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("PD9waHANCg0KDQoNCnJlcXVpcmUoJ2xpc2Fucy5waHAnKTsvL2xpc2Fucy5..

Decoded Output download

?>b'<?php



require(\'lisans.php\');//lisans.php dosyasini ekle
$lisans[\'site\']=getenv(\'HTTP_HOST\');//site domainini al
if (substr($lisans[\'site\'], 0, 4) == "www.")//domain basindaki www. varmi yokmu kontrol et
$lisans[\'site\']=substr($lisans[\'site\'],4);//www. sil ve sadece domain.com olarak adresi al
 
$bas = "MYA-";//Lisans kodu bana istediiniz yaz eklenebilir
$son = "-2018";//Lisans kodu sonuna istediiniz yaz eklenebilir
$m = "md5";//md5 sifreleme 
$s = "sha1";//sha1 sifreleme 
 
 
$lisans[\'hash\']=wordwrap(strtoupper($s ($s ($s ($s ($m ($s ($s ($m ($lisans[\'site\'].date(\'Ymd\')))))))))),5,\'-\',true);//lisans kodunu olustur ve 5 karakterde bir - koy
$liskod = $lisans[\'hash\'];
$cevir=strrev($liskod);//lisans kodunu tersine cevir
$bcs = "$bas$cevir$son";
 
if($bcs!==$lisanskodu)//lisans kodunu kontrol et fark varsa sunucuya baglan - 24 saatte bir lisans kodu degisir
{
$lisans_cevap=file_get_contents(\'http://insta.adanabilisim.net/lisans/kontrol.php?site=\'.$lisans[\'site\']);//lisans sunucusundan lisans kontrolu yap
if($lisans_cevap!=\'LISANSLI\')//sunucudan gelen cevap LISANSLI degilse
 
die(\'Bu siteye ait lisans bulunamadi!!! Lutfen lisans almak icin sorunsuzscript.com adresini ziyaret ediniz\');//lisans gecersiz mesaji verilir islem durur
 
$lyaz = fopen(\'lisans.php\',"w+");//lisans.php dosyasini ac yeni lisans kodunu yaz bu dosya yazlabilir olmaldr
@fwrite($lyaz,\'<?php
/**
    Sorunsuz Script Php Lisans Sistemi
    
    
    Bu dosyaya herhangi bir lisans kodu yazmaniz gerekmez
    Almis oldugunuz urune ait lisans sistemde aktif oldugunda
    Lisans kodunuz otomatik olarak girilecektir.
	
	Yeni lisans almak icin www.sorunsuzscript.com adresini ziyaret edebilirsiniz
 
 */
$lisanskodu="\'.$bcs.\'";
?>\');
fclose($lyaz);
}


	require_once \'sys/config.php\';
	require_once \'vendor/autoload.php\';

	$router	= new AltoRouter();
	
	$smmapi		=	new SMMApi();

	use PHPMailer\PHPMailer\PHPMailer;
	use PHPMailer\PHPMailer\Exception;
	$mail = new PHPMailer(true);


	$router->map(\'POST\', \'/api\', function(){
    	global $vt,$title,$router,$siteayar,$uye,$smmapi;
    	require_once \'api.php\';
			exit();
	},\'api.vieww\');

	## Kullanc GET lemleri ##
	$router->map(\'GET\', \'/\', function(){
    	global $vt,$title,$router,$siteayar,$uye,$siparisler,$haberler;
				if (@$_SESSION["login"]) {
					$title.=	\'Anasayfa\';
					include \'views/\'.SITE_TEMA.\'/main.view.php\';
				}else{
					yonlendir($router->generate(\'login.view\'));
				}
				exit();
	},\'main.view\');
	$router->map(\'GET\', \'/sozlesmeler\', function(){
    	global $vt,$title,$router,$siteayar,$uye,$siparisler,$haberler;
					$title.=	\'Szlemelerimiz\';
					include \'views/\'.SITE_TEMA.\'/sozlesme.view.php\';
					exit();
	},\'sozlesmeler.view\');
	$router->map(\'GET\', \'/cikis-yap\', function(){
			global $router;
			unset($_SESSION["login"]);
			unset($_SESSION["username"]);
			session_destroy();
			setcookie("username", $_SESSION["username"], time() - 60*60*24*7);
    	yonlendir($router->generate(\'login.view\'));
			exit();
	},\'logout.view\');
	$router->map(\'GET\', \'/kayit-ol\', function(){
    	global $vt,$title,$router,$siteayar;
			if (@!$_SESSION["login"]) {
				$title.=	\'Kayt Ol\';
				include \'views/\'.SITE_TEMA.\'/register.view.php\';
			}else{
				yonlendir($router->generate(\'main.view\'));
			}
			exit();
	},\'register.view\');
	$router->map(\'GET\', \'/giris-yap\', function(){
    	global $vt,$title,$router,$siteayar;
			if (@!$_SESSION["login"]) {
				$title.=	\'Giri Yap\';
				include \'views/\'.SITE_TEMA.\'/login.view.php\';
			}else{
				yonlendir($router->generate(\'main.view\'));
			}
			exit();
	},\'login.view\');
	$router->map(\'GET\', \'/parolami-unuttum\', function(){
    	global $vt,$title,$router,$siteayar;
			if (@!$_SESSION["login"]) {
				$title.=	\'Parolam Unuttum\';
				include \'views/\'.SITE_TEMA.\'/password_forget.view.php\';
			}else{
				yonlendir($router->generate(\'main.view\'));
			}
			exit();
	},\'password_forget.view\');
	$router->map(\'GET\', \'/parolami-guncelle\', function(){
    	global $vt,$title,$router,$siteayar;
			if (@!$_SESSION["login"]) {
				$title.=	\'Parolam Unuttum\';
				include \'views/\'.SITE_TEMA.\'/password_forget2.view.php\';
			}else{
				yonlendir($router->generate(\'main.view\'));
			}
			exit();
	},\'sifre_guncelle.view\');
	$router->map(\'GET\', \'/bakiye-ekle\', function(){
    	global $vt,$title,$router,$siteayar,$uye,$bankalar;
			if (@$_SESSION["login"]) {
				$title.=	\'Bakiye Ekle\';
				include \'views/\'.SITE_TEMA.\'/add_balance.view.php\';
			}else{
				yonlendir($router->generate(\'main.view\'));
			}
			exit();
	},\'add_balance.view\');
	$router->map(\'GET\', \'/yeni-destek-talebi\', function(){
    	global $vt,$title,$router,$siteayar,$uye;
			if (@$_SESSION["login"]) {
				$title.=	\'Yeni Destek Talebi Olutur\';
				include \'views/\'.SITE_TEMA.\'/new_ticket.view.php\';
			}else{
				yonlendir($router->generate(\'main.view\'));
			}
			exit();
	},\'new_ticket.view\');
	$router->map(\'GET\', \'/destek-talebi/[*:slug]\', function($slug){
    	global $vt,$title,$router,$siteayar,$uye;
			if (@$_SESSION["login"]) {
				$title	.=	\'Destek Talebini Grntle\';
				$talep	=	$vt->prepare("SELECT * FROM destek_talepler WHERE id=? ");
				$talep	-> execute(array($slug));
				$talep	=	$talep	-> fetch(PDO::FETCH_OBJ);
					if ($talep->talep_sahibi!=$uye->username) {
						yonlendir($router->generate(\'all_tickets.view\'));
					}else{
						$talepcevaplar	=	$vt->prepare("SELECT * FROM destek_talep_cevap WHERE talep_id=?");
						$talepcevaplar -> execute(array($talep->id));
						$talepcevaplar	=	$talepcevaplar->fetchAll(PDO::FETCH_OBJ);
					}
				include \'views/\'.SITE_TEMA.\'/read_ticket.view.php\';
			}else{
				yonlendir($router->generate(\'main.view\'));
			}
			exit();
	},\'read_ticket.view\');
	$router->map(\'GET\', \'/destek-taleplerim\', function(){
    	global $vt,$title,$router,$siteayar,$uye;
			if (@$_SESSION["login"]) {
				$title.=	\'Destek Taleplerim\';
				$taleplerim	=	$vt->prepare("SELECT * FROM destek_talepler WHERE talep_sahibi=? ORDER BY id DESC");
				$taleplerim-> execute(array($uye->username));
				$taleplerim	=	$taleplerim->fetchAll(PDO::FETCH_OBJ);
				include \'views/\'.SITE_TEMA.\'/all_tickets.view.php\';
			}else{
				yonlendir($router->generate(\'main.view\'));
			}
			exit();
	},\'all_tickets.view\');
	$router->map(\'GET\', \'/destek-taleplerim/bekleyenler\', function(){
    	global $vt,$title,$router,$siteayar,$uye;
			if (@$_SESSION["login"]) {
				$title.=	\'Destek Taleplerim\';
				$taleplerim	=	$vt->prepare("SELECT * FROM destek_talepler WHERE talep_sahibi=? && talep_durum=? ORDER BY id DESC");
				$taleplerim-> execute(array($uye->username,\'Ak\'));
				$taleplerim	=	$taleplerim->fetchAll(PDO::FETCH_OBJ);
				include \'views/\'.SITE_TEMA.\'/all_tickets.view.php\';
			}else{
				yonlendir($router->generate(\'main.view\'));
			}
			exit();
	},\'bekleyen_tickets.view\');
	$router->map(\'GET\', \'/destek-taleplerim/yanitlanmis\', function(){
    	global $vt,$title,$router,$siteayar,$uye;
			if (@$_SESSION["login"]) {
				$title.=	\'Destek Taleplerim\';
				$taleplerim	=	$vt->prepare("SELECT * FROM destek_talepler WHERE talep_sahibi=? && talep_durum=? ORDER BY id DESC");
				$taleplerim-> execute(array($uye->username,\'Yantland\'));
				$taleplerim	=	$taleplerim->fetchAll(PDO::FETCH_OBJ);
				include \'views/\'.SITE_TEMA.\'/all_tickets.view.php\';
			}else{
				yonlendir($router->generate(\'main.view\'));
			}
			exit();
	},\'yanitlandi_tickets.view\');
	$router->map(\'GET\', \'/destek-taleplerim/kapali\', function(){
    	global $vt,$title,$router,$siteayar,$uye;
			if (@$_SESSION["login"]) {
				$title.=	\'Destek Taleplerim\';
				$taleplerim	=	$vt->prepare("SELECT * FROM destek_talepler WHERE talep_sahibi=? && talep_durum=? ORDER BY id DESC");
				$taleplerim-> execute(array($uye->username,\'Kapal\'));
				$taleplerim	=	$taleplerim->fetchAll(PDO::FETCH_OBJ);
				include \'views/\'.SITE_TEMA.\'/all_tickets.view.php\';
			}else{
				yonlendir($router->generate(\'main.view\'));
			}
			exit();
	},\'kapali_tickets.view\');
	$router->map(\'GET\', \'/yeni-siparis\', function(){
    	global $vt,$title,$router,$siteayar,$uye,$kategoriler,$kategorilerfiyat;
			if (@$_SESSION["login"]) {
				$title.=	\'Yeni Sipari\';
				include \'views/\'.SITE_TEMA.\'/new_order.view.php\';
			}else{
				yonlendir($router->generate(\'main.view\'));
			}
			exit();
	},\'new_order.view\');
	$router->map(\'GET\', \'/siparislerim\', function(){
    	global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi;
			if (@$_SESSION["login"]) {
				$title.=	\'Siparilerim\';
				$slug	=	1;
				/* Sayfalama */
				$gozuksun = 20; // Listelemede yan yana ka sayfa numaras olsun
				$kactane  = 10; // Sayfada Ka Veri Gzksn
				$nereden  = $slug*$kactane-$kactane; // Veriler Nerden ekilmeye Balanacak
				$verisay  = $vt->query("SELECT * FROM siparisler WHERE siparis_sahibi=\'$uye->username\' ")->rowCount(); // Ka Tane Veri Var
				$toplamsayfa  = ceil($verisay/$kactane); if($toplamsayfa==0){$toplamsayfa=1;} // Toplam Ka Sayfa Var
				if($slug>$toplamsayfa){yonlendir($router->generate(\'my_orders.view\',[\'slug\'=>1]));}
				/* Sayfalama */
				$siparisler	=	$vt->prepare("SELECT * FROM siparisler WHERE siparis_sahibi=? ORDER BY id DESC LIMIT $nereden,$kactane");
				$siparisler-> execute(array($uye->username));
				$siparisler	=	$siparisler->fetchAll(PDO::FETCH_OBJ);
				include \'views/\'.SITE_TEMA.\'/my_orders.view.php\';
			}else{
				yonlendir($router->generate(\'main.view\'));
			}
			exit();
	},\'my_orders.view\');
	$router->map(\'GET\', \'/siparislerim/[*:slug]\', function($slug){
    	global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi;
			if (@$_SESSION["login"]) {
				$title.=	\'Siparilerim\';
				/* Sayfalama */
				$gozuksun = 20; // Listelemede yan yana ka sayfa numaras olsun
				$kactane  = 10; // Sayfada Ka Veri Gzksn
				$nereden  = $slug*$kactane-$kactane; // Veriler Nerden ekilmeye Balanacak
				$verisay  = $vt->query("SELECT * FROM siparisler WHERE siparis_sahibi=\'$uye->username\' ")->rowCount(); // Ka Tane Veri Var
				$toplamsayfa  = ceil($verisay/$kactane); if($toplamsayfa==0){$toplamsayfa=1;} // Toplam Ka Sayfa Var
				if($slug>$toplamsayfa){yonlendir($router->generate(\'my_orders.view\',[\'slug\'=>1]));}
				/* Sayfalama */
				$siparisler	=	$vt->prepare("SELECT * FROM siparisler WHERE siparis_sahibi=? ORDER BY id DESC LIMIT $nereden,$kactane");
				$siparisler-> execute(array($uye->username));
				$siparisler	=	$siparisler->fetchAll(PDO::FETCH_OBJ);
				include \'views/\'.SITE_TEMA.\'/my_orders.view.php\';
			}else{
				yonlendir($router->generate(\'main.view\'));
			}
			exit();
	},\'my_orderss.view\');
	$router->map(\'GET\', \'/paketler\', function(){
    	global $vt,$title,$router,$siteayar,$uye,$urunler,$kategorilerfiyat;
				$title.=	\'Fiyat Listesi\';
				include \'views/\'.SITE_TEMA.\'/price_list.view.php\';
				exit();
	},\'price_list.view\');
	$router->map(\'GET\', \'/profil\', function(){
    	global $vt,$title,$router,$siteayar,$uye;
			if (@$_SESSION["login"]) {
				$title.=	\'Profilim\';
				include \'views/\'.SITE_TEMA.\'/my_setting.view.php\';
			}else{
				yonlendir($router->generate(\'main.view\'));
			}
			exit();
	},\'my_setting.view\');
	$router->map(\'GET\', \'/odemelerim\', function(){
    	global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi,$bodemeler,$bonlineodemeler;
			if (@$_SESSION["login"]) {
				$title.=	\'demelerim\';
				include \'views/\'.SITE_TEMA.\'/odemeler.view.php\';
			}else{
				yonlendir($router->generate(\'main.view\'));
			}
			exit();
	},\'odemeler.view\');
	$router->map(\'GET\', \'/mobil-onay\', function(){
    	global $vt,$title,$router,$siteayar,$uye;
				if (@$_SESSION["login"]) {
					$title.=	\'Anasayfa\';
					include \'views/\'.SITE_TEMA.\'/mobile.view.php\';
				}else{
					yonlendir($router->generate(\'login.view\'));
				}
				exit();
	},\'mobile.view\');
	$router->map(\'POST\', \'/buypayer-odeme\', function(){
    	global $vt,$title,$router,$siteayar,$uye;
				$tutar	=	str_replace(\'.\', \',\', $_POST["tutar"]);
				$yontem =	$_POST["yontem"];
				$rand	=	rand(0,9).rand(0,9).rand(0,9).rand(0,9).rand(0,9);
				$tarih 	=	date("Y.m.d");
				$ip 	=	GetIP();
				if ( $tutar >= 1 ) {
					
					header(\'Content-Type: text/html; charset=utf-8\');
					$postUrl=\'https://www.buypayer.com/receive2.asp\';

					// itt alannda tahsil edilecek tutarda kuru olmas durumunda virgl kullannz "85,55" gibi
					$xmlString=\'xml=<send>
							<mgzid>\'.$siteayar->buypayer_magaza.\'</mgzid>
					        <itt>\'.$tutar.\'</itt> 
					        <sipid>\'.$rand.\'</sipid>
							<adsoyad>\'.$uye->adsoyad.\'</adsoyad>
							<telefon>\'.$uye->telefon.\'</telefon>
						    <eposta>\'.$uye->email.\'</eposta>
					        <adres>Belirtilmemi</adres>
							<urunadi>\'.$tutar.\' TL bakiye yklemesi</urunadi>
							<gvk>\'.$siteayar->buypayer_guvenlik.\'</gvk>
							<uyemail>\'.$siteayar->buypayer_mail.\'</uyemail>
							
					</send>\';  

					$Veriler =  $xmlString;
					$ch = curl_init();
					curl_setopt($ch, CURLOPT_URL, $postUrl);
					curl_setopt($ch, CURLOPT_POST, 1);
					curl_setopt($ch, CURLOPT_POSTFIELDS, $Veriler);
					curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
					curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
					curl_setopt($ch, CURLOPT_TIMEOUT, 30);
					$response = curl_exec($ch);
					curl_close($ch);

					

					if($response){
						$ekle	=	$vt->prepare("INSERT INTO buypayer_odemeler SET odeme_ip=?, odeme_ekstra=?, odeme_sahibi=?, odendimi=?, odeme_tutari=?, odeme_durum=?, odeme_tarih=?");
						$ekle-> execute(array($ip,$rand,$uye->username,\'0\',$tutar,\'Beklemede\',$tarih));
						$output = [\'t\'=>\'Baarl\',\'m\'=>\'Ltfen bekleyin deme sayfasna ynlendiriliyorsunuz\',\'s\'=>\'success\',\'r\'=>$response];
						echo json_encode($output);
					}else{
						$output = [\'t\'=>\'Hata\',\'m\'=>\'deme ilemi balatlrken hata olutu ltfen daha sonra tekrar deneyin\',\'s\'=>\'error\'];
						echo json_encode($output);
					}
				}else{
					$output = [\'t\'=>\'Hata\',\'m\'=>\'Minimum deme miktar 1 TL\'dir\',\'s\'=>\'error\'];
					echo json_encode($output);
				}



	},\'buypayer.post\');
	$router->map(\'POST\', \'/paytr-odeme\', function(){
    	global $vt,$title,$router,$siteayar,$uye;
				$tutar	=	$_POST["tutar"];
				$yontem =	$_POST["yontem"];

				if ( $tutar >= 1 ) {
					$tarih					= date(\'Y-m-d H:i:s\');
					$ip 						= GetIP();
					$merchant_id 		= $siteayar->merchant_id; ## API Entegrasyon Bilgileri
					$merchant_key 	= $siteayar->merchant_key; ## API Entegrasyon Bilgileri
					$merchant_salt	= $siteayar->merchant_salt; ## API Entegrasyon Bilgileri

					$email 							= $uye->mail; ## Mterinizin sitenizde kaytl veya form vastasyla aldnz eposta adresi
					$payment_amount			= ($tutar+$tutar*10/100)*100;  ## Tahsil edilecek tutar.
					$merchant_oid 			= rand(10000,99999999); ## Sipari numaras
					$user_name 					= $uye->adsoyad; ## Mterinizin sitenizde kaytl veya form araclyla aldnz ad ve soyad bilgisi
					$user_address 			= "stanbul"; ## Mterinizin sitenizde kaytl veya form araclyla aldnz adres bilgisi
					$user_phone 				= $uye->telefon; ## Mterinizin sitenizde kaytl veya form araclyla aldnz telefon bilgisi
					$merchant_ok_url 		= "http://".$siteayar->site_url."online-odeme-basarili"; ## Baarl deme sonras mterinizin ynlendirilecei sayfa
					$merchant_fail_url 	= "http://".$siteayar->site_url."online-odeme-basarisiz"; ## deme srecinde beklenmedik bir hata olumas durumunda mterinizin ynlendirilecei sayfa
					$user_basket = base64_encode(json_encode(array(
						array($tutar." TL Bakiye", $tutar, 1)
					))); ## Mterinin sepet/sipari ierii
					$user_ip					=	$ip;
					$timeout_limit 		= "30"; ## lem zaman am sresi - dakika cinsinden
					$debug_on 				= 1; ## Hata mesajlarnn ekrana baslmas iin entegrasyon ve test srecinde 1 olarak brakn. Daha sonra 0 yapabilirsiniz.
			    	$test_mode 				= 0;  ## Maaza canl modda iken test ilem yapmak iin 1 olarak gnderilebilir.
					$no_installment		= 0; // Taksit yaplmasn istemiyorsanz, sadece tek ekim sunacaksanz 1 yapn
					$max_installment 	= 0; ## Sayfada grntlenecek taksit adedini snrlamak istiyorsanz uygun ekilde deitirin.
					$currency = "TL";


					####### Bu ksmda herhangi bir deiiklik yapmanza gerek yoktur. #######
					if( $yontem != "eft" ){
						$hash_str = $merchant_id .$user_ip .$merchant_oid .$email .$payment_amount .$user_basket.$no_installment.$max_installment.$currency.$test_mode;
						$paytr_token=base64_encode(hash_hmac(\'sha256\',$hash_str.$merchant_salt,$merchant_key,true));
						$post_vals=array(
							\'merchant_id\'=>$merchant_id,
							\'user_ip\'=>$user_ip,
							\'merchant_oid\'=>$merchant_oid,
							\'email\'=>$email,
							\'payment_amount\'=>$payment_amount,
							\'paytr_token\'=>$paytr_token,
							\'user_basket\'=>$user_basket,
							\'debug_on\'=>$debug_on,
							\'no_installment\'=>$no_installment,
							\'max_installment\'=>$max_installment,
							\'user_name\'=>$user_name,
							\'user_address\'=>$user_address,
							\'user_phone\'=>$user_phone,
							\'merchant_ok_url\'=>$merchant_ok_url,
							\'merchant_fail_url\'=>$merchant_fail_url,
							\'timeout_limit\'=>$timeout_limit,
							\'currency\'=>$currency,
		           			\'test_mode\'=>$test_mode
						);
					}else{
						$hash_str=$merchant_id.$user_ip.$merchant_oid.$email.$payment_amount.$yontem.$test_mode;
						$paytr_token=base64_encode(hash_hmac(\'sha256\',$hash_str.$merchant_salt,$merchant_key,true));
						$post_vals=array(
							\'merchant_id\'=>$merchant_id,
							\'user_ip\'=>$user_ip,
							\'merchant_oid\'=>$merchant_oid,
							\'email\'=>$email,
							\'payment_amount\'=>$payment_amount,
							\'payment_type\'=>$yontem,
							\'paytr_token\'=>$paytr_token,
							\'debug_on\'=>$debug_on,
							\'timeout_limit\'=>$timeout_limit,
				            \'test_mode\'=>$test_mode
						);
					}


					$ch=curl_init();
					curl_setopt($ch, CURLOPT_URL, "https://www.paytr.com/odeme/api/get-token");
					curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
					curl_setopt($ch, CURLOPT_POST, 1) ;
					curl_setopt($ch, CURLOPT_POSTFIELDS, $post_vals);
					curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
					curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
					curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
					curl_setopt($ch, CURLOPT_TIMEOUT, 20);
					$result = @curl_exec($ch);

					if(curl_errno($ch))
						die("PAYTR IFRAME connection error. err:".curl_error($ch));

					curl_close($ch);

					$result=json_decode($result,1);

					if($result[\'status\']==\'success\'){
						$token	=	$result[\'token\'];
						$ekle	=	$vt->prepare("INSERT INTO paytr_odemeler SET odeme_ip=?, odeme_ekstra=?, odeme_sahibi=?, odendimi=?, odeme_tutari=?, odeme_durum=?, odeme_tarih=?");
						$ekle-> execute(array($ip,$merchant_oid,$uye->username,\'0\',$tutar,\'Beklemede\',$tarih));
						$output = [\'t\'=>\'Baarl\',\'m\'=>\'Ltfen bekleyin deme sayfasna ynlendiriliyorsunuz\',\'s\'=>\'success\',\'r\'=>$router->generate(\'pay_tr.view\',[\'slug\'=>$token,\'url\'=>$yontem])];
						echo json_encode($output);
					}else{

						$output = [\'t\'=>\'Hata\',\'m\'=>\'deme ilemi balatlrken hata olutu ltfen daha sonra tekrar deneyin\',\'s\'=>\'error\'];
						echo json_encode($output);
					}
				}else{
					$output = [\'t\'=>\'Hata\',\'m\'=>\'Minimum deme miktar 1 TL\'dir\',\'s\'=>\'error\'];
					echo json_encode($output);
				}



	},\'payt_tr.post\');
	$router->map(\'GET\', \'/online-odeme/[*:slug]/[*:url]\', function($slug,$url){
    	global $vt,$title,$router,$siteayar,$uye;
			include \'views/default/header.view.php\';
			if ( $url == "eft" ) {
				$url = "https://www.paytr.com/odeme/api/";
			} else {
				$url = "https://www.paytr.com/odeme/guvenli/";
			}

			echo \'
			<main id="app-main" class="app-main">
			  <div class="wrap">
				<section class="app-content">
					<div class="row">
			<script src="https://www.paytr.com/js/iframeResizer.min.js"></script>
	    <iframe src="\'.$url.$slug.\'" id="paytriframe" frameborder="0" scrolling="no" style="width: 100%;"></iframe>
				<script>iFrameResize({},\'#paytriframe\');</script>
					</div><!-- .row -->
				</section><!-- #dash-content -->
			</div><!-- .wrap -->
					\';
			include \'views/default/footer.view.php\';
	},\'pay_tr.view\');
	$router->map(\'GET\', \'/online-odeme-basarili\', function(){
    	global $vt,$title,$router,$siteayar,$uye;
			include \'views/default/header.view.php\';
			echo \'
			<main id="app-main" class="app-main">
			  <div class="wrap">
				<section class="app-content">
					<div class="row">
					<div class="alert alert-success alert-dismissible" role="alert">
							<strong>Baarl! </strong>
							<span>deme ileminiz tamamland, en ksa zamanla hesabnza aktarlacaktr.</span>
						</div>
					</div><!-- .row -->
				</section><!-- #dash-content -->
			</div><!-- .wrap -->
					\';
			include \'views/default/footer.view.php\';
	},\'pay_tr_basarili.view\');
	$router->map(\'GET\', \'/online-odeme-basarisiz\', function(){
			global $vt,$title,$router,$siteayar,$uye;
			include \'views/default/header.view.php\';
			echo \'
			<main id="app-main" class="app-main">
				<div class="wrap">
				<section class="app-content">
					<div class="row">
					<div class="alert alert-danger alert-dismissible" role="alert">
							<strong>Baarsz! </strong>
							<span>deme ileminiz tamamlanamad, ltfen daha sonra tekrar deneyin.</span>
						</div>
					</div><!-- .row -->
				</section><!-- #dash-content -->
			</div><!-- .wrap -->
					\';
			include \'views/default/footer.view.php\';
	},\'pay_tr_basarisiz.view\');

	## Kullanc POST lemleri ##
	$router->map(\'POST\', \'/sifremi-unuttum\', function(){
    	global $vt,$title,$router,$siteayar,$uye;

			$tur			=	$_POST["tur"];
			$mail			=	$_POST["email"];
			$telefon	=	str_replace(" ","",$_POST["telefon"]);
			$tarih    = date("Y.m.d H:i:s");

			if ( $tur == \'telefon\' ) {
				$sor				=		$vt->prepare("SELECT * FROM uyeler WHERE telefon=?");
				$sor				->	execute(array($telefon));
				$uye				=		$sor->fetch(PDO::FETCH_OBJ);
			}else{
				$sor				=		$vt->prepare("SELECT * FROM uyeler WHERE mail=?");
				$sor				->	execute(array($mail));
				$uye				=		$sor->fetch(PDO::FETCH_OBJ);
			}

				if ( $tur == \'secin\' || $tur == \'telefon\' && empty($telefon) || $tur == \'email\' && empty($mail) ) {
					$output	=	["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
					echo json_encode($output);
				}elseif( !$sor->rowCount() ){
					$output	=	["t"=>"Bilgi","m"=>"Girilen bilgiler ile uyuan kullanc bulunamad","s"=>"info"];
					echo json_encode($output);
				}elseif( $tur == \'telefon\' ){
					## Onay Kodu Olutur ##
					$kod 			= rand(1,9).rand(1,9).rand(1,9).rand(1,9).rand(1,9).rand(1,9);
					$olustur	=	$vt->prepare("INSERT INTO sifremiunuttum SET sahibi=?, kod=?, tarih=?");
					$olustur -> execute(array($uye->username,$kod,$tarih));
					## Onay Kodunu Gnder ##
					sifremiUnuttum($telefon,$kod);
				}elseif( $tur == \'email\' ){
					## Onay Kodu Olutur ##
					$kod 			= rand(1,9).rand(1,9).rand(1,9).rand(1,9).rand(1,9).rand(1,9);
					$olustur	=	$vt->prepare("INSERT INTO sifremiunuttum SET sahibi=?, kod=?, tarih=?");
					$olustur -> execute(array($uye->username,$kod,$tarih));
					## Onay Kodunu Gnder ##
					sifremiUnuttumMail($uye->mail,"ifrenizi gncellemek iin gerekli kod olan: ".$kod,"Parolam unuttum");
				}

				exit();
	},\'password_forget.post\');
	$router->map(\'POST\', \'/sifremi-guncelle\', function(){
    	global $vt,$title,$router,$siteayar,$uye;

			$kod				=	$_POST["kod"];
			$yeni				=	$_POST["sifre"];
			$pass				=	md5($_POST["sifre"]);

			$sor				=		$vt->prepare("SELECT * FROM sifremiunuttum WHERE kod=?");
			$sor				->	execute(array($kod));
			$kod				= 	$sor->fetch(PDO::FETCH_OBJ);
			$uye				=		$vt->prepare("SELECT * FROM uyeler WHERE username=?");
			$uye				->	execute(array($kod->sahibi));
			$uye				= 	$uye->fetch(PDO::FETCH_OBJ);


				if ( empty($kod) || empty($yeni) ) {
					$output	=	["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
					echo json_encode($output);
				}elseif( !$sor->rowCount() ){
					$output	=	["t"=>"Bilgi","m"=>"Girilen kod geersiz","s"=>"info"];
					echo json_encode($output);
				}elseif(strlen($yeni)<6){
					$output	=	["t"=>"Bilgi","m"=>"Girdiiniz ifre 6 karakterden ksa olmamal","s"=>"info"];
					echo json_encode($output);
				}else{

					$guncelle = $vt->prepare("UPDATE uyeler SET password=? WHERE username=?");
					$guncelle -> execute(array($pass,$uye->username));
						if ($guncelle) {
							$output	=	["t"=>"Mkemmel!","m"=>"ifreniz gncellendi, ynlendiriliyorsunuz","s"=>"success",\'r\'=>$router->generate(\'login.view\')];
							echo json_encode($output);
							$delete = $vt->prepare("DELETE FROM sifremiunuttum WHERE sahibi=?");
							$delete -> execute(array($uye->username));
						}else{
							$output	=	["t"=>"Hata","m"=>"ifreniz gncellenirken hata olutur.","s"=>"error"];
							echo json_encode($output);
						}
				}


				exit();
	},\'sifre_guncelle.post\');
  $router->map(\'POST\', \'/kayit-ol\', function(){
			global $vt,$title,$router,$siteayar;

		$tarih		=	date("Y-m-d H:i:s");
		$ad				=	ilkHarf($_POST["name"]);
		$mail			=	$_POST["mail"];
		$username	=	str_replace(" ", "", trCevir($_POST["username"]));
		$password	=	$_POST["password"];
		$phone		=	str_replace(" ", "", $_POST["phone"]);
		$captcha 	= @$_POST[\'g-recaptcha-response\'];

		$key			= md5(apikeyOlustur(32).time());

		$ksorgu		=	$vt->prepare("SELECT * FROM uyeler WHERE username=?");
		$ksorgu		->	execute(array($username));
		$msorgu		=	$vt->prepare("SELECT * FROM uyeler WHERE mail=?");
		$msorgu		->	execute(array($mail));
		$tsorgu		=	$vt->prepare("SELECT * FROM uyeler WHERE telefon=?");
		$tsorgu		->	execute(array($phone));

		$googlesecret	= "6Letw1MUAAAAAJehqausSNFkdcGUjsxQrLWtdvqM";

		$robotkontrol 	= file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=$googlesecret&response=" . $captcha . "&remoteip=" . $_SERVER[\'REMOTE_ADDR\']);
		$robotkontrol 	=	json_decode($robotkontrol);

		if (empty($ad) || empty($mail) || empty($username) || empty($password) || empty($phone)) {
			$output	=	["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz","s"=>"info"];
			echo json_encode($output);
		}elseif (!$captcha) {
		    $output	=	["t"=>"Hata","m"=>"Robot olmadnz kantlayn","s"=>"error"];
			echo json_encode($output);
		}elseif($ksorgu->rowCount()){
			$output	=	["t"=>"Bilgi","m"=>"Bu kullanc ad daha nce kullanlm.","s"=>"info"];
			echo json_encode($output);
		}elseif(!filter_var($mail,FILTER_VALIDATE_EMAIL)) {
			$output	=	["t"=>"Bilgi","m"=>"Girdiiniz mail format hatal.","s"=>"info"];
			echo json_encode($output);
		}elseif($msorgu->rowCount()){
			$output	=	["t"=>"Bilgi","m"=>"Bu mail adresi daha nce kullanlm.","s"=>"info"];
			echo json_encode($output);
		}elseif (strlen($password)<6) {
			$output	=	["t"=>"Bilgi","m"=>"Parolanz en az 6 karakterden olumal.","s"=>"info"];
			echo json_encode($output);
		}elseif($tsorgu->rowCount()){
			$output	=	["t"=>"Bilgi","m"=>"Bu telefon numaras daha nce kullanlm.","s"=>"info"];
			echo json_encode($output);
		}elseif( $robotkontrol->success == \'false\'  ){
			$output	=	["t"=>"Hata","m"=>"Ltfen robot olmadnz onaylayn.","s"=>"error"];
			echo json_encode($output);
		}else{
			$kod	= rand(0,9).rand(0,9).rand(0,9).rand(0,9).rand(0,9).rand(0,9);
			$password	=	md5($_POST["password"]);
			$insert	=	$vt->prepare("INSERT INTO uyeler SET adsoyad=?, mail=?, username=?, password=?, telefon=?, uyeliktarihi=?, apikey=?, bakiye=?, onay=?, yetki=?, avatar=?");
			$insert-> execute(array($ad,$mail,$username,$password,$phone,$tarih,$key,0,0,\'Mteri\',\'default_avatar_jpg\'));
				if ($insert) {
					if ($siteayar->sms_onay) {
						$kodekle	=	$vt->prepare("INSERT INTO onay_kodlari SET onay_sahibi=?, onay_kodu=?, onay_tarihi=?");
						$kodekle-> execute(array($username,$kod,$tarih));
						yeniuyeSMS($phone,$kod);
					}
					$output	=	["t"=>"Mkemmel!","m"=>"Kayt ileminiz baaryla sonuland, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate(\'login.view\')];
					echo json_encode($output);
				}else{
					$output	=	["t"=>"Hata","m"=>"Parolanz en az 6 karakterden olumal.","s"=>"error"];
					echo json_encode($output);
				}
		}
		exit();
		},\'register.post\');
	$router->map(\'POST\', \'/bakiye-ekle-banka\', function(){
    	global $vt,$title,$router,$siteayar,$uye;

			$odemeBanka		=	$_POST["odemeBanka"];
			$odemeTutar		=	$_POST["odemeTutar"];
			$tarih				=	date("Y-m-d H:i:s");

			if ( empty($odemeBanka) || $odemeBanka=="yok" || empty($odemeTutar) ) {
				$output	=	["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
				echo json_encode($output);
			}else{
				$ekle		=		$vt->prepare("INSERT INTO banka_odemeler SET odeme_sahibi=?, odeme_banka=?, odeme_tutar=?, odeme_tarih=?, odeme_durum=?, odendimi=? ");
				$ekle		->	execute(array($uye->username,$odemeBanka,$odemeTutar,$tarih,\'Beklemede\',0));
					if ($ekle) {
						$output	=	["t"=>"Mkemmel!","m"=>"deme talebiniz alnd.","s"=>"success"];
						echo json_encode($output);
					}else{
						$output	=	["t"=>"Hata","m"=>"deme talebi srasnda hata olutu.","s"=>"error"];
						echo json_encode($output);
					}
			}
			exit();
	},\'add_banka.post\');
	$router->map(\'POST\', \'/paywant-odeme\', function(){
    	global $vt,$title,$router,$siteayar,$uye;

			$bakiyeYontem	=	$_POST["bakiyeYontem"];
			$bakiyeTutar	=	$_POST["bakiyeTutar"];


			if ( $bakiyeYontem == 1 ) {
				$yontemNasil = "Mobil deme";
			}elseif ( $bakiyeYontem == 2 ) {
				$yontemNasil = "Kredi Kart";
			}elseif ( $bakiyeYontem == 3 ) {
				$yontemNasil = "Havale/Eft/Atm";
			}

				if ( empty($bakiyeTutar) || empty($bakiyeYontem) ) {
					$output	=	["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
					echo json_encode($output);
				}elseif( $bakiyeTutar < 10 ){
					$output	=	["t"=>"Bilgi","m"=>"10 TL altndaki deme ilemi yaplamaz.","s"=>"info"];
					echo json_encode($output);
				}else{



					## PAYYWANT DEME BALA ##
					$apiKey 			= $siteayar->paywant_api; // PAYWANT API
					$apiSecret 		= $siteayar->paywant_secret; // API GIZLI ANAHTAR
					$userID 			= $uye->id; // BAKIYE EKLENECEK KULLANICI ID
					$userEmail 		= $uye->mail; // BAKIYE EKLENECEK KULLANICI EMAL
					$userIPAdresi = GetIP();
					$extraData		= rand(10000,99999999);
					$hashOlustur = base64_encode(hash_hmac(\'sha256\',"$userEmail|$userEmail|$userID".$apiKey,$apiSecret,true));
					$postData = array(
					\'apiKey\' => $apiKey,
					\'hash\' => $hashOlustur,
					\'returnData\'=> $userEmail,
					\'userEmail\' => $userEmail,
					\'userIPAddress\' => $userIPAdresi,
					\'userID\' => $userID,
					\'proApi\' => TRUE,
					 \'productData\' => [
							 "name" =>  $bakiyeTutar." TL Tutarnda Bakiye (".$extraData.")",
							 "amount" => $bakiyeTutar* 111,
							 "extraData" => $extraData,
							 "paymentChannel" => $bakiyeYontem, // 1 Mobil deme, 2 Kredi Kart,3 Banka Havale/Eft/Atm,4 Trk Telekom deme (TTNET),5 Mikrocard,6 CashU
							 "commissionType" => 2 // 1 seilirse komisyonu bizden al, 2 olursa komisyonu mteri desin
					 ]
					);
					$curl = curl_init();
						curl_setopt_array($curl, array(
							CURLOPT_URL => "http://api.paywant.com/gateway.php",
							CURLOPT_RETURNTRANSFER => true,
							CURLOPT_ENCODING => "",
							CURLOPT_MAXREDIRS => 10,
							CURLOPT_TIMEOUT => 30,
							CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
							CURLOPT_CUSTOMREQUEST => "POST",
							CURLOPT_POSTFIELDS => http_build_query($postData),
						));
					$response = curl_exec($curl); $err = curl_error($curl);
					if ($err){
						// echo "cURL Error #:" . $err; // cURL hatasn ekrana bastr
						$output	=	["t"=>"Hata","m"=>"Beklenmedik bir hata olutu, ltfen daha sonra tekrar deneyin.","s"=>"error"];
						echo json_encode($output);
					}else{
						$jsonDecode = json_decode($response,false);
							if($jsonDecode->Status == 100){
								$tarih	=	date("Y-m-d H:i:s");
								$ekle	=	$vt->prepare("INSERT INTO paywant_odemeler SET odeme_ekstra=?, odeme_sahibi=?, odeme_kanali=?, odeme_tutari=?, odeme_net=?, odeme_durum=?, odeme_tarih=?");
								$ekle-> execute(array($extraData,$uye->username,$yontemNasil,$bakiyeTutar,\'Cevap bekleniyor\',\'Beklemede\',$tarih));
								$output	=	["t"=>"Mkemmel!","m"=>"deme ileminiz iin deme sayfasna ynlendiriliyorsunuz, ltfen bekleyin.","s"=>"success","r"=> $jsonDecode->Message];
								echo json_encode($output);
							}else{
								// echo $response; // Dnen hatann ne olduunu bastr
								$output	=	["t"=>"Hata","m"=>"Beklenmedik bir hata olutu, ltfen daha sonra tekrar deneyin.","s"=>"error"];
								echo json_encode($output);
							}
					}
					curl_close($curl);
					## PAYWANT DEME BTR ##
				}
				exit();
	},\'add_paywant.post\');
	$router->map(\'POST|GET\', \'/paywant-odeme-kabul\', function(){
    	global $vt,$title,$router,$siteayar,$uye;

					## PAYWANT DEME KABUL BALA ##
					$apiKey 			= $siteayar->paywant_api; // PAYWANT API
					$apiSecret 		= $siteayar->paywant_secret; // API GIZLI ANAHTAR
					if ($_POST){
						$SiparisID 		= $_POST["SiparisID"];
						$ExtraData 		= $_POST["ExtraData"];
						$UserID 			= $_POST["UserID"];
						$ReturnData 	= $_POST["ReturnData"];
						$Status 			= $_POST["Status"];
						$OdemeKanali 	= $_POST["OdemeKanali"];
						$OdemeTutari 	= $_POST["OdemeTutari"];
						$NetKazanc 		= $_POST["NetKazanc"];
						$Hash 				= $_POST["Hash"];
						if ($SiparisID != "" || $ExtraData != "" || $UserID != "" || $ReturnData != "" || $Status != "" || $OdemeKanali != "" || $OdemeTutari !="" || $NetKazanc != "" || $Hash != ""){
								$hashKontrol = base64_encode(hash_hmac(\'sha256\',"$SiparisID|$ExtraData|$UserID|$ReturnData|$Status|$OdemeKanali|$OdemeTutari|$NetKazanc" . $apiKey, $apiSecret, true));
								if ($Hash == $hashKontrol){
									if ($Status == 100) {
										$uyesor	=	$vt->prepare("SELECT * FROM uyeler WHERE id=?");
										$uyesor-> execute(array($UserID));
										$uyecek	=	$uyesor->fetch(PDO::FETCH_OBJ);
											if ( $uyesor->rowCount() ) {
												$odemesor	=	$vt->prepare("SELECT * FROM paywant_odemeler WHERE odeme_ekstra=? && odendimi=?");
												$odemesor-> execute(array($ExtraData,0));
													if ( $odemesor->rowCount() ) {
														$odemecek  = $odemesor->fetch(PDO::FETCH_OBJ);
														$eklenecek = $odemecek->odeme_tutari;
														$bakiye	=	$vt->prepare("UPDATE uyeler SET bakiye=? WHERE id=?");
														$bakiye-> execute(array($uyecek->bakiye+$eklenecek,$UserID));
															if ($bakiye) {
																$duzelt	=	$vt->prepare("UPDATE paywant_odemeler SET odendimi=?, odeme_net=?, odeme_durum=? WHERE odeme_ekstra=?");
																$duzelt-> execute(array(1,$eklenecek,\'Onayland\',$ExtraData));
																$tarih  = date("Y.m.d H:i:s");
																$kazanc		=		$vt->prepare("INSERT INTO bakiye_kazanc SET tutar=?, tarih=?");
																$kazanc		->	execute(array($eklenecek,$tarih));
																echo "OK";
															}else{
																echo "NO - BAKYE EKLENEMED";
															}
													}else{
														echo "NO - DEME DAHA NCE YAPILMI";
													}
											}else{
												echo "NO - BYLE KULLANICI YOK";
											}
									}else{
										$duzelt	=	$vt->prepare("UPDATE paywant_odemeler SET  odeme_net=?, odeme_durum=? WHERE odeme_ekstra=?");
										$duzelt-> execute(array($eklenecek,\'ptal\',$ExtraData));
										echo \'NO - DEME PTAL EDLM\';
									}
								}else{
									echo \'NO - HASH HATALI\';
								}
						}else{
							echo \'NO - PARAMETRE EKSIK\';
						}
					}else{
						echo \'NO - POST YOK\';
					}
					## PAYWANT DEME KABUL BTR ##
	},\'add_paywant_accept.post\');
	$router->map(\'POST\', \'/mobil-onay\', function(){
    	global $vt,$title,$router,$siteayar,$uye;

			$onay_kodu	=	$_POST["onay_kodu"];

			$sor				=		$vt->prepare("SELECT * FROM onay_kodlari WHERE onay_sahibi=? && onay_kodu=?");
			$sor				->	execute(array($uye->username,$onay_kodu));
				if ( empty($onay_kodu) ) {
					$output	=	["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
					echo json_encode($output);
				}elseif( $sor->rowCount() ){
					$update	=	$vt->prepare("UPDATE uyeler SET onay=? WHERE username=?");
					$update-> execute(array(1,$uye->username));
					$sil		=	$vt->prepare("DELETE FROM onay_kodlari WHERE onay_sahibi=?");
					$sil	->	execute(array($uye->username));
						if ( $update ) {
							$output	=	["t"=>"Mkemmel!","m"=>"Hesabnz onayland, artk sipari vermeye hazrsnz.","s"=>"success","r"=>$router->generate(\'main.view\')];
							echo json_encode($output);
						}else{
							$output	=	["t"=>"Hata","m"=>"Hesabnz onaylanamad.","s"=>"error"];
							echo json_encode($output);
						}
				}else{
					$output	=	["t"=>"Hata","m"=>"Onay kodunu yanl girdiniz.","s"=>"error"];
					echo json_encode($output);
				}
				exit();
	},\'mobile.post\');
	$router->map(\'POST\', \'/giris-yap\', function(){
		global $vt,$title,$router,$siteayar;

		$mail			=	$_POST["mail"];
		$password	=	md5($_POST["password"]);
		$remember 	=	@$_POST["remember"];

		$ksorgu		=	$vt->prepare("SELECT * FROM uyeler WHERE mail=? && password=?");
		$ksorgu		->	execute(array($mail,$password));
		$kbilgi		=	$ksorgu		->fetch(PDO::FETCH_OBJ);

		if ( empty($mail) || empty($_POST["password"]) ) {
			$output	=	["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz","s"=>"info"];
			echo json_encode($output);
		}elseif(!$ksorgu->rowCount()){
			$output	=	["t"=>"Bilgi","m"=>"Kullanc adnz ya da parolanz hatal.","s"=>"info"];
			echo json_encode($output);
		}else{
			$_SESSION["login"]			=	true;
			$_SESSION["username"]		=	$kbilgi->username;

			if( @$remember == true ) { setcookie(\'username\',$kbilgi->username,time()+60*60*24*7); }


			$output	=	["t"=>"Mkemmel!","m"=>"Kullanc girii yapld, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate(\'main.view\')];
			echo json_encode($output);
		}
		exit();
	},\'login.post\');
	$router->map(\'POST\', \'/admin/giris-yap\', function(){
		global $vt,$title,$router,$siteayar;

		$mail			=	$_POST["mail"];
		$password	=	md5($_POST["password"]);

		$ksorgu		=	$vt->prepare("SELECT * FROM uyeler WHERE mail=? && password=? && yetki=?");
		$ksorgu		->	execute(array($mail,$password,\'Admin\'));
		$kbilgi		=	$ksorgu		->fetch(PDO::FETCH_OBJ);

		if ( empty($mail) || empty($_POST["password"]) ) {
			$output	=	["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz","s"=>"info"];
			echo json_encode($output);
		}elseif(!$ksorgu->rowCount()){
			$output	=	["t"=>"Bilgi","m"=>"Kullanc adnz ya da parolanz hatal.","s"=>"info"];
			echo json_encode($output);
		}else{
			$_SESSION["adminlogin"]	=	true;
			$_SESSION["admin"]			=	true;
			$_SESSION["username"]		=	$kbilgi->username;

			$output	=	["t"=>"Mkemmel!","m"=>"Admin girii yapld, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate(\'admin_main.view\')];
			echo json_encode($output);
		}
		exit();
	},\'adminlogin.post\');
	$router->map(\'POST\', \'/profil\', function(){
    	global $vt,$title,$router,$siteayar,$uye;
			$password	=	md5($_POST["password"]);
			$ypass		=	md5($_POST["npassword"]);
			$yypass		=	$_POST["nnpassword"];


			if ( empty($_POST["password"]) || empty($_POST["npassword"]) || empty($_POST["nnpassword"]) ) {
				$output	=	["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
				echo json_encode($output);
			}elseif($uye->password!=$password){
				$output	=	["t"=>"Bilgi","m"=>"Geerli parolanz yanl girdiniz.","s"=>"info"];
				echo json_encode($output);
			}elseif( strlen($_POST["npassword"])<6 ){
				$output	=	["t"=>"Bilgi","m"=>"Parolanz en az 6 karakterden olumal.","s"=>"info"];
				echo json_encode($output);
			}elseif( $_POST["npassword"] != $_POST["nnpassword"]  ){
				$output	=	["t"=>"Bilgi","m"=>"Girilen yeni ifreler birbirinin ayns olmal.","s"=>"info"];
				echo json_encode($output);
			}else{
				$update		=		$vt->prepare("UPDATE uyeler SET password=? WHERE username=? ");
				$update		->	execute(array($ypass,$uye->username));
					if ($update) {
						$output	=	["t"=>"Mkemmel!","m"=>"Parolanz baar ile gncellediniz.","s"=>"success"];
						echo json_encode($output);
					}else{
						$output	=	["t"=>"Hata","m"=>"Parolanz gncellerken bir hata ile karlatk.","s"=>"error"];
						echo json_encode($output);
					}
			}
			exit();
	},\'my_setting.post\');
	$router->map(\'POST\', \'/yeni-siparis\', function(){
    	global $vt,$title,$router,$siteayar,$uye,$smmapi;


			$kategori			=	$_POST["servisKat"];
			$miktar				=	$_POST["servisMiktar"];
			$bakiye				=	$uye->bakiye;
			$urun					=	$_POST["servisUrun"];
			$link					=	$_POST["servisLink"];
			$user					=	$uye->username;
			$gonderiSayi	=	@$_POST["gonderiSayi"];
			$gecikme			=	@$_POST["gecikme"];
			$otoMin				=	@$_POST["otoMin"];
			$otoMak				=	@$_POST["otoMak"];
			$yorumlar			=	@$_POST["yorumlar"];
			$yorumsayi		=	count(explode("
",$yorumlar));

			$urunbilgi=	$vt->prepare("SELECT * FROM urunler WHERE id=?");
			$urunbilgi->	execute(array($urun));
			$urunbilgi=	$urunbilgi->fetch(PDO::FETCH_OBJ); if($urunbilgi->urun_secenegi=="Paket"){$miktar="1";}
			if($urunbilgi->urun_secenegi==\'Paket\'){$miktar=$urunbilgi->urun_min;}
			$api			=	$vt->prepare("SELECT * FROM api WHERE id=?");
			$api		->	execute(array($urunbilgi->urun_api));
			$api			=	$api->fetch(PDO::FETCH_OBJ);


			$ozelfiyat=		$vt->prepare("SELECT * FROM fiyatlandirma WHERE fiyat_sahibi=? && fiyat_servis=?");
			$ozelfiyat-> execute(array($user,$urun));
			$ozelsay	=		$ozelfiyat->rowCount();
			$ozelfiyat=		$ozelfiyat->fetch(PDO::FETCH_OBJ);

			if ($ozelsay) {
				if ( @$urunbilgi->urun_secenegi == \'Paket\' ) {
					$fiyat   	= $ozelfiyat->fiyat_fiyat;
					$miktar		=	@$urunbilgi->urun_min;
					$ybakiye  	= 	$bakiye-$fiyat;
					$tarih		=	date("Y-m-d H:i:s");
					$servis		=	$urunbilgi->id;
				}elseif ( @$urunbilgi->urun_secenegi == \'Servis\' ) {
					$fiyat    	= 	$miktar*($ozelfiyat->fiyat_fiyat/1000);
					$ybakiye  	= 	$bakiye-$fiyat;
					$tarih		=	date("Y-m-d H:i:s");
					$servis		=	$urunbilgi->id;
				}elseif ( @$urunbilgi->urun_secenegi == \'Yorum\' ) {
					$fiyat    	= $yorumsayi*($ozelfiyat->fiyat_fiyat/1000);
					$ybakiye  	= 	$bakiye-$fiyat;
					$tarih		=	date("Y-m-d H:i:s");
					$servis		=	$urunbilgi->id;
				}elseif ( @$urunbilgi->urun_secenegi == \'Abonelik\' ) {
					$fiyat    = $miktar*$ozelfiyat->fiyat_fiyat;
					$miktar 	=	1;
					$ybakiye   	= 	$bakiye-$fiyat;
					$tarih		=	date("Y-m-d H:i:s");
					$servis		=	$urunbilgi->id;
				}
			}else{
				if ( @$urunbilgi->urun_secenegi == \'Paket\' ) {
					$fiyat  	= 	@$urunbilgi->urun_fiyat;
					$miktar		=	@$urunbilgi->urun_min;
					$ybakiye  = 	$bakiye-$fiyat;
					$tarih		=	date("Y-m-d H:i:s");
					$servis		=	$urunbilgi->id;
				}elseif ( @$urunbilgi->urun_secenegi == \'Servis\' ) {
					$fiyat  	= 	@$urunbilgi->urun_birim*$miktar;
					$ybakiye  = 	$bakiye-$fiyat;
					$tarih		=	date("Y-m-d H:i:s");
					$servis		=	$urunbilgi->id;
				}elseif ( @$urunbilgi->urun_secenegi == \'Yorum\' ) {
					$fiyat  	= 	@$urunbilgi->urun_birim*$yorumsayi;
					$ybakiye  = 	$bakiye-$fiyat;
					$tarih		=	date("Y-m-d H:i:s");
					$servis		=	$urunbilgi->id;
				}elseif ( @$urunbilgi->urun_secenegi == \'Abonelik\' ) {
					$fiyat  	= 	@$urunbilgi->urun_birim*$miktar;
					$miktar 	=	1;
					$ybakiye   	= 	$bakiye-$fiyat;
					$tarih		=	date("Y-m-d H:i:s");
					$servis		=	$urunbilgi->id;
				}
			}



			if ( $urun==\'0\' || $kategori==\'kategorisec\'  || empty($link) || ( $urunbilgi->urun_secenegi=="Servis" && empty($miktar) ) || ( $urunbilgi->urun_secenegi=="Yorum" && empty($yorumlar) ) ) {
				$output	=	["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz","s"=>"info"];
				echo json_encode($output);
			}elseif( $bakiye<$fiyat ){
				$output	=	["t"=>"Bilgi","m"=>"Bakiyeniz yetersiz.","s"=>"info"];
				echo json_encode($output);
			}elseif( $urunbilgi->urun_secenegi	==	"Abonelik" && empty($gonderiSayi) ){
				$output	=	["t"=>"Bilgi","m"=>"Gnderi saysn doldurmalsnz","s"=>"info"];
				echo json_encode($output);
			}elseif( $urunbilgi->urun_secenegi==\'Servis\' && $miktar<$urunbilgi->urun_min  ){
				$output	=	["t"=>"Bilgi","m"=>"Sipari edilen miktar, minimum sipari miktarndan dk.","s"=>"info"];
				echo json_encode($output);
			}elseif( $urunbilgi->urun_secenegi==\'Yorum\' && $yorumsayi<$urunbilgi->urun_min  ){
				$output	=	["t"=>"Bilgi","m"=>"Sipari edilen miktar, minimum sipari miktarndan dk.","s"=>"info"];
				echo json_encode($output);
			}elseif ( $urunbilgi->urun_secenegi==\'Yorum\' && $yorumsayi>$urunbilgi->urun_max  ) {
				$output	=	["t"=>"Bilgi","m"=>"Sipari edilen miktar, maksimum sipari miktarndan fazla.","s"=>"info"];
				echo json_encode($output);
			}elseif( $urunbilgi->urun_secenegi==\'Abonelik\' && $otoMin<$urunbilgi->urun_min ){
				$output	=	["t"=>"Bilgi","m"=>"Sipari edilen miktar, minimum sipari miktarndan dk.","s"=>"info"];
				echo json_encode($output);
			}elseif ($miktar>$urunbilgi->urun_max) {
				$output	=	["t"=>"Bilgi","m"=>"Sipari edilen miktar, maksimum sipari miktarndan fazla.","s"=>"info"];
				echo json_encode($output);
			}elseif ( $urunbilgi->urun_secenegi==\'Abonelik\' && $otoMak>$urunbilgi->urun_max  ) {
				$output	=	["t"=>"Bilgi","m"=>"Sipari edilen miktar, maksimum sipari miktarndan fazla.","s"=>"info"];
				echo json_encode($output);
			}else{

				if ($urunbilgi->urun_api=="Manuel") {
					$apiSiparis			=	array("order"=>"Manuel");
					$apiSiparis 		= (object) $apiSiparis;
					$api_order_id		=	1;
				}elseif( $api->api_tercih == "Takipcial.net" ){
					$post = array(
						\'type\'		=> \'neworder\',
						\'service\'	=> \'follow\',
						\'username\'	=> $link,
						\'quantity\'	=> $miktar,
					);
					$takipci			=	takipcialnetAPI( $post, $api->api_api, $api->api_url );
					$takipcialnet	=	json_decode($takipci);
					$api_order_id	=	@$takipcialnet->callback->orderid;
				}elseif( $api->api_tercih == \'Begenikasma.com\' ){
					$apiSiparis				=	begenikasmaAPI($api->api_api,$api->api_url,$link,$miktar);
					$apiSiparis				=	json_decode($apiSiparis);
					$api_order_id			=	@$apiSiparis->order_id;
				}elseif( $api->api_tercih == \'jnsta.mobi\' ){
					$fapi 						= new socialsmedia_api($api->api_api);
					$data = array(
						\'cmd\'     =>  \'orderadd\',\'orders\'  =>  array(
						 0 =>  array(\'service\' =>  $urunbilgi->urun_api_servis,\'amount\' =>  $miktar, \'data\' => $link,))
					 );
					 	$result 					= $fapi->query($data);
						$api_order_id			=	@$result[0][0][id];
				}elseif( $api->api_tercih == \'Sosyalpazarim.com\' ){
					$apiSiparis				=	sosyalpazarimAl($miktar,$link,$api->api_api);
					$apiSiparisSosyal	=	json_decode($apiSiparis);
					$api_order_id			=	1;
				}elseif( $api->api_tercih == \'Ytmatikvip.com\' ){
					$apiSiparis				=	YTMatikal($api->api_api,$api->api_url,$urunbilgi->urun_api_servis,$link,$miktar);
					$apiSiparisSosyal	=	json_decode($apiSiparis);
					$api_order_id			=	@$apiSiparis->order;
				}elseif( $api->api_tercih == \'Hizmetpaneli.com\' ){
					$apiSiparis				=	hizmetpaneliSatin($api->api_api,$urunbilgi->urun_api_servis,$miktar,$link,$api->api_url);
					$apiSiparisSosyal	=	json_decode($apiSiparis);
					$api_order_id			=	@$apiSiparis->order;
				}else{
					if ( $urunbilgi->urun_secenegi	==	"Abonelik" ) {
						$apiSiparis 	= $smmapi->yeniSiparis(array(\'key\' =>$api->api_api,\'action\' =>\'add\',\'service\'=>$urunbilgi->urun_api_servis,\'username\'=>$link,\'min\'=>$otoMin,\'max\'=>$otoMak,\'posts\'=>$gonderiSayi,\'delay\'=>$gecikme),$api->api_url);
						$api_order_id	=	$apiSiparis->order;
					}elseif( $urunbilgi->urun_secenegi	==	"Yorum" ) {
						$apiSiparis 	= $smmapi->yeniSiparis(array(\'key\' =>$api->api_api,\'action\' =>\'add\',\'service\'=>$urunbilgi->urun_api_servis,\'link\'=>$link,\'comments\'=>$yorumlar),$api->api_url);
						$api_order_id	=	$apiSiparis->order;
					}else{
						$apiSiparis 	= $smmapi->yeniSiparis(array(\'key\' =>$api->api_api,\'action\' =>\'add\',\'service\'=>$urunbilgi->urun_api_servis,\'link\'=>$link,\'quantity\'=>$miktar),$api->api_url);
						$api_order_id	=	@$apiSiparis->order;
					}
				}

				if ( @$apiSiparis->order || $api_order_id || @$takipcialnet->status==\'success\' || @$apiSiparisSosyal->islem==\'basarili\' ) {
					$siparis		=	$vt->prepare("INSERT INTO siparisler SET siparis_sahibi=?, siparis_servis=?, urun_api_order_id=?, siparis_durum=?, siparis_miktar=?, siparis_tutar=?, siparis_link=?, siparis_tarih=?");
					$siparis->  execute(array($user,$servis,$api_order_id,\'Beklemede\',$miktar,$fiyat,$link,$tarih));
						if ($siparis) {
							$output	=	["t"=>"Mkemmel!","m"=>"Sipariiniz verildi.","s"=>"success"];
							echo json_encode($output);
							$bakiye	=	$vt->prepare("UPDATE uyeler SET bakiye=? WHERE username=?");
							$bakiye-> execute(array($ybakiye,$user));
							//siparisMail(\'[email protected]\',\'Yeni sipariiniz mevcut.\',\'Sipari Bilgilendirme\');
						}elseif($apiSiparis->error){
							$output	=	["t"=>"Bilgi","m"=>"Sipari verilirken hata olutu.","s"=>"error"];
							echo json_encode($output);
						}
				}else{
					$output	=	["t"=>"Bilgi","m"=>"Sipari verilirken hata olutu.","s"=>"error"];
					echo json_encode($output);
				}
			}

			exit();

	},\'new_order.post\');
	$router->map(\'POST\', \'/yeni-destek-talebi\', function(){
		global $vt,$title,$router,$siteayar,$uye;

		$konu		=	$_POST["konu"];
		$baslik	=	$_POST["baslik"];
		$icerik	=	$_POST["icerik"];
		$tarih	=	date("Y-m-d H:i:s");

		$sorgu	=	$vt->prepare("SELECT * FROM destek_talepler WHERE talep_sahibi=? && talep_durum=? ");
		$sorgu->  execute(array($uye->username,\'Ak\'));

		if ( empty($konu) || empty($baslik) || empty($icerik) ) {
			$output	=	["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
			echo json_encode($output);
		}elseif($sorgu->rowCount()){
			$output	=	["t"=>"Bilgi","m"=>"Halen zlmemi bir destek talebin var.","s"=>"info"];
			echo json_encode($output);
		}else{
			$talep	=	$vt->prepare("INSERT INTO destek_talepler SET talep_sahibi=?, talep_tarihi=?, talep_baslik=?, talep_konu=?, talep_durum=? ");
			$talep -> execute(array($uye->username,$tarih,$baslik,$konu,\'Ak\'));
			$id			=	$vt->lastInsertId();
			$talepi	=	$vt->prepare("INSERT INTO destek_talep_cevap SET talep_id=?, talep_tarihi=?, talep_icerik=?, talep_user=? ");
			$talepi-> execute(array($id,$tarih,$icerik,$uye->username));
				if ($talep) {
					$output	=	["t"=>"Mkemmel!","m"=>"Destek talebiniz oluturuldu, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate(\'all_tickets.view\')];
					echo json_encode($output);
				}else{
					$output	=	["t"=>"Hata","m"=>"Destek talebiniz oluturulurken hata olutu.","s"=>"error"];
					echo json_encode($output);
				}
		}

		exit();
	},\'new_ticket.post\');
	$router->map(\'POST\', \'/talebe-cevap-ver-[*:slug]\', function($slug){
		global $vt,$title,$router,$siteayar,$uye;

		$id			=	$slug;
		$icerik	=	$_POST["icerik"];
		$tarih	=	date("Y-m-d H:i:s");

		$sorgu	=	$vt->prepare("SELECT * FROM destek_talepler WHERE id=?");
		$sorgu->  execute(array($id));

		if ( empty($icerik) ) {
			$output	=	["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
			echo json_encode($output);
		}elseif($sorgu->rowCount()<0){
			$output	=	["t"=>"Bilgi","m"=>"Byle bir destek talebi yok.","s"=>"info"];
			echo json_encode($output);
		}else{
			$talepi	=	$vt->prepare("INSERT INTO destek_talep_cevap SET talep_id=?, talep_tarihi=?, talep_icerik=?, talep_user=? ");
			$talepi-> execute(array($id,$tarih,$icerik,$uye->username));
				if ($talepi) {
					$edit		=	$vt->prepare("UPDATE destek_talepler SET talep_durum=? WHERE id=?");
					$edit		-> execute(array(\'Ak\',$id));
					$output	=	["t"=>"Mkemmel!","m"=>"Destek talebine cevap verdiniz, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate(\'all_tickets.view\')];
					echo json_encode($output);
				}else{
					$output	=	["t"=>"Hata","m"=>"Destek talebine destek verirken hata olutu.","s"=>"error"];
					echo json_encode($output);
				}
		}

		exit();
	},\'new_reply.post\');
	$router->map(\'POST\', \'/ajax-isleri\', function(){
    	global $vt,$title,$router,$siteayar,$uye;

			$durum	=	$_POST["durum"];

			if ($durum==1) {
				$id				=		$_POST["id"];
				$urunler	=		$vt->prepare("SELECT * FROM urunler WHERE urun_kategori=? && durum=?");
				$urunler	-> 	execute(array($id,\'1\'));
				$say 			=		$urunler->rowCount();
				$urunler	=		$urunler->fetchAll(PDO::FETCH_OBJ);
					if ($id=="kategorisec") {
						echo \'<option value="0">Ltfen nce kategori sein..</option>\';
					}else{
						if ($say) {
							foreach ($urunler as $urun) {
								echo \'<option value="\'.$urun->id.\'">\'.$urun->urun_adi.\'</option>\';
							}
						}else{
							echo \'<option value="0">Bu Kategoride rn Bulunmamaktadr.</option>\';
						}
					}
			}

			if ($durum==2) {
				$id				=		$_POST["id"];
				$ozelfiyat=		$vt->prepare("SELECT * FROM fiyatlandirma WHERE fiyat_sahibi=? && fiyat_servis=?");
				$ozelfiyat-> 	execute(array($uye->username,$id));
				$ozelsay	=		$ozelfiyat->rowCount();
				$ozelfiyat=		$ozelfiyat->fetch(PDO::FETCH_OBJ);
				$urun			=		$vt->prepare("SELECT * FROM urunler WHERE id=? && durum=?");
				$urun 		-> 	execute(array($id,\'1\'));
				$urun			=		$urun->fetch(PDO::FETCH_OBJ);
					if ($ozelsay>0) {
						echo $ozelfiyat->fiyat_fiyat/1000;
					}else{
						if ($urun->urun_secenegi=="Servis" || $urun->urun_secenegi=="Yorum") {
							echo $urun->urun_birim;
						}elseif($urun->urun_secenegi=="Paket"){
							echo $urun->urun_birim*1000;
						}
					}
			}

			if ($durum==3) {
				$id				=		$_POST["id"];
				$urun			=		$vt->prepare("SELECT * FROM urunler WHERE id=? && durum=?");
				$urun 		-> 	execute(array($id,\'1\'));
				$urun			=		$urun->fetch(PDO::FETCH_OBJ);
					echo $urun->urun_secenegi;
			}

			if ($durum==4) {
				$id				=		$_POST["id"];
				$urun			=		$vt->prepare("SELECT * FROM urunler WHERE id=? && durum=?");
				$urun 		-> 	execute(array($id,\'1\'));
				$urun			=		$urun->fetch(PDO::FETCH_OBJ);
					if ( strlen($urun->urun_aciklama)>5 ) {
						echo $urun->urun_aciklama;
					}else{
						echo \'0\';
					}
			}

			if ($durum==5) {
				$yorumlar				=		$_POST["yorumlar"];
				echo count(explode("
",$yorumlar));
				exit();
			}
	},\'urunleri_cek.post\');

	## Admin GET lemleri ##
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'\', function(){
    	global $vt,$title,$router,$siteayar,$uye,$kazanc,$bayisayisi,$odemesayisi,$talepsayisi;
				if (@$_SESSION["admin"]) {
					$title.=	\'Anasayfa\';
					include \'views/\'.SITE_TEMA.\'/admin/main.view.php\';
				}else{
					yonlendir($router->generate(\'admin_login.view\'));
				}
				exit();
	},\'admin_main.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/giris-yap\', function(){
    	global $vt,$title,$router,$siteayar;
			if (@!$_SESSION["admin"]) {
				$title.=	\'Giri Yap\';
				include \'views/\'.SITE_TEMA.\'/admin/login.view.php\';
			}else{
				yonlendir($router->generate(\'admin_main.view\'));
			}
			exit();
	},\'admin_login.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/haberler\', function(){
    	global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi,$haberler;
			if (@$_SESSION["admin"]) {
				$title.=	\'Haberler\';
				include \'views/\'.SITE_TEMA.\'/admin/news.view.php\';
			}else{
				yonlendir($router->generate(\'admin_login.view\'));
			}
			exit();
	},\'admin_new.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/yeni-haber\', function(){
    	global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi,$haberler;
			if (@$_SESSION["admin"]) {
				$title.=	\'Haberler\';
				include \'views/\'.SITE_TEMA.\'/admin/new_news.view.php\';
			}else{
				yonlendir($router->generate(\'admin_login.view\'));
			}
			exit();
	},\'admin_news.new.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/haber-duzenle/[*:slug]\', function($slug){
    	global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi,$haberler;
			if (@$_SESSION["admin"]) {
				$title.=	\'Haber Dzenle\';
				$haber	=	$vt->prepare("SELECT * FROM haberler WHERE id=?");
				$haber-> execute(array($slug));
				$haber = $haber->fetch(PDO::FETCH_OBJ);
				include \'views/\'.SITE_TEMA.\'/admin/edit_news.view.php\';
			}else{
				yonlendir($router->generate(\'admin_login.view\'));
			}
			exit();
	},\'admin_news.edit.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/odemeler\', function(){
    	global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi,$odemeler;
			if (@$_SESSION["admin"]) {
				$title.=	\'demeler\';
				include \'views/\'.SITE_TEMA.\'/admin/odemeler.view.php\';
			}else{
				yonlendir($router->generate(\'admin_login.view\'));
			}
			exit();
	},\'admin_odemeler.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/paywant-odemeler/[*:slug]\', function($slug){
    	global $vt,$title,$router,$siteayar,$uye,$kategoriler;
				if (@$_SESSION["admin"]) {
					$title.=	\'Paywant demeleri\';
					/* Sayfalama */
					$gozuksun = 20; // Listelemede yan yana ka sayfa numaras olsun
					$kactane  = 10; // Sayfada Ka Veri Gzksn
					$nereden  = $slug*$kactane-$kactane; // Veriler Nerden ekilmeye Balanacak
					$verisay  = $vt->query("SELECT * FROM paywant_odemeler WHERE odeme_durum=\'Onayland\' ")->rowCount(); // Ka Tane Veri Var
					$toplamsayfa  = ceil($verisay/$kactane); // Toplam Ka Sayfa Var
					if($verisay!=0){if($slug>$toplamsayfa){yonlendir($router->generate(\'admin_paywant_odemeler.view\',[\'slug\'=>1]));}}
					/* Sayfalama */
					$odemeler	=	$vt->prepare("SELECT * FROM paywant_odemeler WHERE odeme_durum=? ORDER BY id DESC LIMIT $nereden,$kactane");
					$odemeler	-> execute(array(\'Onayland\'));
					$odemeler	=	$odemeler->fetchAll(PDO::FETCH_OBJ);
					include \'views/\'.SITE_TEMA.\'/admin/paywant_odemeler.view.php\';
				}else{
					yonlendir($router->generate(\'admin_login.view\'));
				}
				exit();
	},\'admin_paywant_odemeler.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/paytr-odemeler/[*:slug]\', function($slug){
    	global $vt,$title,$router,$siteayar,$uye,$kategoriler;
				if (@$_SESSION["admin"]) {
					$title.=	\'Paywant demeleri\';
					/* Sayfalama */
					$gozuksun = 20; // Listelemede yan yana ka sayfa numaras olsun
					$kactane  = 10; // Sayfada Ka Veri Gzksn
					$nereden  = $slug*$kactane-$kactane; // Veriler Nerden ekilmeye Balanacak
					$verisay  = $vt->query("SELECT * FROM paytr_odemeler WHERE odendimi=\'1\' ")->rowCount(); // Ka Tane Veri Var
					$toplamsayfa  = ceil($verisay/$kactane); // Toplam Ka Sayfa Var
					if($verisay!=0){if($slug>$toplamsayfa){yonlendir($router->generate(\'admin_paytr_odemeler.view\',[\'slug\'=>1]));}}
					/* Sayfalama */
					$odemeler	=	$vt->prepare("SELECT * FROM paytr_odemeler WHERE odendimi=? ORDER BY id DESC LIMIT $nereden,$kactane");
					$odemeler	-> execute(array(\'1\'));
					$odemeler	=	$odemeler->fetchAll(PDO::FETCH_OBJ);
					include \'views/\'.SITE_TEMA.\'/admin/paytr_odemeler.view.php\';
				}else{
					yonlendir($router->generate(\'admin_login.view\'));
				}
				exit();
	},\'admin_paytr_odemeler.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/odeme-duzenle/[*:slug]\', function($slug){
    	global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi,$odemeler;
			if (@$_SESSION["admin"]) {
				$title.=	\'deme Dzenle\';
				$odeme	=	$vt->prepare("SELECT * FROM banka_odemeler WHERE id=?");
				$odeme-> execute(array($slug));
				$odeme	=	$odeme->fetch(PDO::FETCH_OBJ);
				$banka  = $vt->prepare("SELECT * FROM banka_hesaplari WHERE id=?");
				$banka-> execute(array($odeme->odeme_banka));
				$banka  = $banka->fetch(PDO::FETCH_OBJ);
				include \'views/\'.SITE_TEMA.\'/admin/odeme.edit.view.php\';
			}else{
				yonlendir($router->generate(\'admin_login.view\'));
			}
			exit();
	},\'admin_odeme.edit.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/banka-hesap-ekle\', function(){
    	global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi,$bankalar;
			if (@$_SESSION["admin"]) {
				$title.=	\'Banka Hesab Ekle\';
				include \'views/\'.SITE_TEMA.\'/admin/bank.account.new.view.php\';
			}else{
				yonlendir($router->generate(\'admin_login.view\'));
			}
			exit();
	},\'bank_account.new.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/banka-hesaplari\', function(){
    	global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi,$bankalar;
			if (@$_SESSION["admin"]) {
				$title.=	\'Banka Hesaplar\';
				include \'views/\'.SITE_TEMA.\'/admin/bank.account.view.php\';
			}else{
				yonlendir($router->generate(\'admin_login.view\'));
			}
			exit();
	},\'bank_accounts.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/banka-hesap/[*:slug]\', function($slug){
    	global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi,$bankalar;
			if (@$_SESSION["admin"]) {
				$title.=	\'Banka Hesab Dzenle\';
				$banka	=	$vt->prepare("SELECT * FROM banka_hesaplari WHERE id=?");
				$banka-> execute(array($slug));
				$banka	=	$banka->fetch(PDO::FETCH_OBJ);
				include \'views/\'.SITE_TEMA.\'/admin/bank.account.edit.view.php\';
			}else{
				yonlendir($router->generate(\'admin_login.view\'));
			}
			exit();
	},\'bank_account.edit.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/siparis-duzenle/[*:slug]\', function($slug){
    	global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi;
			if (@$_SESSION["admin"]) {
				$title.=	\'Sipari Dzenle\';
				$siparis	=	$vt->prepare("SELECT * FROM siparisler WHERE id=?");
				$siparis-> execute(array($slug));
				$siparis	=	$siparis->fetch(PDO::FETCH_OBJ);
				include \'views/\'.SITE_TEMA.\'/admin/order.edit.view.php\';
			}else{
				yonlendir($router->generate(\'admin_login.view\'));
			}
			exit();
	},\'admin_order_edit.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/siparisler\', function(){
    	global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi;
			if (@$_SESSION["admin"]) {
				$title.=	\'Sipariler\';
				$slug 	=	1;
				/* Sayfalama */
				$gozuksun = 20; // Listelemede yan yana ka sayfa numaras olsun
				$kactane  = 10; // Sayfada Ka Veri Gzksn
				$nereden  = $slug*$kactane-$kactane; // Veriler Nerden ekilmeye Balanacak
				$verisay  = $vt->query("SELECT * FROM siparisler")->rowCount(); // Ka Tane Veri Var
				$toplamsayfa  = ceil($verisay/$kactane); // Toplam Ka Sayfa Var
				if($slug>$toplamsayfa){yonlendir($router->generate(\'admin_orderss.view\',[\'slug\'=>1]));}
				/* Sayfalama */
				$siparisler	=	$vt->prepare("SELECT * FROM siparisler ORDER BY id DESC LIMIT $nereden,$kactane");
				$siparisler-> execute(array());
				$siparisler	=	$siparisler->fetchAll(PDO::FETCH_OBJ);
				include \'views/\'.SITE_TEMA.\'/admin/orders.view.php\';
			}else{
				yonlendir($router->generate(\'admin_login.view\'));
			}
			exit();
	},\'admin_orders.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/siparisler/[*:slug]\', function($slug){
    	global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi;
			if (@$_SESSION["admin"]) {
				$title.=	\'Sipariler\';
				/* Sayfalama */
				$gozuksun = 20; // Listelemede yan yana ka sayfa numaras olsun
				$kactane  = 10; // Sayfada Ka Veri Gzksn
				$nereden  = $slug*$kactane-$kactane; // Veriler Nerden ekilmeye Balanacak
				$verisay  = $vt->query("SELECT * FROM siparisler")->rowCount(); // Ka Tane Veri Var
				$toplamsayfa  = ceil($verisay/$kactane); // Toplam Ka Sayfa Var
				if($slug>$toplamsayfa){yonlendir($router->generate(\'admin_orderss.view\',[\'slug\'=>1]));}
				/* Sayfalama */
				$siparisler	=	$vt->prepare("SELECT * FROM siparisler ORDER BY id DESC LIMIT $nereden,$kactane");
				$siparisler-> execute(array());
				$siparisler	=	$siparisler->fetchAll(PDO::FETCH_OBJ);
				include \'views/\'.SITE_TEMA.\'/admin/orders.view.php\';
			}else{
				yonlendir($router->generate(\'admin_login.view\'));
			}
			exit();
	},\'admin_orderss.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/api-ekle\', function(){
    	global $vt,$title,$router,$siteayar,$uye;
				if (@$_SESSION["admin"]) {
					$title.=	\'API Olutur\';
					include \'views/\'.SITE_TEMA.\'/admin/new_api.view.php\';
				}else{
					yonlendir($router->generate(\'admin_login.view\'));
				}
				exit();
	},\'new_api.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/apiler\', function(){
    	global $vt,$title,$router,$siteayar,$uye,$apiler,$smmapi;
				if (@$_SESSION["admin"]) {
					$title.=	\'Sistemdeki API Servisleri\';
					include \'views/\'.SITE_TEMA.\'/admin/api.view.php\';
				}else{
					yonlendir($router->generate(\'admin_login.view\'));
				}
				exit();
	},\'api.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/api-duzenle/[*:slug]\', function($slug){
    	global $vt,$title,$router,$siteayar,$uye;
				if (@$_SESSION["admin"]) {
					$title.=	\'API Olutur\';
					$api	=	$vt->prepare("SELECT * FROM api WHERE id=?");
					$api-> execute(array($slug));
					$api	=	$api->fetch(PDO::FETCH_OBJ);
					include \'views/\'.SITE_TEMA.\'/admin/edit_api.view.php\';
				}else{
					yonlendir($router->generate(\'admin_login.view\'));
				}
				exit();
	},\'edit_api.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/kategoriler\', function(){
    	global $vt,$title,$router,$siteayar,$uye,$kategoriler;
				if (@$_SESSION["admin"]) {
					$title.=	\'Sistemdeki rn Kategorileri\';
					include \'views/\'.SITE_TEMA.\'/admin/all_categories.view.php\';
				}else{
					yonlendir($router->generate(\'admin_login.view\'));
				}
				exit();
	},\'all_categories.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/urun-ekle\', function(){
    	global $vt,$title,$router,$siteayar,$uye,$apiler,$kategoriler;
				if (@$_SESSION["admin"]) {
					$title.=	\'Yeni rn Ekle\';
					include \'views/\'.SITE_TEMA.\'/admin/new_product.view.php\';
				}else{
					yonlendir($router->generate(\'admin_login.view\'));
				}
				exit();
	},\'new_product.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/urunler\', function(){
    	global $vt,$title,$router,$siteayar,$uye,$urunlerr;
				if (@$_SESSION["admin"]) {
					$title.=	\'rnler\';
					include \'views/\'.SITE_TEMA.\'/admin/all_product.view.php\';
				}else{
					yonlendir($router->generate(\'admin_login.view\'));
				}
				exit();
	},\'all_product.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/urun-duzenle/[*:slug]\', function($slug){
    	global $vt,$title,$router,$siteayar,$uye,$apiler,$kategoriler;
				if (@$_SESSION["admin"]) {
					$title.=	\'rn Dzenle\';
					$urun	=	$vt->prepare("SELECT * FROM urunler WHERE id=?");
					$urun-> execute(array($slug));
					$urun	=	$urun->fetch(PDO::FETCH_OBJ);
					include \'views/\'.SITE_TEMA.\'/admin/edit_product.view.php\';
				}else{
					yonlendir($router->generate(\'admin_login.view\'));
				}
				exit();
	},\'edit_product.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/uye-ara\', function(){
    	global $vt,$title,$router,$siteayar,$uye,$kategoriler;
				if (@$_SESSION["admin"]) {
					$title.=	\'ye Ara\';
					$kelime	= $_GET["ara"];
					$tip	=	$_GET["tip"];
					if ( $tip == \'mail\' ) {
						$sor  		= $vt->prepare("SELECT * FROM uyeler WHERE mail LIKE ? ");
						$sor			-> execute(array("%".$kelime."%"));
					}elseif( $tip == \'telefon\' ){
						$sor  		= $vt->prepare("SELECT * FROM uyeler WHERE telefon LIKE ? ");
						$sor			-> execute(array("%".$kelime."%"));
					}elseif( $tip == \'username\' ){
						$sor  		= $vt->prepare("SELECT * FROM uyeler WHERE username LIKE ?\' ");
						$sor			-> execute(array("%".$kelime."%"));
					}elseif( $tip == \'ad\' ){
						$sor  		= $vt->prepare("SELECT * FROM uyeler WHERE adsoyad LIKE ?\' ");
						$sor			-> execute(array("%".$kelime."%"));
					}
					/* Sayfalama */
					if ( $tip == \'mail\' ) {
						$uyeler	=	$vt->prepare("SELECT * FROM uyeler WHERE mail LIKE ? ORDER BY id DESC");
						$uyeler	-> execute(array("%".$kelime."%"));
						$uyeler	=	$uyeler->fetchAll(PDO::FETCH_OBJ);
					}elseif( $tip == \'telefon\' ){
						$uyeler	=	$vt->prepare("SELECT * FROM uyeler WHERE telefon LIKE ? ORDER BY id DESC");
						$uyeler	-> execute(array("%".$kelime."%"));
						$uyeler	=	$uyeler->fetchAll(PDO::FETCH_OBJ);
					}elseif( $tip == \'username\' ){
						$uyeler	=	$vt->prepare("SELECT * FROM uyeler WHERE username LIKE ? ORDER BY id DESC");
						$uyeler	-> execute(array("%".$kelime."%"));
						$uyeler	=	$uyeler->fetchAll(PDO::FETCH_OBJ);
					}elseif( $tip == \'ad\' ){
						$uyeler	=	$vt->prepare("SELECT * FROM uyeler WHERE adsoyad LIKE ? ORDER BY id DESC");
						$uyeler	-> execute(array("%".$kelime."%"));
						$uyeler	=	$uyeler->fetchAll(PDO::FETCH_OBJ);
					}
					include \'views/\'.SITE_TEMA.\'/admin/ara_users.view.php\';
				}else{
					yonlendir($router->generate(\'admin_login.view\'));
				}
				exit();
	},\'ara_users.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/uyeler/[*:slug]\', function($slug){
    	global $vt,$title,$router,$siteayar,$uye,$kategoriler;
				if (@$_SESSION["admin"]) {
					$title.=	\'Sistemdeki yeler\';
					/* Sayfalama */
					$gozuksun = 20; // Listelemede yan yana ka sayfa numaras olsun
					$kactane  = 10; // Sayfada Ka Veri Gzksn
					$nereden  = $slug*$kactane-$kactane; // Veriler Nerden ekilmeye Balanacak
					$verisay  = $vt->query("SELECT * FROM uyeler")->rowCount(); // Ka Tane Veri Var
					$toplamsayfa  = ceil($verisay/$kactane); // Toplam Ka Sayfa Var
					if($slug>$toplamsayfa){yonlendir($router->generate(\'all_users.view\',[\'slug\'=>1]));}
					/* Sayfalama */
					$uyeler	=	$vt->prepare("SELECT * FROM uyeler ORDER BY id DESC LIMIT $nereden,$kactane");
					$uyeler	-> execute(array());
					$uyeler	=	$uyeler->fetchAll(PDO::FETCH_OBJ);
					include \'views/\'.SITE_TEMA.\'/admin/all_users.view.php\';
				}else{
					yonlendir($router->generate(\'admin_login.view\'));
				}
				exit();
	},\'all_users.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/uye/[*:slug]/fiyatlar\', function($slug){
    	global $vt,$title,$router,$siteayar,$uye,$urunler;
				if (@$_SESSION["admin"]) {
					$title.=	\'yeye zel Fiyatlandrma\';
					$uyesor	=	$vt->prepare("SELECT * FROM uyeler WHERE id=?");
					$uyesor-> execute(array($slug));
						if (!$uyesor	=	$uyesor->fetch(PDO::FETCH_OBJ)) {
							yonlendir($router->generate(\'admin_main.view\'));
						}
					include \'views/\'.SITE_TEMA.\'/admin/private_price.view.php\';
				}else{
					yonlendir($router->generate(\'admin_login.view\'));
				}
				exit();
	},\'private_price.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/uye/[*:slug]\', function($slug){
    	global $vt,$title,$router,$siteayar,$uye,$kategoriler;
				if (@$_SESSION["admin"]) {
						if ( $slug == "[*:slug]") {
							$slug	=	$_GET["slug"];
						}
					$title.=	\'ye Bilgileri\';
					$uyebilgi	=	$vt->prepare("SELECT * FROM uyeler WHERE username=?");
					$uyebilgi	-> execute(array($slug));
					$uyesay		=	$uyebilgi->rowCount();
					$uyebilgi	=	$uyebilgi->fetch(PDO::FETCH_OBJ);
							include \'views/\'.SITE_TEMA.\'/admin/edit_user.view.php\';
				}else{
					yonlendir($router->generate(\'admin_login.view\'));
				}
				exit();
	},\'edit_user.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/destek-talepleri\', function(){
    	global $vt,$title,$router,$siteayar,$uye;
				if (@$_SESSION["admin"]) {
					$title.=	\'Destek Talepleri\';
					$talepler	=	$vt->prepare("SELECT * FROM destek_talepler ORDER BY id DESC");
					$talepler-> execute(array());
					$talepler	=	$talepler->fetchAll(PDO::FETCH_OBJ);
					include \'views/\'.SITE_TEMA.\'/admin/all_tickets.view.php\';
				}else{
					yonlendir($router->generate(\'admin_login.view\'));
				}
				exit();
	},\'admin_tickets.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/destek-talepleri/bekleyenler\', function(){
    	global $vt,$title,$router,$siteayar,$uye;
				if (@$_SESSION["admin"]) {
					$title.=	\'Destek Talepleri\';
					$talepler	=	$vt->prepare("SELECT * FROM destek_talepler WHERE talep_durum=? ORDER BY id DESC");
					$talepler-> execute(array(\'Ak\'));
					$talepler	=	$talepler->fetchAll(PDO::FETCH_OBJ);
					include \'views/\'.SITE_TEMA.\'/admin/all_tickets.view.php\';
				}else{
					yonlendir($router->generate(\'login.view\'));
				}
				exit();
	},\'admin_tickets_bekleyenler.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/destek-talepleri/yanitlanmis\', function(){
    	global $vt,$title,$router,$siteayar,$uye;
				if (@$_SESSION["admin"]) {
					$title.=	\'Destek Talepleri\';
					$talepler	=	$vt->prepare("SELECT * FROM destek_talepler WHERE talep_durum=? ORDER BY id DESC");
					$talepler-> execute(array(\'Yantland\'));
					$talepler	=	$talepler->fetchAll(PDO::FETCH_OBJ);
					include \'views/\'.SITE_TEMA.\'/admin/all_tickets.view.php\';
				}else{
					yonlendir($router->generate(\'admin_login.view\'));
				}
				exit();
	},\'admin_tickets_yanitlandi.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/destek-talepleri/kapali\', function(){
    	global $vt,$title,$router,$siteayar,$uye;
				if (@$_SESSION["admin"]) {
					$title.=	\'Destek Talepleri\';
					$talepler	=	$vt->prepare("SELECT * FROM destek_talepler WHERE talep_durum=? ORDER BY id DESC");
					$talepler-> execute(array(\'Kapal\'));
					$talepler	=	$talepler->fetchAll(PDO::FETCH_OBJ);
					include \'views/\'.SITE_TEMA.\'/admin/all_tickets.view.php\';
				}else{
					yonlendir($router->generate(\'admin_login.view\'));
				}
				exit();
	},\'admin_tickets_kapali.view\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'/destek-talep/[*:slug]\', function($slug){
    	global $vt,$title,$router,$siteayar,$uye;
				if (@$_SESSION["admin"]) {
					$title.=	\'Destek Talepleri\';
					$talep	=	$vt->prepare("SELECT * FROM destek_talep_cevap WHERE talep_id=? ORDER BY id ASC");
					$talep-> execute(array($slug));
					$talep	=	$talep->fetchAll(PDO::FETCH_OBJ);
					include \'views/\'.SITE_TEMA.\'/admin/read_ticket.view.php\';
				}else{
					yonlendir($router->generate(\'admin_login.view\'));
				}
				exit();
	},\'admin_ticket_read.view\');



	## SMS Yolla ##
	$router->map(\'POST\', \'/toplu-sms\', function(){
		global $vt,$title,$router,$siteayar,$uye;
		$mesaj	=	$_POST["sms"];
			topluSMS($mesaj);
			exit();
	},\'toplu_sms.post\');
	$router->map(\'POST\', \'/sms-yolla-[*:slug]\', function($slug){
		global $vt,$title,$router,$siteayar,$uye;
		$uyesor = $vt->prepare("SELECT * FROM uyeler WHERE username=?");
		$uyesor-> execute(array($slug));
		$uyesor = $uyesor->fetch(PDO::FETCH_OBJ);
		$mesaj	=	$_POST["sms"];
			uyeyeSMS($uyesor->telefon,$mesaj);
			exit();
	},\'send_sms.post\');
	$router->map(\'POST\', \'/yeni-kod-yolla\', function(){
		global $vt,$title,$router,$siteayar,$uye;

		if ( $uye->onay == 0 ) {
			$onaysor = $vt->prepare("SELECT * FROM onay_kodlari WHERE onay_sahibi=?");
			$onaysor-> execute(array($uye->username));
				if ( $onaysor->rowCount() ) {
					$onaysor = $onaysor->fetch(PDO::FETCH_OBJ);
					$t			 = date("Hi");
					$t2			= date("Hi", strtotime($onaysor->onay_tarihi));
						if ( $t-$t2 > 3 ) {
							tekrarkodSMS($uye->telefon,$onaysor->onay_kodu);
						}else{
							$output	=	["t"=>"Bilgi","m"=>"Yeni kod alabilmek iin son kod istemenizin stnden 3 dakika gemeli","s"=>"info"];
							echo json_encode($output);
						}
				}else{
					$tarih		=	date("Y-m-d H:i:s");
					$kod			= rand(0,9).rand(0,9).rand(0,9).rand(0,9).rand(0,9).rand(0,9);
					$kodekle	=	$vt->prepare("INSERT INTO onay_kodlari SET onay_sahibi=?, onay_kodu=?, onay_tarihi=?");
					$kodekle-> execute(array($uye->username,$kod,$tarih));
						if ($kodekle) {
							tekrarkodSMS($uye->telefon,$kod);
						}else{
							$output	=	["t"=>"Hata","m"=>"Kod gnderilirken hata olutu.","s"=>"error"];
							echo json_encode($output);
						}
				}
		}else{
			$output	=	["t"=>"Bilgi","m"=>"Hesabnz zaten onayl.","s"=>"info"];
			echo json_encode($output);
		}
		exit();
	},\'onay_kodu.again.post\');

	## Admin POST lemleri ##
	$router->map(\'POST\', \'/\'.$siteayar->site_admin, function(){
		global $vt,$title,$router,$siteayar,$uye;
		if ( !$_SESSION[\'admin\'] ) { exit; }
		$sozlesme					=	$_POST["ckEditor"];
		$site_url					=	$_POST["site_url"];
		$site_title				=	$_POST["site_title"];
		$site_description	=	$_POST["site_description"];
		$site_keywords		=	$_POST["site_keywords"];
		$site_admin				=	$_POST["site_admin"];
		$sms_saglayici		=	$_POST["sms_saglayici"];
		$sms_baslik				=	$_POST["sms_baslik"];
		$sms_kadi					=	$_POST["sms_kadi"];
		$sms_sifre				=	$_POST["sms_sifre"];
		$sms_onay					=	$_POST["sms_onay"];
		$paywant_aktif		=	$_POST["paywant_aktif"];
		$paywant_api			=	$_POST["paywant_api"];
		$paywant_secret		=	$_POST["paywant_secret"];
		$merchant_id			=	$_POST["merchant_id"];
		$merchant_key			=	$_POST["merchant_key"];
		$merchant_salt		=	$_POST["merchant_salt"];
		$odeme_tipi				=	$_POST["odeme_tipi"];
		$buypayer_magaza				=	$_POST["buypayer_magaza"];
		$buypayer_mail				=	$_POST["buypayer_mail"];
		$buypayer_guvenlik				=	$_POST["buypayer_guvenlik"];

		if ( empty($site_url) || empty($site_title) || empty($site_description) || empty($site_keywords)   ) {
			$output	=	["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
			echo json_encode($output);
		}else{
			$edit	=	$vt->prepare("UPDATE siteayar SET
			buypayer_magaza=?,buypayer_mail=?,buypayer_guvenlik=?,
			merchant_id=?,merchant_key=?,merchant_salt=?,odeme_tipi=?,sozlesme=?, site_url=?, site_title=?, site_description=?, site_keywords=?, site_admin=?, paywant_aktif=?, paywant_api=?, paywant_secret=?, sms_saglayici=?, sms_baslik=?, sms_kadi=?, sms_sifre=?, sms_onay=? WHERE id=?");
			$edit-> execute(array($buypayer_magaza,$buypayer_mail,$buypayer_guvenlik,$merchant_id,$merchant_key,$merchant_salt,$odeme_tipi,$sozlesme,$site_url,$site_title,$site_description,$site_keywords,$site_admin,$paywant_aktif,$paywant_api,$paywant_secret,$sms_saglayici,$sms_baslik,$sms_kadi,$sms_sifre,$sms_onay,1));
				if ($edit) {
					$output	=	["t"=>"Mkemmel!","m"=>"Sistem bilgileri gncellendi, ynlendiriliyorsunuz.","s"=>"success","r"=>$site_admin];
					echo json_encode($output);
				}else{
					$output	=	["t"=>"Hata!","m"=>"Sistem bilgileri gncellenirken hata olutu.","s"=>"error"];
					echo json_encode($output);
				}
		}
		exit();
	},\'admin_main.post\');
	$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/uye-sil/[*:slug]\', function($slug){
		global $vt,$title,$router,$siteayar,$uye;
		if ( !$_SESSION[\'admin\'] ) { exit; }
			$uyecek	=	$vt->prepare("SELECT * FROM uyeler WHERE id=?");
			$uyecek-> execute(array($slug));
			$uyecek	=	$uyecek->fetch(PDO::FETCH_OBJ);

			$delete	=	$vt->prepare("DELETE FROM uyeler WHERE id=?");
			$delete-> execute(array($slug));
				if ($delete) {

					$delete	=	$vt->prepare("DELETE FROM siparisler WHERE siparis_sahibi=?");
					$delete-> execute(array($uyecek->username));
					$delete	=	$vt->prepare("DELETE FROM paywant_odemeler WHERE odeme_sahibi=?");
					$delete-> execute(array($uyecek->username));
					$delete	=	$vt->prepare("DELETE FROM fiyatlandirma WHERE fiyat_sahibi=?");
					$delete-> execute(array($uyecek->username));
					$delete	=	$vt->prepare("DELETE FROM destek_talepler WHERE talep_sahibi=?");
					$delete-> execute(array($uyecek->username));
					$delete	=	$vt->prepare("DELETE FROM destek_talep_cevap WHERE talep_user=?");
					$delete-> execute(array($uyecek->username));
					$delete	=	$vt->prepare("DELETE FROM banka_odemeler WHERE odeme_sahibi=?");
					$delete-> execute(array($uyecek->username));

					$output	=	["t"=>"Mkemmel!","m"=>"ye sistemden kaldrld, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("all_users.view")];
					echo json_encode($output);
				}else{
					$output	=	["t"=>"Hata!","m"=>"ye kaldrrken hata olutu.","s"=>"error"];
					echo json_encode($output);
				}
				exit();
	},\'delete_user.post\');
	$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/haber-duzenle/[*:slug]\', function($slug){
		global $vt,$title,$router,$siteayar,$uye;
		if ( !$_SESSION[\'admin\'] ) { exit; }
			$haber_baslik		=	$_POST["haber_baslik"];
			$haber_icerik		=	$_POST["haber_icerik"];

				if ( empty($haber_baslik) || empty($haber_icerik) ) {
					$output	=	["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
					echo json_encode($output);
				}else{
					$duzelt	=	$vt->prepare("UPDATE haberler SET haber_baslik=?, haber_icerik=? WHERE id=?");
					$duzelt-> execute(array($haber_baslik,$haber_icerik,$slug));
						if ($duzelt) {
							$output	=	["t"=>"Mkemmel!","m"=>"Yeni haber dzenlendi, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("admin_new.view")];
							echo json_encode($output);
						}else{
							$output	=	["t"=>"Hata!","m"=>"Haber dzenlenirken hata olutu.","s"=>"error"];
							echo json_encode($output);
						}
				}

				exit();
	},\'admin_news.edit.post\');
	$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/haber-ekle\', function(){
		global $vt,$title,$router,$siteayar,$uye;
		if ( !$_SESSION[\'admin\'] ) { exit; }
			$haber_baslik		=	$_POST["haber_baslik"];
			$haber_icerik		=	$_POST["haber_icerik"];
			$tarih					=	date("Y-m-d H:i:s");

				if ( empty($haber_baslik) || empty($haber_icerik) ) {
					$output	=	["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
					echo json_encode($output);
				}else{
					$ekle	=	$vt->prepare("INSERT INTO haberler SET haber_baslik=?, haber_icerik=?, haber_tarih=?");
					$ekle-> execute(array($haber_baslik,$haber_icerik,$tarih));
						if ($ekle) {
							$output	=	["t"=>"Mkemmel!","m"=>"Yeni haber eklendi, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("admin_new.view")];
							echo json_encode($output);
						}else{
							$output	=	["t"=>"Hata!","m"=>"Haber eklenirken hata olutu.","s"=>"error"];
							echo json_encode($output);
						}
				}

				exit();
	},\'admin_news.new.post\');
	$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/haber-sil/[*:slug]\', function($slug){
		global $vt,$title,$router,$siteayar,$uye;
		if ( !$_SESSION[\'admin\'] ) { exit; }
			$delete	=	$vt->prepare("DELETE FROM haberler WHERE id=?");
			$delete-> execute(array($slug));
				if ($delete) {
					$output	=	["t"=>"Mkemmel!","m"=>"Haber sistemden kaldrld, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("admin_new.view")];
					echo json_encode($output);
				}else{
					$output	=	["t"=>"Hata!","m"=>"Haber kaldrlrken hata olutu.","s"=>"error"];
					echo json_encode($output);
				}

				exit();
	},\'admin_news.delete.post\');
	$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/odeme-duzenle/[*:slug]\', function($slug){
		global $vt,$title,$router,$siteayar,$uye;
		if ( !$_SESSION[\'admin\'] ) { exit; }
		$odeme_durum				=	$_POST["odeme_durum"];

		$odeme	=	$vt->prepare("SELECT * FROM banka_odemeler WHERE id=?");
		$odeme-> execute(array($slug));
		$odeme	=	$odeme->fetch(PDO::FETCH_OBJ);

		$sahip	=	$vt->prepare("SELECT * FROM uyeler WHERE username=?");
		$sahip-> execute(array($odeme->odeme_sahibi));
		$sahip	=	$sahip->fetch(PDO::FETCH_OBJ);

		if ( $odeme->odendimi == 0  && $odeme_durum == \'Onayland\' ) {
			$bakiye	=	$vt->prepare("UPDATE uyeler SET bakiye=? WHERE username=?");
			$bakiye-> execute(array($sahip->bakiye+$odeme->odeme_tutar,$odeme->odeme_sahibi));
			$odendi = $vt->prepare("UPDATE banka_odemeler SET odendimi=? WHERE id=?");
			$odendi-> execute(array(1,$slug));
			$tarih  = date("Y.m.d H:i:s");
			$kazanc		=		$vt->prepare("INSERT INTO bakiye_kazanc SET tutar=?, tarih=?");
			$kazanc		->	execute(array($odeme->odeme_tutar,$tarih));
		}

		if ( empty($odeme_durum) ) {
			$output	=	["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
			echo json_encode($output);
		}else{
			$duzelt	=	$vt->prepare("UPDATE banka_odemeler SET odeme_durum=?  WHERE id=?");
			$duzelt-> execute(array($odeme_durum,$slug));
				if ($duzelt) {
					$output	=	["t"=>"Mkemmel!","m"=>"deme dzenlendi, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("admin_odemeler.view")];
					echo json_encode($output);
				}else{
					$output	=	["t"=>"Hata!","m"=>"deme gncellenirken hata olutu.","s"=>"error"];
					echo json_encode($output);
				}
		}
		exit();
	},\'admin_odeme.edit.post\');
	$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/banka-hesap-ekle\', function(){
		global $vt,$title,$router,$siteayar,$uye;
		if ( !$_SESSION[\'admin\'] ) { exit; }
		$ad				=	$_POST["ad"];
		$iban			=	$_POST["iban"];
		$hesap		=	$_POST["hesap"];
		$sube			=	$_POST["sube"];
		$alici		=	$_POST["alici"];
		$logo			=	$_POST["logo"];

		if ( empty($ad) || empty($iban) || empty($alici) || empty($logo) ) {
			$output	=	["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
			echo json_encode($output);
		}else{
			$ekle	=	$vt->prepare("INSERT INTO banka_hesaplari SET banka_ad=?, banka_iban=?, banka_hesapno=?, banka_sube=?, banka_alici=?, banka_logo=?");
			$ekle-> execute(array($ad,$iban,$hesap,$sube,$alici,$logo));
				if ($ekle) {
					$output	=	["t"=>"Mkemmel!","m"=>"Banka bilgileri eklendi, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("bank_accounts.view")];
					echo json_encode($output);
				}else{
					$output	=	["t"=>"Hata!","m"=>"Banka bilgileri eklenirken hata olutu.","s"=>"error"];
					echo json_encode($output);
				}
		}
		exit();
	},\'bank_account.new.post\');
	$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/banka-hesap/[*:slug]\', function($slug){
		global $vt,$title,$router,$siteayar,$uye;
		if ( !$_SESSION[\'admin\'] ) { exit; }
		$ad				=	$_POST["ad"];
		$iban			=	$_POST["iban"];
		$hesap		=	$_POST["hesap"];
		$sube			=	$_POST["sube"];
		$alici		=	$_POST["alici"];
		$logo			=	$_POST["logo"];

		if ( empty($ad) || empty($iban) || empty($alici) || empty($logo) ) {
			$output	=	["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
			echo json_encode($output);
		}else{
			$duzelt	=	$vt->prepare("UPDATE banka_hesaplari SET banka_ad=?, banka_iban=?, banka_hesapno=?, banka_sube=?, banka_alici=?, banka_logo=?  WHERE id=?");
			$duzelt-> execute(array($ad,$iban,$hesap,$sube,$alici,$logo,$slug));
				if ($duzelt) {
					$output	=	["t"=>"Mkemmel!","m"=>"Banka bilgileri dzenlendi, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("bank_accounts.view")];
					echo json_encode($output);
				}else{
					$output	=	["t"=>"Hata!","m"=>"Banka bilgileri gncellenirken hata olutu.","s"=>"error"];
					echo json_encode($output);
				}
		}
		exit();
	},\'bank_account.edit.post\');
	$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/banka-hesap-sil/[*:slug]\', function($slug){
		global $vt,$title,$router,$siteayar,$uye;
		if ( !$_SESSION[\'admin\'] ) { exit; }
			$duzelt	=	$vt->prepare("UPDATE banka_hesaplari SET banka_durum=?  WHERE id=?");
			$duzelt-> execute(array(\'0\',$slug));
				if ($duzelt) {
					$output	=	["t"=>"Mkemmel!","m"=>"Banka bilgileri sistemden kaldrld, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("bank_accounts.view")];
					echo json_encode($output);
				}else{
					$output	=	["t"=>"Hata!","m"=>"Banka bilgileri kaldrlrken hata olutu.","s"=>"error"];
					echo json_encode($output);
				}

				exit();
	},\'bank_account.delete.post\');
	$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/siparis-duzenle/[*:slug]\', function($slug){
		global $vt,$title,$router,$siteayar,$uye;
		if ( !$_SESSION[\'admin\'] ) { exit; }
		$durum		=	$_POST["durum"];

		$sor	=	$vt->prepare("SELECT * FROM siparisler WHERE id=? ");
		$sor	-> execute(array($slug));
		$sor	=	$sor->fetch(PDO::FETCH_OBJ);



		if ( empty($durum) ) {
			$output	=	["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
			echo json_encode($output);
		}else{
			$insert	=	$vt->prepare("UPDATE siparisler SET siparis_durum=? WHERE id=?");
			$insert-> execute(array($durum,$slug));
				if ($insert) {
					if ( $sor->siparis_durum!="ptal" && $durum == "ptal" ) {
						$uyesor	=	$vt->prepare("SELECT * FROM uyeler WHERE username=? ");
						$uyesor	-> execute(array($sor->siparis_sahibi));
						$uyesor	=	$uyesor->fetch(PDO::FETCH_OBJ);
						$bakiye	=	$uyesor->bakiye+$sor->siparis_tutar;
						$update	=	$vt->prepare("UPDATE uyeler SET bakiye=? WHERE username=?");
						$update-> execute(array($bakiye,$sor->siparis_sahibi));
					}
					$output	=	["t"=>"Mkemmel!","m"=>"Sipari baaryla gncellendir, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("admin_orders.view")];
					echo json_encode($output);
				}else{
					$output	=	["t"=>"Hata!","m"=>"Sipari gncellenirken hata olutu.","s"=>"error"];
					echo json_encode($output);
				}
		}
		exit();
	},\'admin_order_edit.post\');
	$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/api-olustur\', function(){
		global $vt,$title,$router,$siteayar,$uye;
		if ( !$_SESSION[\'admin\'] ) { exit; }
		$ad		=	$_POST["adi"];
		$url	=	$_POST["url"];
		$api	=	$_POST["api"];
		$trch	=	$_POST["api_tercih"];

		$sor	=	$vt->prepare("SELECT * FROM api WHERE api_url=? ");
		$sor	-> execute(array($url));

		if ( empty($ad) || empty($url) || empty($api) || empty($trch)) {
			$output	=	["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
			echo json_encode($output);
		}elseif( $sor->rowCount()  ){
			$output	=	["t"=>"Bilgi","m"=>"Bu API URL\'i sistemde zaten kaytl.","s"=>"info"];
			echo json_encode($output);
		}else{
			$insert	=	$vt->prepare("INSERT INTO api SET api_adi=?, api_url=?, api_api=?, api_tercih=?");
			$insert-> execute(array($ad,$url,$api,$trch));
				if ($insert) {
					$output	=	["t"=>"Mkemmel!","m"=>"API sisteme baaryla eklendi, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("api.view")];
					echo json_encode($output);
				}else{
					$output	=	["t"=>"Hata!","m"=>"API sisteme eklenirken hata olutu.","s"=>"error"];
					echo json_encode($output);
				}
		}
		exit();
	},\'new_api.post\');
	$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/api-duzenle/[*:slug]\', function($slug){
		global $vt,$title,$router,$siteayar,$uye;
		if ( !$_SESSION[\'admin\'] ) { exit; }
		$ad		=	$_POST["adi"];
		$url	=	$_POST["url"];
		$api	=	$_POST["api"];
		$trch	=	$_POST["api_tercih"];

		$sor	=	$vt->prepare("SELECT * FROM api WHERE api_url=? && id!=? ");
		$sor	-> execute(array($url,$slug));

		if ( empty($ad) || empty($url) || empty($api) || empty($trch) ) {
			$output	=	["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
			echo json_encode($output);
		}elseif( $sor->rowCount()  ){
			$output	=	["t"=>"Bilgi","m"=>"Bu API URL\'i sistemde zaten kaytl.","s"=>"info"];
			echo json_encode($output);
		}else{
			$update	=	$vt->prepare("UPDATE api SET api_adi=?, api_url=?, api_api=?, api_tercih=? WHERE id=?");
			$update-> execute(array($ad,$url,$api,$trch,$slug));
				if ($update) {
					$output	=	["t"=>"Mkemmel!","m"=>"API bilgileriniz dzenlendi, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("api.view")];
					echo json_encode($output);
				}else{
					$output	=	["t"=>"Hata!","m"=>"API bilgileri dzenlenirken hata olutu.","s"=>"error"];
					echo json_encode($output);
				}
		}
		exit();
	},\'edit_api.post\');
	$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/api-sil/[*:slug]\', function($slug){
		global $vt,$title,$router,$siteayar,$uye;
		if ( !$_SESSION[\'admin\'] ) { exit; }
			$delete	=	$vt->prepare("DELETE FROM api WHERE id=?");
			$delete-> execute(array($slug));
				if ($delete) {
					$output	=	["t"=>"Mkemmel!","m"=>"API servisi kaldrld, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("api.view")];
					echo json_encode($output);
				}else{
					$output	=	["t"=>"Hata!","m"=>"API servisini kaldrrken hata olutu.","s"=>"error"];
					echo json_encode($output);
				}
				exit();
	},\'delete_api.post\');
	$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/kategori-olustur\', function(){
		global $vt,$title,$router,$siteayar,$uye;
		if ( !$_SESSION[\'admin\'] ) { exit; }
		$ad		=	$_POST["adi"];
		$sira = $_POST["sira"];

		$sor	=	$vt->prepare("SELECT * FROM kategoriler WHERE kategori_adi=? ");
		$sor	-> execute(array($ad));

		if ( empty($ad) ) {
			$output	=	["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
			echo json_encode($output);
		}elseif( $sor->rowCount()  ){
			$output	=	["t"=>"Bilgi","m"=>"Bu kategori zaten sistemde kaytl.","s"=>"info"];
			echo json_encode($output);
		}else{
			$insert	=	$vt->prepare("INSERT INTO kategoriler SET kategori_adi=?, sira=?");
			$insert-> execute(array($ad,$sira));
				if ($insert) {
					$output	=	["t"=>"Mkemmel!","m"=>"Kategori baaryla eklendi, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("all_categories.view")];
					echo json_encode($output);
				}else{
					$output	=	["t"=>"Hata!","m"=>"Kategori sisteme eklenirken hata olutu.","s"=>"error"];
					echo json_encode($output);
				}
		}
		exit();
	},\'new_category.post\');
	$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/kategori-sil/[*:slug]\', function($slug){
		global $vt,$title,$router,$siteayar,$uye;
		if ( !$_SESSION[\'admin\'] ) { exit; }
			$delete	=	$vt->prepare("DELETE FROM kategoriler WHERE id=?");
			$delete-> execute(array($slug));
				if ($delete) {
					$output	=	["t"=>"Mkemmel!","m"=>"Kategori kaldrld, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("all_categories.view")];
					echo json_encode($output);
				}else{
					$output	=	["t"=>"Hata!","m"=>"Kategori kaldrrken hata olutu.","s"=>"error"];
					echo json_encode($output);
				}
				exit();
	},\'delete_category.post\');
	$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/kategori-durum/[*:slug]\', function($slug){
		global $vt,$title,$router,$siteayar,$uye;
		if ( !$_SESSION[\'admin\'] ) { exit; }
			$kat	=	$vt->prepare("SELECT * FROM kategoriler WHERE id=?");
			$kat-> execute(array($slug));
			$kat	=	$kat->fetch(PDO::FETCH_OBJ);
				if ( $kat->durum == 1 ) {
					$durum = 0 ;
					$etki  = \'pasif\';
				}else{
					$durum = 1 ;
					$etki  = \'aktif\';
				}
			$edit	=	$vt->prepare("UPDATE kategoriler SET durum=? WHERE id=?");
			$edit-> execute(array($durum,$slug));
				if ($edit) {
					$output	=	["t"=>"Mkemmel!","m"=>"Kategori ".$etki."letirildi, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("all_categories.view")];
					echo json_encode($output);
				}else{
					$output	=	["t"=>"Hata!","m"=>"Kategori ".$etki."letirilirken hata olutu.","s"=>"error"];
					echo json_encode($output);
				}
				exit();
	},\'pasif_category.post\');
	$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/kategori-duzenle/[*:slug]\', function($slug){
		global $vt,$title,$router,$siteayar,$uye;
		if ( !$_SESSION[\'admin\'] ) { exit; }
		$ad		=	$_POST["adi"];
		$sira = $_POST["sira"];

		$sor	=	$vt->prepare("SELECT * FROM kategoriler WHERE kategori_adi=? && id!=? ");
		$sor	-> execute(array($ad,$slug));
		$sor2	=	$vt->query("SELECT * FROM kategoriler WHERE id=\'$slug\' ")->fetch(PDO::FETCH_OBJ);
		if ( empty($ad) ) {
			$output	=	["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
			echo json_encode($output);
		}elseif( $sor->rowCount()  ){
			$output	=	["t"=>"Bilgi","m"=>"Bu kategori sistemde zaten kaytl.","s"=>"info"];
			echo json_encode($output);
		}else{
			$update	=	$vt->prepare("UPDATE kategoriler SET kategori_adi=?, sira=? WHERE id=?");
			$update-> execute(array($ad,$sira,$slug));
				if ($update) {
					$output	=	["t"=>"Mkemmel!","m"=>"Kategori bilgileriniz dzenlendi, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("all_categories.view")];
					echo json_encode($output);
				}else{
					$output	=	["t"=>"Hata!","m"=>"Kategori bilgileri dzenlenirken hata olutu.","s"=>"error"];
					echo json_encode($output);
				}
		}
		exit();
	},\'edit_category.post\');
	$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/yeni-urun\', function(){
		global $vt,$title,$router,$siteayar,$uye;
		if ( !$_SESSION[\'admin\'] ) { exit; }
		$api_servis	=	$_POST["api_servis"];
		$aciklama		=	$_POST["aciklama"];
		$kategori		=	$_POST["kategori"];
		$fiyat			=	$_POST["fiyat"];
		@$birim			= $fiyat/1000;
		$url				=	$_POST["baglanti"];
		$min				=	$_POST["min"];
		$mak				=	$_POST["mak"];
		$api				=	$_POST["api"];
		$ad					=	$_POST["adi"];


		$sor	=	$vt->prepare("SELECT * FROM urunler WHERE urun_api=? && urun_api_servis=? WHERE durum=\'1\' ");
		$sor	-> execute(array($api,$api_servis));

		if ( empty($ad) || empty($api) || empty($mak) || empty($min) || empty($url)	|| empty($fiyat)	|| empty($kategori)	|| empty($api_servis)   ) {
			$output	=	["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
			echo json_encode($output);
		}elseif($mak<$min){
			$output	=	["t"=>"Bilgi","m"=>"Maksimum sipari miktarnz minimum sipari miktarndan ufak olamaz.","s"=>"info"];
			echo json_encode($output);
		}elseif( $sor->rowCount()  ){
			$output	=	["t"=>"Bilgi","m"=>"Bu API ve servis ile kaytl rn zaten var.","s"=>"info"];
			echo json_encode($output);
		}else{
			$insert	=	$vt->prepare("INSERT INTO urunler SET urun_adi=?, urun_aciklama=?, urun_fiyat=?, urun_birim=?, urun_secenegi=?, urun_kategori=?, urun_min=?, urun_max=?, urun_api=?, urun_api_servis=?");
			$insert-> execute(array($ad,$aciklama,$fiyat,$birim,$url,$kategori,$min,$mak,$api,$api_servis));
				if ($insert) {
					$output	=	["t"=>"Mkemmel!","m"=>"rn sisteme baaryla eklendi, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("all_product.view")];
					echo json_encode($output);
				}else{
					$output	=	["t"=>"Hata!","m"=>"rn sisteme eklenirken hata olutu.","s"=>"error"];
					echo json_encode($output);
				}
		}
		exit();
	},\'new_product.post\');
	$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/urun-sil/[*:slug]\', function($slug){
		global $vt,$title,$router,$siteayar,$uye;
		if ( !$_SESSION[\'admin\'] ) { exit; }
			$delete	=	$vt->prepare("UPDATE urunler SET durum=? WHERE id=?");
			$delete-> execute(array(0,$slug));
				if ($delete) {
					$output	=	["t"=>"Mkemmel!","m"=>"rn hizmetten kaldrld, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("all_product.view")];
					echo json_encode($output);
				}else{
					$output	=	["t"=>"Hata!","m"=>"rn hizmetten kaldrrken hata olutu.","s"=>"error"];
					echo json_encode($output);
				}
				exit();
	},\'delete_product.post\');
	$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/urun-durum/[*:slug]\', function($slug){
		global $vt,$title,$router,$siteayar,$uye;
		if ( !$_SESSION[\'admin\'] ) { exit; }
			$urun	=	$vt->prepare("SELECT * FROM urunler WHERE id=?");
			$urun-> execute(array($slug));
			$urun	=	$urun->fetch(PDO::FETCH_OBJ);
				if ( $urun->durum == 1 ) {
					$durum = 2 ;
					$etki  = \'pasif\';
				}elseif( $urun->durum == 2 ){
					$durum = 1 ;
					$etki  = \'aktif\';
				}
			$edit	=	$vt->prepare("UPDATE urunler SET durum=? WHERE id=?");
			$edit-> execute(array($durum,$slug));
				if ($edit) {
					$output	=	["t"=>"Mkemmel!","m"=>"rn ".$etki."letirildi, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("all_product.view")];
					echo json_encode($output);
				}else{
					$output	=	["t"=>"Hata!","m"=>"rn ".$etki."letirilirken hata olutu.","s"=>"error"];
					echo json_encode($output);
				}
				exit();
	},\'pasif_product.post\');
	$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/urun-duzenle/[*:slug]\', function($slug){
		global $vt,$title,$router,$siteayar,$uye;
		if ( !$_SESSION[\'admin\'] ) { exit; }
		$api_servis	=	$_POST["api_servis"];
		$aciklama		=	$_POST["aciklama"];
		$kategori		=	$_POST["kategori"];
		$fiyat			=	$_POST["fiyat"];
		$birim			= $fiyat/1000;
		$url				=	$_POST["baglanti"];
		$min				=	$_POST["min"];
		$mak				=	$_POST["mak"];
		$api				=	$_POST["api"];
		$ad					=	$_POST["adi"];


		$sor	=	$vt->prepare("SELECT * FROM urunler WHERE urun_api=? && urun_api_servis=? && id!=? ");
		$sor	-> execute(array($api,$api_servis,$slug));

		if ( empty($ad) || empty($api) || empty($mak) || empty($min) || empty($url)	|| empty($fiyat)	|| empty($kategori)	|| empty($api_servis)   ) {
			$output	=	["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
			echo json_encode($output);
		}elseif($mak<$min){
			$output	=	["t"=>"Bilgi","m"=>"Maksimum sipari miktarnz minimum sipari miktarndan ufak olamaz.","s"=>"info"];
			echo json_encode($output);
		}elseif( $sor->rowCount()  ){
			$output	=	["t"=>"Bilgi","m"=>"Bu API ve servis ile kaytl rn zaten var.","s"=>"info"];
			echo json_encode($output);
		}else{
			$update	=	$vt->prepare("UPDATE urunler SET urun_adi=?, urun_aciklama=?, urun_fiyat=?, urun_birim=?, urun_secenegi=?, urun_kategori=?, urun_min=?, urun_max=?, urun_api=?, urun_api_servis=? WHERE id=?");
			$update-> execute(array($ad,$aciklama,$fiyat,$birim,$url,$kategori,$min,$mak,$api,$api_servis,$slug));
				if ($update) {
					$output	=	["t"=>"Mkemmel!","m"=>"rn baaryla dzenlendi, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate("all_product.view")];
					echo json_encode($output);
				}else{
					$output	=	["t"=>"Hata!","m"=>"rn dzenlenirken hata olutu.","s"=>"error"];
					echo json_encode($output);
				}
		}
		exit();
	},\'edit_product.post\');
	$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/talebe-cevap-ver-[*:slug]\', function($slug){
		global $vt,$title,$router,$siteayar,$uye;
		if ( !$_SESSION[\'admin\'] ) { exit; }
		$id			=	$slug;
		$icerik	=	$_POST["icerik"];
		$tarih	=	date("Y-m-d H:i:s");

		$sorgu	=	$vt->prepare("SELECT * FROM destek_talepler WHERE id=?");
		$sorgu->  execute(array($id));

		if ( empty($icerik) ) {
			$output	=	["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
			echo json_encode($output);
		}elseif($sorgu->rowCount()<0){
			$output	=	["t"=>"Bilgi","m"=>"Byle bir destek talebi yok.","s"=>"info"];
			echo json_encode($output);
		}else{
			$talepi	=	$vt->prepare("INSERT INTO destek_talep_cevap SET talep_id=?, talep_tarihi=?, talep_icerik=?, talep_user=? ");
			$talepi-> execute(array($id,$tarih,$icerik,$uye->username));
				if ($talepi) {
					$edit		=	$vt->prepare("UPDATE destek_talepler SET talep_durum=? WHERE id=?");
					$edit		-> execute(array(\'Yantland\',$id));
					$output	=	["t"=>"Mkemmel!","m"=>"Destek talebine cevap verdiniz, ynlendiriliyorsunuz.","s"=>"success","r"=>$router->generate(\'admin_tickets_bekleyenler.view\')];
					echo json_encode($output);
				}else{
					$output	=	["t"=>"Hata","m"=>"Destek talebine destek verirken hata olutu.","s"=>"error"];
					echo json_encode($output);
				}
		}

		exit();
	},\'new_reply_admin.post\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'talep-durum-ac-[*:slug]\', function($slug){
		global $vt,$title,$router,$siteayar,$uye;
		if ( !$_SESSION[\'admin\'] ) { exit; }
		$sor	=	$vt->prepare("SELECT * FROM destek_talepler WHERE id=?");
		$sor-> execute(array($slug));
		$sor	=	$sor->fetch(PDO::FETCH_OBJ);
			if ( $sor->talep_durum == "Ak" ) {
				$output	=	["t"=>"Hata","m"=>"Talep zaten ak durumda.","s"=>"error"];
				echo json_encode($output);
			}else{
				$edit	=	$vt->prepare("UPDATE destek_talepler SET talep_durum=? WHERE id=?");
				$edit-> execute(array("Ak",$slug));
					if ($edit) {
						$output	=	["t"=>"Mkemmel!","m"=>"Destek talebi durumu deitirildi.","s"=>"success"];
						echo json_encode($output);
					}else{
						$output	=	["t"=>"Hata","m"=>"Destek talebi durumu deitirilemedi.","s"=>"error"];
						echo json_encode($output);
					}
			}
			exit();
	}, \'talep_ac.post\');
	$router->map(\'GET\', \'/\'.$siteayar->site_admin.\'talep-durum-kapa-[*:slug]\', function($slug){
		global $vt,$title,$router,$siteayar,$uye;
		if ( !$_SESSION[\'admin\'] ) { exit; }
		$sor	=	$vt->prepare("SELECT * FROM destek_talepler WHERE id=?");
		$sor-> execute(array($slug));
		$sor	=	$sor->fetch(PDO::FETCH_OBJ);
			if ( $sor->talep_durum == "Kapal" ) {
				$output	=	["t"=>"Hata","m"=>"Talep zaten kapal durumda.","s"=>"error"];
				echo json_encode($output);
			}else{
				$edit	=	$vt->prepare("UPDATE destek_talepler SET talep_durum=? WHERE id=?");
				$edit-> execute(array("Kapal",$slug));
					if ($edit) {
						$output	=	["t"=>"Mkemmel!","m"=>"Destek talebi durumu deitirildi.","s"=>"success"];
						echo json_encode($output);
					}else{
						$output	=	["t"=>"Hata","m"=>"Destek talebi durumu deitirilemedi.","s"=>"error"];
						echo json_encode($output);
					}
			}
			exit();
	}, \'talep_kapat.post\');
	$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/uye/[*:slug]/bakiye\', function($slug){
		global $vt,$title,$router,$siteayar,$uye;
		if ( !$_SESSION[\'admin\'] ) { exit; }
		$uyesor	=	$vt->prepare("SELECT * FROM uyeler WHERE username=?");
		$uyesor-> execute(array($slug));
		$uyesor	=	$uyesor->fetch(PDO::FETCH_OBJ);

		$tarih		=	date("Y.m.d H:i:s");
		$miktar		=	$_POST["miktar"];
		$islem		=	$_POST["islem"];

		if ( $islem == \'ekle\' ) {
			$bakiye		=	$uyesor->bakiye+$miktar;
			$durum		=	\'ekleme\';
		}elseif ( $islem == \'eksilt\' ) {
			$bakiye		=	$uyesor->bakiye-$miktar;
			$durum		=	\'eksiltme\';
		}else{
			$durum		=	\'bos\';
		}

		if ( empty($miktar) || empty($islem) ) {
			$output	=	["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
			echo json_encode($output);
		}elseif( $durum == "bos" ){
			$output	=	["t"=>"Bilgi","m"=>"lem uan iin gerekletirilemiyor.","s"=>"info"];
			echo json_encode($output);
		}else{
			$duzelt		=		$vt->prepare("UPDATE uyeler SET bakiye=? WHERE username=?");
			$duzelt		->	execute(array($bakiye,$slug));
				if ($duzelt) {
					$output	=	["t"=>"Mkemmel!","m"=>$miktar." TL tutarnda bakiye ".$durum." ilemi gerekletirildi.","s"=>"success"];
					echo json_encode($output);
						if ( $islem == \'ekle\' ) {
							$kazanc		=		$vt->prepare("INSERT INTO bakiye_kazanc SET tutar=?, tarih=?");
							$kazanc		->	execute(array($miktar,$tarih));
						}
				}else{
					$output	=	["t"=>"Hata","m"=>"ye bakiye ilemi srasnda hata olutu.","s"=>"error"];
					echo json_encode($output);
				}
		}

		exit();
	},\'add_balance_user.post\');
	$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/uye/[*:slug]/fiyatlar/[*:slug2]\', function($slug,$slug2){
		global $vt,$title,$router,$siteayar,$uye;
		if ( !$_SESSION[\'admin\'] ) { exit; }
		$uyesor	=	$vt->prepare("SELECT * FROM uyeler WHERE id=?");
		$uyesor-> execute(array($slug));
		$uyesor	=	$uyesor->fetch(PDO::FETCH_OBJ);

		$urunsor	=	$vt->prepare("SELECT * FROM urunler WHERE id=?");
		$urunsor-> execute(array($slug2));
		$urunsor	=	$urunsor->fetch(PDO::FETCH_OBJ);

		$fiyat	=	$_POST["fiyat"];


		$sor	=	$vt->prepare("SELECT * FROM fiyatlandirma WHERE fiyat_sahibi=? && fiyat_servis=? ");
		$sor	-> execute(array($uyesor->username,$slug2));

		if ( empty($fiyat) ) {
			$output	=	["t"=>"Bilgi","m"=>"Fiyat alann doldurmalsnz.","s"=>"info"];
			echo json_encode($output);
		}elseif($sor->rowCount()){
			$update	=	$vt->prepare("UPDATE fiyatlandirma SET fiyat_fiyat=? WHERE fiyat_sahibi=? && fiyat_servis=?");
			$update-> execute(array($fiyat,$uyesor->username,$slug2));
				if ($update) {
					$output	=	["t"=>"Mkemmel!","m"=>"yeye zel fiyatlandrma ilemi baarl.","s"=>"success"];
					echo json_encode($output);
				}else{
					$output	=	["t"=>"Hata!","m"=>"yeye zel fiyatlandrma ilemi srasnda hata olutu.","s"=>"error"];
					echo json_encode($output);
				}
		}else{
			$insert	=	$vt->prepare("INSERT INTO fiyatlandirma SET fiyat_fiyat=?, fiyat_sahibi=?, fiyat_servis=?");
			$insert-> execute(array($fiyat,$uyesor->username,$slug2));
				if ($insert) {
					$output	=	["t"=>"Mkemmel!","m"=>"yeye zel fiyatlandrma ilemi baarl.","s"=>"success"];
					echo json_encode($output);
				}else{
					$output	=	["t"=>"Hata!","m"=>"yeye zel fiyatlandrma ilemi srasnda hata olutu.","s"=>"error"];
					echo json_encode($output);
				}
		}
		exit();
	},\'private_price.post\');
	$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/uye/[*:slug]/fiyat-sil/[*:slug2]\', function($slug,$slug2){
		global $vt,$title,$router,$siteayar,$uye;
		if ( !$_SESSION[\'admin\'] ) { exit; }
		$uyesor	=	$vt->prepare("SELECT * FROM uyeler WHERE id=?");
		$uyesor-> execute(array($slug));
		$uyesor	=	$uyesor->fetch(PDO::FETCH_OBJ);

		$sor	=	$vt->prepare("SELECT * FROM fiyatlandirma WHERE fiyat_sahibi=? && fiyat_servis=? ");
		$sor	-> execute(array($uyesor->username,$slug2));

		if($sor->rowCount()){
			$delete	=	$vt->prepare("DELETE FROM fiyatlandirma WHERE fiyat_sahibi=? && fiyat_servis=?");
			$delete-> execute(array($uyesor->username,$slug2));
				if ($delete) {
					$output	=	["t"=>"Mkemmel!","m"=>"yeye zel fiyatlandrma ilemi silindi.","s"=>"success"];
					echo json_encode($output);
				}else{
					$output	=	["t"=>"Hata!","m"=>"yeye zel fiyatlandrma silinirken hata olutu.","s"=>"error"];
					echo json_encode($output);
				}
		}
		exit();
	},\'private_price_delete.post\');
	$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/uye/[*:slug]\', function($slug){
		global $vt,$title,$router,$siteayar,$uye;
		if ( !$_SESSION[\'admin\'] ) { exit; }
		$uyesor	=	$vt->prepare("SELECT * FROM uyeler WHERE username=?");
		$uyesor-> execute(array($slug));
		$uyesor	=	$uyesor->fetch(PDO::FETCH_OBJ);

		$telefon		=	str_replace(" ","",$_POST["telefon"]);
		$adsoyad		=	ilkHarf($_POST["adsoyad"]);
		$yetki			=	$_POST["yetki"];
		$mail				=	$_POST["mail"];
		$onay				=	$_POST["onay"];

		if ( empty($adsoyad) || empty($mail) || empty($yetki) || empty($telefon) ) {
			$output	=	["t"=>"Bilgi","m"=>"Tm alanlar doldurmalsnz.","s"=>"info"];
			echo json_encode($output);
		}elseif(!filter_var($mail,FILTER_VALIDATE_EMAIL)){
			$output	=	["t"=>"Bilgi","m"=>"Girilen mail format yanl.","s"=>"info"];
			echo json_encode($output);
		}else{
			$duzelt		=		$vt->prepare("UPDATE uyeler SET adsoyad=?, mail=?, telefon=?, yetki=?, onay=? WHERE username=?");
			$duzelt		->	execute(array($adsoyad,$mail,$telefon,$yetki,$onay,$slug));
				if ($duzelt) {
					$output	=	["t"=>"Mkemmel!","m"=>"ye bilgileri gncellendi.","s"=>"success"];
					echo json_encode($output);
				}else{
					$output	=	["t"=>"Hata","m"=>"ye bilgileri gncellenirken hata olutu.","s"=>"error"];
					echo json_encode($output);
				}
		}
		exit();
	},\'edit_user.post\');
	$router->map(\'POST\', \'/\'.$siteayar->site_admin.\'/uye-pass/[*:slug]\', function($slug){
		global $vt,$title,$router,$siteayar,$uye;
		if ( !$_SESSION[\'admin\'] ) { exit; }
		$pass				=	$_POST["pass"];


		if ( empty($pass) || strlen($pass) < 6 ) {
			$output	=	["t"=>"Bilgi","m"=>"Parola 6 karakterden ksa olamaz.","s"=>"info"];
			echo json_encode($output);
		}else{
			$pass		=	md5($_POST["pass"]);
			$duzelt		=		$vt->prepare("UPDATE uyeler SET password=? WHERE username=?");
			$duzelt		->	execute(array($pass,$slug));
				if ($duzelt) {
					$output	=	["t"=>"Mkemmel!","m"=>"ye ifresi gncellendi.","s"=>"success"];
					echo json_encode($output);
				}else{
					$output	=	["t"=>"Hata","m"=>"ye ifresi gncellenirken hata olutu.","s"=>"error"];
					echo json_encode($output);
				}
		}
			exit();
	},\'edit_user_pass.post\');


	$match = $router->match();
	if( $match && is_callable( $match[\'target\'] ) ) {
		call_user_func_array( $match[\'target\'], $match[\'params\'] );
	} else {
		header( $_SERVER["SERVER_PROTOCOL"] . \' 404 Not Found\');
	}
 ?>'

Did this file decode correctly?

Original Code

<?php eval("?>".base64_decode("PD9waHANCg0KDQoNCnJlcXVpcmUoJ2xpc2Fucy5waHAnKTsvL2xpc2Fucy5waHAgZG9zeWFzaW5pIGVrbGUNCiRsaXNhbnNbJ3NpdGUnXT1nZXRlbnYoJ0hUVFBfSE9TVCcpOy8vc2l0ZSBkb21haW5pbmkgYWwNCmlmIChzdWJzdHIoJGxpc2Fuc1snc2l0ZSddLCAwLCA0KSA9PSAid3d3LiIpLy9kb21haW4gYmFzaW5kYWtpIHd3dy4gdmFybWkgeW9rbXUga29udHJvbCBldA0KJGxpc2Fuc1snc2l0ZSddPXN1YnN0cigkbGlzYW5zWydzaXRlJ10sNCk7Ly93d3cuIHNpbCB2ZSBzYWRlY2UgZG9tYWluLmNvbSBvbGFyYWsgYWRyZXNpIGFsDQogDQokYmFzID0gIk1ZQS0iOy8vTGlzYW5zIGtvZHUgYmHFn8SxbmEgaXN0ZWRpxJ9pbml6IHlhesSxIGVrbGVuZWJpbGlyDQokc29uID0gIi0yMDE4IjsvL0xpc2FucyBrb2R1IHNvbnVuYSBpc3RlZGnEn2luaXogeWF6xLEgZWtsZW5lYmlsaXINCiRtID0gIm1kNSI7Ly9tZDUgc2lmcmVsZW1lIA0KJHMgPSAic2hhMSI7Ly9zaGExIHNpZnJlbGVtZSANCiANCiANCiRsaXNhbnNbJ2hhc2gnXT13b3Jkd3JhcChzdHJ0b3VwcGVyKCRzICgkcyAoJHMgKCRzICgkbSAoJHMgKCRzICgkbSAoJGxpc2Fuc1snc2l0ZSddLmRhdGUoJ1ltZCcpKSkpKSkpKSkpLDUsJy0nLHRydWUpOy8vbGlzYW5zIGtvZHVudSBvbHVzdHVyIHZlIDUga2FyYWt0ZXJkZSBiaXIgLSBrb3kNCiRsaXNrb2QgPSAkbGlzYW5zWydoYXNoJ107DQokY2V2aXI9c3RycmV2KCRsaXNrb2QpOy8vbGlzYW5zIGtvZHVudSB0ZXJzaW5lIGNldmlyDQokYmNzID0gIiRiYXMkY2V2aXIkc29uIjsNCiANCmlmKCRiY3MhPT0kbGlzYW5za29kdSkvL2xpc2FucyBrb2R1bnUga29udHJvbCBldCBmYXJrIHZhcnNhIHN1bnVjdXlhIGJhZ2xhbiAtIDI0IHNhYXR0ZSBiaXIgbGlzYW5zIGtvZHUgZGVnaXNpcg0Kew0KJGxpc2Fuc19jZXZhcD1maWxlX2dldF9jb250ZW50cygnaHR0cDovL2luc3RhLmFkYW5hYmlsaXNpbS5uZXQvbGlzYW5zL2tvbnRyb2wucGhwP3NpdGU9Jy4kbGlzYW5zWydzaXRlJ10pOy8vbGlzYW5zIHN1bnVjdXN1bmRhbiBsaXNhbnMga29udHJvbHUgeWFwDQppZigkbGlzYW5zX2NldmFwIT0nTElTQU5TTEknKS8vc3VudWN1ZGFuIGdlbGVuIGNldmFwIExJU0FOU0xJIGRlZ2lsc2UNCiANCmRpZSgnQnUgc2l0ZXllIGFpdCBsaXNhbnMgYnVsdW5hbWFkaSEhISBMdXRmZW4gbGlzYW5zIGFsbWFrIGljaW4gc29ydW5zdXpzY3JpcHQuY29tIGFkcmVzaW5pIHppeWFyZXQgZWRpbml6Jyk7Ly9saXNhbnMgZ2VjZXJzaXogbWVzYWppIHZlcmlsaXIgaXNsZW0gZHVydXINCiANCiRseWF6ID0gZm9wZW4oJ2xpc2Fucy5waHAnLCJ3KyIpOy8vbGlzYW5zLnBocCBkb3N5YXNpbmkgYWMgeWVuaSBsaXNhbnMga29kdW51IHlheiBidSBkb3N5YSB5YXrEsWxhYmlsaXIgb2xtYWzEsWTEsXINCkBmd3JpdGUoJGx5YXosJzw/cGhwDQovKioNCiAgICBTb3J1bnN1eiBTY3JpcHQgUGhwIExpc2FucyBTaXN0ZW1pDQogICAgDQogICAgDQogICAgQnUgZG9zeWF5YSBoZXJoYW5naSBiaXIgbGlzYW5zIGtvZHUgeWF6bWFuaXogZ2VyZWttZXoNCiAgICBBbG1pcyBvbGR1Z3VudXogdXJ1bmUgYWl0IGxpc2FucyBzaXN0ZW1kZSBha3RpZiBvbGR1Z3VuZGENCiAgICBMaXNhbnMga29kdW51eiBvdG9tYXRpayBvbGFyYWsgZ2lyaWxlY2VrdGlyLg0KCQ0KCVllbmkgbGlzYW5zIGFsbWFrIGljaW4gd3d3LnNvcnVuc3V6c2NyaXB0LmNvbSBhZHJlc2luaSB6aXlhcmV0IGVkZWJpbGlyc2luaXoNCiANCiAqLw0KJGxpc2Fuc2tvZHU9IicuJGJjcy4nIjsNCj8+Jyk7DQpmY2xvc2UoJGx5YXopOw0KfQ0KDQoNCglyZXF1aXJlX29uY2UgJ3N5cy9jb25maWcucGhwJzsNCglyZXF1aXJlX29uY2UgJ3ZlbmRvci9hdXRvbG9hZC5waHAnOw0KDQoJJHJvdXRlcgk9IG5ldyBBbHRvUm91dGVyKCk7DQoJDQoJJHNtbWFwaQkJPQluZXcgU01NQXBpKCk7DQoNCgl1c2UgUEhQTWFpbGVyXFBIUE1haWxlclxQSFBNYWlsZXI7DQoJdXNlIFBIUE1haWxlclxQSFBNYWlsZXJcRXhjZXB0aW9uOw0KCSRtYWlsID0gbmV3IFBIUE1haWxlcih0cnVlKTsNCg0KDQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy9hcGknLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllLCRzbW1hcGk7DQogICAgCXJlcXVpcmVfb25jZSAnYXBpLnBocCc7DQoJCQlleGl0KCk7DQoJfSwnYXBpLnZpZXd3Jyk7DQoNCgkjIyBLdWxsYW7EsWPEsSBHRVQgxLDFn2xlbWxlcmkgIyMNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwkc2lwYXJpc2xlciwkaGFiZXJsZXI7DQoJCQkJaWYgKEAkX1NFU1NJT05bImxvZ2luIl0pIHsNCgkJCQkJJHRpdGxlLj0JJ0FuYXNheWZhJzsNCgkJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9tYWluLnZpZXcucGhwJzsNCgkJCQl9ZWxzZXsNCgkJCQkJeW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdsb2dpbi52aWV3JykpOw0KCQkJCX0NCgkJCQlleGl0KCk7DQoJfSwnbWFpbi52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnL3Nvemxlc21lbGVyJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwkc2lwYXJpc2xlciwkaGFiZXJsZXI7DQoJCQkJCSR0aXRsZS49CSdTw7Z6bGXFn21lbGVyaW1peic7DQoJCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvc296bGVzbWUudmlldy5waHAnOw0KCQkJCQlleGl0KCk7DQoJfSwnc296bGVzbWVsZXIudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy9jaWtpcy15YXAnLCBmdW5jdGlvbigpew0KCQkJZ2xvYmFsICRyb3V0ZXI7DQoJCQl1bnNldCgkX1NFU1NJT05bImxvZ2luIl0pOw0KCQkJdW5zZXQoJF9TRVNTSU9OWyJ1c2VybmFtZSJdKTsNCgkJCXNlc3Npb25fZGVzdHJveSgpOw0KCQkJc2V0Y29va2llKCJ1c2VybmFtZSIsICRfU0VTU0lPTlsidXNlcm5hbWUiXSwgdGltZSgpIC0gNjAqNjAqMjQqNyk7DQogICAgCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnbG9naW4udmlldycpKTsNCgkJCWV4aXQoKTsNCgl9LCdsb2dvdXQudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy9rYXlpdC1vbCcsIGZ1bmN0aW9uKCl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyOw0KCQkJaWYgKEAhJF9TRVNTSU9OWyJsb2dpbiJdKSB7DQoJCQkJJHRpdGxlLj0JJ0thecSxdCBPbCc7DQoJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9yZWdpc3Rlci52aWV3LnBocCc7DQoJCQl9ZWxzZXsNCgkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ21haW4udmlldycpKTsNCgkJCX0NCgkJCWV4aXQoKTsNCgl9LCdyZWdpc3Rlci52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnL2dpcmlzLXlhcCcsIGZ1bmN0aW9uKCl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyOw0KCQkJaWYgKEAhJF9TRVNTSU9OWyJsb2dpbiJdKSB7DQoJCQkJJHRpdGxlLj0JJ0dpcmnFnyBZYXAnOw0KCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvbG9naW4udmlldy5waHAnOw0KCQkJfWVsc2V7DQoJCQkJeW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdtYWluLnZpZXcnKSk7DQoJCQl9DQoJCQlleGl0KCk7DQoJfSwnbG9naW4udmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy9wYXJvbGFtaS11bnV0dHVtJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXI7DQoJCQlpZiAoQCEkX1NFU1NJT05bImxvZ2luIl0pIHsNCgkJCQkkdGl0bGUuPQknUGFyb2xhbcSxIFVudXR0dW0nOw0KCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvcGFzc3dvcmRfZm9yZ2V0LnZpZXcucGhwJzsNCgkJCX1lbHNlew0KCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnbWFpbi52aWV3JykpOw0KCQkJfQ0KCQkJZXhpdCgpOw0KCX0sJ3Bhc3N3b3JkX2ZvcmdldC52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnL3Bhcm9sYW1pLWd1bmNlbGxlJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXI7DQoJCQlpZiAoQCEkX1NFU1NJT05bImxvZ2luIl0pIHsNCgkJCQkkdGl0bGUuPQknUGFyb2xhbcSxIFVudXR0dW0nOw0KCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvcGFzc3dvcmRfZm9yZ2V0Mi52aWV3LnBocCc7DQoJCQl9ZWxzZXsNCgkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ21haW4udmlldycpKTsNCgkJCX0NCgkJCWV4aXQoKTsNCgl9LCdzaWZyZV9ndW5jZWxsZS52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnL2Jha2l5ZS1la2xlJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwkYmFua2FsYXI7DQoJCQlpZiAoQCRfU0VTU0lPTlsibG9naW4iXSkgew0KCQkJCSR0aXRsZS49CSdCYWtpeWUgRWtsZSc7DQoJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9hZGRfYmFsYW5jZS52aWV3LnBocCc7DQoJCQl9ZWxzZXsNCgkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ21haW4udmlldycpKTsNCgkJCX0NCgkJCWV4aXQoKTsNCgl9LCdhZGRfYmFsYW5jZS52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnL3llbmktZGVzdGVrLXRhbGViaScsIGZ1bmN0aW9uKCl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCQlpZiAoQCRfU0VTU0lPTlsibG9naW4iXSkgew0KCQkJCSR0aXRsZS49CSdZZW5pIERlc3RlayBUYWxlYmkgT2x1xZ90dXInOw0KCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvbmV3X3RpY2tldC52aWV3LnBocCc7DQoJCQl9ZWxzZXsNCgkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ21haW4udmlldycpKTsNCgkJCX0NCgkJCWV4aXQoKTsNCgl9LCduZXdfdGlja2V0LnZpZXcnKTsNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvZGVzdGVrLXRhbGViaS9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJCWlmIChAJF9TRVNTSU9OWyJsb2dpbiJdKSB7DQoJCQkJJHRpdGxlCS49CSdEZXN0ZWsgVGFsZWJpbmkgR8O2csO8bnTDvGxlJzsNCgkJCQkkdGFsZXAJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gZGVzdGVrX3RhbGVwbGVyIFdIRVJFIGlkPT8gIik7DQoJCQkJJHRhbGVwCS0+IGV4ZWN1dGUoYXJyYXkoJHNsdWcpKTsNCgkJCQkkdGFsZXAJPQkkdGFsZXAJLT4gZmV0Y2goUERPOjpGRVRDSF9PQkopOw0KCQkJCQlpZiAoJHRhbGVwLT50YWxlcF9zYWhpYmkhPSR1eWUtPnVzZXJuYW1lKSB7DQoJCQkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ2FsbF90aWNrZXRzLnZpZXcnKSk7DQoJCQkJCX1lbHNlew0KCQkJCQkJJHRhbGVwY2V2YXBsYXIJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gZGVzdGVrX3RhbGVwX2NldmFwIFdIRVJFIHRhbGVwX2lkPT8iKTsNCgkJCQkJCSR0YWxlcGNldmFwbGFyIC0+IGV4ZWN1dGUoYXJyYXkoJHRhbGVwLT5pZCkpOw0KCQkJCQkJJHRhbGVwY2V2YXBsYXIJPQkkdGFsZXBjZXZhcGxhci0+ZmV0Y2hBbGwoUERPOjpGRVRDSF9PQkopOw0KCQkJCQl9DQoJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9yZWFkX3RpY2tldC52aWV3LnBocCc7DQoJCQl9ZWxzZXsNCgkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ21haW4udmlldycpKTsNCgkJCX0NCgkJCWV4aXQoKTsNCgl9LCdyZWFkX3RpY2tldC52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnL2Rlc3Rlay10YWxlcGxlcmltJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJCWlmIChAJF9TRVNTSU9OWyJsb2dpbiJdKSB7DQoJCQkJJHRpdGxlLj0JJ0Rlc3RlayBUYWxlcGxlcmltJzsNCgkJCQkkdGFsZXBsZXJpbQk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBkZXN0ZWtfdGFsZXBsZXIgV0hFUkUgdGFsZXBfc2FoaWJpPT8gT1JERVIgQlkgaWQgREVTQyIpOw0KCQkJCSR0YWxlcGxlcmltLT4gZXhlY3V0ZShhcnJheSgkdXllLT51c2VybmFtZSkpOw0KCQkJCSR0YWxlcGxlcmltCT0JJHRhbGVwbGVyaW0tPmZldGNoQWxsKFBETzo6RkVUQ0hfT0JKKTsNCgkJCQlpbmNsdWRlICd2aWV3cy8nLlNJVEVfVEVNQS4nL2FsbF90aWNrZXRzLnZpZXcucGhwJzsNCgkJCX1lbHNlew0KCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnbWFpbi52aWV3JykpOw0KCQkJfQ0KCQkJZXhpdCgpOw0KCX0sJ2FsbF90aWNrZXRzLnZpZXcnKTsNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvZGVzdGVrLXRhbGVwbGVyaW0vYmVrbGV5ZW5sZXInLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQkJaWYgKEAkX1NFU1NJT05bImxvZ2luIl0pIHsNCgkJCQkkdGl0bGUuPQknRGVzdGVrIFRhbGVwbGVyaW0nOw0KCQkJCSR0YWxlcGxlcmltCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIGRlc3Rla190YWxlcGxlciBXSEVSRSB0YWxlcF9zYWhpYmk9PyAmJiB0YWxlcF9kdXJ1bT0/IE9SREVSIEJZIGlkIERFU0MiKTsNCgkJCQkkdGFsZXBsZXJpbS0+IGV4ZWN1dGUoYXJyYXkoJHV5ZS0+dXNlcm5hbWUsJ0HDp8SxaycpKTsNCgkJCQkkdGFsZXBsZXJpbQk9CSR0YWxlcGxlcmltLT5mZXRjaEFsbChQRE86OkZFVENIX09CSik7DQoJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9hbGxfdGlja2V0cy52aWV3LnBocCc7DQoJCQl9ZWxzZXsNCgkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ21haW4udmlldycpKTsNCgkJCX0NCgkJCWV4aXQoKTsNCgl9LCdiZWtsZXllbl90aWNrZXRzLnZpZXcnKTsNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvZGVzdGVrLXRhbGVwbGVyaW0veWFuaXRsYW5taXMnLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQkJaWYgKEAkX1NFU1NJT05bImxvZ2luIl0pIHsNCgkJCQkkdGl0bGUuPQknRGVzdGVrIFRhbGVwbGVyaW0nOw0KCQkJCSR0YWxlcGxlcmltCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIGRlc3Rla190YWxlcGxlciBXSEVSRSB0YWxlcF9zYWhpYmk9PyAmJiB0YWxlcF9kdXJ1bT0/IE9SREVSIEJZIGlkIERFU0MiKTsNCgkJCQkkdGFsZXBsZXJpbS0+IGV4ZWN1dGUoYXJyYXkoJHV5ZS0+dXNlcm5hbWUsJ1lhbsSxdGxhbmTEsScpKTsNCgkJCQkkdGFsZXBsZXJpbQk9CSR0YWxlcGxlcmltLT5mZXRjaEFsbChQRE86OkZFVENIX09CSik7DQoJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9hbGxfdGlja2V0cy52aWV3LnBocCc7DQoJCQl9ZWxzZXsNCgkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ21haW4udmlldycpKTsNCgkJCX0NCgkJCWV4aXQoKTsNCgl9LCd5YW5pdGxhbmRpX3RpY2tldHMudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy9kZXN0ZWstdGFsZXBsZXJpbS9rYXBhbGknLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQkJaWYgKEAkX1NFU1NJT05bImxvZ2luIl0pIHsNCgkJCQkkdGl0bGUuPQknRGVzdGVrIFRhbGVwbGVyaW0nOw0KCQkJCSR0YWxlcGxlcmltCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIGRlc3Rla190YWxlcGxlciBXSEVSRSB0YWxlcF9zYWhpYmk9PyAmJiB0YWxlcF9kdXJ1bT0/IE9SREVSIEJZIGlkIERFU0MiKTsNCgkJCQkkdGFsZXBsZXJpbS0+IGV4ZWN1dGUoYXJyYXkoJHV5ZS0+dXNlcm5hbWUsJ0thcGFsxLEnKSk7DQoJCQkJJHRhbGVwbGVyaW0JPQkkdGFsZXBsZXJpbS0+ZmV0Y2hBbGwoUERPOjpGRVRDSF9PQkopOw0KCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvYWxsX3RpY2tldHMudmlldy5waHAnOw0KCQkJfWVsc2V7DQoJCQkJeW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdtYWluLnZpZXcnKSk7DQoJCQl9DQoJCQlleGl0KCk7DQoJfSwna2FwYWxpX3RpY2tldHMudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy95ZW5pLXNpcGFyaXMnLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllLCRrYXRlZ29yaWxlciwka2F0ZWdvcmlsZXJmaXlhdDsNCgkJCWlmIChAJF9TRVNTSU9OWyJsb2dpbiJdKSB7DQoJCQkJJHRpdGxlLj0JJ1llbmkgU2lwYXJpxZ8nOw0KCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvbmV3X29yZGVyLnZpZXcucGhwJzsNCgkJCX1lbHNlew0KCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnbWFpbi52aWV3JykpOw0KCQkJfQ0KCQkJZXhpdCgpOw0KCX0sJ25ld19vcmRlci52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnL3NpcGFyaXNsZXJpbScsIGZ1bmN0aW9uKCl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWUsJGFwaWxlciwkc21tYXBpOw0KCQkJaWYgKEAkX1NFU1NJT05bImxvZ2luIl0pIHsNCgkJCQkkdGl0bGUuPQknU2lwYXJpxZ9sZXJpbSc7DQoJCQkJJHNsdWcJPQkxOw0KCQkJCS8qIFNheWZhbGFtYSAqLw0KCQkJCSRnb3p1a3N1biA9IDIwOyAvLyBMaXN0ZWxlbWVkZSB5YW4geWFuYSBrYcOnIHNheWZhIG51bWFyYXPEsSBvbHN1bg0KCQkJCSRrYWN0YW5lICA9IDEwOyAvLyBTYXlmYWRhIEthw6cgVmVyaSBHw7Z6w7xrc8O8bg0KCQkJCSRuZXJlZGVuICA9ICRzbHVnKiRrYWN0YW5lLSRrYWN0YW5lOyAvLyBWZXJpbGVyIE5lcmRlbiDDh2VraWxtZXllIEJhxZ9sYW5hY2FrDQoJCQkJJHZlcmlzYXkgID0gJHZ0LT5xdWVyeSgiU0VMRUNUICogRlJPTSBzaXBhcmlzbGVyIFdIRVJFIHNpcGFyaXNfc2FoaWJpPSckdXllLT51c2VybmFtZScgIiktPnJvd0NvdW50KCk7IC8vIEthw6cgVGFuZSBWZXJpIFZhcg0KCQkJCSR0b3BsYW1zYXlmYSAgPSBjZWlsKCR2ZXJpc2F5LyRrYWN0YW5lKTsgaWYoJHRvcGxhbXNheWZhPT0wKXskdG9wbGFtc2F5ZmE9MTt9IC8vIFRvcGxhbSBLYcOnIFNheWZhIFZhcg0KCQkJCWlmKCRzbHVnPiR0b3BsYW1zYXlmYSl7eW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdteV9vcmRlcnMudmlldycsWydzbHVnJz0+MV0pKTt9DQoJCQkJLyogU2F5ZmFsYW1hICovDQoJCQkJJHNpcGFyaXNsZXIJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gc2lwYXJpc2xlciBXSEVSRSBzaXBhcmlzX3NhaGliaT0/IE9SREVSIEJZIGlkIERFU0MgTElNSVQgJG5lcmVkZW4sJGthY3RhbmUiKTsNCgkJCQkkc2lwYXJpc2xlci0+IGV4ZWN1dGUoYXJyYXkoJHV5ZS0+dXNlcm5hbWUpKTsNCgkJCQkkc2lwYXJpc2xlcgk9CSRzaXBhcmlzbGVyLT5mZXRjaEFsbChQRE86OkZFVENIX09CSik7DQoJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9teV9vcmRlcnMudmlldy5waHAnOw0KCQkJfWVsc2V7DQoJCQkJeW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdtYWluLnZpZXcnKSk7DQoJCQl9DQoJCQlleGl0KCk7DQoJfSwnbXlfb3JkZXJzLnZpZXcnKTsNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvc2lwYXJpc2xlcmltL1sqOnNsdWddJywgZnVuY3Rpb24oJHNsdWcpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllLCRhcGlsZXIsJHNtbWFwaTsNCgkJCWlmIChAJF9TRVNTSU9OWyJsb2dpbiJdKSB7DQoJCQkJJHRpdGxlLj0JJ1NpcGFyacWfbGVyaW0nOw0KCQkJCS8qIFNheWZhbGFtYSAqLw0KCQkJCSRnb3p1a3N1biA9IDIwOyAvLyBMaXN0ZWxlbWVkZSB5YW4geWFuYSBrYcOnIHNheWZhIG51bWFyYXPEsSBvbHN1bg0KCQkJCSRrYWN0YW5lICA9IDEwOyAvLyBTYXlmYWRhIEthw6cgVmVyaSBHw7Z6w7xrc8O8bg0KCQkJCSRuZXJlZGVuICA9ICRzbHVnKiRrYWN0YW5lLSRrYWN0YW5lOyAvLyBWZXJpbGVyIE5lcmRlbiDDh2VraWxtZXllIEJhxZ9sYW5hY2FrDQoJCQkJJHZlcmlzYXkgID0gJHZ0LT5xdWVyeSgiU0VMRUNUICogRlJPTSBzaXBhcmlzbGVyIFdIRVJFIHNpcGFyaXNfc2FoaWJpPSckdXllLT51c2VybmFtZScgIiktPnJvd0NvdW50KCk7IC8vIEthw6cgVGFuZSBWZXJpIFZhcg0KCQkJCSR0b3BsYW1zYXlmYSAgPSBjZWlsKCR2ZXJpc2F5LyRrYWN0YW5lKTsgaWYoJHRvcGxhbXNheWZhPT0wKXskdG9wbGFtc2F5ZmE9MTt9IC8vIFRvcGxhbSBLYcOnIFNheWZhIFZhcg0KCQkJCWlmKCRzbHVnPiR0b3BsYW1zYXlmYSl7eW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdteV9vcmRlcnMudmlldycsWydzbHVnJz0+MV0pKTt9DQoJCQkJLyogU2F5ZmFsYW1hICovDQoJCQkJJHNpcGFyaXNsZXIJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gc2lwYXJpc2xlciBXSEVSRSBzaXBhcmlzX3NhaGliaT0/IE9SREVSIEJZIGlkIERFU0MgTElNSVQgJG5lcmVkZW4sJGthY3RhbmUiKTsNCgkJCQkkc2lwYXJpc2xlci0+IGV4ZWN1dGUoYXJyYXkoJHV5ZS0+dXNlcm5hbWUpKTsNCgkJCQkkc2lwYXJpc2xlcgk9CSRzaXBhcmlzbGVyLT5mZXRjaEFsbChQRE86OkZFVENIX09CSik7DQoJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9teV9vcmRlcnMudmlldy5waHAnOw0KCQkJfWVsc2V7DQoJCQkJeW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdtYWluLnZpZXcnKSk7DQoJCQl9DQoJCQlleGl0KCk7DQoJfSwnbXlfb3JkZXJzcy52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnL3Bha2V0bGVyJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwkdXJ1bmxlciwka2F0ZWdvcmlsZXJmaXlhdDsNCgkJCQkkdGl0bGUuPQknRml5YXQgTGlzdGVzaSc7DQoJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9wcmljZV9saXN0LnZpZXcucGhwJzsNCgkJCQlleGl0KCk7DQoJfSwncHJpY2VfbGlzdC52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnL3Byb2ZpbCcsIGZ1bmN0aW9uKCl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCQlpZiAoQCRfU0VTU0lPTlsibG9naW4iXSkgew0KCQkJCSR0aXRsZS49CSdQcm9maWxpbSc7DQoJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9teV9zZXR0aW5nLnZpZXcucGhwJzsNCgkJCX1lbHNlew0KCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnbWFpbi52aWV3JykpOw0KCQkJfQ0KCQkJZXhpdCgpOw0KCX0sJ215X3NldHRpbmcudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy9vZGVtZWxlcmltJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwkYXBpbGVyLCRzbW1hcGksJGJvZGVtZWxlciwkYm9ubGluZW9kZW1lbGVyOw0KCQkJaWYgKEAkX1NFU1NJT05bImxvZ2luIl0pIHsNCgkJCQkkdGl0bGUuPQknw5ZkZW1lbGVyaW0nOw0KCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvb2RlbWVsZXIudmlldy5waHAnOw0KCQkJfWVsc2V7DQoJCQkJeW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdtYWluLnZpZXcnKSk7DQoJCQl9DQoJCQlleGl0KCk7DQoJfSwnb2RlbWVsZXIudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy9tb2JpbC1vbmF5JywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJCQlpZiAoQCRfU0VTU0lPTlsibG9naW4iXSkgew0KCQkJCQkkdGl0bGUuPQknQW5hc2F5ZmEnOw0KCQkJCQlpbmNsdWRlICd2aWV3cy8nLlNJVEVfVEVNQS4nL21vYmlsZS52aWV3LnBocCc7DQoJCQkJfWVsc2V7DQoJCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnbG9naW4udmlldycpKTsNCgkJCQl9DQoJCQkJZXhpdCgpOw0KCX0sJ21vYmlsZS52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy9idXlwYXllci1vZGVtZScsIGZ1bmN0aW9uKCl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCQkJJHR1dGFyCT0Jc3RyX3JlcGxhY2UoJy4nLCAnLCcsICRfUE9TVFsidHV0YXIiXSk7DQoJCQkJJHlvbnRlbSA9CSRfUE9TVFsieW9udGVtIl07DQoJCQkJJHJhbmQJPQlyYW5kKDAsOSkucmFuZCgwLDkpLnJhbmQoMCw5KS5yYW5kKDAsOSkucmFuZCgwLDkpOw0KCQkJCSR0YXJpaCAJPQlkYXRlKCJZLm0uZCIpOw0KCQkJCSRpcCAJPQlHZXRJUCgpOw0KCQkJCWlmICggJHR1dGFyID49IDEgKSB7DQoJCQkJCQ0KCQkJCQloZWFkZXIoJ0NvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Jyk7DQoJCQkJCSRwb3N0VXJsPSdodHRwczovL3d3dy5idXlwYXllci5jb20vcmVjZWl2ZTIuYXNwJzsNCg0KCQkJCQkvLyBpdHQgYWxhbsSxbmRhIHRhaHNpbCBlZGlsZWNlayB0dXRhcmRhIGt1cnXFnyBvbG1hc8SxIGR1cnVtdW5kYSB2aXJnw7xsIGt1bGxhbsSxbsSxeiAiODUsNTUiIGdpYmkNCgkJCQkJJHhtbFN0cmluZz0neG1sPTxzZW5kPg0KCQkJCQkJCTxtZ3ppZD4nLiRzaXRlYXlhci0+YnV5cGF5ZXJfbWFnYXphLic8L21nemlkPg0KCQkJCQkgICAgICAgIDxpdHQ+Jy4kdHV0YXIuJzwvaXR0PiANCgkJCQkJICAgICAgICA8c2lwaWQ+Jy4kcmFuZC4nPC9zaXBpZD4NCgkJCQkJCQk8YWRzb3lhZD4nLiR1eWUtPmFkc295YWQuJzwvYWRzb3lhZD4NCgkJCQkJCQk8dGVsZWZvbj4nLiR1eWUtPnRlbGVmb24uJzwvdGVsZWZvbj4NCgkJCQkJCSAgICA8ZXBvc3RhPicuJHV5ZS0+ZW1haWwuJzwvZXBvc3RhPg0KCQkJCQkgICAgICAgIDxhZHJlcz5CZWxpcnRpbG1lbWnFnzwvYWRyZXM+DQoJCQkJCQkJPHVydW5hZGk+Jy4kdHV0YXIuJyBUTCBiYWtpeWUgecO8a2xlbWVzaTwvdXJ1bmFkaT4NCgkJCQkJCQk8Z3ZrPicuJHNpdGVheWFyLT5idXlwYXllcl9ndXZlbmxpay4nPC9ndms+DQoJCQkJCQkJPHV5ZW1haWw+Jy4kc2l0ZWF5YXItPmJ1eXBheWVyX21haWwuJzwvdXllbWFpbD4NCgkJCQkJCQkNCgkJCQkJPC9zZW5kPic7ICANCg0KCQkJCQkkVmVyaWxlciA9ICAkeG1sU3RyaW5nOw0KCQkJCQkkY2ggPSBjdXJsX2luaXQoKTsNCgkJCQkJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJHBvc3RVcmwpOw0KCQkJCQljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVCwgMSk7DQoJCQkJCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9QT1NURklFTERTLCAkVmVyaWxlcik7DQoJCQkJCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwxKTsNCgkJCQkJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1NTTF9WRVJJRllQRUVSLDApOw0KCQkJCQljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVElNRU9VVCwgMzApOw0KCQkJCQkkcmVzcG9uc2UgPSBjdXJsX2V4ZWMoJGNoKTsNCgkJCQkJY3VybF9jbG9zZSgkY2gpOw0KDQoJCQkJCQ0KDQoJCQkJCWlmKCRyZXNwb25zZSl7DQoJCQkJCQkkZWtsZQk9CSR2dC0+cHJlcGFyZSgiSU5TRVJUIElOVE8gYnV5cGF5ZXJfb2RlbWVsZXIgU0VUIG9kZW1lX2lwPT8sIG9kZW1lX2Vrc3RyYT0/LCBvZGVtZV9zYWhpYmk9Pywgb2RlbmRpbWk9Pywgb2RlbWVfdHV0YXJpPT8sIG9kZW1lX2R1cnVtPT8sIG9kZW1lX3RhcmloPT8iKTsNCgkJCQkJCSRla2xlLT4gZXhlY3V0ZShhcnJheSgkaXAsJHJhbmQsJHV5ZS0+dXNlcm5hbWUsJzAnLCR0dXRhciwnQmVrbGVtZWRlJywkdGFyaWgpKTsNCgkJCQkJCSRvdXRwdXQgPSBbJ3QnPT4nQmHFn2FyxLFsxLEnLCdtJz0+J0zDvHRmZW4gYmVrbGV5aW4gw7ZkZW1lIHNheWZhc8SxbmEgecO2bmxlbmRpcmlsaXlvcnN1bnV6Jywncyc9PidzdWNjZXNzJywncic9PiRyZXNwb25zZV07DQoJCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCQl9ZWxzZXsNCgkJCQkJCSRvdXRwdXQgPSBbJ3QnPT4nSGF0YScsJ20nPT4nw5ZkZW1lIGnFn2xlbWkgYmHFn2xhdMSxbMSxcmtlbiBoYXRhIG9sdcWfdHUgbMO8dGZlbiBkYWhhIHNvbnJhIHRla3JhciBkZW5leWluJywncyc9PidlcnJvciddOw0KCQkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQkJfQ0KCQkJCX1lbHNlew0KCQkJCQkkb3V0cHV0ID0gWyd0Jz0+J0hhdGEnLCdtJz0+J01pbmltdW0gw7ZkZW1lIG1pa3RhcsSxIDEgVExcJ2RpcicsJ3MnPT4nZXJyb3InXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9DQoNCg0KDQoJfSwnYnV5cGF5ZXIucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnUE9TVCcsICcvcGF5dHItb2RlbWUnLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQkJCSR0dXRhcgk9CSRfUE9TVFsidHV0YXIiXTsNCgkJCQkkeW9udGVtID0JJF9QT1NUWyJ5b250ZW0iXTsNCg0KCQkJCWlmICggJHR1dGFyID49IDEgKSB7DQoJCQkJCSR0YXJpaAkJCQkJPSBkYXRlKCdZLW0tZCBIOmk6cycpOw0KCQkJCQkkaXAgCQkJCQkJPSBHZXRJUCgpOw0KCQkJCQkkbWVyY2hhbnRfaWQgCQk9ICRzaXRlYXlhci0+bWVyY2hhbnRfaWQ7ICMjIEFQSSBFbnRlZ3Jhc3lvbiBCaWxnaWxlcmkNCgkJCQkJJG1lcmNoYW50X2tleSAJPSAkc2l0ZWF5YXItPm1lcmNoYW50X2tleTsgIyMgQVBJIEVudGVncmFzeW9uIEJpbGdpbGVyaQ0KCQkJCQkkbWVyY2hhbnRfc2FsdAk9ICRzaXRlYXlhci0+bWVyY2hhbnRfc2FsdDsgIyMgQVBJIEVudGVncmFzeW9uIEJpbGdpbGVyaQ0KDQoJCQkJCSRlbWFpbCAJCQkJCQkJPSAkdXllLT5tYWlsOyAjIyBNw7zFn3RlcmluaXppbiBzaXRlbml6ZGUga2F5xLF0bMSxIHZleWEgZm9ybSB2YXPEsXRhc8SxeWxhIGFsZMSxxJ/EsW7EsXogZXBvc3RhIGFkcmVzaQ0KCQkJCQkkcGF5bWVudF9hbW91bnQJCQk9ICgkdHV0YXIrJHR1dGFyKjEwLzEwMCkqMTAwOyAgIyMgVGFoc2lsIGVkaWxlY2VrIHR1dGFyLg0KCQkJCQkkbWVyY2hhbnRfb2lkIAkJCT0gcmFuZCgxMDAwMCw5OTk5OTk5OSk7ICMjIFNpcGFyacWfIG51bWFyYXPEsQ0KCQkJCQkkdXNlcl9uYW1lIAkJCQkJPSAkdXllLT5hZHNveWFkOyAjIyBNw7zFn3RlcmluaXppbiBzaXRlbml6ZGUga2F5xLF0bMSxIHZleWEgZm9ybSBhcmFjxLFsxLHEn8SxeWxhIGFsZMSxxJ/EsW7EsXogYWQgdmUgc295YWQgYmlsZ2lzaQ0KCQkJCQkkdXNlcl9hZGRyZXNzIAkJCT0gIsSwc3RhbmJ1bCI7ICMjIE3DvMWfdGVyaW5pemluIHNpdGVuaXpkZSBrYXnEsXRsxLEgdmV5YSBmb3JtIGFyYWPEsWzEscSfxLF5bGEgYWxkxLHEn8SxbsSxeiBhZHJlcyBiaWxnaXNpDQoJCQkJCSR1c2VyX3Bob25lIAkJCQk9ICR1eWUtPnRlbGVmb247ICMjIE3DvMWfdGVyaW5pemluIHNpdGVuaXpkZSBrYXnEsXRsxLEgdmV5YSBmb3JtIGFyYWPEsWzEscSfxLF5bGEgYWxkxLHEn8SxbsSxeiB0ZWxlZm9uIGJpbGdpc2kNCgkJCQkJJG1lcmNoYW50X29rX3VybCAJCT0gImh0dHA6Ly8iLiRzaXRlYXlhci0+c2l0ZV91cmwuIm9ubGluZS1vZGVtZS1iYXNhcmlsaSI7ICMjIEJhxZ9hcsSxbMSxIMO2ZGVtZSBzb25yYXPEsSBtw7zFn3RlcmluaXppbiB5w7ZubGVuZGlyaWxlY2XEn2kgc2F5ZmENCgkJCQkJJG1lcmNoYW50X2ZhaWxfdXJsIAk9ICJodHRwOi8vIi4kc2l0ZWF5YXItPnNpdGVfdXJsLiJvbmxpbmUtb2RlbWUtYmFzYXJpc2l6IjsgIyMgw5ZkZW1lIHPDvHJlY2luZGUgYmVrbGVubWVkaWsgYmlyIGhhdGEgb2x1xZ9tYXPEsSBkdXJ1bXVuZGEgbcO8xZ90ZXJpbml6aW4gecO2bmxlbmRpcmlsZWNlxJ9pIHNheWZhDQoJCQkJCSR1c2VyX2Jhc2tldCA9IGJhc2U2NF9lbmNvZGUoanNvbl9lbmNvZGUoYXJyYXkoDQoJCQkJCQlhcnJheSgkdHV0YXIuIiBUTCBCYWtpeWUiLCAkdHV0YXIsIDEpDQoJCQkJCSkpKTsgIyMgTcO8xZ90ZXJpbmluIHNlcGV0L3NpcGFyacWfIGnDp2VyacSfaQ0KCQkJCQkkdXNlcl9pcAkJCQkJPQkkaXA7DQoJCQkJCSR0aW1lb3V0X2xpbWl0IAkJPSAiMzAiOyAjIyDEsMWfbGVtIHphbWFuIGHFn8SxbcSxIHPDvHJlc2kgLSBkYWtpa2EgY2luc2luZGVuDQoJCQkJCSRkZWJ1Z19vbiAJCQkJPSAxOyAjIyBIYXRhIG1lc2FqbGFyxLFuxLFuIGVrcmFuYSBiYXPEsWxtYXPEsSBpw6dpbiBlbnRlZ3Jhc3lvbiB2ZSB0ZXN0IHPDvHJlY2luZGUgMSBvbGFyYWsgYsSxcmFrxLFuLiBEYWhhIHNvbnJhIDAgeWFwYWJpbGlyc2luaXouDQoJCQkgICAgCSR0ZXN0X21vZGUgCQkJCT0gMDsgICMjIE1hxJ9hemEgY2FubMSxIG1vZGRhIGlrZW4gdGVzdCBpxZ9sZW0geWFwbWFrIGnDp2luIDEgb2xhcmFrIGfDtm5kZXJpbGViaWxpci4NCgkJCQkJJG5vX2luc3RhbGxtZW50CQk9IDA7IC8vIFRha3NpdCB5YXDEsWxtYXPEsW7EsSBpc3RlbWl5b3JzYW7EsXosIHNhZGVjZSB0ZWsgw6dla2ltIHN1bmFjYWtzYW7EsXogMSB5YXDEsW4NCgkJCQkJJG1heF9pbnN0YWxsbWVudCAJPSAwOyAjIyBTYXlmYWRhIGfDtnLDvG50w7xsZW5lY2VrIHRha3NpdCBhZGVkaW5pIHPEsW7EsXJsYW1hayBpc3RpeW9yc2FuxLF6IHV5Z3VuIMWfZWtpbGRlIGRlxJ9pxZ90aXJpbi4NCgkJCQkJJGN1cnJlbmN5ID0gIlRMIjsNCg0KDQoJCQkJCSMjIyMjIyMgQnUga8Sxc8SxbWRhIGhlcmhhbmdpIGJpciBkZcSfacWfaWtsaWsgeWFwbWFuxLF6YSBnZXJlayB5b2t0dXIuICMjIyMjIyMNCgkJCQkJaWYoICR5b250ZW0gIT0gImVmdCIgKXsNCgkJCQkJCSRoYXNoX3N0ciA9ICRtZXJjaGFudF9pZCAuJHVzZXJfaXAgLiRtZXJjaGFudF9vaWQgLiRlbWFpbCAuJHBheW1lbnRfYW1vdW50IC4kdXNlcl9iYXNrZXQuJG5vX2luc3RhbGxtZW50LiRtYXhfaW5zdGFsbG1lbnQuJGN1cnJlbmN5LiR0ZXN0X21vZGU7DQoJCQkJCQkkcGF5dHJfdG9rZW49YmFzZTY0X2VuY29kZShoYXNoX2htYWMoJ3NoYTI1NicsJGhhc2hfc3RyLiRtZXJjaGFudF9zYWx0LCRtZXJjaGFudF9rZXksdHJ1ZSkpOw0KCQkJCQkJJHBvc3RfdmFscz1hcnJheSgNCgkJCQkJCQknbWVyY2hhbnRfaWQnPT4kbWVyY2hhbnRfaWQsDQoJCQkJCQkJJ3VzZXJfaXAnPT4kdXNlcl9pcCwNCgkJCQkJCQknbWVyY2hhbnRfb2lkJz0+JG1lcmNoYW50X29pZCwNCgkJCQkJCQknZW1haWwnPT4kZW1haWwsDQoJCQkJCQkJJ3BheW1lbnRfYW1vdW50Jz0+JHBheW1lbnRfYW1vdW50LA0KCQkJCQkJCSdwYXl0cl90b2tlbic9PiRwYXl0cl90b2tlbiwNCgkJCQkJCQkndXNlcl9iYXNrZXQnPT4kdXNlcl9iYXNrZXQsDQoJCQkJCQkJJ2RlYnVnX29uJz0+JGRlYnVnX29uLA0KCQkJCQkJCSdub19pbnN0YWxsbWVudCc9PiRub19pbnN0YWxsbWVudCwNCgkJCQkJCQknbWF4X2luc3RhbGxtZW50Jz0+JG1heF9pbnN0YWxsbWVudCwNCgkJCQkJCQkndXNlcl9uYW1lJz0+JHVzZXJfbmFtZSwNCgkJCQkJCQkndXNlcl9hZGRyZXNzJz0+JHVzZXJfYWRkcmVzcywNCgkJCQkJCQkndXNlcl9waG9uZSc9PiR1c2VyX3Bob25lLA0KCQkJCQkJCSdtZXJjaGFudF9va191cmwnPT4kbWVyY2hhbnRfb2tfdXJsLA0KCQkJCQkJCSdtZXJjaGFudF9mYWlsX3VybCc9PiRtZXJjaGFudF9mYWlsX3VybCwNCgkJCQkJCQkndGltZW91dF9saW1pdCc9PiR0aW1lb3V0X2xpbWl0LA0KCQkJCQkJCSdjdXJyZW5jeSc9PiRjdXJyZW5jeSwNCgkJICAgICAgICAgICAJCQkndGVzdF9tb2RlJz0+JHRlc3RfbW9kZQ0KCQkJCQkJKTsNCgkJCQkJfWVsc2V7DQoJCQkJCQkkaGFzaF9zdHI9JG1lcmNoYW50X2lkLiR1c2VyX2lwLiRtZXJjaGFudF9vaWQuJGVtYWlsLiRwYXltZW50X2Ftb3VudC4keW9udGVtLiR0ZXN0X21vZGU7DQoJCQkJCQkkcGF5dHJfdG9rZW49YmFzZTY0X2VuY29kZShoYXNoX2htYWMoJ3NoYTI1NicsJGhhc2hfc3RyLiRtZXJjaGFudF9zYWx0LCRtZXJjaGFudF9rZXksdHJ1ZSkpOw0KCQkJCQkJJHBvc3RfdmFscz1hcnJheSgNCgkJCQkJCQknbWVyY2hhbnRfaWQnPT4kbWVyY2hhbnRfaWQsDQoJCQkJCQkJJ3VzZXJfaXAnPT4kdXNlcl9pcCwNCgkJCQkJCQknbWVyY2hhbnRfb2lkJz0+JG1lcmNoYW50X29pZCwNCgkJCQkJCQknZW1haWwnPT4kZW1haWwsDQoJCQkJCQkJJ3BheW1lbnRfYW1vdW50Jz0+JHBheW1lbnRfYW1vdW50LA0KCQkJCQkJCSdwYXltZW50X3R5cGUnPT4keW9udGVtLA0KCQkJCQkJCSdwYXl0cl90b2tlbic9PiRwYXl0cl90b2tlbiwNCgkJCQkJCQknZGVidWdfb24nPT4kZGVidWdfb24sDQoJCQkJCQkJJ3RpbWVvdXRfbGltaXQnPT4kdGltZW91dF9saW1pdCwNCgkJCQkgICAgICAgICAgICAndGVzdF9tb2RlJz0+JHRlc3RfbW9kZQ0KCQkJCQkJKTsNCgkJCQkJfQ0KDQoNCgkJCQkJJGNoPWN1cmxfaW5pdCgpOw0KCQkJCQljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAiaHR0cHM6Ly93d3cucGF5dHIuY29tL29kZW1lL2FwaS9nZXQtdG9rZW4iKTsNCgkJCQkJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAxKTsNCgkJCQkJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1BPU1QsIDEpIDsNCgkJCQkJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1BPU1RGSUVMRFMsICRwb3N0X3ZhbHMpOw0KCQkJCQljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIsIDApOw0KCQkJCQljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsIDApOw0KCQkJCQljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfRlJFU0hfQ09OTkVDVCwgdHJ1ZSk7DQoJCQkJCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9USU1FT1VULCAyMCk7DQoJCQkJCSRyZXN1bHQgPSBAY3VybF9leGVjKCRjaCk7DQoNCgkJCQkJaWYoY3VybF9lcnJubygkY2gpKQ0KCQkJCQkJZGllKCJQQVlUUiBJRlJBTUUgY29ubmVjdGlvbiBlcnJvci4gZXJyOiIuY3VybF9lcnJvcigkY2gpKTsNCg0KCQkJCQljdXJsX2Nsb3NlKCRjaCk7DQoNCgkJCQkJJHJlc3VsdD1qc29uX2RlY29kZSgkcmVzdWx0LDEpOw0KDQoJCQkJCWlmKCRyZXN1bHRbJ3N0YXR1cyddPT0nc3VjY2Vzcycpew0KCQkJCQkJJHRva2VuCT0JJHJlc3VsdFsndG9rZW4nXTsNCgkJCQkJCSRla2xlCT0JJHZ0LT5wcmVwYXJlKCJJTlNFUlQgSU5UTyBwYXl0cl9vZGVtZWxlciBTRVQgb2RlbWVfaXA9Pywgb2RlbWVfZWtzdHJhPT8sIG9kZW1lX3NhaGliaT0/LCBvZGVuZGltaT0/LCBvZGVtZV90dXRhcmk9Pywgb2RlbWVfZHVydW09Pywgb2RlbWVfdGFyaWg9PyIpOw0KCQkJCQkJJGVrbGUtPiBleGVjdXRlKGFycmF5KCRpcCwkbWVyY2hhbnRfb2lkLCR1eWUtPnVzZXJuYW1lLCcwJywkdHV0YXIsJ0Jla2xlbWVkZScsJHRhcmloKSk7DQoJCQkJCQkkb3V0cHV0ID0gWyd0Jz0+J0JhxZ9hcsSxbMSxJywnbSc9PidMw7x0ZmVuIGJla2xleWluIMO2ZGVtZSBzYXlmYXPEsW5hIHnDtm5sZW5kaXJpbGl5b3JzdW51eicsJ3MnPT4nc3VjY2VzcycsJ3InPT4kcm91dGVyLT5nZW5lcmF0ZSgncGF5X3RyLnZpZXcnLFsnc2x1Zyc9PiR0b2tlbiwndXJsJz0+JHlvbnRlbV0pXTsNCgkJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJCX1lbHNlew0KDQoJCQkJCQkkb3V0cHV0ID0gWyd0Jz0+J0hhdGEnLCdtJz0+J8OWZGVtZSBpxZ9sZW1pIGJhxZ9sYXTEsWzEsXJrZW4gaGF0YSBvbHXFn3R1IGzDvHRmZW4gZGFoYSBzb25yYSB0ZWtyYXIgZGVuZXlpbicsJ3MnPT4nZXJyb3InXTsNCgkJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJCX0NCgkJCQl9ZWxzZXsNCgkJCQkJJG91dHB1dCA9IFsndCc9PidIYXRhJywnbSc9PidNaW5pbXVtIMO2ZGVtZSBtaWt0YXLEsSAxIFRMXCdkaXInLCdzJz0+J2Vycm9yJ107DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfQ0KDQoNCg0KCX0sJ3BheXRfdHIucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy9vbmxpbmUtb2RlbWUvWyo6c2x1Z10vWyo6dXJsXScsIGZ1bmN0aW9uKCRzbHVnLCR1cmwpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQkJaW5jbHVkZSAndmlld3MvZGVmYXVsdC9oZWFkZXIudmlldy5waHAnOw0KCQkJaWYgKCAkdXJsID09ICJlZnQiICkgew0KCQkJCSR1cmwgPSAiaHR0cHM6Ly93d3cucGF5dHIuY29tL29kZW1lL2FwaS8iOw0KCQkJfSBlbHNlIHsNCgkJCQkkdXJsID0gImh0dHBzOi8vd3d3LnBheXRyLmNvbS9vZGVtZS9ndXZlbmxpLyI7DQoJCQl9DQoNCgkJCWVjaG8gJw0KCQkJPG1haW4gaWQ9ImFwcC1tYWluIiBjbGFzcz0iYXBwLW1haW4iPg0KCQkJICA8ZGl2IGNsYXNzPSJ3cmFwIj4NCgkJCQk8c2VjdGlvbiBjbGFzcz0iYXBwLWNvbnRlbnQiPg0KCQkJCQk8ZGl2IGNsYXNzPSJyb3ciPg0KCQkJPHNjcmlwdCBzcmM9Imh0dHBzOi8vd3d3LnBheXRyLmNvbS9qcy9pZnJhbWVSZXNpemVyLm1pbi5qcyI+PC9zY3JpcHQ+DQoJICAgIDxpZnJhbWUgc3JjPSInLiR1cmwuJHNsdWcuJyIgaWQ9InBheXRyaWZyYW1lIiBmcmFtZWJvcmRlcj0iMCIgc2Nyb2xsaW5nPSJubyIgc3R5bGU9IndpZHRoOiAxMDAlOyI+PC9pZnJhbWU+DQoJCQkJPHNjcmlwdD5pRnJhbWVSZXNpemUoe30sXCcjcGF5dHJpZnJhbWVcJyk7PC9zY3JpcHQ+DQoJCQkJCTwvZGl2PjwhLS0gLnJvdyAtLT4NCgkJCQk8L3NlY3Rpb24+PCEtLSAjZGFzaC1jb250ZW50IC0tPg0KCQkJPC9kaXY+PCEtLSAud3JhcCAtLT4NCgkJCQkJJzsNCgkJCWluY2x1ZGUgJ3ZpZXdzL2RlZmF1bHQvZm9vdGVyLnZpZXcucGhwJzsNCgl9LCdwYXlfdHIudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy9vbmxpbmUtb2RlbWUtYmFzYXJpbGknLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQkJaW5jbHVkZSAndmlld3MvZGVmYXVsdC9oZWFkZXIudmlldy5waHAnOw0KCQkJZWNobyAnDQoJCQk8bWFpbiBpZD0iYXBwLW1haW4iIGNsYXNzPSJhcHAtbWFpbiI+DQoJCQkgIDxkaXYgY2xhc3M9IndyYXAiPg0KCQkJCTxzZWN0aW9uIGNsYXNzPSJhcHAtY29udGVudCI+DQoJCQkJCTxkaXYgY2xhc3M9InJvdyI+DQoJCQkJCTxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LXN1Y2Nlc3MgYWxlcnQtZGlzbWlzc2libGUiIHJvbGU9ImFsZXJ0Ij4NCgkJCQkJCQk8c3Ryb25nPkJhxZ9hcsSxbMSxISA8L3N0cm9uZz4NCgkJCQkJCQk8c3Bhbj7DlmRlbWUgacWfbGVtaW5peiB0YW1hbWxhbmTEsSwgZW4ga8Sxc2EgemFtYW5sYSBoZXNhYsSxbsSxemEgYWt0YXLEsWxhY2FrdMSxci48L3NwYW4+DQoJCQkJCQk8L2Rpdj4NCgkJCQkJPC9kaXY+PCEtLSAucm93IC0tPg0KCQkJCTwvc2VjdGlvbj48IS0tICNkYXNoLWNvbnRlbnQgLS0+DQoJCQk8L2Rpdj48IS0tIC53cmFwIC0tPg0KCQkJCQknOw0KCQkJaW5jbHVkZSAndmlld3MvZGVmYXVsdC9mb290ZXIudmlldy5waHAnOw0KCX0sJ3BheV90cl9iYXNhcmlsaS52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnL29ubGluZS1vZGVtZS1iYXNhcmlzaXonLCBmdW5jdGlvbigpew0KCQkJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJCWluY2x1ZGUgJ3ZpZXdzL2RlZmF1bHQvaGVhZGVyLnZpZXcucGhwJzsNCgkJCWVjaG8gJw0KCQkJPG1haW4gaWQ9ImFwcC1tYWluIiBjbGFzcz0iYXBwLW1haW4iPg0KCQkJCTxkaXYgY2xhc3M9IndyYXAiPg0KCQkJCTxzZWN0aW9uIGNsYXNzPSJhcHAtY29udGVudCI+DQoJCQkJCTxkaXYgY2xhc3M9InJvdyI+DQoJCQkJCTxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWRhbmdlciBhbGVydC1kaXNtaXNzaWJsZSIgcm9sZT0iYWxlcnQiPg0KCQkJCQkJCTxzdHJvbmc+QmHFn2FyxLFzxLF6ISA8L3N0cm9uZz4NCgkJCQkJCQk8c3Bhbj7DlmRlbWUgacWfbGVtaW5peiB0YW1hbWxhbmFtYWTEsSwgbMO8dGZlbiBkYWhhIHNvbnJhIHRla3JhciBkZW5leWluLjwvc3Bhbj4NCgkJCQkJCTwvZGl2Pg0KCQkJCQk8L2Rpdj48IS0tIC5yb3cgLS0+DQoJCQkJPC9zZWN0aW9uPjwhLS0gI2Rhc2gtY29udGVudCAtLT4NCgkJCTwvZGl2PjwhLS0gLndyYXAgLS0+DQoJCQkJCSc7DQoJCQlpbmNsdWRlICd2aWV3cy9kZWZhdWx0L2Zvb3Rlci52aWV3LnBocCc7DQoJfSwncGF5X3RyX2Jhc2FyaXNpei52aWV3Jyk7DQoNCgkjIyBLdWxsYW7EsWPEsSBQT1NUIMSwxZ9sZW1sZXJpICMjDQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy9zaWZyZW1pLXVudXR0dW0nLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KDQoJCQkkdHVyCQkJPQkkX1BPU1RbInR1ciJdOw0KCQkJJG1haWwJCQk9CSRfUE9TVFsiZW1haWwiXTsNCgkJCSR0ZWxlZm9uCT0Jc3RyX3JlcGxhY2UoIiAiLCIiLCRfUE9TVFsidGVsZWZvbiJdKTsNCgkJCSR0YXJpaCAgICA9IGRhdGUoIlkubS5kIEg6aTpzIik7DQoNCgkJCWlmICggJHR1ciA9PSAndGVsZWZvbicgKSB7DQoJCQkJJHNvcgkJCQk9CQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gdXllbGVyIFdIRVJFIHRlbGVmb249PyIpOw0KCQkJCSRzb3IJCQkJLT4JZXhlY3V0ZShhcnJheSgkdGVsZWZvbikpOw0KCQkJCSR1eWUJCQkJPQkJJHNvci0+ZmV0Y2goUERPOjpGRVRDSF9PQkopOw0KCQkJfWVsc2V7DQoJCQkJJHNvcgkJCQk9CQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gdXllbGVyIFdIRVJFIG1haWw9PyIpOw0KCQkJCSRzb3IJCQkJLT4JZXhlY3V0ZShhcnJheSgkbWFpbCkpOw0KCQkJCSR1eWUJCQkJPQkJJHNvci0+ZmV0Y2goUERPOjpGRVRDSF9PQkopOw0KCQkJfQ0KDQoJCQkJaWYgKCAkdHVyID09ICdzZWNpbicgfHwgJHR1ciA9PSAndGVsZWZvbicgJiYgZW1wdHkoJHRlbGVmb24pIHx8ICR0dXIgPT0gJ2VtYWlsJyAmJiBlbXB0eSgkbWFpbCkgKSB7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IlTDvG0gYWxhbmxhcsSxIGRvbGR1cm1hbMSxc8SxbsSxei4iLCJzIj0+ImluZm8iXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9ZWxzZWlmKCAhJHNvci0+cm93Q291bnQoKSApew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJHaXJpbGVuIGJpbGdpbGVyIGlsZSB1eXXFn2FuIGt1bGxhbsSxY8SxIGJ1bHVuYW1hZMSxIiwicyI9PiJpbmZvIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfWVsc2VpZiggJHR1ciA9PSAndGVsZWZvbicgKXsNCgkJCQkJIyMgT25heSBLb2R1IE9sdcWfdHVyICMjDQoJCQkJCSRrb2QgCQkJPSByYW5kKDEsOSkucmFuZCgxLDkpLnJhbmQoMSw5KS5yYW5kKDEsOSkucmFuZCgxLDkpLnJhbmQoMSw5KTsNCgkJCQkJJG9sdXN0dXIJPQkkdnQtPnByZXBhcmUoIklOU0VSVCBJTlRPIHNpZnJlbWl1bnV0dHVtIFNFVCBzYWhpYmk9Pywga29kPT8sIHRhcmloPT8iKTsNCgkJCQkJJG9sdXN0dXIgLT4gZXhlY3V0ZShhcnJheSgkdXllLT51c2VybmFtZSwka29kLCR0YXJpaCkpOw0KCQkJCQkjIyBPbmF5IEtvZHVudSBHw7ZuZGVyICMjDQoJCQkJCXNpZnJlbWlVbnV0dHVtKCR0ZWxlZm9uLCRrb2QpOw0KCQkJCX1lbHNlaWYoICR0dXIgPT0gJ2VtYWlsJyApew0KCQkJCQkjIyBPbmF5IEtvZHUgT2x1xZ90dXIgIyMNCgkJCQkJJGtvZCAJCQk9IHJhbmQoMSw5KS5yYW5kKDEsOSkucmFuZCgxLDkpLnJhbmQoMSw5KS5yYW5kKDEsOSkucmFuZCgxLDkpOw0KCQkJCQkkb2x1c3R1cgk9CSR2dC0+cHJlcGFyZSgiSU5TRVJUIElOVE8gc2lmcmVtaXVudXR0dW0gU0VUIHNhaGliaT0/LCBrb2Q9PywgdGFyaWg9PyIpOw0KCQkJCQkkb2x1c3R1ciAtPiBleGVjdXRlKGFycmF5KCR1eWUtPnVzZXJuYW1lLCRrb2QsJHRhcmloKSk7DQoJCQkJCSMjIE9uYXkgS29kdW51IEfDtm5kZXIgIyMNCgkJCQkJc2lmcmVtaVVudXR0dW1NYWlsKCR1eWUtPm1haWwsIsWeaWZyZW5pemkgZ8O8bmNlbGxlbWVrIGnDp2luIGdlcmVrbGkga29kIG9sYW46ICIuJGtvZCwiUGFyb2xhbcSxIHVudXR0dW0iKTsNCgkJCQl9DQoNCgkJCQlleGl0KCk7DQoJfSwncGFzc3dvcmRfZm9yZ2V0LnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnL3NpZnJlbWktZ3VuY2VsbGUnLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KDQoJCQkka29kCQkJCT0JJF9QT1NUWyJrb2QiXTsNCgkJCSR5ZW5pCQkJCT0JJF9QT1NUWyJzaWZyZSJdOw0KCQkJJHBhc3MJCQkJPQltZDUoJF9QT1NUWyJzaWZyZSJdKTsNCg0KCQkJJHNvcgkJCQk9CQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gc2lmcmVtaXVudXR0dW0gV0hFUkUga29kPT8iKTsNCgkJCSRzb3IJCQkJLT4JZXhlY3V0ZShhcnJheSgka29kKSk7DQoJCQkka29kCQkJCT0gCSRzb3ItPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCgkJCSR1eWUJCQkJPQkJJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHV5ZWxlciBXSEVSRSB1c2VybmFtZT0/Iik7DQoJCQkkdXllCQkJCS0+CWV4ZWN1dGUoYXJyYXkoJGtvZC0+c2FoaWJpKSk7DQoJCQkkdXllCQkJCT0gCSR1eWUtPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCg0KDQoJCQkJaWYgKCBlbXB0eSgka29kKSB8fCBlbXB0eSgkeWVuaSkgKSB7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IlTDvG0gYWxhbmxhcsSxIGRvbGR1cm1hbMSxc8SxbsSxei4iLCJzIj0+ImluZm8iXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9ZWxzZWlmKCAhJHNvci0+cm93Q291bnQoKSApew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJHaXJpbGVuIGtvZCBnZcOnZXJzaXoiLCJzIj0+ImluZm8iXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9ZWxzZWlmKHN0cmxlbigkeWVuaSk8Nil7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IkdpcmRpxJ9pbml6IMWfaWZyZSA2IGthcmFrdGVyZGVuIGvEsXNhIG9sbWFtYWzEsSIsInMiPT4iaW5mbyJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX1lbHNlew0KDQoJCQkJCSRndW5jZWxsZSA9ICR2dC0+cHJlcGFyZSgiVVBEQVRFIHV5ZWxlciBTRVQgcGFzc3dvcmQ9PyBXSEVSRSB1c2VybmFtZT0/Iik7DQoJCQkJCSRndW5jZWxsZSAtPiBleGVjdXRlKGFycmF5KCRwYXNzLCR1eWUtPnVzZXJuYW1lKSk7DQoJCQkJCQlpZiAoJGd1bmNlbGxlKSB7DQoJCQkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiLFnmlmcmVuaXogZ8O8bmNlbGxlbmRpLCB5w7ZubGVuZGlyaWxpeW9yc3VudXoiLCJzIj0+InN1Y2Nlc3MiLCdyJz0+JHJvdXRlci0+Z2VuZXJhdGUoJ2xvZ2luLnZpZXcnKV07DQoJCQkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQkJCQkkZGVsZXRlID0gJHZ0LT5wcmVwYXJlKCJERUxFVEUgRlJPTSBzaWZyZW1pdW51dHR1bSBXSEVSRSBzYWhpYmk9PyIpOw0KCQkJCQkJCSRkZWxldGUgLT4gZXhlY3V0ZShhcnJheSgkdXllLT51c2VybmFtZSkpOw0KCQkJCQkJfWVsc2V7DQoJCQkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhIiwibSI9PiLFnmlmcmVuaXogZ8O8bmNlbGxlbmlya2VuIGhhdGEgb2x1xZ90dXIuIiwicyI9PiJlcnJvciJdOw0KCQkJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJCQl9DQoJCQkJfQ0KDQoNCgkJCQlleGl0KCk7DQoJfSwnc2lmcmVfZ3VuY2VsbGUucG9zdCcpOw0KICAkcm91dGVyLT5tYXAoJ1BPU1QnLCAnL2theWl0LW9sJywgZnVuY3Rpb24oKXsNCgkJCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyOw0KDQoJCSR0YXJpaAkJPQlkYXRlKCJZLW0tZCBIOmk6cyIpOw0KCQkkYWQJCQkJPQlpbGtIYXJmKCRfUE9TVFsibmFtZSJdKTsNCgkJJG1haWwJCQk9CSRfUE9TVFsibWFpbCJdOw0KCQkkdXNlcm5hbWUJPQlzdHJfcmVwbGFjZSgiICIsICIiLCB0ckNldmlyKCRfUE9TVFsidXNlcm5hbWUiXSkpOw0KCQkkcGFzc3dvcmQJPQkkX1BPU1RbInBhc3N3b3JkIl07DQoJCSRwaG9uZQkJPQlzdHJfcmVwbGFjZSgiICIsICIiLCAkX1BPU1RbInBob25lIl0pOw0KCQkkY2FwdGNoYSAJPSBAJF9QT1NUWydnLXJlY2FwdGNoYS1yZXNwb25zZSddOw0KDQoJCSRrZXkJCQk9IG1kNShhcGlrZXlPbHVzdHVyKDMyKS50aW1lKCkpOw0KDQoJCSRrc29yZ3UJCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHV5ZWxlciBXSEVSRSB1c2VybmFtZT0/Iik7DQoJCSRrc29yZ3UJCS0+CWV4ZWN1dGUoYXJyYXkoJHVzZXJuYW1lKSk7DQoJCSRtc29yZ3UJCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHV5ZWxlciBXSEVSRSBtYWlsPT8iKTsNCgkJJG1zb3JndQkJLT4JZXhlY3V0ZShhcnJheSgkbWFpbCkpOw0KCQkkdHNvcmd1CQk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSB1eWVsZXIgV0hFUkUgdGVsZWZvbj0/Iik7DQoJCSR0c29yZ3UJCS0+CWV4ZWN1dGUoYXJyYXkoJHBob25lKSk7DQoNCgkJJGdvb2dsZXNlY3JldAk9ICI2TGV0dzFNVUFBQUFBSmVocWF1c1NORmtkY0dVanN4UXJMV3RkdnFNIjsNCg0KCQkkcm9ib3Rrb250cm9sIAk9IGZpbGVfZ2V0X2NvbnRlbnRzKCJodHRwczovL3d3dy5nb29nbGUuY29tL3JlY2FwdGNoYS9hcGkvc2l0ZXZlcmlmeT9zZWNyZXQ9JGdvb2dsZXNlY3JldCZyZXNwb25zZT0iIC4gJGNhcHRjaGEgLiAiJnJlbW90ZWlwPSIgLiAkX1NFUlZFUlsnUkVNT1RFX0FERFInXSk7DQoJCSRyb2JvdGtvbnRyb2wgCT0JanNvbl9kZWNvZGUoJHJvYm90a29udHJvbCk7DQoNCgkJaWYgKGVtcHR5KCRhZCkgfHwgZW1wdHkoJG1haWwpIHx8IGVtcHR5KCR1c2VybmFtZSkgfHwgZW1wdHkoJHBhc3N3b3JkKSB8fCBlbXB0eSgkcGhvbmUpKSB7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJUw7xtIGFsYW5sYXLEsSBkb2xkdXJtYWzEsXPEsW7EsXoiLCJzIj0+ImluZm8iXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX1lbHNlaWYgKCEkY2FwdGNoYSkgew0KCQkgICAgJG91dHB1dAk9CVsidCI9PiJIYXRhIiwibSI9PiJSb2JvdCBvbG1hZMSxxJ/EsW7EsXrEsSBrYW7EsXRsYXnEsW4iLCJzIj0+ImVycm9yIl07DQoJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQl9ZWxzZWlmKCRrc29yZ3UtPnJvd0NvdW50KCkpew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iQnUga3VsbGFuxLFjxLEgYWTEsSBkYWhhIMO2bmNlIGt1bGxhbsSxbG3EscWfLiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2VpZighZmlsdGVyX3ZhcigkbWFpbCxGSUxURVJfVkFMSURBVEVfRU1BSUwpKSB7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJHaXJkacSfaW5peiBtYWlsIGZvcm1hdMSxIGhhdGFsxLEuIiwicyI9PiJpbmZvIl07DQoJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQl9ZWxzZWlmKCRtc29yZ3UtPnJvd0NvdW50KCkpew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iQnUgbWFpbCBhZHJlc2kgZGFoYSDDtm5jZSBrdWxsYW7EsWxtxLHFny4iLCJzIj0+ImluZm8iXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX1lbHNlaWYgKHN0cmxlbigkcGFzc3dvcmQpPDYpIHsNCgkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IlBhcm9sYW7EsXogZW4gYXogNiBrYXJha3RlcmRlbiBvbHXFn21hbMSxLiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2VpZigkdHNvcmd1LT5yb3dDb3VudCgpKXsNCgkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IkJ1IHRlbGVmb24gbnVtYXJhc8SxIGRhaGEgw7ZuY2Uga3VsbGFuxLFsbcSxxZ8uIiwicyI9PiJpbmZvIl07DQoJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQl9ZWxzZWlmKCAkcm9ib3Rrb250cm9sLT5zdWNjZXNzID09ICdmYWxzZScgICl7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEiLCJtIj0+IkzDvHRmZW4gcm9ib3Qgb2xtYWTEscSfxLFuxLF6xLEgb25heWxhecSxbi4iLCJzIj0+ImVycm9yIl07DQoJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQl9ZWxzZXsNCgkJCSRrb2QJPSByYW5kKDAsOSkucmFuZCgwLDkpLnJhbmQoMCw5KS5yYW5kKDAsOSkucmFuZCgwLDkpLnJhbmQoMCw5KTsNCgkJCSRwYXNzd29yZAk9CW1kNSgkX1BPU1RbInBhc3N3b3JkIl0pOw0KCQkJJGluc2VydAk9CSR2dC0+cHJlcGFyZSgiSU5TRVJUIElOVE8gdXllbGVyIFNFVCBhZHNveWFkPT8sIG1haWw9PywgdXNlcm5hbWU9PywgcGFzc3dvcmQ9PywgdGVsZWZvbj0/LCB1eWVsaWt0YXJpaGk9PywgYXBpa2V5PT8sIGJha2l5ZT0/LCBvbmF5PT8sIHlldGtpPT8sIGF2YXRhcj0/Iik7DQoJCQkkaW5zZXJ0LT4gZXhlY3V0ZShhcnJheSgkYWQsJG1haWwsJHVzZXJuYW1lLCRwYXNzd29yZCwkcGhvbmUsJHRhcmloLCRrZXksMCwwLCdNw7zFn3RlcmknLCdkZWZhdWx0X2F2YXRhcl9qcGcnKSk7DQoJCQkJaWYgKCRpbnNlcnQpIHsNCgkJCQkJaWYgKCRzaXRlYXlhci0+c21zX29uYXkpIHsNCgkJCQkJCSRrb2Rla2xlCT0JJHZ0LT5wcmVwYXJlKCJJTlNFUlQgSU5UTyBvbmF5X2tvZGxhcmkgU0VUIG9uYXlfc2FoaWJpPT8sIG9uYXlfa29kdT0/LCBvbmF5X3RhcmloaT0/Iik7DQoJCQkJCQkka29kZWtsZS0+IGV4ZWN1dGUoYXJyYXkoJHVzZXJuYW1lLCRrb2QsJHRhcmloKSk7DQoJCQkJCQl5ZW5pdXllU01TKCRwaG9uZSwka29kKTsNCgkJCQkJfQ0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+Ik3DvGtlbW1lbCEiLCJtIj0+IkthecSxdCBpxZ9sZW1pbml6IGJhxZ9hcsSxeWxhIHNvbnXDp2xhbmTEsSwgecO2bmxlbmRpcmlsaXlvcnN1bnV6LiIsInMiPT4ic3VjY2VzcyIsInIiPT4kcm91dGVyLT5nZW5lcmF0ZSgnbG9naW4udmlldycpXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9ZWxzZXsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhIiwibSI9PiJQYXJvbGFuxLF6IGVuIGF6IDYga2FyYWt0ZXJkZW4gb2x1xZ9tYWzEsS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfQ0KCQl9DQoJCWV4aXQoKTsNCgkJfSwncmVnaXN0ZXIucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnUE9TVCcsICcvYmFraXllLWVrbGUtYmFua2EnLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KDQoJCQkkb2RlbWVCYW5rYQkJPQkkX1BPU1RbIm9kZW1lQmFua2EiXTsNCgkJCSRvZGVtZVR1dGFyCQk9CSRfUE9TVFsib2RlbWVUdXRhciJdOw0KCQkJJHRhcmloCQkJCT0JZGF0ZSgiWS1tLWQgSDppOnMiKTsNCg0KCQkJaWYgKCBlbXB0eSgkb2RlbWVCYW5rYSkgfHwgJG9kZW1lQmFua2E9PSJ5b2siIHx8IGVtcHR5KCRvZGVtZVR1dGFyKSApIHsNCgkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJUw7xtIGFsYW5sYXLEsSBkb2xkdXJtYWzEsXPEsW7EsXouIiwicyI9PiJpbmZvIl07DQoJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCX1lbHNlew0KCQkJCSRla2xlCQk9CQkkdnQtPnByZXBhcmUoIklOU0VSVCBJTlRPIGJhbmthX29kZW1lbGVyIFNFVCBvZGVtZV9zYWhpYmk9Pywgb2RlbWVfYmFua2E9Pywgb2RlbWVfdHV0YXI9Pywgb2RlbWVfdGFyaWg9Pywgb2RlbWVfZHVydW09Pywgb2RlbmRpbWk9PyAiKTsNCgkJCQkkZWtsZQkJLT4JZXhlY3V0ZShhcnJheSgkdXllLT51c2VybmFtZSwkb2RlbWVCYW5rYSwkb2RlbWVUdXRhciwkdGFyaWgsJ0Jla2xlbWVkZScsMCkpOw0KCQkJCQlpZiAoJGVrbGUpIHsNCgkJCQkJCSRvdXRwdXQJPQlbInQiPT4iTcO8a2VtbWVsISIsIm0iPT4iw5ZkZW1lIHRhbGViaW5peiBhbMSxbmTEsS4iLCJzIj0+InN1Y2Nlc3MiXTsNCgkJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJCX1lbHNlew0KCQkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhIiwibSI9PiLDlmRlbWUgdGFsZWJpIHPEsXJhc8SxbmRhIGhhdGEgb2x1xZ90dS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCQl9DQoJCQl9DQoJCQlleGl0KCk7DQoJfSwnYWRkX2JhbmthLnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnL3BheXdhbnQtb2RlbWUnLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KDQoJCQkkYmFraXllWW9udGVtCT0JJF9QT1NUWyJiYWtpeWVZb250ZW0iXTsNCgkJCSRiYWtpeWVUdXRhcgk9CSRfUE9TVFsiYmFraXllVHV0YXIiXTsNCg0KDQoJCQlpZiAoICRiYWtpeWVZb250ZW0gPT0gMSApIHsNCgkJCQkkeW9udGVtTmFzaWwgPSAiTW9iaWwgw5ZkZW1lIjsNCgkJCX1lbHNlaWYgKCAkYmFraXllWW9udGVtID09IDIgKSB7DQoJCQkJJHlvbnRlbU5hc2lsID0gIktyZWRpIEthcnTEsSI7DQoJCQl9ZWxzZWlmICggJGJha2l5ZVlvbnRlbSA9PSAzICkgew0KCQkJCSR5b250ZW1OYXNpbCA9ICJIYXZhbGUvRWZ0L0F0bSI7DQoJCQl9DQoNCgkJCQlpZiAoIGVtcHR5KCRiYWtpeWVUdXRhcikgfHwgZW1wdHkoJGJha2l5ZVlvbnRlbSkgKSB7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IlTDvG0gYWxhbmxhcsSxIGRvbGR1cm1hbMSxc8SxbsSxei4iLCJzIj0+ImluZm8iXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9ZWxzZWlmKCAkYmFraXllVHV0YXIgPCAxMCApew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiIxMCBUTCBhbHTEsW5kYWtpIMO2ZGVtZSBpxZ9sZW1pIHlhcMSxbGFtYXouIiwicyI9PiJpbmZvIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfWVsc2V7DQoNCg0KDQoJCQkJCSMjIFBBWVlXQU5UIMOWREVNRSBCQcWeTEEgIyMNCgkJCQkJJGFwaUtleSAJCQk9ICRzaXRlYXlhci0+cGF5d2FudF9hcGk7IC8vIFBBWVdBTlQgQVBJDQoJCQkJCSRhcGlTZWNyZXQgCQk9ICRzaXRlYXlhci0+cGF5d2FudF9zZWNyZXQ7IC8vIEFQSSBHSVpMSSBBTkFIVEFSDQoJCQkJCSR1c2VySUQgCQkJPSAkdXllLT5pZDsgLy8gQkFLSVlFIEVLTEVORUNFSyBLVUxMQU5JQ0kgSUQNCgkJCQkJJHVzZXJFbWFpbCAJCT0gJHV5ZS0+bWFpbDsgLy8gQkFLSVlFIEVLTEVORUNFSyBLVUxMQU5JQ0kgRU1BxLBMDQoJCQkJCSR1c2VySVBBZHJlc2kgPSBHZXRJUCgpOw0KCQkJCQkkZXh0cmFEYXRhCQk9IHJhbmQoMTAwMDAsOTk5OTk5OTkpOw0KCQkJCQkkaGFzaE9sdXN0dXIgPSBiYXNlNjRfZW5jb2RlKGhhc2hfaG1hYygnc2hhMjU2JywiJHVzZXJFbWFpbHwkdXNlckVtYWlsfCR1c2VySUQiLiRhcGlLZXksJGFwaVNlY3JldCx0cnVlKSk7DQoJCQkJCSRwb3N0RGF0YSA9IGFycmF5KA0KCQkJCQknYXBpS2V5JyA9PiAkYXBpS2V5LA0KCQkJCQknaGFzaCcgPT4gJGhhc2hPbHVzdHVyLA0KCQkJCQkncmV0dXJuRGF0YSc9PiAkdXNlckVtYWlsLA0KCQkJCQkndXNlckVtYWlsJyA9PiAkdXNlckVtYWlsLA0KCQkJCQkndXNlcklQQWRkcmVzcycgPT4gJHVzZXJJUEFkcmVzaSwNCgkJCQkJJ3VzZXJJRCcgPT4gJHVzZXJJRCwNCgkJCQkJJ3Byb0FwaScgPT4gVFJVRSwNCgkJCQkJICdwcm9kdWN0RGF0YScgPT4gWw0KCQkJCQkJCSAibmFtZSIgPT4gICRiYWtpeWVUdXRhci4iIFRMIFR1dGFyxLFuZGEgQmFraXllICgiLiRleHRyYURhdGEuIikiLA0KCQkJCQkJCSAiYW1vdW50IiA9PiAkYmFraXllVHV0YXIqIDExMSwNCgkJCQkJCQkgImV4dHJhRGF0YSIgPT4gJGV4dHJhRGF0YSwNCgkJCQkJCQkgInBheW1lbnRDaGFubmVsIiA9PiAkYmFraXllWW9udGVtLCAvLyAxIE1vYmlsIMOWZGVtZSwgMiBLcmVkaSBLYXJ0xLEsMyBCYW5rYSBIYXZhbGUvRWZ0L0F0bSw0IFTDvHJrIFRlbGVrb20gw5ZkZW1lIChUVE5FVCksNSBNaWtyb2NhcmQsNiBDYXNoVQ0KCQkJCQkJCSAiY29tbWlzc2lvblR5cGUiID0+IDIgLy8gMSBzZcOnaWxpcnNlIGtvbWlzeW9udSBiaXpkZW4gYWwsIDIgb2x1cnNhIGtvbWlzeW9udSBtw7zFn3Rlcmkgw7ZkZXNpbg0KCQkJCQkgXQ0KCQkJCQkpOw0KCQkJCQkkY3VybCA9IGN1cmxfaW5pdCgpOw0KCQkJCQkJY3VybF9zZXRvcHRfYXJyYXkoJGN1cmwsIGFycmF5KA0KCQkJCQkJCUNVUkxPUFRfVVJMID0+ICJodHRwOi8vYXBpLnBheXdhbnQuY29tL2dhdGV3YXkucGhwIiwNCgkJCQkJCQlDVVJMT1BUX1JFVFVSTlRSQU5TRkVSID0+IHRydWUsDQoJCQkJCQkJQ1VSTE9QVF9FTkNPRElORyA9PiAiIiwNCgkJCQkJCQlDVVJMT1BUX01BWFJFRElSUyA9PiAxMCwNCgkJCQkJCQlDVVJMT1BUX1RJTUVPVVQgPT4gMzAsDQoJCQkJCQkJQ1VSTE9QVF9IVFRQX1ZFUlNJT04gPT4gQ1VSTF9IVFRQX1ZFUlNJT05fMV8xLA0KCQkJCQkJCUNVUkxPUFRfQ1VTVE9NUkVRVUVTVCA9PiAiUE9TVCIsDQoJCQkJCQkJQ1VSTE9QVF9QT1NURklFTERTID0+IGh0dHBfYnVpbGRfcXVlcnkoJHBvc3REYXRhKSwNCgkJCQkJCSkpOw0KCQkJCQkkcmVzcG9uc2UgPSBjdXJsX2V4ZWMoJGN1cmwpOyAkZXJyID0gY3VybF9lcnJvcigkY3VybCk7DQoJCQkJCWlmICgkZXJyKXsNCgkJCQkJCS8vIGVjaG8gImNVUkwgRXJyb3IgIzoiIC4gJGVycjsgLy8gY1VSTCBoYXRhc8SxbsSxIGVrcmFuYSBiYXN0xLFyDQoJCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEiLCJtIj0+IkJla2xlbm1lZGlrIGJpciBoYXRhIG9sdcWfdHUsIGzDvHRmZW4gZGFoYSBzb25yYSB0ZWtyYXIgZGVuZXlpbi4iLCJzIj0+ImVycm9yIl07DQoJCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCQl9ZWxzZXsNCgkJCQkJCSRqc29uRGVjb2RlID0ganNvbl9kZWNvZGUoJHJlc3BvbnNlLGZhbHNlKTsNCgkJCQkJCQlpZigkanNvbkRlY29kZS0+U3RhdHVzID09IDEwMCl7DQoJCQkJCQkJCSR0YXJpaAk9CWRhdGUoIlktbS1kIEg6aTpzIik7DQoJCQkJCQkJCSRla2xlCT0JJHZ0LT5wcmVwYXJlKCJJTlNFUlQgSU5UTyBwYXl3YW50X29kZW1lbGVyIFNFVCBvZGVtZV9la3N0cmE9Pywgb2RlbWVfc2FoaWJpPT8sIG9kZW1lX2thbmFsaT0/LCBvZGVtZV90dXRhcmk9Pywgb2RlbWVfbmV0PT8sIG9kZW1lX2R1cnVtPT8sIG9kZW1lX3RhcmloPT8iKTsNCgkJCQkJCQkJJGVrbGUtPiBleGVjdXRlKGFycmF5KCRleHRyYURhdGEsJHV5ZS0+dXNlcm5hbWUsJHlvbnRlbU5hc2lsLCRiYWtpeWVUdXRhciwnQ2V2YXAgYmVrbGVuaXlvcicsJ0Jla2xlbWVkZScsJHRhcmloKSk7DQoJCQkJCQkJCSRvdXRwdXQJPQlbInQiPT4iTcO8a2VtbWVsISIsIm0iPT4iw5ZkZW1lIGnFn2xlbWluaXogacOnaW4gw7ZkZW1lIHNheWZhc8SxbmEgecO2bmxlbmRpcmlsaXlvcnN1bnV6LCBsw7x0ZmVuIGJla2xleWluLiIsInMiPT4ic3VjY2VzcyIsInIiPT4gJGpzb25EZWNvZGUtPk1lc3NhZ2VdOw0KCQkJCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCQkJCX1lbHNlew0KCQkJCQkJCQkvLyBlY2hvICRyZXNwb25zZTsgLy8gRMO2bmVuIGhhdGFuxLFuIG5lIG9sZHXEn3VudSBiYXN0xLFyDQoJCQkJCQkJCSRvdXRwdXQJPQlbInQiPT4iSGF0YSIsIm0iPT4iQmVrbGVubWVkaWsgYmlyIGhhdGEgb2x1xZ90dSwgbMO8dGZlbiBkYWhhIHNvbnJhIHRla3JhciBkZW5leWluLiIsInMiPT4iZXJyb3IiXTsNCgkJCQkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQkJCQl9DQoJCQkJCX0NCgkJCQkJY3VybF9jbG9zZSgkY3VybCk7DQoJCQkJCSMjIFBBWVdBTlQgw5ZERU1FIELEsFTEsFIgIyMNCgkJCQl9DQoJCQkJZXhpdCgpOw0KCX0sJ2FkZF9wYXl3YW50LnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1R8R0VUJywgJy9wYXl3YW50LW9kZW1lLWthYnVsJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCg0KCQkJCQkjIyBQQVlXQU5UIMOWREVNRSBLQUJVTCBCQcWeTEEgIyMNCgkJCQkJJGFwaUtleSAJCQk9ICRzaXRlYXlhci0+cGF5d2FudF9hcGk7IC8vIFBBWVdBTlQgQVBJDQoJCQkJCSRhcGlTZWNyZXQgCQk9ICRzaXRlYXlhci0+cGF5d2FudF9zZWNyZXQ7IC8vIEFQSSBHSVpMSSBBTkFIVEFSDQoJCQkJCWlmICgkX1BPU1Qpew0KCQkJCQkJJFNpcGFyaXNJRCAJCT0gJF9QT1NUWyJTaXBhcmlzSUQiXTsNCgkJCQkJCSRFeHRyYURhdGEgCQk9ICRfUE9TVFsiRXh0cmFEYXRhIl07DQoJCQkJCQkkVXNlcklEIAkJCT0gJF9QT1NUWyJVc2VySUQiXTsNCgkJCQkJCSRSZXR1cm5EYXRhIAk9ICRfUE9TVFsiUmV0dXJuRGF0YSJdOw0KCQkJCQkJJFN0YXR1cyAJCQk9ICRfUE9TVFsiU3RhdHVzIl07DQoJCQkJCQkkT2RlbWVLYW5hbGkgCT0gJF9QT1NUWyJPZGVtZUthbmFsaSJdOw0KCQkJCQkJJE9kZW1lVHV0YXJpIAk9ICRfUE9TVFsiT2RlbWVUdXRhcmkiXTsNCgkJCQkJCSROZXRLYXphbmMgCQk9ICRfUE9TVFsiTmV0S2F6YW5jIl07DQoJCQkJCQkkSGFzaCAJCQkJPSAkX1BPU1RbIkhhc2giXTsNCgkJCQkJCWlmICgkU2lwYXJpc0lEICE9ICIiIHx8ICRFeHRyYURhdGEgIT0gIiIgfHwgJFVzZXJJRCAhPSAiIiB8fCAkUmV0dXJuRGF0YSAhPSAiIiB8fCAkU3RhdHVzICE9ICIiIHx8ICRPZGVtZUthbmFsaSAhPSAiIiB8fCAkT2RlbWVUdXRhcmkgIT0iIiB8fCAkTmV0S2F6YW5jICE9ICIiIHx8ICRIYXNoICE9ICIiKXsNCgkJCQkJCQkJJGhhc2hLb250cm9sID0gYmFzZTY0X2VuY29kZShoYXNoX2htYWMoJ3NoYTI1NicsIiRTaXBhcmlzSUR8JEV4dHJhRGF0YXwkVXNlcklEfCRSZXR1cm5EYXRhfCRTdGF0dXN8JE9kZW1lS2FuYWxpfCRPZGVtZVR1dGFyaXwkTmV0S2F6YW5jIiAuICRhcGlLZXksICRhcGlTZWNyZXQsIHRydWUpKTsNCgkJCQkJCQkJaWYgKCRIYXNoID09ICRoYXNoS29udHJvbCl7DQoJCQkJCQkJCQlpZiAoJFN0YXR1cyA9PSAxMDApIHsNCgkJCQkJCQkJCQkkdXllc29yCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHV5ZWxlciBXSEVSRSBpZD0/Iik7DQoJCQkJCQkJCQkJJHV5ZXNvci0+IGV4ZWN1dGUoYXJyYXkoJFVzZXJJRCkpOw0KCQkJCQkJCQkJCSR1eWVjZWsJPQkkdXllc29yLT5mZXRjaChQRE86OkZFVENIX09CSik7DQoJCQkJCQkJCQkJCWlmICggJHV5ZXNvci0+cm93Q291bnQoKSApIHsNCgkJCQkJCQkJCQkJCSRvZGVtZXNvcgk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBwYXl3YW50X29kZW1lbGVyIFdIRVJFIG9kZW1lX2Vrc3RyYT0/ICYmIG9kZW5kaW1pPT8iKTsNCgkJCQkJCQkJCQkJCSRvZGVtZXNvci0+IGV4ZWN1dGUoYXJyYXkoJEV4dHJhRGF0YSwwKSk7DQoJCQkJCQkJCQkJCQkJaWYgKCAkb2RlbWVzb3ItPnJvd0NvdW50KCkgKSB7DQoJCQkJCQkJCQkJCQkJCSRvZGVtZWNlayAgPSAkb2RlbWVzb3ItPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCgkJCQkJCQkJCQkJCQkJJGVrbGVuZWNlayA9ICRvZGVtZWNlay0+b2RlbWVfdHV0YXJpOw0KCQkJCQkJCQkJCQkJCQkkYmFraXllCT0JJHZ0LT5wcmVwYXJlKCJVUERBVEUgdXllbGVyIFNFVCBiYWtpeWU9PyBXSEVSRSBpZD0/Iik7DQoJCQkJCQkJCQkJCQkJCSRiYWtpeWUtPiBleGVjdXRlKGFycmF5KCR1eWVjZWstPmJha2l5ZSskZWtsZW5lY2VrLCRVc2VySUQpKTsNCgkJCQkJCQkJCQkJCQkJCWlmICgkYmFraXllKSB7DQoJCQkJCQkJCQkJCQkJCQkJJGR1emVsdAk9CSR2dC0+cHJlcGFyZSgiVVBEQVRFIHBheXdhbnRfb2RlbWVsZXIgU0VUIG9kZW5kaW1pPT8sIG9kZW1lX25ldD0/LCBvZGVtZV9kdXJ1bT0/IFdIRVJFIG9kZW1lX2Vrc3RyYT0/Iik7DQoJCQkJCQkJCQkJCQkJCQkJJGR1emVsdC0+IGV4ZWN1dGUoYXJyYXkoMSwkZWtsZW5lY2VrLCdPbmF5bGFuZMSxJywkRXh0cmFEYXRhKSk7DQoJCQkJCQkJCQkJCQkJCQkJJHRhcmloICA9IGRhdGUoIlkubS5kIEg6aTpzIik7DQoJCQkJCQkJCQkJCQkJCQkJJGthemFuYwkJPQkJJHZ0LT5wcmVwYXJlKCJJTlNFUlQgSU5UTyBiYWtpeWVfa2F6YW5jIFNFVCB0dXRhcj0/LCB0YXJpaD0/Iik7DQoJCQkJCQkJCQkJCQkJCQkJJGthemFuYwkJLT4JZXhlY3V0ZShhcnJheSgkZWtsZW5lY2VrLCR0YXJpaCkpOw0KCQkJCQkJCQkJCQkJCQkJCWVjaG8gIk9LIjsNCgkJCQkJCQkJCQkJCQkJCX1lbHNlew0KCQkJCQkJCQkJCQkJCQkJCWVjaG8gIk5PIC0gQkFLxLBZRSBFS0xFTkVNRUTEsCI7DQoJCQkJCQkJCQkJCQkJCQl9DQoJCQkJCQkJCQkJCQkJfWVsc2V7DQoJCQkJCQkJCQkJCQkJCWVjaG8gIk5PIC0gw5ZERU1FIERBSEEgw5ZOQ0UgWUFQSUxNScWeIjsNCgkJCQkJCQkJCQkJCQl9DQoJCQkJCQkJCQkJCX1lbHNlew0KCQkJCQkJCQkJCQkJZWNobyAiTk8gLSBCw5ZZTEUgS1VMTEFOSUNJIFlPSyI7DQoJCQkJCQkJCQkJCX0NCgkJCQkJCQkJCX1lbHNlew0KCQkJCQkJCQkJCSRkdXplbHQJPQkkdnQtPnByZXBhcmUoIlVQREFURSBwYXl3YW50X29kZW1lbGVyIFNFVCAgb2RlbWVfbmV0PT8sIG9kZW1lX2R1cnVtPT8gV0hFUkUgb2RlbWVfZWtzdHJhPT8iKTsNCgkJCQkJCQkJCQkkZHV6ZWx0LT4gZXhlY3V0ZShhcnJheSgkZWtsZW5lY2VrLCfEsHB0YWwnLCRFeHRyYURhdGEpKTsNCgkJCQkJCQkJCQllY2hvICdOTyAtIMOWREVNRSDEsFBUQUwgRUTEsExNxLDFnic7DQoJCQkJCQkJCQl9DQoJCQkJCQkJCX1lbHNlew0KCQkJCQkJCQkJZWNobyAnTk8gLSBIQVNIIEhBVEFMSSc7DQoJCQkJCQkJCX0NCgkJCQkJCX1lbHNlew0KCQkJCQkJCWVjaG8gJ05PIC0gUEFSQU1FVFJFIEVLU0lLJzsNCgkJCQkJCX0NCgkJCQkJfWVsc2V7DQoJCQkJCQllY2hvICdOTyAtIFBPU1QgWU9LJzsNCgkJCQkJfQ0KCQkJCQkjIyBQQVlXQU5UIMOWREVNRSBLQUJVTCBCxLBUxLBSICMjDQoJfSwnYWRkX3BheXdhbnRfYWNjZXB0LnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnL21vYmlsLW9uYXknLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KDQoJCQkkb25heV9rb2R1CT0JJF9QT1NUWyJvbmF5X2tvZHUiXTsNCg0KCQkJJHNvcgkJCQk9CQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gb25heV9rb2RsYXJpIFdIRVJFIG9uYXlfc2FoaWJpPT8gJiYgb25heV9rb2R1PT8iKTsNCgkJCSRzb3IJCQkJLT4JZXhlY3V0ZShhcnJheSgkdXllLT51c2VybmFtZSwkb25heV9rb2R1KSk7DQoJCQkJaWYgKCBlbXB0eSgkb25heV9rb2R1KSApIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iVMO8bSBhbGFubGFyxLEgZG9sZHVybWFsxLFzxLFuxLF6LiIsInMiPT4iaW5mbyJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX1lbHNlaWYoICRzb3ItPnJvd0NvdW50KCkgKXsNCgkJCQkJJHVwZGF0ZQk9CSR2dC0+cHJlcGFyZSgiVVBEQVRFIHV5ZWxlciBTRVQgb25heT0/IFdIRVJFIHVzZXJuYW1lPT8iKTsNCgkJCQkJJHVwZGF0ZS0+IGV4ZWN1dGUoYXJyYXkoMSwkdXllLT51c2VybmFtZSkpOw0KCQkJCQkkc2lsCQk9CSR2dC0+cHJlcGFyZSgiREVMRVRFIEZST00gb25heV9rb2RsYXJpIFdIRVJFIG9uYXlfc2FoaWJpPT8iKTsNCgkJCQkJJHNpbAktPglleGVjdXRlKGFycmF5KCR1eWUtPnVzZXJuYW1lKSk7DQoJCQkJCQlpZiAoICR1cGRhdGUgKSB7DQoJCQkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiJIZXNhYsSxbsSxeiBvbmF5bGFuZMSxLCBhcnTEsWsgc2lwYXJpxZ8gdmVybWV5ZSBoYXrEsXJzxLFuxLF6LiIsInMiPT4ic3VjY2VzcyIsInIiPT4kcm91dGVyLT5nZW5lcmF0ZSgnbWFpbi52aWV3JyldOw0KCQkJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJCQl9ZWxzZXsNCgkJCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEiLCJtIj0+Ikhlc2FixLFuxLF6IG9uYXlsYW5hbWFkxLEuIiwicyI9PiJlcnJvciJdOw0KCQkJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJCQl9DQoJCQkJfWVsc2V7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iSGF0YSIsIm0iPT4iT25heSBrb2R1bnUgeWFubMSxxZ8gZ2lyZGluaXouIiwicyI9PiJlcnJvciJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX0NCgkJCQlleGl0KCk7DQoJfSwnbW9iaWxlLnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnL2dpcmlzLXlhcCcsIGZ1bmN0aW9uKCl7DQoJCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyOw0KDQoJCSRtYWlsCQkJPQkkX1BPU1RbIm1haWwiXTsNCgkJJHBhc3N3b3JkCT0JbWQ1KCRfUE9TVFsicGFzc3dvcmQiXSk7DQoJCSRyZW1lbWJlciAJPQlAJF9QT1NUWyJyZW1lbWJlciJdOw0KDQoJCSRrc29yZ3UJCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHV5ZWxlciBXSEVSRSBtYWlsPT8gJiYgcGFzc3dvcmQ9PyIpOw0KCQkka3Nvcmd1CQktPglleGVjdXRlKGFycmF5KCRtYWlsLCRwYXNzd29yZCkpOw0KCQkka2JpbGdpCQk9CSRrc29yZ3UJCS0+ZmV0Y2goUERPOjpGRVRDSF9PQkopOw0KDQoJCWlmICggZW1wdHkoJG1haWwpIHx8IGVtcHR5KCRfUE9TVFsicGFzc3dvcmQiXSkgKSB7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJUw7xtIGFsYW5sYXLEsSBkb2xkdXJtYWzEsXPEsW7EsXoiLCJzIj0+ImluZm8iXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX1lbHNlaWYoISRrc29yZ3UtPnJvd0NvdW50KCkpew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iS3VsbGFuxLFjxLEgYWTEsW7EsXogeWEgZGEgcGFyb2xhbsSxeiBoYXRhbMSxLiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2V7DQoJCQkkX1NFU1NJT05bImxvZ2luIl0JCQk9CXRydWU7DQoJCQkkX1NFU1NJT05bInVzZXJuYW1lIl0JCT0JJGtiaWxnaS0+dXNlcm5hbWU7DQoNCgkJCWlmKCBAJHJlbWVtYmVyID09IHRydWUgKSB7IHNldGNvb2tpZSgndXNlcm5hbWUnLCRrYmlsZ2ktPnVzZXJuYW1lLHRpbWUoKSs2MCo2MCoyNCo3KTsgfQ0KDQoNCgkJCSRvdXRwdXQJPQlbInQiPT4iTcO8a2VtbWVsISIsIm0iPT4iS3VsbGFuxLFjxLEgZ2lyacWfaSB5YXDEsWxkxLEsIHnDtm5sZW5kaXJpbGl5b3JzdW51ei4iLCJzIj0+InN1Y2Nlc3MiLCJyIj0+JHJvdXRlci0+Z2VuZXJhdGUoJ21haW4udmlldycpXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX0NCgkJZXhpdCgpOw0KCX0sJ2xvZ2luLnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnL2FkbWluL2dpcmlzLXlhcCcsIGZ1bmN0aW9uKCl7DQoJCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyOw0KDQoJCSRtYWlsCQkJPQkkX1BPU1RbIm1haWwiXTsNCgkJJHBhc3N3b3JkCT0JbWQ1KCRfUE9TVFsicGFzc3dvcmQiXSk7DQoNCgkJJGtzb3JndQkJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gdXllbGVyIFdIRVJFIG1haWw9PyAmJiBwYXNzd29yZD0/ICYmIHlldGtpPT8iKTsNCgkJJGtzb3JndQkJLT4JZXhlY3V0ZShhcnJheSgkbWFpbCwkcGFzc3dvcmQsJ0FkbWluJykpOw0KCQkka2JpbGdpCQk9CSRrc29yZ3UJCS0+ZmV0Y2goUERPOjpGRVRDSF9PQkopOw0KDQoJCWlmICggZW1wdHkoJG1haWwpIHx8IGVtcHR5KCRfUE9TVFsicGFzc3dvcmQiXSkgKSB7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJUw7xtIGFsYW5sYXLEsSBkb2xkdXJtYWzEsXPEsW7EsXoiLCJzIj0+ImluZm8iXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX1lbHNlaWYoISRrc29yZ3UtPnJvd0NvdW50KCkpew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iS3VsbGFuxLFjxLEgYWTEsW7EsXogeWEgZGEgcGFyb2xhbsSxeiBoYXRhbMSxLiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2V7DQoJCQkkX1NFU1NJT05bImFkbWlubG9naW4iXQk9CXRydWU7DQoJCQkkX1NFU1NJT05bImFkbWluIl0JCQk9CXRydWU7DQoJCQkkX1NFU1NJT05bInVzZXJuYW1lIl0JCT0JJGtiaWxnaS0+dXNlcm5hbWU7DQoNCgkJCSRvdXRwdXQJPQlbInQiPT4iTcO8a2VtbWVsISIsIm0iPT4iQWRtaW4gZ2lyacWfaSB5YXDEsWxkxLEsIHnDtm5sZW5kaXJpbGl5b3JzdW51ei4iLCJzIj0+InN1Y2Nlc3MiLCJyIj0+JHJvdXRlci0+Z2VuZXJhdGUoJ2FkbWluX21haW4udmlldycpXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX0NCgkJZXhpdCgpOw0KCX0sJ2FkbWlubG9naW4ucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnUE9TVCcsICcvcHJvZmlsJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJCSRwYXNzd29yZAk9CW1kNSgkX1BPU1RbInBhc3N3b3JkIl0pOw0KCQkJJHlwYXNzCQk9CW1kNSgkX1BPU1RbIm5wYXNzd29yZCJdKTsNCgkJCSR5eXBhc3MJCT0JJF9QT1NUWyJubnBhc3N3b3JkIl07DQoNCg0KCQkJaWYgKCBlbXB0eSgkX1BPU1RbInBhc3N3b3JkIl0pIHx8IGVtcHR5KCRfUE9TVFsibnBhc3N3b3JkIl0pIHx8IGVtcHR5KCRfUE9TVFsibm5wYXNzd29yZCJdKSApIHsNCgkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJUw7xtIGFsYW5sYXLEsSBkb2xkdXJtYWzEsXPEsW7EsXouIiwicyI9PiJpbmZvIl07DQoJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCX1lbHNlaWYoJHV5ZS0+cGFzc3dvcmQhPSRwYXNzd29yZCl7DQoJCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iR2XDp2VybGkgcGFyb2xhbsSxesSxIHlhbmzEscWfIGdpcmRpbml6LiIsInMiPT4iaW5mbyJdOw0KCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQl9ZWxzZWlmKCBzdHJsZW4oJF9QT1NUWyJucGFzc3dvcmQiXSk8NiApew0KCQkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IlBhcm9sYW7EsXogZW4gYXogNiBrYXJha3RlcmRlbiBvbHXFn21hbMSxLiIsInMiPT4iaW5mbyJdOw0KCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQl9ZWxzZWlmKCAkX1BPU1RbIm5wYXNzd29yZCJdICE9ICRfUE9TVFsibm5wYXNzd29yZCJdICApew0KCQkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IkdpcmlsZW4geWVuaSDFn2lmcmVsZXIgYmlyYmlyaW5pbiBheW7EsXPEsSBvbG1hbMSxLiIsInMiPT4iaW5mbyJdOw0KCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQl9ZWxzZXsNCgkJCQkkdXBkYXRlCQk9CQkkdnQtPnByZXBhcmUoIlVQREFURSB1eWVsZXIgU0VUIHBhc3N3b3JkPT8gV0hFUkUgdXNlcm5hbWU9PyAiKTsNCgkJCQkkdXBkYXRlCQktPglleGVjdXRlKGFycmF5KCR5cGFzcywkdXllLT51c2VybmFtZSkpOw0KCQkJCQlpZiAoJHVwZGF0ZSkgew0KCQkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiJQYXJvbGFuxLF6xLEgYmHFn2FyxLEgaWxlIGfDvG5jZWxsZWRpbml6LiIsInMiPT4ic3VjY2VzcyJdOw0KCQkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQkJfWVsc2V7DQoJCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEiLCJtIj0+IlBhcm9sYW7EsXrEsSBnw7xuY2VsbGVya2VuIGJpciBoYXRhIGlsZSBrYXLFn8SxbGHFn3TEsWsuIiwicyI9PiJlcnJvciJdOw0KCQkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQkJfQ0KCQkJfQ0KCQkJZXhpdCgpOw0KCX0sJ215X3NldHRpbmcucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnUE9TVCcsICcveWVuaS1zaXBhcmlzJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwkc21tYXBpOw0KDQoNCgkJCSRrYXRlZ29yaQkJCT0JJF9QT1NUWyJzZXJ2aXNLYXQiXTsNCgkJCSRtaWt0YXIJCQkJPQkkX1BPU1RbInNlcnZpc01pa3RhciJdOw0KCQkJJGJha2l5ZQkJCQk9CSR1eWUtPmJha2l5ZTsNCgkJCSR1cnVuCQkJCQk9CSRfUE9TVFsic2VydmlzVXJ1biJdOw0KCQkJJGxpbmsJCQkJCT0JJF9QT1NUWyJzZXJ2aXNMaW5rIl07DQoJCQkkdXNlcgkJCQkJPQkkdXllLT51c2VybmFtZTsNCgkJCSRnb25kZXJpU2F5aQk9CUAkX1BPU1RbImdvbmRlcmlTYXlpIl07DQoJCQkkZ2VjaWttZQkJCT0JQCRfUE9TVFsiZ2VjaWttZSJdOw0KCQkJJG90b01pbgkJCQk9CUAkX1BPU1RbIm90b01pbiJdOw0KCQkJJG90b01hawkJCQk9CUAkX1BPU1RbIm90b01hayJdOw0KCQkJJHlvcnVtbGFyCQkJPQlAJF9QT1NUWyJ5b3J1bWxhciJdOw0KCQkJJHlvcnVtc2F5aQkJPQljb3VudChleHBsb2RlKCJcbiIsJHlvcnVtbGFyKSk7DQoNCgkJCSR1cnVuYmlsZ2k9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSB1cnVubGVyIFdIRVJFIGlkPT8iKTsNCgkJCSR1cnVuYmlsZ2ktPglleGVjdXRlKGFycmF5KCR1cnVuKSk7DQoJCQkkdXJ1bmJpbGdpPQkkdXJ1bmJpbGdpLT5mZXRjaChQRE86OkZFVENIX09CSik7IGlmKCR1cnVuYmlsZ2ktPnVydW5fc2VjZW5lZ2k9PSJQYWtldCIpeyRtaWt0YXI9IjEiO30NCgkJCWlmKCR1cnVuYmlsZ2ktPnVydW5fc2VjZW5lZ2k9PSdQYWtldCcpeyRtaWt0YXI9JHVydW5iaWxnaS0+dXJ1bl9taW47fQ0KCQkJJGFwaQkJCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIGFwaSBXSEVSRSBpZD0/Iik7DQoJCQkkYXBpCQktPglleGVjdXRlKGFycmF5KCR1cnVuYmlsZ2ktPnVydW5fYXBpKSk7DQoJCQkkYXBpCQkJPQkkYXBpLT5mZXRjaChQRE86OkZFVENIX09CSik7DQoNCg0KCQkJJG96ZWxmaXlhdD0JCSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBmaXlhdGxhbmRpcm1hIFdIRVJFIGZpeWF0X3NhaGliaT0/ICYmIGZpeWF0X3NlcnZpcz0/Iik7DQoJCQkkb3plbGZpeWF0LT4gZXhlY3V0ZShhcnJheSgkdXNlciwkdXJ1bikpOw0KCQkJJG96ZWxzYXkJPQkJJG96ZWxmaXlhdC0+cm93Q291bnQoKTsNCgkJCSRvemVsZml5YXQ9CQkkb3plbGZpeWF0LT5mZXRjaChQRE86OkZFVENIX09CSik7DQoNCgkJCWlmICgkb3plbHNheSkgew0KCQkJCWlmICggQCR1cnVuYmlsZ2ktPnVydW5fc2VjZW5lZ2kgPT0gJ1Bha2V0JyApIHsNCgkJCQkJJGZpeWF0ICAgCT0gJG96ZWxmaXlhdC0+Zml5YXRfZml5YXQ7DQoJCQkJCSRtaWt0YXIJCT0JQCR1cnVuYmlsZ2ktPnVydW5fbWluOw0KCQkJCQkkeWJha2l5ZSAgCT0gCSRiYWtpeWUtJGZpeWF0Ow0KCQkJCQkkdGFyaWgJCT0JZGF0ZSgiWS1tLWQgSDppOnMiKTsNCgkJCQkJJHNlcnZpcwkJPQkkdXJ1bmJpbGdpLT5pZDsNCgkJCQl9ZWxzZWlmICggQCR1cnVuYmlsZ2ktPnVydW5fc2VjZW5lZ2kgPT0gJ1NlcnZpcycgKSB7DQoJCQkJCSRmaXlhdCAgICAJPSAJJG1pa3RhciooJG96ZWxmaXlhdC0+Zml5YXRfZml5YXQvMTAwMCk7DQoJCQkJCSR5YmFraXllICAJPSAJJGJha2l5ZS0kZml5YXQ7DQoJCQkJCSR0YXJpaAkJPQlkYXRlKCJZLW0tZCBIOmk6cyIpOw0KCQkJCQkkc2VydmlzCQk9CSR1cnVuYmlsZ2ktPmlkOw0KCQkJCX1lbHNlaWYgKCBAJHVydW5iaWxnaS0+dXJ1bl9zZWNlbmVnaSA9PSAnWW9ydW0nICkgew0KCQkJCQkkZml5YXQgICAgCT0gJHlvcnVtc2F5aSooJG96ZWxmaXlhdC0+Zml5YXRfZml5YXQvMTAwMCk7DQoJCQkJCSR5YmFraXllICAJPSAJJGJha2l5ZS0kZml5YXQ7DQoJCQkJCSR0YXJpaAkJPQlkYXRlKCJZLW0tZCBIOmk6cyIpOw0KCQkJCQkkc2VydmlzCQk9CSR1cnVuYmlsZ2ktPmlkOw0KCQkJCX1lbHNlaWYgKCBAJHVydW5iaWxnaS0+dXJ1bl9zZWNlbmVnaSA9PSAnQWJvbmVsaWsnICkgew0KCQkJCQkkZml5YXQgICAgPSAkbWlrdGFyKiRvemVsZml5YXQtPmZpeWF0X2ZpeWF0Ow0KCQkJCQkkbWlrdGFyIAk9CTE7DQoJCQkJCSR5YmFraXllICAgCT0gCSRiYWtpeWUtJGZpeWF0Ow0KCQkJCQkkdGFyaWgJCT0JZGF0ZSgiWS1tLWQgSDppOnMiKTsNCgkJCQkJJHNlcnZpcwkJPQkkdXJ1bmJpbGdpLT5pZDsNCgkJCQl9DQoJCQl9ZWxzZXsNCgkJCQlpZiAoIEAkdXJ1bmJpbGdpLT51cnVuX3NlY2VuZWdpID09ICdQYWtldCcgKSB7DQoJCQkJCSRmaXlhdCAgCT0gCUAkdXJ1bmJpbGdpLT51cnVuX2ZpeWF0Ow0KCQkJCQkkbWlrdGFyCQk9CUAkdXJ1bmJpbGdpLT51cnVuX21pbjsNCgkJCQkJJHliYWtpeWUgID0gCSRiYWtpeWUtJGZpeWF0Ow0KCQkJCQkkdGFyaWgJCT0JZGF0ZSgiWS1tLWQgSDppOnMiKTsNCgkJCQkJJHNlcnZpcwkJPQkkdXJ1bmJpbGdpLT5pZDsNCgkJCQl9ZWxzZWlmICggQCR1cnVuYmlsZ2ktPnVydW5fc2VjZW5lZ2kgPT0gJ1NlcnZpcycgKSB7DQoJCQkJCSRmaXlhdCAgCT0gCUAkdXJ1bmJpbGdpLT51cnVuX2JpcmltKiRtaWt0YXI7DQoJCQkJCSR5YmFraXllICA9IAkkYmFraXllLSRmaXlhdDsNCgkJCQkJJHRhcmloCQk9CWRhdGUoIlktbS1kIEg6aTpzIik7DQoJCQkJCSRzZXJ2aXMJCT0JJHVydW5iaWxnaS0+aWQ7DQoJCQkJfWVsc2VpZiAoIEAkdXJ1bmJpbGdpLT51cnVuX3NlY2VuZWdpID09ICdZb3J1bScgKSB7DQoJCQkJCSRmaXlhdCAgCT0gCUAkdXJ1bmJpbGdpLT51cnVuX2JpcmltKiR5b3J1bXNheWk7DQoJCQkJCSR5YmFraXllICA9IAkkYmFraXllLSRmaXlhdDsNCgkJCQkJJHRhcmloCQk9CWRhdGUoIlktbS1kIEg6aTpzIik7DQoJCQkJCSRzZXJ2aXMJCT0JJHVydW5iaWxnaS0+aWQ7DQoJCQkJfWVsc2VpZiAoIEAkdXJ1bmJpbGdpLT51cnVuX3NlY2VuZWdpID09ICdBYm9uZWxpaycgKSB7DQoJCQkJCSRmaXlhdCAgCT0gCUAkdXJ1bmJpbGdpLT51cnVuX2JpcmltKiRtaWt0YXI7DQoJCQkJCSRtaWt0YXIgCT0JMTsNCgkJCQkJJHliYWtpeWUgICAJPSAJJGJha2l5ZS0kZml5YXQ7DQoJCQkJCSR0YXJpaAkJPQlkYXRlKCJZLW0tZCBIOmk6cyIpOw0KCQkJCQkkc2VydmlzCQk9CSR1cnVuYmlsZ2ktPmlkOw0KCQkJCX0NCgkJCX0NCg0KDQoNCgkJCWlmICggJHVydW49PScwJyB8fCAka2F0ZWdvcmk9PSdrYXRlZ29yaXNlYycgIHx8IGVtcHR5KCRsaW5rKSB8fCAoICR1cnVuYmlsZ2ktPnVydW5fc2VjZW5lZ2k9PSJTZXJ2aXMiICYmIGVtcHR5KCRtaWt0YXIpICkgfHwgKCAkdXJ1bmJpbGdpLT51cnVuX3NlY2VuZWdpPT0iWW9ydW0iICYmIGVtcHR5KCR5b3J1bWxhcikgKSApIHsNCgkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJUw7xtIGFsYW5sYXLEsSBkb2xkdXJtYWzEsXPEsW7EsXoiLCJzIj0+ImluZm8iXTsNCgkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJfWVsc2VpZiggJGJha2l5ZTwkZml5YXQgKXsNCgkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJCYWtpeWVuaXogeWV0ZXJzaXouIiwicyI9PiJpbmZvIl07DQoJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCX1lbHNlaWYoICR1cnVuYmlsZ2ktPnVydW5fc2VjZW5lZ2kJPT0JIkFib25lbGlrIiAmJiBlbXB0eSgkZ29uZGVyaVNheWkpICl7DQoJCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iR8O2bmRlcmkgc2F5xLFzxLFuxLEgZG9sZHVybWFsxLFzxLFuxLF6IiwicyI9PiJpbmZvIl07DQoJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCX1lbHNlaWYoICR1cnVuYmlsZ2ktPnVydW5fc2VjZW5lZ2k9PSdTZXJ2aXMnICYmICRtaWt0YXI8JHVydW5iaWxnaS0+dXJ1bl9taW4gICl7DQoJCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iU2lwYXJpxZ8gZWRpbGVuIG1pa3RhciwgbWluaW11bSBzaXBhcmnFnyBtaWt0YXLEsW5kYW4gZMO8xZ/DvGsuIiwicyI9PiJpbmZvIl07DQoJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCX1lbHNlaWYoICR1cnVuYmlsZ2ktPnVydW5fc2VjZW5lZ2k9PSdZb3J1bScgJiYgJHlvcnVtc2F5aTwkdXJ1bmJpbGdpLT51cnVuX21pbiAgKXsNCgkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJTaXBhcmnFnyBlZGlsZW4gbWlrdGFyLCBtaW5pbXVtIHNpcGFyacWfIG1pa3RhcsSxbmRhbiBkw7zFn8O8ay4iLCJzIj0+ImluZm8iXTsNCgkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJfWVsc2VpZiAoICR1cnVuYmlsZ2ktPnVydW5fc2VjZW5lZ2k9PSdZb3J1bScgJiYgJHlvcnVtc2F5aT4kdXJ1bmJpbGdpLT51cnVuX21heCAgKSB7DQoJCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iU2lwYXJpxZ8gZWRpbGVuIG1pa3RhciwgbWFrc2ltdW0gc2lwYXJpxZ8gbWlrdGFyxLFuZGFuIGZhemxhLiIsInMiPT4iaW5mbyJdOw0KCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQl9ZWxzZWlmKCAkdXJ1bmJpbGdpLT51cnVuX3NlY2VuZWdpPT0nQWJvbmVsaWsnICYmICRvdG9NaW48JHVydW5iaWxnaS0+dXJ1bl9taW4gKXsNCgkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJTaXBhcmnFnyBlZGlsZW4gbWlrdGFyLCBtaW5pbXVtIHNpcGFyacWfIG1pa3RhcsSxbmRhbiBkw7zFn8O8ay4iLCJzIj0+ImluZm8iXTsNCgkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJfWVsc2VpZiAoJG1pa3Rhcj4kdXJ1bmJpbGdpLT51cnVuX21heCkgew0KCQkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IlNpcGFyacWfIGVkaWxlbiBtaWt0YXIsIG1ha3NpbXVtIHNpcGFyacWfIG1pa3RhcsSxbmRhbiBmYXpsYS4iLCJzIj0+ImluZm8iXTsNCgkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJfWVsc2VpZiAoICR1cnVuYmlsZ2ktPnVydW5fc2VjZW5lZ2k9PSdBYm9uZWxpaycgJiYgJG90b01haz4kdXJ1bmJpbGdpLT51cnVuX21heCAgKSB7DQoJCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iU2lwYXJpxZ8gZWRpbGVuIG1pa3RhciwgbWFrc2ltdW0gc2lwYXJpxZ8gbWlrdGFyxLFuZGFuIGZhemxhLiIsInMiPT4iaW5mbyJdOw0KCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQl9ZWxzZXsNCg0KCQkJCWlmICgkdXJ1bmJpbGdpLT51cnVuX2FwaT09Ik1hbnVlbCIpIHsNCgkJCQkJJGFwaVNpcGFyaXMJCQk9CWFycmF5KCJvcmRlciI9PiJNYW51ZWwiKTsNCgkJCQkJJGFwaVNpcGFyaXMgCQk9IChvYmplY3QpICRhcGlTaXBhcmlzOw0KCQkJCQkkYXBpX29yZGVyX2lkCQk9CTE7DQoJCQkJfWVsc2VpZiggJGFwaS0+YXBpX3RlcmNpaCA9PSAiVGFraXBjaWFsLm5ldCIgKXsNCgkJCQkJJHBvc3QgPSBhcnJheSgNCgkJCQkJCSd0eXBlJwkJPT4gJ25ld29yZGVyJywNCgkJCQkJCSdzZXJ2aWNlJwk9PiAnZm9sbG93JywNCgkJCQkJCSd1c2VybmFtZScJPT4gJGxpbmssDQoJCQkJCQkncXVhbnRpdHknCT0+ICRtaWt0YXIsDQoJCQkJCSk7DQoJCQkJCSR0YWtpcGNpCQkJPQl0YWtpcGNpYWxuZXRBUEkoICRwb3N0LCAkYXBpLT5hcGlfYXBpLCAkYXBpLT5hcGlfdXJsICk7DQoJCQkJCSR0YWtpcGNpYWxuZXQJPQlqc29uX2RlY29kZSgkdGFraXBjaSk7DQoJCQkJCSRhcGlfb3JkZXJfaWQJPQlAJHRha2lwY2lhbG5ldC0+Y2FsbGJhY2stPm9yZGVyaWQ7DQoJCQkJfWVsc2VpZiggJGFwaS0+YXBpX3RlcmNpaCA9PSAnQmVnZW5pa2FzbWEuY29tJyApew0KCQkJCQkkYXBpU2lwYXJpcwkJCQk9CWJlZ2VuaWthc21hQVBJKCRhcGktPmFwaV9hcGksJGFwaS0+YXBpX3VybCwkbGluaywkbWlrdGFyKTsNCgkJCQkJJGFwaVNpcGFyaXMJCQkJPQlqc29uX2RlY29kZSgkYXBpU2lwYXJpcyk7DQoJCQkJCSRhcGlfb3JkZXJfaWQJCQk9CUAkYXBpU2lwYXJpcy0+b3JkZXJfaWQ7DQoJCQkJfWVsc2VpZiggJGFwaS0+YXBpX3RlcmNpaCA9PSAnam5zdGEubW9iaScgKXsNCgkJCQkJJGZhcGkgCQkJCQkJPSBuZXcgc29jaWFsc21lZGlhX2FwaSgkYXBpLT5hcGlfYXBpKTsNCgkJCQkJJGRhdGEgPSBhcnJheSgNCgkJCQkJCSdjbWQnICAgICA9PiAgJ29yZGVyYWRkJywnb3JkZXJzJyAgPT4gIGFycmF5KA0KCQkJCQkJIDAgPT4gIGFycmF5KCdzZXJ2aWNlJyA9PiAgJHVydW5iaWxnaS0+dXJ1bl9hcGlfc2VydmlzLCdhbW91bnQnID0+ICAkbWlrdGFyLCAnZGF0YScgPT4gJGxpbmssKSkNCgkJCQkJICk7DQoJCQkJCSAJJHJlc3VsdCAJCQkJCT0gJGZhcGktPnF1ZXJ5KCRkYXRhKTsNCgkJCQkJCSRhcGlfb3JkZXJfaWQJCQk9CUAkcmVzdWx0WzBdWzBdW2lkXTsNCgkJCQl9ZWxzZWlmKCAkYXBpLT5hcGlfdGVyY2loID09ICdTb3N5YWxwYXphcmltLmNvbScgKXsNCgkJCQkJJGFwaVNpcGFyaXMJCQkJPQlzb3N5YWxwYXphcmltQWwoJG1pa3RhciwkbGluaywkYXBpLT5hcGlfYXBpKTsNCgkJCQkJJGFwaVNpcGFyaXNTb3N5YWwJPQlqc29uX2RlY29kZSgkYXBpU2lwYXJpcyk7DQoJCQkJCSRhcGlfb3JkZXJfaWQJCQk9CTE7DQoJCQkJfWVsc2VpZiggJGFwaS0+YXBpX3RlcmNpaCA9PSAnWXRtYXRpa3ZpcC5jb20nICl7DQoJCQkJCSRhcGlTaXBhcmlzCQkJCT0JWVRNYXRpa2FsKCRhcGktPmFwaV9hcGksJGFwaS0+YXBpX3VybCwkdXJ1bmJpbGdpLT51cnVuX2FwaV9zZXJ2aXMsJGxpbmssJG1pa3Rhcik7DQoJCQkJCSRhcGlTaXBhcmlzU29zeWFsCT0JanNvbl9kZWNvZGUoJGFwaVNpcGFyaXMpOw0KCQkJCQkkYXBpX29yZGVyX2lkCQkJPQlAJGFwaVNpcGFyaXMtPm9yZGVyOw0KCQkJCX1lbHNlaWYoICRhcGktPmFwaV90ZXJjaWggPT0gJ0hpem1ldHBhbmVsaS5jb20nICl7DQoJCQkJCSRhcGlTaXBhcmlzCQkJCT0JaGl6bWV0cGFuZWxpU2F0aW4oJGFwaS0+YXBpX2FwaSwkdXJ1bmJpbGdpLT51cnVuX2FwaV9zZXJ2aXMsJG1pa3RhciwkbGluaywkYXBpLT5hcGlfdXJsKTsNCgkJCQkJJGFwaVNpcGFyaXNTb3N5YWwJPQlqc29uX2RlY29kZSgkYXBpU2lwYXJpcyk7DQoJCQkJCSRhcGlfb3JkZXJfaWQJCQk9CUAkYXBpU2lwYXJpcy0+b3JkZXI7DQoJCQkJfWVsc2V7DQoJCQkJCWlmICggJHVydW5iaWxnaS0+dXJ1bl9zZWNlbmVnaQk9PQkiQWJvbmVsaWsiICkgew0KCQkJCQkJJGFwaVNpcGFyaXMgCT0gJHNtbWFwaS0+eWVuaVNpcGFyaXMoYXJyYXkoJ2tleScgPT4kYXBpLT5hcGlfYXBpLCdhY3Rpb24nID0+J2FkZCcsJ3NlcnZpY2UnPT4kdXJ1bmJpbGdpLT51cnVuX2FwaV9zZXJ2aXMsJ3VzZXJuYW1lJz0+JGxpbmssJ21pbic9PiRvdG9NaW4sJ21heCc9PiRvdG9NYWssJ3Bvc3RzJz0+JGdvbmRlcmlTYXlpLCdkZWxheSc9PiRnZWNpa21lKSwkYXBpLT5hcGlfdXJsKTsNCgkJCQkJCSRhcGlfb3JkZXJfaWQJPQkkYXBpU2lwYXJpcy0+b3JkZXI7DQoJCQkJCX1lbHNlaWYoICR1cnVuYmlsZ2ktPnVydW5fc2VjZW5lZ2kJPT0JIllvcnVtIiApIHsNCgkJCQkJCSRhcGlTaXBhcmlzIAk9ICRzbW1hcGktPnllbmlTaXBhcmlzKGFycmF5KCdrZXknID0+JGFwaS0+YXBpX2FwaSwnYWN0aW9uJyA9PidhZGQnLCdzZXJ2aWNlJz0+JHVydW5iaWxnaS0+dXJ1bl9hcGlfc2VydmlzLCdsaW5rJz0+JGxpbmssJ2NvbW1lbnRzJz0+JHlvcnVtbGFyKSwkYXBpLT5hcGlfdXJsKTsNCgkJCQkJCSRhcGlfb3JkZXJfaWQJPQkkYXBpU2lwYXJpcy0+b3JkZXI7DQoJCQkJCX1lbHNlew0KCQkJCQkJJGFwaVNpcGFyaXMgCT0gJHNtbWFwaS0+eWVuaVNpcGFyaXMoYXJyYXkoJ2tleScgPT4kYXBpLT5hcGlfYXBpLCdhY3Rpb24nID0+J2FkZCcsJ3NlcnZpY2UnPT4kdXJ1bmJpbGdpLT51cnVuX2FwaV9zZXJ2aXMsJ2xpbmsnPT4kbGluaywncXVhbnRpdHknPT4kbWlrdGFyKSwkYXBpLT5hcGlfdXJsKTsNCgkJCQkJCSRhcGlfb3JkZXJfaWQJPQlAJGFwaVNpcGFyaXMtPm9yZGVyOw0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJaWYgKCBAJGFwaVNpcGFyaXMtPm9yZGVyIHx8ICRhcGlfb3JkZXJfaWQgfHwgQCR0YWtpcGNpYWxuZXQtPnN0YXR1cz09J3N1Y2Nlc3MnIHx8IEAkYXBpU2lwYXJpc1Nvc3lhbC0+aXNsZW09PSdiYXNhcmlsaScgKSB7DQoJCQkJCSRzaXBhcmlzCQk9CSR2dC0+cHJlcGFyZSgiSU5TRVJUIElOVE8gc2lwYXJpc2xlciBTRVQgc2lwYXJpc19zYWhpYmk9Pywgc2lwYXJpc19zZXJ2aXM9PywgdXJ1bl9hcGlfb3JkZXJfaWQ9Pywgc2lwYXJpc19kdXJ1bT0/LCBzaXBhcmlzX21pa3Rhcj0/LCBzaXBhcmlzX3R1dGFyPT8sIHNpcGFyaXNfbGluaz0/LCBzaXBhcmlzX3RhcmloPT8iKTsNCgkJCQkJJHNpcGFyaXMtPiAgZXhlY3V0ZShhcnJheSgkdXNlciwkc2VydmlzLCRhcGlfb3JkZXJfaWQsJ0Jla2xlbWVkZScsJG1pa3RhciwkZml5YXQsJGxpbmssJHRhcmloKSk7DQoJCQkJCQlpZiAoJHNpcGFyaXMpIHsNCgkJCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+Ik3DvGtlbW1lbCEiLCJtIj0+IlNpcGFyacWfaW5peiB2ZXJpbGRpLiIsInMiPT4ic3VjY2VzcyJdOw0KCQkJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJCQkJJGJha2l5ZQk9CSR2dC0+cHJlcGFyZSgiVVBEQVRFIHV5ZWxlciBTRVQgYmFraXllPT8gV0hFUkUgdXNlcm5hbWU9PyIpOw0KCQkJCQkJCSRiYWtpeWUtPiBleGVjdXRlKGFycmF5KCR5YmFraXllLCR1c2VyKSk7DQoJCQkJCQkJLy9zaXBhcmlzTWFpbCgnYjgxZXJpa2FuQGdtYWlsLmNvbScsJ1llbmkgc2lwYXJpxZ9pbml6IG1ldmN1dC4nLCdTaXBhcmnFnyBCaWxnaWxlbmRpcm1lJyk7DQoJCQkJCQl9ZWxzZWlmKCRhcGlTaXBhcmlzLT5lcnJvcil7DQoJCQkJCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iU2lwYXJpxZ8gdmVyaWxpcmtlbiBoYXRhIG9sdcWfdHUuIiwicyI9PiJlcnJvciJdOw0KCQkJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJCQl9DQoJCQkJfWVsc2V7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IlNpcGFyacWfIHZlcmlsaXJrZW4gaGF0YSBvbHXFn3R1LiIsInMiPT4iZXJyb3IiXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9DQoJCQl9DQoNCgkJCWV4aXQoKTsNCg0KCX0sJ25ld19vcmRlci5wb3N0Jyk7DQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy95ZW5pLWRlc3Rlay10YWxlYmknLCBmdW5jdGlvbigpew0KCQlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KDQoJCSRrb251CQk9CSRfUE9TVFsia29udSJdOw0KCQkkYmFzbGlrCT0JJF9QT1NUWyJiYXNsaWsiXTsNCgkJJGljZXJpawk9CSRfUE9TVFsiaWNlcmlrIl07DQoJCSR0YXJpaAk9CWRhdGUoIlktbS1kIEg6aTpzIik7DQoNCgkJJHNvcmd1CT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIGRlc3Rla190YWxlcGxlciBXSEVSRSB0YWxlcF9zYWhpYmk9PyAmJiB0YWxlcF9kdXJ1bT0/ICIpOw0KCQkkc29yZ3UtPiAgZXhlY3V0ZShhcnJheSgkdXllLT51c2VybmFtZSwnQcOnxLFrJykpOw0KDQoJCWlmICggZW1wdHkoJGtvbnUpIHx8IGVtcHR5KCRiYXNsaWspIHx8IGVtcHR5KCRpY2VyaWspICkgew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iVMO8bSBhbGFubGFyxLEgZG9sZHVybWFsxLFzxLFuxLF6LiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2VpZigkc29yZ3UtPnJvd0NvdW50KCkpew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iSGFsZW4gw6fDtnrDvGxtZW1pxZ8gYmlyIGRlc3RlayB0YWxlYmluIHZhci4iLCJzIj0+ImluZm8iXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX1lbHNlew0KCQkJJHRhbGVwCT0JJHZ0LT5wcmVwYXJlKCJJTlNFUlQgSU5UTyBkZXN0ZWtfdGFsZXBsZXIgU0VUIHRhbGVwX3NhaGliaT0/LCB0YWxlcF90YXJpaGk9PywgdGFsZXBfYmFzbGlrPT8sIHRhbGVwX2tvbnU9PywgdGFsZXBfZHVydW09PyAiKTsNCgkJCSR0YWxlcCAtPiBleGVjdXRlKGFycmF5KCR1eWUtPnVzZXJuYW1lLCR0YXJpaCwkYmFzbGlrLCRrb251LCdBw6fEsWsnKSk7DQoJCQkkaWQJCQk9CSR2dC0+bGFzdEluc2VydElkKCk7DQoJCQkkdGFsZXBpCT0JJHZ0LT5wcmVwYXJlKCJJTlNFUlQgSU5UTyBkZXN0ZWtfdGFsZXBfY2V2YXAgU0VUIHRhbGVwX2lkPT8sIHRhbGVwX3RhcmloaT0/LCB0YWxlcF9pY2VyaWs9PywgdGFsZXBfdXNlcj0/ICIpOw0KCQkJJHRhbGVwaS0+IGV4ZWN1dGUoYXJyYXkoJGlkLCR0YXJpaCwkaWNlcmlrLCR1eWUtPnVzZXJuYW1lKSk7DQoJCQkJaWYgKCR0YWxlcCkgew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+Ik3DvGtlbW1lbCEiLCJtIj0+IkRlc3RlayB0YWxlYmluaXogb2x1xZ90dXJ1bGR1LCB5w7ZubGVuZGlyaWxpeW9yc3VudXouIiwicyI9PiJzdWNjZXNzIiwiciI9PiRyb3V0ZXItPmdlbmVyYXRlKCdhbGxfdGlja2V0cy52aWV3JyldOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX1lbHNlew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEiLCJtIj0+IkRlc3RlayB0YWxlYmluaXogb2x1xZ90dXJ1bHVya2VuIGhhdGEgb2x1xZ90dS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfQ0KCQl9DQoNCgkJZXhpdCgpOw0KCX0sJ25ld190aWNrZXQucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnUE9TVCcsICcvdGFsZWJlLWNldmFwLXZlci1bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCgkJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCg0KCQkkaWQJCQk9CSRzbHVnOw0KCQkkaWNlcmlrCT0JJF9QT1NUWyJpY2VyaWsiXTsNCgkJJHRhcmloCT0JZGF0ZSgiWS1tLWQgSDppOnMiKTsNCg0KCQkkc29yZ3UJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gZGVzdGVrX3RhbGVwbGVyIFdIRVJFIGlkPT8iKTsNCgkJJHNvcmd1LT4gIGV4ZWN1dGUoYXJyYXkoJGlkKSk7DQoNCgkJaWYgKCBlbXB0eSgkaWNlcmlrKSApIHsNCgkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IlTDvG0gYWxhbmxhcsSxIGRvbGR1cm1hbMSxc8SxbsSxei4iLCJzIj0+ImluZm8iXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX1lbHNlaWYoJHNvcmd1LT5yb3dDb3VudCgpPDApew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iQsO2eWxlIGJpciBkZXN0ZWsgdGFsZWJpIHlvay4iLCJzIj0+ImluZm8iXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX1lbHNlew0KCQkJJHRhbGVwaQk9CSR2dC0+cHJlcGFyZSgiSU5TRVJUIElOVE8gZGVzdGVrX3RhbGVwX2NldmFwIFNFVCB0YWxlcF9pZD0/LCB0YWxlcF90YXJpaGk9PywgdGFsZXBfaWNlcmlrPT8sIHRhbGVwX3VzZXI9PyAiKTsNCgkJCSR0YWxlcGktPiBleGVjdXRlKGFycmF5KCRpZCwkdGFyaWgsJGljZXJpaywkdXllLT51c2VybmFtZSkpOw0KCQkJCWlmICgkdGFsZXBpKSB7DQoJCQkJCSRlZGl0CQk9CSR2dC0+cHJlcGFyZSgiVVBEQVRFIGRlc3Rla190YWxlcGxlciBTRVQgdGFsZXBfZHVydW09PyBXSEVSRSBpZD0/Iik7DQoJCQkJCSRlZGl0CQktPiBleGVjdXRlKGFycmF5KCdBw6fEsWsnLCRpZCkpOw0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+Ik3DvGtlbW1lbCEiLCJtIj0+IkRlc3RlayB0YWxlYmluZSBjZXZhcCB2ZXJkaW5peiwgecO2bmxlbmRpcmlsaXlvcnN1bnV6LiIsInMiPT4ic3VjY2VzcyIsInIiPT4kcm91dGVyLT5nZW5lcmF0ZSgnYWxsX3RpY2tldHMudmlldycpXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9ZWxzZXsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhIiwibSI9PiJEZXN0ZWsgdGFsZWJpbmUgZGVzdGVrIHZlcmlya2VuIGhhdGEgb2x1xZ90dS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfQ0KCQl9DQoNCgkJZXhpdCgpOw0KCX0sJ25ld19yZXBseS5wb3N0Jyk7DQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy9hamF4LWlzbGVyaScsIGZ1bmN0aW9uKCl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoNCgkJCSRkdXJ1bQk9CSRfUE9TVFsiZHVydW0iXTsNCg0KCQkJaWYgKCRkdXJ1bT09MSkgew0KCQkJCSRpZAkJCQk9CQkkX1BPU1RbImlkIl07DQoJCQkJJHVydW5sZXIJPQkJJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHVydW5sZXIgV0hFUkUgdXJ1bl9rYXRlZ29yaT0/ICYmIGR1cnVtPT8iKTsNCgkJCQkkdXJ1bmxlcgktPiAJZXhlY3V0ZShhcnJheSgkaWQsJzEnKSk7DQoJCQkJJHNheSAJCQk9CQkkdXJ1bmxlci0+cm93Q291bnQoKTsNCgkJCQkkdXJ1bmxlcgk9CQkkdXJ1bmxlci0+ZmV0Y2hBbGwoUERPOjpGRVRDSF9PQkopOw0KCQkJCQlpZiAoJGlkPT0ia2F0ZWdvcmlzZWMiKSB7DQoJCQkJCQllY2hvICc8b3B0aW9uIHZhbHVlPSIwIj5Mw7x0ZmVuIMO2bmNlIGthdGVnb3JpIHNlw6dpbi4uPC9vcHRpb24+JzsNCgkJCQkJfWVsc2V7DQoJCQkJCQlpZiAoJHNheSkgew0KCQkJCQkJCWZvcmVhY2ggKCR1cnVubGVyIGFzICR1cnVuKSB7DQoJCQkJCQkJCWVjaG8gJzxvcHRpb24gdmFsdWU9IicuJHVydW4tPmlkLiciPicuJHVydW4tPnVydW5fYWRpLic8L29wdGlvbj4nOw0KCQkJCQkJCX0NCgkJCQkJCX1lbHNlew0KCQkJCQkJCWVjaG8gJzxvcHRpb24gdmFsdWU9IjAiPkJ1IEthdGVnb3JpZGUgw5xyw7xuIEJ1bHVubWFtYWt0YWTEsXIuPC9vcHRpb24+JzsNCgkJCQkJCX0NCgkJCQkJfQ0KCQkJfQ0KDQoJCQlpZiAoJGR1cnVtPT0yKSB7DQoJCQkJJGlkCQkJCT0JCSRfUE9TVFsiaWQiXTsNCgkJCQkkb3plbGZpeWF0PQkJJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIGZpeWF0bGFuZGlybWEgV0hFUkUgZml5YXRfc2FoaWJpPT8gJiYgZml5YXRfc2VydmlzPT8iKTsNCgkJCQkkb3plbGZpeWF0LT4gCWV4ZWN1dGUoYXJyYXkoJHV5ZS0+dXNlcm5hbWUsJGlkKSk7DQoJCQkJJG96ZWxzYXkJPQkJJG96ZWxmaXlhdC0+cm93Q291bnQoKTsNCgkJCQkkb3plbGZpeWF0PQkJJG96ZWxmaXlhdC0+ZmV0Y2goUERPOjpGRVRDSF9PQkopOw0KCQkJCSR1cnVuCQkJPQkJJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHVydW5sZXIgV0hFUkUgaWQ9PyAmJiBkdXJ1bT0/Iik7DQoJCQkJJHVydW4gCQktPiAJZXhlY3V0ZShhcnJheSgkaWQsJzEnKSk7DQoJCQkJJHVydW4JCQk9CQkkdXJ1bi0+ZmV0Y2goUERPOjpGRVRDSF9PQkopOw0KCQkJCQlpZiAoJG96ZWxzYXk+MCkgew0KCQkJCQkJZWNobyAkb3plbGZpeWF0LT5maXlhdF9maXlhdC8xMDAwOw0KCQkJCQl9ZWxzZXsNCgkJCQkJCWlmICgkdXJ1bi0+dXJ1bl9zZWNlbmVnaT09IlNlcnZpcyIgfHwgJHVydW4tPnVydW5fc2VjZW5lZ2k9PSJZb3J1bSIpIHsNCgkJCQkJCQllY2hvICR1cnVuLT51cnVuX2JpcmltOw0KCQkJCQkJfWVsc2VpZigkdXJ1bi0+dXJ1bl9zZWNlbmVnaT09IlBha2V0Iil7DQoJCQkJCQkJZWNobyAkdXJ1bi0+dXJ1bl9iaXJpbSoxMDAwOw0KCQkJCQkJfQ0KCQkJCQl9DQoJCQl9DQoNCgkJCWlmICgkZHVydW09PTMpIHsNCgkJCQkkaWQJCQkJPQkJJF9QT1NUWyJpZCJdOw0KCQkJCSR1cnVuCQkJPQkJJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHVydW5sZXIgV0hFUkUgaWQ9PyAmJiBkdXJ1bT0/Iik7DQoJCQkJJHVydW4gCQktPiAJZXhlY3V0ZShhcnJheSgkaWQsJzEnKSk7DQoJCQkJJHVydW4JCQk9CQkkdXJ1bi0+ZmV0Y2goUERPOjpGRVRDSF9PQkopOw0KCQkJCQllY2hvICR1cnVuLT51cnVuX3NlY2VuZWdpOw0KCQkJfQ0KDQoJCQlpZiAoJGR1cnVtPT00KSB7DQoJCQkJJGlkCQkJCT0JCSRfUE9TVFsiaWQiXTsNCgkJCQkkdXJ1bgkJCT0JCSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSB1cnVubGVyIFdIRVJFIGlkPT8gJiYgZHVydW09PyIpOw0KCQkJCSR1cnVuIAkJLT4gCWV4ZWN1dGUoYXJyYXkoJGlkLCcxJykpOw0KCQkJCSR1cnVuCQkJPQkJJHVydW4tPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCgkJCQkJaWYgKCBzdHJsZW4oJHVydW4tPnVydW5fYWNpa2xhbWEpPjUgKSB7DQoJCQkJCQllY2hvICR1cnVuLT51cnVuX2FjaWtsYW1hOw0KCQkJCQl9ZWxzZXsNCgkJCQkJCWVjaG8gJzAnOw0KCQkJCQl9DQoJCQl9DQoNCgkJCWlmICgkZHVydW09PTUpIHsNCgkJCQkkeW9ydW1sYXIJCQkJPQkJJF9QT1NUWyJ5b3J1bWxhciJdOw0KCQkJCWVjaG8gY291bnQoZXhwbG9kZSgiXG4iLCR5b3J1bWxhcikpOw0KCQkJCWV4aXQoKTsNCgkJCX0NCgl9LCd1cnVubGVyaV9jZWsucG9zdCcpOw0KDQoJIyMgQWRtaW4gR0VUIMSwxZ9sZW1sZXJpICMjDQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicnLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllLCRrYXphbmMsJGJheWlzYXlpc2ksJG9kZW1lc2F5aXNpLCR0YWxlcHNheWlzaTsNCgkJCQlpZiAoQCRfU0VTU0lPTlsiYWRtaW4iXSkgew0KCQkJCQkkdGl0bGUuPQknQW5hc2F5ZmEnOw0KCQkJCQlpbmNsdWRlICd2aWV3cy8nLlNJVEVfVEVNQS4nL2FkbWluL21haW4udmlldy5waHAnOw0KCQkJCX1lbHNlew0KCQkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ2FkbWluX2xvZ2luLnZpZXcnKSk7DQoJCQkJfQ0KCQkJCWV4aXQoKTsNCgl9LCdhZG1pbl9tYWluLnZpZXcnKTsNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy9naXJpcy15YXAnLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhcjsNCgkJCWlmIChAISRfU0VTU0lPTlsiYWRtaW4iXSkgew0KCQkJCSR0aXRsZS49CSdHaXJpxZ8gWWFwJzsNCgkJCQlpbmNsdWRlICd2aWV3cy8nLlNJVEVfVEVNQS4nL2FkbWluL2xvZ2luLnZpZXcucGhwJzsNCgkJCX1lbHNlew0KCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbWFpbi52aWV3JykpOw0KCQkJfQ0KCQkJZXhpdCgpOw0KCX0sJ2FkbWluX2xvZ2luLnZpZXcnKTsNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy9oYWJlcmxlcicsIGZ1bmN0aW9uKCl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWUsJGFwaWxlciwkc21tYXBpLCRoYWJlcmxlcjsNCgkJCWlmIChAJF9TRVNTSU9OWyJhZG1pbiJdKSB7DQoJCQkJJHRpdGxlLj0JJ0hhYmVybGVyJzsNCgkJCQlpbmNsdWRlICd2aWV3cy8nLlNJVEVfVEVNQS4nL2FkbWluL25ld3Mudmlldy5waHAnOw0KCQkJfWVsc2V7DQoJCQkJeW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdhZG1pbl9sb2dpbi52aWV3JykpOw0KCQkJfQ0KCQkJZXhpdCgpOw0KCX0sJ2FkbWluX25ldy52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicveWVuaS1oYWJlcicsIGZ1bmN0aW9uKCl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWUsJGFwaWxlciwkc21tYXBpLCRoYWJlcmxlcjsNCgkJCWlmIChAJF9TRVNTSU9OWyJhZG1pbiJdKSB7DQoJCQkJJHRpdGxlLj0JJ0hhYmVybGVyJzsNCgkJCQlpbmNsdWRlICd2aWV3cy8nLlNJVEVfVEVNQS4nL2FkbWluL25ld19uZXdzLnZpZXcucGhwJzsNCgkJCX1lbHNlew0KCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbG9naW4udmlldycpKTsNCgkJCX0NCgkJCWV4aXQoKTsNCgl9LCdhZG1pbl9uZXdzLm5ldy52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvaGFiZXItZHV6ZW5sZS9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwkYXBpbGVyLCRzbW1hcGksJGhhYmVybGVyOw0KCQkJaWYgKEAkX1NFU1NJT05bImFkbWluIl0pIHsNCgkJCQkkdGl0bGUuPQknSGFiZXIgRMO8emVubGUnOw0KCQkJCSRoYWJlcgk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBoYWJlcmxlciBXSEVSRSBpZD0/Iik7DQoJCQkJJGhhYmVyLT4gZXhlY3V0ZShhcnJheSgkc2x1ZykpOw0KCQkJCSRoYWJlciA9ICRoYWJlci0+ZmV0Y2goUERPOjpGRVRDSF9PQkopOw0KCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvYWRtaW4vZWRpdF9uZXdzLnZpZXcucGhwJzsNCgkJCX1lbHNlew0KCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbG9naW4udmlldycpKTsNCgkJCX0NCgkJCWV4aXQoKTsNCgl9LCdhZG1pbl9uZXdzLmVkaXQudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL29kZW1lbGVyJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwkYXBpbGVyLCRzbW1hcGksJG9kZW1lbGVyOw0KCQkJaWYgKEAkX1NFU1NJT05bImFkbWluIl0pIHsNCgkJCQkkdGl0bGUuPQknw5ZkZW1lbGVyJzsNCgkJCQlpbmNsdWRlICd2aWV3cy8nLlNJVEVfVEVNQS4nL2FkbWluL29kZW1lbGVyLnZpZXcucGhwJzsNCgkJCX1lbHNlew0KCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbG9naW4udmlldycpKTsNCgkJCX0NCgkJCWV4aXQoKTsNCgl9LCdhZG1pbl9vZGVtZWxlci52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvcGF5d2FudC1vZGVtZWxlci9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwka2F0ZWdvcmlsZXI7DQoJCQkJaWYgKEAkX1NFU1NJT05bImFkbWluIl0pIHsNCgkJCQkJJHRpdGxlLj0JJ1BheXdhbnQgw5ZkZW1lbGVyaSc7DQoJCQkJCS8qIFNheWZhbGFtYSAqLw0KCQkJCQkkZ296dWtzdW4gPSAyMDsgLy8gTGlzdGVsZW1lZGUgeWFuIHlhbmEga2HDpyBzYXlmYSBudW1hcmFzxLEgb2xzdW4NCgkJCQkJJGthY3RhbmUgID0gMTA7IC8vIFNheWZhZGEgS2HDpyBWZXJpIEfDtnrDvGtzw7xuDQoJCQkJCSRuZXJlZGVuICA9ICRzbHVnKiRrYWN0YW5lLSRrYWN0YW5lOyAvLyBWZXJpbGVyIE5lcmRlbiDDh2VraWxtZXllIEJhxZ9sYW5hY2FrDQoJCQkJCSR2ZXJpc2F5ICA9ICR2dC0+cXVlcnkoIlNFTEVDVCAqIEZST00gcGF5d2FudF9vZGVtZWxlciBXSEVSRSBvZGVtZV9kdXJ1bT0nT25heWxhbmTEsScgIiktPnJvd0NvdW50KCk7IC8vIEthw6cgVGFuZSBWZXJpIFZhcg0KCQkJCQkkdG9wbGFtc2F5ZmEgID0gY2VpbCgkdmVyaXNheS8ka2FjdGFuZSk7IC8vIFRvcGxhbSBLYcOnIFNheWZhIFZhcg0KCQkJCQlpZigkdmVyaXNheSE9MCl7aWYoJHNsdWc+JHRvcGxhbXNheWZhKXt5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ2FkbWluX3BheXdhbnRfb2RlbWVsZXIudmlldycsWydzbHVnJz0+MV0pKTt9fQ0KCQkJCQkvKiBTYXlmYWxhbWEgKi8NCgkJCQkJJG9kZW1lbGVyCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHBheXdhbnRfb2RlbWVsZXIgV0hFUkUgb2RlbWVfZHVydW09PyBPUkRFUiBCWSBpZCBERVNDIExJTUlUICRuZXJlZGVuLCRrYWN0YW5lIik7DQoJCQkJCSRvZGVtZWxlcgktPiBleGVjdXRlKGFycmF5KCdPbmF5bGFuZMSxJykpOw0KCQkJCQkkb2RlbWVsZXIJPQkkb2RlbWVsZXItPmZldGNoQWxsKFBETzo6RkVUQ0hfT0JKKTsNCgkJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9hZG1pbi9wYXl3YW50X29kZW1lbGVyLnZpZXcucGhwJzsNCgkJCQl9ZWxzZXsNCgkJCQkJeW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdhZG1pbl9sb2dpbi52aWV3JykpOw0KCQkJCX0NCgkJCQlleGl0KCk7DQoJfSwnYWRtaW5fcGF5d2FudF9vZGVtZWxlci52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvcGF5dHItb2RlbWVsZXIvWyo6c2x1Z10nLCBmdW5jdGlvbigkc2x1Zyl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWUsJGthdGVnb3JpbGVyOw0KCQkJCWlmIChAJF9TRVNTSU9OWyJhZG1pbiJdKSB7DQoJCQkJCSR0aXRsZS49CSdQYXl3YW50IMOWZGVtZWxlcmknOw0KCQkJCQkvKiBTYXlmYWxhbWEgKi8NCgkJCQkJJGdvenVrc3VuID0gMjA7IC8vIExpc3RlbGVtZWRlIHlhbiB5YW5hIGthw6cgc2F5ZmEgbnVtYXJhc8SxIG9sc3VuDQoJCQkJCSRrYWN0YW5lICA9IDEwOyAvLyBTYXlmYWRhIEthw6cgVmVyaSBHw7Z6w7xrc8O8bg0KCQkJCQkkbmVyZWRlbiAgPSAkc2x1Zyoka2FjdGFuZS0ka2FjdGFuZTsgLy8gVmVyaWxlciBOZXJkZW4gw4dla2lsbWV5ZSBCYcWfbGFuYWNhaw0KCQkJCQkkdmVyaXNheSAgPSAkdnQtPnF1ZXJ5KCJTRUxFQ1QgKiBGUk9NIHBheXRyX29kZW1lbGVyIFdIRVJFIG9kZW5kaW1pPScxJyAiKS0+cm93Q291bnQoKTsgLy8gS2HDpyBUYW5lIFZlcmkgVmFyDQoJCQkJCSR0b3BsYW1zYXlmYSAgPSBjZWlsKCR2ZXJpc2F5LyRrYWN0YW5lKTsgLy8gVG9wbGFtIEthw6cgU2F5ZmEgVmFyDQoJCQkJCWlmKCR2ZXJpc2F5IT0wKXtpZigkc2x1Zz4kdG9wbGFtc2F5ZmEpe3lvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fcGF5dHJfb2RlbWVsZXIudmlldycsWydzbHVnJz0+MV0pKTt9fQ0KCQkJCQkvKiBTYXlmYWxhbWEgKi8NCgkJCQkJJG9kZW1lbGVyCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHBheXRyX29kZW1lbGVyIFdIRVJFIG9kZW5kaW1pPT8gT1JERVIgQlkgaWQgREVTQyBMSU1JVCAkbmVyZWRlbiwka2FjdGFuZSIpOw0KCQkJCQkkb2RlbWVsZXIJLT4gZXhlY3V0ZShhcnJheSgnMScpKTsNCgkJCQkJJG9kZW1lbGVyCT0JJG9kZW1lbGVyLT5mZXRjaEFsbChQRE86OkZFVENIX09CSik7DQoJCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvYWRtaW4vcGF5dHJfb2RlbWVsZXIudmlldy5waHAnOw0KCQkJCX1lbHNlew0KCQkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ2FkbWluX2xvZ2luLnZpZXcnKSk7DQoJCQkJfQ0KCQkJCWV4aXQoKTsNCgl9LCdhZG1pbl9wYXl0cl9vZGVtZWxlci52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvb2RlbWUtZHV6ZW5sZS9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwkYXBpbGVyLCRzbW1hcGksJG9kZW1lbGVyOw0KCQkJaWYgKEAkX1NFU1NJT05bImFkbWluIl0pIHsNCgkJCQkkdGl0bGUuPQknw5ZkZW1lIETDvHplbmxlJzsNCgkJCQkkb2RlbWUJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gYmFua2Ffb2RlbWVsZXIgV0hFUkUgaWQ9PyIpOw0KCQkJCSRvZGVtZS0+IGV4ZWN1dGUoYXJyYXkoJHNsdWcpKTsNCgkJCQkkb2RlbWUJPQkkb2RlbWUtPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCgkJCQkkYmFua2EgID0gJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIGJhbmthX2hlc2FwbGFyaSBXSEVSRSBpZD0/Iik7DQoJCQkJJGJhbmthLT4gZXhlY3V0ZShhcnJheSgkb2RlbWUtPm9kZW1lX2JhbmthKSk7DQoJCQkJJGJhbmthICA9ICRiYW5rYS0+ZmV0Y2goUERPOjpGRVRDSF9PQkopOw0KCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvYWRtaW4vb2RlbWUuZWRpdC52aWV3LnBocCc7DQoJCQl9ZWxzZXsNCgkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ2FkbWluX2xvZ2luLnZpZXcnKSk7DQoJCQl9DQoJCQlleGl0KCk7DQoJfSwnYWRtaW5fb2RlbWUuZWRpdC52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvYmFua2EtaGVzYXAtZWtsZScsIGZ1bmN0aW9uKCl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWUsJGFwaWxlciwkc21tYXBpLCRiYW5rYWxhcjsNCgkJCWlmIChAJF9TRVNTSU9OWyJhZG1pbiJdKSB7DQoJCQkJJHRpdGxlLj0JJ0JhbmthIEhlc2FixLEgRWtsZSc7DQoJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9hZG1pbi9iYW5rLmFjY291bnQubmV3LnZpZXcucGhwJzsNCgkJCX1lbHNlew0KCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbG9naW4udmlldycpKTsNCgkJCX0NCgkJCWV4aXQoKTsNCgl9LCdiYW5rX2FjY291bnQubmV3LnZpZXcnKTsNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy9iYW5rYS1oZXNhcGxhcmknLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllLCRhcGlsZXIsJHNtbWFwaSwkYmFua2FsYXI7DQoJCQlpZiAoQCRfU0VTU0lPTlsiYWRtaW4iXSkgew0KCQkJCSR0aXRsZS49CSdCYW5rYSBIZXNhcGxhcsSxJzsNCgkJCQlpbmNsdWRlICd2aWV3cy8nLlNJVEVfVEVNQS4nL2FkbWluL2JhbmsuYWNjb3VudC52aWV3LnBocCc7DQoJCQl9ZWxzZXsNCgkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ2FkbWluX2xvZ2luLnZpZXcnKSk7DQoJCQl9DQoJCQlleGl0KCk7DQoJfSwnYmFua19hY2NvdW50cy52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvYmFua2EtaGVzYXAvWyo6c2x1Z10nLCBmdW5jdGlvbigkc2x1Zyl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWUsJGFwaWxlciwkc21tYXBpLCRiYW5rYWxhcjsNCgkJCWlmIChAJF9TRVNTSU9OWyJhZG1pbiJdKSB7DQoJCQkJJHRpdGxlLj0JJ0JhbmthIEhlc2FixLEgRMO8emVubGUnOw0KCQkJCSRiYW5rYQk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBiYW5rYV9oZXNhcGxhcmkgV0hFUkUgaWQ9PyIpOw0KCQkJCSRiYW5rYS0+IGV4ZWN1dGUoYXJyYXkoJHNsdWcpKTsNCgkJCQkkYmFua2EJPQkkYmFua2EtPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCgkJCQlpbmNsdWRlICd2aWV3cy8nLlNJVEVfVEVNQS4nL2FkbWluL2JhbmsuYWNjb3VudC5lZGl0LnZpZXcucGhwJzsNCgkJCX1lbHNlew0KCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbG9naW4udmlldycpKTsNCgkJCX0NCgkJCWV4aXQoKTsNCgl9LCdiYW5rX2FjY291bnQuZWRpdC52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvc2lwYXJpcy1kdXplbmxlL1sqOnNsdWddJywgZnVuY3Rpb24oJHNsdWcpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllLCRhcGlsZXIsJHNtbWFwaTsNCgkJCWlmIChAJF9TRVNTSU9OWyJhZG1pbiJdKSB7DQoJCQkJJHRpdGxlLj0JJ1NpcGFyacWfIETDvHplbmxlJzsNCgkJCQkkc2lwYXJpcwk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBzaXBhcmlzbGVyIFdIRVJFIGlkPT8iKTsNCgkJCQkkc2lwYXJpcy0+IGV4ZWN1dGUoYXJyYXkoJHNsdWcpKTsNCgkJCQkkc2lwYXJpcwk9CSRzaXBhcmlzLT5mZXRjaChQRE86OkZFVENIX09CSik7DQoJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9hZG1pbi9vcmRlci5lZGl0LnZpZXcucGhwJzsNCgkJCX1lbHNlew0KCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbG9naW4udmlldycpKTsNCgkJCX0NCgkJCWV4aXQoKTsNCgl9LCdhZG1pbl9vcmRlcl9lZGl0LnZpZXcnKTsNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy9zaXBhcmlzbGVyJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwkYXBpbGVyLCRzbW1hcGk7DQoJCQlpZiAoQCRfU0VTU0lPTlsiYWRtaW4iXSkgew0KCQkJCSR0aXRsZS49CSdTaXBhcmnFn2xlcic7DQoJCQkJJHNsdWcgCT0JMTsNCgkJCQkvKiBTYXlmYWxhbWEgKi8NCgkJCQkkZ296dWtzdW4gPSAyMDsgLy8gTGlzdGVsZW1lZGUgeWFuIHlhbmEga2HDpyBzYXlmYSBudW1hcmFzxLEgb2xzdW4NCgkJCQkka2FjdGFuZSAgPSAxMDsgLy8gU2F5ZmFkYSBLYcOnIFZlcmkgR8O2esO8a3PDvG4NCgkJCQkkbmVyZWRlbiAgPSAkc2x1Zyoka2FjdGFuZS0ka2FjdGFuZTsgLy8gVmVyaWxlciBOZXJkZW4gw4dla2lsbWV5ZSBCYcWfbGFuYWNhaw0KCQkJCSR2ZXJpc2F5ICA9ICR2dC0+cXVlcnkoIlNFTEVDVCAqIEZST00gc2lwYXJpc2xlciIpLT5yb3dDb3VudCgpOyAvLyBLYcOnIFRhbmUgVmVyaSBWYXINCgkJCQkkdG9wbGFtc2F5ZmEgID0gY2VpbCgkdmVyaXNheS8ka2FjdGFuZSk7IC8vIFRvcGxhbSBLYcOnIFNheWZhIFZhcg0KCQkJCWlmKCRzbHVnPiR0b3BsYW1zYXlmYSl7eW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdhZG1pbl9vcmRlcnNzLnZpZXcnLFsnc2x1Zyc9PjFdKSk7fQ0KCQkJCS8qIFNheWZhbGFtYSAqLw0KCQkJCSRzaXBhcmlzbGVyCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHNpcGFyaXNsZXIgT1JERVIgQlkgaWQgREVTQyBMSU1JVCAkbmVyZWRlbiwka2FjdGFuZSIpOw0KCQkJCSRzaXBhcmlzbGVyLT4gZXhlY3V0ZShhcnJheSgpKTsNCgkJCQkkc2lwYXJpc2xlcgk9CSRzaXBhcmlzbGVyLT5mZXRjaEFsbChQRE86OkZFVENIX09CSik7DQoJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9hZG1pbi9vcmRlcnMudmlldy5waHAnOw0KCQkJfWVsc2V7DQoJCQkJeW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdhZG1pbl9sb2dpbi52aWV3JykpOw0KCQkJfQ0KCQkJZXhpdCgpOw0KCX0sJ2FkbWluX29yZGVycy52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvc2lwYXJpc2xlci9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwkYXBpbGVyLCRzbW1hcGk7DQoJCQlpZiAoQCRfU0VTU0lPTlsiYWRtaW4iXSkgew0KCQkJCSR0aXRsZS49CSdTaXBhcmnFn2xlcic7DQoJCQkJLyogU2F5ZmFsYW1hICovDQoJCQkJJGdvenVrc3VuID0gMjA7IC8vIExpc3RlbGVtZWRlIHlhbiB5YW5hIGthw6cgc2F5ZmEgbnVtYXJhc8SxIG9sc3VuDQoJCQkJJGthY3RhbmUgID0gMTA7IC8vIFNheWZhZGEgS2HDpyBWZXJpIEfDtnrDvGtzw7xuDQoJCQkJJG5lcmVkZW4gID0gJHNsdWcqJGthY3RhbmUtJGthY3RhbmU7IC8vIFZlcmlsZXIgTmVyZGVuIMOHZWtpbG1leWUgQmHFn2xhbmFjYWsNCgkJCQkkdmVyaXNheSAgPSAkdnQtPnF1ZXJ5KCJTRUxFQ1QgKiBGUk9NIHNpcGFyaXNsZXIiKS0+cm93Q291bnQoKTsgLy8gS2HDpyBUYW5lIFZlcmkgVmFyDQoJCQkJJHRvcGxhbXNheWZhICA9IGNlaWwoJHZlcmlzYXkvJGthY3RhbmUpOyAvLyBUb3BsYW0gS2HDpyBTYXlmYSBWYXINCgkJCQlpZigkc2x1Zz4kdG9wbGFtc2F5ZmEpe3lvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fb3JkZXJzcy52aWV3JyxbJ3NsdWcnPT4xXSkpO30NCgkJCQkvKiBTYXlmYWxhbWEgKi8NCgkJCQkkc2lwYXJpc2xlcgk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBzaXBhcmlzbGVyIE9SREVSIEJZIGlkIERFU0MgTElNSVQgJG5lcmVkZW4sJGthY3RhbmUiKTsNCgkJCQkkc2lwYXJpc2xlci0+IGV4ZWN1dGUoYXJyYXkoKSk7DQoJCQkJJHNpcGFyaXNsZXIJPQkkc2lwYXJpc2xlci0+ZmV0Y2hBbGwoUERPOjpGRVRDSF9PQkopOw0KCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvYWRtaW4vb3JkZXJzLnZpZXcucGhwJzsNCgkJCX1lbHNlew0KCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbG9naW4udmlldycpKTsNCgkJCX0NCgkJCWV4aXQoKTsNCgl9LCdhZG1pbl9vcmRlcnNzLnZpZXcnKTsNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy9hcGktZWtsZScsIGZ1bmN0aW9uKCl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCQkJaWYgKEAkX1NFU1NJT05bImFkbWluIl0pIHsNCgkJCQkJJHRpdGxlLj0JJ0FQSSBPbHXFn3R1cic7DQoJCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvYWRtaW4vbmV3X2FwaS52aWV3LnBocCc7DQoJCQkJfWVsc2V7DQoJCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbG9naW4udmlldycpKTsNCgkJCQl9DQoJCQkJZXhpdCgpOw0KCX0sJ25ld19hcGkudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL2FwaWxlcicsIGZ1bmN0aW9uKCl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWUsJGFwaWxlciwkc21tYXBpOw0KCQkJCWlmIChAJF9TRVNTSU9OWyJhZG1pbiJdKSB7DQoJCQkJCSR0aXRsZS49CSdTaXN0ZW1kZWtpIEFQSSBTZXJ2aXNsZXJpJzsNCgkJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9hZG1pbi9hcGkudmlldy5waHAnOw0KCQkJCX1lbHNlew0KCQkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ2FkbWluX2xvZ2luLnZpZXcnKSk7DQoJCQkJfQ0KCQkJCWV4aXQoKTsNCgl9LCdhcGkudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL2FwaS1kdXplbmxlL1sqOnNsdWddJywgZnVuY3Rpb24oJHNsdWcpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQkJCWlmIChAJF9TRVNTSU9OWyJhZG1pbiJdKSB7DQoJCQkJCSR0aXRsZS49CSdBUEkgT2x1xZ90dXInOw0KCQkJCQkkYXBpCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIGFwaSBXSEVSRSBpZD0/Iik7DQoJCQkJCSRhcGktPiBleGVjdXRlKGFycmF5KCRzbHVnKSk7DQoJCQkJCSRhcGkJPQkkYXBpLT5mZXRjaChQRE86OkZFVENIX09CSik7DQoJCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvYWRtaW4vZWRpdF9hcGkudmlldy5waHAnOw0KCQkJCX1lbHNlew0KCQkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ2FkbWluX2xvZ2luLnZpZXcnKSk7DQoJCQkJfQ0KCQkJCWV4aXQoKTsNCgl9LCdlZGl0X2FwaS52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicva2F0ZWdvcmlsZXInLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllLCRrYXRlZ29yaWxlcjsNCgkJCQlpZiAoQCRfU0VTU0lPTlsiYWRtaW4iXSkgew0KCQkJCQkkdGl0bGUuPQknU2lzdGVtZGVraSDDnHLDvG4gS2F0ZWdvcmlsZXJpJzsNCgkJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9hZG1pbi9hbGxfY2F0ZWdvcmllcy52aWV3LnBocCc7DQoJCQkJfWVsc2V7DQoJCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbG9naW4udmlldycpKTsNCgkJCQl9DQoJCQkJZXhpdCgpOw0KCX0sJ2FsbF9jYXRlZ29yaWVzLnZpZXcnKTsNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy91cnVuLWVrbGUnLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllLCRhcGlsZXIsJGthdGVnb3JpbGVyOw0KCQkJCWlmIChAJF9TRVNTSU9OWyJhZG1pbiJdKSB7DQoJCQkJCSR0aXRsZS49CSdZZW5pIMOccsO8biBFa2xlJzsNCgkJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9hZG1pbi9uZXdfcHJvZHVjdC52aWV3LnBocCc7DQoJCQkJfWVsc2V7DQoJCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbG9naW4udmlldycpKTsNCgkJCQl9DQoJCQkJZXhpdCgpOw0KCX0sJ25ld19wcm9kdWN0LnZpZXcnKTsNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy91cnVubGVyJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwkdXJ1bmxlcnI7DQoJCQkJaWYgKEAkX1NFU1NJT05bImFkbWluIl0pIHsNCgkJCQkJJHRpdGxlLj0JJ8OccsO8bmxlcic7DQoJCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvYWRtaW4vYWxsX3Byb2R1Y3Qudmlldy5waHAnOw0KCQkJCX1lbHNlew0KCQkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ2FkbWluX2xvZ2luLnZpZXcnKSk7DQoJCQkJfQ0KCQkJCWV4aXQoKTsNCgl9LCdhbGxfcHJvZHVjdC52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvdXJ1bi1kdXplbmxlL1sqOnNsdWddJywgZnVuY3Rpb24oJHNsdWcpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllLCRhcGlsZXIsJGthdGVnb3JpbGVyOw0KCQkJCWlmIChAJF9TRVNTSU9OWyJhZG1pbiJdKSB7DQoJCQkJCSR0aXRsZS49CSfDnHLDvG4gRMO8emVubGUnOw0KCQkJCQkkdXJ1bgk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSB1cnVubGVyIFdIRVJFIGlkPT8iKTsNCgkJCQkJJHVydW4tPiBleGVjdXRlKGFycmF5KCRzbHVnKSk7DQoJCQkJCSR1cnVuCT0JJHVydW4tPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCgkJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9hZG1pbi9lZGl0X3Byb2R1Y3Qudmlldy5waHAnOw0KCQkJCX1lbHNlew0KCQkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ2FkbWluX2xvZ2luLnZpZXcnKSk7DQoJCQkJfQ0KCQkJCWV4aXQoKTsNCgl9LCdlZGl0X3Byb2R1Y3QudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL3V5ZS1hcmEnLCBmdW5jdGlvbigpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllLCRrYXRlZ29yaWxlcjsNCgkJCQlpZiAoQCRfU0VTU0lPTlsiYWRtaW4iXSkgew0KCQkJCQkkdGl0bGUuPQknw5x5ZSBBcmEnOw0KCQkJCQkka2VsaW1lCT0gJF9HRVRbImFyYSJdOw0KCQkJCQkkdGlwCT0JJF9HRVRbInRpcCJdOw0KCQkJCQlpZiAoICR0aXAgPT0gJ21haWwnICkgew0KCQkJCQkJJHNvciAgCQk9ICR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSB1eWVsZXIgV0hFUkUgbWFpbCBMSUtFID8gIik7DQoJCQkJCQkkc29yCQkJLT4gZXhlY3V0ZShhcnJheSgiJSIuJGtlbGltZS4iJSIpKTsNCgkJCQkJfWVsc2VpZiggJHRpcCA9PSAndGVsZWZvbicgKXsNCgkJCQkJCSRzb3IgIAkJPSAkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gdXllbGVyIFdIRVJFIHRlbGVmb24gTElLRSA/ICIpOw0KCQkJCQkJJHNvcgkJCS0+IGV4ZWN1dGUoYXJyYXkoIiUiLiRrZWxpbWUuIiUiKSk7DQoJCQkJCX1lbHNlaWYoICR0aXAgPT0gJ3VzZXJuYW1lJyApew0KCQkJCQkJJHNvciAgCQk9ICR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSB1eWVsZXIgV0hFUkUgdXNlcm5hbWUgTElLRSA/JyAiKTsNCgkJCQkJCSRzb3IJCQktPiBleGVjdXRlKGFycmF5KCIlIi4ka2VsaW1lLiIlIikpOw0KCQkJCQl9ZWxzZWlmKCAkdGlwID09ICdhZCcgKXsNCgkJCQkJCSRzb3IgIAkJPSAkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gdXllbGVyIFdIRVJFIGFkc295YWQgTElLRSA/JyAiKTsNCgkJCQkJCSRzb3IJCQktPiBleGVjdXRlKGFycmF5KCIlIi4ka2VsaW1lLiIlIikpOw0KCQkJCQl9DQoJCQkJCS8qIFNheWZhbGFtYSAqLw0KCQkJCQlpZiAoICR0aXAgPT0gJ21haWwnICkgew0KCQkJCQkJJHV5ZWxlcgk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSB1eWVsZXIgV0hFUkUgbWFpbCBMSUtFID8gT1JERVIgQlkgaWQgREVTQyIpOw0KCQkJCQkJJHV5ZWxlcgktPiBleGVjdXRlKGFycmF5KCIlIi4ka2VsaW1lLiIlIikpOw0KCQkJCQkJJHV5ZWxlcgk9CSR1eWVsZXItPmZldGNoQWxsKFBETzo6RkVUQ0hfT0JKKTsNCgkJCQkJfWVsc2VpZiggJHRpcCA9PSAndGVsZWZvbicgKXsNCgkJCQkJCSR1eWVsZXIJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gdXllbGVyIFdIRVJFIHRlbGVmb24gTElLRSA/IE9SREVSIEJZIGlkIERFU0MiKTsNCgkJCQkJCSR1eWVsZXIJLT4gZXhlY3V0ZShhcnJheSgiJSIuJGtlbGltZS4iJSIpKTsNCgkJCQkJCSR1eWVsZXIJPQkkdXllbGVyLT5mZXRjaEFsbChQRE86OkZFVENIX09CSik7DQoJCQkJCX1lbHNlaWYoICR0aXAgPT0gJ3VzZXJuYW1lJyApew0KCQkJCQkJJHV5ZWxlcgk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSB1eWVsZXIgV0hFUkUgdXNlcm5hbWUgTElLRSA/IE9SREVSIEJZIGlkIERFU0MiKTsNCgkJCQkJCSR1eWVsZXIJLT4gZXhlY3V0ZShhcnJheSgiJSIuJGtlbGltZS4iJSIpKTsNCgkJCQkJCSR1eWVsZXIJPQkkdXllbGVyLT5mZXRjaEFsbChQRE86OkZFVENIX09CSik7DQoJCQkJCX1lbHNlaWYoICR0aXAgPT0gJ2FkJyApew0KCQkJCQkJJHV5ZWxlcgk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSB1eWVsZXIgV0hFUkUgYWRzb3lhZCBMSUtFID8gT1JERVIgQlkgaWQgREVTQyIpOw0KCQkJCQkJJHV5ZWxlcgktPiBleGVjdXRlKGFycmF5KCIlIi4ka2VsaW1lLiIlIikpOw0KCQkJCQkJJHV5ZWxlcgk9CSR1eWVsZXItPmZldGNoQWxsKFBETzo6RkVUQ0hfT0JKKTsNCgkJCQkJfQ0KCQkJCQlpbmNsdWRlICd2aWV3cy8nLlNJVEVfVEVNQS4nL2FkbWluL2FyYV91c2Vycy52aWV3LnBocCc7DQoJCQkJfWVsc2V7DQoJCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbG9naW4udmlldycpKTsNCgkJCQl9DQoJCQkJZXhpdCgpOw0KCX0sJ2FyYV91c2Vycy52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvdXllbGVyL1sqOnNsdWddJywgZnVuY3Rpb24oJHNsdWcpew0KICAgIAlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllLCRrYXRlZ29yaWxlcjsNCgkJCQlpZiAoQCRfU0VTU0lPTlsiYWRtaW4iXSkgew0KCQkJCQkkdGl0bGUuPQknU2lzdGVtZGVraSDDnHllbGVyJzsNCgkJCQkJLyogU2F5ZmFsYW1hICovDQoJCQkJCSRnb3p1a3N1biA9IDIwOyAvLyBMaXN0ZWxlbWVkZSB5YW4geWFuYSBrYcOnIHNheWZhIG51bWFyYXPEsSBvbHN1bg0KCQkJCQkka2FjdGFuZSAgPSAxMDsgLy8gU2F5ZmFkYSBLYcOnIFZlcmkgR8O2esO8a3PDvG4NCgkJCQkJJG5lcmVkZW4gID0gJHNsdWcqJGthY3RhbmUtJGthY3RhbmU7IC8vIFZlcmlsZXIgTmVyZGVuIMOHZWtpbG1leWUgQmHFn2xhbmFjYWsNCgkJCQkJJHZlcmlzYXkgID0gJHZ0LT5xdWVyeSgiU0VMRUNUICogRlJPTSB1eWVsZXIiKS0+cm93Q291bnQoKTsgLy8gS2HDpyBUYW5lIFZlcmkgVmFyDQoJCQkJCSR0b3BsYW1zYXlmYSAgPSBjZWlsKCR2ZXJpc2F5LyRrYWN0YW5lKTsgLy8gVG9wbGFtIEthw6cgU2F5ZmEgVmFyDQoJCQkJCWlmKCRzbHVnPiR0b3BsYW1zYXlmYSl7eW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdhbGxfdXNlcnMudmlldycsWydzbHVnJz0+MV0pKTt9DQoJCQkJCS8qIFNheWZhbGFtYSAqLw0KCQkJCQkkdXllbGVyCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHV5ZWxlciBPUkRFUiBCWSBpZCBERVNDIExJTUlUICRuZXJlZGVuLCRrYWN0YW5lIik7DQoJCQkJCSR1eWVsZXIJLT4gZXhlY3V0ZShhcnJheSgpKTsNCgkJCQkJJHV5ZWxlcgk9CSR1eWVsZXItPmZldGNoQWxsKFBETzo6RkVUQ0hfT0JKKTsNCgkJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9hZG1pbi9hbGxfdXNlcnMudmlldy5waHAnOw0KCQkJCX1lbHNlew0KCQkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ2FkbWluX2xvZ2luLnZpZXcnKSk7DQoJCQkJfQ0KCQkJCWV4aXQoKTsNCgl9LCdhbGxfdXNlcnMudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL3V5ZS9bKjpzbHVnXS9maXlhdGxhcicsIGZ1bmN0aW9uKCRzbHVnKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwkdXJ1bmxlcjsNCgkJCQlpZiAoQCRfU0VTU0lPTlsiYWRtaW4iXSkgew0KCQkJCQkkdGl0bGUuPQknw5x5ZXllIMOWemVsIEZpeWF0bGFuZMSxcm1hJzsNCgkJCQkJJHV5ZXNvcgk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSB1eWVsZXIgV0hFUkUgaWQ9PyIpOw0KCQkJCQkkdXllc29yLT4gZXhlY3V0ZShhcnJheSgkc2x1ZykpOw0KCQkJCQkJaWYgKCEkdXllc29yCT0JJHV5ZXNvci0+ZmV0Y2goUERPOjpGRVRDSF9PQkopKSB7DQoJCQkJCQkJeW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdhZG1pbl9tYWluLnZpZXcnKSk7DQoJCQkJCQl9DQoJCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvYWRtaW4vcHJpdmF0ZV9wcmljZS52aWV3LnBocCc7DQoJCQkJfWVsc2V7DQoJCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbG9naW4udmlldycpKTsNCgkJCQl9DQoJCQkJZXhpdCgpOw0KCX0sJ3ByaXZhdGVfcHJpY2UudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL3V5ZS9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZSwka2F0ZWdvcmlsZXI7DQoJCQkJaWYgKEAkX1NFU1NJT05bImFkbWluIl0pIHsNCgkJCQkJCWlmICggJHNsdWcgPT0gIlsqOnNsdWddIikgew0KCQkJCQkJCSRzbHVnCT0JJF9HRVRbInNsdWciXTsNCgkJCQkJCX0NCgkJCQkJJHRpdGxlLj0JJ8OceWUgQmlsZ2lsZXJpJzsNCgkJCQkJJHV5ZWJpbGdpCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHV5ZWxlciBXSEVSRSB1c2VybmFtZT0/Iik7DQoJCQkJCSR1eWViaWxnaQktPiBleGVjdXRlKGFycmF5KCRzbHVnKSk7DQoJCQkJCSR1eWVzYXkJCT0JJHV5ZWJpbGdpLT5yb3dDb3VudCgpOw0KCQkJCQkkdXllYmlsZ2kJPQkkdXllYmlsZ2ktPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCgkJCQkJCQlpbmNsdWRlICd2aWV3cy8nLlNJVEVfVEVNQS4nL2FkbWluL2VkaXRfdXNlci52aWV3LnBocCc7DQoJCQkJfWVsc2V7DQoJCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbG9naW4udmlldycpKTsNCgkJCQl9DQoJCQkJZXhpdCgpOw0KCX0sJ2VkaXRfdXNlci52aWV3Jyk7DQoJJHJvdXRlci0+bWFwKCdHRVQnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvZGVzdGVrLXRhbGVwbGVyaScsIGZ1bmN0aW9uKCl7DQogICAgCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCQkJaWYgKEAkX1NFU1NJT05bImFkbWluIl0pIHsNCgkJCQkJJHRpdGxlLj0JJ0Rlc3RlayBUYWxlcGxlcmknOw0KCQkJCQkkdGFsZXBsZXIJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gZGVzdGVrX3RhbGVwbGVyIE9SREVSIEJZIGlkIERFU0MiKTsNCgkJCQkJJHRhbGVwbGVyLT4gZXhlY3V0ZShhcnJheSgpKTsNCgkJCQkJJHRhbGVwbGVyCT0JJHRhbGVwbGVyLT5mZXRjaEFsbChQRE86OkZFVENIX09CSik7DQoJCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvYWRtaW4vYWxsX3RpY2tldHMudmlldy5waHAnOw0KCQkJCX1lbHNlew0KCQkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ2FkbWluX2xvZ2luLnZpZXcnKSk7DQoJCQkJfQ0KCQkJCWV4aXQoKTsNCgl9LCdhZG1pbl90aWNrZXRzLnZpZXcnKTsNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy9kZXN0ZWstdGFsZXBsZXJpL2Jla2xleWVubGVyJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJCQlpZiAoQCRfU0VTU0lPTlsiYWRtaW4iXSkgew0KCQkJCQkkdGl0bGUuPQknRGVzdGVrIFRhbGVwbGVyaSc7DQoJCQkJCSR0YWxlcGxlcgk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBkZXN0ZWtfdGFsZXBsZXIgV0hFUkUgdGFsZXBfZHVydW09PyBPUkRFUiBCWSBpZCBERVNDIik7DQoJCQkJCSR0YWxlcGxlci0+IGV4ZWN1dGUoYXJyYXkoJ0HDp8SxaycpKTsNCgkJCQkJJHRhbGVwbGVyCT0JJHRhbGVwbGVyLT5mZXRjaEFsbChQRE86OkZFVENIX09CSik7DQoJCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvYWRtaW4vYWxsX3RpY2tldHMudmlldy5waHAnOw0KCQkJCX1lbHNlew0KCQkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ2xvZ2luLnZpZXcnKSk7DQoJCQkJfQ0KCQkJCWV4aXQoKTsNCgl9LCdhZG1pbl90aWNrZXRzX2Jla2xleWVubGVyLnZpZXcnKTsNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy9kZXN0ZWstdGFsZXBsZXJpL3lhbml0bGFubWlzJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJCQlpZiAoQCRfU0VTU0lPTlsiYWRtaW4iXSkgew0KCQkJCQkkdGl0bGUuPQknRGVzdGVrIFRhbGVwbGVyaSc7DQoJCQkJCSR0YWxlcGxlcgk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBkZXN0ZWtfdGFsZXBsZXIgV0hFUkUgdGFsZXBfZHVydW09PyBPUkRFUiBCWSBpZCBERVNDIik7DQoJCQkJCSR0YWxlcGxlci0+IGV4ZWN1dGUoYXJyYXkoJ1lhbsSxdGxhbmTEsScpKTsNCgkJCQkJJHRhbGVwbGVyCT0JJHRhbGVwbGVyLT5mZXRjaEFsbChQRE86OkZFVENIX09CSik7DQoJCQkJCWluY2x1ZGUgJ3ZpZXdzLycuU0lURV9URU1BLicvYWRtaW4vYWxsX3RpY2tldHMudmlldy5waHAnOw0KCQkJCX1lbHNlew0KCQkJCQl5b25sZW5kaXIoJHJvdXRlci0+Z2VuZXJhdGUoJ2FkbWluX2xvZ2luLnZpZXcnKSk7DQoJCQkJfQ0KCQkJCWV4aXQoKTsNCgl9LCdhZG1pbl90aWNrZXRzX3lhbml0bGFuZGkudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL2Rlc3Rlay10YWxlcGxlcmkva2FwYWxpJywgZnVuY3Rpb24oKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJCQlpZiAoQCRfU0VTU0lPTlsiYWRtaW4iXSkgew0KCQkJCQkkdGl0bGUuPQknRGVzdGVrIFRhbGVwbGVyaSc7DQoJCQkJCSR0YWxlcGxlcgk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBkZXN0ZWtfdGFsZXBsZXIgV0hFUkUgdGFsZXBfZHVydW09PyBPUkRFUiBCWSBpZCBERVNDIik7DQoJCQkJCSR0YWxlcGxlci0+IGV4ZWN1dGUoYXJyYXkoJ0thcGFsxLEnKSk7DQoJCQkJCSR0YWxlcGxlcgk9CSR0YWxlcGxlci0+ZmV0Y2hBbGwoUERPOjpGRVRDSF9PQkopOw0KCQkJCQlpbmNsdWRlICd2aWV3cy8nLlNJVEVfVEVNQS4nL2FkbWluL2FsbF90aWNrZXRzLnZpZXcucGhwJzsNCgkJCQl9ZWxzZXsNCgkJCQkJeW9ubGVuZGlyKCRyb3V0ZXItPmdlbmVyYXRlKCdhZG1pbl9sb2dpbi52aWV3JykpOw0KCQkJCX0NCgkJCQlleGl0KCk7DQoJfSwnYWRtaW5fdGlja2V0c19rYXBhbGkudmlldycpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL2Rlc3Rlay10YWxlcC9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCiAgICAJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJCQlpZiAoQCRfU0VTU0lPTlsiYWRtaW4iXSkgew0KCQkJCQkkdGl0bGUuPQknRGVzdGVrIFRhbGVwbGVyaSc7DQoJCQkJCSR0YWxlcAk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBkZXN0ZWtfdGFsZXBfY2V2YXAgV0hFUkUgdGFsZXBfaWQ9PyBPUkRFUiBCWSBpZCBBU0MiKTsNCgkJCQkJJHRhbGVwLT4gZXhlY3V0ZShhcnJheSgkc2x1ZykpOw0KCQkJCQkkdGFsZXAJPQkkdGFsZXAtPmZldGNoQWxsKFBETzo6RkVUQ0hfT0JKKTsNCgkJCQkJaW5jbHVkZSAndmlld3MvJy5TSVRFX1RFTUEuJy9hZG1pbi9yZWFkX3RpY2tldC52aWV3LnBocCc7DQoJCQkJfWVsc2V7DQoJCQkJCXlvbmxlbmRpcigkcm91dGVyLT5nZW5lcmF0ZSgnYWRtaW5fbG9naW4udmlldycpKTsNCgkJCQl9DQoJCQkJZXhpdCgpOw0KCX0sJ2FkbWluX3RpY2tldF9yZWFkLnZpZXcnKTsNCg0KDQoNCgkjIyBTTVMgWW9sbGEgIyMNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnL3RvcGx1LXNtcycsIGZ1bmN0aW9uKCl7DQoJCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCSRtZXNhagk9CSRfUE9TVFsic21zIl07DQoJCQl0b3BsdVNNUygkbWVzYWopOw0KCQkJZXhpdCgpOw0KCX0sJ3RvcGx1X3Ntcy5wb3N0Jyk7DQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy9zbXMteW9sbGEtWyo6c2x1Z10nLCBmdW5jdGlvbigkc2x1Zyl7DQoJCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCSR1eWVzb3IgPSAkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gdXllbGVyIFdIRVJFIHVzZXJuYW1lPT8iKTsNCgkJJHV5ZXNvci0+IGV4ZWN1dGUoYXJyYXkoJHNsdWcpKTsNCgkJJHV5ZXNvciA9ICR1eWVzb3ItPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCgkJJG1lc2FqCT0JJF9QT1NUWyJzbXMiXTsNCgkJCXV5ZXllU01TKCR1eWVzb3ItPnRlbGVmb24sJG1lc2FqKTsNCgkJCWV4aXQoKTsNCgl9LCdzZW5kX3Ntcy5wb3N0Jyk7DQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy95ZW5pLWtvZC15b2xsYScsIGZ1bmN0aW9uKCl7DQoJCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoNCgkJaWYgKCAkdXllLT5vbmF5ID09IDAgKSB7DQoJCQkkb25heXNvciA9ICR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBvbmF5X2tvZGxhcmkgV0hFUkUgb25heV9zYWhpYmk9PyIpOw0KCQkJJG9uYXlzb3ItPiBleGVjdXRlKGFycmF5KCR1eWUtPnVzZXJuYW1lKSk7DQoJCQkJaWYgKCAkb25heXNvci0+cm93Q291bnQoKSApIHsNCgkJCQkJJG9uYXlzb3IgPSAkb25heXNvci0+ZmV0Y2goUERPOjpGRVRDSF9PQkopOw0KCQkJCQkkdAkJCSA9IGRhdGUoIkhpIik7DQoJCQkJCSR0MgkJCT0gZGF0ZSgiSGkiLCBzdHJ0b3RpbWUoJG9uYXlzb3ItPm9uYXlfdGFyaWhpKSk7DQoJCQkJCQlpZiAoICR0LSR0MiA+IDMgKSB7DQoJCQkJCQkJdGVrcmFya29kU01TKCR1eWUtPnRlbGVmb24sJG9uYXlzb3ItPm9uYXlfa29kdSk7DQoJCQkJCQl9ZWxzZXsNCgkJCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJZZW5pIGtvZCBhbGFiaWxtZWsgacOnaW4gc29uIGtvZCBpc3RlbWVuaXppbiDDvHN0w7xuZGVuIDMgZGFraWthIGdlw6dtZWxpIiwicyI9PiJpbmZvIl07DQoJCQkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQkJCX0NCgkJCQl9ZWxzZXsNCgkJCQkJJHRhcmloCQk9CWRhdGUoIlktbS1kIEg6aTpzIik7DQoJCQkJCSRrb2QJCQk9IHJhbmQoMCw5KS5yYW5kKDAsOSkucmFuZCgwLDkpLnJhbmQoMCw5KS5yYW5kKDAsOSkucmFuZCgwLDkpOw0KCQkJCQkka29kZWtsZQk9CSR2dC0+cHJlcGFyZSgiSU5TRVJUIElOVE8gb25heV9rb2RsYXJpIFNFVCBvbmF5X3NhaGliaT0/LCBvbmF5X2tvZHU9Pywgb25heV90YXJpaGk9PyIpOw0KCQkJCQkka29kZWtsZS0+IGV4ZWN1dGUoYXJyYXkoJHV5ZS0+dXNlcm5hbWUsJGtvZCwkdGFyaWgpKTsNCgkJCQkJCWlmICgka29kZWtsZSkgew0KCQkJCQkJCXRla3JhcmtvZFNNUygkdXllLT50ZWxlZm9uLCRrb2QpOw0KCQkJCQkJfWVsc2V7DQoJCQkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhIiwibSI9PiJLb2QgZ8O2bmRlcmlsaXJrZW4gaGF0YSBvbHXFn3R1LiIsInMiPT4iZXJyb3IiXTsNCgkJCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCQkJfQ0KCQkJCX0NCgkJfWVsc2V7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJIZXNhYsSxbsSxeiB6YXRlbiBvbmF5bMSxLiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfQ0KCQlleGl0KCk7DQoJfSwnb25heV9rb2R1LmFnYWluLnBvc3QnKTsNCg0KCSMjIEFkbWluIFBPU1QgxLDFn2xlbWxlcmkgIyMNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLCBmdW5jdGlvbigpew0KCQlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQlpZiAoICEkX1NFU1NJT05bJ2FkbWluJ10gKSB7IGV4aXQ7IH0NCgkJJHNvemxlc21lCQkJCQk9CSRfUE9TVFsiY2tFZGl0b3IiXTsNCgkJJHNpdGVfdXJsCQkJCQk9CSRfUE9TVFsic2l0ZV91cmwiXTsNCgkJJHNpdGVfdGl0bGUJCQkJPQkkX1BPU1RbInNpdGVfdGl0bGUiXTsNCgkJJHNpdGVfZGVzY3JpcHRpb24JPQkkX1BPU1RbInNpdGVfZGVzY3JpcHRpb24iXTsNCgkJJHNpdGVfa2V5d29yZHMJCT0JJF9QT1NUWyJzaXRlX2tleXdvcmRzIl07DQoJCSRzaXRlX2FkbWluCQkJCT0JJF9QT1NUWyJzaXRlX2FkbWluIl07DQoJCSRzbXNfc2FnbGF5aWNpCQk9CSRfUE9TVFsic21zX3NhZ2xheWljaSJdOw0KCQkkc21zX2Jhc2xpawkJCQk9CSRfUE9TVFsic21zX2Jhc2xpayJdOw0KCQkkc21zX2thZGkJCQkJCT0JJF9QT1NUWyJzbXNfa2FkaSJdOw0KCQkkc21zX3NpZnJlCQkJCT0JJF9QT1NUWyJzbXNfc2lmcmUiXTsNCgkJJHNtc19vbmF5CQkJCQk9CSRfUE9TVFsic21zX29uYXkiXTsNCgkJJHBheXdhbnRfYWt0aWYJCT0JJF9QT1NUWyJwYXl3YW50X2FrdGlmIl07DQoJCSRwYXl3YW50X2FwaQkJCT0JJF9QT1NUWyJwYXl3YW50X2FwaSJdOw0KCQkkcGF5d2FudF9zZWNyZXQJCT0JJF9QT1NUWyJwYXl3YW50X3NlY3JldCJdOw0KCQkkbWVyY2hhbnRfaWQJCQk9CSRfUE9TVFsibWVyY2hhbnRfaWQiXTsNCgkJJG1lcmNoYW50X2tleQkJCT0JJF9QT1NUWyJtZXJjaGFudF9rZXkiXTsNCgkJJG1lcmNoYW50X3NhbHQJCT0JJF9QT1NUWyJtZXJjaGFudF9zYWx0Il07DQoJCSRvZGVtZV90aXBpCQkJCT0JJF9QT1NUWyJvZGVtZV90aXBpIl07DQoJCSRidXlwYXllcl9tYWdhemEJCQkJPQkkX1BPU1RbImJ1eXBheWVyX21hZ2F6YSJdOw0KCQkkYnV5cGF5ZXJfbWFpbAkJCQk9CSRfUE9TVFsiYnV5cGF5ZXJfbWFpbCJdOw0KCQkkYnV5cGF5ZXJfZ3V2ZW5saWsJCQkJPQkkX1BPU1RbImJ1eXBheWVyX2d1dmVubGlrIl07DQoNCgkJaWYgKCBlbXB0eSgkc2l0ZV91cmwpIHx8IGVtcHR5KCRzaXRlX3RpdGxlKSB8fCBlbXB0eSgkc2l0ZV9kZXNjcmlwdGlvbikgfHwgZW1wdHkoJHNpdGVfa2V5d29yZHMpICAgKSB7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJUw7xtIGFsYW5sYXLEsSBkb2xkdXJtYWzEsXPEsW7EsXouIiwicyI9PiJpbmZvIl07DQoJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQl9ZWxzZXsNCgkJCSRlZGl0CT0JJHZ0LT5wcmVwYXJlKCJVUERBVEUgc2l0ZWF5YXIgU0VUDQoJCQlidXlwYXllcl9tYWdhemE9PyxidXlwYXllcl9tYWlsPT8sYnV5cGF5ZXJfZ3V2ZW5saWs9PywNCgkJCW1lcmNoYW50X2lkPT8sbWVyY2hhbnRfa2V5PT8sbWVyY2hhbnRfc2FsdD0/LG9kZW1lX3RpcGk9Pyxzb3psZXNtZT0/LCBzaXRlX3VybD0/LCBzaXRlX3RpdGxlPT8sIHNpdGVfZGVzY3JpcHRpb249Pywgc2l0ZV9rZXl3b3Jkcz0/LCBzaXRlX2FkbWluPT8sIHBheXdhbnRfYWt0aWY9PywgcGF5d2FudF9hcGk9PywgcGF5d2FudF9zZWNyZXQ9Pywgc21zX3NhZ2xheWljaT0/LCBzbXNfYmFzbGlrPT8sIHNtc19rYWRpPT8sIHNtc19zaWZyZT0/LCBzbXNfb25heT0/IFdIRVJFIGlkPT8iKTsNCgkJCSRlZGl0LT4gZXhlY3V0ZShhcnJheSgkYnV5cGF5ZXJfbWFnYXphLCRidXlwYXllcl9tYWlsLCRidXlwYXllcl9ndXZlbmxpaywkbWVyY2hhbnRfaWQsJG1lcmNoYW50X2tleSwkbWVyY2hhbnRfc2FsdCwkb2RlbWVfdGlwaSwkc296bGVzbWUsJHNpdGVfdXJsLCRzaXRlX3RpdGxlLCRzaXRlX2Rlc2NyaXB0aW9uLCRzaXRlX2tleXdvcmRzLCRzaXRlX2FkbWluLCRwYXl3YW50X2FrdGlmLCRwYXl3YW50X2FwaSwkcGF5d2FudF9zZWNyZXQsJHNtc19zYWdsYXlpY2ksJHNtc19iYXNsaWssJHNtc19rYWRpLCRzbXNfc2lmcmUsJHNtc19vbmF5LDEpKTsNCgkJCQlpZiAoJGVkaXQpIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiJTaXN0ZW0gYmlsZ2lsZXJpIGfDvG5jZWxsZW5kaSwgecO2bmxlbmRpcmlsaXlvcnN1bnV6LiIsInMiPT4ic3VjY2VzcyIsInIiPT4kc2l0ZV9hZG1pbl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfWVsc2V7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iSGF0YSEiLCJtIj0+IlNpc3RlbSBiaWxnaWxlcmkgZ8O8bmNlbGxlbmlya2VuIGhhdGEgb2x1xZ90dS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfQ0KCQl9DQoJCWV4aXQoKTsNCgl9LCdhZG1pbl9tYWluLnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvdXllLXNpbC9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCgkJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJaWYgKCAhJF9TRVNTSU9OWydhZG1pbiddICkgeyBleGl0OyB9DQoJCQkkdXllY2VrCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHV5ZWxlciBXSEVSRSBpZD0/Iik7DQoJCQkkdXllY2VrLT4gZXhlY3V0ZShhcnJheSgkc2x1ZykpOw0KCQkJJHV5ZWNlawk9CSR1eWVjZWstPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCg0KCQkJJGRlbGV0ZQk9CSR2dC0+cHJlcGFyZSgiREVMRVRFIEZST00gdXllbGVyIFdIRVJFIGlkPT8iKTsNCgkJCSRkZWxldGUtPiBleGVjdXRlKGFycmF5KCRzbHVnKSk7DQoJCQkJaWYgKCRkZWxldGUpIHsNCg0KCQkJCQkkZGVsZXRlCT0JJHZ0LT5wcmVwYXJlKCJERUxFVEUgRlJPTSBzaXBhcmlzbGVyIFdIRVJFIHNpcGFyaXNfc2FoaWJpPT8iKTsNCgkJCQkJJGRlbGV0ZS0+IGV4ZWN1dGUoYXJyYXkoJHV5ZWNlay0+dXNlcm5hbWUpKTsNCgkJCQkJJGRlbGV0ZQk9CSR2dC0+cHJlcGFyZSgiREVMRVRFIEZST00gcGF5d2FudF9vZGVtZWxlciBXSEVSRSBvZGVtZV9zYWhpYmk9PyIpOw0KCQkJCQkkZGVsZXRlLT4gZXhlY3V0ZShhcnJheSgkdXllY2VrLT51c2VybmFtZSkpOw0KCQkJCQkkZGVsZXRlCT0JJHZ0LT5wcmVwYXJlKCJERUxFVEUgRlJPTSBmaXlhdGxhbmRpcm1hIFdIRVJFIGZpeWF0X3NhaGliaT0/Iik7DQoJCQkJCSRkZWxldGUtPiBleGVjdXRlKGFycmF5KCR1eWVjZWstPnVzZXJuYW1lKSk7DQoJCQkJCSRkZWxldGUJPQkkdnQtPnByZXBhcmUoIkRFTEVURSBGUk9NIGRlc3Rla190YWxlcGxlciBXSEVSRSB0YWxlcF9zYWhpYmk9PyIpOw0KCQkJCQkkZGVsZXRlLT4gZXhlY3V0ZShhcnJheSgkdXllY2VrLT51c2VybmFtZSkpOw0KCQkJCQkkZGVsZXRlCT0JJHZ0LT5wcmVwYXJlKCJERUxFVEUgRlJPTSBkZXN0ZWtfdGFsZXBfY2V2YXAgV0hFUkUgdGFsZXBfdXNlcj0/Iik7DQoJCQkJCSRkZWxldGUtPiBleGVjdXRlKGFycmF5KCR1eWVjZWstPnVzZXJuYW1lKSk7DQoJCQkJCSRkZWxldGUJPQkkdnQtPnByZXBhcmUoIkRFTEVURSBGUk9NIGJhbmthX29kZW1lbGVyIFdIRVJFIG9kZW1lX3NhaGliaT0/Iik7DQoJCQkJCSRkZWxldGUtPiBleGVjdXRlKGFycmF5KCR1eWVjZWstPnVzZXJuYW1lKSk7DQoNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiLDnHllIHNpc3RlbWRlbiBrYWxkxLFyxLFsZMSxLCB5w7ZubGVuZGlyaWxpeW9yc3VudXouIiwicyI9PiJzdWNjZXNzIiwiciI9PiRyb3V0ZXItPmdlbmVyYXRlKCJhbGxfdXNlcnMudmlldyIpXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9ZWxzZXsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhISIsIm0iPT4iw5x5ZSBrYWxkxLFyxLFya2VuIGhhdGEgb2x1xZ90dS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfQ0KCQkJCWV4aXQoKTsNCgl9LCdkZWxldGVfdXNlci5wb3N0Jyk7DQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL2hhYmVyLWR1emVubGUvWyo6c2x1Z10nLCBmdW5jdGlvbigkc2x1Zyl7DQoJCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCWlmICggISRfU0VTU0lPTlsnYWRtaW4nXSApIHsgZXhpdDsgfQ0KCQkJJGhhYmVyX2Jhc2xpawkJPQkkX1BPU1RbImhhYmVyX2Jhc2xpayJdOw0KCQkJJGhhYmVyX2ljZXJpawkJPQkkX1BPU1RbImhhYmVyX2ljZXJpayJdOw0KDQoJCQkJaWYgKCBlbXB0eSgkaGFiZXJfYmFzbGlrKSB8fCBlbXB0eSgkaGFiZXJfaWNlcmlrKSApIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iVMO8bSBhbGFubGFyxLEgZG9sZHVybWFsxLFzxLFuxLF6LiIsInMiPT4iaW5mbyJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX1lbHNlew0KCQkJCQkkZHV6ZWx0CT0JJHZ0LT5wcmVwYXJlKCJVUERBVEUgaGFiZXJsZXIgU0VUIGhhYmVyX2Jhc2xpaz0/LCBoYWJlcl9pY2VyaWs9PyBXSEVSRSBpZD0/Iik7DQoJCQkJCSRkdXplbHQtPiBleGVjdXRlKGFycmF5KCRoYWJlcl9iYXNsaWssJGhhYmVyX2ljZXJpaywkc2x1ZykpOw0KCQkJCQkJaWYgKCRkdXplbHQpIHsNCgkJCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+Ik3DvGtlbW1lbCEiLCJtIj0+IlllbmkgaGFiZXIgZMO8emVubGVuZGksIHnDtm5sZW5kaXJpbGl5b3JzdW51ei4iLCJzIj0+InN1Y2Nlc3MiLCJyIj0+JHJvdXRlci0+Z2VuZXJhdGUoImFkbWluX25ldy52aWV3IildOw0KCQkJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJCQl9ZWxzZXsNCgkJCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEhIiwibSI9PiJIYWJlciBkw7x6ZW5sZW5pcmtlbiBoYXRhIG9sdcWfdHUuIiwicyI9PiJlcnJvciJdOw0KCQkJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJCQl9DQoJCQkJfQ0KDQoJCQkJZXhpdCgpOw0KCX0sJ2FkbWluX25ld3MuZWRpdC5wb3N0Jyk7DQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL2hhYmVyLWVrbGUnLCBmdW5jdGlvbigpew0KCQlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQlpZiAoICEkX1NFU1NJT05bJ2FkbWluJ10gKSB7IGV4aXQ7IH0NCgkJCSRoYWJlcl9iYXNsaWsJCT0JJF9QT1NUWyJoYWJlcl9iYXNsaWsiXTsNCgkJCSRoYWJlcl9pY2VyaWsJCT0JJF9QT1NUWyJoYWJlcl9pY2VyaWsiXTsNCgkJCSR0YXJpaAkJCQkJPQlkYXRlKCJZLW0tZCBIOmk6cyIpOw0KDQoJCQkJaWYgKCBlbXB0eSgkaGFiZXJfYmFzbGlrKSB8fCBlbXB0eSgkaGFiZXJfaWNlcmlrKSApIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iVMO8bSBhbGFubGFyxLEgZG9sZHVybWFsxLFzxLFuxLF6LiIsInMiPT4iaW5mbyJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX1lbHNlew0KCQkJCQkkZWtsZQk9CSR2dC0+cHJlcGFyZSgiSU5TRVJUIElOVE8gaGFiZXJsZXIgU0VUIGhhYmVyX2Jhc2xpaz0/LCBoYWJlcl9pY2VyaWs9PywgaGFiZXJfdGFyaWg9PyIpOw0KCQkJCQkkZWtsZS0+IGV4ZWN1dGUoYXJyYXkoJGhhYmVyX2Jhc2xpaywkaGFiZXJfaWNlcmlrLCR0YXJpaCkpOw0KCQkJCQkJaWYgKCRla2xlKSB7DQoJCQkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiJZZW5pIGhhYmVyIGVrbGVuZGksIHnDtm5sZW5kaXJpbGl5b3JzdW51ei4iLCJzIj0+InN1Y2Nlc3MiLCJyIj0+JHJvdXRlci0+Z2VuZXJhdGUoImFkbWluX25ldy52aWV3IildOw0KCQkJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJCQl9ZWxzZXsNCgkJCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEhIiwibSI9PiJIYWJlciBla2xlbmlya2VuIGhhdGEgb2x1xZ90dS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQkJCX0NCgkJCQl9DQoNCgkJCQlleGl0KCk7DQoJfSwnYWRtaW5fbmV3cy5uZXcucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnUE9TVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy9oYWJlci1zaWwvWyo6c2x1Z10nLCBmdW5jdGlvbigkc2x1Zyl7DQoJCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCWlmICggISRfU0VTU0lPTlsnYWRtaW4nXSApIHsgZXhpdDsgfQ0KCQkJJGRlbGV0ZQk9CSR2dC0+cHJlcGFyZSgiREVMRVRFIEZST00gaGFiZXJsZXIgV0hFUkUgaWQ9PyIpOw0KCQkJJGRlbGV0ZS0+IGV4ZWN1dGUoYXJyYXkoJHNsdWcpKTsNCgkJCQlpZiAoJGRlbGV0ZSkgew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+Ik3DvGtlbW1lbCEiLCJtIj0+IkhhYmVyIHNpc3RlbWRlbiBrYWxkxLFyxLFsZMSxLCB5w7ZubGVuZGlyaWxpeW9yc3VudXouIiwicyI9PiJzdWNjZXNzIiwiciI9PiRyb3V0ZXItPmdlbmVyYXRlKCJhZG1pbl9uZXcudmlldyIpXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9ZWxzZXsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhISIsIm0iPT4iSGFiZXIga2FsZMSxcsSxbMSxcmtlbiBoYXRhIG9sdcWfdHUuIiwicyI9PiJlcnJvciJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX0NCg0KCQkJCWV4aXQoKTsNCgl9LCdhZG1pbl9uZXdzLmRlbGV0ZS5wb3N0Jyk7DQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL29kZW1lLWR1emVubGUvWyo6c2x1Z10nLCBmdW5jdGlvbigkc2x1Zyl7DQoJCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCWlmICggISRfU0VTU0lPTlsnYWRtaW4nXSApIHsgZXhpdDsgfQ0KCQkkb2RlbWVfZHVydW0JCQkJPQkkX1BPU1RbIm9kZW1lX2R1cnVtIl07DQoNCgkJJG9kZW1lCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIGJhbmthX29kZW1lbGVyIFdIRVJFIGlkPT8iKTsNCgkJJG9kZW1lLT4gZXhlY3V0ZShhcnJheSgkc2x1ZykpOw0KCQkkb2RlbWUJPQkkb2RlbWUtPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCg0KCQkkc2FoaXAJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gdXllbGVyIFdIRVJFIHVzZXJuYW1lPT8iKTsNCgkJJHNhaGlwLT4gZXhlY3V0ZShhcnJheSgkb2RlbWUtPm9kZW1lX3NhaGliaSkpOw0KCQkkc2FoaXAJPQkkc2FoaXAtPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCg0KCQlpZiAoICRvZGVtZS0+b2RlbmRpbWkgPT0gMCAgJiYgJG9kZW1lX2R1cnVtID09ICdPbmF5bGFuZMSxJyApIHsNCgkJCSRiYWtpeWUJPQkkdnQtPnByZXBhcmUoIlVQREFURSB1eWVsZXIgU0VUIGJha2l5ZT0/IFdIRVJFIHVzZXJuYW1lPT8iKTsNCgkJCSRiYWtpeWUtPiBleGVjdXRlKGFycmF5KCRzYWhpcC0+YmFraXllKyRvZGVtZS0+b2RlbWVfdHV0YXIsJG9kZW1lLT5vZGVtZV9zYWhpYmkpKTsNCgkJCSRvZGVuZGkgPSAkdnQtPnByZXBhcmUoIlVQREFURSBiYW5rYV9vZGVtZWxlciBTRVQgb2RlbmRpbWk9PyBXSEVSRSBpZD0/Iik7DQoJCQkkb2RlbmRpLT4gZXhlY3V0ZShhcnJheSgxLCRzbHVnKSk7DQoJCQkkdGFyaWggID0gZGF0ZSgiWS5tLmQgSDppOnMiKTsNCgkJCSRrYXphbmMJCT0JCSR2dC0+cHJlcGFyZSgiSU5TRVJUIElOVE8gYmFraXllX2themFuYyBTRVQgdHV0YXI9PywgdGFyaWg9PyIpOw0KCQkJJGthemFuYwkJLT4JZXhlY3V0ZShhcnJheSgkb2RlbWUtPm9kZW1lX3R1dGFyLCR0YXJpaCkpOw0KCQl9DQoNCgkJaWYgKCBlbXB0eSgkb2RlbWVfZHVydW0pICkgew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iVMO8bSBhbGFubGFyxLEgZG9sZHVybWFsxLFzxLFuxLF6LiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2V7DQoJCQkkZHV6ZWx0CT0JJHZ0LT5wcmVwYXJlKCJVUERBVEUgYmFua2Ffb2RlbWVsZXIgU0VUIG9kZW1lX2R1cnVtPT8gIFdIRVJFIGlkPT8iKTsNCgkJCSRkdXplbHQtPiBleGVjdXRlKGFycmF5KCRvZGVtZV9kdXJ1bSwkc2x1ZykpOw0KCQkJCWlmICgkZHV6ZWx0KSB7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iTcO8a2VtbWVsISIsIm0iPT4iw5ZkZW1lIGTDvHplbmxlbmRpLCB5w7ZubGVuZGlyaWxpeW9yc3VudXouIiwicyI9PiJzdWNjZXNzIiwiciI9PiRyb3V0ZXItPmdlbmVyYXRlKCJhZG1pbl9vZGVtZWxlci52aWV3IildOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX1lbHNlew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEhIiwibSI9PiLDlmRlbWUgZ8O8bmNlbGxlbmlya2VuIGhhdGEgb2x1xZ90dS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfQ0KCQl9DQoJCWV4aXQoKTsNCgl9LCdhZG1pbl9vZGVtZS5lZGl0LnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvYmFua2EtaGVzYXAtZWtsZScsIGZ1bmN0aW9uKCl7DQoJCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCWlmICggISRfU0VTU0lPTlsnYWRtaW4nXSApIHsgZXhpdDsgfQ0KCQkkYWQJCQkJPQkkX1BPU1RbImFkIl07DQoJCSRpYmFuCQkJPQkkX1BPU1RbImliYW4iXTsNCgkJJGhlc2FwCQk9CSRfUE9TVFsiaGVzYXAiXTsNCgkJJHN1YmUJCQk9CSRfUE9TVFsic3ViZSJdOw0KCQkkYWxpY2kJCT0JJF9QT1NUWyJhbGljaSJdOw0KCQkkbG9nbwkJCT0JJF9QT1NUWyJsb2dvIl07DQoNCgkJaWYgKCBlbXB0eSgkYWQpIHx8IGVtcHR5KCRpYmFuKSB8fCBlbXB0eSgkYWxpY2kpIHx8IGVtcHR5KCRsb2dvKSApIHsNCgkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IlTDvG0gYWxhbmxhcsSxIGRvbGR1cm1hbMSxc8SxbsSxei4iLCJzIj0+ImluZm8iXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX1lbHNlew0KCQkJJGVrbGUJPQkkdnQtPnByZXBhcmUoIklOU0VSVCBJTlRPIGJhbmthX2hlc2FwbGFyaSBTRVQgYmFua2FfYWQ9PywgYmFua2FfaWJhbj0/LCBiYW5rYV9oZXNhcG5vPT8sIGJhbmthX3N1YmU9PywgYmFua2FfYWxpY2k9PywgYmFua2FfbG9nbz0/Iik7DQoJCQkkZWtsZS0+IGV4ZWN1dGUoYXJyYXkoJGFkLCRpYmFuLCRoZXNhcCwkc3ViZSwkYWxpY2ksJGxvZ28pKTsNCgkJCQlpZiAoJGVrbGUpIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiJCYW5rYSBiaWxnaWxlcmkgZWtsZW5kaSwgecO2bmxlbmRpcmlsaXlvcnN1bnV6LiIsInMiPT4ic3VjY2VzcyIsInIiPT4kcm91dGVyLT5nZW5lcmF0ZSgiYmFua19hY2NvdW50cy52aWV3IildOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX1lbHNlew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEhIiwibSI9PiJCYW5rYSBiaWxnaWxlcmkgZWtsZW5pcmtlbiBoYXRhIG9sdcWfdHUuIiwicyI9PiJlcnJvciJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX0NCgkJfQ0KCQlleGl0KCk7DQoJfSwnYmFua19hY2NvdW50Lm5ldy5wb3N0Jyk7DQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL2JhbmthLWhlc2FwL1sqOnNsdWddJywgZnVuY3Rpb24oJHNsdWcpew0KCQlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQlpZiAoICEkX1NFU1NJT05bJ2FkbWluJ10gKSB7IGV4aXQ7IH0NCgkJJGFkCQkJCT0JJF9QT1NUWyJhZCJdOw0KCQkkaWJhbgkJCT0JJF9QT1NUWyJpYmFuIl07DQoJCSRoZXNhcAkJPQkkX1BPU1RbImhlc2FwIl07DQoJCSRzdWJlCQkJPQkkX1BPU1RbInN1YmUiXTsNCgkJJGFsaWNpCQk9CSRfUE9TVFsiYWxpY2kiXTsNCgkJJGxvZ28JCQk9CSRfUE9TVFsibG9nbyJdOw0KDQoJCWlmICggZW1wdHkoJGFkKSB8fCBlbXB0eSgkaWJhbikgfHwgZW1wdHkoJGFsaWNpKSB8fCBlbXB0eSgkbG9nbykgKSB7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJUw7xtIGFsYW5sYXLEsSBkb2xkdXJtYWzEsXPEsW7EsXouIiwicyI9PiJpbmZvIl07DQoJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQl9ZWxzZXsNCgkJCSRkdXplbHQJPQkkdnQtPnByZXBhcmUoIlVQREFURSBiYW5rYV9oZXNhcGxhcmkgU0VUIGJhbmthX2FkPT8sIGJhbmthX2liYW49PywgYmFua2FfaGVzYXBubz0/LCBiYW5rYV9zdWJlPT8sIGJhbmthX2FsaWNpPT8sIGJhbmthX2xvZ289PyAgV0hFUkUgaWQ9PyIpOw0KCQkJJGR1emVsdC0+IGV4ZWN1dGUoYXJyYXkoJGFkLCRpYmFuLCRoZXNhcCwkc3ViZSwkYWxpY2ksJGxvZ28sJHNsdWcpKTsNCgkJCQlpZiAoJGR1emVsdCkgew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+Ik3DvGtlbW1lbCEiLCJtIj0+IkJhbmthIGJpbGdpbGVyaSBkw7x6ZW5sZW5kaSwgecO2bmxlbmRpcmlsaXlvcnN1bnV6LiIsInMiPT4ic3VjY2VzcyIsInIiPT4kcm91dGVyLT5nZW5lcmF0ZSgiYmFua19hY2NvdW50cy52aWV3IildOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX1lbHNlew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEhIiwibSI9PiJCYW5rYSBiaWxnaWxlcmkgZ8O8bmNlbGxlbmlya2VuIGhhdGEgb2x1xZ90dS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfQ0KCQl9DQoJCWV4aXQoKTsNCgl9LCdiYW5rX2FjY291bnQuZWRpdC5wb3N0Jyk7DQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL2JhbmthLWhlc2FwLXNpbC9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCgkJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJaWYgKCAhJF9TRVNTSU9OWydhZG1pbiddICkgeyBleGl0OyB9DQoJCQkkZHV6ZWx0CT0JJHZ0LT5wcmVwYXJlKCJVUERBVEUgYmFua2FfaGVzYXBsYXJpIFNFVCBiYW5rYV9kdXJ1bT0/ICBXSEVSRSBpZD0/Iik7DQoJCQkkZHV6ZWx0LT4gZXhlY3V0ZShhcnJheSgnMCcsJHNsdWcpKTsNCgkJCQlpZiAoJGR1emVsdCkgew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+Ik3DvGtlbW1lbCEiLCJtIj0+IkJhbmthIGJpbGdpbGVyaSBzaXN0ZW1kZW4ga2FsZMSxcsSxbGTEsSwgecO2bmxlbmRpcmlsaXlvcnN1bnV6LiIsInMiPT4ic3VjY2VzcyIsInIiPT4kcm91dGVyLT5nZW5lcmF0ZSgiYmFua19hY2NvdW50cy52aWV3IildOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX1lbHNlew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEhIiwibSI9PiJCYW5rYSBiaWxnaWxlcmkga2FsZMSxcsSxbMSxcmtlbiBoYXRhIG9sdcWfdHUuIiwicyI9PiJlcnJvciJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX0NCg0KCQkJCWV4aXQoKTsNCgl9LCdiYW5rX2FjY291bnQuZGVsZXRlLnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvc2lwYXJpcy1kdXplbmxlL1sqOnNsdWddJywgZnVuY3Rpb24oJHNsdWcpew0KCQlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQlpZiAoICEkX1NFU1NJT05bJ2FkbWluJ10gKSB7IGV4aXQ7IH0NCgkJJGR1cnVtCQk9CSRfUE9TVFsiZHVydW0iXTsNCg0KCQkkc29yCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHNpcGFyaXNsZXIgV0hFUkUgaWQ9PyAiKTsNCgkJJHNvcgktPiBleGVjdXRlKGFycmF5KCRzbHVnKSk7DQoJCSRzb3IJPQkkc29yLT5mZXRjaChQRE86OkZFVENIX09CSik7DQoNCg0KDQoJCWlmICggZW1wdHkoJGR1cnVtKSApIHsNCgkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IlTDvG0gYWxhbmxhcsSxIGRvbGR1cm1hbMSxc8SxbsSxei4iLCJzIj0+ImluZm8iXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX1lbHNlew0KCQkJJGluc2VydAk9CSR2dC0+cHJlcGFyZSgiVVBEQVRFIHNpcGFyaXNsZXIgU0VUIHNpcGFyaXNfZHVydW09PyBXSEVSRSBpZD0/Iik7DQoJCQkkaW5zZXJ0LT4gZXhlY3V0ZShhcnJheSgkZHVydW0sJHNsdWcpKTsNCgkJCQlpZiAoJGluc2VydCkgew0KCQkJCQlpZiAoICRzb3ItPnNpcGFyaXNfZHVydW0hPSLEsHB0YWwiICYmICRkdXJ1bSA9PSAixLBwdGFsIiApIHsNCgkJCQkJCSR1eWVzb3IJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gdXllbGVyIFdIRVJFIHVzZXJuYW1lPT8gIik7DQoJCQkJCQkkdXllc29yCS0+IGV4ZWN1dGUoYXJyYXkoJHNvci0+c2lwYXJpc19zYWhpYmkpKTsNCgkJCQkJCSR1eWVzb3IJPQkkdXllc29yLT5mZXRjaChQRE86OkZFVENIX09CSik7DQoJCQkJCQkkYmFraXllCT0JJHV5ZXNvci0+YmFraXllKyRzb3ItPnNpcGFyaXNfdHV0YXI7DQoJCQkJCQkkdXBkYXRlCT0JJHZ0LT5wcmVwYXJlKCJVUERBVEUgdXllbGVyIFNFVCBiYWtpeWU9PyBXSEVSRSB1c2VybmFtZT0/Iik7DQoJCQkJCQkkdXBkYXRlLT4gZXhlY3V0ZShhcnJheSgkYmFraXllLCRzb3ItPnNpcGFyaXNfc2FoaWJpKSk7DQoJCQkJCX0NCgkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiJTaXBhcmnFnyBiYcWfYXLEsXlsYSBnw7xuY2VsbGVuZGlyLCB5w7ZubGVuZGlyaWxpeW9yc3VudXouIiwicyI9PiJzdWNjZXNzIiwiciI9PiRyb3V0ZXItPmdlbmVyYXRlKCJhZG1pbl9vcmRlcnMudmlldyIpXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9ZWxzZXsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhISIsIm0iPT4iU2lwYXJpxZ8gZ8O8bmNlbGxlbmlya2VuIGhhdGEgb2x1xZ90dS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfQ0KCQl9DQoJCWV4aXQoKTsNCgl9LCdhZG1pbl9vcmRlcl9lZGl0LnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvYXBpLW9sdXN0dXInLCBmdW5jdGlvbigpew0KCQlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQlpZiAoICEkX1NFU1NJT05bJ2FkbWluJ10gKSB7IGV4aXQ7IH0NCgkJJGFkCQk9CSRfUE9TVFsiYWRpIl07DQoJCSR1cmwJPQkkX1BPU1RbInVybCJdOw0KCQkkYXBpCT0JJF9QT1NUWyJhcGkiXTsNCgkJJHRyY2gJPQkkX1BPU1RbImFwaV90ZXJjaWgiXTsNCg0KCQkkc29yCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIGFwaSBXSEVSRSBhcGlfdXJsPT8gIik7DQoJCSRzb3IJLT4gZXhlY3V0ZShhcnJheSgkdXJsKSk7DQoNCgkJaWYgKCBlbXB0eSgkYWQpIHx8IGVtcHR5KCR1cmwpIHx8IGVtcHR5KCRhcGkpIHx8IGVtcHR5KCR0cmNoKSkgew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iVMO8bSBhbGFubGFyxLEgZG9sZHVybWFsxLFzxLFuxLF6LiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2VpZiggJHNvci0+cm93Q291bnQoKSAgKXsNCgkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IkJ1IEFQSSBVUkwnaSBzaXN0ZW1kZSB6YXRlbiBrYXnEsXRsxLEuIiwicyI9PiJpbmZvIl07DQoJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQl9ZWxzZXsNCgkJCSRpbnNlcnQJPQkkdnQtPnByZXBhcmUoIklOU0VSVCBJTlRPIGFwaSBTRVQgYXBpX2FkaT0/LCBhcGlfdXJsPT8sIGFwaV9hcGk9PywgYXBpX3RlcmNpaD0/Iik7DQoJCQkkaW5zZXJ0LT4gZXhlY3V0ZShhcnJheSgkYWQsJHVybCwkYXBpLCR0cmNoKSk7DQoJCQkJaWYgKCRpbnNlcnQpIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiJBUEkgc2lzdGVtZSBiYcWfYXLEsXlsYSBla2xlbmRpLCB5w7ZubGVuZGlyaWxpeW9yc3VudXouIiwicyI9PiJzdWNjZXNzIiwiciI9PiRyb3V0ZXItPmdlbmVyYXRlKCJhcGkudmlldyIpXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9ZWxzZXsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhISIsIm0iPT4iQVBJIHNpc3RlbWUgZWtsZW5pcmtlbiBoYXRhIG9sdcWfdHUuIiwicyI9PiJlcnJvciJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX0NCgkJfQ0KCQlleGl0KCk7DQoJfSwnbmV3X2FwaS5wb3N0Jyk7DQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL2FwaS1kdXplbmxlL1sqOnNsdWddJywgZnVuY3Rpb24oJHNsdWcpew0KCQlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQlpZiAoICEkX1NFU1NJT05bJ2FkbWluJ10gKSB7IGV4aXQ7IH0NCgkJJGFkCQk9CSRfUE9TVFsiYWRpIl07DQoJCSR1cmwJPQkkX1BPU1RbInVybCJdOw0KCQkkYXBpCT0JJF9QT1NUWyJhcGkiXTsNCgkJJHRyY2gJPQkkX1BPU1RbImFwaV90ZXJjaWgiXTsNCg0KCQkkc29yCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIGFwaSBXSEVSRSBhcGlfdXJsPT8gJiYgaWQhPT8gIik7DQoJCSRzb3IJLT4gZXhlY3V0ZShhcnJheSgkdXJsLCRzbHVnKSk7DQoNCgkJaWYgKCBlbXB0eSgkYWQpIHx8IGVtcHR5KCR1cmwpIHx8IGVtcHR5KCRhcGkpIHx8IGVtcHR5KCR0cmNoKSApIHsNCgkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IlTDvG0gYWxhbmxhcsSxIGRvbGR1cm1hbMSxc8SxbsSxei4iLCJzIj0+ImluZm8iXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX1lbHNlaWYoICRzb3ItPnJvd0NvdW50KCkgICl7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJCdSBBUEkgVVJMJ2kgc2lzdGVtZGUgemF0ZW4ga2F5xLF0bMSxLiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2V7DQoJCQkkdXBkYXRlCT0JJHZ0LT5wcmVwYXJlKCJVUERBVEUgYXBpIFNFVCBhcGlfYWRpPT8sIGFwaV91cmw9PywgYXBpX2FwaT0/LCBhcGlfdGVyY2loPT8gV0hFUkUgaWQ9PyIpOw0KCQkJJHVwZGF0ZS0+IGV4ZWN1dGUoYXJyYXkoJGFkLCR1cmwsJGFwaSwkdHJjaCwkc2x1ZykpOw0KCQkJCWlmICgkdXBkYXRlKSB7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iTcO8a2VtbWVsISIsIm0iPT4iQVBJIGJpbGdpbGVyaW5peiBkw7x6ZW5sZW5kaSwgecO2bmxlbmRpcmlsaXlvcnN1bnV6LiIsInMiPT4ic3VjY2VzcyIsInIiPT4kcm91dGVyLT5nZW5lcmF0ZSgiYXBpLnZpZXciKV07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfWVsc2V7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iSGF0YSEiLCJtIj0+IkFQSSBiaWxnaWxlcmkgZMO8emVubGVuaXJrZW4gaGF0YSBvbHXFn3R1LiIsInMiPT4iZXJyb3IiXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9DQoJCX0NCgkJZXhpdCgpOw0KCX0sJ2VkaXRfYXBpLnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvYXBpLXNpbC9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCgkJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJaWYgKCAhJF9TRVNTSU9OWydhZG1pbiddICkgeyBleGl0OyB9DQoJCQkkZGVsZXRlCT0JJHZ0LT5wcmVwYXJlKCJERUxFVEUgRlJPTSBhcGkgV0hFUkUgaWQ9PyIpOw0KCQkJJGRlbGV0ZS0+IGV4ZWN1dGUoYXJyYXkoJHNsdWcpKTsNCgkJCQlpZiAoJGRlbGV0ZSkgew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+Ik3DvGtlbW1lbCEiLCJtIj0+IkFQSSBzZXJ2aXNpIGthbGTEsXLEsWxkxLEsIHnDtm5sZW5kaXJpbGl5b3JzdW51ei4iLCJzIj0+InN1Y2Nlc3MiLCJyIj0+JHJvdXRlci0+Z2VuZXJhdGUoImFwaS52aWV3IildOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX1lbHNlew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEhIiwibSI9PiJBUEkgc2VydmlzaW5pIGthbGTEsXLEsXJrZW4gaGF0YSBvbHXFn3R1LiIsInMiPT4iZXJyb3IiXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9DQoJCQkJZXhpdCgpOw0KCX0sJ2RlbGV0ZV9hcGkucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnUE9TVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy9rYXRlZ29yaS1vbHVzdHVyJywgZnVuY3Rpb24oKXsNCgkJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJaWYgKCAhJF9TRVNTSU9OWydhZG1pbiddICkgeyBleGl0OyB9DQoJCSRhZAkJPQkkX1BPU1RbImFkaSJdOw0KCQkkc2lyYSA9ICRfUE9TVFsic2lyYSJdOw0KDQoJCSRzb3IJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00ga2F0ZWdvcmlsZXIgV0hFUkUga2F0ZWdvcmlfYWRpPT8gIik7DQoJCSRzb3IJLT4gZXhlY3V0ZShhcnJheSgkYWQpKTsNCg0KCQlpZiAoIGVtcHR5KCRhZCkgKSB7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJUw7xtIGFsYW5sYXLEsSBkb2xkdXJtYWzEsXPEsW7EsXouIiwicyI9PiJpbmZvIl07DQoJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQl9ZWxzZWlmKCAkc29yLT5yb3dDb3VudCgpICApew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iQnUga2F0ZWdvcmkgemF0ZW4gc2lzdGVtZGUga2F5xLF0bMSxLiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2V7DQoJCQkkaW5zZXJ0CT0JJHZ0LT5wcmVwYXJlKCJJTlNFUlQgSU5UTyBrYXRlZ29yaWxlciBTRVQga2F0ZWdvcmlfYWRpPT8sIHNpcmE9PyIpOw0KCQkJJGluc2VydC0+IGV4ZWN1dGUoYXJyYXkoJGFkLCRzaXJhKSk7DQoJCQkJaWYgKCRpbnNlcnQpIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiJLYXRlZ29yaSBiYcWfYXLEsXlsYSBla2xlbmRpLCB5w7ZubGVuZGlyaWxpeW9yc3VudXouIiwicyI9PiJzdWNjZXNzIiwiciI9PiRyb3V0ZXItPmdlbmVyYXRlKCJhbGxfY2F0ZWdvcmllcy52aWV3IildOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX1lbHNlew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEhIiwibSI9PiJLYXRlZ29yaSBzaXN0ZW1lIGVrbGVuaXJrZW4gaGF0YSBvbHXFn3R1LiIsInMiPT4iZXJyb3IiXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9DQoJCX0NCgkJZXhpdCgpOw0KCX0sJ25ld19jYXRlZ29yeS5wb3N0Jyk7DQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL2thdGVnb3JpLXNpbC9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCgkJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJaWYgKCAhJF9TRVNTSU9OWydhZG1pbiddICkgeyBleGl0OyB9DQoJCQkkZGVsZXRlCT0JJHZ0LT5wcmVwYXJlKCJERUxFVEUgRlJPTSBrYXRlZ29yaWxlciBXSEVSRSBpZD0/Iik7DQoJCQkkZGVsZXRlLT4gZXhlY3V0ZShhcnJheSgkc2x1ZykpOw0KCQkJCWlmICgkZGVsZXRlKSB7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iTcO8a2VtbWVsISIsIm0iPT4iS2F0ZWdvcmkga2FsZMSxcsSxbGTEsSwgecO2bmxlbmRpcmlsaXlvcnN1bnV6LiIsInMiPT4ic3VjY2VzcyIsInIiPT4kcm91dGVyLT5nZW5lcmF0ZSgiYWxsX2NhdGVnb3JpZXMudmlldyIpXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9ZWxzZXsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhISIsIm0iPT4iS2F0ZWdvcmkga2FsZMSxcsSxcmtlbiBoYXRhIG9sdcWfdHUuIiwicyI9PiJlcnJvciJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX0NCgkJCQlleGl0KCk7DQoJfSwnZGVsZXRlX2NhdGVnb3J5LnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicva2F0ZWdvcmktZHVydW0vWyo6c2x1Z10nLCBmdW5jdGlvbigkc2x1Zyl7DQoJCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCWlmICggISRfU0VTU0lPTlsnYWRtaW4nXSApIHsgZXhpdDsgfQ0KCQkJJGthdAk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBrYXRlZ29yaWxlciBXSEVSRSBpZD0/Iik7DQoJCQkka2F0LT4gZXhlY3V0ZShhcnJheSgkc2x1ZykpOw0KCQkJJGthdAk9CSRrYXQtPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCgkJCQlpZiAoICRrYXQtPmR1cnVtID09IDEgKSB7DQoJCQkJCSRkdXJ1bSA9IDAgOw0KCQkJCQkkZXRraSAgPSAncGFzaWYnOw0KCQkJCX1lbHNlew0KCQkJCQkkZHVydW0gPSAxIDsNCgkJCQkJJGV0a2kgID0gJ2FrdGlmJzsNCgkJCQl9DQoJCQkkZWRpdAk9CSR2dC0+cHJlcGFyZSgiVVBEQVRFIGthdGVnb3JpbGVyIFNFVCBkdXJ1bT0/IFdIRVJFIGlkPT8iKTsNCgkJCSRlZGl0LT4gZXhlY3V0ZShhcnJheSgkZHVydW0sJHNsdWcpKTsNCgkJCQlpZiAoJGVkaXQpIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiJLYXRlZ29yaSAiLiRldGtpLiJsZcWfdGlyaWxkaSwgecO2bmxlbmRpcmlsaXlvcnN1bnV6LiIsInMiPT4ic3VjY2VzcyIsInIiPT4kcm91dGVyLT5nZW5lcmF0ZSgiYWxsX2NhdGVnb3JpZXMudmlldyIpXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9ZWxzZXsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhISIsIm0iPT4iS2F0ZWdvcmkgIi4kZXRraS4ibGXFn3RpcmlsaXJrZW4gaGF0YSBvbHXFn3R1LiIsInMiPT4iZXJyb3IiXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9DQoJCQkJZXhpdCgpOw0KCX0sJ3Bhc2lmX2NhdGVnb3J5LnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicva2F0ZWdvcmktZHV6ZW5sZS9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCgkJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJaWYgKCAhJF9TRVNTSU9OWydhZG1pbiddICkgeyBleGl0OyB9DQoJCSRhZAkJPQkkX1BPU1RbImFkaSJdOw0KCQkkc2lyYSA9ICRfUE9TVFsic2lyYSJdOw0KDQoJCSRzb3IJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00ga2F0ZWdvcmlsZXIgV0hFUkUga2F0ZWdvcmlfYWRpPT8gJiYgaWQhPT8gIik7DQoJCSRzb3IJLT4gZXhlY3V0ZShhcnJheSgkYWQsJHNsdWcpKTsNCgkJJHNvcjIJPQkkdnQtPnF1ZXJ5KCJTRUxFQ1QgKiBGUk9NIGthdGVnb3JpbGVyIFdIRVJFIGlkPSckc2x1ZycgIiktPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCgkJaWYgKCBlbXB0eSgkYWQpICkgew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iVMO8bSBhbGFubGFyxLEgZG9sZHVybWFsxLFzxLFuxLF6LiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2VpZiggJHNvci0+cm93Q291bnQoKSAgKXsNCgkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IkJ1IGthdGVnb3JpIHNpc3RlbWRlIHphdGVuIGthecSxdGzEsS4iLCJzIj0+ImluZm8iXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX1lbHNlew0KCQkJJHVwZGF0ZQk9CSR2dC0+cHJlcGFyZSgiVVBEQVRFIGthdGVnb3JpbGVyIFNFVCBrYXRlZ29yaV9hZGk9Pywgc2lyYT0/IFdIRVJFIGlkPT8iKTsNCgkJCSR1cGRhdGUtPiBleGVjdXRlKGFycmF5KCRhZCwkc2lyYSwkc2x1ZykpOw0KCQkJCWlmICgkdXBkYXRlKSB7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iTcO8a2VtbWVsISIsIm0iPT4iS2F0ZWdvcmkgYmlsZ2lsZXJpbml6IGTDvHplbmxlbmRpLCB5w7ZubGVuZGlyaWxpeW9yc3VudXouIiwicyI9PiJzdWNjZXNzIiwiciI9PiRyb3V0ZXItPmdlbmVyYXRlKCJhbGxfY2F0ZWdvcmllcy52aWV3IildOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX1lbHNlew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEhIiwibSI9PiJLYXRlZ29yaSBiaWxnaWxlcmkgZMO8emVubGVuaXJrZW4gaGF0YSBvbHXFn3R1LiIsInMiPT4iZXJyb3IiXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9DQoJCX0NCgkJZXhpdCgpOw0KCX0sJ2VkaXRfY2F0ZWdvcnkucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnUE9TVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy95ZW5pLXVydW4nLCBmdW5jdGlvbigpew0KCQlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQlpZiAoICEkX1NFU1NJT05bJ2FkbWluJ10gKSB7IGV4aXQ7IH0NCgkJJGFwaV9zZXJ2aXMJPQkkX1BPU1RbImFwaV9zZXJ2aXMiXTsNCgkJJGFjaWtsYW1hCQk9CSRfUE9TVFsiYWNpa2xhbWEiXTsNCgkJJGthdGVnb3JpCQk9CSRfUE9TVFsia2F0ZWdvcmkiXTsNCgkJJGZpeWF0CQkJPQkkX1BPU1RbImZpeWF0Il07DQoJCUAkYmlyaW0JCQk9ICRmaXlhdC8xMDAwOw0KCQkkdXJsCQkJCT0JJF9QT1NUWyJiYWdsYW50aSJdOw0KCQkkbWluCQkJCT0JJF9QT1NUWyJtaW4iXTsNCgkJJG1hawkJCQk9CSRfUE9TVFsibWFrIl07DQoJCSRhcGkJCQkJPQkkX1BPU1RbImFwaSJdOw0KCQkkYWQJCQkJCT0JJF9QT1NUWyJhZGkiXTsNCg0KDQoJCSRzb3IJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gdXJ1bmxlciBXSEVSRSB1cnVuX2FwaT0/ICYmIHVydW5fYXBpX3NlcnZpcz0/IFdIRVJFIGR1cnVtPScxJyAiKTsNCgkJJHNvcgktPiBleGVjdXRlKGFycmF5KCRhcGksJGFwaV9zZXJ2aXMpKTsNCg0KCQlpZiAoIGVtcHR5KCRhZCkgfHwgZW1wdHkoJGFwaSkgfHwgZW1wdHkoJG1haykgfHwgZW1wdHkoJG1pbikgfHwgZW1wdHkoJHVybCkJfHwgZW1wdHkoJGZpeWF0KQl8fCBlbXB0eSgka2F0ZWdvcmkpCXx8IGVtcHR5KCRhcGlfc2VydmlzKSAgICkgew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iVMO8bSBhbGFubGFyxLEgZG9sZHVybWFsxLFzxLFuxLF6LiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2VpZigkbWFrPCRtaW4pew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iTWFrc2ltdW0gc2lwYXJpxZ8gbWlrdGFyxLFuxLF6IG1pbmltdW0gc2lwYXJpxZ8gbWlrdGFyxLFuZGFuIHVmYWsgb2xhbWF6LiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2VpZiggJHNvci0+cm93Q291bnQoKSAgKXsNCgkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IkJ1IEFQSSB2ZSBzZXJ2aXMgaWxlIGthecSxdGzEsSDDvHLDvG4gemF0ZW4gdmFyLiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2V7DQoJCQkkaW5zZXJ0CT0JJHZ0LT5wcmVwYXJlKCJJTlNFUlQgSU5UTyB1cnVubGVyIFNFVCB1cnVuX2FkaT0/LCB1cnVuX2FjaWtsYW1hPT8sIHVydW5fZml5YXQ9PywgdXJ1bl9iaXJpbT0/LCB1cnVuX3NlY2VuZWdpPT8sIHVydW5fa2F0ZWdvcmk9PywgdXJ1bl9taW49PywgdXJ1bl9tYXg9PywgdXJ1bl9hcGk9PywgdXJ1bl9hcGlfc2VydmlzPT8iKTsNCgkJCSRpbnNlcnQtPiBleGVjdXRlKGFycmF5KCRhZCwkYWNpa2xhbWEsJGZpeWF0LCRiaXJpbSwkdXJsLCRrYXRlZ29yaSwkbWluLCRtYWssJGFwaSwkYXBpX3NlcnZpcykpOw0KCQkJCWlmICgkaW5zZXJ0KSB7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iTcO8a2VtbWVsISIsIm0iPT4iw5xyw7xuIHNpc3RlbWUgYmHFn2FyxLF5bGEgZWtsZW5kaSwgecO2bmxlbmRpcmlsaXlvcnN1bnV6LiIsInMiPT4ic3VjY2VzcyIsInIiPT4kcm91dGVyLT5nZW5lcmF0ZSgiYWxsX3Byb2R1Y3QudmlldyIpXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9ZWxzZXsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhISIsIm0iPT4iw5xyw7xuIHNpc3RlbWUgZWtsZW5pcmtlbiBoYXRhIG9sdcWfdHUuIiwicyI9PiJlcnJvciJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX0NCgkJfQ0KCQlleGl0KCk7DQoJfSwnbmV3X3Byb2R1Y3QucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnUE9TVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy91cnVuLXNpbC9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCgkJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJaWYgKCAhJF9TRVNTSU9OWydhZG1pbiddICkgeyBleGl0OyB9DQoJCQkkZGVsZXRlCT0JJHZ0LT5wcmVwYXJlKCJVUERBVEUgdXJ1bmxlciBTRVQgZHVydW09PyBXSEVSRSBpZD0/Iik7DQoJCQkkZGVsZXRlLT4gZXhlY3V0ZShhcnJheSgwLCRzbHVnKSk7DQoJCQkJaWYgKCRkZWxldGUpIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiLDnHLDvG4gaGl6bWV0dGVuIGthbGTEsXLEsWxkxLEsIHnDtm5sZW5kaXJpbGl5b3JzdW51ei4iLCJzIj0+InN1Y2Nlc3MiLCJyIj0+JHJvdXRlci0+Z2VuZXJhdGUoImFsbF9wcm9kdWN0LnZpZXciKV07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfWVsc2V7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iSGF0YSEiLCJtIj0+IsOccsO8biBoaXptZXR0ZW4ga2FsZMSxcsSxcmtlbiBoYXRhIG9sdcWfdHUuIiwicyI9PiJlcnJvciJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX0NCgkJCQlleGl0KCk7DQoJfSwnZGVsZXRlX3Byb2R1Y3QucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnUE9TVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy91cnVuLWR1cnVtL1sqOnNsdWddJywgZnVuY3Rpb24oJHNsdWcpew0KCQlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQlpZiAoICEkX1NFU1NJT05bJ2FkbWluJ10gKSB7IGV4aXQ7IH0NCgkJCSR1cnVuCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHVydW5sZXIgV0hFUkUgaWQ9PyIpOw0KCQkJJHVydW4tPiBleGVjdXRlKGFycmF5KCRzbHVnKSk7DQoJCQkkdXJ1bgk9CSR1cnVuLT5mZXRjaChQRE86OkZFVENIX09CSik7DQoJCQkJaWYgKCAkdXJ1bi0+ZHVydW0gPT0gMSApIHsNCgkJCQkJJGR1cnVtID0gMiA7DQoJCQkJCSRldGtpICA9ICdwYXNpZic7DQoJCQkJfWVsc2VpZiggJHVydW4tPmR1cnVtID09IDIgKXsNCgkJCQkJJGR1cnVtID0gMSA7DQoJCQkJCSRldGtpICA9ICdha3RpZic7DQoJCQkJfQ0KCQkJJGVkaXQJPQkkdnQtPnByZXBhcmUoIlVQREFURSB1cnVubGVyIFNFVCBkdXJ1bT0/IFdIRVJFIGlkPT8iKTsNCgkJCSRlZGl0LT4gZXhlY3V0ZShhcnJheSgkZHVydW0sJHNsdWcpKTsNCgkJCQlpZiAoJGVkaXQpIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiLDnHLDvG4gIi4kZXRraS4ibGXFn3RpcmlsZGksIHnDtm5sZW5kaXJpbGl5b3JzdW51ei4iLCJzIj0+InN1Y2Nlc3MiLCJyIj0+JHJvdXRlci0+Z2VuZXJhdGUoImFsbF9wcm9kdWN0LnZpZXciKV07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfWVsc2V7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iSGF0YSEiLCJtIj0+IsOccsO8biAiLiRldGtpLiJsZcWfdGlyaWxpcmtlbiBoYXRhIG9sdcWfdHUuIiwicyI9PiJlcnJvciJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX0NCgkJCQlleGl0KCk7DQoJfSwncGFzaWZfcHJvZHVjdC5wb3N0Jyk7DQoJJHJvdXRlci0+bWFwKCdQT1NUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4nL3VydW4tZHV6ZW5sZS9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCgkJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJaWYgKCAhJF9TRVNTSU9OWydhZG1pbiddICkgeyBleGl0OyB9DQoJCSRhcGlfc2VydmlzCT0JJF9QT1NUWyJhcGlfc2VydmlzIl07DQoJCSRhY2lrbGFtYQkJPQkkX1BPU1RbImFjaWtsYW1hIl07DQoJCSRrYXRlZ29yaQkJPQkkX1BPU1RbImthdGVnb3JpIl07DQoJCSRmaXlhdAkJCT0JJF9QT1NUWyJmaXlhdCJdOw0KCQkkYmlyaW0JCQk9ICRmaXlhdC8xMDAwOw0KCQkkdXJsCQkJCT0JJF9QT1NUWyJiYWdsYW50aSJdOw0KCQkkbWluCQkJCT0JJF9QT1NUWyJtaW4iXTsNCgkJJG1hawkJCQk9CSRfUE9TVFsibWFrIl07DQoJCSRhcGkJCQkJPQkkX1BPU1RbImFwaSJdOw0KCQkkYWQJCQkJCT0JJF9QT1NUWyJhZGkiXTsNCg0KDQoJCSRzb3IJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gdXJ1bmxlciBXSEVSRSB1cnVuX2FwaT0/ICYmIHVydW5fYXBpX3NlcnZpcz0/ICYmIGlkIT0/ICIpOw0KCQkkc29yCS0+IGV4ZWN1dGUoYXJyYXkoJGFwaSwkYXBpX3NlcnZpcywkc2x1ZykpOw0KDQoJCWlmICggZW1wdHkoJGFkKSB8fCBlbXB0eSgkYXBpKSB8fCBlbXB0eSgkbWFrKSB8fCBlbXB0eSgkbWluKSB8fCBlbXB0eSgkdXJsKQl8fCBlbXB0eSgkZml5YXQpCXx8IGVtcHR5KCRrYXRlZ29yaSkJfHwgZW1wdHkoJGFwaV9zZXJ2aXMpICAgKSB7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJUw7xtIGFsYW5sYXLEsSBkb2xkdXJtYWzEsXPEsW7EsXouIiwicyI9PiJpbmZvIl07DQoJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQl9ZWxzZWlmKCRtYWs8JG1pbil7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJNYWtzaW11bSBzaXBhcmnFnyBtaWt0YXLEsW7EsXogbWluaW11bSBzaXBhcmnFnyBtaWt0YXLEsW5kYW4gdWZhayBvbGFtYXouIiwicyI9PiJpbmZvIl07DQoJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQl9ZWxzZWlmKCAkc29yLT5yb3dDb3VudCgpICApew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iQnUgQVBJIHZlIHNlcnZpcyBpbGUga2F5xLF0bMSxIMO8csO8biB6YXRlbiB2YXIuIiwicyI9PiJpbmZvIl07DQoJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQl9ZWxzZXsNCgkJCSR1cGRhdGUJPQkkdnQtPnByZXBhcmUoIlVQREFURSB1cnVubGVyIFNFVCB1cnVuX2FkaT0/LCB1cnVuX2FjaWtsYW1hPT8sIHVydW5fZml5YXQ9PywgdXJ1bl9iaXJpbT0/LCB1cnVuX3NlY2VuZWdpPT8sIHVydW5fa2F0ZWdvcmk9PywgdXJ1bl9taW49PywgdXJ1bl9tYXg9PywgdXJ1bl9hcGk9PywgdXJ1bl9hcGlfc2VydmlzPT8gV0hFUkUgaWQ9PyIpOw0KCQkJJHVwZGF0ZS0+IGV4ZWN1dGUoYXJyYXkoJGFkLCRhY2lrbGFtYSwkZml5YXQsJGJpcmltLCR1cmwsJGthdGVnb3JpLCRtaW4sJG1haywkYXBpLCRhcGlfc2VydmlzLCRzbHVnKSk7DQoJCQkJaWYgKCR1cGRhdGUpIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiLDnHLDvG4gYmHFn2FyxLF5bGEgZMO8emVubGVuZGksIHnDtm5sZW5kaXJpbGl5b3JzdW51ei4iLCJzIj0+InN1Y2Nlc3MiLCJyIj0+JHJvdXRlci0+Z2VuZXJhdGUoImFsbF9wcm9kdWN0LnZpZXciKV07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfWVsc2V7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iSGF0YSEiLCJtIj0+IsOccsO8biBkw7x6ZW5sZW5pcmtlbiBoYXRhIG9sdcWfdHUuIiwicyI9PiJlcnJvciJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX0NCgkJfQ0KCQlleGl0KCk7DQoJfSwnZWRpdF9wcm9kdWN0LnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvdGFsZWJlLWNldmFwLXZlci1bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCgkJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJaWYgKCAhJF9TRVNTSU9OWydhZG1pbiddICkgeyBleGl0OyB9DQoJCSRpZAkJCT0JJHNsdWc7DQoJCSRpY2VyaWsJPQkkX1BPU1RbImljZXJpayJdOw0KCQkkdGFyaWgJPQlkYXRlKCJZLW0tZCBIOmk6cyIpOw0KDQoJCSRzb3JndQk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBkZXN0ZWtfdGFsZXBsZXIgV0hFUkUgaWQ9PyIpOw0KCQkkc29yZ3UtPiAgZXhlY3V0ZShhcnJheSgkaWQpKTsNCg0KCQlpZiAoIGVtcHR5KCRpY2VyaWspICkgew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iVMO8bSBhbGFubGFyxLEgZG9sZHVybWFsxLFzxLFuxLF6LiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2VpZigkc29yZ3UtPnJvd0NvdW50KCk8MCl7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJCw7Z5bGUgYmlyIGRlc3RlayB0YWxlYmkgeW9rLiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2V7DQoJCQkkdGFsZXBpCT0JJHZ0LT5wcmVwYXJlKCJJTlNFUlQgSU5UTyBkZXN0ZWtfdGFsZXBfY2V2YXAgU0VUIHRhbGVwX2lkPT8sIHRhbGVwX3RhcmloaT0/LCB0YWxlcF9pY2VyaWs9PywgdGFsZXBfdXNlcj0/ICIpOw0KCQkJJHRhbGVwaS0+IGV4ZWN1dGUoYXJyYXkoJGlkLCR0YXJpaCwkaWNlcmlrLCR1eWUtPnVzZXJuYW1lKSk7DQoJCQkJaWYgKCR0YWxlcGkpIHsNCgkJCQkJJGVkaXQJCT0JJHZ0LT5wcmVwYXJlKCJVUERBVEUgZGVzdGVrX3RhbGVwbGVyIFNFVCB0YWxlcF9kdXJ1bT0/IFdIRVJFIGlkPT8iKTsNCgkJCQkJJGVkaXQJCS0+IGV4ZWN1dGUoYXJyYXkoJ1lhbsSxdGxhbmTEsScsJGlkKSk7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iTcO8a2VtbWVsISIsIm0iPT4iRGVzdGVrIHRhbGViaW5lIGNldmFwIHZlcmRpbml6LCB5w7ZubGVuZGlyaWxpeW9yc3VudXouIiwicyI9PiJzdWNjZXNzIiwiciI9PiRyb3V0ZXItPmdlbmVyYXRlKCdhZG1pbl90aWNrZXRzX2Jla2xleWVubGVyLnZpZXcnKV07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfWVsc2V7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iSGF0YSIsIm0iPT4iRGVzdGVrIHRhbGViaW5lIGRlc3RlayB2ZXJpcmtlbiBoYXRhIG9sdcWfdHUuIiwicyI9PiJlcnJvciJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX0NCgkJfQ0KDQoJCWV4aXQoKTsNCgl9LCduZXdfcmVwbHlfYWRtaW4ucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnR0VUJywgJy8nLiRzaXRlYXlhci0+c2l0ZV9hZG1pbi4ndGFsZXAtZHVydW0tYWMtWyo6c2x1Z10nLCBmdW5jdGlvbigkc2x1Zyl7DQoJCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCWlmICggISRfU0VTU0lPTlsnYWRtaW4nXSApIHsgZXhpdDsgfQ0KCQkkc29yCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIGRlc3Rla190YWxlcGxlciBXSEVSRSBpZD0/Iik7DQoJCSRzb3ItPiBleGVjdXRlKGFycmF5KCRzbHVnKSk7DQoJCSRzb3IJPQkkc29yLT5mZXRjaChQRE86OkZFVENIX09CSik7DQoJCQlpZiAoICRzb3ItPnRhbGVwX2R1cnVtID09ICJBw6fEsWsiICkgew0KCQkJCSRvdXRwdXQJPQlbInQiPT4iSGF0YSIsIm0iPT4iVGFsZXAgemF0ZW4gYcOnxLFrIGR1cnVtZGEuIiwicyI9PiJlcnJvciJdOw0KCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQl9ZWxzZXsNCgkJCQkkZWRpdAk9CSR2dC0+cHJlcGFyZSgiVVBEQVRFIGRlc3Rla190YWxlcGxlciBTRVQgdGFsZXBfZHVydW09PyBXSEVSRSBpZD0/Iik7DQoJCQkJJGVkaXQtPiBleGVjdXRlKGFycmF5KCJBw6fEsWsiLCRzbHVnKSk7DQoJCQkJCWlmICgkZWRpdCkgew0KCQkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiJEZXN0ZWsgdGFsZWJpIGR1cnVtdSBkZcSfacWfdGlyaWxkaS4iLCJzIj0+InN1Y2Nlc3MiXTsNCgkJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJCX1lbHNlew0KCQkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhIiwibSI9PiJEZXN0ZWsgdGFsZWJpIGR1cnVtdSBkZcSfacWfdGlyaWxlbWVkaS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCQl9DQoJCQl9DQoJCQlleGl0KCk7DQoJfSwgJ3RhbGVwX2FjLnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ0dFVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJ3RhbGVwLWR1cnVtLWthcGEtWyo6c2x1Z10nLCBmdW5jdGlvbigkc2x1Zyl7DQoJCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCWlmICggISRfU0VTU0lPTlsnYWRtaW4nXSApIHsgZXhpdDsgfQ0KCQkkc29yCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIGRlc3Rla190YWxlcGxlciBXSEVSRSBpZD0/Iik7DQoJCSRzb3ItPiBleGVjdXRlKGFycmF5KCRzbHVnKSk7DQoJCSRzb3IJPQkkc29yLT5mZXRjaChQRE86OkZFVENIX09CSik7DQoJCQlpZiAoICRzb3ItPnRhbGVwX2R1cnVtID09ICJLYXBhbMSxIiApIHsNCgkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEiLCJtIj0+IlRhbGVwIHphdGVuIGthcGFsxLEgZHVydW1kYS4iLCJzIj0+ImVycm9yIl07DQoJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCX1lbHNlew0KCQkJCSRlZGl0CT0JJHZ0LT5wcmVwYXJlKCJVUERBVEUgZGVzdGVrX3RhbGVwbGVyIFNFVCB0YWxlcF9kdXJ1bT0/IFdIRVJFIGlkPT8iKTsNCgkJCQkkZWRpdC0+IGV4ZWN1dGUoYXJyYXkoIkthcGFsxLEiLCRzbHVnKSk7DQoJCQkJCWlmICgkZWRpdCkgew0KCQkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiJEZXN0ZWsgdGFsZWJpIGR1cnVtdSBkZcSfacWfdGlyaWxkaS4iLCJzIj0+InN1Y2Nlc3MiXTsNCgkJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJCX1lbHNlew0KCQkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhIiwibSI9PiJEZXN0ZWsgdGFsZWJpIGR1cnVtdSBkZcSfacWfdGlyaWxlbWVkaS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCQl9DQoJCQl9DQoJCQlleGl0KCk7DQoJfSwgJ3RhbGVwX2thcGF0LnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvdXllL1sqOnNsdWddL2Jha2l5ZScsIGZ1bmN0aW9uKCRzbHVnKXsNCgkJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJaWYgKCAhJF9TRVNTSU9OWydhZG1pbiddICkgeyBleGl0OyB9DQoJCSR1eWVzb3IJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gdXllbGVyIFdIRVJFIHVzZXJuYW1lPT8iKTsNCgkJJHV5ZXNvci0+IGV4ZWN1dGUoYXJyYXkoJHNsdWcpKTsNCgkJJHV5ZXNvcgk9CSR1eWVzb3ItPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCg0KCQkkdGFyaWgJCT0JZGF0ZSgiWS5tLmQgSDppOnMiKTsNCgkJJG1pa3RhcgkJPQkkX1BPU1RbIm1pa3RhciJdOw0KCQkkaXNsZW0JCT0JJF9QT1NUWyJpc2xlbSJdOw0KDQoJCWlmICggJGlzbGVtID09ICdla2xlJyApIHsNCgkJCSRiYWtpeWUJCT0JJHV5ZXNvci0+YmFraXllKyRtaWt0YXI7DQoJCQkkZHVydW0JCT0JJ2VrbGVtZSc7DQoJCX1lbHNlaWYgKCAkaXNsZW0gPT0gJ2Vrc2lsdCcgKSB7DQoJCQkkYmFraXllCQk9CSR1eWVzb3ItPmJha2l5ZS0kbWlrdGFyOw0KCQkJJGR1cnVtCQk9CSdla3NpbHRtZSc7DQoJCX1lbHNlew0KCQkJJGR1cnVtCQk9CSdib3MnOw0KCQl9DQoNCgkJaWYgKCBlbXB0eSgkbWlrdGFyKSB8fCBlbXB0eSgkaXNsZW0pICkgew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iVMO8bSBhbGFubGFyxLEgZG9sZHVybWFsxLFzxLFuxLF6LiIsInMiPT4iaW5mbyJdOw0KCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJfWVsc2VpZiggJGR1cnVtID09ICJib3MiICl7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiLEsMWfbGVtIMWfdWFuIGnDp2luIGdlcsOnZWtsZcWfdGlyaWxlbWl5b3IuIiwicyI9PiJpbmZvIl07DQoJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQl9ZWxzZXsNCgkJCSRkdXplbHQJCT0JCSR2dC0+cHJlcGFyZSgiVVBEQVRFIHV5ZWxlciBTRVQgYmFraXllPT8gV0hFUkUgdXNlcm5hbWU9PyIpOw0KCQkJJGR1emVsdAkJLT4JZXhlY3V0ZShhcnJheSgkYmFraXllLCRzbHVnKSk7DQoJCQkJaWYgKCRkdXplbHQpIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiRtaWt0YXIuIiBUTCB0dXRhcsSxbmRhIGJha2l5ZSAiLiRkdXJ1bS4iIGnFn2xlbWkgZ2Vyw6dla2xlxZ90aXJpbGRpLiIsInMiPT4ic3VjY2VzcyJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCQkJaWYgKCAkaXNsZW0gPT0gJ2VrbGUnICkgew0KCQkJCQkJCSRrYXphbmMJCT0JCSR2dC0+cHJlcGFyZSgiSU5TRVJUIElOVE8gYmFraXllX2themFuYyBTRVQgdHV0YXI9PywgdGFyaWg9PyIpOw0KCQkJCQkJCSRrYXphbmMJCS0+CWV4ZWN1dGUoYXJyYXkoJG1pa3RhciwkdGFyaWgpKTsNCgkJCQkJCX0NCgkJCQl9ZWxzZXsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhIiwibSI9PiLDnHllIGJha2l5ZSBpxZ9sZW1pIHPEsXJhc8SxbmRhIGhhdGEgb2x1xZ90dS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfQ0KCQl9DQoNCgkJZXhpdCgpOw0KCX0sJ2FkZF9iYWxhbmNlX3VzZXIucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnUE9TVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy91eWUvWyo6c2x1Z10vZml5YXRsYXIvWyo6c2x1ZzJdJywgZnVuY3Rpb24oJHNsdWcsJHNsdWcyKXsNCgkJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJaWYgKCAhJF9TRVNTSU9OWydhZG1pbiddICkgeyBleGl0OyB9DQoJCSR1eWVzb3IJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gdXllbGVyIFdIRVJFIGlkPT8iKTsNCgkJJHV5ZXNvci0+IGV4ZWN1dGUoYXJyYXkoJHNsdWcpKTsNCgkJJHV5ZXNvcgk9CSR1eWVzb3ItPmZldGNoKFBETzo6RkVUQ0hfT0JKKTsNCg0KCQkkdXJ1bnNvcgk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSB1cnVubGVyIFdIRVJFIGlkPT8iKTsNCgkJJHVydW5zb3ItPiBleGVjdXRlKGFycmF5KCRzbHVnMikpOw0KCQkkdXJ1bnNvcgk9CSR1cnVuc29yLT5mZXRjaChQRE86OkZFVENIX09CSik7DQoNCgkJJGZpeWF0CT0JJF9QT1NUWyJmaXlhdCJdOw0KDQoNCgkJJHNvcgk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSBmaXlhdGxhbmRpcm1hIFdIRVJFIGZpeWF0X3NhaGliaT0/ICYmIGZpeWF0X3NlcnZpcz0/ICIpOw0KCQkkc29yCS0+IGV4ZWN1dGUoYXJyYXkoJHV5ZXNvci0+dXNlcm5hbWUsJHNsdWcyKSk7DQoNCgkJaWYgKCBlbXB0eSgkZml5YXQpICkgew0KCQkJJG91dHB1dAk9CVsidCI9PiJCaWxnaSIsIm0iPT4iRml5YXQgYWxhbsSxbsSxIGRvbGR1cm1hbMSxc8SxbsSxei4iLCJzIj0+ImluZm8iXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX1lbHNlaWYoJHNvci0+cm93Q291bnQoKSl7DQoJCQkkdXBkYXRlCT0JJHZ0LT5wcmVwYXJlKCJVUERBVEUgZml5YXRsYW5kaXJtYSBTRVQgZml5YXRfZml5YXQ9PyBXSEVSRSBmaXlhdF9zYWhpYmk9PyAmJiBmaXlhdF9zZXJ2aXM9PyIpOw0KCQkJJHVwZGF0ZS0+IGV4ZWN1dGUoYXJyYXkoJGZpeWF0LCR1eWVzb3ItPnVzZXJuYW1lLCRzbHVnMikpOw0KCQkJCWlmICgkdXBkYXRlKSB7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iTcO8a2VtbWVsISIsIm0iPT4iw5x5ZXllIMO2emVsIGZpeWF0bGFuZMSxcm1hIGnFn2xlbWkgYmHFn2FyxLFsxLEuIiwicyI9PiJzdWNjZXNzIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfWVsc2V7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iSGF0YSEiLCJtIj0+IsOceWV5ZSDDtnplbCBmaXlhdGxhbmTEsXJtYSBpxZ9sZW1pIHPEsXJhc8SxbmRhIGhhdGEgb2x1xZ90dS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfQ0KCQl9ZWxzZXsNCgkJCSRpbnNlcnQJPQkkdnQtPnByZXBhcmUoIklOU0VSVCBJTlRPIGZpeWF0bGFuZGlybWEgU0VUIGZpeWF0X2ZpeWF0PT8sIGZpeWF0X3NhaGliaT0/LCBmaXlhdF9zZXJ2aXM9PyIpOw0KCQkJJGluc2VydC0+IGV4ZWN1dGUoYXJyYXkoJGZpeWF0LCR1eWVzb3ItPnVzZXJuYW1lLCRzbHVnMikpOw0KCQkJCWlmICgkaW5zZXJ0KSB7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iTcO8a2VtbWVsISIsIm0iPT4iw5x5ZXllIMO2emVsIGZpeWF0bGFuZMSxcm1hIGnFn2xlbWkgYmHFn2FyxLFsxLEuIiwicyI9PiJzdWNjZXNzIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfWVsc2V7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iSGF0YSEiLCJtIj0+IsOceWV5ZSDDtnplbCBmaXlhdGxhbmTEsXJtYSBpxZ9sZW1pIHPEsXJhc8SxbmRhIGhhdGEgb2x1xZ90dS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfQ0KCQl9DQoJCWV4aXQoKTsNCgl9LCdwcml2YXRlX3ByaWNlLnBvc3QnKTsNCgkkcm91dGVyLT5tYXAoJ1BPU1QnLCAnLycuJHNpdGVheWFyLT5zaXRlX2FkbWluLicvdXllL1sqOnNsdWddL2ZpeWF0LXNpbC9bKjpzbHVnMl0nLCBmdW5jdGlvbigkc2x1Zywkc2x1ZzIpew0KCQlnbG9iYWwgJHZ0LCR0aXRsZSwkcm91dGVyLCRzaXRlYXlhciwkdXllOw0KCQlpZiAoICEkX1NFU1NJT05bJ2FkbWluJ10gKSB7IGV4aXQ7IH0NCgkJJHV5ZXNvcgk9CSR2dC0+cHJlcGFyZSgiU0VMRUNUICogRlJPTSB1eWVsZXIgV0hFUkUgaWQ9PyIpOw0KCQkkdXllc29yLT4gZXhlY3V0ZShhcnJheSgkc2x1ZykpOw0KCQkkdXllc29yCT0JJHV5ZXNvci0+ZmV0Y2goUERPOjpGRVRDSF9PQkopOw0KDQoJCSRzb3IJPQkkdnQtPnByZXBhcmUoIlNFTEVDVCAqIEZST00gZml5YXRsYW5kaXJtYSBXSEVSRSBmaXlhdF9zYWhpYmk9PyAmJiBmaXlhdF9zZXJ2aXM9PyAiKTsNCgkJJHNvcgktPiBleGVjdXRlKGFycmF5KCR1eWVzb3ItPnVzZXJuYW1lLCRzbHVnMikpOw0KDQoJCWlmKCRzb3ItPnJvd0NvdW50KCkpew0KCQkJJGRlbGV0ZQk9CSR2dC0+cHJlcGFyZSgiREVMRVRFIEZST00gZml5YXRsYW5kaXJtYSBXSEVSRSBmaXlhdF9zYWhpYmk9PyAmJiBmaXlhdF9zZXJ2aXM9PyIpOw0KCQkJJGRlbGV0ZS0+IGV4ZWN1dGUoYXJyYXkoJHV5ZXNvci0+dXNlcm5hbWUsJHNsdWcyKSk7DQoJCQkJaWYgKCRkZWxldGUpIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiLDnHlleWUgw7Z6ZWwgZml5YXRsYW5kxLFybWEgacWfbGVtaSBzaWxpbmRpLiIsInMiPT4ic3VjY2VzcyJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX1lbHNlew0KCQkJCQkkb3V0cHV0CT0JWyJ0Ij0+IkhhdGEhIiwibSI9PiLDnHlleWUgw7Z6ZWwgZml5YXRsYW5kxLFybWEgc2lsaW5pcmtlbiBoYXRhIG9sdcWfdHUuIiwicyI9PiJlcnJvciJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX0NCgkJfQ0KCQlleGl0KCk7DQoJfSwncHJpdmF0ZV9wcmljZV9kZWxldGUucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnUE9TVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy91eWUvWyo6c2x1Z10nLCBmdW5jdGlvbigkc2x1Zyl7DQoJCWdsb2JhbCAkdnQsJHRpdGxlLCRyb3V0ZXIsJHNpdGVheWFyLCR1eWU7DQoJCWlmICggISRfU0VTU0lPTlsnYWRtaW4nXSApIHsgZXhpdDsgfQ0KCQkkdXllc29yCT0JJHZ0LT5wcmVwYXJlKCJTRUxFQ1QgKiBGUk9NIHV5ZWxlciBXSEVSRSB1c2VybmFtZT0/Iik7DQoJCSR1eWVzb3ItPiBleGVjdXRlKGFycmF5KCRzbHVnKSk7DQoJCSR1eWVzb3IJPQkkdXllc29yLT5mZXRjaChQRE86OkZFVENIX09CSik7DQoNCgkJJHRlbGVmb24JCT0Jc3RyX3JlcGxhY2UoIiAiLCIiLCRfUE9TVFsidGVsZWZvbiJdKTsNCgkJJGFkc295YWQJCT0JaWxrSGFyZigkX1BPU1RbImFkc295YWQiXSk7DQoJCSR5ZXRraQkJCT0JJF9QT1NUWyJ5ZXRraSJdOw0KCQkkbWFpbAkJCQk9CSRfUE9TVFsibWFpbCJdOw0KCQkkb25heQkJCQk9CSRfUE9TVFsib25heSJdOw0KDQoJCWlmICggZW1wdHkoJGFkc295YWQpIHx8IGVtcHR5KCRtYWlsKSB8fCBlbXB0eSgkeWV0a2kpIHx8IGVtcHR5KCR0ZWxlZm9uKSApIHsNCgkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IlTDvG0gYWxhbmxhcsSxIGRvbGR1cm1hbMSxc8SxbsSxei4iLCJzIj0+ImluZm8iXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX1lbHNlaWYoIWZpbHRlcl92YXIoJG1haWwsRklMVEVSX1ZBTElEQVRFX0VNQUlMKSl7DQoJCQkkb3V0cHV0CT0JWyJ0Ij0+IkJpbGdpIiwibSI9PiJHaXJpbGVuIG1haWwgZm9ybWF0xLEgeWFubMSxxZ8uIiwicyI9PiJpbmZvIl07DQoJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQl9ZWxzZXsNCgkJCSRkdXplbHQJCT0JCSR2dC0+cHJlcGFyZSgiVVBEQVRFIHV5ZWxlciBTRVQgYWRzb3lhZD0/LCBtYWlsPT8sIHRlbGVmb249PywgeWV0a2k9Pywgb25heT0/IFdIRVJFIHVzZXJuYW1lPT8iKTsNCgkJCSRkdXplbHQJCS0+CWV4ZWN1dGUoYXJyYXkoJGFkc295YWQsJG1haWwsJHRlbGVmb24sJHlldGtpLCRvbmF5LCRzbHVnKSk7DQoJCQkJaWYgKCRkdXplbHQpIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiLDnHllIGJpbGdpbGVyaSBnw7xuY2VsbGVuZGkuIiwicyI9PiJzdWNjZXNzIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfWVsc2V7DQoJCQkJCSRvdXRwdXQJPQlbInQiPT4iSGF0YSIsIm0iPT4iw5x5ZSBiaWxnaWxlcmkgZ8O8bmNlbGxlbmlya2VuIGhhdGEgb2x1xZ90dS4iLCJzIj0+ImVycm9yIl07DQoJCQkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCQkJfQ0KCQl9DQoJCWV4aXQoKTsNCgl9LCdlZGl0X3VzZXIucG9zdCcpOw0KCSRyb3V0ZXItPm1hcCgnUE9TVCcsICcvJy4kc2l0ZWF5YXItPnNpdGVfYWRtaW4uJy91eWUtcGFzcy9bKjpzbHVnXScsIGZ1bmN0aW9uKCRzbHVnKXsNCgkJZ2xvYmFsICR2dCwkdGl0bGUsJHJvdXRlciwkc2l0ZWF5YXIsJHV5ZTsNCgkJaWYgKCAhJF9TRVNTSU9OWydhZG1pbiddICkgeyBleGl0OyB9DQoJCSRwYXNzCQkJCT0JJF9QT1NUWyJwYXNzIl07DQoNCg0KCQlpZiAoIGVtcHR5KCRwYXNzKSB8fCBzdHJsZW4oJHBhc3MpIDwgNiApIHsNCgkJCSRvdXRwdXQJPQlbInQiPT4iQmlsZ2kiLCJtIj0+IlBhcm9sYSA2IGthcmFrdGVyZGVuIGvEsXNhIG9sYW1hei4iLCJzIj0+ImluZm8iXTsNCgkJCWVjaG8ganNvbl9lbmNvZGUoJG91dHB1dCk7DQoJCX1lbHNlew0KCQkJJHBhc3MJCT0JbWQ1KCRfUE9TVFsicGFzcyJdKTsNCgkJCSRkdXplbHQJCT0JCSR2dC0+cHJlcGFyZSgiVVBEQVRFIHV5ZWxlciBTRVQgcGFzc3dvcmQ9PyBXSEVSRSB1c2VybmFtZT0/Iik7DQoJCQkkZHV6ZWx0CQktPglleGVjdXRlKGFycmF5KCRwYXNzLCRzbHVnKSk7DQoJCQkJaWYgKCRkdXplbHQpIHsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJNw7xrZW1tZWwhIiwibSI9PiLDnHllIMWfaWZyZXNpIGfDvG5jZWxsZW5kaS4iLCJzIj0+InN1Y2Nlc3MiXTsNCgkJCQkJZWNobyBqc29uX2VuY29kZSgkb3V0cHV0KTsNCgkJCQl9ZWxzZXsNCgkJCQkJJG91dHB1dAk9CVsidCI9PiJIYXRhIiwibSI9PiLDnHllIMWfaWZyZXNpIGfDvG5jZWxsZW5pcmtlbiBoYXRhIG9sdcWfdHUuIiwicyI9PiJlcnJvciJdOw0KCQkJCQllY2hvIGpzb25fZW5jb2RlKCRvdXRwdXQpOw0KCQkJCX0NCgkJfQ0KCQkJZXhpdCgpOw0KCX0sJ2VkaXRfdXNlcl9wYXNzLnBvc3QnKTsNCg0KDQoJJG1hdGNoID0gJHJvdXRlci0+bWF0Y2goKTsNCglpZiggJG1hdGNoICYmIGlzX2NhbGxhYmxlKCAkbWF0Y2hbJ3RhcmdldCddICkgKSB7DQoJCWNhbGxfdXNlcl9mdW5jX2FycmF5KCAkbWF0Y2hbJ3RhcmdldCddLCAkbWF0Y2hbJ3BhcmFtcyddICk7DQoJfSBlbHNlIHsNCgkJaGVhZGVyKCAkX1NFUlZFUlsiU0VSVkVSX1BST1RPQ09MIl0gLiAnIDQwNCBOb3QgRm91bmQnKTsNCgl9DQogPz4=")); ?> 

Function Calls

base64_decode 1

Variables

None

Stats

MD5 1ff2e0f81052c0b38af8f74bd9b80198
Eval Count 1
Decode Time 202 ms