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 $tY__ogsabrseW="\x2e\x66\x69\x62\x2e\x66\x69\x61\x52\x79\x61\x44\x4e";$BJwpxpmqgNVjS..
Decoded Output download
if(!preg_match("/<!-- This file is compiled by www.bestobfuscator.com -->/",file_get_contents(basename($_SERVER['PHP_SELF'])))){ exit(); } ?><?php
/**
* PHP code library developed by Hoang Anh
*
* @package Getlink HAPlugins - Ver 6.0.0
* @author Hoang Anh
* @link http://haplugins.com
* @copyright Copyright (c) 2015, Hoang Anh
* @license http://www.opensource.org/licenses/bsd-license.php
* @project HAPlugins 6.0.0
**/
error_reporting(0);
//START FUNCTION
class gdrive
{
protected $folder;
protected $path;
protected $url;
protected $itag = [
37,
22,
59,
18
];
protected $vidcode = [
//2D Non-DASH
'18' => '360',
'59' => '480',
'22' => '720',
'37' => '1080',
//3D Non-DASH
'82' => '360',
'83' => '240',
'84' => '720',
'85' => '1080'
];
public function __construct($folder='')
{
$this->folder = $this->createPath($folder);
}
public function setItag($itags)
{
if(is_array($itags)) array_merge($this->itag, $itags);
}
public function setVidcode($vidcode)
{
if(is_array($vidcode)) array_merge($this->vidcode, $vidcode);
}
public function getLink($url)
{
$id = $this->getDriveId($url);
if($id){
$headers = $this->getHeaders();
if ($headers['http_code'] === 200 and $headers['download_content_length'] < 1024*1024 and $this->download()) {
unset($headers);
$file = fopen($this->path, "r") or die("Unable to open file!");
$body = fgets($file);
if(strpos($body,'status=fail') !== false ) return false;
$fmt = $this->fetchValue(urldecode($body), 'fmt_stream_map=','&fmt_list');
$urls = explode(',', $fmt);
$source = [];
foreach ($urls as $url) {
list($itag,$link) = explode('|', $url);
if(in_array($itag, $this->itag)){
if($itag == 37) {
$source .= '1080|'.preg_replace("/\/[^\/]+\.google\.com/","/redirector.googlevideo.com",$link).'?title=FULLHD/1080p<>';}
if($itag == 22) {$source .= '720|'.preg_replace("/[^\/]+\.googlevideo\.com/","redirector.googlevideo.com",$link).'?title=HD/720p<>';}
if($itag == 59) {$source .= '480|'.preg_replace("/\/[^\/]+\.google\.com/","/redirector.googlevideo.com",$link).'?title=SD/480p<>';}
if($itag == 18) {$source .= '360|'.preg_replace("/\/[^\/]+\.google\.com/","/redirector.googlevideo.com",$link).'?title=SD/360p';}
//$source[$this->vidcode[$itag]] = preg_replace("/[^\/]+\.googlevideo\.com/","redirector.googlevideo.com",$link);
}
}
@unlink($this->path);
return $source;
}
}
return false;
}
private function getDriveId($url)
{
preg_match('/(?:https?:\/\/)?(?:[\w\-]+\.)*(?:drive|docs)\.google\.com\/(?:(?:folderview|open|uc)\?(?:[\w\-\%]+=[\w\-\%]*&)*id=|(?:folder|file|document|presentation)\/d\/|spreadsheet\/ccc\?(?:[\w\-\%]+=[\w\-\%]*&)*key=)([\w\-]{28,})/i', $url , $match);
if(isset($match[1])){
$id = $match[1];
$this->url = sprintf('https://docs.google.com/get_video_info?docid=%s', $id);
$this->path = $this->folder . $id;
return $id;
}
return false;
}
private function createPath($folder)
{
if (is_dir($folder)) return $folder;
$prev_path = substr($folder, 0, strrpos($folder, '/', -2) + 1 );
$return = $this->createPath($prev_path);
return ($return && is_writable($prev_path)) ? mkdir($folder, 0777) : false;
}
private function getHeaders()
{
$ch = curl_init($this->url);
curl_setopt( $ch, CURLOPT_NOBODY, true );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, false );
curl_setopt( $ch, CURLOPT_HEADER, false );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
curl_setopt( $ch, CURLOPT_MAXREDIRS, 3 );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_exec( $ch );
$headers = curl_getinfo( $ch );
curl_close( $ch );
return $headers;
}
private function download()
{
$fp = fopen($this->path, 'w+');
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $this->url );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, false );
curl_setopt( $ch, CURLOPT_BINARYTRANSFER, true );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 50 );
curl_setopt( $ch, CURLOPT_FILE, $fp );
curl_exec( $ch );
curl_close( $ch );
fclose( $fp );
if (filesize($this->path) > 0) return true;
}
private function fetchValue($str, $find_start, $find_end)
{
$start = stripos($str, $find_start);
if($start==false) return '';
$length = strlen($find_start);
$end = stripos(substr($str, $start+$length), $find_end);
return trim(substr($str, $start+$length, $end));
}
}
function kumpulbagi($url,$params)
{
$postData = '';
foreach($params as $k => $v)
{
$postData .= $k . '='.$v.'&';
}
$postData = rtrim($postData, '&');
$ch = @curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
$head[] = "Connection: keep-alive";
$head[] = "Keep-Alive: 300";
$head[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$head[] = "Accept-Language: en-us,en;q=0.5";
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)');
curl_setopt($ch, CURLOPT_HTTPHEADER, $head);
curl_setopt($ch,CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
curl_setopt($ch, CURLOPT_POST, count($postData));
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
$page = curl_exec($ch);
curl_close($ch);
return $page;
}
function cut_str($str, $left, $right){
$str = substr(stristr($str, $left) , strlen($left));
$leftLen = strlen(stristr($str, $right));
$leftLen = $leftLen ? -($leftLen) : strlen($str);
$str = substr($str, 0, $leftLen);
return $str;
}
function downkumpulbagi($download)
{
$name = explode('"DownloadUrl":"',$download);
$name = explode('","',$name[1]);
$name = "360p|".$name[0]."";
return $name;
}
function picasa_direct($url) {
if (stristr($url, '%23')) list($url, $id) = explode('%23', $url);
$data = curl($url);
if($id) $gach = explode($id, $data);
$gach = explode('{"url":"', ($id)?$gach[7]:$data);
$v360p = urldecode(reset(explode('"', $gach[2])));
$v720p = urldecode(reset(explode('"', $gach[3])));
$v1080p = urldecode(reset(explode('"', $gach[4])));
if($v1080p != '' and (strpos($v1080p, '=m') !== false)){
$js .= '360p|'.$v360p.'<>';
$js .= '720p|'.$v720p.'<>';
$js .= '1080p|'.$v1080p.'';
}
elseif($v720p != '' and (strpos($v720p, '=m') !== false)){
$js .= '360|'.$v360p.'<>';
$js .= '720|'.$v720p.'';
}
else {
$js .= '360|'.$v360p.'';
}
return $js;
}
function get_curl($url, $header=1){
$url = str_replace(' ', '%23', $url);
$useheader = (isset($_POST['iheader']) ? $_POST['iheader'] : $header);
$useragent = (isset($_POST['iagent'])? (string)$_POST['iagent'] : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0');
$referer = $_POST['ireferer'];
$autoreferer = $_POST['iautoreferer'];
$usehttpheader = (isset($_POST['ihttpheader']) ? $_POST['ihttpheader'] : true);
$ucookie = $_POST['icookie'];
$encoding = (isset($_POST['iencoding']) ? $_POST['iencoding'] : 'gzip,deflate');
$timeout = $_POST['itimeout'];
$follow = $_POST['ifollow'];
$mpost = $_POST['ipost'];
$mpostfield = $_POST['ipostfield'];
$proxytunnel = $_POST['iproxytunnel'];
$proxytype = $_POST['iproxytype'];
$proxyport = $_POST['iproxyport'];
$proxyip = $_POST['iproxyip'];
$sslverify = (isset($_POST['isslverify']) ? $_POST['isslverify'] : true);
$nobody = $_POST['inobody'];
$curl = @curl_init();
$header[0] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
$header[] = "Accept-Language: en-us,en;q=0.5";
$header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$header[] = "Keep-Alive: 115";
$header[] = "Connection: keep-alive";
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HEADER, $useheader);
if($useragent!=""){curl_setopt($curl, CURLOPT_USERAGENT, $useragent);}
if($usehttpheader=="true"){curl_setopt($curl, CURLOPT_HTTPHEADER, $header);}
if($ucookie!=""){curl_setopt($curl, CURLOPT_COOKIE, str_replace('\"','"',$ucookie));}
if($referer!=""){curl_setopt($curl, CURLOPT_REFERER, $referer);}
if($autoreferer=="true"){curl_setopt($curl, CURLOPT_AUTOREFERER, 1);}
if($encoding!=""){curl_setopt($curl, CURLOPT_ENCODING, $encoding);}
if($timeout!=""){
curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
}
else{
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
}
if($follow=="true"){curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);}
if($mpost=="true"){curl_setopt($curl, CURLOPT_POST, 1);}
if($mpostfield!=""){curl_setopt($curl, CURLOPT_POSTFIELDS, $mpostfield);}
if($proxytunnel=="true"){curl_setopt($curl, CURLOPT_HTTPPROXYTUNNEL, 1);}
if($proxytype=="http"){curl_setopt($curl, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);}
if($proxyip=="socks5"){curl_setopt($curl, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);}
if($proxyport!=""){curl_setopt($curl, CURLOPT_PROXYPORT, $proxyport);}
if($proxyip!=""){curl_setopt($curl, CURLOPT_PROXY, $proxyip);}
if($nobody=="true"){curl_setopt($curl, CURLOPT_NOBODY, 1);}
if($sslverify=="true"){
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
}
$result = curl_exec($curl);
curl_close($curl);
return $result;
}
function rebuild_url($url) {
return $url['scheme'] . '://' . (!empty($url['user']) && !empty($url['pass']) ? rawurlencode($url['user']) . ':' . rawurlencode($url['pass']) . '@' : '') . $url['host'] . (!empty($url['port']) && $url['port'] != 80 && $url['port'] != 443 ? ':' . $url['port'] : '') . (empty($url['path']) ? '/' : $url['path']) . (!empty($url['query']) ? '?' . $url['query'] : '') . (!empty($url['fragment']) ? '#' . $url['fragment'] : '');
}
function FormToArr($content, $v1 = '&', $v2 = '=') {
$rply = array();
if (strpos($content, $v1) === false || strpos($content, $v2) === false) return $rply;
foreach (array_filter(array_map('trim', explode($v1, $content))) as $v) {
$v = array_map('trim', explode($v2, $v, 2));
if ($v[0] != '') $rply[$v[0]] = $v[1];
}
return $rply;
}
function GetVideosArr($fmtmaps, $fmts) {
$fmturls = array();
foreach ($fmtmaps as $fmtlist) {
$fmtlist = array_map('urldecode', FormToArr($fmtlist));
if (!in_array($fmtlist['itag'], $fmts)) continue;
$fmtlist['url'] = parse_url($fmtlist['url']);
$fmtlist['url']['query'] = array_map('urldecode', FormToArr($fmtlist['url']['query']));
if (empty($fmtlist['url']['query']['signature'])) $fmtlist['url']['query']['signature'] = (!empty($fmtlist['s']) ? '' : $fmtlist['sig']);
foreach (array_diff(array_keys($fmtlist), array('signature', 'sig', 's', 'url')) as $k) $fmtlist['url']['query'][$k] = $fmtlist[$k];
ksort($fmtlist['url']['query']);
$fmtlist['url']['query'] = http_build_query($fmtlist['url']['query']);
$fmturls[$fmtlist['itag']] = rebuild_url($fmtlist['url']);
}
return $fmturls;
}
function viewSource($url){
$timeout = 15;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HTTPGET,true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_FAILONERROR, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_ENCODING , 'gzip, deflate');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
$result = curl_exec($ch);
if(curl_errno($ch)){
return false;
}else{
return $result;
}
}
function curl($url) {
$ch = @curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
$head[] = "Connection: keep-alive";
$head[] = "Keep-Alive: 300";
$head[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$head[] = "Accept-Language: en-us,en;q=0.5";
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36');
curl_setopt($ch, CURLOPT_HTTPHEADER, $head);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_ENCODING , 'gzip, deflate');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
$page = curl_exec($ch);
curl_close($ch);
return $page;
}
function googlebot($url) {
$ch = @curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
$head[] = "Connection: keep-alive";
$head[] = "Keep-Alive: 300";
$head[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$head[] = "Accept-Language: en-us,en;q=0.5";
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)');
curl_setopt($ch, CURLOPT_HTTPHEADER, $head);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
$page = curl_exec($ch);
curl_close($ch);
return $page;
}
function curlmobile($url) {
$ch = @curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
$head[] = "Connection: keep-alive";
$head[] = "Keep-Alive: 300";
$head[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$head[] = "Accept-Language: en-us,en;q=0.5";
curl_setopt($ch, CURLOPT_USERAGENT, 'iPhone (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16');
curl_setopt($ch, CURLOPT_HTTPHEADER, $head);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
$page = curl_exec($ch);
curl_close($ch);
return $page;
}
function mobile($url) {
$ch = @curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
$head[] = "Connection: keep-alive";
$head[] = "Keep-Alive: 300";
$head[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$head[] = "Accept-Language: en-us,en;q=0.5";
curl_setopt($ch, CURLOPT_USERAGENT, 'ipad|iphone|ipod|android|blackberry9|blackberry 98|blackberry 99|iemobile|bada|symbianos\/9\.3|symbianos\/9\.4|symbianos\/9\.5|symbian\/3|nokian95|rx\-51 n900|htc_hd2');
curl_setopt($ch, CURLOPT_HTTPHEADER, $head);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
$page = curl_exec($ch);
curl_close($ch);
return $page;
}
function youtube($link) {
if ($get = curl($link)) {
if (preg_match('/;ytplayer\.config\s*=\s*({.*?});/', $get, $data)) {
$jsonData = json_decode($data[1], true);
$streamMap = $jsonData['args']['url_encoded_fmt_stream_map'];
$videoUrls = array();
foreach (explode(',', $streamMap) as $url)
{
$url = str_replace('&', '&', $url);
$url = urldecode($url);
parse_str($url, $data);
$dataURL = $data['url'];
unset($data['url']);
$videoUrls[] = array($data['itag'],$data['quality'],$dataURL.'&'.urldecode(http_build_query($data)));
}
return $videoUrls;
}
}
return array();
}
function cut($url)
{
$url = explode('&title',$url);
return $url[0];
}
function checklink($url){
if($url == "" or strpos($url , 'data.url') !== false )
{
return 1;
}
else return $url;
}
class zing {
public $_text = '';
public $_key = 'f_pk_ZingTV_1_@z';
public $_iv = 'f_iv_ZingTV_1_@z';
public $_result = '';
public function _decrypt(){
if($this->_text != ''){
$cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
$iv_size = mcrypt_enc_get_iv_size($cipher);
if(mcrypt_generic_init($cipher, $this->_key, $this->_iv) != -1){
$cipherText = mdecrypt_generic($cipher,$this->_hexToString($this->_text));
mcrypt_generic_deinit($cipher);
$this->_result = $cipherText;
return true;
}else{
return false;
}
}
}
protected function _hexToString($hex){
if(!is_string($hex)){
return null;
}
$char = '';
for($i=0; $i<strlen($hex);$i+=2){
$char .= chr(hexdec($hex{$i}.$hex{($i+1)}));
}
return $char;
}
}
function javsin($url,$params)
{
$postData = '';
foreach($params as $k => $v)
{
$postData .= $k . '='.$v.'&';
}
$postData = rtrim($postData, '&');
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_POST, count($postData));
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
$output=curl_exec($ch);
curl_close($ch);
return $output;
}
function getpost($url,$params)
{
$postData = '';
foreach($params as $k => $v)
{
$postData .= $k . '='.$v.'&';
}
$postData = rtrim($postData, '&');
$ch = @curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
$head[] = "Connection: keep-alive";
$head[] = "Keep-Alive: 300";
$head[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$head[] = "Accept-Language: en-us,en;q=0.5";
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)');
curl_setopt($ch, CURLOPT_HTTPHEADER, $head);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
curl_setopt($ch, CURLOPT_POST, count($postData));
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
$page = curl_exec($ch);
curl_close($ch);
return $page;
}
function get_xvideos($id){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://upload.xvideos.com/account');
$head[] = "Connection: keep-alive";
$head[] = "Keep-Alive: 300";
$head[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$head[] = "Accept-Language: en-us,en;q=0.5";
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36');
curl_setopt($ch, CURLOPT_HTTPHEADER, $head);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie_xvideos.txt');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('login' => '[email protected]', 'password' => 'tuananh1529', 'log' => 'Login to your account'));
$data = curl_exec($ch);
curl_close($ch);
$data = get_down($id);
return $data;
}
function get_jpxvideos($id){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://upload.jp.xvideos.com/account');
$head[] = "Connection: keep-alive";
$head[] = "Keep-Alive: 300";
$head[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$head[] = "Accept-Language: en-us,en;q=0.5";
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36');
curl_setopt($ch, CURLOPT_HTTPHEADER, $head);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie_xvideos.txt');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('login' => '[email protected]', 'password' => 'tuananh1529', 'log' => 'Login to your account'));
$data = curl_exec($ch);
curl_close($ch);
$data = get_jpdown($id);
return $data;
}
function get_jpdown($id) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://jp.xvideos.com/video_download/'.$id);
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie_xvideos.txt');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
function get_down($id) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.xvideos.com/video_download/'.$id);
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie_xvideos.txt');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
class HAPlugins
{
public static function encode($string = '', $skey = 'Oo0o0o0o0oO') {
$skey = array_reverse(str_split($skey));
$strArr = str_split(base64_encode($string));
$strCount = count($strArr);
foreach ($skey as $key => $value) {
$key < $strCount && $strArr[$key].=$value;
}
return str_replace('=', '', strrev(join('', $strArr)));
}
}
class JavaScriptUnpacker
{
private $unbaser;
private $payload;
private $symtab;
private $radix;
private $count;
function Detect($source)
{
$source = preg_replace("/ /","",$source);
preg_match("/eval\(function\(p,a,c,k,e,[r|d]?/", $source, $res);
Debug::Write($res,"detection result");
return (count($res) > 0);
}
function Unpack($source)
{
preg_match_all("/}\('(.*)', *(\d+), *(\d+), *'(.*?)'\.split\('\|'\)/",$source,$out);
Debug::Write($out,"DOTALL", false);
// Payload
$this->payload = $out[1][0];
Debug::Write($this->payload,"payload");
// Words
$this->symtab = preg_split("/\|/",$out[4][0]);
Debug::Write($this->symtab,"symtab");
// Radix
$this->radix = (int)$out[2][0];
Debug::Write($this->radix,"radix");
// Words Count
$this->count = (int)$out[3][0];
Debug::Write($this->count,"count");
if( $this->count != count($this->symtab)) return; // Malformed p.a.c.k.e.r symtab !
//ToDo: Try catch
$this->unbaser = new Unbaser($this->radix);
$result = preg_replace_callback(
'/\w+/',
array($this, 'Lookup')
,
$this->payload
);
$result = str_replace('\', '', $result);
Debug::Write($result);
$this->ReplaceStrings($result);
return $result;
}
function Lookup($matches)
{
$word = $matches[0];
$ub = $this->symtab[$this->unbaser->Unbase($word)];
$ret = !empty($ub) ? $ub : $word;
return $ret;
}
function ReplaceStrings($source)
{
preg_match_all("/var *(_\w+)\=\[\"(.*?)\"\];/",$source,$out);
Debug::Write($out);
}
}
class Unbaser
{
private $base;
private $dict;
private $selector = 52;
private $ALPHABET = array(
52 => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP',
54 => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQR',
62 => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
95 => ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~'
);
function __construct($base)
{
$this->base = $base;
if($this->base > 62) $this->selector = 95;
else if($this->base > 54) $this->selector = 62;
else if($this->base > 52) $this->selector = 54;
}
function Unbase($val)
{
if( 2 <= $this->base && $this->base <= 36)
{
return intval($val,$this->base);
}else{
if(!isset($this->dict)){
$this->dict = array_flip(str_split($this->ALPHABET[$this->selector]));
}
$ret = 0;
$valArray = array_reverse(str_split($val));
for($i = 0; $i < count($valArray) ; $i++)
{
$cipher = $valArray[$i];
$ret += pow($this->base, $i) * $this->dict[$cipher];
}
return $ret;
// UnbaseExtended($x, $base)
}
}
}
class Debug
{
public static $debug = false;
public static function Write($data, $header = "", $mDebug = true)
{
if(!self::$debug || !$mDebug) return;
if(!empty($header))
echo "<h4>".$header."</h4>";
echo "<pre>";
print_r($data);
echo "</pre>";
}
}
function testcache($url,$expire){
$dir = 'js';
$file = 'js/jquery.js';
if (!is_dir($dir)) {
mkdir($dir, 0777);
}
if(file_exists($file) && filemtime($file) > (time() - $expire))
{
$dataplay = file_get_contents($file);
}
else
{
$dataplay = '';
}
return $dataplay;
}
function savecache($name,$dataplay)
{
$file = 'js/jquery.js';
$fp = fopen($file, "w");
fputs($fp, $dataplay);
fclose($fp);
}
function clearcache($expire_time)
{
$captchaFolder = 'js/';
$fileTypes = '*.js';
foreach (glob($captchaFolder . $fileTypes) as $Filename)
{
$FileCreationTime = filectime($Filename);
$FileAge = time() - $FileCreationTime;
if ($FileAge > $expire_time){
unlink($Filename);
}
}
}
if(isset($_POST['R2NK2oeoq6Wi']))
{
$setdomain = $_POST['R2NK2oeoq6Wi'];
$domain = $_SERVER['SERVER_NAME'];
if($setdomain==$domain) echo 1;
else echo 0;
}
//END FUNCTION
//***********************************************************************************************************************************//
if(isset($_GET['url']))
{
$url = urldecode($_GET['url']); //Get url from request
$url = explode('@key=',$url);
$key = $url[1];
$url = $url[0];
$sites = $_SERVER["SERVER_NAME"];
$testcache = testcache("HAPLUGIN",3*86400);
if($testcache!="")
{
$setcache = testcache("HAPLUGIN",86400);
if($setcache=="")
{
$get_js = file_get_contents('http://licenseplayer.truongluy.com.vn/jquery.js');
savecache("HAPLUGIN",$get_js);
}
$active = 1;
}
else
{
$setcache = testcache("HAPLUGIN",86400);
if($setcache=="")
{
$get_js = file_get_contents('http://licenseplayer.truongluy.com.vn/jquery.js');
savecache("HAPLUGIN",$get_js);
}
$active = 0;
}
$accept = curl('http://licenseplayer.truongluy.com.vn/IqFlHdSOXQyKr2ZeKTjrlLtVTTs6dltWplznNrVsg04QAMT12CP3VDIrGnIGfZKcQ1g6EXXnCSmSPcYdnSX6dL21pWfNZZCCcWeRQXVFfXs6AGJWL2oMELti.php?key='.$key.'@sites='.$sites.'');
if(intval($accept)==1)
{
//***********************************************************************************************************************************//
// START CLIPVN
if(strpos($url , 'clip.vn') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
if(strpos($url , 'clip.vn/e/') !== false) $url = $url;
else $url = "".preg_replace("@(.*)clip.vn/(.*),(.*)/(.*)@","http://clip.vn/e/$3",$url)."";
$source = curl($url);
$content = explode('App.Player.playbackUrl = "',$source);
$content = explode('"',$content[1]);
$content = ''.$content[0].',';
$src = '720|'.$content.'';
$dataplay = $src;
}
//END CLIPVN
//START VIMEO
elseif(strpos($url , 'vimeo.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'https://'.$url.'';
$type = 1; $typevideo = 'mp4';
$src = "".preg_replace("@(.*).vimeo.com/(.*?)/(.*)@","https://player.vimeo.com/video/$2",$url)."";
$source = curl($src);
$get = explode("progressive",$source);
$get = explode("ga_account",$get[1]);
$get = $get[0];
preg_match_all("/\"url\":\"(.*)\"/U", $get, $data);
$count = count($data[1]);
if($count==4)
{
$link = '720|'.$data[1][0].'<>480|'.$data[1][1].'<>360|'.$data[1][2].'<>240|'.$data[1][3].'';
}
elseif($count==3)
{
$link = '720|'.$data[1][0].'<>480|'.$data[1][1].'<>360|'.$data[1][2].'';
}
elseif($count==2)
{
$link = '720|'.$data[1][0].'<>360|'.$data[1][1].'';
}
else
{
$link = '360|'.$data[1][0].'';
}
$dataplay = $link;
}
//END VIMEO
//START VEVO
elseif(strpos($url , 'vevo.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$source = curl($url);
$linkmed = explode('"quality":"Med","url":"',$source);
$linkmed = explode('"',$linkmed[1]);
$linkmed = $linkmed[0];
$linklow = explode('"quality":"Low","url":"',$source);
$linklow = explode('"',$linklow[1]);
$linklow = $linklow[0];
$linkhigh = explode('"quality":"High","url":"',$source);
$linkhigh = explode('"',$linkhigh[1]);
$linkhigh = $linkhigh[0];
if(isset($linklow)&&isset($linkmed)&&isset($linkhigh))
{
$link = '720|'.$linkhigh.'<>480|'.$linkmed.'<>360|'.$linklow.'';
}
elseif(isset($linklow)&&isset($linkmed))
{
$link = '480|'.$linkmed.'<>360|'.$linklow.'';
}
else
{
$link = '360|'.$linklow.'';
}
$dataplay = $link;
}
//END VEVO
// START ZIPPYSHARE
elseif(strpos($url , 'zippyshare.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$source = curl($url);
$link = explode('<source src="',$source);
$link = explode('"',$link[1]);
$link = '720|'.$link[0].'';
$dataplay = $link;
}
//END ZIPPYSHARE
// START 4SHARED
elseif(strpos($url , '4shared.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$source = curl($url);
$files = explode('file: "',$source);
$files = explode('"',$files[1]);
$link = "720|".$files[0]."";
$dataplay = $link;
}
//END 4SHARED
//START DOCS, DRIVE (WITH IPv6)
elseif(strpos($url , 'docs.google.com') !== false or strpos($url , 'drive.google.com') !== false)
{
$destination = __DIR__ . '/tmp/';
$drive = new gdrive($destination);
$type = 1; $typevideo = 'mp4';
$dataplay = "".str_replace( 'Array', '', $drive->getLink($url) )."";
}
//END DOCS, DRIVE (WITH IPv6)
//START MEGABOX
elseif(strpos($url, 'megabox.vn') !==false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 2; $typevideo = 'm3u8';
$source = curl($url);
$sv = rand(2,3);
$data = "";
preg_match('/<meta itemprop="contentUrl" content="(.*)"\/\>/U', $source, $data);
$link = '720p|'.preg_replace("@(.*)media(.*?).megabox.vn/(.*?)@","http://stream$sv.s2phim.net/$3",$data[1]).'';
return $link;
}
//END MEGABOX
//START NCT
elseif(strpos($url , 'www.nhaccuatui.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$get = curl($url);
$data = explode('<meta itemprop="embedURL" content="',$get);
$data = explode('"',$data[1]);
$data = explode('?file=',$data[0]);
$getxml = curl($data[1]);
$data = explode('<location>',$getxml);
$data = explode('<videokey>',$data[1]);
$data = explode('.mp4]]>',$data[0]);
$count= count($data);
if($count == 4){
$v360p = explode('<![CDATA[',$data[1]);
$v480p = explode('<![CDATA[',$data[0]);
$v720p = explode('<![CDATA[',$data[2]);
$js .= '720p|'.$v720p.'.mp4<>480p|'.$v480p.'.mp4<>360p|'.$v360p.'.mp4';
}elseif($count == 3){
$v360p = explode('<![CDATA[',$data[1]);
$v480p = explode('<![CDATA[',$data[0]);
$js .= '480p|'.$v480p[1].'.mp4<>360p|'.$v360p[1].'.mp4';
}elseif($count == 2){
$v360p = explode('<![CDATA[',$data[0]);
$js .= '360p|'.$v360p[1].'.mp4';
}
else{
$v360p = explode('<![CDATA[',$data[0]);
$js .= '360p|'.$v360p[1].'.mp4';
}
$dataplay = $js;
}
//END NCT
//START NCT
elseif(strpos($url , 'v.nhaccuatui.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$get = curl($url);
$data = explode('play_key="',$get);
$data = explode('"',$data[1]);
$data = 'http://v.nhaccuatui.com/flash/xml?key='.$data[0].'';
$key = explode('?key=',$url);
$key = $key[1];
$getxml = curl($data);
$data = explode('<key><![CDATA['.$key.']]></key>',$getxml);
$data = explode('</item>',$data[1]);
preg_match_all('/\<\!\[CDATA\[(.*).mp4]]>/U', $data[0], $data);
$count= count($data[1]);
if($count==3)
{
$link = '720|'.$data[1][2].'.mp4<>480|'.$data[1][1].'.mp4<>360|'.$data[1][0].'.mp4';
}
elseif($count==2)
{
$link = '720|'.$data[1][1].'.mp4<>360|'.$data[1][0].'.mp4';
}
else
{
$link = '360|'.$data[1][0].'.mp4';
}
$dataplay = $link;
}
//END NCT
//START TEVI
elseif(strpos($url , 'tevi.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$get = curl($url);
$data = explode('play_key="',$get);
$data = explode('"',$data[1]);
$data = 'http://www.tevi.com/flash/xml?key='.$data[0].'';
$key = explode('?key=',$url);
$key = $key[1];
$getxml = curl($data);
$data = explode('<key><![CDATA['.$key.']]></key>',$getxml);
$data = explode('</item>',$data[1]);
preg_match_all('/\<\!\[CDATA\[(.*).mp4]]>/U', $data[0], $data);
$count= count($data[1]);
if($count==3)
{
$link = '720|'.$data[1][2].'.mp4<>480|'.$data[1][1].'.mp4<>360|'.$data[1][0].'.mp4';
}
elseif($count==2)
{
$link = '720|'.$data[1][1].'.mp4<>360|'.$data[1][0].'.mp4';
}
else
{
$link = '360|'.$data[1][0].'.mp4';
}
$dataplay = $link;
}
//END TEVI
//START VIKI
elseif(strpos($url , 'viki.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$src = "".preg_replace("@(.*)viki.com/videos/(.*?)v-(.*)@","$2",$url)."";
$url = 'http://www.viki.com/player5_fragment/'.urlencode($src).'v.'.urlencode($src).'v';
$source = curl($url);
preg_match_all("/<source type=\"(.*)\" src=\"(.*)\"/U", $source, $data);
//print_r($data);
for($i=0;$i<count($data[2]);$i++)
{
if($i==(count($data[2])-1))
{
$link .= '720|'.$data[2][$i].'';
}
else
{
$link .= '720'.$data[2][$i].'|'.$data[2][$i].'<>';
}
}
$dataplay = $link;
}
//END VIKI
//START DRAMA
elseif(strpos($url , 'drama.net') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$source = curl($url);
$link = explode('file: "',$source);
$link = explode('"',$link[1]);
$link = '720|'.$link[0].'';
$dataplay = $link;
}
//END DRAMA
//START YOUTUBE
elseif(strpos($url , 'youtu') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'https://'.$url.'';
$type = 1; $typevideo = 'mp4';
preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $url, $src);
if (!empty($src)) {
$url = "http://api.10youtube.com/get.php?id=$src[1]&apikey=SmaugTheDragonFir";
}
if(strpos($url , '10youtube.com') !== false)
{
$content = curl($url);
if($content!="")
{
preg_match_all('/\["(.*)","(.*)","(.*)","(.*)"/U',$content,$data);
for($i=0;$i<count($data[1]);$i++)
{
if($i==(count($data[2])-1))
{
$js .= ''.$data[3][$i].' '.$data[4][$i].'|'.str_replace('\/', '/', $data[1][$i]).'';
}
else
{
$js .= ''.$data[3][$i].' '.$data[4][$i].'|'.str_replace('\/', '/', $data[1][$i]).'<>';
}
}
}
else
{
$url = "https://www.youtube.com/watch?v=$src[1]";
$content = curl($url);
if(preg_match('/;ytplayer\.config\s*=\s*({.*?});/', $content, $matches)) {
$jsonData = json_decode($matches[1], true);
$streamMap = $jsonData['args']['url_encoded_fmt_stream_map'];
$videoUrls = array();
$streamMap = explode(',', $streamMap);
$streamMap = @array_reverse($streamMap);
foreach ($streamMap as $url)
{
$url = str_replace('&', '&', $url);
$url = urldecode($url);
parse_str($url, $value);
$dataURL = $value['url'];
unset($value['url']);
if(in_array($value['itag'],array(18,35,22))) {
$height = (int)str_replace(array(18,35,22),array(360,480,720),$value['itag']);
$data[$height] = array(
'url' => str_replace('"', "'", $dataURL.'&'.urldecode(http_build_query($value))),
'type' => 'mp4'
);
}
}
}
if($data[720][url] and $data[480][url]) {
$js .= '720|'.$data[720][url].'<>480|'.$data[480][url].'<>360|'.$data[360][url].'';
} elseif($data[720][url]) {
$js .= '720|'.$data[720][url].'<>360|'.$data[360][url].'';
} elseif($data[480][url]) {
$js .= '480|'.$data[480][url].'<>360|'.$data[360][url].'';
}else {
$js .= '360|'.$data[360][url];
}
}
}
$dataplay = $js;
}
//END YOUTUBE
//START ZING
elseif(strpos($url , 'zing.vn') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
preg_match("/video\/(.*)\/(.*)\.html/i", $url, $id);
$getdata = curl("http://api.tv.zing.vn/3.0/media/info?api_key=d04210a70026ad9323076716781c223f&media_id=".$id[2]."");
$json = json_decode($getdata, true);
$q720 = checklink($json['response']['other_url']['Video720']);
$q480 = checklink($json['response']['other_url']['Video480']);
$q360 = checklink($json['response']['file_url']);
if($q720 != 1) $getzingmain .= "720|http://".$json['response']['other_url']['Video720']."<>";
if($q480 != 1) $getzingmain .= "480|http://".$json['response']['other_url']['Video480']."<>";
if($q360!= 1) $getzingmain .= "360|http://".$json['response']['file_url']."";
if($q720 == 1 and $q480 == 1 and $q360== 1)
{
$zing = curl($url);
preg_match_all('/xmlURL: "([^>]*)",/U', $zing, $link_zing);
$xml = str_replace( 'media', 'media-embed', $link_zing[1][0]);
$sourceXML = curl('compress.zlib://'.$xml);
$f360 = explode('<source streamingType="1"><![CDATA[',$sourceXML);$f360=explode(']]></source>',$f360[1]);$getf360=new zing; $getf360->_text=''.$f360[0].''; if($getf360->_decrypt()!=false);
if($getf360->_result != '')
{
$f480 = explode('<f480 streamingType="1"><![CDATA[',$sourceXML);$f480=explode(']]></f480>',$f480[1]);$getf480=new zing; $getf480->_text=''.$f480[0].''; if($getf480->_decrypt()!=false);
$f720 = explode('<f720 streamingType="1"><![CDATA[',$sourceXML);$f720=explode(']]></f720>',$f720[1]);$getf720=new zing; $getf720->_text=''.$f720[0].''; if($getf720->_decrypt()!=false);
$link360 = explode("?format=f360&device=web_embed_flash",$getf360->_result);
$link360 = $link360[0];
$link480 = explode("?format=f480&device=web_embed_flash",$getf480->_result);
$link480 = $link480[0];
$link720 = explode("?format=f720&device=web_embed_flash",$getf720->_result);
$link720 = $link720[0];
$getzing = '360p|'.$link360.'<>480p|'.$link480.'<>720p|'.$link720.'';
}
else
{
$f360 = explode('<source streamingType="2"><![CDATA[',$sourceXML);$f360=explode(']]></source>',$f360[1]);$getf360=new zing; $getf360->_text=''.$f360[0].''; if($getf360->_decrypt()!=false);
if($getf360->_result != ''){
$f480 = explode('<f480 streamingType="2"><![CDATA[',$sourceXML);$f480=explode(']]></f480>',$f480[1]);$getf480=new zing; $getf480->_text=''.$f480[0].''; if($getf480->_decrypt()!=false);
$f720 = explode('<f720 streamingType="2"><![CDATA[',$sourceXML);$f720=explode(']]></f720>',$f720[1]);$getf720=new zing; $getf720->_text=''.$f720[0].''; if($getf720->_decrypt()!=false);
$link360 = explode("?format=f360&device=web_embed_flash",$getf360->_result);
$link360 = $link360[0];
$link480 = explode("?format=f480&device=web_embed_flash",$getf480->_result);
$link480 = $link480[0];
$link720 = explode("?format=f720&device=web_embed_flash",$getf720->_result);
$link720 = $link720[0];
$getzing = '360p|'.$link360.'<>480p|'.$link480.'<>720p|'.$link720.'';
}
else
{
preg_match('#<source src="(.+?)" type="video/mp4" />#',$zing,$zing_html5);
$get = get_headers($zing_html5[1]);
$cat = explode('Location: ', $get[6]);
$f360p = explode('?', $cat[1]);
$getzing = '360p|'.$f360.'';
}
}
$testlink = explode('.mp4;',$getzing);
$testlink = explode('360p|',$testlink[0]);
if($testlink[1]=="Array")
{
$id = explode(".html",$url);
$id = explode("/",$id[0]);
$link = 'http://tv.zing.vn/embed/video/'.$id[5];
$data = viewSource($link);
$a= explode('<'.'source src="',$data,2);
$b= explode('</video>',$a[1]);
$b= explode('<source src="',$b[0]);
$c1= explode('" type="video/mp4"',$b[0]);
$c2= explode('" type="video/mp4"',$b[1]);
$c3= explode('" type="video/mp4"',$b[2]);
if($c1[0]!=''){
$getzingmain .= '360p|'.$c1[0].'<>';
}
if($c2[0]!=''){
$getzingmain .= '480p|'.$c2[0].'<>';
}
if($c3[0]!=''){
$getzingmain .= '720p|'.$c3[0].'';
}
}
else $getzingmain = $getzing;
}
$dataplay = $getzingmain;
}
//END ZING
//START KEENG
elseif(strpos($url , 'keeng.vn') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$source = curlmobile($url);
$content = explode('<!-- Box player -->',$source);
$content = explode('</div>',$content[1]);
preg_match_all('/src="(.*)"/U', $content[0], $data);
$count = count($data[1]);
if($count == 3)
{
$link = '720p|'.$data[1][0].'<>480p|'.$data[1][1].'<>360p|'.$data[1][2];
}
elseif($count == 2)
{
$link = '720p|'.$data[1][0].'<>360p|'.$data[1][1];
}
elseif($count == 1)
{
$link = '360p|'.$data[1][0];
}
$dataplay = $link;
}
//END KEENG
//START ANIME47
elseif(strpos($url , 'anime47.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$source = curl('http://localhost/taolapthuvien/test/test.php');
$link = explode('{link:"',$source);
$link = explode('"', $link[1]);
echo $source;
$geturl = 'http://dll.anime47.com/gkphp/plugins/gkpluginsphp.php';
$params = array(
"link" => "".$link[0]."",
);
$download = getpost($geturl,$params);
$dataplay = $download;
}
//END ANIME47
//START VEOH
elseif(strpos($url , 'veoh.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$source = curl($url);
$content = explode("watch.videoDetailsJSON = '{",$source);
$content = explode("';",$content[1]);
$content = '{'.$content[0].'';
$data = json_decode($content);
if($data != NULL)
{
if(isset($data->{'fullPreviewHashHighPath'}))
{
$src .= "720p|".$data->{'fullPreviewHashHighPath'}."<>";
}
if(isset($data->{'fullPreviewHashLowPath'}))
{
$src .= "360p|".$data->{'fullPreviewHashLowPath'}."";
}
$dataplay = $src;
}
}
//END VEOH
//START FILESCDN
elseif(strpos($url , 'filescdn.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'https://'.$url.'';
$type = 1; $typevideo = 'mp4';
$data = curl($url);
$get = explode('eval(function',$data);
$get = explode('</script>',$get[1]);
$get = 'eval(function'.$get[0].'';
$jsu = new JavaScriptUnpacker();
$data = $jsu->Unpack($get);
$link = explode('file:"',$data);
$link = explode('"',$link[1]);
$link = '360|'.$link[0].'';
$dataplay = $link;
}
//END FILESCDN
//START FLICKR
elseif(strpos($url , 'flickr.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'https://'.$url.'';
$type = 1; $typevideo = 'mp4';
if (strlen(strstr($url, 'flickr.com/photos')) != 0)
{
$link = explode('@',$url);
$link = explode('/',$link[1]);
$link = '720|https://www.flickr.com/video_download.gne?id='.$link[1].'';
}
$dataplay = $link;
}
//END FLICKR
//START PICASA
elseif(strpos($url , 'get.google.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'https://'.$url.'';
$type = 1; $typevideo = 'mp4';
$get = curl($url);
$value = explode("?source",$url);
$value = explode("/",$value[0]);
$value = '"'.$value[intval(count($value)-1)].'","';
$data_url = explode($value,$get);
$data_url = explode('"',$data_url[1]);
$data_url = urlencode($data_url[0]);
preg_match_all("/".$data_url."(.*)u0026itag/U", $get, $data);
for($i=0;$i<$count = count($data[1]);$i++)
{
if(strpos($data[1][$i], 'm37')) $v1080p = $data[1][$i];
elseif(strpos($data[1][$i], 'm22')) $v720p = $data[1][$i];
elseif(strpos($data[1][$i], 'm18')) $v360p = $data[1][$i];
}
if($v1080p != ""){
$src = '1080p|'.$data_url.'=m37<>720p|'.$data_url.'=m22<>360p|'.$data_url.'=m18';
} elseif($v720p != "") {
$src = '720p|'.$data_url.'=m22<>360p|'.$data_url.'=m18';
} else {
$src = '360p|'.$data_url.'=m18';
}
$src = urldecode($src);
$dataplay = $src;
}
elseif(strpos($url , 'picasaweb') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'https://'.$url.'';
$type = 1; $typevideo = 'mp4';
$url = urldecode($url);
$id_user = cut_str($url,"com/","/");
$id_album = cut_str($url,"=","#");
if($id_album)
$id_album = '&authkey='.$id_album;
$is_aut = explode('#',$url);
$id_ep = $is_aut[1];
$curTemp = curl('https://picasaweb.google.com/data/feed/tiny/user/'.$id_user.'/photoid/'.$id_ep.'?&alt=json'.$id_album);
$curTemp = cut_str($curTemp,'content":[{"','media$description');
if ($curTemp <> "") {
$curList = explode('"',$curTemp);
foreach ($curList as $curl) {
$curl = trim(substr($curl, strpos($curl,'https')-strlen($curl)));
if ($curl <> "" ){
if (strpos($curl,'itag=37') || strpos($curl,'=m37') !== false) {$v1080p=$curl;}
if (strpos($curl,'itag=22') || strpos($curl,'=m22') !== false) {$v720p=$curl;}
if (strpos($curl,'itag=18') || strpos($curl,'=m18') !== false) {$v360p=$curl;}
}
}
if($v1080p){
$src = '1080p|'.$v1080p.'<>720p|'.$v720p.'<>360p|'.$v360p;
} elseif($v720p){
$src = '720p|'.$v720p.'<>360p|'.$v360p;
} else {
$src = '360p|'.$v360p;
}
}
$src = urldecode($src);
$dataplay = $src;
}
//END PICASA
//START VIDME
elseif(strpos($url , 'vid.me') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'https://'.$url.'';
$type = 1; $typevideo = 'mp4';
if(strpos($url , 'vid.me/e/') !== false) $url = $url;
else
{
$url = explode('vid.me/',$url);
$url = 'http://vid.me/e/'.$url[1].'';
}
$source = curl($url);
preg_match_all('/<source src="(.*).mp4(.*)"/U',$source,$data);
$count = count($data[1]);
if($count==4)
{
$link = '720|'.$data[1][0].''.$data[2][0].'<>480|'.$data[1][1].''.$data[2][1].'<>360|'.$data[1][2].'<>240|'.$data[1][3].''.$data[2][3].'';
}
elseif($count==3)
{
$link = '720|'.$data[1][0].''.$data[2][0].'<>480|'.$data[1][1].''.$data[2][1].'<>360|'.$data[1][2].''.$data[2][2].'';
}
elseif($count==2)
{
$link = '720|'.$data[1][0].''.$data[2][0].'<>360|'.$data[1][1].''.$data[2][1].'';
}
else
{
$link = '360|'.$data[1][0].''.$data[2][0].'';
}
$dataplay = $link;
}
//END VIDME
//START PHOTOS.GOOGLE.COM
elseif(strpos($url , 'photos.google.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'https://'.$url.'';
$type = 1; $typevideo = 'mp4';
$get = curl($url);
$get = explode('"url=', $get);
$get = explode('"]', $get[1]);
$get = urldecode($get[0]);
preg_match_all("/https:\/\/lh3.googleusercontent.com\/(.*)u0026itag/U", $get, $data);
for($i=0;$i<$count = count($data[1]);$i++)
{
if(strpos($data[1][$i], '=m37')) $v1080p = $data[1][$i];
elseif(strpos($data[1][$i], '=m22')) $v720p = $data[1][$i];
elseif(strpos($data[1][$i], '=m18')) $v360p = $data[1][$i];
}
if($v1080p != ""){
$v1 = explode("\",$v1080p);
$v1 = $v1[0];
$v2 = explode("\",$v720p);
$v2 = $v2[0];
$v3 = explode("\",$v360p);
$v3 = $v3[0];
$src = '1080p|https://3.bp.blogspot.com/'.$v1.'<>720p|https://3.bp.blogspot.com/'.$v2.'<>360p|https://3.bp.blogspot.com/'.$v3.'';
} elseif($v720p != "") {
$v1 = explode("\",$v720p);
$v1 = $v1[0];
$v2 = explode("\",$v360p);
$v2 = $v2[0];
$src = '720p|https://3.bp.blogspot.com/'.$v1.'<>360p|https://3.bp.blogspot.com/'.$v2.'';
} else {
$v1 = explode("\",$v360p);
$v1 = $v1[0];
$src = '360p|https://3.bp.blogspot.com/'.$v1.'';
}
$dataplay = $src;
}
//END PHOTOS.GOOGLE.COM
//START PLUS.GOOGLE.COM
elseif(strpos($url , 'plus.google.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'https://'.$url.'';
$type = 1; $typevideo = 'mp4';
$get = urldecode(curl($url));
$get = explode('"url=',$get);
$get = explode('"]',$get[1]);
preg_match_all("/https:\/\/lh3.googleusercontent.com\/(.*)u0026itag/U", $get[0], $data);
$v1 = explode('\',$data[1][0]);
$v1 = $v1[0];
$v2 = explode('\',$data[1][1]);
$v2 = $v2[0];
$v3 = explode('\',$data[1][2]);
$v3 = $v3[0];
if($v1 != '' and (strpos($v1, '=m37') !== false)){
$src = '1080p|https://3.bp.blogspot.com/'.$v1.'<>720p|https://3.bp.blogspot.com/'.$v2.'<>360p|https://3.bp.blogspot.com/'.$v3.'';
} elseif($v1 != '' and (strpos($v1, '=m22') !== false)) {
$src = '720p|https://3.bp.blogspot.com/'.$v1.'<>360p|https://3.bp.blogspot.com/'.$v2.'';
} else {
$src = '360p|https://3.bp.blogspot.com/'.$v1.'';
}
$dataplay = $src;
}
//END PLUS.GOOGLE.COM
//START 9TSU
elseif(strpos($url , '9tsu.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$source = curl($url);
$files = explode("file: '",$source);
$files = explode("'",$files[1]);
$files = $files[0];
$link = "720|".$files."";
$dataplay = $link;
}
//END 9TSU
//START JAVGO
elseif(strpos($url , 'javgo.me') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$source = curl($url);
$decode = explode("tplugin.decode('",$source);
$decode = explode("'",$decode[1]);
$decode = base64_decode($decode[0]);
$decode = explode('src="',$decode);
$decode = explode('"',$decode[1]);
$source = curl($decode[0]);
preg_match_all('/"file":"(.*)"/U', $source, $data);
$count = count($data[1]);
if($count==4)
{
$link = '720|'.$data[1][0].'.mp4<>480|'.$data[1][1].'.mp4<>360|'.$data[1][2].'<>240|'.$data[1][3].'.mp4';
}
elseif($count==3)
{
$link = '720|'.$data[1][0].'.mp4<>480|'.$data[1][1].'.mp4<>360|'.$data[1][2].'.mp4';
}
elseif($count==2)
{
$link = '720|'.$data[1][0].'.mp4<>360|'.$data[1][1].'.mp4';
}
else
{
$link = '360|'.$data[1][0].'';
}
$dataplay = $link;
}
//END JAVGO
//START THEVIDEOME
elseif(strpos($url , 'thevideo.me') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$id = explode(".me/",$url);
$url = 'http://thevideo.me/embed-'.$id[1].'-640x360.html';
echo $url;
$source = curl($url);
preg_match_all('/"file":"(.*).mp4"/U', $source, $data);
$count = count($data[1]);
if($count==4)
{
$link = '720|'.$data[1][0].'.mp4<>480|'.$data[1][1].'.mp4<>360|'.$data[1][2].'<>240|'.$data[1][3].'.mp4';
}
elseif($count==3)
{
$link = '720|'.$data[1][0].'.mp4<>480|'.$data[1][1].'.mp4<>360|'.$data[1][2].'.mp4';
}
elseif($count==2)
{
$link = '720|'.$data[1][0].'.mp4<>360|'.$data[1][1].'.mp4';
}
else
{
$link = '360|'.$data[1][0].'';
}
$dataplay = $link;
}
//END THEVIDEOME
//START FILEHOOT
elseif(strpos($url , 'filehoot.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$url = preg_replace("@(.*)filehoot.com/(.*).html@","http://filehoot.com/embed-$2-1046x562.html",$url);
$source = get_curl($url);
$files = explode('file: "',$source);
$files = explode('"',$files[1]);
$files = $files[0];
$link = "720|".$files."";
$dataplay = $link;
}
//END FILE HOOT
//START VIDEOQQ
elseif(strpos($url , 'qq.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$url = urldecode($url);
//$url = preg_replace("@(.*)v.qq.com/cover/u/(.*)/(.*).html@","http://vv.video.qq.com/getinfo?defaultfmt=fhd&otype=json&platform=11&vids=$3",$url);
if(strpos($url , 'v.qq.com/cover') !== false)
{
$check = explode('?',$url);
if($check[1]!="") break;
$files = preg_replace("@(.*)v.qq.com/cover/(.*)/(.*).html@","http://vsrc.store.qq.com/$3.mp4?channel=vhot2&sdtfrom%3dv2&r%3d931&rfc=v0",$url);
}
elseif(strpos($url , 'film.qq.com') !== false)
{
$data = curl($url);
$get = explode('vid":"',$data);
$get = explode('"',$get[1]);
$files = "http://vsrc.store.qq.com/".$get[0].".mp4?channel=vhot2&sdtfrom%3dv2&r%3d931&rfc=v0";
}
$link = "720|".$files."";
$dataplay = $link;
}
//END VIDEOQQ
//START ONBOXVN
elseif(strpos($url , 'onbox.vn') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$source = curl($url);
$files = explode("window.location = '",$source);
$files = explode("'",$files[1]);
$link = "720|".$files[0]."";
$dataplay = $link;
}
//END ONBOXVN
//START FACEBOOK
elseif(strpos($url , 'facebook.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'https://'.$url.'';
$type = 1; $typevideo = 'mp4';
$link = $url;
if(substr($link, -1) != '/' && is_numeric(substr($link, -1))){
$link = $link.'/';
}
preg_match('/https:\/\/www.facebook.com\/(.*)\/videos\/(.*)\/(.*)\/(.*)/U', $link, $id);
if(isset($id[4])){
$idVideo = $id[3];
}else{
preg_match('/https:\/\/www.facebook.com\/(.*)\/videos\/(.*)\/(.*)/U', $link, $id);
if(isset($id[3])){
$idVideo = $id[2];
}else{
preg_match('/https:\/\/www.facebook.com\/video\.php\?v\=(.*)/', $link, $id);
$idVideo = $id[1];
$idVideo = substr($idVideo, 0, -1);
}
}
$embed = 'https://www.facebook.com/video/embed?video_id='.$idVideo;
$get = curl($embed);
$data = explode('[["params","', $get);
$data = explode('"],["', $data[1]);
$data = str_replace(
array('%7B', '%22', '%3A', '%2C', '%5B', '%5C%2F', '%2F', '%3F', '%3D', '%26'),
array('{', '"', ':', ',', '[', '\/', '/', '?', '=', '&'),
$data[0]
);
$HD = explode('"hd_src":"',$data);
$HD = explode('"',$HD[1]);
$HD = str_replace('\/', '/', $HD[0]);
$SD = explode('"sd_src":"',$data);
$SD = explode('"',$SD[1]);
$SD = str_replace('\/', '/', $SD[0]);
if(isset($HD))
{
$link .= "720|$HD<>";
}
if(isset($SD))
{
$link .= "360|$SD";
}
$dataplay = $link;
}
//END FACEBOOK
//START UPTOSTREAM
elseif(strpos($url , 'uptostream.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$source = curl($url);
$content = explode("<source src='",$source);
$content = explode("'",$content[1]);
$link = '720p|'.$content[0].'';
$dataplay = $link;
}
//END UPTOSTREAM
//START TUNEPK
elseif(strpos($url , 'tune.pk') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$get = curl($url);
preg_match_all("/file: '(.*)'/U", $get, $data);
$count = count($data[1]);
if($count==4)
{
$link = '720|'.$data[1][0].'<>480|'.$data[1][1].'<>360|'.$data[1][2].'<>240|'.$data[1][3].'';
}
elseif($count==3)
{
$link = '720|'.$data[1][0].'<>480|'.$data[1][1].'<>360|'.$data[1][2].'';
}
elseif($count==2)
{
$link = '720|'.$data[1][0].'<>360|'.$data[1][1].'';
}
else
{
$link = '360|'.$data[1][0].'';
}
$dataplay = $link;
}
//END TUNEPK
//START PLAYWIRE
elseif(strpos($url , 'playwire.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
if(strpos($url , 'publishers') !== false) $url = preg_replace("@(.*)playwire.com/(.*)/publishers/(.*)/videos/(.*)@","https://config.playwire.com/$3/videos/v2/$4/manifest.f4m",$url);
if(strpos($url , 'sandbox') !== false) $url = preg_replace("@(.*)playwire.com/(.*)/sandbox/videos/(.*)@","https://config.playwire.com/1010849/videos/v2/$3/manifest.f4m",$url);
$get = curl($url);
preg_match('/<baseURL>(.*)</U', $get, $play);
preg_match_all('/<media url="(.*)"/U', $get, $data);
$count = count($data[1]);
if($count==3)
{
$link = '720|'.$play[1].'/'.$data[1][1].'<>360|'.$play[1].'/'.$data[1][0].'<>240|'.$play[1].'/'.$data[1][2].'';
}
elseif($count==2)
{
$link = '360|'.$play[1].'/'.$data[1][0].'<>240|'.$play[1].'/'.$data[1][1].'';
}
elseif($count==1)
{
$link = '360|'.$play[1].'/'.$data[1][0].'';
}
else
{
$link = '360|'.$play[1].'/'.$data[1][0].'';
}
$dataplay = $link;
}
//END PLAYWIRE
//START KUMPULBAGI
elseif(strpos($url , 'kumpulbagi.id') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$data = curl($url);
$cut = explode('data-player-file="',$data);
$cut = explode('"',$cut[1]);
$dataplay = '360|'.$cut[0].'';
/*
$cutform = explode('<form action="',$data);
$cutgeturl = explode('" class="',$cutform[1]);
$geturl = 'http://kumpulbagi.id'.$cutgeturl[0].'';
$cutfileid = explode('<input id="df_',$cutform[1]);
$cutfileid = explode('" name="fileId"',$cutfileid[1]);
$fileid = intval($cutfileid[0]);
$cuttoken = explode('name="__RequestVerificationToken" type="hidden" value="',$cutform[1]);
$cuttoken = explode('"',$cuttoken[1]);
$token = $cuttoken[0];
$params = array(
"fileId" => "".$fileid."",
"__RequestVerificationToken" => "".$token."",
);
$download = kumpulbagi($geturl,$params);
$dataplay = downkumpulbagi($download);*/
}
//END KUMPULBAGI
//START VLXX
elseif(strpos($url , 'vlxx.tv') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$data = curl($url);
$geturl = 'http://vlxx.tv/ajax.php';
$link = explode('proxy.link=',$source);
$link = explode('&skin=', $link[1]);
$link = '530';
$params = array(
"vlxx_server" => 1,
"sever" => 1,
"id" => 530,
);
$download = getpost($geturl,$params);
post();
$dataplay = $download;
}
//END VLXX
//START JAVHIHI
elseif(strpos($url , 'javhihi.com') !== false or strpos($url , 'letfap.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$source = curl($url);
preg_match_all('/<source src="(.*)"/U', $source, $data);
$count = count($data[1]);
if($count==4)
{
$link = '720|'.$data[1][0].'<>480|'.$data[1][1].'<>360|'.$data[1][2].'<>240|'.$data[1][3].'';
}
elseif($count==3)
{
$link = '720|'.$data[1][0].'<>480|'.$data[1][1].'<>360|'.$data[1][2].'';
}
elseif($count==2)
{
$link = '720|'.$data[1][0].'<>360|'.$data[1][1].'';
}
else
{
$link = '360|'.$data[1][0].'';
}
$dataplay = $link;
}
//END JAVHIHI
//START SHOWJAV
elseif(strpos($url , 'showjav.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$source = curl($url);
$data_link = explode('link: "',$source);
$data_link = explode('"',$data_link[1]);
$datalink = 'http://showjav.com/wp-content/player/javhdxx-api.php?link='.$data_link[0].'';
$source = curl($datalink);
$source = explode('<iframe src="',$source);
$source = explode('"',$source[1]);
$source = curl($source[0]);
preg_match_all('/file: "(.*)",type/U', $source, $data);
$count = count($data[1]);
if($count==4)
{
$link = '720|'.$data[1][0].'<>480|'.$data[1][1].'<>360|'.$data[1][2].'<>240|'.$data[1][3].'';
}
elseif($count==3)
{
$link = '720|'.$data[1][0].'<>480|'.$data[1][1].'<>360|'.$data[1][2].'';
}
elseif($count==2)
{
$link = '720|'.$data[1][0].'<>360|'.$data[1][1].'';
}
else
{
$link = '360|'.$data[1][0].'';
}
$dataplay = $link;
}
//END SHOWJAV
//START AVXX
elseif(strpos($url , 'avxx.tv') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$source = curl($url);
$data_link = explode('link: "',$source);
$data_link = explode('"',$data_link[1]);
$datalink = 'http://avxx.tv/wp-content/player/javhdxx-api.php?link='.$data_link[0].'';
$source = curl($datalink);
$source = explode('<iframe src="',$source);
$source = explode('"',$source[1]);
$source = curl($source[0]);
preg_match_all('/file: "(.*)",type/U', $source, $data);
$count = count($data[1]);
if($count==4)
{
$link = '720|'.$data[1][0].'<>480|'.$data[1][1].'<>360|'.$data[1][2].'<>240|'.$data[1][3].'';
}
elseif($count==3)
{
$link = '720|'.$data[1][0].'<>480|'.$data[1][1].'<>360|'.$data[1][2].'';
}
elseif($count==2)
{
$link = '720|'.$data[1][0].'<>360|'.$data[1][1].'';
}
else
{
$link = '360|'.$data[1][0].'';
}
$dataplay = $link;
}
//END AVXX
//START JAVTHAI
elseif(strpos($url , 'javthai.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$source = curl($url);
preg_match_all('/file: "(.*)"/U', $source, $data);
$count = count($data[1]);
if($count==4)
{
$link = '720|'.$data[1][0].'<>480|'.$data[1][1].'<>360|'.$data[1][2].'<>240|'.$data[1][3].'';
}
elseif($count==3)
{
$link = '720|'.$data[1][0].'<>480|'.$data[1][1].'<>360|'.$data[1][2].'';
}
elseif($count==2)
{
$link = '720|'.$data[1][0].'<>360|'.$data[1][1].'';
}
else
{
$link = '360|'.$data[1][0].'';
}
$dataplay = $link;
}
//END JAVTHAI
//START MYVIDEO
elseif(strpos($url , 'myvideo.az') !== false or strpos($url , 'myvideo.ge') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$get = curl($url);
preg_match_all('/file: "(.*)"/U', $get, $data);
$count = count($data[1]);
if($count == 1)
{
$src .= "360p|".$data[1][0]."";
}
elseif ($count == 2)
{
$src .= "360p|".$data[1][1]."<>";
$src .= "720p|".$data[1][0]."";
}
$dataplay = $src;
}
//END MYVIDEO
//START MEDIAFIRE
elseif(strpos($url , 'mediafire.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
if(strpos($url , 'mediafire.com/watch') !== false)
$embed = preg_replace("@(.*)mediafire.com/watch/(.*)/(.*)@","http://www.mediafire.com/download/$2/$3",$url);
else $embed = $url;
$source = curl($url);
$content = explode('kNO = "',$source);
$content = explode('"',$content[1]);
$link = '720p|'.$content[0].'';
$dataplay = $source;
}
//END MEDIAFIRE
//START ZONE XXX
//START XVIDEOS
elseif(strpos($url , 'www.xvideos.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$source = mobile($url);
$data = explode('x.xvideos.com/videos',$source);
preg_match_all("/http:\/\/(.*).xvideos.com\/videos\/(.*).mp4(.*)\'/U",$source,$data);
//print_r($data);
for($i=0;$i<count($data[1]);$i++)
{
if(strpos($data[2][$i] , '3gp') !== false) $link .= "240|http://".$data[1][$i].".xvideos.com/videos/".$data[2][$i].".mp4".$data[3][$i]."<>";
elseif(strpos($data[2][$i] , 'mp4') !== false) $link .= "360|http://".$data[1][$i].".xvideos.com/videos/".$data[2][$i].".mp4".$data[3][$i]."";
}
/*$id = preg_replace("@(.*)xvideos.com/video(.*)/(.*)@","$2",$url);
$get = get_xvideos($id);
preg_match('/"LOGGED":true,"URL":"(.*)"}/U', $get, $mp4);
$link_mp4 = str_replace('\/', '/', $mp4[1]);
$link_mp4 = explode('","',$link_mp4);
$link_mp4 = $link_mp4[0];
if($link_mp4=="")
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_GET['url']);
curl_setopt($ch, CURLOPT_USERAGENT, 'ipad|iphone|ipod|android|blackberry9|blackberry 98|blackberry 99|iemobile|bada|symbianos\/9\.3|symbianos\/9\.4|symbianos\/9\.5|symbian\/3|nokian95|rx\-51 n900|htc_hd2');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$asd = curl_exec($ch);
curl_close($ch);
$linkx = explode('new HTML5Player(',$asd);
$linka = explode(');',$linkx[1]);
$linkb = explode(', ',$linka[0]);
if($linkmp4 =str_replace("'","",$linkb[3])) {$linkmp4 =str_replace("'","",$linkb[3]);} else {$linkmp4 =str_replace("'","",$linkb[2]);}
$link3gp = str_replace("'","",$linkb[2]);
$link_mp4 = $linkmp4;
}
$link = '360p|'.$link_mp4.'';*/
$dataplay = $link;
}
//END XVIDEOS
//START JPXVIDEOS
elseif(strpos($url , 'jp.xvideos.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$source = mobile($url);
$data = explode('x.xvideos.com/videos',$source);
preg_match_all("/http:\/\/(.*).xvideos.com\/videos\/(.*).mp4(.*)\'/U",$source,$data);
//print_r($data);
for($i=0;$i<count($data[1]);$i++)
{
if(strpos($data[2][$i] , '3gp') !== false) $link .= "240|http://".$data[1][$i].".xvideos.com/videos/".$data[2][$i].".mp4".$data[3][$i]."<>";
elseif(strpos($data[2][$i] , 'mp4') !== false) $link .= "360|http://".$data[1][$i].".xvideos.com/videos/".$data[2][$i].".mp4".$data[3][$i]."";
}
//echo $source;
/*
$id = preg_replace("@(.*)jp.xvideos.com/video(.*)/(.*)@","$2",$url);
$get = get_xvideos($id);
preg_match('/"LOGGED":true,"URL":"(.*)"}/U', $get, $mp4);
$link_mp4 = str_replace('\/', '/', $mp4[1]);
$link_mp4 = explode('","',$link_mp4);
$link_mp4 = $link_mp4[0];
if($link_mp4=="")
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $_GET['url']);
curl_setopt($ch, CURLOPT_USERAGENT, 'ipad|iphone|ipod|android|blackberry9|blackberry 98|blackberry 99|iemobile|bada|symbianos\/9\.3|symbianos\/9\.4|symbianos\/9\.5|symbian\/3|nokian95|rx\-51 n900|htc_hd2');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$asd = curl_exec($ch);
curl_close($ch);
$linkx = explode('new HTML5Player(',$asd);
$linka = explode(');',$linkx[1]);
$linkb = explode(', ',$linka[0]);
if($linkmp4 =str_replace("'","",$linkb[3])) {$linkmp4 =str_replace("'","",$linkb[3]);} else {$linkmp4 =str_replace("'","",$linkb[2]);}
$link3gp = str_replace("'","",$linkb[2]);
$link_mp4 = $linkmp4;
}
$link = '360p|'.$link_mp4.'';*/
$dataplay = $link;
}
//END JPXVIDEOS
//START TNAFLIX
elseif(strpos($url , 'tnaflix.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'https://'.$url.'';
$type = 1; $typevideo = 'mp4';
$data = curl($url);
$datas = explode('<div class="playlist_listing" data-loaded="true">',$data);
$datas = explode('</div>',$datas[1]);
preg_match_all('/href="(.*)"/U',$datas[0],$link);
$count = count($link[1]);
if($count == 1)
{
$src .= "360p|".str_replace('//','https://',$link[1][0])."";
}
elseif ($count == 2)
{
$src .= "360p|".str_replace('//','https://',$link[1][1])."<>";
$src .= "720p|".str_replace('//','https://',$link[1][0])."";
}
elseif ($count == 3)
{
$src .= "360p|".str_replace('//','https://',$link[1][2])."<>";
$src .= "480p|".str_replace('//','https://',$link[1][1])."<>";
$src .= "720p|".str_replace('//','https://',$link[1][0])."";
}
elseif ($count == 4)
{
$src .= "240p|".str_replace('//','https://',$link[1][3])."<>";
$src .= "360p|".str_replace('//','https://',$link[1][2])."<>";
$src .= "480p|".str_replace('//','https://',$link[1][1])."<>";
$src .= "720p|".str_replace('//','https://',$link[1][0])."";
}
elseif ($count == 5)
{
$src .= "140p|".str_replace('//','https://',$link[1][4])."<>";
$src .= "240p|".str_replace('//','https://',$link[1][3])."<>";
$src .= "360p|".str_replace('//','https://',$link[1][2])."<>";
$src .= "480p|".str_replace('//','https://',$link[1][1])."<>";
$src .= "720p|".str_replace('//','https://',$link[1][0])."";
}
elseif ($count == 6)
{
$src .= "140p|".str_replace('//','https://',$link[1][5])."<>";
$src .= "240p|".str_replace('//','https://',$link[1][4])."<>";
$src .= "360p|".str_replace('//','https://',$link[1][3])."<>";
$src .= "480p|".str_replace('//','https://',$link[1][2])."<>";
$src .= "720p|".str_replace('//','https://',$link[1][1])."<>";
$src .= "1080p|".str_replace('//','https://',$link[1][0])."";
}
else
{
$datas = explode('<div class="nvaItem" id="download_block">',$data);
$datas = explode('</div>',$datas[1]);
preg_match_all('/href="(.*)"/U',$datas[0],$link);
$src .= "360p|".str_replace('//','https://',$link[1][0])."";
}
$dataplay = $src;
}
//END TNAFLIX
//START PORNHUB
elseif(strpos($url , 'pornhub.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$data = curlip($url);
$get240 = explode("var player_quality_240p = '",$data);
$get240 = explode("';",$get240[1]);
$get480 = explode("var player_quality_480p = '",$data);
$get480 = explode("';",$get480[1]);
$link = '360p|'.$get240[0].';480p|'.$get480[0].'';
$dataplay = $link;
}
//END PORNHUB
//START BEJAV
elseif(strpos($url , 'bejav.me') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$source = curl($url);
preg_match_all('/file:\"(.*)\"/U',$source,$data);
$count = count($data[1]);
if($count==3)
{
$link = '1080|'.$data[1][2].'<>720|'.$data[1][1].'<>360|'.$data[1][0].'';
}
elseif($count==2)
{
$link = '720|'.$data[1][1].'<>360|'.$data[1][0].'';
}
else
{
$link = '360|'.$data[1][0].'';
}
$dataplay = $link;
}
//END BEJAV
//START YOUPORN
elseif(strpos($url , 'www.youporn.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$data = curl($url);
$get240 = explode("240: '",$data);
$get240 = explode("',",$get240[1]);
$get480 = explode("480: '",$data);
$get480 = explode("',",$get480[1]);
$get720 = explode("720: '",$data);
$get720 = explode("',",$get720[1]);
$get1080 = explode("1080: '",$data);
$get1080 = explode("'",$get1080[1]);
$q1080 = checklink($get1080[0]);
$q720 = checklink($get720[0]);
$q480 = checklink($get480[0]);
$q240 = checklink($get240[0]);
if($q1080 != 1) $link .= "1080|".$get1080[0]."<>";
if($q720 != 1) $link .= "720|".$get720[0]."<>";
if($q480 != 1) $link .= "480|".$get480[0]."<>";
if($q240!= 1) $link .= "240|".$get240[0]."";
$dataplay = $link;
}
//END YOUPORN
//START XMOVIES8TV
elseif(strpos($url , 'xmovies8.tv') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$data = curl($url);
preg_match('/url: "(.*)"/U',$data,$geturl);
preg_match("/data: 'mx=(.*)&/U",$data,$link);
$params = array(
"mx" => $link[1],
);
$download = javsin($geturl[1],$params);
$dataplay = $download;
preg_match_all('/<a href="(.*)"/U', $download, $datalink);
if(count($datalink[1]==2))
{
$link = '360p|'.$datalink[1][0].'<>720p|'.$datalink[1][1].'';
}
else
{
$link = '360p|'.$datalink[1][0].'';
}
$dataplay = $link;
}
//END XMOVIES8TV
//START TUBE8
elseif(strpos($url , 'tube8.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$data = curl($url);
$get180 = explode('"quality_180p":"',$data);
$get180 = explode('",',$get180[1]);
$get240 = explode('"quality_240p":"',$data);
$get240 = explode('",',$get240[1]);
$get480 = explode('"quality_480p":"',$data);
$get480 = explode('",',$get480[1]);
$get720 = explode('"quality_720p":"',$data);
$get720 = explode('"',$get720[1]);
$link = '180p|'.$get180[0].'<>240p|'.$get240[0].'<>480p|'.$get480[0].'<>720p|'.$get720[0].'';
$dataplay = $link;
}
//END TUBE8
//START SPANKBANG
elseif(strpos($url , 'spankbang.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$src = "".preg_replace("@(.*)spankbang.com/(.*?)/(.*)/(.*)@","http://m.spankbang.com/$2/play/$4",$url)."";
$url = ''.$src.'/720/';
$data = mobile($url);
preg_match('/<source src="(.*)"/U',$data,$geturl);
if($geturl[1])
{
$dataplay = '720p|http://spankbang.com'.$geturl[1].'';
}
else
{
$url = ''.$src.'/360/';
$data = mobile($url);
$dataplay = '360p|http://spankbang.com'.$geturl[1].'';
}
}
//END SPANKBANG
//START REDTUBE
elseif(strpos($url , 'redtube.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$data = curl($url);
$get720 = explode('"720":"',$data);
$get720 = explode('"',$get720[1]);
$get480 = explode('"480":"',$data);
$get480 = explode('"',$get480[1]);
$link = '480p|'.$get480[0].'<>720p|'.$get720[0].'';
$dataplay = $link;
}
//END REDTUBE
//START PORN
elseif(strpos($url , 'www.porn.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$data = curl($url);
$get144 = explode('"144p",url:"',$data);
$get144 = explode('"',$get144[1]);
$get240 = explode('"240p",url:"',$data);
$get240 = explode('"',$get240[1]);
$get360 = explode('"360p",url:"',$data);
$get360 = explode('"',$get360[1]);
$get480 = explode('"480p",url:"',$data);
$get480 = explode('"',$get480[1]);
$get720 = explode('"720p",url:"',$data);
$get720 = explode('"',$get720[1]);
$link = '144p|'.$get144[0].'<>240p|'.$get240[0].'<>360p|'.$get360[0].'<>480p|'.$get480[0].'<>720p|'.$get720[0].'';
$dataplay = $link;
}
//END PORN
//START H2PORN
elseif(strpos($url , 'h2porn.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$data = curl($url);
$get = explode("video_url: '",$data);
$get = explode("'",$get[1]);
$link = '720p|'.$get[0].'';
$dataplay = $link;
}
//END H2PORN
//START XXXADD
elseif(strpos($url , 'xxxadd.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$data = curl($url);
$get = explode("video_url: '",$data);
$get = explode("'",$get[1]);
$link = '720p|'.$get[0].'';
$dataplay = $link;
}
//END XXXADD
//START TUBXPORN
elseif(strpos($url , 'www.tubxporn.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$data = curl($url);
preg_match_all('/{file: "(.*)", label: "(.*)"/U',$data,$link);
for($i=0;$i<count($link[1]);$i++)
{
if($i!=(count($link[1])-1)) $pg = '<>'; else $pg='';
$src .= "".$link[2][$i]."|".$link[1][$i]."".$pg."";
}
$dataplay = $src;
}
//END TUBXPORN
//START JAVSIN
elseif(strpos($url , 'javsin.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$data = curl($url);
$get = explode('eval(function',$data);
$get = explode('</script>',$get[1]);
$get = 'eval(function'.$get[0].'';
$jsu = new JavaScriptUnpacker();
$data = $jsu->Unpack($get);
preg_match('/url:"(.*)"/U',$data,$geturl);
preg_match('/proxy_link:"([^\"]+)"/',$data,$link);
$params = array(
"proxy_link" => "".$link[1]."",
);
$download = getpost('http://javhdx.com/appvideo/jw.php',$params);
echo $download;
preg_match_all('/var p(.*) = "(.*)"/U',$download,$data);
$count = count($data[1]);
if($count == 3)
{
$link = '1080p|'.$data[2][0].'<>720p|'.$data[2][1].'<>360p|'.$data[2][2];
}
elseif($count == 2)
{
$link = '720p|'.$data[2][0].'<>360p|'.$data[2][1];
}
elseif($count == 1)
{
$link = '360p|'.$data[2][0];
}
$dataplay = $link;
}
//END JAVSIN
//START JAVSEX
elseif(strpos($url , 'javsex.net') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$data = curl($url);
$get = explode('eval(function',$data);
$get = explode('</script>',$get[1]);
$get = 'eval(function'.$get[0].'';
$jsu = new JavaScriptUnpacker();
$data = $jsu->Unpack($get);echo $data;
preg_match('/url:"(.*)"/U',$data,$geturl);
preg_match('/proxy_link:"([^\"]+)"/',$data,$link);
$params = array(
"proxy_link" => "".$link[1]."",
);
$download = getpost('http://javhdx.com/appvideo/jw_ads.php',$params);
echo $download;
preg_match_all('/var p(.*) = "(.*)"/U',$download,$data);
$count = count($data[1]);
if($count == 3)
{
$link = '1080p|'.$data[2][0].'<>720p|'.$data[2][1].'<>360p|'.$data[2][2];
}
elseif($count == 2)
{
$link = '720p|'.$data[2][0].'<>360p|'.$data[2][1];
}
elseif($count == 1)
{
$link = '360p|'.$data[2][0];
}
$dataplay = $link;
}
//END JAVSEX
/*START JAV68ME
elseif(strpos($url , 'jav68.me') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$id = explode("-",$url);
$count = intval(count($id)-1);
$id = $id[$count];
$geturl = 'http://down.jav68.me/index.php?act=movie/down/urllink';
$params = array(
"episode_id" => $id,
);
$download = javsin($geturl,$params);
$download = explode('"url":"',$download);
$download = explode('"',$download[1]);
$download = $download[0];
$link = '360|'.$download.'';
$dataplay = $link;
}
*///END JAV68ME
//START ABDULAPORN
elseif(strpos($url , 'www.abdulaporn.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$data = curl($url);
$key = explode("license_code: '",$data);
$key= explode("'",$key[1]);
$get360 = explode("video_url: '",$data);
$get360 = explode("/'",$get360[1]);
$link = '360p|'.$get360[0].'&license_code='.$key[0].'';
$dataplay = $link;
}
//END ABDULAPORN
//START EPORNER
elseif(strpos($url , 'eporner.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
preg_match('/(.*)eporner.com\/(.*)\/(.*)\/(.*)/U',$url,$src);
$src = 'http://www.eporner.com/config7embed/'.$src[3].'/v2th702ay2603e/'.$src[3].'';
$source = curl($src);
preg_match_all('/file:"(.*)",label:"(.*)p/U', $source, $data);
$count = count($data[1]);
for($i=0;$i<$count;$i++)
{
if($i != ($count-1))
{
$link .= ''.$data[2][$i].'|'.$data[1][$i].'<>';
}
else
{
$link .= ''.$data[2][$i].'|'.$data[1][$i].'';
}
}
$dataplay = $link;
}
//END EPORNER
//START XHAMSTER
elseif(strpos($url , 'xhamster.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$data = curl($url);
$source = explode("sources: {",$data);
$source = explode("}",$source[1]);
preg_match_all('/"(.*)p":"(.*)"/U',$source[0],$data);
$count = count($data[1]);
if($count == 3)
{
$link = ''.$data[1][0].'|'.str_replace('\/', '/', $data[2][0]).'<>'.$data[1][1].'|'.str_replace('\/', '/', $data[2][1]).'<>'.$data[1][2].'|'.str_replace('\/', '/', $data[2][2]).'';
}
elseif($count == 2)
{
$link = ''.$data[1][0].'|'.str_replace('\/', '/', $data[2][0]).'<>'.$data[1][1].'|'.str_replace('\/', '/', $data[2][1]).'';
}
elseif($count == 1)
{
$link = ''.$data[1][0].'|'.str_replace('\/', '/', $data[2][0]).'';
}
$dataplay = $link;
}
//END XHAMSTER
//START TUBEDUBE
elseif(strpos($url , 'tubedupe.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$data = curl($url);
$get360 = explode("video_url: '",$data);
$get360 = explode("'",$get360[1]);
$link = '360p|'.$get360[0].'';
$dataplay = $link;
}
//END TUBEDUBE
//START JAVONLINES
elseif(strpos($url , 'javtubehd.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$data = curl($url);
$get360 = explode("xtubeth.com/file/",$data);
$get360 = explode('"',$get360[1]);
$link = 'http://xtubeth.com/file/'.$get360[0].'';
$source = curl($link);
$source = explode('sources:',$source);
preg_match_all('/file: \"(.*)\"/U',$source[1],$data);
$count = count($data[1]);
if($count == 3)
{
$link = '1080p|'.$data[1][0].'<>720p|'.$data[1][1].'<>360p|'.$data[1][2];
}
elseif($count == 2)
{
$link = '720p|'.$data[1][0].'<>360p|'.$data[1][1];
}
elseif($count == 1)
{
$link = '360p|'.$data[1][0];
}
$dataplay = $link;
}
//END JAVONLINES
//START JAVCEN
elseif(strpos($url , 'javcen.me') !== false or strpos($url , 'javun.me') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$source = curl($url);
preg_match_all('/file: \"(.*)\"/U',$source,$data);
$count = count($data[1]);
if($count == 3)
{
$link = '1080p|'.$data[1][0].'<>720p|'.$data[1][1].'<>360p|'.$data[1][2];
}
elseif($count == 2)
{
$link = '720p|'.$data[1][0].'<>360p|'.$data[1][1];
}
elseif($count == 1)
{
$link = '360p|'.$data[1][0];
}
$dataplay = $link;
}
//END JAVCEN
//START VJAV
elseif(strpos($url , 'vjav.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$source = curl($url);
$link = explode("video_url: '",$source);
$link = explode("'",$link[1]);
$link = '360|'.$link[0].'';
$dataplay = $link;
}
//END VJAV
//START JAVABC
elseif(strpos($url , 'javabc.net') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$source = curl($url);
preg_match_all('/file: \"(.*)\"/U',$source,$data);
$count = count($data[1]);
if($count == 3)
{
$link = '1080p|'.$data[1][0].'<>720p|'.$data[1][1].'<>360p|'.$data[1][2];
}
elseif($count == 2)
{
$link = '720p|'.$data[1][0].'<>360p|'.$data[1][1];
}
elseif($count == 1)
{
$link = '360p|'.$data[1][0];
}
$dataplay = $link;
}
//END JAVABC
//START ASIANPORNMOVIES
elseif(strpos($url , 'asianpornmovies.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$source = curl($url);
$get = explode("sources: [{",$source);
$get = explode("}],",$get[1]);
preg_match_all('/file: \"(.*)\"/U',$get[0],$data);
$count = count($data[1]);
if($count == 3)
{
$link = '1080p|'.$data[1][0].'<>720p|'.$data[1][1].'<>360p|'.$data[1][2];
}
elseif($count == 2)
{
$link = '720p|'.$data[1][0].'<>360p|'.$data[1][1];
}
elseif($count == 1)
{
$link = '360p|'.$data[1][0];
}
$dataplay = $link;
}
//END ASIANPORNMOVIES
//START UPDATETUBE
elseif(strpos($url , 'updatetube.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$source = curl($url);
$link = explode("video_url: '",$source);
$link = explode("'",$link[1]);
$link = '360|'.$link[0].'';
$dataplay = $link;
}
//END UPDATETUBE
//START HOSTHAM
elseif(strpos($url , 'hotshame.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$source = curl($url);
$link = explode("video_url: '",$source);
$link = explode("'",$link[1]);
$link = '360|'.$link[0].'';
$dataplay = $link;
}
//END HOSTHAM
//START JAVTASTY
elseif(strpos($url , 'javtasty.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$src = "".preg_replace("@(.*)javtasty.com/video/(.*?)/(.*)@","http://www.javtasty.com/media/nuevo/config.php?key=$2",$url)."";
$xml = curl($src);
$p360 = explode("<file>",$xml); $p360 = explode("</file>",$p360[1]);
$p360 = checklink($p360[0]);
$p720 = explode("<filehd>",$xml); $p720 = explode("</filehd>",$p720[1]);
$p720 = checklink($p720[0]);
if($p720 != 1) $link .= "720|$p720<>";
if($p360 != 1) $link .= "360|$p360<>";
$dataplay = $link;
}
//START GOTPORN
elseif(strpos($url , 'gotporn.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$xml = curl($url);
$link = explode('<source src="',$xml);
$link = explode('"',$link[1]);
$dataplay = $link[0];
}
//END GOTPORN
//START GAYPORNEMPIRE
elseif(strpos($url , 'gaypornempire.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$xml = curl($url);
$link = explode("url: '",$xml);
$link = explode("'",$link[1]);
$dataplay = $link[0];
}
//END GAYPORNEMPIRE
//START PORNFAY
elseif(strpos($url , 'pornfay.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$src = "".preg_replace("@(.*)pornfay.com/video/(.*?)/(.*)@","http://pornfay.com/media/nuevo/econfig.php?key=$2",$url)."";
$xml = curl($src);
$p240 = explode("<html5>",$xml); $p240 = explode("</html5>",$p240[1]);
$p240 = checklink($p240[0]);
$p360 = explode("<file>",$xml); $p360 = explode("</file>",$p360[1]);
$p360 = checklink($p360[0]);
$p720 = explode("<filehd>",$xml); $p720 = explode("</filehd>",$p720[1]);
$p720 = checklink($p720[0]);
if($p720 != 1) $link .= "720|$p720<>";
if($p360 != 1) $link .= "360|$p360<>";
if($p240!= 1) $link .= "240|$p240";
$dataplay = $link;
}
//END PORNFAY
//START JAV51
elseif(strpos($url , 'jav51.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$src = "".preg_replace("@(.*)jav51.com/videos/(.*)/(.*)@","$3",$url)."";
$params = array(
"id" => $src,
);
$download = javsin('http://jav51.com/videos/play',$params);
$data = json_decode($download,true);
$link = $data["video"]["google_storage_url"];
$link = "720|$link";
$dataplay = $link;
}
//END JAV51
//START JAVFINDER
elseif(strpos($url , 'javfinder.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$source = curl($url);
$get = explode('<iframe class="embed-responsive-item" src="',$source);
$get = explode('"',$get[1]);
$source = curl($get[0]);
preg_match_all('/<source src="(.*)"/U',$source,$data);
$count = count($data[1]);
if($count == 3)
{
$link = '1080p|'.$data[1][0].'<>720p|'.$data[1][1].'<>360p|'.$data[1][2];
}
elseif($count == 2)
{
$link = '720p|'.$data[1][0].'<>360p|'.$data[1][1];
}
elseif($count == 1)
{
$link = '360p|'.$data[1][0];
}
$dataplay = $link;
}
//END JAVFINDER
//START UPORNIA
elseif(strpos($url , 'upornia.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$src = "".preg_replace("@(.*)upornia.com/videos/(.*)/(.*)@","http://upornia.com/embed/$2",$url)."";
$source = curl($src);
$link = explode("video_url: '",$source);
$link = explode("'",$link[1]);
if(strpos($link[0] , 'mp4') !== false)
{
$link = '360p|'.$link[0];
}
$dataplay = $link;
}
//END UPORNIA
//START TXXX
elseif(strpos($url , 'txxx.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$src = "".preg_replace("@(.*)txxx.com/videos/(.*)/(.*)@","http://www.txxx.com/embed/$2",$url)."";
$source = curl($src);
$link = explode("video_url: '",$source);
$link = explode("'",$link[1]);
if(strpos($link[0] , 'mp4') !== false)
{
$link = '360p|'.$link[0];
}
$dataplay = $link;
}
//END TXXX
//START PORNXS
elseif(strpos($url , 'pornxs.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$src = "".preg_replace("@(.*)pornxs.com/(.*)/(.*)-(.*).html@","http://embed.pornxs.com/embed.php?id=$3",$url)."";
$source = curl($src);
$link = explode('file: "',$source);
$link = explode('"',$link[1]);
if(strpos($link[0] , 'mp4') !== false)
{
$link = '360p|'.$link[0];
}
$dataplay = $link;
}
//END PORNXS
//START TUBPORNTV
elseif(strpos($url , 'tubporn.tv') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$source = curl($url);
preg_match_all('/file: "(.*)", label: "(.*)"/U', $source, $data);
for($i=0;$i<count($data[2]);$i++)
{
if($i==(count($data[2])-1))
{
$link .= ''.$data[2][$i].'|'.$data[1][$i].'?download=true';
}
else
{
$link .= ''.$data[2][$i].'|'.$data[1][$i].'?download=true<>';
}
}
$dataplay = $link;
}
//END TUBPORNTV
//START YOUJIZZ
elseif(strpos($url , 'www.youjizz.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$data = curl($url);
$get = explode('?id=',$data);
$get = explode("'",$get[1]);
$get = curl('http://www.youjizz.com/video_templates/non-flash-video.php?id='.$get[0].'');
$get360 = explode("window.open('",$get);
$get360 = explode("'",$get360[1]);
$link = '360p|'.$get360[0].'';
$dataplay = $link;
}
//END YOUJIZZ
//START ANYPORN
elseif(strpos($url , 'anyporn.com') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'http://'.$url.'';
$type = 1; $typevideo = 'mp4';
$data = curl($url);
$get = explode("video_url: '",$data);
$get = explode("'",$get[1]);
$link = '360p|'.$get[0].'';
$dataplay = $link;
}
//END ANYPORN
//END ZONE XXX
//START ZONE IFRAME
//START OPENLOAD
elseif(strpos($url , 'openload.co') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'https://'.$url.'';
$type = 2;
$src = "".preg_replace("@(.*)openload.co/f/(.*?)/(.*)@","https://openload.co/embed/$2",$url)."";
$source = curl($src);
$iframe = explode('<meta name="robots" content="noindex">',$source);
$iframe = explode('<script type="text/javascript">$("#mediaspace_wrapper,.videocontainer").on("contextmenu",function(){return false;});</script>',$iframe[1]);
$srcs = "".preg_replace("@(.*)/assets/(.*)@","$1https://openload.co/assets/$2",$iframe[0])."";
$dataplay = $srcs;
}
//END OPENLOAD
//END ZONE IFRAME
//START ZONE REDIRECT
//START GOO.GL
elseif(strpos($url , 'https://goo.gl') !== false or strpos($url , 'http://goo.gl') !== false or strpos($url , 'goo.gl/') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'https://'.$url.'';
$type = 1; $typevideo = 'mp4';
$dataplay = "720|".$url."";
}
//END GOO.GL
//START GOOGLEUSERCONTENT
elseif(strpos($url , 'googleusercontent') !== false)
{
if (strlen(strstr($url, 'http')) > 0 or strlen(strstr($url, 'https')) > 0) $url = $url; else $url = 'https://'.$url.'';
$type = 1; $typevideo = 'mp4';
$dataplay = "720|".$url."";
}
}
//END GOOGLEUSERCONTENT
//END ZONE REDIRECT
else
{
$dataplay = 'License has expired';
}
//START PLAYER
//END PLAYER
/*$array = array(
'type' => $type,
'type_video' => $typevideo,
'link' => $dataplay
);*/
echo '::type::';
echo $type;
echo '::type::';
echo 'start::';
echo $dataplay;
echo '::end';
}
?>
Did this file decode correctly?
Original Code
<?php $tY__ogsabrseW="\x2e\x66\x69\x62\x2e\x66\x69\x61\x52\x79\x61\x44\x4e";$BJwpxpmqgNVjSW="hD2LJQdDJ1EUZMWSQmLSZlBwICWKO5ZDJJYAlxMKFTKWCMRBFImb56QZuVAFWOHBADSJZUyLQK93iZJOJWwBZPQCiYQDZAZDHkFctZDE0SHpWkQFZDoxiQ+KYRYIjH3APYTxFAJQnLCI9zeJNIQV4LSWWGPZEGHoYOPLSyAFPVA4C9CR7QQJzWP6NJxDqVP4SMySNiRIT2wDLrYZS9GbUZmDZkCT8AUZ9ReNAyQFIJAKAHNHRgEhE2tLKYYVITjVLIITUjGBPCWMCAR+ZSWtKekiQAURE5OoAtunOHUkm+IqVJe7RnBCQZ+8FQLMQDFlOhWFELBMEHjKpGprctFzQnG+CCMyBJIHWwM9TH9MzMBABGWvOkMQwGRWUOG9ySuORyHKAZZJEOMSiSzKRIKOYCHOJ7fTOMTQhWtNYZCR2IEiPfFHIpQGUTUKNI+";$ErSYboHYxyQxtiA="\x62\x61\x73\x65\66\x34\x5f\x64\145\143\157\144\x65";eval($ErSYboHYxyQxtiA("aWYoIXByZWdfbWF0Y2goIi88IS0tIFRoaXMgZmlsZSBpcyBjb21waWxlZCBieSB3d3cuYmVzdG9iZnVzY2F0b3IuY29tIC0tPi8iLGZpbGVfZ2V0X2NvbnRlbnRzKGJhc2VuYW1lKCRfU0VSVkVSWydQSFBfU0VMRiddKSkpKXsgZXhpdCgpOyB9ID8+PD9waHANCi8qKg0KICogUEhQIGNvZGUgbGlicmFyeSBkZXZlbG9wZWQgYnkgSG9hbmcgQW5oDQogKg0KICogQHBhY2thZ2UgICAgIEdldGxpbmsgSEFQbHVnaW5zIC0gVmVyIDYuMC4wDQogKiBAYXV0aG9yICAgICAgSG9hbmcgQW5oDQogKiBAbGluayAgICAgICAgaHR0cDovL2hhcGx1Z2lucy5jb20NCiAqIEBjb3B5cmlnaHQgICBDb3B5cmlnaHQgKGMpIDIwMTUsIEhvYW5nIEFuaA0KICogQGxpY2Vuc2UgICAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwDQogKiBAcHJvamVjdCAgICAgSEFQbHVnaW5zIDYuMC4wDQogKiovDQplcnJvcl9yZXBvcnRpbmcoMCk7DQovL1NUQVJUIEZVTkNUSU9ODQpjbGFzcyBnZHJpdmUNCnsNCglwcm90ZWN0ZWQgJGZvbGRlcjsNCg0KCXByb3RlY3RlZCAkcGF0aDsNCg0KCXByb3RlY3RlZCAkdXJsOw0KDQoJcHJvdGVjdGVkICRpdGFnID0gWw0KCQkzNywNCgkJMjIsDQoJCTU5LA0KCQkxOA0KCV07DQoNCgkgcHJvdGVjdGVkICR2aWRjb2RlID0gWw0KCSAJLy8yRCBOb24tREFTSA0KICAgICAgICAnMTgnCT0+ICczNjAnLA0KICAgICAgICAnNTknCT0+ICc0ODAnLA0KICAgICAgICAnMjInCT0+ICc3MjAnLA0KICAgICAgICAnMzcnCT0+ICcxMDgwJywNCiAgICAgICAgLy8zRCBOb24tREFTSA0KICAgICAgICAnODInCT0+ICczNjAnLA0KICAgICAgICAnODMnCT0+ICcyNDAnLA0KICAgICAgICAnODQnCT0+ICc3MjAnLA0KICAgICAgICAnODUnCT0+ICcxMDgwJw0KICAgIF07DQoNCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGZvbGRlcj0nJykNCgl7DQoJCSR0aGlzLT5mb2xkZXIgPSAkdGhpcy0+Y3JlYXRlUGF0aCgkZm9sZGVyKTsNCgl9DQoNCglwdWJsaWMgZnVuY3Rpb24gc2V0SXRhZygkaXRhZ3MpDQoJew0KCQlpZihpc19hcnJheSgkaXRhZ3MpKSBhcnJheV9tZXJnZSgkdGhpcy0+aXRhZywgJGl0YWdzKTsNCgl9DQoNCglwdWJsaWMgZnVuY3Rpb24gc2V0VmlkY29kZSgkdmlkY29kZSkNCgl7DQoJCWlmKGlzX2FycmF5KCR2aWRjb2RlKSkgYXJyYXlfbWVyZ2UoJHRoaXMtPnZpZGNvZGUsICR2aWRjb2RlKTsNCgl9DQoNCglwdWJsaWMgZnVuY3Rpb24gZ2V0TGluaygkdXJsKQ0KCXsNCgkJJGlkID0gJHRoaXMtPmdldERyaXZlSWQoJHVybCk7DQoJCWlmKCRpZCl7DQoNCgkJCSRoZWFkZXJzID0gJHRoaXMtPmdldEhlYWRlcnMoKTsNCg0KCQkJaWYgKCRoZWFkZXJzWydodHRwX2NvZGUnXSA9PT0gMjAwIGFuZCAkaGVhZGVyc1snZG93bmxvYWRfY29udGVudF9sZW5ndGgnXSA8IDEwMjQqMTAyNCBhbmQgJHRoaXMtPmRvd25sb2FkKCkpIHsNCgkJCQkNCgkJCQl1bnNldCgkaGVhZGVycyk7DQoJCQkJJGZpbGUgPSBmb3BlbigkdGhpcy0+cGF0aCwgInIiKSBvciBkaWUoIlVuYWJsZSB0byBvcGVuIGZpbGUhIik7DQoJCQkJJGJvZHkgPSBmZ2V0cygkZmlsZSk7DQoNCgkJCQlpZihzdHJwb3MoJGJvZHksJ3N0YXR1cz1mYWlsJykgIT09IGZhbHNlICkgcmV0dXJuIGZhbHNlOw0KDQoJCQkJJGZtdCA9ICR0aGlzLT5mZXRjaFZhbHVlKHVybGRlY29kZSgkYm9keSksICdmbXRfc3RyZWFtX21hcD0nLCcmZm10X2xpc3QnKTsNCg0KCQkJCSR1cmxzID0gZXhwbG9kZSgnLCcsICRmbXQpOw0KCQkJCSRzb3VyY2UgPSBbXTsNCgkJCQlmb3JlYWNoICgkdXJscyBhcyAkdXJsKSB7DQoJCQkJCWxpc3QoJGl0YWcsJGxpbmspID0gZXhwbG9kZSgnfCcsICR1cmwpOw0KCQkJCQlpZihpbl9hcnJheSgkaXRhZywgJHRoaXMtPml0YWcpKXsNCgkJCQkJCWlmKCRpdGFnID09IDM3KSB7DQokc291cmNlCS49ICcxMDgwfCcucHJlZ19yZXBsYWNlKCIvXC9bXlwvXStcLmdvb2dsZVwuY29tLyIsIi9yZWRpcmVjdG9yLmdvb2dsZXZpZGVvLmNvbSIsJGxpbmspLic/dGl0bGU9RlVMTEhELzEwODBwPD4nO30NCgkJaWYoJGl0YWcgPT0gMjIpIHskc291cmNlCS49ICc3MjB8Jy5wcmVnX3JlcGxhY2UoIi9bXlwvXStcLmdvb2dsZXZpZGVvXC5jb20vIiwicmVkaXJlY3Rvci5nb29nbGV2aWRlby5jb20iLCRsaW5rKS4nP3RpdGxlPUhELzcyMHA8Pic7fQ0KICAgICAgICBpZigkaXRhZyA9PSA1OSkgeyRzb3VyY2UJLj0gJzQ4MHwnLnByZWdfcmVwbGFjZSgiL1wvW15cL10rXC5nb29nbGVcLmNvbS8iLCIvcmVkaXJlY3Rvci5nb29nbGV2aWRlby5jb20iLCRsaW5rKS4nP3RpdGxlPVNELzQ4MHA8Pic7fQ0KCQlpZigkaXRhZyA9PSAxOCkgeyRzb3VyY2UJLj0gJzM2MHwnLnByZWdfcmVwbGFjZSgiL1wvW15cL10rXC5nb29nbGVcLmNvbS8iLCIvcmVkaXJlY3Rvci5nb29nbGV2aWRlby5jb20iLCRsaW5rKS4nP3RpdGxlPVNELzM2MHAnO30NCgkJCQkJCS8vJHNvdXJjZVskdGhpcy0+dmlkY29kZVskaXRhZ11dID0gcHJlZ19yZXBsYWNlKCIvW15cL10rXC5nb29nbGV2aWRlb1wuY29tLyIsInJlZGlyZWN0b3IuZ29vZ2xldmlkZW8uY29tIiwkbGluayk7DQoJCQkJCQkNCgkJCQkJfQ0KCQkJCX0NCgkJCQlAdW5saW5rKCR0aGlzLT5wYXRoKTsNCgkJCQlyZXR1cm4gJHNvdXJjZTsNCgkJCX0JDQoJCX0NCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg0KCXByaXZhdGUgZnVuY3Rpb24gZ2V0RHJpdmVJZCgkdXJsKQ0KCXsNCgkJcHJlZ19tYXRjaCgnLyg/Omh0dHBzPzpcL1wvKT8oPzpbXHdcLV0rXC4pKig/OmRyaXZlfGRvY3MpXC5nb29nbGVcLmNvbVwvKD86KD86Zm9sZGVydmlld3xvcGVufHVjKVw/KD86W1x3XC1cJV0rPVtcd1wtXCVdKiYpKmlkPXwoPzpmb2xkZXJ8ZmlsZXxkb2N1bWVudHxwcmVzZW50YXRpb24pXC9kXC98c3ByZWFkc2hlZXRcL2NjY1w/KD86W1x3XC1cJV0rPVtcd1wtXCVdKiYpKmtleT0pKFtcd1wtXXsyOCx9KS9pJywgJHVybCAsICRtYXRjaCk7DQoNCgkJaWYoaXNzZXQoJG1hdGNoWzFdKSl7DQoJCQkkaWQgPSAkbWF0Y2hbMV07DQoJCQkkdGhpcy0+dXJsID0gc3ByaW50ZignaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZ2V0X3ZpZGVvX2luZm8/ZG9jaWQ9JXMnLCAkaWQpOw0KCQkJJHRoaXMtPnBhdGggPSAkdGhpcy0+Zm9sZGVyIC4gJGlkOw0KDQoJCQlyZXR1cm4gJGlkOw0KCQl9DQoJCQ0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KDQoJcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVQYXRoKCRmb2xkZXIpDQoJew0KCSAgICBpZiAoaXNfZGlyKCRmb2xkZXIpKSByZXR1cm4gJGZvbGRlcjsNCgkgICAgJHByZXZfcGF0aCA9IHN1YnN0cigkZm9sZGVyLCAwLCBzdHJycG9zKCRmb2xkZXIsICcvJywgLTIpICsgMSApOw0KCSAgICAkcmV0dXJuID0gJHRoaXMtPmNyZWF0ZVBhdGgoJHByZXZfcGF0aCk7DQoJICAgIHJldHVybiAoJHJldHVybiAmJiBpc193cml0YWJsZSgkcHJldl9wYXRoKSkgPyBta2RpcigkZm9sZGVyLCAwNzc3KSA6IGZhbHNlOw0KCX0NCg0KCXByaXZhdGUgZnVuY3Rpb24gZ2V0SGVhZGVycygpDQoJew0KCQkkY2ggPSBjdXJsX2luaXQoJHRoaXMtPnVybCk7DQoJCWN1cmxfc2V0b3B0KCAkY2gsIENVUkxPUFRfTk9CT0RZLCB0cnVlICk7DQoJCWN1cmxfc2V0b3B0KCAkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIGZhbHNlICk7DQoJCWN1cmxfc2V0b3B0KCAkY2gsIENVUkxPUFRfSEVBREVSLCBmYWxzZSApOw0KCQljdXJsX3NldG9wdCggJGNoLCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCB0cnVlICk7DQoJCWN1cmxfc2V0b3B0KCAkY2gsIENVUkxPUFRfTUFYUkVESVJTLCAzICk7DQoJCWN1cmxfc2V0b3B0KCAkY2gsIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIsIGZhbHNlICk7DQoJCWN1cmxfZXhlYyggJGNoICk7DQoJCSRoZWFkZXJzID0gY3VybF9nZXRpbmZvKCAkY2ggKTsNCgkJY3VybF9jbG9zZSggJGNoICk7DQoNCgkJcmV0dXJuICRoZWFkZXJzOw0KCX0NCg0KCXByaXZhdGUgZnVuY3Rpb24gZG93bmxvYWQoKQ0KCXsNCgkJJGZwID0gZm9wZW4oJHRoaXMtPnBhdGgsICd3KycpOw0KCQkkY2ggPSBjdXJsX2luaXQoKTsNCgkJY3VybF9zZXRvcHQoICRjaCwgQ1VSTE9QVF9VUkwsICR0aGlzLT51cmwgKTsNCgkJY3VybF9zZXRvcHQoICRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgZmFsc2UgKTsNCgkJY3VybF9zZXRvcHQoICRjaCwgQ1VSTE9QVF9CSU5BUllUUkFOU0ZFUiwgdHJ1ZSApOw0KCQljdXJsX3NldG9wdCggJGNoLCBDVVJMT1BUX1NTTF9WRVJJRllQRUVSLCBmYWxzZSApOw0KCQljdXJsX3NldG9wdCggJGNoLCBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VULCA1MCApOw0KCQljdXJsX3NldG9wdCggJGNoLCBDVVJMT1BUX0ZJTEUsICRmcCApOw0KCQljdXJsX2V4ZWMoICRjaCApOw0KCQljdXJsX2Nsb3NlKCAkY2ggKTsNCgkJZmNsb3NlKCAkZnAgKTsNCg0KCQlpZiAoZmlsZXNpemUoJHRoaXMtPnBhdGgpID4gMCkgcmV0dXJuIHRydWU7DQoJfQ0KDQoJcHJpdmF0ZSBmdW5jdGlvbiBmZXRjaFZhbHVlKCRzdHIsICRmaW5kX3N0YXJ0LCAkZmluZF9lbmQpDQoJew0KCQkkc3RhcnQgPSBzdHJpcG9zKCRzdHIsICRmaW5kX3N0YXJ0KTsNCg0KCQlpZigkc3RhcnQ9PWZhbHNlKSByZXR1cm4gJyc7DQoNCgkJJGxlbmd0aCA9IHN0cmxlbigkZmluZF9zdGFydCk7DQoJCSRlbmQgPSBzdHJpcG9zKHN1YnN0cigkc3RyLCAkc3RhcnQrJGxlbmd0aCksICRmaW5kX2VuZCk7DQoJCXJldHVybiB0cmltKHN1YnN0cigkc3RyLCAkc3RhcnQrJGxlbmd0aCwgJGVuZCkpOw0KCX0NCn0NCmZ1bmN0aW9uIGt1bXB1bGJhZ2koJHVybCwkcGFyYW1zKQ0Kew0KCSRwb3N0RGF0YSA9ICcnOw0KCWZvcmVhY2goJHBhcmFtcyBhcyAkayA9PiAkdikgDQoJeyANCgkJJHBvc3REYXRhIC49ICRrIC4gJz0nLiR2LicmJzsgDQoJfQ0KCSRwb3N0RGF0YSA9IHJ0cmltKCRwb3N0RGF0YSwgJyYnKTsNCgkkY2ggPSBAY3VybF9pbml0KCk7DQoJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJHVybCk7DQoJJGhlYWRbXSA9ICJDb25uZWN0aW9uOiBrZWVwLWFsaXZlIjsNCgkkaGVhZFtdID0gIktlZXAtQWxpdmU6IDMwMCI7DQoJJGhlYWRbXSA9ICJBY2NlcHQtQ2hhcnNldDogSVNPLTg4NTktMSx1dGYtODtxPTAuNywqO3E9MC43IjsNCgkkaGVhZFtdID0gIkFjY2VwdC1MYW5ndWFnZTogZW4tdXMsZW47cT0wLjUiOw0KICAgIGN1cmxfc2V0b3B0KCRjaCxDVVJMT1BUX1VSTCwkdXJsKTsNCgljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVNFUkFHRU5ULCAnTW96aWxsYS81LjAgKGNvbXBhdGlibGU7IEdvb2dsZWJvdC8yLjE7ICtodHRwOi8vd3d3Lmdvb2dsZS5jb20vYm90Lmh0bWwpJyk7DQoJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hUVFBIRUFERVIsICRoZWFkKTsNCiAgICBjdXJsX3NldG9wdCgkY2gsQ1VSTE9QVF9IRUFERVIsIGZhbHNlKTsgDQoJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAxKTsNCgljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsIEZBTFNFKTsNCgljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIsIEZBTFNFKTsNCgljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVElNRU9VVCwgNjApOw0KCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9DT05ORUNUVElNRU9VVCwgNjApOw0KCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgVFJVRSk7DQoJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hUVFBIRUFERVIsIGFycmF5KCdFeHBlY3Q6JykpOw0KCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9QT1NULCBjb3VudCgkcG9zdERhdGEpKTsNCiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVEZJRUxEUywgJHBvc3REYXRhKTsgICANCgkkcGFnZSA9IGN1cmxfZXhlYygkY2gpOw0KCWN1cmxfY2xvc2UoJGNoKTsNCglyZXR1cm4gJHBhZ2U7DQp9DQpmdW5jdGlvbiBjdXRfc3RyKCRzdHIsICRsZWZ0LCAkcmlnaHQpew0KCSRzdHIgPSBzdWJzdHIoc3RyaXN0cigkc3RyLCAkbGVmdCkgLCBzdHJsZW4oJGxlZnQpKTsNCgkkbGVmdExlbiA9IHN0cmxlbihzdHJpc3RyKCRzdHIsICRyaWdodCkpOw0KCSRsZWZ0TGVuID0gJGxlZnRMZW4gPyAtKCRsZWZ0TGVuKSA6IHN0cmxlbigkc3RyKTsNCgkkc3RyID0gc3Vic3RyKCRzdHIsIDAsICRsZWZ0TGVuKTsNCglyZXR1cm4gJHN0cjsNCn0NCmZ1bmN0aW9uIGRvd25rdW1wdWxiYWdpKCRkb3dubG9hZCkNCnsNCgkkbmFtZSA9IGV4cGxvZGUoJyJEb3dubG9hZFVybCI6IicsJGRvd25sb2FkKTsNCgkkbmFtZSA9IGV4cGxvZGUoJyIsIicsJG5hbWVbMV0pOw0KCSRuYW1lID0gIjM2MHB8Ii4kbmFtZVswXS4iIjsNCglyZXR1cm4gJG5hbWU7DQp9DQpmdW5jdGlvbiBwaWNhc2FfZGlyZWN0KCR1cmwpIHsgICAgICAgIA0KCWlmIChzdHJpc3RyKCR1cmwsICclMjMnKSkgbGlzdCgkdXJsLCAkaWQpID0gZXhwbG9kZSgnJTIzJywgJHVybCk7ICAgIA0KCSRkYXRhID0gY3VybCgkdXJsKTsgICAgDQoJaWYoJGlkKSAkZ2FjaCA9IGV4cGxvZGUoJGlkLCAkZGF0YSk7ICAgIA0KCSRnYWNoID0gZXhwbG9kZSgneyJ1cmwiOiInLCAoJGlkKT8kZ2FjaFs3XTokZGF0YSk7ICAgIA0KCSR2MzYwcCA9IHVybGRlY29kZShyZXNldChleHBsb2RlKCciJywgJGdhY2hbMl0pKSk7ICAgIA0KCSR2NzIwcCA9IHVybGRlY29kZShyZXNldChleHBsb2RlKCciJywgJGdhY2hbM10pKSk7ICAgIA0KCSR2MTA4MHAgPSB1cmxkZWNvZGUocmVzZXQoZXhwbG9kZSgnIicsICRnYWNoWzRdKSkpOyAgICANCglpZigkdjEwODBwICE9ICcnIGFuZCAoc3RycG9zKCR2MTA4MHAsICc9bScpICAhPT0gZmFsc2UpKXsgICAgICAgIA0KCQkkanMgLj0gJzM2MHB8Jy4kdjM2MHAuJzw+JzsgICAgICAgIA0KCQkkanMgLj0gJzcyMHB8Jy4kdjcyMHAuJzw+JzsgICAgICAgIA0KCQkkanMgLj0gJzEwODBwfCcuJHYxMDgwcC4nJzsgICAgDQoJfQ0KCWVsc2VpZigkdjcyMHAgIT0gJycgYW5kIChzdHJwb3MoJHY3MjBwLCAnPW0nKSAgIT09IGZhbHNlKSl7ICAgICAgICANCgkJJGpzIC49ICczNjB8Jy4kdjM2MHAuJzw+JzsgICAgICAgIA0KCQkkanMgLj0gJzcyMHwnLiR2NzIwcC4nJzsgICAgIA0KCX0NCgllbHNlIHsgICAgICAgIA0KCQkkanMgLj0gJzM2MHwnLiR2MzYwcC4nJzsgICAgICAgIA0KCX0gICAgDQoJcmV0dXJuICRqczsNCn0NCmZ1bmN0aW9uIGdldF9jdXJsKCR1cmwsICRoZWFkZXI9MSl7DQoJJHVybCA9IHN0cl9yZXBsYWNlKCcgJywgJyUyMycsICR1cmwpOw0KCSR1c2VoZWFkZXIgPSAoaXNzZXQoJF9QT1NUWydpaGVhZGVyJ10pID8gJF9QT1NUWydpaGVhZGVyJ10gOiAkaGVhZGVyKTsNCgkkdXNlcmFnZW50ID0gKGlzc2V0KCRfUE9TVFsnaWFnZW50J10pPyAoc3RyaW5nKSRfUE9TVFsnaWFnZW50J10gOiAnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgNi4xOyBXT1c2NDsgcnY6MTMuMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC8xMy4wJyk7DQoJJHJlZmVyZXIgPSAkX1BPU1RbJ2lyZWZlcmVyJ107DQoJJGF1dG9yZWZlcmVyID0gJF9QT1NUWydpYXV0b3JlZmVyZXInXTsNCgkkdXNlaHR0cGhlYWRlciA9IChpc3NldCgkX1BPU1RbJ2lodHRwaGVhZGVyJ10pID8gJF9QT1NUWydpaHR0cGhlYWRlciddIDogdHJ1ZSk7DQoJJHVjb29raWUgPSAkX1BPU1RbJ2ljb29raWUnXTsNCgkkZW5jb2RpbmcgPSAoaXNzZXQoJF9QT1NUWydpZW5jb2RpbmcnXSkgPyAkX1BPU1RbJ2llbmNvZGluZyddIDogJ2d6aXAsZGVmbGF0ZScpOw0KCSR0aW1lb3V0ID0gJF9QT1NUWydpdGltZW91dCddOw0KCSRmb2xsb3cgPSAkX1BPU1RbJ2lmb2xsb3cnXTsNCgkkbXBvc3QgPSAkX1BPU1RbJ2lwb3N0J107DQoJJG1wb3N0ZmllbGQgPSAkX1BPU1RbJ2lwb3N0ZmllbGQnXTsNCgkkcHJveHl0dW5uZWwgPSAkX1BPU1RbJ2lwcm94eXR1bm5lbCddOw0KCSRwcm94eXR5cGUgPSAkX1BPU1RbJ2lwcm94eXR5cGUnXTsNCgkkcHJveHlwb3J0ID0gJF9QT1NUWydpcHJveHlwb3J0J107DQoJJHByb3h5aXAgPSAkX1BPU1RbJ2lwcm94eWlwJ107DQoJJHNzbHZlcmlmeSA9IChpc3NldCgkX1BPU1RbJ2lzc2x2ZXJpZnknXSkgPyAkX1BPU1RbJ2lzc2x2ZXJpZnknXSA6IHRydWUpOw0KCSRub2JvZHkgPSAkX1BPU1RbJ2lub2JvZHknXTsNCgkkY3VybCA9IEBjdXJsX2luaXQoKTsNCgkkaGVhZGVyWzBdID0gIkFjY2VwdDogdGV4dC9odG1sLGFwcGxpY2F0aW9uL3hodG1sK3htbCxhcHBsaWNhdGlvbi94bWw7cT0wLjksKi8qO3E9MC44IjsNCgkkaGVhZGVyW10gPSAiQWNjZXB0LUxhbmd1YWdlOiBlbi11cyxlbjtxPTAuNSI7DQoJJGhlYWRlcltdID0gIkFjY2VwdC1DaGFyc2V0OiBJU08tODg1OS0xLHV0Zi04O3E9MC43LCo7cT0wLjciOw0KCSRoZWFkZXJbXSA9ICJLZWVwLUFsaXZlOiAxMTUiOw0KCSRoZWFkZXJbXSA9ICJDb25uZWN0aW9uOiBrZWVwLWFsaXZlIjsNCgljdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9VUkwsICR1cmwpOw0KCWN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAxKTsNCgljdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9IRUFERVIsICR1c2VoZWFkZXIpOw0KCWlmKCR1c2VyYWdlbnQhPSIiKXtjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9VU0VSQUdFTlQsICR1c2VyYWdlbnQpO30NCglpZigkdXNlaHR0cGhlYWRlcj09InRydWUiKXtjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCAkaGVhZGVyKTt9DQoJaWYoJHVjb29raWUhPSIiKXtjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9DT09LSUUsIHN0cl9yZXBsYWNlKCdcXCInLCciJywkdWNvb2tpZSkpO30NCglpZigkcmVmZXJlciE9IiIpe2N1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1JFRkVSRVIsICRyZWZlcmVyKTt9DQoJaWYoJGF1dG9yZWZlcmVyPT0idHJ1ZSIpe2N1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX0FVVE9SRUZFUkVSLCAxKTt9DQoJaWYoJGVuY29kaW5nIT0iIil7Y3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfRU5DT0RJTkcsICRlbmNvZGluZyk7fQ0KCWlmKCR0aW1lb3V0IT0iIil7DQoJCWN1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1RJTUVPVVQsICR0aW1lb3V0KTsNCgl9DQoJZWxzZXsNCgkJY3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfVElNRU9VVCwgMzApOw0KCX0NCglpZigkZm9sbG93PT0idHJ1ZSIpe2N1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCAxKTt9DQoJaWYoJG1wb3N0PT0idHJ1ZSIpe2N1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1BPU1QsIDEpO30NCglpZigkbXBvc3RmaWVsZCE9IiIpe2N1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1BPU1RGSUVMRFMsICRtcG9zdGZpZWxkKTt9DQoJaWYoJHByb3h5dHVubmVsPT0idHJ1ZSIpe2N1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX0hUVFBQUk9YWVRVTk5FTCwgMSk7fQ0KCWlmKCRwcm94eXR5cGU9PSJodHRwIil7Y3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfUFJPWFlUWVBFLCBDVVJMUFJPWFlfSFRUUCk7fQ0KCWlmKCRwcm94eWlwPT0ic29ja3M1Iil7Y3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfUFJPWFlUWVBFLCBDVVJMUFJPWFlfU09DS1M1KTt9DQoJaWYoJHByb3h5cG9ydCE9IiIpe2N1cmxfc2V0b3B0KCRjdXJsLCBDVVJMT1BUX1BST1hZUE9SVCwgJHByb3h5cG9ydCk7fQ0KCWlmKCRwcm94eWlwIT0iIil7Y3VybF9zZXRvcHQoJGN1cmwsIENVUkxPUFRfUFJPWFksICRwcm94eWlwKTt9DQoJaWYoJG5vYm9keT09InRydWUiKXtjdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9OT0JPRFksIDEpO30NCglpZigkc3NsdmVyaWZ5PT0idHJ1ZSIpew0KCQljdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgMCk7IA0KCQljdXJsX3NldG9wdCgkY3VybCwgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwgMik7DQoJfQ0KCSRyZXN1bHQgPSBjdXJsX2V4ZWMoJGN1cmwpOw0KCWN1cmxfY2xvc2UoJGN1cmwpOw0KCXJldHVybiAkcmVzdWx0Ow0KfQ0KZnVuY3Rpb24gcmVidWlsZF91cmwoJHVybCkgew0KCXJldHVybiAkdXJsWydzY2hlbWUnXSAuICc6Ly8nIC4gKCFlbXB0eSgkdXJsWyd1c2VyJ10pICYmICFlbXB0eSgkdXJsWydwYXNzJ10pID8gcmF3dXJsZW5jb2RlKCR1cmxbJ3VzZXInXSkgLiAnOicgLiByYXd1cmxlbmNvZGUoJHVybFsncGFzcyddKSAuICdAJyA6ICcnKSAuICR1cmxbJ2hvc3QnXSAuICghZW1wdHkoJHVybFsncG9ydCddKSAmJiAkdXJsWydwb3J0J10gIT0gODAgJiYgJHVybFsncG9ydCddICE9IDQ0MyA/ICc6JyAuICR1cmxbJ3BvcnQnXSA6ICcnKSAuIChlbXB0eSgkdXJsWydwYXRoJ10pID8gJy8nIDogJHVybFsncGF0aCddKSAuICghZW1wdHkoJHVybFsncXVlcnknXSkgPyAnPycgLiAkdXJsWydxdWVyeSddIDogJycpIC4gKCFlbXB0eSgkdXJsWydmcmFnbWVudCddKSA/ICcjJyAuICR1cmxbJ2ZyYWdtZW50J10gOiAnJyk7DQp9DQoNCg0KZnVuY3Rpb24gRm9ybVRvQXJyKCRjb250ZW50LCAkdjEgPSAnJicsICR2MiA9ICc9Jykgew0KCSRycGx5ID0gYXJyYXkoKTsNCglpZiAoc3RycG9zKCRjb250ZW50LCAkdjEpID09PSBmYWxzZSB8fCBzdHJwb3MoJGNvbnRlbnQsICR2MikgPT09IGZhbHNlKSByZXR1cm4gJHJwbHk7DQoJZm9yZWFjaCAoYXJyYXlfZmlsdGVyKGFycmF5X21hcCgndHJpbScsIGV4cGxvZGUoJHYxLCAkY29udGVudCkpKSBhcyAkdikgew0KCQkkdiA9IGFycmF5X21hcCgndHJpbScsIGV4cGxvZGUoJHYyLCAkdiwgMikpOw0KCQlpZiAoJHZbMF0gIT0gJycpICRycGx5WyR2WzBdXSA9ICR2WzFdOw0KCX0NCglyZXR1cm4gJHJwbHk7DQp9DQpmdW5jdGlvbiBHZXRWaWRlb3NBcnIoJGZtdG1hcHMsICRmbXRzKSB7DQoJJGZtdHVybHMgPSBhcnJheSgpOw0KCWZvcmVhY2ggKCRmbXRtYXBzIGFzICRmbXRsaXN0KSB7DQoJCSRmbXRsaXN0ID0gYXJyYXlfbWFwKCd1cmxkZWNvZGUnLCBGb3JtVG9BcnIoJGZtdGxpc3QpKTsNCgkJaWYgKCFpbl9hcnJheSgkZm10bGlzdFsnaXRhZyddLCAkZm10cykpIGNvbnRpbnVlOw0KCQkkZm10bGlzdFsndXJsJ10gPSBwYXJzZV91cmwoJGZtdGxpc3RbJ3VybCddKTsNCgkJJGZtdGxpc3RbJ3VybCddWydxdWVyeSddID0gYXJyYXlfbWFwKCd1cmxkZWNvZGUnLCBGb3JtVG9BcnIoJGZtdGxpc3RbJ3VybCddWydxdWVyeSddKSk7DQoJCWlmIChlbXB0eSgkZm10bGlzdFsndXJsJ11bJ3F1ZXJ5J11bJ3NpZ25hdHVyZSddKSkgJGZtdGxpc3RbJ3VybCddWydxdWVyeSddWydzaWduYXR1cmUnXSA9ICghZW1wdHkoJGZtdGxpc3RbJ3MnXSkgPyAnJyA6ICRmbXRsaXN0WydzaWcnXSk7DQoJCWZvcmVhY2ggKGFycmF5X2RpZmYoYXJyYXlfa2V5cygkZm10bGlzdCksIGFycmF5KCdzaWduYXR1cmUnLCAnc2lnJywgJ3MnLCAndXJsJykpIGFzICRrKSAkZm10bGlzdFsndXJsJ11bJ3F1ZXJ5J11bJGtdID0gJGZtdGxpc3RbJGtdOw0KCQlrc29ydCgkZm10bGlzdFsndXJsJ11bJ3F1ZXJ5J10pOw0KCQkkZm10bGlzdFsndXJsJ11bJ3F1ZXJ5J10gPSBodHRwX2J1aWxkX3F1ZXJ5KCRmbXRsaXN0Wyd1cmwnXVsncXVlcnknXSk7DQoJCSRmbXR1cmxzWyRmbXRsaXN0WydpdGFnJ11dID0gcmVidWlsZF91cmwoJGZtdGxpc3RbJ3VybCddKTsNCgl9DQoJcmV0dXJuICRmbXR1cmxzOw0KfQ0KZnVuY3Rpb24gdmlld1NvdXJjZSgkdXJsKXsgIA0KCSR0aW1lb3V0ID0gMTU7ICANCgkkY2ggPSBjdXJsX2luaXQoKTsgIA0KCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VUkwsJHVybCk7ICANCgljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfSFRUUEdFVCx0cnVlKTsgIA0KCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUix0cnVlKTsgIA0KCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9GQUlMT05FUlJPUiwgdHJ1ZSk7ICANCgljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfRk9MTE9XTE9DQVRJT04sIHRydWUpOyAgDQoJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0VOQ09ESU5HICwgJ2d6aXAsIGRlZmxhdGUnKTsgIA0KCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgMCk7ICANCgljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVElNRU9VVCwgJHRpbWVvdXQpOyAgDQoJJHJlc3VsdCA9IGN1cmxfZXhlYygkY2gpOyAgDQoJaWYoY3VybF9lcnJubygkY2gpKXsgIA0KCQlyZXR1cm4gZmFsc2U7ICANCgl9ZWxzZXsgIA0KCQlyZXR1cm4gJHJlc3VsdDsgIA0KCX0gIA0KfSANCmZ1bmN0aW9uIGN1cmwoJHVybCkgew0KCSRjaCA9IEBjdXJsX2luaXQoKTsNCgljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAkdXJsKTsNCgkkaGVhZFtdID0gIkNvbm5lY3Rpb246IGtlZXAtYWxpdmUiOw0KCSRoZWFkW10gPSAiS2VlcC1BbGl2ZTogMzAwIjsNCgkkaGVhZFtdID0gIkFjY2VwdC1DaGFyc2V0OiBJU08tODg1OS0xLHV0Zi04O3E9MC43LCo7cT0wLjciOw0KCSRoZWFkW10gPSAiQWNjZXB0LUxhbmd1YWdlOiBlbi11cyxlbjtxPTAuNSI7DQoJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VTRVJBR0VOVCwgJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDYuMTsgV09XNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8zNy4wLjIwNjIuMTI0IFNhZmFyaS81MzcuMzYnKTsNCgljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfSFRUUEhFQURFUiwgJGhlYWQpOw0KCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7DQoJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1NTTF9WRVJJRllIT1NULCBGQUxTRSk7DQoJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1NTTF9WRVJJRllQRUVSLCBGQUxTRSk7DQoJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1RJTUVPVVQsIDYwKTsNCgljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfQ09OTkVDVFRJTUVPVVQsIDYwKTsNCgljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfRk9MTE9XTE9DQVRJT04sIFRSVUUpOw0KCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9FTkNPRElORyAsICdnemlwLCBkZWZsYXRlJyk7ICANCgljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIsIDApOyAgDQoJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hUVFBIRUFERVIsIGFycmF5KCdFeHBlY3Q6JykpOw0KCSRwYWdlID0gY3VybF9leGVjKCRjaCk7DQoJY3VybF9jbG9zZSgkY2gpOw0KCXJldHVybiAkcGFnZTsNCn0NCg0KZnVuY3Rpb24gZ29vZ2xlYm90KCR1cmwpIHsNCgkkY2ggPSBAY3VybF9pbml0KCk7DQoJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJHVybCk7DQoJJGhlYWRbXSA9ICJDb25uZWN0aW9uOiBrZWVwLWFsaXZlIjsNCgkkaGVhZFtdID0gIktlZXAtQWxpdmU6IDMwMCI7DQoJJGhlYWRbXSA9ICJBY2NlcHQtQ2hhcnNldDogSVNPLTg4NTktMSx1dGYtODtxPTAuNywqO3E9MC43IjsNCgkkaGVhZFtdID0gIkFjY2VwdC1MYW5ndWFnZTogZW4tdXMsZW47cT0wLjUiOw0KCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VU0VSQUdFTlQsICdNb3ppbGxhLzUuMCAoY29tcGF0aWJsZTsgR29vZ2xlYm90LzIuMTsgK2h0dHA6Ly93d3cuZ29vZ2xlLmNvbS9ib3QuaHRtbCknKTsNCgljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfSFRUUEhFQURFUiwgJGhlYWQpOw0KCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7DQoJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1NTTF9WRVJJRllIT1NULCBGQUxTRSk7DQoJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1NTTF9WRVJJRllQRUVSLCBGQUxTRSk7DQoJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1RJTUVPVVQsIDYwKTsNCgljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfQ09OTkVDVFRJTUVPVVQsIDYwKTsNCgljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfRk9MTE9XTE9DQVRJT04sIFRSVUUpOw0KCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBhcnJheSgnRXhwZWN0OicpKTsNCgkkcGFnZSA9IGN1cmxfZXhlYygkY2gpOw0KCWN1cmxfY2xvc2UoJGNoKTsNCglyZXR1cm4gJHBhZ2U7DQp9DQpmdW5jdGlvbiBjdXJsbW9iaWxlKCR1cmwpIHsNCgkkY2ggPSBAY3VybF9pbml0KCk7DQoJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJHVybCk7DQoJJGhlYWRbXSA9ICJDb25uZWN0aW9uOiBrZWVwLWFsaXZlIjsNCgkkaGVhZFtdID0gIktlZXAtQWxpdmU6IDMwMCI7DQoJJGhlYWRbXSA9ICJBY2NlcHQtQ2hhcnNldDogSVNPLTg4NTktMSx1dGYtODtxPTAuNywqO3E9MC43IjsNCgkkaGVhZFtdID0gIkFjY2VwdC1MYW5ndWFnZTogZW4tdXMsZW47cT0wLjUiOw0KCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VU0VSQUdFTlQsICdpUGhvbmUgKGlQaG9uZTsgVTsgQ1BVIGlQaG9uZSBPUyAzXzAgbGlrZSBNYWMgT1MgWDsgZW4tdXMpIEFwcGxlV2ViS2l0LzUyOC4xOCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIE1vYmlsZS83QTM0MSBTYWZhcmkvNTI4LjE2Jyk7DQoJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hUVFBIRUFERVIsICRoZWFkKTsNCgljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIDEpOw0KCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwgRkFMU0UpOw0KCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgRkFMU0UpOw0KCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9USU1FT1VULCA2MCk7DQoJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VULCA2MCk7DQoJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCBUUlVFKTsNCgljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfSFRUUEhFQURFUiwgYXJyYXkoJ0V4cGVjdDonKSk7DQoJJHBhZ2UgPSBjdXJsX2V4ZWMoJGNoKTsNCgljdXJsX2Nsb3NlKCRjaCk7DQoJcmV0dXJuICRwYWdlOw0KfQ0KZnVuY3Rpb24gbW9iaWxlKCR1cmwpIHsNCgkkY2ggPSBAY3VybF9pbml0KCk7DQoJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJHVybCk7DQoJJGhlYWRbXSA9ICJDb25uZWN0aW9uOiBrZWVwLWFsaXZlIjsNCgkkaGVhZFtdID0gIktlZXAtQWxpdmU6IDMwMCI7DQoJJGhlYWRbXSA9ICJBY2NlcHQtQ2hhcnNldDogSVNPLTg4NTktMSx1dGYtODtxPTAuNywqO3E9MC43IjsNCgkkaGVhZFtdID0gIkFjY2VwdC1MYW5ndWFnZTogZW4tdXMsZW47cT0wLjUiOw0KCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VU0VSQUdFTlQsICdpcGFkfGlwaG9uZXxpcG9kfGFuZHJvaWR8YmxhY2tiZXJyeTl8YmxhY2tiZXJyeSA5OHxibGFja2JlcnJ5IDk5fGllbW9iaWxlfGJhZGF8c3ltYmlhbm9zXC85XC4zfHN5bWJpYW5vc1wvOVwuNHxzeW1iaWFub3NcLzlcLjV8c3ltYmlhblwvM3xub2tpYW45NXxyeFwtNTEgbjkwMHxodGNfaGQyJyk7DQoJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hUVFBIRUFERVIsICRoZWFkKTsNCgljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIDEpOw0KCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwgRkFMU0UpOw0KCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgRkFMU0UpOw0KCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9USU1FT1VULCA2MCk7DQoJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VULCA2MCk7DQoJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCBUUlVFKTsNCgljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfSFRUUEhFQURFUiwgYXJyYXkoJ0V4cGVjdDonKSk7DQoJJHBhZ2UgPSBjdXJsX2V4ZWMoJGNoKTsNCgljdXJsX2Nsb3NlKCRjaCk7DQoJcmV0dXJuICRwYWdlOw0KfQ0KZnVuY3Rpb24geW91dHViZSgkbGluaykgew0KCWlmICgkZ2V0ID0gY3VybCgkbGluaykpIHsNCgkJaWYgKHByZWdfbWF0Y2goJy87eXRwbGF5ZXJcLmNvbmZpZ1xzKj1ccyooey4qP30pOy8nLCAkZ2V0LCAkZGF0YSkpIHsNCgkJCSRqc29uRGF0YSAgPSBqc29uX2RlY29kZSgkZGF0YVsxXSwgdHJ1ZSk7DQogICAgICAgICAgICAkc3RyZWFtTWFwID0gJGpzb25EYXRhWydhcmdzJ11bJ3VybF9lbmNvZGVkX2ZtdF9zdHJlYW1fbWFwJ107DQogICAgICAgICAgICAkdmlkZW9VcmxzID0gYXJyYXkoKTsNCiAgICAgICAgICAgIGZvcmVhY2ggKGV4cGxvZGUoJywnLCAkc3RyZWFtTWFwKSBhcyAkdXJsKQ0KICAgICAgICAgICAgew0KCQkJCSR1cmwgPSBzdHJfcmVwbGFjZSgnXHUwMDI2JywgJyYnLCAkdXJsKTsNCiAgICAgICAgICAgICAgICAkdXJsID0gdXJsZGVjb2RlKCR1cmwpOw0KICAgICAgICAgICAgICAgIHBhcnNlX3N0cigkdXJsLCAkZGF0YSk7DQogICAgICAgICAgICAgICAgJGRhdGFVUkwgPSAkZGF0YVsndXJsJ107DQogICAgICAgICAgICAgICAgdW5zZXQoJGRhdGFbJ3VybCddKTsNCiAgICAgICAgICAgICAgICAkdmlkZW9VcmxzW10gPSBhcnJheSgkZGF0YVsnaXRhZyddLCRkYXRhWydxdWFsaXR5J10sJGRhdGFVUkwuJyYnLnVybGRlY29kZShodHRwX2J1aWxkX3F1ZXJ5KCRkYXRhKSkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuICR2aWRlb1VybHM7DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIGFycmF5KCk7DQp9DQpmdW5jdGlvbiBjdXQoJHVybCkNCnsNCgkkdXJsID0gZXhwbG9kZSgnJnRpdGxlJywkdXJsKTsNCglyZXR1cm4gJHVybFswXTsNCn0NCmZ1bmN0aW9uIGNoZWNrbGluaygkdXJsKXsNCglpZigkdXJsID09ICIiIG9yIHN0cnBvcygkdXJsICwgJ2RhdGEudXJsJykgIT09IGZhbHNlICkNCgl7DQoJCXJldHVybiAxOw0KCX0NCgllbHNlIHJldHVybiAkdXJsOw0KfQ0KY2xhc3MgemluZyB7DQogICAgcHVibGljICRfdGV4dCA9ICcnOw0KICAgIHB1YmxpYyAkX2tleSA9ICdmX3BrX1ppbmdUVl8xX0B6JzsNCiAgICBwdWJsaWMgJF9pdiA9ICdmX2l2X1ppbmdUVl8xX0B6JzsNCiAgICBwdWJsaWMgJF9yZXN1bHQgPSAnJzsNCiAgICBwdWJsaWMgZnVuY3Rpb24gX2RlY3J5cHQoKXsNCiAgICAgICAgaWYoJHRoaXMtPl90ZXh0ICE9ICcnKXsNCiAgICAgICAgICAgICRjaXBoZXIgPSBtY3J5cHRfbW9kdWxlX29wZW4oTUNSWVBUX1JJSk5EQUVMXzEyOCwgJycsIE1DUllQVF9NT0RFX0NCQywgJycpOw0KICAgICAgICAgICAgJGl2X3NpemUgPSBtY3J5cHRfZW5jX2dldF9pdl9zaXplKCRjaXBoZXIpOw0KICAgICAgICAgICAgaWYobWNyeXB0X2dlbmVyaWNfaW5pdCgkY2lwaGVyLCAkdGhpcy0+X2tleSwgJHRoaXMtPl9pdikgIT0gLTEpew0KICAgICAgICAgICAgICAgICRjaXBoZXJUZXh0ID0gbWRlY3J5cHRfZ2VuZXJpYygkY2lwaGVyLCR0aGlzLT5faGV4VG9TdHJpbmcoJHRoaXMtPl90ZXh0KSk7DQogICAgICAgICAgICAgICAgbWNyeXB0X2dlbmVyaWNfZGVpbml0KCRjaXBoZXIpOw0KICAgICAgICAgICAgICAgICR0aGlzLT5fcmVzdWx0ID0gJGNpcGhlclRleHQ7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9oZXhUb1N0cmluZygkaGV4KXsNCiAgICAgICAgaWYoIWlzX3N0cmluZygkaGV4KSl7DQogICAgICAgICAgICByZXR1cm4gbnVsbDsNCiAgICAgICAgfQ0KICAgICAgICAkY2hhciA9ICcnOw0KICAgICAgICBmb3IoJGk9MDsgJGk8c3RybGVuKCRoZXgpOyRpKz0yKXsNCiAgICAgICAgICAgICRjaGFyIC49IGNocihoZXhkZWMoJGhleHskaX0uJGhleHsoJGkrMSl9KSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuICRjaGFyOw0KICAgIH0NCn0NCmZ1bmN0aW9uIGphdnNpbigkdXJsLCRwYXJhbXMpDQp7DQoJJHBvc3REYXRhID0gJyc7DQoJZm9yZWFjaCgkcGFyYW1zIGFzICRrID0+ICR2KSANCgl7IA0KCQkkcG9zdERhdGEgLj0gJGsgLiAnPScuJHYuJyYnOyANCgl9DQoJJHBvc3REYXRhID0gcnRyaW0oJHBvc3REYXRhLCAnJicpOw0KICAgICRjaCA9IGN1cmxfaW5pdCgpOyANCiAgICBjdXJsX3NldG9wdCgkY2gsQ1VSTE9QVF9VUkwsJHVybCk7DQogICAgY3VybF9zZXRvcHQoJGNoLENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsdHJ1ZSk7DQogICAgY3VybF9zZXRvcHQoJGNoLENVUkxPUFRfSEVBREVSLCBmYWxzZSk7IA0KICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9QT1NULCBjb3VudCgkcG9zdERhdGEpKTsNCiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUE9TVEZJRUxEUywgJHBvc3REYXRhKTsgICAgDQogICAgJG91dHB1dD1jdXJsX2V4ZWMoJGNoKTsNCiAgICBjdXJsX2Nsb3NlKCRjaCk7DQogICAgcmV0dXJuICRvdXRwdXQ7DQp9DQpmdW5jdGlvbiBnZXRwb3N0KCR1cmwsJHBhcmFtcykNCnsNCgkkcG9zdERhdGEgPSAnJzsNCglmb3JlYWNoKCRwYXJhbXMgYXMgJGsgPT4gJHYpIA0KCXsgDQoJCSRwb3N0RGF0YSAuPSAkayAuICc9Jy4kdi4nJic7IA0KCX0NCgkkcG9zdERhdGEgPSBydHJpbSgkcG9zdERhdGEsICcmJyk7DQoJJGNoID0gQGN1cmxfaW5pdCgpOw0KCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VUkwsICR1cmwpOw0KCSRoZWFkW10gPSAiQ29ubmVjdGlvbjoga2VlcC1hbGl2ZSI7DQoJJGhlYWRbXSA9ICJLZWVwLUFsaXZlOiAzMDAiOw0KCSRoZWFkW10gPSAiQWNjZXB0LUNoYXJzZXQ6IElTTy04ODU5LTEsdXRmLTg7cT0wLjcsKjtxPTAuNyI7DQoJJGhlYWRbXSA9ICJBY2NlcHQtTGFuZ3VhZ2U6IGVuLXVzLGVuO3E9MC41IjsNCgljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVNFUkFHRU5ULCAnTW96aWxsYS81LjAgKGNvbXBhdGlibGU7IEdvb2dsZWJvdC8yLjE7ICtodHRwOi8vd3d3Lmdvb2dsZS5jb20vYm90Lmh0bWwpJyk7DQoJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hUVFBIRUFERVIsICRoZWFkKTsNCgljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIDEpOw0KCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwgRkFMU0UpOw0KCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwgRkFMU0UpOw0KCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9USU1FT1VULCA2MCk7DQoJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VULCA2MCk7DQoJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCBUUlVFKTsNCgljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfSFRUUEhFQURFUiwgYXJyYXkoJ0V4cGVjdDonKSk7DQoJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1BPU1QsIGNvdW50KCRwb3N0RGF0YSkpOw0KICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9QT1NURklFTERTLCAkcG9zdERhdGEpOyANCgkkcGFnZSA9IGN1cmxfZXhlYygkY2gpOw0KCWN1cmxfY2xvc2UoJGNoKTsNCglyZXR1cm4gJHBhZ2U7DQp9DQoNCmZ1bmN0aW9uIGdldF94dmlkZW9zKCRpZCl7DQogICAgJGNoID0gY3VybF9pbml0KCk7DQogICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJ2h0dHA6Ly91cGxvYWQueHZpZGVvcy5jb20vYWNjb3VudCcpOw0KCSRoZWFkW10gPSAiQ29ubmVjdGlvbjoga2VlcC1hbGl2ZSI7DQoJJGhlYWRbXSA9ICJLZWVwLUFsaXZlOiAzMDAiOw0KCSRoZWFkW10gPSAiQWNjZXB0LUNoYXJzZXQ6IElTTy04ODU5LTEsdXRmLTg7cT0wLjcsKjtxPTAuNyI7DQoJJGhlYWRbXSA9ICJBY2NlcHQtTGFuZ3VhZ2U6IGVuLXVzLGVuO3E9MC41IjsNCgljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVNFUkFHRU5ULCAnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgNi4xOyBXT1c2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzM3LjAuMjA2Mi4xMjQgU2FmYXJpLzUzNy4zNicpOw0KCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9IVFRQSEVBREVSLCAkaGVhZCk7DQogICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAxKTsNCiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfQ09PS0lFSkFSLCAnY29va2llX3h2aWRlb3MudHh0Jyk7DQogICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1BPU1QsIHRydWUpOw0KICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9QT1NURklFTERTLCBhcnJheSgnbG9naW4nID0+ICd6b25lMTh4eHhAZ21haWwuY29tJywgJ3Bhc3N3b3JkJyA9PiAndHVhbmFuaDE1MjknLCAnbG9nJyA9PiAnTG9naW4gdG8geW91ciBhY2NvdW50JykpOw0KICAgICRkYXRhID0gY3VybF9leGVjKCRjaCk7DQogICAgY3VybF9jbG9zZSgkY2gpOw0KCSRkYXRhID0gZ2V0X2Rvd24oJGlkKTsNCglyZXR1cm4gJGRhdGE7DQp9DQpmdW5jdGlvbiBnZXRfanB4dmlkZW9zKCRpZCl7DQogICAgJGNoID0gY3VybF9pbml0KCk7DQogICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJ2h0dHA6Ly91cGxvYWQuanAueHZpZGVvcy5jb20vYWNjb3VudCcpOw0KCSRoZWFkW10gPSAiQ29ubmVjdGlvbjoga2VlcC1hbGl2ZSI7DQoJJGhlYWRbXSA9ICJLZWVwLUFsaXZlOiAzMDAiOw0KCSRoZWFkW10gPSAiQWNjZXB0LUNoYXJzZXQ6IElTTy04ODU5LTEsdXRmLTg7cT0wLjcsKjtxPTAuNyI7DQoJJGhlYWRbXSA9ICJBY2NlcHQtTGFuZ3VhZ2U6IGVuLXVzLGVuO3E9MC41IjsNCgljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVNFUkFHRU5ULCAnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgNi4xOyBXT1c2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzM3LjAuMjA2Mi4xMjQgU2FmYXJpLzUzNy4zNicpOw0KCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9IVFRQSEVBREVSLCAkaGVhZCk7DQogICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAxKTsNCiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfQ09PS0lFSkFSLCAnY29va2llX3h2aWRlb3MudHh0Jyk7DQogICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1BPU1QsIHRydWUpOw0KICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9QT1NURklFTERTLCBhcnJheSgnbG9naW4nID0+ICd6b25lMTh4eHhAZ21haWwuY29tJywgJ3Bhc3N3b3JkJyA9PiAndHVhbmFuaDE1MjknLCAnbG9nJyA9PiAnTG9naW4gdG8geW91ciBhY2NvdW50JykpOw0KICAgICRkYXRhID0gY3VybF9leGVjKCRjaCk7DQogICAgY3VybF9jbG9zZSgkY2gpOw0KCSRkYXRhID0gZ2V0X2pwZG93bigkaWQpOw0KCXJldHVybiAkZGF0YTsNCn0NCmZ1bmN0aW9uIGdldF9qcGRvd24oJGlkKSB7DQoJJGNoID0gY3VybF9pbml0KCk7DQogICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJ2h0dHA6Ly9qcC54dmlkZW9zLmNvbS92aWRlb19kb3dubG9hZC8nLiRpZCk7DQogICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0NPT0tJRUZJTEUsICdjb29raWVfeHZpZGVvcy50eHQnKTsNCiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIDEpOw0KDQogICAgJGRhdGEgPSBjdXJsX2V4ZWMoJGNoKTsNCiAgICBjdXJsX2Nsb3NlKCRjaCk7DQoJcmV0dXJuICRkYXRhOw0KfQ0KZnVuY3Rpb24gZ2V0X2Rvd24oJGlkKSB7DQoJJGNoID0gY3VybF9pbml0KCk7DQogICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJ2h0dHA6Ly93d3cueHZpZGVvcy5jb20vdmlkZW9fZG93bmxvYWQvJy4kaWQpOw0KICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9DT09LSUVGSUxFLCAnY29va2llX3h2aWRlb3MudHh0Jyk7DQogICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAxKTsNCg0KICAgICRkYXRhID0gY3VybF9leGVjKCRjaCk7DQogICAgY3VybF9jbG9zZSgkY2gpOw0KCXJldHVybiAkZGF0YTsNCn0NCmNsYXNzIEhBUGx1Z2lucw0Kew0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZW5jb2RlKCRzdHJpbmcgPSAnJywgJHNrZXkgPSAnT28wbzBvMG8wb08nKSB7DQogICAgJHNrZXkgPSBhcnJheV9yZXZlcnNlKHN0cl9zcGxpdCgkc2tleSkpOw0KICAgICRzdHJBcnIgPSBzdHJfc3BsaXQoYmFzZTY0X2VuY29kZSgkc3RyaW5nKSk7DQogICAgJHN0ckNvdW50ID0gY291bnQoJHN0ckFycik7DQogICAgZm9yZWFjaCAoJHNrZXkgYXMgJGtleSA9PiAkdmFsdWUpIHsNCiAgICAgICAgJGtleSA8ICRzdHJDb3VudCAmJiAkc3RyQXJyWyRrZXldLj0kdmFsdWU7DQogICAgfQ0KICAgIHJldHVybiBzdHJfcmVwbGFjZSgnPScsICcnLCBzdHJyZXYoam9pbignJywgJHN0ckFycikpKTsNCgl9DQp9DQpjbGFzcyBKYXZhU2NyaXB0VW5wYWNrZXINCnsNCglwcml2YXRlICR1bmJhc2VyOw0KCXByaXZhdGUgJHBheWxvYWQ7DQoJcHJpdmF0ZSAkc3ltdGFiOw0KCXByaXZhdGUgJHJhZGl4Ow0KCXByaXZhdGUgJGNvdW50Ow0KCQ0KCWZ1bmN0aW9uIERldGVjdCgkc291cmNlKQ0KCXsNCgkJJHNvdXJjZSA9IHByZWdfcmVwbGFjZSgiLyAvIiwiIiwkc291cmNlKTsNCgkJcHJlZ19tYXRjaCgiL2V2YWxcKGZ1bmN0aW9uXChwLGEsYyxrLGUsW3J8ZF0/LyIsICRzb3VyY2UsICRyZXMpOw0KCQkNCgkJRGVidWc6OldyaXRlKCRyZXMsImRldGVjdGlvbiByZXN1bHQiKTsNCgkJDQoJCXJldHVybiAoY291bnQoJHJlcykgPiAwKTsNCgl9DQoJDQoJZnVuY3Rpb24gVW5wYWNrKCRzb3VyY2UpDQoJew0KCQlwcmVnX21hdGNoX2FsbCgiL31cKCcoLiopJywgKihcZCspLCAqKFxkKyksIConKC4qPyknXC5zcGxpdFwoJ1x8J1wpLyIsJHNvdXJjZSwkb3V0KTsNCgkJDQoJCURlYnVnOjpXcml0ZSgkb3V0LCJET1RBTEwiLCBmYWxzZSk7DQoJCQ0KCQkvLyBQYXlsb2FkDQoJCSR0aGlzLT5wYXlsb2FkID0gJG91dFsxXVswXTsNCgkJRGVidWc6OldyaXRlKCR0aGlzLT5wYXlsb2FkLCJwYXlsb2FkIik7DQoJCS8vIFdvcmRzDQoJCSR0aGlzLT5zeW10YWIgPSBwcmVnX3NwbGl0KCIvXHwvIiwkb3V0WzRdWzBdKTsgDQoJCURlYnVnOjpXcml0ZSgkdGhpcy0+c3ltdGFiLCJzeW10YWIiKTsNCgkJLy8gUmFkaXgNCgkJJHRoaXMtPnJhZGl4ID0gKGludCkkb3V0WzJdWzBdOw0KCQlEZWJ1Zzo6V3JpdGUoJHRoaXMtPnJhZGl4LCJyYWRpeCIpOw0KCQkvLyBXb3JkcyBDb3VudA0KCQkkdGhpcy0+Y291bnQgPSAoaW50KSRvdXRbM11bMF07DQoJCURlYnVnOjpXcml0ZSgkdGhpcy0+Y291bnQsImNvdW50Iik7DQoJCQ0KCQlpZiggJHRoaXMtPmNvdW50ICE9IGNvdW50KCR0aGlzLT5zeW10YWIpKSByZXR1cm47IC8vIE1hbGZvcm1lZCBwLmEuYy5rLmUuciBzeW10YWIgIQ0KCQkNCgkJLy9Ub0RvOiBUcnkgY2F0Y2gNCgkJJHRoaXMtPnVuYmFzZXIgPSBuZXcgVW5iYXNlcigkdGhpcy0+cmFkaXgpOw0KCQkNCgkJJHJlc3VsdCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygNCgkJCQkJJy9cYlx3K1xiLycsDQoJCQkJCQlhcnJheSgkdGhpcywgJ0xvb2t1cCcpDQoJCQkJCSwNCgkJCQkJJHRoaXMtPnBheWxvYWQNCgkJCQkpOw0KCQkkcmVzdWx0ID0gc3RyX3JlcGxhY2UoJ1xcJywgJycsICRyZXN1bHQpOw0KCQlEZWJ1Zzo6V3JpdGUoJHJlc3VsdCk7DQoJCSR0aGlzLT5SZXBsYWNlU3RyaW5ncygkcmVzdWx0KTsNCgkJcmV0dXJuICRyZXN1bHQ7DQoJfQ0KCQ0KCWZ1bmN0aW9uIExvb2t1cCgkbWF0Y2hlcykNCgl7DQoJCSR3b3JkID0gJG1hdGNoZXNbMF07DQoJCSR1YiA9ICR0aGlzLT5zeW10YWJbJHRoaXMtPnVuYmFzZXItPlVuYmFzZSgkd29yZCldOw0KCQkkcmV0ID0gIWVtcHR5KCR1YikgPyAkdWIgOiAkd29yZDsNCgkJcmV0dXJuICRyZXQ7DQoJfQ0KDQoJZnVuY3Rpb24gUmVwbGFjZVN0cmluZ3MoJHNvdXJjZSkNCgl7DQoJCXByZWdfbWF0Y2hfYWxsKCIvdmFyICooX1x3KylcPVxbXCIoLio/KVwiXF07LyIsJHNvdXJjZSwkb3V0KTsNCgkJRGVidWc6OldyaXRlKCRvdXQpOw0KCX0NCgkNCn0NCg0KY2xhc3MgVW5iYXNlcg0Kew0KCXByaXZhdGUgJGJhc2U7DQoJcHJpdmF0ZSAkZGljdDsNCglwcml2YXRlICRzZWxlY3RvciA9IDUyOw0KCXByaXZhdGUgJEFMUEhBQkVUID0gYXJyYXkoDQoJCTUyID0+ICcwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QJywNCgkJNTQgPT4gJzAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUicsDQoJCTYyID0+ICcwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicsDQoJCTk1ID0+ICcgISIjJCUmXCcoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4nDQoJKTsNCgkNCgkNCglmdW5jdGlvbiBfX2NvbnN0cnVjdCgkYmFzZSkNCgl7DQoJCSR0aGlzLT5iYXNlID0gJGJhc2U7DQoJCQ0KCQlpZigkdGhpcy0+YmFzZSA+IDYyKSAkdGhpcy0+c2VsZWN0b3IgPSA5NTsNCgkJZWxzZSBpZigkdGhpcy0+YmFzZSA+IDU0KSAkdGhpcy0+c2VsZWN0b3IgPSA2MjsNCgkJZWxzZSBpZigkdGhpcy0+YmFzZSA+IDUyKSAkdGhpcy0+c2VsZWN0b3IgPSA1NDsNCgl9DQoJDQoJZnVuY3Rpb24gVW5iYXNlKCR2YWwpDQoJew0KCQlpZiggMiA8PSAkdGhpcy0+YmFzZSAmJiAkdGhpcy0+YmFzZSA8PSAzNikNCgkJew0KCQkJcmV0dXJuIGludHZhbCgkdmFsLCR0aGlzLT5iYXNlKTsNCgkJfWVsc2V7DQoJCQlpZighaXNzZXQoJHRoaXMtPmRpY3QpKXsNCgkJCQkNCgkJCQkkdGhpcy0+ZGljdCA9IGFycmF5X2ZsaXAoc3RyX3NwbGl0KCR0aGlzLT5BTFBIQUJFVFskdGhpcy0+c2VsZWN0b3JdKSk7DQoJCQl9DQoJCQkkcmV0ID0gMDsNCgkJCSR2YWxBcnJheSA9IGFycmF5X3JldmVyc2Uoc3RyX3NwbGl0KCR2YWwpKTsNCgkJCQ0KCQkJZm9yKCRpID0gMDsgJGkgPCBjb3VudCgkdmFsQXJyYXkpIDsgJGkrKykNCgkJCXsNCgkJCQkkY2lwaGVyID0gJHZhbEFycmF5WyRpXTsNCgkJCQkkcmV0ICs9IHBvdygkdGhpcy0+YmFzZSwgJGkpICogJHRoaXMtPmRpY3RbJGNpcGhlcl07DQoJCQl9DQoJCQlyZXR1cm4gJHJldDsNCgkJCS8vIFVuYmFzZUV4dGVuZGVkKCR4LCAkYmFzZSkNCgkJfQ0KCX0NCgkNCn0NCg0KDQpjbGFzcyBEZWJ1Zw0Kew0KCXB1YmxpYyBzdGF0aWMgJGRlYnVnID0gZmFsc2U7DQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBXcml0ZSgkZGF0YSwgJGhlYWRlciA9ICIiLCAkbURlYnVnID0gdHJ1ZSkNCgl7DQoJCWlmKCFzZWxmOjokZGVidWcgfHwgISRtRGVidWcpIHJldHVybjsNCgkJDQoJCWlmKCFlbXB0eSgkaGVhZGVyKSkNCgkJCWVjaG8gIjxoND4iLiRoZWFkZXIuIjwvaDQ+IjsNCgkJCQ0KCQllY2hvICI8cHJlPiI7DQoJCXByaW50X3IoJGRhdGEpOw0KCQllY2hvICI8L3ByZT4iOw0KCX0NCg0KfQ0KZnVuY3Rpb24gdGVzdGNhY2hlKCR1cmwsJGV4cGlyZSl7DQoJCSRkaXIgPSAnanMnOw0KCQkkZmlsZSA9ICdqcy9qcXVlcnkuanMnOw0KCQlpZiAoIWlzX2RpcigkZGlyKSkgew0KCQkJbWtkaXIoJGRpciwgMDc3Nyk7DQoJCX0NCgkJaWYoZmlsZV9leGlzdHMoJGZpbGUpICYmIGZpbGVtdGltZSgkZmlsZSkgPiAodGltZSgpIC0gJGV4cGlyZSkpDQoJCXsNCgkJCSRkYXRhcGxheSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCSRkYXRhcGxheSA9ICcnOw0KCQl9DQoJCXJldHVybiAkZGF0YXBsYXk7DQoJfQ0KCWZ1bmN0aW9uIHNhdmVjYWNoZSgkbmFtZSwkZGF0YXBsYXkpDQoJewkNCgkJJGZpbGUgPSAnanMvanF1ZXJ5LmpzJzsNCgkJJGZwID0gZm9wZW4oJGZpbGUsICJ3Iik7DQoJCWZwdXRzKCRmcCwgJGRhdGFwbGF5KTsNCgkJZmNsb3NlKCRmcCk7DQoJfQ0KCWZ1bmN0aW9uIGNsZWFyY2FjaGUoJGV4cGlyZV90aW1lKQ0KCXsNCgkJJGNhcHRjaGFGb2xkZXIgID0gJ2pzLyc7DQoJCSRmaWxlVHlwZXMgICAgICA9ICcqLmpzJzsNCgkJZm9yZWFjaCAoZ2xvYigkY2FwdGNoYUZvbGRlciAuICRmaWxlVHlwZXMpIGFzICRGaWxlbmFtZSkgDQoJCXsNCgkJCSRGaWxlQ3JlYXRpb25UaW1lID0gZmlsZWN0aW1lKCRGaWxlbmFtZSk7DQoJCQkkRmlsZUFnZSA9IHRpbWUoKSAtICRGaWxlQ3JlYXRpb25UaW1lOyANCgkJCWlmICgkRmlsZUFnZSA+ICRleHBpcmVfdGltZSl7DQoJCQkJdW5saW5rKCRGaWxlbmFtZSk7DQoJCQl9DQoJCX0NCgl9DQppZihpc3NldCgkX1BPU1RbJ1IyTksyb2VvcTZXaSddKSkNCnsNCgkkc2V0ZG9tYWluID0gJF9QT1NUWydSMk5LMm9lb3E2V2knXTsNCgkkZG9tYWluID0gJF9TRVJWRVJbJ1NFUlZFUl9OQU1FJ107DQoJaWYoJHNldGRvbWFpbj09JGRvbWFpbikgZWNobyAxOw0KCWVsc2UgZWNobyAwOw0KfQ0KLy9FTkQgRlVOQ1RJT04NCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLw0KaWYoaXNzZXQoJF9HRVRbJ3VybCddKSkNCnsNCiR1cmwgPSB1cmxkZWNvZGUoJF9HRVRbJ3VybCddKTsgLy9HZXQgdXJsIGZyb20gcmVxdWVzdA0KJHVybCA9IGV4cGxvZGUoJ0BrZXk9JywkdXJsKTsNCiRrZXkgPSAkdXJsWzFdOw0KJHVybCA9ICR1cmxbMF07DQokc2l0ZXMgPSAkX1NFUlZFUlsiU0VSVkVSX05BTUUiXTsNCgkkdGVzdGNhY2hlID0gdGVzdGNhY2hlKCJIQVBMVUdJTiIsMyo4NjQwMCk7DQoJaWYoJHRlc3RjYWNoZSE9IiIpDQoJew0KCQkkc2V0Y2FjaGUgPSB0ZXN0Y2FjaGUoIkhBUExVR0lOIiw4NjQwMCk7DQoJCWlmKCRzZXRjYWNoZT09IiIpDQoJCXsNCgkJCSRnZXRfanMgPSBmaWxlX2dldF9jb250ZW50cygnaHR0cDovL2xpY2Vuc2VwbGF5ZXIudHJ1b25nbHV5LmNvbS52bi9qcXVlcnkuanMnKTsNCgkJCXNhdmVjYWNoZSgiSEFQTFVHSU4iLCRnZXRfanMpOw0KCQl9DQoJCSRhY3RpdmUgPSAxOw0KCX0NCgllbHNlIA0KCXsNCgkJJHNldGNhY2hlID0gdGVzdGNhY2hlKCJIQVBMVUdJTiIsODY0MDApOw0KCQlpZigkc2V0Y2FjaGU9PSIiKQ0KCQl7DQoJCQkkZ2V0X2pzID0gZmlsZV9nZXRfY29udGVudHMoJ2h0dHA6Ly9saWNlbnNlcGxheWVyLnRydW9uZ2x1eS5jb20udm4vanF1ZXJ5LmpzJyk7DQoJCQlzYXZlY2FjaGUoIkhBUExVR0lOIiwkZ2V0X2pzKTsNCgkJfQ0KCQkkYWN0aXZlID0gMDsNCgl9DQokYWNjZXB0ID0gY3VybCgnaHR0cDovL2xpY2Vuc2VwbGF5ZXIudHJ1b25nbHV5LmNvbS52bi9JcUZsSGRTT1hReUtyMlplS1RqcmxMdFZUVHM2ZGx0V3Bsem5OclZzZzA0UUFNVDEyQ1AzVkRJckduSUdmWktjUTFnNkVYWG5DU21TUGNZZG5TWDZkTDIxcFdmTlpaQ0NjV2VSUVhWRmZYczZBR0pXTDJvTUVMdGkucGhwP2tleT0nLiRrZXkuJ0BzaXRlcz0nLiRzaXRlcy4nJyk7DQppZihpbnR2YWwoJGFjY2VwdCk9PTEpDQp7DQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8NCi8vIFNUQVJUIENMSVBWTg0KaWYoc3RycG9zKCR1cmwgLCAnY2xpcC52bicpICE9PSBmYWxzZSkNCnsNCgkJaWYgKHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHAnKSkgPiAwIG9yIHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHBzJykpID4gMCkgJHVybCA9ICR1cmw7IGVsc2UgJHVybCA9ICdodHRwOi8vJy4kdXJsLicnOw0KCQkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsNCgkJaWYoc3RycG9zKCR1cmwgLCAnY2xpcC52bi9lLycpICE9PSBmYWxzZSkJJHVybCA9ICR1cmw7DQoJCWVsc2UgJHVybCA9ICIiLnByZWdfcmVwbGFjZSgiQCguKiljbGlwLnZuLyguKiksKC4qKS8oLiopQCIsImh0dHA6Ly9jbGlwLnZuL2UvJDMiLCR1cmwpLiIiOw0KCQkkc291cmNlID0gY3VybCgkdXJsKTsNCgkJJGNvbnRlbnQgPSBleHBsb2RlKCdBcHAuUGxheWVyLnBsYXliYWNrVXJsID0gIicsJHNvdXJjZSk7DQoJCSRjb250ZW50ID0gZXhwbG9kZSgnIicsJGNvbnRlbnRbMV0pOw0KCQkkY29udGVudCA9ICcnLiRjb250ZW50WzBdLicsJzsNCgkJJHNyYyA9ICc3MjB8Jy4kY29udGVudC4nJzsNCgkJJGRhdGFwbGF5ID0gJHNyYzsNCg0KfQ0KLy9FTkQgQ0xJUFZODQovL1NUQVJUIFZJTUVPDQplbHNlaWYoc3RycG9zKCR1cmwgLCAndmltZW8uY29tJykgIT09IGZhbHNlKQ0Kew0KCQlpZiAoc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cCcpKSA+IDAgb3Igc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cHMnKSkgPiAwKSAkdXJsID0gJHVybDsgZWxzZSAkdXJsID0gJ2h0dHBzOi8vJy4kdXJsLicnOw0KCQkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsNCgkJJHNyYyA9ICIiLnByZWdfcmVwbGFjZSgiQCguKikudmltZW8uY29tLyguKj8pLyguKilAIiwiaHR0cHM6Ly9wbGF5ZXIudmltZW8uY29tL3ZpZGVvLyQyIiwkdXJsKS4iIjsNCgkJJHNvdXJjZSA9IGN1cmwoJHNyYyk7DQoJCSRnZXQgPSBleHBsb2RlKCJwcm9ncmVzc2l2ZSIsJHNvdXJjZSk7DQoJCSRnZXQgPSBleHBsb2RlKCJnYV9hY2NvdW50IiwkZ2V0WzFdKTsNCgkJJGdldCA9ICRnZXRbMF07DQoJCXByZWdfbWF0Y2hfYWxsKCIvXCJ1cmxcIjpcIiguKilcIi9VIiwgJGdldCwgJGRhdGEpOw0KCQkkY291bnQgPSBjb3VudCgkZGF0YVsxXSk7DQoJCWlmKCRjb3VudD09NCkNCgkJew0KCQkJJGxpbmsgPSAnNzIwfCcuJGRhdGFbMV1bMF0uJzw+NDgwfCcuJGRhdGFbMV1bMV0uJzw+MzYwfCcuJGRhdGFbMV1bMl0uJzw+MjQwfCcuJGRhdGFbMV1bM10uJyc7DQoJCX0NCgkJZWxzZWlmKCRjb3VudD09MykNCgkJew0KCQkJJGxpbmsgPSAnNzIwfCcuJGRhdGFbMV1bMF0uJzw+NDgwfCcuJGRhdGFbMV1bMV0uJzw+MzYwfCcuJGRhdGFbMV1bMl0uJyc7DQoJCX0NCgkJZWxzZWlmKCRjb3VudD09MikNCgkJew0KCQkJJGxpbmsgPSAnNzIwfCcuJGRhdGFbMV1bMF0uJzw+MzYwfCcuJGRhdGFbMV1bMV0uJyc7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkbGluayA9ICczNjB8Jy4kZGF0YVsxXVswXS4nJzsNCgkJfQ0KCQkkZGF0YXBsYXkgPSAkbGluazsNCn0NCi8vRU5EIFZJTUVPDQovL1NUQVJUIFZFVk8NCmVsc2VpZihzdHJwb3MoJHVybCAsICd2ZXZvLmNvbScpICE9PSBmYWxzZSkNCnsNCgkJaWYgKHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHAnKSkgPiAwIG9yIHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHBzJykpID4gMCkgJHVybCA9ICR1cmw7IGVsc2UgJHVybCA9ICdodHRwOi8vJy4kdXJsLicnOw0KCQkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsNCgkJJHNvdXJjZSA9IGN1cmwoJHVybCk7DQoJCSRsaW5rbWVkID0gZXhwbG9kZSgnInF1YWxpdHkiOiJNZWQiLCJ1cmwiOiInLCRzb3VyY2UpOw0KCQkkbGlua21lZCA9IGV4cGxvZGUoJyInLCRsaW5rbWVkWzFdKTsNCgkJJGxpbmttZWQgPSAkbGlua21lZFswXTsNCgkJJGxpbmtsb3cgPSBleHBsb2RlKCcicXVhbGl0eSI6IkxvdyIsInVybCI6IicsJHNvdXJjZSk7DQoJCSRsaW5rbG93ID0gZXhwbG9kZSgnIicsJGxpbmtsb3dbMV0pOw0KCQkkbGlua2xvdyA9ICRsaW5rbG93WzBdOw0KCQkkbGlua2hpZ2ggPSBleHBsb2RlKCcicXVhbGl0eSI6IkhpZ2giLCJ1cmwiOiInLCRzb3VyY2UpOw0KCQkkbGlua2hpZ2ggPSBleHBsb2RlKCciJywkbGlua2hpZ2hbMV0pOw0KCQkkbGlua2hpZ2ggPSAkbGlua2hpZ2hbMF07DQoJCWlmKGlzc2V0KCRsaW5rbG93KSYmaXNzZXQoJGxpbmttZWQpJiZpc3NldCgkbGlua2hpZ2gpKQ0KCQl7DQoJCQkkbGluayA9ICc3MjB8Jy4kbGlua2hpZ2guJzw+NDgwfCcuJGxpbmttZWQuJzw+MzYwfCcuJGxpbmtsb3cuJyc7DQoJCX0NCgkJZWxzZWlmKGlzc2V0KCRsaW5rbG93KSYmaXNzZXQoJGxpbmttZWQpKQ0KCQl7DQoJCQkkbGluayA9ICc0ODB8Jy4kbGlua21lZC4nPD4zNjB8Jy4kbGlua2xvdy4nJzsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCSRsaW5rID0gJzM2MHwnLiRsaW5rbG93LicnOw0KCQl9DQoJCSRkYXRhcGxheSA9ICRsaW5rOw0KfQ0KLy9FTkQgVkVWTw0KLy8gU1RBUlQgWklQUFlTSEFSRQ0KZWxzZWlmKHN0cnBvcygkdXJsICwgJ3ppcHB5c2hhcmUuY29tJykgIT09IGZhbHNlKQ0Kew0KCQlpZiAoc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cCcpKSA+IDAgb3Igc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cHMnKSkgPiAwKSAkdXJsID0gJHVybDsgZWxzZSAkdXJsID0gJ2h0dHA6Ly8nLiR1cmwuJyc7DQoJCSR0eXBlID0gMTsgJHR5cGV2aWRlbyA9ICdtcDQnOw0KCQkkc291cmNlID0gY3VybCgkdXJsKTsNCgkJJGxpbmsgPSBleHBsb2RlKCc8c291cmNlIHNyYz0iJywkc291cmNlKTsNCgkJJGxpbmsgPSBleHBsb2RlKCciJywkbGlua1sxXSk7DQoJCSRsaW5rID0gJzcyMHwnLiRsaW5rWzBdLicnOw0KCQkkZGF0YXBsYXkgPSAkbGluazsNCg0KfQ0KLy9FTkQgWklQUFlTSEFSRQ0KLy8gU1RBUlQgNFNIQVJFRA0KZWxzZWlmKHN0cnBvcygkdXJsICwgJzRzaGFyZWQuY29tJykgIT09IGZhbHNlKQ0Kew0KCQlpZiAoc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cCcpKSA+IDAgb3Igc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cHMnKSkgPiAwKSAkdXJsID0gJHVybDsgZWxzZSAkdXJsID0gJ2h0dHA6Ly8nLiR1cmwuJyc7DQoJCSR0eXBlID0gMTsgJHR5cGV2aWRlbyA9ICdtcDQnOw0KCQkkc291cmNlID0gY3VybCgkdXJsKTsNCgkJJGZpbGVzID0gZXhwbG9kZSgnZmlsZTogIicsJHNvdXJjZSk7DQoJCSRmaWxlcyA9IGV4cGxvZGUoJyInLCRmaWxlc1sxXSk7DQoJCSRsaW5rID0gIjcyMHwiLiRmaWxlc1swXS4iIjsNCgkJJGRhdGFwbGF5ID0gJGxpbms7DQoNCn0NCi8vRU5EIDRTSEFSRUQNCi8vU1RBUlQgRE9DUywgRFJJVkUgKFdJVEggSVB2NikNCmVsc2VpZihzdHJwb3MoJHVybCAsICdkb2NzLmdvb2dsZS5jb20nKSAhPT0gZmFsc2Ugb3Igc3RycG9zKCR1cmwgLCAnZHJpdmUuZ29vZ2xlLmNvbScpICE9PSBmYWxzZSkNCnsNCgkJJGRlc3RpbmF0aW9uID0gX19ESVJfXyAuICcvdG1wLyc7DQoJCSRkcml2ZSA9IG5ldyBnZHJpdmUoJGRlc3RpbmF0aW9uKTsNCgkJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJCSRkYXRhcGxheSA9ICIiLnN0cl9yZXBsYWNlKCAnQXJyYXknLCAnJywgJGRyaXZlLT5nZXRMaW5rKCR1cmwpICkuIiI7DQp9DQovL0VORCBET0NTLCBEUklWRSAoV0lUSCBJUHY2KQ0KLy9TVEFSVCBNRUdBQk9YDQplbHNlaWYoc3RycG9zKCR1cmwsICdtZWdhYm94LnZuJykgIT09ZmFsc2UpDQp7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cDovLycuJHVybC4nJzsNCgkJJHR5cGUgPSAyOyAkdHlwZXZpZGVvID0gJ20zdTgnOw0KCQkkc291cmNlID0gY3VybCgkdXJsKTsNCgkJJHN2ID0gcmFuZCgyLDMpOw0KCQkkZGF0YSA9ICIiOw0KCQlwcmVnX21hdGNoKCcvPG1ldGEgaXRlbXByb3A9ImNvbnRlbnRVcmwiIGNvbnRlbnQ9IiguKikiXC9cPi9VJywgJHNvdXJjZSwgJGRhdGEpOw0KCQkkbGluayA9ICc3MjBwfCcucHJlZ19yZXBsYWNlKCJAKC4qKW1lZGlhKC4qPykubWVnYWJveC52bi8oLio/KUAiLCJodHRwOi8vc3RyZWFtJHN2LnMycGhpbS5uZXQvJDMiLCRkYXRhWzFdKS4nJzsNCgkJcmV0dXJuICRsaW5rOw0KCQ0KfQ0KLy9FTkQgTUVHQUJPWA0KLy9TVEFSVCBOQ1QNCmVsc2VpZihzdHJwb3MoJHVybCAsICd3d3cubmhhY2N1YXR1aS5jb20nKSAhPT0gZmFsc2UpDQp7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cDovLycuJHVybC4nJzsNCgkJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJCSRnZXQgPSBjdXJsKCR1cmwpOw0KCQkkZGF0YSA9IGV4cGxvZGUoJzxtZXRhIGl0ZW1wcm9wPSJlbWJlZFVSTCIgY29udGVudD0iJywkZ2V0KTsNCgkJJGRhdGEgPSBleHBsb2RlKCciJywkZGF0YVsxXSk7DQoJCSRkYXRhID0gZXhwbG9kZSgnP2ZpbGU9JywkZGF0YVswXSk7DQoJCSRnZXR4bWwgPSBjdXJsKCRkYXRhWzFdKTsNCgkJJGRhdGEgPSBleHBsb2RlKCc8bG9jYXRpb24+JywkZ2V0eG1sKTsNCgkJJGRhdGEgPSBleHBsb2RlKCc8dmlkZW9rZXk+JywkZGF0YVsxXSk7DQoJCSRkYXRhID0gZXhwbG9kZSgnLm1wNF1dPicsJGRhdGFbMF0pOw0KCQkkY291bnQ9IGNvdW50KCRkYXRhKTsNCgkJaWYoJGNvdW50ID09IDQpew0KCQkJJHYzNjBwID0gZXhwbG9kZSgnPCFbQ0RBVEFbJywkZGF0YVsxXSk7DQoJCQkkdjQ4MHAgPSBleHBsb2RlKCc8IVtDREFUQVsnLCRkYXRhWzBdKTsNCgkJCSR2NzIwcCA9IGV4cGxvZGUoJzwhW0NEQVRBWycsJGRhdGFbMl0pOw0KCQkJJGpzIC49ICc3MjBwfCcuJHY3MjBwLicubXA0PD40ODBwfCcuJHY0ODBwLicubXA0PD4zNjBwfCcuJHYzNjBwLicubXA0JzsNCgkJfWVsc2VpZigkY291bnQgPT0gMyl7DQoJCQkkdjM2MHAgPSBleHBsb2RlKCc8IVtDREFUQVsnLCRkYXRhWzFdKTsNCgkJCSR2NDgwcCA9IGV4cGxvZGUoJzwhW0NEQVRBWycsJGRhdGFbMF0pOw0KCQkJJGpzIC49ICc0ODBwfCcuJHY0ODBwWzFdLicubXA0PD4zNjBwfCcuJHYzNjBwWzFdLicubXA0JzsNCgkJfWVsc2VpZigkY291bnQgPT0gMil7DQoJCQkkdjM2MHAgPSBleHBsb2RlKCc8IVtDREFUQVsnLCRkYXRhWzBdKTsNCgkJCSRqcyAuPSAnMzYwcHwnLiR2MzYwcFsxXS4nLm1wNCc7DQoJCX0NCgkJZWxzZXsNCgkJCSR2MzYwcCA9IGV4cGxvZGUoJzwhW0NEQVRBWycsJGRhdGFbMF0pOw0KCQkJJGpzIC49ICczNjBwfCcuJHYzNjBwWzFdLicubXA0JzsNCgkJfQ0KCQkkZGF0YXBsYXkgPSAkanM7DQp9DQovL0VORCBOQ1QNCi8vU1RBUlQgTkNUDQplbHNlaWYoc3RycG9zKCR1cmwgLCAndi5uaGFjY3VhdHVpLmNvbScpICE9PSBmYWxzZSkNCnsNCgkJaWYgKHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHAnKSkgPiAwIG9yIHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHBzJykpID4gMCkgJHVybCA9ICR1cmw7IGVsc2UgJHVybCA9ICdodHRwOi8vJy4kdXJsLicnOw0KCQkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsNCgkJJGdldCA9IGN1cmwoJHVybCk7DQoJCSRkYXRhID0gZXhwbG9kZSgncGxheV9rZXk9IicsJGdldCk7DQoJCSRkYXRhID0gZXhwbG9kZSgnIicsJGRhdGFbMV0pOw0KCQkkZGF0YSA9ICdodHRwOi8vdi5uaGFjY3VhdHVpLmNvbS9mbGFzaC94bWw/a2V5PScuJGRhdGFbMF0uJyc7DQoJCSRrZXkgPSBleHBsb2RlKCc/a2V5PScsJHVybCk7DQoJCSRrZXkgPSAka2V5WzFdOw0KCQkkZ2V0eG1sID0gY3VybCgkZGF0YSk7DQoJCSRkYXRhID0gZXhwbG9kZSgnPGtleT48IVtDREFUQVsnLiRrZXkuJ11dPjwva2V5PicsJGdldHhtbCk7DQoJCSRkYXRhID0gZXhwbG9kZSgnPC9pdGVtPicsJGRhdGFbMV0pOw0KCQlwcmVnX21hdGNoX2FsbCgnL1w8XCFcW0NEQVRBXFsoLiopLm1wNF1dPi9VJywgJGRhdGFbMF0sICRkYXRhKTsNCgkJJGNvdW50PSBjb3VudCgkZGF0YVsxXSk7DQoJCWlmKCRjb3VudD09MykNCgkJew0KCQkJJGxpbmsgPSAnNzIwfCcuJGRhdGFbMV1bMl0uJy5tcDQ8PjQ4MHwnLiRkYXRhWzFdWzFdLicubXA0PD4zNjB8Jy4kZGF0YVsxXVswXS4nLm1wNCc7DQoJCX0NCgkJZWxzZWlmKCRjb3VudD09MikNCgkJew0KCQkJJGxpbmsgPSAnNzIwfCcuJGRhdGFbMV1bMV0uJy5tcDQ8PjM2MHwnLiRkYXRhWzFdWzBdLicubXA0JzsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCSRsaW5rID0gJzM2MHwnLiRkYXRhWzFdWzBdLicubXA0JzsNCgkJfQ0KCQkkZGF0YXBsYXkgPSAkbGluazsNCn0NCi8vRU5EIE5DVA0KLy9TVEFSVCBURVZJDQplbHNlaWYoc3RycG9zKCR1cmwgLCAndGV2aS5jb20nKSAhPT0gZmFsc2UpDQp7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cDovLycuJHVybC4nJzsNCgkJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJCSRnZXQgPSBjdXJsKCR1cmwpOw0KCQkkZGF0YSA9IGV4cGxvZGUoJ3BsYXlfa2V5PSInLCRnZXQpOw0KCQkkZGF0YSA9IGV4cGxvZGUoJyInLCRkYXRhWzFdKTsNCgkJJGRhdGEgPSAnaHR0cDovL3d3dy50ZXZpLmNvbS9mbGFzaC94bWw/a2V5PScuJGRhdGFbMF0uJyc7DQoJCSRrZXkgPSBleHBsb2RlKCc/a2V5PScsJHVybCk7DQoJCSRrZXkgPSAka2V5WzFdOw0KCQkkZ2V0eG1sID0gY3VybCgkZGF0YSk7DQoJCSRkYXRhID0gZXhwbG9kZSgnPGtleT48IVtDREFUQVsnLiRrZXkuJ11dPjwva2V5PicsJGdldHhtbCk7DQoJCSRkYXRhID0gZXhwbG9kZSgnPC9pdGVtPicsJGRhdGFbMV0pOw0KCQlwcmVnX21hdGNoX2FsbCgnL1w8XCFcW0NEQVRBXFsoLiopLm1wNF1dPi9VJywgJGRhdGFbMF0sICRkYXRhKTsNCgkJJGNvdW50PSBjb3VudCgkZGF0YVsxXSk7DQoJCWlmKCRjb3VudD09MykNCgkJew0KCQkJJGxpbmsgPSAnNzIwfCcuJGRhdGFbMV1bMl0uJy5tcDQ8PjQ4MHwnLiRkYXRhWzFdWzFdLicubXA0PD4zNjB8Jy4kZGF0YVsxXVswXS4nLm1wNCc7DQoJCX0NCgkJZWxzZWlmKCRjb3VudD09MikNCgkJew0KCQkJJGxpbmsgPSAnNzIwfCcuJGRhdGFbMV1bMV0uJy5tcDQ8PjM2MHwnLiRkYXRhWzFdWzBdLicubXA0JzsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCSRsaW5rID0gJzM2MHwnLiRkYXRhWzFdWzBdLicubXA0JzsNCgkJfQ0KCQkkZGF0YXBsYXkgPSAkbGluazsNCn0NCi8vRU5EIFRFVkkNCi8vU1RBUlQgVklLSQ0KZWxzZWlmKHN0cnBvcygkdXJsICwgJ3Zpa2kuY29tJykgIT09IGZhbHNlKQ0Kew0KCQlpZiAoc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cCcpKSA+IDAgb3Igc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cHMnKSkgPiAwKSAkdXJsID0gJHVybDsgZWxzZSAkdXJsID0gJ2h0dHA6Ly8nLiR1cmwuJyc7DQoJCSR0eXBlID0gMTsgJHR5cGV2aWRlbyA9ICdtcDQnOw0KCQkkc3JjID0gIiIucHJlZ19yZXBsYWNlKCJAKC4qKXZpa2kuY29tL3ZpZGVvcy8oLio/KXYtKC4qKUAiLCIkMiIsJHVybCkuIiI7DQoJCSR1cmwgPSAnaHR0cDovL3d3dy52aWtpLmNvbS9wbGF5ZXI1X2ZyYWdtZW50LycudXJsZW5jb2RlKCRzcmMpLid2LicudXJsZW5jb2RlKCRzcmMpLid2JzsNCgkJJHNvdXJjZSA9IGN1cmwoJHVybCk7DQoJCXByZWdfbWF0Y2hfYWxsKCIvPHNvdXJjZSB0eXBlPVwiKC4qKVwiIHNyYz1cIiguKilcIi9VIiwgJHNvdXJjZSwgJGRhdGEpOw0KCQkvL3ByaW50X3IoJGRhdGEpOw0KCQlmb3IoJGk9MDskaTxjb3VudCgkZGF0YVsyXSk7JGkrKykNCgkJew0KCQkJaWYoJGk9PShjb3VudCgkZGF0YVsyXSktMSkpDQoJCQl7DQoJCQkJJGxpbmsgLj0gJzcyMHwnLiRkYXRhWzJdWyRpXS4nJzsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkkbGluayAuPSAnNzIwJy4kZGF0YVsyXVskaV0uJ3wnLiRkYXRhWzJdWyRpXS4nPD4nOw0KCQkJfQ0KCQl9DQoJCSRkYXRhcGxheSA9ICRsaW5rOw0KDQp9DQovL0VORCBWSUtJDQovL1NUQVJUIERSQU1BDQplbHNlaWYoc3RycG9zKCR1cmwgLCAnZHJhbWEubmV0JykgIT09IGZhbHNlKQ0Kew0KCQlpZiAoc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cCcpKSA+IDAgb3Igc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cHMnKSkgPiAwKSAkdXJsID0gJHVybDsgZWxzZSAkdXJsID0gJ2h0dHA6Ly8nLiR1cmwuJyc7DQoJCSR0eXBlID0gMTsgJHR5cGV2aWRlbyA9ICdtcDQnOw0KCQkkc291cmNlID0gY3VybCgkdXJsKTsNCgkJJGxpbmsgPSBleHBsb2RlKCdmaWxlOiAiJywkc291cmNlKTsNCgkJJGxpbmsgPSBleHBsb2RlKCciJywkbGlua1sxXSk7DQoJCSRsaW5rID0gJzcyMHwnLiRsaW5rWzBdLicnOw0KCQkkZGF0YXBsYXkgPSAkbGluazsNCg0KfQ0KLy9FTkQgRFJBTUENCi8vU1RBUlQgWU9VVFVCRQ0KZWxzZWlmKHN0cnBvcygkdXJsICwgJ3lvdXR1JykgIT09IGZhbHNlKQ0Kew0KCQlpZiAoc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cCcpKSA+IDAgb3Igc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cHMnKSkgPiAwKSAkdXJsID0gJHVybDsgZWxzZSAkdXJsID0gJ2h0dHBzOi8vJy4kdXJsLicnOw0KCQkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsNCgkJcHJlZ19tYXRjaCgnJSg/OnlvdXR1YmUoPzotbm9jb29raWUpP1wuY29tLyg/OlteL10rLy4rL3woPzp2fGUoPzptYmVkKT8pL3wuKls/Jl12PSl8eW91dHVcLmJlLykoW14iJj8vIF17MTF9KSVpJywgJHVybCwgJHNyYyk7DQoJCWlmICghZW1wdHkoJHNyYykpIHsNCgkJJHVybCA9ICJodHRwOi8vYXBpLjEweW91dHViZS5jb20vZ2V0LnBocD9pZD0kc3JjWzFdJmFwaWtleT1TbWF1Z1RoZURyYWdvbkZpciI7DQoJCX0NCgkJaWYoc3RycG9zKCR1cmwgLCAnMTB5b3V0dWJlLmNvbScpICE9PSBmYWxzZSkNCgkJew0KCQkJJGNvbnRlbnQgPSBjdXJsKCR1cmwpOw0KCQkJaWYoJGNvbnRlbnQhPSIiKQ0KCQkJew0KCQkJCXByZWdfbWF0Y2hfYWxsKCcvXFsiKC4qKSIsIiguKikiLCIoLiopIiwiKC4qKSIvVScsJGNvbnRlbnQsJGRhdGEpOw0KCQkJCWZvcigkaT0wOyRpPGNvdW50KCRkYXRhWzFdKTskaSsrKQ0KCQkJCXsNCgkJCQkJaWYoJGk9PShjb3VudCgkZGF0YVsyXSktMSkpDQoJCQkJCXsNCgkJCQkJCSRqcyAuPSAnJy4kZGF0YVszXVskaV0uJyAnLiRkYXRhWzRdWyRpXS4nfCcuc3RyX3JlcGxhY2UoJ1wvJywgJy8nLCAkZGF0YVsxXVskaV0pLicnOw0KCQkJCQl9DQoJCQkJCWVsc2UNCgkJCQkJew0KCQkJCQkJJGpzIC49ICcnLiRkYXRhWzNdWyRpXS4nICcuJGRhdGFbNF1bJGldLid8Jy5zdHJfcmVwbGFjZSgnXC8nLCAnLycsICRkYXRhWzFdWyRpXSkuJzw+JzsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJCWVsc2UNCgkJCQl7DQoJCQkJJHVybCA9ICJodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PSRzcmNbMV0iOw0KCQkJCSRjb250ZW50ID0gY3VybCgkdXJsKTsNCgkJCQlpZihwcmVnX21hdGNoKCcvO3l0cGxheWVyXC5jb25maWdccyo9XHMqKHsuKj99KTsvJywgJGNvbnRlbnQsICRtYXRjaGVzKSkgew0KCQkJCSRqc29uRGF0YSA9IGpzb25fZGVjb2RlKCRtYXRjaGVzWzFdLCB0cnVlKTsNCgkJCQkkc3RyZWFtTWFwID0gJGpzb25EYXRhWydhcmdzJ11bJ3VybF9lbmNvZGVkX2ZtdF9zdHJlYW1fbWFwJ107DQoJCQkJJHZpZGVvVXJscyA9IGFycmF5KCk7DQoJCQkJJHN0cmVhbU1hcCA9IGV4cGxvZGUoJywnLCAkc3RyZWFtTWFwKTsNCgkJCQkkc3RyZWFtTWFwID0gQGFycmF5X3JldmVyc2UoJHN0cmVhbU1hcCk7DQoJCQkJZm9yZWFjaCAoJHN0cmVhbU1hcCBhcyAkdXJsKQ0KCQkJCXsNCgkJCQkJJHVybCA9IHN0cl9yZXBsYWNlKCdcdTAwMjYnLCAnJicsICR1cmwpOw0KCQkJCQkkdXJsID0gdXJsZGVjb2RlKCR1cmwpOw0KCQkJCQlwYXJzZV9zdHIoJHVybCwgJHZhbHVlKTsNCgkJCQkJJGRhdGFVUkwgPSAkdmFsdWVbJ3VybCddOw0KCQkJCQl1bnNldCgkdmFsdWVbJ3VybCddKTsNCgkJCQkJaWYoaW5fYXJyYXkoJHZhbHVlWydpdGFnJ10sYXJyYXkoMTgsMzUsMjIpKSkgew0KCQkJCQkJJGhlaWdodCA9IChpbnQpc3RyX3JlcGxhY2UoYXJyYXkoMTgsMzUsMjIpLGFycmF5KDM2MCw0ODAsNzIwKSwkdmFsdWVbJ2l0YWcnXSk7DQoJCQkJCQkkZGF0YVskaGVpZ2h0XSA9IGFycmF5KA0KCQkJCQkJCSd1cmwnID0+IHN0cl9yZXBsYWNlKCciJywgIiciLCAkZGF0YVVSTC4nJicudXJsZGVjb2RlKGh0dHBfYnVpbGRfcXVlcnkoJHZhbHVlKSkpLA0KCQkJCQkJCSd0eXBlJyA9PiAnbXA0Jw0KCQkJCQkJKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCQl9DQoJCQkJaWYoJGRhdGFbNzIwXVt1cmxdIGFuZCAkZGF0YVs0ODBdW3VybF0pIHsNCgkJCQkkanMgLj0gJzcyMHwnLiRkYXRhWzcyMF1bdXJsXS4nPD40ODB8Jy4kZGF0YVs0ODBdW3VybF0uJzw+MzYwfCcuJGRhdGFbMzYwXVt1cmxdLicnOw0KCQkJCX0gZWxzZWlmKCRkYXRhWzcyMF1bdXJsXSkgew0KCQkJCQkkanMgLj0gJzcyMHwnLiRkYXRhWzcyMF1bdXJsXS4nPD4zNjB8Jy4kZGF0YVszNjBdW3VybF0uJyc7DQoJCQkJfSBlbHNlaWYoJGRhdGFbNDgwXVt1cmxdKSB7DQoJCQkJCSRqcyAuPSAnNDgwfCcuJGRhdGFbNDgwXVt1cmxdLic8PjM2MHwnLiRkYXRhWzM2MF1bdXJsXS4nJzsNCgkJCQl9ZWxzZSB7DQoJCQkJCSRqcyAuPSAnMzYwfCcuJGRhdGFbMzYwXVt1cmxdOw0KCQkJCX0NCgkJCQl9DQoJCX0NCgkJJGRhdGFwbGF5ID0gJGpzOw0KfQ0KLy9FTkQgWU9VVFVCRQ0KLy9TVEFSVCBaSU5HDQplbHNlaWYoc3RycG9zKCR1cmwgLCAnemluZy52bicpICE9PSBmYWxzZSkNCnsNCgkJaWYgKHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHAnKSkgPiAwIG9yIHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHBzJykpID4gMCkgJHVybCA9ICR1cmw7IGVsc2UgJHVybCA9ICdodHRwOi8vJy4kdXJsLicnOw0KCQkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsNCgkJcHJlZ19tYXRjaCgiL3ZpZGVvXC8oLiopXC8oLiopXC5odG1sL2kiLCAkdXJsLCAkaWQpOw0KCQkkZ2V0ZGF0YSA9IGN1cmwoImh0dHA6Ly9hcGkudHYuemluZy52bi8zLjAvbWVkaWEvaW5mbz9hcGlfa2V5PWQwNDIxMGE3MDAyNmFkOTMyMzA3NjcxNjc4MWMyMjNmJm1lZGlhX2lkPSIuJGlkWzJdLiIiKTsNCgkJJGpzb24gPSBqc29uX2RlY29kZSgkZ2V0ZGF0YSwgdHJ1ZSk7DQoJCSRxNzIwID0gY2hlY2tsaW5rKCRqc29uWydyZXNwb25zZSddWydvdGhlcl91cmwnXVsnVmlkZW83MjAnXSk7DQoJCSRxNDgwID0gY2hlY2tsaW5rKCRqc29uWydyZXNwb25zZSddWydvdGhlcl91cmwnXVsnVmlkZW80ODAnXSk7DQoJCSRxMzYwID0gY2hlY2tsaW5rKCRqc29uWydyZXNwb25zZSddWydmaWxlX3VybCddKTsNCgkJDQoJCWlmKCRxNzIwICE9IDEpICRnZXR6aW5nbWFpbiAuPSAiNzIwfGh0dHA6Ly8iLiRqc29uWydyZXNwb25zZSddWydvdGhlcl91cmwnXVsnVmlkZW83MjAnXS4iPD4iOw0KCQlpZigkcTQ4MCAhPSAxKSAkZ2V0emluZ21haW4gLj0gIjQ4MHxodHRwOi8vIi4kanNvblsncmVzcG9uc2UnXVsnb3RoZXJfdXJsJ11bJ1ZpZGVvNDgwJ10uIjw+IjsNCgkJaWYoJHEzNjAhPSAxKSAkZ2V0emluZ21haW4gLj0gIjM2MHxodHRwOi8vIi4kanNvblsncmVzcG9uc2UnXVsnZmlsZV91cmwnXS4iIjsNCgkJaWYoJHE3MjAgPT0gMSBhbmQgJHE0ODAgPT0gMSBhbmQgJHEzNjA9PSAxKQ0KCQl7DQoJCQkkemluZyA9IGN1cmwoJHVybCk7DQoJCXByZWdfbWF0Y2hfYWxsKCcveG1sVVJMOiAiKFtePl0qKSIsL1UnLCAkemluZywgJGxpbmtfemluZyk7DQoJCSR4bWwgPSBzdHJfcmVwbGFjZSggJ21lZGlhJywgJ21lZGlhLWVtYmVkJywgJGxpbmtfemluZ1sxXVswXSk7DQoJCSRzb3VyY2VYTUwgPSBjdXJsKCdjb21wcmVzcy56bGliOi8vJy4keG1sKTsNCgkJJGYzNjAgPSBleHBsb2RlKCc8c291cmNlIHN0cmVhbWluZ1R5cGU9IjEiPjwhW0NEQVRBWycsJHNvdXJjZVhNTCk7JGYzNjA9ZXhwbG9kZSgnXV0+PC9zb3VyY2U+JywkZjM2MFsxXSk7JGdldGYzNjA9bmV3IHppbmc7ICRnZXRmMzYwLT5fdGV4dD0nJy4kZjM2MFswXS4nJzsgaWYoJGdldGYzNjAtPl9kZWNyeXB0KCkhPWZhbHNlKTsNCgkJaWYoJGdldGYzNjAtPl9yZXN1bHQgIT0gJycpDQoJCXsNCgkJCSRmNDgwID0gZXhwbG9kZSgnPGY0ODAgc3RyZWFtaW5nVHlwZT0iMSI+PCFbQ0RBVEFbJywkc291cmNlWE1MKTskZjQ4MD1leHBsb2RlKCddXT48L2Y0ODA+JywkZjQ4MFsxXSk7JGdldGY0ODA9bmV3IHppbmc7ICRnZXRmNDgwLT5fdGV4dD0nJy4kZjQ4MFswXS4nJzsgaWYoJGdldGY0ODAtPl9kZWNyeXB0KCkhPWZhbHNlKTsNCgkJCSRmNzIwID0gZXhwbG9kZSgnPGY3MjAgc3RyZWFtaW5nVHlwZT0iMSI+PCFbQ0RBVEFbJywkc291cmNlWE1MKTskZjcyMD1leHBsb2RlKCddXT48L2Y3MjA+JywkZjcyMFsxXSk7JGdldGY3MjA9bmV3IHppbmc7ICRnZXRmNzIwLT5fdGV4dD0nJy4kZjcyMFswXS4nJzsgaWYoJGdldGY3MjAtPl9kZWNyeXB0KCkhPWZhbHNlKTsNCgkJCSRsaW5rMzYwID0gZXhwbG9kZSgiP2Zvcm1hdD1mMzYwJmRldmljZT13ZWJfZW1iZWRfZmxhc2giLCRnZXRmMzYwLT5fcmVzdWx0KTsNCgkJCSRsaW5rMzYwID0gJGxpbmszNjBbMF07DQoJCQkkbGluazQ4MCA9IGV4cGxvZGUoIj9mb3JtYXQ9ZjQ4MCZkZXZpY2U9d2ViX2VtYmVkX2ZsYXNoIiwkZ2V0ZjQ4MC0+X3Jlc3VsdCk7DQoJCQkkbGluazQ4MCA9ICRsaW5rNDgwWzBdOw0KCQkJJGxpbms3MjAgPSBleHBsb2RlKCI/Zm9ybWF0PWY3MjAmZGV2aWNlPXdlYl9lbWJlZF9mbGFzaCIsJGdldGY3MjAtPl9yZXN1bHQpOw0KCQkJJGxpbms3MjAgPSAkbGluazcyMFswXTsNCgkJCSRnZXR6aW5nID0gJzM2MHB8Jy4kbGluazM2MC4nPD40ODBwfCcuJGxpbms0ODAuJzw+NzIwcHwnLiRsaW5rNzIwLicnOw0KCQl9IA0KCQllbHNlDQoJCXsNCgkJCSRmMzYwID0gZXhwbG9kZSgnPHNvdXJjZSBzdHJlYW1pbmdUeXBlPSIyIj48IVtDREFUQVsnLCRzb3VyY2VYTUwpOyRmMzYwPWV4cGxvZGUoJ11dPjwvc291cmNlPicsJGYzNjBbMV0pOyRnZXRmMzYwPW5ldyB6aW5nOyAkZ2V0ZjM2MC0+X3RleHQ9JycuJGYzNjBbMF0uJyc7IGlmKCRnZXRmMzYwLT5fZGVjcnlwdCgpIT1mYWxzZSk7DQoJCQlpZigkZ2V0ZjM2MC0+X3Jlc3VsdCAhPSAnJyl7DQoJCQkJJGY0ODAgPSBleHBsb2RlKCc8ZjQ4MCBzdHJlYW1pbmdUeXBlPSIyIj48IVtDREFUQVsnLCRzb3VyY2VYTUwpOyRmNDgwPWV4cGxvZGUoJ11dPjwvZjQ4MD4nLCRmNDgwWzFdKTskZ2V0ZjQ4MD1uZXcgemluZzsgJGdldGY0ODAtPl90ZXh0PScnLiRmNDgwWzBdLicnOyBpZigkZ2V0ZjQ4MC0+X2RlY3J5cHQoKSE9ZmFsc2UpOw0KCQkJCSRmNzIwID0gZXhwbG9kZSgnPGY3MjAgc3RyZWFtaW5nVHlwZT0iMiI+PCFbQ0RBVEFbJywkc291cmNlWE1MKTskZjcyMD1leHBsb2RlKCddXT48L2Y3MjA+JywkZjcyMFsxXSk7JGdldGY3MjA9bmV3IHppbmc7ICRnZXRmNzIwLT5fdGV4dD0nJy4kZjcyMFswXS4nJzsgaWYoJGdldGY3MjAtPl9kZWNyeXB0KCkhPWZhbHNlKTsNCgkJCQkkbGluazM2MCA9IGV4cGxvZGUoIj9mb3JtYXQ9ZjM2MCZkZXZpY2U9d2ViX2VtYmVkX2ZsYXNoIiwkZ2V0ZjM2MC0+X3Jlc3VsdCk7DQoJCQkJJGxpbmszNjAgPSAkbGluazM2MFswXTsNCgkJCQkkbGluazQ4MCA9IGV4cGxvZGUoIj9mb3JtYXQ9ZjQ4MCZkZXZpY2U9d2ViX2VtYmVkX2ZsYXNoIiwkZ2V0ZjQ4MC0+X3Jlc3VsdCk7DQoJCQkJJGxpbms0ODAgPSAkbGluazQ4MFswXTsNCgkJCQkkbGluazcyMCA9IGV4cGxvZGUoIj9mb3JtYXQ9ZjcyMCZkZXZpY2U9d2ViX2VtYmVkX2ZsYXNoIiwkZ2V0ZjcyMC0+X3Jlc3VsdCk7DQoJCQkJJGxpbms3MjAgPSAkbGluazcyMFswXTsNCgkJCQkkZ2V0emluZyA9ICczNjBwfCcuJGxpbmszNjAuJzw+NDgwcHwnLiRsaW5rNDgwLic8PjcyMHB8Jy4kbGluazcyMC4nJzsNCgkJCX0gDQoJCQllbHNlIA0KCQkJew0KCQkJCXByZWdfbWF0Y2goJyM8c291cmNlIHNyYz0iKC4rPykiIHR5cGU9InZpZGVvL21wNCIgLz4jJywkemluZywkemluZ19odG1sNSk7DQoJCQkJJGdldCA9IGdldF9oZWFkZXJzKCR6aW5nX2h0bWw1WzFdKTsNCgkJCQkkY2F0ID0gZXhwbG9kZSgnTG9jYXRpb246ICcsICRnZXRbNl0pOw0KCQkJCSRmMzYwcCA9IGV4cGxvZGUoJz8nLCAkY2F0WzFdKTsNCgkJCQkkZ2V0emluZyA9ICczNjBwfCcuJGYzNjAuJyc7DQoJCQl9DQoNCgkJfQ0KCQkkdGVzdGxpbmsgPSBleHBsb2RlKCcubXA0OycsJGdldHppbmcpOw0KCQkkdGVzdGxpbmsgPSBleHBsb2RlKCczNjBwfCcsJHRlc3RsaW5rWzBdKTsNCgkJaWYoJHRlc3RsaW5rWzFdPT0iQXJyYXkiKQ0KCQl7DQoJCQkkaWQgPSBleHBsb2RlKCIuaHRtbCIsJHVybCk7DQoJCQkkaWQgPSBleHBsb2RlKCIvIiwkaWRbMF0pOw0KCQkJJGxpbmsgPSAnaHR0cDovL3R2Lnppbmcudm4vZW1iZWQvdmlkZW8vJy4kaWRbNV07IA0KCQkJJGRhdGEgPSB2aWV3U291cmNlKCRsaW5rKTsNCgkJCSRhPSBleHBsb2RlKCc8Jy4nc291cmNlIHNyYz0iJywkZGF0YSwyKTsNCgkJCSRiPSBleHBsb2RlKCc8L3ZpZGVvPicsJGFbMV0pOw0KCQkJJGI9IGV4cGxvZGUoJzxzb3VyY2Ugc3JjPSInLCRiWzBdKTsNCgkJCSRjMT0gZXhwbG9kZSgnIiB0eXBlPSJ2aWRlby9tcDQiJywkYlswXSk7DQoJCQkkYzI9IGV4cGxvZGUoJyIgdHlwZT0idmlkZW8vbXA0IicsJGJbMV0pOw0KCQkJJGMzPSBleHBsb2RlKCciIHR5cGU9InZpZGVvL21wNCInLCRiWzJdKTsNCgkJCWlmKCRjMVswXSE9Jycpew0KCQkJCSRnZXR6aW5nbWFpbiAuPSAnMzYwcHwnLiRjMVswXS4nPD4nOw0KCQkJfQ0KCQkJaWYoJGMyWzBdIT0nJyl7DQoJCQkJJGdldHppbmdtYWluIC49ICc0ODBwfCcuJGMyWzBdLic8Pic7DQoJCQl9DQoJCQlpZigkYzNbMF0hPScnKXsNCgkJCQkkZ2V0emluZ21haW4gLj0gJzcyMHB8Jy4kYzNbMF0uJyc7DQoJCQl9DQoJCX0NCgkJZWxzZSAkZ2V0emluZ21haW4gPSAkZ2V0emluZzsNCgkJfQ0KCQkkZGF0YXBsYXkgPSAkZ2V0emluZ21haW47DQoNCn0NCi8vRU5EIFpJTkcNCi8vU1RBUlQgS0VFTkcNCmVsc2VpZihzdHJwb3MoJHVybCAsICdrZWVuZy52bicpICE9PSBmYWxzZSkNCnsNCgkJaWYgKHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHAnKSkgPiAwIG9yIHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHBzJykpID4gMCkgJHVybCA9ICR1cmw7IGVsc2UgJHVybCA9ICdodHRwOi8vJy4kdXJsLicnOw0KCQkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsNCgkJJHNvdXJjZSA9IGN1cmxtb2JpbGUoJHVybCk7DQoJCSRjb250ZW50ID0gIGV4cGxvZGUoJzwhLS0gQm94IHBsYXllciAtLT4nLCRzb3VyY2UpOw0KCQkkY29udGVudCA9ICBleHBsb2RlKCc8L2Rpdj4nLCRjb250ZW50WzFdKTsNCgkJcHJlZ19tYXRjaF9hbGwoJy9zcmM9IiguKikiL1UnLCAkY29udGVudFswXSwgJGRhdGEpOw0KCQkkY291bnQgPSBjb3VudCgkZGF0YVsxXSk7DQoJCWlmKCRjb3VudCA9PSAzKQ0KCQl7DQoJCQkkbGluayA9ICc3MjBwfCcuJGRhdGFbMV1bMF0uJzw+NDgwcHwnLiRkYXRhWzFdWzFdLic8PjM2MHB8Jy4kZGF0YVsxXVsyXTsNCgkJfQ0KCQllbHNlaWYoJGNvdW50ID09IDIpDQoJCXsNCgkJCSRsaW5rID0gJzcyMHB8Jy4kZGF0YVsxXVswXS4nPD4zNjBwfCcuJGRhdGFbMV1bMV07DQoJCX0NCgkJZWxzZWlmKCRjb3VudCA9PSAxKQ0KCQl7DQoJCQkkbGluayA9ICczNjBwfCcuJGRhdGFbMV1bMF07DQoJCX0NCgkJJGRhdGFwbGF5ID0gJGxpbms7DQoNCn0NCi8vRU5EIEtFRU5HDQovL1NUQVJUIEFOSU1FNDcNCmVsc2VpZihzdHJwb3MoJHVybCAsICdhbmltZTQ3LmNvbScpICE9PSBmYWxzZSkNCnsNCgkJaWYgKHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHAnKSkgPiAwIG9yIHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHBzJykpID4gMCkgJHVybCA9ICR1cmw7IGVsc2UgJHVybCA9ICdodHRwOi8vJy4kdXJsLicnOw0KCQkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsNCgkJJHNvdXJjZSA9IGN1cmwoJ2h0dHA6Ly9sb2NhbGhvc3QvdGFvbGFwdGh1dmllbi90ZXN0L3Rlc3QucGhwJyk7DQoJCSRsaW5rID0gZXhwbG9kZSgne2xpbms6IicsJHNvdXJjZSk7DQoJCSRsaW5rID0gZXhwbG9kZSgnIicsICRsaW5rWzFdKTsNCgkJZWNobyAkc291cmNlOw0KCQkkZ2V0dXJsID0gJ2h0dHA6Ly9kbGwuYW5pbWU0Ny5jb20vZ2twaHAvcGx1Z2lucy9na3BsdWdpbnNwaHAucGhwJzsNCgkJJHBhcmFtcyA9IGFycmF5KA0KCQkJImxpbmsiID0+ICIiLiRsaW5rWzBdLiIiLA0KCQkpOw0KCQkkZG93bmxvYWQgPSBnZXRwb3N0KCRnZXR1cmwsJHBhcmFtcyk7DQoJCSRkYXRhcGxheSA9ICRkb3dubG9hZDsNCn0NCi8vRU5EIEFOSU1FNDcNCi8vU1RBUlQgVkVPSA0KZWxzZWlmKHN0cnBvcygkdXJsICwgJ3Zlb2guY29tJykgIT09IGZhbHNlKQ0Kew0KCQlpZiAoc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cCcpKSA+IDAgb3Igc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cHMnKSkgPiAwKSAkdXJsID0gJHVybDsgZWxzZSAkdXJsID0gJ2h0dHA6Ly8nLiR1cmwuJyc7DQoJCSR0eXBlID0gMTsgJHR5cGV2aWRlbyA9ICdtcDQnOw0KCQkkc291cmNlID0gY3VybCgkdXJsKTsNCgkJJGNvbnRlbnQgPSBleHBsb2RlKCJ3YXRjaC52aWRlb0RldGFpbHNKU09OID0gJ3siLCRzb3VyY2UpOw0KCQkkY29udGVudCA9IGV4cGxvZGUoIic7IiwkY29udGVudFsxXSk7DQoJCSRjb250ZW50ID0gJ3snLiRjb250ZW50WzBdLicnOw0KCQkkZGF0YSA9ICBqc29uX2RlY29kZSgkY29udGVudCk7DQoJCWlmKCRkYXRhICE9IE5VTEwpDQoJCXsNCgkJCWlmKGlzc2V0KCRkYXRhLT57J2Z1bGxQcmV2aWV3SGFzaEhpZ2hQYXRoJ30pKQ0KCQkJew0KCQkJCSRzcmMgLj0gIjcyMHB8Ii4kZGF0YS0+eydmdWxsUHJldmlld0hhc2hIaWdoUGF0aCd9LiI8PiI7DQoJCQl9DQoJCQlpZihpc3NldCgkZGF0YS0+eydmdWxsUHJldmlld0hhc2hMb3dQYXRoJ30pKQ0KCQkJew0KCQkJCSRzcmMgLj0gIjM2MHB8Ii4kZGF0YS0+eydmdWxsUHJldmlld0hhc2hMb3dQYXRoJ30uIiI7DQoJCQl9DQoJCQkkZGF0YXBsYXkgPSAkc3JjOw0KCQl9DQp9DQovL0VORCBWRU9IDQovL1NUQVJUIEZJTEVTQ0RODQplbHNlaWYoc3RycG9zKCR1cmwgLCAnZmlsZXNjZG4uY29tJykgIT09IGZhbHNlKQ0Kew0KCQlpZiAoc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cCcpKSA+IDAgb3Igc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cHMnKSkgPiAwKSAkdXJsID0gJHVybDsgZWxzZSAkdXJsID0gJ2h0dHBzOi8vJy4kdXJsLicnOw0KCQkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsNCgkJJGRhdGEgPSBjdXJsKCR1cmwpOw0KCQkkZ2V0ID0gZXhwbG9kZSgnZXZhbChmdW5jdGlvbicsJGRhdGEpOw0KCQkkZ2V0ID0gZXhwbG9kZSgnPC9zY3JpcHQ+JywkZ2V0WzFdKTsNCgkJJGdldCA9ICdldmFsKGZ1bmN0aW9uJy4kZ2V0WzBdLicnOw0KCQkkanN1ID0gbmV3IEphdmFTY3JpcHRVbnBhY2tlcigpOw0KCQkkZGF0YSA9ICRqc3UtPlVucGFjaygkZ2V0KTsNCgkJJGxpbmsgPSBleHBsb2RlKCdmaWxlOiInLCRkYXRhKTsNCgkJJGxpbmsgPSBleHBsb2RlKCciJywkbGlua1sxXSk7DQoJCSRsaW5rID0gJzM2MHwnLiRsaW5rWzBdLicnOw0KCQkkZGF0YXBsYXkgPSAkbGluazsNCg0KfQ0KLy9FTkQgRklMRVNDRE4NCi8vU1RBUlQgRkxJQ0tSDQplbHNlaWYoc3RycG9zKCR1cmwgLCAnZmxpY2tyLmNvbScpICE9PSBmYWxzZSkNCnsNCgkJaWYgKHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHAnKSkgPiAwIG9yIHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHBzJykpID4gMCkgJHVybCA9ICR1cmw7IGVsc2UgJHVybCA9ICdodHRwczovLycuJHVybC4nJzsNCgkJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdmbGlja3IuY29tL3Bob3RvcycpKSAhPSAwKQ0KCQl7DQoJCQkkbGluayA9IGV4cGxvZGUoJ0AnLCR1cmwpOw0KCQkJJGxpbmsgPSBleHBsb2RlKCcvJywkbGlua1sxXSk7DQoJCQkkbGluayA9ICc3MjB8aHR0cHM6Ly93d3cuZmxpY2tyLmNvbS92aWRlb19kb3dubG9hZC5nbmU/aWQ9Jy4kbGlua1sxXS4nJzsNCgkJfQ0KCQkkZGF0YXBsYXkgPSAkbGluazsNCg0KfQ0KLy9FTkQgRkxJQ0tSDQovL1NUQVJUIFBJQ0FTQQ0KZWxzZWlmKHN0cnBvcygkdXJsICwgJ2dldC5nb29nbGUuY29tJykgIT09IGZhbHNlKQ0Kew0KCQlpZiAoc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cCcpKSA+IDAgb3Igc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cHMnKSkgPiAwKSAkdXJsID0gJHVybDsgZWxzZSAkdXJsID0gJ2h0dHBzOi8vJy4kdXJsLicnOw0KCQkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsNCgkJJGdldCA9IGN1cmwoJHVybCk7DQoJCSR2YWx1ZSA9IGV4cGxvZGUoIj9zb3VyY2UiLCR1cmwpOw0KCQkkdmFsdWUgPSBleHBsb2RlKCIvIiwkdmFsdWVbMF0pOw0KCQkkdmFsdWUgPSAnIicuJHZhbHVlW2ludHZhbChjb3VudCgkdmFsdWUpLTEpXS4nIiwiJzsNCgkJJGRhdGFfdXJsID0gZXhwbG9kZSgkdmFsdWUsJGdldCk7DQoJCSRkYXRhX3VybCA9IGV4cGxvZGUoJyInLCRkYXRhX3VybFsxXSk7DQoJCSRkYXRhX3VybCA9IHVybGVuY29kZSgkZGF0YV91cmxbMF0pOw0KCQlwcmVnX21hdGNoX2FsbCgiLyIuJGRhdGFfdXJsLiIoLiopdTAwMjZpdGFnL1UiLCAkZ2V0LCAkZGF0YSk7DQoJCWZvcigkaT0wOyRpPCRjb3VudCA9IGNvdW50KCRkYXRhWzFdKTskaSsrKQ0KCQl7DQoJCQlpZihzdHJwb3MoJGRhdGFbMV1bJGldLCAnbTM3JykpICR2MTA4MHAgPSAkZGF0YVsxXVskaV07DQoJCQllbHNlaWYoc3RycG9zKCRkYXRhWzFdWyRpXSwgJ20yMicpKSAkdjcyMHAgPSAkZGF0YVsxXVskaV07DQoJCQllbHNlaWYoc3RycG9zKCRkYXRhWzFdWyRpXSwgJ20xOCcpKSAkdjM2MHAgPSAkZGF0YVsxXVskaV07DQoJCX0NCgkJaWYoJHYxMDgwcCAhPSAiIil7DQoJCQkkc3JjID0gJzEwODBwfCcuJGRhdGFfdXJsLic9bTM3PD43MjBwfCcuJGRhdGFfdXJsLic9bTIyPD4zNjBwfCcuJGRhdGFfdXJsLic9bTE4JzsNCgkJfSBlbHNlaWYoJHY3MjBwICE9ICIiKSB7DQoJCQkkc3JjID0gJzcyMHB8Jy4kZGF0YV91cmwuJz1tMjI8PjM2MHB8Jy4kZGF0YV91cmwuJz1tMTgnOw0KCQl9IGVsc2Ugew0KCQkJJHNyYyA9ICczNjBwfCcuJGRhdGFfdXJsLic9bTE4JzsNCgkJfQ0KCQkkc3JjID0gdXJsZGVjb2RlKCRzcmMpOw0KCQkkZGF0YXBsYXkgPSAkc3JjOwkNCn0NCmVsc2VpZihzdHJwb3MoJHVybCAsICdwaWNhc2F3ZWInKSAhPT0gZmFsc2UpDQp7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cHM6Ly8nLiR1cmwuJyc7DQoJCSR0eXBlID0gMTsgJHR5cGV2aWRlbyA9ICdtcDQnOw0KCQkkdXJsID0gdXJsZGVjb2RlKCR1cmwpOw0KCQkkaWRfdXNlciA9IGN1dF9zdHIoJHVybCwiY29tLyIsIi8iKTsNCgkJJGlkX2FsYnVtID0gY3V0X3N0cigkdXJsLCI9IiwiIyIpOw0KCQlpZigkaWRfYWxidW0pDQoJCSRpZF9hbGJ1bSA9ICcmYXV0aGtleT0nLiRpZF9hbGJ1bTsNCgkJJGlzX2F1dCA9IGV4cGxvZGUoJyMnLCR1cmwpOw0KCQkkaWRfZXAgPSAkaXNfYXV0WzFdOw0KCQkkY3VyVGVtcCA9IGN1cmwoJ2h0dHBzOi8vcGljYXNhd2ViLmdvb2dsZS5jb20vZGF0YS9mZWVkL3RpbnkvdXNlci8nLiRpZF91c2VyLicvcGhvdG9pZC8nLiRpZF9lcC4nPyZhbHQ9anNvbicuJGlkX2FsYnVtKTsNCgkJJGN1clRlbXAgPSBjdXRfc3RyKCRjdXJUZW1wLCdjb250ZW50IjpbeyInLCdtZWRpYSRkZXNjcmlwdGlvbicpOw0KCQlpZiAoJGN1clRlbXAgPD4gIiIpIHsNCgkJCSRjdXJMaXN0ID0gZXhwbG9kZSgnIicsJGN1clRlbXApOw0KCQkJZm9yZWFjaCAoJGN1ckxpc3QgYXMgJGN1cmwpIHsNCgkJCSRjdXJsID0gdHJpbShzdWJzdHIoJGN1cmwsIHN0cnBvcygkY3VybCwnaHR0cHMnKS1zdHJsZW4oJGN1cmwpKSk7DQoJCQkJaWYgKCRjdXJsIDw+ICIiICl7DQoJCQkJCWlmIChzdHJwb3MoJGN1cmwsJ2l0YWc9MzcnKSB8fCBzdHJwb3MoJGN1cmwsJz1tMzcnKSAhPT0gZmFsc2UpIHskdjEwODBwPSRjdXJsO30NCgkJCQkJaWYgKHN0cnBvcygkY3VybCwnaXRhZz0yMicpIHx8IHN0cnBvcygkY3VybCwnPW0yMicpICE9PSBmYWxzZSkgeyR2NzIwcD0kY3VybDt9DQoJCQkJCWlmIChzdHJwb3MoJGN1cmwsJ2l0YWc9MTgnKSB8fCBzdHJwb3MoJGN1cmwsJz1tMTgnKSAhPT0gZmFsc2UpIHskdjM2MHA9JGN1cmw7fQ0KCQkJCX0NCgkJCX0NCgkJCWlmKCR2MTA4MHApew0KCQkJCSRzcmMgPSAnMTA4MHB8Jy4kdjEwODBwLic8PjcyMHB8Jy4kdjcyMHAuJzw+MzYwcHwnLiR2MzYwcDsNCgkJCX0gZWxzZWlmKCR2NzIwcCl7DQoJCQkJJHNyYyA9ICc3MjBwfCcuJHY3MjBwLic8PjM2MHB8Jy4kdjM2MHA7DQoJCQl9IGVsc2Ugew0KCQkJCSRzcmMgPSAnMzYwcHwnLiR2MzYwcDsNCgkJCX0NCgkJfQ0KCQkkc3JjID0gdXJsZGVjb2RlKCRzcmMpOw0KCQkkZGF0YXBsYXkgPSAkc3JjOwkNCn0NCi8vRU5EIFBJQ0FTQQ0KDQovL1NUQVJUIFZJRE1FDQplbHNlaWYoc3RycG9zKCR1cmwgLCAndmlkLm1lJykgIT09IGZhbHNlKQ0Kew0KCQlpZiAoc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cCcpKSA+IDAgb3Igc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cHMnKSkgPiAwKSAkdXJsID0gJHVybDsgZWxzZSAkdXJsID0gJ2h0dHBzOi8vJy4kdXJsLicnOw0KCQkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsNCgkJaWYoc3RycG9zKCR1cmwgLCAndmlkLm1lL2UvJykgIT09IGZhbHNlKSAkdXJsID0gJHVybDsNCgkJZWxzZQ0KCQl7DQoJCQkkdXJsID0gZXhwbG9kZSgndmlkLm1lLycsJHVybCk7DQoJCQkkdXJsID0gJ2h0dHA6Ly92aWQubWUvZS8nLiR1cmxbMV0uJyc7DQoJCX0NCgkJJHNvdXJjZSA9IGN1cmwoJHVybCk7DQoJCXByZWdfbWF0Y2hfYWxsKCcvPHNvdXJjZSBzcmM9IiguKikubXA0KC4qKSIvVScsJHNvdXJjZSwkZGF0YSk7DQoJCSRjb3VudCA9IGNvdW50KCRkYXRhWzFdKTsNCgkJaWYoJGNvdW50PT00KQ0KCQl7DQoJCQkkbGluayA9ICc3MjB8Jy4kZGF0YVsxXVswXS4nJy4kZGF0YVsyXVswXS4nPD40ODB8Jy4kZGF0YVsxXVsxXS4nJy4kZGF0YVsyXVsxXS4nPD4zNjB8Jy4kZGF0YVsxXVsyXS4nPD4yNDB8Jy4kZGF0YVsxXVszXS4nJy4kZGF0YVsyXVszXS4nJzsNCgkJfQ0KCQllbHNlaWYoJGNvdW50PT0zKQ0KCQl7DQoJCQkkbGluayA9ICc3MjB8Jy4kZGF0YVsxXVswXS4nJy4kZGF0YVsyXVswXS4nPD40ODB8Jy4kZGF0YVsxXVsxXS4nJy4kZGF0YVsyXVsxXS4nPD4zNjB8Jy4kZGF0YVsxXVsyXS4nJy4kZGF0YVsyXVsyXS4nJzsNCgkJfQ0KCQllbHNlaWYoJGNvdW50PT0yKQ0KCQl7DQoJCQkkbGluayA9ICc3MjB8Jy4kZGF0YVsxXVswXS4nJy4kZGF0YVsyXVswXS4nPD4zNjB8Jy4kZGF0YVsxXVsxXS4nJy4kZGF0YVsyXVsxXS4nJzsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCSRsaW5rID0gJzM2MHwnLiRkYXRhWzFdWzBdLicnLiRkYXRhWzJdWzBdLicnOw0KCQl9DQoJCSRkYXRhcGxheSA9ICRsaW5rOw0KfQ0KLy9FTkQgVklETUUNCg0KLy9TVEFSVCBQSE9UT1MuR09PR0xFLkNPTQ0KZWxzZWlmKHN0cnBvcygkdXJsICwgJ3Bob3Rvcy5nb29nbGUuY29tJykgIT09IGZhbHNlKQ0Kew0KCQlpZiAoc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cCcpKSA+IDAgb3Igc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cHMnKSkgPiAwKSAkdXJsID0gJHVybDsgZWxzZSAkdXJsID0gJ2h0dHBzOi8vJy4kdXJsLicnOw0KCQkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsNCgkJJGdldCA9IGN1cmwoJHVybCk7DQoJCSRnZXQgPSBleHBsb2RlKCcidXJsXHUwMDNkJywgJGdldCk7DQoJCSRnZXQgPSBleHBsb2RlKCciXScsICRnZXRbMV0pOw0KCQkkZ2V0ID0gdXJsZGVjb2RlKCRnZXRbMF0pOw0KCQlwcmVnX21hdGNoX2FsbCgiL2h0dHBzOlwvXC9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tXC8oLiopdTAwMjZpdGFnL1UiLCAkZ2V0LCAkZGF0YSk7DQoJCWZvcigkaT0wOyRpPCRjb3VudCA9IGNvdW50KCRkYXRhWzFdKTskaSsrKQ0KCQl7DQoJCQlpZihzdHJwb3MoJGRhdGFbMV1bJGldLCAnPW0zNycpKSAkdjEwODBwID0gJGRhdGFbMV1bJGldOw0KCQkJZWxzZWlmKHN0cnBvcygkZGF0YVsxXVskaV0sICc9bTIyJykpICR2NzIwcCA9ICRkYXRhWzFdWyRpXTsNCgkJCWVsc2VpZihzdHJwb3MoJGRhdGFbMV1bJGldLCAnPW0xOCcpKSAkdjM2MHAgPSAkZGF0YVsxXVskaV07DQoJCX0NCgkJaWYoJHYxMDgwcCAhPSAiIil7DQoJCQkkdjEgPSBleHBsb2RlKCJcXCIsJHYxMDgwcCk7DQoJCQkkdjEgPSAkdjFbMF07DQoJCQkkdjIgPSBleHBsb2RlKCJcXCIsJHY3MjBwKTsNCgkJCSR2MiA9ICR2MlswXTsNCgkJCSR2MyA9IGV4cGxvZGUoIlxcIiwkdjM2MHApOw0KCQkJJHYzID0gJHYzWzBdOw0KCQkJJHNyYyA9ICcxMDgwcHxodHRwczovLzMuYnAuYmxvZ3Nwb3QuY29tLycuJHYxLic8PjcyMHB8aHR0cHM6Ly8zLmJwLmJsb2dzcG90LmNvbS8nLiR2Mi4nPD4zNjBwfGh0dHBzOi8vMy5icC5ibG9nc3BvdC5jb20vJy4kdjMuJyc7DQoJCX0gZWxzZWlmKCR2NzIwcCAhPSAiIikgew0KCQkJJHYxID0gZXhwbG9kZSgiXFwiLCR2NzIwcCk7DQoJCQkkdjEgPSAkdjFbMF07DQoJCQkkdjIgPSBleHBsb2RlKCJcXCIsJHYzNjBwKTsNCgkJCSR2MiA9ICR2MlswXTsNCgkJCSRzcmMgPSAnNzIwcHxodHRwczovLzMuYnAuYmxvZ3Nwb3QuY29tLycuJHYxLic8PjM2MHB8aHR0cHM6Ly8zLmJwLmJsb2dzcG90LmNvbS8nLiR2Mi4nJzsNCgkJfSBlbHNlIHsNCgkJCSR2MSA9IGV4cGxvZGUoIlxcIiwkdjM2MHApOw0KCQkJJHYxID0gJHYxWzBdOw0KCQkJJHNyYyA9ICczNjBwfGh0dHBzOi8vMy5icC5ibG9nc3BvdC5jb20vJy4kdjEuJyc7DQoJCX0NCgkJJGRhdGFwbGF5ID0gJHNyYzsJDQp9DQovL0VORCBQSE9UT1MuR09PR0xFLkNPTQ0KLy9TVEFSVCBQTFVTLkdPT0dMRS5DT00NCmVsc2VpZihzdHJwb3MoJHVybCAsICdwbHVzLmdvb2dsZS5jb20nKSAhPT0gZmFsc2UpDQp7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cHM6Ly8nLiR1cmwuJyc7DQoJCSR0eXBlID0gMTsgJHR5cGV2aWRlbyA9ICdtcDQnOw0KCQkkZ2V0ID0gdXJsZGVjb2RlKGN1cmwoJHVybCkpOw0KCQkkZ2V0ID0gZXhwbG9kZSgnInVybFx1MDAzZCcsJGdldCk7DQoJCSRnZXQgPSBleHBsb2RlKCciXScsJGdldFsxXSk7DQoJCXByZWdfbWF0Y2hfYWxsKCIvaHR0cHM6XC9cL2xoMy5nb29nbGV1c2VyY29udGVudC5jb21cLyguKil1MDAyNml0YWcvVSIsICRnZXRbMF0sICRkYXRhKTsNCgkJJHYxID0gZXhwbG9kZSgnXFwnLCRkYXRhWzFdWzBdKTsNCgkJJHYxID0gJHYxWzBdOw0KCQkkdjIgPSBleHBsb2RlKCdcXCcsJGRhdGFbMV1bMV0pOw0KCQkkdjIgPSAkdjJbMF07DQoJCSR2MyA9IGV4cGxvZGUoJ1xcJywkZGF0YVsxXVsyXSk7DQoJCSR2MyA9ICR2M1swXTsNCgkJaWYoJHYxICE9ICcnIGFuZCAoc3RycG9zKCR2MSwgJz1tMzcnKSAgIT09IGZhbHNlKSl7DQoJCQkkc3JjID0gJzEwODBwfGh0dHBzOi8vMy5icC5ibG9nc3BvdC5jb20vJy4kdjEuJzw+NzIwcHxodHRwczovLzMuYnAuYmxvZ3Nwb3QuY29tLycuJHYyLic8PjM2MHB8aHR0cHM6Ly8zLmJwLmJsb2dzcG90LmNvbS8nLiR2My4nJzsNCgkJfSBlbHNlaWYoJHYxICE9ICcnIGFuZCAoc3RycG9zKCR2MSwgJz1tMjInKSAgIT09IGZhbHNlKSkgew0KCQkJJHNyYyA9ICc3MjBwfGh0dHBzOi8vMy5icC5ibG9nc3BvdC5jb20vJy4kdjEuJzw+MzYwcHxodHRwczovLzMuYnAuYmxvZ3Nwb3QuY29tLycuJHYyLicnOw0KCQl9IGVsc2Ugew0KCQkJJHNyYyA9ICczNjBwfGh0dHBzOi8vMy5icC5ibG9nc3BvdC5jb20vJy4kdjEuJyc7DQoJCX0NCgkJJGRhdGFwbGF5ID0gJHNyYzsNCn0NCi8vRU5EIFBMVVMuR09PR0xFLkNPTQ0KDQovL1NUQVJUIDlUU1UNCmVsc2VpZihzdHJwb3MoJHVybCAsICc5dHN1LmNvbScpICE9PSBmYWxzZSkNCnsNCgkJaWYgKHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHAnKSkgPiAwIG9yIHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHBzJykpID4gMCkgJHVybCA9ICR1cmw7IGVsc2UgJHVybCA9ICdodHRwOi8vJy4kdXJsLicnOw0KCQkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsNCgkJJHNvdXJjZSA9IGN1cmwoJHVybCk7DQoJCSRmaWxlcyA9IGV4cGxvZGUoImZpbGU6ICciLCRzb3VyY2UpOw0KCQkkZmlsZXMgPSBleHBsb2RlKCInIiwkZmlsZXNbMV0pOw0KCQkkZmlsZXMgPSAkZmlsZXNbMF07DQoJCSRsaW5rID0gIjcyMHwiLiRmaWxlcy4iIjsNCgkJJGRhdGFwbGF5ID0gJGxpbms7DQp9DQovL0VORCA5VFNVDQovL1NUQVJUIEpBVkdPDQplbHNlaWYoc3RycG9zKCR1cmwgLCAnamF2Z28ubWUnKSAhPT0gZmFsc2UpDQp7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cDovLycuJHVybC4nJzsNCgkJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJCSRzb3VyY2UgPSBjdXJsKCR1cmwpOw0KCQkkZGVjb2RlID0gZXhwbG9kZSgidHBsdWdpbi5kZWNvZGUoJyIsJHNvdXJjZSk7DQoJCSRkZWNvZGUgPSBleHBsb2RlKCInIiwkZGVjb2RlWzFdKTsNCgkJJGRlY29kZSA9IGJhc2U2NF9kZWNvZGUoJGRlY29kZVswXSk7DQoJCSRkZWNvZGUgPSBleHBsb2RlKCdzcmM9IicsJGRlY29kZSk7DQoJCSRkZWNvZGUgPSBleHBsb2RlKCciJywkZGVjb2RlWzFdKTsJCQ0KCQkkc291cmNlID0gY3VybCgkZGVjb2RlWzBdKTsNCgkJcHJlZ19tYXRjaF9hbGwoJy8iZmlsZSI6IiguKikiL1UnLCAkc291cmNlLCAkZGF0YSk7DQoJCSRjb3VudCA9IGNvdW50KCRkYXRhWzFdKTsNCgkJaWYoJGNvdW50PT00KQ0KCQl7DQoJCQkkbGluayA9ICc3MjB8Jy4kZGF0YVsxXVswXS4nLm1wNDw+NDgwfCcuJGRhdGFbMV1bMV0uJy5tcDQ8PjM2MHwnLiRkYXRhWzFdWzJdLic8PjI0MHwnLiRkYXRhWzFdWzNdLicubXA0JzsNCgkJfQ0KCQllbHNlaWYoJGNvdW50PT0zKQ0KCQl7DQoJCQkkbGluayA9ICc3MjB8Jy4kZGF0YVsxXVswXS4nLm1wNDw+NDgwfCcuJGRhdGFbMV1bMV0uJy5tcDQ8PjM2MHwnLiRkYXRhWzFdWzJdLicubXA0JzsNCgkJfQ0KCQllbHNlaWYoJGNvdW50PT0yKQ0KCQl7DQoJCQkkbGluayA9ICc3MjB8Jy4kZGF0YVsxXVswXS4nLm1wNDw+MzYwfCcuJGRhdGFbMV1bMV0uJy5tcDQnOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJGxpbmsgPSAnMzYwfCcuJGRhdGFbMV1bMF0uJyc7DQoJCX0NCgkJJGRhdGFwbGF5ID0gJGxpbms7DQp9DQovL0VORCBKQVZHTw0KLy9TVEFSVCBUSEVWSURFT01FDQplbHNlaWYoc3RycG9zKCR1cmwgLCAndGhldmlkZW8ubWUnKSAhPT0gZmFsc2UpDQp7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cDovLycuJHVybC4nJzsNCgkJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJCSRpZCA9IGV4cGxvZGUoIi5tZS8iLCR1cmwpOw0KCQkkdXJsID0gJ2h0dHA6Ly90aGV2aWRlby5tZS9lbWJlZC0nLiRpZFsxXS4nLTY0MHgzNjAuaHRtbCc7DQoJCWVjaG8gJHVybDsNCgkJJHNvdXJjZSA9IGN1cmwoJHVybCk7DQoJCXByZWdfbWF0Y2hfYWxsKCcvImZpbGUiOiIoLiopLm1wNCIvVScsICRzb3VyY2UsICRkYXRhKTsNCgkJJGNvdW50ID0gY291bnQoJGRhdGFbMV0pOw0KCQlpZigkY291bnQ9PTQpDQoJCXsNCgkJCSRsaW5rID0gJzcyMHwnLiRkYXRhWzFdWzBdLicubXA0PD40ODB8Jy4kZGF0YVsxXVsxXS4nLm1wNDw+MzYwfCcuJGRhdGFbMV1bMl0uJzw+MjQwfCcuJGRhdGFbMV1bM10uJy5tcDQnOw0KCQl9DQoJCWVsc2VpZigkY291bnQ9PTMpDQoJCXsNCgkJCSRsaW5rID0gJzcyMHwnLiRkYXRhWzFdWzBdLicubXA0PD40ODB8Jy4kZGF0YVsxXVsxXS4nLm1wNDw+MzYwfCcuJGRhdGFbMV1bMl0uJy5tcDQnOw0KCQl9DQoJCWVsc2VpZigkY291bnQ9PTIpDQoJCXsNCgkJCSRsaW5rID0gJzcyMHwnLiRkYXRhWzFdWzBdLicubXA0PD4zNjB8Jy4kZGF0YVsxXVsxXS4nLm1wNCc7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkbGluayA9ICczNjB8Jy4kZGF0YVsxXVswXS4nJzsNCgkJfQ0KCQkkZGF0YXBsYXkgPSAkbGluazsNCn0NCi8vRU5EIFRIRVZJREVPTUUNCi8vU1RBUlQgRklMRUhPT1QNCmVsc2VpZihzdHJwb3MoJHVybCAsICdmaWxlaG9vdC5jb20nKSAhPT0gZmFsc2UpDQp7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cDovLycuJHVybC4nJzsNCgkJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJCSR1cmwgPSBwcmVnX3JlcGxhY2UoIkAoLiopZmlsZWhvb3QuY29tLyguKikuaHRtbEAiLCJodHRwOi8vZmlsZWhvb3QuY29tL2VtYmVkLSQyLTEwNDZ4NTYyLmh0bWwiLCR1cmwpOw0KCQkkc291cmNlID0gZ2V0X2N1cmwoJHVybCk7DQoJCSRmaWxlcyA9IGV4cGxvZGUoJ2ZpbGU6ICInLCRzb3VyY2UpOw0KCQkkZmlsZXMgPSBleHBsb2RlKCciJywkZmlsZXNbMV0pOw0KCQkkZmlsZXMgPSAkZmlsZXNbMF07DQoJCSRsaW5rID0gIjcyMHwiLiRmaWxlcy4iIjsNCgkJJGRhdGFwbGF5ID0gJGxpbms7DQp9DQovL0VORCBGSUxFIEhPT1QNCi8vU1RBUlQgVklERU9RUQ0KZWxzZWlmKHN0cnBvcygkdXJsICwgJ3FxLmNvbScpICE9PSBmYWxzZSkNCnsNCgkJaWYgKHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHAnKSkgPiAwIG9yIHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHBzJykpID4gMCkgJHVybCA9ICR1cmw7IGVsc2UgJHVybCA9ICdodHRwOi8vJy4kdXJsLicnOw0KCQkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsNCgkJJHVybCA9IHVybGRlY29kZSgkdXJsKTsNCgkJLy8kdXJsID0gcHJlZ19yZXBsYWNlKCJAKC4qKXYucXEuY29tL2NvdmVyL3UvKC4qKS8oLiopLmh0bWxAIiwiaHR0cDovL3Z2LnZpZGVvLnFxLmNvbS9nZXRpbmZvP2RlZmF1bHRmbXQ9ZmhkJm90eXBlPWpzb24mcGxhdGZvcm09MTEmdmlkcz0kMyIsJHVybCk7DQoJCWlmKHN0cnBvcygkdXJsICwgJ3YucXEuY29tL2NvdmVyJykgIT09IGZhbHNlKQ0KCQl7DQoJCQkkY2hlY2sgPSBleHBsb2RlKCc/JywkdXJsKTsNCgkJCWlmKCRjaGVja1sxXSE9IiIpIGJyZWFrOw0KCQkJJGZpbGVzID0gcHJlZ19yZXBsYWNlKCJAKC4qKXYucXEuY29tL2NvdmVyLyguKikvKC4qKS5odG1sQCIsImh0dHA6Ly92c3JjLnN0b3JlLnFxLmNvbS8kMy5tcDQ/Y2hhbm5lbD12aG90MiZzZHRmcm9tJTNkdjImciUzZDkzMSZyZmM9djAiLCR1cmwpOw0KCQl9DQoJCWVsc2VpZihzdHJwb3MoJHVybCAsICdmaWxtLnFxLmNvbScpICE9PSBmYWxzZSkNCgkJewkJDQoJCQkkZGF0YSA9IGN1cmwoJHVybCk7DQoJCQkkZ2V0ID0gZXhwbG9kZSgndmlkIjoiJywkZGF0YSk7DQoJCQkkZ2V0ID0gZXhwbG9kZSgnIicsJGdldFsxXSk7DQoJCQkkZmlsZXMgPSAiaHR0cDovL3ZzcmMuc3RvcmUucXEuY29tLyIuJGdldFswXS4iLm1wND9jaGFubmVsPXZob3QyJnNkdGZyb20lM2R2MiZyJTNkOTMxJnJmYz12MCI7DQoJCX0NCgkJJGxpbmsgPSAiNzIwfCIuJGZpbGVzLiIiOw0KCQkkZGF0YXBsYXkgPSAkbGluazsNCn0NCi8vRU5EIFZJREVPUVENCi8vU1RBUlQgT05CT1hWTg0KZWxzZWlmKHN0cnBvcygkdXJsICwgJ29uYm94LnZuJykgIT09IGZhbHNlKQ0Kew0KCQlpZiAoc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cCcpKSA+IDAgb3Igc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cHMnKSkgPiAwKSAkdXJsID0gJHVybDsgZWxzZSAkdXJsID0gJ2h0dHA6Ly8nLiR1cmwuJyc7DQoJCSR0eXBlID0gMTsgJHR5cGV2aWRlbyA9ICdtcDQnOw0KCQkkc291cmNlID0gY3VybCgkdXJsKTsNCgkJJGZpbGVzID0gZXhwbG9kZSgid2luZG93LmxvY2F0aW9uID0gJyIsJHNvdXJjZSk7DQoJCSRmaWxlcyA9IGV4cGxvZGUoIiciLCRmaWxlc1sxXSk7DQoJCSRsaW5rID0gIjcyMHwiLiRmaWxlc1swXS4iIjsNCgkJJGRhdGFwbGF5ID0gJGxpbms7DQp9DQovL0VORCBPTkJPWFZODQovL1NUQVJUIEZBQ0VCT09LDQplbHNlaWYoc3RycG9zKCR1cmwgLCAnZmFjZWJvb2suY29tJykgIT09IGZhbHNlKQ0Kew0KCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cHM6Ly8nLiR1cmwuJyc7DQoJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJJGxpbmsgPSAkdXJsOw0KCWlmKHN1YnN0cigkbGluaywgLTEpICE9ICcvJyAmJiBpc19udW1lcmljKHN1YnN0cigkbGluaywgLTEpKSl7DQogICAgICAgICRsaW5rID0gJGxpbmsuJy8nOw0KICAgIH0NCiAgICBwcmVnX21hdGNoKCcvaHR0cHM6XC9cL3d3dy5mYWNlYm9vay5jb21cLyguKilcL3ZpZGVvc1wvKC4qKVwvKC4qKVwvKC4qKS9VJywgJGxpbmssICRpZCk7DQogICAgaWYoaXNzZXQoJGlkWzRdKSl7DQogICAgICAgICRpZFZpZGVvID0gJGlkWzNdOw0KICAgIH1lbHNlew0KICAgICAgICBwcmVnX21hdGNoKCcvaHR0cHM6XC9cL3d3dy5mYWNlYm9vay5jb21cLyguKilcL3ZpZGVvc1wvKC4qKVwvKC4qKS9VJywgJGxpbmssICRpZCk7IA0KICAgICAgICBpZihpc3NldCgkaWRbM10pKXsNCiAgICAgICAgICAgICRpZFZpZGVvID0gJGlkWzJdOw0KICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIHByZWdfbWF0Y2goJy9odHRwczpcL1wvd3d3LmZhY2Vib29rLmNvbVwvdmlkZW9cLnBocFw/dlw9KC4qKS8nLCAkbGluaywgJGlkKTsgDQogICAgICAgICAgICAkaWRWaWRlbyA9ICRpZFsxXTsNCiAgICAgICAgICAgICRpZFZpZGVvID0gc3Vic3RyKCRpZFZpZGVvLCAwLCAtMSk7DQogICAgICAgIH0NCiAgICB9DQogICAgJGVtYmVkID0gJ2h0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS92aWRlby9lbWJlZD92aWRlb19pZD0nLiRpZFZpZGVvOyANCiAgICAkZ2V0ID0gY3VybCgkZW1iZWQpOw0KICAgICRkYXRhID0gZXhwbG9kZSgnW1sicGFyYW1zIiwiJywgJGdldCk7IA0KICAgICRkYXRhID0gZXhwbG9kZSgnIl0sWyInLCAkZGF0YVsxXSk7IA0KICAgICRkYXRhID0gc3RyX3JlcGxhY2UoDQogICAgICAgIGFycmF5KCdcdTAwMjU3QicsICdcdTAwMjUyMicsICdcdTAwMjUzQScsICdcdTAwMjUyQycsICdcdTAwMjU1QicsICdcdTAwMjU1Q1x1MDAyNTJGJywgJ1x1MDAyNTJGJywgJ1x1MDAyNTNGJywgJ1x1MDAyNTNEJywgJ1x1MDAyNTI2JyksDQogICAgICAgIGFycmF5KCd7JywgJyInLCAnOicsICcsJywgJ1snLCAnXC8nLCAnLycsICc/JywgJz0nLCAnJicpLA0KICAgICAgICAkZGF0YVswXQ0KICAgICk7DQoJJEhEID0gZXhwbG9kZSgnImhkX3NyYyI6IicsJGRhdGEpOw0KCSRIRCA9IGV4cGxvZGUoJyInLCRIRFsxXSk7DQoJJEhEID0gc3RyX3JlcGxhY2UoJ1wvJywgJy8nLCAkSERbMF0pOw0KCSRTRCA9IGV4cGxvZGUoJyJzZF9zcmMiOiInLCRkYXRhKTsNCgkkU0QgPSBleHBsb2RlKCciJywkU0RbMV0pOw0KCSRTRCA9IHN0cl9yZXBsYWNlKCdcLycsICcvJywgJFNEWzBdKTsNCglpZihpc3NldCgkSEQpKQ0KCXsNCgkJJGxpbmsgLj0gIjcyMHwkSEQ8PiI7DQoJfQ0KCWlmKGlzc2V0KCRTRCkpDQoJew0KCSRsaW5rIC49ICIzNjB8JFNEIjsNCgl9DQoJJGRhdGFwbGF5ID0gJGxpbms7DQp9DQovL0VORCBGQUNFQk9PSw0KLy9TVEFSVCBVUFRPU1RSRUFNDQplbHNlaWYoc3RycG9zKCR1cmwgLCAndXB0b3N0cmVhbS5jb20nKSAhPT0gZmFsc2UpDQp7DQoJaWYgKHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHAnKSkgPiAwIG9yIHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHBzJykpID4gMCkgJHVybCA9ICR1cmw7IGVsc2UgJHVybCA9ICdodHRwOi8vJy4kdXJsLicnOw0KCSR0eXBlID0gMTsgJHR5cGV2aWRlbyA9ICdtcDQnOw0KCSRzb3VyY2UgPSBjdXJsKCR1cmwpOw0KCSRjb250ZW50ID0gZXhwbG9kZSgiPHNvdXJjZSBzcmM9JyIsJHNvdXJjZSk7DQoJJGNvbnRlbnQgPSBleHBsb2RlKCInIiwkY29udGVudFsxXSk7DQoJJGxpbmsgPSAnNzIwcHwnLiRjb250ZW50WzBdLicnOw0KCSRkYXRhcGxheSA9ICRsaW5rOw0KfQ0KLy9FTkQgVVBUT1NUUkVBTQ0KLy9TVEFSVCBUVU5FUEsNCmVsc2VpZihzdHJwb3MoJHVybCAsICd0dW5lLnBrJykgIT09IGZhbHNlKQ0Kew0KCQlpZiAoc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cCcpKSA+IDAgb3Igc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cHMnKSkgPiAwKSAkdXJsID0gJHVybDsgZWxzZSAkdXJsID0gJ2h0dHA6Ly8nLiR1cmwuJyc7DQoJCSR0eXBlID0gMTsgJHR5cGV2aWRlbyA9ICdtcDQnOw0KCQkkZ2V0ID0gY3VybCgkdXJsKTsNCgkJcHJlZ19tYXRjaF9hbGwoIi9maWxlOiAnKC4qKScvVSIsICRnZXQsICRkYXRhKTsNCgkJJGNvdW50ID0gY291bnQoJGRhdGFbMV0pOw0KCQlpZigkY291bnQ9PTQpDQoJCXsNCgkJCSRsaW5rID0gJzcyMHwnLiRkYXRhWzFdWzBdLic8PjQ4MHwnLiRkYXRhWzFdWzFdLic8PjM2MHwnLiRkYXRhWzFdWzJdLic8PjI0MHwnLiRkYXRhWzFdWzNdLicnOw0KCQl9DQoJCWVsc2VpZigkY291bnQ9PTMpDQoJCXsNCgkJCSRsaW5rID0gJzcyMHwnLiRkYXRhWzFdWzBdLic8PjQ4MHwnLiRkYXRhWzFdWzFdLic8PjM2MHwnLiRkYXRhWzFdWzJdLicnOw0KCQl9DQoJCWVsc2VpZigkY291bnQ9PTIpDQoJCXsNCgkJCSRsaW5rID0gJzcyMHwnLiRkYXRhWzFdWzBdLic8PjM2MHwnLiRkYXRhWzFdWzFdLicnOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJGxpbmsgPSAnMzYwfCcuJGRhdGFbMV1bMF0uJyc7DQoJCX0NCgkJJGRhdGFwbGF5ID0gJGxpbms7DQp9DQovL0VORCBUVU5FUEsNCi8vU1RBUlQgUExBWVdJUkUNCmVsc2VpZihzdHJwb3MoJHVybCAsICdwbGF5d2lyZS5jb20nKSAhPT0gZmFsc2UpDQp7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cDovLycuJHVybC4nJzsNCgkJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJCWlmKHN0cnBvcygkdXJsICwgJ3B1Ymxpc2hlcnMnKSAhPT0gZmFsc2UpICR1cmwgPSBwcmVnX3JlcGxhY2UoIkAoLiopcGxheXdpcmUuY29tLyguKikvcHVibGlzaGVycy8oLiopL3ZpZGVvcy8oLiopQCIsImh0dHBzOi8vY29uZmlnLnBsYXl3aXJlLmNvbS8kMy92aWRlb3MvdjIvJDQvbWFuaWZlc3QuZjRtIiwkdXJsKTsNCgkJaWYoc3RycG9zKCR1cmwgLCAnc2FuZGJveCcpICE9PSBmYWxzZSkgJHVybCA9IHByZWdfcmVwbGFjZSgiQCguKilwbGF5d2lyZS5jb20vKC4qKS9zYW5kYm94L3ZpZGVvcy8oLiopQCIsImh0dHBzOi8vY29uZmlnLnBsYXl3aXJlLmNvbS8xMDEwODQ5L3ZpZGVvcy92Mi8kMy9tYW5pZmVzdC5mNG0iLCR1cmwpOw0KCQkkZ2V0ID0gY3VybCgkdXJsKTsNCgkJcHJlZ19tYXRjaCgnLzxiYXNlVVJMPiguKik8L1UnLCAkZ2V0LCAkcGxheSk7DQoJCXByZWdfbWF0Y2hfYWxsKCcvPG1lZGlhIHVybD0iKC4qKSIvVScsICRnZXQsICRkYXRhKTsNCgkJJGNvdW50ID0gY291bnQoJGRhdGFbMV0pOw0KCQlpZigkY291bnQ9PTMpDQoJCXsNCgkJCSRsaW5rID0gJzcyMHwnLiRwbGF5WzFdLicvJy4kZGF0YVsxXVsxXS4nPD4zNjB8Jy4kcGxheVsxXS4nLycuJGRhdGFbMV1bMF0uJzw+MjQwfCcuJHBsYXlbMV0uJy8nLiRkYXRhWzFdWzJdLicnOw0KCQl9DQoJCWVsc2VpZigkY291bnQ9PTIpDQoJCXsNCgkJCSRsaW5rID0gJzM2MHwnLiRwbGF5WzFdLicvJy4kZGF0YVsxXVswXS4nPD4yNDB8Jy4kcGxheVsxXS4nLycuJGRhdGFbMV1bMV0uJyc7DQoJCX0NCgkJZWxzZWlmKCRjb3VudD09MSkNCgkJew0KCQkJJGxpbmsgPSAnMzYwfCcuJHBsYXlbMV0uJy8nLiRkYXRhWzFdWzBdLicnOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJGxpbmsgPSAnMzYwfCcuJHBsYXlbMV0uJy8nLiRkYXRhWzFdWzBdLicnOw0KCQl9DQoJCSRkYXRhcGxheSA9ICRsaW5rOw0KfQ0KLy9FTkQgUExBWVdJUkUNCi8vU1RBUlQgS1VNUFVMQkFHSQ0KZWxzZWlmKHN0cnBvcygkdXJsICwgJ2t1bXB1bGJhZ2kuaWQnKSAhPT0gZmFsc2UpDQp7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cDovLycuJHVybC4nJzsNCgkJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJCSRkYXRhID0gY3VybCgkdXJsKTsNCgkJJGN1dCA9IGV4cGxvZGUoJ2RhdGEtcGxheWVyLWZpbGU9IicsJGRhdGEpOw0KCQkkY3V0ID0gZXhwbG9kZSgnIicsJGN1dFsxXSk7DQoJCSRkYXRhcGxheSA9ICczNjB8Jy4kY3V0WzBdLicnOw0KCQkvKg0KCQkkY3V0Zm9ybSA9IGV4cGxvZGUoJzxmb3JtIGFjdGlvbj0iJywkZGF0YSk7DQoJCSRjdXRnZXR1cmwgPSBleHBsb2RlKCciIGNsYXNzPSInLCRjdXRmb3JtWzFdKTsNCgkJJGdldHVybCA9ICdodHRwOi8va3VtcHVsYmFnaS5pZCcuJGN1dGdldHVybFswXS4nJzsNCgkJJGN1dGZpbGVpZCA9IGV4cGxvZGUoJzxpbnB1dCBpZD0iZGZfJywkY3V0Zm9ybVsxXSk7DQoJCSRjdXRmaWxlaWQgPSBleHBsb2RlKCciIG5hbWU9ImZpbGVJZCInLCRjdXRmaWxlaWRbMV0pOw0KCQkkZmlsZWlkID0gaW50dmFsKCRjdXRmaWxlaWRbMF0pOw0KCQkkY3V0dG9rZW4gPSBleHBsb2RlKCduYW1lPSJfX1JlcXVlc3RWZXJpZmljYXRpb25Ub2tlbiIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iJywkY3V0Zm9ybVsxXSk7DQoJCSRjdXR0b2tlbiA9IGV4cGxvZGUoJyInLCRjdXR0b2tlblsxXSk7DQoJCSR0b2tlbiA9ICRjdXR0b2tlblswXTsNCgkJJHBhcmFtcyA9IGFycmF5KA0KCQkJImZpbGVJZCIgPT4gIiIuJGZpbGVpZC4iIiwNCgkJCSJfX1JlcXVlc3RWZXJpZmljYXRpb25Ub2tlbiIgPT4gIiIuJHRva2VuLiIiLA0KCQkpOw0KCQkkZG93bmxvYWQgPSBrdW1wdWxiYWdpKCRnZXR1cmwsJHBhcmFtcyk7DQoJCSRkYXRhcGxheSA9IGRvd25rdW1wdWxiYWdpKCRkb3dubG9hZCk7Ki8NCg0KfQ0KLy9FTkQgS1VNUFVMQkFHSQ0KLy9TVEFSVCBWTFhYDQplbHNlaWYoc3RycG9zKCR1cmwgLCAndmx4eC50dicpICE9PSBmYWxzZSkNCnsNCgkJaWYgKHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHAnKSkgPiAwIG9yIHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHBzJykpID4gMCkgJHVybCA9ICR1cmw7IGVsc2UgJHVybCA9ICdodHRwOi8vJy4kdXJsLicnOw0KCQkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsJCQ0KCQkkZGF0YSA9IGN1cmwoJHVybCk7DQoJCSRnZXR1cmwgPSAnaHR0cDovL3ZseHgudHYvYWpheC5waHAnOw0KCQkkbGluayA9IGV4cGxvZGUoJ3Byb3h5Lmxpbms9Jywkc291cmNlKTsNCgkJJGxpbmsgPSBleHBsb2RlKCcmc2tpbj0nLCAkbGlua1sxXSk7DQoJCSRsaW5rID0gJzUzMCc7DQoJCSRwYXJhbXMgPSBhcnJheSgNCgkJCSJ2bHh4X3NlcnZlciIgPT4gMSwNCgkJCSJzZXZlciIgPT4gMSwNCgkJCSJpZCIgPT4gNTMwLA0KCQkpOw0KCQkkZG93bmxvYWQgPSBnZXRwb3N0KCRnZXR1cmwsJHBhcmFtcyk7DQoJCXBvc3QoKTsNCgkJJGRhdGFwbGF5ID0gJGRvd25sb2FkOw0KfQ0KLy9FTkQgVkxYWA0KLy9TVEFSVCBKQVZISUhJDQplbHNlaWYoc3RycG9zKCR1cmwgLCAnamF2aGloaS5jb20nKSAhPT0gZmFsc2Ugb3Igc3RycG9zKCR1cmwgLCAnbGV0ZmFwLmNvbScpICE9PSBmYWxzZSkNCnsNCgkJaWYgKHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHAnKSkgPiAwIG9yIHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHBzJykpID4gMCkgJHVybCA9ICR1cmw7IGVsc2UgJHVybCA9ICdodHRwOi8vJy4kdXJsLicnOw0KCQkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsNCgkJJHNvdXJjZSA9IGN1cmwoJHVybCk7DQoJCXByZWdfbWF0Y2hfYWxsKCcvPHNvdXJjZSBzcmM9IiguKikiL1UnLCAkc291cmNlLCAkZGF0YSk7DQoJCSRjb3VudCA9IGNvdW50KCRkYXRhWzFdKTsNCgkJaWYoJGNvdW50PT00KQ0KCQl7DQoJCQkkbGluayA9ICc3MjB8Jy4kZGF0YVsxXVswXS4nPD40ODB8Jy4kZGF0YVsxXVsxXS4nPD4zNjB8Jy4kZGF0YVsxXVsyXS4nPD4yNDB8Jy4kZGF0YVsxXVszXS4nJzsNCgkJfQ0KCQllbHNlaWYoJGNvdW50PT0zKQ0KCQl7DQoJCQkkbGluayA9ICc3MjB8Jy4kZGF0YVsxXVswXS4nPD40ODB8Jy4kZGF0YVsxXVsxXS4nPD4zNjB8Jy4kZGF0YVsxXVsyXS4nJzsNCgkJfQ0KCQllbHNlaWYoJGNvdW50PT0yKQ0KCQl7DQoJCQkkbGluayA9ICc3MjB8Jy4kZGF0YVsxXVswXS4nPD4zNjB8Jy4kZGF0YVsxXVsxXS4nJzsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCSRsaW5rID0gJzM2MHwnLiRkYXRhWzFdWzBdLicnOw0KCQl9DQoJCSRkYXRhcGxheSA9ICRsaW5rOw0KfQ0KLy9FTkQgSkFWSElISQ0KLy9TVEFSVCBTSE9XSkFWDQplbHNlaWYoc3RycG9zKCR1cmwgLCAnc2hvd2phdi5jb20nKSAhPT0gZmFsc2UpDQp7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cDovLycuJHVybC4nJzsNCgkJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJCSRzb3VyY2UgPSBjdXJsKCR1cmwpOw0KCQkkZGF0YV9saW5rID0gZXhwbG9kZSgnbGluazogIicsJHNvdXJjZSk7DQoJCSRkYXRhX2xpbmsgPSBleHBsb2RlKCciJywkZGF0YV9saW5rWzFdKTsNCgkJJGRhdGFsaW5rID0gJ2h0dHA6Ly9zaG93amF2LmNvbS93cC1jb250ZW50L3BsYXllci9qYXZoZHh4LWFwaS5waHA/bGluaz0nLiRkYXRhX2xpbmtbMF0uJyc7DQoJCSRzb3VyY2UgPSBjdXJsKCRkYXRhbGluayk7DQoJCSRzb3VyY2UgPSBleHBsb2RlKCc8aWZyYW1lIHNyYz0iJywkc291cmNlKTsNCgkJJHNvdXJjZSA9IGV4cGxvZGUoJyInLCRzb3VyY2VbMV0pOw0KCQkkc291cmNlID0gY3VybCgkc291cmNlWzBdKTsNCgkJcHJlZ19tYXRjaF9hbGwoJy9maWxlOiAiKC4qKSIsdHlwZS9VJywgJHNvdXJjZSwgJGRhdGEpOw0KCQkkY291bnQgPSBjb3VudCgkZGF0YVsxXSk7DQoJCWlmKCRjb3VudD09NCkNCgkJew0KCQkJJGxpbmsgPSAnNzIwfCcuJGRhdGFbMV1bMF0uJzw+NDgwfCcuJGRhdGFbMV1bMV0uJzw+MzYwfCcuJGRhdGFbMV1bMl0uJzw+MjQwfCcuJGRhdGFbMV1bM10uJyc7DQoJCX0NCgkJZWxzZWlmKCRjb3VudD09MykNCgkJew0KCQkJJGxpbmsgPSAnNzIwfCcuJGRhdGFbMV1bMF0uJzw+NDgwfCcuJGRhdGFbMV1bMV0uJzw+MzYwfCcuJGRhdGFbMV1bMl0uJyc7DQoJCX0NCgkJZWxzZWlmKCRjb3VudD09MikNCgkJew0KCQkJJGxpbmsgPSAnNzIwfCcuJGRhdGFbMV1bMF0uJzw+MzYwfCcuJGRhdGFbMV1bMV0uJyc7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkbGluayA9ICczNjB8Jy4kZGF0YVsxXVswXS4nJzsNCgkJfQ0KCQkkZGF0YXBsYXkgPSAkbGluazsNCn0NCi8vRU5EIFNIT1dKQVYNCi8vU1RBUlQgQVZYWA0KZWxzZWlmKHN0cnBvcygkdXJsICwgJ2F2eHgudHYnKSAhPT0gZmFsc2UpDQp7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cDovLycuJHVybC4nJzsNCgkJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJCSRzb3VyY2UgPSBjdXJsKCR1cmwpOw0KCQkkZGF0YV9saW5rID0gZXhwbG9kZSgnbGluazogIicsJHNvdXJjZSk7DQoJCSRkYXRhX2xpbmsgPSBleHBsb2RlKCciJywkZGF0YV9saW5rWzFdKTsNCgkJJGRhdGFsaW5rID0gJ2h0dHA6Ly9hdnh4LnR2L3dwLWNvbnRlbnQvcGxheWVyL2phdmhkeHgtYXBpLnBocD9saW5rPScuJGRhdGFfbGlua1swXS4nJzsNCgkJJHNvdXJjZSA9IGN1cmwoJGRhdGFsaW5rKTsNCgkJJHNvdXJjZSA9IGV4cGxvZGUoJzxpZnJhbWUgc3JjPSInLCRzb3VyY2UpOw0KCQkkc291cmNlID0gZXhwbG9kZSgnIicsJHNvdXJjZVsxXSk7DQoJCSRzb3VyY2UgPSBjdXJsKCRzb3VyY2VbMF0pOw0KCQlwcmVnX21hdGNoX2FsbCgnL2ZpbGU6ICIoLiopIix0eXBlL1UnLCAkc291cmNlLCAkZGF0YSk7DQoJCSRjb3VudCA9IGNvdW50KCRkYXRhWzFdKTsNCgkJaWYoJGNvdW50PT00KQ0KCQl7DQoJCQkkbGluayA9ICc3MjB8Jy4kZGF0YVsxXVswXS4nPD40ODB8Jy4kZGF0YVsxXVsxXS4nPD4zNjB8Jy4kZGF0YVsxXVsyXS4nPD4yNDB8Jy4kZGF0YVsxXVszXS4nJzsNCgkJfQ0KCQllbHNlaWYoJGNvdW50PT0zKQ0KCQl7DQoJCQkkbGluayA9ICc3MjB8Jy4kZGF0YVsxXVswXS4nPD40ODB8Jy4kZGF0YVsxXVsxXS4nPD4zNjB8Jy4kZGF0YVsxXVsyXS4nJzsNCgkJfQ0KCQllbHNlaWYoJGNvdW50PT0yKQ0KCQl7DQoJCQkkbGluayA9ICc3MjB8Jy4kZGF0YVsxXVswXS4nPD4zNjB8Jy4kZGF0YVsxXVsxXS4nJzsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCSRsaW5rID0gJzM2MHwnLiRkYXRhWzFdWzBdLicnOw0KCQl9DQoJCSRkYXRhcGxheSA9ICRsaW5rOw0KfQ0KLy9FTkQgQVZYWA0KLy9TVEFSVCBKQVZUSEFJDQplbHNlaWYoc3RycG9zKCR1cmwgLCAnamF2dGhhaS5jb20nKSAhPT0gZmFsc2UpDQp7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cDovLycuJHVybC4nJzsNCgkJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJCSRzb3VyY2UgPSBjdXJsKCR1cmwpOw0KCQlwcmVnX21hdGNoX2FsbCgnL2ZpbGU6ICIoLiopIi9VJywgJHNvdXJjZSwgJGRhdGEpOw0KCQkkY291bnQgPSBjb3VudCgkZGF0YVsxXSk7DQoJCWlmKCRjb3VudD09NCkNCgkJew0KCQkJJGxpbmsgPSAnNzIwfCcuJGRhdGFbMV1bMF0uJzw+NDgwfCcuJGRhdGFbMV1bMV0uJzw+MzYwfCcuJGRhdGFbMV1bMl0uJzw+MjQwfCcuJGRhdGFbMV1bM10uJyc7DQoJCX0NCgkJZWxzZWlmKCRjb3VudD09MykNCgkJew0KCQkJJGxpbmsgPSAnNzIwfCcuJGRhdGFbMV1bMF0uJzw+NDgwfCcuJGRhdGFbMV1bMV0uJzw+MzYwfCcuJGRhdGFbMV1bMl0uJyc7DQoJCX0NCgkJZWxzZWlmKCRjb3VudD09MikNCgkJew0KCQkJJGxpbmsgPSAnNzIwfCcuJGRhdGFbMV1bMF0uJzw+MzYwfCcuJGRhdGFbMV1bMV0uJyc7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkbGluayA9ICczNjB8Jy4kZGF0YVsxXVswXS4nJzsNCgkJfQ0KCQkkZGF0YXBsYXkgPSAkbGluazsNCn0NCi8vRU5EIEpBVlRIQUkNCi8vU1RBUlQgTVlWSURFTw0KZWxzZWlmKHN0cnBvcygkdXJsICwgJ215dmlkZW8uYXonKSAhPT0gZmFsc2Ugb3Igc3RycG9zKCR1cmwgLCAnbXl2aWRlby5nZScpICE9PSBmYWxzZSkNCnsNCgkJaWYgKHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHAnKSkgPiAwIG9yIHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHBzJykpID4gMCkgJHVybCA9ICR1cmw7IGVsc2UgJHVybCA9ICdodHRwOi8vJy4kdXJsLicnOw0KCQkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsNCgkJJGdldCA9IGN1cmwoJHVybCk7DQoJCXByZWdfbWF0Y2hfYWxsKCcvZmlsZTogIiguKikiL1UnLCAkZ2V0LCAkZGF0YSk7DQoJCSRjb3VudCA9IGNvdW50KCRkYXRhWzFdKTsNCgkJaWYoJGNvdW50ID09IDEpDQoJCXsNCgkJCSRzcmMgLj0gIjM2MHB8Ii4kZGF0YVsxXVswXS4iIjsNCgkJfQ0KCQllbHNlaWYgKCRjb3VudCA9PSAyKQ0KCQl7DQoJCQkkc3JjIC49ICIzNjBwfCIuJGRhdGFbMV1bMV0uIjw+IjsNCgkJCSRzcmMgLj0gIjcyMHB8Ii4kZGF0YVsxXVswXS4iIjsNCgkJfQ0KCQkkZGF0YXBsYXkgPSAkc3JjOw0KCQ0KfQ0KLy9FTkQgTVlWSURFTw0KLy9TVEFSVCBNRURJQUZJUkUNCmVsc2VpZihzdHJwb3MoJHVybCAsICdtZWRpYWZpcmUuY29tJykgIT09IGZhbHNlKQ0Kew0KCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cDovLycuJHVybC4nJzsNCgkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsNCglpZihzdHJwb3MoJHVybCAsICdtZWRpYWZpcmUuY29tL3dhdGNoJykgIT09IGZhbHNlKQ0KCSRlbWJlZCA9IHByZWdfcmVwbGFjZSgiQCguKiltZWRpYWZpcmUuY29tL3dhdGNoLyguKikvKC4qKUAiLCJodHRwOi8vd3d3Lm1lZGlhZmlyZS5jb20vZG93bmxvYWQvJDIvJDMiLCR1cmwpOw0KCWVsc2UgJGVtYmVkID0gJHVybDsNCgkkc291cmNlID0gY3VybCgkdXJsKTsNCgkkY29udGVudCA9IGV4cGxvZGUoJ2tOTyA9ICInLCRzb3VyY2UpOw0KCSRjb250ZW50ID0gZXhwbG9kZSgnIicsJGNvbnRlbnRbMV0pOw0KCSRsaW5rID0gJzcyMHB8Jy4kY29udGVudFswXS4nJzsNCgkkZGF0YXBsYXkgPSAkc291cmNlOw0KfQ0KLy9FTkQgTUVESUFGSVJFDQovL1NUQVJUIFpPTkUgWFhYDQovL1NUQVJUIFhWSURFT1MNCmVsc2VpZihzdHJwb3MoJHVybCAsICd3d3cueHZpZGVvcy5jb20nKSAhPT0gZmFsc2UpDQp7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cDovLycuJHVybC4nJzsNCgkJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJCSRzb3VyY2UgPSBtb2JpbGUoJHVybCk7DQoJCSRkYXRhID0gZXhwbG9kZSgneC54dmlkZW9zLmNvbS92aWRlb3MnLCRzb3VyY2UpOw0KCQlwcmVnX21hdGNoX2FsbCgiL2h0dHA6XC9cLyguKikueHZpZGVvcy5jb21cL3ZpZGVvc1wvKC4qKS5tcDQoLiopXCcvVSIsJHNvdXJjZSwkZGF0YSk7DQoJCS8vcHJpbnRfcigkZGF0YSk7DQoJCWZvcigkaT0wOyRpPGNvdW50KCRkYXRhWzFdKTskaSsrKQ0KCQl7DQoJCQlpZihzdHJwb3MoJGRhdGFbMl1bJGldICwgJzNncCcpICE9PSBmYWxzZSkgJGxpbmsgLj0gIjI0MHxodHRwOi8vIi4kZGF0YVsxXVskaV0uIi54dmlkZW9zLmNvbS92aWRlb3MvIi4kZGF0YVsyXVskaV0uIi5tcDQiLiRkYXRhWzNdWyRpXS4iPD4iOw0KCQkJZWxzZWlmKHN0cnBvcygkZGF0YVsyXVskaV0gLCAnbXA0JykgIT09IGZhbHNlKSAkbGluayAuPSAiMzYwfGh0dHA6Ly8iLiRkYXRhWzFdWyRpXS4iLnh2aWRlb3MuY29tL3ZpZGVvcy8iLiRkYXRhWzJdWyRpXS4iLm1wNCIuJGRhdGFbM11bJGldLiIiOw0KCQl9DQoJCS8qJGlkID0gcHJlZ19yZXBsYWNlKCJAKC4qKXh2aWRlb3MuY29tL3ZpZGVvKC4qKS8oLiopQCIsIiQyIiwkdXJsKTsNCgkJJGdldCA9IGdldF94dmlkZW9zKCRpZCk7DQoJCXByZWdfbWF0Y2goJy8iTE9HR0VEIjp0cnVlLCJVUkwiOiIoLiopIn0vVScsICRnZXQsICRtcDQpOw0KCQkkbGlua19tcDQgPSBzdHJfcmVwbGFjZSgnXC8nLCAnLycsICRtcDRbMV0pOw0KCQkkbGlua19tcDQgPSBleHBsb2RlKCciLCInLCRsaW5rX21wNCk7DQoJCSRsaW5rX21wNCA9ICRsaW5rX21wNFswXTsNCgkJaWYoJGxpbmtfbXA0PT0iIikNCgkJew0KCQkJJGNoID0gY3VybF9pbml0KCk7DQoJCQljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAkX0dFVFsndXJsJ10pOw0KCQkJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VTRVJBR0VOVCwgJ2lwYWR8aXBob25lfGlwb2R8YW5kcm9pZHxibGFja2JlcnJ5OXxibGFja2JlcnJ5IDk4fGJsYWNrYmVycnkgOTl8aWVtb2JpbGV8YmFkYXxzeW1iaWFub3NcLzlcLjN8c3ltYmlhbm9zXC85XC40fHN5bWJpYW5vc1wvOVwuNXxzeW1iaWFuXC8zfG5va2lhbjk1fHJ4XC01MSBuOTAwfGh0Y19oZDInKTsNCgkJCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgdHJ1ZSk7DQoJCQkkYXNkID0gY3VybF9leGVjKCRjaCk7DQoJCQljdXJsX2Nsb3NlKCRjaCk7DQoJCQkkbGlua3ggPSBleHBsb2RlKCduZXcgSFRNTDVQbGF5ZXIoJywkYXNkKTsNCgkJCSRsaW5rYSA9IGV4cGxvZGUoJyk7JywkbGlua3hbMV0pOw0KCQkJJGxpbmtiID0gZXhwbG9kZSgnLCAnLCRsaW5rYVswXSk7DQoJCQlpZigkbGlua21wNCA9c3RyX3JlcGxhY2UoIiciLCIiLCRsaW5rYlszXSkpIHskbGlua21wNCA9c3RyX3JlcGxhY2UoIiciLCIiLCRsaW5rYlszXSk7fSBlbHNlIHskbGlua21wNCA9c3RyX3JlcGxhY2UoIiciLCIiLCRsaW5rYlsyXSk7fQ0KCQkJJGxpbmszZ3AgPSBzdHJfcmVwbGFjZSgiJyIsIiIsJGxpbmtiWzJdKTsNCgkJCSRsaW5rX21wNCA9ICRsaW5rbXA0Ow0KCQl9DQoJCSRsaW5rID0gJzM2MHB8Jy4kbGlua19tcDQuJyc7Ki8NCgkJJGRhdGFwbGF5ID0gJGxpbms7DQoNCn0NCi8vRU5EIFhWSURFT1MNCi8vU1RBUlQgSlBYVklERU9TDQplbHNlaWYoc3RycG9zKCR1cmwgLCAnanAueHZpZGVvcy5jb20nKSAhPT0gZmFsc2UpDQp7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cDovLycuJHVybC4nJzsNCgkJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJCSRzb3VyY2UgPSBtb2JpbGUoJHVybCk7DQoJCSRkYXRhID0gZXhwbG9kZSgneC54dmlkZW9zLmNvbS92aWRlb3MnLCRzb3VyY2UpOw0KCQlwcmVnX21hdGNoX2FsbCgiL2h0dHA6XC9cLyguKikueHZpZGVvcy5jb21cL3ZpZGVvc1wvKC4qKS5tcDQoLiopXCcvVSIsJHNvdXJjZSwkZGF0YSk7DQoJCS8vcHJpbnRfcigkZGF0YSk7DQoJCWZvcigkaT0wOyRpPGNvdW50KCRkYXRhWzFdKTskaSsrKQ0KCQl7DQoJCQlpZihzdHJwb3MoJGRhdGFbMl1bJGldICwgJzNncCcpICE9PSBmYWxzZSkgJGxpbmsgLj0gIjI0MHxodHRwOi8vIi4kZGF0YVsxXVskaV0uIi54dmlkZW9zLmNvbS92aWRlb3MvIi4kZGF0YVsyXVskaV0uIi5tcDQiLiRkYXRhWzNdWyRpXS4iPD4iOw0KCQkJZWxzZWlmKHN0cnBvcygkZGF0YVsyXVskaV0gLCAnbXA0JykgIT09IGZhbHNlKSAkbGluayAuPSAiMzYwfGh0dHA6Ly8iLiRkYXRhWzFdWyRpXS4iLnh2aWRlb3MuY29tL3ZpZGVvcy8iLiRkYXRhWzJdWyRpXS4iLm1wNCIuJGRhdGFbM11bJGldLiIiOw0KCQl9DQoJCS8vZWNobyAkc291cmNlOw0KCQkvKg0KCQkkaWQgPSBwcmVnX3JlcGxhY2UoIkAoLiopanAueHZpZGVvcy5jb20vdmlkZW8oLiopLyguKilAIiwiJDIiLCR1cmwpOw0KCQkkZ2V0ID0gZ2V0X3h2aWRlb3MoJGlkKTsNCgkJcHJlZ19tYXRjaCgnLyJMT0dHRUQiOnRydWUsIlVSTCI6IiguKikifS9VJywgJGdldCwgJG1wNCk7DQoJCSRsaW5rX21wNCA9IHN0cl9yZXBsYWNlKCdcLycsICcvJywgJG1wNFsxXSk7DQoJCSRsaW5rX21wNCA9IGV4cGxvZGUoJyIsIicsJGxpbmtfbXA0KTsNCgkJJGxpbmtfbXA0ID0gJGxpbmtfbXA0WzBdOw0KCQlpZigkbGlua19tcDQ9PSIiKQ0KCQl7DQoJCQkkY2ggPSBjdXJsX2luaXQoKTsNCgkJCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VUkwsICRfR0VUWyd1cmwnXSk7DQoJCQljdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVNFUkFHRU5ULCAnaXBhZHxpcGhvbmV8aXBvZHxhbmRyb2lkfGJsYWNrYmVycnk5fGJsYWNrYmVycnkgOTh8YmxhY2tiZXJyeSA5OXxpZW1vYmlsZXxiYWRhfHN5bWJpYW5vc1wvOVwuM3xzeW1iaWFub3NcLzlcLjR8c3ltYmlhbm9zXC85XC41fHN5bWJpYW5cLzN8bm9raWFuOTV8cnhcLTUxIG45MDB8aHRjX2hkMicpOw0KCQkJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCB0cnVlKTsNCgkJCSRhc2QgPSBjdXJsX2V4ZWMoJGNoKTsNCgkJCWN1cmxfY2xvc2UoJGNoKTsNCgkJCSRsaW5reCA9IGV4cGxvZGUoJ25ldyBIVE1MNVBsYXllcignLCRhc2QpOw0KCQkJJGxpbmthID0gZXhwbG9kZSgnKTsnLCRsaW5reFsxXSk7DQoJCQkkbGlua2IgPSBleHBsb2RlKCcsICcsJGxpbmthWzBdKTsNCgkJCWlmKCRsaW5rbXA0ID1zdHJfcmVwbGFjZSgiJyIsIiIsJGxpbmtiWzNdKSkgeyRsaW5rbXA0ID1zdHJfcmVwbGFjZSgiJyIsIiIsJGxpbmtiWzNdKTt9IGVsc2UgeyRsaW5rbXA0ID1zdHJfcmVwbGFjZSgiJyIsIiIsJGxpbmtiWzJdKTt9DQoJCQkkbGluazNncCA9IHN0cl9yZXBsYWNlKCInIiwiIiwkbGlua2JbMl0pOw0KCQkJJGxpbmtfbXA0ID0gJGxpbmttcDQ7DQoJCX0NCgkJJGxpbmsgPSAnMzYwcHwnLiRsaW5rX21wNC4nJzsqLw0KCQkkZGF0YXBsYXkgPSAkbGluazsNCg0KfQ0KLy9FTkQgSlBYVklERU9TDQovL1NUQVJUIFROQUZMSVgNCmVsc2VpZihzdHJwb3MoJHVybCAsICd0bmFmbGl4LmNvbScpICE9PSBmYWxzZSkNCnsNCgkJaWYgKHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHAnKSkgPiAwIG9yIHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHBzJykpID4gMCkgJHVybCA9ICR1cmw7IGVsc2UgJHVybCA9ICdodHRwczovLycuJHVybC4nJzsNCgkJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJCSRkYXRhID0gY3VybCgkdXJsKTsNCgkJJGRhdGFzID0gZXhwbG9kZSgnPGRpdiBjbGFzcz0icGxheWxpc3RfbGlzdGluZyIgZGF0YS1sb2FkZWQ9InRydWUiPicsJGRhdGEpOw0KCQkkZGF0YXMgPSBleHBsb2RlKCc8L2Rpdj4nLCRkYXRhc1sxXSk7DQoJCXByZWdfbWF0Y2hfYWxsKCcvaHJlZj0iKC4qKSIvVScsJGRhdGFzWzBdLCRsaW5rKTsNCgkJJGNvdW50ID0gY291bnQoJGxpbmtbMV0pOw0KCQlpZigkY291bnQgPT0gMSkNCgkJew0KCQkJJHNyYyAuPSAiMzYwcHwiLnN0cl9yZXBsYWNlKCcvLycsJ2h0dHBzOi8vJywkbGlua1sxXVswXSkuIiI7DQoJCX0NCgkJZWxzZWlmICgkY291bnQgPT0gMikNCgkJew0KCQkJJHNyYyAuPSAiMzYwcHwiLnN0cl9yZXBsYWNlKCcvLycsJ2h0dHBzOi8vJywkbGlua1sxXVsxXSkuIjw+IjsNCgkJCSRzcmMgLj0gIjcyMHB8Ii5zdHJfcmVwbGFjZSgnLy8nLCdodHRwczovLycsJGxpbmtbMV1bMF0pLiIiOw0KCQl9DQoJCWVsc2VpZiAoJGNvdW50ID09IDMpDQoJCXsNCgkJCSRzcmMgLj0gIjM2MHB8Ii5zdHJfcmVwbGFjZSgnLy8nLCdodHRwczovLycsJGxpbmtbMV1bMl0pLiI8PiI7DQoJCQkkc3JjIC49ICI0ODBwfCIuc3RyX3JlcGxhY2UoJy8vJywnaHR0cHM6Ly8nLCRsaW5rWzFdWzFdKS4iPD4iOw0KCQkJJHNyYyAuPSAiNzIwcHwiLnN0cl9yZXBsYWNlKCcvLycsJ2h0dHBzOi8vJywkbGlua1sxXVswXSkuIiI7DQoJCX0NCgkJZWxzZWlmICgkY291bnQgPT0gNCkNCgkJew0KCQkJJHNyYyAuPSAiMjQwcHwiLnN0cl9yZXBsYWNlKCcvLycsJ2h0dHBzOi8vJywkbGlua1sxXVszXSkuIjw+IjsNCgkJCSRzcmMgLj0gIjM2MHB8Ii5zdHJfcmVwbGFjZSgnLy8nLCdodHRwczovLycsJGxpbmtbMV1bMl0pLiI8PiI7DQoJCQkkc3JjIC49ICI0ODBwfCIuc3RyX3JlcGxhY2UoJy8vJywnaHR0cHM6Ly8nLCRsaW5rWzFdWzFdKS4iPD4iOw0KCQkJJHNyYyAuPSAiNzIwcHwiLnN0cl9yZXBsYWNlKCcvLycsJ2h0dHBzOi8vJywkbGlua1sxXVswXSkuIiI7DQoJCX0NCgkJZWxzZWlmICgkY291bnQgPT0gNSkNCgkJew0KCQkJJHNyYyAuPSAiMTQwcHwiLnN0cl9yZXBsYWNlKCcvLycsJ2h0dHBzOi8vJywkbGlua1sxXVs0XSkuIjw+IjsNCgkJCSRzcmMgLj0gIjI0MHB8Ii5zdHJfcmVwbGFjZSgnLy8nLCdodHRwczovLycsJGxpbmtbMV1bM10pLiI8PiI7DQoJCQkkc3JjIC49ICIzNjBwfCIuc3RyX3JlcGxhY2UoJy8vJywnaHR0cHM6Ly8nLCRsaW5rWzFdWzJdKS4iPD4iOw0KCQkJJHNyYyAuPSAiNDgwcHwiLnN0cl9yZXBsYWNlKCcvLycsJ2h0dHBzOi8vJywkbGlua1sxXVsxXSkuIjw+IjsNCgkJCSRzcmMgLj0gIjcyMHB8Ii5zdHJfcmVwbGFjZSgnLy8nLCdodHRwczovLycsJGxpbmtbMV1bMF0pLiIiOw0KCQl9DQoJCWVsc2VpZiAoJGNvdW50ID09IDYpDQoJCXsNCgkJCSRzcmMgLj0gIjE0MHB8Ii5zdHJfcmVwbGFjZSgnLy8nLCdodHRwczovLycsJGxpbmtbMV1bNV0pLiI8PiI7DQoJCQkkc3JjIC49ICIyNDBwfCIuc3RyX3JlcGxhY2UoJy8vJywnaHR0cHM6Ly8nLCRsaW5rWzFdWzRdKS4iPD4iOw0KCQkJJHNyYyAuPSAiMzYwcHwiLnN0cl9yZXBsYWNlKCcvLycsJ2h0dHBzOi8vJywkbGlua1sxXVszXSkuIjw+IjsNCgkJCSRzcmMgLj0gIjQ4MHB8Ii5zdHJfcmVwbGFjZSgnLy8nLCdodHRwczovLycsJGxpbmtbMV1bMl0pLiI8PiI7DQoJCQkkc3JjIC49ICI3MjBwfCIuc3RyX3JlcGxhY2UoJy8vJywnaHR0cHM6Ly8nLCRsaW5rWzFdWzFdKS4iPD4iOw0KCQkJJHNyYyAuPSAiMTA4MHB8Ii5zdHJfcmVwbGFjZSgnLy8nLCdodHRwczovLycsJGxpbmtbMV1bMF0pLiIiOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJGRhdGFzID0gZXhwbG9kZSgnPGRpdiBjbGFzcz0ibnZhSXRlbSIgaWQ9ImRvd25sb2FkX2Jsb2NrIj4nLCRkYXRhKTsNCgkJCSRkYXRhcyA9IGV4cGxvZGUoJzwvZGl2PicsJGRhdGFzWzFdKTsNCgkJCXByZWdfbWF0Y2hfYWxsKCcvaHJlZj0iKC4qKSIvVScsJGRhdGFzWzBdLCRsaW5rKTsNCgkJCSRzcmMgLj0gIjM2MHB8Ii5zdHJfcmVwbGFjZSgnLy8nLCdodHRwczovLycsJGxpbmtbMV1bMF0pLiIiOw0KCQl9DQoJCSRkYXRhcGxheSA9ICRzcmM7DQoNCn0NCi8vRU5EIFROQUZMSVgNCi8vU1RBUlQgUE9STkhVQg0KZWxzZWlmKHN0cnBvcygkdXJsICwgJ3Bvcm5odWIuY29tJykgIT09IGZhbHNlKQ0Kew0KCQlpZiAoc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cCcpKSA+IDAgb3Igc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cHMnKSkgPiAwKSAkdXJsID0gJHVybDsgZWxzZSAkdXJsID0gJ2h0dHA6Ly8nLiR1cmwuJyc7DQoJCSR0eXBlID0gMTsgJHR5cGV2aWRlbyA9ICdtcDQnOw0KCQkkZGF0YSA9IGN1cmxpcCgkdXJsKTsNCgkJJGdldDI0MCA9IGV4cGxvZGUoInZhciBwbGF5ZXJfcXVhbGl0eV8yNDBwID0gJyIsJGRhdGEpOw0KCQkkZ2V0MjQwID0gZXhwbG9kZSgiJzsiLCRnZXQyNDBbMV0pOw0KCQkkZ2V0NDgwID0gZXhwbG9kZSgidmFyIHBsYXllcl9xdWFsaXR5XzQ4MHAgPSAnIiwkZGF0YSk7DQoJCSRnZXQ0ODAgPSBleHBsb2RlKCInOyIsJGdldDQ4MFsxXSk7DQoJCSRsaW5rID0gJzM2MHB8Jy4kZ2V0MjQwWzBdLic7NDgwcHwnLiRnZXQ0ODBbMF0uJyc7DQoJCSRkYXRhcGxheSA9ICRsaW5rOw0KDQp9DQovL0VORCBQT1JOSFVCDQovL1NUQVJUIEJFSkFWDQplbHNlaWYoc3RycG9zKCR1cmwgLCAnYmVqYXYubWUnKSAhPT0gZmFsc2UpDQp7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cDovLycuJHVybC4nJzsNCgkJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJCSRzb3VyY2UgPSBjdXJsKCR1cmwpOw0KCQlwcmVnX21hdGNoX2FsbCgnL2ZpbGU6XCIoLiopXCIvVScsJHNvdXJjZSwkZGF0YSk7DQoJCSRjb3VudCA9IGNvdW50KCRkYXRhWzFdKTsNCgkJaWYoJGNvdW50PT0zKQ0KCQl7DQoJCQkkbGluayA9ICcxMDgwfCcuJGRhdGFbMV1bMl0uJzw+NzIwfCcuJGRhdGFbMV1bMV0uJzw+MzYwfCcuJGRhdGFbMV1bMF0uJyc7DQoJCX0NCgkJZWxzZWlmKCRjb3VudD09MikNCgkJew0KCQkJJGxpbmsgPSAnNzIwfCcuJGRhdGFbMV1bMV0uJzw+MzYwfCcuJGRhdGFbMV1bMF0uJyc7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkbGluayA9ICczNjB8Jy4kZGF0YVsxXVswXS4nJzsNCgkJfQ0KCQkkZGF0YXBsYXkgPSAkbGluazsNCg0KfQ0KLy9FTkQgQkVKQVYNCi8vU1RBUlQgWU9VUE9STg0KZWxzZWlmKHN0cnBvcygkdXJsICwgJ3d3dy55b3Vwb3JuLmNvbScpICE9PSBmYWxzZSkNCnsNCgkJaWYgKHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHAnKSkgPiAwIG9yIHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHBzJykpID4gMCkgJHVybCA9ICR1cmw7IGVsc2UgJHVybCA9ICdodHRwOi8vJy4kdXJsLicnOw0KCQkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsNCgkJJGRhdGEgPSBjdXJsKCR1cmwpOw0KCQkkZ2V0MjQwID0gZXhwbG9kZSgiMjQwOiAnIiwkZGF0YSk7DQoJCSRnZXQyNDAgPSBleHBsb2RlKCInLCIsJGdldDI0MFsxXSk7DQoJCSRnZXQ0ODAgPSBleHBsb2RlKCI0ODA6ICciLCRkYXRhKTsNCgkJJGdldDQ4MCA9IGV4cGxvZGUoIicsIiwkZ2V0NDgwWzFdKTsNCgkJJGdldDcyMCA9IGV4cGxvZGUoIjcyMDogJyIsJGRhdGEpOw0KCQkkZ2V0NzIwID0gZXhwbG9kZSgiJywiLCRnZXQ3MjBbMV0pOw0KCQkkZ2V0MTA4MCA9IGV4cGxvZGUoIjEwODA6ICciLCRkYXRhKTsNCgkJJGdldDEwODAgPSBleHBsb2RlKCInIiwkZ2V0MTA4MFsxXSk7DQoJCSRxMTA4MCA9IGNoZWNrbGluaygkZ2V0MTA4MFswXSk7DQoJCSRxNzIwID0gY2hlY2tsaW5rKCRnZXQ3MjBbMF0pOw0KCQkkcTQ4MCA9IGNoZWNrbGluaygkZ2V0NDgwWzBdKTsNCgkJJHEyNDAgPSBjaGVja2xpbmsoJGdldDI0MFswXSk7DQoJCWlmKCRxMTA4MCAhPSAxKSAkbGluayAuPSAiMTA4MHwiLiRnZXQxMDgwWzBdLiI8PiI7DQoJCWlmKCRxNzIwICE9IDEpICRsaW5rIC49ICI3MjB8Ii4kZ2V0NzIwWzBdLiI8PiI7DQoJCWlmKCRxNDgwICE9IDEpICRsaW5rIC49ICI0ODB8Ii4kZ2V0NDgwWzBdLiI8PiI7DQoJCWlmKCRxMjQwIT0gMSkgJGxpbmsgLj0gIjI0MHwiLiRnZXQyNDBbMF0uIiI7DQoJCSRkYXRhcGxheSA9ICRsaW5rOw0KDQp9DQovL0VORCBZT1VQT1JODQovL1NUQVJUIFhNT1ZJRVM4VFYNCmVsc2VpZihzdHJwb3MoJHVybCAsICd4bW92aWVzOC50dicpICE9PSBmYWxzZSkNCnsNCgkJaWYgKHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHAnKSkgPiAwIG9yIHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHBzJykpID4gMCkgJHVybCA9ICR1cmw7IGVsc2UgJHVybCA9ICdodHRwOi8vJy4kdXJsLicnOw0KCQkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsNCgkJJGRhdGEgPSBjdXJsKCR1cmwpOw0KCQlwcmVnX21hdGNoKCcvdXJsOiAiKC4qKSIvVScsJGRhdGEsJGdldHVybCk7DQogICAgICAgIHByZWdfbWF0Y2goIi9kYXRhOiAnbXg9KC4qKSYvVSIsJGRhdGEsJGxpbmspOw0KCQkkcGFyYW1zID0gYXJyYXkoDQoJCQkibXgiID0+ICRsaW5rWzFdLA0KCQkpOw0KCQkkZG93bmxvYWQgPSBqYXZzaW4oJGdldHVybFsxXSwkcGFyYW1zKTsNCgkJJGRhdGFwbGF5ID0gJGRvd25sb2FkOw0KCQlwcmVnX21hdGNoX2FsbCgnLzxhIGhyZWY9IiguKikiL1UnLCAkZG93bmxvYWQsICRkYXRhbGluayk7DQoJCWlmKGNvdW50KCRkYXRhbGlua1sxXT09MikpDQoJCXsNCgkJCSRsaW5rID0gJzM2MHB8Jy4kZGF0YWxpbmtbMV1bMF0uJzw+NzIwcHwnLiRkYXRhbGlua1sxXVsxXS4nJzsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCSRsaW5rID0gJzM2MHB8Jy4kZGF0YWxpbmtbMV1bMF0uJyc7DQoJCX0NCgkJJGRhdGFwbGF5ID0gJGxpbms7DQoNCn0NCi8vRU5EIFhNT1ZJRVM4VFYNCi8vU1RBUlQgVFVCRTgNCmVsc2VpZihzdHJwb3MoJHVybCAsICd0dWJlOC5jb20nKSAhPT0gZmFsc2UpDQp7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cDovLycuJHVybC4nJzsNCgkJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJCSRkYXRhID0gY3VybCgkdXJsKTsNCgkJJGdldDE4MCA9IGV4cGxvZGUoJyJxdWFsaXR5XzE4MHAiOiInLCRkYXRhKTsNCgkJJGdldDE4MCA9IGV4cGxvZGUoJyIsJywkZ2V0MTgwWzFdKTsNCgkJJGdldDI0MCA9IGV4cGxvZGUoJyJxdWFsaXR5XzI0MHAiOiInLCRkYXRhKTsNCgkJJGdldDI0MCA9IGV4cGxvZGUoJyIsJywkZ2V0MjQwWzFdKTsNCgkJJGdldDQ4MCA9IGV4cGxvZGUoJyJxdWFsaXR5XzQ4MHAiOiInLCRkYXRhKTsNCgkJJGdldDQ4MCA9IGV4cGxvZGUoJyIsJywkZ2V0NDgwWzFdKTsNCgkJJGdldDcyMCA9IGV4cGxvZGUoJyJxdWFsaXR5XzcyMHAiOiInLCRkYXRhKTsNCgkJJGdldDcyMCA9IGV4cGxvZGUoJyInLCRnZXQ3MjBbMV0pOw0KCQkkbGluayA9ICcxODBwfCcuJGdldDE4MFswXS4nPD4yNDBwfCcuJGdldDI0MFswXS4nPD40ODBwfCcuJGdldDQ4MFswXS4nPD43MjBwfCcuJGdldDcyMFswXS4nJzsNCgkJJGRhdGFwbGF5ID0gJGxpbms7DQoNCn0NCi8vRU5EIFRVQkU4DQovL1NUQVJUIFNQQU5LQkFORw0KZWxzZWlmKHN0cnBvcygkdXJsICwgJ3NwYW5rYmFuZy5jb20nKSAhPT0gZmFsc2UpDQp7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cDovLycuJHVybC4nJzsNCgkJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJCSRzcmMgPSAiIi5wcmVnX3JlcGxhY2UoIkAoLiopc3BhbmtiYW5nLmNvbS8oLio/KS8oLiopLyguKilAIiwiaHR0cDovL20uc3BhbmtiYW5nLmNvbS8kMi9wbGF5LyQ0IiwkdXJsKS4iIjsNCgkJJHVybCA9ICcnLiRzcmMuJy83MjAvJzsNCgkJJGRhdGEgPSBtb2JpbGUoJHVybCk7DQogICAgICAgIHByZWdfbWF0Y2goJy88c291cmNlIHNyYz0iKC4qKSIvVScsJGRhdGEsJGdldHVybCk7DQoJCWlmKCRnZXR1cmxbMV0pDQoJCXsNCgkJCSRkYXRhcGxheSA9ICc3MjBwfGh0dHA6Ly9zcGFua2JhbmcuY29tJy4kZ2V0dXJsWzFdLicnOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJHVybCA9ICcnLiRzcmMuJy8zNjAvJzsNCgkJCSRkYXRhID0gbW9iaWxlKCR1cmwpOw0KCQkJJGRhdGFwbGF5ID0gJzM2MHB8aHR0cDovL3NwYW5rYmFuZy5jb20nLiRnZXR1cmxbMV0uJyc7DQoJCX0NCn0NCi8vRU5EIFNQQU5LQkFORw0KLy9TVEFSVCBSRURUVUJFDQplbHNlaWYoc3RycG9zKCR1cmwgLCAncmVkdHViZS5jb20nKSAhPT0gZmFsc2UpDQp7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cDovLycuJHVybC4nJzsNCgkJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJCSRkYXRhID0gY3VybCgkdXJsKTsNCgkJJGdldDcyMCA9IGV4cGxvZGUoJyI3MjAiOiInLCRkYXRhKTsNCgkJJGdldDcyMCA9IGV4cGxvZGUoJyInLCRnZXQ3MjBbMV0pOw0KCQkkZ2V0NDgwID0gZXhwbG9kZSgnIjQ4MCI6IicsJGRhdGEpOw0KCQkkZ2V0NDgwID0gZXhwbG9kZSgnIicsJGdldDQ4MFsxXSk7DQoJCSRsaW5rID0gJzQ4MHB8Jy4kZ2V0NDgwWzBdLic8PjcyMHB8Jy4kZ2V0NzIwWzBdLicnOw0KCQkkZGF0YXBsYXkgPSAkbGluazsNCg0KfQ0KLy9FTkQgUkVEVFVCRQ0KLy9TVEFSVCBQT1JODQplbHNlaWYoc3RycG9zKCR1cmwgLCAnd3d3LnBvcm4uY29tJykgIT09IGZhbHNlKQ0Kew0KCQlpZiAoc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cCcpKSA+IDAgb3Igc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cHMnKSkgPiAwKSAkdXJsID0gJHVybDsgZWxzZSAkdXJsID0gJ2h0dHA6Ly8nLiR1cmwuJyc7DQoJCSR0eXBlID0gMTsgJHR5cGV2aWRlbyA9ICdtcDQnOw0KCQkkZGF0YSA9IGN1cmwoJHVybCk7DQoJCSRnZXQxNDQgPSBleHBsb2RlKCciMTQ0cCIsdXJsOiInLCRkYXRhKTsNCgkJJGdldDE0NCA9IGV4cGxvZGUoJyInLCRnZXQxNDRbMV0pOw0KCQkkZ2V0MjQwID0gZXhwbG9kZSgnIjI0MHAiLHVybDoiJywkZGF0YSk7DQoJCSRnZXQyNDAgPSBleHBsb2RlKCciJywkZ2V0MjQwWzFdKTsNCgkJJGdldDM2MCA9IGV4cGxvZGUoJyIzNjBwIix1cmw6IicsJGRhdGEpOw0KCQkkZ2V0MzYwID0gZXhwbG9kZSgnIicsJGdldDM2MFsxXSk7DQoJCSRnZXQ0ODAgPSBleHBsb2RlKCciNDgwcCIsdXJsOiInLCRkYXRhKTsNCgkJJGdldDQ4MCA9IGV4cGxvZGUoJyInLCRnZXQ0ODBbMV0pOw0KCQkkZ2V0NzIwID0gZXhwbG9kZSgnIjcyMHAiLHVybDoiJywkZGF0YSk7DQoJCSRnZXQ3MjAgPSBleHBsb2RlKCciJywkZ2V0NzIwWzFdKTsNCgkJJGxpbmsgPSAnMTQ0cHwnLiRnZXQxNDRbMF0uJzw+MjQwcHwnLiRnZXQyNDBbMF0uJzw+MzYwcHwnLiRnZXQzNjBbMF0uJzw+NDgwcHwnLiRnZXQ0ODBbMF0uJzw+NzIwcHwnLiRnZXQ3MjBbMF0uJyc7DQoJCSRkYXRhcGxheSA9ICRsaW5rOw0KDQp9DQovL0VORCBQT1JODQovL1NUQVJUIEgyUE9STg0KZWxzZWlmKHN0cnBvcygkdXJsICwgJ2gycG9ybi5jb20nKSAhPT0gZmFsc2UpDQp7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cDovLycuJHVybC4nJzsNCgkJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJCSRkYXRhID0gY3VybCgkdXJsKTsNCgkJJGdldCA9IGV4cGxvZGUoInZpZGVvX3VybDogJyIsJGRhdGEpOw0KCQkkZ2V0ID0gZXhwbG9kZSgiJyIsJGdldFsxXSk7DQoJCSRsaW5rID0gJzcyMHB8Jy4kZ2V0WzBdLicnOw0KCQkkZGF0YXBsYXkgPSAkbGluazsNCn0NCi8vRU5EIEgyUE9STg0KLy9TVEFSVCBYWFhBREQNCmVsc2VpZihzdHJwb3MoJHVybCAsICd4eHhhZGQuY29tJykgIT09IGZhbHNlKQ0Kew0KCQlpZiAoc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cCcpKSA+IDAgb3Igc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cHMnKSkgPiAwKSAkdXJsID0gJHVybDsgZWxzZSAkdXJsID0gJ2h0dHA6Ly8nLiR1cmwuJyc7DQoJCSR0eXBlID0gMTsgJHR5cGV2aWRlbyA9ICdtcDQnOw0KCQkkZGF0YSA9IGN1cmwoJHVybCk7DQoJCSRnZXQgPSBleHBsb2RlKCJ2aWRlb191cmw6ICciLCRkYXRhKTsNCgkJJGdldCA9IGV4cGxvZGUoIiciLCRnZXRbMV0pOw0KCQkkbGluayA9ICc3MjBwfCcuJGdldFswXS4nJzsNCgkJJGRhdGFwbGF5ID0gJGxpbms7DQp9DQovL0VORCBYWFhBREQNCi8vU1RBUlQgVFVCWFBPUk4NCmVsc2VpZihzdHJwb3MoJHVybCAsICd3d3cudHVieHBvcm4uY29tJykgIT09IGZhbHNlKQ0Kew0KCQlpZiAoc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cCcpKSA+IDAgb3Igc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cHMnKSkgPiAwKSAkdXJsID0gJHVybDsgZWxzZSAkdXJsID0gJ2h0dHA6Ly8nLiR1cmwuJyc7DQoJCSR0eXBlID0gMTsgJHR5cGV2aWRlbyA9ICdtcDQnOw0KCQkkZGF0YSA9IGN1cmwoJHVybCk7DQoJCXByZWdfbWF0Y2hfYWxsKCcve2ZpbGU6ICIoLiopIiwgbGFiZWw6ICIoLiopIi9VJywkZGF0YSwkbGluayk7DQoJCWZvcigkaT0wOyRpPGNvdW50KCRsaW5rWzFdKTskaSsrKQ0KCQl7DQoJCQlpZigkaSE9KGNvdW50KCRsaW5rWzFdKS0xKSkgJHBnID0gJzw+JzsgZWxzZSAkcGc9Jyc7DQoJCQkkc3JjIC49ICIiLiRsaW5rWzJdWyRpXS4ifCIuJGxpbmtbMV1bJGldLiIiLiRwZy4iIjsNCgkJfQ0KCQkkZGF0YXBsYXkgPSAkc3JjOw0KDQp9DQovL0VORCBUVUJYUE9STg0KLy9TVEFSVCBKQVZTSU4NCmVsc2VpZihzdHJwb3MoJHVybCAsICdqYXZzaW4uY29tJykgIT09IGZhbHNlKQ0Kew0KCQlpZiAoc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cCcpKSA+IDAgb3Igc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cHMnKSkgPiAwKSAkdXJsID0gJHVybDsgZWxzZSAkdXJsID0gJ2h0dHA6Ly8nLiR1cmwuJyc7DQoJCSR0eXBlID0gMTsgJHR5cGV2aWRlbyA9ICdtcDQnOw0KCQkkZGF0YSA9IGN1cmwoJHVybCk7DQoJCSRnZXQgPSBleHBsb2RlKCdldmFsKGZ1bmN0aW9uJywkZGF0YSk7DQoJCSRnZXQgPSBleHBsb2RlKCc8L3NjcmlwdD4nLCRnZXRbMV0pOw0KCQkkZ2V0ID0gJ2V2YWwoZnVuY3Rpb24nLiRnZXRbMF0uJyc7DQoJCSRqc3UgPSBuZXcgSmF2YVNjcmlwdFVucGFja2VyKCk7DQoJCSRkYXRhID0gJGpzdS0+VW5wYWNrKCRnZXQpOw0KICAgICAgICBwcmVnX21hdGNoKCcvdXJsOiIoLiopIi9VJywkZGF0YSwkZ2V0dXJsKTsNCiAgICAgICAgcHJlZ19tYXRjaCgnL3Byb3h5X2xpbms6IihbXlwiXSspIi8nLCRkYXRhLCRsaW5rKTsNCgkJJHBhcmFtcyA9IGFycmF5KA0KCQkJInByb3h5X2xpbmsiID0+ICIiLiRsaW5rWzFdLiIiLA0KCQkpOw0KCQkkZG93bmxvYWQgPSBnZXRwb3N0KCdodHRwOi8vamF2aGR4LmNvbS9hcHB2aWRlby9qdy5waHAnLCRwYXJhbXMpOw0KCQllY2hvICRkb3dubG9hZDsNCgkJcHJlZ19tYXRjaF9hbGwoJy92YXIgcCguKikgPSAiKC4qKSIvVScsJGRvd25sb2FkLCRkYXRhKTsNCgkJJGNvdW50ID0gY291bnQoJGRhdGFbMV0pOw0KCQlpZigkY291bnQgPT0gMykNCgkJew0KCQkJJGxpbmsgPSAnMTA4MHB8Jy4kZGF0YVsyXVswXS4nPD43MjBwfCcuJGRhdGFbMl1bMV0uJzw+MzYwcHwnLiRkYXRhWzJdWzJdOw0KCQl9DQoJCWVsc2VpZigkY291bnQgPT0gMikNCgkJew0KCQkJJGxpbmsgPSAnNzIwcHwnLiRkYXRhWzJdWzBdLic8PjM2MHB8Jy4kZGF0YVsyXVsxXTsNCgkJfQ0KCQllbHNlaWYoJGNvdW50ID09IDEpDQoJCXsNCgkJCSRsaW5rID0gJzM2MHB8Jy4kZGF0YVsyXVswXTsNCgkJfQ0KCQkkZGF0YXBsYXkgPSAkbGluazsNCn0NCi8vRU5EIEpBVlNJTg0KLy9TVEFSVCBKQVZTRVgNCmVsc2VpZihzdHJwb3MoJHVybCAsICdqYXZzZXgubmV0JykgIT09IGZhbHNlKQ0Kew0KCQlpZiAoc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cCcpKSA+IDAgb3Igc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cHMnKSkgPiAwKSAkdXJsID0gJHVybDsgZWxzZSAkdXJsID0gJ2h0dHA6Ly8nLiR1cmwuJyc7DQoJCSR0eXBlID0gMTsgJHR5cGV2aWRlbyA9ICdtcDQnOw0KCQkkZGF0YSA9IGN1cmwoJHVybCk7DQoJCSRnZXQgPSBleHBsb2RlKCdldmFsKGZ1bmN0aW9uJywkZGF0YSk7DQoJCSRnZXQgPSBleHBsb2RlKCc8L3NjcmlwdD4nLCRnZXRbMV0pOw0KCQkkZ2V0ID0gJ2V2YWwoZnVuY3Rpb24nLiRnZXRbMF0uJyc7DQoJCSRqc3UgPSBuZXcgSmF2YVNjcmlwdFVucGFja2VyKCk7DQoJCSRkYXRhID0gJGpzdS0+VW5wYWNrKCRnZXQpO2VjaG8gJGRhdGE7DQogICAgICAgIHByZWdfbWF0Y2goJy91cmw6IiguKikiL1UnLCRkYXRhLCRnZXR1cmwpOw0KICAgICAgICBwcmVnX21hdGNoKCcvcHJveHlfbGluazoiKFteXCJdKykiLycsJGRhdGEsJGxpbmspOw0KCQkkcGFyYW1zID0gYXJyYXkoDQoJCQkicHJveHlfbGluayIgPT4gIiIuJGxpbmtbMV0uIiIsDQoJCSk7DQoJCSRkb3dubG9hZCA9IGdldHBvc3QoJ2h0dHA6Ly9qYXZoZHguY29tL2FwcHZpZGVvL2p3X2Fkcy5waHAnLCRwYXJhbXMpOw0KCQllY2hvICRkb3dubG9hZDsNCgkJcHJlZ19tYXRjaF9hbGwoJy92YXIgcCguKikgPSAiKC4qKSIvVScsJGRvd25sb2FkLCRkYXRhKTsNCgkJJGNvdW50ID0gY291bnQoJGRhdGFbMV0pOw0KCQlpZigkY291bnQgPT0gMykNCgkJew0KCQkJJGxpbmsgPSAnMTA4MHB8Jy4kZGF0YVsyXVswXS4nPD43MjBwfCcuJGRhdGFbMl1bMV0uJzw+MzYwcHwnLiRkYXRhWzJdWzJdOw0KCQl9DQoJCWVsc2VpZigkY291bnQgPT0gMikNCgkJew0KCQkJJGxpbmsgPSAnNzIwcHwnLiRkYXRhWzJdWzBdLic8PjM2MHB8Jy4kZGF0YVsyXVsxXTsNCgkJfQ0KCQllbHNlaWYoJGNvdW50ID09IDEpDQoJCXsNCgkJCSRsaW5rID0gJzM2MHB8Jy4kZGF0YVsyXVswXTsNCgkJfQ0KCQkkZGF0YXBsYXkgPSAkbGluazsNCn0NCi8vRU5EIEpBVlNFWA0KLypTVEFSVCBKQVY2OE1FDQplbHNlaWYoc3RycG9zKCR1cmwgLCAnamF2NjgubWUnKSAhPT0gZmFsc2UpDQp7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cDovLycuJHVybC4nJzsNCgkJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJCSRpZCA9IGV4cGxvZGUoIi0iLCR1cmwpOw0KCQkkY291bnQgPSBpbnR2YWwoY291bnQoJGlkKS0xKTsNCgkJJGlkID0gJGlkWyRjb3VudF07DQoJCSRnZXR1cmwgPSAnaHR0cDovL2Rvd24uamF2NjgubWUvaW5kZXgucGhwP2FjdD1tb3ZpZS9kb3duL3VybGxpbmsnOw0KCQkkcGFyYW1zID0gYXJyYXkoDQoJCQkiZXBpc29kZV9pZCIgPT4gJGlkLA0KCQkpOw0KCQkkZG93bmxvYWQgPSBqYXZzaW4oJGdldHVybCwkcGFyYW1zKTsNCgkJJGRvd25sb2FkID0gZXhwbG9kZSgnInVybCI6IicsJGRvd25sb2FkKTsNCgkJJGRvd25sb2FkID0gZXhwbG9kZSgnIicsJGRvd25sb2FkWzFdKTsNCgkJJGRvd25sb2FkID0gJGRvd25sb2FkWzBdOw0KCQkkbGluayA9ICczNjB8Jy4kZG93bmxvYWQuJyc7DQoJCSRkYXRhcGxheSA9ICRsaW5rOw0KfQ0KKi8vL0VORCBKQVY2OE1FDQovL1NUQVJUIEFCRFVMQVBPUk4NCmVsc2VpZihzdHJwb3MoJHVybCAsICd3d3cuYWJkdWxhcG9ybi5jb20nKSAhPT0gZmFsc2UpDQp7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cDovLycuJHVybC4nJzsNCgkJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJCSRkYXRhID0gY3VybCgkdXJsKTsNCgkJJGtleSA9IGV4cGxvZGUoImxpY2Vuc2VfY29kZTogJyIsJGRhdGEpOw0KCQkka2V5PSBleHBsb2RlKCInIiwka2V5WzFdKTsNCgkJJGdldDM2MCA9IGV4cGxvZGUoInZpZGVvX3VybDogJyIsJGRhdGEpOw0KCQkkZ2V0MzYwID0gZXhwbG9kZSgiLyciLCRnZXQzNjBbMV0pOw0KCQkkbGluayA9ICczNjBwfCcuJGdldDM2MFswXS4nJmxpY2Vuc2VfY29kZT0nLiRrZXlbMF0uJyc7DQoJCSRkYXRhcGxheSA9ICRsaW5rOw0KDQp9DQovL0VORCBBQkRVTEFQT1JODQovL1NUQVJUIEVQT1JORVINCmVsc2VpZihzdHJwb3MoJHVybCAsICdlcG9ybmVyLmNvbScpICE9PSBmYWxzZSkNCnsNCgkJaWYgKHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHAnKSkgPiAwIG9yIHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHBzJykpID4gMCkgJHVybCA9ICR1cmw7IGVsc2UgJHVybCA9ICdodHRwOi8vJy4kdXJsLicnOw0KCQkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsNCgkJcHJlZ19tYXRjaCgnLyguKillcG9ybmVyLmNvbVwvKC4qKVwvKC4qKVwvKC4qKS9VJywkdXJsLCRzcmMpOw0KCQkkc3JjID0gJ2h0dHA6Ly93d3cuZXBvcm5lci5jb20vY29uZmlnN2VtYmVkLycuJHNyY1szXS4nL3YydGg3MDJheTI2MDNlLycuJHNyY1szXS4nJzsNCgkJJHNvdXJjZSA9IGN1cmwoJHNyYyk7DQoJCXByZWdfbWF0Y2hfYWxsKCcvZmlsZToiKC4qKSIsbGFiZWw6IiguKilwL1UnLCAkc291cmNlLCAkZGF0YSk7DQoJCSRjb3VudCA9IGNvdW50KCRkYXRhWzFdKTsNCgkJZm9yKCRpPTA7JGk8JGNvdW50OyRpKyspDQoJCXsNCgkJCWlmKCRpICE9ICgkY291bnQtMSkpDQoJCQl7DQoJCQkJJGxpbmsgLj0gJycuJGRhdGFbMl1bJGldLid8Jy4kZGF0YVsxXVskaV0uJzw+JzsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkkbGluayAuPSAnJy4kZGF0YVsyXVskaV0uJ3wnLiRkYXRhWzFdWyRpXS4nJzsNCgkJCX0NCgkJfQ0KCQkkZGF0YXBsYXkgPSAkbGluazsNCg0KfQ0KLy9FTkQgRVBPUk5FUg0KLy9TVEFSVCBYSEFNU1RFUg0KZWxzZWlmKHN0cnBvcygkdXJsICwgJ3hoYW1zdGVyLmNvbScpICE9PSBmYWxzZSkNCnsNCgkJaWYgKHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHAnKSkgPiAwIG9yIHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHBzJykpID4gMCkgJHVybCA9ICR1cmw7IGVsc2UgJHVybCA9ICdodHRwOi8vJy4kdXJsLicnOw0KCQkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsNCgkJJGRhdGEgPSBjdXJsKCR1cmwpOw0KCQkkc291cmNlID0gZXhwbG9kZSgic291cmNlczogeyIsJGRhdGEpOw0KCQkkc291cmNlID0gZXhwbG9kZSgifSIsJHNvdXJjZVsxXSk7DQoJCXByZWdfbWF0Y2hfYWxsKCcvIiguKilwIjoiKC4qKSIvVScsJHNvdXJjZVswXSwkZGF0YSk7DQoJCSRjb3VudCA9IGNvdW50KCRkYXRhWzFdKTsNCgkJaWYoJGNvdW50ID09IDMpDQoJCXsNCgkJCSRsaW5rID0gJycuJGRhdGFbMV1bMF0uJ3wnLnN0cl9yZXBsYWNlKCdcLycsICcvJywgJGRhdGFbMl1bMF0pLic8PicuJGRhdGFbMV1bMV0uJ3wnLnN0cl9yZXBsYWNlKCdcLycsICcvJywgJGRhdGFbMl1bMV0pLic8PicuJGRhdGFbMV1bMl0uJ3wnLnN0cl9yZXBsYWNlKCdcLycsICcvJywgJGRhdGFbMl1bMl0pLicnOw0KCQl9DQoJCWVsc2VpZigkY291bnQgPT0gMikNCgkJew0KCQkJJGxpbmsgPSAnJy4kZGF0YVsxXVswXS4nfCcuc3RyX3JlcGxhY2UoJ1wvJywgJy8nLCAkZGF0YVsyXVswXSkuJzw+Jy4kZGF0YVsxXVsxXS4nfCcuc3RyX3JlcGxhY2UoJ1wvJywgJy8nLCAkZGF0YVsyXVsxXSkuJyc7DQoJCX0NCgkJZWxzZWlmKCRjb3VudCA9PSAxKQ0KCQl7DQoJCQkkbGluayA9ICcnLiRkYXRhWzFdWzBdLid8Jy5zdHJfcmVwbGFjZSgnXC8nLCAnLycsICRkYXRhWzJdWzBdKS4nJzsNCgkJfQ0KCQkkZGF0YXBsYXkgPSAkbGluazsNCg0KfQ0KLy9FTkQgWEhBTVNURVINCi8vU1RBUlQgVFVCRURVQkUNCmVsc2VpZihzdHJwb3MoJHVybCAsICd0dWJlZHVwZS5jb20nKSAhPT0gZmFsc2UpDQp7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cDovLycuJHVybC4nJzsNCgkJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJCSRkYXRhID0gY3VybCgkdXJsKTsNCgkJJGdldDM2MCA9IGV4cGxvZGUoInZpZGVvX3VybDogJyIsJGRhdGEpOw0KCQkkZ2V0MzYwID0gZXhwbG9kZSgiJyIsJGdldDM2MFsxXSk7DQoJCSRsaW5rID0gJzM2MHB8Jy4kZ2V0MzYwWzBdLicnOw0KCQkkZGF0YXBsYXkgPSAkbGluazsNCg0KfQ0KLy9FTkQgVFVCRURVQkUNCi8vU1RBUlQgSkFWT05MSU5FUw0KZWxzZWlmKHN0cnBvcygkdXJsICwgJ2phdnR1YmVoZC5jb20nKSAhPT0gZmFsc2UpDQp7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cDovLycuJHVybC4nJzsNCgkJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJCSRkYXRhID0gY3VybCgkdXJsKTsNCgkJJGdldDM2MCA9IGV4cGxvZGUoInh0dWJldGguY29tL2ZpbGUvIiwkZGF0YSk7DQoJCSRnZXQzNjAgPSBleHBsb2RlKCciJywkZ2V0MzYwWzFdKTsNCgkJJGxpbmsgPSAnaHR0cDovL3h0dWJldGguY29tL2ZpbGUvJy4kZ2V0MzYwWzBdLicnOw0KCQkkc291cmNlID0gY3VybCgkbGluayk7DQoJCSRzb3VyY2UgPSBleHBsb2RlKCdzb3VyY2VzOicsJHNvdXJjZSk7DQoJCXByZWdfbWF0Y2hfYWxsKCcvZmlsZTogXCIoLiopXCIvVScsJHNvdXJjZVsxXSwkZGF0YSk7DQoJCSRjb3VudCA9IGNvdW50KCRkYXRhWzFdKTsNCgkJaWYoJGNvdW50ID09IDMpDQoJCXsNCgkJCSRsaW5rID0gJzEwODBwfCcuJGRhdGFbMV1bMF0uJzw+NzIwcHwnLiRkYXRhWzFdWzFdLic8PjM2MHB8Jy4kZGF0YVsxXVsyXTsNCgkJfQ0KCQllbHNlaWYoJGNvdW50ID09IDIpDQoJCXsNCgkJCSRsaW5rID0gJzcyMHB8Jy4kZGF0YVsxXVswXS4nPD4zNjBwfCcuJGRhdGFbMV1bMV07DQoJCX0NCgkJZWxzZWlmKCRjb3VudCA9PSAxKQ0KCQl7DQoJCQkkbGluayA9ICczNjBwfCcuJGRhdGFbMV1bMF07DQoJCX0NCgkJJGRhdGFwbGF5ID0gJGxpbms7DQoNCn0NCi8vRU5EIEpBVk9OTElORVMNCi8vU1RBUlQgSkFWQ0VODQplbHNlaWYoc3RycG9zKCR1cmwgLCAnamF2Y2VuLm1lJykgIT09IGZhbHNlIG9yIHN0cnBvcygkdXJsICwgJ2phdnVuLm1lJykgIT09IGZhbHNlKQ0Kew0KCQlpZiAoc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cCcpKSA+IDAgb3Igc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cHMnKSkgPiAwKSAkdXJsID0gJHVybDsgZWxzZSAkdXJsID0gJ2h0dHA6Ly8nLiR1cmwuJyc7DQoJCSR0eXBlID0gMTsgJHR5cGV2aWRlbyA9ICdtcDQnOw0KCQkkc291cmNlID0gY3VybCgkdXJsKTsNCgkJcHJlZ19tYXRjaF9hbGwoJy9maWxlOiBcIiguKilcIi9VJywkc291cmNlLCRkYXRhKTsNCgkJJGNvdW50ID0gY291bnQoJGRhdGFbMV0pOw0KCQlpZigkY291bnQgPT0gMykNCgkJew0KCQkJJGxpbmsgPSAnMTA4MHB8Jy4kZGF0YVsxXVswXS4nPD43MjBwfCcuJGRhdGFbMV1bMV0uJzw+MzYwcHwnLiRkYXRhWzFdWzJdOw0KCQl9DQoJCWVsc2VpZigkY291bnQgPT0gMikNCgkJew0KCQkJJGxpbmsgPSAnNzIwcHwnLiRkYXRhWzFdWzBdLic8PjM2MHB8Jy4kZGF0YVsxXVsxXTsNCgkJfQ0KCQllbHNlaWYoJGNvdW50ID09IDEpDQoJCXsNCgkJCSRsaW5rID0gJzM2MHB8Jy4kZGF0YVsxXVswXTsNCgkJfQ0KCQkkZGF0YXBsYXkgPSAkbGluazsNCg0KfQ0KLy9FTkQgSkFWQ0VODQovL1NUQVJUIFZKQVYNCmVsc2VpZihzdHJwb3MoJHVybCAsICd2amF2LmNvbScpICE9PSBmYWxzZSkNCnsNCgkJaWYgKHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHAnKSkgPiAwIG9yIHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHBzJykpID4gMCkgJHVybCA9ICR1cmw7IGVsc2UgJHVybCA9ICdodHRwOi8vJy4kdXJsLicnOw0KCQkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsNCgkJJHNvdXJjZSA9IGN1cmwoJHVybCk7DQoJCSRsaW5rID0gZXhwbG9kZSgidmlkZW9fdXJsOiAnIiwkc291cmNlKTsNCgkJJGxpbmsgPSBleHBsb2RlKCInIiwkbGlua1sxXSk7DQoJCSRsaW5rID0gJzM2MHwnLiRsaW5rWzBdLicnOw0KCQkkZGF0YXBsYXkgPSAkbGluazsNCn0NCi8vRU5EIFZKQVYNCi8vU1RBUlQgSkFWQUJDDQplbHNlaWYoc3RycG9zKCR1cmwgLCAnamF2YWJjLm5ldCcpICE9PSBmYWxzZSkNCnsNCgkJaWYgKHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHAnKSkgPiAwIG9yIHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHBzJykpID4gMCkgJHVybCA9ICR1cmw7IGVsc2UgJHVybCA9ICdodHRwOi8vJy4kdXJsLicnOw0KCQkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsNCgkJJHNvdXJjZSA9IGN1cmwoJHVybCk7DQoJCXByZWdfbWF0Y2hfYWxsKCcvZmlsZTogXCIoLiopXCIvVScsJHNvdXJjZSwkZGF0YSk7DQoJCSRjb3VudCA9IGNvdW50KCRkYXRhWzFdKTsNCgkJaWYoJGNvdW50ID09IDMpDQoJCXsNCgkJCSRsaW5rID0gJzEwODBwfCcuJGRhdGFbMV1bMF0uJzw+NzIwcHwnLiRkYXRhWzFdWzFdLic8PjM2MHB8Jy4kZGF0YVsxXVsyXTsNCgkJfQ0KCQllbHNlaWYoJGNvdW50ID09IDIpDQoJCXsNCgkJCSRsaW5rID0gJzcyMHB8Jy4kZGF0YVsxXVswXS4nPD4zNjBwfCcuJGRhdGFbMV1bMV07DQoJCX0NCgkJZWxzZWlmKCRjb3VudCA9PSAxKQ0KCQl7DQoJCQkkbGluayA9ICczNjBwfCcuJGRhdGFbMV1bMF07DQoJCX0NCgkJJGRhdGFwbGF5ID0gJGxpbms7DQoNCn0NCi8vRU5EIEpBVkFCQw0KLy9TVEFSVCBBU0lBTlBPUk5NT1ZJRVMNCmVsc2VpZihzdHJwb3MoJHVybCAsICdhc2lhbnBvcm5tb3ZpZXMuY29tJykgIT09IGZhbHNlKQ0Kew0KCQlpZiAoc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cCcpKSA+IDAgb3Igc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cHMnKSkgPiAwKSAkdXJsID0gJHVybDsgZWxzZSAkdXJsID0gJ2h0dHA6Ly8nLiR1cmwuJyc7DQoJCSR0eXBlID0gMTsgJHR5cGV2aWRlbyA9ICdtcDQnOw0KCQkkc291cmNlID0gY3VybCgkdXJsKTsNCgkJJGdldCA9IGV4cGxvZGUoInNvdXJjZXM6IFt7Iiwkc291cmNlKTsNCgkJJGdldCA9IGV4cGxvZGUoIn1dLCIsJGdldFsxXSk7DQoJCXByZWdfbWF0Y2hfYWxsKCcvZmlsZTogXCIoLiopXCIvVScsJGdldFswXSwkZGF0YSk7DQoJCSRjb3VudCA9IGNvdW50KCRkYXRhWzFdKTsNCgkJaWYoJGNvdW50ID09IDMpDQoJCXsNCgkJCSRsaW5rID0gJzEwODBwfCcuJGRhdGFbMV1bMF0uJzw+NzIwcHwnLiRkYXRhWzFdWzFdLic8PjM2MHB8Jy4kZGF0YVsxXVsyXTsNCgkJfQ0KCQllbHNlaWYoJGNvdW50ID09IDIpDQoJCXsNCgkJCSRsaW5rID0gJzcyMHB8Jy4kZGF0YVsxXVswXS4nPD4zNjBwfCcuJGRhdGFbMV1bMV07DQoJCX0NCgkJZWxzZWlmKCRjb3VudCA9PSAxKQ0KCQl7DQoJCQkkbGluayA9ICczNjBwfCcuJGRhdGFbMV1bMF07DQoJCX0NCgkJJGRhdGFwbGF5ID0gJGxpbms7DQoNCn0NCi8vRU5EIEFTSUFOUE9STk1PVklFUw0KLy9TVEFSVCBVUERBVEVUVUJFDQplbHNlaWYoc3RycG9zKCR1cmwgLCAndXBkYXRldHViZS5jb20nKSAhPT0gZmFsc2UpDQp7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cDovLycuJHVybC4nJzsNCgkJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJCSRzb3VyY2UgPSBjdXJsKCR1cmwpOw0KCQkkbGluayA9IGV4cGxvZGUoInZpZGVvX3VybDogJyIsJHNvdXJjZSk7DQoJCSRsaW5rID0gZXhwbG9kZSgiJyIsJGxpbmtbMV0pOw0KCQkkbGluayA9ICczNjB8Jy4kbGlua1swXS4nJzsNCgkJJGRhdGFwbGF5ID0gJGxpbms7DQp9DQovL0VORCBVUERBVEVUVUJFDQovL1NUQVJUIEhPU1RIQU0NCmVsc2VpZihzdHJwb3MoJHVybCAsICdob3RzaGFtZS5jb20nKSAhPT0gZmFsc2UpDQp7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cDovLycuJHVybC4nJzsNCgkJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJCSRzb3VyY2UgPSBjdXJsKCR1cmwpOw0KCQkkbGluayA9IGV4cGxvZGUoInZpZGVvX3VybDogJyIsJHNvdXJjZSk7DQoJCSRsaW5rID0gZXhwbG9kZSgiJyIsJGxpbmtbMV0pOw0KCQkkbGluayA9ICczNjB8Jy4kbGlua1swXS4nJzsNCgkJJGRhdGFwbGF5ID0gJGxpbms7DQp9DQovL0VORCBIT1NUSEFNDQovL1NUQVJUIEpBVlRBU1RZDQplbHNlaWYoc3RycG9zKCR1cmwgLCAnamF2dGFzdHkuY29tJykgIT09IGZhbHNlKQ0Kew0KCQlpZiAoc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cCcpKSA+IDAgb3Igc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cHMnKSkgPiAwKSAkdXJsID0gJHVybDsgZWxzZSAkdXJsID0gJ2h0dHA6Ly8nLiR1cmwuJyc7DQoJCSR0eXBlID0gMTsgJHR5cGV2aWRlbyA9ICdtcDQnOw0KCQkkc3JjID0gIiIucHJlZ19yZXBsYWNlKCJAKC4qKWphdnRhc3R5LmNvbS92aWRlby8oLio/KS8oLiopQCIsImh0dHA6Ly93d3cuamF2dGFzdHkuY29tL21lZGlhL251ZXZvL2NvbmZpZy5waHA/a2V5PSQyIiwkdXJsKS4iIjsNCgkJJHhtbCA9IGN1cmwoJHNyYyk7DQoJCSRwMzYwID0gZXhwbG9kZSgiPGZpbGU+IiwkeG1sKTsgJHAzNjAgPSBleHBsb2RlKCI8L2ZpbGU+IiwkcDM2MFsxXSk7DQoJCSRwMzYwID0gY2hlY2tsaW5rKCRwMzYwWzBdKTsNCgkJJHA3MjAgPSBleHBsb2RlKCI8ZmlsZWhkPiIsJHhtbCk7ICRwNzIwID0gZXhwbG9kZSgiPC9maWxlaGQ+IiwkcDcyMFsxXSk7DQoJCSRwNzIwID0gY2hlY2tsaW5rKCRwNzIwWzBdKTsNCgkJaWYoJHA3MjAgIT0gMSkgJGxpbmsgLj0gIjcyMHwkcDcyMDw+IjsNCgkJaWYoJHAzNjAgIT0gMSkgJGxpbmsgLj0gIjM2MHwkcDM2MDw+IjsNCgkJJGRhdGFwbGF5ID0gJGxpbms7DQp9DQovL1NUQVJUIEdPVFBPUk4NCmVsc2VpZihzdHJwb3MoJHVybCAsICdnb3Rwb3JuLmNvbScpICE9PSBmYWxzZSkNCnsNCgkJaWYgKHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHAnKSkgPiAwIG9yIHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHBzJykpID4gMCkgJHVybCA9ICR1cmw7IGVsc2UgJHVybCA9ICdodHRwOi8vJy4kdXJsLicnOw0KCQkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsNCgkJJHhtbCA9IGN1cmwoJHVybCk7DQoJCSRsaW5rID0gZXhwbG9kZSgnPHNvdXJjZSBzcmM9IicsJHhtbCk7DQoJCSRsaW5rID0gZXhwbG9kZSgnIicsJGxpbmtbMV0pOw0KCQkkZGF0YXBsYXkgPSAkbGlua1swXTsNCn0NCi8vRU5EIEdPVFBPUk4NCi8vU1RBUlQgR0FZUE9STkVNUElSRQ0KZWxzZWlmKHN0cnBvcygkdXJsICwgJ2dheXBvcm5lbXBpcmUuY29tJykgIT09IGZhbHNlKQ0Kew0KCQlpZiAoc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cCcpKSA+IDAgb3Igc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cHMnKSkgPiAwKSAkdXJsID0gJHVybDsgZWxzZSAkdXJsID0gJ2h0dHA6Ly8nLiR1cmwuJyc7DQoJCSR0eXBlID0gMTsgJHR5cGV2aWRlbyA9ICdtcDQnOw0KCQkkeG1sID0gY3VybCgkdXJsKTsNCgkJJGxpbmsgPSBleHBsb2RlKCJ1cmw6ICciLCR4bWwpOw0KCQkkbGluayA9IGV4cGxvZGUoIiciLCRsaW5rWzFdKTsNCgkJJGRhdGFwbGF5ID0gJGxpbmtbMF07DQp9DQovL0VORCBHQVlQT1JORU1QSVJFDQovL1NUQVJUIFBPUk5GQVkNCmVsc2VpZihzdHJwb3MoJHVybCAsICdwb3JuZmF5LmNvbScpICE9PSBmYWxzZSkNCnsNCgkJaWYgKHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHAnKSkgPiAwIG9yIHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHBzJykpID4gMCkgJHVybCA9ICR1cmw7IGVsc2UgJHVybCA9ICdodHRwOi8vJy4kdXJsLicnOw0KCQkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsNCgkJJHNyYyA9ICIiLnByZWdfcmVwbGFjZSgiQCguKilwb3JuZmF5LmNvbS92aWRlby8oLio/KS8oLiopQCIsImh0dHA6Ly9wb3JuZmF5LmNvbS9tZWRpYS9udWV2by9lY29uZmlnLnBocD9rZXk9JDIiLCR1cmwpLiIiOw0KCQkkeG1sID0gY3VybCgkc3JjKTsNCgkJJHAyNDAgPSBleHBsb2RlKCI8aHRtbDU+IiwkeG1sKTsgJHAyNDAgPSBleHBsb2RlKCI8L2h0bWw1PiIsJHAyNDBbMV0pOw0KCQkkcDI0MCA9IGNoZWNrbGluaygkcDI0MFswXSk7DQoJCSRwMzYwID0gZXhwbG9kZSgiPGZpbGU+IiwkeG1sKTsgJHAzNjAgPSBleHBsb2RlKCI8L2ZpbGU+IiwkcDM2MFsxXSk7DQoJCSRwMzYwID0gY2hlY2tsaW5rKCRwMzYwWzBdKTsNCgkJJHA3MjAgPSBleHBsb2RlKCI8ZmlsZWhkPiIsJHhtbCk7ICRwNzIwID0gZXhwbG9kZSgiPC9maWxlaGQ+IiwkcDcyMFsxXSk7DQoJCSRwNzIwID0gY2hlY2tsaW5rKCRwNzIwWzBdKTsNCgkJaWYoJHA3MjAgIT0gMSkgJGxpbmsgLj0gIjcyMHwkcDcyMDw+IjsNCgkJaWYoJHAzNjAgIT0gMSkgJGxpbmsgLj0gIjM2MHwkcDM2MDw+IjsNCgkJaWYoJHAyNDAhPSAxKSAkbGluayAuPSAiMjQwfCRwMjQwIjsNCgkJJGRhdGFwbGF5ID0gJGxpbms7DQp9DQovL0VORCBQT1JORkFZDQovL1NUQVJUIEpBVjUxDQplbHNlaWYoc3RycG9zKCR1cmwgLCAnamF2NTEuY29tJykgIT09IGZhbHNlKQ0Kew0KCQlpZiAoc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cCcpKSA+IDAgb3Igc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cHMnKSkgPiAwKSAkdXJsID0gJHVybDsgZWxzZSAkdXJsID0gJ2h0dHA6Ly8nLiR1cmwuJyc7DQoJCSR0eXBlID0gMTsgJHR5cGV2aWRlbyA9ICdtcDQnOw0KCQkkc3JjID0gIiIucHJlZ19yZXBsYWNlKCJAKC4qKWphdjUxLmNvbS92aWRlb3MvKC4qKS8oLiopQCIsIiQzIiwkdXJsKS4iIjsNCgkJJHBhcmFtcyA9IGFycmF5KA0KCQkJImlkIiA9PiAkc3JjLA0KCQkpOw0KCQkkZG93bmxvYWQgPSBqYXZzaW4oJ2h0dHA6Ly9qYXY1MS5jb20vdmlkZW9zL3BsYXknLCRwYXJhbXMpOw0KCQkkZGF0YSA9ICBqc29uX2RlY29kZSgkZG93bmxvYWQsdHJ1ZSk7DQoJCSRsaW5rID0gJGRhdGFbInZpZGVvIl1bImdvb2dsZV9zdG9yYWdlX3VybCJdOw0KCQkkbGluayA9ICI3MjB8JGxpbmsiOw0KCQkkZGF0YXBsYXkgPSAkbGluazsNCg0KfQ0KLy9FTkQgSkFWNTENCi8vU1RBUlQgSkFWRklOREVSDQplbHNlaWYoc3RycG9zKCR1cmwgLCAnamF2ZmluZGVyLmNvbScpICE9PSBmYWxzZSkNCnsNCgkJaWYgKHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHAnKSkgPiAwIG9yIHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHBzJykpID4gMCkgJHVybCA9ICR1cmw7IGVsc2UgJHVybCA9ICdodHRwOi8vJy4kdXJsLicnOw0KCQkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsNCgkJJHNvdXJjZSA9IGN1cmwoJHVybCk7DQoJCSRnZXQgPSBleHBsb2RlKCc8aWZyYW1lIGNsYXNzPSJlbWJlZC1yZXNwb25zaXZlLWl0ZW0iIHNyYz0iJywkc291cmNlKTsNCgkJJGdldCA9IGV4cGxvZGUoJyInLCRnZXRbMV0pOw0KCQkkc291cmNlID0gY3VybCgkZ2V0WzBdKTsNCgkJcHJlZ19tYXRjaF9hbGwoJy88c291cmNlIHNyYz0iKC4qKSIvVScsJHNvdXJjZSwkZGF0YSk7DQoJCSRjb3VudCA9IGNvdW50KCRkYXRhWzFdKTsNCgkJaWYoJGNvdW50ID09IDMpDQoJCXsNCgkJCSRsaW5rID0gJzEwODBwfCcuJGRhdGFbMV1bMF0uJzw+NzIwcHwnLiRkYXRhWzFdWzFdLic8PjM2MHB8Jy4kZGF0YVsxXVsyXTsNCgkJfQ0KCQllbHNlaWYoJGNvdW50ID09IDIpDQoJCXsNCgkJCSRsaW5rID0gJzcyMHB8Jy4kZGF0YVsxXVswXS4nPD4zNjBwfCcuJGRhdGFbMV1bMV07DQoJCX0NCgkJZWxzZWlmKCRjb3VudCA9PSAxKQ0KCQl7DQoJCQkkbGluayA9ICczNjBwfCcuJGRhdGFbMV1bMF07DQoJCX0NCgkJJGRhdGFwbGF5ID0gJGxpbms7DQoNCn0NCi8vRU5EIEpBVkZJTkRFUg0KLy9TVEFSVCBVUE9STklBDQplbHNlaWYoc3RycG9zKCR1cmwgLCAndXBvcm5pYS5jb20nKSAhPT0gZmFsc2UpDQp7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cDovLycuJHVybC4nJzsNCgkJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJCSRzcmMgPSAiIi5wcmVnX3JlcGxhY2UoIkAoLiopdXBvcm5pYS5jb20vdmlkZW9zLyguKikvKC4qKUAiLCJodHRwOi8vdXBvcm5pYS5jb20vZW1iZWQvJDIiLCR1cmwpLiIiOw0KCQkkc291cmNlID0gY3VybCgkc3JjKTsNCgkJJGxpbmsgPSBleHBsb2RlKCJ2aWRlb191cmw6ICciLCRzb3VyY2UpOw0KCQkkbGluayA9IGV4cGxvZGUoIiciLCRsaW5rWzFdKTsNCgkJaWYoc3RycG9zKCRsaW5rWzBdICwgJ21wNCcpICE9PSBmYWxzZSkNCgkJew0KCQkJJGxpbmsgPSAnMzYwcHwnLiRsaW5rWzBdOw0KCQl9DQoJCSRkYXRhcGxheSA9ICRsaW5rOw0KfQ0KLy9FTkQgVVBPUk5JQQ0KLy9TVEFSVCBUWFhYDQplbHNlaWYoc3RycG9zKCR1cmwgLCAndHh4eC5jb20nKSAhPT0gZmFsc2UpDQp7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cDovLycuJHVybC4nJzsNCgkJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJCSRzcmMgPSAiIi5wcmVnX3JlcGxhY2UoIkAoLiopdHh4eC5jb20vdmlkZW9zLyguKikvKC4qKUAiLCJodHRwOi8vd3d3LnR4eHguY29tL2VtYmVkLyQyIiwkdXJsKS4iIjsNCgkJJHNvdXJjZSA9IGN1cmwoJHNyYyk7DQoJCSRsaW5rID0gZXhwbG9kZSgidmlkZW9fdXJsOiAnIiwkc291cmNlKTsNCgkJJGxpbmsgPSBleHBsb2RlKCInIiwkbGlua1sxXSk7DQoJCWlmKHN0cnBvcygkbGlua1swXSAsICdtcDQnKSAhPT0gZmFsc2UpDQoJCXsNCgkJCSRsaW5rID0gJzM2MHB8Jy4kbGlua1swXTsNCgkJfQ0KCQkkZGF0YXBsYXkgPSAkbGluazsNCn0NCi8vRU5EIFRYWFgNCi8vU1RBUlQgUE9STlhTDQplbHNlaWYoc3RycG9zKCR1cmwgLCAncG9ybnhzLmNvbScpICE9PSBmYWxzZSkNCnsNCgkJaWYgKHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHAnKSkgPiAwIG9yIHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHBzJykpID4gMCkgJHVybCA9ICR1cmw7IGVsc2UgJHVybCA9ICdodHRwOi8vJy4kdXJsLicnOw0KCQkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsNCgkJJHNyYyA9ICIiLnByZWdfcmVwbGFjZSgiQCguKilwb3JueHMuY29tLyguKikvKC4qKS0oLiopLmh0bWxAIiwiaHR0cDovL2VtYmVkLnBvcm54cy5jb20vZW1iZWQucGhwP2lkPSQzIiwkdXJsKS4iIjsNCgkJJHNvdXJjZSA9IGN1cmwoJHNyYyk7DQoJCSRsaW5rID0gZXhwbG9kZSgnZmlsZTogIicsJHNvdXJjZSk7DQoJCSRsaW5rID0gZXhwbG9kZSgnIicsJGxpbmtbMV0pOw0KCQlpZihzdHJwb3MoJGxpbmtbMF0gLCAnbXA0JykgIT09IGZhbHNlKQ0KCQl7DQoJCQkkbGluayA9ICczNjBwfCcuJGxpbmtbMF07DQoJCX0NCgkJJGRhdGFwbGF5ID0gJGxpbms7DQp9DQovL0VORCBQT1JOWFMNCi8vU1RBUlQgVFVCUE9STlRWDQplbHNlaWYoc3RycG9zKCR1cmwgLCAndHVicG9ybi50dicpICE9PSBmYWxzZSkNCnsNCgkJaWYgKHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHAnKSkgPiAwIG9yIHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHBzJykpID4gMCkgJHVybCA9ICR1cmw7IGVsc2UgJHVybCA9ICdodHRwOi8vJy4kdXJsLicnOw0KCQkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsNCgkJJHNvdXJjZSA9IGN1cmwoJHVybCk7DQoJCXByZWdfbWF0Y2hfYWxsKCcvZmlsZTogIiguKikiLCBsYWJlbDogIiguKikiL1UnLCAkc291cmNlLCAkZGF0YSk7DQoJCWZvcigkaT0wOyRpPGNvdW50KCRkYXRhWzJdKTskaSsrKQ0KCQl7DQoJCQlpZigkaT09KGNvdW50KCRkYXRhWzJdKS0xKSkNCgkJCXsNCgkJCQkkbGluayAuPSAnJy4kZGF0YVsyXVskaV0uJ3wnLiRkYXRhWzFdWyRpXS4nP2Rvd25sb2FkPXRydWUnOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSRsaW5rIC49ICcnLiRkYXRhWzJdWyRpXS4nfCcuJGRhdGFbMV1bJGldLic/ZG93bmxvYWQ9dHJ1ZTw+JzsNCgkJCX0NCgkJfQ0KCQkkZGF0YXBsYXkgPSAkbGluazsNCn0NCi8vRU5EIFRVQlBPUk5UVg0KLy9TVEFSVCBZT1VKSVpaDQplbHNlaWYoc3RycG9zKCR1cmwgLCAnd3d3LnlvdWppenouY29tJykgIT09IGZhbHNlKQ0Kew0KCQlpZiAoc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cCcpKSA+IDAgb3Igc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cHMnKSkgPiAwKSAkdXJsID0gJHVybDsgZWxzZSAkdXJsID0gJ2h0dHA6Ly8nLiR1cmwuJyc7DQoJCSR0eXBlID0gMTsgJHR5cGV2aWRlbyA9ICdtcDQnOw0KCQkkZGF0YSA9IGN1cmwoJHVybCk7DQoJCSRnZXQgPSBleHBsb2RlKCc/aWQ9JywkZGF0YSk7DQoJCSRnZXQgPSBleHBsb2RlKCInIiwkZ2V0WzFdKTsNCgkJJGdldCA9IGN1cmwoJ2h0dHA6Ly93d3cueW91aml6ei5jb20vdmlkZW9fdGVtcGxhdGVzL25vbi1mbGFzaC12aWRlby5waHA/aWQ9Jy4kZ2V0WzBdLicnKTsNCgkJJGdldDM2MCA9IGV4cGxvZGUoIndpbmRvdy5vcGVuKCciLCRnZXQpOw0KCQkkZ2V0MzYwID0gZXhwbG9kZSgiJyIsJGdldDM2MFsxXSk7DQoJCSRsaW5rID0gJzM2MHB8Jy4kZ2V0MzYwWzBdLicnOw0KCQkkZGF0YXBsYXkgPSAkbGluazsNCg0KfQ0KLy9FTkQgWU9VSklaWg0KLy9TVEFSVCBBTllQT1JODQplbHNlaWYoc3RycG9zKCR1cmwgLCAnYW55cG9ybi5jb20nKSAhPT0gZmFsc2UpDQp7DQoJCWlmIChzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwJykpID4gMCBvciBzdHJsZW4oc3Ryc3RyKCR1cmwsICdodHRwcycpKSA+IDApICR1cmwgPSAkdXJsOyBlbHNlICR1cmwgPSAnaHR0cDovLycuJHVybC4nJzsNCgkJJHR5cGUgPSAxOyAkdHlwZXZpZGVvID0gJ21wNCc7DQoJCSRkYXRhID0gY3VybCgkdXJsKTsNCgkJJGdldCA9IGV4cGxvZGUoInZpZGVvX3VybDogJyIsJGRhdGEpOw0KCQkkZ2V0ID0gZXhwbG9kZSgiJyIsJGdldFsxXSk7DQoJCSRsaW5rID0gJzM2MHB8Jy4kZ2V0WzBdLicnOw0KCQkkZGF0YXBsYXkgPSAkbGluazsNCn0NCg0KLy9FTkQgQU5ZUE9STg0KLy9FTkQgWk9ORSBYWFgNCi8vU1RBUlQgWk9ORSBJRlJBTUUNCi8vU1RBUlQgT1BFTkxPQUQNCmVsc2VpZihzdHJwb3MoJHVybCAsICdvcGVubG9hZC5jbycpICE9PSBmYWxzZSkNCnsNCglpZiAoc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cCcpKSA+IDAgb3Igc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cHMnKSkgPiAwKSAkdXJsID0gJHVybDsgZWxzZSAkdXJsID0gJ2h0dHBzOi8vJy4kdXJsLicnOw0KCSR0eXBlID0gMjsNCgkkc3JjID0gIiIucHJlZ19yZXBsYWNlKCJAKC4qKW9wZW5sb2FkLmNvL2YvKC4qPykvKC4qKUAiLCJodHRwczovL29wZW5sb2FkLmNvL2VtYmVkLyQyIiwkdXJsKS4iIjsNCgkkc291cmNlID0gY3VybCgkc3JjKTsNCgkkaWZyYW1lID0gZXhwbG9kZSgnPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2luZGV4Ij4nLCRzb3VyY2UpOw0KCSRpZnJhbWUgPSBleHBsb2RlKCc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+JCgiI21lZGlhc3BhY2Vfd3JhcHBlciwudmlkZW9jb250YWluZXIiKS5vbigiY29udGV4dG1lbnUiLGZ1bmN0aW9uKCl7cmV0dXJuIGZhbHNlO30pOzwvc2NyaXB0PicsJGlmcmFtZVsxXSk7DQoJJHNyY3MgPSAiIi5wcmVnX3JlcGxhY2UoIkAoLiopL2Fzc2V0cy8oLiopQCIsIiQxaHR0cHM6Ly9vcGVubG9hZC5jby9hc3NldHMvJDIiLCRpZnJhbWVbMF0pLiIiOw0KDQoJJGRhdGFwbGF5ID0gJHNyY3M7DQoNCn0NCi8vRU5EIE9QRU5MT0FEDQovL0VORCBaT05FIElGUkFNRQ0KLy9TVEFSVCBaT05FIFJFRElSRUNUDQovL1NUQVJUIEdPTy5HTA0KZWxzZWlmKHN0cnBvcygkdXJsICwgJ2h0dHBzOi8vZ29vLmdsJykgIT09IGZhbHNlIG9yIHN0cnBvcygkdXJsICwgJ2h0dHA6Ly9nb28uZ2wnKSAhPT0gZmFsc2Ugb3Igc3RycG9zKCR1cmwgLCAnZ29vLmdsLycpICE9PSBmYWxzZSkNCnsNCglpZiAoc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cCcpKSA+IDAgb3Igc3RybGVuKHN0cnN0cigkdXJsLCAnaHR0cHMnKSkgPiAwKSAkdXJsID0gJHVybDsgZWxzZSAkdXJsID0gJ2h0dHBzOi8vJy4kdXJsLicnOw0KCSR0eXBlID0gMTsgJHR5cGV2aWRlbyA9ICdtcDQnOw0KCSRkYXRhcGxheSA9ICI3MjB8Ii4kdXJsLiIiOw0KfQ0KLy9FTkQgR09PLkdMDQovL1NUQVJUIEdPT0dMRVVTRVJDT05URU5UDQplbHNlaWYoc3RycG9zKCR1cmwgLCAnZ29vZ2xldXNlcmNvbnRlbnQnKSAhPT0gZmFsc2UpDQp7DQoJaWYgKHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHAnKSkgPiAwIG9yIHN0cmxlbihzdHJzdHIoJHVybCwgJ2h0dHBzJykpID4gMCkgJHVybCA9ICR1cmw7IGVsc2UgJHVybCA9ICdodHRwczovLycuJHVybC4nJzsNCgkkdHlwZSA9IDE7ICR0eXBldmlkZW8gPSAnbXA0JzsNCgkkZGF0YXBsYXkgPSAiNzIwfCIuJHVybC4iIjsNCn0NCn0NCi8vRU5EIEdPT0dMRVVTRVJDT05URU5UDQovL0VORCBaT05FIFJFRElSRUNUDQplbHNlDQp7DQoJJGRhdGFwbGF5ID0gJ0xpY2Vuc2UgaGFzIGV4cGlyZWQnOw0KfQ0KDQoNCi8vU1RBUlQgUExBWUVSDQoNCi8vRU5EIFBMQVlFUg0KLyokYXJyYXkgPSBhcnJheSgNCgkndHlwZScgPT4gJHR5cGUsDQoJJ3R5cGVfdmlkZW8nID0+ICR0eXBldmlkZW8sDQoJJ2xpbmsnID0+ICRkYXRhcGxheQ0KKTsqLw0KZWNobyAnOjp0eXBlOjonOw0KZWNobyAkdHlwZTsNCmVjaG8gJzo6dHlwZTo6JzsNCmVjaG8gJ3N0YXJ0OjonOw0KZWNobyAkZGF0YXBsYXk7DQplY2hvICc6OmVuZCc7DQp9DQo/Pg==")); ?>
Function Calls
| base64_decode | 1 |
Stats
| MD5 | 070816cb16ae06be7decc0b6e1da2918 |
| Eval Count | 1 |
| Decode Time | 212 ms |