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("DQoNCjw/cGhwDQpmdW5jdGlvbiBjdXJsX2lsZV9iYWdsYW4oJHVybCl7DQo..
Decoded Output download
?>b'
<?php
function curl_ile_baglan($url){
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => array(
"cache-control: no-cache"
),
));
$response = curl_exec($curl);
return $response;
}
function Json_Tazele($lys){
$nowwww = str_replace("www.", "", $_SERVER[\'HTTP_HOST\']);
$uzakjson = curl_ile_baglan($lys."kontrol?site=".$nowwww."&script=12");
$son_karakter = substr(trim($uzakjson) , -1);
$ilk_karakter = substr(trim($uzakjson) , 0 , 1);
if ($ilk_karakter == "{" and $son_karakter == "}") {
$uzakjson = json_decode($uzakjson,true);
if(file_exists("license.txt")) {
$yereljson = fopen("license.txt","w");
fwrite($yereljson, strrev(rtrim(base64_encode(base64_encode(base64_encode(json_encode($uzakjson)))),"=")."o1k9a8n7"));
fclose($yereljson);
}else{
touch(\'license.txt\');
fwrite($yereljson, strrev(rtrim(base64_encode(base64_encode(base64_encode(json_encode($uzakjson)))),"=")."o1k9a8n7"));
fclose($yereljson);
}
}else{
if (file_exists("license.txt")) {
$yereljson = fopen("license.txt","w");
fwrite($yereljson, "Uzak sitede bulunan json veriler alnamad!
Hata:".$uzakjson);
fclose($yereljson);
}else{
touch("license.txt");
$yereljson = fopen("license.txt","w");
fwrite($yereljson, "Uzak sitede bulunan json veriler alnamad!
Hata:".$uzakjson);
fclose($yereljson);
}
}
}
function Lisans_Filtrele_Yonlendir($yerel_json_alanadi){
$nowwww = str_replace("www.", "", $_SERVER[\'HTTP_HOST\']);
$gercekalanadi = $nowwww.$_SERVER[\'PHP_SELF\'];
if(!stristr($gercekalanadi, $yerel_json_alanadi) or $urun_id != 12){
curl_ile_baglan("https://lisansv2.yesilkare.com/get?sipadres=".$_SERVER[\'SERVER_ADDR\']."&kipadres=".$_SERVER[\'REMOTE_ADDR\']."&dizin=".$_SERVER[\'REQUEST_URI\']."&script=12&site=".$nowwww);
echo "<script>window.location.href = \'https://lisansv2.yesilkare.com/uyari\';</script>";
}
}
function Lisans_Kontrol($lys,$durum = null){
date_default_timezone_set(\'Europe/Istanbul\');
$nowwww = str_replace("www.", "", $_SERVER[\'HTTP_HOST\']);
if(!file_exists("license.txt")){
touch("license.txt");
Json_Tazele($lys);
}
if(file_exists("license.txt")){
$yereljson = file_get_contents("license.txt");
$yereljson = strrev($yereljson);
$yereljson = explode("o1k9a8n7",$yereljson);
$yereljson = base64_decode(base64_decode(base64_decode($yereljson[0]."=")));
$yereljson = json_decode($yereljson,true);
}
if($yereljson["alanadi"] == $nowwww){
if($yereljson["kontrol_aralik"] != null){
$datetime1 = new DateTime(date("Y-m-d H:i:s"));
$datetime2 = new DateTime(date("Y-m-d H:i:s",strtotime($yereljson["lisans_bitis"])));
$dinamik_kalan_saniye = $datetime2->getTimestamp() - $datetime1->getTimestamp();
if($dinamik_kalan_saniye <= 0 and $yereljson["lisans_bitis"] != null){
if(time() > $yereljson["kontrol_aralik"]){
Json_Tazele($lys);
if ($durum == true) {
$detay = \'<h2 style="text-align:center"><span style="color:green">Lisansl</span>, <span style="color:green">Kontrol Var</span>, <span style="color:green">Sreli Lisans</span>, Sresi Geti , <span style="color:green">Yerel Json Tazelendi</span><br>Senaryoya gre ynlendirilir.</h2>\';
}else{
Lisans_Filtrele_Yonlendir($yereljson["alanadi"]);
}
}else{
if ($durum == true) {
$detay = \'<h2 style="text-align:center"><span style="color:green">Lisansl</span>, <span style="color:green">Kontrol Var</span>, <span style="color:green">Sreli Lisans</span>, Sresi Geti , <span style="color:red">Yerel Json Tazelenmedi</span><br>Senaryoya gre ynlendirilir.</h2>\';
}else{
Lisans_Filtrele_Yonlendir($yereljson["alanadi"]);
}
}
}elseif(!$dinamik_kalan_saniye <= 0 and $yereljson["lisans_bitis"] != null){
if(time() > $yereljson["kontrol_aralik"]){
Json_Tazele($lys);
$durum == true ? $detay = \'<h2 style="text-align:center"><span style="color:green">Lisansl</span>, <span style="color:green">Kontrol Var</span>, <span style="color:green">Sreli Lisans</span>, <span style="color:green">Yerel Json Tazelendi</span><br>Senaryoya gre ynlendirilmez.</h2>\' : "";
}else{
$durum == true ? $detay = \'<h2 style="text-align:center"><span style="color:green">Lisansl, Kontrol Var, Sreli Lisans</span>, <span style="color:red">Yerel Json Tazelenmedi</span><br>Senaryoya gre ynlendirilmez.</h2>\' : "";
}
}else{
if(time() > $yereljson["kontrol_aralik"]){
Json_Tazele($lys);
$durum == true ? $detay = \'<h2 style="text-align:center"><span style="color:green">Lisansl, Kontrol Var, Sresiz Lisans, Yerel Json Tazelendi</span><br>Senaryoya gre ynlendirilmez.</h2>\' : "";
}else{
$durum == true ? $detay = \'<h2 style="text-align:center"><span style="color:green">Lisansl, Kontrol Var, Sresiz Lisans</span>, <span style="color:red">Yerel Json Tazelenmedi</span><br>Senaryoya gre ynlendrilmez.</h2>\' : "";
}
}
}else{
Json_Tazele($lys);
}
if ($yereljson["urun_id"] != 12) {
$durum == true ? $detay = \'<h2 style="text-align:center"><span style="color:red">Bu alanad Lisansl Ancak Bu rn in Deil</span><br>Senaroya gre ynlendirilir.</h2>\' : Lisans_Filtrele_Yonlendir($yereljson["alanadi"]);
}
}else{
Json_Tazele($lys);
$durum == true ? $detay = \'<h2 style="text-align:center"><span style="color:red">Lisans Yok</span><br>Senaryoya gre ynlendirilir.</h2>\' : Lisans_Filtrele_Yonlendir($yereljson["alanadi"]);
}
echo $durum == true ? $detay : "";
}
?>
<?php
//NEML BULDUUNUZ VE FRELEMEK STEDNZ SAYFALARA LAVE EDNZ.
//Fonksiyona 1 veya True olarak ikinci bir parametre girilirse lisanslanan site ynlenmez uan ne durumda olduu bilgisi dner.
Lisans_Kontrol("https://lisansv2.yesilkare.com/");
?>
<?php echo $header; ?>
<div id="container" class="container j-container">
<ul class="breadcrumb">
<?php foreach ($breadcrumbs as $breadcrumb) { ?>
<li><a href="<?php echo $breadcrumb[\'href\']; ?>"><?php echo $breadcrumb[\'text\']; ?></a></li>
<?php } ?>
</ul>
<div class="row"><?php echo $column_left; ?><?php echo $column_right; ?>
<?php if ($column_left && $column_right) { ?>
<?php $class = \'col-sm-6\'; ?>
<?php } elseif ($column_left || $column_right) { ?>
<?php $class = \'col-sm-9\'; ?>
<?php } else { ?>
<?php $class = \'col-sm-12\'; ?>
<?php } ?>
<div id="content" class="product-page-content">
<?php if ($this->journal2->settings->get(\'product_page_title_position\', \'top\') === \'top\'): ?>
<h1 class="heading-title"><?php echo $heading_title; ?></h1>
<?php endif; ?>
<?php echo $content_top; ?>
<div class="row product-info <?php echo $this->journal2->settings->get(\'split_ratio\'); ?>">
<?php if ($column_left && $column_right) { ?>
<?php $class = \'col-sm-6\'; ?>
<?php } elseif ($column_left || $column_right) { ?>
<?php $class = \'col-sm-6\'; ?>
<?php } else { ?>
<?php $class = \'col-sm-8\'; ?>
<?php } ?>
<div class="left">
<?php if ($thumb) { ?>
<div class="image">
<?php if (isset($labels) && is_array($labels)): ?>
<?php foreach ($labels as $label => $name): ?>
<span class="label-<?php echo $label; ?>"><b><?php echo $name; ?></b></span>
<?php endforeach; ?>
<?php endif; ?>
<a href="<?php echo $popup; ?>" title="<?php echo $heading_title; ?>"><img src="<?php echo $thumb; ?>" title="<?php echo $heading_title; ?>" alt="<?php echo $heading_title; ?>" id="image" data-largeimg="<?php echo $popup; ?>" /></a>
</div>
<?php if($this->journal2->settings->get(\'product_page_gallery\')): ?>
<div class="gallery-text"><span><?php echo $this->journal2->settings->get(\'product_page_gallery_text\'); ?></span></div>
<?php endif; ?>
<?php } ?>
<?php if ($images) { ?>
<div id="product-gallery" class="image-additional <?php echo $this->journal2->settings->get(\'product_page_gallery_carousel\') ? \'journal-carousel\' : \'image-additional-grid\'; ?>">
<?php if ($this->journal2->settings->get(\'product_page_gallery_carousel\')): ?>
<div class="swiper">
<div class="swiper-container" <?php echo $this->journal2->settings->get(\'rtl\') ? \'dir="rtl"\' : \'\'; ?>>
<div class="swiper-wrapper">
<?php endif; ?>
<?php if ($thumb) { ?>
<a class="swiper-slide" style="<?php echo $this->journal2->settings->get(\'product_page_gallery_carousel\') ? (\'width: \' . 100 / $this->journal2->settings->get(\'product_page_additional_width\', 5) . \'%\') : \'\'; ?>" href="<?php echo isset($popup_fixed) ? $popup_fixed : $popup; ?>" title="<?php echo $heading_title; ?>"><img src="<?php echo isset($thumb_fixed) ? $thumb_fixed : $thumb; ?>" title="<?php echo $heading_title; ?>" alt="<?php echo $heading_title; ?>"/></a>
<?php } ?>
<?php foreach ($images as $image) { ?>
<a class="swiper-slide" style="<?php echo $this->journal2->settings->get(\'product_page_gallery_carousel\') ? (\'width: \' . 100 / $this->journal2->settings->get(\'product_page_additional_width\', 5) . \'%\') : \'\'; ?>" href="<?php echo $image[\'popup\']; ?>" title="<?php echo $heading_title; ?>"><img src="<?php echo $image[\'thumb\']; ?>" title="<?php echo $heading_title; ?>" alt="<?php echo $heading_title; ?>"/></a>
<?php } ?>
<?php if ($this->journal2->settings->get(\'product_page_gallery_carousel\')): ?>
</div>
</div>
<div class="swiper-button-next"></div>
<div class="swiper-button-prev"></div>
</div>
<?php endif; ?>
</div>
<?php if ($this->journal2->settings->get(\'product_page_gallery_carousel\')): ?>
<script>
(function () {
var opts = {
slidesPerView: parseInt(\'<?php echo $this->journal2->settings->get(\'product_page_additional_width\', 5) ?>\', 10),
slidesPerGroup: parseInt(\'<?php echo $this->journal2->settings->get(\'product_page_additional_width\', 5) ?>\', 10),
spaceBetween: parseInt(\'<?php echo $this->journal2->settings->get(\'product_page_additional_spacing\', 10) ?>\', 10),
nextButton: $(\'#product-gallery .swiper-button-next\'),
prevButton: $(\'#product-gallery .swiper-button-prev\'),
autoplay: <?php echo $this->journal2->settings->get(\'product_page_gallery_carousel_autoplay\') ? (int)$this->journal2->settings->get(\'product_page_gallery_carousel_transition_delay\', 4000) : \'false\'; ?>,
speed: <?php echo (int)$this->journal2->settings->get(\'product_page_gallery_carousel_transition_speed\', 400); ?>,
touchEventsTarget: <?php echo $this->journal2->settings->get(\'product_page_gallery_carousel_touchdrag\') ? \'\'container\'\' : \'false\'; ?>,
};
$(\'#product-gallery .swiper-container\').swiper(opts);
})();
</script>
<?php endif; ?>
<?php } ?>
<?php foreach ($this->journal2->settings->get(\'additional_product_description_image\', array()) as $tab): ?>
<div class="journal-custom-tab">
<?php if ($tab[\'has_icon\']): ?>
<div class="block-icon block-icon-left" style="<?php echo $tab[\'icon_css\']; ?>"><?php echo $tab[\'icon\']; ?></div>
<?php endif; ?>
<?php if ($tab[\'name\']): ?>
<h3><?php echo $tab[\'name\']; ?></h3>
<?php endif; ?>
<?php echo $tab[\'content\']; ?>
</div>
<?php endforeach; ?>
<div class="image-gallery" style="display: none !important;">
<?php if ($thumb) { ?>
<a href="<?php echo $popup; ?>" data-original="<?php echo isset($original) ? $original : $popup; ?>" title="<?php echo $heading_title; ?>" class="swipebox"><img src="<?php echo $thumb; ?>" title="<?php echo $heading_title; ?>" alt="<?php echo $heading_title; ?>" /></a>
<?php } ?>
<?php if ($images) { ?>
<?php foreach ($images as $image) { ?>
<a href="<?php echo $image[\'popup\']; ?>" data-original="<?php echo isset($image[\'original\']) ? $image[\'original\'] : $image[\'popup\']; ?>" title="<?php echo $heading_title; ?>" class="swipebox"><img src="<?php echo $image[\'thumb\']; ?>" title="<?php echo $heading_title; ?>" alt="<?php echo $heading_title; ?>" /></a>
<?php } ?>
<?php } ?>
</div>
<?php if ($this->journal2->settings->get(\'share_buttons_status\') && (!Journal2Cache::$mobile_detect->isMobile() || (Journal2Cache::$mobile_detect->isMobile() && !$this->journal2->settings->get(\'share_buttons_disable_on_mobile\', 1))) && $this->journal2->settings->get(\'share_buttons_position\') === \'left\' && count($this->journal2->settings->get(\'config_share_buttons\', array()))): ?>
<div class="social share-this <?php echo $this->journal2->settings->get(\'share_buttons_disable_on_mobile\', 1) ? \'hide-on-mobile\' : \'\'; ?>">
<div class="social-loaded">
<script type="text/javascript">var switchTo5x=true;</script>
<script type="text/javascript" src="https://ws.sharethis.com/button/buttons.js"></script>
<script type="text/javascript">stLight.options({publisher: "<?php echo $this->journal2->settings->get(\'share_buttons_account_key\'); ?>", doNotHash: true, doNotCopy: true, hashAddressBar: false});</script>
<?php foreach ($this->journal2->settings->get(\'config_share_buttons\', array()) as $item): ?>
<span class="<?php echo $item[\'class\'] . $this->journal2->settings->get(\'share_buttons_style\'); ?>" displayText="<?php echo $this->journal2->settings->get(\'share_buttons_style\') ? $item[\'name\'] : \'\'; ?>"></span>
<?php endforeach; ?>
</div>
</div>
<?php endif; ?>
<meta="description" content="<?php echo $this->journal2->settings->get(\'product_description\'); ?>" />
<div class="product-tabs">
<?php if ($this->journal2->settings->get(\'share_buttons_status\') && (!Journal2Cache::$mobile_detect->isMobile() || (Journal2Cache::$mobile_detect->isMobile() && !$this->journal2->settings->get(\'share_buttons_disable_on_mobile\', 1))) && $this->journal2->settings->get(\'share_buttons_position\') === \'bottom\' && count($this->journal2->settings->get(\'config_share_buttons\', array()))): ?>
<div class="social share-this <?php echo $this->journal2->settings->get(\'share_buttons_disable_on_mobile\', 1) ? \'hide-on-mobile\' : \'\'; ?>">
<div class="social-loaded">
<script type="text/javascript">var switchTo5x=true;</script>
<script type="text/javascript" src="https://ws.sharethis.com/button/buttons.js"></script>
<script type="text/javascript">stLight.options({publisher: "<?php echo $this->journal2->settings->get(\'share_buttons_account_key\'); ?>", doNotHash: true, doNotCopy: true, hashAddressBar: false});</script>
<?php foreach ($this->journal2->settings->get(\'config_share_buttons\', array()) as $item): ?>
<span class="<?php echo $item[\'class\'] . $this->journal2->settings->get(\'share_buttons_style\'); ?>" displayText="<?php echo $this->journal2->settings->get(\'share_buttons_style\') ? $item[\'name\'] : \'\'; ?>"></span>
<?php endforeach; ?>
</div>
</div>
<?php endif; ?>
<ul id="tabs" class="nav nav-tabs htabs">
<?php $is_active = true; ?>
<?php if (trim($description) && !$this->journal2->settings->get(\'hide_product_description\')) { ?>
<li <?php if ($is_active) { echo \'class="active"\'; $is_active = false; } ;?>><a href="#tab-description" data-toggle="tab"><?php echo $tab_description; ?></a></li>
<?php } ?>
<?php if ($attribute_groups) { ?>
<li <?php if ($is_active) { echo \'class="active"\'; $is_active = false; } ;?>><a href="#tab-specification" data-toggle="tab"><?php echo $tab_attribute; ?></a></li>
<?php } ?>
<?php if ($review_status) { ?>
<li <?php if ($is_active) { echo \'class="active"\'; $is_active = false; } ;?>><a href="#tab-review" data-toggle="tab"><?php echo $tab_review; ?></a></li>
<?php } ?>
<?php if ( isset($customerPhotosData[\'Enabled\']) && $customerPhotosData[\'Enabled\'] == \'yes\' && $customerPhotosData[\'showInTab\'] == \'yes\' ) { ?>
<li><a href="#tab_CustomerPhotos" data-toggle="tab"><?php echo $tab_CustomerPhotos; ?></a></li>
<?php } ?>
<?php $index = 0; foreach ($this->journal2->settings->get(\'additional_product_tabs\', array()) as $tab): $index++; ?>
<li <?php if ($is_active) { echo \'class="active"\'; $is_active = false; } ;?>><a href="#additional-product-tab-<?php echo $index; ?>" data-toggle="tab"><?php echo $tab[\'name\']; ?></a></li>
<?php endforeach; ?>
</ul>
<div class="tabs-content">
<?php $is_active = true; ?>
<?php if (trim($description) && !$this->journal2->settings->get(\'hide_product_description\')) { ?>
<div class="tab-pane tab-content <?php if ($is_active) { echo \'active\'; $is_active = false; } ;?>" id="tab-description"><?php echo $description; ?></div>
<?php } ?>
<?php if (!empty($customerPhotosData[\'Enabled\']) && $customerPhotosData[\'Enabled\'] == \'yes\' && $customerPhotosData[\'showInTab\'] == \'yes\') { ?>
<div class="tab-pane tab-content1" id="tab_CustomerPhotos">
<?php
$flag=0;
if (!empty($customerPhotosCustomTags)) {
foreach ($customerPhotosCustomTags as $CustomTags) {
if ($CustomTags[\'pid\']==$product_id) {
$flag=1;
if ($customerPhotosData[\'UseSiteShortNameProducts\'] == "yes") {
$tagVar = $customerPhotosData[\'ShortTag\'].$CustomTags[\'tag\'];
} else {
$tagVar = $CustomTags[\'tag\'];
}
}
}
}
if ($flag==0) {
$replace = array(\' \', \'"\', \'"\', \'.\', \',\' ,\'\'\', \'!\', \'-\', \'?\', \'*\', \'+\', \'&\', \'@\', \'$\', \'%\', \':\', \'(\', \')\');
$replaced = array(\'\', \'\', \'\', \'\', \'\', \'\', \'\', \'\', \'\', \'\', \'\', \'\', \'\', \'\', \'\', \'\', \'\', \'\');
$product_strip_unused_chars = str_replace($replace, $replaced, $heading_title);
if (extension_loaded(\'mbstring\')) {
$final_tag_var = mb_substr($product_strip_unused_chars,0,$customerPhotosData[\'TagCharacterLimit\'], \'utf-8\');
$tagVar = $customerPhotosData[\'ShortTag\'].mb_strtolower($final_tag_var,\'utf-8\');
} else {
$final_tag_var = substr($product_strip_unused_chars,0,$customerPhotosData[\'TagCharacterLimit\']);
$tagVar = $customerPhotosData[\'ShortTag\'].strtolower($final_tag_var);
}
}
$patterns = array();
$patterns[0] = \'/%s/\';
$patterns[1] = \'/{Upload link}/\';
$patterns[2] = \'/Twitter/\';
$replacements = array();
$replacements[0] = "<strong>#".$tagVar."</strong>";
$replacements[1] = $text_upload_link_product_page;
$replacements[2] = \'<strong>Twitter</strong>\';
echo preg_replace($patterns, $replacements, $customerPhotosData[\'MainMessage\'][$current_language]); ?>
<br /><br />
<style type="text/css">
.CustomerPhotosImg {
border: none;
height: <?php echo $customerPhotosData[\'tabImageHeight\']; ?>px;
width: auto;
padding: 2px;
display: none;
}
.upload-successful{
text-align:center;
}
#upload-container{
height:300px;
}
#upload-message{
display: inline-block;
width: 100%;
}
.message-container{
text-align: center;
margin-top: 20%;
margin-left: 7%;
}
</style>
<div id="CustomerPhotosImages">
<script>
var customerIgnoredPhotos = \'<?php echo $customerPhotosData[\'IgnoredPhotos\']; ?>\';
</script>
<?php if ($customerPhotosData[\'TwitterEnable\'] == \'yes\') { ?>
<script>
var twitterTag = \'<?php echo $tagVar; ?>\';
$.ajax({
url: \'index.php?route=module/customerphotoswidget/twitterTags&hashtag=\'+twitterTag,
dataType: \'json\',
success: function(data) {
if (data) {
$(data).each(function(index, element) {
if (customerIgnoredPhotos.indexOf(element.image) == -1) {
$(\'#CustomerPhotosImages\').append(\'<a href="\'+element.link+\'" title="Click to see the picture in full size" target="_blank"><img src="\'+element.image+\'" class="CustomerPhotosImg" /></a>\');
}
$(\'.CustomerPhotosImg\').fadeIn(\'slow\');
});
}
}
});
</script>
<?php } ?>
<div class="modal fade" id="upload-modal-product-tpl" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content" >
<div class="modal-header">
<h3 style="text-align:center"><?php echo $entry_resimyukle; ?></h3>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
</div>
<div class="modal-body" id="produt_page_tab">
<div class="row" id="upload-container" style="display:none">
<div class="col-xs-10 message-container" >
<span id="upload-message"><?php echo $entry_resimyukleaciklama; ?></span>
<button class="btn btn-default" id="upload-button"><i class="glyphicon glyphicon-upload"></i> <?php echo $entry_resimyuklebuton; ?></button>
</div>
</div>
<div id="preview" style="display:none; text-align:center">
<div class="dz-preview dz-file-preview">
<div class="dz-details" style="text-align:center">
<img data-dz-thumbnail />
</div>
<br>
<div id="progresbar_container">
<div class="progress progress-striped active" id="bar" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0">
<div class="progress-bar progress-bar-success" style="width:0%;" data-dz-uploadprogress></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<?php if ($customerPhotosData[\'UploadedPhotosEnable\'] == \'yes\') { ?>
<script>
var myDropzone;
var previewTemplate = $(\'#preview\').html();
$(\'#upload-modal-product-tpl\').on(\'shown.bs.modal\', function (e) {
$(\'#upload-container\').css(\'display\',\'block\');
myDropzone = new Dropzone("div#produt_page_tab", {
url: "<?php echo $customer_photos_upload_action?>",
thumbnailWidth: 200,
thumbnailHeight: 200,
previewTemplate:previewTemplate,
clickable:"#upload-button",
});
myDropzone.on(\'sending\', function(file, xhr, formData){
formData.append(\'widget_custom_tag\', \'<?php echo $tagVar; ?>\');
});
myDropzone.on("success", function(progress) {
$(\'.progress-bar\').parent().removeClass("active");
$(\'.modal-body\').append(\'<p class="upload-successful">Your photo has been uploaded and will be reviewed by an administrator</p>\')
});
});
$(\'#upload-button\').click(function(){
$(\'#upload-container\').css(\'display\',\'none\');
})
$(\'#upload-modal-product-tpl\').on(\'hidden.bs.modal\', function (e) {
$(\'.upload-successful\').remove();
myDropzone.destroy()
});
var tag = \'<?php echo $tagVar; ?>\';
$.ajax({
url: \'index.php?route=module/customerphotos/getUploadedPhotos\',
type:\'get\',
dataType: \'json\',
data:{tag:tag},
success: function(data) {
if (data) {
$(data).each(function(index, element) {
if (customerIgnoredPhotos.indexOf(element.image_url) == -1) {
$(\'#CustomerPhotosImages\').append(\'<a href="\'+element.image_preview+\'" title="Click to see the picture in full size" target="_blank"><img src="\'+element.image_url+\'" class="CustomerPhotosImg" /></a>\');
}
$(\'.CustomerPhotosImg\').fadeIn(\'slow\');
});
}
}
});
</script>
<?php } ?>
</div>
</div>
<?php } ?>
<?php if ($attribute_groups) { ?>
<div class="tab-pane tab-content <?php if ($is_active) { echo \'active\'; $is_active = false; } ;?>" id="tab-specification">
<table class="table table-bordered attribute">
<?php foreach ($attribute_groups as $attribute_group) { ?>
<tbody>
<?php foreach ($attribute_group[\'attribute\'] as $attribute) { ?>
<tr>
<td style="width:215px; text-align:left;"><?php echo $attribute[\'name\']; ?></td>
<td style="width:auto;"><?php echo $attribute[\'text\']; ?></td>
</tr>
<?php } ?>
</tbody>
<?php } ?>
</table>
</div>
<?php } ?>
<?php if ($review_status) { ?>
<div class="tab-pane tab-content <?php if ($is_active) { echo \'active\'; $is_active = false; } ;?>" id="tab-review" <?php if ($rating): ?><?php endif; ?>>
<?php if ($rating): ?>
<meta ="ratingValue" content="<?php echo $rating; ?>" />
<meta ="reviewCount" content="<?php echo $this->journal2->settings->get(\'product_num_reviews\'); ?>" />
<meta ="bestRating" content="5" />
<meta ="worstRating" content="1" />
<?php endif; ?>
<form class="form-horizontal" id="form-review">
<div id="review"></div>
<h2 id="review-title"><?php echo $text_write; ?></h2>
<?php if ($review_guest) { ?>
<div class="form-group required">
<div class="col-sm-12">
<label class="control-label" for="input-name"><?php echo $entry_name; ?></label>
<input type="text" name="name" value="<?php echo version_compare(VERSION, \'2.2\', \'<\') ? \'\' : $customer_name; ?>" id="input-name" class="form-control" />
</div>
</div>
<div class="form-group required">
<div class="col-sm-12">
<label class="control-label" for="input-review"><?php echo $entry_review; ?></label>
<textarea name="text" rows="5" id="input-review" class="form-control"></textarea>
<div class="help-block"><?php echo $text_note; ?></div>
</div>
</div>
<div class="form-group required">
<div class="col-sm-12">
<label class="control-label"><?php echo $entry_rating; ?></label>
<?php echo $entry_bad; ?>
<input type="radio" name="rating" value="1" />
<input type="radio" name="rating" value="2" />
<input type="radio" name="rating" value="3" />
<input type="radio" name="rating" value="4" />
<input type="radio" name="rating" value="5" />
<?php echo $entry_good; ?></div>
</div>
<br/>
<?php if (version_compare(VERSION, \'2.0.2\', \'<\')): ?>
<div class="form-group required">
<div class="col-sm-12">
<label class="control-label" for="input-captcha"><?php echo $entry_captcha; ?></label>
<input type="text" name="captcha" value="" id="input-captcha" class="form-control" />
</div>
</div>
<div class="form-group">
<div class="col-sm-12"> <img src="index.php?route=tool/captcha" alt="" id="captcha" /> </div>
</div>
<?php elseif (version_compare(VERSION, \'2.1\', \'<\')): ?>
<?php if ($site_key) { ?>
<div class="form-group">
<div class="col-sm-12">
<div class="g-recaptcha" data-sitekey="<?php echo $site_key; ?>"></div>
</div>
</div>
<?php } ?>
<?php else: ?>
<?php echo $captcha; ?>
<?php endif; ?>
<div class="buttons">
<div class="pull-right">
<button type="button" id="button-review" data-loading-text="<?php echo $text_loading; ?>" class="btn btn-primary button"><?php echo $button_continue; ?></button>
</div>
</div>
<?php } else { ?>
<?php echo $text_login; ?>
<?php } ?>
</form>
</div>
<?php } ?>
<?php $index = 0; foreach ($this->journal2->settings->get(\'additional_product_tabs\', array()) as $tab): $index++; ?>
<div id="additional-product-tab-<?php echo $index; ?>" class="tab-pane tab-content journal-custom-tab <?php if ($is_active) { echo \'active\'; $is_active = false; } ;?>"><?php echo $tab[\'content\']; ?></div>
<?php endforeach; ?>
</div>
</div>
</div>
<?php if ($column_left && $column_right) { ?>
<?php $class = \'col-sm-6\'; ?>
<?php } elseif ($column_left || $column_right) { ?>
<?php $class = \'col-sm-6\'; ?>
<?php } else { ?>
<?php $class = \'col-sm-4\'; ?>
<?php } ?>
<div class="right">
<?php if ($this->journal2->settings->get(\'product_page_title_position\', \'top\') === \'right\'): ?>
<h1 class="heading-title"><?php echo $heading_title; ?></h1>
<?php endif; ?>
<div id="product" class="product-options">
<?php foreach ($this->journal2->settings->get(\'additional_product_description_top\', array()) as $tab): ?>
<div class="journal-custom-tab">
<?php if ($tab[\'has_icon\']): ?>
<div class="block-icon block-icon-left" style="<?php echo $tab[\'icon_css\']; ?>"><?php echo $tab[\'icon\']; ?></div>
<?php endif; ?>
<?php if ($tab[\'name\']): ?>
<h3><?php echo $tab[\'name\']; ?></h3>
<?php endif; ?>
<?php echo $tab[\'content\']; ?>
</div>
<?php endforeach; ?>
<ul class="list-unstyled description">
<?php if($this->journal2->settings->get(\'product_views\')): ?>
<li class="product-views-count"><img style="margin-top:-14px;"src="https://www.sarayperdehome.com/image/grafikler/ucretsiz-kargo-anime.gif"></li>
<?php endif; ?>
<?php if($this->journal2->settings->get(\'manufacturer_image\') == \'on\'): ?>
<li class="brand-logo">
<a href="<?php echo $manufacturers; ?>" class="brand-image">
<img src="<?php echo $manufacturer_image; ?>" width="<?php echo $manufacturer_image_width; ?>" height="<?php echo $manufacturer_image_height; ?>" alt="<?php echo $manufacturer; ?>" />
</a>
<?php if(isset($manufacturer_image_name) && $manufacturer_image_name): ?>
<a href="<?php echo $manufacturers; ?>" class="brand-logo-text">
<?php echo $manufacturer_image_name; ?>
</a>
<?php endif; ?>
</li>
<?php else: ?>
<?php if ($manufacturer) { ?>
<li class="p-brand"><?php echo $text_manufacturer; ?> <a href="<?php echo $manufacturers; ?>"><?php echo $manufacturer; ?></a></li>
<?php } ?>
<?php endif; ?>
<li class="p-model"><?php echo $text_model; ?> <span class="p-model"><?php echo $model; ?></span></li>
<?php if ($reward) { ?>
<li class="p-rewards"><?php echo $text_reward; ?> <span class="p-rewards"><?php echo $reward; ?></span></li>
<?php } ?>
<li class="p-stock"><?php echo $text_stock; ?> <span class="journal-stock <?php echo isset($stock_status) ? $stock_status : \'\'; ?>"><?php echo $stock; ?></span></li>
</ul>
<?php if($this->journal2->settings->get(\'product_sold\')): ?>
<div class="product-sold-count-text"><?php echo $this->journal2->settings->get(\'product_sold\'); ?></div>
<?php endif; ?>
<?php if (isset($date_end) && $date_end && $this->journal2->settings->get(\'show_countdown_product_page\', \'on\') == \'on\'): ?>
<div class="countdown-wrapper"><div class="expire-text"><?php echo $this->journal2->settings->get(\'countdown_product_page_title\'); ?></div><div class="countdown"></div></div>
<script>Journal.countdown($(\'.right .countdown\'), \'<?php echo $date_end; ?>\');</script>
<?php endif; ?>
<?php if ($price) { ?>
<div style="margin-top:5px; margin-bottom:0px;" class="perde-olcu">
<ul>
<?php if ($urun_tip == "stor" || $urun_tip == "jaluzi") { ?>
<li>
<span style="font-size:14px; margin-bottom:6px;"><b>* <?php echo $entry_engiriniz; ?></b></span>
<select name="option[en]" id="sen">
<option value="0">-- <?php echo $entry_perdenineniplace; ?> --</option>
<?php for ($i=30;$i<=$en;$i++) { ?>
<option value="<?php echo $i; ?>"><?php echo $i; ?> cm</option>
<?php } ?>
</select>
</li>
<li style="float:right;">
<div style="margin-left:10px;">
<span style="font-size:14px; margin-bottom:6px;"><b>* <?php echo $entry_boygiriniz; ?></b></span>
<select name="option[boy]" id="sboy">
<option value="0">-- <?php echo $entry_perdeninboyuplace; ?> --</option>
<?php for ($i=30;$i<=$boy;$i++) { ?>
<option value="<?php echo $i; ?>"><?php echo $i; ?> cm</option>
<?php } ?>
</select>
</div>
</li>
<?php }else if ($urun_tip == "perde") { ?>
<li>
<span style="font-size:14px; margin-bottom:6px;"><b>* <?php echo $entry_engiriniz; ?></b></span>
<select name="option[en]" id="pen">
<option value="0">-- <?php echo $entry_perdeninenistandartplace; ?> --</option>
<?php for ($i=30;$i<=$en;$i++) { ?>
<option value="<?php echo $i; ?>"><?php echo $i; ?> cm</option>
<?php } ?>
</select>
</li>
<li>
<div style="margin-left:10px;">
<span style="font-size:14px; margin-bottom:6px;"><b>* <?php echo $entry_boygiriniz; ?></b></span>
<select name="option[boy]" id="pboy">
<option value="0">-- <?php echo $entry_perdeninboyustandartplace; ?> --</option>
<?php for ($i=180;$i<=$boy;$i++) { ?>
<option value="<?php echo $i; ?>"><?php echo $i; ?> cm</option>
<?php } ?>
</select>
</div>
</li>
<li style="width:98%; margin-top:15px; margin-bottom:0px;">
<span style="font-size:14px; margin-bottom:6px;"><b><?php echo $entry_pile; ?></b></span>
<select name="option[pile]" id="ppile">
<option value="2.5"><?php echo $entry_pileseyrek; ?></option>
<option value="2.75"><?php echo $entry_pileorta; ?></option>
<option value="3"><?php echo $entry_pilesik; ?></option>
</select>
</li>
<?php }else if ($urun_tip == "rustik-test") { ?>
<li>
<span style="font-size:14px; margin-bottom:6px;"><?php echo $entry_ebatgir; ?></b></span>
<select name="option[rustik]" id="pebat">
<option value="0">-- seiniz --</option>
<option value="100">100 cm</option>
<option value="150">150 cm</option>
<option value="200">200 cm</option>
<option value="250">250 cm</option>
<option value="300">300 cm</option>
</select>
</li>
<?php }else if ($urun_tip == "varak-test") { ?>
<li>
<span style="font-size:14px; margin-bottom:6px;"><?php echo $entry_ebatgir; ?></b></span>
<select name="option[varak]" id="pebat">
<option value="0">-- seiniz --</option>
<option value="55">55 cm\'e kadar</option>
<option value="105">105 cm\'e kadar</option>
<option value="155">155 cm\'e kadar</option>
<option value="205">205 cm\'e kadar</option>
<option value="280">280 cm\'e kadar</option>
</select>
</li>
<?php } ?>
</ul>
</div>
<ul class="list-unstyled price">
<meta ="itemCondition" />
<meta ="priceCurrency" content="<?php echo $this->journal2->settings->get(\'product_price_currency\'); ?>" />
<meta ="price" content="<?php echo $this->journal2->settings->get(\'product_price\'); ?>" />
<?php if ($this->journal2->settings->get(\'product_in_stock\') === \'yes\'): ?>
<link ="availability" href="http://schema.org/InStock" />
<?php endif; ?>
<?php if (!$special) { ?>
<li class="product-price"><?php echo $price; ?></li>
<?php } else { ?>
<li class="price-old"><?php echo $price; ?></li>
<li class="price-new"><?php echo $special; ?></li>
<?php } ?>
<?php if ($tax) { ?>
<li class="price-tax"><?php echo $text_tax; ?> <?php echo $tax; ?></li>
<?php } ?>
<?php if ($points) { ?>
<li class="reward"><small><?php echo $text_points; ?> <?php echo $points; ?></small></li>
<?php } ?>
<?php if ($discounts) { ?>
<?php foreach ($discounts as $discount) { ?>
<li class="discounts"><?php echo $discount[\'quantity\']; ?><?php echo $text_discount; ?><?php echo $discount[\'price\']; ?></li>
<?php } ?>
<?php } ?>
</ul>
<?php } ?>
<?php if ($categories) { ?>
<?php foreach ($categories as $category) { ?>
<!-- Stor perde -->
<?php if ($category[\'category_id\'] == \'59\') { ?>
<div style="margin-bottom:-15px;">
<div style="background-color: #f3f3f3;
border: 1px solid #dcdcdc;
padding: 10px;
margin-bottom: 15px;
-moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075);
-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075);
box-shadow: inset 0 1px 1px rgba(0,0,0,.075);
color: #555555;">Girmi olduunuz en ls mekanizma dahil ldr. Kuma 4 cm eksik kesilmektedir. ly buna gre giriniz. (llerinizi setikten sonra tutar otomatik olarak hesaplanacaktr.)</div></div>
<?php } ?>
<!-- Zebra perde -->
<?php if ($category[\'category_id\'] == \'66\') { ?>
<div style="margin-bottom:-15px;">
<div style="background-color: #f3f3f3;
border: 1px solid #dcdcdc;
padding: 10px;
margin-bottom: 15px;
-moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075);
-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075);
box-shadow: inset 0 1px 1px rgba(0,0,0,.075);
color: #555555;">Girmi olduunuz en ls mekanizma dahil ldr. Kuma 4 cm eksik kesilmektedir. ly buna gre giriniz. (llerinizi setikten sonra tutar otomatik olarak hesaplanacaktr.)</div></div>
<?php } ?>
<?php } ?>
<?php } ?>
<!--<style>
#seceklerListess li{
list-style:none;
list-style-type:none;
display:block;
float:left;
margin-left:10px;
}
#seceklerListess li{
width:40%;
}
</style> -->
<input type="hidden" name="toplam-hesap" id="toplam-hesap" value=""/>
<input type="hidden" id="fiyattt" value="<?php echo $fiyat; ?>"/>
<input type="hidden" id="kampanyaaa" value="<?php echo $kampanya ?>"/>
<input type="hidden" id="fiyattt2" value="<?php echo $fiyat2; ?>"/>
<input type="hidden" id="kampanyaaa2" value="<?php echo $kampanya2 ?>"/>
<script type="text/javascript">
function hesapla123(){
$(\'#sen\').trigger("change");
}
// quantity = parseInt($("#input-quantity").val();
$(\'#sen\').change(function (){
var en = $(\'#sen\').val();
var boy = $(\'#sboy\').val();
if (boy<=200){
boy = 200;
}else{
var bsay = boy.substr(1, 2);
var bson = boy.substr(2,2);
if (bson!=0) {
bson = 10 - bson;
boy = parseInt(boy) + parseInt(bson);
}
}
if (en<=100){
en = 100;
}else{
var esay = en.substr(1, 2);
var eson = en.substr(2,2);
if (eson!=0) {
eson = 10 - eson;
en = parseInt(en) + parseInt(eson);
}
}
if (boy > 0){
var adet = parseInt($("#input-quantity").val());
metre= (en*boy*adet)/10000;
metre=metre.toFixed(2);
$(\'#perde-hesap\').html("");
<?php if (!$special) { ?>
sonuc= metre*$("#fiyattt").val();
sonuc=sonuc.toFixed(2);
sonuc2= metre*$("#fiyattt2").val();
sonuc2=sonuc2.toFixed(2);
<?php } else { ?>
sonuc= metre*$("#kampanyaaa").val();
sonuc=sonuc.toFixed(2);
sonuc2= metre*$("#kampanyaaa2").val();
sonuc2=sonuc2.toFixed(2);
<?php } ?>
toplam_hesap=(sonuc/adet).toFixed(2);
$(\'#toplam-hesap\').val(toplam_hesap);
if ($(\'#sboy\').val()>0){
$(\'#perde-hesap\').addClass(\'perde-hesap\');
$(\'#perde-hesap\').append(\'<?php echo $entry_ebatsonuc; ?> <span id="metre">\' + metre + \'</span> m<sup>2</sup>, <?php echo $entry_sonuctutar; ?> <span id="fiyat">\' + sonuc2 + \'</span> <?php echo $this->currency->getCode(); ?> + <?php echo $entry_artivergi; ?>\');
}
}
});
$(\'#sboy\').change(function (){
var en = $(\'#sen\').val();
var boy = $(\'#sboy\').val();
if (boy<=200){
boy = 200;
}else{
var bsay = boy.substr(1, 2);
var bson = boy.substr(2,2);
if (bson!=0) {
bson = 10 - bson;
boy = parseInt(boy) + parseInt(bson);
}
}
if (en<=100){
en = 100;
}else{
var esay = en.substr(1, 2);
var eson = en.substr(2,2);
if (eson!=0) {
eson = 10 - eson;
en = parseInt(en) + parseInt(eson);
}
}
if (en > 0){
var adet = parseInt($("#input-quantity").val());
metre= (en*boy*adet)/10000; metre=metre.toFixed(2);
$(\'#perde-hesap\').html("");
<?php if (!$special) { ?>
sonuc= metre*$("#fiyattt").val();
sonuc=sonuc.toFixed(2);
sonuc2= metre*$("#fiyattt2").val();
sonuc2=sonuc2.toFixed(2);
<?php } else { ?>
sonuc= metre*$("#kampanyaaa").val();
sonuc=sonuc.toFixed(2);
sonuc2= metre*$("#kampanyaaa2").val();
sonuc2=sonuc2.toFixed(2);
<?php } ?>
toplam_hesap=(sonuc/adet).toFixed(2);
$(\'#toplam-hesap\').val(toplam_hesap);
if ($(\'#sen\').val()>0){
$(\'#perde-hesap\').addClass(\'perde-hesap\');
$(\'#perde-hesap\').append(\'<?php echo $entry_ebatsonuc; ?> <span id="metre">\' + metre + \'</span> m<sup>2</sup>, <?php echo $entry_sonuctutar; ?> <span id="fiyat">\' + sonuc2 + \'</span> <?php echo $this->currency->getCode(); ?> + <?php echo $entry_artivergi; ?>\');
}
}
});
$(\'#pen\').change(function (){
var en = $(\'#pen\').val();
var boy = $(\'#pboy\').val();
var pile = $(\'#ppile\').val();
if (boy > 0){
var adet = parseInt($("#input-quantity").val());
metre= (en*1*adet*pile)/100;
$(\'#perde-hesap\').html("");
<?php if (!$special) { ?>
sonuc= metre*$("#fiyattt").val();
sonuc=sonuc.toFixed(2);
sonuc2= metre*$("#fiyattt2").val();
sonuc2=sonuc2.toFixed(2);
<?php } else { ?>
sonuc= metre*$("#kampanyaaa").val();
sonuc=sonuc.toFixed(2);
sonuc2= metre*$("#kampanyaaa2").val();
sonuc2=sonuc2.toFixed(2);
<?php } ?>
toplam_hesap=(sonuc/adet).toFixed(2);
$(\'#toplam-hesap\').val(toplam_hesap);
if($(\'#pboy\').val()>0){
$(\'#perde-hesap\').addClass(\'perde-hesap\');
$(\'#perde-hesap\').append(\'<?php echo $entry_ebatsonuc; ?> <span id="metre">\' + metre + \'</span> mt, <?php echo $entry_sonuctutar; ?> <span id="fiyat">\' + sonuc2 + \'</span> <?php echo $this->currency->getCode(); ?> + <?php echo $entry_artivergi; ?>\');
}
}
});
$(\'#pboy\').change(function (){
var en = $(\'#pen\').val();
var boy = $(\'#pboy\').val();
var pile = $(\'#ppile\').val();
if (en > 0){
var adet = parseInt($("#input-quantity").val());
metre= (en*1*adet*pile)/100;
$(\'#perde-hesap\').html("");
<?php if (!$special) { ?>
sonuc= metre*$("#fiyattt").val();
sonuc=sonuc.toFixed(2);
sonuc2= metre*$("#fiyattt2").val();
sonuc2=sonuc2.toFixed(2);
<?php } else { ?>
sonuc= metre*$("#kampanyaaa").val();
sonuc=sonuc.toFixed(2);
sonuc2= metre*$("#kampanyaaa2").val();
sonuc2=sonuc2.toFixed(2);
<?php } ?>
toplam_hesap=(sonuc/adet).toFixed(2);
$(\'#toplam-hesap\').val(toplam_hesap);
if ($(\'#pen\').val()>0){
$(\'#perde-hesap\').addClass(\'perde-hesap\');
$(\'#perde-hesap\').append(\'<?php echo $entry_ebatsonuc; ?> <span id="metre">\' + metre + \'</span> mt, <?php echo $entry_sonuctutar; ?> <span id="fiyat">\' + sonuc2 + \'</span> <?php echo $this->currency->getCode(); ?> + <?php echo $entry_artivergi; ?>\');
}
}
});
$(\'#ppile\').change(function (){
var en = $(\'#pen\').val();
var boy = $(\'#pboy\').val();
var pile = $(\'#ppile\').val();
if (en > 0){
var adet = parseInt($("#input-quantity").val());
metre= (en*1*adet*pile)/100;
$(\'#perde-hesap\').html("");
<?php if (!$special) { ?>
sonuc= metre*$("#fiyattt").val();
sonuc=sonuc.toFixed(2);
sonuc2= metre*$("#fiyattt2").val();
sonuc2=sonuc2.toFixed(2);
<?php } else { ?>
sonuc= metre*$("#kampanyaaa").val();
sonuc=sonuc.toFixed(2);
sonuc2= metre*$("#kampanyaaa2").val();
sonuc2=sonuc2.toFixed(2);
<?php } ?>
toplam_hesap=(sonuc/adet).toFixed(2);
$(\'#toplam-hesap\').val(toplam_hesap);
$(\'#perde-hesap\').addClass(\'perde-hesap\');
$(\'#perde-hesap\').append(\'<?php echo $entry_ebatsonuc; ?> <span id="metre">\' + metre + \'</span> mt, <?php echo $entry_sonuctutar; ?> <span id="fiyat">\' + sonuc2 + \'</span> <?php echo $this->currency->getCode(); ?> + <?php echo $entry_artivergi; ?>\');
}
});
$(\'#pebat\').change(function (){
var ebat = $(\'#pebat\').val();
if (ebat > 0){
var adet = parseInt($("#input-quantity").val());
metre= (ebat*adet)/1000000;
$(\'#perde-hesap\').html("");
<?php if (!$special) { ?>
sonuc= metre*$("#fiyattt").val();
sonuc=sonuc.toFixed(2);
sonuc2= metre*$("#fiyattt2").val();
sonuc2=sonuc2.toFixed(2);
<?php } else { ?>
sonuc= metre*$("#kampanyaaa").val();
sonuc=sonuc.toFixed(2);
sonuc2= metre*$("#kampanyaaa2").val();
sonuc2=sonuc2.toFixed(2);
<?php } ?>
toplam_hesap=(sonuc/adet).toFixed(2);
$(\'#toplam-hesap\').val(toplam_hesap);
$(\'#perde-hesap\').addClass(\'perde-hesap\');
$(\'#perde-hesap\').append(\'<?php echo $entry_ebatsonuc; ?> <span id="metre">\' + ebat*adet + \'</span> cm, <?php echo $entry_sonuctutar; ?> <span id="fiyat">\' + sonuc2 + \'</span> <?php echo $this->currency->getCode(); ?> + <?php echo $entry_artivergi; ?>\');
}
});
</script>
<?php if ($options) { ?>
<script>
function sayfala(sayfa,id,islem){
var sorgu= $("input[type=\'radio\'][name=\'option["+id+"]\']:checked").val();
if (islem == \'+\') {
if (sorgu=="") { $(\'#sepete-ekle\').trigger(\'click\'); }else {
$(\'.adim\' + sayfa).hide();
$(\'.adim\' + (parseInt(sayfa) + 1)).show();
}
} else {
$(\'.adim\' + sayfa).hide();
$(\'.adim\' + (parseInt(sayfa) - 1)).show();
}
}
</script>
<div id="fbfancy" style="display: none;">
<div id="secenekler">
<div id="options" class="options">
<?php $xj=0; foreach($options as $sayfa){ $sayfa_say[]=$sayfa[\'sayfa\'];} $sayfalandirma = max($sayfa_say); $sayfalar = count($options);
$popup_ac_new = false;
foreach ($options as $option) {
if($option["sayfa"] > 0){
$popup_ac_new = true;
?>
<?php if ($option[\'type\'] == \'select\') { ?>
<div id="option-<?php echo $option[\'product_option_id\']; ?>" class="option option-<?php echo $option[\'type\']; ?>">
<?php if ($option[\'required\']) { ?>
<span class="required">*</span>
<?php } ?>
<b><?php echo $option[\'name\']; ?>:</b><br />
<select class="acilir_listeler" name="option[<?php echo $option[\'product_option_id\']; ?>]">
<option value=""><?php echo $text_select; ?></option>
<?php foreach ($option[\'product_option_value\'] as $option_value) { ?>
<option value="<?php echo $option_value[\'product_option_value_id\']; ?>" data-image="<?php echo $option_value[\'image\']; ?>"><?php echo $option_value[\'name\']; ?>
<?php if ($option_value[\'price\']) { ?>
(<?php echo $option_value[\'price_prefix\']; ?><?php echo $option_value[\'price\']; ?>)
<?php } ?>
</option>
<?php } ?>
</select>
</div>
<?php } ?>
<?php if ($option[\'type\'] == \'radio\') { ?>
<div id="option-<?php echo $option[\'product_option_id\']; ?>" data-sayfa="<?php echo $option[\'sayfa\']; ?>" class="option option-<?php echo $option[\'type\']; ?> adim<?php echo $option[\'sayfa\']; ?>">
<div style="clear:both;"></div>
<div style="width:100%; padding-top:5px; margin-bottom:10px; border-bottom:1px dashed #ccc;">
<span class="lightyazisb"><b><?php echo $option[\'name\']; ?></b></span>
</div>
<ul id="option-sec">
<?php $ix=1; foreach ($option[\'product_option_value\'] as $option_value) { ?>
<li>
<div class="list">
<label for="option-value-<?php echo $option_value[\'product_option_value_id\']; ?>">
<img src="<?php echo $option_value[\'image\']; ?>" width="100%" height="100" alt="<?php echo $option_value[\'name\']; ?>" style="height: 100px ! important; margin-bottom:-5px;" />
</label>
</div>
<div class="label-title">
<input style="float: left" data-price="" type="radio" <?php echo ($ix==1) ? "checked" : ""; ?> name="option[<?php echo $option[\'product_option_id\']; ?>]" value="<?php echo $option_value[\'product_option_value_id\']; ?>" data-image="<?php echo $option_value[\'image\']; ?>" id="option-value-<?php echo $option_value[\'product_option_value_id\']; ?>" />
<b><?php echo $option_value[\'name\']; ?>
<?php if ($option_value[\'price\']) { ?>
(<?php echo $option_value[\'price_prefix\']; ?><?php echo $option_value[\'price\']; ?>)
<?php } ?>
</b>
</div>
</li>
<?php $ix++; $xj++; } ?>
</ul>
<div style="clear:both;"></div>
<?php
if ($option[\'sayfa_baslik\']==1) { ?>
<div >
<div style="float:right;margin-left:5px;width:49%">
<?php if ($option[\'sayfa\']== $sayfalandirma){ ?>
<button id="sepete-ekle" class="btn-evyellow" name="SepeteAt"><?php echo $entry_sepeteekle; ?></button>
<?php }else{ ?>
<button onclick="sayfala(\'<?php echo $option[\'sayfa\']; ?>\',\'<?php echo $option[\'product_option_id\']; ?>\',\'+\');" name="DevamEt" class="btn-evyellow"><?php echo $entry_devam; ?></button>
<?php } ?>
</div>
<?php if ($option[\'sayfa\']>1){ ?>
<div style="float:right;width:49%">
<button onclick="sayfala(\'<?php echo $option[\'sayfa\']; ?>\',\'<?php echo $option[\'product_option_id\']; ?>\',\'-\');" name="GeriDon" class="btn-evblue"><?php echo $entry_geridon; ?></button>
</div>
<?php }else{ ?>
<div style="float:right;width:49%">
<button onclick="$.fancybox.close();" name="GeriDon" id="GeriDon" class="btn-evblue"><?php echo $entry_kapat; ?></button>
</div>
<?php } ?>
</div>
<?php } ?>
</div>
<?php } ?>
<?php if ($option[\'type\'] == \'checkbox\') { ?>
<div id="option-<?php echo $option[\'product_option_id\']; ?>" class="option option-<?php echo $option[\'type\']; ?>">
<?php if ($option[\'required\']) { ?>
<span class="required">*</span>
<?php } ?>
<b><?php echo $option[\'name\']; ?>:</b><br />
<?php foreach ($option[\'product_option_value\'] as $option_value) { ?>
<input type="checkbox" name="option[<?php echo $option[\'product_option_id\']; ?>][]" value="<?php echo $option_value[\'product_option_value_id\']; ?>" data-image="<?php echo $option_value[\'image\']; ?>" id="option-value-<?php echo $option_value[\'product_option_value_id\']; ?>" />
<label for="option-value-<?php echo $option_value[\'product_option_value_id\']; ?>"><?php echo $option_value[\'name\']; ?>
<?php if ($option_value[\'price\']) { ?>
(<?php echo $option_value[\'price_prefix\']; ?><?php echo $option_value[\'price\']; ?>)
<?php } ?>
</label>
<br />
<?php } ?>
</div>
<br />
<?php } ?>
<?php if ($option[\'type\'] == \'image\') { ?>
<div id="option-<?php echo $option[\'product_option_id\']; ?>" class="option option-<?php echo $option[\'type\']; ?>">
<?php if ($option[\'required\']) { ?>
<span class="required">*</span>
<?php } ?>
<b><?php echo $option[\'name\']; ?>:</b><br />
<table class="option-image">
<?php $ix=1; foreach ($option[\'product_option_value\'] as $option_value) { ?>
<tr>
<td style="width: 1px;">
<input type="radio" name="option[<?php echo $option[\'product_option_id\']; ?>]" value="<?php echo $option_value[\'product_option_value_id\']; ?>" id="option-value-<?php echo $option_value[\'product_option_value_id\']; ?>" /></td>
<td><label for="option-value-<?php echo $option_value[\'product_option_value_id\']; ?>"><img src="<?php echo $option_value[\'image\']; ?>" width="220" height="100" alt="<?php echo $option_value[\'name\'] . ($option_value[\'price\'] ? \' \' . $option_value[\'price_prefix\'] . $option_value[\'price\'] : \'\'); ?>" /></label></td>
<td><label for="option-value-<?php echo $option_value[\'product_option_value_id\']; ?>"><?php echo $option_value[\'name\']; ?>
<?php if ($option_value[\'price\']) { ?>
(<?php echo $option_value[\'price_prefix\']; ?><?php echo $option_value[\'price\']; ?>)
<?php } ?>
</label></td>
</tr>
<?php $ix++; } ?>
</table>
</div>
<br />
<?php } ?>
<?php if ($option[\'type\'] == \'text\') { ?>
<div id="option-<?php echo $option[\'product_option_id\']; ?>" class="option">
<?php if ($option[\'required\']) { ?>
<span class="required">*</span>
<?php } ?>
<b><?php echo $option[\'name\']; ?>:</b><br />
<input type="text" name="option[<?php echo $option[\'product_option_id\']; ?>]" value="" placeholder="<?php echo $option[\'placeholder\']; ?>"/>
</div>
<br />
<?php } ?>
<?php if ($option[\'type\'] == \'textarea\') { ?>
<div id="option-<?php echo $option[\'product_option_id\']; ?>" class="option">
<?php if ($option[\'required\']) { ?>
<span class="required">*</span>
<?php } ?>
<b><?php echo $option[\'name\']; ?>:</b><br />
<textarea name="option[<?php echo $option[\'product_option_id\']; ?>]" cols="40" rows="5"><?php echo $option[\'product_option_value\']; ?></textarea>
</div>
<br />
<?php } ?>
<?php if ($option[\'type\'] == \'file\') { ?>
<div id="option-<?php echo $option[\'product_option_id\']; ?>" class="option">
<?php if ($option[\'required\']) { ?>
<span class="required">*</span>
<?php } ?>
<b><?php echo $option[\'name\']; ?>:</b><br />
<input type="button" value="<?php echo $button_upload; ?>" id="button-option-<?php echo $option[\'product_option_id\']; ?>" class="button">
<input type="hidden" name="option[<?php echo $option[\'product_option_id\']; ?>]" value="" />
</div>
<br />
<?php } ?>
<?php if ($option[\'type\'] == \'date\') { ?>
<div id="option-<?php echo $option[\'product_option_id\']; ?>" class="option">
<?php if ($option[\'required\']) { ?>
<span class="required">*</span>
<?php } ?>
<b><?php echo $option[\'name\']; ?>:</b><br />
<input type="text" name="option[<?php echo $option[\'product_option_id\']; ?>]" value="<?php echo $option[\'product_option_value\']; ?>" class="date" />
</div>
<br />
<?php } ?>
<?php if ($option[\'type\'] == \'datetime\') { ?>
<div id="option-<?php echo $option[\'product_option_id\']; ?>" class="option">
<?php if ($option[\'required\']) { ?>
<span class="required">*</span>
<?php } ?>
<b><?php echo $option[\'name\']; ?>:</b><br />
<input type="text" name="option[<?php echo $option[\'product_option_id\']; ?>]" value="<?php echo $option[\'product_option_value\']; ?>" class="datetime" />
</div>
<br />
<?php } ?>
<?php if ($option[\'type\'] == \'time\') { ?>
<div id="option-<?php echo $option[\'product_option_id\']; ?>" class="option">
<?php if ($option[\'required\']) { ?>
<span class="required">*</span>
<?php } ?>
<b><?php echo $option[\'name\']; ?>:</b><br />
<input type="text" name="option[<?php echo $option[\'product_option_id\']; ?>]" value="<?php echo $option[\'product_option_value\']; ?>" class="time" />
</div>
<br />
<?php } ?>
<?php } ?>
<?php } ?>
</div>
</div>
</div>
<?php } ?>
<?php if ($recurrings) { ?>
<hr>
<h3><?php echo $text_payment_recurring ?></h3>
<div class="form-group required">
<select name="recurring_id" class="form-control">
<option value=""><?php echo $text_select; ?></option>
<?php foreach ($recurrings as $recurring) { ?>
<option value="<?php echo $recurring[\'recurring_id\'] ?>"><?php echo $recurring[\'name\'] ?></option>
<?php } ?>
</select>
<div class="help-block" id="recurring-description"></div>
</div>
<?php } ?>
<div id="perde-hesap">
</div>
<input id="sayfa-no" value="1" type="hidden">
<div class="form-group cart <?php echo isset($labels) && is_array($labels) && isset($labels[\'outofstock\']) ? \'outofstock\' : \'\'; ?>">
<div>
<?php if($this->journal2->settings->get(\'hide_add_to_cart_button\')): ?>
<?php foreach ($this->journal2->settings->get(\'additional_product_enquiry\', array()) as $tab): ?>
<div><?php echo $tab[\'content\']; ?></div>
<?php endforeach; ?>
<input type="hidden" name="product_id" value="<?php echo $product_id; ?>" />
<?php else: ?>
<!--<div id="mobile" style="margin-bottom:15px; color:#238C00;">
<ul style="list-style-type:none; margin-left:0px; padding-left:0px;">
<li><i class="fa fa-calendar"></i> <?php echo $entry_isgunukargo; ?></li>
<li style="margin-top:7px;"><i class="fas fa-lock"></i> <?php echo $entry_guvenliodeme; ?></li>
<li style="margin-top:7px;"><i class="fas fa-credit-card"></i> <?php echo $entry_kredikarti; ?></li>
<li style="margin-top:7px;"><i class="fas fa-check-circle"></i> <?php echo $entry_havaleeftodeme; ?></li>
</ul>
</div>-->
<span class="qty">
<input type="text" name="quantity" value="<?php echo $minimum; ?>" size="2" data-min-value="<?php echo $minimum; ?>" id="input-quantity" class="form-control" />
<input type="hidden" name="product_id" value="<?php echo $product_id; ?>" />
<script>
/* quantity buttons */
var $input = $(\'.cart input[name="quantity"]\');
function up() {
var val = parseInt($input.val(), 10) + 1 || parseInt($input.attr(\'data-min-value\'), 10);
$input.val(val);
hesapla123();
}
function down() {
var val = parseInt($input.val(), 10) - 1 || 0;
var min = parseInt($input.attr(\'data-min-value\'), 10) || 1;
$input.val(Math.max(val, min));
hesapla123();
}
$(\'<a href="javascript:;" class="journal-stepper">-</a>\').insertBefore($input).click(down);
$(\'<a href="javascript:;" class="journal-stepper">+</a>\').insertAfter($input).click(up);
$input.keydown(function (e) {
if (e.which === 38) {
up();
return false;
}
if (e.which === 40) {
down();
return false;
}
});
</script>
</span>
<button type="button" onclick="popup_ac()" id="button-cart" data-loading-text="<?php echo $text_loading; ?>" class="button"><span class="button-cart-text"><?php echo $button_cart; ?></span></button>
<?php endif; ?>
</div>
<img style="margin-top:20px; width:100%;" src="https://www.sarayperdehome.com/image/grafikler/urun-sayfasi-iconlar.png">
<a class="fancybox" href="#fbfancy"></a>
<a class="fancyboxx" href="#after-sayfa" style="display:none;"></a>
<div id="after-sayfa" style="display: none;height: 35px; width: 100%; position: absolute; bottom: 10px;">
<a onclick="window.location.replace(\'index.php\')" class="btn-evblue" style="width:45%;float:left">Alverie Devam Et</a>
<a onclick="window.location.replace(\'index.php?route=checkout/cart\')" class="btn-evyellow" style="width:45%;float:left">Sepete Git</a>
</div>
<script>
function kontrol() {
var sen = $(\'#sen\').val();
var sboy = $(\'#sboy\').val();
var en = $(\'#pen\').val();
var boy = $(\'#pboy\').val();
var ebat = $(\'#pebat\').val();
if (sen == 0) {
alert("<?php echo $entry_uyarien; ?>");
return false;
}
if (sboy ==0) {
alert("<?php echo $entry_uyariboy; ?>");
return false;
}
if (en==0) {
alert("<?php echo $entry_uyarien; ?>");
return false;
}
if (boy ==0) {
alert("<?php echo $entry_uyariboy; ?>");
return false;
}
if (ebat < 1) {
alert("<?php echo $entry_uyariebat; ?>");
return false;
}
/* addToCart(\'<?php echo $product_id; ?>\');*/
alert ("sepete eklicem. kodumu a");
}
</script>
</div>
<?php if ($minimum > 1) { ?>
<div class="alert alert-info"><i class="fa fa-info-circle"></i> <?php echo $text_minimum; ?></div>
<?php } ?>
<div class="wishlist-compare">
<span class="links">
<a onclick="addToWishList(\'<?php echo $product_id; ?>\');"><?php echo $button_wishlist; ?></a>
<a onclick="addToCompare(\'<?php echo $product_id; ?>\');"><?php echo $button_compare; ?></a>
</span>
</div>
<?php if ($review_status) { ?>
<div class="rating">
<ul style="margin-left:-20px; margin-top:1px; margin-bottom:-5px;">
<li>Etek, boncuk ve dier seenekler (varsa) <span style="color:#DB1D0D;">Sepete Ekle</span> butonuna tkladktan sonra alacaktr.</li>
<li>Kredi kart taksit seenekleri deme sayfasnda gsterilecektir.</li>
<li>Sipariinizle ilgili notunuz varsa deme sayfasnda belirtebilirsiniz.</li>
</ul>
</div>
<?php } ?>
<?php if ($review_status) { ?>
<div class="rating">
<p>
<?php for ($i = 1; $i <= 5; $i++) { ?>
<?php if ($rating < $i) { ?>
<span class="fa fa-stack"><i class="fa fa-star-o fa-stack-1x"></i></span>
<?php } else { ?>
<span class="fa fa-stack"><i class="fa fa-star fa-stack-1x"></i><i class="fa fa-star-o fa-stack-1x"></i></span>
<?php } ?>
<?php } ?>
<a href="" onclick="$(\'a[href=\'#tab-review\']\').trigger(\'click\'); return false;"><?php echo $reviews; ?></a> / <a href="" onclick="$(\'a[href=\'#tab-review\']\').trigger(\'click\'); return false;"><?php echo $text_write; ?></a></p>
</div>
<?php } ?>
<?php if ($this->journal2->settings->get(\'share_buttons_status\') && (!Journal2Cache::$mobile_detect->isMobile() || (Journal2Cache::$mobile_detect->isMobile() && !$this->journal2->settings->get(\'share_buttons_disable_on_mobile\', 1))) && $this->journal2->settings->get(\'share_buttons_position\') === \'right\' && count($this->journal2->settings->get(\'config_share_buttons\', array()))): ?>
<div class="social share-this <?php echo $this->journal2->settings->get(\'share_buttons_disable_on_mobile\', 1) ? \'hide-on-mobile\' : \'\'; ?>">
<div class="social-loaded">
<script type="text/javascript">var switchTo5x=true;</script>
<script type="text/javascript" src="https://ws.sharethis.com/button/buttons.js"></script>
<script type="text/javascript">stLight.options({publisher: "<?php echo $this->journal2->settings->get(\'share_buttons_account_key\'); ?>", doNotHash: true, doNotCopy: true, hashAddressBar: false});</script>
<?php foreach ($this->journal2->settings->get(\'config_share_buttons\', array()) as $item): ?>
<span class="<?php echo $item[\'class\'] . $this->journal2->settings->get(\'share_buttons_style\'); ?>" displayText="<?php echo $this->journal2->settings->get(\'share_buttons_style\') ? $item[\'name\'] : \'\'; ?>"></span>
<?php endforeach; ?>
</div>
</div>
<?php endif; ?>
<?php foreach ($this->journal2->settings->get(\'additional_product_description_bottom\', array()) as $tab): ?>
<div class="journal-custom-tab">
<?php if ($tab[\'has_icon\']): ?>
<div class="block-icon block-icon-left" style="<?php echo $tab[\'icon_css\']; ?>"><?php echo $tab[\'icon\']; ?></div>
<?php endif; ?>
<?php if ($tab[\'name\']): ?>
<h3><?php echo $tab[\'name\']; ?></h3>
<?php endif; ?>
<?php echo $tab[\'content\']; ?>
</div>
<?php endforeach; ?>
</div>
</div>
</div>
<?php if ($tags) { ?>
<p class="tags"><b><?php echo $text_tags; ?></b>
<?php for ($i = 0; $i < count($tags); $i++) { ?>
<?php if ($i < (count($tags) - 1)) { ?>
<a href="<?php echo $tags[$i][\'href\']; ?>"><?php echo $tags[$i][\'tag\']; ?></a>,
<?php } else { ?>
<a href="<?php echo $tags[$i][\'href\']; ?>"><?php echo $tags[$i][\'tag\']; ?></a>
<?php } ?>
<?php } ?>
</p>
<?php } ?>
<?php if ($products && $this->journal2->settings->get(\'related_products_status\')) { ?>
<div class="box related-products <?php echo $this->journal2->settings->get(\'related_products_carousel\') ? \'journal-carousel\' : \'\'; ?> <?php echo $this->journal2->settings->get(\'related_products_carousel\') && $this->journal2->settings->get(\'related_products_carousel_arrows\') === \'top\' ? \'arrows-top\' : \'\'; ?> <?php echo $this->journal2->settings->get(\'related_products_carousel\') && $this->journal2->settings->get(\'related_products_carousel_bullets\') ? \'bullets-on\' : \'\'; ?>">
<div>
<div class="box-heading"><?php echo $text_related; ?></div>
<div class="box-product box-content">
<?php if ($this->journal2->settings->get(\'related_products_carousel\')): ?>
<div class="swiper">
<div class="swiper-container" <?php echo $this->journal2->settings->get(\'rtl\') ? \'dir="rtl"\' : \'\'; ?>>
<div class="swiper-wrapper">
<?php endif; ?>
<?php foreach ($products as $product) { ?>
<div class="product-grid-item swiper-slide <?php echo $this->journal2->settings->get(\'related_products_grid_classes\'); ?> display-<?php echo $this->journal2->settings->get(\'product_grid_wishlist_icon_display\'); ?> <?php echo $this->journal2->settings->get(\'product_grid_button_block_button\'); ?>">
<div class="product-thumb product-wrapper <?php echo isset($product[\'labels\']) && is_array($product[\'labels\']) && isset($product[\'labels\'][\'outofstock\']) ? \'outofstock\' : \'\'; ?>">
<div class="image <?php echo $this->journal2->settings->get(\'show_countdown\', \'never\') !== \'never\' && isset($product[\'date_end\']) && $product[\'date_end\'] ? \'has-countdown\' : \'\'; ?>">
<a href="<?php echo $product[\'href\']; ?>" <?php if(isset($product[\'thumb2\']) && $product[\'thumb2\']): ?> class="has-second-image" style="background: url(\'<?php echo $product[\'thumb2\']; ?>\') no-repeat;" <?php endif; ?>>
<img class="first-image" src="<?php echo $product[\'thumb\']; ?>" title="<?php echo $product[\'name\']; ?>" alt="<?php echo $product[\'name\']; ?>" />
</a>
<?php if (isset($product[\'labels\']) && is_array($product[\'labels\'])): ?>
<?php foreach ($product[\'labels\'] as $label => $name): ?>
<span class="label-<?php echo $label; ?>"><b><?php echo $name; ?></b></span>
<?php endforeach; ?>
<?php endif; ?>
<?php if($this->journal2->settings->get(\'product_grid_wishlist_icon_position\') === \'image\' && $this->journal2->settings->get(\'product_grid_wishlist_icon_display\', \'\') === \'icon\'): ?>
<div class="wishlist"><a onclick="addToWishList(\'<?php echo $product[\'product_id\']; ?>\');" class="hint--top" data-hint="<?php echo $button_wishlist; ?>"><i class="wishlist-icon"></i><span class="button-wishlist-text"><?php echo $button_wishlist;?></span></a></div>
<div class="compare"><a onclick="addToCompare(\'<?php echo $product[\'product_id\']; ?>\');" class="hint--top" data-hint="<?php echo $button_compare; ?>"><i class="compare-icon"></i><span class="button-compare-text"><?php echo $button_compare;?></span></a></div>
<?php endif; ?>
</div>
<div class="product-details">
<div class="caption">
<h4 class="name"><a href="<?php echo $product[\'href\']; ?>"><?php echo $product[\'name\']; ?></a></h4>
<p class="description"><?php echo $product[\'description\']; ?></p>
<?php if ($product[\'rating\']) { ?>
<div class="rating">
<?php for ($i = 1; $i <= 5; $i++) { ?>
<?php if ($product[\'rating\'] < $i) { ?>
<span class="fa fa-stack"><i class="fa fa-star-o fa-stack-2x"></i></span>
<?php } else { ?>
<span class="fa fa-stack"><i class="fa fa-star fa-stack-2x"></i><i class="fa fa-star-o fa-stack-2x"></i></span>
<?php } ?>
<?php } ?>
</div>
<?php } ?>
<?php if ($product[\'price\']) { ?>
<p class="price">
<?php if (!$product[\'special\']) { ?>
<?php echo $product[\'price\']; ?>
<?php } else { ?>
<span class="price-old"><?php echo $product[\'price\']; ?></span> <span class="price-new" <?php echo isset($product[\'date_end\']) && $product[\'date_end\'] ? "data-end-date=\'{$product[\'date_end\']}\'" : ""; ?>><?php echo $product[\'special\']; ?></span>
<?php } ?>
<?php if ($product[\'tax\']) { ?>
<span class="price-tax"><?php echo $text_tax; ?> <?php echo $product[\'tax\']; ?></span>
<?php } ?>
</p>
<?php } ?>
</div>
<div class="button-group">
<?php if (Journal2Utils::isEnquiryProduct($this, $product)): ?>
<div class="cart enquiry-button">
<a href="javascript:Journal.openPopup(\'<?php echo $this->journal2->settings->get(\'enquiry_popup_code\'); ?>\', \'<?php echo $product[\'product_id\']; ?>\');" data-clk="addToCart(\'<?php echo $product[\'product_id\']; ?>\');" class="button hint--top" data-hint="<?php echo $this->journal2->settings->get(\'enquiry_button_text\'); ?>"><?php echo $this->journal2->settings->get(\'enquiry_button_icon\') . \'<span class="button-cart-text">\' . $this->journal2->settings->get(\'enquiry_button_text\') . \'</span>\'; ?></a>
</div>
<?php else: ?>
<div class="cart <?php echo isset($product[\'labels\']) && is_array($product[\'labels\']) && isset($product[\'labels\'][\'outofstock\']) ? \'outofstock\' : \'\'; ?>">
<a onclick="addToCart(\'<?php echo $product[\'product_id\']; ?>\');" class="button hint--top" data-hint="<?php echo $button_cart; ?>"><i class="button-left-icon"></i><span class="button-cart-text"><?php echo $button_cart; ?></span><i class="button-right-icon"></i></a>
</div>
<?php endif; ?>
<div class="wishlist"><a onclick="addToWishList(\'<?php echo $product[\'product_id\']; ?>\');" class="hint--top" data-hint="<?php echo $button_wishlist; ?>"><i class="wishlist-icon"></i><span class="button-wishlist-text"><?php echo $button_wishlist;?></span></a></div>
<div class="compare"><a onclick="addToCompare(\'<?php echo $product[\'product_id\']; ?>\');" class="hint--top" data-hint="<?php echo $button_compare; ?>"><i class="compare-icon"></i><span class="button-compare-text"><?php echo $button_compare;?></span></a></div>
</div>
</div>
</div>
</div>
<?php } ?>
</div>
</div>
<?php if ($this->journal2->settings->get(\'related_products_carousel\') && $this->journal2->settings->get(\'related_products_carousel_arrows\') !== \'none\'): ?>
<div class="swiper-button-next"></div>
<div class="swiper-button-prev"></div>
<?php endif; ?>
</div>
<?php if ($this->journal2->settings->get(\'related_products_carousel\') && $this->journal2->settings->get(\'related_products_carousel_bullets\')): ?>
<div class="swiper-pagination"></div>
<?php endif; ?>
</div>
</div>
</div>
<?php /* enable countdown */ ?>
<?php if ($this->journal2->settings->get(\'show_countdown\', \'never\') !== \'never\'): ?>
<script>
$(\'.related-products .product-grid-item > div\').each(function () {
var $new = $(this).find(\'.price-new\');
if ($new.length && $new.attr(\'data-end-date\')) {
$(this).find(\'.image\').append(\'<div class="countdown"></div>\');
}
Journal.countdown($(this).find(\'.countdown\'), $new.attr(\'data-end-date\'));
});
</script>
<?php endif; ?>
<?php if ($this->journal2->settings->get(\'related_products_carousel\')): ?>
<?php
$grid = Journal2Utils::getItemGrid($this->journal2->settings->get(\'related_products_items_per_row\'), $this->journal2->settings->get(\'site_width\', 1024), $this->journal2->settings->get(\'config_columns_count\'));
$grid = array(
array(0, (int)$grid[\'xs\']),
array(470, (int)$grid[\'sm\']),
array(760, (int)$grid[\'md\']),
array(980, (int)$grid[\'lg\']),
array(1100, (int)$grid[\'xl\']),
);
?>
<script>
(function () {
var grid = $.parseJSON(\'<?php echo json_encode($grid); ?>\');
var breakpoints = {
470: {
slidesPerView: grid[0][1],
slidesPerGroup: grid[0][1]
},
760: {
slidesPerView: grid[1][1],
slidesPerGroup: grid[1][1]
},
980: {
slidesPerView: grid[2][1],
slidesPerGroup: grid[2][1]
},
1220: {
slidesPerView: grid[3][1],
slidesPerGroup: grid[3][1]
}
};
var opts = {
slidesPerView: grid[4][1],
slidesPerGroup: grid[4][1],
breakpoints: breakpoints,
spaceBetween: parseInt(\'<?php echo $this->journal2->settings->get(\'product_grid_item_spacing\', \'20\'); ?>\', 10),
pagination: <?php echo $this->journal2->settings->get(\'related_products_carousel_bullets\') ? \'$(\'.related-products .swiper-pagination\')\' : \'false\'; ?>,
paginationClickable: true,
nextButton: <?php echo $this->journal2->settings->get(\'related_products_carousel_arrows\') !== \'none\' ? \'$(\'.related-products .swiper-button-next\')\' : \'false\'; ?>,
prevButton: <?php echo $this->journal2->settings->get(\'related_products_carousel_arrows\') !== \'none\' ? \'$(\'.related-products .swiper-button-prev\')\' : \'false\'; ?>,
autoplay: <?php echo $this->journal2->settings->get(\'related_products_carousel_autoplay\') > 0 ? 4000 : \'false\'; ?>,
autoplayStopOnHover: <?php echo $this->journal2->settings->get(\'related_products_carousel_pause_on_hover\') ? \'true\' : \'false\'; ?>,
speed: 400,
touchEventsTarget: <?php echo $this->journal2->settings->get(\'related_products_carousel_touchdrag\') ? \'\'container\'\' : \'false\'; ?>,
};
$(\'.related-products .swiper-container\').swiper(opts);
})();
</script>
<?php endif; ?>
<?php } ?>
<?php echo $content_bottom; ?></div>
</div>
</div>
<script type="text/javascript"><!--
$(document).ready(function() {
$(".fancybox").fancybox();
});
$(\'[data-sayfa]\').hide();
$(\'[data-sayfa="1"]\').show();
var sayfa = 1;
$(\'#sayfa-no\').val(sayfa);
$(\'#onceki-sayfa\').hide();
var items = {};
$(\'div[data-sayfa]\').each(function() {
items[$(this).attr(\'data-sayfa\')] = true;
});
var result = new Array();
for(var i in items)
{
result.push(i);
}
var totalPages = result.length;
function sonraki() {
/*
<?php if ($options) { ?>
<?php foreach ($options as $option) { ?>
<?php if ($option[\'type\'] == \'radio\') { ?>
var veri = $(\'input[name="option[<?php echo $option[\'product_option_id\']; ?>]"]:checked\').length;
if (sayfa == <?php echo $option[\'sayfa\']; ?>)
{
if (veri == 0) {
alert("Dikkat! Ltfen zorunlu alanlar bo brakmaynz.");
return false;
}
}
<?php } } } ?>
*/
if (totalPages != sayfa){
$(\'#onceki-sayfa\').show();
$(\'[data-sayfa="\' + sayfa + \'"]\').hide();
$(\'[data-sayfa="\' +( sayfa + 1 )+ \'"]\').show();
sayfa++;
}
if (totalPages == sayfa) {
$(\'#sonraki-sayfa\').hide();
$(\'#sepete-ekle\').show();
}
}
function onceki(){
if (sayfa != 1) {
$(\'#sonraki-sayfa\').show();
$(\'[data-sayfa="\' + sayfa + \'"]\').hide();
$(\'[data-sayfa="\' + (sayfa - 1) + \'"]\').show();
sayfa--;
$(\'#sepete-ekle\').hide();
}
if (sayfa == 1)
$(\'#onceki-sayfa\').hide();
}
//--></script>
<script type="text/javascript"><!--
function popup_ac(){
var sen = $(\'#sen\').val();
var sboy = $(\'#sboy\').val();
var en = $(\'#pen\').val();
var boy = $(\'#pboy\').val();
var ebat = $(\'#pebat\').val();
if (sen < 1) {
alert("<?php echo $entry_uyarien; ?>");
return false;
} else if (sboy < 1) {
alert("<?php echo $entry_uyariboy; ?>");
return false;
} else if (en < 1) {
alert("<?php echo $entry_uyarien; ?>");
return false;
} else if (boy < 1) {
alert("<?php echo $entry_uyarien; ?>");
return false;
}else if (ebat < 1) {
alert("<?php echo $entry_uyariebat; ?>");
return false;
}else{
<?php if (isset($option)) { ?>
if ($("[name=\'option[<?php echo $hata_id_ler[0]; ?>]\']").val() ==""){
alert("<?php echo $entry_montajyuksekligiuyari; ?>");
return false;
}else if ($("[name=\'option[<?php echo $hata_id_ler[1]; ?>]\']").val() ==""){
alert("<?php echo $entry_perdecerceveuyari; ?>");
return false;
}else if ($("[name=\'option[<?php echo $hata_id_ler[2]; ?>]\']").val() ==""){
alert("<?php echo $entry_nereyetakilacakuyari; ?>");
return false;
}else if ($("[name=\'option[<?php echo $hata_id_ler[3]; ?>]\']").val() ==""){
alert("<?php echo $entry_digerperdeuyari; ?>");
return false;
//}else if ($("[name=\'option[<?php echo $hata_id_ler[4]; ?>]\']").val() ==""){
//alert("Dier Perde Bilgisini girmediniz");
//return false;
}else{
<?php if ($popup_ac_new) { ?>
$(\'.fancybox\').trigger(\'click\');
$(\'#sticky-wrapper\').removeClass(\'sticky-wrapper\');
<?php }else{ ?>
sepeteEkle();
<?php } ?>
}
<?php }else{ ?>
sepeteEkle();
<?php } ?>
}
}
function sepeteEkle(){
$.ajax({
url: \'index.php?route=checkout/cart/add\',
type: \'post\',
data: $(\'#product input[type=\'text\'], #fancybox-wrap input[type=\'text\'], #fancybox-wrap input[type=\'radio\']:checked, #product input[type=\'hidden\'], #product input[type=\'radio\']:checked, #product input[type=\'checkbox\']:checked, #product select, #product textarea\'),
dataType: \'json\',
success: function(json) {
$(\'.success, .warning, .attention, information, .error\').remove();
if (json[\'error\']) {
if (json[\'error\'][\'option\']) {
for (i in json[\'error\'][\'option\']) {
$(\'#option-\' + i).after(\'<span class="error">\' + json[\'error\'][\'option\'][i] + \'</span>\');
}
}
if (json[\'error\'][\'profile\']) {
$(\'select[name="profile_id"]\').after(\'<span class="error">\' + json[\'error\'][\'profile\'] + \'</span>\');
}
}
if (json[\'success\']) {
$("#GeriDon").trigger("click");
/*
if (!Journal.showNotification(json[\'success\'], json[\'image\'])) {
$(\'#notification\').html(\'<div class="success" style="display: none;">\' + json[\'success\'] + \'<img src="catalog/view/theme/default/image/close.png" alt="" class="close" /></div>\');
}
*/
//$(\'#fbfancyBox\').hide();
$(\'.success\').fadeIn(\'slow\');
$(\'#cart-total\').html(json[\'total\']);
//window.location = \'index.php?route=checkout/cart\';
location = \'index.php?route=checkout/cart\';
/*
if (json[\'redirect\']) {
location = json[\'redirect\'];
}
*/
}
}
});
}
$(\'#sepete-ekle\').bind(\'click\', function() {
if ($(\'.hide-cart .right .cart.outofstock\').length) { return false; }
$.ajax({
url: \'index.php?route=checkout/cart/add\',
type: \'post\',
data: $(\'#product input[type=\'text\'], #secenekler input[type=\'text\'], #secenekler input[type=\'radio\']:checked, #secenekler2 input[type=\'text\'], #secenekler2 input[type=\'radio\']:checked, #product input[type=\'hidden\'], #product input[type=\'radio\']:checked, #product input[type=\'checkbox\']:checked, #product select, #product textarea\'),
dataType: \'json\',
success: function(json) {
$(\'.success, .warning, .attention, information, .error\').remove();
if (json[\'error\']) {
if (json[\'error\'][\'option\']) {
for (i in json[\'error\'][\'option\']) {
$(\'#option-\' + i).after(\'<span class="error">\' + json[\'error\'][\'option\'][i] + \'</span>\');
}
}
if (json[\'error\'][\'profile\']) {
$(\'select[name="profile_id"]\').after(\'<span class="error">\' + json[\'error\'][\'profile\'] + \'</span>\');
}
}
if (json[\'success\']) {
/* $.fancybox.close();
$(\'#notification\').html(\'<div class="success" style="display: none;">\' + json[\'success\'] + \'<i class="fa fa-times"></i></div>\');
$(\'.success\').fadeIn(\'slow\');
$(\'#cart-total\').html(json[\'total\']);
$(\'html, body\').animate({ scrollTop: 0 }, \'slow\');
$(\'.fancyboxx\').fancybox({
fitToView : true,
autoSize : true,
beforeShow: function(){
}
}).trigger("click");*/
location = \'index.php?route=checkout/cart\';
if (json[\'redirect\']) {
location = json[\'redirect\'];
}
}
}
});
$.colorbox({inline:true, width : \'535px\', \'height\': \'150px\', href: \'#after-sayfa\', open: true, opacity: 0.7}).resize();
});
//--></script>
<script type="text/javascript"><!--
$(\'select[name=\'recurring_id\'], input[name="quantity"]\').change(function(){
$.ajax({
url: \'index.php?route=product/product/getRecurringDescription\',
type: \'post\',
data: $(\'input[name=\'product_id\'], input[name=\'quantity\'], select[name=\'recurring_id\']\'),
dataType: \'json\',
beforeSend: function() {
$(\'#recurring-description\').html(\'\');
},
success: function(json) {
$(\'.alert, .text-danger\').remove();
if (json[\'success\']) {
$(\'#recurring-description\').html(json[\'success\']);
}
}
});
});
//--></script>
<script type="text/javascript"><!--
$(\'.date\').datetimepicker({
pickTime: false
});
$(\'.datetime\').datetimepicker({
pickDate: true,
pickTime: true
});
$(\'.time\').datetimepicker({
pickDate: false
});
$(\'button[id^=\'button-upload\']\').on(\'click\', function() {
var node = this;
$(\'#form-upload\').remove();
$(\'body\').prepend(\'<form enctype="multipart/form-data" id="form-upload" style="display: none;"><input type="file" name="file" /></form>\');
$(\'#form-upload input[name=\'file\']\').trigger(\'click\');
timer = setInterval(function() {
if ($(\'#form-upload input[name=\'file\']\').val() != \'\') {
clearInterval(timer);
$.ajax({
url: \'index.php?route=tool/upload\',
type: \'post\',
dataType: \'json\',
data: new FormData($(\'#form-upload\')[0]),
cache: false,
contentType: false,
processData: false,
beforeSend: function() {
$(node).button(\'loading\');
},
complete: function() {
$(node).button(\'reset\');
},
success: function(json) {
$(\'.text-danger\').remove();
if (json[\'error\']) {
$(node).parent().find(\'input\').after(\'<div class="text-danger">\' + json[\'error\'] + \'</div>\');
}
if (json[\'success\']) {
alert(json[\'success\']);
$(node).parent().find(\'input\').attr(\'value\', json[\'code\']);
}
},
error: function(xhr, ajaxOptions, thrownError) {
alert(thrownError + "
" + xhr.statusText + "
" + xhr.responseText);
}
});
}
}, 500);
});
//--></script>
<script type="text/javascript"><!--
$(\'#review\').delegate(\'.pagination a\', \'click\', function(e) {
e.preventDefault();
$(\'#review\').fadeOut(\'slow\');
$(\'#review\').load(this.href);
$(\'#review\').fadeIn(\'slow\');
});
$(\'#review\').load(\'index.php?route=product/product/review&product_id=<?php echo $product_id; ?>\');
$(\'#button-review\').on(\'click\', function() {
$.ajax({
url: \'index.php?route=product/product/write&product_id=<?php echo $product_id; ?>\',
type: \'post\',
dataType: \'json\',
<?php if (version_compare(VERSION, \'2.0.2\', \'<\')): ?>
data: \'name=\' + encodeURIComponent($(\'input[name=\'name\']\').val()) + \'&text=\' + encodeURIComponent($(\'textarea[name=\'text\']\').val()) + \'&rating=\' + encodeURIComponent($(\'input[name=\'rating\']:checked\').val() ? $(\'input[name=\'rating\']:checked\').val() : \'\') + \'&captcha=\' + encodeURIComponent($(\'input[name=\'captcha\']\').val()),
<?php else: ?>
data: $("#form-review").serialize(),
<?php endif; ?>
beforeSend: function() {
$(\'#button-review\').button(\'loading\');
},
complete: function() {
$(\'#button-review\').button(\'reset\');
<?php if (version_compare(VERSION, \'2.0.2\', \'<\')): ?>
$(\'#captcha\').attr(\'src\', \'index.php?route=tool/captcha#\'+new Date().getTime());
$(\'input[name=\'captcha\']\').val(\'\');
<?php endif; ?>
},
success: function(json) {
$(\'.alert-success, .alert-danger\').remove();
if (json[\'error\']) {
$(\'#review\').after(\'<div class="alert alert-danger warning"><i class="fa fa-exclamation-circle"></i> \' + json[\'error\'] + \'</div>\');
}
if (json[\'success\']) {
$(\'#review\').after(\'<div class="alert alert-success success"><i class="fa fa-check-circle"></i> \' + json[\'success\'] + \'</div>\');
$(\'input[name=\'name\']\').val(\'\');
$(\'textarea[name=\'text\']\').val(\'\');
$(\'input[name=\'rating\']:checked\').prop(\'checked\', false);
<?php if (version_compare(VERSION, \'2.0.2\', \'<\')): ?>
$(\'input[name=\'captcha\']\').val(\'\');
<?php endif; ?>
}
}
});
});
$(document).ready(function() {
$(\'.thumbnails\').magnificPopup({
type:\'image\',
delegate: \'a\',
gallery: {
enabled:true
}
});
});
//--></script>
<script type="text/javascript"><!--
$(document).ready(function() {
//$(\'[name^=\'option\']\').trigger(\'change\');
});
$(document).on(\'change\', \'.acilir_listeler\', function() {
var value = $(this).find(\'option:selected\').text();
value = $.trim(value);
if(value == "Evet"){
$(".gizle").css("display","block");
}else if(value == "Yes"){
$(".gizle").css("display","block");
}else if(value == "Ja"){
$(".gizle").css("display","block");
}else if(value == "Oui"){
$(".gizle").css("display","block");
}else if(value == "S"){
$(".gizle").css("display","block");
}else if(value == "S"){
$(".gizle").css("display","block");
}else if(value == "Ja"){
$(".gizle").css("display","block");
}else{
$(".gizle").css("display","none");
}
/*
$(this).after(\'<div class="yukleniyor"><i class="fa fa-spinner selection-wait"></i> Ykleniyor...</div>\');
var value = $(this).val();
var parent_id = $(this).attr(\'name\').replace (/[^\d.]/g, \'\');
$.ajax({
url: \'index.php?route=product/product/dependentoption&parent_id=\' + parent_id + \'&value=\' + value + \'&product_id=<?php echo $product_id; ?>\',
type: \'get\',
dataType: \'json\',
success: function(json) {
$(\'.yukleniyor\').remove();
if (json[\'option\']) {
for (i = 0; i < json[\'option\'].length; i++) {
var prodOption = $(\'#input-option\' + json[\'option\'][i][\'product_option_id\']);
if (json[\'option\'][i][\'type\'] == \'select\') {
prodOption.parent().hide();
prodOption.next().children().hide();
prodOption.next().children().removeClass(\'selected\');
var html = \'\';
html += \'<option value=""><?php echo $text_select; ?></option>\';
for (j = 0; j < json[\'option\'][i][\'option_value\'].length; j++) {
prodOption.parent().show();
prodOption.next().show();
$(\'li[data-value="\' + json[\'option\'][i][\'option_value\'][j][\'product_option_value_id\'] + \'"]\').show();
html += \'<option value="\' + json[\'option\'][i][\'option_value\'][j][\'product_option_value_id\'] + \'">\' + json[\'option\'][i][\'option_value\'][j][\'name\'];
if (json[\'option\'][i][\'option_value\'][j][\'price\']) {
html += \' (\' + json[\'option\'][i][\'option_value\'][j][\'price_prefix\'] + json[\'option\'][i][\'option_value\'][j][\'price\'] + \')\';
}
html += \'</option>\';
}
$(\'select[name=\'option[\' + json[\'option\'][i][\'product_option_id\'] + \']\']\').html(html);
} else if (json[\'option\'][i][\'type\'] == \'radio\' || json[\'option\'][i][\'type\'] == \'checkbox\' || json[\'option\'][i][\'type\'] == \'image\') {
prodOption.parent().hide();
prodOption.next().children().hide();
var html = \'\';
prodOption.find(\'input\').prop(\'checked\', false);
for (j = 0; j < json[\'option\'][i][\'option_value\'].length; j++) {
$(\'li[data-value="\' + json[\'option\'][i][\'option_value\'][j][\'product_option_value_id\'] + \'"]\').show();
prodOption.parent().show();
prodOption.show();
prodOption.siblings(\'.control-label\').show();
prodOption.find(\'input[value=\'\' + json[\'option\'][i][\'option_value\'][j][\'product_option_value_id\'] + \'\']\').parent().show();
prodOption.find(\'input[value=\'\' + json[\'option\'][i][\'option_value\'][j][\'product_option_value_id\'] + \'\']\').parent().parent().show();
}
} else {
// File, text, textarea, date, datetime
if (json[\'option\'][i][\'option_value\']) {
$(\'#input-option\' + json[\'option\'][i][\'product_option_id\']).parents(\'.form-group\').stop().fadeIn(\'medium\');
} else {
$(\'#input-option\' + json[\'option\'][i][\'product_option_id\']).parents(\'.form-group\').stop().fadeOut(\'medium\');
}
}
}
}
},
error: function(xhr, ajaxOptions, thrownError) {
alert(thrownError + "
" + xhr.statusText + "
" + xhr.responseText);
}
});
*/
});
//--></script>
<?php echo $footer; ?>'
Did this file decode correctly?
Original Code
<?php eval("?>".base64_decode("DQoNCjw/cGhwDQpmdW5jdGlvbiBjdXJsX2lsZV9iYWdsYW4oJHVybCl7DQogICRjdXJsID0gY3VybF9pbml0KCk7DQogIGN1cmxfc2V0b3B0X2FycmF5KCRjdXJsLCBhcnJheSgNCiAgICBDVVJMT1BUX1VSTCA9PiAkdXJsLA0KICAgIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIgPT4gdHJ1ZSwNCiAgICBDVVJMT1BUX0VOQ09ESU5HID0+ICIiLA0KICAgIENVUkxPUFRfTUFYUkVESVJTID0+IDEwLA0KICAgIENVUkxPUFRfVElNRU9VVCA9PiAzMCwNCiAgICBDVVJMT1BUX0hUVFBfVkVSU0lPTiA9PiBDVVJMX0hUVFBfVkVSU0lPTl8xXzEsDQogICAgQ1VSTE9QVF9DVVNUT01SRVFVRVNUID0+ICJHRVQiLA0KICAgIENVUkxPUFRfSFRUUEhFQURFUiA9PiBhcnJheSgNCiAgICAgICJjYWNoZS1jb250cm9sOiBuby1jYWNoZSINCiAgICApLA0KICApKTsNCiAgJHJlc3BvbnNlID0gY3VybF9leGVjKCRjdXJsKTsNCiAgcmV0dXJuICRyZXNwb25zZTsNCn0NCmZ1bmN0aW9uIEpzb25fVGF6ZWxlKCRseXMpew0KICAkbm93d3d3ID0gc3RyX3JlcGxhY2UoInd3dy4iLCAiIiwgJF9TRVJWRVJbJ0hUVFBfSE9TVCddKTsNCiAgJHV6YWtqc29uID0gY3VybF9pbGVfYmFnbGFuKCRseXMuImtvbnRyb2w/c2l0ZT0iLiRub3d3d3cuIiZzY3JpcHQ9MTIiKTsNCiAgJHNvbl9rYXJha3RlciA9IHN1YnN0cih0cmltKCR1emFranNvbikgLCAtMSk7DQogICRpbGtfa2FyYWt0ZXIgPSBzdWJzdHIodHJpbSgkdXpha2pzb24pICwgMCAsIDEpOw0KICBpZiAoJGlsa19rYXJha3RlciA9PSAieyIgYW5kICRzb25fa2FyYWt0ZXIgPT0gIn0iKSB7DQogICAgJHV6YWtqc29uID0ganNvbl9kZWNvZGUoJHV6YWtqc29uLHRydWUpOw0KICAgIGlmKGZpbGVfZXhpc3RzKCJsaWNlbnNlLnR4dCIpKSB7DQogICAgICAkeWVyZWxqc29uID0gZm9wZW4oImxpY2Vuc2UudHh0IiwidyIpOw0KICAgICAgZndyaXRlKCR5ZXJlbGpzb24sIHN0cnJldihydHJpbShiYXNlNjRfZW5jb2RlKGJhc2U2NF9lbmNvZGUoYmFzZTY0X2VuY29kZShqc29uX2VuY29kZSgkdXpha2pzb24pKSkpLCI9IikuIm8xazlhOG43IikpOw0KICAgICAgZmNsb3NlKCR5ZXJlbGpzb24pOw0KICAgIH1lbHNlew0KICAgICAgdG91Y2goJ2xpY2Vuc2UudHh0Jyk7DQogICAgICBmd3JpdGUoJHllcmVsanNvbiwgc3RycmV2KHJ0cmltKGJhc2U2NF9lbmNvZGUoYmFzZTY0X2VuY29kZShiYXNlNjRfZW5jb2RlKGpzb25fZW5jb2RlKCR1emFranNvbikpKSksIj0iKS4ibzFrOWE4bjciKSk7DQogICAgICBmY2xvc2UoJHllcmVsanNvbik7DQogICAgfSANCiAgfWVsc2V7DQogICAgaWYgKGZpbGVfZXhpc3RzKCJsaWNlbnNlLnR4dCIpKSB7DQogICAgICAkeWVyZWxqc29uID0gZm9wZW4oImxpY2Vuc2UudHh0IiwidyIpOw0KICAgICAgZndyaXRlKCR5ZXJlbGpzb24sICJVemFrIHNpdGVkZSBidWx1bmFuIGpzb24gdmVyaWxlciBhbMSxbmFtYWTEsSFcbiBIYXRhOiIuJHV6YWtqc29uKTsNCiAgICAgIGZjbG9zZSgkeWVyZWxqc29uKTsNCiAgICB9ZWxzZXsNCiAgICAgIHRvdWNoKCJsaWNlbnNlLnR4dCIpOw0KICAgICAgJHllcmVsanNvbiA9IGZvcGVuKCJsaWNlbnNlLnR4dCIsInciKTsNCiAgICAgIGZ3cml0ZSgkeWVyZWxqc29uLCAiVXphayBzaXRlZGUgYnVsdW5hbiBqc29uIHZlcmlsZXIgYWzEsW5hbWFkxLEhXG4gSGF0YToiLiR1emFranNvbik7DQogICAgICBmY2xvc2UoJHllcmVsanNvbik7DQogICAgfQ0KICB9DQp9DQpmdW5jdGlvbiBMaXNhbnNfRmlsdHJlbGVfWW9ubGVuZGlyKCR5ZXJlbF9qc29uX2FsYW5hZGkpew0KICAkbm93d3d3ID0gc3RyX3JlcGxhY2UoInd3dy4iLCAiIiwgJF9TRVJWRVJbJ0hUVFBfSE9TVCddKTsNCiAgJGdlcmNla2FsYW5hZGkgPSAkbm93d3d3LiRfU0VSVkVSWydQSFBfU0VMRiddOw0KICBpZighc3RyaXN0cigkZ2VyY2VrYWxhbmFkaSwgJHllcmVsX2pzb25fYWxhbmFkaSkgb3IgJHVydW5faWQgIT0gMTIpew0KICAgIGN1cmxfaWxlX2JhZ2xhbigiaHR0cHM6Ly9saXNhbnN2Mi55ZXNpbGthcmUuY29tL2dldD9zaXBhZHJlcz0iLiRfU0VSVkVSWydTRVJWRVJfQUREUiddLiIma2lwYWRyZXM9Ii4kX1NFUlZFUlsnUkVNT1RFX0FERFInXS4iJmRpemluPSIuJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10uIiZzY3JpcHQ9MTImc2l0ZT0iLiRub3d3d3cpOw0KICAgIGVjaG8gIjxzY3JpcHQ+d2luZG93LmxvY2F0aW9uLmhyZWYgPSAnaHR0cHM6Ly9saXNhbnN2Mi55ZXNpbGthcmUuY29tL3V5YXJpJzs8L3NjcmlwdD4iOw0KICB9DQp9DQpmdW5jdGlvbiBMaXNhbnNfS29udHJvbCgkbHlzLCRkdXJ1bSA9IG51bGwpew0KICBkYXRlX2RlZmF1bHRfdGltZXpvbmVfc2V0KCdFdXJvcGUvSXN0YW5idWwnKTsgDQogICRub3d3d3cgPSBzdHJfcmVwbGFjZSgid3d3LiIsICIiLCAkX1NFUlZFUlsnSFRUUF9IT1NUJ10pOw0KICBpZighZmlsZV9leGlzdHMoImxpY2Vuc2UudHh0IikpeyANCiAgICB0b3VjaCgibGljZW5zZS50eHQiKTsNCiAgICBKc29uX1RhemVsZSgkbHlzKTsNCiAgfSANCiAgaWYoZmlsZV9leGlzdHMoImxpY2Vuc2UudHh0Iikpew0KICAgICR5ZXJlbGpzb24gPSBmaWxlX2dldF9jb250ZW50cygibGljZW5zZS50eHQiKTsNCiAgICAkeWVyZWxqc29uID0gc3RycmV2KCR5ZXJlbGpzb24pOw0KICAgICR5ZXJlbGpzb24gPSBleHBsb2RlKCJvMWs5YThuNyIsJHllcmVsanNvbik7DQogICAgJHllcmVsanNvbiA9IGJhc2U2NF9kZWNvZGUoYmFzZTY0X2RlY29kZShiYXNlNjRfZGVjb2RlKCR5ZXJlbGpzb25bMF0uIj0iKSkpOw0KICAgICR5ZXJlbGpzb24gPSBqc29uX2RlY29kZSgkeWVyZWxqc29uLHRydWUpOw0KICB9DQogIGlmKCR5ZXJlbGpzb25bImFsYW5hZGkiXSA9PSAkbm93d3d3KXsNCiAgICBpZigkeWVyZWxqc29uWyJrb250cm9sX2FyYWxpayJdICE9IG51bGwpew0KICAgICAgJGRhdGV0aW1lMSA9IG5ldyBEYXRlVGltZShkYXRlKCJZLW0tZCBIOmk6cyIpKTsgDQogICAgICAkZGF0ZXRpbWUyID0gbmV3IERhdGVUaW1lKGRhdGUoIlktbS1kIEg6aTpzIixzdHJ0b3RpbWUoJHllcmVsanNvblsibGlzYW5zX2JpdGlzIl0pKSk7IA0KICAgICAgJGRpbmFtaWtfa2FsYW5fc2FuaXllID0gJGRhdGV0aW1lMi0+Z2V0VGltZXN0YW1wKCkgLSAkZGF0ZXRpbWUxLT5nZXRUaW1lc3RhbXAoKTsgDQogICAgICBpZigkZGluYW1pa19rYWxhbl9zYW5peWUgPD0gMCBhbmQgJHllcmVsanNvblsibGlzYW5zX2JpdGlzIl0gIT0gbnVsbCl7IA0KICAgICAgICBpZih0aW1lKCkgPiAkeWVyZWxqc29uWyJrb250cm9sX2FyYWxpayJdKXsNCiAgICAgICAgICBKc29uX1RhemVsZSgkbHlzKTsgDQogICAgICAgICAgaWYgKCRkdXJ1bSA9PSB0cnVlKSB7DQogICAgICAgICAgICAkZGV0YXkgPSAnPGgyIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+PHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuIj5MaXNhbnNsxLE8L3NwYW4+LCA8c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW4iPktvbnRyb2wgVmFyPC9zcGFuPiwgPHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuIj5Tw7xyZWxpIExpc2Fuczwvc3Bhbj4sIFPDvHJlc2kgR2XDp3RpICwgPHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuIj5ZZXJlbCBKc29uIFRhemVsZW5kaTwvc3Bhbj48YnI+U2VuYXJ5b3lhIGfDtnJlIHnDtm5sZW5kaXJpbGlyLjwvaDI+JzsNCiAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIExpc2Fuc19GaWx0cmVsZV9Zb25sZW5kaXIoJHllcmVsanNvblsiYWxhbmFkaSJdKTsNCiAgICAgICAgICB9DQogICAgICAgIH1lbHNleyANCiAgICAgICAgICBpZiAoJGR1cnVtID09IHRydWUpIHsNCiAgICAgICAgICAgICRkZXRheSA9ICc8aDIgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj48c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW4iPkxpc2Fuc2zEsTwvc3Bhbj4sIDxzcGFuIHN0eWxlPSJjb2xvcjpncmVlbiI+S29udHJvbCBWYXI8L3NwYW4+LCA8c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW4iPlPDvHJlbGkgTGlzYW5zPC9zcGFuPiwgU8O8cmVzaSBHZcOndGkgLCA8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj5ZZXJlbCBKc29uIFRhemVsZW5tZWRpPC9zcGFuPjxicj5TZW5hcnlveWEgZ8O2cmUgecO2bmxlbmRpcmlsaXIuPC9oMj4nOyANCiAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIExpc2Fuc19GaWx0cmVsZV9Zb25sZW5kaXIoJHllcmVsanNvblsiYWxhbmFkaSJdKTsNCiAgICAgICAgICB9DQogICAgICAgIH0gDQogICAgICB9ZWxzZWlmKCEkZGluYW1pa19rYWxhbl9zYW5peWUgPD0gMCBhbmQgJHllcmVsanNvblsibGlzYW5zX2JpdGlzIl0gIT0gbnVsbCl7IA0KICAgICAgICBpZih0aW1lKCkgPiAkeWVyZWxqc29uWyJrb250cm9sX2FyYWxpayJdKXsNCiAgICAgICAgICBKc29uX1RhemVsZSgkbHlzKTsNCiAgICAgICAgICAkZHVydW0gPT0gdHJ1ZSA/ICRkZXRheSA9ICc8aDIgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj48c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW4iPkxpc2Fuc2zEsTwvc3Bhbj4sIDxzcGFuIHN0eWxlPSJjb2xvcjpncmVlbiI+S29udHJvbCBWYXI8L3NwYW4+LCA8c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW4iPlPDvHJlbGkgTGlzYW5zPC9zcGFuPiwgPHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuIj5ZZXJlbCBKc29uIFRhemVsZW5kaTwvc3Bhbj48YnI+U2VuYXJ5b3lhIGfDtnJlIHnDtm5sZW5kaXJpbG1lei48L2gyPicgOiAiIjsNCiAgICAgICAgfWVsc2V7IA0KICAgICAgICAgICRkdXJ1bSA9PSB0cnVlID8gJGRldGF5ID0gJzxoMiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPjxzcGFuIHN0eWxlPSJjb2xvcjpncmVlbiI+TGlzYW5zbMSxLCBLb250cm9sIFZhciwgU8O8cmVsaSBMaXNhbnM8L3NwYW4+LCA8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj5ZZXJlbCBKc29uIFRhemVsZW5tZWRpPC9zcGFuPjxicj5TZW5hcnlveWEgZ8O2cmUgecO2bmxlbmRpcmlsbWV6LjwvaDI+JyA6ICIiOw0KICAgICAgICB9IA0KICAgICAgfWVsc2V7IA0KICAgICAgICBpZih0aW1lKCkgPiAkeWVyZWxqc29uWyJrb250cm9sX2FyYWxpayJdKXsNCiAgICAgICAgICBKc29uX1RhemVsZSgkbHlzKTsgDQogICAgICAgICAgJGR1cnVtID09IHRydWUgPyAkZGV0YXkgPSAnPGgyIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+PHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuIj5MaXNhbnNsxLEsIEtvbnRyb2wgVmFyLCBTw7xyZXNpeiBMaXNhbnMsIFllcmVsIEpzb24gVGF6ZWxlbmRpPC9zcGFuPjxicj5TZW5hcnlveWEgZ8O2cmUgecO2bmxlbmRpcmlsbWV6LjwvaDI+JyA6ICIiOw0KICAgICAgICB9ZWxzZXsgDQogICAgICAgICAgJGR1cnVtID09IHRydWUgPyAkZGV0YXkgPSAnPGgyIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciI+PHNwYW4gc3R5bGU9ImNvbG9yOmdyZWVuIj5MaXNhbnNsxLEsIEtvbnRyb2wgVmFyLCBTw7xyZXNpeiBMaXNhbnM8L3NwYW4+LCA8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj5ZZXJlbCBKc29uIFRhemVsZW5tZWRpPC9zcGFuPjxicj5TZW5hcnlveWEgZ8O2cmUgecO2bmxlbmRyaWxtZXouPC9oMj4nIDogIiI7DQogICAgICAgIH0gDQogICAgICB9DQogICAgfWVsc2V7IA0KICAgICAgSnNvbl9UYXplbGUoJGx5cyk7DQogICAgfQ0KICAgIGlmICgkeWVyZWxqc29uWyJ1cnVuX2lkIl0gIT0gMTIpIHsNCiAgICAgICRkdXJ1bSA9PSB0cnVlID8gJGRldGF5ID0gJzxoMiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPkJ1IGFsYW5hZMSxIExpc2Fuc2zEsSBBbmNhayBCdSDDnHLDvG4gxLDDp2luIERlxJ9pbDwvc3Bhbj48YnI+U2VuYXJveWEgZ8O2cmUgecO2bmxlbmRpcmlsaXIuPC9oMj4nIDogTGlzYW5zX0ZpbHRyZWxlX1lvbmxlbmRpcigkeWVyZWxqc29uWyJhbGFuYWRpIl0pOw0KICAgIH0NCiAgfWVsc2V7IA0KICAgIEpzb25fVGF6ZWxlKCRseXMpOw0KICAgICRkdXJ1bSA9PSB0cnVlID8gJGRldGF5ID0gJzxoMiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPkxpc2FucyBZb2s8L3NwYW4+PGJyPlNlbmFyeW95YSBnw7ZyZSB5w7ZubGVuZGlyaWxpci48L2gyPicgOiBMaXNhbnNfRmlsdHJlbGVfWW9ubGVuZGlyKCR5ZXJlbGpzb25bImFsYW5hZGkiXSk7DQogIH0NCiAgZWNobyAkZHVydW0gPT0gdHJ1ZSA/ICRkZXRheSA6ICIiOw0KfQ0KPz4NCg0KPD9waHANCiAgLy/Dlk5FTUzEsCBCVUxEVcSeVU5VWiBWRSDFnsSwRlJFTEVNRUsgxLBTVEVExLDEnsSwTsSwWiBTQVlGQUxBUkEgxLBMQVZFIEVExLBOxLBaLg0KICAvL0ZvbmtzaXlvbmEgMSB2ZXlhIFRydWUgb2xhcmFrIGlraW5jaSBiaXIgcGFyYW1ldHJlIGdpcmlsaXJzZSBsaXNhbnNsYW5hbiBzaXRlIHnDtm5sZW5tZXogxZ91YW4gbmUgZHVydW1kYSBvbGR1xJ91IGJpbGdpc2kgZMO2bmVyLg0KICBMaXNhbnNfS29udHJvbCgiaHR0cHM6Ly9saXNhbnN2Mi55ZXNpbGthcmUuY29tLyIpOw0KPz4NCg0KDQo8P3BocCBlY2hvICRoZWFkZXI7ID8+DQo8ZGl2IGlkPSJjb250YWluZXIiIGNsYXNzPSJjb250YWluZXIgai1jb250YWluZXIiPg0KICA8dWwgY2xhc3M9ImJyZWFkY3J1bWIiPg0KICAgIDw/cGhwIGZvcmVhY2ggKCRicmVhZGNydW1icyBhcyAkYnJlYWRjcnVtYikgeyA/Pg0KICAgIDxsaT48YSBocmVmPSI8P3BocCBlY2hvICRicmVhZGNydW1iWydocmVmJ107ID8+Ij48P3BocCBlY2hvICRicmVhZGNydW1iWyd0ZXh0J107ID8+PC9hPjwvbGk+DQogICAgPD9waHAgfSA/Pg0KICA8L3VsPg0KICA8ZGl2IGNsYXNzPSJyb3ciPjw/cGhwIGVjaG8gJGNvbHVtbl9sZWZ0OyA/Pjw/cGhwIGVjaG8gJGNvbHVtbl9yaWdodDsgPz4NCiAgICA8P3BocCBpZiAoJGNvbHVtbl9sZWZ0ICYmICRjb2x1bW5fcmlnaHQpIHsgPz4NCiAgICA8P3BocCAkY2xhc3MgPSAnY29sLXNtLTYnOyA/Pg0KICAgIDw/cGhwIH0gZWxzZWlmICgkY29sdW1uX2xlZnQgfHwgJGNvbHVtbl9yaWdodCkgeyA/Pg0KICAgIDw/cGhwICRjbGFzcyA9ICdjb2wtc20tOSc7ID8+DQogICAgPD9waHAgfSBlbHNlIHsgPz4NCiAgICA8P3BocCAkY2xhc3MgPSAnY29sLXNtLTEyJzsgPz4NCiAgICA8P3BocCB9ID8+DQogICAgPGRpdiBpZD0iY29udGVudCIgY2xhc3M9InByb2R1Y3QtcGFnZS1jb250ZW50Ij4NCiAgICAgIDw/cGhwIGlmICgkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ3Byb2R1Y3RfcGFnZV90aXRsZV9wb3NpdGlvbicsICd0b3AnKSA9PT0gJ3RvcCcpOiA/Pg0KICAgICAgPGgxIGNsYXNzPSJoZWFkaW5nLXRpdGxlIj48P3BocCBlY2hvICRoZWFkaW5nX3RpdGxlOyA/PjwvaDE+DQogICAgICA8P3BocCBlbmRpZjsgPz4NCiAgICAgIDw/cGhwIGVjaG8gJGNvbnRlbnRfdG9wOyA/Pg0KICAgICAgPGRpdiBjbGFzcz0icm93IHByb2R1Y3QtaW5mbyA8P3BocCBlY2hvICR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgnc3BsaXRfcmF0aW8nKTsgPz4iPg0KICAgICAgICA8P3BocCBpZiAoJGNvbHVtbl9sZWZ0ICYmICRjb2x1bW5fcmlnaHQpIHsgPz4NCiAgICAgICAgPD9waHAgJGNsYXNzID0gJ2NvbC1zbS02JzsgPz4NCiAgICAgICAgPD9waHAgfSBlbHNlaWYgKCRjb2x1bW5fbGVmdCB8fCAkY29sdW1uX3JpZ2h0KSB7ID8+DQogICAgICAgIDw/cGhwICRjbGFzcyA9ICdjb2wtc20tNic7ID8+DQogICAgICAgIDw/cGhwIH0gZWxzZSB7ID8+DQogICAgICAgIDw/cGhwICRjbGFzcyA9ICdjb2wtc20tOCc7ID8+DQogICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgPGRpdiBjbGFzcz0ibGVmdCI+DQogICAgICAgICAgPD9waHAgaWYgKCR0aHVtYikgeyA/Pg0KICAgICAgICAgIDxkaXYgY2xhc3M9ImltYWdlIj4NCiAgICAgICAgICAgIDw/cGhwIGlmIChpc3NldCgkbGFiZWxzKSAmJiBpc19hcnJheSgkbGFiZWxzKSk6ID8+DQogICAgICAgICAgICA8P3BocCBmb3JlYWNoICgkbGFiZWxzIGFzICRsYWJlbCA9PiAkbmFtZSk6ID8+DQogICAgICAgICAgICA8c3BhbiBjbGFzcz0ibGFiZWwtPD9waHAgZWNobyAkbGFiZWw7ID8+Ij48Yj48P3BocCBlY2hvICRuYW1lOyA/PjwvYj48L3NwYW4+DQogICAgICAgICAgICA8P3BocCBlbmRmb3JlYWNoOyA/Pg0KICAgICAgICAgICAgPD9waHAgZW5kaWY7ID8+DQogICAgICAgICAgICA8YSBocmVmPSI8P3BocCBlY2hvICRwb3B1cDsgPz4iIHRpdGxlPSI8P3BocCBlY2hvICRoZWFkaW5nX3RpdGxlOyA/PiI+PGltZyBzcmM9Ijw/cGhwIGVjaG8gJHRodW1iOyA/PiIgdGl0bGU9Ijw/cGhwIGVjaG8gJGhlYWRpbmdfdGl0bGU7ID8+IiBhbHQ9Ijw/cGhwIGVjaG8gJGhlYWRpbmdfdGl0bGU7ID8+IiBpZD0iaW1hZ2UiIGRhdGEtbGFyZ2VpbWc9Ijw/cGhwIGVjaG8gJHBvcHVwOyA/PiIgLz48L2E+DQogICAgICAgICAgPC9kaXY+DQogICAgICAgICAgPD9waHAgaWYoJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdwcm9kdWN0X3BhZ2VfZ2FsbGVyeScpKTogPz4NCiAgICAgICAgICA8ZGl2IGNsYXNzPSJnYWxsZXJ5LXRleHQiPjxzcGFuPjw/cGhwIGVjaG8gJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdwcm9kdWN0X3BhZ2VfZ2FsbGVyeV90ZXh0Jyk7ID8+PC9zcGFuPjwvZGl2Pg0KICAgICAgICAgIDw/cGhwIGVuZGlmOyA/Pg0KDQogICAgICAgICAgPD9waHAgfSA/Pg0KICAgICAgICAgIDw/cGhwIGlmICgkaW1hZ2VzKSB7ID8+DQogICAgICAgICAgPGRpdiBpZD0icHJvZHVjdC1nYWxsZXJ5IiBjbGFzcz0iaW1hZ2UtYWRkaXRpb25hbCA8P3BocCBlY2hvICR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgncHJvZHVjdF9wYWdlX2dhbGxlcnlfY2Fyb3VzZWwnKSA/ICdqb3VybmFsLWNhcm91c2VsJyA6ICdpbWFnZS1hZGRpdGlvbmFsLWdyaWQnOyA/PiI+DQogICAgICAgICAgICA8P3BocCBpZiAoJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdwcm9kdWN0X3BhZ2VfZ2FsbGVyeV9jYXJvdXNlbCcpKTogPz4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN3aXBlciI+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzd2lwZXItY29udGFpbmVyIiA8P3BocCBlY2hvICR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgncnRsJykgPyAnZGlyPSJydGwiJyA6ICcnOyA/Pj4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN3aXBlci13cmFwcGVyIj4NCiAgICAgICAgICAgIDw/cGhwIGVuZGlmOyA/Pg0KICAgICAgICAgICAgICAgIDw/cGhwIGlmICgkdGh1bWIpIHsgPz4NCiAgICAgICAgICAgICAgICA8YSBjbGFzcz0ic3dpcGVyLXNsaWRlIiBzdHlsZT0iPD9waHAgZWNobyAkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ3Byb2R1Y3RfcGFnZV9nYWxsZXJ5X2Nhcm91c2VsJykgPyAoJ3dpZHRoOiAnIC4gMTAwIC8gJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdwcm9kdWN0X3BhZ2VfYWRkaXRpb25hbF93aWR0aCcsIDUpIC4gJyUnKSA6ICcnOyA/PiIgaHJlZj0iPD9waHAgZWNobyBpc3NldCgkcG9wdXBfZml4ZWQpID8gJHBvcHVwX2ZpeGVkIDogJHBvcHVwOyA/PiIgdGl0bGU9Ijw/cGhwIGVjaG8gJGhlYWRpbmdfdGl0bGU7ID8+Ij48aW1nIHNyYz0iPD9waHAgZWNobyBpc3NldCgkdGh1bWJfZml4ZWQpID8gJHRodW1iX2ZpeGVkIDogJHRodW1iOyA/PiIgdGl0bGU9Ijw/cGhwIGVjaG8gJGhlYWRpbmdfdGl0bGU7ID8+IiBhbHQ9Ijw/cGhwIGVjaG8gJGhlYWRpbmdfdGl0bGU7ID8+Ii8+PC9hPg0KICAgICAgICAgICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgICAgICAgICA8P3BocCBmb3JlYWNoICgkaW1hZ2VzIGFzICRpbWFnZSkgeyA/Pg0KICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJzd2lwZXItc2xpZGUiIHN0eWxlPSI8P3BocCBlY2hvICR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgncHJvZHVjdF9wYWdlX2dhbGxlcnlfY2Fyb3VzZWwnKSA/ICgnd2lkdGg6ICcgLiAxMDAgLyAkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ3Byb2R1Y3RfcGFnZV9hZGRpdGlvbmFsX3dpZHRoJywgNSkgLiAnJScpIDogJyc7ID8+IiBocmVmPSI8P3BocCBlY2hvICRpbWFnZVsncG9wdXAnXTsgPz4iIHRpdGxlPSI8P3BocCBlY2hvICRoZWFkaW5nX3RpdGxlOyA/PiI+PGltZyBzcmM9Ijw/cGhwIGVjaG8gJGltYWdlWyd0aHVtYiddOyA/PiIgdGl0bGU9Ijw/cGhwIGVjaG8gJGhlYWRpbmdfdGl0bGU7ID8+IiBhbHQ9Ijw/cGhwIGVjaG8gJGhlYWRpbmdfdGl0bGU7ID8+Ii8+PC9hPg0KICAgICAgICAgICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgICAgIDw/cGhwIGlmICgkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ3Byb2R1Y3RfcGFnZV9nYWxsZXJ5X2Nhcm91c2VsJykpOiA/Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN3aXBlci1idXR0b24tbmV4dCI+PC9kaXY+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzd2lwZXItYnV0dG9uLXByZXYiPjwvZGl2Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8P3BocCBlbmRpZjsgPz4NCiAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICA8P3BocCBpZiAoJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdwcm9kdWN0X3BhZ2VfZ2FsbGVyeV9jYXJvdXNlbCcpKTogPz4NCiAgICAgICAgICA8c2NyaXB0Pg0KICAgICAgICAgICAgKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICB2YXIgb3B0cyA9IHsNCiAgICAgICAgICAgICAgICAgICAgc2xpZGVzUGVyVmlldzogcGFyc2VJbnQoJzw/cGhwIGVjaG8gJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdwcm9kdWN0X3BhZ2VfYWRkaXRpb25hbF93aWR0aCcsIDUpID8+JywgMTApLA0KICAgICAgICAgICAgICAgICAgICBzbGlkZXNQZXJHcm91cDogcGFyc2VJbnQoJzw/cGhwIGVjaG8gJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdwcm9kdWN0X3BhZ2VfYWRkaXRpb25hbF93aWR0aCcsIDUpID8+JywgMTApLA0KICAgICAgICAgICAgICAgICAgICBzcGFjZUJldHdlZW46IHBhcnNlSW50KCc8P3BocCBlY2hvICR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgncHJvZHVjdF9wYWdlX2FkZGl0aW9uYWxfc3BhY2luZycsIDEwKSA/PicsIDEwKSwNCiAgICAgICAgICAgICAgICAgICAgbmV4dEJ1dHRvbjogJCgnI3Byb2R1Y3QtZ2FsbGVyeSAuc3dpcGVyLWJ1dHRvbi1uZXh0JyksDQogICAgICAgICAgICAgICAgICAgIHByZXZCdXR0b246ICQoJyNwcm9kdWN0LWdhbGxlcnkgLnN3aXBlci1idXR0b24tcHJldicpLA0KICAgICAgICAgICAgICAgICAgICBhdXRvcGxheTogPD9waHAgZWNobyAkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ3Byb2R1Y3RfcGFnZV9nYWxsZXJ5X2Nhcm91c2VsX2F1dG9wbGF5JykgPyAoaW50KSR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgncHJvZHVjdF9wYWdlX2dhbGxlcnlfY2Fyb3VzZWxfdHJhbnNpdGlvbl9kZWxheScsIDQwMDApIDogJ2ZhbHNlJzsgPz4sDQogICAgICAgICAgICAgICAgICAgIHNwZWVkOiA8P3BocCBlY2hvIChpbnQpJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdwcm9kdWN0X3BhZ2VfZ2FsbGVyeV9jYXJvdXNlbF90cmFuc2l0aW9uX3NwZWVkJywgNDAwKTsgPz4sDQogICAgICAgICAgICAgICAgICAgIHRvdWNoRXZlbnRzVGFyZ2V0OiA8P3BocCBlY2hvICR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgncHJvZHVjdF9wYWdlX2dhbGxlcnlfY2Fyb3VzZWxfdG91Y2hkcmFnJykgID8gJ1wnY29udGFpbmVyXCcnIDogJ2ZhbHNlJzsgPz4sDQogICAgICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgICAgICQoJyNwcm9kdWN0LWdhbGxlcnkgLnN3aXBlci1jb250YWluZXInKS5zd2lwZXIob3B0cyk7DQogICAgICAgICAgICB9KSgpOw0KICAgICAgICAgIDwvc2NyaXB0Pg0KICAgICAgICAgIDw/cGhwIGVuZGlmOyA/Pg0KICAgICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgICA8P3BocCBmb3JlYWNoICgkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ2FkZGl0aW9uYWxfcHJvZHVjdF9kZXNjcmlwdGlvbl9pbWFnZScsIGFycmF5KCkpIGFzICR0YWIpOiA/Pg0KICAgICAgICAgIDxkaXYgY2xhc3M9ImpvdXJuYWwtY3VzdG9tLXRhYiI+DQogICAgICAgICAgICA8P3BocCBpZiAoJHRhYlsnaGFzX2ljb24nXSk6ID8+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJibG9jay1pY29uIGJsb2NrLWljb24tbGVmdCIgc3R5bGU9Ijw/cGhwIGVjaG8gJHRhYlsnaWNvbl9jc3MnXTsgPz4iPjw/cGhwIGVjaG8gJHRhYlsnaWNvbiddOyA/PjwvZGl2Pg0KICAgICAgICAgICAgPD9waHAgZW5kaWY7ID8+DQogICAgICAgICAgICA8P3BocCBpZiAoJHRhYlsnbmFtZSddKTogPz4NCiAgICAgICAgICAgIDxoMz48P3BocCBlY2hvICR0YWJbJ25hbWUnXTsgPz48L2gzPg0KICAgICAgICAgICAgPD9waHAgZW5kaWY7ID8+DQogICAgICAgICAgICA8P3BocCBlY2hvICR0YWJbJ2NvbnRlbnQnXTsgPz4NCiAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICA8P3BocCBlbmRmb3JlYWNoOyA/Pg0KICAgICAgICAgIDxkaXYgY2xhc3M9ImltYWdlLWdhbGxlcnkiIHN0eWxlPSJkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Ij4NCiAgICAgICAgICAgIDw/cGhwIGlmICgkdGh1bWIpIHsgPz4NCiAgICAgICAgICAgIDxhIGhyZWY9Ijw/cGhwIGVjaG8gJHBvcHVwOyA/PiIgZGF0YS1vcmlnaW5hbD0iPD9waHAgZWNobyBpc3NldCgkb3JpZ2luYWwpID8gJG9yaWdpbmFsIDogJHBvcHVwOyA/PiIgdGl0bGU9Ijw/cGhwIGVjaG8gJGhlYWRpbmdfdGl0bGU7ID8+IiBjbGFzcz0ic3dpcGVib3giPjxpbWcgc3JjPSI8P3BocCBlY2hvICR0aHVtYjsgPz4iIHRpdGxlPSI8P3BocCBlY2hvICRoZWFkaW5nX3RpdGxlOyA/PiIgYWx0PSI8P3BocCBlY2hvICRoZWFkaW5nX3RpdGxlOyA/PiIgLz48L2E+DQogICAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgICA8P3BocCBpZiAoJGltYWdlcykgeyA/Pg0KICAgICAgICAgICAgPD9waHAgZm9yZWFjaCAoJGltYWdlcyBhcyAkaW1hZ2UpIHsgPz4NCiAgICAgICAgICAgIDxhIGhyZWY9Ijw/cGhwIGVjaG8gJGltYWdlWydwb3B1cCddOyA/PiIgZGF0YS1vcmlnaW5hbD0iPD9waHAgZWNobyBpc3NldCgkaW1hZ2VbJ29yaWdpbmFsJ10pID8gJGltYWdlWydvcmlnaW5hbCddIDogJGltYWdlWydwb3B1cCddOyA/PiIgdGl0bGU9Ijw/cGhwIGVjaG8gJGhlYWRpbmdfdGl0bGU7ID8+IiBjbGFzcz0ic3dpcGVib3giPjxpbWcgc3JjPSI8P3BocCBlY2hvICRpbWFnZVsndGh1bWInXTsgPz4iIHRpdGxlPSI8P3BocCBlY2hvICRoZWFkaW5nX3RpdGxlOyA/PiIgYWx0PSI8P3BocCBlY2hvICRoZWFkaW5nX3RpdGxlOyA/PiIgLz48L2E+DQogICAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgPC9kaXY+DQogICAgICAgICAgPD9waHAgaWYgKCR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgnc2hhcmVfYnV0dG9uc19zdGF0dXMnKSAmJiAoIUpvdXJuYWwyQ2FjaGU6OiRtb2JpbGVfZGV0ZWN0LT5pc01vYmlsZSgpIHx8IChKb3VybmFsMkNhY2hlOjokbW9iaWxlX2RldGVjdC0+aXNNb2JpbGUoKSAmJiAhJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdzaGFyZV9idXR0b25zX2Rpc2FibGVfb25fbW9iaWxlJywgMSkpKSAmJiAkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ3NoYXJlX2J1dHRvbnNfcG9zaXRpb24nKSA9PT0gJ2xlZnQnICYmIGNvdW50KCR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgnY29uZmlnX3NoYXJlX2J1dHRvbnMnLCBhcnJheSgpKSkpOiA/Pg0KICAgICAgICAgIDxkaXYgY2xhc3M9InNvY2lhbCBzaGFyZS10aGlzIDw/cGhwIGVjaG8gJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdzaGFyZV9idXR0b25zX2Rpc2FibGVfb25fbW9iaWxlJywgMSkgPyAnaGlkZS1vbi1tb2JpbGUnIDogJyc7ID8+Ij4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNvY2lhbC1sb2FkZWQiPg0KICAgICAgICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+dmFyIHN3aXRjaFRvNXg9dHJ1ZTs8L3NjcmlwdD4NCiAgICAgICAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93cy5zaGFyZXRoaXMuY29tL2J1dHRvbi9idXR0b25zLmpzIj48L3NjcmlwdD4NCiAgICAgICAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPnN0TGlnaHQub3B0aW9ucyh7cHVibGlzaGVyOiAiPD9waHAgZWNobyAkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ3NoYXJlX2J1dHRvbnNfYWNjb3VudF9rZXknKTsgPz4iLCBkb05vdEhhc2g6IHRydWUsIGRvTm90Q29weTogdHJ1ZSwgaGFzaEFkZHJlc3NCYXI6IGZhbHNlfSk7PC9zY3JpcHQ+DQogICAgICAgICAgICAgIDw/cGhwIGZvcmVhY2ggKCR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgnY29uZmlnX3NoYXJlX2J1dHRvbnMnLCBhcnJheSgpKSBhcyAkaXRlbSk6ID8+DQogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSI8P3BocCBlY2hvICRpdGVtWydjbGFzcyddIC4gJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdzaGFyZV9idXR0b25zX3N0eWxlJyk7ID8+IiBkaXNwbGF5VGV4dD0iPD9waHAgZWNobyAkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ3NoYXJlX2J1dHRvbnNfc3R5bGUnKSA/ICRpdGVtWyduYW1lJ10gOiAnJzsgPz4iPjwvc3Bhbj4NCiAgICAgICAgICAgICAgPD9waHAgZW5kZm9yZWFjaDsgPz4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgIDw/cGhwIGVuZGlmOyA/Pg0KICAgICAgICAgIDxtZXRhPSJkZXNjcmlwdGlvbiIgY29udGVudD0iPD9waHAgZWNobyAkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ3Byb2R1Y3RfZGVzY3JpcHRpb24nKTsgPz4iIC8+DQogICAgICAgICAgPGRpdiBjbGFzcz0icHJvZHVjdC10YWJzIj4NCiAgICAgICAgICAgIDw/cGhwIGlmICgkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ3NoYXJlX2J1dHRvbnNfc3RhdHVzJykgJiYgKCFKb3VybmFsMkNhY2hlOjokbW9iaWxlX2RldGVjdC0+aXNNb2JpbGUoKSB8fCAoSm91cm5hbDJDYWNoZTo6JG1vYmlsZV9kZXRlY3QtPmlzTW9iaWxlKCkgJiYgISR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgnc2hhcmVfYnV0dG9uc19kaXNhYmxlX29uX21vYmlsZScsIDEpKSkgJiYgJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdzaGFyZV9idXR0b25zX3Bvc2l0aW9uJykgPT09ICdib3R0b20nICYmIGNvdW50KCR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgnY29uZmlnX3NoYXJlX2J1dHRvbnMnLCBhcnJheSgpKSkpOiA/Pg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic29jaWFsIHNoYXJlLXRoaXMgPD9waHAgZWNobyAkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ3NoYXJlX2J1dHRvbnNfZGlzYWJsZV9vbl9tb2JpbGUnLCAxKSA/ICdoaWRlLW9uLW1vYmlsZScgOiAnJzsgPz4iPg0KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzb2NpYWwtbG9hZGVkIj4NCiAgICAgICAgICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+dmFyIHN3aXRjaFRvNXg9dHJ1ZTs8L3NjcmlwdD4NCiAgICAgICAgICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3dzLnNoYXJldGhpcy5jb20vYnV0dG9uL2J1dHRvbnMuanMiPjwvc2NyaXB0Pg0KICAgICAgICAgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5zdExpZ2h0Lm9wdGlvbnMoe3B1Ymxpc2hlcjogIjw/cGhwIGVjaG8gJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdzaGFyZV9idXR0b25zX2FjY291bnRfa2V5Jyk7ID8+IiwgZG9Ob3RIYXNoOiB0cnVlLCBkb05vdENvcHk6IHRydWUsIGhhc2hBZGRyZXNzQmFyOiBmYWxzZX0pOzwvc2NyaXB0Pg0KICAgICAgICAgICAgICAgIDw/cGhwIGZvcmVhY2ggKCR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgnY29uZmlnX3NoYXJlX2J1dHRvbnMnLCBhcnJheSgpKSBhcyAkaXRlbSk6ID8+DQogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Ijw/cGhwIGVjaG8gJGl0ZW1bJ2NsYXNzJ10gLiAkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ3NoYXJlX2J1dHRvbnNfc3R5bGUnKTsgPz4iIGRpc3BsYXlUZXh0PSI8P3BocCBlY2hvICR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgnc2hhcmVfYnV0dG9uc19zdHlsZScpID8gJGl0ZW1bJ25hbWUnXSA6ICcnOyA/PiI+PC9zcGFuPg0KICAgICAgICAgICAgICAgIDw/cGhwIGVuZGZvcmVhY2g7ID8+DQogICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8P3BocCBlbmRpZjsgPz4NCiAgICAgICAgICA8dWwgaWQ9InRhYnMiIGNsYXNzPSJuYXYgbmF2LXRhYnMgaHRhYnMiPg0KICAgICAgICAgICAgPD9waHAgJGlzX2FjdGl2ZSA9IHRydWU7ID8+DQogICAgICAgICAgICA8P3BocCBpZiAodHJpbSgkZGVzY3JpcHRpb24pICYmICEkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ2hpZGVfcHJvZHVjdF9kZXNjcmlwdGlvbicpKSB7ID8+DQogICAgICAgICAgICA8bGkgPD9waHAgaWYgKCRpc19hY3RpdmUpIHsgZWNobyAnY2xhc3M9ImFjdGl2ZSInOyAkaXNfYWN0aXZlID0gZmFsc2U7IH0gOz8+PjxhIGhyZWY9IiN0YWItZGVzY3JpcHRpb24iIGRhdGEtdG9nZ2xlPSJ0YWIiPjw/cGhwIGVjaG8gJHRhYl9kZXNjcmlwdGlvbjsgPz48L2E+PC9saT4NCiAgICAgICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgICAgIDw/cGhwIGlmICgkYXR0cmlidXRlX2dyb3VwcykgeyA/Pg0KICAgICAgICAgICAgPGxpIDw/cGhwIGlmICgkaXNfYWN0aXZlKSB7IGVjaG8gJ2NsYXNzPSJhY3RpdmUiJzsgJGlzX2FjdGl2ZSA9IGZhbHNlOyB9IDs/Pj48YSBocmVmPSIjdGFiLXNwZWNpZmljYXRpb24iIGRhdGEtdG9nZ2xlPSJ0YWIiPjw/cGhwIGVjaG8gJHRhYl9hdHRyaWJ1dGU7ID8+PC9hPjwvbGk+DQogICAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgICA8P3BocCBpZiAoJHJldmlld19zdGF0dXMpIHsgPz4NCiAgICAgICAgICAgIDxsaSA8P3BocCBpZiAoJGlzX2FjdGl2ZSkgeyBlY2hvICdjbGFzcz0iYWN0aXZlIic7ICRpc19hY3RpdmUgPSBmYWxzZTsgfSA7Pz4+PGEgaHJlZj0iI3RhYi1yZXZpZXciIGRhdGEtdG9nZ2xlPSJ0YWIiPjw/cGhwIGVjaG8gJHRhYl9yZXZpZXc7ID8+PC9hPjwvbGk+DQogICAgICAgICAgICA8P3BocCB9ID8+DQoJCQk8P3BocCBpZiAoIGlzc2V0KCRjdXN0b21lclBob3Rvc0RhdGFbJ0VuYWJsZWQnXSkgJiYgJGN1c3RvbWVyUGhvdG9zRGF0YVsnRW5hYmxlZCddID09ICd5ZXMnICYmICRjdXN0b21lclBob3Rvc0RhdGFbJ3Nob3dJblRhYiddID09ICd5ZXMnICkgeyA/Pg0KCQkJCTxsaT48YSBocmVmPSIjdGFiX0N1c3RvbWVyUGhvdG9zIiBkYXRhLXRvZ2dsZT0idGFiIj48P3BocCBlY2hvICR0YWJfQ3VzdG9tZXJQaG90b3M7ID8+PC9hPjwvbGk+DQoJCQk8P3BocCB9ID8+DQogICAgICAgICAgICA8P3BocCAkaW5kZXggPSAwOyBmb3JlYWNoICgkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ2FkZGl0aW9uYWxfcHJvZHVjdF90YWJzJywgYXJyYXkoKSkgYXMgJHRhYik6ICRpbmRleCsrOyA/Pg0KICAgICAgICAgICAgPGxpIDw/cGhwIGlmICgkaXNfYWN0aXZlKSB7IGVjaG8gJ2NsYXNzPSJhY3RpdmUiJzsgJGlzX2FjdGl2ZSA9IGZhbHNlOyB9IDs/Pj48YSBocmVmPSIjYWRkaXRpb25hbC1wcm9kdWN0LXRhYi08P3BocCBlY2hvICRpbmRleDsgPz4iIGRhdGEtdG9nZ2xlPSJ0YWIiPjw/cGhwIGVjaG8gJHRhYlsnbmFtZSddOyA/PjwvYT48L2xpPg0KICAgICAgICAgICAgPD9waHAgZW5kZm9yZWFjaDsgPz4NCiAgICAgICAgICA8L3VsPg0KICAgICAgICAgIDxkaXYgY2xhc3M9InRhYnMtY29udGVudCI+DQogICAgICAgICAgICA8P3BocCAkaXNfYWN0aXZlID0gdHJ1ZTsgPz4NCiAgICAgICAgICAgIDw/cGhwIGlmICh0cmltKCRkZXNjcmlwdGlvbikgJiYgISR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgnaGlkZV9wcm9kdWN0X2Rlc2NyaXB0aW9uJykpIHsgPz4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYi1wYW5lIHRhYi1jb250ZW50IDw/cGhwIGlmICgkaXNfYWN0aXZlKSB7IGVjaG8gJ2FjdGl2ZSc7ICRpc19hY3RpdmUgPSBmYWxzZTsgfSA7Pz4iIGlkPSJ0YWItZGVzY3JpcHRpb24iPjw/cGhwIGVjaG8gJGRlc2NyaXB0aW9uOyA/PjwvZGl2Pg0KICAgICAgICAgICAgPD9waHAgfSA/Pg0KCQkJPD9waHAgaWYgKCFlbXB0eSgkY3VzdG9tZXJQaG90b3NEYXRhWydFbmFibGVkJ10pICYmICRjdXN0b21lclBob3Rvc0RhdGFbJ0VuYWJsZWQnXSA9PSAneWVzJyAmJiAkY3VzdG9tZXJQaG90b3NEYXRhWydzaG93SW5UYWInXSA9PSAneWVzJykgeyA/Pg0KCQkJPGRpdiBjbGFzcz0idGFiLXBhbmUgdGFiLWNvbnRlbnQxIiBpZD0idGFiX0N1c3RvbWVyUGhvdG9zIj4NCgkJCQk8P3BocCANCgkJCQkkZmxhZz0wOw0KCQkJCWlmICghZW1wdHkoJGN1c3RvbWVyUGhvdG9zQ3VzdG9tVGFncykpIHsNCgkJCQkJZm9yZWFjaCAoJGN1c3RvbWVyUGhvdG9zQ3VzdG9tVGFncyBhcyAkQ3VzdG9tVGFncykgew0KCQkJCQkJIGlmICgkQ3VzdG9tVGFnc1sncGlkJ109PSRwcm9kdWN0X2lkKSB7DQoJCQkJCQkJICRmbGFnPTE7DQoJCQkJCQkJCWlmICgkY3VzdG9tZXJQaG90b3NEYXRhWydVc2VTaXRlU2hvcnROYW1lUHJvZHVjdHMnXSA9PSAieWVzIikgew0KCQkJCQkJCQkJJHRhZ1ZhciA9ICRjdXN0b21lclBob3Rvc0RhdGFbJ1Nob3J0VGFnJ10uJEN1c3RvbVRhZ3NbJ3RhZyddOwkNCgkJCQkJCQkJfSBlbHNlIHsNCgkJCQkJCQkJCSR0YWdWYXIgPSAkQ3VzdG9tVGFnc1sndGFnJ107DQoJCQkJCQkJCX0NCgkJCQkJCSB9DQoJCQkJCX0NCgkJCQl9DQoJCQkJaWYgKCRmbGFnPT0wKSB7DQoJCQkJCSRyZXBsYWNlID0gYXJyYXkoJyAnLCAnIicsICciJywgJy4nLCAnLCcgLCdcJycsICchJywgJy0nLCAnPycsICcqJywgJysnLCAnJicsICdAJywgJyQnLCAnJScsICc6JywgJygnLCAnKScpOw0KCQkJCQkkcmVwbGFjZWQgPSBhcnJheSgnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnLCAnJywgJycsICcnKTsNCgkJCQkJJHByb2R1Y3Rfc3RyaXBfdW51c2VkX2NoYXJzID0gc3RyX3JlcGxhY2UoJHJlcGxhY2UsICRyZXBsYWNlZCwgJGhlYWRpbmdfdGl0bGUpOw0KCQkJCQlpZiAoZXh0ZW5zaW9uX2xvYWRlZCgnbWJzdHJpbmcnKSkgeyANCgkJCQkJCSRmaW5hbF90YWdfdmFyID0gbWJfc3Vic3RyKCRwcm9kdWN0X3N0cmlwX3VudXNlZF9jaGFycywwLCRjdXN0b21lclBob3Rvc0RhdGFbJ1RhZ0NoYXJhY3RlckxpbWl0J10sICd1dGYtOCcpOw0KCQkJCQkJJHRhZ1ZhciA9ICRjdXN0b21lclBob3Rvc0RhdGFbJ1Nob3J0VGFnJ10ubWJfc3RydG9sb3dlcigkZmluYWxfdGFnX3ZhciwndXRmLTgnKTsgDQoJCQkJCSB9IGVsc2Ugew0KCQkJCQkJJGZpbmFsX3RhZ192YXIgPSBzdWJzdHIoJHByb2R1Y3Rfc3RyaXBfdW51c2VkX2NoYXJzLDAsJGN1c3RvbWVyUGhvdG9zRGF0YVsnVGFnQ2hhcmFjdGVyTGltaXQnXSk7DQoJCQkJCQkkdGFnVmFyID0gJGN1c3RvbWVyUGhvdG9zRGF0YVsnU2hvcnRUYWcnXS5zdHJ0b2xvd2VyKCRmaW5hbF90YWdfdmFyKTsgDQoJCQkJCSB9DQoJCQkJfQ0KDQogICAgCQkJJHBhdHRlcm5zID0gYXJyYXkoKTsNCgkJCQkkcGF0dGVybnNbMF0gPSAnLyVzLyc7DQoJCQkJJHBhdHRlcm5zWzFdID0gJy97VXBsb2FkIGxpbmt9Lyc7DQoJCQkJJHBhdHRlcm5zWzJdID0gJy9Ud2l0dGVyLyc7DQoJCQkJJHJlcGxhY2VtZW50cyA9IGFycmF5KCk7DQoJCQkJJHJlcGxhY2VtZW50c1swXSA9ICI8c3Ryb25nPiMiLiR0YWdWYXIuIjwvc3Ryb25nPiI7DQoJCQkJJHJlcGxhY2VtZW50c1sxXSA9ICR0ZXh0X3VwbG9hZF9saW5rX3Byb2R1Y3RfcGFnZTsNCgkJCQkkcmVwbGFjZW1lbnRzWzJdID0gJzxzdHJvbmc+VHdpdHRlcjwvc3Ryb25nPic7DQoJCQkJZWNobyBwcmVnX3JlcGxhY2UoJHBhdHRlcm5zLCAkcmVwbGFjZW1lbnRzLCAkY3VzdG9tZXJQaG90b3NEYXRhWydNYWluTWVzc2FnZSddWyRjdXJyZW50X2xhbmd1YWdlXSk7ID8+DQoJCQkJPGJyIC8+PGJyIC8+DQogICAgICAgIA0KCQkJCTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJCQkJLkN1c3RvbWVyUGhvdG9zSW1nIHsNCgkJCQkJYm9yZGVyOiBub25lOw0KCQkJCQloZWlnaHQ6IDw/cGhwIGVjaG8gJGN1c3RvbWVyUGhvdG9zRGF0YVsndGFiSW1hZ2VIZWlnaHQnXTsgPz5weDsNCgkJCQkJd2lkdGg6IGF1dG87DQoJCQkJCXBhZGRpbmc6IDJweDsNCgkJCQkJZGlzcGxheTogbm9uZTsNCgkJCQl9DQoNCiAgICAgICAgICAudXBsb2FkLXN1Y2Nlc3NmdWx7DQogICAgICAgICAgICAgIHRleHQtYWxpZ246Y2VudGVyOw0KICAgICAgICAgIH0NCiAgICAgICAgICAjdXBsb2FkLWNvbnRhaW5lcnsNCiAgICAgICAgICAgICAgaGVpZ2h0OjMwMHB4Ow0KICAgICAgICAgIH0NCg0KICAgICAgICAgICN1cGxvYWQtbWVzc2FnZXsNCiAgICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOw0KICAgICAgICAgICAgICB3aWR0aDogMTAwJTsNCiAgICAgICAgICB9DQoNCg0KICAgICAgICAgIC5tZXNzYWdlLWNvbnRhaW5lcnsNCiAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOw0KICAgICAgICAgICAgICBtYXJnaW4tdG9wOiAyMCU7DQogICAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiA3JTsNCiAgICAgICAgICB9DQogICAgICAgICAgDQogICAgDQoJCQkJPC9zdHlsZT4NCgkJCQk8ZGl2IGlkPSJDdXN0b21lclBob3Rvc0ltYWdlcyI+DQoJCQkJCTxzY3JpcHQ+DQoJCQkJCQl2YXIgY3VzdG9tZXJJZ25vcmVkUGhvdG9zID0gJzw/cGhwIGVjaG8gJGN1c3RvbWVyUGhvdG9zRGF0YVsnSWdub3JlZFBob3RvcyddOyA/Pic7DQoJCQkJCTwvc2NyaXB0PgkJCQkJDQoJCQkJCTw/cGhwIGlmICgkY3VzdG9tZXJQaG90b3NEYXRhWydUd2l0dGVyRW5hYmxlJ10gPT0gJ3llcycpIHsgID8+DQoJCQkJCQk8c2NyaXB0Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0d2l0dGVyVGFnID0gJzw/cGhwIGVjaG8gJHRhZ1ZhcjsgPz4nOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuYWpheCh7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJ2luZGV4LnBocD9yb3V0ZT1tb2R1bGUvY3VzdG9tZXJwaG90b3N3aWRnZXQvdHdpdHRlclRhZ3MmaGFzaHRhZz0nK3R3aXR0ZXJUYWcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZGF0YSkuZWFjaChmdW5jdGlvbihpbmRleCwgZWxlbWVudCkgewkJDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXN0b21lcklnbm9yZWRQaG90b3MuaW5kZXhPZihlbGVtZW50LmltYWdlKSA9PSAtMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI0N1c3RvbWVyUGhvdG9zSW1hZ2VzJykuYXBwZW5kKCc8YSBocmVmPSInK2VsZW1lbnQubGluaysnIiB0aXRsZT0iQ2xpY2sgdG8gc2VlIHRoZSBwaWN0dXJlIGluIGZ1bGwgc2l6ZSIgdGFyZ2V0PSJfYmxhbmsiPjxpbWcgc3JjPSInK2VsZW1lbnQuaW1hZ2UrJyIgY2xhc3M9IkN1c3RvbWVyUGhvdG9zSW1nIiAvPjwvYT4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5DdXN0b21lclBob3Rvc0ltZycpLmZhZGVJbignc2xvdycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICAgICAgCSA8L3NjcmlwdD4NCiAgICAgICAgICAgICAgICAgICAgPD9waHAgfSA/Pg0KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9InVwbG9hZC1tb2RhbC1wcm9kdWN0LXRwbCIgdGFiaW5kZXg9Ii0xIiByb2xlPSJkaWFsb2ciIGFyaWEtbGFiZWxsZWRieT0ibXlNb2RhbExhYmVsIj4NCiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1kaWFsb2ciIHJvbGU9ImRvY3VtZW50Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWNvbnRlbnQiID4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj48P3BocCBlY2hvICRlbnRyeV9yZXNpbXl1a2xlOyA/PjwvaDM+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1sYWJlbD0iQ2xvc2UiPjxzcGFuIGFyaWEtaGlkZGVuPSJ0cnVlIj4mdGltZXM7PC9zcGFuPjwvYnV0dG9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm9keSIgaWQ9InByb2R1dF9wYWdlX3RhYiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93IiBpZD0idXBsb2FkLWNvbnRhaW5lciIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC14cy0xMCBtZXNzYWdlLWNvbnRhaW5lciIgPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9InVwbG9hZC1tZXNzYWdlIj48P3BocCBlY2hvICRlbnRyeV9yZXNpbXl1a2xlYWNpa2xhbWE7ID8+PC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQiIGlkPSJ1cGxvYWQtYnV0dG9uIj48aSBjbGFzcz0iZ2x5cGhpY29uIGdseXBoaWNvbi11cGxvYWQiPjwvaT4mbmJzcDw/cGhwIGVjaG8gJGVudHJ5X3Jlc2lteXVrbGVidXRvbjsgPz48L2J1dHRvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9InByZXZpZXciIHN0eWxlPSJkaXNwbGF5Om5vbmU7IHRleHQtYWxpZ246Y2VudGVyIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZHotcHJldmlldyBkei1maWxlLXByZXZpZXciPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZHotZGV0YWlscyIgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGRhdGEtZHotdGh1bWJuYWlsIC8+ICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0icHJvZ3Jlc2Jhcl9jb250YWluZXIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InByb2dyZXNzIHByb2dyZXNzLXN0cmlwZWQgYWN0aXZlIiBpZD0iYmFyIiByb2xlPSJwcm9ncmVzc2JhciIgYXJpYS12YWx1ZW1pbj0iMCIgYXJpYS12YWx1ZW1heD0iMTAwIiBhcmlhLXZhbHVlbm93PSIwIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvZ3Jlc3MtYmFyIHByb2dyZXNzLWJhci1zdWNjZXNzIiBzdHlsZT0id2lkdGg6MCU7IiBkYXRhLWR6LXVwbG9hZHByb2dyZXNzPjwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPD9waHAgaWYgKCRjdXN0b21lclBob3Rvc0RhdGFbJ1VwbG9hZGVkUGhvdG9zRW5hYmxlJ10gPT0gJ3llcycpIHsgID8+DQogICAgICAgICAgICAgICAgICAgIDxzY3JpcHQ+DQogICAgICAgICAgICAgICAgICAgICAgdmFyIG15RHJvcHpvbmU7DQogICAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZpZXdUZW1wbGF0ZSA9ICQoJyNwcmV2aWV3JykuaHRtbCgpOw0KICAgICAgICAgICAgICAgICAgICAgICQoJyN1cGxvYWQtbW9kYWwtcHJvZHVjdC10cGwnKS5vbignc2hvd24uYnMubW9kYWwnLCBmdW5jdGlvbiAoZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjdXBsb2FkLWNvbnRhaW5lcicpLmNzcygnZGlzcGxheScsJ2Jsb2NrJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgIG15RHJvcHpvbmUgPSBuZXcgRHJvcHpvbmUoImRpdiNwcm9kdXRfcGFnZV90YWIiLCB7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogIjw/cGhwIGVjaG8gJGN1c3RvbWVyX3Bob3Rvc191cGxvYWRfYWN0aW9uPz4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRodW1ibmFpbFdpZHRoOiAyMDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGh1bWJuYWlsSGVpZ2h0OiAyMDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlld1RlbXBsYXRlOnByZXZpZXdUZW1wbGF0ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlja2FibGU6IiN1cGxvYWQtYnV0dG9uIiwgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbXlEcm9wem9uZS5vbignc2VuZGluZycsIGZ1bmN0aW9uKGZpbGUsIHhociwgZm9ybURhdGEpew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCd3aWRnZXRfY3VzdG9tX3RhZycsICc8P3BocCBlY2hvICR0YWdWYXI7ID8+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbXlEcm9wem9uZS5vbigic3VjY2VzcyIsIGZ1bmN0aW9uKHByb2dyZXNzKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5wcm9ncmVzcy1iYXInKS5wYXJlbnQoKS5yZW1vdmVDbGFzcygiYWN0aXZlIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5tb2RhbC1ib2R5JykuYXBwZW5kKCc8cCBjbGFzcz0idXBsb2FkLXN1Y2Nlc3NmdWwiPllvdXIgcGhvdG8gaGFzIGJlZW4gdXBsb2FkZWQgYW5kIHdpbGwgYmUgcmV2aWV3ZWQgYnkgYW4gYWRtaW5pc3RyYXRvcjwvcD4nKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAkKCcjdXBsb2FkLWJ1dHRvbicpLmNsaWNrKGZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICQoJyN1cGxvYWQtY29udGFpbmVyJykuY3NzKCdkaXNwbGF5Jywnbm9uZScpOw0KICAgICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICAgICAgJCgnI3VwbG9hZC1tb2RhbC1wcm9kdWN0LXRwbCcpLm9uKCdoaWRkZW4uYnMubW9kYWwnLCBmdW5jdGlvbiAoZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcudXBsb2FkLXN1Y2Nlc3NmdWwnKS5yZW1vdmUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbXlEcm9wem9uZS5kZXN0cm95KCkNCiAgICAgICAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgICAgICAgICAgIHZhciB0YWcgPSAnPD9waHAgZWNobyAkdGFnVmFyOyA/Pic7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5hamF4KHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAnaW5kZXgucGhwP3JvdXRlPW1vZHVsZS9jdXN0b21lcnBob3Rvcy9nZXRVcGxvYWRlZFBob3RvcycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6J2dldCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6e3RhZzp0YWd9LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKSB7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRhdGEpLmVhY2goZnVuY3Rpb24oaW5kZXgsIGVsZW1lbnQpIHsgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1c3RvbWVySWdub3JlZFBob3Rvcy5pbmRleE9mKGVsZW1lbnQuaW1hZ2VfdXJsKSA9PSAtMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI0N1c3RvbWVyUGhvdG9zSW1hZ2VzJykuYXBwZW5kKCc8YSBocmVmPSInK2VsZW1lbnQuaW1hZ2VfcHJldmlldysnIiB0aXRsZT0iQ2xpY2sgdG8gc2VlIHRoZSBwaWN0dXJlIGluIGZ1bGwgc2l6ZSIgdGFyZ2V0PSJfYmxhbmsiPjxpbWcgc3JjPSInK2VsZW1lbnQuaW1hZ2VfdXJsKyciIGNsYXNzPSJDdXN0b21lclBob3Rvc0ltZyIgLz48L2E+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcuQ3VzdG9tZXJQaG90b3NJbWcnKS5mYWRlSW4oJ3Nsb3cnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICAgICAgPC9zY3JpcHQ+DQogICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gPz4NCgkJCQk8L2Rpdj4NCgkJCTwvZGl2Pg0KCQkJPD9waHAgfSA/Pg0KICAgICAgICAgICAgPD9waHAgaWYgKCRhdHRyaWJ1dGVfZ3JvdXBzKSB7ID8+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWItcGFuZSB0YWItY29udGVudCA8P3BocCBpZiAoJGlzX2FjdGl2ZSkgeyBlY2hvICdhY3RpdmUnOyAkaXNfYWN0aXZlID0gZmFsc2U7IH0gOz8+IiBpZD0idGFiLXNwZWNpZmljYXRpb24iPg0KICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9InRhYmxlIHRhYmxlLWJvcmRlcmVkIGF0dHJpYnV0ZSI+DQogICAgICAgICAgICAgICAgPD9waHAgZm9yZWFjaCAoJGF0dHJpYnV0ZV9ncm91cHMgYXMgJGF0dHJpYnV0ZV9ncm91cCkgeyA/Pg0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIDx0Ym9keT4NCiAgICAgICAgICAgICAgICAgIDw/cGhwIGZvcmVhY2ggKCRhdHRyaWJ1dGVfZ3JvdXBbJ2F0dHJpYnV0ZSddIGFzICRhdHRyaWJ1dGUpIHsgPz4NCiAgICAgICAgICAgICAgICAgIDx0cj4NCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJ3aWR0aDoyMTVweDsgdGV4dC1hbGlnbjpsZWZ0OyI+PD9waHAgZWNobyAkYXR0cmlidXRlWyduYW1lJ107ID8+PC90ZD4NCiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJ3aWR0aDphdXRvOyI+PD9waHAgZWNobyAkYXR0cmlidXRlWyd0ZXh0J107ID8+PC90ZD4NCiAgICAgICAgICAgICAgICAgIDwvdHI+DQogICAgICAgICAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgICAgICAgPC90Ym9keT4NCiAgICAgICAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgICAgIDwvdGFibGU+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgICAgIDw/cGhwIGlmICgkcmV2aWV3X3N0YXR1cykgeyA/Pg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFiLXBhbmUgdGFiLWNvbnRlbnQgPD9waHAgaWYgKCRpc19hY3RpdmUpIHsgZWNobyAnYWN0aXZlJzsgJGlzX2FjdGl2ZSA9IGZhbHNlOyB9IDs/PiIgaWQ9InRhYi1yZXZpZXciIDw/cGhwIGlmICgkcmF0aW5nKTogPz48P3BocCBlbmRpZjsgPz4+DQogICAgICAgICAgICAgICAgPD9waHAgaWYgKCRyYXRpbmcpOiA/Pg0KICAgICAgICAgICAgICAgIDxtZXRhID0icmF0aW5nVmFsdWUiIGNvbnRlbnQ9Ijw/cGhwIGVjaG8gJHJhdGluZzsgPz4iIC8+DQogICAgICAgICAgICAgICAgPG1ldGEgPSJyZXZpZXdDb3VudCIgY29udGVudD0iPD9waHAgZWNobyAkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ3Byb2R1Y3RfbnVtX3Jldmlld3MnKTsgPz4iIC8+DQogICAgICAgICAgICAgICAgPG1ldGEgPSJiZXN0UmF0aW5nIiBjb250ZW50PSI1IiAvPg0KICAgICAgICAgICAgICAgIDxtZXRhID0id29yc3RSYXRpbmciIGNvbnRlbnQ9IjEiIC8+DQogICAgICAgICAgICAgICAgPD9waHAgZW5kaWY7ID8+DQogICAgICAgICAgICAgIDxmb3JtIGNsYXNzPSJmb3JtLWhvcml6b250YWwiIGlkPSJmb3JtLXJldmlldyI+DQogICAgICAgICAgICAgICAgPGRpdiBpZD0icmV2aWV3Ij48L2Rpdj4NCiAgICAgICAgICAgICAgICA8aDIgaWQ9InJldmlldy10aXRsZSI+PD9waHAgZWNobyAkdGV4dF93cml0ZTsgPz48L2gyPg0KICAgICAgICAgICAgICAgIDw/cGhwIGlmICgkcmV2aWV3X2d1ZXN0KSB7ID8+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCByZXF1aXJlZCI+DQogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtc20tMTIiPg0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImNvbnRyb2wtbGFiZWwiIGZvcj0iaW5wdXQtbmFtZSI+PD9waHAgZWNobyAkZW50cnlfbmFtZTsgPz48L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibmFtZSIgdmFsdWU9Ijw/cGhwIGVjaG8gdmVyc2lvbl9jb21wYXJlKFZFUlNJT04sICcyLjInLCAnPCcpID8gJycgOiAkY3VzdG9tZXJfbmFtZTsgPz4iIGlkPSJpbnB1dC1uYW1lIiBjbGFzcz0iZm9ybS1jb250cm9sIiAvPg0KICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCByZXF1aXJlZCI+DQogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtc20tMTIiPg0KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImNvbnRyb2wtbGFiZWwiIGZvcj0iaW5wdXQtcmV2aWV3Ij48P3BocCBlY2hvICRlbnRyeV9yZXZpZXc7ID8+PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9InRleHQiIHJvd3M9IjUiIGlkPSJpbnB1dC1yZXZpZXciIGNsYXNzPSJmb3JtLWNvbnRyb2wiPjwvdGV4dGFyZWE+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlbHAtYmxvY2siPjw/cGhwIGVjaG8gJHRleHRfbm90ZTsgPz48L2Rpdj4NCiAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgcmVxdWlyZWQiPg0KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLXNtLTEyIj4NCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJjb250cm9sLWxhYmVsIj48P3BocCBlY2hvICRlbnRyeV9yYXRpbmc7ID8+PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7IDw/cGhwIGVjaG8gJGVudHJ5X2JhZDsgPz4mbmJzcDsNCiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJyYXRpbmciIHZhbHVlPSIxIiAvPg0KICAgICAgICAgICAgICAgICAgICAmbmJzcDsNCiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJyYXRpbmciIHZhbHVlPSIyIiAvPg0KICAgICAgICAgICAgICAgICAgICAmbmJzcDsNCiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJyYXRpbmciIHZhbHVlPSIzIiAvPg0KICAgICAgICAgICAgICAgICAgICAmbmJzcDsNCiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJyYXRpbmciIHZhbHVlPSI0IiAvPg0KICAgICAgICAgICAgICAgICAgICAmbmJzcDsNCiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJyYXRpbmciIHZhbHVlPSI1IiAvPg0KICAgICAgICAgICAgICAgICAgICAmbmJzcDs8P3BocCBlY2hvICRlbnRyeV9nb29kOyA/PjwvZGl2Pg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDxici8+DQogICAgICAgICAgICAgICAgPD9waHAgaWYgKHZlcnNpb25fY29tcGFyZShWRVJTSU9OLCAnMi4wLjInLCAnPCcpKTogPz4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIHJlcXVpcmVkIj4NCiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1zbS0xMiI+DQogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iY29udHJvbC1sYWJlbCIgZm9yPSJpbnB1dC1jYXB0Y2hhIj48P3BocCBlY2hvICRlbnRyeV9jYXB0Y2hhOyA/PjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJjYXB0Y2hhIiB2YWx1ZT0iIiBpZD0iaW5wdXQtY2FwdGNoYSIgY2xhc3M9ImZvcm0tY29udHJvbCIgLz4NCiAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPg0KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLXNtLTEyIj4gPGltZyBzcmM9ImluZGV4LnBocD9yb3V0ZT10b29sL2NhcHRjaGEiIGFsdD0iIiBpZD0iY2FwdGNoYSIgLz4gPC9kaXY+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgPD9waHAgZWxzZWlmICh2ZXJzaW9uX2NvbXBhcmUoVkVSU0lPTiwgJzIuMScsICc8JykpOiA/Pg0KICAgICAgICAgICAgICAgIDw/cGhwIGlmICgkc2l0ZV9rZXkpIHsgPz4NCiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtc20tMTIiPg0KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImctcmVjYXB0Y2hhIiBkYXRhLXNpdGVrZXk9Ijw/cGhwIGVjaG8gJHNpdGVfa2V5OyA/PiI+PC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgPD9waHAgfSA/Pg0KICAgICAgICAgICAgICAgIDw/cGhwIGVsc2U6ID8+DQogICAgICAgICAgICAgICAgPD9waHAgZWNobyAkY2FwdGNoYTsgPz4NCiAgICAgICAgICAgICAgICA8P3BocCBlbmRpZjsgPz4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJidXR0b25zIj4NCiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InB1bGwtcmlnaHQiPg0KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgaWQ9ImJ1dHRvbi1yZXZpZXciIGRhdGEtbG9hZGluZy10ZXh0PSI8P3BocCBlY2hvICR0ZXh0X2xvYWRpbmc7ID8+IiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IGJ1dHRvbiI+PD9waHAgZWNobyAkYnV0dG9uX2NvbnRpbnVlOyA/PjwvYnV0dG9uPg0KICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgPD9waHAgfSBlbHNlIHsgPz4NCiAgICAgICAgICAgICAgICA8P3BocCBlY2hvICR0ZXh0X2xvZ2luOyA/Pg0KICAgICAgICAgICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgICAgICAgPC9mb3JtPg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgICA8P3BocCAkaW5kZXggPSAwOyBmb3JlYWNoICgkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ2FkZGl0aW9uYWxfcHJvZHVjdF90YWJzJywgYXJyYXkoKSkgYXMgJHRhYik6ICRpbmRleCsrOyA/Pg0KICAgICAgICAgICAgICA8ZGl2IGlkPSJhZGRpdGlvbmFsLXByb2R1Y3QtdGFiLTw/cGhwIGVjaG8gJGluZGV4OyA/PiIgY2xhc3M9InRhYi1wYW5lIHRhYi1jb250ZW50IGpvdXJuYWwtY3VzdG9tLXRhYiA8P3BocCBpZiAoJGlzX2FjdGl2ZSkgeyBlY2hvICdhY3RpdmUnOyAkaXNfYWN0aXZlID0gZmFsc2U7IH0gOz8+Ij48P3BocCBlY2hvICR0YWJbJ2NvbnRlbnQnXTsgPz48L2Rpdj4NCiAgICAgICAgICAgIDw/cGhwIGVuZGZvcmVhY2g7ID8+DQogICAgICAgICAgPC9kaXY+DQogICAgICAgICAgPC9kaXY+DQogICAgICAgIDwvZGl2Pg0KICAgICAgICA8P3BocCBpZiAoJGNvbHVtbl9sZWZ0ICYmICRjb2x1bW5fcmlnaHQpIHsgPz4NCiAgICAgICAgPD9waHAgJGNsYXNzID0gJ2NvbC1zbS02JzsgPz4NCiAgICAgICAgPD9waHAgfSBlbHNlaWYgKCRjb2x1bW5fbGVmdCB8fCAkY29sdW1uX3JpZ2h0KSB7ID8+DQogICAgICAgIDw/cGhwICRjbGFzcyA9ICdjb2wtc20tNic7ID8+DQogICAgICAgIDw/cGhwIH0gZWxzZSB7ID8+DQogICAgICAgIDw/cGhwICRjbGFzcyA9ICdjb2wtc20tNCc7ID8+DQogICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgPGRpdiBjbGFzcz0icmlnaHQiPg0KICAgICAgICAgIDw/cGhwIGlmICgkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ3Byb2R1Y3RfcGFnZV90aXRsZV9wb3NpdGlvbicsICd0b3AnKSA9PT0gJ3JpZ2h0Jyk6ID8+DQogICAgICAgICAgPGgxIGNsYXNzPSJoZWFkaW5nLXRpdGxlIj48P3BocCBlY2hvICRoZWFkaW5nX3RpdGxlOyA/PjwvaDE+DQogICAgICAgICAgPD9waHAgZW5kaWY7ID8+DQogICAgICAgICAgPGRpdiBpZD0icHJvZHVjdCIgY2xhc3M9InByb2R1Y3Qtb3B0aW9ucyI+DQogICAgICAgICAgICA8P3BocCBmb3JlYWNoICgkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ2FkZGl0aW9uYWxfcHJvZHVjdF9kZXNjcmlwdGlvbl90b3AnLCBhcnJheSgpKSBhcyAkdGFiKTogPz4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImpvdXJuYWwtY3VzdG9tLXRhYiI+DQogICAgICAgICAgICAgIDw/cGhwIGlmICgkdGFiWydoYXNfaWNvbiddKTogPz4NCiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmxvY2staWNvbiBibG9jay1pY29uLWxlZnQiIHN0eWxlPSI8P3BocCBlY2hvICR0YWJbJ2ljb25fY3NzJ107ID8+Ij48P3BocCBlY2hvICR0YWJbJ2ljb24nXTsgPz48L2Rpdj4NCiAgICAgICAgICAgICAgPD9waHAgZW5kaWY7ID8+DQogICAgICAgICAgICAgIDw/cGhwIGlmICgkdGFiWyduYW1lJ10pOiA/Pg0KICAgICAgICAgICAgICA8aDM+PD9waHAgZWNobyAkdGFiWyduYW1lJ107ID8+PC9oMz4NCiAgICAgICAgICAgICAgPD9waHAgZW5kaWY7ID8+DQogICAgICAgICAgICAgIDw/cGhwIGVjaG8gJHRhYlsnY29udGVudCddOyA/Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8P3BocCBlbmRmb3JlYWNoOyA/Pg0KICAgICAgICAgIDx1bCBjbGFzcz0ibGlzdC11bnN0eWxlZCBkZXNjcmlwdGlvbiI+DQogICAgICAgICAgICA8P3BocCBpZigkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ3Byb2R1Y3Rfdmlld3MnKSk6ID8+DQogICAgICAgICAgICA8bGkgY2xhc3M9InByb2R1Y3Qtdmlld3MtY291bnQiPjxpbWcgc3R5bGU9Im1hcmdpbi10b3A6LTE0cHg7InNyYz0iaHR0cHM6Ly93d3cuc2FyYXlwZXJkZWhvbWUuY29tL2ltYWdlL2dyYWZpa2xlci91Y3JldHNpei1rYXJnby1hbmltZS5naWYiPjwvbGk+DQogICAgICAgICAgICA8P3BocCBlbmRpZjsgPz4NCiAgICAgICAgICAgIDw/cGhwIGlmKCR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgnbWFudWZhY3R1cmVyX2ltYWdlJykgPT0gJ29uJyk6ID8+DQogICAgICAgICAgICA8bGkgY2xhc3M9ImJyYW5kLWxvZ28iPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Ijw/cGhwIGVjaG8gJG1hbnVmYWN0dXJlcnM7ID8+IiBjbGFzcz0iYnJhbmQtaW1hZ2UiPg0KICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iPD9waHAgZWNobyAkbWFudWZhY3R1cmVyX2ltYWdlOyA/PiIgd2lkdGg9Ijw/cGhwIGVjaG8gJG1hbnVmYWN0dXJlcl9pbWFnZV93aWR0aDsgPz4iIGhlaWdodD0iPD9waHAgZWNobyAkbWFudWZhY3R1cmVyX2ltYWdlX2hlaWdodDsgPz4iIGFsdD0iPD9waHAgZWNobyAkbWFudWZhY3R1cmVyOyA/PiIgLz4NCiAgICAgICAgICAgICAgICA8L2E+DQogICAgICAgICAgICAgICAgPD9waHAgaWYoaXNzZXQoJG1hbnVmYWN0dXJlcl9pbWFnZV9uYW1lKSAmJiAkbWFudWZhY3R1cmVyX2ltYWdlX25hbWUpOiA/Pg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Ijw/cGhwIGVjaG8gJG1hbnVmYWN0dXJlcnM7ID8+IiBjbGFzcz0iYnJhbmQtbG9nby10ZXh0Ij4NCiAgICAgICAgICAgICAgICAgICAgPD9waHAgZWNobyAkbWFudWZhY3R1cmVyX2ltYWdlX25hbWU7ID8+DQogICAgICAgICAgICAgICAgPC9hPg0KICAgICAgICAgICAgICAgIDw/cGhwIGVuZGlmOyA/Pg0KICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgIDw/cGhwIGVsc2U6ID8+DQogICAgICAgICAgICA8P3BocCBpZiAoJG1hbnVmYWN0dXJlcikgeyA/Pg0KICAgICAgICAgICAgPGxpIGNsYXNzPSJwLWJyYW5kIj48P3BocCBlY2hvICR0ZXh0X21hbnVmYWN0dXJlcjsgPz4gPGEgaHJlZj0iPD9waHAgZWNobyAkbWFudWZhY3R1cmVyczsgPz4iPjw/cGhwIGVjaG8gJG1hbnVmYWN0dXJlcjsgPz48L2E+PC9saT4NCiAgICAgICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgICAgIDw/cGhwIGVuZGlmOyA/Pg0KCQkJDQoJCQkNCgkJCQ0KCQkJDQoJCQkNCgkJCQ0KICAgICAgICAgICAgPGxpIGNsYXNzPSJwLW1vZGVsIj48P3BocCBlY2hvICR0ZXh0X21vZGVsOyA/PiA8c3BhbiBjbGFzcz0icC1tb2RlbCI+PD9waHAgZWNobyAkbW9kZWw7ID8+PC9zcGFuPjwvbGk+DQogICAgICAgICAgICANCg0KCQkJDQoJCQkNCgkJCTw/cGhwIGlmICgkcmV3YXJkKSB7ID8+DQogICAgICAgICAgICA8bGkgY2xhc3M9InAtcmV3YXJkcyI+PD9waHAgZWNobyAkdGV4dF9yZXdhcmQ7ID8+IDxzcGFuIGNsYXNzPSJwLXJld2FyZHMiPjw/cGhwIGVjaG8gJHJld2FyZDsgPz48L3NwYW4+PC9saT4NCiAgICAgICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgICAgIDxsaSBjbGFzcz0icC1zdG9jayI+PD9waHAgZWNobyAkdGV4dF9zdG9jazsgPz4gPHNwYW4gY2xhc3M9ImpvdXJuYWwtc3RvY2sgPD9waHAgZWNobyBpc3NldCgkc3RvY2tfc3RhdHVzKSA/ICRzdG9ja19zdGF0dXMgOiAnJzsgPz4iPjw/cGhwIGVjaG8gJHN0b2NrOyA/Pjwvc3Bhbj48L2xpPg0KICAgICAgICAgIDwvdWw+DQogICAgICAgICAgPD9waHAgaWYoJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdwcm9kdWN0X3NvbGQnKSk6ID8+DQogICAgICAgICAgPGRpdiBjbGFzcz0icHJvZHVjdC1zb2xkLWNvdW50LXRleHQiPjw/cGhwIGVjaG8gJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdwcm9kdWN0X3NvbGQnKTsgPz48L2Rpdj4NCiAgICAgICAgICA8P3BocCBlbmRpZjsgPz4NCiAgICAgICAgICA8P3BocCBpZiAoaXNzZXQoJGRhdGVfZW5kKSAmJiAkZGF0ZV9lbmQgJiYgJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdzaG93X2NvdW50ZG93bl9wcm9kdWN0X3BhZ2UnLCAnb24nKSA9PSAnb24nKTogPz4NCiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb3VudGRvd24td3JhcHBlciI+PGRpdiBjbGFzcz0iZXhwaXJlLXRleHQiPjw/cGhwIGVjaG8gJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdjb3VudGRvd25fcHJvZHVjdF9wYWdlX3RpdGxlJyk7ID8+PC9kaXY+PGRpdiBjbGFzcz0iY291bnRkb3duIj48L2Rpdj48L2Rpdj4NCiAgICAgICAgICA8c2NyaXB0PkpvdXJuYWwuY291bnRkb3duKCQoJy5yaWdodCAuY291bnRkb3duJyksICc8P3BocCBlY2hvICRkYXRlX2VuZDsgPz4nKTs8L3NjcmlwdD4NCiAgICAgICAgICA8P3BocCBlbmRpZjsgPz4NCiAgICAgICAgICA8P3BocCBpZiAoJHByaWNlKSB7ID8+DQogICAgDQoJDQoJCQkJDQoJCQkJCQkJICAJCQkJPGRpdiBzdHlsZT0ibWFyZ2luLXRvcDo1cHg7IG1hcmdpbi1ib3R0b206MHB4OyIgY2xhc3M9InBlcmRlLW9sY3UiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICA8dWw+DQogICAgICAgICAgICAgICAgICA8P3BocCBpZiAoJHVydW5fdGlwID09ICJzdG9yIiB8fCAkdXJ1bl90aXAgPT0gImphbHV6aSIpIHsgPz4NCiAgICAgICAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iZm9udC1zaXplOjE0cHg7IG1hcmdpbi1ib3R0b206NnB4OyI+PGI+KiA8P3BocCBlY2hvICRlbnRyeV9lbmdpcmluaXo7ID8+PC9iPjwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgDQoJCQkJCTxzZWxlY3QgbmFtZT0ib3B0aW9uW2VuXSIgaWQ9InNlbiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjAiPi0tIDw/cGhwIGVjaG8gJGVudHJ5X3BlcmRlbmluZW5pcGxhY2U7ID8+IC0tPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGZvciAoJGk9MzA7JGk8PSRlbjskaSsrKSB7ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ijw/cGhwIGVjaG8gJGk7ID8+Ij48P3BocCBlY2hvICRpOyA/PiBjbTwvb3B0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+DQogICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgPC9saT4NCgkJCQkgDQoJCQkJIA0KDQoJCQkJPGxpIHN0eWxlPSJmbG9hdDpyaWdodDsiPg0KCQkJCSA8ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDoxMHB4OyI+DQogICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJmb250LXNpemU6MTRweDsgbWFyZ2luLWJvdHRvbTo2cHg7Ij48Yj4qIDw/cGhwIGVjaG8gJGVudHJ5X2JveWdpcmluaXo7ID8+PC9iPjwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgDQoJCQkJCSAgIDxzZWxlY3QgbmFtZT0ib3B0aW9uW2JveV0iIGlkPSJzYm95Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMCI+LS0gPD9waHAgZWNobyAkZW50cnlfcGVyZGVuaW5ib3l1cGxhY2U7ID8+IC0tPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGZvciAoJGk9MzA7JGk8PSRib3k7JGkrKykgeyA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8P3BocCBlY2hvICRpOyA/PiI+PD9waHAgZWNobyAkaTsgPz4gY208L29wdGlvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgfSA/Pg0KICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0Pg0KICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgPC9saT4NCg0KDQoNCg0KDQogICAgICAgICAgICAgIDw/cGhwIH1lbHNlIGlmICgkdXJ1bl90aXAgPT0gInBlcmRlIikgeyA/Pg0KICAgICAgICAgICAgICAgICA8bGk+DQogICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJmb250LXNpemU6MTRweDsgbWFyZ2luLWJvdHRvbTo2cHg7Ij48Yj4qIDw/cGhwIGVjaG8gJGVudHJ5X2VuZ2lyaW5pejsgPz48L2I+PC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICAgIA0KCQkJCQk8c2VsZWN0IG5hbWU9Im9wdGlvbltlbl0iIGlkPSJwZW4iPg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIwIj4tLSA8P3BocCBlY2hvICRlbnRyeV9wZXJkZW5pbmVuaXN0YW5kYXJ0cGxhY2U7ID8+IC0tPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGZvciAoJGk9MzA7JGk8PSRlbjskaSsrKSB7ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ijw/cGhwIGVjaG8gJGk7ID8+Ij48P3BocCBlY2hvICRpOyA/PiBjbTwvb3B0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+DQoJCQkJCSAgDQogICAgICAgICAgICAgICAgICA8L2xpPg0KDQoNCiAgICAgICAgICAgICAgICAgICA8bGk+DQoJCQkJIDxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OjEwcHg7Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxNHB4OyBtYXJnaW4tYm90dG9tOjZweDsiPjxiPiogPD9waHAgZWNobyAkZW50cnlfYm95Z2lyaW5pejsgPz48L2I+PC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICANCgkJCQkJCQ0KCQkJCQkJPHNlbGVjdCBuYW1lPSJvcHRpb25bYm95XSIgaWQ9InBib3kiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIwIj4tLSA8P3BocCBlY2hvICRlbnRyeV9wZXJkZW5pbmJveXVzdGFuZGFydHBsYWNlOyA/PiAtLTwvb3B0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBmb3IgKCRpPTE4MDskaTw9JGJveTskaSsrKSB7ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ijw/cGhwIGVjaG8gJGk7ID8+Ij48P3BocCBlY2hvICRpOyA/PiBjbTwvb3B0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+DQoJCQkJCQkNCiAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICA8L2xpPg0KICAgICAgICAgICAgICAgICAgPGxpIHN0eWxlPSJ3aWR0aDo5OCU7IG1hcmdpbi10b3A6MTVweDsgbWFyZ2luLWJvdHRvbTowcHg7Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxNHB4OyBtYXJnaW4tYm90dG9tOjZweDsiPjxiPjw/cGhwIGVjaG8gJGVudHJ5X3BpbGU7ID8+PC9iPjwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IG5hbWU9Im9wdGlvbltwaWxlXSIgaWQ9InBwaWxlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMi41Ij48P3BocCBlY2hvICRlbnRyeV9waWxlc2V5cmVrOyA/Pjwvb3B0aW9uPg0KCQkJCQkJICA8b3B0aW9uIHZhbHVlPSIyLjc1Ij48P3BocCBlY2hvICRlbnRyeV9waWxlb3J0YTsgPz48L29wdGlvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMyI+PD9waHAgZWNobyAkZW50cnlfcGlsZXNpazsgPz48L29wdGlvbj4NCg0KICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0Pg0KICAgICAgICAgICAgICAgICAgPC9saT4NCg0KICAgICAgICAgICAgICAgICAgPD9waHAgfWVsc2UgaWYgKCR1cnVuX3RpcCA9PSAicnVzdGlrLXRlc3QiKSB7ID8+DQoNCiAgICAgICAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxNHB4OyBtYXJnaW4tYm90dG9tOjZweDsiPjw/cGhwIGVjaG8gJGVudHJ5X2ViYXRnaXI7ID8+PC9iPjwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IG5hbWU9Im9wdGlvbltydXN0aWtdIiBpZD0icGViYXQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIwIj4tLSBzZcOnaW5peiAtLTwvb3B0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMDAiPjEwMCBjbTwvb3B0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxNTAiPjE1MCBjbTwvb3B0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMDAiPjIwMCBjbTwvb3B0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIyNTAiPjI1MCBjbTwvb3B0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIzMDAiPjMwMCBjbTwvb3B0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0Pg0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgIDwvbGk+DQoNCiAgICAgICAgICAgICAgICAgIDw/cGhwIH1lbHNlIGlmICgkdXJ1bl90aXAgPT0gInZhcmFrLXRlc3QiKSB7ID8+DQoNCiAgICAgICAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxNHB4OyBtYXJnaW4tYm90dG9tOjZweDsiPjw/cGhwIGVjaG8gJGVudHJ5X2ViYXRnaXI7ID8+PC9iPjwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICANCgkJCQkJCQk8c2VsZWN0IG5hbWU9Im9wdGlvblt2YXJha10iIGlkPSJwZWJhdCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjAiPi0tIHNlw6dpbml6IC0tPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjU1Ij41NSBjbSdlIGthZGFyPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjEwNSI+MTA1IGNtJ2Uga2FkYXI8L29wdGlvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTU1Ij4xNTUgY20nZSBrYWRhcjwvb3B0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMDUiPjIwNSBjbSdlIGthZGFyPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjI4MCI+MjgwIGNtJ2Uga2FkYXI8L29wdGlvbj4NCiAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4gICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgIDwvbGk+DQoNCiAgICAgICAgICAgICAgICAgIDw/cGhwIH0gPz4NCg0KDQogICAgICAgICAgICAgIDwvdWw+DQogICAgICAgICAgPC9kaXY+DQoJDQoJDQoJCSAgPHVsICBjbGFzcz0ibGlzdC11bnN0eWxlZCBwcmljZSI+DQogICAgICAgICAgICA8bWV0YSA9Iml0ZW1Db25kaXRpb24iIC8+DQogICAgICAgICAgICA8bWV0YSA9InByaWNlQ3VycmVuY3kiIGNvbnRlbnQ9Ijw/cGhwIGVjaG8gJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdwcm9kdWN0X3ByaWNlX2N1cnJlbmN5Jyk7ID8+IiAvPg0KICAgICAgICAgICAgPG1ldGEgPSJwcmljZSIgY29udGVudD0iPD9waHAgZWNobyAkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ3Byb2R1Y3RfcHJpY2UnKTsgPz4iIC8+DQogICAgICAgICAgICA8P3BocCBpZiAoJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdwcm9kdWN0X2luX3N0b2NrJykgPT09ICd5ZXMnKTogPz4NCiAgICAgICAgICAgIDxsaW5rID0iYXZhaWxhYmlsaXR5IiAgaHJlZj0iaHR0cDovL3NjaGVtYS5vcmcvSW5TdG9jayIgLz4NCiAgICAgICAgICAgIDw/cGhwIGVuZGlmOyA/Pg0KICAgICAgICAgICAgPD9waHAgaWYgKCEkc3BlY2lhbCkgeyA/Pg0KICAgICAgICAgICAgPGxpIGNsYXNzPSJwcm9kdWN0LXByaWNlIj48P3BocCBlY2hvICRwcmljZTsgPz48L2xpPg0KICAgICAgICAgICAgPD9waHAgfSBlbHNlIHsgPz4NCiAgICAgICAgICAgIDxsaSBjbGFzcz0icHJpY2Utb2xkIj48P3BocCBlY2hvICRwcmljZTsgPz48L2xpPg0KICAgICAgICAgICAgPGxpIGNsYXNzPSJwcmljZS1uZXciPjw/cGhwIGVjaG8gJHNwZWNpYWw7ID8+PC9saT4NCiAgICAgICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgICAgIDw/cGhwIGlmICgkdGF4KSB7ID8+DQogICAgICAgICAgICA8bGkgY2xhc3M9InByaWNlLXRheCI+PD9waHAgZWNobyAkdGV4dF90YXg7ID8+IDw/cGhwIGVjaG8gJHRheDsgPz48L2xpPg0KICAgICAgICAgICAgPD9waHAgfSA/Pg0KICAgICAgICAgICAgPD9waHAgaWYgKCRwb2ludHMpIHsgPz4NCiAgICAgICAgICAgIDxsaSBjbGFzcz0icmV3YXJkIj48c21hbGw+PD9waHAgZWNobyAkdGV4dF9wb2ludHM7ID8+IDw/cGhwIGVjaG8gJHBvaW50czsgPz48L3NtYWxsPjwvbGk+DQogICAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgICA8P3BocCBpZiAoJGRpc2NvdW50cykgeyA/Pg0KICAgICAgICAgICAgPD9waHAgZm9yZWFjaCAoJGRpc2NvdW50cyBhcyAkZGlzY291bnQpIHsgPz4NCiAgICAgICAgICAgIDxsaSBjbGFzcz0iZGlzY291bnRzIj48P3BocCBlY2hvICRkaXNjb3VudFsncXVhbnRpdHknXTsgPz48P3BocCBlY2hvICR0ZXh0X2Rpc2NvdW50OyA/Pjw/cGhwIGVjaG8gJGRpc2NvdW50WydwcmljZSddOyA/PjwvbGk+DQogICAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgPC91bD4NCiAgICAgICAgICA8P3BocCB9ID8+DQoJCQkJICANCgkJCQkgIAkJICAJCSAgIDw/cGhwIGlmICgkY2F0ZWdvcmllcykgeyA/Pg0KCQkJCTw/cGhwIGZvcmVhY2ggKCRjYXRlZ29yaWVzIGFzICRjYXRlZ29yeSkgeyA/Pg0KCQkJCTwhLS0gU3RvciBwZXJkZSAtLT4NCgkJCQkJPD9waHAgaWYgKCRjYXRlZ29yeVsnY2F0ZWdvcnlfaWQnXSA9PSAnNTknKSB7ID8+IA0KCQkJCQkJPGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbTotMTVweDsiPg0KCTxkaXYgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmM2YzZjM7DQoJYm9yZGVyOiAxcHggc29saWQgI2RjZGNkYzsNCglwYWRkaW5nOiAxMHB4Ow0KCW1hcmdpbi1ib3R0b206IDE1cHg7DQoJLW1vei1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KTsNCgktd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpOw0KCWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNzUpOw0KCWNvbG9yOiAjNTU1NTU1OyI+R2lybWnFnyBvbGR1xJ91bnV6IGVuIMO2bMOnw7xzw7wgbWVrYW5pem1hIGRhaGlsIMO2bMOnw7xkw7xyLiBLdW1hxZ8gNCBjbSBla3NpayBrZXNpbG1la3RlZGlyLiDDlmzDp8O8ecO8IGJ1bmEgZ8O2cmUgZ2lyaW5pei4gKMOWbMOnw7xsZXJpbml6aSBzZcOndGlrdGVuIHNvbnJhIHR1dGFyIG90b21hdGlrIG9sYXJhayBoZXNhcGxhbmFjYWt0xLFyLik8L2Rpdj48L2Rpdj4NCgkJCQkJPD9waHAgfSA/Pg0KCQkJCQk8IS0tIFplYnJhIHBlcmRlIC0tPg0KCQkJCQk8P3BocCBpZiAoJGNhdGVnb3J5WydjYXRlZ29yeV9pZCddID09ICc2NicpIHsgPz4NCgkJCQkJCTxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206LTE1cHg7Ij4NCgk8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmM2YzOw0KCWJvcmRlcjogMXB4IHNvbGlkICNkY2RjZGM7DQoJcGFkZGluZzogMTBweDsNCgltYXJnaW4tYm90dG9tOiAxNXB4Ow0KCS1tb3otYm94LXNoYWRvdzogaW5zZXQgMCAxcHggMXB4IHJnYmEoMCwwLDAsLjA3NSk7DQoJLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KTsNCglib3gtc2hhZG93OiBpbnNldCAwIDFweCAxcHggcmdiYSgwLDAsMCwuMDc1KTsNCgljb2xvcjogIzU1NTU1NTsiPkdpcm1pxZ8gb2xkdcSfdW51eiBlbiDDtmzDp8O8c8O8IG1la2FuaXptYSBkYWhpbCDDtmzDp8O8ZMO8ci4gS3VtYcWfIDQgY20gZWtzaWsga2VzaWxtZWt0ZWRpci4gw5Zsw6fDvHnDvCBidW5hIGfDtnJlIGdpcmluaXouICjDlmzDp8O8bGVyaW5pemkgc2XDp3Rpa3RlbiBzb25yYSB0dXRhciBvdG9tYXRpayBvbGFyYWsgaGVzYXBsYW5hY2FrdMSxci4pPC9kaXY+PC9kaXY+DQoJCQkJCTw/cGhwIH0gPz4NCgkJCQkJDQoJCQkJCQ0KCQkJCTw/cGhwIH0gPz4NCgkJCTw/cGhwIH0gPz4NCgkJCQkgIA0KDQogICAgICAgICAgPCEtLTxzdHlsZT4NCiAgICAgICAgICAjc2VjZWtsZXJMaXN0ZXNzIGxpew0KCQkJICBsaXN0LXN0eWxlOm5vbmU7DQoJCQkgIGxpc3Qtc3R5bGUtdHlwZTpub25lOw0KCQkJICBkaXNwbGF5OmJsb2NrOw0KCQkJICBmbG9hdDpsZWZ0Ow0KCQkJICBtYXJnaW4tbGVmdDoxMHB4Ow0KCQkgIH0NCgkJICAjc2VjZWtsZXJMaXN0ZXNzIGxpew0KCQkJICB3aWR0aDo0MCU7DQoJCQkgIA0KCQkJIA0KCQkJICANCgkJICB9DQogICAgICAgICAgDQogICAgICAgICAgPC9zdHlsZT4gLS0+DQoNCg0KICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InRvcGxhbS1oZXNhcCIgaWQ9InRvcGxhbS1oZXNhcCIgdmFsdWU9IiIvPg0KICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJmaXlhdHR0IiB2YWx1ZT0iPD9waHAgZWNobyAkZml5YXQ7ID8+Ii8+DQogICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9ImthbXBhbnlhYWEiIHZhbHVlPSI8P3BocCBlY2hvICRrYW1wYW55YSA/PiIvPg0KICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iZml5YXR0dDIiIHZhbHVlPSI8P3BocCBlY2hvICRmaXlhdDI7ID8+Ii8+DQogICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9ImthbXBhbnlhYWEyIiB2YWx1ZT0iPD9waHAgZWNobyAka2FtcGFueWEyID8+Ii8+DQoNCiAgICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQoJCSAgDQoJCSAgZnVuY3Rpb24gaGVzYXBsYTEyMygpew0KCQkJICANCgkJCSAgJCgnI3NlbicpLnRyaWdnZXIoImNoYW5nZSIpOw0KCQkgIH0NCiAgICAgICAgICAgICAgDQoJCQkvLyAgcXVhbnRpdHkgPSBwYXJzZUludCgkKCIjaW5wdXQtcXVhbnRpdHkiKS52YWwoKTsNCg0KICAgICAgICAgICAgICAkKCcjc2VuJykuY2hhbmdlKGZ1bmN0aW9uICgpew0KICAgICAgICAgICAgICAgICAgdmFyIGVuID0gJCgnI3NlbicpLnZhbCgpOw0KICAgICAgICAgICAgICAgICAgdmFyIGJveSA9ICQoJyNzYm95JykudmFsKCk7DQoJCQkJIAlpZiAoYm95PD0yMDApew0KCQkJCQkgIGJveSA9IDIwMDsNCgkJCQkJfWVsc2V7DQoJCQkJCQl2YXIgYnNheSA9IGJveS5zdWJzdHIoMSwgMik7DQoJCQkJCQl2YXIgYnNvbiA9IGJveS5zdWJzdHIoMiwyKTsNCgkJCQkJCWlmIChic29uIT0wKSB7DQoJCQkJCQkJYnNvbiA9IDEwIC0gYnNvbjsNCgkJCQkJCQlib3kgPSBwYXJzZUludChib3kpICsgcGFyc2VJbnQoYnNvbik7DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJaWYgKGVuPD0xMDApew0KCQkJCQkgIGVuID0gMTAwOw0KCQkJCQl9ZWxzZXsNCgkJCQkJCXZhciBlc2F5ID0gZW4uc3Vic3RyKDEsIDIpOw0KCQkJCQkJdmFyIGVzb24gPSBlbi5zdWJzdHIoMiwyKTsNCgkJCQkJCWlmIChlc29uIT0wKSB7DQoJCQkJCQkJZXNvbiA9IDEwIC0gZXNvbjsNCgkJCQkJCQllbiA9IHBhcnNlSW50KGVuKSArIHBhcnNlSW50KGVzb24pOw0KCQkJCQkJfQ0KCQkJCQl9DQoNCiAgICAgICAgICAgICAgICAgIGlmIChib3kgPiAwKXsNCiAgICAgICAgICAgICAgICAgICAgICB2YXIgYWRldCA9IHBhcnNlSW50KCQoIiNpbnB1dC1xdWFudGl0eSIpLnZhbCgpKTsNCiAgICAgICAgICAgICAgICAgICAgICBtZXRyZT0gKGVuKmJveSphZGV0KS8xMDAwMDsgDQoJCQkJCSAgbWV0cmU9bWV0cmUudG9GaXhlZCgyKTsNCiAgICAgICAgICAgICAgICAgICAgICAkKCcjcGVyZGUtaGVzYXAnKS5odG1sKCIiKTsNCiAgICAgICAgICAgICAgICAgIDw/cGhwIGlmICghJHNwZWNpYWwpIHsgPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgc29udWM9IG1ldHJlKiQoIiNmaXlhdHR0IikudmFsKCk7CQkJCQkJICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgc29udWM9c29udWMudG9GaXhlZCgyKTsNCgkJCQkJCSAgc29udWMyPSBtZXRyZSokKCIjZml5YXR0dDIiKS52YWwoKTsJCQkJCQkgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzb251YzI9c29udWMyLnRvRml4ZWQoMik7DQogICAgICAgICAgICAgICAgICAgICAgPD9waHAgfSBlbHNlIHsgPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgc29udWM9IG1ldHJlKiQoIiNrYW1wYW55YWFhIikudmFsKCk7CQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBzb251Yz1zb251Yy50b0ZpeGVkKDIpOw0KCQkJCQkJICBzb251YzI9IG1ldHJlKiQoIiNrYW1wYW55YWFhMiIpLnZhbCgpOwkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgc29udWMyPXNvbnVjMi50b0ZpeGVkKDIpOw0KICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgIHRvcGxhbV9oZXNhcD0oc29udWMvYWRldCkudG9GaXhlZCgyKTsNCiAgICAgICAgICAgICAgICAgICAgICAkKCcjdG9wbGFtLWhlc2FwJykudmFsKHRvcGxhbV9oZXNhcCk7DQoJCQkJCSAgaWYgKCQoJyNzYm95JykudmFsKCk+MCl7DQoJCQkJCQkJJCgnI3BlcmRlLWhlc2FwJykuYWRkQ2xhc3MoJ3BlcmRlLWhlc2FwJyk7DQoJCQkJCQkJJCgnI3BlcmRlLWhlc2FwJykuYXBwZW5kKCc8P3BocCBlY2hvICRlbnRyeV9lYmF0c29udWM7ID8+IDxzcGFuIGlkPSJtZXRyZSI+JyArIG1ldHJlICsgJzwvc3Bhbj4gbTxzdXA+Mjwvc3VwPiwgPD9waHAgZWNobyAkZW50cnlfc29udWN0dXRhcjsgPz4gPHNwYW4gaWQ9ImZpeWF0Ij4nICsgc29udWMyICsgJzwvc3Bhbj4gPD9waHAgZWNobyAkdGhpcy0+Y3VycmVuY3ktPmdldENvZGUoKTsgPz4gKyA8P3BocCBlY2hvICRlbnRyeV9hcnRpdmVyZ2k7ID8+Jyk7DQoJCQkJCSAgfQ0KICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICAgICQoJyNzYm95JykuY2hhbmdlKGZ1bmN0aW9uICgpew0KICAgICAgICAgICAgICAgICAgdmFyIGVuID0gJCgnI3NlbicpLnZhbCgpOw0KICAgICAgICAgICAgICAgICAgdmFyIGJveSA9ICQoJyNzYm95JykudmFsKCk7DQoJCQkJIAlpZiAoYm95PD0yMDApew0KCQkJCQkgIGJveSA9IDIwMDsNCgkJCQkJfWVsc2V7DQoJCQkJCQl2YXIgYnNheSA9IGJveS5zdWJzdHIoMSwgMik7DQoJCQkJCQl2YXIgYnNvbiA9IGJveS5zdWJzdHIoMiwyKTsNCgkJCQkJCWlmIChic29uIT0wKSB7DQoJCQkJCQkJYnNvbiA9IDEwIC0gYnNvbjsNCgkJCQkJCQlib3kgPSBwYXJzZUludChib3kpICsgcGFyc2VJbnQoYnNvbik7DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJaWYgKGVuPD0xMDApew0KCQkJCQkgIGVuID0gMTAwOw0KCQkJCQl9ZWxzZXsNCgkJCQkJCXZhciBlc2F5ID0gZW4uc3Vic3RyKDEsIDIpOw0KCQkJCQkJdmFyIGVzb24gPSBlbi5zdWJzdHIoMiwyKTsNCgkJCQkJCWlmIChlc29uIT0wKSB7DQoJCQkJCQkJZXNvbiA9IDEwIC0gZXNvbjsNCgkJCQkJCQllbiA9IHBhcnNlSW50KGVuKSArIHBhcnNlSW50KGVzb24pOw0KCQkJCQkJfQ0KCQkJCQl9CQkJCSAgDQoJCQkJCSAgaWYgKGVuID4gMCl7DQogICAgICAgICAgICAgICAgICAgICAgdmFyIGFkZXQgPSBwYXJzZUludCgkKCIjaW5wdXQtcXVhbnRpdHkiKS52YWwoKSk7DQogICAgICAgICAgICAgICAgICAgICAgbWV0cmU9IChlbipib3kqYWRldCkvMTAwMDA7IG1ldHJlPW1ldHJlLnRvRml4ZWQoMik7DQogICAgICAgICAgICAgICAgICAgICAgJCgnI3BlcmRlLWhlc2FwJykuaHRtbCgiIik7DQogICAgICAgICAgICAgICAgICA8P3BocCBpZiAoISRzcGVjaWFsKSB7ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgIHNvbnVjPSBtZXRyZSokKCIjZml5YXR0dCIpLnZhbCgpOwkJCQkJCSAgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHNvbnVjPXNvbnVjLnRvRml4ZWQoMik7DQoJCQkJCQkgIHNvbnVjMj0gbWV0cmUqJCgiI2ZpeWF0dHQyIikudmFsKCk7CQkJCQkJICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgc29udWMyPXNvbnVjMi50b0ZpeGVkKDIpOw0KICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gZWxzZSB7ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgIHNvbnVjPSBtZXRyZSokKCIja2FtcGFueWFhYSIpLnZhbCgpOwkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgc29udWM9c29udWMudG9GaXhlZCgyKTsNCgkJCQkJCSAgc29udWMyPSBtZXRyZSokKCIja2FtcGFueWFhYTIiKS52YWwoKTsJDQogICAgICAgICAgICAgICAgICAgICAgICAgIHNvbnVjMj1zb251YzIudG9GaXhlZCgyKTsNCiAgICAgICAgICAgICAgICAgICAgICA8P3BocCB9ID8+DQoJCQkJCSAgDQogICAgICAgICAgICAgICAgICAgICAgdG9wbGFtX2hlc2FwPShzb251Yy9hZGV0KS50b0ZpeGVkKDIpOw0KICAgICAgICAgICAgICAgICAgICAgICQoJyN0b3BsYW0taGVzYXAnKS52YWwodG9wbGFtX2hlc2FwKTsNCiAgICAgICAgICAgICAgICAgICAgICANCgkJCQkJICBpZiAoJCgnI3NlbicpLnZhbCgpPjApew0KCQkJCQkJCSQoJyNwZXJkZS1oZXNhcCcpLmFkZENsYXNzKCdwZXJkZS1oZXNhcCcpOw0KCQkJCQkJCSQoJyNwZXJkZS1oZXNhcCcpLmFwcGVuZCgnPD9waHAgZWNobyAkZW50cnlfZWJhdHNvbnVjOyA/PiA8c3BhbiBpZD0ibWV0cmUiPicgKyBtZXRyZSArICc8L3NwYW4+IG08c3VwPjI8L3N1cD4sIDw/cGhwIGVjaG8gJGVudHJ5X3NvbnVjdHV0YXI7ID8+IDxzcGFuIGlkPSJmaXlhdCI+JyArIHNvbnVjMiArICc8L3NwYW4+IDw/cGhwIGVjaG8gJHRoaXMtPmN1cnJlbmN5LT5nZXRDb2RlKCk7ID8+ICsgPD9waHAgZWNobyAkZW50cnlfYXJ0aXZlcmdpOyA/PicpOw0KCQkJCQkgIH0NCiAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICB9KTsNCg0KDQogICAgICAgICAgICAgICQoJyNwZW4nKS5jaGFuZ2UoZnVuY3Rpb24gKCl7DQogICAgICAgICAgICAgICAgICB2YXIgZW4gPSAkKCcjcGVuJykudmFsKCk7DQogICAgICAgICAgICAgICAgICB2YXIgYm95ID0gJCgnI3Bib3knKS52YWwoKTsNCiAgICAgICAgICAgICAgICAgIHZhciBwaWxlID0gJCgnI3BwaWxlJykudmFsKCk7DQogICAgICAgICAgICAgICAgICBpZiAoYm95ID4gMCl7DQogICAgICAgICAgICAgICAgICAgICAgdmFyIGFkZXQgPSBwYXJzZUludCgkKCIjaW5wdXQtcXVhbnRpdHkiKS52YWwoKSk7DQogICAgICAgICAgICAgICAgICAgICAgbWV0cmU9IChlbioxKmFkZXQqcGlsZSkvMTAwOw0KICAgICAgICAgICAgICAgICAgICAgICQoJyNwZXJkZS1oZXNhcCcpLmh0bWwoIiIpOw0KICAgICAgICAgICAgICAgICA8P3BocCBpZiAoISRzcGVjaWFsKSB7ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgIHNvbnVjPSBtZXRyZSokKCIjZml5YXR0dCIpLnZhbCgpOwkJCQkJCSAgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHNvbnVjPXNvbnVjLnRvRml4ZWQoMik7DQoJCQkJCQkgIHNvbnVjMj0gbWV0cmUqJCgiI2ZpeWF0dHQyIikudmFsKCk7CQkJCQkJICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgc29udWMyPXNvbnVjMi50b0ZpeGVkKDIpOw0KICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gZWxzZSB7ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgIHNvbnVjPSBtZXRyZSokKCIja2FtcGFueWFhYSIpLnZhbCgpOwkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgc29udWM9c29udWMudG9GaXhlZCgyKTsNCgkJCQkJCSAgc29udWMyPSBtZXRyZSokKCIja2FtcGFueWFhYTIiKS52YWwoKTsJDQogICAgICAgICAgICAgICAgICAgICAgICAgIHNvbnVjMj1zb251YzIudG9GaXhlZCgyKTsNCiAgICAgICAgICAgICAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgICAgICAgICAgICAgdG9wbGFtX2hlc2FwPShzb251Yy9hZGV0KS50b0ZpeGVkKDIpOw0KICAgICAgICAgICAgICAgICAgICAgICQoJyN0b3BsYW0taGVzYXAnKS52YWwodG9wbGFtX2hlc2FwKTsNCgkJCQkJICBpZigkKCcjcGJveScpLnZhbCgpPjApew0KCQkJCQkJCSQoJyNwZXJkZS1oZXNhcCcpLmFkZENsYXNzKCdwZXJkZS1oZXNhcCcpOw0KCQkJCQkJCSQoJyNwZXJkZS1oZXNhcCcpLmFwcGVuZCgnPD9waHAgZWNobyAkZW50cnlfZWJhdHNvbnVjOyA/PiA8c3BhbiBpZD0ibWV0cmUiPicgKyBtZXRyZSArICc8L3NwYW4+IG10LCA8P3BocCBlY2hvICRlbnRyeV9zb251Y3R1dGFyOyA/PiA8c3BhbiBpZD0iZml5YXQiPicgKyBzb251YzIgKyAnPC9zcGFuPiA8P3BocCBlY2hvICR0aGlzLT5jdXJyZW5jeS0+Z2V0Q29kZSgpOyA/PiArIDw/cGhwIGVjaG8gJGVudHJ5X2FydGl2ZXJnaTsgPz4nKTsNCgkJCQkJICB9DQogICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICQoJyNwYm95JykuY2hhbmdlKGZ1bmN0aW9uICgpew0KICAgICAgICAgICAgICAgICAgdmFyIGVuID0gJCgnI3BlbicpLnZhbCgpOw0KICAgICAgICAgICAgICAgICAgdmFyIGJveSA9ICQoJyNwYm95JykudmFsKCk7DQogICAgICAgICAgICAgICAgICB2YXIgcGlsZSA9ICQoJyNwcGlsZScpLnZhbCgpOw0KICAgICAgICAgICAgICAgICAgaWYgKGVuID4gMCl7DQogICAgICAgICAgICAgICAgICAgICAgdmFyIGFkZXQgPSBwYXJzZUludCgkKCIjaW5wdXQtcXVhbnRpdHkiKS52YWwoKSk7DQogICAgICAgICAgICAgICAgICAgICAgbWV0cmU9IChlbioxKmFkZXQqcGlsZSkvMTAwOw0KICAgICAgICAgICAgICAgICAgICAgICQoJyNwZXJkZS1oZXNhcCcpLmh0bWwoIiIpOw0KICAgICAgICAgICAgICAgIDw/cGhwIGlmICghJHNwZWNpYWwpIHsgPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgc29udWM9IG1ldHJlKiQoIiNmaXlhdHR0IikudmFsKCk7CQkJCQkJICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgc29udWM9c29udWMudG9GaXhlZCgyKTsNCgkJCQkJCSAgc29udWMyPSBtZXRyZSokKCIjZml5YXR0dDIiKS52YWwoKTsJCQkJCQkgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzb251YzI9c29udWMyLnRvRml4ZWQoMik7DQogICAgICAgICAgICAgICAgICAgICAgPD9waHAgfSBlbHNlIHsgPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgc29udWM9IG1ldHJlKiQoIiNrYW1wYW55YWFhIikudmFsKCk7CQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBzb251Yz1zb251Yy50b0ZpeGVkKDIpOw0KCQkJCQkJICBzb251YzI9IG1ldHJlKiQoIiNrYW1wYW55YWFhMiIpLnZhbCgpOwkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgc29udWMyPXNvbnVjMi50b0ZpeGVkKDIpOw0KICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gPz4NCgkJCQkJICANCiAgICAgICAgICAgICAgICAgICAgICAgdG9wbGFtX2hlc2FwPShzb251Yy9hZGV0KS50b0ZpeGVkKDIpOw0KICAgICAgICAgICAgICAgICAgICAgICQoJyN0b3BsYW0taGVzYXAnKS52YWwodG9wbGFtX2hlc2FwKTsNCiAgICAgICAgICAgICAgICAgICAgICANCgkJCQkJICBpZiAoJCgnI3BlbicpLnZhbCgpPjApew0KCQkJCQkJCSQoJyNwZXJkZS1oZXNhcCcpLmFkZENsYXNzKCdwZXJkZS1oZXNhcCcpOw0KCQkJCQkJCSQoJyNwZXJkZS1oZXNhcCcpLmFwcGVuZCgnPD9waHAgZWNobyAkZW50cnlfZWJhdHNvbnVjOyA/PiA8c3BhbiBpZD0ibWV0cmUiPicgKyBtZXRyZSArICc8L3NwYW4+IG10LCA8P3BocCBlY2hvICRlbnRyeV9zb251Y3R1dGFyOyA/PiA8c3BhbiBpZD0iZml5YXQiPicgKyBzb251YzIgKyAnPC9zcGFuPiA8P3BocCBlY2hvICR0aGlzLT5jdXJyZW5jeS0+Z2V0Q29kZSgpOyA/PiArIDw/cGhwIGVjaG8gJGVudHJ5X2FydGl2ZXJnaTsgPz4nKTsNCgkJCQkJICB9DQogICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICQoJyNwcGlsZScpLmNoYW5nZShmdW5jdGlvbiAoKXsNCiAgICAgICAgICAgICAgICAgIHZhciBlbiA9ICQoJyNwZW4nKS52YWwoKTsNCiAgICAgICAgICAgICAgICAgIHZhciBib3kgPSAkKCcjcGJveScpLnZhbCgpOw0KICAgICAgICAgICAgICAgICAgdmFyIHBpbGUgPSAkKCcjcHBpbGUnKS52YWwoKTsNCiAgICAgICAgICAgICAgICAgIGlmIChlbiA+IDApew0KICAgICAgICAgICAgICAgICAgICAgIHZhciBhZGV0ID0gcGFyc2VJbnQoJCgiI2lucHV0LXF1YW50aXR5IikudmFsKCkpOw0KICAgICAgICAgICAgICAgICAgICAgIG1ldHJlPSAoZW4qMSphZGV0KnBpbGUpLzEwMDsNCiAgICAgICAgICAgICAgICAgICAgICAkKCcjcGVyZGUtaGVzYXAnKS5odG1sKCIiKTsNCiAgICAgICAgICAgICAgICAgIDw/cGhwIGlmICghJHNwZWNpYWwpIHsgPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgc29udWM9IG1ldHJlKiQoIiNmaXlhdHR0IikudmFsKCk7CQkJCQkJICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgc29udWM9c29udWMudG9GaXhlZCgyKTsNCgkJCQkJCSAgc29udWMyPSBtZXRyZSokKCIjZml5YXR0dDIiKS52YWwoKTsJCQkJCQkgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzb251YzI9c29udWMyLnRvRml4ZWQoMik7DQogICAgICAgICAgICAgICAgICAgICAgPD9waHAgfSBlbHNlIHsgPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgc29udWM9IG1ldHJlKiQoIiNrYW1wYW55YWFhIikudmFsKCk7CQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBzb251Yz1zb251Yy50b0ZpeGVkKDIpOw0KCQkJCQkJICBzb251YzI9IG1ldHJlKiQoIiNrYW1wYW55YWFhMiIpLnZhbCgpOwkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgc29udWMyPXNvbnVjMi50b0ZpeGVkKDIpOw0KICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgICAgICAgICAgICAgICAgDQoJCQkJCSAgIHRvcGxhbV9oZXNhcD0oc29udWMvYWRldCkudG9GaXhlZCgyKTsNCiAgICAgICAgICAgICAgICAgICAgICAkKCcjdG9wbGFtLWhlc2FwJykudmFsKHRvcGxhbV9oZXNhcCk7DQoJCQkJCSAgDQogICAgICAgICAgICAgICAgICAgICAgJCgnI3BlcmRlLWhlc2FwJykuYWRkQ2xhc3MoJ3BlcmRlLWhlc2FwJyk7DQogICAgICAgICAgICAgICAgICAgICAgJCgnI3BlcmRlLWhlc2FwJykuYXBwZW5kKCc8P3BocCBlY2hvICRlbnRyeV9lYmF0c29udWM7ID8+IDxzcGFuIGlkPSJtZXRyZSI+JyArIG1ldHJlICsgJzwvc3Bhbj4gbXQsIDw/cGhwIGVjaG8gJGVudHJ5X3NvbnVjdHV0YXI7ID8+IDxzcGFuIGlkPSJmaXlhdCI+JyArIHNvbnVjMiArICc8L3NwYW4+IDw/cGhwIGVjaG8gJHRoaXMtPmN1cnJlbmN5LT5nZXRDb2RlKCk7ID8+ICsgPD9waHAgZWNobyAkZW50cnlfYXJ0aXZlcmdpOyA/PicpOw0KICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICAgICQoJyNwZWJhdCcpLmNoYW5nZShmdW5jdGlvbiAoKXsNCiAgICAgICAgICAgICAgICAgIHZhciBlYmF0ID0gJCgnI3BlYmF0JykudmFsKCk7DQoNCiAgICAgICAgICAgICAgICAgIGlmIChlYmF0ID4gMCl7DQogICAgICAgICAgICAgICAgICAgICAgdmFyIGFkZXQgPSBwYXJzZUludCgkKCIjaW5wdXQtcXVhbnRpdHkiKS52YWwoKSk7DQogICAgICAgICAgICAgICAgICAgICAgbWV0cmU9IChlYmF0KmFkZXQpLzEwMDAwMDA7DQogICAgICAgICAgICAgICAgICAgICAgJCgnI3BlcmRlLWhlc2FwJykuaHRtbCgiIik7DQogICAgICAgICAgICAgICAgICA8P3BocCBpZiAoISRzcGVjaWFsKSB7ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgIHNvbnVjPSBtZXRyZSokKCIjZml5YXR0dCIpLnZhbCgpOwkJCQkJCSAgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHNvbnVjPXNvbnVjLnRvRml4ZWQoMik7DQoJCQkJCQkgIHNvbnVjMj0gbWV0cmUqJCgiI2ZpeWF0dHQyIikudmFsKCk7CQkJCQkJICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgc29udWMyPXNvbnVjMi50b0ZpeGVkKDIpOw0KICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gZWxzZSB7ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgIHNvbnVjPSBtZXRyZSokKCIja2FtcGFueWFhYSIpLnZhbCgpOwkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgc29udWM9c29udWMudG9GaXhlZCgyKTsNCgkJCQkJCSAgc29udWMyPSBtZXRyZSokKCIja2FtcGFueWFhYTIiKS52YWwoKTsJDQogICAgICAgICAgICAgICAgICAgICAgICAgIHNvbnVjMj1zb251YzIudG9GaXhlZCgyKTsNCiAgICAgICAgICAgICAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgICAgICAgICAgICAgDQoJCQkJCSAgDQoJCQkJCSAgIHRvcGxhbV9oZXNhcD0oc29udWMvYWRldCkudG9GaXhlZCgyKTsNCiAgICAgICAgICAgICAgICAgICAgICAkKCcjdG9wbGFtLWhlc2FwJykudmFsKHRvcGxhbV9oZXNhcCk7DQoJCQkJCSAgDQogICAgICAgICAgICAgICAgICAgICAgJCgnI3BlcmRlLWhlc2FwJykuYWRkQ2xhc3MoJ3BlcmRlLWhlc2FwJyk7DQogICAgICAgICAgICAgICAgICAgICAgJCgnI3BlcmRlLWhlc2FwJykuYXBwZW5kKCc8P3BocCBlY2hvICRlbnRyeV9lYmF0c29udWM7ID8+IDxzcGFuIGlkPSJtZXRyZSI+JyArIGViYXQqYWRldCArICc8L3NwYW4+IGNtLCA8P3BocCBlY2hvICRlbnRyeV9zb251Y3R1dGFyOyA/PiA8c3BhbiBpZD0iZml5YXQiPicgKyBzb251YzIgKyAnPC9zcGFuPiA8P3BocCBlY2hvICR0aGlzLT5jdXJyZW5jeS0+Z2V0Q29kZSgpOyA/PiArIDw/cGhwIGVjaG8gJGVudHJ5X2FydGl2ZXJnaTsgPz4nKTsNCiAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICA8L3NjcmlwdD4NCgkJDQoJCSAgPD9waHAgaWYgKCRvcHRpb25zKSB7ID8+DQogICAgPHNjcmlwdD4NCiAgICAgICAgZnVuY3Rpb24gc2F5ZmFsYShzYXlmYSxpZCxpc2xlbSl7DQoNCiAgICAgICAgICAgIHZhciBzb3JndT0gJCgiaW5wdXRbdHlwZT0ncmFkaW8nXVtuYW1lPSdvcHRpb25bIitpZCsiXSddOmNoZWNrZWQiKS52YWwoKTsNCgkJCQkNCiAgICAgICAgICAgICAgICBpZiAoaXNsZW0gPT0gJysnKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChzb3JndT09IiIpIHsgJCgnI3NlcGV0ZS1la2xlJykudHJpZ2dlcignY2xpY2snKTsgfWVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgJCgnLmFkaW0nICsgc2F5ZmEpLmhpZGUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICQoJy5hZGltJyArIChwYXJzZUludChzYXlmYSkgKyAxKSkuc2hvdygpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgJCgnLmFkaW0nICsgc2F5ZmEpLmhpZGUoKTsNCiAgICAgICAgICAgICAgICAgICAgJCgnLmFkaW0nICsgKHBhcnNlSW50KHNheWZhKSAtIDEpKS5zaG93KCk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgIH0NCg0KICAgIDwvc2NyaXB0Pg0KICAgIA0KICAgIA0KICAgIA0KICAgIA0KICAgIDxkaXYgaWQ9ImZiZmFuY3kiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+DQoNCg0KICAgIDxkaXYgaWQ9InNlY2VuZWtsZXIiPg0KICAgICAgPGRpdiBpZD0ib3B0aW9ucyIgY2xhc3M9Im9wdGlvbnMiPg0KICAgICAgICA8P3BocCAkeGo9MDsgIGZvcmVhY2goJG9wdGlvbnMgYXMgJHNheWZhKXsgJHNheWZhX3NheVtdPSRzYXlmYVsnc2F5ZmEnXTt9ICRzYXlmYWxhbmRpcm1hID0gIG1heCgkc2F5ZmFfc2F5KTsgICAkc2F5ZmFsYXIgPSBjb3VudCgkb3B0aW9ucyk7IA0KICAgICAgICANCiAgICAgICAgJHBvcHVwX2FjX25ldyA9IGZhbHNlOw0KICAgICAgICANCiAgICAgICAgDQogICAgZm9yZWFjaCAoJG9wdGlvbnMgYXMgJG9wdGlvbikgeyANCiAgICAgICAgDQogICAgICAgaWYoJG9wdGlvblsic2F5ZmEiXSA+IDApew0KICAgICAgICANCiAgICAgICAgJHBvcHVwX2FjX25ldyA9IHRydWU7DQogICAgICAgIA0KICAgICAgICA/Pg0KICAgICAgICA8P3BocCAgaWYgKCRvcHRpb25bJ3R5cGUnXSA9PSAnc2VsZWN0JykgeyA/Pg0KICAgICAgICA8ZGl2IGlkPSJvcHRpb24tPD9waHAgZWNobyAkb3B0aW9uWydwcm9kdWN0X29wdGlvbl9pZCddOyA/PiIgY2xhc3M9Im9wdGlvbiBvcHRpb24tPD9waHAgZWNobyAkb3B0aW9uWyd0eXBlJ107ID8+Ij4NCiAgICAgICAgICA8P3BocCBpZiAoJG9wdGlvblsncmVxdWlyZWQnXSkgeyA/Pg0KICAgICAgICAgIDxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj4NCiAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgPGI+PD9waHAgZWNobyAkb3B0aW9uWyduYW1lJ107ID8+OjwvYj48YnIgLz4NCiAgICAgICAgICA8c2VsZWN0IGNsYXNzPSJhY2lsaXJfbGlzdGVsZXIiIG5hbWU9Im9wdGlvbls8P3BocCBlY2hvICRvcHRpb25bJ3Byb2R1Y3Rfb3B0aW9uX2lkJ107ID8+XSI+DQogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIiPjw/cGhwIGVjaG8gJHRleHRfc2VsZWN0OyA/Pjwvb3B0aW9uPg0KICAgICAgICAgICAgPD9waHAgZm9yZWFjaCAoJG9wdGlvblsncHJvZHVjdF9vcHRpb25fdmFsdWUnXSBhcyAkb3B0aW9uX3ZhbHVlKSB7ID8+DQogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8P3BocCBlY2hvICRvcHRpb25fdmFsdWVbJ3Byb2R1Y3Rfb3B0aW9uX3ZhbHVlX2lkJ107ID8+IiBkYXRhLWltYWdlPSI8P3BocCBlY2hvICRvcHRpb25fdmFsdWVbJ2ltYWdlJ107ID8+Ij48P3BocCBlY2hvICRvcHRpb25fdmFsdWVbJ25hbWUnXTsgPz4NCiAgICAgICAgICAgIDw/cGhwIGlmICgkb3B0aW9uX3ZhbHVlWydwcmljZSddKSB7ID8+DQogICAgICAgICAgICAoPD9waHAgZWNobyAkb3B0aW9uX3ZhbHVlWydwcmljZV9wcmVmaXgnXTsgPz48P3BocCBlY2hvICRvcHRpb25fdmFsdWVbJ3ByaWNlJ107ID8+KQ0KICAgICAgICAgICAgPD9waHAgfSA/Pg0KICAgICAgICAgICAgPC9vcHRpb24+DQogICAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgPC9zZWxlY3Q+DQogICAgICAgIDwvZGl2Pg0KDQogICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgPD9waHAgaWYgKCRvcHRpb25bJ3R5cGUnXSA9PSAncmFkaW8nKSB7ID8+DQogICAgICAgICAgPGRpdiBpZD0ib3B0aW9uLTw/cGhwIGVjaG8gJG9wdGlvblsncHJvZHVjdF9vcHRpb25faWQnXTsgPz4iIGRhdGEtc2F5ZmE9Ijw/cGhwIGVjaG8gJG9wdGlvblsnc2F5ZmEnXTsgPz4iIGNsYXNzPSJvcHRpb24gb3B0aW9uLTw/cGhwIGVjaG8gJG9wdGlvblsndHlwZSddOyA/PiAgYWRpbTw/cGhwIGVjaG8gJG9wdGlvblsnc2F5ZmEnXTsgPz4iPg0KICAgICAgICAgICAgDQoJCQkgIA0KICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJjbGVhcjpib3RoOyI+PC9kaXY+DQoNCiAgICAgICAgICAgICAgPGRpdiBzdHlsZT0id2lkdGg6MTAwJTsgcGFkZGluZy10b3A6NXB4OyBtYXJnaW4tYm90dG9tOjEwcHg7IGJvcmRlci1ib3R0b206MXB4IGRhc2hlZCAjY2NjOyI+DQogICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibGlnaHR5YXppc2IiPjxiPjw/cGhwIGVjaG8gJG9wdGlvblsnbmFtZSddOyA/PjwvYj48L3NwYW4+DQogICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPHVsIGlkPSJvcHRpb24tc2VjIj4NCg0KICAgICAgICAgIDw/cGhwICRpeD0xOyBmb3JlYWNoICgkb3B0aW9uWydwcm9kdWN0X29wdGlvbl92YWx1ZSddIGFzICRvcHRpb25fdmFsdWUpIHsgID8+DQogICAgICAgICAgICAgICAgPGxpPg0KCQkJCQk8ZGl2IGNsYXNzPSJsaXN0Ij4NCgkJCQkJCTxsYWJlbCBmb3I9Im9wdGlvbi12YWx1ZS08P3BocCBlY2hvICRvcHRpb25fdmFsdWVbJ3Byb2R1Y3Rfb3B0aW9uX3ZhbHVlX2lkJ107ID8+Ij4NCgkJCQkJCSAgPGltZyBzcmM9Ijw/cGhwIGVjaG8gJG9wdGlvbl92YWx1ZVsnaW1hZ2UnXTsgPz4iIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCIgYWx0PSI8P3BocCBlY2hvICRvcHRpb25fdmFsdWVbJ25hbWUnXTsgPz4iICBzdHlsZT0iaGVpZ2h0OiAxMDBweCAhIGltcG9ydGFudDsgbWFyZ2luLWJvdHRvbTotNXB4OyIgLz4NCgkJCQkJCTwvbGFiZWw+DQoJCQkJCTwvZGl2Pg0KCQkJCQk8ZGl2IGNsYXNzPSJsYWJlbC10aXRsZSI+DQoJCQkJCTxpbnB1dCBzdHlsZT0iZmxvYXQ6IGxlZnQiIGRhdGEtcHJpY2U9IiIgdHlwZT0icmFkaW8iIDw/cGhwIGVjaG8gKCRpeD09MSkgPyAiY2hlY2tlZCIgOiAiIjsgPz4gbmFtZT0ib3B0aW9uWzw/cGhwIGVjaG8gJG9wdGlvblsncHJvZHVjdF9vcHRpb25faWQnXTsgPz5dIiB2YWx1ZT0iPD9waHAgZWNobyAkb3B0aW9uX3ZhbHVlWydwcm9kdWN0X29wdGlvbl92YWx1ZV9pZCddOyA/PiIgZGF0YS1pbWFnZT0iPD9waHAgZWNobyAkb3B0aW9uX3ZhbHVlWydpbWFnZSddOyA/PiIgaWQ9Im9wdGlvbi12YWx1ZS08P3BocCBlY2hvICRvcHRpb25fdmFsdWVbJ3Byb2R1Y3Rfb3B0aW9uX3ZhbHVlX2lkJ107ID8+IiAvPg0KICAgICAgICAgICAgICAgICAgIDxiPjw/cGhwIGVjaG8gJG9wdGlvbl92YWx1ZVsnbmFtZSddOyA/Pg0KICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoJG9wdGlvbl92YWx1ZVsncHJpY2UnXSkgeyA/Pg0KICAgICAgICAgICAgICAgICAgICAoPD9waHAgZWNobyAkb3B0aW9uX3ZhbHVlWydwcmljZV9wcmVmaXgnXTsgPz48P3BocCBlY2hvICRvcHRpb25fdmFsdWVbJ3ByaWNlJ107ID8+KQ0KICAgICAgICAgICAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgICAgICAgICAgIDwvYj4NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgPC9saT4NCiAgICAgICAgICA8P3BocCAkaXgrKzsgJHhqKys7IH0gPz4NCiAgICAgICAgICAgIDwvdWw+DQoJCQk8ZGl2IHN0eWxlPSJjbGVhcjpib3RoOyI+PC9kaXY+DQoJCQkgPD9waHAgDQoJCQkgaWYgKCRvcHRpb25bJ3NheWZhX2Jhc2xpayddPT0xKSB7ID8+CQkJIA0KCQkJCTxkaXYgPg0KCQkJCQkgIDxkaXYgc3R5bGU9ImZsb2F0OnJpZ2h0O21hcmdpbi1sZWZ0OjVweDt3aWR0aDo0OSUiPg0KCQkJCQkJICA8P3BocCBpZiAoJG9wdGlvblsnc2F5ZmEnXT09ICRzYXlmYWxhbmRpcm1hKXsgPz4NCgkJCQkJCSAgPGJ1dHRvbiBpZD0ic2VwZXRlLWVrbGUiIGNsYXNzPSJidG4tZXZ5ZWxsb3ciIG5hbWU9IlNlcGV0ZUF0Ij48P3BocCBlY2hvICRlbnRyeV9zZXBldGVla2xlOyA/PjwvYnV0dG9uPiAgICAgICAgICAgICAgICAgIA0KCQkJCQkJICA8P3BocCB9ZWxzZXsgPz4NCgkJCQkJCSAgPGJ1dHRvbiBvbmNsaWNrPSJzYXlmYWxhKCc8P3BocCBlY2hvICRvcHRpb25bJ3NheWZhJ107ID8+JywnPD9waHAgZWNobyAkb3B0aW9uWydwcm9kdWN0X29wdGlvbl9pZCddOyA/PicsJysnKTsiIG5hbWU9IkRldmFtRXQiICBjbGFzcz0iYnRuLWV2eWVsbG93Ij48P3BocCBlY2hvICRlbnRyeV9kZXZhbTsgPz48L2J1dHRvbj4NCgkJCQkJCSAgPD9waHAgfSA/Pg0KCQkJCQkgIDwvZGl2Pg0KCQkJCQkgIDw/cGhwIGlmICgkb3B0aW9uWydzYXlmYSddPjEpeyA/Pg0KCQkJCQkgIDxkaXYgc3R5bGU9ImZsb2F0OnJpZ2h0O3dpZHRoOjQ5JSI+DQoJCQkJCQkgIDxidXR0b24gb25jbGljaz0ic2F5ZmFsYSgnPD9waHAgZWNobyAkb3B0aW9uWydzYXlmYSddOyA/PicsJzw/cGhwIGVjaG8gJG9wdGlvblsncHJvZHVjdF9vcHRpb25faWQnXTsgPz4nLCctJyk7IiBuYW1lPSJHZXJpRG9uIiAgY2xhc3M9ImJ0bi1ldmJsdWUiPjw/cGhwIGVjaG8gJGVudHJ5X2dlcmlkb247ID8+PC9idXR0b24+DQoJCQkJCSAgPC9kaXY+DQoJCQkJCSAgPD9waHAgfWVsc2V7ID8+IA0KCQkJCQkgICA8ZGl2IHN0eWxlPSJmbG9hdDpyaWdodDt3aWR0aDo0OSUiPg0KCQkJCQkJICA8YnV0dG9uIG9uY2xpY2s9IiQuZmFuY3lib3guY2xvc2UoKTsiIG5hbWU9IkdlcmlEb24iIGlkPSJHZXJpRG9uIiAgY2xhc3M9ImJ0bi1ldmJsdWUiPjw/cGhwIGVjaG8gJGVudHJ5X2thcGF0OyA/PjwvYnV0dG9uPg0KCQkJCQkgIDwvZGl2PgkJCQkJICAJCQkJCSANCgkJCQkJICA8P3BocCB9ICA/Pg0KCQkJCTwvZGl2Pg0KCQkJCSAgPD9waHAgfSAgPz4NCiAgICAgICAgPC9kaXY+DQoNCiAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgDQogICAgICAgICAgDQogICAgICAgICAgDQogICAgICAgIDw/cGhwIGlmICgkb3B0aW9uWyd0eXBlJ10gPT0gJ2NoZWNrYm94JykgeyA/Pg0KICAgICAgICA8ZGl2IGlkPSJvcHRpb24tPD9waHAgZWNobyAkb3B0aW9uWydwcm9kdWN0X29wdGlvbl9pZCddOyA/PiIgY2xhc3M9Im9wdGlvbiBvcHRpb24tPD9waHAgZWNobyAkb3B0aW9uWyd0eXBlJ107ID8+Ij4NCiAgICAgICAgICA8P3BocCBpZiAoJG9wdGlvblsncmVxdWlyZWQnXSkgeyA/Pg0KICAgICAgICAgIDxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj4NCiAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgPGI+PD9waHAgZWNobyAkb3B0aW9uWyduYW1lJ107ID8+OjwvYj48YnIgLz4NCiAgICAgICAgICA8P3BocCBmb3JlYWNoICgkb3B0aW9uWydwcm9kdWN0X29wdGlvbl92YWx1ZSddIGFzICRvcHRpb25fdmFsdWUpIHsgPz4NCiAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9Im9wdGlvbls8P3BocCBlY2hvICRvcHRpb25bJ3Byb2R1Y3Rfb3B0aW9uX2lkJ107ID8+XVtdIiB2YWx1ZT0iPD9waHAgZWNobyAkb3B0aW9uX3ZhbHVlWydwcm9kdWN0X29wdGlvbl92YWx1ZV9pZCddOyA/PiIgZGF0YS1pbWFnZT0iPD9waHAgZWNobyAkb3B0aW9uX3ZhbHVlWydpbWFnZSddOyA/PiIgaWQ9Im9wdGlvbi12YWx1ZS08P3BocCBlY2hvICRvcHRpb25fdmFsdWVbJ3Byb2R1Y3Rfb3B0aW9uX3ZhbHVlX2lkJ107ID8+IiAvPg0KICAgICAgICAgIDxsYWJlbCBmb3I9Im9wdGlvbi12YWx1ZS08P3BocCBlY2hvICRvcHRpb25fdmFsdWVbJ3Byb2R1Y3Rfb3B0aW9uX3ZhbHVlX2lkJ107ID8+Ij48P3BocCBlY2hvICRvcHRpb25fdmFsdWVbJ25hbWUnXTsgPz4NCiAgICAgICAgICAgIDw/cGhwIGlmICgkb3B0aW9uX3ZhbHVlWydwcmljZSddKSB7ID8+DQogICAgICAgICAgICAoPD9waHAgZWNobyAkb3B0aW9uX3ZhbHVlWydwcmljZV9wcmVmaXgnXTsgPz48P3BocCBlY2hvICRvcHRpb25fdmFsdWVbJ3ByaWNlJ107ID8+KQ0KICAgICAgICAgICAgPD9waHAgfSA/Pg0KICAgICAgICAgIDwvbGFiZWw+DQogICAgICAgICAgPGJyIC8+DQogICAgICAgICAgPD9waHAgfSA/Pg0KICAgICAgICA8L2Rpdj4NCiAgICAgICAgPGJyIC8+DQogICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgPD9waHAgaWYgKCRvcHRpb25bJ3R5cGUnXSA9PSAnaW1hZ2UnKSB7ID8+DQogICAgICAgIDxkaXYgaWQ9Im9wdGlvbi08P3BocCBlY2hvICRvcHRpb25bJ3Byb2R1Y3Rfb3B0aW9uX2lkJ107ID8+IiBjbGFzcz0ib3B0aW9uIG9wdGlvbi08P3BocCBlY2hvICRvcHRpb25bJ3R5cGUnXTsgPz4iPg0KICAgICAgICAgIDw/cGhwIGlmICgkb3B0aW9uWydyZXF1aXJlZCddKSB7ID8+DQogICAgICAgICAgPHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPg0KICAgICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgICA8Yj48P3BocCBlY2hvICRvcHRpb25bJ25hbWUnXTsgPz46PC9iPjxiciAvPg0KICAgICAgICAgIDx0YWJsZSBjbGFzcz0ib3B0aW9uLWltYWdlIj4NCiAgICAgICAgICAgIDw/cGhwICRpeD0xOyBmb3JlYWNoICgkb3B0aW9uWydwcm9kdWN0X29wdGlvbl92YWx1ZSddIGFzICRvcHRpb25fdmFsdWUpIHsgPz4NCiAgICAgICAgICAgIDx0cj4NCiAgICAgICAgICAgICAgPHRkIHN0eWxlPSJ3aWR0aDogMXB4OyI+DQogICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Im9wdGlvbls8P3BocCBlY2hvICRvcHRpb25bJ3Byb2R1Y3Rfb3B0aW9uX2lkJ107ID8+XSIgICAgdmFsdWU9Ijw/cGhwIGVjaG8gJG9wdGlvbl92YWx1ZVsncHJvZHVjdF9vcHRpb25fdmFsdWVfaWQnXTsgPz4iIGlkPSJvcHRpb24tdmFsdWUtPD9waHAgZWNobyAkb3B0aW9uX3ZhbHVlWydwcm9kdWN0X29wdGlvbl92YWx1ZV9pZCddOyA/PiIgLz48L3RkPg0KICAgICAgICAgICAgICA8dGQ+PGxhYmVsIGZvcj0ib3B0aW9uLXZhbHVlLTw/cGhwIGVjaG8gJG9wdGlvbl92YWx1ZVsncHJvZHVjdF9vcHRpb25fdmFsdWVfaWQnXTsgPz4iPjxpbWcgc3JjPSI8P3BocCBlY2hvICRvcHRpb25fdmFsdWVbJ2ltYWdlJ107ID8+IiB3aWR0aD0iMjIwIiBoZWlnaHQ9IjEwMCIgYWx0PSI8P3BocCBlY2hvICRvcHRpb25fdmFsdWVbJ25hbWUnXSAuICgkb3B0aW9uX3ZhbHVlWydwcmljZSddID8gJyAnIC4gJG9wdGlvbl92YWx1ZVsncHJpY2VfcHJlZml4J10gLiAkb3B0aW9uX3ZhbHVlWydwcmljZSddIDogJycpOyA/PiIgLz48L2xhYmVsPjwvdGQ+DQogICAgICAgICAgICAgIDx0ZD48bGFiZWwgZm9yPSJvcHRpb24tdmFsdWUtPD9waHAgZWNobyAkb3B0aW9uX3ZhbHVlWydwcm9kdWN0X29wdGlvbl92YWx1ZV9pZCddOyA/PiI+PD9waHAgZWNobyAkb3B0aW9uX3ZhbHVlWyduYW1lJ107ID8+DQogICAgICAgICAgICAgICAgICA8P3BocCBpZiAoJG9wdGlvbl92YWx1ZVsncHJpY2UnXSkgeyA/Pg0KICAgICAgICAgICAgICAgICAgKDw/cGhwIGVjaG8gJG9wdGlvbl92YWx1ZVsncHJpY2VfcHJlZml4J107ID8+PD9waHAgZWNobyAkb3B0aW9uX3ZhbHVlWydwcmljZSddOyA/PikNCiAgICAgICAgICAgICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgICAgICAgICA8L2xhYmVsPjwvdGQ+DQogICAgICAgICAgICA8L3RyPg0KICAgICAgICAgICAgPD9waHAgJGl4Kys7IH0gPz4NCiAgICAgICAgICA8L3RhYmxlPg0KICAgICAgICA8L2Rpdj4NCiAgICAgICAgPGJyIC8+DQogICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgPD9waHAgaWYgKCRvcHRpb25bJ3R5cGUnXSA9PSAndGV4dCcpIHsgPz4NCiAgICAgICAgPGRpdiBpZD0ib3B0aW9uLTw/cGhwIGVjaG8gJG9wdGlvblsncHJvZHVjdF9vcHRpb25faWQnXTsgPz4iIGNsYXNzPSJvcHRpb24iPg0KICAgICAgICAgIDw/cGhwIGlmICgkb3B0aW9uWydyZXF1aXJlZCddKSB7ID8+DQogICAgICAgICAgPHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPg0KICAgICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgICA8Yj48P3BocCBlY2hvICRvcHRpb25bJ25hbWUnXTsgPz46PC9iPjxiciAvPg0KICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJvcHRpb25bPD9waHAgZWNobyAkb3B0aW9uWydwcm9kdWN0X29wdGlvbl9pZCddOyA/Pl0iIHZhbHVlPSIiIHBsYWNlaG9sZGVyPSI8P3BocCBlY2hvICRvcHRpb25bJ3BsYWNlaG9sZGVyJ107ID8+Ii8+DQogICAgICAgIDwvZGl2Pg0KICAgICAgICA8YnIgLz4NCiAgICAgICAgPD9waHAgfSA/Pg0KICAgICAgICA8P3BocCBpZiAoJG9wdGlvblsndHlwZSddID09ICd0ZXh0YXJlYScpIHsgPz4NCiAgICAgICAgPGRpdiBpZD0ib3B0aW9uLTw/cGhwIGVjaG8gJG9wdGlvblsncHJvZHVjdF9vcHRpb25faWQnXTsgPz4iIGNsYXNzPSJvcHRpb24iPg0KICAgICAgICAgIDw/cGhwIGlmICgkb3B0aW9uWydyZXF1aXJlZCddKSB7ID8+DQogICAgICAgICAgPHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPg0KICAgICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgICA8Yj48P3BocCBlY2hvICRvcHRpb25bJ25hbWUnXTsgPz46PC9iPjxiciAvPg0KICAgICAgICAgIDx0ZXh0YXJlYSBuYW1lPSJvcHRpb25bPD9waHAgZWNobyAkb3B0aW9uWydwcm9kdWN0X29wdGlvbl9pZCddOyA/Pl0iIGNvbHM9IjQwIiByb3dzPSI1Ij48P3BocCBlY2hvICRvcHRpb25bJ3Byb2R1Y3Rfb3B0aW9uX3ZhbHVlJ107ID8+PC90ZXh0YXJlYT4NCiAgICAgICAgPC9kaXY+DQogICAgICAgIDxiciAvPg0KICAgICAgICA8P3BocCB9ID8+DQogICAgICAgIDw/cGhwIGlmICgkb3B0aW9uWyd0eXBlJ10gPT0gJ2ZpbGUnKSB7ID8+DQogICAgICAgIDxkaXYgaWQ9Im9wdGlvbi08P3BocCBlY2hvICRvcHRpb25bJ3Byb2R1Y3Rfb3B0aW9uX2lkJ107ID8+IiBjbGFzcz0ib3B0aW9uIj4NCiAgICAgICAgICA8P3BocCBpZiAoJG9wdGlvblsncmVxdWlyZWQnXSkgeyA/Pg0KICAgICAgICAgIDxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj4NCiAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgPGI+PD9waHAgZWNobyAkb3B0aW9uWyduYW1lJ107ID8+OjwvYj48YnIgLz4NCiAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iPD9waHAgZWNobyAkYnV0dG9uX3VwbG9hZDsgPz4iIGlkPSJidXR0b24tb3B0aW9uLTw/cGhwIGVjaG8gJG9wdGlvblsncHJvZHVjdF9vcHRpb25faWQnXTsgPz4iIGNsYXNzPSJidXR0b24iPg0KICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Im9wdGlvbls8P3BocCBlY2hvICRvcHRpb25bJ3Byb2R1Y3Rfb3B0aW9uX2lkJ107ID8+XSIgdmFsdWU9IiIgLz4NCiAgICAgICAgPC9kaXY+DQogICAgICAgIDxiciAvPg0KICAgICAgICA8P3BocCB9ID8+DQogICAgICAgIDw/cGhwIGlmICgkb3B0aW9uWyd0eXBlJ10gPT0gJ2RhdGUnKSB7ID8+DQogICAgICAgIDxkaXYgaWQ9Im9wdGlvbi08P3BocCBlY2hvICRvcHRpb25bJ3Byb2R1Y3Rfb3B0aW9uX2lkJ107ID8+IiBjbGFzcz0ib3B0aW9uIj4NCiAgICAgICAgICA8P3BocCBpZiAoJG9wdGlvblsncmVxdWlyZWQnXSkgeyA/Pg0KICAgICAgICAgIDxzcGFuIGNsYXNzPSJyZXF1aXJlZCI+Kjwvc3Bhbj4NCiAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgPGI+PD9waHAgZWNobyAkb3B0aW9uWyduYW1lJ107ID8+OjwvYj48YnIgLz4NCiAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ib3B0aW9uWzw/cGhwIGVjaG8gJG9wdGlvblsncHJvZHVjdF9vcHRpb25faWQnXTsgPz5dIiB2YWx1ZT0iPD9waHAgZWNobyAkb3B0aW9uWydwcm9kdWN0X29wdGlvbl92YWx1ZSddOyA/PiIgY2xhc3M9ImRhdGUiIC8+DQogICAgICAgIDwvZGl2Pg0KICAgICAgICA8YnIgLz4NCiAgICAgICAgPD9waHAgfSA/Pg0KICAgICAgICA8P3BocCBpZiAoJG9wdGlvblsndHlwZSddID09ICdkYXRldGltZScpIHsgPz4NCiAgICAgICAgPGRpdiBpZD0ib3B0aW9uLTw/cGhwIGVjaG8gJG9wdGlvblsncHJvZHVjdF9vcHRpb25faWQnXTsgPz4iIGNsYXNzPSJvcHRpb24iPg0KICAgICAgICAgIDw/cGhwIGlmICgkb3B0aW9uWydyZXF1aXJlZCddKSB7ID8+DQogICAgICAgICAgPHNwYW4gY2xhc3M9InJlcXVpcmVkIj4qPC9zcGFuPg0KICAgICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgICA8Yj48P3BocCBlY2hvICRvcHRpb25bJ25hbWUnXTsgPz46PC9iPjxiciAvPg0KICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJvcHRpb25bPD9waHAgZWNobyAkb3B0aW9uWydwcm9kdWN0X29wdGlvbl9pZCddOyA/Pl0iIHZhbHVlPSI8P3BocCBlY2hvICRvcHRpb25bJ3Byb2R1Y3Rfb3B0aW9uX3ZhbHVlJ107ID8+IiBjbGFzcz0iZGF0ZXRpbWUiIC8+DQogICAgICAgIDwvZGl2Pg0KICAgICAgICA8YnIgLz4NCiAgICAgICAgPD9waHAgfSA/Pg0KICAgICAgICA8P3BocCBpZiAoJG9wdGlvblsndHlwZSddID09ICd0aW1lJykgeyA/Pg0KICAgICAgICA8ZGl2IGlkPSJvcHRpb24tPD9waHAgZWNobyAkb3B0aW9uWydwcm9kdWN0X29wdGlvbl9pZCddOyA/PiIgY2xhc3M9Im9wdGlvbiI+DQogICAgICAgICAgPD9waHAgaWYgKCRvcHRpb25bJ3JlcXVpcmVkJ10pIHsgPz4NCiAgICAgICAgICA8c3BhbiBjbGFzcz0icmVxdWlyZWQiPio8L3NwYW4+DQogICAgICAgICAgPD9waHAgfSA/Pg0KICAgICAgICAgIDxiPjw/cGhwIGVjaG8gJG9wdGlvblsnbmFtZSddOyA/Pjo8L2I+PGJyIC8+DQogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Im9wdGlvbls8P3BocCBlY2hvICRvcHRpb25bJ3Byb2R1Y3Rfb3B0aW9uX2lkJ107ID8+XSIgdmFsdWU9Ijw/cGhwIGVjaG8gJG9wdGlvblsncHJvZHVjdF9vcHRpb25fdmFsdWUnXTsgPz4iIGNsYXNzPSJ0aW1lIiAvPg0KICAgICAgICA8L2Rpdj4NCiAgICAgICAgPGJyIC8+DQogICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgDQogICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgDQogICAgICAgIDw/cGhwIH0gPz4NCiAgICAgIDwvZGl2Pg0KICAgIDwvZGl2Pg0KICA8L2Rpdj4NCiAgICAgIDw/cGhwIH0gPz4NCgkJICAgPD9waHAgaWYgKCRyZWN1cnJpbmdzKSB7ID8+DQogICAgICAgICAgICA8aHI+DQogICAgICAgICAgICA8aDM+PD9waHAgZWNobyAkdGV4dF9wYXltZW50X3JlY3VycmluZyA/PjwvaDM+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIHJlcXVpcmVkIj4NCiAgICAgICAgICAgICAgPHNlbGVjdCBuYW1lPSJyZWN1cnJpbmdfaWQiIGNsYXNzPSJmb3JtLWNvbnRyb2wiPg0KICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiI+PD9waHAgZWNobyAkdGV4dF9zZWxlY3Q7ID8+PC9vcHRpb24+DQogICAgICAgICAgICAgICAgPD9waHAgZm9yZWFjaCAoJHJlY3VycmluZ3MgYXMgJHJlY3VycmluZykgeyA/Pg0KICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ijw/cGhwIGVjaG8gJHJlY3VycmluZ1sncmVjdXJyaW5nX2lkJ10gPz4iPjw/cGhwIGVjaG8gJHJlY3VycmluZ1snbmFtZSddID8+PC9vcHRpb24+DQogICAgICAgICAgICAgICAgPD9waHAgfSA/Pg0KICAgICAgICAgICAgICA8L3NlbGVjdD4NCiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVscC1ibG9jayIgaWQ9InJlY3VycmluZy1kZXNjcmlwdGlvbiI+PC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgIDxkaXYgaWQ9InBlcmRlLWhlc2FwIj4NCgkJDQoJCTwvZGl2Pg0KCQk8aW5wdXQgaWQ9InNheWZhLW5vIiB2YWx1ZT0iMSIgdHlwZT0iaGlkZGVuIj4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAgY2FydCA8P3BocCBlY2hvIGlzc2V0KCRsYWJlbHMpICYmIGlzX2FycmF5KCRsYWJlbHMpICYmIGlzc2V0KCRsYWJlbHNbJ291dG9mc3RvY2snXSkgPyAnb3V0b2ZzdG9jaycgOiAnJzsgPz4iPg0KICAgICAgICAgICAgICA8ZGl2Pg0KCQkJICAgICAgICAgICAgICAgIDw/cGhwIGlmKCR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgnaGlkZV9hZGRfdG9fY2FydF9idXR0b24nKSk6ID8+DQogICAgICAgICAgICAgIDw/cGhwIGZvcmVhY2ggKCR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgnYWRkaXRpb25hbF9wcm9kdWN0X2VucXVpcnknLCBhcnJheSgpKSBhcyAkdGFiKTogPz4NCgkJCSAgPGRpdj48P3BocCBlY2hvICR0YWJbJ2NvbnRlbnQnXTsgPz48L2Rpdj4NCgkJCSAgPD9waHAgZW5kZm9yZWFjaDsgPz4NCgkJCSAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJwcm9kdWN0X2lkIiB2YWx1ZT0iPD9waHAgZWNobyAkcHJvZHVjdF9pZDsgPz4iIC8+DQogICAgICAgICAgICAgIDw/cGhwIGVsc2U6ID8+DQoJCQkgIA0KCQkJDQoJCQkNCgkJCQ0KCQkJDQoJCQkgPCEtLTxkaXYgaWQ9Im1vYmlsZSIgc3R5bGU9Im1hcmdpbi1ib3R0b206MTVweDsgY29sb3I6IzIzOEMwMDsiPg0KCQkJIDx1bCBzdHlsZT0ibGlzdC1zdHlsZS10eXBlOm5vbmU7IG1hcmdpbi1sZWZ0OjBweDsgcGFkZGluZy1sZWZ0OjBweDsiPg0KCQkJIA0KCQkJIDxsaT48aSBjbGFzcz0iZmEgZmEtY2FsZW5kYXIiPjwvaT4gPD9waHAgZWNobyAkZW50cnlfaXNndW51a2FyZ287ID8+PC9saT4NCgkJCSA8bGkgc3R5bGU9Im1hcmdpbi10b3A6N3B4OyI+PGkgY2xhc3M9ImZhcyBmYS1sb2NrIj48L2k+IDw/cGhwIGVjaG8gJGVudHJ5X2d1dmVubGlvZGVtZTsgPz48L2xpPg0KCQkJIDxsaSBzdHlsZT0ibWFyZ2luLXRvcDo3cHg7Ij48aSBjbGFzcz0iZmFzIGZhLWNyZWRpdC1jYXJkIj48L2k+IDw/cGhwIGVjaG8gJGVudHJ5X2tyZWRpa2FydGk7ID8+PC9saT4NCgkJCSA8bGkgc3R5bGU9Im1hcmdpbi10b3A6N3B4OyI+PGkgY2xhc3M9ImZhcyBmYS1jaGVjay1jaXJjbGUiPjwvaT4gPD9waHAgZWNobyAkZW50cnlfaGF2YWxlZWZ0b2RlbWU7ID8+PC9saT4NCgkJCSANCgkJCSA8L3VsPg0KCQkJIA0KCQkJIDwvZGl2Pi0tPg0KCQkJIA0KCQkJIA0KCQkJIA0KDQoJCQkgIA0KCQkJICANCgkJCSA8c3BhbiBjbGFzcz0icXR5Ij4NCiAgICAgICAgICAgICAgDQogICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJxdWFudGl0eSIgdmFsdWU9Ijw/cGhwIGVjaG8gJG1pbmltdW07ID8+IiBzaXplPSIyIiBkYXRhLW1pbi12YWx1ZT0iPD9waHAgZWNobyAkbWluaW11bTsgPz4iIGlkPSJpbnB1dC1xdWFudGl0eSIgY2xhc3M9ImZvcm0tY29udHJvbCIgLz4NCiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icHJvZHVjdF9pZCIgdmFsdWU9Ijw/cGhwIGVjaG8gJHByb2R1Y3RfaWQ7ID8+IiAvPg0KICAgICAgICAgICAgICA8c2NyaXB0Pg0KIC8qIHF1YW50aXR5IGJ1dHRvbnMgKi8NCiAgICAgICAgICAgICAgICB2YXIgJGlucHV0ID0gJCgnLmNhcnQgaW5wdXRbbmFtZT0icXVhbnRpdHkiXScpOw0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHVwKCkgew0KICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IHBhcnNlSW50KCRpbnB1dC52YWwoKSwgMTApICsgMSB8fCBwYXJzZUludCgkaW5wdXQuYXR0cignZGF0YS1taW4tdmFsdWUnKSwgMTApOw0KICAgICAgICAgICAgICAgICAgJGlucHV0LnZhbCh2YWwpOw0KCQkJCSAgaGVzYXBsYTEyMygpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkb3duKCkgew0KICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IHBhcnNlSW50KCRpbnB1dC52YWwoKSwgMTApIC0gMSB8fCAwOw0KICAgICAgICAgICAgICAgICAgdmFyIG1pbiA9IHBhcnNlSW50KCRpbnB1dC5hdHRyKCdkYXRhLW1pbi12YWx1ZScpLCAxMCkgfHwgMTsNCiAgICAgICAgICAgICAgICAgICRpbnB1dC52YWwoTWF0aC5tYXgodmFsLCBtaW4pKTsNCgkJCQkgIGhlc2FwbGExMjMoKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgJCgnPGEgaHJlZj0iamF2YXNjcmlwdDo7IiBjbGFzcz0iam91cm5hbC1zdGVwcGVyIj4tPC9hPicpLmluc2VydEJlZm9yZSgkaW5wdXQpLmNsaWNrKGRvd24pOw0KICAgICAgICAgICAgICAgICQoJzxhIGhyZWY9ImphdmFzY3JpcHQ6OyIgY2xhc3M9ImpvdXJuYWwtc3RlcHBlciI+KzwvYT4nKS5pbnNlcnRBZnRlcigkaW5wdXQpLmNsaWNrKHVwKTsNCiAgICAgICAgICAgICAgICAkaW5wdXQua2V5ZG93bihmdW5jdGlvbiAoZSkgew0KICAgICAgICAgICAgICAgICAgaWYgKGUud2hpY2ggPT09IDM4KSB7DQogICAgICAgICAgICAgICAgICAgIHVwKCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIGlmIChlLndoaWNoID09PSA0MCkgew0KICAgICAgICAgICAgICAgICAgICBkb3duKCk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgPC9zY3JpcHQ+DQo8L3NwYW4+DQoNCg0KICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIG9uY2xpY2s9InBvcHVwX2FjKCkiIGlkPSJidXR0b24tY2FydCIgZGF0YS1sb2FkaW5nLXRleHQ9Ijw/cGhwIGVjaG8gJHRleHRfbG9hZGluZzsgPz4iIGNsYXNzPSJidXR0b24iPjxzcGFuIGNsYXNzPSJidXR0b24tY2FydC10ZXh0Ij48P3BocCBlY2hvICRidXR0b25fY2FydDsgPz48L3NwYW4+PC9idXR0b24+DQogICAgICAgICAgICAgICAgPD9waHAgZW5kaWY7ID8+DQogICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICANCjxpbWcgc3R5bGU9Im1hcmdpbi10b3A6MjBweDsgd2lkdGg6MTAwJTsiIHNyYz0iaHR0cHM6Ly93d3cuc2FyYXlwZXJkZWhvbWUuY29tL2ltYWdlL2dyYWZpa2xlci91cnVuLXNheWZhc2ktaWNvbmxhci5wbmciPg0KCQkJICANCgkJICAgCSAgIDxhIGNsYXNzPSJmYW5jeWJveCIgaHJlZj0iI2ZiZmFuY3kiPjwvYT4NCgkJCTxhIGNsYXNzPSJmYW5jeWJveHgiIGhyZWY9IiNhZnRlci1zYXlmYSIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjwvYT4NCgkJCQ0KCQk8ZGl2IGlkPSJhZnRlci1zYXlmYSIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7aGVpZ2h0OiAzNXB4OyB3aWR0aDogMTAwJTsgcG9zaXRpb246IGFic29sdXRlOyBib3R0b206IDEwcHg7Ij4NCiAgICAgICAgICAgIDxhIG9uY2xpY2s9IndpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKCdpbmRleC5waHAnKSIgY2xhc3M9ImJ0bi1ldmJsdWUiIHN0eWxlPSJ3aWR0aDo0NSU7ZmxvYXQ6bGVmdCI+QWzEscWfdmVyacWfZSBEZXZhbSBFdDwvYT4NCiAgICAgICAgICAgIDxhIG9uY2xpY2s9IndpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKCdpbmRleC5waHA/cm91dGU9Y2hlY2tvdXQvY2FydCcpIiBjbGFzcz0iYnRuLWV2eWVsbG93IiBzdHlsZT0id2lkdGg6NDUlO2Zsb2F0OmxlZnQiPlNlcGV0ZSBHaXQ8L2E+DQogICAgICAgIDwvZGl2Pg0KICAgICAgICANCiAgICAgICAgICA8c2NyaXB0Pg0KICAgICAgICAgIGZ1bmN0aW9uIGtvbnRyb2woKSB7DQogICAgICAgICAgICAgIHZhciBzZW4gPSAkKCcjc2VuJykudmFsKCk7DQogICAgICAgICAgICAgIHZhciBzYm95ID0gJCgnI3Nib3knKS52YWwoKTsNCiAgICAgICAgICAgICAgdmFyIGVuID0gJCgnI3BlbicpLnZhbCgpOw0KICAgICAgICAgICAgICB2YXIgYm95ID0gJCgnI3Bib3knKS52YWwoKTsNCiAgICAgICAgICAgICAgdmFyIGViYXQgPSAkKCcjcGViYXQnKS52YWwoKTsNCiAgICAgICAgICAgICAgDQoJCQkJaWYgKHNlbiA9PSAwKSB7DQoJCQkJCWFsZXJ0KCI8P3BocCBlY2hvICRlbnRyeV91eWFyaWVuOyA/PiIpOw0KCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJfQ0KCQkJICANCgkJCQlpZiAoc2JveSA9PTApIHsNCiAgICAgICAgICAgICAgICAgICAgYWxlcnQoIjw/cGhwIGVjaG8gJGVudHJ5X3V5YXJpYm95OyA/PiIpOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICAgICAgfSANCiAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmIChlbj09MCkgew0KICAgICAgICAgICAgICAgICAgICBhbGVydCgiPD9waHAgZWNobyAkZW50cnlfdXlhcmllbjsgPz4iKTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgIH0gDQoJCQkJCSAgDQogICAgICAgICAgICAgICAgaWYgKGJveSA9PTApIHsNCiAgICAgICAgICAgICAgICAgICAgYWxlcnQoIjw/cGhwIGVjaG8gJGVudHJ5X3V5YXJpYm95OyA/PiIpOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKGViYXQgPCAxKSB7DQogICAgICAgICAgICAgICAgICAgIGFsZXJ0KCI8P3BocCBlY2hvICRlbnRyeV91eWFyaWViYXQ7ID8+Iik7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAvKiBhZGRUb0NhcnQoJzw/cGhwIGVjaG8gJHByb2R1Y3RfaWQ7ID8+Jyk7Ki8NCgkJCSAgIGFsZXJ0ICgic2VwZXRlIGVrbGljZW0uIGtvZHVtdSBhw6ciKTsNCiAgICAgICAgICAgICANCiAgICAgICAgICB9DQogICAgICAgICAgPC9zY3JpcHQ+DQogICAgICAgDQoJCSAgIDwvZGl2Pg0KCQkgIA0KICAgICAgICAgICAgPD9waHAgaWYgKCRtaW5pbXVtID4gMSkgeyA/Pg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtaW5mbyI+PGkgY2xhc3M9ImZhIGZhLWluZm8tY2lyY2xlIj48L2k+IDw/cGhwIGVjaG8gJHRleHRfbWluaW11bTsgPz48L2Rpdj4NCiAgICAgICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9Indpc2hsaXN0LWNvbXBhcmUiPg0KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibGlua3MiPg0KICAgICAgICAgICAgICAgICAgPGEgb25jbGljaz0iYWRkVG9XaXNoTGlzdCgnPD9waHAgZWNobyAkcHJvZHVjdF9pZDsgPz4nKTsiPjw/cGhwIGVjaG8gJGJ1dHRvbl93aXNobGlzdDsgPz48L2E+DQogICAgICAgICAgICAgICAgICA8YSBvbmNsaWNrPSJhZGRUb0NvbXBhcmUoJzw/cGhwIGVjaG8gJHByb2R1Y3RfaWQ7ID8+Jyk7Ij48P3BocCBlY2hvICRidXR0b25fY29tcGFyZTsgPz48L2E+DQogICAgICAgICAgICAgIDwvc3Bhbj4NCiAgICAgICAgICAgIDwvZGl2Pg0KCQkJDQoJCQkNCgkJCQ0KCQkJDQoJCQkgPD9waHAgaWYgKCRyZXZpZXdfc3RhdHVzKSB7ID8+DQogICAgICAgICAgPGRpdiBjbGFzcz0icmF0aW5nIj4NCiAgICAgICAgICAgIDx1bCBzdHlsZT0ibWFyZ2luLWxlZnQ6LTIwcHg7IG1hcmdpbi10b3A6MXB4OyBtYXJnaW4tYm90dG9tOi01cHg7Ij4NCiAgICAgICAgICA8bGk+RXRlaywgYm9uY3VrIHZlIGRpxJ9lciBzZcOnZW5la2xlciAodmFyc2EpIDxzcGFuIHN0eWxlPSJjb2xvcjojREIxRDBEOyI+U2VwZXRlIEVrbGU8L3NwYW4+IGJ1dG9udW5hIHTEsWtsYWTEsWt0YW4gc29ucmEgYcOnxLFsYWNha3TEsXIuPC9saT4NCgkJICA8bGk+S3JlZGkga2FydMSxIHRha3NpdCBzZcOnZW5la2xlcmkgw7ZkZW1lIHNheWZhc8SxbmRhIGfDtnN0ZXJpbGVjZWt0aXIuPC9saT4NCgkJICA8bGk+U2lwYXJpxZ9pbml6bGUgaWxnaWxpIG5vdHVudXogdmFyc2Egw7ZkZW1lIHNheWZhc8SxbmRhIGJlbGlydGViaWxpcnNpbml6LjwvbGk+DQoJCSAgPC91bD4NCgkJICA8L2Rpdj4NCiAgICAgICAgICA8P3BocCB9ID8+DQoJCQkNCgkJCQ0KCQkJDQoJCQkNCgkJCQ0KCQkJDQoJCQkNCgkJCQ0KCQkJDQogICAgICAgICAgPD9waHAgaWYgKCRyZXZpZXdfc3RhdHVzKSB7ID8+DQogICAgICAgICAgPGRpdiBjbGFzcz0icmF0aW5nIj4NCiAgICAgICAgICAgIDxwPg0KICAgICAgICAgICAgICA8P3BocCBmb3IgKCRpID0gMTsgJGkgPD0gNTsgJGkrKykgeyA/Pg0KICAgICAgICAgICAgICA8P3BocCBpZiAoJHJhdGluZyA8ICRpKSB7ID8+DQogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJmYSBmYS1zdGFjayI+PGkgY2xhc3M9ImZhIGZhLXN0YXItbyBmYS1zdGFjay0xeCI+PC9pPjwvc3Bhbj4NCiAgICAgICAgICAgICAgPD9waHAgfSBlbHNlIHsgPz4NCiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImZhIGZhLXN0YWNrIj48aSBjbGFzcz0iZmEgZmEtc3RhciBmYS1zdGFjay0xeCI+PC9pPjxpIGNsYXNzPSJmYSBmYS1zdGFyLW8gZmEtc3RhY2stMXgiPjwvaT48L3NwYW4+DQogICAgICAgICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgICAgICAgPD9waHAgfSA/Pg0KICAgICAgICAgICAgICA8YSBocmVmPSIiIG9uY2xpY2s9IiQoJ2FbaHJlZj1cJyN0YWItcmV2aWV3XCddJykudHJpZ2dlcignY2xpY2snKTsgcmV0dXJuIGZhbHNlOyI+PD9waHAgZWNobyAkcmV2aWV3czsgPz48L2E+IC8gPGEgaHJlZj0iIiBvbmNsaWNrPSIkKCdhW2hyZWY9XCcjdGFiLXJldmlld1wnXScpLnRyaWdnZXIoJ2NsaWNrJyk7IHJldHVybiBmYWxzZTsiPjw/cGhwIGVjaG8gJHRleHRfd3JpdGU7ID8+PC9hPjwvcD4NCiAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgICA8P3BocCBpZiAoJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdzaGFyZV9idXR0b25zX3N0YXR1cycpICYmICghSm91cm5hbDJDYWNoZTo6JG1vYmlsZV9kZXRlY3QtPmlzTW9iaWxlKCkgfHwgKEpvdXJuYWwyQ2FjaGU6OiRtb2JpbGVfZGV0ZWN0LT5pc01vYmlsZSgpICYmICEkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ3NoYXJlX2J1dHRvbnNfZGlzYWJsZV9vbl9tb2JpbGUnLCAxKSkpICYmICR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgnc2hhcmVfYnV0dG9uc19wb3NpdGlvbicpID09PSAncmlnaHQnICYmIGNvdW50KCR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgnY29uZmlnX3NoYXJlX2J1dHRvbnMnLCBhcnJheSgpKSkpOiA/Pg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic29jaWFsIHNoYXJlLXRoaXMgPD9waHAgZWNobyAkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ3NoYXJlX2J1dHRvbnNfZGlzYWJsZV9vbl9tb2JpbGUnLCAxKSA/ICdoaWRlLW9uLW1vYmlsZScgOiAnJzsgPz4iPg0KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzb2NpYWwtbG9hZGVkIj4NCiAgICAgICAgICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+dmFyIHN3aXRjaFRvNXg9dHJ1ZTs8L3NjcmlwdD4NCiAgICAgICAgICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3dzLnNoYXJldGhpcy5jb20vYnV0dG9uL2J1dHRvbnMuanMiPjwvc2NyaXB0Pg0KICAgICAgICAgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5zdExpZ2h0Lm9wdGlvbnMoe3B1Ymxpc2hlcjogIjw/cGhwIGVjaG8gJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdzaGFyZV9idXR0b25zX2FjY291bnRfa2V5Jyk7ID8+IiwgZG9Ob3RIYXNoOiB0cnVlLCBkb05vdENvcHk6IHRydWUsIGhhc2hBZGRyZXNzQmFyOiBmYWxzZX0pOzwvc2NyaXB0Pg0KICAgICAgICAgICAgICAgIDw/cGhwIGZvcmVhY2ggKCR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgnY29uZmlnX3NoYXJlX2J1dHRvbnMnLCBhcnJheSgpKSBhcyAkaXRlbSk6ID8+DQogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Ijw/cGhwIGVjaG8gJGl0ZW1bJ2NsYXNzJ10gLiAkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ3NoYXJlX2J1dHRvbnNfc3R5bGUnKTsgPz4iIGRpc3BsYXlUZXh0PSI8P3BocCBlY2hvICR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgnc2hhcmVfYnV0dG9uc19zdHlsZScpID8gJGl0ZW1bJ25hbWUnXSA6ICcnOyA/PiI+PC9zcGFuPg0KICAgICAgICAgICAgICAgIDw/cGhwIGVuZGZvcmVhY2g7ID8+DQogICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8P3BocCBlbmRpZjsgPz4NCiAgICAgICAgICAgIDw/cGhwIGZvcmVhY2ggKCR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgnYWRkaXRpb25hbF9wcm9kdWN0X2Rlc2NyaXB0aW9uX2JvdHRvbScsIGFycmF5KCkpIGFzICR0YWIpOiA/Pg0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iam91cm5hbC1jdXN0b20tdGFiIj4NCiAgICAgICAgICAgICAgPD9waHAgaWYgKCR0YWJbJ2hhc19pY29uJ10pOiA/Pg0KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJibG9jay1pY29uIGJsb2NrLWljb24tbGVmdCIgc3R5bGU9Ijw/cGhwIGVjaG8gJHRhYlsnaWNvbl9jc3MnXTsgPz4iPjw/cGhwIGVjaG8gJHRhYlsnaWNvbiddOyA/PjwvZGl2Pg0KICAgICAgICAgICAgICA8P3BocCBlbmRpZjsgPz4NCiAgICAgICAgICAgICAgPD9waHAgaWYgKCR0YWJbJ25hbWUnXSk6ID8+DQogICAgICAgICAgICAgIDxoMz48P3BocCBlY2hvICR0YWJbJ25hbWUnXTsgPz48L2gzPg0KICAgICAgICAgICAgICA8P3BocCBlbmRpZjsgPz4NCiAgICAgICAgICAgICAgPD9waHAgZWNobyAkdGFiWydjb250ZW50J107ID8+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDw/cGhwIGVuZGZvcmVhY2g7ID8+DQogICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgIDwvZGl2Pg0KICAgICAgICA8L2Rpdj4NCiAgICAgIDw/cGhwIGlmICgkdGFncykgeyA/Pg0KICAgICAgPHAgY2xhc3M9InRhZ3MiPjxiPjw/cGhwIGVjaG8gJHRleHRfdGFnczsgPz48L2I+DQogICAgICAgIDw/cGhwIGZvciAoJGkgPSAwOyAkaSA8IGNvdW50KCR0YWdzKTsgJGkrKykgeyA/Pg0KICAgICAgICA8P3BocCBpZiAoJGkgPCAoY291bnQoJHRhZ3MpIC0gMSkpIHsgPz4NCiAgICAgICAgPGEgaHJlZj0iPD9waHAgZWNobyAkdGFnc1skaV1bJ2hyZWYnXTsgPz4iPjw/cGhwIGVjaG8gJHRhZ3NbJGldWyd0YWcnXTsgPz48L2E+LA0KICAgICAgICA8P3BocCB9IGVsc2UgeyA/Pg0KICAgICAgICA8YSBocmVmPSI8P3BocCBlY2hvICR0YWdzWyRpXVsnaHJlZiddOyA/PiI+PD9waHAgZWNobyAkdGFnc1skaV1bJ3RhZyddOyA/PjwvYT4NCiAgICAgICAgPD9waHAgfSA/Pg0KICAgICAgICA8P3BocCB9ID8+DQogICAgICA8L3A+DQogICAgICA8P3BocCB9ID8+DQogICAgICA8P3BocCBpZiAoJHByb2R1Y3RzICYmICR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgncmVsYXRlZF9wcm9kdWN0c19zdGF0dXMnKSkgeyA/Pg0KICAgICAgPGRpdiBjbGFzcz0iYm94IHJlbGF0ZWQtcHJvZHVjdHMgPD9waHAgZWNobyAkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ3JlbGF0ZWRfcHJvZHVjdHNfY2Fyb3VzZWwnKSA/ICdqb3VybmFsLWNhcm91c2VsJyA6ICcnOyA/PiA8P3BocCBlY2hvICR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgncmVsYXRlZF9wcm9kdWN0c19jYXJvdXNlbCcpICYmICR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgncmVsYXRlZF9wcm9kdWN0c19jYXJvdXNlbF9hcnJvd3MnKSA9PT0gJ3RvcCcgPyAnYXJyb3dzLXRvcCcgOiAnJzsgPz4gPD9waHAgZWNobyAkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ3JlbGF0ZWRfcHJvZHVjdHNfY2Fyb3VzZWwnKSAmJiAkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ3JlbGF0ZWRfcHJvZHVjdHNfY2Fyb3VzZWxfYnVsbGV0cycpID8gJ2J1bGxldHMtb24nIDogJyc7ID8+Ij4NCiAgICAgICAgPGRpdj4NCiAgICAgICAgICA8ZGl2IGNsYXNzPSJib3gtaGVhZGluZyI+PD9waHAgZWNobyAkdGV4dF9yZWxhdGVkOyA/PjwvZGl2Pg0KICAgICAgICAgIDxkaXYgY2xhc3M9ImJveC1wcm9kdWN0IGJveC1jb250ZW50Ij4NCiAgICAgICAgICA8P3BocCBpZiAoJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdyZWxhdGVkX3Byb2R1Y3RzX2Nhcm91c2VsJykpOiA/Pg0KICAgICAgICAgIDxkaXYgY2xhc3M9InN3aXBlciI+DQogICAgICAgICAgPGRpdiBjbGFzcz0ic3dpcGVyLWNvbnRhaW5lciIgPD9waHAgZWNobyAkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ3J0bCcpID8gJ2Rpcj0icnRsIicgOiAnJzsgPz4+DQogICAgICAgICAgPGRpdiBjbGFzcz0ic3dpcGVyLXdyYXBwZXIiPg0KICAgICAgICAgIDw/cGhwIGVuZGlmOyA/Pg0KICAgICAgICAgICAgPD9waHAgZm9yZWFjaCAoJHByb2R1Y3RzIGFzICRwcm9kdWN0KSB7ID8+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9kdWN0LWdyaWQtaXRlbSBzd2lwZXItc2xpZGUgPD9waHAgZWNobyAkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ3JlbGF0ZWRfcHJvZHVjdHNfZ3JpZF9jbGFzc2VzJyk7ID8+IGRpc3BsYXktPD9waHAgZWNobyAkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ3Byb2R1Y3RfZ3JpZF93aXNobGlzdF9pY29uX2Rpc3BsYXknKTsgPz4gPD9waHAgZWNobyAkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ3Byb2R1Y3RfZ3JpZF9idXR0b25fYmxvY2tfYnV0dG9uJyk7ID8+Ij4NCiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icHJvZHVjdC10aHVtYiBwcm9kdWN0LXdyYXBwZXIgPD9waHAgZWNobyBpc3NldCgkcHJvZHVjdFsnbGFiZWxzJ10pICYmIGlzX2FycmF5KCRwcm9kdWN0WydsYWJlbHMnXSkgJiYgaXNzZXQoJHByb2R1Y3RbJ2xhYmVscyddWydvdXRvZnN0b2NrJ10pID8gJ291dG9mc3RvY2snIDogJyc7ID8+Ij4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbWFnZSA8P3BocCBlY2hvICR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgnc2hvd19jb3VudGRvd24nLCAnbmV2ZXInKSAhPT0gJ25ldmVyJyAmJiBpc3NldCgkcHJvZHVjdFsnZGF0ZV9lbmQnXSkgJiYgJHByb2R1Y3RbJ2RhdGVfZW5kJ10gPyAnaGFzLWNvdW50ZG93bicgOiAnJzsgPz4iPg0KICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iPD9waHAgZWNobyAkcHJvZHVjdFsnaHJlZiddOyA/PiIgPD9waHAgaWYoaXNzZXQoJHByb2R1Y3RbJ3RodW1iMiddKSAmJiAkcHJvZHVjdFsndGh1bWIyJ10pOiA/PiBjbGFzcz0iaGFzLXNlY29uZC1pbWFnZSIgc3R5bGU9ImJhY2tncm91bmQ6IHVybCgnPD9waHAgZWNobyAkcHJvZHVjdFsndGh1bWIyJ107ID8+Jykgbm8tcmVwZWF0OyIgPD9waHAgZW5kaWY7ID8+Pg0KICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz0iZmlyc3QtaW1hZ2UiIHNyYz0iPD9waHAgZWNobyAkcHJvZHVjdFsndGh1bWInXTsgPz4iIHRpdGxlPSI8P3BocCBlY2hvICRwcm9kdWN0WyduYW1lJ107ID8+IiBhbHQ9Ijw/cGhwIGVjaG8gJHByb2R1Y3RbJ25hbWUnXTsgPz4iIC8+DQogICAgICAgICAgICAgICAgICA8L2E+DQogICAgICAgICAgICAgICAgICA8P3BocCBpZiAoaXNzZXQoJHByb2R1Y3RbJ2xhYmVscyddKSAmJiBpc19hcnJheSgkcHJvZHVjdFsnbGFiZWxzJ10pKTogPz4NCiAgICAgICAgICAgICAgICAgIDw/cGhwIGZvcmVhY2ggKCRwcm9kdWN0WydsYWJlbHMnXSBhcyAkbGFiZWwgPT4gJG5hbWUpOiA/Pg0KICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxhYmVsLTw/cGhwIGVjaG8gJGxhYmVsOyA/PiI+PGI+PD9waHAgZWNobyAkbmFtZTsgPz48L2I+PC9zcGFuPg0KICAgICAgICAgICAgICAgICAgPD9waHAgZW5kZm9yZWFjaDsgPz4NCiAgICAgICAgICAgICAgICAgIDw/cGhwIGVuZGlmOyA/Pg0KICAgICAgICAgICAgICAgICAgPD9waHAgaWYoJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdwcm9kdWN0X2dyaWRfd2lzaGxpc3RfaWNvbl9wb3NpdGlvbicpID09PSAnaW1hZ2UnICYmICR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgncHJvZHVjdF9ncmlkX3dpc2hsaXN0X2ljb25fZGlzcGxheScsICcnKSA9PT0gJ2ljb24nKTogPz4NCiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Indpc2hsaXN0Ij48YSBvbmNsaWNrPSJhZGRUb1dpc2hMaXN0KCc8P3BocCBlY2hvICRwcm9kdWN0Wydwcm9kdWN0X2lkJ107ID8+Jyk7IiBjbGFzcz0iaGludC0tdG9wIiBkYXRhLWhpbnQ9Ijw/cGhwIGVjaG8gJGJ1dHRvbl93aXNobGlzdDsgPz4iPjxpIGNsYXNzPSJ3aXNobGlzdC1pY29uIj48L2k+PHNwYW4gY2xhc3M9ImJ1dHRvbi13aXNobGlzdC10ZXh0Ij48P3BocCBlY2hvICRidXR0b25fd2lzaGxpc3Q7Pz48L3NwYW4+PC9hPjwvZGl2Pg0KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29tcGFyZSI+PGEgb25jbGljaz0iYWRkVG9Db21wYXJlKCc8P3BocCBlY2hvICRwcm9kdWN0Wydwcm9kdWN0X2lkJ107ID8+Jyk7IiBjbGFzcz0iaGludC0tdG9wIiBkYXRhLWhpbnQ9Ijw/cGhwIGVjaG8gJGJ1dHRvbl9jb21wYXJlOyA/PiI+PGkgY2xhc3M9ImNvbXBhcmUtaWNvbiI+PC9pPjxzcGFuIGNsYXNzPSJidXR0b24tY29tcGFyZS10ZXh0Ij48P3BocCBlY2hvICRidXR0b25fY29tcGFyZTs/Pjwvc3Bhbj48L2E+PC9kaXY+DQogICAgICAgICAgICAgICAgICA8P3BocCBlbmRpZjsgPz4NCiAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwcm9kdWN0LWRldGFpbHMiPg0KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FwdGlvbiI+DQogICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz0ibmFtZSI+PGEgaHJlZj0iPD9waHAgZWNobyAkcHJvZHVjdFsnaHJlZiddOyA/PiI+PD9waHAgZWNobyAkcHJvZHVjdFsnbmFtZSddOyA/PjwvYT48L2g0Pg0KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZGVzY3JpcHRpb24iPjw/cGhwIGVjaG8gJHByb2R1Y3RbJ2Rlc2NyaXB0aW9uJ107ID8+PC9wPg0KICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoJHByb2R1Y3RbJ3JhdGluZyddKSB7ID8+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJhdGluZyI+DQogICAgICAgICAgICAgICAgICAgICAgPD9waHAgZm9yICgkaSA9IDE7ICRpIDw9IDU7ICRpKyspIHsgPz4NCiAgICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoJHByb2R1Y3RbJ3JhdGluZyddIDwgJGkpIHsgPz4NCiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZmEgZmEtc3RhY2siPjxpIGNsYXNzPSJmYSBmYS1zdGFyLW8gZmEtc3RhY2stMngiPjwvaT48L3NwYW4+DQogICAgICAgICAgICAgICAgICAgICAgPD9waHAgfSBlbHNlIHsgPz4NCiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZmEgZmEtc3RhY2siPjxpIGNsYXNzPSJmYSBmYS1zdGFyIGZhLXN0YWNrLTJ4Ij48L2k+PGkgY2xhc3M9ImZhIGZhLXN0YXItbyBmYS1zdGFjay0yeCI+PC9pPjwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgICAgICAgICAgICAgPD9waHAgfSA/Pg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPD9waHAgfSA/Pg0KICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoJHByb2R1Y3RbJ3ByaWNlJ10pIHsgPz4NCiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9InByaWNlIj4NCiAgICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoISRwcm9kdWN0WydzcGVjaWFsJ10pIHsgPz4NCiAgICAgICAgICAgICAgICAgICAgICA8P3BocCBlY2hvICRwcm9kdWN0WydwcmljZSddOyA/Pg0KICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gZWxzZSB7ID8+DQogICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InByaWNlLW9sZCI+PD9waHAgZWNobyAkcHJvZHVjdFsncHJpY2UnXTsgPz48L3NwYW4+IDxzcGFuIGNsYXNzPSJwcmljZS1uZXciIDw/cGhwIGVjaG8gaXNzZXQoJHByb2R1Y3RbJ2RhdGVfZW5kJ10pICYmICRwcm9kdWN0WydkYXRlX2VuZCddID8gImRhdGEtZW5kLWRhdGU9J3skcHJvZHVjdFsnZGF0ZV9lbmQnXX0nIiA6ICIiOyA/Pj48P3BocCBlY2hvICRwcm9kdWN0WydzcGVjaWFsJ107ID8+PC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoJHByb2R1Y3RbJ3RheCddKSB7ID8+DQogICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InByaWNlLXRheCI+PD9waHAgZWNobyAkdGV4dF90YXg7ID8+IDw/cGhwIGVjaG8gJHByb2R1Y3RbJ3RheCddOyA/Pjwvc3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICA8P3BocCB9ID8+DQogICAgICAgICAgICAgICAgICAgIDwvcD4NCiAgICAgICAgICAgICAgICAgICAgPD9waHAgfSA/Pg0KICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJidXR0b24tZ3JvdXAiPg0KICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoSm91cm5hbDJVdGlsczo6aXNFbnF1aXJ5UHJvZHVjdCgkdGhpcywgJHByb2R1Y3QpKTogPz4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2FydCBlbnF1aXJ5LWJ1dHRvbiI+DQogICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDpKb3VybmFsLm9wZW5Qb3B1cCgnPD9waHAgZWNobyAkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ2VucXVpcnlfcG9wdXBfY29kZScpOyA/PicsICc8P3BocCBlY2hvICRwcm9kdWN0Wydwcm9kdWN0X2lkJ107ID8+Jyk7IiBkYXRhLWNsaz0iYWRkVG9DYXJ0KCc8P3BocCBlY2hvICRwcm9kdWN0Wydwcm9kdWN0X2lkJ107ID8+Jyk7IiBjbGFzcz0iYnV0dG9uIGhpbnQtLXRvcCIgZGF0YS1oaW50PSI8P3BocCBlY2hvICR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgnZW5xdWlyeV9idXR0b25fdGV4dCcpOyA/PiI+PD9waHAgZWNobyAkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ2VucXVpcnlfYnV0dG9uX2ljb24nKSAuICc8c3BhbiBjbGFzcz0iYnV0dG9uLWNhcnQtdGV4dCI+JyAuICR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgnZW5xdWlyeV9idXR0b25fdGV4dCcpIC4gJzwvc3Bhbj4nOyA/PjwvYT4NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDw/cGhwIGVsc2U6ID8+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcnQgPD9waHAgZWNobyBpc3NldCgkcHJvZHVjdFsnbGFiZWxzJ10pICYmIGlzX2FycmF5KCRwcm9kdWN0WydsYWJlbHMnXSkgJiYgaXNzZXQoJHByb2R1Y3RbJ2xhYmVscyddWydvdXRvZnN0b2NrJ10pID8gJ291dG9mc3RvY2snIDogJyc7ID8+Ij4NCiAgICAgICAgICAgICAgICAgICAgICA8YSBvbmNsaWNrPSJhZGRUb0NhcnQoJzw/cGhwIGVjaG8gJHByb2R1Y3RbJ3Byb2R1Y3RfaWQnXTsgPz4nKTsiIGNsYXNzPSJidXR0b24gaGludC0tdG9wIiBkYXRhLWhpbnQ9Ijw/cGhwIGVjaG8gJGJ1dHRvbl9jYXJ0OyA/PiI+PGkgY2xhc3M9ImJ1dHRvbi1sZWZ0LWljb24iPjwvaT48c3BhbiBjbGFzcz0iYnV0dG9uLWNhcnQtdGV4dCI+PD9waHAgZWNobyAkYnV0dG9uX2NhcnQ7ID8+PC9zcGFuPjxpIGNsYXNzPSJidXR0b24tcmlnaHQtaWNvbiI+PC9pPjwvYT4NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDw/cGhwIGVuZGlmOyA/Pg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3aXNobGlzdCI+PGEgb25jbGljaz0iYWRkVG9XaXNoTGlzdCgnPD9waHAgZWNobyAkcHJvZHVjdFsncHJvZHVjdF9pZCddOyA/PicpOyIgY2xhc3M9ImhpbnQtLXRvcCIgZGF0YS1oaW50PSI8P3BocCBlY2hvICRidXR0b25fd2lzaGxpc3Q7ID8+Ij48aSBjbGFzcz0id2lzaGxpc3QtaWNvbiI+PC9pPjxzcGFuIGNsYXNzPSJidXR0b24td2lzaGxpc3QtdGV4dCI+PD9waHAgZWNobyAkYnV0dG9uX3dpc2hsaXN0Oz8+PC9zcGFuPjwvYT48L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29tcGFyZSI+PGEgb25jbGljaz0iYWRkVG9Db21wYXJlKCc8P3BocCBlY2hvICRwcm9kdWN0Wydwcm9kdWN0X2lkJ107ID8+Jyk7IiBjbGFzcz0iaGludC0tdG9wIiBkYXRhLWhpbnQ9Ijw/cGhwIGVjaG8gJGJ1dHRvbl9jb21wYXJlOyA/PiI+PGkgY2xhc3M9ImNvbXBhcmUtaWNvbiI+PC9pPjxzcGFuIGNsYXNzPSJidXR0b24tY29tcGFyZS10ZXh0Ij48P3BocCBlY2hvICRidXR0b25fY29tcGFyZTs/Pjwvc3Bhbj48L2E+PC9kaXY+DQogICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDw/cGhwIH0gPz4NCiAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICA8P3BocCBpZiAoJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdyZWxhdGVkX3Byb2R1Y3RzX2Nhcm91c2VsJykgJiYgJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdyZWxhdGVkX3Byb2R1Y3RzX2Nhcm91c2VsX2Fycm93cycpICE9PSAnbm9uZScpOiA/Pg0KICAgICAgICAgIDxkaXYgY2xhc3M9InN3aXBlci1idXR0b24tbmV4dCI+PC9kaXY+DQogICAgICAgICAgPGRpdiBjbGFzcz0ic3dpcGVyLWJ1dHRvbi1wcmV2Ij48L2Rpdj4NCiAgICAgICAgICA8P3BocCBlbmRpZjsgPz4NCiAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICA8P3BocCBpZiAoJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdyZWxhdGVkX3Byb2R1Y3RzX2Nhcm91c2VsJykgJiYgJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdyZWxhdGVkX3Byb2R1Y3RzX2Nhcm91c2VsX2J1bGxldHMnKSk6ID8+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzd2lwZXItcGFnaW5hdGlvbiI+PC9kaXY+DQogICAgICAgICAgPD9waHAgZW5kaWY7ID8+DQogICAgICAgICAgPC9kaXY+DQogICAgICAgIDwvZGl2Pg0KICAgICAgPC9kaXY+DQogICAgICA8P3BocCAvKiBlbmFibGUgY291bnRkb3duICovID8+DQogICAgICA8P3BocCBpZiAoJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdzaG93X2NvdW50ZG93bicsICduZXZlcicpICE9PSAnbmV2ZXInKTogPz4NCiAgICAgIDxzY3JpcHQ+DQogICAgICAgICQoJy5yZWxhdGVkLXByb2R1Y3RzIC5wcm9kdWN0LWdyaWQtaXRlbSA+IGRpdicpLmVhY2goZnVuY3Rpb24gKCkgew0KICAgICAgICAgIHZhciAkbmV3ID0gJCh0aGlzKS5maW5kKCcucHJpY2UtbmV3Jyk7DQogICAgICAgICAgaWYgKCRuZXcubGVuZ3RoICYmICRuZXcuYXR0cignZGF0YS1lbmQtZGF0ZScpKSB7DQogICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy5pbWFnZScpLmFwcGVuZCgnPGRpdiBjbGFzcz0iY291bnRkb3duIj48L2Rpdj4nKTsNCiAgICAgICAgICB9DQogICAgICAgICAgSm91cm5hbC5jb3VudGRvd24oJCh0aGlzKS5maW5kKCcuY291bnRkb3duJyksICRuZXcuYXR0cignZGF0YS1lbmQtZGF0ZScpKTsNCiAgICAgICAgfSk7DQogICAgICA8L3NjcmlwdD4NCiAgICAgIDw/cGhwIGVuZGlmOyA/Pg0KICAgICAgPD9waHAgaWYgKCR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgncmVsYXRlZF9wcm9kdWN0c19jYXJvdXNlbCcpKTogPz4NCiAgICAgIDw/cGhwDQogICAgICAkZ3JpZCA9IEpvdXJuYWwyVXRpbHM6OmdldEl0ZW1HcmlkKCR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgncmVsYXRlZF9wcm9kdWN0c19pdGVtc19wZXJfcm93JyksICR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgnc2l0ZV93aWR0aCcsIDEwMjQpLCAkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ2NvbmZpZ19jb2x1bW5zX2NvdW50JykpOw0KICAgICAgJGdyaWQgPSBhcnJheSgNCiAgICAgICAgICBhcnJheSgwLCAoaW50KSRncmlkWyd4cyddKSwNCiAgICAgICAgICBhcnJheSg0NzAsIChpbnQpJGdyaWRbJ3NtJ10pLA0KICAgICAgICAgIGFycmF5KDc2MCwgKGludCkkZ3JpZFsnbWQnXSksDQogICAgICAgICAgYXJyYXkoOTgwLCAoaW50KSRncmlkWydsZyddKSwNCiAgICAgICAgICBhcnJheSgxMTAwLCAoaW50KSRncmlkWyd4bCddKSwNCiAgICAgICk7DQogICAgICA/Pg0KICAgICAgPHNjcmlwdD4NCiAgICAgICAgKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICB2YXIgZ3JpZCA9ICQucGFyc2VKU09OKCc8P3BocCBlY2hvIGpzb25fZW5jb2RlKCRncmlkKTsgPz4nKTsNCg0KICAgICAgICAgICAgdmFyIGJyZWFrcG9pbnRzID0gew0KICAgICAgICAgICAgNDcwOiB7DQogICAgICAgICAgICAgIHNsaWRlc1BlclZpZXc6IGdyaWRbMF1bMV0sDQogICAgICAgICAgICAgIHNsaWRlc1Blckdyb3VwOiBncmlkWzBdWzFdDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgNzYwOiB7DQogICAgICAgICAgICAgIHNsaWRlc1BlclZpZXc6IGdyaWRbMV1bMV0sDQogICAgICAgICAgICAgIHNsaWRlc1Blckdyb3VwOiBncmlkWzFdWzFdDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgOTgwOiB7DQogICAgICAgICAgICAgIHNsaWRlc1BlclZpZXc6IGdyaWRbMl1bMV0sDQogICAgICAgICAgICAgIHNsaWRlc1Blckdyb3VwOiBncmlkWzJdWzFdDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgMTIyMDogew0KICAgICAgICAgICAgICBzbGlkZXNQZXJWaWV3OiBncmlkWzNdWzFdLA0KICAgICAgICAgICAgICBzbGlkZXNQZXJHcm91cDogZ3JpZFszXVsxXQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH07DQoNCiAgICAgICAgICB2YXIgb3B0cyA9IHsNCiAgICAgICAgICAgIHNsaWRlc1BlclZpZXc6IGdyaWRbNF1bMV0sDQogICAgICAgICAgICBzbGlkZXNQZXJHcm91cDogZ3JpZFs0XVsxXSwNCiAgICAgICAgICAgIGJyZWFrcG9pbnRzOiBicmVha3BvaW50cywNCiAgICAgICAgICAgIHNwYWNlQmV0d2VlbjogcGFyc2VJbnQoJzw/cGhwIGVjaG8gJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdwcm9kdWN0X2dyaWRfaXRlbV9zcGFjaW5nJywgJzIwJyk7ID8+JywgMTApLA0KICAgICAgICAgICAgcGFnaW5hdGlvbjogPD9waHAgZWNobyAkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ3JlbGF0ZWRfcHJvZHVjdHNfY2Fyb3VzZWxfYnVsbGV0cycpID8gJyQoXCcucmVsYXRlZC1wcm9kdWN0cyAuc3dpcGVyLXBhZ2luYXRpb25cJyknIDogJ2ZhbHNlJzsgPz4sDQogICAgICAgICAgICBwYWdpbmF0aW9uQ2xpY2thYmxlOiB0cnVlLA0KICAgICAgICAgICAgbmV4dEJ1dHRvbjogPD9waHAgZWNobyAkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ3JlbGF0ZWRfcHJvZHVjdHNfY2Fyb3VzZWxfYXJyb3dzJykgIT09ICdub25lJyA/ICckKFwnLnJlbGF0ZWQtcHJvZHVjdHMgLnN3aXBlci1idXR0b24tbmV4dFwnKScgOiAnZmFsc2UnOyA/PiwNCiAgICAgICAgICAgIHByZXZCdXR0b246IDw/cGhwIGVjaG8gJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdyZWxhdGVkX3Byb2R1Y3RzX2Nhcm91c2VsX2Fycm93cycpICE9PSAnbm9uZScgPyAnJChcJy5yZWxhdGVkLXByb2R1Y3RzIC5zd2lwZXItYnV0dG9uLXByZXZcJyknIDogJ2ZhbHNlJzsgPz4sDQogICAgICAgICAgICBhdXRvcGxheTogPD9waHAgZWNobyAkdGhpcy0+am91cm5hbDItPnNldHRpbmdzLT5nZXQoJ3JlbGF0ZWRfcHJvZHVjdHNfY2Fyb3VzZWxfYXV0b3BsYXknKSA+IDAgPyA0MDAwIDogJ2ZhbHNlJzsgPz4sDQogICAgICAgICAgICBhdXRvcGxheVN0b3BPbkhvdmVyOiA8P3BocCBlY2hvICR0aGlzLT5qb3VybmFsMi0+c2V0dGluZ3MtPmdldCgncmVsYXRlZF9wcm9kdWN0c19jYXJvdXNlbF9wYXVzZV9vbl9ob3ZlcicpID8gJ3RydWUnIDogJ2ZhbHNlJzsgPz4sDQogICAgICAgICAgICBzcGVlZDogNDAwLA0KICAgICAgICAgICAgdG91Y2hFdmVudHNUYXJnZXQ6IDw/cGhwIGVjaG8gJHRoaXMtPmpvdXJuYWwyLT5zZXR0aW5ncy0+Z2V0KCdyZWxhdGVkX3Byb2R1Y3RzX2Nhcm91c2VsX3RvdWNoZHJhZycpICA/ICdcJ2NvbnRhaW5lclwnJyA6ICdmYWxzZSc7ID8+LA0KICAgICAgICAgIH07DQoNCiAgICAgICAgICAkKCcucmVsYXRlZC1wcm9kdWN0cyAuc3dpcGVyLWNvbnRhaW5lcicpLnN3aXBlcihvcHRzKTsNCiAgICAgICAgfSkoKTsNCiAgICAgIDwvc2NyaXB0Pg0KICAgICAgPD9waHAgZW5kaWY7ID8+DQogICAgICA8P3BocCB9ID8+DQogICAgICA8P3BocCBlY2hvICRjb250ZW50X2JvdHRvbTsgPz48L2Rpdj4NCiAgICA8L2Rpdj4NCjwvZGl2Pg0KICAgIA0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwhLS0NCiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgew0KICAgICQoIi5mYW5jeWJveCIpLmZhbmN5Ym94KCk7DQp9KTsNCiAgICAkKCdbZGF0YS1zYXlmYV0nKS5oaWRlKCk7DQogICAgJCgnW2RhdGEtc2F5ZmE9IjEiXScpLnNob3coKTsNCiAgICB2YXIgc2F5ZmEgPSAxOw0KICAgICQoJyNzYXlmYS1ubycpLnZhbChzYXlmYSk7DQogICAgJCgnI29uY2VraS1zYXlmYScpLmhpZGUoKTsNCg0KICAgIHZhciBpdGVtcyA9IHt9Ow0KICAgICQoJ2RpdltkYXRhLXNheWZhXScpLmVhY2goZnVuY3Rpb24oKSB7DQogICAgICAgIGl0ZW1zWyQodGhpcykuYXR0cignZGF0YS1zYXlmYScpXSA9IHRydWU7DQogICAgfSk7DQoNCiAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5KCk7DQogICAgZm9yKHZhciBpIGluIGl0ZW1zKQ0KICAgIHsNCiAgICAgICAgcmVzdWx0LnB1c2goaSk7DQogICAgfQ0KICAgIHZhciB0b3RhbFBhZ2VzID0gcmVzdWx0Lmxlbmd0aDsNCg0KICAgIGZ1bmN0aW9uIHNvbnJha2koKSB7DQovKg0KICAgICAgICA8P3BocCBpZiAoJG9wdGlvbnMpIHsgPz4NCiAgICAgICAgPD9waHAgZm9yZWFjaCAoJG9wdGlvbnMgYXMgJG9wdGlvbikgeyA/Pg0KICAgICAgICA8P3BocCBpZiAoJG9wdGlvblsndHlwZSddID09ICdyYWRpbycpIHsgPz4NCg0KICAgICAgICAgICAgICAgIHZhciAgdmVyaSA9ICQoJ2lucHV0W25hbWU9Im9wdGlvbls8P3BocCBlY2hvICRvcHRpb25bJ3Byb2R1Y3Rfb3B0aW9uX2lkJ107ID8+XSJdOmNoZWNrZWQnKS5sZW5ndGg7DQogICAgICAgICAgICAgICAgICAgIGlmIChzYXlmYSA9PSA8P3BocCBlY2hvICRvcHRpb25bJ3NheWZhJ107ID8+KQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodmVyaSA9PSAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoIkRpa2thdCEgTMO8dGZlbiB6b3J1bmx1IGFsYW5sYXLEsSBib8WfIGLEsXJha21hecSxbsSxei4iKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgPD9waHAgfSB9IH0gPz4NCiovDQogICAgICAgIGlmICh0b3RhbFBhZ2VzICE9IHNheWZhKXsNCiAgICAgICAgICAgICQoJyNvbmNla2ktc2F5ZmEnKS5zaG93KCk7DQogICAgICAgICAgICAkKCdbZGF0YS1zYXlmYT0iJyArIHNheWZhICsgJyJdJykuaGlkZSgpOw0KICAgICAgICAgICAgJCgnW2RhdGEtc2F5ZmE9IicgKyggIHNheWZhICsgMSApKyAnIl0nKS5zaG93KCk7DQogICAgICAgICAgIHNheWZhKys7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAodG90YWxQYWdlcyA9PSBzYXlmYSkgew0KICAgICAgICAgICAgJCgnI3NvbnJha2ktc2F5ZmEnKS5oaWRlKCk7DQogICAgICAgICAgICAkKCcjc2VwZXRlLWVrbGUnKS5zaG93KCk7DQoNCiAgICAgICAgfQ0KICAgIH0NCg0KDQoNCiAgICBmdW5jdGlvbiBvbmNla2koKXsNCiAgICAgICAgaWYgKHNheWZhICE9IDEpIHsNCiAgICAgICAgICAgICQoJyNzb25yYWtpLXNheWZhJykuc2hvdygpOw0KICAgICAgICAgICAgJCgnW2RhdGEtc2F5ZmE9IicgKyBzYXlmYSArICciXScpLmhpZGUoKTsNCiAgICAgICAgICAgICQoJ1tkYXRhLXNheWZhPSInICsgKHNheWZhIC0gMSkgKyAnIl0nKS5zaG93KCk7DQogICAgICAgICAgICBzYXlmYS0tOw0KICAgICAgICAgICAgJCgnI3NlcGV0ZS1la2xlJykuaGlkZSgpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKHNheWZhID09IDEpDQogICAgICAgICAgICAkKCcjb25jZWtpLXNheWZhJykuaGlkZSgpOw0KICAgIH0NCg0KDQovLy0tPjwvc2NyaXB0Pg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwhLS0NCg0KZnVuY3Rpb24gcG9wdXBfYWMoKXsNCiAgICB2YXIgc2VuID0gJCgnI3NlbicpLnZhbCgpOw0KICAgIHZhciBzYm95ID0gJCgnI3Nib3knKS52YWwoKTsNCiAgICB2YXIgZW4gPSAkKCcjcGVuJykudmFsKCk7DQogICAgdmFyIGJveSA9ICQoJyNwYm95JykudmFsKCk7DQogICAgdmFyIGViYXQgPSAkKCcjcGViYXQnKS52YWwoKTsNCiAgICANCiAgICAgICAgaWYgKHNlbiA8IDEpIHsNCiAgICAgICAgICAgIGFsZXJ0KCI8P3BocCBlY2hvICRlbnRyeV91eWFyaWVuOyA/PiIpOw0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9IGVsc2UgaWYgKHNib3kgPCAxKSB7DQoJCQlhbGVydCgiPD9waHAgZWNobyAkZW50cnlfdXlhcmlib3k7ID8+Iik7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CQ0KCQl9IGVsc2UgaWYgKGVuIDwgMSkgew0KCQkJYWxlcnQoIjw/cGhwIGVjaG8gJGVudHJ5X3V5YXJpZW47ID8+Iik7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CQ0KCQl9IGVsc2UgaWYgKGJveSA8IDEpIHsNCgkJCWFsZXJ0KCI8P3BocCBlY2hvICRlbnRyeV91eWFyaWVuOyA/PiIpOw0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwkNCgkJfWVsc2UgaWYgKGViYXQgPCAxKSB7DQoJCQlhbGVydCgiPD9waHAgZWNobyAkZW50cnlfdXlhcmllYmF0OyA/PiIpOw0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwkNCgkJfWVsc2V7DQoJCQkNCgkJCTw/cGhwIGlmIChpc3NldCgkb3B0aW9uKSkgeyA/Pg0KCQkJCQkJCQkJDQoJCQkJCWlmICgkKCJbbmFtZT0nb3B0aW9uWzw/cGhwIGVjaG8gJGhhdGFfaWRfbGVyWzBdOyA/Pl0nXSIpLnZhbCgpID09IiIpew0KCQkJCQkJYWxlcnQoIjw/cGhwIGVjaG8gJGVudHJ5X21vbnRhanl1a3Nla2xpZ2l1eWFyaTsgPz4iKTsNCiAgICAgICAgICAgIAkJCXJldHVybiBmYWxzZTsNCgkJCQkJfWVsc2UgaWYgKCQoIltuYW1lPSdvcHRpb25bPD9waHAgZWNobyAkaGF0YV9pZF9sZXJbMV07ID8+XSddIikudmFsKCkgPT0iIil7DQoJCQkJCQlhbGVydCgiPD9waHAgZWNobyAkZW50cnlfcGVyZGVjZXJjZXZldXlhcmk7ID8+Iik7DQogICAgICAgICAgICAJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCX1lbHNlIGlmICgkKCJbbmFtZT0nb3B0aW9uWzw/cGhwIGVjaG8gJGhhdGFfaWRfbGVyWzJdOyA/Pl0nXSIpLnZhbCgpID09IiIpew0KCQkJCQkJYWxlcnQoIjw/cGhwIGVjaG8gJGVudHJ5X25lcmV5ZXRha2lsYWNha3V5YXJpOyA/PiIpOw0KICAgICAgICAgICAgCQkJcmV0dXJuIGZhbHNlOw0KCQkJCQl9ZWxzZSBpZiAoJCgiW25hbWU9J29wdGlvbls8P3BocCBlY2hvICRoYXRhX2lkX2xlclszXTsgPz5dJ10iKS52YWwoKSA9PSIiKXsNCgkJCQkJCWFsZXJ0KCI8P3BocCBlY2hvICRlbnRyeV9kaWdlcnBlcmRldXlhcmk7ID8+Iik7DQogICAgICAgICAgICAJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCS8vfWVsc2UgaWYgKCQoIltuYW1lPSdvcHRpb25bPD9waHAgZWNobyAkaGF0YV9pZF9sZXJbNF07ID8+XSddIikudmFsKCkgPT0iIil7DQoJCQkJCQkvL2FsZXJ0KCJEacSfZXIgUGVyZGUgQmlsZ2lzaW5pIGdpcm1lZGluaXoiKTsNCiAgICAgICAgICAgIAkJCS8vcmV0dXJuIGZhbHNlOw0KCQkJCQl9ZWxzZXsNCgkJCQkJCTw/cGhwIGlmICgkcG9wdXBfYWNfbmV3KSB7ID8+DQoJCQkNCiAgICAgICAgICAgCQkJCQkkKCcuZmFuY3lib3gnKS50cmlnZ2VyKCdjbGljaycpOw0KCQkJCSAJCQkkKCcjc3RpY2t5LXdyYXBwZXInKS5yZW1vdmVDbGFzcygnc3RpY2t5LXdyYXBwZXInKTsNCgkJCQkJCTw/cGhwIH1lbHNleyA/Pg0KCQkJCQkJCXNlcGV0ZUVrbGUoKTsNCgkJCQkJCTw/cGhwIH0gPz4NCgkJCQkJfQ0KICAgICAgICAgICAgPD9waHAgfWVsc2V7ID8+DQoJCQkJc2VwZXRlRWtsZSgpOw0KCQkJPD9waHAgfSA/Pg0KCQl9DQoJCQ0KICAgICAgIA0KICANCn0NCg0KZnVuY3Rpb24gc2VwZXRlRWtsZSgpew0KICAgICAgICAkLmFqYXgoew0KICAgICAgICAgICAgdXJsOiAnaW5kZXgucGhwP3JvdXRlPWNoZWNrb3V0L2NhcnQvYWRkJywNCiAgICAgICAgICAgIHR5cGU6ICdwb3N0JywNCiAgICAgICAgICAgIGRhdGE6ICQoJyNwcm9kdWN0IGlucHV0W3R5cGU9XCd0ZXh0XCddLCAjZmFuY3lib3gtd3JhcCBpbnB1dFt0eXBlPVwndGV4dFwnXSwgI2ZhbmN5Ym94LXdyYXAgaW5wdXRbdHlwZT1cJ3JhZGlvXCddOmNoZWNrZWQsICNwcm9kdWN0IGlucHV0W3R5cGU9XCdoaWRkZW5cJ10sICNwcm9kdWN0IGlucHV0W3R5cGU9XCdyYWRpb1wnXTpjaGVja2VkLCAjcHJvZHVjdCBpbnB1dFt0eXBlPVwnY2hlY2tib3hcJ106Y2hlY2tlZCwgI3Byb2R1Y3Qgc2VsZWN0LCAjcHJvZHVjdCB0ZXh0YXJlYScpLA0KICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJywNCiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGpzb24pIHsNCiAgICAgICAgICAgICAgICAkKCcuc3VjY2VzcywgLndhcm5pbmcsIC5hdHRlbnRpb24sIGluZm9ybWF0aW9uLCAuZXJyb3InKS5yZW1vdmUoKTsNCg0KICAgICAgICAgICAgICAgIGlmIChqc29uWydlcnJvciddKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChqc29uWydlcnJvciddWydvcHRpb24nXSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpIGluIGpzb25bJ2Vycm9yJ11bJ29wdGlvbiddKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI29wdGlvbi0nICsgaSkuYWZ0ZXIoJzxzcGFuIGNsYXNzPSJlcnJvciI+JyArIGpzb25bJ2Vycm9yJ11bJ29wdGlvbiddW2ldICsgJzwvc3Bhbj4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIGlmIChqc29uWydlcnJvciddWydwcm9maWxlJ10pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICQoJ3NlbGVjdFtuYW1lPSJwcm9maWxlX2lkIl0nKS5hZnRlcignPHNwYW4gY2xhc3M9ImVycm9yIj4nICsganNvblsnZXJyb3InXVsncHJvZmlsZSddICsgJzwvc3Bhbj4nKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmIChqc29uWydzdWNjZXNzJ10pIHsNCgkJCQkJDQoJCQkJCQ0KCQkJCQkNCgkJCQkJDQogICAgICAgICAgICAgICAgICAgJCgiI0dlcmlEb24iKS50cmlnZ2VyKCJjbGljayIpOw0KLyoNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFKb3VybmFsLnNob3dOb3RpZmljYXRpb24oanNvblsnc3VjY2VzcyddLCBqc29uWydpbWFnZSddKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJCgnI25vdGlmaWNhdGlvbicpLmh0bWwoJzxkaXYgY2xhc3M9InN1Y2Nlc3MiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+JyArIGpzb25bJ3N1Y2Nlc3MnXSArICc8aW1nIHNyYz0iY2F0YWxvZy92aWV3L3RoZW1lL2RlZmF1bHQvaW1hZ2UvY2xvc2UucG5nIiBhbHQ9IiIgY2xhc3M9ImNsb3NlIiAvPjwvZGl2PicpOw0KICAgICAgICAgICAgICAgICAgICB9DQoqLw0KICAgICAgICAgICAgICAgICAgICAvLyQoJyNmYmZhbmN5Qm94JykuaGlkZSgpOw0KICAgICAgICAgICAgICAgICAgICAkKCcuc3VjY2VzcycpLmZhZGVJbignc2xvdycpOw0KDQogICAgICAgICAgICAgICAgICAgICQoJyNjYXJ0LXRvdGFsJykuaHRtbChqc29uWyd0b3RhbCddKTsNCgkJCQkJLy93aW5kb3cubG9jYXRpb24gPSAnaW5kZXgucGhwP3JvdXRlPWNoZWNrb3V0L2NhcnQnOw0KICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiA9ICdpbmRleC5waHA/cm91dGU9Y2hlY2tvdXQvY2FydCc7DQoJCQkJLyoNCiAgICAgICAgICAgICAgICAgICAgaWYgKGpzb25bJ3JlZGlyZWN0J10pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uID0ganNvblsncmVkaXJlY3QnXTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KCQkJCQkqLw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQp9DQoNCiAgICAkKCcjc2VwZXRlLWVrbGUnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uKCkgew0KCQ0KICAgICAgICBpZiAoJCgnLmhpZGUtY2FydCAucmlnaHQgLmNhcnQub3V0b2ZzdG9jaycpLmxlbmd0aCkgeyByZXR1cm4gZmFsc2U7ICB9DQoJCQ0KICAgICAgICAkLmFqYXgoew0KICAgICAgICAgICAgdXJsOiAnaW5kZXgucGhwP3JvdXRlPWNoZWNrb3V0L2NhcnQvYWRkJywNCiAgICAgICAgICAgIHR5cGU6ICdwb3N0JywNCiAgICAgICAgICAgIGRhdGE6ICQoJyNwcm9kdWN0IGlucHV0W3R5cGU9XCd0ZXh0XCddLCAjc2VjZW5la2xlciBpbnB1dFt0eXBlPVwndGV4dFwnXSwgI3NlY2VuZWtsZXIgaW5wdXRbdHlwZT1cJ3JhZGlvXCddOmNoZWNrZWQsICNzZWNlbmVrbGVyMiBpbnB1dFt0eXBlPVwndGV4dFwnXSwgI3NlY2VuZWtsZXIyIGlucHV0W3R5cGU9XCdyYWRpb1wnXTpjaGVja2VkLCAjcHJvZHVjdCBpbnB1dFt0eXBlPVwnaGlkZGVuXCddLCAjcHJvZHVjdCBpbnB1dFt0eXBlPVwncmFkaW9cJ106Y2hlY2tlZCwgI3Byb2R1Y3QgaW5wdXRbdHlwZT1cJ2NoZWNrYm94XCddOmNoZWNrZWQsICNwcm9kdWN0IHNlbGVjdCwgI3Byb2R1Y3QgdGV4dGFyZWEnKSwNCiAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsDQogICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihqc29uKSB7DQogICAgICAgICAgICAgICAgJCgnLnN1Y2Nlc3MsIC53YXJuaW5nLCAuYXR0ZW50aW9uLCBpbmZvcm1hdGlvbiwgLmVycm9yJykucmVtb3ZlKCk7DQoNCiAgICAgICAgICAgICAgICBpZiAoanNvblsnZXJyb3InXSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoanNvblsnZXJyb3InXVsnb3B0aW9uJ10pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSBpbiBqc29uWydlcnJvciddWydvcHRpb24nXSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNvcHRpb24tJyArIGkpLmFmdGVyKCc8c3BhbiBjbGFzcz0iZXJyb3IiPicgKyBqc29uWydlcnJvciddWydvcHRpb24nXVtpXSArICc8L3NwYW4+Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICBpZiAoanNvblsnZXJyb3InXVsncHJvZmlsZSddKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkKCdzZWxlY3RbbmFtZT0icHJvZmlsZV9pZCJdJykuYWZ0ZXIoJzxzcGFuIGNsYXNzPSJlcnJvciI+JyArIGpzb25bJ2Vycm9yJ11bJ3Byb2ZpbGUnXSArICc8L3NwYW4+Jyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAoanNvblsnc3VjY2VzcyddKSB7DQoNCiAgICAgICAgICAgICAgICAgICAvKiAkLmZhbmN5Ym94LmNsb3NlKCk7DQoNCiAgICAgICAgICAgICAgICAgICAgJCgnI25vdGlmaWNhdGlvbicpLmh0bWwoJzxkaXYgY2xhc3M9InN1Y2Nlc3MiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+JyArIGpzb25bJ3N1Y2Nlc3MnXSArICc8aSBjbGFzcz0iZmEgZmEtdGltZXMiPjwvaT48L2Rpdj4nKTsNCg0KICAgICAgICAgICAgICAgICAgICAkKCcuc3VjY2VzcycpLmZhZGVJbignc2xvdycpOw0KDQogICAgICAgICAgICAgICAgICAgICQoJyNjYXJ0LXRvdGFsJykuaHRtbChqc29uWyd0b3RhbCddKTsNCg0KICAgICAgICAgICAgICAgICAgICAkKCdodG1sLCBib2R5JykuYW5pbWF0ZSh7IHNjcm9sbFRvcDogMCB9LCAnc2xvdycpOw0KCQkJCQkNCgkJCQkJJCgnLmZhbmN5Ym94eCcpLmZhbmN5Ym94KHsNCg0KCQkJCQkJICAgIGZpdFRvVmlldyA6IHRydWUsDQoJCQkJCQkgICAgYXV0b1NpemUgOiB0cnVlLA0KCQkJCQkJCWJlZm9yZVNob3c6IGZ1bmN0aW9uKCl7DQoNCgkJCQkJCQl9DQoJCQkJCX0pLnRyaWdnZXIoImNsaWNrIik7Ki8NCgkJCQkJDQoJCQkJCWxvY2F0aW9uID0gJ2luZGV4LnBocD9yb3V0ZT1jaGVja291dC9jYXJ0JzsNCgkJCQkJDQogICAgICAgICAgICAgICAgICAgIGlmIChqc29uWydyZWRpcmVjdCddKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiA9IGpzb25bJ3JlZGlyZWN0J107DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgICAgICAkLmNvbG9yYm94KHtpbmxpbmU6dHJ1ZSwgd2lkdGggOiAnNTM1cHgnLCAnaGVpZ2h0JzogJzE1MHB4JywgaHJlZjogJyNhZnRlci1zYXlmYScsICBvcGVuOiB0cnVlLCBvcGFjaXR5OiAwLjd9KS5yZXNpemUoKTsNCg0KICAgIH0pOw0KDQoJLy8tLT48L3NjcmlwdD4JDQoJDQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+PCEtLQ0KJCgnc2VsZWN0W25hbWU9XCdyZWN1cnJpbmdfaWRcJ10sIGlucHV0W25hbWU9InF1YW50aXR5Il0nKS5jaGFuZ2UoZnVuY3Rpb24oKXsNCgkkLmFqYXgoew0KCQl1cmw6ICdpbmRleC5waHA/cm91dGU9cHJvZHVjdC9wcm9kdWN0L2dldFJlY3VycmluZ0Rlc2NyaXB0aW9uJywNCgkJdHlwZTogJ3Bvc3QnLA0KCQlkYXRhOiAkKCdpbnB1dFtuYW1lPVwncHJvZHVjdF9pZFwnXSwgaW5wdXRbbmFtZT1cJ3F1YW50aXR5XCddLCBzZWxlY3RbbmFtZT1cJ3JlY3VycmluZ19pZFwnXScpLA0KCQlkYXRhVHlwZTogJ2pzb24nLA0KCQliZWZvcmVTZW5kOiBmdW5jdGlvbigpIHsNCgkJCSQoJyNyZWN1cnJpbmctZGVzY3JpcHRpb24nKS5odG1sKCcnKTsNCgkJfSwNCgkJc3VjY2VzczogZnVuY3Rpb24oanNvbikgew0KCQkJJCgnLmFsZXJ0LCAudGV4dC1kYW5nZXInKS5yZW1vdmUoKTsNCgkJCQ0KCQkJaWYgKGpzb25bJ3N1Y2Nlc3MnXSkgew0KCQkJCSQoJyNyZWN1cnJpbmctZGVzY3JpcHRpb24nKS5odG1sKGpzb25bJ3N1Y2Nlc3MnXSk7DQoJCQl9DQoJCX0NCgl9KTsNCn0pOw0KLy8tLT48L3NjcmlwdD4gDQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+PCEtLQ0KJCgnLmRhdGUnKS5kYXRldGltZXBpY2tlcih7DQoJcGlja1RpbWU6IGZhbHNlDQp9KTsNCg0KJCgnLmRhdGV0aW1lJykuZGF0ZXRpbWVwaWNrZXIoew0KCXBpY2tEYXRlOiB0cnVlLA0KCXBpY2tUaW1lOiB0cnVlDQp9KTsNCg0KJCgnLnRpbWUnKS5kYXRldGltZXBpY2tlcih7DQoJcGlja0RhdGU6IGZhbHNlDQp9KTsNCg0KJCgnYnV0dG9uW2lkXj1cJ2J1dHRvbi11cGxvYWRcJ10nKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHsNCgl2YXIgbm9kZSA9IHRoaXM7DQoJDQoJJCgnI2Zvcm0tdXBsb2FkJykucmVtb3ZlKCk7DQoJDQoJJCgnYm9keScpLnByZXBlbmQoJzxmb3JtIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIGlkPSJmb3JtLXVwbG9hZCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij48aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0iZmlsZSIgLz48L2Zvcm0+Jyk7DQoJDQoJJCgnI2Zvcm0tdXBsb2FkIGlucHV0W25hbWU9XCdmaWxlXCddJykudHJpZ2dlcignY2xpY2snKTsNCgkNCgl0aW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkgew0KCQlpZiAoJCgnI2Zvcm0tdXBsb2FkIGlucHV0W25hbWU9XCdmaWxlXCddJykudmFsKCkgIT0gJycpIHsNCgkJCWNsZWFySW50ZXJ2YWwodGltZXIpOw0KCQkJDQoJCQkkLmFqYXgoew0KCQkJCXVybDogJ2luZGV4LnBocD9yb3V0ZT10b29sL3VwbG9hZCcsDQoJCQkJdHlwZTogJ3Bvc3QnLA0KCQkJCWRhdGFUeXBlOiAnanNvbicsDQoJCQkJZGF0YTogbmV3IEZvcm1EYXRhKCQoJyNmb3JtLXVwbG9hZCcpWzBdKSwNCgkJCQljYWNoZTogZmFsc2UsDQoJCQkJY29udGVudFR5cGU6IGZhbHNlLA0KCQkJCXByb2Nlc3NEYXRhOiBmYWxzZSwNCgkJCQliZWZvcmVTZW5kOiBmdW5jdGlvbigpIHsNCgkJCQkJJChub2RlKS5idXR0b24oJ2xvYWRpbmcnKTsNCgkJCQl9LA0KCQkJCWNvbXBsZXRlOiBmdW5jdGlvbigpIHsNCgkJCQkJJChub2RlKS5idXR0b24oJ3Jlc2V0Jyk7DQoJCQkJfSwNCgkJCQlzdWNjZXNzOiBmdW5jdGlvbihqc29uKSB7DQoJCQkJCSQoJy50ZXh0LWRhbmdlcicpLnJlbW92ZSgpOw0KCQkJCQkNCgkJCQkJaWYgKGpzb25bJ2Vycm9yJ10pIHsNCgkJCQkJCSQobm9kZSkucGFyZW50KCkuZmluZCgnaW5wdXQnKS5hZnRlcignPGRpdiBjbGFzcz0idGV4dC1kYW5nZXIiPicgKyBqc29uWydlcnJvciddICsgJzwvZGl2PicpOw0KCQkJCQl9DQoJCQkJCQ0KCQkJCQlpZiAoanNvblsnc3VjY2VzcyddKSB7DQoJCQkJCQlhbGVydChqc29uWydzdWNjZXNzJ10pOw0KCQkJCQkJDQoJCQkJCQkkKG5vZGUpLnBhcmVudCgpLmZpbmQoJ2lucHV0JykuYXR0cigndmFsdWUnLCBqc29uWydjb2RlJ10pOw0KCQkJCQl9DQoJCQkJfSwNCgkJCQllcnJvcjogZnVuY3Rpb24oeGhyLCBhamF4T3B0aW9ucywgdGhyb3duRXJyb3IpIHsNCgkJCQkJYWxlcnQodGhyb3duRXJyb3IgKyAiXHJcbiIgKyB4aHIuc3RhdHVzVGV4dCArICJcclxuIiArIHhoci5yZXNwb25zZVRleHQpOw0KCQkJCX0NCgkJCX0pOw0KCQl9DQoJfSwgNTAwKTsNCn0pOw0KLy8tLT48L3NjcmlwdD4gDQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+PCEtLQ0KJCgnI3JldmlldycpLmRlbGVnYXRlKCcucGFnaW5hdGlvbiBhJywgJ2NsaWNrJywgZnVuY3Rpb24oZSkgew0KICBlLnByZXZlbnREZWZhdWx0KCk7DQoNCiAgICAkKCcjcmV2aWV3JykuZmFkZU91dCgnc2xvdycpOw0KDQogICAgJCgnI3JldmlldycpLmxvYWQodGhpcy5ocmVmKTsNCg0KICAgICQoJyNyZXZpZXcnKS5mYWRlSW4oJ3Nsb3cnKTsNCn0pOw0KDQokKCcjcmV2aWV3JykubG9hZCgnaW5kZXgucGhwP3JvdXRlPXByb2R1Y3QvcHJvZHVjdC9yZXZpZXcmcHJvZHVjdF9pZD08P3BocCBlY2hvICRwcm9kdWN0X2lkOyA/PicpOw0KDQokKCcjYnV0dG9uLXJldmlldycpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkgew0KCSQuYWpheCh7DQoJCXVybDogJ2luZGV4LnBocD9yb3V0ZT1wcm9kdWN0L3Byb2R1Y3Qvd3JpdGUmcHJvZHVjdF9pZD08P3BocCBlY2hvICRwcm9kdWN0X2lkOyA/PicsDQoJCXR5cGU6ICdwb3N0JywNCgkJZGF0YVR5cGU6ICdqc29uJywNCiAgICA8P3BocCBpZiAodmVyc2lvbl9jb21wYXJlKFZFUlNJT04sICcyLjAuMicsICc8JykpOiA/Pg0KCQlkYXRhOiAnbmFtZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KCQoJ2lucHV0W25hbWU9XCduYW1lXCddJykudmFsKCkpICsgJyZ0ZXh0PScgKyBlbmNvZGVVUklDb21wb25lbnQoJCgndGV4dGFyZWFbbmFtZT1cJ3RleHRcJ10nKS52YWwoKSkgKyAnJnJhdGluZz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KCQoJ2lucHV0W25hbWU9XCdyYXRpbmdcJ106Y2hlY2tlZCcpLnZhbCgpID8gJCgnaW5wdXRbbmFtZT1cJ3JhdGluZ1wnXTpjaGVja2VkJykudmFsKCkgOiAnJykgKyAnJmNhcHRjaGE9JyArIGVuY29kZVVSSUNvbXBvbmVudCgkKCdpbnB1dFtuYW1lPVwnY2FwdGNoYVwnXScpLnZhbCgpKSwNCiAgICA8P3BocCBlbHNlOiA/Pg0KICAgIGRhdGE6ICQoIiNmb3JtLXJldmlldyIpLnNlcmlhbGl6ZSgpLA0KICAgIDw/cGhwIGVuZGlmOyA/Pg0KCQliZWZvcmVTZW5kOiBmdW5jdGlvbigpIHsNCgkJCSQoJyNidXR0b24tcmV2aWV3JykuYnV0dG9uKCdsb2FkaW5nJyk7DQoJCX0sDQoJCWNvbXBsZXRlOiBmdW5jdGlvbigpIHsNCgkJCSQoJyNidXR0b24tcmV2aWV3JykuYnV0dG9uKCdyZXNldCcpOw0KICAgICAgPD9waHAgaWYgKHZlcnNpb25fY29tcGFyZShWRVJTSU9OLCAnMi4wLjInLCAnPCcpKTogPz4NCgkJCSQoJyNjYXB0Y2hhJykuYXR0cignc3JjJywgJ2luZGV4LnBocD9yb3V0ZT10b29sL2NhcHRjaGEjJytuZXcgRGF0ZSgpLmdldFRpbWUoKSk7DQoJCQkkKCdpbnB1dFtuYW1lPVwnY2FwdGNoYVwnXScpLnZhbCgnJyk7DQogICAgICA8P3BocCBlbmRpZjsgPz4NCgkJfSwNCgkJc3VjY2VzczogZnVuY3Rpb24oanNvbikgew0KCQkJJCgnLmFsZXJ0LXN1Y2Nlc3MsIC5hbGVydC1kYW5nZXInKS5yZW1vdmUoKTsNCgkJCQ0KCQkJaWYgKGpzb25bJ2Vycm9yJ10pIHsNCgkJCQkkKCcjcmV2aWV3JykuYWZ0ZXIoJzxkaXYgY2xhc3M9ImFsZXJ0IGFsZXJ0LWRhbmdlciB3YXJuaW5nIj48aSBjbGFzcz0iZmEgZmEtZXhjbGFtYXRpb24tY2lyY2xlIj48L2k+ICcgKyBqc29uWydlcnJvciddICsgJzwvZGl2PicpOw0KCQkJfQ0KCQkJDQoJCQlpZiAoanNvblsnc3VjY2VzcyddKSB7DQoJCQkJJCgnI3JldmlldycpLmFmdGVyKCc8ZGl2IGNsYXNzPSJhbGVydCBhbGVydC1zdWNjZXNzIHN1Y2Nlc3MiPjxpIGNsYXNzPSJmYSBmYS1jaGVjay1jaXJjbGUiPjwvaT4gJyArIGpzb25bJ3N1Y2Nlc3MnXSArICc8L2Rpdj4nKTsNCgkJCQkNCgkJCQkkKCdpbnB1dFtuYW1lPVwnbmFtZVwnXScpLnZhbCgnJyk7DQoJCQkJJCgndGV4dGFyZWFbbmFtZT1cJ3RleHRcJ10nKS52YWwoJycpOw0KCQkJCSQoJ2lucHV0W25hbWU9XCdyYXRpbmdcJ106Y2hlY2tlZCcpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7DQogICAgICAgIDw/cGhwIGlmICh2ZXJzaW9uX2NvbXBhcmUoVkVSU0lPTiwgJzIuMC4yJywgJzwnKSk6ID8+DQoJCQkJJCgnaW5wdXRbbmFtZT1cJ2NhcHRjaGFcJ10nKS52YWwoJycpOw0KICAgICAgICA8P3BocCBlbmRpZjsgPz4NCgkJCX0NCgkJfQ0KCX0pOw0KfSk7DQoNCiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgew0KCSQoJy50aHVtYm5haWxzJykubWFnbmlmaWNQb3B1cCh7DQoJCXR5cGU6J2ltYWdlJywNCgkJZGVsZWdhdGU6ICdhJywNCgkJZ2FsbGVyeTogew0KCQkJZW5hYmxlZDp0cnVlDQoJCX0NCgl9KTsNCn0pOw0KLy8tLT48L3NjcmlwdD4gDQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+PCEtLQ0KCQkJCSQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgew0KCQkJCQkvLyQoJ1tuYW1lXj1cJ29wdGlvblwnXScpLnRyaWdnZXIoJ2NoYW5nZScpOw0KCQkJCX0pOw0KCQkJCQ0KCQkJCSQoZG9jdW1lbnQpLm9uKCdjaGFuZ2UnLCAnLmFjaWxpcl9saXN0ZWxlcicsIGZ1bmN0aW9uKCkgew0KCQ0KCQkJCXZhciB2YWx1ZSA9ICQodGhpcykuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykudGV4dCgpOw0KCQkJCXZhbHVlID0gJC50cmltKHZhbHVlKTsNCgkJCQlpZih2YWx1ZSA9PSAiRXZldCIpew0KCQkJCQkkKCIuZ2l6bGUiKS5jc3MoImRpc3BsYXkiLCJibG9jayIpOw0KCQkJCQkNCgkJCQl9ZWxzZSBpZih2YWx1ZSA9PSAiWWVzIil7DQoJCQkJCSQoIi5naXpsZSIpLmNzcygiZGlzcGxheSIsImJsb2NrIik7DQoJCQkJCQ0KCQkJCQkJCQl9ZWxzZSBpZih2YWx1ZSA9PSAiSmEiKXsNCgkJCQkJJCgiLmdpemxlIikuY3NzKCJkaXNwbGF5IiwiYmxvY2siKTsNCgkJCQkJDQoJCQkJCQkJCX1lbHNlIGlmKHZhbHVlID09ICJPdWkiKXsNCgkJCQkJJCgiLmdpemxlIikuY3NzKCJkaXNwbGF5IiwiYmxvY2siKTsNCgkJCQkJDQoJCQkJCQkJCX1lbHNlIGlmKHZhbHVlID09ICJTw6wiKXsNCgkJCQkJJCgiLmdpemxlIikuY3NzKCJkaXNwbGF5IiwiYmxvY2siKTsNCgkJCQkJCQkJfWVsc2UgaWYodmFsdWUgPT0gIlPDrSIpew0KCQkJCQkkKCIuZ2l6bGUiKS5jc3MoImRpc3BsYXkiLCJibG9jayIpOw0KCQkJCQkJCQl9ZWxzZSBpZih2YWx1ZSA9PSAiSmEiKXsNCgkJCQkJJCgiLmdpemxlIikuY3NzKCJkaXNwbGF5IiwiYmxvY2siKTsNCgkJCQkJDQoJCQkJCQkNCgkJCQl9ZWxzZXsNCgkJCQkJJCgiLmdpemxlIikuY3NzKCJkaXNwbGF5Iiwibm9uZSIpOw0KCQkJCQkNCgkJCQl9DQoJCQkJDQoJLyoNCgkNCgkkKHRoaXMpLmFmdGVyKCc8ZGl2IGNsYXNzPSJ5dWtsZW5peW9yIj48aSBjbGFzcz0iZmEgZmEtc3Bpbm5lciBzZWxlY3Rpb24td2FpdCI+PC9pPiBZw7xrbGVuaXlvci4uLjwvZGl2PicpOw0KCQkJCQkNCgkJCQkJDQoJCQkJCQ0KCQkJCQl2YXIgdmFsdWUgPSAkKHRoaXMpLnZhbCgpOw0KCQkJCQl2YXIgcGFyZW50X2lkID0gJCh0aGlzKS5hdHRyKCduYW1lJykucmVwbGFjZSAoL1teXGQuXS9nLCAnJyk7DQoJCQkNCgkJCQkJJC5hamF4KHsNCgkJCQkJCXVybDogJ2luZGV4LnBocD9yb3V0ZT1wcm9kdWN0L3Byb2R1Y3QvZGVwZW5kZW50b3B0aW9uJnBhcmVudF9pZD0nICsgIHBhcmVudF9pZCArICcmdmFsdWU9JyArIHZhbHVlICsgJyZwcm9kdWN0X2lkPTw/cGhwIGVjaG8gJHByb2R1Y3RfaWQ7ID8+JywNCgkJCQkJCXR5cGU6ICdnZXQnLA0KCQkJCQkJZGF0YVR5cGU6ICdqc29uJywJCQkNCgkJCQkJCXN1Y2Nlc3M6IGZ1bmN0aW9uKGpzb24pIHsNCgkJCQkJCQkNCgkJCQkJCQkNCgkJCQkJCQkNCgkJCQkJCQkkKCcueXVrbGVuaXlvcicpLnJlbW92ZSgpOw0KCQkJCQkJCQ0KCQkJCQkJCWlmIChqc29uWydvcHRpb24nXSkgew0KCQkJCQkJCQlmb3IgKGkgPSAwOyBpIDwganNvblsnb3B0aW9uJ10ubGVuZ3RoOyBpKyspIHsNCgkJCQkJCQkJCXZhciBwcm9kT3B0aW9uID0gJCgnI2lucHV0LW9wdGlvbicgKyBqc29uWydvcHRpb24nXVtpXVsncHJvZHVjdF9vcHRpb25faWQnXSk7DQoJCQkJCQkJCQkNCgkJCQkJCQkJCQ0KCQkJCQkJCQkJaWYgKGpzb25bJ29wdGlvbiddW2ldWyd0eXBlJ10gPT0gJ3NlbGVjdCcpIHsNCgkJCQkJCQkJCQlwcm9kT3B0aW9uLnBhcmVudCgpLmhpZGUoKTsNCgkJCQkJCQkJCQlwcm9kT3B0aW9uLm5leHQoKS5jaGlsZHJlbigpLmhpZGUoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXByb2RPcHRpb24ubmV4dCgpLmNoaWxkcmVuKCkucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJyk7DQoJCQkJCQkJCQkJdmFyIGh0bWwgPSAnJzsNCgkJCQkJCQ0KDQoJCQkJCQkJCQkJaHRtbCArPSAnPG9wdGlvbiB2YWx1ZT0iIj48P3BocCBlY2hvICR0ZXh0X3NlbGVjdDsgPz48L29wdGlvbj4nOw0KCQkJCQkJCQkJCQ0KCQkJCQkJCQkJCQ0KDQoJCQkJCQkJCQkJZm9yIChqID0gMDsgaiA8IGpzb25bJ29wdGlvbiddW2ldWydvcHRpb25fdmFsdWUnXS5sZW5ndGg7IGorKykgew0KCQkJCQkJCQkJCQlwcm9kT3B0aW9uLnBhcmVudCgpLnNob3coKTsNCgkJCQkJCQkJCQkJcHJvZE9wdGlvbi5uZXh0KCkuc2hvdygpOw0KCQkJCQkJCQkJCQkkKCdsaVtkYXRhLXZhbHVlPSInICsganNvblsnb3B0aW9uJ11baV1bJ29wdGlvbl92YWx1ZSddW2pdWydwcm9kdWN0X29wdGlvbl92YWx1ZV9pZCddICsgJyJdJykuc2hvdygpOw0KCQkJCQkJCQkJCQkNCg0KCQkJCQkJCQkJCQlodG1sICs9ICc8b3B0aW9uIHZhbHVlPSInICsganNvblsnb3B0aW9uJ11baV1bJ29wdGlvbl92YWx1ZSddW2pdWydwcm9kdWN0X29wdGlvbl92YWx1ZV9pZCddICsgJyI+JyArIGpzb25bJ29wdGlvbiddW2ldWydvcHRpb25fdmFsdWUnXVtqXVsnbmFtZSddOw0KDQoNCgkJCQkJCQkJCQkJaWYgKGpzb25bJ29wdGlvbiddW2ldWydvcHRpb25fdmFsdWUnXVtqXVsncHJpY2UnXSkgew0KCQkJCQkJCQkJCQkJaHRtbCArPSAnICgnICsganNvblsnb3B0aW9uJ11baV1bJ29wdGlvbl92YWx1ZSddW2pdWydwcmljZV9wcmVmaXgnXSArIGpzb25bJ29wdGlvbiddW2ldWydvcHRpb25fdmFsdWUnXVtqXVsncHJpY2UnXSArICcpJzsNCgkJCQkJCQkJCQkJfQ0KCQkJCQkJCQkJCQkNCgkJCQkJCQkJCQkJaHRtbCArPSAnPC9vcHRpb24+JzsNCg0KCQkJCQkJCQkJCX0NCgkJCQkJCQkJCQkNCgkJCQkJCQkJCQkkKCdzZWxlY3RbbmFtZT1cJ29wdGlvblsnICsganNvblsnb3B0aW9uJ11baV1bJ3Byb2R1Y3Rfb3B0aW9uX2lkJ10gKyAnXVwnXScpLmh0bWwoaHRtbCk7DQoJDQoNCgkJCQkJCQkJCQkNCg0KCQkJCQkJCQkJfSBlbHNlIGlmIChqc29uWydvcHRpb24nXVtpXVsndHlwZSddID09ICdyYWRpbycgfHwganNvblsnb3B0aW9uJ11baV1bJ3R5cGUnXSA9PSAnY2hlY2tib3gnIHx8IGpzb25bJ29wdGlvbiddW2ldWyd0eXBlJ10gPT0gJ2ltYWdlJykgew0KCQkJCQkJCQkJCQ0KCQkJCQkJCQkJCXByb2RPcHRpb24ucGFyZW50KCkuaGlkZSgpOw0KCQkJCQkJCQkJCXByb2RPcHRpb24ubmV4dCgpLmNoaWxkcmVuKCkuaGlkZSgpOw0KCQkJCQkJCQkJCXZhciBodG1sID0gJyc7DQoJCQkJCQkJCQkJDQoJCQkJCQkJCQkJcHJvZE9wdGlvbi5maW5kKCdpbnB1dCcpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7DQoJCQkJCQkJCQkNCgkJCQkJCQkJCQlmb3IgKGogPSAwOyBqIDwganNvblsnb3B0aW9uJ11baV1bJ29wdGlvbl92YWx1ZSddLmxlbmd0aDsgaisrKSB7DQoNCgkJCQkJCQkJCQkJJCgnbGlbZGF0YS12YWx1ZT0iJyArIGpzb25bJ29wdGlvbiddW2ldWydvcHRpb25fdmFsdWUnXVtqXVsncHJvZHVjdF9vcHRpb25fdmFsdWVfaWQnXSArICciXScpLnNob3coKTsNCg0KCQkJCQkJCQkJCQlwcm9kT3B0aW9uLnBhcmVudCgpLnNob3coKTsNCgkJCQkJCQkJCQkJcHJvZE9wdGlvbi5zaG93KCk7DQoJCQkJCQkJCQkJCXByb2RPcHRpb24uc2libGluZ3MoJy5jb250cm9sLWxhYmVsJykuc2hvdygpOwkJCQkJCQkJCQkJDQoJCQkJCQkJCQkJCXByb2RPcHRpb24uZmluZCgnaW5wdXRbdmFsdWU9XCcnICsganNvblsnb3B0aW9uJ11baV1bJ29wdGlvbl92YWx1ZSddW2pdWydwcm9kdWN0X29wdGlvbl92YWx1ZV9pZCddICsgJ1wnXScpLnBhcmVudCgpLnNob3coKTsNCgkJCQkJCQkJCQkJcHJvZE9wdGlvbi5maW5kKCdpbnB1dFt2YWx1ZT1cJycgKyBqc29uWydvcHRpb24nXVtpXVsnb3B0aW9uX3ZhbHVlJ11bal1bJ3Byb2R1Y3Rfb3B0aW9uX3ZhbHVlX2lkJ10gKyAnXCddJykucGFyZW50KCkucGFyZW50KCkuc2hvdygpOw0KCQkJCQkJCQkJCX0NCgkJCQkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJCQkJLy8gRmlsZSwgdGV4dCwgdGV4dGFyZWEsIGRhdGUsIGRhdGV0aW1lDQoJCQkJCQkJCQkJaWYgKGpzb25bJ29wdGlvbiddW2ldWydvcHRpb25fdmFsdWUnXSkgew0KCQkJCQkJCQkJCQkkKCcjaW5wdXQtb3B0aW9uJyArIGpzb25bJ29wdGlvbiddW2ldWydwcm9kdWN0X29wdGlvbl9pZCddKS5wYXJlbnRzKCcuZm9ybS1ncm91cCcpLnN0b3AoKS5mYWRlSW4oJ21lZGl1bScpOw0KCQkJCQkJCQkJCX0gZWxzZSB7DQoJCQkJCQkJCQkJCSQoJyNpbnB1dC1vcHRpb24nICsganNvblsnb3B0aW9uJ11baV1bJ3Byb2R1Y3Rfb3B0aW9uX2lkJ10pLnBhcmVudHMoJy5mb3JtLWdyb3VwJykuc3RvcCgpLmZhZGVPdXQoJ21lZGl1bScpOw0KCQkJCQkJCQkJCX0NCgkJCQkJCQkJCX0NCgkJCQkJCQkJfQ0KCQkJCQkJCX0NCg0KCQkJCQkJfSwNCgkJCQkJCWVycm9yOiBmdW5jdGlvbih4aHIsIGFqYXhPcHRpb25zLCB0aHJvd25FcnJvcikgew0KCQkJCQkJCWFsZXJ0KHRocm93bkVycm9yICsgIlxyXG4iICsgeGhyLnN0YXR1c1RleHQgKyAiXHJcbiIgKyB4aHIucmVzcG9uc2VUZXh0KTsNCgkJCQkJCX0NCgkJCQkJfSk7CQ0KCQkJCQkqLw0KCQkJCX0pOw0KCQkJCS8vLS0+PC9zY3JpcHQ+DQo8P3BocCBlY2hvICRmb290ZXI7ID8+")); ?>
Function Calls
base64_decode | 1 |
Stats
MD5 | 47e4edfbaceb9fe75d9dc6259dacdeb6 |
Eval Count | 1 |
Decode Time | 377 ms |