#!/usr/bin/perl #################################################################Modules use strict; use warnings; use Cwd; use Fcntl; use threads; use Net::NNTP; use Date::Parse; use Date::Format; use threads::shared; use Convert::BulkDecoder; use MLDBM qw(DB_File Storable); $| = 1; ################################################################Log File open ('STDERR', '>', 'NewsSurfer.log') #<-todo, add clear log function and retain logs between launches or warn "Can not create a log file!\n$!"; ############################################################Declarations our $VERSION = 3.02; my ($mw, $windowx, $windowy, %shash, %threads, $DEBUG, $RSS,); #################################################################Threads warn "Launching thread\n"; foreach my $l qw ( rss article decode post list die return progress optionCSV ) { share($shash{1}{$l}); $shash{1}{$l} = 0; } $threads{1} = threads->new(\&worker, 1); warn "Thread 1 is active\n"; ########################################################Optional Modules if ($^O eq 'MSWin32') { eval { require Win32::Console; Win32::Console::Free() }; if ($@) { warn "Win32::Console is not installed.\n$@"; } } #RSS Modules eval { require XML::FeedPP; require LWP::Simple; require Data::Dumper }; if (! $@) { $RSS = 1; } #############################################################GUI Modules use Tk::ResizeButton; use Tk::ProgressBar; use Tk::ItemStyle; use Tk::ROText; use Tk::HList; use Tk::Pod; use Tk; ####################################################################Main $DEBUG = $ARGV[0] || 0; $mw = MainWindow->new( -title => 'NewsSurfer', -relief => 'groove', -colormap => 'new', -bd => 2, ); splash(); news_gui(); Tk::MainLoop(); ####################################################################Exit foreach my $k (sort keys %threads) { warn "Destroying Thread [$k]\n"; $shash{$k}{'die'} = 1; sleep(1); } warn "Exiting..\n"; close STDERR; exit; #############################################################Subroutines sub splash #------------------------------------------------------------ { $mw->gridPropagate(0); $mw->withdraw; my ($image, $splash, $canvas,); $windowx = $mw->screenwidth; $windowy = $mw->screenheight; my $x = ($windowx - 500) / 2; my $y = ($windowy - 288) / 2; my $geometry = '500x288+'.$x.'+'.$y; { my $imagedata = load_image(1); $image = $mw->Photo( -format => 'gif', -data => $imagedata ); } $splash = $mw->Toplevel(-takefocus => 1,); $splash->overrideredirect(1); $splash->geometry($geometry); $splash->resizable(0, 0); $canvas = $splash->Canvas()->pack( -fill => 'both', -expand => 1, ); $canvas->createImage(0,0, -image => $image, -anchor => 'nw', ); $splash->update; $mw->after(12000, sub { $splash->destroy; $mw->GeometryRequest($windowx,$windowy); $mw->Post(-5,-5); $mw->update; }); return (1); } sub news_gui #---------------------------------------------------------- { #Widget Initialization our $sort_cnt = 3; our $msglimitOption; my $sys_bg = $mw->cget(-background); my $sys_fg = $mw->cget(-foreground); dbmopen(my %OPT, 'settings', '0640') || die "Cannot create settings.\n$!"; unless ($OPT{Mail}) { $OPT{Mail} = 'NewsSurfer@domain.invalid'; } unless ($OPT{DDir}) { $OPT{DDir} = '.'; } unless (-e $OPT{DDir} and -d $OPT{DDir}) { $OPT{DDir} = '.'; } dbmclose %OPT; $mw->gridRowconfigure(2, -weight => 1,); $mw->gridRowconfigure(4, -minsize => 8,); $mw->gridColumnconfigure(1, -weight => 1,); $mw->setPalette( background => '#a1a1a1', activebackground => '#a1a1a1', activeforeground => '#000fff', ); #create frames and panedwindow #my($pw1, $f1_main, $f2_main, $f3_main, $f2_tool,); my($pw1, $f1_main, $f2_main, $f3_main,); { $f1_main = $mw->Frame( -relief => 'flat', -bd => 2, )->grid( -in => $mw, -column => '1', -padx => '8', -sticky => 'news', -row => '1', -pady => '0', ); $f1_main->gridColumnconfigure(2, -minsize => 8,); $f1_main->gridColumnconfigure(7, -minsize => 8,); $f1_main->gridColumnconfigure(11, -minsize => 8,); $f1_main->gridColumnconfigure(14, -weight => 1,); $f2_main = $mw->Frame( -relief => 'groove', -bd => 4, )->grid( -in => $mw, -column => '1', -padx => '8', -sticky => 'news', -row => '2', -pady => '0', ); $f2_main->gridRowconfigure(1, -weight => 1,); $f2_main->gridColumnconfigure(1, -weight => 1,); $f3_main = $mw->Frame( -relief => 'groove', -bd => 2, )->grid( -in => $mw, -column => '1', -padx => '8', -sticky => 'news', -row => '3', -pady => '0', ); $f3_main->gridRowconfigure(1, -weight => 1,); $f3_main->gridColumnconfigure(1, -weight => 1,); $pw1 = $f2_main->Panedwindow( -orient => 'vertical', -relief => 'groove', -bd => 2, )->grid( -in => $f2_main, -row => '1', -sticky => 'news', -column => '1', ); } #frame 1 (toolbar frame) my $logo; our @buttons; { $logo = $mw->Label( -text => 'NewsSurfer', -font => '{Courier New} 16', )->grid( -in => $f1_main, -column => '14', -sticky => 'news', -row => '1', ); my $c = 1; foreach my $l qw( scan grab read_message post browse group opt show_log help quit ) { my $sub = \&{ $l; }; my $w = $f1_main->Button( -activebackground => '#a1a1a1', -bd => 0, -highlightthickness => 0, -command => sub { &$sub(); }, )->grid( -in => $f1_main, -column => $c, -sticky => 'news', -row => '1', ); push (@buttons, $w); if ($c =~ m/^(1|6|10)$/) { $c++; } $c++; } } #frame 2 (main display frame) #upper Function select our $lb1_grp; { $lb1_grp = $pw1->Scrolled( 'HList', -highlightthickness => 1, -columns => 3, -header => 1, -height => 3, -indicator => 1, -indicatorcmd => sub {}, -font => '{Ariel} 8', -highlightcolor => '#000000', -scrollbars => 'ose', -background => '#ffffff', -foreground => '#000000', -selectbackground => '#000000', -selectforeground => '#fff000', -selectmode => 'single', ); my $c = 0; foreach my $label ('Group', 'Last Scanned', '',) { my $w = $lb1_grp->ResizeButton( -widget => \$lb1_grp, -column => $c, -text => "$label", -font => '{Ariel} 8', -activebackground => '#a1a1a1', -activeforeground => '#000000', -relief => 'flat', -anchor => 'w', -borderwidth => 0, -takefocus => 0, -command => sub {}, ); $lb1_grp->columnWidth($c, -char => '1'); $lb1_grp->header( 'create', $c, -itemtype => 'window', -headerbackground => '#a1a1a1', -widget => $w, -borderwidth => 1, ); $c++; } { my ($c, @colWidth,); if ($windowx >= 800) { @colWidth = (127, 25, ''); } else { @colWidth = (95, 25, ''); } $c = 0; foreach my $width (@colWidth) { $lb1_grp->columnWidth ($c, -char => $width); $c++; } } } #lower HList our($lb2_msg,); { $lb2_msg = $pw1->Scrolled( 'HList', -highlightthickness => 1, -columns => 6, -header => 1, -indicator => 1, -indicatorcmd => sub {}, -separator => '^', -scrollbars => 'ose', -highlightcolor => '#000000', -background => '#ffffff', -foreground => '#000000', -selectbackground => '#000000', -selectforeground => '#fff000', -selectmode => 'extended', ); #lower HList column headers my $c = 0; foreach my $label ( 'Headers', 'From', 'Parts', 'Bytes', 'Date', ' ', ) { my $w = $lb2_msg->ResizeButton( -widget => \$lb2_msg, -column => $c, -text => $label, -font => '{Ariel} 8', -activebackground => '#a1a1a1', -activeforeground => '#000fff', -relief => 'flat', -anchor => 'w', -borderwidth => 0, -takefocus => 0, -command => sub { lb2_msg_sort("$label") },); $lb2_msg->columnWidth($c, -char => '1'); $lb2_msg->header( 'create', $c, -itemtype => 'window', -headerbackground => '#a1a1a1', -widget => $w, -borderwidth => 1, ); $c++; } if ($windowx >= 800) { $lb2_msg->columnWidth (0, -char => '100'); } else { $lb2_msg->columnWidth (0, -char => '68'); } $lb2_msg->columnWidth (1, -char => '10'); $lb2_msg->columnWidth (2, -char => '7'); $lb2_msg->columnWidth (3, -char => '10'); $lb2_msg->columnWidth (4, -char => '25'); $lb2_msg->columnWidth (5, -char => ''); } #frame 3 ('Statusbar frame') our($sb_lab,); our $sblabel = ' '; our $pb = 0; { $sb_lab = $mw->Label( -text => " $sblabel", -anchor => 'w', -relief => 'sunken', -bd => 2, )->grid( -in => $f3_main, -column => '1', -sticky => 'ew', -row => '1', ); $mw->ProgressBar( -relief => 'sunken', -bd => 2, -length => 270, -from => 0, -to => 100, -blocks => 50, -colors => [0, 'green'], -variable => \$pb, )->grid( -in => $f3_main, -column => '2', -sticky => 'news', -row => '1', ); } #log window our($tl1, $txt_log,); { $tl1 = $mw->Toplevel( -title => 'View Log', -relief => 'groove', -bd => 2, ); $tl1->gridRowconfigure(1, -minsize => 8, -weight => 1,); $tl1->gridColumnconfigure(1, -minsize => 8, -weight => 1,); $tl1->transient($mw); $tl1->withdraw; my $f = $tl1->Frame( -relief => 'sunken', -bd => 2, )->grid( -in => $tl1, -columnspan => '2', -column => '1', -rowspan => '1', -row => '1', -sticky => 'news' ); $f->gridRowconfigure(1, -minsize => 8, -weight => 1,); $f->gridColumnconfigure(1, -minsize => 8, -weight => 1,); $txt_log = $f->Scrolled( 'ROText', -scrollbars => 'se', -foreground => '#ffffff', -background => '#000000', -selectforeground => '#fff000', -selectbackground => '#000000', -wrap => 'none', -relief => 'flat', -bd => 0, -width => 80, -height => 30, )->grid( -in => $f, -columnspan => '1', -column => '1', -rowspan => '1', -row => '1', -sticky => 'news' ); $txt_log->tagConfigure('Red', -foreground => '#ff0000'); $txt_log->tagConfigure('Blue', -foreground => '#000fff'); $txt_log->tagConfigure('Yellow', -foreground => '#fff000'); { my $menu = $txt_log->menu; $menu->configure( -bg => $sys_bg, -fg => $sys_fg, -activeforeground => '#000fff', -activebackground => '#a1a1a1', ); $menu->delete('File'); $menu->delete('Search'); $menu->delete('View'); } my $c = 1; foreach my $label ('C l o s e', 'S a v e',) { my $s = 'w'; if ($c > 1) { $s = 'e' }; my $sublabel = $label; $sublabel =~ s/\s//g; my $sub = \&{ 'log_'.lc($sublabel); }; my $w = $tl1->Button( -text => $label, -activeforeground => '#000fff', -activebackground => '#a1a1a1', -relief => 'flat', -command => sub { &$sub(); }, )->grid( -in => $tl1, -column => $c, -sticky => $s, -row => '4', ); FlashButton($w, '#181830', $sys_fg); $c++; } } #post message window our($tl2, $txt_post, @post_entries,); { $tl2 = $mw->Toplevel( -relief => 'groove', -bd => 2, ); $tl2->title('Post Message'); $tl2->resizable(0, 0); $tl2->transient($mw); $tl2->withdraw; $tl2->gridColumnconfigure(3, -weight => 1,); my $c = 1; foreach my $label ('From: ', 'Subject: ',) { $tl2->Label( -text => $label, )->grid( -in => $tl2, -column => '1', -sticky => 'e', -row => $c, ); my $w = $tl2->Entry( -width => 60, -background => '#ffffff', -foreground => '#000000', )->grid( -in => $tl2, -columnspan => '2', -column => '2', -rowspan => '1', -row => $c, -sticky => 'w' ); $c++; push (@post_entries, $w); } my $f = $tl2->Frame( -relief => 'sunken', -bd => 2, )->grid( -in => $tl2, -columnspan => '4', -column => '1', -rowspan => '1', -row => '3', -sticky => 'nws' ); $txt_post = $f->Scrolled( 'Text', -scrollbars => 'se', -background => '#ffffff', -foreground => '#000000', -selectforeground => '#fff000', -selectbackground => '#000000', -relief => 'flat', -wrap => 'none', -height => 30, -width => 80, )->grid( -in => $f, -column => '1', -sticky => 'nws', -row => '1', ); { my $post_menu = $txt_post->menu; $post_menu->delete('File'); $post_menu->delete('Search'); $post_menu->delete('View'); } $c = 1; foreach my $label ( 'C a n c e l ', 'P o s t ', 'A t t a c h a n d P o s t', ) { my $sublabel = $label; $sublabel =~ s/\s//g; my $sub = \&{ 'post_'.lc($sublabel); }; my $w = $tl2->Button( -text => $label, -activeforeground => '#000fff', -activebackground => '#a1a1a1', -relief => 'flat', -command => sub { &$sub(); }, )->grid( -in => $tl2, -column => $c, -sticky => 'w', -row => '4', ); FlashButton($w, '#181830', $sys_fg); $c++; } } #groups subscription window our ($tl3, $lb_grp, $grpSubSearch,); { $tl3 = $mw->Toplevel( -relief => 'groove', -bd => 2, ); $tl3->title('Groups'); $tl3->geometry("+90+35"); $tl3->resizable(0, 0); $tl3->transient($mw); $tl3->withdraw; $tl3->gridColumnconfigure(5, -weight => 1,); my $f = $tl3->Frame( -relief => 'sunken', -bd => 2, )->grid( -in => $tl3, -columnspan => '5', -column => '1', -rowspan => '1', -row => '2', -sticky => 'news' ); $lb_grp = $f->Scrolled( 'HList', -scrollbars => 'ose', -background => '#000000', -foreground => '#ffffff', -selectbackground => '#fff000', -selectforeground => '#000000', -highlightthickness => 0, -selectmode => 'extended', -relief => 'flat', -takefocus => 0, -header => 1, -columns => 2, -indicator => 1, -height => 30, -width => 96, -indicatorcmd => sub {}, #do nothing )->grid( -in => $f, -column => '1', -sticky => 'news', -row => '1', ); $lb_grp ->columnWidth (0, -char => '70'); $lb_grp ->columnWidth (1, -char => '20'); $lb_grp ->headerCreate(0, -text => "Newsgroups",); $lb_grp ->headerCreate(1, -text => "Message Count",); $f = $tl3->Frame( -relief => 'flat', )->grid( -in => $tl3, -column => '1', -columnspan => '5', -sticky => 'ew', -row => '1', -rowspan => '1', ); $f->gridColumnconfigure(3, -weight => 1,); my $e = $tl3->Entry( -background => '#ffffff', -foreground => '#000000', -textvariable => \$grpSubSearch, -width => 40, )->grid( -in => $f, -column => '1', -sticky => 'ew', -row => '1', ); $e->bind('' => sub { search($lb_grp, 'GROUP', 0); }); my $c = 2; foreach my $label ( 'S e a r c h', 'S h o w A l l N e w s g r o u p s' ) { my ($w, $showAll,); if ($c > 2) { $showAll = 1; } else { $showAll = 0; } $w = $f->Button( -text => $label, -activeforeground => '#000fff', -activebackground => '#a1a1a1', -relief => 'flat', -command => sub { search($lb_grp, 'GROUP', $showAll); } )->grid( -in => $f, -column => $c, -sticky => 'ew', -row => '1', ); FlashButton($w, '#181830', $sys_fg); $c += 2; } $c = 1; foreach my $label ( 'C l o s e ', 'U p d a t e ', 'S u b s c r i b e ', 'U n S u b s c r i b e', ) { my $sublabel = $label; $sublabel =~ s/\s//g; my $sub = \&{ 'grp_' . lc($sublabel); }; my $w = $tl3->Button( -text => $label, -activeforeground => '#000fff', -activebackground => '#a1a1a1', -relief => 'flat', -command => sub { &$sub(); }, )->grid( -in => $tl3, -column => $c, -sticky => 'n', -row => '3', ); FlashButton($w, '#181830', $sys_fg); $c++; } } #read message window our($tl4, $txt_read,); { $tl4 = $mw->Toplevel( -relief => 'groove', -bd => 2, ); $tl4->title('Read Message'); $tl4->transient($mw); $tl4->withdraw; my $f = $tl4->Frame( -relief => 'sunken', -bd => 2, )->grid( -in => $tl4, -columnspan => '2', -column => '1', -rowspan => '1', -row => '1', -sticky => 'news' ); $txt_read = $f->Scrolled( 'ROText', -scrollbars => 'se', -background => '#ffffff', -foreground => '#000000', -selectforeground => '#fff000', -selectbackground => '#000000', -wrap => 'none', -relief => 'flat', -width => 80, -height => 30, )->grid( -in => $f, -columnspan => '1', -column => '1', -rowspan => '1', -row => '1', -sticky => 'news' ); { my $read_menu = $txt_read->menu; $read_menu->configure( -bg => $sys_bg, -fg => $sys_fg, -activeforeground => '#000fff', -activebackground => '#a1a1a1', ); $read_menu->delete('File'); $read_menu->delete('Search'); $read_menu->delete('View'); } my $c = 1; foreach my $label ('C l o s e', 'R e p l y',) { my $s = 'w'; if ($c > 1) { $s = 'e' }; my $sublabel = $label; $sublabel =~ s/ \s+ #remove any whitespace in the string //xg; my $sub = \&{ 'read_'.lc($sublabel); }; my $w = $tl4->Button( -text => $label, -activeforeground => '#000fff', -activebackground => '#a1a1a1', -relief => 'flat', -command => sub { &$sub(); }, )->grid( -in => $tl4, -column => $c, -sticky => $s, -row => '4', ); FlashButton($w, '#181830', $sys_fg); $c++; } } #options window our($tl5, $quoteSig, @OPT_widgets,); { $tl5 = $mw->Toplevel( -relief => 'groove', -bd => 2, -takefocus => 1, ); $tl5->title('Options'); $tl5->geometry("+105+70"); $tl5->resizable(0, 0); $tl5->transient($mw); $tl5->withdraw; my $f = $tl5->Frame( -bd => 3, -relief => 'sunken', -bg => '#000000', )->grid( -in => $tl5, -column => '1', -sticky => 'e', -row => '1', ); $f->gridRowconfigure(5, -minsize => 8,); $f->gridRowconfigure(9, -minsize => 96, -weight => 1,); $f->gridColumnconfigure(3, -minsize => 96,); my $c = 1; foreach my $label ('NNTP Server: ', 'Username: ', 'Password: ', 'Email: ',) { $f->Label( -text => $label, -background => '#000000', -foreground => '#ffffff', -anchor => 'e', -width => 15, )->grid( -in => $f, -column => '1', -sticky => 'e', -row => $c, ); $c++; } $c = 6; foreach my $label ('Download Dir: ', 'Signature File: ',) { $label =~ m/\b(\w+)\b/; my $sub = \&{ 'opt_' . lc($1); }; my $w = $f->Button( -text => $label, -anchor => 'e', -relief => 'flat', -bg => '#000000', -fg => '#ffffff', -activeforeground => '#fff000', -activebackground => '#000000', -width => 15, -command => sub { &$sub(); }, )->grid( -in => $f, -column => '1', -sticky => 'e', -row => $c, ); FlashButton($w, '#181830', $sys_fg); $c++; } undef $c; foreach my $row qw(1 2 3 4 6 7) { my $w = $f->Entry( -width => 32, -background => '#ffffff', -foreground => '#000000', )->grid( -in => $f, -column => '2', -sticky => 'w', -row => $row, ); if ($row >= 3) { if ($row == 3) { $w->configure(-show => '*',); } elsif ($row >= 6) { $w->configure(-width => 64,); } } push (@OPT_widgets, $w); } my $w; $w = $f->Checkbutton( -foreground => '#ffffff', -background => '#000000', -activeforeground => '#ffffff', -activebackground => '#000000', -selectcolor => '#000000', -variable => \$quoteSig, )->grid( -in => $f, -column => 1, -sticky => 'e', -row => 8, ); push (@OPT_widgets, $w); $w = $f->Label( -text => 'Quote signatures in reply message.', -background => '#000000', -foreground => '#ffffff', )->grid( -in => $f, -column => 2, -sticky => 'w', -row => 8, ); $w = $tl5->Button( -text => 'C l o s e & S a v e', -relief => 'flat', -activeforeground => '#000fff', -activebackground => '#a1a1a1', -command => sub { opt_close(); } )->grid( -in => $tl5, -column => '1', -sticky => 'w', -row => '2', ); FlashButton($w, '#181830', $sys_fg); } #help window our($tl6, $txt_help,); { $tl6 = $mw->Toplevel( -relief => 'groove', -bd => 2, ); $tl6->title('Help'); $tl6->geometry("+93+70"); $tl6->resizable(0, 0); $tl6->transient($mw); $tl6->withdraw; $tl6->gridColumnconfigure(2, -weight => 1,); my $f = $tl6->Frame( -relief => 'sunken', -bd => 2, )->grid( -in => $tl6, -column => '1', -columnspan => '3', -sticky => 'news', -row => '1', ); $txt_help = $f->Scrolled( 'ROText', -scrollbars => 'oe', -background => '#000000', -foreground => '#ffffff', -selectbackground => '#000000', -selectforeground => '#fff000', -wrap => 'none', -relief => 'flat', -width => 80, -height => 20, )->grid( -in => $f, -column => '1', -sticky => 'news', -row => '1', ); $txt_help->menu(undef); my $c = 1; foreach my $label ('C l o s e', 'A b o u t',) { my $sublabel = $label; $sublabel =~ s/\s//g; my $sub = \&{ 'help_' . lc($sublabel); }; my $w = $tl6->Button( -text => $label, -activeforeground => '#000fff', -activebackground => '#a1a1a1', -relief => 'flat', -command => sub { &$sub(); } )->grid( -in => $tl6, -column => $c, -sticky => 'n', -row => '2', ); FlashButton($w, '#181830', $sys_fg); $c += 2; } } #group right click menu our($tl7,); { $tl7 = $mw->Toplevel( -title => 'group_rc_menu', -relief => 'raised', -borderwidth => 2.5, ); $tl7->overrideredirect(1); $tl7->resizable(0, 0); $tl7->transient($mw); $tl7->withdraw; my $f = $tl7->Frame( -relief => 'sunken', -bd => '1.5', -takefocus => '1', )->grid( -in => $tl7, -column => '1', -sticky => 'news', -row => '1', ); $f->gridRowconfigure(3, -minsize => 2,); $f->gridRowconfigure(5, -minsize => 2,); $f->bind('' => sub { $tl7->withdraw; }); $f->Frame( -relief => 'groove', -bd => 8, )->grid( -in => $f, -column => 1, -sticky => 'news', -row => 3, ); $f->Frame( -relief => 'groove', -bd => 2, )->grid( -in => $f, -column => 1, -sticky => 'news', -row => 5, ); $f->Button( -text => 'Scan', -activeforeground => '#000fff', -activebackground => '#a1a1a1', -relief => 'flat', -anchor => 'w', -width => 10, -command => sub { scan(); })->grid( -in => $f, -column => 1, -sticky => 'n', -row => 1, ); $f->Button( -text => 'Load', -activeforeground => '#000fff', -activebackground => '#a1a1a1', -relief => 'flat', -anchor => 'w', -width => 10, -command => sub { message_load(); })->grid( -in => $f, -column => 1, -sticky => 'n', -row => 2, ); $f->Button( -text => 'Search', -activeforeground => '#000fff', -activebackground => '#a1a1a1', -relief => 'flat', -anchor => 'w', -width => 10, -command => sub { search_popup(); })->grid( -in => $f, -column => 1, -sticky => 'n', -row => 4, ); $f->Button( -text => 'Clear', -activeforeground => '#000fff', -activebackground => '#a1a1a1', -relief => 'flat', -anchor => 'w', -width => 10, -command => sub { message_clear(); })->grid( -in => $f, -column => 1, -sticky => 'n', -row => 6, ); $f->Button( -text => 'Reset', -activeforeground => '#000fff', -activebackground => '#a1a1a1', -relief => 'flat', -anchor => 'w', -width => 10, -command => sub { $lb1_grp->focus; rset_cmd(); })->grid( -in => $f, -column => 1, -sticky => 'n', -row => 7, ); $f->Button( -activeforeground => '#000fff', -activebackground => '#a1a1a1', -relief => 'flat', -text => 'Remove', -anchor => 'w', -width => 10, -command => sub { $lb1_grp->focus; grp_unsubscribe('X'); })->grid( -in => $f, -column => 1, -sticky => 'n', -row => 8, ); } #message right click menu our($tl8,); { $tl8 = $mw->Toplevel( -title => 'message_rc_menu', -relief => 'raised', -borderwidth => 2.5, ); $tl8->overrideredirect(1); $tl8->resizable(0, 0); $tl8->transient($mw); $tl8->withdraw; my $f = $tl8->Frame( -relief => 'sunken', -bd => 1.5, -takefocus => 1, )->grid( -in => $tl8, -column => 1, -sticky => 'news', -row => 1, ); $f->bind('' => sub { $tl8->withdraw; }); $f->Button( -text => 'Read', -activeforeground => '#000fff', -activebackground => '#a1a1a1', -relief => 'flat', -anchor => 'w', -width => 10, -command => sub { read_message(); })->grid( -in => $f, -column => 1, -sticky => 'n', -row => 1, ); $f->Button( -text => 'Grab', -activeforeground => '#000fff', -activebackground => '#a1a1a1', -relief => 'flat', -anchor => 'w', -width => 10, -command => sub { grab(); })->grid( -in => $f, -column => 1, -sticky => 'n', -row => 2, ); $f->Button( -text => 'Grab&Open', -activeforeground => '#000fff', -activebackground => '#a1a1a1', -relief => 'flat', -anchor => 'w', -width => 10, -command => sub { grab(1); })->grid( -in => $f, -column => 1, -sticky => 'n', -row => 3, ); $f->Button( -text => 'SelectAll', -activeforeground => '#000fff', -activebackground => '#a1a1a1', -relief => 'flat', -anchor => 'w', -width => 10, -command => sub { lb2_msg_select_all(); })->grid( -in => $f, -column => 1, -sticky => 'n', -row => 4, ); $f->Button( -text => 'Delete', -activeforeground => '#000fff', -activebackground => '#a1a1a1', -relief => 'flat', -anchor => 'w', -width => 10, -command => sub { $lb2_msg->focus; message_delete(); })->grid( -in => $f, -column => 1, -sticky => 'n', -row => 5, ); } #message download window our($tl9, $l1_msgs, $e1_msgs, $dlnew,); { $tl9 = $mw->Toplevel( -relief => 'groove', -bd => 2, ); $tl9->title('Download Messages'); $tl9->geometry("+220+160"); $tl9->resizable(0, 0); $tl9->transient($mw); $tl9->withdraw; $tl9->gridColumnconfigure(4, -minsize => 64, -weight => 1,); my $f = $tl9->Frame( -bg => '#000000', -relief => 'sunken', -bd => 3, )->grid( -in => $tl9, -columnspan => 4, -column => 1, -rowspan => 1, -row => 1, -sticky => 'w', ); $f->gridRowconfigure(4, -minsize => 100,); $f->gridColumnconfigure(4, -minsize => 32, -weight => 1,); $l1_msgs = $f->Label( -text => '', -bg => '#000000', -fg => '#ffffff', )->grid( -in => $f, -columnspan => 3, -column => 1, -rowspan => 1, -row => 1, -sticky => 'w', ); $f->Label( -text => 'Enter the number of messages to be downloaded: ', -bg => '#000000', -fg => '#ffffff', )->grid( -in => $f, -padx => 0, -columnspan => 2, -column => 1, -pady => 8, -row => 2, -sticky => 'w', ); $f->Label( -text => 'Newest messages only (mark the rest read).', -bg => '#000000', -fg => '#ffffff', )->grid( -in => $f, -padx => 0, -column => 2, -pady => 0, -row => 4, -sticky => 'nw', ); $e1_msgs = $f->Entry( -bg => '#ffffff', -fg => '#000000', -selectbackground => '#000000', -selectforeground => '#fff000', -width => 6, )->grid( -in => $f, -padx => 0, -column => 3, -pady => 8, -row => 2, -sticky => 'w', ); $f->Checkbutton( -variable => \$dlnew, -activeforeground => '#000000', -activebackground => '#000000', -foreground => '#000000', -background => '#000000', -selectcolor => '#ffffff', )->grid( -in => $f, -padx => '0', -column => '1', -padx => '0', -row => '4', -sticky => 'ne', ); my $c = 1; my $sticky = 'w'; foreach my $label ('O k', 'C a n c e l',) { my $sublabel = $label; $sublabel =~ s/\s//g; my $w = $tl9->Button( -text => $label, -activeforeground => '#000fff', -activebackground => '#a1a1a1', -relief => 'flat', -command => sub { $msglimitOption = uc($sublabel); }, )->grid( -in => $tl9, -column => $c, -sticky => 'e', -row => '2', ); FlashButton($w, '#181830', $sys_fg); $c += 3; } } #Search group popup our($tla,); { $tla = $mw->Toplevel(); $tla->title('Search Group'); $tla->geometry("+250+200"); $tla->resizable(0, 0); $tla->transient($mw); $tla->withdraw; $tla->gridColumnconfigure(1, -weight => 1,); my $f = $tla->Frame( -bd => 3, -relief => 'sunken', -bg => '#000000', )->grid( -in => $tla, -column => '1', -columnspan => '2', -sticky => 'news', -row => '1', -rowspan => '1', ); $tla->Label( -text => 'To clear previous search results, '. 'perform an empty search.'."\n\n\n\n", -bg => '#000000', -fg => '#ffffff', )->grid( -in => $f, -column => '1', -sticky => 'news', -row => '1', ); my $e = $tla->Entry( #$grpSubSearch is shared with the groups window -textvariable => \$grpSubSearch, -bg => '#ffffff', -fg => '#000000', -relief => 'sunken', -bd => 2, )->grid( -in => $tla, -column => '1', -sticky => 'news', -row => '2', ); $e->bind('' => sub { search($lb2_msg); }); my $w = $tla->Button( -text => 'S e a r c h', -activeforeground => '#000fff', -activebackground => '#a1a1a1', -relief => 'flat', -command => sub { search($lb2_msg); } )->grid( -in => $tla, -column => '2', -sticky => '', -row => '2', ); FlashButton($w, '#181830', $sys_fg); } #$pw1->add($f2_tool, $lb2_msg,); $pw1->add($lb1_grp, $lb2_msg,); #Bindings $tl2->protocol(WM_DELETE_WINDOW => \&post_cancel); $tl3->protocol(WM_DELETE_WINDOW => \&grp_close); $tl4->protocol(WM_DELETE_WINDOW => \&read_close); $tl9->protocol(WM_DELETE_WINDOW => \&dlmsgs_cancel); $tl1->protocol(WM_DELETE_WINDOW => sub {$tl1->withdraw;}); $tl5->protocol(WM_DELETE_WINDOW => sub {$tl5->withdraw;}); $tl6->protocol(WM_DELETE_WINDOW => sub {$tl6->withdraw;}); $tla->protocol(WM_DELETE_WINDOW => sub {$tla->withdraw;}); $logo->bind('' => sub { $logo->configure(-text=>'');$mw->update;$mw->after(200); $logo->configure(-text=>'N');$mw->update;$mw->after(180); $logo->configure(-text=>'Ne');$mw->update;$mw->after(130); $logo->configure(-text=>'New');$mw->update;$mw->after(120); $logo->configure(-text=>'News');$mw->update;$mw->after(160); $logo->configure(-text=>'NewsS');$mw->update;$mw->after(130); $logo->configure(-text=>'NewsSu');$mw->update;$mw->after(100); $logo->configure(-text=>'NewsSur');$mw->update;$mw->after(120); $logo->configure(-text=>'NewsSurf');$mw->update;$mw->after(130); $logo->configure(-text=>'NewsSurfe');$mw->update;$mw->after(110); $logo->configure(-text=>'NewsSurfer');$mw->update;$mw->after(100); }); $lb1_grp ->bind('' => sub { raise_rc_menu($tl7); }); $lb1_grp->bind(''=> sub { b4_grp_unsubscribe('X'); }); $lb2_msg ->bind('' => sub { my @sel = $lb2_msg->selectionGet; if ($sel[1]) { raise_rc_menu($tl8); } else { $lb2_msg->Tk::HList::ButtonRelease_1; raise_rc_menu($tl8, $lb2_msg); } }); $lb2_msg ->bind('' => sub { b2_grab_cmd(1); }); $lb2_msg->bind('' => \&read_message); $lb1_grp->bind('' => \&message_load); $lb1_grp->bind('' => \&scan); $lb1_grp->bind('' => \&message_clear); $lb1_grp->bind('' => \&message_clear); $lb1_grp->bind('' => \&rset_cmd); $lb1_grp->bind('' => \&rset_cmd); $lb2_msg->bind('' => \&message_delete); $lb2_msg->bind('' => \&read_message); $lb2_msg->bind('' => \&lb2_msg_select_all); $lb2_msg->bind('' => \&lb2_msg_select_all); $lb2_msg->bind('' => \&lb2_msg_select_end); $lb2_msg->bind('' => \&lb2_msg_select_hom); $lb2_msg->bind('' => \&message_delete); $lb2_msg->bind('' => \&message_delete); { my $c = 10; foreach my $b (@buttons) { #bind images onto buttons MainButtons($b, $c); $c++ } } #Defaults foreach my $p (glob 'part*.pt') { #todo - recovery unlink $_ || warn "Unable to delete part: [$p]\n$!"; } warn 'Warning - NewsSurfer has started. (' . localtime() . "}\n"; $sblabel = 'Ready'; $msglimitOption = 0; display_groups(); $lb1_grp->focus(); #Callbacks #sub toolBar #--------------------------------------------------------- #{ # #'Email', 'Newsgroups', 'RSS', # my $cmd = uc ($_[0]) || return (0); # my ($c, @lb1_headers,); # # if ($cmd eq 'NEWSGROUPS') { # #Newsgroup mode # @lb1_headers = ('Group', 'Last Scanned', '',); # #Display NNTP subscriptions # display_groups(); # $lb1_grp->focus(); # } # elsif ($cmd eq 'RSS') { # #RSS mode # $mw->Busy(-recurse => 1); # @lb1_headers = ('URL', 'Last Updated', '',); # #Display RSS URL's # display_rss(); # $mw->Unbusy; # } # else { # #Error # return (0); # } # $c = 0; # foreach my $label (@lb1_headers) { # my $w = $lb1_grp->ResizeButton( # -widget => \$lb1_grp, # -column => $c, # -text => "$label", # -font => '{Ariel} 8', # -activebackground => '#a1a1a1', # -activeforeground => '#000000', # -relief => 'flat', # -anchor => 'w', # -borderwidth => 0, # -takefocus => 0, # -command => sub {}, # ); # $lb1_grp->columnWidth($c, -char => '1'); # $lb1_grp->header( # 'create', $c, # -itemtype => 'window', # -headerbackground => '#a1a1a1', # -widget => $w, # -borderwidth => 1, # ); # $c++; # } # { # my ($c, @colWidth,); # if ($windowx >= 800) { # @colWidth = (115, 25, ''); # } # else { # @colWidth = (95, 25, ''); # } # $c = 0; # foreach my $width (@colWidth) { # $lb1_grp->columnWidth ($c, -char => $width); # $c++; # } # } # return (1); #} #sub display_rss #----------------------------------------------------- #{ # my ($URLs, $lb1_k1, $lb1_k2, $lb1_r1, $c,); # # $lb1_grp->delete('all'); # $lb1_k1 = $lb1_grp->ItemStyle('text', # -anchor => 'w', # -selectforeground => '#fff000', # -background => '#ffffff', # -foreground => '#000000', # -font => '{Arial} 8', # ); # $lb1_r1 = $lb1_grp->ItemStyle('text', # -anchor => 'w', # -selectforeground => '#fff000', # -background => '#ffffff', # -foreground => '#f01010', # -font => '{Arial} 8', # ); # $lb1_k2 = $lb1_grp->ItemStyle('text', # -anchor => 'e', # -selectforeground => '#fff000', # -background => '#ffffff', # -foreground => '#000000', # -font => '{Arial} 8', # ); # # open (FH, '<', 'NewsSurfer_RSS.ini') # or die "Cannot open NewsSurfer_RSS.ini\n$!"; # while (my $url = ()) { # if ($url =~ m/^$/ || $url =~ m/^#/) { # next; # } # else { # chomp ($url); # $c++; # } # $lb1_grp->add($c); # if (fetchRSS($url)) { # $lb1_grp->itemCreate($c, 0, # -text => $url, # -style => $lb1_k1, # ); # } # else { # $lb1_grp->itemCreate($c, 0, # -text => $url . ' (unreachable)', # -style => $lb1_r1, # ); # } # $lb1_grp->itemCreate($c, 1, # -text => 'todo', # -style => $lb1_k2, # ); # $mw->update; # } # close FH or die "Cannot close NewsSurfer_RSS.ini\n$!"; # return (1); #} #sub fetchRSS #-------------------------------------------------------- #{ # my $url = $_[0] || return (0); # my ($xml, $rssContent,); # my $lb2_b1 = $lb2_msg->ItemStyle('text', # -anchor => 'e', # -selectforeground => '#fff000', # -background => '#ffffff', # -foreground => '#0000ff', # -font => '{Arial} 8', # ); # my $lb2_b2 = $lb2_msg->ItemStyle('text', # -anchor => 'w', # -selectforeground => '#fff000', # -background => '#ffffff', # -foreground => '#0000ff', # -font => '{Arial} 8', # ); # # #Get RSS URL # if ($rssContent = get($url)) { # #Parse RSS # eval { $xml = XML::FeedPP->new($rssContent) }; # if (! $@) { # my (%file, $tmp, $c,); # tie %file, 'RSSDB', "rssfile", O_CREAT|O_RDWR, '0640' # or error('RSSDB', 'DIE',); # # #Save RSS header to DB # $tmp = $file{RSSDB}; # $tmp->{$url} = $xml; # $file{RSSDB} = $tmp; # undef $tmp; # untie %file; # # #Display RSS header # $c = 0; # foreach my $rssHeader ( $xml->get_item() ) { # $lb2_msg->add($c); # my $counter = 0; # foreach my $tag qw(title pubDate link) { # my $output = $rssHeader->$tag() || '-'; # if ($counter == 2) { $counter = 0; } # else { $counter++; } # $lb2_msg->itemCreate($c, $counter, # -itemtype => 'text', # -style => $lb2_b2, # -text => $output, # ); # $c++; # } # if ($DEBUG) { # print "\n" . '-'x79 . "\nXMLDATA:\n"; # print Dumper ($rssHeader); # print "\n"; # } # $mw->update; # } # } # else { # warn "Error processing URL: [$url]\n$!"; # return (0); # } # } # else { # warn "Error downloading URL: [$url]\n$!"; # return (0); # } # return (1); #} sub nntpconnect #----------------------------------------------------- { #Called whenever a connection to the server needs to be established my($nntp, $serv, $user, $pass,); eval { dbmopen(my %OPT, 'settings', '0640') || die "Cannot create settings.\n$!"; $serv = $OPT{Serv}; $user = $OPT{User}; $pass = $OPT{Pass}; dbmclose %OPT }; if (! $@) { #db access ok, try to connect foreach my $c (1..3) { warn "Connection attempt: [$c of 3]\n"; undef $nntp; $nntp = Net::NNTP->new( $serv, Debug => 1, Timeout => 5, ); if (! $nntp) { if ($c > 2) { #could not connect warn "Error - Can't connect to server: [" . $serv . "]\n"; error('login'); return (0); } else { #wait 1 second and then try again (up to 3 retries) my $a = $c + 1; warn "Error - Can't connect to server: [" . $serv . "]\n"; warn "Connection attempt: [$a of 3]\n"; update_status("Connection attempt: [$a of 3]"); $mw->after(1000); next; } } else { #connected last; } } } else { #error accessing db, not connected warn "DB error: [$@]\n"; return (0); } #connection ok, authenticate user if (! defined $user) { $user = 'anonymous'; } if (! defined $pass) { $pass = "\n"; } eval { $nntp->authinfo($user, $pass) }; if ($@) { error('login'); return (0); } elsif (! $nntp) { error('login'); return (0); } #authenticated, return a reference to the nntp object return (\$nntp); } sub scan #------------------------------------------------------------ { #called from a button pressed in the main window or rc menu my (@sel,); #clear old newsgroup's display $mw->Busy(-recurse => 1); $lb2_msg->focus; $lb2_msg->delete('all'); $mw->update; #determine which newsgroup to scan @sel = $lb1_grp->selectionGet; if (defined $sel[0]) { my ($group, $nntpRef,); $group = $lb1_grp->itemCget($sel[0], 0, -text); #connect to nntp server update_status('Connecting to NNTP server...'); update_status('4', 'PROGRESSBAR'); $nntpRef = nntpconnect(); if($nntpRef) { #determine article number range available on the server my($dlmsg, $totmsgs, $rng, @nfo,); update_status('Scanning newsgroup...'); update_status('4', 'PROGRESSBAR'); @nfo = $$nntpRef->group($group); if ($nfo[1]) { shift @nfo; pop @nfo; $totmsgs = $nfo[1] - $nfo[0]; $totmsgs++; $dlmsg = $nfo[1] - $nfo[0]; $dlmsg++; #load group db and determine which headers to download next. if (-e "$group.grp") { update_status('Removing expired articles...'); update_status('4', 'PROGRESSBAR'); tie my %file, 'MLDBM', "$group.grp", O_CREAT|O_RDWR, '0640' or error('MLDBM', 'DIE',); #remove expired articles my $tmp = $file{HEADERDB}; while (my $k = each %$tmp) { #k is a message number of a previously downloaded message #remove messages that are no longer on the server if ($k < $nfo[0]) { delete $tmp->{$k}; } } #determine the new article range my(@keys, $last,); update_status('4', 'PROGRESSBAR'); @keys = (keys %$tmp); @keys = sort {$b <=> $a} @keys; $last = $keys[0] || 0; warn "last messageID downloaded is: [$last]\n"; warn "first new messageID is: [$nfo[1]]\n"; $last++; #save to db $file{HEADERDB} = $tmp; undef $tmp; untie %file; #check for new messages if ($last <= $nfo[1]) { #there are new messages in the newsgroup undef $rng; unless($last == 1) { shift @nfo; unshift (@nfo, "$last"); } $totmsgs = $nfo[1] - $nfo[0]; $totmsgs++; $dlmsg = $nfo[1] - $nfo[0]; $dlmsg++; warn "There are $totmsgs new messages on the server\n"; #enforce maximum message download limit unless($totmsgs < 5000) { my $r = msglimit($totmsgs); if ($r == 0) { $$nntpRef->quit(); $dlmsg = 0; } elsif ($dlnew == 1) { $nfo[0] = $nfo[1] - $r; $dlmsg = $nfo[1] - $nfo[0]; } else { $nfo[1] = $nfo[0] + $r; $dlmsg = $nfo[1] - $nfo[0]; } } } else { #there are no new messages on the newsgroup warn "No new messages...\n"; update_status('No new messages...'); undef $dlmsg; #load old messages displayheaders('OLD'); } } else { #Newly subscribed or reset group; create a new db. warn "Creating a new db for $group\n"; update_status('Initializing newsgroup...'); update_status('4', 'PROGRESSBAR'); unless($totmsgs < 5000) { #popup d/l messages my $r = msglimit($totmsgs); warn "Message download limit set to: [$r]\n"; if ($r == 0) { $dlmsg = 0; } elsif ($dlnew == 1) { $nfo[0] = $nfo[1] - $r; } else { $nfo[1] = $nfo[0] + $r; } $dlmsg = $nfo[1] - $nfo[0]; } } if ($dlmsg) { $rng = \@nfo; #download xover into %xover, then disconnect update_status("Downloading $dlmsg of $totmsgs new headers"); update_status('16', 'PROGRESSBAR'); my($href, %xover); $href = $$nntpRef->xover($rng); #<-blocks if ($href) { %xover = %$href; undef $href; #(%xover is a HoA) $_ is msgnum #$xover{$_}[0] #subject #$xover{$_}[4] #references #$xover{$_}[1] #from #$xover{$_}[5] #bytes #$xover{$_}[2] #date #$xover{$_}[6] #lines *parts* #$xover{$_}[3] #msg-id #$xover{$_}[7] #xref:full *read* } else { #try to reconnect warn "Warning - retrying header download...\n"; update_status('retrying header download...'); eval { $$nntpRef->quit }; $nntpRef = nntpconnect(); if ($$nntpRef) { $$nntpRef->group($group); $href = $$nntpRef->xover($rng); #<-blocks if (defined $href) { %xover = %$href; undef $href; } else { error('connect'); } } else { error('connect'); } } if (keys %xover) { #handle multipart messages update_status('Preparing messages...'); my (%file, $tmp,); my $subj_sav = ' '; my $c = 0; tie %file, 'MLDBM', "$group.grp", O_CREAT|O_RDWR, '0640' || error('MLDBM', 'DIE',); $tmp = $file{MULTIPARTDB}; while (my $k = each %xover) { if ($pb >= 100) {$pb = 0; } if ($c > 500) {for(1..1){$pb++; $c = 0; $mw->update;}} else {$c++; } if ($xover{$k}[0] =~ m/ (\p{Any}+) #the main subject $1 [\(\[\{]+? #followed by a ( or [ or { (\d+) #followed by a digit $2 [\/\-]+? #followed by a foward slash or dash (\d+) #followed by a digit $3 [\)\]\}]+? #followed by a ) or ] or } (\p{Any}*) #additional subject text $4 #$1 = sub, $2 = pt, $3 = tot, $4 = more sub /gx) { #it is a multipart message my $newsubj; $newsubj = $1.$4; $newsubj =~ s/ #validate subject ~::~/ #replace this ____ #with this /x; #record multipart message ids $tmp->{$newsubj}{$2} = $xover{$k}[3]; #combine parts for display, update subject if ($1 ne $subj_sav) { $subj_sav = $1; #it is a new subject $xover{$k}[6] = $3; #parts total $xover{$k}[0] = $newsubj; #edited subject } else { #seen this subject already delete $xover{$k}; } } else { #not a multipart message $xover{$k}[6] = 1; } } $file{MULTIPARTDB} = $tmp; undef $tmp; #remove multipart duplicates and log new message ids update_status('Combining parts...'); update_status('16', 'PROGRESSBAR'); my %seen; while (my $k = each %xover) { if ($xover{$k}) { if ($xover{$k}[6] != 1) { my $l; $l = $xover{$k}[0] . $xover{$k}[1] . $xover{$k}[6]; # subject from parts if (defined $seen{$l}) { delete $xover{$k}; } $seen{$l} = 1; } } } undef %seen; #count headers, format the time/date, remove old headers update_status('Formatting Time/Date...'); update_status('16', 'PROGRESSBAR'); while (my $k = each %xover) { my $now = time; my $epoch = str2time($xover{$k}[2]); my $age = $now - $epoch; if ($age < 2592000 or $k == $nfo [1]) { chomp($xover{$k}[2] = ctime($epoch)); } else { delete $xover{$k} } } #save new headers to group header db my $newheadercount = 0; update_status('Saving Group...'); update_status('16', 'PROGRESSBAR'); $tmp = $file{HEADERDB}; while (my $messagenumber = each %xover) { for my $c (0..7) { $tmp->{$messagenumber}[$c] = $xover{$messagenumber}[$c]; } $newheadercount++; } $file{HEADERDB} = $tmp; undef $tmp; untie %file; #display messages warn "Displaying [$newheadercount] new messages\n"; update_status('Displaying messages...'); update_status('4', 'PROGRESSBAR'); displayheaders('NEW', $newheadercount); #update last scanned time dbmopen(my %SBSCRIBE, 'sbscribe', '0640') || die "Cannot create sbscribe.\n$!"; my $stime; chomp ($stime = ctime(time)); $SBSCRIBE{"$group"} = "$stime"; dbmclose %SBSCRIBE; } } } else { #unable to get group information from server } $$nntpRef->quit(); } else { #could not connect to server } } else { #no group selected to scan error('scan_1'); } #cleanup gui display_groups(); $lb2_msg->focus; if ($sel[0]) { $lb1_grp->selectionSet($sel[0]) }; ready(); return (1); } sub msglimit #-------------------------------------------------------- { #called from sub scan my $totmsgs = $_[0] || 'NULL'; $dlnew = 0; my $ret; $ret = dlmsgs('PROMPT', $totmsgs); $ret = dlmsgs($ret, $totmsgs); #return number of messages to be downloaded to the scan subroutine return ($ret); } sub dlmsgs #---------------------------------------------------------- { #called from sub msglimit my $opt = uc($_[0]) || 'NULL'; my $totmsgs = $_[1] || 'NULL'; my $maxdl = $e1_msgs->get || '5000'; $e1_msgs->delete(0, 'end'); $e1_msgs->insert(0, $maxdl); if ($opt eq 'PROMPT') { $l1_msgs->configure(-text => "There are more than $totmsgs ". 'unread messages in this group.'); $tl9->Popup; $e1_msgs->focus; $mw->update; $mw->Unbusy; $mw->waitVariable(\$msglimitOption); #wait for user $mw->Busy(-recurse => 1); return ($msglimitOption); } elsif ($opt eq 'OK') { if ($maxdl =~ m/\D/) { $maxdl = 0; } elsif ($maxdl > $totmsgs) { $maxdl = $totmsgs; } $tl9->withdraw; } elsif ($opt eq 'CANCEL') { $maxdl = 0; $tl9->withdraw; } else { warn "ERROR - Invalid dlmsgs option: [$opt]\n$!"; $mw->destroy; } return ($maxdl); } sub displayheaders #-------------------------------------------------- { #called from subs scan and message_load #when opt1 is set to 'NEW' then opt2 should specify # of new msgs my $opt1 = uc($_[0]) || 'OLD'; my $opt2 = $_[1] || 0; my(%file, $lb2_k1, $lb2_k2, $lb2_b1, $lb2_b2, $chek, $group, @sel); #determine which newsgroup is selected @sel = $lb1_grp->selectionGet; if (defined $sel[0]) { $group = $lb1_grp->itemCget($sel[0], 0, -text); } else { warn "Warning - No valid group selected for header display\n"; return (0); } #prepare display { my $imagedata = load_image(2); $chek = $mw->Photo( -format => 'bmp', -data => $imagedata ); } $lb2_b1 = $lb2_msg->ItemStyle('text', -anchor => 'e', -selectforeground => '#fff000', -background => '#ffffff', -foreground => '#0000ff', -font => '{Arial} 8', ); $lb2_b2 = $lb2_msg->ItemStyle('text', -anchor => 'w', -selectforeground => '#fff000', -background => '#ffffff', -foreground => '#0000ff', -font => '{Arial} 8', ); $lb2_k1 = $lb2_msg->ItemStyle('text', -anchor => 'e', -selectforeground => '#fff000', -background => '#ffffff', -foreground => '#000000', -font => '{Arial} 8', ); $lb2_k2 = $lb2_msg->ItemStyle('text', -anchor => 'w', -selectforeground => '#fff000', -background => '#ffffff', -foreground => '#000000', -font => '{Arial} 8', ); #load group db tie %file, 'MLDBM', "$group.grp", O_CREAT|O_RDWR, '0640' or error('MLDBM', 'DIE',); my $tmp = $file{HEADERDB}; #display headers #TODO - my $cnt = my $c = 0; #discussion threads for (1..10) { $pb++; $mw->update; } foreach my $k (reverse sort keys %$tmp) { if ($pb >= 100) { $pb = 0; } if ($c > 100) { for(1..10) { $pb++; $mw->update; $c = 0; } } else { $c++; } $cnt++; if ($opt1 eq 'NEW' && $cnt <= $opt2) { $lb2_msg->add($k); my $counter = 0; foreach my $headerportion (0, 1, 6, 5, 2,) { if ($counter < 2) { $lb2_msg->itemCreate($k, $counter, -itemtype => 'text', -style => $lb2_b2, -text => $tmp->{$k}[$headerportion], ); } else { $lb2_msg->itemCreate($k, $counter, -itemtype => 'text', -style => $lb2_b1, -text => $tmp->{$k}[$headerportion], ); } $counter++; } } else { $lb2_msg->add($k); my $counter = 0; foreach my $headerportion (0, 1, 6, 5, 2,) { if ($counter < 2) { $lb2_msg->itemCreate($k, $counter, -itemtype => 'text', -style => $lb2_k2, -text => $tmp->{$k}[$headerportion], ); } else { $lb2_msg->itemCreate($k, $counter, -itemtype => 'text', -style => $lb2_k1, -text => $tmp->{$k}[$headerportion], ); } $counter++; } #mark message as old $tmp->{$k}[8] = 1; } if ($tmp->{$k}[7] eq 'read') { $lb2_msg->indicator('create', $k, -itemtype => 'image', -image => $chek ); } ##mark message as old #$tmp->{$k}[8] = 1; } $file{HEADERDB} = $tmp; undef $tmp; untie %file; return (1); } sub message_load #---------------------------------------------------- { #called from the main window, rc menu, or sub message_clear my($group, $return,); update_status('Loading newsgroup...'); $mw->Busy(-recurse => 1); $lb2_msg->focus; $mw->update; #load messages $lb2_msg->delete('all'); for (1..10) { $pb++; $mw->update; } my $ret = displayheaders('OLD'); if ($ret) { $return = 1; } else { $return = 0; } ready(); $lb2_msg->focus; $mw->update; return ($return); } sub message_clear #--------------------------------------------------- { #called from the rc menu my ($group, @sel, @paths, %file,); update_status('Clearing previously scanned messages from group...'); $mw->Busy(-recurse => 1); $mw->update; #get a list of paths for the message hlist lb2_msg_select_all(); @paths = $lb2_msg->infoSelection; unless ($paths[0]) { my $ret = displayheaders('OLD'); if ($ret) { lb2_msg_select_all(); @paths = $lb2_msg->infoSelection; } else { warn "Error - Unable to clear group\n"; ready(); $mw->Unbusy; return (0); } } #determine group @sel = $lb1_grp->selectionGet; eval { $group = $lb1_grp->itemCget($sel[0], 0, -text) }; if ($@) { warn "Error - No valid group selected to clear.\n"; ready(); return (0); } #open the selected groups' DB file if (-e "$group.grp") { tie %file, 'MLDBM', "$group.grp", O_CREAT|O_RDWR, '0640' or error('MLDBM', 'DIE',); #select this groups HEADERDB table my $tmp = $file{HEADERDB}; #clear the selected group, and update it's HEADERDB my $c = 1; foreach my $path (@paths) { unless ($path == $paths[0]) { $lb2_msg->delete('entry', $path); delete $tmp->{$path}; if ($c == 100) { $mw->update; undef $c; } $c++; } } $file{HEADERDB} = $tmp; #delete this groups' MULTIPARTDB delete $file{MULTIPARTDB}; } #close the DB file and finish up untie %file; ready(); return (1); } sub lb2_msg_sort #---------------------------------------------------- { #called from a button pressed in the main window my $caller = uc($_[0]) || ' '; my(@sel, $group, @y, $imagedata, $chek, %file, $c, $col, $opt,); if ($caller eq ' ') { return (1); } elsif ($caller eq 'HEADERS') { $col = 0; $opt = 1; } elsif ($caller eq 'FROM') { $col = 1; $opt = 1; } elsif ($caller eq 'PARTS') { $col = 6; $opt = 2; } elsif ($caller eq 'BYTES') { $col = 5; $opt = 2; } elsif ($caller eq 'DATE') { $col = 2; $opt = 3; } else { warn "Error - Invalid sort option: [$caller]\n"; return (0); } $sort_cnt++; $mw->Busy(-recurse => 1,); $lb2_msg->delete('all'); update_status ('Sorting...'); $imagedata = load_image(2); $chek = $mw->Photo( -format => 'bmp', -data => $imagedata ); undef $imagedata; #load group header db @sel = $lb1_grp->selectionGet; eval { $group = $lb1_grp->itemCget($sel[0], 0, -text) }; if ($@) { warn "Error - No valid group selected for sort.\n"; $mw->Unbusy; return (0); } tie %file, 'MLDBM', "$group.grp", O_CREAT|O_RDWR, '0640' or error('MLDBM', 'DIE',); my $tmp = $file{HEADERDB}; #sort if ($sort_cnt % 2) { if ($opt == 1) { @y = sort{ $tmp->{$b}[$col] cmp $tmp->{$a}[$col] }keys %$tmp; } elsif ($opt == 2) { @y = sort{ $tmp->{$b}[$col] <=> $tmp->{$a}[$col] }keys %$tmp; } else { @y = sort{ str2time($tmp->{$b}[$col]) <=> str2time($tmp->{$a}[$col]) }keys %$tmp; } } else { if ($opt == 1) { @y = sort{ $tmp->{$a}[$col] cmp $tmp->{$b}[$col] }keys %$tmp; } elsif ($opt == 2) { @y = sort{ $tmp->{$a}[$col] <=> $tmp->{$b}[$col] }keys %$tmp; } else { @y = sort{ str2time($tmp->{$a}[$col]) <=> str2time($tmp->{$b}[$col]) }keys %$tmp; } } #re-populate my $blackEast = $lb2_msg->ItemStyle( 'text', -selectforeground => '#fff000', -bg => '#ffffff', -fg => 'black', -anchor => 'e', -font => '{Arial} 8', ); my $blackWest = $lb2_msg->ItemStyle( 'text', -selectforeground => '#fff000', -bg => '#ffffff', -fg => 'black', -anchor => 'w', -font => '{Arial} 8', ); my $blueEast = $lb2_msg->ItemStyle( 'text', -selectforeground => '#fff000', -bg => '#ffffff', -fg => 'blue', -anchor => 'e', -font => '{Arial} 8', ); my $blueWest = $lb2_msg->ItemStyle( 'text', -selectforeground => '#fff000', -bg => '#ffffff', -fg => 'blue', -anchor => 'w', -font => '{Arial} 8', ); $c = 0; foreach my $k (@y) { if ($c > 100) { $mw->update; $c = 0; } else { $c++ } my($lb2_k1, $lb2_k2,); if ($tmp->{$k}[8]) { $lb2_k1 = $blackEast; $lb2_k2 = $blackWest; } else { $lb2_k1 = $blueEast; $lb2_k2 = $blueWest; } $lb2_msg->add($k); $lb2_msg->itemCreate($k, 0, -itemtype => 'text', -style => $lb2_k2, -text => $tmp->{$k}[0] ); $lb2_msg->itemCreate($k, 1, -itemtype => 'text', -style => $lb2_k2, -text => $tmp->{$k}[1] ); $lb2_msg->itemCreate($k, 2, -itemtype => 'text', -style => $lb2_k1, -text => $tmp->{$k}[6] ); $lb2_msg->itemCreate($k, 3, -itemtype => 'text', -style => $lb2_k1, -text => $tmp->{$k}[5] ); $lb2_msg->itemCreate($k, 4, -itemtype => 'text', -style => $lb2_k1, -text => $tmp->{$k}[2] ); if ($tmp->{$k}[7] eq 'read') { $lb2_msg->indicator('create', $k, -itemtype => 'image', -image => $chek ); } } untie %file; ready(); return (1); } sub grab #------------------------------------------------------------ { #called from a button in the main window or the rc menu my $open = $_[0] || '0'; my (%file, @sel, @grabs, $group,); $mw->Busy(-recurse => 1); $pb = 0; #grab what? @sel = $lb1_grp->selectionGet; eval { $group = $lb1_grp->itemCget($sel[0], 0, -text) }; if ($@) { warn "Error - No valid group selected for grab.\n"; ready(); return (0); } $lb2_msg->focus; @grabs = $lb2_msg->selectionGet; unless ($group and @grabs) { warn "Selection error\n"; $mw->Unbusy; ready(); return (0); } #load group multipart db (%multi is a HoHoA) subj->part = msg id tie %file, 'MLDBM', "$group.grp", O_CREAT|O_RDWR, '0640' or error('MLDBM', 'DIE',); #get selection(s) foreach my $article (@grabs) { my($subje, $parts, @art, $aref, $treturn,); for(1..4) { $pb++; $mw->update; } $mw->after(500); #read subject $subje = $lb2_msg->itemCget($article, 0, -text); $parts = $lb2_msg->itemCget($article, 2, -text); #lookup subject if (defined $parts && $parts > 1) { #Multipart message my $tmp = $file{MULTIPARTDB}{$subje}; my $parttot = keys %$tmp; my @parts = sort(keys %$tmp); my $msgIDs; my $partNum; #fixes: part 0 nfo files in messages if ($parttot == $parts + 1) { $partNum = 0; } else { $partNum ++; } #prepare options to provide to the thread my $msgID = ' '; foreach my $msgID (@parts) { $msgIDs .= $tmp->{$msgID} . ','; } $msgID = substr ($msgID, 1); #launch thread, download parts $shash{1}{optionCSV} = '0,' . $partNum . ',' . $msgIDs; $shash{1}{progress} = 1; $shash{1}{article} = 1; $mw->after(500); while ($shash{1}{article} == 1) { #wait for the thread, update gui update_status( "Downloading... ($shash{1}{progress} of $parttot)" ); if ($pb >= 100) { $pb = 0; } else { $pb += .01; } $mw->update; } $treturn = $shash{1}{return}; } else { #singlepart message my @a = ($article); for(1..5) { $pb += 5; $mw->update; } update_status('Downloading message...'); #Launch thread $shash{1}{optionCSV} = $group . ",1,@a"; $shash{1}{article} = 1; while ($shash{1}{article} == 1) { if ($pb >= 100) { $pb = 0; } else { $pb += .01; } $mw->update; } $treturn = $shash{1}{return}; } #If the message was downloaded ok, then start up the decoder if ($treturn) { my ($res, $cvt, $ret,); $mw->after(500); update_status('Decoding attachment...'); warn "Decoding attachment(s)\n"; $pb++; #launch thread $shash{1}{decode} = 1; while ($shash{1}{decode} == 1) { if ($pb >= 100) { $pb = 0; } else { $pb += .01; } $mw->update; } $ret = $shash{1}{return}; if ($ret) { #mark read; load and update group header db my($tmp, $chek,); $tmp = $file{HEADERDB}; $tmp->{$article}[7] = 'read'; $file{HEADERDB} = $tmp; { my $imagedata = load_image(2); $chek = $mw->Photo( -format => 'bmp', -data => $imagedata ); } $lb2_msg->indicator( 'create', $article, -itemtype => 'image', -image => $chek ); $mw->update; #open it? if ($open == 1) { my $cwd = cwd; my($dir, $file) = split('\*', $ret); if ($^O eq 'MSWin32') { chdir ($dir); system('start', '/B', $file); chdir ($cwd); } else { chdir ($dir); system($file); chdir ($cwd); } } } else { #Could not decode attachment, try the next message warn "Could not decode attachment\n$!"; } } else { #Missing some or all parts, try the next message warn "Will not be able to decode this attachment\n"; warn "The message is missing some or all of it's parts\n$!"; } } untie %file; ready(); return (1); } sub message_delete #-------------------------------------------------- { #called from the rc menu my($group, @sel, %file,); $mw->Busy(-recurse => 1,); update_status('Deleting selected messages...'); @sel = $lb1_grp->selectionGet; eval { $group = $lb1_grp->itemCget($sel[0], 0, -text) }; if ($@) { warn "Error - No valid group selected for message delete.\n"; ready(); $mw->Unbusy; return (0); } $lb2_msg->focus; @sel = $lb2_msg->selectionGet; unless ($sel[0]) { ready(); $mw->Unbusy; return (0); } #load group header db if (-e "$group.grp") { tie %file, 'MLDBM', "$group.grp", O_CREAT|O_RDWR, '0640' or error('MLDBM', 'DIE',); } else { ready(); $mw->Unbusy; return (0); } my $tmp = $file{HEADERDB}; #delete selected messages from screen and group header db foreach my $msgnum (@sel) { $lb2_msg->hide('entry', $msgnum); delete $tmp->{$msgnum}; } $file{HEADERDB} = $tmp; $lb2_msg->selectionClear; $mw->update; untie %file; ready(); return (1); } sub read_message #---------------------------------------------------- { #called from a button pressed in the main window or the rc menu my (@sel, $group,); $mw->Busy(-recurse => 1,); update_status('Connecting to server...'); #determine which group @sel = $lb1_grp->selectionGet; eval { $group = $lb1_grp->itemCget($sel[0], 0, -text) }; if ($@) { warn "Error - No valid group selected for message read.\n"; ready(); return (0); } #determine which article @sel = $lb2_msg->selectionGet; $lb2_msg->focus; if (! $group || ! $sel[0]) { ready(); return (0); } else { #Connect to server my ($nntpRef, $msg,); $nntpRef = nntpconnect(); if (! $nntpRef) { warn "Retrying connection...\n"; $nntpRef = nntpconnect(); if (! $nntpRef) { warn "Error - Unable to connect to server, try again\n"; ready(); return (0); } } #download message update_status('Downloading message...'); #launch thread, download article #<-test $shash{1}{optionCSV} = $group . ',1,' . $sel[0]; $shash{1}{article} = 1; update_status('Downloading message'); while ($shash{1}{article} == 1) { #wait for the thread, update gui if ($pb >= 100) { $pb = 0; } else { $pb += .01; } $mw->update; } #check return, read and display downloaded message file my $treturn = $shash{1}{return}; if ($treturn) { #read message header and determine encoding (max 128 lines) my ($headerLineCount, $blankLineAt, $encoding, $qp,); open (FH, '<', 'part1.pt') || warn "Can't open part1.pt\n$!"; while (my $l = ()) { #determine if we are still in the header $headerLineCount++; if ($l =~ m/^$/) { #this line is blank $blankLineAt = $headerLineCount; if ($blankLineAt = $headerLineCount - 1) { #the last line was blank also (indicates end of header) last; } } #determine encoding used for this message if ($l =~ m/Content-Transfer-Encoding:\s+(.+)/) { #record specified encoding $encoding = $1; if ($encoding eq 'quoted-printable') { $qp = 1; } last; } elsif ($headerLineCount > 128) { #extra long header? (sanity check) last; } } if (!defined $encoding) { $encoding = 'UNKNOWN'; } warn "DEBUG - $encoding encoding detected\n"; close FH || warn "Can't close part1.pt"; #read message open (FH, '<', 'part1.pt') || warn "Can't open part1.pt\n$!"; while (my $l = ()) { #check if quoted printable encoding was detected if ($qp) { #decode quoted printable #The following is borrowed from the module #MIME::QuotedPrint::Perl created by: Gisle Aas $l =~ s/\r\n/\n/g; # normalize newlines $l =~ s/[ \t]+\n/\n/g; # rule #3 (trailing space deleted) $l =~ s/=\n//g; # rule #5 (soft line breaks) if (ord('A') == 193) { # EBCDIC style machine if (ord('[') == 173) { $l =~ s/=([\da-fA-F]{2})/Encode::encode('cp1047', Encode::decode('iso-8859-1',pack("C", hex($1))))/gex; } elsif (ord('[') == 187) { $l =~ s/=([\da-fA-F]{2})/Encode::encode('posix-bc', Encode::decode('iso-8859-1',pack("C", hex($1))))/gex; } elsif (ord('[') == 186) { $l =~ s/=([\da-fA-F]{2})/Encode::encode('cp37', Encode::decode('iso-8859-1',pack("C", hex($1))))/gex; } } else { # ASCII style machine $l =~ s/=([\da-fA-F]{2})/pack("C", hex($1))/ge; } } elsif ($l =~ s/[A-F]\<(.*)\>/$1/) { #handle (remove for now) odd 'tin-like' formatting tags <-todo } #display message $txt_read->insert('end', $l); $mw->update; } close FH || warn "Can't close part1.pt"; } else { #error downloading message update_status('Could not download article from server'); warn "Could not download the article\n"; $mw->update; $mw->after(1000); ready(); return (0); } } #mark message as read, load and update group header db, update gui { my ($tmp, %file, $imagedata, $chek,); tie %file, 'MLDBM', "$group.grp", O_CREAT|O_RDWR, '0640' or error('MLDBM', 'DIE',); $tmp = $file{HEADERDB}; $tmp->{$sel[0]}[7] = 'read'; $file{HEADERDB} = $tmp; untie %file; $txt_read->focus; $tl4->update; $tl4->deiconify(); $tl4->raise(); $mw->update; $imagedata = load_image(2); $chek = $mw->Photo( -format => 'bmp', -data => $imagedata ); undef $imagedata; $lb2_msg->indicator('create', $sel[0], -itemtype => 'image', -image => $chek ); } ready(); return (1); } sub read_close #------------------------------------------------------ { #called from a button pressed in the read window $txt_read->delete("1.0", 'end'); $tl4->withdraw; $tl4->configure(-title => 'Read Message'); $mw->update; return (1); } sub read_reply #------------------------------------------------------ { #called from a button pressed in the read window my($c, $txt, @tmp, $refs, $mid, $subj); $mw->Busy(-recurse => 1); #read message $txt = $txt_read->get('1.0', 'end'); @tmp = split('\n', $txt); undef $txt; $txt_read->delete("1.0", 'end'); $tl4->withdraw; dbmopen(my %OPT, 'settings', '0640') || die "Cannot create settings.\n$!"; my $QSig = $OPT{QSig}; dbmclose %OPT; #process header, and quote message $c = 0; foreach my $line (@tmp) { #look for blank lines (delimits header) unless ($line =~ m/(.+)/) { $c++; } if ($c >= 1) { #found blank lines, start quoting everything from here if ($line =~ m/^--\s*$/) { #found signature if ($QSig) { $txt .= '> '.$line."\n"; } else { last; } } else { #quote message line $txt .= '> '.$line."\n"; } } else { #process header if ($line =~ m/^References:\s+(.+)/) { $refs = $1; #warn "gotref, refs is $refs\n"; } elsif ($line =~ m/^Message-ID:\s+(.+)/) { $mid = $1; #warn "gotmid, mid is $mid\n"; } elsif ($line =~ m/^Subject:\s+(.+)/) { my $a = $1; if ($a =~ m/[Rr][Ee]:.*/) { $subj = $a; } else { $subj = "Re: $a"; } #warn "gotsubj, subj is $subj\n"; } } } if ($mid) { $refs .= $mid }; #save references, so the send function can craft the header dbmopen(%OPT, 'settings', '0640') || die "Cannot create settings.\n$!"; $OPT{Refs} = $refs; $post_entries[0]->delete('0', 'end'); $post_entries[1]->delete('0', 'end'); $post_entries[0]->insert('end', $OPT{Mail}); $post_entries[1]->insert('end', $subj); dbmclose %OPT; #populate then display the reply window my $typed; my @sel = $lb2_msg->selectionGet; $typed = $lb2_msg->itemCget($sel[0], 1, -text); $typed .= " wrote in message-id: $mid\n"; $txt_post->insert('end', "$typed\n"); $txt_post->insert('end', "$txt"); $mw->Unbusy; post(); return (1); } sub post #------------------------------------------------------------ { #called from a main button, rc menu, or read_reply my($from,); my @sel = $lb1_grp->selectionGet; my $group; eval { $group = $lb1_grp->itemCget($sel[0], 0, -text) }; if ($@) { warn "Error - No valid group selected for message post.\n"; return (0); } { dbmopen(my %OPT, 'settings', '0640') || die "Cannot read settings.\n$!"; $from = $OPT{Mail}; dbmclose %OPT } $post_entries[0]->delete('0', 'end'); $post_entries[0]->insert('end', $from); $tl2->deiconify(); $tl2->raise(); $txt_post->focus; $mw->update; return (1); } sub post_post #------------------------------------------------------- { #called from a button pressed in the post window or sub post_attach my $atch = $_[0] || 0; my $cur = $_[1] || 1; my $tot = $_[2] || 1; my $filename = $_[3] || ' '; my (@sel, $msg, $hdr, $bdy, $subj, $from, $refs, $sign, $group,); #determine group @sel = $lb1_grp->selectionGet; eval { $group = $lb1_grp->itemCget($sel[0], 0, -text) }; if ($@) { warn "Error - No valid group selected for posting to.\n"; return (0); } $mw->update; $mw->Busy(-recurse => 1,); update_status('Formatting message...'); for (1..4) { $pb++; $mw->update; } #gather message information, update subject header #subject should not contain (#/#), it should look like below #[Comment1] "filename" yEnc (partnum/numparts) [size] [Comment2] $subj = $post_entries[1]->get(); $from = $post_entries[0]->get(); $subj =~ s/\(\d+\/\d+\)//g; { dbmopen(my %OPT, 'settings', '0640') || die "Cannot read settings.\n$!"; unless ($sign) { $sign = 0; } unless ($subj) { $subj = 'No Subject'; } unless ($OPT{Refs}) { $OPT{Refs} = 0; } if ($atch) { $subj .= ' "'.$filename.'" '. "yEnc ($cur/$tot)"; } $refs = $OPT{Refs}; $sign = $OPT{Sig}; $OPT{Refs} = 0; #<-test dbmclose %OPT; } #create header if ($refs) { $hdr = 'From: '."$from\n". 'Newsgroups: '."$group\n". 'Distribution: '."world\n". 'References: '."$refs\n". 'X-NNTPclient: '."NewsSurfer v3.01\n". 'X-CreatedBy: '." Just another Perl hacker, \n". 'Subject: '."$subj\n\n"; } else { $hdr = 'From: '."$from\n". 'Newsgroups: '."$group\n". 'Distribution: '."world\n". 'X-NNTPclient: '."NewsSurfer v3.01\n". 'X-CreatedBy: '." Just another Perl hacker, \n". 'Subject: '."$subj\n\n"; } $msg = $hdr."\n"; #attach body and signature to first article only if ($cur == 1) { $bdy = $txt_post->get("1.0", 'end'); if ($sign) { #attach signature to body my (@sig,); if (open ('FH', '<', $sign)) { @sig = (); close FH; $bdy .= "\n--\n"; #'four lines after the double dash space' foreach my $line (@sig) { chomp $line; $bdy .= "$line\n"; } } else { error('sig1') } } $msg .= $bdy."\n"; } if ($atch) { #attach file part to article $msg .= $atch."\n"; } #connect, post message, and disconnect update_status('Posting message...'); for (1..4) { $pb += 4; $mw->update; } my $nntpRef = nntpconnect(); if($nntpRef) { my $bool = $$nntpRef->post([$msg]); #<-blocks unless ($bool) { warn "Error - Unable to post message, could not post.\n"; } } else { warn "Error - Unable to post message, could not connect\n"; } $$nntpRef->quit; #finish up ready(); if ($cur == $tot) { post_cancel(); } return (1); } sub post_yenc #------------------------------------------------------- { my $aref = $_[0] || return (0); my (@in, @out, $linesize,); update_status('Encoding attachment...'); for (1..4) { $pb++; $mw->update; } @in = @$aref; undef $aref; $linesize = 0; while (defined(my $byte = shift @in)) { my $yenc = ($byte + 42) % 256; if ($linesize >= 128) { #enforce line size, insert a CRLF pair push @out, 0x0D; push @out, 0x0A; $linesize = 0; } if ($linesize == 0 || $linesize == 127) { #escape a tab or space in the first or last column of a line if ($yenc == 0x09 || $yenc == 0x20) { $yenc = ( $byte + 64 ) % 256; push @out, 0x3D; push @out, $yenc; $linesize += 2; next; } } if ($yenc==0x00 || $yenc==0x0A || $yenc==0x0D || $yenc==0x3D ){ #found a critical character, escape it with 0x3D (=) push @out, 0x3D; $yenc = ( $byte + 64 ) % 256; $linesize++; } push @out, $yenc; $linesize++; } my $ydata = join '', map { chr $_ } @out; return ($ydata); } sub post_attachandpost #---------------------------------------------- { #called from a button pressed in the post window my $file = $mw->getOpenFile(); $mw->Busy(-recurse => 1); if (defined $file) { #Open the file, or return early unless (open ('ATCH', '< :raw', $file)) { error('post_atch_1'); return (0); } #deterimine filename and remove leading and trailing whitespace update_status('Creating attachment...'); for (1..4) { $pb += 4; $mw->update; } my $file_name = $file; $file_name =~ s/ .*\/ #0 or more of anything until foward slash (.+) #capture 1 or more of anything /$1 #replace those with capture variable 1 /x; $file_name =~ s/ ^\s+ #remove any space at the beginning //x; $file_name =~ s/ \s+$ #remove any space at the end //x; #truncate filenames longer than 254 characters my $file_name_len = length $file_name; if ($file_name_len >= 255) { for (255..$file_name_len) { chop $file_name; } } #how large is the file in bytes my($file_bytes, $file_kbytes,); $file_bytes = -s $file; #Split files that are larger than the posting limit (400k) <-research if ($file_bytes > 409600) { #how many parts will this be? my($totalparts, $currentpart,); $totalparts = 1 + (int($file_bytes / 409600)); #read 400k chunks of the file into a string $currentpart = 1; while (my $size = read(ATCH, my $buf, 409600)) { #yEncode data my @data = map { ord $_ } split(//, $buf); my $ydata = post_yenc(\@data); my $begin = 1 + (($currentpart * 409600) - 409600); my $end; if ($size == 409600) { $end = $currentpart * $size; } else { $end = (($currentpart - 1) * 409600) + $size; } #Encapsulate data in yENC headers my $crlf = "\015\012"; my $yhead = "=ybegin ". "part=$currentpart ". "total=$totalparts ". "line=128 ". "size=$file_bytes ". "name=$file_name"; my $ypart = "=ypart ". "begin=$begin ". "end=$end"; my $ytail = "=yend ". "size=$size ". "part=$currentpart"; my $atch = $crlf.$yhead.$crlf.$ypart. $crlf.$ydata.$crlf.$ytail.$crlf; #Send the message my $ret = post_post( $atch, $currentpart, $totalparts, $file_name ); if ($ret) { $currentpart++; } else { warn "Error - Unable to attach file\n"; last; } $mw->update; } close ATCH; } else { #Create single part message attachement my $line; while () { $line .= $_; } close ATCH; #yEncode data my @data = map { ord $_ } split(//, $line); my $ydata = post_yenc(\@data); #Encapsulate data in yENC headers my $crlf = "\015\012"; my $yhead = "=ybegin ". "line=128 ". "size=$file_bytes ". "name=$file_name"; my $ytail = "=yend ". "size=$file_bytes"; my $atch = $crlf.$yhead.$crlf.$ydata.$crlf.$ytail.$crlf; #send the message my $ret = post_post($atch, 1, 1, $file_name); unless ($ret) { warn "Error - Unable to attach file\n"; } } } else { warn "Warning - No file selected for attachment\n"; } $mw->Unbusy; return (1); } sub post_cancel #----------------------------------------------------- { #called from a button pressed in the post window $txt_post->delete('1.0', 'end'); $tl2->Unbusy; $tl2->withdraw(); $mw->update; return (1); } sub browse #---------------------------------------------------------- { #called from a button pressed in the main window <-test $mw->Busy(-recurse => 1); dbmopen(my %OPT, 'settings', '0640') || die "Cannot create settings.\n$!"; if ($^O eq 'MSWin32') { my ($dir,); $dir = $OPT{DDir}; $dir =~ s/ \/ #swap foward slash for a backslash /\\/xg; system('explorer.exe', $dir); } else { system('ls', $OPT{DDir}); } dbmclose %OPT; $mw->Unbusy; $mw->update; return (1); } sub rset_cmd #-------------------------------------------------------- { #called from the rc menu my ($sel, $rem,); $mw->Busy(-recurse => 1); $sel = $lb1_grp->selectionGet; $rem = $lb1_grp->itemCget($sel, 0, -text); unless ($sel && $rem) { warn "Warning - No valid groups selected for reset.\n"; return (0); } $lb2_msg->delete('all'); if (-e "$rem.grp") { unless (unlink "$rem.grp") { error('rset_1'); return (0); } } dbmopen(my %SBSCRIBE, 'sbscribe', '0640') || die "Cannot create sbscribe.\a\n$!"; $SBSCRIBE{$rem} = 'Never'; dbmclose %SBSCRIBE; $mw->after(500); display_groups(); $mw->Unbusy; return (1); } sub group #----------------------------------------------------------- { #called from a button pressed in the main window my($lb_grp_s1, $imagedata, $chek,); $mw->Busy(-recurse => 1); $tl3->Popup; $lb_grp->focus; foreach my $b (@buttons) { $b->configure(-state => 'disabled'); } $mw->Unbusy; $mw->update; return (1); } sub grp_search #------------------------------------------------------ { search($lb_grp, 'GROUP'); return (1); } sub grp_shownewsgroups #---------------------------------------------- { my $opt1 = uc ($_[0]) || 'ALL'; my($chek, $lb_grp_s1,); $mw->Busy(-recurse => 1,); update_status('Loading groups...'); { my $imagedata = load_image(3); $chek = $mw->Photo(-format => 'bmp', -data => $imagedata); for (1..4) { $pb++; $mw->update; } undef $imagedata; } $lb_grp_s1 = $lb_grp->ItemStyle( 'text', -selectforeground => '#000000', -selectbackground => '#fff000', -bg => '#000000', -fg => '#ffffff', -font => '{Arial} 8', -anchor => 'w', ); $lb_grp->delete('all'); $mw->update; if (-e 'groups') { my(%groups, $counter, $c,); tie %groups, 'MLDBM', 'groups', O_CREAT|O_RDWR, '0640' or die $!; dbmopen(my %SBSCRIBE, 'sbscribe', '0640') || die "Cannot create sbscribe.\n$!"; $counter = $c = 0; foreach my $k (sort(keys(%groups))) { my $found; if ($opt1 eq 'SEARCH') { #search action specified if ($k =~ m/$grpSubSearch/) { $found++; } } if ($opt1 eq 'SEARCH' && !defined $found) { #item does not match search next; } else { #display the item my $v = $groups{$k}; $lb_grp->add($counter); $lb_grp->itemCreate($counter, 0, -text => $k, -style => $lb_grp_s1 ); $lb_grp->itemCreate($counter, 1, -text => $v, -style => $lb_grp_s1 ); if ($SBSCRIBE{$k}) { $lb_grp->indicator('create', $counter, -itemtype => 'image', -image => $chek ); } } if ($pb >= 100) { $pb = 0; $mw->update; } if ($c > 1000) { for (1..5) { $pb++; $mw->update; } $c = 0; } else { $c++; } $counter++; } untie %groups; dbmclose %SBSCRIBE; } else { $lb_grp->add(0); $lb_grp->itemCreate(0,0, -text => 'Press the Update button to retrieve groups '. 'from server.' ); } ready(); return (1); } sub grp_update #------------------------------------------------------ { #called from a button pressed in the group window $tl3->Busy(-recurse => 1,); update_status('Downloading groups...'); $lb_grp->delete('all'); $pb++; $mw->update; $shash{1}{list} = 1; while ($shash{1}{list} == 1) { if ($pb >= 100) { $pb = 0; } else { $pb++; } $mw->after(100); $mw->update; } $tl3->Unbusy; grp_close(); group(); grp_shownewsgroups(); ready(); return (1); } sub grp_subscribe #--------------------------------------------------- { #called from a button pressed in the group window my ($imagedata, $chek, @sel,); $imagedata = load_image(3); $chek = $mw->Photo( -format => 'bmp', -data => $imagedata ); undef $imagedata; dbmopen(my %SBSCRIBE, 'sbscribe', '0640') || die "Cannot create sbscribe.\a\n$!"; @sel = $lb_grp->selectionGet; foreach (@sel) { my $a = $lb_grp->itemCget($_, 0, -text); $lb_grp->indicator('create', $_, -itemtype => 'image', -image => $chek ); $SBSCRIBE{$a} = 'Never'; } dbmclose %SBSCRIBE; display_groups(); return (1); } sub grp_unsubscribe #------------------------------------------------- { #called from a button pressed in the group or main window my $opt = $_[0]; dbmopen(my %SBSCRIBE, 'sbscribe', '0640') || die "Cannot create sbscribe.\a\n$!"; if ($opt) { #unsubscribe from main screen my($sel, $a,); $sel = $lb1_grp->selectionGet; unless ($sel) { warn "Warning - No valid group selected to remove.\n"; return (0); } $a = $lb1_grp->itemCget($sel, 0, -text); warn "Warning - Removing newsgroup: [$a.grp].\n"; delete $SBSCRIBE{$a}; if (-e "$a.grp") { unlink "$a.grp" || error('grp_unsub_1', "$a"); } $lb2_msg->delete('all'); } else { #unsubscribe from groups screen my (@sel,); @sel = $lb_grp->selectionGet; unless (@sel) { warn "Warning - No valid group selected to remove.\n"; return (0); } foreach (@sel) { my $a = $lb_grp->itemCget($_, 0, -text); $lb_grp->indicator('delete', $_,); warn "Warning - Removing newsgroup: [$a.grp].\n"; delete $SBSCRIBE{$a}; if (-e "$a.grp") { unlink "$a.grp" || error('grp_unsub_1', "$a"); } } } dbmclose %SBSCRIBE; display_groups(); return (1); } sub grp_close #------------------------------------------------------- { #called from a button pressed in the group window $mw->Busy(-recurse => 1); $mw->update; $lb_grp->delete('all'); $tl3->withdraw; foreach my $b (@buttons) { $b->configure(-state => 'normal',); } $mw->update; $mw->Unbusy; return (1); } sub display_groups #-------------------------------------------------- { #called from subs: group_subscribe, group_unsubscribe my ($lb1_k1, $lb1_k2,); $lb1_grp->delete('all'); $lb1_k1 = $lb1_grp->ItemStyle('text', -anchor => 'w', -selectforeground => '#fff000', -background => '#ffffff', -foreground => '#000000', -font => '{Arial} 8', ); $lb1_k2 = $lb1_grp->ItemStyle('text', -anchor => 'e', -selectforeground => '#fff000', -background => '#ffffff', -foreground => '#000000', -font => '{Arial} 8', ); my $counter = 1; dbmopen(my %SBSCRIBE, 'sbscribe', '0640') || die "Cannot create sbscribe.\n$!"; for my $k (sort keys %SBSCRIBE) { $lb1_grp->add($counter); $lb1_grp->itemCreate($counter, 0, -text => "$k", -style => $lb1_k1, ); $lb1_grp->itemCreate($counter, 1, -text => "$SBSCRIBE{$k}", -style => $lb1_k2, ); $counter++; } dbmclose %SBSCRIBE; return (1); } sub search_popup #---------------------------------------------------- { #called from rc menu my ($group, @sel,); #make sure the group clicked has been loaded or scanned. @sel = $lb1_grp->selectionGet; eval { $group = $lb1_grp->itemCget($sel[0], 0, -text) }; if ($@) { print STDERR 'No valid group selected to search.'. "\nEval: $@\n"; } #raise popup $tla->Popup; $tla->focus; $mw->update; return (1); } sub search #---------------------------------------------------------- { #works for HLists only #called from button pressed in group window or search_popup window #Todo - add search within results option #<--Todo my $w = $_[0] || return (0); my $opt1 = uc ($_[1]) || 0; my $opt2 = $_[2] || 0; my (@paths, $c,); #show all requested if ($opt1 eq 'GROUP' && $opt2 == 1) { #show all available newsgroups grp_shownewsgroups('ALL'); return (1); } #start searching $w->focus; $mw->Busy(-recurse => 1,); update_status('Searching groups...'); $mw->update; if (defined $grpSubSearch) { #escape any regex metachars found within search string #$grpSubSearch = qr/$grpSubSearch/; $grpSubSearch =~ s/ ([\/\+\*\.\?\^\$]+) #quietly escape any regex metachars /\\$1/xg; } else { #Default search regex (all but newline regex metachar) $grpSubSearch = '.'; } for (1..4) { $pb++; $mw->update; } $tla->withdraw; $c = 0; @paths = $w->infoChildren; if ($paths[0]) { #Widget is populated, show only entries which match search term foreach my $path (@paths) { my $item = $w->itemCget($path, 0, -text); if ($item =~ m/$grpSubSearch/i) { $w->show('entry', $path); } else { $w->hide('entry', $path); } if ($c >= 1000) { if ($pb >= 100) { $pb = 0; } else { $pb++; } $c = 0; $mw->update; next; } $c++; } } else { #searching an empty widget, see if it is the groups window if ($opt1 eq 'GROUP') { #call a more specific search subroutine grp_shownewsgroups('SEARCH'); } } ready(); return (1); } sub opt #------------------------------------------------------------- { #called from button pressed in the main window dbmopen(my %OPT, 'settings', '0640') || die "Cannot create settings.\n$!"; my $c = 0; foreach my $k qw(Serv User Pass Mail DDir Sig) { $OPT_widgets[$c]->delete(0, 'end'); $OPT_widgets[$c]->insert('end', $OPT{$k}); $mw->update; $c++ } if ($OPT{QSig}) { $OPT_widgets[$c]->select; } dbmclose %OPT; $tl5->Popup; $tl5->focus; $mw->update; return (1); } sub opt_close #------------------------------------------------------- { #called from button pressed in the option window my($serv, $user, $pass, $email, $ddir, $sig,); dbmopen(my %OPT, 'settings', '0640') || die "Cannot create settings.\n$!"; $serv = $OPT_widgets[0]->get(); $user = $OPT_widgets[1]->get(); $pass = $OPT_widgets[2]->get(); $email = $OPT_widgets[3]->get(); $ddir = $OPT_widgets[4]->get(); $sig = $OPT_widgets[5]->get(); $OPT{Serv} = $serv; $OPT{User} = $user; $OPT{Pass} = $pass; $OPT{Mail} = $email; $OPT{DDir} = $ddir; $OPT{Sig} = $sig; $OPT{QSig} = $quoteSig; dbmclose %OPT; $tl5->withdraw; $mw->update; return (1); } sub opt_download #---------------------------------------------------- { #called from button pressed in the option window my ($dir,); $OPT_widgets[4]->delete(0, 'end'); eval { $dir = $tl5->chooseDirectory( -title => 'Choose a download directory.', -initialdir => '.', -mustexist => 1, ) }; if ($@) { #error error('conf_browse1'); } else { if ($dir) { #user defined directory $OPT_widgets[4]->insert('end', "$dir"); } else { #default directory $OPT_widgets[4]->insert('end', "."); } } $mw->update; return (1); } sub opt_signature #--------------------------------------------------- { #called from button pressed in the option window my ($sig, $ofile,); $OPT_widgets[5]->delete(0, 'end'); $ofile = $tl5->getOpenFile( -title => 'Choose Signature File', -initialdir => '.', ); if ($ofile) { $OPT_widgets[5]->insert('end', "$ofile"); $mw->update; return (1); } return (0); } sub show_log #-------------------------------------------------------- { #called from button pressed in the main window my (@log,); $tl1->deiconify(); $tl1->raise(); $txt_log->focus; $txt_log->delete('1.0', 'end'); $mw->update; $mw->Busy(-recurse => 1); close STDERR; open ('FH', '<', 'NewsSurfer.log') || warn "Error - Cannot open NewsSurfer.log\n$!"; @log = (); close FH; open STDERR, '>>', 'NewsSurfer.log' || warn "Error - Cannot open NewsSurfer.log\n$!"; foreach my $line (@log) { chomp $line; unless (defined $line) { $line = '#'; } $line =~ s/ ^Net #the word 'Net' at the beginning of the string .*\) #followed by everything up to a right parenthesis (<|>.*) #capture left or right bracket followed by anything #replace those with capture 1 /$1/x; if ($line =~ m/ ^>>>.* #three right brackets followed by anything /x) { $txt_log->insert('end', $line . "\n", 'Blue'); } elsif ($line =~ m/ ^Error #the word 'error' at the beginning of the string \s* #followed by some optional whitespace -.+ #followed by a dash and 1 or more of anything /xi) { $txt_log->insert('end', $line . "\n", 'Red'); } elsif ($line =~ m/ ^Warning #the word 'warning' at the beginning of the string \s* #followed by some optional whitespace -.+ #followed by a dash and 1 or more of anything /xi) { $txt_log->insert('end', $line . "\n", 'Yellow'); } else { $txt_log->insert('end', $line . "\n"); } $mw->update; } $mw->Unbusy; return (1); } sub log_close #------------------------------------------------------- { #called from button pressed in the log window $tl1->withdraw; $mw->update; return (1); } sub log_save #-------------------------------------------------------- { #called from button pressed in the log window my (@log, $sf,); $sf = $tl1->getSaveFile(-title => 'Save Log',); if ($sf) { warn "Warning - A logfile has been saved.\n"; $mw->Busy(-recurse => 1); open ('FH', '<', 'NewsSurfer.log') || warn "Error - Cannot open NewsSurfer.log\n"; @log = (); close FH; open ('FH', '>', $sf) || warn "Error - Can not save log.\n$!"; foreach my $line (@log) { chomp $line; print FH "$line\n"; } close FH; $mw->Unbusy; return (1); } } sub help #------------------------------------------------------------ { #called from button pressed in the main window $tl6->Popup; $txt_help->focus; $txt_help->delete("1.0", 'end'); $txt_help->insert('end', 'NewsSurfer can download binaries and read messages on '. "usenet newsgroups.\n". "You can use NewsSurfer to post messages and atachments.\n" ); $mw->update; return (1); } sub help_about #------------------------------------------------------ { #called from button pressed in the help window my($pod,); $pod = $mw->Pod(-tree => 0,); $pod->configure(-file => $0); return (1); } sub help_close #------------------------------------------------------ { #called from button pressed in the help window $tl6->withdraw; $mw->update; return (1); } sub quit #------------------------------------------------------------ { #called from button pressed in the main window $mw->Busy(-recurse => 1,); $mw->update; warn 'NewsSurfer has closed. (' . localtime() . ")\n"; $mw->destroy; return (1); } sub raise_rc_menu #--------------------------------------------------- { #called from right-clicking in the main window my $toplevelwidget = $_[0] || 'NULL'; #required my $listbox = $_[1]; #optional my($x, $y) = $mw->pointerxy; my $height; $mw->Busy(-recurse => 1,); if ($listbox && Exists($listbox) && Exists($toplevelwidget)) { #a listbox was supplied my($selected,); #verify widget is a listbox eval { $selected = $listbox->nearest($y - $listbox->rooty) }; if (! $@) { #it's a listbox, make selection at xy if there is a entry if ($selected) { $listbox->selectionClear(); $listbox->selectionSet($selected); } } $height = $toplevelwidget->height; $y -= $height; } if (Exists($toplevelwidget)) { $toplevelwidget->geometry('+'."$x".'+'."$y"); $toplevelwidget->deiconify(); $toplevelwidget->raise(); $toplevelwidget->focus(); $mw->update; } $mw->Unbusy; return (1); } sub lb2_msg_select_all #---------------------------------------------- { #called from the rc menu or key binding my (@paths, $count, $home, $end,); $mw->Busy(-recurse => 1); @paths = $lb2_msg->infoChildren; if (@paths) { $count = $#paths; $home = $paths[0]; $end = $paths[$count]; $lb2_msg->focus; $lb2_msg->selectionSet("$home", "$end"); } $mw->update; $mw->Unbusy; return (1); } sub lb2_msg_select_end #---------------------------------------------- { #called from the rc menu or key binding my ($sel, @paths, $count, $end,); $sel = $lb2_msg->selectionGet; @paths = $lb2_msg->infoChildren; $count = $#paths; $end = $paths[$count]; $lb2_msg->selectionSet($sel, "$end"); $mw->update; return (1); } sub lb2_msg_select_hom #---------------------------------------------- { #called from the rc menu or key binding my ($sel, @paths, $home,); $sel = $lb2_msg->selectionGet; @paths = $lb2_msg->infoChildren; $home = $paths[0]; $lb2_msg->selectionSet($sel, "$home"); $mw->update; return (1); } sub FlashButton #----------------------------------------------------- { #called during widget creation my $w = $_[0]; my $c1 = $_[1]; my $c2 = $_[2]; unless($w and $c1 and $c2) { return (0); } $w->bind('' => sub { $w->configure(-relief => 'flat',); $w->configure(-fg => $c1); $w->flash; $w->flash; $w->configure(-fg => $c2); }); return (1); } sub MainButtons #----------------------------------------------------- { #called during widget creation my $w = $_[0]; my $o1 = $_[1]; my ($id1, $id2, $i1, $i2, $i3,); my $o2 = $o1.'1'; $id1 = load_image($o1); $id2 = load_image($o2); $i1 = $mw->Photo( -data => $id1, -format => 'bmp', -palette => '256', ); $i2 = $mw->Photo( -data => $id1, -format => 'bmp', -palette => '64/64/64', ); $i3 = $mw->Photo( -data => $id2, -format => 'bmp', ); undef $id1; undef $id2; my $width = $mw->screenwidth; if ($width > 800) { $i1->copy($i1, -zoom => 1.9,1,); $i2->copy($i2, -zoom => 1.9,1,); $i3->copy($i3, -zoom => 1.9,1,); } $w->configure(-relief => 'flat', -image => $i1); $w->bind('' => sub { $w->configure(-image => $i1); }); $w->bind('' => sub { $w->configure(-image => $i2); }); $w->bind('' => sub { $w->configure( -relief => 'flat', -image => $i3 ); }); $w->bind('' => sub { $w->configure( -relief => 'flat', -image => $i1 ); }); $mw->update; return (1); } sub ready #----------------------------------------------------------- { while ($pb > 100) { $pb++; if ($pb % 2) { $mw->update }; } $pb = 0; update_status('Ready'); $mw->Unbusy; $mw->update; return (1); } sub error #----------------------------------------------------------- { #called from various subroutines my $error = $_[0] || 'NULL'; my $opt1 = $_[1] || 0; my(@sel, $group,); my $msg = "\nError - "; @sel = $lb1_grp->selectionGet; eval { $group = $lb1_grp->itemCget($sel[0], 0, -text) }; if ($@) { warn "Error - No valid group selected.\n"; } $mw->Busy(-recurse => 1); if ($error eq 'connect') { $msg .= "Could not connect, try again.\n"; } elsif ($error =~ m/ ^grab.* #'grab' followed by anything at the beginning of string /xig) { if ($error eq 'grab_1') { $msg .= "Cannot open $group.dat\n$!"; } elsif ($error eq 'grab_2a') { $msg .= "Cant decode attachment.\n"."File already exists.\n"; } elsif ($error eq 'grab_2b') { $msg .= "Cant decode attachment. Decoder error.\n$!"; } elsif ($error eq 'grab_3') { $msg .= "Cannot open $group.grp\n$!"; } elsif ($error eq 'grab_4') { $msg .= "Error downloading article from server\n$!"; } elsif ($error eq 'grab_4a') { $msg .= "Article does not exist on server\n$!"; } } elsif ($error =~ m/ ^scan.* #'scan' followed by anything at the beginning of string /xig) { if ($error eq 'scan_1') { $msg .= "Must select a group to scan.\n"; } elsif ($error eq 'scan_2') { $msg .= "Cannot open $group.grp\n$!"; } elsif ($error eq 'scan_3') { $msg .= "Cannot create $group.grp\n$!"; } } elsif ($error =~ m/ ^grp.* #'grp' followed by anything at the beginning of string /xig) { if ($error eq 'grp_1') { $msg .= "Cannot open groups.\n$!"; } elsif ($error eq 'grp_update_1') { $msg .= "Can't create local groups.\n$!"; } elsif ($error eq 'grp_unsub_1') { $msg .= "Unable to delete $_[1].grp\n$!"; } elsif ($error eq 'grp_unsub_2') { $msg .= "Unable to delete $_[1].dat\n$!"; } elsif ($error eq 'grp_search_1') { $msg .= "Must enter a search term.\n"; } } elsif ($error =~ m/ ^post.* #'post' followed by anything at the beginning of string /xig) { if ($error eq 'post_1') { $msg .= "Must scan a group to post to.\n"; } elsif ($error eq 'post_atch_1') { $msg .= "Cannot open file\n$!"; } elsif ($error eq 'post_attach_tobig') { $msg .= "Can't post file attachments larger than 1Mb.\n"; } } else { if ($error eq 'login') { $msg .= "Cannot login\n$!"; } elsif ($error eq 'MLDBM') { $msg .= "Error opening .grp database file\n$!"; } elsif ($error eq 'conf_browse1') { $msg .= 'Manually enter path or upgrade perl/Tk.'; } elsif ($error eq 'msg_del_1') { $msg .= "Cannot open $group.grp\n$!"; } elsif ($error eq 'read_1') { $msg .= "Cannot open $group.grp\n$!"; } elsif ($error eq 'rset_1') { $msg .= "Unable to delete file.\n$!"; } elsif ($error eq 'sort_1') { $msg .= "Cannot open $group.grp\n$!"; } elsif ($error eq 'sig1') { $msg .= "Can't load signature.\n$!"; } } #display error chomp ($msg); warn "$msg\n"; update_status($msg); $mw->after(2000); #check if die was requested if ($opt1) { $mw->destroy; } else { ready(); return (1); } return (0); } sub update_status #---------------------------------------------------<-redo interface { #called from various subroutines #called with either a status message in $txt #or a number followed by PROGRESSBAR (triggers progressbar update) #or a word followed by PROGRESSBAR (triggers progress complete) my $txt = $_[0] || 'NULL'; my $opt = $_[1] || 'NULL'; if ($opt eq 'PROGRESSBAR') { if ($txt =~ m/(^\d+)/) { #update status of progressbar for (1..$1) { $pb++; $mw->update; $mw->after(64); } } else { #complete and reset the progress bar while ($pb < 100) { $pb++; $mw->update; } $pb = 0; } } elsif ($txt ne 'NULL' && $opt ne 'PROGRESSBAR') { $sb_lab->configure(-text => " $txt"); $mw->update; } else { warn "Error - update_status error\ntxt [$txt]\nopt [$opt]\n$!"; $mw->destroy; } return (1); } return (1); } #***********************************************************************END news_gui sub load_image #-------------------------------------------------------- { #called from various subroutines, returns imagedata my $opt = $_[0]; my $imagedata; if ($opt == 2) { $imagedata = 'Qk1YAgAAAAAAADYAAAAoAAAACgAAABEAAAABABgAAAAAAAAAAAASCwAAEgsAAA'. 'AAAAAAAAAA////////////////////////////////////////AAD4+Pj/////'. '//////////////////////////////8AAP////////////////////////////'. '39/f39/fj4+AAA////////////////////////////////////////AAD/////'. '///+/v7+/v79/f39/f3+/v7///////////8AAGZHumlKvUYvi4p0xotyzVhEkm'. 'BFp1w8sP38/v///wAAdlfK////////9fL79fP8+vj//fz/i3LN+vn9////AABm'. 'R7r49//4+/9JTFsXGCGvr7b///9sU7X////9/f8AAGZHuvHu/sPG1RYZKBobKx'. 'AQFGFedGFHrPz8/f79/wAAa0+6/Pv/Xl5mAAAIq6yyJygrAAASZE6i+/v9/v7/'. 'AAByWLv49f/R0NfLy9Dw8PStrrUHBhBRP4P///////8AAHNVv/v6/fXy+vj3/P'. 'Lv+vHv+RcSJgUDCO/v7////wAAgGTGeV3AlX3RhGjLi3LNi3LNdlrAIiElDQsT'. '7+/vAAD///3///7+/f/////////////9/fz39/clJyPQ0NAAAP////////////'. '///////////////////////////wAA/v7+////////////////////////+/v7'. '////+Pj5AAD////////+/v7+/v7+/v7////////////////7/PsAAAAA'; } elsif ($opt == 3) { $imagedata = 'Qk1YAgAAAAAAADYAAAAoAAAACgAAABEAAAABABgAAAAAAAAAAAASCwAAEgsAAA'. 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBwcAAAAA'. 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. 'ICAgICAgcHBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. 'AAARDSABAQEBAQEAAAAAAAANCRgAAAAAAAAAAGZHunZXymtQtmZHumlYmHNfqm'. 'tRsWxSsAgHDQAAAAAAdlfKAAAAAAAACg0ECgwDBQcAAgMAZke6HBYuAAAAAABm'. 'R7oHCAAHBAC2s6To595QUEkAAABtWKgZES0BAQAAAGZHug4RATw5Kunm1+Xk1O'. '/v656hi3JepREMHQAAAAAAa0+6AwQAoaGZ///3VFNN2NfU///taUy1GRIsAQEA'. 'AAByWLsHCgAjIx4qKiYODgpSUUr4+e9sUrQYESwAAAAAAHNVvwoJDg0KFRwUMB'. 'wYKBQTEdDO0/r89xAQEAAAAAAAbU69Zke6ZkytZ0uzaVSgZke6Zke63d7a8vTs'. 'EBAQAAAAAAIAAAEBAgAAAAAAAAAAAAACAgMICAja2NwvLy8AAAAAAAAAAAAAAA'. 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAABAQE'. 'AAAABwcGAAAAAAAAAAABAQEBAQEBAQEAAAAAAAAAAAAAAAAEAwQAAAAA'; } elsif ($opt == 10) { $imagedata = 'Qk2mDgAAAAAAADYAAAAoAAAAOAAAABYAAAABABgAAAAAAHAOAAAmDgAAJg4AAAAAAAAAAAAAoaGh oaGhoKCgoKCgoKCgnJyckJCQiIiIh4eHh4eHhYWFhYWFhISEhISEhISEg4ODg4ODg4ODg4ODgoKC goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg4ODg4ODg4ODhISEhISEhISEhYWFhYWFhoaGhoaG hoaGh4eHh4eHh4eHh4eHh4eHiIiIiIiIiIiIjIyMlJSUnp6eoaGhoaGhoaGhoaGhoaGhoaGhoaGh oKCgoKCgkpKSj4+Purq61NTU29vb2dnZ2tra2dnZ2NjY1tbW1tbW1dXV1dXV1dXV1NTU1NTU1NTU 09PT09PT09PT09PT09PT09PT09PT1NTU1dXV1dXV1dXV1tbW1tbW2NjY2dnZ2tra29vb3Nzc3Nzc 3Nzc3d3d3d3d3t7e3t7e39/f39/f39/f0dHRsrKyioqKlJSUoaGhoaGhoaGhoaGhoaGhoaGhoKCg jo6OoqKi6enp/Pz8+/v7+vr6+fn5+Pj49vb29fX19PT08/Pz8vLy8fHx8fHx8PDw7+/v7+/v7+/v 7+/v7+/v7u7u7+/v7+/v7+/v8PDw8PDw8fHx8vLy8/Pz9PT09fX19/f3+Pj4+fn5+vr6+/v7/Pz8 /f39/f39/v7+/v7+////////////////////5ubmoaGhjo6OoaGhoaGhoaGhoaGhoKCgkZGRoKCg +fn5/Pz8+/v7+vr6+fn5+Pj49vb29fX18/Pz8vLy8fHx8PDw7+/v7u7u7u7u7e3t7Ozs7Ozs7Ozs 7Ozs7Ozs7Ozs7Ozs7Ozs7u7u7u7u7+/v8PDw8fHx8vLy8/Pz9fX19/f3+Pj4+fn5+vr6+/v7/Pz8 /f39/v7+/v7+/v7+/////////////////////Pz8qqqqj4+PoaGhoaGhoaGhmZmZi4uL5+fn9vb2 9fX19PT08/Pz8vLy8fHx7+/v7e3t6+vr6urq6enp6Ojo5ubm5ubm5eXl5OTk5OTk5OTk5OTk5OTk 5OTk5OTk5OTk5OTk5eXl5ubm5ubm6Ojo6enp6urq7Ozs7u7u7+/v8fHx8/Pz9PT09fX19vb29/f3 9/f3+Pj4+Pj4+fn5+fn5+fn5+fn5+fn5+fn58/PznJyck5OToaGhoaGhjIyMxcXF7+/v7u7u7e3t 7Ozs6+vr6enp6Ojo5ubm5eXl4+Pj4eHh39/f3t7e3d3d3Nzc3Nzc29vb29vb2tra2tra2tra2tra 2tra2tra29vb3Nzc3d3d3d3d39/f4eHh4uLi4+Pj5eXl5+fn6Ojo6urq6+vr7e3t7u7u7u7u7+/v 8PDw8PDw8fHx8fHx8fHx8fHx8fHx8fHx8fHx4ODgh4eHn5+fnJycjo6O4uLi5eXl5OTk4+Pj4uLi 4eHh39/f3d3d29vb2dnZ2NjY1tbW1NTU09PT0tLS0dHR0NDQ0NDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/P z8/P0NDQ0dHR0tLS09PT1NTU1dXV19fX2dnZ2tra3Nzc3t7e4ODg4uLi4uLi4+Pj5OTk5eXl5ubm 5ubm5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fnp6enlZWVlJSUpKSk29vb2tra2dnZ2NjY19fX1dXV 09PT0tLS0NDQzs7OzMzMy8vLycnJyMjIx8fHxsbGxsbGxcXFxMTExMTExMTEw8PDw8PDxMTExMTE xcXFxsbGxsbGx8fHycnJysrKzMzMzc3Nz8/P0dHR09PT1dXV1tbW2NjY2dnZ2dnZ2tra29vb29vb 3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzcxMTEiYmJjIyMsrKyzs7Ozs7Ozc3NzMzMy8vLycnJyMjI xsbGxcXFw8PDwcHBv7+/vr6+vLy8vLy8u7u7urq6ubm5ubm5uLi4uLi4uLi4uLi4uLi4ubm5ubm5 u7u7vLy8vLy8vb29v7+/wMDAwsLCxMTExcXFx8fHycnJysrKzMzMzc3Nzs7Ozs7Oz8/Pz8/P0NDQ 0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQy8vLgoKChoaGt7e3wsLCwsLCwcHBwMDAv7+/v7+/vr6+vb29 vLy8u7u7uLi4t7e3tbW1vaem32Vf8kI48kI46lBH0Xp1sbGxsbGx1nNt7kk/8kI45VdOsrKy419W 8kI45lhP8kI4419XuLi48kI45GBYvb295WFZ8kI4wcHBwsLCw8PDxMTExMTExcXFxcXFxsbGxcXF xcXFxMTExMTExMTExMTExMTEwMDAgoKCg4ODs7OzuLi4t7e3tra2tra2urq6u7u7u7u7urq6ubm5 t7e3tbW1tLS0s7OzwpqX6FxTyY2JwZiW1Hp08FBGyIyI0IF78FBG1Hp0wJiW1Hp0wZiW8FBG3W9o xpSQ8FBG4WpitbW18FBG4mtjurq642tk8FBGvb29vr6+v7+/wMDAwcHBwcHBwcHBwsLCwsLCwMDA vLy8ubm5ubm5ubm5ubm5tra2goKCgoKCq6urrq6urq6urKyssrKyurq6u7u7urq6ubm5t7e3t7e3 tra2tLS0tLS0t66us7Ozs7Ozwp2b3Xhy8F5V0IiE4HNt8F5VsbGxsrKysrKyt62t7GRb6Glh0omF 8F5V4XRttra28F5V4nRuubm54nVv8F5VvLy8vb29vb29vr6+v7+/v7+/v7+/v7+/v7+/v7+/u7u7 srKyr6+vr6+vr6+vrKysgoKCg4ODoqKipqampqamp6entbW1vr6+vr6+vb29vLy8u7u7urq6urq6 ubm5uLi4t7e305SQ7XRt8HBo8HBo7XRtva2s3oaB8HBovq6tt7e3vq6ut7e3u7OyyqKf1JSR8HBo 4oJ8urq68HBo44N9vLy85IN+8HBov7+/v7+/wMDAwcHBwcHBwcHBwcHBwcHBwcHBwcHBwMDAs7Oz qKiop6enp6enpaWlgoKCh4eHmZmZoKCgoKCgp6envb29xMTExMTEw8PDw8PDwcHBwcHBwcHBwMDA wMDAybSy8oN974eB252a0qimwbu6vr6+yLSy74eB74eB5ZKN8oN9vr6+4paS5ZKN6I+J8oN93J6b wcHB8oN974eB5pOO8oN97IuGxMTExMTExcXFxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGurq6paWl oaGhoaGhn5+fgoKCjY2Nk5OToKCgoKCgrq6uysrKz8/Pzs7Ozs7Ozs7Ozc3NzMzMzMzMzMzMy8vL 08LB9JmT56ily8vLzcfH2ri20sHAysrK0MTD3bWy37Kv2Lu5y8vL08LB4LKw4LKw27m2zMzMzMzM 18C+1cPC18C/4bSx08jHz8/Pz8/Pz8/P0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQx8fHq6uroaGh oaGhn5+fgoKClZWVi4uLoKCgoKCgtLS01NTU2dnZ2dnZ2NjY2NjY19fX19fX19fX19fX1tbW1tbW 6MC99q6p9q6p9q6p9q6p3M7N1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fX19fX19fX19fX19fX 2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra0dHRr6+voaGhoaGh l5eXioqKnp6eg4ODnp6eoKCgsLCw2NjY4uLi4uLi4uLi4uLi4uLi4eHh4eHh4eHh4eHh4eHh4eHh 4t/f59nY59nY4eHh4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi 4uLi4uLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj0tLSq6uroaGhoaGhioqK l5eXoaGhkJCQkJCQoKCgqamp1tbW6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6urq6urq 6urq6urq6urq6urq6urq6urq6urq6urq6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr 6+vr6+vr6+vr7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs6+vry8vLpaWloaGhmZmZgYGBoKCg oaGhnZ2dgYGBmZmZoqKixsbG7u7u8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz 8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz 8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz9PT09PT09PT09PT09PT05+fnubm5oaGhnZ2dhYWFlZWVoaGhoaGh oaGhlJSUhYWFnZ2dsbGx4eHh+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6 +vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6 +vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr68/Pzzs7Op6ennp6eiIiIkZGRoaGhoaGhoaGhoaGh oaGhkJCQhISEmpqavLy84ODg8vLy9/f39/f3+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn58/Pz5eXly8vLrKyslpaWhYWFkJCQoaGhoaGhoaGhoaGhoaGhoaGh oaGhlpaWgYGBjIyMoaGhsrKyurq6vb29wMDAwcHBwcHBwMDAwMDAwMDAwMDAwMDAwMDAwMDAwcHB wcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHB wcHBwcHBwcHBwcHBwMDAtra2pqamlpaWioqKgICAmZmZoaGhoaGhoaGhoaGh'; } elsif ($opt == 101) { $imagedata = 'Qk2mDgAAAAAAADYAAAAoAAAAOAAAABYAAAABABgAAAAAAHAOAAAmDgAAJg4AAAAAAAAAAAAAoaGh oaGhoKCgoKCgoKCgnJyckJCQiIiIh4eHh4eHhYWFhYWFhISEhISEhISEg4ODg4ODg4ODg4ODgoKC goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg4ODg4ODg4ODhISEhISEhISEhYWFhYWFhoaGhoaG hoaGh4eHh4eHh4eHh4eHh4eHiIiIiIiIiIiIjIyMlJSUnp6eoaGhoaGhoaGhoaGhoaGhoaGhoaGh oKCgoKCgkpKShoaGmpqapaWlqampqKioqKiop6enp6enpaWlpaWlpaWlpKSkpKSko6Ojo6Ojo6Oj o6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjpKSkpKSkpaWlpaWlpaWlp6enp6enqKioqampqampqqqq qqqqq6urq6urq6urq6urrKysrKysrKyspqaml5eXhYWFlJSUoaGhoaGhoaGhoaGhoaGhoaGhoKCg jo6Oj4+PsLCwubm5uLi4t7e3t7e3tra2tLS0tLS0s7OzsrKysbGxsbGxsbGxsLCwr6+vr6+vr6+v r6+vr6+vr6+vr6+vr6+vr6+vsLCwsLCwsbGxsbGxsrKys7OztLS0tbW1tra2t7e3t7e3uLi4ubm5 urq6urq6urq6urq6u7u7u7u7u7u7u7u7u7u7r6+vkJCQjo6OoaGhoaGhoaGhoaGhoKCgkZGRj4+P uLi4ubm5uLi4t7e3t7e3tra2tLS0tLS0srKysbGxsbGxsLCwr6+vr6+vr6+vrq6ura2tra2tra2t ra2tra2tra2tra2tra2tr6+vr6+vr6+vsLCwsbGxsbGxsrKytLS0tbW1tra2t7e3t7e3uLi4ubm5 urq6urq6urq6urq6u7u7u7u7u7u7u7u7u7u7urq6lJSUj4+PoaGhoaGhoaGhmZmZhISEsLCwtra2 tbW1tLS0tLS0s7OzsrKysbGxr6+vrq6ura2trKysrKysqqqqqqqqqqqqqampqampqampqKioqKio qKioqKioqampqampqqqqqqqqqqqqrKysrKysra2tr6+vsLCwsbGxsrKytLS0tLS0tbW1tra2t7e3 t7e3t7e3t7e3uLi4uLi4uLi4uLi4uLi4uLi4tbW1jY2Nk5OToaGhoaGhjIyMnp6esrKysbGxsLCw r6+vr6+vra2trKysq6urqqqqqKiop6enpqampaWlpKSkpKSkpKSko6Ojo6OjoqKioqKioqKioqKi oqKioqKio6OjpKSkpKSkpKSkpqamp6enqKioqKioqqqqq6urra2trq6ur6+vsLCwsbGxsbGxsrKy srKysrKys7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozq6urg4ODn5+fnJychYWFqqqqrKysq6urqqqqqamp qKiop6enpqampKSko6OjoaGhoKCgn5+fnp6enZ2dnZ2dnJycnJycm5ubm5ubm5ubm5ubm5ubm5ub m5ubnJycnZ2dnZ2dnp6en5+fn5+foaGhoqKipKSkpaWlpqamqKioqampqqqqqqqqq6urrKysrKys rKysra2tra2tra2tra2tra2tra2tra2tra2tkZGRlZWVlJSUj4+PpqampqampKSkpKSko6OjoqKi oKCgn5+fnp6enZ2dm5ubmpqamZmZmJiYl5eXl5eXlpaWlZWVlZWVlZWVlZWVlJSUlJSUlZWVlZWV lZWVlpaWl5eXl5eXmZmZmZmZm5ubnJycnZ2dnp6eoKCgoqKioqKipKSkpKSkpaWlpqampqampqam p6enp6enp6enp6enp6enp6enp6enp6ennZ2diYmJjIyMk5OTn5+fn5+fnZ2dnZ2dnJycm5ubmpqa mJiYl5eXlpaWlJSUk5OTkpKSkZGRkJCQkJCQj4+Pjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6O kJCQkJCQkZGRkpKSk5OTk5OTlZWVl5eXmJiYmZmZmpqanJycnZ2dnZ2dnp6en5+fn5+fn5+foKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgnp6egoKChoaGk5OTmJiYl5eXl5eXlpaWlpaWlpaWl5eXlpaW lpaWlJSUk5OTkZGRkJCQm4WEzFNM6Dku6Dku3UM6umJejY2NjY2Nv15X4z406Dku10lAjo6O0U1G 6Dku2ElA6Dku0k5Hk5OT6Dku009IlpaW1FBI6DkumZmZmpqam5ubm5ubnJycnJycnJycnJycm5ub mpqamZmZmZmZmZmZmZmZmZmZmJiYgoKCg4ODkJCQkpKSkZGRkZGRkpKSl5eXm5ubm5ubmpqamZmZ mJiYlpaWlpaWlZWVqYF+3lJIs3hzqIF+wmlj6Eg+s3ZyvW1o6Eg+wmljqIB9wmljqIF+6Eg+zmBZ r3156Eg+01xUlpaW6Eg+1FxVmpqa1V1V6Eg+nZ2dnZ2dnp6enp6en5+fn5+fn5+foKCgn5+fnZ2d mJiYk5OTk5OTk5OTk5OTkpKSgoKCgoKCi4uLjIyMjIyMi4uLk5OTn5+foaGhn5+fn5+fnp6enp6e nJycm5ubm5ubn5eWmpqampqarYiH0G1m6lhPwXh01mlh6lhPmZmZmZmZmZmZn5aV5VxU4GFZwnl1 6lhP1mlinZ2d6lhP1mljn5+f12pj6lhPoqKioqKio6Ojo6Ojo6Ojo6Ojo6OjpKSkpKSkpKSknp6e kpKSjY2NjY2NjY2NjIyMgoKCg4ODhoaGh4eHh4eHiYmJm5ubqampqampqKiop6enp6enpqampaWl pKSkpKSkpKSkx4eD525n62tj62tj525nq5ub1Hx362tjrJybo6OjrJybo6OjqKCgupKPyIiE62tj 2np0pqam62tj2np0qKio2np162tjqampqqqqqqqqq6urq6urq6urq6urq6urq6urq6urqampmJiY iYmJiIiIiIiIiIiIgoKCh4eHg4ODhISEhISEjY2Nq6urtLS0s7Ozs7OzsrKysrKysbGxsLCwsLCw sLCwu6al7X946oJ80pSQxp2as6yrr6+vu6ak6YJ86YJ83ouG7X94r6+v2o6K3ouG4oiD7X9405WR sbGx7X946oJ83oyH7X945oaAtLS0tLS0tLS0tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1pqamioqK hYWFhYWFhYWFgoKCjY2NgoKChISEhISEl5eXu7u7wcHBwcHBwMDAwMDAwMDAv7+/v7+/vr6+vr6+ yLe18ZWQ4aKevr6+wLu60a6sx7a1vb29xLi41Kyp16qnzrGvvr6+yLe116qn16qn0q+tv7+/v7+/ zLWzybi3zLW02auox7u7wcHBwcHBwcHBwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCt7e3kpKShYWF hYWFhYWFgoKClZWVgYGBhISEhYWFnp6eyMjIzs7Ozc3Nzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzM 4rm39Kun9Kun9Kun9Kun08bEzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzc3N zc3Nzc3Nzc3Nzc3Nzs7Ozs7Ozs7Ozs7Ozs7Ozs7Oz8/Pz8/Pz8/Pz8/Pz8/PxMTEl5eXhYWFhYWF g4ODioqKnp6egYGBhISEhISEmZmZzc3N2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ 2tfX4NLR4NLR2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ 2tra2tra2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vbxcXFkpKShYWFhYWFgoKC l5eXoaGhkJCQgoKChISEkJCQysrK5ubm5ubm5ubm5ubm5ubm5eXl5eXl5eXl5eXl5eXl5eXl5eXl 5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5ubm5ubm5ubm 5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5OTku7u7ioqKhYWFhISEgICAoKCg oaGhnZ2df39/g4ODhoaGtra26urq8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw 8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw 8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw39/fpKSkhYWFhISEgYGBlZWVoaGhoaGh oaGhlJSUgICAhISEmpqa2NjY+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn57+/vwMDAjY2NhYWFgYGBkZGRoaGhoaGhoaGhoaGh oaGhkJCQgICAhoaGqKio19fX7u7u9PT09fX19/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3 9/f39/f39/f39/f39/f39/f37+/v3t7evLy8lJSUg4ODgYGBkJCQoaGhoaGhoaGhoaGhoaGhoaGh oaGhlpaWf39/gYGBkJCQpKSkra2tr6+vs7OztLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0 tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tbW1tbW1 tbW1tbW1tbW1tbW1s7Ozp6enlJSUhYWFgYGBgICAmZmZoaGhoaGhoaGhoaGh'; } elsif ($opt == 11) { $imagedata = 'Qk2mDgAAAAAAADYAAAAoAAAAOAAAABYAAAABABgAAAAAAHAOAAAmDgAAJg4AAAAAAAAAAAAAoaGh oaGhoKCgoKCgoKCgnJyckJCQiIiIh4eHh4eHhYWFhYWFhYWFhISEhISEhISEg4ODg4ODg4ODg4OD goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg4ODg4ODg4ODhISEhISEhISEhYWFhYWFhoaG hoaGh4eHh4eHh4eHh4eHh4eHiIiIiIiIiIiIjIyMlJSUnp6eoaGhoaGhoaGhoaGhoaGhoaGhoaGh oKCgoKCgkpKSj4+Purq61NTU29vb2dnZ2tra2dnZ2NjY19fX1tbW1dXV1dXV1dXV1dXV1NTU1NTU 1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTU1dXV1dXV1tbW1tbW2NjY2dnZ2tra29vb3Nzc 3Nzc3d3d3d3d3t7e3t7e39/f39/f39/f0dHRsrKyioqKlJSUoaGhoaGhoaGhoaGhoaGhoaGhoKCg jo6OoqKi6enp/Pz8+/v7+vr6+fn5+Pj49/f39fX19PT08/Pz8vLy8vLy8fHx8fHx8PDw8PDw7+/v 7+/v7+/v7+/v7+/v7+/v7+/v7+/v8PDw8PDw8fHx8vLy8/Pz9PT09fX19/f3+Pj4+fn5+vr6+/v7 /Pz8/f39/v7+/v7+/v7+////////////////5ubmoaGhjo6OoaGhoaGhoaGhoaGhoKCgkZGRoKCg +fn5/Pz8+/v7+vr6+fn5+Pj49/f39fX19PT08vLy8fHx8PDw7+/v7+/v7+/v7u7u7e3t7e3t7Ozs 7Ozs7Ozs7Ozs7Ozs7Ozs7e3t7u7u7u7u7+/v8PDw8fHx8vLy9PT09fX19/f3+Pj4+vr6+/v7/Pz8 /f39/f39/v7+/v7+/////////////////////Pz8qqqqj4+PoaGhoaGhoaGhmZmZi4uL5+fn9/f3 9vb29fX18/Pz8vLy8fHx7+/v7e3t7Ozs6+vr6urq6Ojo5+fn5ubm5ubm5eXl5eXl5OTk5OTk5OTk 5OTk5OTk5OTk5OTk5OTk5eXl5eXl5ubm6Ojo6enp6urq7Ozs7u7u8PDw8vLy8/Pz9PT09fX19vb2 9/f3+Pj4+Pj4+fn5+fn5+fn5+fn5+fn5+fn58/PznJyck5OToaGhoaGhjIyMxcXF7+/v7u7u7e3t 7Ozs6+vr6enp6Ojo5+fn5eXl4+Pj4uLi4eHh39/f3t7e3d3d3d3d3Nzc29vb29vb29vb2tra2tra 2tra2tra2tra29vb3Nzc3Nzc3d3d3t7e4ODg4uLi5OTk5ubm5+fn6enp6urq7Ozs7e3t7u7u7+/v 8PDw8PDw8fHx8fHx8fHx8fHx8fHx8fHx8fHx4ODgh4eHn5+fnJycjo6O4uLi5eXl5OTk4+Pj4uLi 4eHh39/f3d3d3Nzc2tra2dnZ19fX1dXV1NTU09PT0tLS0tLS0dHR0NDQ0NDQz8/Pz8/Pz8/Pz8/P z8/Pz8/P0NDQ0NDQ0dHR0tLS09PT1dXV19fX2dnZ2tra3Nzc3t7e4eHh4uLi4uLi5OTk5eXl5ubm 5ubm5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fnp6enlZWVlJSUpKSk29vb2tra2dnZ2NjY19fX1tbW 09PT09PT0dHRz8/Pzc3NzMzMysrKycnJx8fHx8fHxsbGxsbGxcXFxcXFxMTExMTEw8PDw8PDxMTE xMTExcXFxsbGxsbGxsbGyMjIysrKzMzMzc3Nz8/P0tLS09PT1dXV19fX2NjY2dnZ2tra29vb29vb 3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzcxMTEiYmJjIyMsrKyzs7Ozs7Ozs7OzMzMy8vLycnJyMjI xsbGxcXFw8PDwcHBwMDAvr6+vb29vLy8vLy8u7u7urq6ubm5ubm5uLi4uLi4uLi4uLi4uLi4uLi4 ubm5urq6u7u7vLy8vb29vr6+wMDAwsLCxMTExcXFx8fHycnJy8vLzMzMzc3Nzs7Ozs7Oz8/P0NDQ 0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQy8vLgoKChoaGt7e3wsLCwsLCwcHBwMDAv7+/v7+/vr6+vb29 vLy8u7u7ubm5uLi4tra2tbW1ua2t221m7kk/8kI46lBH2mxlsbGx0Xp18kI4wZaTsbGxsbGx4l5W 8kI45ldO8kI4419Xtra2419Y8kI47kpA8kI43HlzwMDAwcHBwsLCw8PDxMTExMTExcXFxsbGxcXF xcXFxMTExMTExMTExMTExMTEwMDAgoKCg4ODs7OzuLi4uLi4t7e3tra2urq6u7u7u7u7urq6ubm5 t7e3tra2tLS0tLS0s7Oz4Glh8FBG2HVuwZiW5GNa8FBGsLCw0IF78FBGwJiWsLCwwJiW8FBG3G9n xZOP8FBG4GlhtLS04Wpi8FBGxp2b33Jq8FBGyaGevr6+vr6+v7+/wcHBwcHBwcHBwsLCwsLCwMDA vLy8ubm5ubm5ubm5ubm5tra2goKCgoKCq6urrq6urq6ura2tsrKyurq6u7u7u7u7ubm5uLi4t7e3 tra2tbW1tLS0u6mo8F5V4XRts7Ozwp2b5G5n8F5VsbGx0IiE8F5VwZyasbGxtaur7GRb6Glh0YiE 8F5V4XRttLS04nRt8F5Vt7e3xqKg8F5V1o2IvLy8vb29vr6+v7+/v7+/v7+/v7+/v7+/v7+/u7u7 srKyr6+vr6+vr6+vrKysgoKCg4ODoqKipqampqamp6entbW1vr6+vr6+vr6+vLy8vLy8u7u7urq6 urq6ubm5xqak8HBo05SQt7e38HBo8HBo8HBotra205OP8HBoyKCdtra2tra2urKyyaGf05SQ8HBo 4oJ8ubm544N88HBou7u7zKSi8HBo15eTv7+/v7+/wMDAwcHBwcHBwcHBwcHBwcHBwcHBwMDAs7Oz qKiop6enp6enpaWlgoKCh4eHmZmZoKCgoKCgp6envb29xMTExMTEw8PDw8PDwsLCwcHBwcHBwMDA wMDAybSz8oN93pqVvr6+vr6+vr6+vr6+vr6+2KGe8oN96I6J8oN9vr6+4ZaR5ZKN6I6J8oN93J6a wMDA5pON8oN96Y+K74eB8oN9yry7xMTExMTExcXFxsbGxsbGxsbGxsbGxsbGxsbGxsbGurq6paWl oaGhoaGhn5+fgoKCjY2Nk5OToKCgoKCgrq6uysrKz8/Pzs7Ozs7Ozs7Ozc3Nzc3NzMzMzMzMzMzM y8vL7KKe9JmT1b69y8vL0MTD6qWhysrK0MTD1b68zcfH1b68ysrK08HA37Kv37Kv27i2zMzMzMzM 6qai9JmT1cPC4bOx2MG/z8/Pz8/Pz8/P0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQx8fHq6uroaGh oaGhn5+fgoKClZWVi4uLoKCgoKCgtLS01NTU2dnZ2dnZ2NjY2NjY2NjY19fX19fX19fX19fX1tbW 3M/O8LWy9q6p9q6p9q6p8rOv1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fX7ri1 9q6p2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra0dHRr6+voaGhoaGh l5eXioqKnp6eg4ODnp6eoKCgsLCw2NjY4uLi4uLi4uLi4uLi4uLi4eHh4eHh4eHh4eHh4eHh4eHh 4eHh5dva59nY5dva4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh5tvb59nZ 4uLi4uLi4uLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj0tLSq6uroaGhoaGhioqK l5eXoaGhkJCQkJCQoKCgqamp1tbW6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6urq 6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6+vr6+vr6+vr6+vr6+vr6+vr6+vr 6+vr6+vr6+vr6+vr7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs6+vry8vLpaWloaGhmZmZgYGBoKCg oaGhnZ2dgYGBmZmZoqKixsbG7u7u8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz 8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz 8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz9PT09PT09PT09PT09PT05+fnubm5oaGhnZ2dhYWFlZWVoaGhoaGh oaGhlJSUhYWFnZ2dsbGx4eHh+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6 +vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6 +vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr68/Pzzs7Op6ennp6eiIiIkZGRoaGhoaGhoaGhoaGh oaGhkZGRhISEmpqavLy84ODg8vLy9/f39/f3+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn58/Pz5eXly8vLrKyslpaWhYWFkJCQoaGhoaGhoaGhoaGhoaGhoaGh oaGhl5eXgYGBjIyMoaGhsrKyurq6vb29wMDAwcHBwcHBwcHBwMDAwMDAwMDAwMDAwMDAwMDAwMDA wMDAwMDAwMDAwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHB wcHBwcHBwcHBwcHBwMDAtra2pqamlpaWioqKgICAmZmZoaGhoaGhoaGhoaGh'; } elsif ($opt == 111) { $imagedata = 'Qk2mDgAAAAAAADYAAAAoAAAAOAAAABYAAAABABgAAAAAAHAOAAAmDgAAJg4AAAAAAAAAAAAAoaGh oaGhoKCgoKCgoKCgnJyckJCQiIiIh4eHh4eHhYWFhYWFhYWFhISEhISEhISEg4ODg4ODg4ODg4OD goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg4ODg4ODg4ODhISEhISEhISEhYWFhYWFhoaG hoaGh4eHh4eHh4eHh4eHh4eHiIiIiIiIiIiIjIyMlJSUnp6eoaGhoaGhoaGhoaGhoaGhoaGhoaGh oKCgoKCgkpKSioqKp6enurq6vb29vLy8vLy8vLy8u7u7urq6ubm5ubm5ubm5uLi4uLi4t7e3t7e3 t7e3t7e3tra2tra2tra2tra2tra2t7e3t7e3t7e3uLi4ubm5ubm5ubm5u7u7vLy8vLy8vb29vr6+ v7+/v7+/v7+/wMDAwMDAwcHBwcHBwcHBuLi4oqKih4eHlJSUoaGhoaGhoaGhoaGhoaGhoaGhoKCg jo6Ol5eXyMjI1NTU1NTU09PT0tLS0dHR0NDQz8/Pzs7Ozc3NzMzMzMzMy8vLy8vLysrKysrKysrK ysrKysrKysrKysrKysrKysrKysrKysrKysrKy8vLzMzMzc3Nzs7Oz8/P0NDQ0dHR0tLS09PT1NTU 1NTU1dXV1tbW1tbW1tbW19fX19fX19fX19fXxsbGl5eXjo6OoaGhoaGhoaGhoaGhoKCgkZGRlpaW 0tLS1NTU1NTU09PT0tLS0dHR0NDQz8/Pzs7OzMzMy8vLysrKysrKysrKysrKycnJyMjIyMjIx8fH x8fHx8fHx8fHx8fHx8fHyMjIycnJycnJysrKysrKy8vLzMzMzs7Oz8/P0NDQ0dHR09PT1NTU1NTU 1dXV1dXV1tbW1tbW19fX19fX19fX19fX19fX1dXVnZ2dj4+PoaGhoaGhoaGhmZmZh4eHxcXFz8/P z8/Pzs7OzMzMy8vLysrKycnJx8fHxsbGxsbGxcXFw8PDwsLCwcHBwcHBwcHBwcHBwMDAwMDAwMDA v7+/v7+/v7+/wMDAwMDAwcHBwcHBwcHBw8PDxMTExcXFxsbGyMjIysrKy8vLzMzMzc3Nzs7Oz8/P z8/P0NDQ0NDQ0dHR0dHR0dHR0dHR0dHR0dHRzc3Nk5OTk5OToaGhoaGhjIyMrKysx8fHx8fHxsbG xcXFxMTEw8PDwcHBwMDAv7+/vb29vLy8vLy8urq6ubm5uLi4uLi4uLi4t7e3t7e3t7e3tra2tra2 tra2tra2tra2t7e3uLi4uLi4uLi4ubm5u7u7vLy8vr6+wMDAwMDAw8PDw8PDxcXFxsbGx8fHx8fH yMjIyMjIycnJycnJycnJycnJycnJycnJycnJvr6+hISEn5+fnJyciIiIvLy8vr6+vb29vLy8u7u7 urq6uLi4t7e3tra2tbW1s7OzsrKysLCwr6+vr6+vrq6urq6ura2trKysrKysrKysrKysq6urq6ur rKysrKysrKysrKysra2trq6ur6+vsLCwsrKys7OztbW1tra2uLi4urq6u7u7u7u7vb29vr6+vr6+ vr6+v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/mJiYlZWVlJSUlJSUs7Ozs7OzsrKysLCwsLCwr6+v ra2trKysq6urqampqKiop6enpaWlpKSko6Ojo6OjoqKioqKioaGhoaGhoKCgoKCgoKCgoKCgoKCg oKCgoaGhoqKioqKioqKipKSkpaWlp6enqKioqamprKysra2trq6usLCwsLCwsbGxs7Ozs7Ozs7Oz tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0pqamiYmJjIyMmZmZp6enp6enpqampaWlpKSko6OjoaGh oKCgn5+fnZ2dnJycm5ubmpqamZmZmJiYmJiYl5eXlpaWlpaWlpaWlZWVlZWVlZWVlZWVlZWVlZWV lpaWlpaWl5eXmJiYmZmZmpqam5ubnZ2dnp6en5+foaGho6OjpKSkpaWlpaWlpqamp6enp6enqKio qKioqKioqKioqKioqKioqKioqKiopqamgoKChoaGlpaWm5ubm5ubmpqamZmZmZmZmZmZmZmZmZmZ mJiYl5eXlpaWlZWVlJSUk5OTmIyLx1tT4z806Dou3UQ6xlpSkJCQu2Rf6DoupXp3j4+Pj4+P0k9H 6Dou2EpA6Dou009HlJSU01BI6Dou4z816DouxWNdm5ubnJycnZ2dnp6enp6en5+fn5+fn5+fnp6e nZ2dnJycnJycnJycnJycnJycmpqagoKCg4ODjo6OkJCQkJCQj4+PkJCQlpaWmZmZmZmZmJiYl5eX lpaWlpaWlZWVlJSUk5OT0lpT6Ec+yGRdp39811VO6Ec+kJCQvGxn6Ec+pn57kJCQpn576Ec+zV5Y rXp46Ec+01tTlJSU01tU6Ec+q4KBz2Fa6Ec+rYWDnJycnJycnZ2dnZ2dnZ2dnZ2dnp6enZ2dm5ub lpaWkZGRkZGRkZGRkZGRkJCQgoKCgoKChoaGhoaGhoaGhYWFjY2NmpqanJycm5ubm5ubmpqamZmZ mJiYmJiYl5eXoY+N6FdN02dglZWVqoWD2GNb6FdNlJSUvnZx6FdNqYWDlJSUmpCQ4ltS3l9Wv3Zx 6FdN02dgl5eX1Gdg6FdNmpqaroqI6FdNwnp1nZ2dnZ2dnp6en5+fn5+fn5+fn5+fn5+fn5+fmZmZ jIyMh4eHh4eHh4eHh4eHgoKCg4ODf39/f39/fn5+gYGBlZWVo6Ojo6OjoqKioqKioaGhoKCgoKCg oKCgn5+fsZGP6Wlhw4N/nZ2d6Wlh6Wlh6WlhnZ2dw4N/6WlhtY2KnZ2dnZ2dopqatY2Kw4N/6Wlh 1ndxn5+f13dx6WlhoaGhuJCN6WlhxoaCpKSkpKSkpKSkpKSkpaWlpaWlpaWlpaWlpaWlo6OjkJCQ gICAf39/f39/f39/goKCh4eHenp6eXl5eHh4g4ODo6Ojra2trKysrKysq6urq6urqqqqqqqqqamp qamptaCf7H130o2JqampqampqKioqKioqKioypOP7H1334WA7H13qKio14qG24iD34aA7H13z5CN qamp24mD7H134IaA54B67H13tKamra2tra2tra2tra2trq6urq6urq6urq6urq6urq6unZ2df39/ eXl5eXl5eXl5goKCjY2NfHx8eXl5eHh4jo6OtLS0u7u7u7u7u7u7urq6urq6urq6ubm5ubm5ubm5 uLi45ZuW75SOxq+uuLi4v7Oz4Z2ZuLi4v7Ozxq+tu7W1xq+tuLi4wrGw1Kaj1Kajzauoubm5ubm5 4p2Z75SOxLOy1aekyLGwu7u7u7u7vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8sLCwh4eHeXl5 eXl5eXl5goKClZWVfX19eXl5eXl5lZWVxMTEycnJycnJycnJycnJyMjIyMjIyMjIyMjIyMjIx8fH z8LB6q+s8qql8qql8qql7a2qx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHyMjIyMjI6LGu 8qqlyMjIycnJycnJycnJycnJysrKysrKysrKysrKysrKysrKysrKysrKysrKvr6+jY2NeXl5eXl5 e3t7ioqKnp6ef39/eXl5eXl5j4+PycnJ19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV 1dXV29HR3dDP29HR1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW3NHR3tDP 1tbW1tbW1tbW1tbW19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXv7+/h4eHeXl5eXl5fn5+ l5eXoaGhkJCQfHx8eXl5hYWFxMTE4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj 4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj 4+Pj4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OTk5OTk4uLitbW1fn5+eXl5e3t7gICAoKCg oaGhnZ2df39/enp6e3t7r6+v6Ojo7+/v7+/v7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u 7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u 7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v3Nzcm5ubeXl5enp6f39/lZWVoaGhoaGh oaGhlJSUf39/enp6kZGR1NTU+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4 +Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4 +Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj47u7uubm5goKCenp6fn5+kZGRoaGhoaGhoaGhoaGh oaGhkZGRf39/f39/oKCg1NTU7Ozs8/Pz9PT09vb29/f39/f39vb29vb29vb29vb29vb29vb29vb2 9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29/f39/f39/f39/f39/f39/f39/f39/f3 9/f39/f39/f39/f39/f39vb27u7u2tratbW1iYmJe3t7f39/kJCQoaGhoaGhoaGhoaGhoaGhoaGh oaGhl5eXf39/fn5+ioqKnp6eqKioqamprq6ur6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+v r6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+v r6+vr6+vr6+vr6+vra2toKCgjIyMf39/fn5+gICAmZmZoaGhoaGhoaGhoaGh'; } elsif ($opt == 12) { $imagedata = 'Qk2mDgAAAAAAADYAAAAoAAAAOAAAABYAAAABABgAAAAAAHAOAAAmDgAAJg4AAAAAAAAAAAAAoaGh oaGhoKCgoKCgoKCgnJyckJCQiIiIh4eHh4eHhYWFhYWFhISEhISEhISEg4ODg4ODgoKCgoKCgoKC goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg4ODg4ODg4ODhISEhISEhYWFhYWF hoaGhoaGhoaGh4eHh4eHh4eHh4eHiIiIiIiIjIyMlJSUnp6eoaGhoaGhoaGhoaGhoaGhoaGhoaGh oKCgoKCgkpKSj4+Purq61NTU2tra2NjY2dnZ2NjY19fX1tbW1dXV1dXV1dXV1NTU1NTU09PT09PT 0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT09PT09PT1NTU1NTU1dXV1dXV1tbW19fX2dnZ2tra29vb 3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e39/f0dHRsrKyioqKlJSUoaGhoaGhoaGhoaGhoaGhoKCgoKCg jo6OoqKi6enp+/v7+vr6+fn5+Pj49/f39fX19PT08/Pz8vLy8fHx8PDw8PDw7+/v7+/v7u7u7u7u 7u7u7u7u7u7u7u7u7u7u7u7u7u7u7+/v7+/v8PDw8PDw8fHx8vLy8/Pz9PT09vb2+Pj4+fn5+vr6 +/v7/Pz8/Pz8/f39/v7+/v7+////////////5ubmoaGhjo6OoaGhoaGhoaGhoaGhoKCgkZGRoKCg +Pj4/Pz8+/v7+vr6+fn59/f39fX19PT08vLy8fHx8PDw7+/v7u7u7e3t7Ozs7Ozs6+vr6+vr6+vr 6urq6urq6+vr6+vr6+vr6+vr7Ozs7Ozs7e3t7u7u7+/v8PDw8fHx8/Pz9PT09vb2+Pj4+fn5+vr6 +/v7/Pz8/f39/v7+/v7+/////////////////Pz8qqqqj4+PoaGhoaGhoaGhmZmZi4uL5+fn9vb2 9fX19PT08/Pz8vLy8PDw7u7u7Ozs6urq6enp6Ojo5ubm5eXl5eXl5OTk5OTk5OTk4+Pj4+Pj4+Pj 4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTk5eXl5ubm5+fn6Ojo6urq6+vr7e3t7+/v8fHx8vLy9PT09fX1 9vb29/f39/f3+Pj4+Pj4+fn5+fn5+fn5+fn58/PznJyck5OToaGhoaGhjIyMxcXF7+/v7u7u7e3t 6+vr6urq6enp6Ojo5ubm5OTk4uLi4ODg3t7e3d3d3Nzc29vb29vb2tra2dnZ2dnZ2dnZ2NjY2NjY 2NjY2dnZ2dnZ2dnZ2tra29vb29vb3Nzc3t7e39/f4eHh4+Pj5eXl5+fn6Ojo6enp6+vr7Ozs7e3t 7u7u7+/v8PDw8PDw8fHx8fHx8fHx8fHx8fHx4ODgh4eHn5+fnJycjo6O4eHh5eXl4+Pj4uLi4uLi 4ODg3t7e3Nzc2tra2dnZ19fX1dXV09PT0tLS0dHR0NDQz8/Pz8/Pzs7Ozs7Ozc3Nzc3Nzc3Nzc3N zs7Ozs7Ozs7Oz8/Pz8/P0NDQ0dHR09PT1NTU1tbW2NjY2dnZ29vb3d3d4ODg4eHh4uLi4+Pj5OTk 5eXl5ubm5ubm5+fn5+fn5+fn5+fn5+fn5+fnp6enlZWVlJSUpKSk2tra2dnZ2dnZ2NjY1tbW1dXV 09PT0tLSz8/Pzc3Ny8vLycnJyMjIxsbGxsbGxcXFxMTEw8PDwsLCwsLCwsLCwsLCwsLCwsLCwsLC wsLCw8PDw8PDxMTExsbGxsbGx8fHycnJysrKzMzMzs7O0dHR09PT1NTU1tbW19fX2dnZ2dnZ2tra 29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3NzcxMTEiYmJjIyMsrKyzs7Ozs7Ozc3Ny8vLysrKycnJx8fH xcXFxMTEwcHBv7+/vr6+vLy8vLy8urq6ubm5uLi4uLi4uLi4t7e3t7e3t7e3t7e3t7e3t7e3uLi4 uLi4uLi4ubm5urq6u7u7vLy8vb29v7+/wcHBw8PDxcXFxsbGyMjIysrKy8vLzMzMzs7Ozs7Oz8/P z8/P0NDQ0NDQ0NDQ0NDQ0NDQ0NDQy8vLgoKChoaGt7e3wsLCwsLCwcHBv7+/v7+/vr6+vr6+vb29 u7u7ubm5t7e3tbW1tbW1s7Oz8kI44l5WsbGxuaOh7kk/7kk/vJuYs6mo3WRd8kI48kI45VdOuaOh 0Xp18kI47kk/6lBH8kI4tbW1vqmn6lBI8kI45GBZ8kI42IF8wcHBwcHBwsLCxMTExMTExcXFxMTE xcXFxMTExMTExMTExMTExMTEwMDAgoKCg4ODs7OzuLi4t7e3tra2tra2ubm5urq6urq6urq6uLi4 t7e3tLS0s7Ozs7OzsrKy8FBG4GhgsLCw5GJa8FBGx4uHrq6u32hg8FBGy4WBwJeV0IB6u52b8FBG 6FxTwZiW6FxT8FBGs7Oz2XZv8FBG0IqF1YWA8FBG1oaBvb29vr6+vr6+wMDAwcHBwcHBwcHBwMDA vLy8ubm5ubm5ubm5ubm5tra2goKCgoKCq6urrq6ura2trKyssrKyubm5u7u7ubm5ubm5t7e3tra2 tLS0tLS0s7Ozs7Oz8F5V6Glh3Hhy8F5V1IJ9sLCwsLCw8F5V6Glh0IiD0IiD0IiDuaem4HNt7GRb 1YR+6Glh8F5VtLS04XRt8F5Vt7e3xqKf8F5V1YyIu7u7vLy8vb29vr6+v7+/v7+/v7+/v7+/u7u7 srKyr6+vr6+vr6+vrKysgoKCg4ODoqKipqampaWlpqamtbW1vr6+vr6+vLy8vLy8u7u7urq6ubm5 uLi4t7e3t7e38HBo7XRt4oF87XRt5X13urKxtra27XRt6Xly05OP4oF88HBoxaSit7e3xaWj05SQ 6Xly8HBoubm534eB8HBowrKwyamn8HBo15eTvr6+v7+/v7+/wMDAwcHBwcHBwcHBwcHBwMDAs7Oz qKiop6enp6enpaWlgoKCh4eHmZmZoKCgoKCgp6envb29xMTExMTEw8PDwsLCwcHBwcHBwMDAwMDA v7+/vr6+8oN95ZKNvr6+zqyp8oN91KShvb290ael8oN95JKN74eB64qFvr6+2KGe5ZKN5ZKN8oN9 6I+JwMDAzbGv8oN97IuF6Y+K8oN926SgxMTExMTExMTExcXFxsbGxsbGxsbGxsbGxsbGurq6paWl oaGhoaGhn5+fgoKCjY2Nk5OToKCgoKCgrq6uysrKz8/Pzs7Ozs7Ozc3Nzc3NzMzMzMzMy8vLy8vL y8vL9JmT7KKe1b685Kuo9JmT3LSyysrKysrK1L2837Gv3bWyzcfHysrK0MTD3bWy37Kv3bWyzsjI zMzMzMzM1r++4LOw4bOw9JmT4bSxz8/Pz8/Pz8/P0NDQ0NDQ0NDQ0NDQ0NDQ0NDQx8fHq6uroaGh oaGhn5+fgoKClZWVi4uLoKCgoKCgs7Oz1NTU2dnZ2dnZ2NjY2NjY19fX19fX19fX1tbW1tbW1tbW 9q6p9q6p9q6p9q6p7Lq319PT1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX 19fX19fX19fX383M9q6p58PB2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra0dHRr6+voaGhoaGh l5eXioqKnp6egoKCnp6eoKCgsLCw2NjY4uLi4uLi4uLi4uLi4eHh4eHh4eHh4eHh4eHh4eHh4ODg 4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh 4eHh4eHh4+Dg59rZ5d7e4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj0tLSq6uroaGhoaGhioqK l5eXoaGhkJCQkJCQoKCgqamp1dXV6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6urq6urq6urq 6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6+vr6+vr6+vr6+vr6+vr6+vr 6+vr6+vr6+vr6+vr6+vr6+vr7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs6+vry8vLpaWloaGhmZmZgYGBoKCg oaGhnZ2dgYGBmZmZoqKixsbG7u7u8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz 8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz 8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz9PT09PT05+fnubm5oaGhnZ2dhYWFlZWVoaGhoaGh oaGhlJSUhYWFnZ2dsbGx4eHh+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6 +vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6 +vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr68/Pzzs7Op6ennp6eiIiIkZGRoaGhoaGhoaGhoaGh oaGhkJCQhISEmpqavLy84ODg8vLy9/f39/f3+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn58/Pz5eXly8vLrKyslpaWhYWFkJCQoaGhoaGhoaGhoaGhoaGhoaGh oaGhlpaWgYGBjIyMoaGhsrKyurq6vb29wMDAwcHBwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA wcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHB wcHBwcHBwcHBwcHBwMDAtra2pqamlpaWioqKgICAmZmZoaGhoaGhoaGhoaGh'; } elsif ($opt == 121) { $imagedata = 'Qk2mDgAAAAAAADYAAAAoAAAAOAAAABYAAAABABgAAAAAAHAOAAAmDgAAJg4AAAAAAAAAAAAAoaGh oaGhoKCgoKCgoKCgnJyckJCQiIiIh4eHh4eHhYWFhYWFhISEhISEhISEg4ODg4ODgoKCgoKCgoKC goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg4ODg4ODg4ODhISEhISEhYWFhYWF hoaGhoaGhoaGh4eHh4eHh4eHh4eHiIiIiIiIjIyMlJSUnp6eoaGhoaGhoaGhoaGhoaGhoaGhoaGh oKCgoKCgkpKShoaGmpqapaWlqampp6enp6enp6enpqampaWlpaWlpKSkpKSko6Ojo6Ojo6Ojo6Oj oqKioqKioqKioqKioqKioqKioqKio6Ojo6Ojo6Ojo6Ojo6OjpKSkpaWlpaWlpqamp6enqKioqamp qampqqqqqqqqq6urq6urq6urq6urrKyspqaml5eXhYWFlJSUoaGhoaGhoaGhoaGhoaGhoKCgoKCg jo6Oj4+PsLCwuLi4t7e3t7e3tra2tbW1tLS0s7OzsrKysbGxsbGxsLCwsLCwr6+vr6+vr6+vr6+v r6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vsLCwsLCwsbGxsbGxsrKys7OztLS0tra2t7e3t7e3 uLi4ubm5ubm5urq6urq6urq6u7u7u7u7u7u7r6+vkJCQjo6OoaGhoaGhoaGhoaGhoKCgkZGRj4+P t7e3ubm5uLi4t7e3t7e3tbW1tLS0s7OzsbGxsbGxsLCwr6+vr6+vrq6ura2tra2trKysrKysrKys rKysrKysrKysrKysrKysrKysra2tra2trq6ur6+vr6+vsLCwsbGxsrKys7OztLS0tra2t7e3t7e3 uLi4ubm5urq6urq6urq6u7u7u7u7u7u7u7u7urq6lJSUj4+PoaGhoaGhoaGhmZmZhISEsLCwtra2 tbW1tLS0tLS0s7OzsrKysLCwr6+vra2trKysrKysqqqqqqqqqqqqqampqKioqKiop6enp6enp6en p6enp6enp6enp6enqKioqKioqampqqqqqqqqq6urrKysra2trq6ur6+vsbGxsrKys7OztLS0tbW1 tra2t7e3t7e3t7e3t7e3uLi4uLi4uLi4uLi4tbW1jY2Nk5OToaGhoaGhjIyMnp6esrKysbGxsLCw r6+vrq6ura2trKysq6urqampqKiopqampaWlpKSkpKSko6Ojo6OjoqKioaGhoaGhoaGhoaGhoaGh oaGhoaGhoaGhoaGhoqKio6Ojo6OjpKSkpaWlpqamp6enqKioqqqqq6urrKysra2tr6+vr6+vsLCw sbGxsrKysrKysrKys7Ozs7Ozs7Ozs7Ozs7Ozq6urg4ODn5+fnJychYWFqqqqrKysqqqqqqqqqamp qKiopqampaWlpKSkoqKioaGhn5+fnp6enZ2dnZ2dnJycm5ubm5ubmpqampqamZmZmZmZmZmZmZmZ mpqampqampqam5ubm5ubnJycnZ2dnp6en5+foKCgoaGho6OjpKSkpqamqKioqKioqqqqqqqqq6ur rKysrKysrKysra2tra2tra2tra2tra2tra2tkZGRlZWVlJSUj4+PpqampaWlpKSkpKSkoqKioqKi oKCgn5+fnZ2dnJycmpqamZmZmJiYl5eXlpaWlZWVlZWVlJSUk5OTk5OTk5OTk5OTk5OTk5OTk5OT k5OTlJSUlJSUlZWVlpaWl5eXl5eXmZmZmZmZm5ubnZ2dnp6eoKCgoaGhoqKio6OjpKSkpaWlpqam pqampqamp6enp6enp6enp6enp6enp6ennZ2diYmJjIyMk5OTn5+fnp6enZ2dnJycnJycmpqamZmZ mJiYl5eXlZWVk5OTkpKSkZGRkJCQj4+Pjo6Ojo6OjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2N jY2Njo6Ojo6Oj4+PkJCQkZGRkpKSk5OTlJSUlpaWl5eXmJiYmpqanJycnJycnZ2dnp6en5+fn5+f n5+foKCgoKCgoKCgoKCgoKCgoKCgnp6egoKChoaGk5OTmJiYl5eXl5eXlZWVlpaWlpaWlpaWlZWV lZWVk5OTkZGRkJCQkJCQjo6O6Dku0U1GjY2NmIKB4z004z00nHx6kYaFy1JL6Dku6Dku10g/mIKB umJe6Dku4z403UM66DkukJCQm4WF3kQ66Dku009I6Dkuv2himZmZmZmZmpqam5ubnJycm5ubmpqa mpqamZmZmZmZmZmZmZmZmZmZmJiYgoKCg4ODkJCQkpKSkZGRkZGRkpKSl5eXm5ubm5ubmpqamJiY l5eXlpaWlZWVlJSUlJSU6Eg+0ltTkpKS11ZO6Eg+snZykZGR0ltT6Eg+t3Jsp398vG1oooOB6Eg+ 3lJIqIF+3lJI6Eg+lZWVyWVf6Eg+u3VxwXJs6Eg+wnJtnZ2dnZ2dnZ2dnp6en5+fn5+fnp6enZ2d mJiYk5OTk5OTk5OTk5OTkpKSgoKCgoKCi4uLjIyMi4uLi4uLk5OTnp6eoaGhn5+fn5+fnp6enZ2d m5ubm5ubmpqampqa6lhP32BZ0G1m6lhPxnRvmJiYmJiY6lhP32BZwXh0wXh0wXh0o5GQ1mlh5VxU xnRw32BZ6lhPm5ub1mli6lhPnp6eso2L6lhPxXx4oaGhoqKio6Ojo6Ojo6Ojo6Ojo6OjpKSknp6e kpKSjY2NjY2NjY2NjIyMgoKCg4ODhoaGh4eHhoaGiYmJm5ubqampqampqKiop6enp6enpaWlpKSk pKSkpKSko6Oj62tj5m5n2Xlz5m5n3XVvp5+eoqKi5m5n4nJrx4eD2Xlz62tjtZSSo6OjtZWTx4eD 4nJs62tjpKSk1n1462tjr5+euJiW62tjyoqGqampqampqqqqqqqqq6urq6urq6urq6urqampmJiY iYmJiIiIiIiIiIiIgoKCh4eHg4ODhISEhISEjY2Nq6urtLS0s7Ozs7OzsrKysrKysbGxsLCwsLCw r6+vr6+v7X943ouGr6+vw6Ce7X94ypqXrq6uxp2a7X943ouG6YJ85oV/r6+vzpeU3ouG3ouG7X94 4oiDsLCwwKSj7X945oaA4omD7X940JmWtLS0tLS0tLS0tLS0tbW1tbW1tbW1tbW1tbW1pqamioqK hYWFhYWFhYWFgoKCjY2NgoKChISEhISEl5eXu7u7wcHBwcHBwMDAwMDAv7+/v7+/v7+/vr6+vr6+ vr6+8ZWQ552YyrOy3aSh8ZWQ1Kypvb29vb29yrOy16mn1KypwLu6vb29xLi41Kyq16qn1Kyqwby7 vr6+v7+/zLWz2Kqo2Kuo8ZWQ2auowcHBwcHBwcHBwsLCwsLCwsLCwsLCwsLCwsLCt7e3kpKShYWF hYWFhYWFgoKClZWVgYGBhISEhYWFnZ2dyMjIzs7Ozc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzM 9Kun9Kun9Kun9Kun57WyzcnJy8vLy8vLy8vLy8vLzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzM zMzMzMzMzc3N18TE9Kun4by6zs7Ozs7Ozs7Ozs7Ozs7Ozs7Oz8/Pz8/Pz8/PxMTEl5eXhYWFhYWF g4ODioqKnp6egICAhISEhISEmZmZzc3N2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ 2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ 2dnZ2dnZ29jY4dPS3dbW2tra2tra2tra2tra2tra2tra29vb29vb29vbxcXFkpKShYWFhYWFgoKC l5eXoaGhkJCQgoKChISEkJCQysrK5ubm5ubm5ubm5ubm5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl 5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl 5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5OTku7u7ioqKhYWFhISEgICAoKCg oaGhnZ2df39/g4ODhoaGtra26urq8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw 8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw 8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw39/fpKSkhYWFhISEgYGBlZWVoaGhoaGh oaGhlJSUgICAhISEmpqa2NjY+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn57+/vwMDAjY2NhYWFgYGBkZGRoaGhoaGhoaGhoaGh oaGhkJCQgICAhoaGqKio19fX7u7u9PT09fX19/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3 9/f39/f39/f39/f39/f39/f37+/v3t7evLy8lJSUg4ODgYGBkJCQoaGhoaGhoaGhoaGhoaGhoaGh oaGhlpaWf39/gYGBkJCQpKSkra2tr6+vs7OztLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0 tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0 tLS0tLS0tLS0tbW1s7Ozp6enlJSUhYWFgYGBgICAmZmZoaGhoaGhoaGhoaGh'; } elsif ($opt == 13) { $imagedata = 'Qk2mDgAAAAAAADYAAAAoAAAAOAAAABYAAAABABgAAAAAAHAOAAAmDgAAJg4AAAAAAAAAAAAAoaGh oaGhoKCgoKCgoKCgnJyckJCQiIiIh4eHh4eHhoaGhYWFhYWFhISEhISEhISEhISEg4ODg4ODg4OD goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg4ODg4ODg4ODhISEhISEhYWFhYWFhYWFhoaGhoaGh4eH h4eHh4eHh4eHh4eHiIiIiIiIiIiIiIiIiIiIjIyMlJSUnp6eoaGhoaGhoaGhoaGhoaGhoaGhoaGh oKCgoKCgkpKSj4+Purq61NTU29vb2dnZ2tra2dnZ2NjY2NjY19fX1tbW1dXV1dXV1dXV1NTU1NTU 1NTU09PT09PT09PT1NTU1NTU1NTU1dXV1dXV1dXV1tbW19fX2NjY2dnZ2tra29vb3Nzc3Nzc3d3d 3d3d3t7e3t7e39/f39/f39/f39/f39/f0dHRsrKyioqKlJSUoaGhoaGhoaGhoaGhoaGhoKCgoKCg jo6OoqKi6enp/Pz8+/v7+vr6+fn5+Pj49/f39fX19PT09PT08/Pz8vLy8vLy8fHx8PDw8PDw7+/v 7+/v7+/v7+/v7+/v8PDw8PDw8PDw8fHx8vLy8/Pz9PT09fX19/f3+Pj4+fn5+vr6+/v7/Pz8/f39 /v7+/v7+/v7+////////////////////////5ubmoaGhjo6OoaGhoaGhoaGhoaGhoKCgkZGRoKCg +fn5/Pz8+/v7+vr6+fn5+Pj49/f39fX19PT08/Pz8vLy8fHx8PDw7+/v7+/v7u7u7e3t7Ozs7Ozs 7Ozs7Ozs7Ozs7e3t7u7u7u7u7+/v8PDw8fHx8vLy9PT09fX19/f3+fn5+vr6+/v7/Pz8/f39/f39 /v7+/v7+/////////////////////////////Pz8qqqqj4+PoaGhoaGhoaGhmZmZi4uL5+fn9vb2 9vb29fX19PT08/Pz8fHx7+/v7u7u7Ozs6+vr6urq6enp6Ojo5+fn5ubm5eXl5OTk5OTk5OTk5OTk 5OTk5OTk5OTk5eXl5ubm5+fn6Ojo6enp6+vr7Ozs7u7u8PDw8vLy8/Pz9PT09fX19vb29/f3+Pj4 +Pj4+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn58/PznJyck5OToaGhoaGhjIyMxcXF7+/v7u7u7e3t 7Ozs6+vr6urq6Ojo5+fn5eXl5OTk4uLi4eHh4ODg3t7e3t7e3d3d3Nzc29vb2tra2tra2tra2tra 29vb29vb3Nzc3Nzc3t7e39/f4ODg4uLi5OTk5ubm6Ojo6enp6urq7Ozs7e3t7u7u7+/v8PDw8PDw 8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx4ODgh4eHn5+fnJycjo6O4eHh5eXl5OTk4+Pj4uLi 4eHh4ODg3t7e3Nzc2tra2dnZ2NjY1tbW1dXV09PT0tLS0dHR0NDQ0NDQz8/Pz8/Pz8/Pz8/Pz8/P 0NDQ0NDQ0dHR09PT1NTU1dXV2NjY2dnZ29vb3d3d3t7e4ODg4uLi4uLi5OTk5eXl5eXl5ubm5+fn 5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fnp6enlZWVlJSUpKSk2tra2dnZ2dnZ2NjY19fX1tbW 1NTU09PT0dHRz8/Pzc3NzMzMysrKycnJyMjIx8fHxsbGxsbGxMTExMTEw8PDw8PDxMTExMTExcXF xsbGxsbGx8fHyMjIysrKzMzMzs7O0NDQ0tLS09PT1dXV19fX2NjY2dnZ2dnZ2tra29vb3Nzc3Nzc 3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzcxMTEiYmJjIyMsrKyzs7Ozs7Ozc3NzMzMy8vLycnJyMjI xsbGxcXFw8PDwcHBwMDAvr6+vb29vLy8vLy8u7u7ubm5uLi4uLi4uLi4uLi4uLi4uLi4ubm5urq6 u7u7vLy8vb29vr6+wMDAwsLCxMTExsbGyMjIycnJysrKzMzMzc3Nzs7Ozs7Oz8/P0NDQ0NDQ0NDQ 0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQy8vLgoKChoaGt7e3wsLCwsLCwcHBwMDAv7+/v7+/vr6+vb29 vLy8u7u7uLi4t7e3tra2tbW18kI4419WsrKysbGxsbGxsLCwsLCw0Xp07kk/8kI42mxltquqvp6c 5lhP8kI48kI43G5nvbKxwauq61FJ8kI442liwcHBwsLCw8PDxMTExMTExcXFxsbGxsbGxsbGxcXF xcXFxMTExMTExMTExMTExMTEwMDAgoKCg4ODs7OzuLi4t7e3tra2tra2urq6u7u7u7u7urq6ubm5 t7e3tbW1tLS0s7Ozs7Oz8FBG4GlhsbGxsLCwsLCwr6+vwJeV8FBG2HRuzIaB8FBG0IF7vZ+d0YF8 wpqX0oJ98FBG0IqF1IWA8FBG1oaByaGevr6+vr6+v7+/wMDAwcHBwcHBwsLCwsLCwsLCwsLCwMDA vLy8ubm5ubm5ubm5ubm5tra2goKCgoKCq6urrq6ura2trKyssrKyurq6u7u7urq6ubm5uLi4t7e3 tra2tLS0tLS0s7Oz8F5V7GRb4HNt4HNtxZeUsLCw0IiD8F5VwZyasbGx8F5V4XRts7Oz1oR/7GRb 8F5V8F5VyZuY1IyH8F5Vx6Ogu7u7vLy8vb29vr6+v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/u7u7 srKyr6+vr6+vr6+vrKysgoKCg4ODoqKipqampqamp6entbW1vr6+vr6+vb29vLy8u7u7urq6urq6 ubm5uLi4t7e38HBo6Xly05SP4oF88HBozJuZz5eU8HBoyKCdurKx8HBo34aBxaWk8HBo5n130ZmV xKyrvra21paS8HBoyqmovr6+vr6+v7+/wMDAwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwMDAs7Oz qKiop6enp6enpaWlgoKCh4eHmZmZoKCgoKCgp6envb29xMTExMTEw8PDw8PDwsLCwcHBwcHBwMDA wMDAv7+/8oN95ZKNvr6+vr6+8oN95JKNwbq674eB74eB64qF8oN9y6+uwru774eB74eB5ZKN74eB 2qOf8oN98oN98oN95pSPxMTExMTExcXFxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGurq6paWl oaGhoaGhn5+fgoKCjY2Nk5OToKCgoKCgrq6uysrKz8/Pzs7Ozs7Ozs7Ozc3NzMzMzMzMzMzMzMzM y8vL9JmT7KKe1b693bWy9JmT5KuoysrKzMfG3bWy37Kv0MTEy8vLy8vLzsjI3rWz4LKw27m30sbG 5q2p9JmT37e01cTDz8/Pz8/Pz8/P0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQx8fHq6uroaGh oaGhn5+fgoKClZWVi4uLoKCgoKCgtLS01NTU2dnZ2dnZ2NjY2NjY19fX19fX19fX19fX1tbW1tbW 9q6p9q6p9q6p9q6p7Lq319PT1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbW19fX19fX19fX19fX48jG 77i13tDP2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra0dHRr6+voaGhoaGh l5eXioqKnp6egoKCnp6eoKCgsLCw2NjY4uLi4uLi4uLi4uLi4uLi4eHh4eHh4eHh4eHh4eHh4eHh 4eHh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi 4uLi4uLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj0tLSq6uroaGhoaGhioqK l5eXoaGhkJCQkJCQoKCgqamp1tbW6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6urq6urq 6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr 6+vr6+vr7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs6+vry8vLpaWloaGhmZmZgYGBoKCg oaGhnZ2dgYGBmZmZoqKixsbG7u7u8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz 8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz 8/Pz8/Pz8/Pz8/Pz8/Pz9PT09PT09PT09PT09PT09PT05+fnubm5oaGhnZ2dhYWFlZWVoaGhoaGh oaGhlJSUhYWFnZ2dsbGx4eHh+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6 +vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6 +vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr68/Pzzs7Op6ennp6eiIiIkZGRoaGhoaGhoaGhoaGh oaGhkJCQhISEmpqavLy84ODg8vLy9/f39/f3+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn58/Pz5eXly8vLrKyslpaWhYWFkJCQoaGhoaGhoaGhoaGhoaGhoaGh oaGhlpaWgYGBjIyMoaGhsrKyurq6vb29wMDAwcHBwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA wMDAwMDAwMDAwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHB wcHBwcHBwcHBwcHBwMDAtra2pqamlpaWioqKgICAmZmZoaGhoaGhoaGhoaGh'; } elsif ($opt == 131) { $imagedata = 'Qk2mDgAAAAAAADYAAAAoAAAAOAAAABYAAAABABgAAAAAAHAOAAAmDgAAJg4AAAAAAAAAAAAAoaGh oaGhoKCgoKCgoKCgnJyckJCQiIiIh4eHh4eHhoaGhYWFhYWFhISEhISEhISEhISEg4ODg4ODg4OD goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg4ODg4ODg4ODhISEhISEhYWFhYWFhYWFhoaGhoaGh4eH h4eHh4eHh4eHh4eHiIiIiIiIiIiIiIiIiIiIjIyMlJSUnp6eoaGhoaGhoaGhoaGhoaGhoaGhoaGh oKCgoKCgkpKShoaGmpqapqamqampqKioqKiop6enp6enp6enpqampaWlpaWlpaWlpKSko6Ojo6Oj o6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjpKSkpKSkpaWlpaWlpqamp6enp6enqKioqampqampqqqqq6ur q6urq6urq6urrKysrKysrKysrKysrKyspqaml5eXhYWFlJSUoaGhoaGhoaGhoaGhoaGhoKCgoKCg jo6Oj4+PsLCwubm5uLi4t7e3t7e3tra2tbW1tLS0s7Ozs7OzsrKysbGxsbGxsbGxsLCwsLCwr6+v r6+vr6+vr6+vr6+vsLCwsLCwsLCwsbGxsbGxsrKys7OztLS0tbW1tra2t7e3t7e3uLi4ubm5urq6 urq6urq6urq6u7u7u7u7u7u7u7u7u7u7u7u7r6+vkJCQjo6OoaGhoaGhoaGhoaGhoKCgkZGRj4+P uLi4ubm5uLi4t7e3t7e3tra2tbW1tLS0s7OzsrKysbGxsbGxsLCwr6+vr6+vr6+vrq6ura2tra2t ra2tra2tra2trq6ur6+vr6+vr6+vsLCwsbGxsbGxs7OztLS0tbW1t7e3t7e3uLi4ubm5urq6urq6 urq6urq6u7u7u7u7u7u7u7u7u7u7u7u7u7u7urq6lJSUj4+PoaGhoaGhoaGhmZmZhISEsLCwtra2 tra2tbW1tLS0tLS0srKysbGxsLCwr6+vrq6ura2trKysrKysq6urqqqqqqqqqampqampqKioqamp qampqampqampqqqqqqqqq6urrKysrKysrq6ur6+vsLCwsrKys7OztLS0tLS0tbW1tra2t7e3t7e3 t7e3uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4tbW1jY2Nk5OToaGhoaGhjIyMnp6esrKysbGxsLCw r6+vr6+vrq6ura2tq6urqqqqqampqKiop6enpqampaWlpaWlpKSkpKSko6OjoqKioqKioqKioqKi o6Ojo6OjpKSkpKSkpaWlpqampqamqKioqampq6urrKysra2trq6ur6+vsLCwsbGxsrKysrKysrKy s7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozq6urg4ODn5+fnJychYWFqqqqrKysq6urqqqqqqqq qKioqKiopqampaWlpKSkoqKioaGhoKCgn5+fnp6enZ2dnZ2dnJycnJycm5ubm5ubm5ubm5ubm5ub nJycnJycnZ2dnp6en5+fn5+foaGho6OjpKSkpqampqamqKioqampqqqqq6urrKysrKysrKysra2t ra2tra2tra2tra2tra2tra2tra2tra2tra2tkZGRlZWVlJSUj4+PpqampaWlpKSkpKSko6OjoqKi oaGhoKCgnp6enZ2dnJycm5ubmZmZmZmZmJiYl5eXl5eXlpaWlZWVlZWVlJSUlJSUlZWVlZWVlZWV lpaWl5eXl5eXmJiYmZmZm5ubnZ2dnp6en5+foKCgoqKio6OjpKSkpKSkpaWlpqampqamp6enp6en p6enp6enp6enp6enp6enp6enp6enp6ennZ2diYmJjIyMk5OTn5+fnp6enZ2dnZ2dnJycm5ubmpqa mJiYl5eXlpaWlJSUk5OTkpKSkpKSkZGRkJCQkJCQjo6Ojo6Ojo6OjY2NjY2Njo6Ojo6Ojo6Oj4+P kJCQkZGRkpKSkpKSk5OTlZWVl5eXmJiYmpqam5ubnJycnZ2dnZ2dnp6en5+fn5+foKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgnp6egoKChoaGk5OTmJiYl5eXl5eXlpaWlpaWlpaWl5eXlpaW lpaWlJSUk5OTkZGRkZGRkJCQ6Dku0U1Gjo6OjY2NjY2NjIyMjIyMumJd4z406DkuxVhRlIiIn358 2ElA6Dku6Dkux1pTmY6Nn4mI3kQ76Dkuz1ZPmZmZmpqam5ubm5ubnJycnJycnZ2dnZ2dnJycm5ub mpqamZmZmZmZmZmZmZmZmZmZmJiYgoKCg4ODkJCQkpKSkZGRkZGRkpKSl5eXm5ubm5ubmpqamZmZ mJiYlpaWlpaWlZWVlZWV6Eg+01xUk5OTkpKSkpKSkZGRp3986Eg+yGRduHJt6Eg+vW5ppIaEvm5p qoF/v29q6Eg+u3VxwXFr6Eg+wnJsr4eEnZ2dnZ2dnp6enp6en5+fn5+foKCgoKCgoKCgn5+fnZ2d mJiYk5OTk5OTk5OTk5OTkpKSgoKCgoKCi4uLjIyMi4uLi4uLk5OTn5+foaGhn5+fn5+fn5+fnZ2d nJycm5ubm5ubm5ub6lhP5VxU1mlh1mlhs4SCmJiYwXh06lhPrYiHmZmZ6lhP1mlimpqax3Vx5VxU 6lhP6lhPtYiExHx36lhPso2MoaGhoqKioqKio6Ojo6Ojo6Ojo6OjpKSkpKSkpKSkpKSkpKSknp6e kpKSjY2NjY2NjY2NjIyMgoKCg4ODhoaGh4eHh4eHiYmJm5ubqampqampqKiop6enp6enpqampaWl pKSkpKSkpKSk62tj4nJrx4eD2Xlz62tjvo2Kw4qG62tjupGPp5+e62tj1Xx4tZWT62tj3nVvw4uI spqZq6OiyYmG62tjuZmWqampqampqqqqqqqqq6urq6urq6urq6urq6urq6urq6urq6urqampmJiY iYmJiIiIiIiIiIiIgoKCh4eHg4ODhISEhISEjY2Nq6urtLS0tLS0s7OzsrKysrKysbGxsLCwsLCw sLCwr6+v7X943ouGr6+vr6+v7X943ouGs6yr6YJ86YJ85oV/7X94v6Ohs6ys6oJ86oJ83oyG6oJ8 z5iV7X947X947X9434yHtLS0tLS0tLS0tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1pqamioqK hYWFhYWFhYWFgoKCjY2NgoKChISEhISEl5eXu7u7wcHBwcHBwMDAwMDAwMDAv7+/v7+/vr6+vr6+ vr6+8ZWQ552Yy7Sy1Kyp8ZWQ3aShvb29wLu61Kyp16mnxLm4vr6+vr6+wby71Kyq2Kqn0q+txbq5 3qWi8ZWQ1q2ryrm4wcHBwcHBwcHBwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCt7e3kpKShYWF hYWFhYWFgoKClZWVgYGBhISEhYWFnp6eyMjIzs7Ozc3Nzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzM 9Kun9Kun9Kun9Kun57WyzcnJy8vLy8vLzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzc3N3MC+ 6rSw1cfGzc3Nzs7Ozs7Ozs7Ozs7Ozs7Ozs7Oz8/Pz8/Pz8/Pz8/Pz8/Pz8/PxMTEl5eXhYWFhYWF g4ODioqKnp6egICAhISEhISEmZmZzc3N2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ 2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra 2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vbxcXFkpKShYWFhYWFgoKC l5eXoaGhkJCQgoKChISEkJCQysrK5ubm5ubm5ubm5ubm5ubm5eXl5eXl5eXl5eXl5eXl5eXl5eXl 5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5ubm5ubm5ubm 5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5OTku7u7ioqKhYWFhISEgICAoKCg oaGhnZ2df39/g4ODhoaGtra26urq8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw 8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw 8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw39/fpKSkhYWFhISEgYGBlZWVoaGhoaGh oaGhlJSUgICAhISEmpqa2NjY+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn57+/vwMDAjY2NhYWFgYGBkZGRoaGhoaGhoaGhoaGh oaGhkJCQgICAhoaGqKio19fX7u7u9PT09fX19/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3 9/f39/f39/f39/f39/f39/f37+/v3t7evLy8lJSUg4ODgYGBkJCQoaGhoaGhoaGhoaGhoaGhoaGh oaGhlpaWf39/gYGBkJCQpKSkra2tr6+vs7OztLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0 tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tbW1 tbW1tbW1tbW1tbW1s7Ozp6enlJSUhYWFgYGBgICAmZmZoaGhoaGhoaGhoaGh'; } elsif ($opt == 14) { $imagedata = 'Qk2mDgAAAAAAADYAAAAoAAAAOAAAABYAAAABABgAAAAAAHAOAAAmDgAAJg4AAAAAAAAAAAAAn5+f np6enp6enp6enZ2dmZmZjIyMhoaGhISEhISEg4ODg4ODgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKC goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg4ODg4OD hISEhISEhISEhYWFhYWFhoaGhoaGhoaGh4eHi4uLk5OTnZ2doKCgoaGhoaGhoaGhoaGhnp6enp6e nZ2dnZ2djo6Oi4uLtbW1zs7O1NTU09PT1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU 1NTU1NTU1NTU1NTU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT1NTU1NTU1dXV1dXV1dXV 1tbW2NjY2dnZ2tra29vb3Nzc3Nzc3Nzcz8/PsbGxiYmJk5OToaGhoaGhoaGhoaGhnp6enZ2dnZ2d i4uLnZ2d4uLi8/Pz8vLy8fHx8fHx8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw 8PDw8PDw7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v8PDw8PDw8fHx8vLy8vLy8/Pz 9fX19vb2+Pj4+fn5+vr6+/v7/Pz8/f39/f395eXloKCgjo6OoaGhoaGhoaGhnZ2dnZ2djY2Nm5ub 8PDw8vLy8fHx8PDw7+/v7u7u7u7u7u7u7u7u7e3t7e3t7e3t7e3t7e3t7u7u7u7u7u7u7u7u7u7u 7e3t7e3t7e3t7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7e3t7u7u7+/v8PDw8fHx8vLy8/Pz 9fX19vb2+Pj4+fn5+vr6+/v7/Pz8/f39/v7++/v7qqqqj4+PoaGhoaGhnZ2dlZWVh4eH39/f7Ozs 6urq6enp6Ojo5ubm5ubm5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl 5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5eXl5eXl5ubm6Ojo6enp6urq7Ozs7e3t 7+/v8fHx8vLy9PT09fX19vb29/f39/f3+Pj48vLynJyck5OToaGhnZ2diIiIvb295eXl4+Pj4uLi 39/f3t7e3d3d3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb 29vb29vb29vb2tra2tra2tra2tra2tra2tra29vb29vb3Nzc3d3d3t7e4ODg4uLi4+Pj5eXl5+fn 6Ojo6urq6+vr7Ozs7e3t7u7u7+/v8PDw8PDw4ODgh4eHn5+fl5eXiYmJ2NjY2tra2dnZ1tbW1dXV 09PT0tLS0dHR0dHR0dHR0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0NDQ0NDQ0NDQ 0NDQz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHR0tLS09PT1dXV1tbW2dnZ2tra3Nzc3t7e 4ODg4eHh4uLi4+Pj5OTk5eXl5ubm5ubm5+fnp6enlZWVj4+Pnp6e0dHRz8/Pzc3Ny8vLycnJyMjI x8fHxsbGxsbGxsbGxsbGxcXFxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxcXFxcXFxcXF xMTExMTExMTExMTExMTExMTExMTExMTExsbGxsbGx8fHyMjIysrKy8vLzc3Nz8/P0dHR09PT1NTU 1tbW2NjY2dnZ2dnZ2tra29vb29vb3NzcxMTEiYmJh4eHq6urxcXFw8PDwcHBv7+/vr6+vLy8vLy8 u7u7u7u7urq6ubm5ubm5ubm5ubm5ubm5ubm5urq6urq6u7u7u7u7u7u7urq6ubm5ubm5ubm5uLi4 uLi4uLi4uLi4uLi4uLi4uLi4ubm5urq6u7u7vLy8vb29vr6+wMDAwcHBxMTExcXFx8fHycnJysrK y8vLzc3Nzs7Ozs7Oz8/Pz8/P0NDQy8vLgoKCgYGBr6+vubm5uLi4tra2tLS0s7OztLS0tLS08kE3 8kI38kI48kI43mRetaqqsbGx8kI44l5WsrKys7Ozt6yr22xm8kI47kk/0Xp1sbGxsbGxuaOi8kI4 8kI4sbGxxY+L8kI42mxlsbGxvZ2b5ldO8kI48kI43G5nvLCwvbGx4Whg8kI48kI46FpRx7GwwMDA wsLCwsLCwsLCw8PDw8PDxMTEwMDAgoKCfn5+rKyssLCwrq6urKysq6urr6+vsrKysrKy8FBG5GNa wZiWzIaB8FBG2HRusLCw8FBG4GlhsbGxsbGx0IF88FBGzYeC2HRu8FBGwZiWsbGxyIyI8FBG7FZN wJiW2HRu7FZN6FxTsbGxvZ6d0IF8wpqX0YJ98FBGz4iE4mpi8FBG0YuHyKCd1oeBx6mmvr6+vb29 urq6uLi4uLi4uLi4ubm5tra2goKCfX19paWlpqampaWlo6OjqKiosrKys7Ozs7Oz8F5V4HNtsrKy uqem8F5V3XhysrKy8F5V4HNts7Ozs7Oz4XRt8F5Vs7Ozwp2b8F5V0YiEs7Oz3Xhy8F5V2X540YiE 7GRb0YiE8F5VvqOhs7Oz1YR+7GRb8F5V8F5VyJqY8F5V6Wlh1IyI1YyI1o2IwrCvvb29vb29urq6 sbGxrq6urq6ur6+vrKysgoKCf39/nZ2dn5+fnp6en5+frq6uuLi4t7e3t7e38HBo8HBo8HBo8HBo 5n13wamot7e38HBo5n13t7e3t7e334aB8HBou7OyyaGf8HBo0ZiUt7e38HBo4oJ8zJyZ8HBo8HBo urKy8HBo05SQxaWk8HBo5n130ZmVxKuqvrW17XVt6npz1paS5IN98HBoy6upv7+/wMDAv7+/srKy p6enpqamp6enpaWlgoKCg4ODlZWVmpqamZmZoKCguLi4wMDAv7+/vr6+8oN96I6Jy6+u4ZaR74eB wbu6vr6+8oN964qF74eB2KGezLCu8oN964qF74eB74eBwbu6z6yq8oN92KGexbe28oN94ZaRvr6+ 5ZKN6I6Jwru774eB74eB5ZKN74eBzbGw1Kqn8oN95pOO74eB7IuGxMTExMTExcXFxsbGurq6pKSk oaGhoaGhn5+fgoKCioqKj4+Pm5ubmpqaqampx8fHy8vLy8vLy8vL9JmT7KKe1b6956il9JmT1b69 y8vL1b6908HA0MTE0MTEy8vL0MXE4LKv3bWyzcjHy8vL0MTE1b69zcjHy8vL1b690MTEy8vL0MTE 1b69y8vLzsjI3rWz4LKw27m2z8nJzc3N18C/4bOx37e00cvLz8/Pz8/Pz8/P0NDQx8fHqqqqoaGh oaGhn5+fgoKCkZGRiIiInJycm5ubr6+v0tLS1tbW1tbW1tbW9q6p9q6p9q6p9q6p6r261tbW1tbW 1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW 1tbW1tbW19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ0NDQrq6uoaGhoaGh l5eXioqKm5ubgICAm5ubnJycrKys1tbW4eHh4eHh4eHh4eHh4eHh4eHh4ODg4eHh4eHh4eHh4eHh 4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh 4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4+Pj4+Pj0tLSqqqqoaGhoaGhioqK l5eXnp6ejY2Njo6OnZ2dpqam1NTU6+vr6+vr6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq 6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr 6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr7Ozs7Ozs6+vrysrKpaWloaGhmZmZgYGBoKCg n5+fm5ubf39/l5eXn5+fxcXF7u7u8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz 8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz 8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz5ubmuLi4oaGhnZ2dhYWFlZWVoaGhoKCg n5+fkpKShISEnJycsLCw4ODg+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6 +vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6 +vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr68/Pzzs7Op6ennp6eiIiIkZGRoaGhoaGhoKCgoKCg oKCgj4+Pg4ODmZmZu7u74ODg8fHx9/f39/f3+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn58/Pz5eXlysrKrKyslpaWhYWFkJCQoaGhoaGhoaGhoKCgoKCgoKCg oKCglpaWgYGBi4uLoKCgsrKyurq6vLy8v7+/wMDAwMDAwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHB wcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHB wcHBwcHBwcHBwcHBv7+/tra2pqamlpaWioqKgICAmZmZoaGhoaGhoaGhoaGh'; } elsif ($opt == 141) { $imagedata = 'Qk2mDgAAAAAAADYAAAAoAAAAOAAAABYAAAABABgAAAAAAHAOAAAmDgAAJg4AAAAAAAAAAAAAn5+f np6enp6enp6enZ2dmZmZjIyMhoaGhISEhISEg4ODg4ODgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKC goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg4ODg4OD hISEhISEhISEhYWFhYWFhoaGhoaGhoaGh4eHi4uLk5OTnZ2doKCgoaGhoaGhoaGhoaGhnp6enp6e nZ2dnZ2djo6OgoKClpaWoaGhpKSko6OjpKSko6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj o6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjpKSkpKSkpaWl paWlp6enp6enqKioqampqampqampqqqqpaWllpaWhISEk5OToaGhoaGhoaGhoaGhnp6enZ2dnZ2d i4uLioqKqqqqsrKysbGxsbGxsbGxsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCw sLCwsLCwr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vsLCwsLCwsbGxsbGxsbGxsrKy tLS0tLS0tra2t7e3t7e3uLi4ubm5urq6urq6rq6uj4+Pjo6OoaGhoaGhoaGhnZ2dnZ2djY2NioqK sbGxsbGxsbGxsLCwr6+vr6+vr6+vr6+vr6+vrq6urq6urq6urq6urq6ur6+vr6+vr6+vr6+vr6+v rq6urq6urq6ura2tra2tra2tra2tra2tra2tra2tra2tra2trq6ur6+vr6+vsLCwsbGxsbGxsrKy tLS0tLS0tra2t7e3t7e3uLi4ubm5urq6urq6ubm5lJSUj4+PoaGhoaGhnZ2dlZWVgICAqampr6+v ra2trKysrKysqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qampqampqampqampqampqKioqampqampqampqampqampqqqqqqqqqqqqrKysrKysra2tr6+vr6+v sbGxsrKys7OztLS0tbW1tra2t7e3t7e3t7e3tLS0jY2Nk5OToaGhnZ2diIiImJiYqqqqqKioqKio pqampaWlpKSkpKSkpKSkpKSko6Ojo6Ojo6Ojo6Ojo6Ojo6OjpKSkpKSkpKSkpKSkpKSkpKSko6Oj o6Ojo6Ojo6OjoqKioqKioqKioqKioqKioqKio6Ojo6OjpKSkpKSkpaWlpqamqKioqKioqqqqq6ur rKysrq6ur6+vr6+vsLCwsbGxsrKysrKysrKyq6urg4ODn5+fl5eXgYGBo6OjpKSkoqKioKCgn5+f np6enZ2dnZ2dnZ2dnZ2dnJycnJycnJycnJycnJycnJycnJycnZ2dnZ2dnZ2dnZ2dnJycnJycnJyc nJycm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubnJycnZ2dnZ2dnp6en5+foKCgoqKipKSkpaWlpqam qKioqKioqqqqqqqqq6urrKysrKysrKysra2tkZGRlZWVj4+PioqKnp6enZ2dnJycmpqamZmZmJiY l5eXl5eXlpaWlpaWlpaWlZWVlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlZWVlZWVlZWV lZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlpaWl5eXl5eXmJiYmZmZmpqanJycnZ2dnp6eoKCgoaGh oqKipKSkpKSkpaWlpqampqampqamp6ennZ2diYmJh4eHjo6OmJiYlpaWlZWVk5OTkpKSkZGRkJCQ kJCQkJCQj4+Pjo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Pj4+PkJCQkJCQkJCQj4+Pjo6Ojo6Ojo6Ojo6O jo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+PkJCQkJCQkpKSkpKSk5OTlZWVl5eXmJiYmZmZmpqanJyc nJycnZ2dnp6en5+fn5+fn5+foKCgnp6egoKCgYGBjY2NkZGRj4+Pjo6OjIyMjIyMjo6Ojo6O6Dgt 6Dgt6Dku6Dkuy1NMk4eHjY2N6Dku0U1Gjo6Ojo6OlIiIxllS6Dku4z40umJejY2NjY2NmIOC6Dku 6DkujY2NqnJv6DkuxVhRjY2Nn35810lA6Dku6Dkux1pTmIyLmI2MzlVO6Dku6Dku2UtCooyLl5eX mJiYl5eXmJiYmJiYmJiYmZmZmJiYgoKCfn5+i4uLjIyMioqKiYmJiYmJj4+Pk5OTlJSU6Eg+2FZO qIF+uHJt6Eg+yGRdkpKS6Eg+01tTk5OTk5OTvm5p6Eg+uXJuyGRe6Eg+qIF+k5OTs3Zy6Eg+401D qIB9yGRd401D3lJIk5OTo4WDvm5pqYF+vm9q6Eg+unRw1FxV6Eg+vHZyroaDwnJtq42LnJycm5ub lpaWkpKSkpKSkpKSk5OTkpKSgoKCfX19hoaGhoaGhYWFhISEi4uLmJiYmpqampqa6lhP1mlhmZmZ o5GQ6lhP0G1mmZmZ6lhP1mlhmpqampqa1mli6lhPmpqaromH6lhPwnl0mpqa0G1m6lhPy3FrwXh0 5VxUwXh06lhPqY2MmpqaxnRw5VxU6lhP6lhPtYiE6lhP4GFZxHx3xHx4xXx4q5iYoqKio6OjnZ2d kZGRjIyMjIyMjY2NjIyMgoKCf39/goKCgoKCgYGBgoKClpaWpKSkpKSko6Oj62tj62tj62tj62tj 3nVvsJmXo6Oj62tj3nVvo6Ojo6Oj1Xx462tjqKCgupKP62tjw4qHo6Oj62tj2Xlzvo6L62tj62tj p6Cf62tjx4eDtZWT62tj3nVvw4uIspqZqaKh525n43NsyYmG2np162tjupqYqqqqqqqqqKiol5eX iIiIh4eHiIiIiIiIgoKCg4ODf39/f39/fn5+iIiIpqamsLCwr6+vr6+v7X944YiDvqOh2o6J6YJ8 s6yrr6+v7X945oV/6oJ8zpeUv6Oh7X945oV/6oJ86oJ8s6ysw6Ce7X94zpeUt6mp7X942o6Kr6+v 3ouG4oiDs6ys6oJ86oJ83oyG6oJ8wKSjyJ6c7X943oyH6oJ85oaAtLS0tLS0tLS0tbW1pqamiYmJ hYWFhYWFhYWFgoKCioqKf39/gICAf39/k5OTubm5vr6+vr6+vr6+8ZWQ552Yy7Sy4aKe8ZWQy7Sy vr6+y7Syx7a1xLm4xLm4vr6+xbm416qn1Kyqwbu7vr6+xLm4y7Sywbu7vr6+y7SyxLm4vr6+xLm4 y7Syvr6+wby71Kyq16qn0q+twr28v7+/zLW02Kuo1q2rxL6+wcHBwcHBwcHBwsLCt7e3kZGRhYWF hYWFhYWFgoKCkZGRfn5+gYGBgYGBmpqaxsbGzMzMzMzMzMzM9Kun9Kun9Kun9Kun5Le1zMzMzMzM zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzM zMzMzMzMzMzMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzs7Ozs7Ozs7Ozs7Ow8PDlpaWhYWFhYWF g4ODioqKm5ubfn5+gYGBgYGBlpaWzMzM2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ 2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ 2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2traxMTEkZGRhYWFhYWFgoKC l5eXnp6ejY2NgICAgYGBjY2NyMjI5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl 5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl 5eXl5eXl5eXl5eXl5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5OTku7u7ioqKhYWFhISEgICAoKCg n5+fm5ubfX19gYGBhISEtLS06enp8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw 8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw 8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw39/fo6OjhYWFhISEgYGBlZWVoaGhoKCg n5+fkpKSf39/g4ODmZmZ2NjY+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn57+/vv7+/jY2NhYWFgYGBkZGRoaGhoaGhoKCgoKCg oKCgj4+Pf39/hYWFp6en19fX7e3t9PT09fX19/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3 9/f39/f39/f39/f39/f39/f37+/v3d3du7u7lJSUg4ODgYGBkJCQoaGhoaGhoaGhoKCgoKCgoKCg oKCglpaWf39/gICAj4+Po6Ojra2tr6+vs7OztLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0 tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0 tLS0tLS0tLS0tLS0srKyp6enlJSUhYWFgYGBgICAmZmZoaGhoaGhoaGhoaGh'; } elsif ($opt == 15) { $imagedata = 'Qk2mDgAAAAAAADYAAAAoAAAAOAAAABYAAAABABgAAAAAAHAOAAAmDgAAJg4AAAAAAAAAAAAAn5+f n5+fnp6enp6enZ2dmZmZjY2NhoaGhYWFhISEg4ODg4ODg4ODg4ODg4ODgoKCgoKCgoKCgoKCgoKC goKCgoKCgoKCgoKCgoKCgoKCgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgoKCgoKCgoKCg4ODg4OD hISEhISEhYWFhYWFhoaGhoaGhoaGh4eHh4eHi4uLk5OTnp6eoaGhoaGhoaGhoaGhoaGhn5+fnp6e np6enZ2dj4+Pi4uLtbW1z8/P1NTU09PT1dXV1dXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTU09PT 09PT09PT09PT0tLS0tLS0tLS0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PT09PT1NTU1dXV1dXV1tbW 2NjY2dnZ2tra29vb3Nzc3Nzc3d3d3d3d0NDQsbGxioqKlJSUoaGhoaGhoaGhoaGhnp6enp6enZ2d i4uLnp6e4+Pj9PT08/Pz8vLy8vLy8fHx8fHx8fHx8PDw8PDw8PDw8PDw8PDw8PDw7+/v7+/v7+/v 7+/v7u7u7u7u7u7u7e3t7e3t7Ozs7Ozs7Ozs7Ozs7e3t7u7u7u7u7+/v8PDw8fHx8vLy8/Pz9fX1 9/f3+Pj4+fn5+vr6+/v7/Pz8/f39/f39/v7+5eXloaGhjo6OoaGhoaGhoaGhnp6enZ2djo6OnJyc 8fHx8/Pz8vLy8fHx8PDw8PDw7+/v7+/v7u7u7u7u7u7u7u7u7u7u7u7u7e3t7e3t7Ozs7Ozs7Ozs 7Ozs6+vr6+vr6+vr6urq6urq6urq6enp6urq6urq6+vr6+vr7Ozs7u7u7+/v8PDw8vLy8/Pz9fX1 9/f3+Pj4+vr6+/v7/Pz8/f39/f39/v7+/v7+/Pz8qqqqj4+PoaGhoaGhnZ2dlpaWiIiI4ODg7e3t 7Ozs6+vr6enp6Ojo6Ojo5ubm5ubm5ubm5eXl5eXl5eXl5eXl5eXl5eXl5OTk5OTk5OTk5OTk5OTk 5OTk5OTk4+Pj4+Pj4uLi4uLi4uLi4uLi4+Pj4+Pj5OTk5OTk5eXl5+fn6Ojo6urq7Ozs7u7u7+/v 8vLy8/Pz9PT09fX19vb29/f3+Pj4+Pj4+fn58/PznJyck5OToaGhnZ2diYmJvr6+5+fn5eXl4+Pj 4uLi4eHh39/f3t7e3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vb29vb29vb29vb2tra2tra 2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2tra29vb3Nzc3t7e39/f4eHh4+Pj5eXl5+fn6enp 6urq7Ozs7e3t7u7u7+/v8PDw8PDw8fHx8fHx4ODgh4eHn5+fmJiYioqK2dnZ3Nzc2tra2dnZ19fX 1dXV1NTU09PT0tLS0tLS0dHR0dHR0dHR0dHR0NDQ0NDQ0NDQ0NDQ0NDQ0NDQz8/Pz8/Pz8/Pz8/P zs7Ozs7Ozc3Nzc3Nzc3Nzc3Nzs7Oz8/Pz8/P0NDQ0tLS09PT1dXV1tbW2dnZ2tra3Nzc3t7e4eHh 4uLi4uLi5OTk5OTk5eXl5ubm5+fn5+fn5+fnp6enlZWVkJCQn5+f09PT0dHRz8/Pzc3Ny8vLysrK ycnJx8fHx8fHxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxcXFxcXFxcXFxMTExMTEw8PDw8PD wsLCwsLCwsLCwsLCwsLCw8PDw8PD90A162JZxsbGyMjIysrKzMzMzc3N0NDQ0tLS09PT1dXV19fX 2NjY2dnZ2dnZ2tra29vb3Nzc3Nzc3NzcxMTEiYmJiIiIrKysxsbGxcXFw8PDwcHBwMDAvr6+vb29 vLy8vLy8vLy8u7u7u7u7urq6urq6urq6urq6urq6urq6ubm5ubm5ubm5ubm5uLi4uLi4uLi4uLi4 uLi4uLi4t7e3uLi4uLi4uLi49D0y5l1UvLy8vb29vr6+wMDAwsLCxMTExsbGyMjIycnJy8vLzMzM zc3Nzs7Ozs7Oz8/P0NDQ0NDQ0NDQy8vLgoKCgoKCsbGxu7u7ubm5uLi4tra2tra2tbW1tbW1ua2t 221m7kk/8kI46lBH2mxlsrKy0nt18kI4wpeUsrKysrKyxo+M6lBH8kI44l5WvZyasbGxxI6K7kk/ 6U9H4l5W8kI4wZaTsbGx8kI47kk/7kk/7ko/zYuHuLi4419Y8kI48kI45WFZyqmnwcHBwsLCwsLC w8PDwsLCw8PDxMTExMTExMTEwMDAgoKCf39/ra2tsLCwr6+vra2tra2tsLCws7Ozs7Oz4Glh8FBG 2HVuwpmW5GNa8FBGsbGx0IF78FBGwZiWsbGxtauq7FZN5GNaxZKP7FZN4GhgsLCw4Ghg8FBGw5GO 3G5n8FBGwJiWsLCw8FBG5WNawpqX6FxU7VZNua+u23dxx56cypiW8FBG33Jrvr6+vr6+v7+/vr6+ u7u7uLi4ubm5ubm5ubm5tra2goKCfn5+pqamp6enpqampaWlqqqqs7OztLS0u6mn8F5V4XRts7Oz wp2b5W5n8F5Vs7Oz0YiE8F5Vwp2bs7Ozwp2b8F5V0YiEs7Oz4HNt8F5VsrKy4HNt8F5VsbGx0IiE 8F5Vwp2bsrKy8F5V4XRts7Oz0omF8F5VxJ+ezZaT6Wli8F5V8F5V2YeCvLy8vb29vr6+v7+/u7u7 sbGxr6+vr6+vr6+vrKysgoKCf39/np6eoKCgn5+foKCgr6+vurq6ubm5xqak8HBo05SQt7e38HBo 8HBo8HBot7e305SQ8HBoyaGft7e3wqqp8HBo14+Lt7e35n137XRtt7e34oF88HBot7e305OP8HBo xaWjt7e38HBo4oJ8uLi42JCM8HBoyKem8HBo7XVt1paSyqqowbq5v7+/v7+/wMDAwcHBwMDAsrKy qKiop6enp6enpaWlgoKChISElZWVm5ubmpqaoaGhubm5wMDAwMDAybSz8oN93pqVvr6+vr6+vr6+ vr6+vr6+2KGe8oN96I6J8oN9v7+/5ZKN8oN96I6J8oN92KGevr6+5ZKN8oN9vr6+2KGe8oN9y6+u vr6+8oN974eB5ZKN8oN97IuFwcHB5pOO8oN95pSO7IuG26SgxMTExcXFxcXFxsbGxsbGurq6paWl oaGhoaGhn5+fgoKCioqKkJCQnJycm5ubqqqqx8fHzMzMzMzMy8vL7KKe9JmT1b69y8vL0MTE6qWh y8vL0MTE1b69zcjH1b69y8vLy8vL2ri237Kv1b69y8vLy8vL08HA1b69y8vL0MTE1b69zcjHy8vL 1b6908LB1r++4LKw0cbFzMzMzc3N3Lm34bSx37e008jHz8/Pz8/P0NDQ0NDQ0NDQx8fHq6uroaGh oaGhn5+fgoKCkpKSiYmJnZ2dnJycsLCw0tLS19fX19fX1tbW3M/O8LWy9q6p9q6p9q6p8rOv1tbW 1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW 1tbW19fX19fX19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ0NDQr6+voaGhoaGh l5eXioqKnJycgICAm5ubnZ2dra2t19fX4eHh4eHh4eHh4eHh4eHh5dva59nY5dva4eHh4eHh4eHh 4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh 4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj0tLSq6uroaGhoaGhioqK l5eXn5+fjo6Ojo6OnZ2dpqam1NTU6+vr6+vr6+vr6+vr6urq6urq6urq6urq6urq6urq6+vr6+vr 6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr 6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr7Ozs7Ozs7Ozs7Ozs6+vry8vLpaWloaGhmZmZgYGBoKCg n5+fm5ubgICAl5eXoKCgxcXF7u7u8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz 8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz 8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz5+fnubm5oaGhnZ2dhYWFlZWVoaGhoKCg n5+fkpKShISEnJycsLCw4ODg+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6 +vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6 +vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr68/Pzzs7Op6ennp6eiIiIkZGRoaGhoaGhoKCgoKCg oKCgkJCQg4ODmZmZu7u74ODg8fHx9/f39/f3+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn58/Pz5eXly8vLrKyslpaWhYWFkJCQoaGhoaGhoaGhoKCgoKCgoKCg oKCglpaWgYGBjIyMoaGhsrKyurq6vLy8v7+/wcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHB wcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHB wcHBwcHBwcHBwcHBwMDAtra2pqamlpaWioqKgICAmZmZoaGhoaGhoaGhoaGh'; } elsif ($opt == 151) { $imagedata = 'Qk2mDgAAAAAAADYAAAAoAAAAOAAAABYAAAABABgAAAAAAHAOAAAmDgAAJg4AAAAAAAAAAAAAn5+f n5+fnp6enp6enZ2dmZmZjY2NhoaGhYWFhISEg4ODg4ODg4ODg4ODg4ODgoKCgoKCgoKCgoKCgoKC goKCgoKCgoKCgoKCgoKCgoKCgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgoKCgoKCgoKCg4ODg4OD hISEhISEhYWFhYWFhoaGhoaGhoaGh4eHh4eHi4uLk5OTnp6eoaGhoaGhoaGhoaGhoaGhn5+fnp6e np6enZ2dj4+Pg4ODlpaWoaGhpaWlpKSkpKSkpKSkpKSko6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj o6Ojo6Ojo6OjoqKioqKioqKioaGhoaGhoaGhoaGhoaGhoqKioqKio6Ojo6Ojo6OjpKSkpaWlpaWl p6enp6enqKioqampqampqqqqq6urq6urpaWllpaWhYWFlJSUoaGhoaGhoaGhoaGhnp6enp6enZ2d i4uLi4uLq6urs7OzsrKysbGxsbGxsbGxsbGxsbGxsLCwsLCwsLCwsLCwsLCwsLCwr6+vr6+vr6+v r6+vr6+vr6+vr6+vrq6urq6ura2tra2tra2tra2trq6ur6+vr6+vr6+vsLCwsbGxsbGxsrKytLS0 tbW1tra2t7e3t7e3uLi4ubm5urq6urq6urq6rq6ukJCQjo6OoaGhoaGhoaGhnp6enZ2djo6Oi4uL srKysrKysbGxsbGxsLCwsLCwr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vrq6urq6ura2tra2tra2t ra2trKysrKysrKysrKysrKysrKysq6urrKysrKysrKysrKysra2tr6+vr6+vsLCwsbGxsrKytLS0 tbW1tra2t7e3uLi4ubm5urq6urq6urq6urq6urq6lJSUj4+PoaGhoaGhnZ2dlpaWgYGBqqqqr6+v r6+vrq6urKysrKysrKysqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqampqampqampqampqKio qKioqKiop6enp6enp6enp6enp6enp6enp6enp6enqKioqampqqqqq6urrKysra2tr6+vsLCwsbGx s7OztLS0tLS0tbW1tra2t7e3t7e3t7e3uLi4tbW1jY2Nk5OToaGhnZ2diYmJmZmZq6urqqqqqKio qKiop6enpqampaWlpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSko6Ojo6Ojo6Ojo6Ojo6OjoqKioqKi oaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoqKio6OjpKSkpaWlpqamp6enqKioqqqqq6urra2t rq6ur6+vsLCwsbGxsrKysrKysrKys7Ozs7Ozq6urg4ODn5+fmJiYgYGBpKSkpaWlpKSkoqKioaGh n5+fn5+fnp6enZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnJycnJycnJycnJycnJycnJycm5ubm5ubm5ubm5ub mpqampqamZmZmZmZmZmZmZmZmpqam5ubm5ubnJycnZ2dnp6en5+foKCgoqKipKSkpaWlpqamqKio qampqqqqq6urq6urrKysrKysra2tra2tra2tkZGRlZWVkJCQioqKoKCgnp6enZ2dnJycmpqamZmZ mZmZl5eXl5eXl5eXl5eXlpaWlpaWlpaWlpaWlpaWlpaWlpaWlZWVlZWVlZWVlZWVlZWVlJSUlJSU k5OTk5OTk5OTk5OTk5OTlJSUlJSU6jMo1UxEl5eXmJiYmZmZm5ubnJycnp6en5+foKCgoqKio6Oj pKSkpKSkpaWlpqampqamp6enp6enp6ennZ2diYmJiIiIjo6OmJiYl5eXlpaWlZWVk5OTkpKSkpKS kZGRkJCQkJCQkJCQkJCQj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2N jY2NjY2NjY2NjY2NjY2Njo6O6DIm0kpBkJCQkpKSkpKSk5OTlZWVl5eXmJiYmpqam5ubnJycnZ2d nZ2dnp6en5+fn5+foKCgoKCgoKCgnp6egoKCgoKCjo6OkpKSkZGRj4+Pjo6Ojo6Oj4+Pj4+PlYmJ xllS4z406Dku3UM6xllSjo6Ou2Ne6DkupXl2jo6Ojo6OqnNw3UM66Dku0U1Gnn17jY2NqXJu4z00 3UM60U1G6DkupHh1jY2N6Dku4z404z404z40sW9rk5OT009I6Dku6Dku1FBJqIaFmZmZmZmZmZmZ mJiYmJiYmJiYmZmZmZmZmZmZmJiYgoKCf39/i4uLjIyMi4uLioqKi4uLkJCQlZWVlZWV01xU6Eg+ yWReqYF+2FZO6Eg+k5OTvW5p6Eg+qIF+k5OTmI+O401D2FZOrXt5401D0ltTkpKS0ltT6Eg+rHp3 zV9Y6Eg+qIB9kpKS6Eg+2FZOqYF+3lJI405DnJGRymZgrYWCs4F96Eg+0GNcnZ2dnZ2dnZ2dm5ub l5eXkpKSk5OTk5OTk5OTkpKSgoKCfn5+h4eHh4eHhoaGhYWFjY2NmJiYm5ubpJKR6lhP1mlimpqa romH2mVd6lhPmpqawnl06lhPromHmpqaromH6lhPwnl0mpqa1mlh6lhPmZmZ1mlh6lhPmZmZwXh0 6lhPrYiHmZmZ6lhP1mlim5ubwnl16lhPsIyJu4SA4GFZ6lhP6lhPynhzoqKio6Ojo6Ojo6OjnZ2d kZGRjY2NjY2NjY2NjIyMgoKCf39/g4ODgoKCgoKChISEl5eXpaWlpKSktpaU62tjx4eDo6Oj62tj 62tj62tjo6Ojx4eD62tjupGPo6OjsJmX62tjzIN/o6Oj3nVv525no6Oj2Xlz62tjo6Ojx4eD62tj tZWTo6Oj62tj2XlzpKSkzISA62tjt5eV62tj525nyoqGupmXrqWlqampqqqqqqqqq6urqampl5eX iYmJiIiIiIiIiIiIgoKChISEgICAgICAf39/iIiIp6ensLCwsLCwu6em7X941pGNr6+vr6+vr6+v r6+vr6+vzpeU7X944oiD7X94r6+v3ouG7X944oiD7X94zpeUr6+v3ouG7X94r6+vzpeU7X94v6Oh r6+v7X946oJ83ouG7X945oWAsbGx3oyH7X9434yH5oaA0JqWtLS0tLS0tLS0tbW1tbW1pqamioqK hYWFhYWFhYWFgoKCioqKf39/gYGBgICAlJSUubm5v7+/vr6+vr6+552Y8ZWQy7Syvr6+xLm45J+b vr6+xLm4y7Sywbu7y7Syvr6+vr6+0a+s16qny7Syvr6+vr6+x7a1y7Syvr6+xLm4y7Sywbu7vr6+ y7SyyLe1y7Sz2Kqnxbq5v7+/v7+/0rCu2Kuo1q6rx7u7wcHBwcHBwsLCwsLCwsLCt7e3kpKShYWF hYWFhYWFgoKCkpKSf39/gYGBgoKCm5ubxsbGzMzMzMzMzMzM08bF7LGu9Kun9Kun9Kun7q+rzMzM zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzM zMzMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ow8PDl5eXhYWFhYWF g4ODioqKnJycfn5+goKCgYGBlpaWzMzM2dnZ2dnZ2dnZ2dnZ2dnZ3tTT4NLR3tTT2dnZ2dnZ2dnZ 2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ 2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2traxcXFkpKShYWFhYWFgoKC l5eXn5+fjo6OgICAgoKCjY2NyMjI5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl 5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl 5eXl5eXl5eXl5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5OTku7u7ioqKhYWFhISEgICAoKCg n5+fm5ubfn5+gYGBhISEtbW16enp8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw 8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw 8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw39/fpKSkhYWFhISEgYGBlZWVoaGhoKCg n5+fkpKSf39/g4ODmpqa2NjY+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn57+/vwMDAjY2NhYWFgYGBkZGRoaGhoaGhoKCgoKCg oKCgkJCQf39/hYWFp6en19fX7e3t9PT09fX19/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3 9/f39/f39/f39/f39/f39/f37+/v3t7evLy8lJSUg4ODgYGBkJCQoaGhoaGhoaGhoKCgoKCgoKCg oKCglpaWf39/gYGBkJCQo6Ojra2tr6+vs7OztLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0 tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0 tLS0tLS0tLS0tLS0s7Ozp6enlJSUhYWFgYGBgICAmZmZoaGhoaGhoaGhoaGh'; } elsif ($opt == 16) { $imagedata = 'Qk2mDgAAAAAAADYAAAAoAAAAOAAAABYAAAABABgAAAAAAHAOAAAmDgAAJg4AAAAAAAAAAAAAn5+f n5+fnp6enp6enZ2dmZmZjIyMhYWFhISEg4ODgoKCgoKCgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGB gYGBgYGBgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg4ODg4OD g4ODhISEhISEhISEhYWFhYWFhYWFhoaGhoaGioqKk5OTnZ2doKCgoKCgoaGhoaGhoaGhn5+fnp6e np6enZ2dj4+Pi4uLtbW1zs7O1NTU0tLS09PT09PT0tLS0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS 0tLS0tLS0tLS0tLS09PT09PT09PT09PT09PT09PT09PT09PT09PT1NTU1NTU1NTU1dXV1dXV1dXV 1dXV1tbW19fX2NjY2dnZ2tra29vb3Nzcz8/PsLCwiYmJk5OToKCgoKCgoaGhoaGhnp6enp6enZ2d i4uLnZ2d4uLi8/Pz8vLy8fHx8PDw7+/v7u7u7e3t7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7e3t 7e3t7u7u7u7u7u7u7u7u7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v8PDw8PDw8PDw8fHx8vLy8vLy 8/Pz9PT09fX19/f3+Pj4+fn5+vr6+/v7/Pz85OTkoKCgjY2NoKCgoaGhoaGhnp6enZ2djo6Om5ub 8PDw8/Pz8fHx8PDw7u7u7e3t7Ozs6+vr6urq6enp6enp6enp6enp6enp6enp6enp6urq6urq6urq 6+vr6+vr6+vr6+vr7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7e3t7u7u7u7u7+/v8PDw8fHx8vLy 8/Pz9PT09fX19/f3+Pj4+vr6+/v7/Pz8/Pz8+vr6qampjo6OoaGhoaGhnp6elpaWiIiI4ODg7e3t 6+vr6enp6Ojo5ubm5OTk5OTk4+Pj4uLi4uLi4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4+Pj4+Pj 4+Pj5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5eXl5eXl5ubm5+fn6Ojo6enp6urq6+vr 7e3t7u7u8PDw8vLy8/Pz9PT09fX19vb29/f38vLym5ubk5OToaGhnZ2diYmJvr6+5ubm5OTk4uLi 4ODg3t7e3d3d29vb2tra2dnZ2NjY19fX19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ 2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vb29vb29vb3Nzc3d3d3t7e39/f4ODg4eHh4+Pj5OTk 5ubm6Ojo6enp6urq6+vr7e3t7u7u7+/v7+/v39/fh4eHn5+fmJiYi4uL2dnZ29vb2dnZ2NjY1dXV 1NTU0tLS0NDQz8/Pzs7Ozc3NzMzMzMzMzMzMy8vLzMzMzMzMzMzMzMzMzc3Nzc3Nzc3Nzs7Ozs7O zs7Oz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDQ0dHR0tLS09PT1NTU1dXV1tbW2NjY2dnZ29vb 3d3d3t7e4eHh4uLi4uLi4+Pj5OTk5eXl5ubmpqamlZWVkJCQn5+f09PT0dHRzs7OzMzMysrKyMjI x8fHxsbGxMTEw8PDwsLCwcHBwMDAwMDAzqCd90A124B7wMDAwcHBwcHBwsLCwsLCwsLCwsLCw8PD w8PDw8PDxMTExMTExMTExMTExMTExcXFxsbGxsbGxsbGx8fHyMjIysrKy8vLzMzMzs7O0NDQ0tLS 09PT1dXV19fX2NjY2dnZ2dnZ2tra29vbw8PDiYmJiIiIrKysxsbGxcXFw8PDwcHBv7+/vb29vLy8 urq6uLi4uLi4t7e3tra2tra2tbW1xZeU9D0y1Xp0tra2tra2tra2t7e3t7e3t7e3uLi4uLi4uLi4 uLi4uLi4uLi4uLi4ubm5ubm5ubm5urq6u7u7vLy8vLy8vb29vr6+wMDAwcHBw8PDxcXFxsbGyMjI ycnJysrKzMzMzc3Nzs7Ozs7Oz8/PysrKgoKCgoKCsbGxu7u7ubm5uLi4tbW1tbW1tLS0tLS0tquq 2mxl8kI48kI44V1Vu5qYrq6uv5SR8kI46U9H8kI46U9Hu5qYr6+vxI2K7kk/8kI4zYB80Xp08kI4 wZaTtaqq2mxl8kI47kk/0Xp1srKys7Oz8kI4419XtbW1419X8kI4uLi42ndx7kpA8kI461BIz5eU wMDAwMDAwcHBwsLCwsLCw8PDv7+/goKCf39/ra2tsLCwr6+vra2trKyssLCwsrKysrKy4Glh8FBG zIaBw5CO7FZM7FZMsqenvpaT8FBG13NswpCN8FBG32hgrq6u32hg8FBGw5COu52b0IB68FBGwJiW 0IF78FBGzIaB2HRu8FBGwZiWsrKy8FBG4Glhs7Oz4Wpi8FBGt7e304R/ypiVyJ+d6V1V7VZMvLy8 uLi4tra2t7e3uLi4uLi4tbW1goKCfn5+pqamp6enpqampaWlqqqqsrKys7Ozu6in8F5V2H14sLCw sLCwx5GN8F5Vx5CNv5uY8F5Vz4eCr6+v33Js8F5Vr6+v4HNt8F5VsLCwsLCw0IiD8F5VwZya4HNt 8F5VsrKywp2b8F5V0YiEs7Oz8F5V4XRttLS04XRt8F5Vt7e3wqel5m9o8F5V8F5V5nBpvLy8ubm5 sLCwra2trq6urq6urKysgoKCf39/np6eoKCgn5+foKCgr6+vubm5uLi4xaWk8HBo05OPtra2tbW1 w6Oi8HBo0pKPw6Oi8HBo0pKPtbW15Xx38HBotbW14oF88HBotra2tra205OP8HBoxaSi3oaB8HBo urKyyaCe8HBo0ZiUt7e38HBo4oJ8ubm54oJ88HBourq644N98HBo2ZGNzqWjxbW0v7+/vr6+sbGx p6enpqampqampaWlgoKChISElpaWm5ubmpqaoaGhubm5wMDAwMDAyLSy8oN9252Zvr6+vb29zaup 8oN91KShyq6s8oN964qE6I6J8oN93pmV16Cd8oN98oN98oN92KGd2KGd8oN9y6+uy6+u8oN964qF 74eB74eBwbu6v7+/8oN974eB5ZKN8oN97IuFwcHB2qOf8oN96Y+K6Y+K5pSPxMTExMTEubm5pKSk oKCgoKCgn5+fgoKCioqKkJCQnJycm5ubqampx8fHzMzMy8vLy8vL75+a8pyX0sG/zMfG7KKe9JmT z8PCzMbG1L28z8TD2re13LSyzMfGz8TD7KKe9JmT1L28z8TD0MTD1b68zcfHysrK0MTE37Kv3bWy zcjHy8vLy8vL1r+908LB1r++4LKw0cbFzMzMzc3N18C/4bSx4bSx1sXEz8/Pz8/Px8fHqqqqoKCg oKCgn5+fgoKCkpKSiYmJnZ2dnJycsLCw0tLS19fX1tbW1tbW3M7N8rOv9q6p9q6p9LCs4sbF1dXV 1dXV1dXV1dXV1dXV1dXV1dXV1dXV6L+97ri11dXV1dXV5sLA9q6p3szL1tbW1tbW1tbW1tbW1tbW 1tbW1tbW1tbW19fX19fX19fX19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ0NDQrq6uoKCgoKCg l5eXioqKnJycgICAm5ubnZ2dra2t19fX4eHh4eHh4eHh4eHh4ODg5tnY5tnY4t/e4ODg4ODg4ODg 4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg49zc5tnY4t/e4eHh4eHh4eHh4eHh4eHh4eHh 4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4+Pj0tLSqqqqoKCgoKCgioqK l5eXn5+fjo6Ojo6OnZ2dpqam1NTU6+vr6+vr6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq 6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6+vr6+vr6+vr 6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr7Ozs6+vrysrKpKSkoKCgmZmZgYGBoKCg n5+fm5ubgICAl5eXoKCgxcXF7u7u8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz 8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz 8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz5ubmuLi4oKCgnJychYWFlZWVoaGhoKCg n5+fkpKShISEnJycsLCw4ODg+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6 +vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6 +vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr68/Pzzs7OpqamnZ2diIiIkZGRoaGhoaGhoKCgoKCg oKCgj4+Pg4ODmZmZu7u74ODg8fHx9/f39/f3+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn58/Pz5eXlysrKrKyslpaWhYWFkJCQoaGhoaGhoaGhoKCgoKCgoKCg oKCglpaWgYGBjIyMoKCgsrKyurq6vLy8v7+/wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA wMDAwMDAwMDAwMDAwMDAwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHB wcHBwcHBwcHBwcHBv7+/tbW1paWllpaWioqKgICAmZmZoaGhoaGhoaGhoaGh'; } elsif ($opt == 161) { $imagedata = 'Qk2mDgAAAAAAADYAAAAoAAAAOAAAABYAAAABABgAAAAAAHAOAAAmDgAAJg4AAAAAAAAAAAAAn5+f n5+fnp6enp6enZ2dmZmZjIyMhYWFhISEg4ODgoKCgoKCgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGB gYGBgYGBgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg4ODg4OD g4ODhISEhISEhISEhYWFhYWFhYWFhoaGhoaGioqKk5OTnZ2doKCgoKCgoaGhoaGhoaGhn5+fnp6e np6enZ2dj4+PgoKClpaWoaGhpKSkoqKio6Ojo6OjoqKioaGhoaGhoaGhoaGhoaGhoaGhoaGhoqKi oqKioqKioqKioqKio6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjpKSkpKSkpaWl paWlpaWlpqamp6enp6enqKioqampqamppKSklZWVhISEk5OToKCgoKCgoaGhoaGhnp6enp6enZ2d i4uLi4uLqqqqsrKysbGxsbGxsLCwr6+vr6+vrq6ura2tra2tra2tra2tra2tra2tra2tra2trq6u rq6ur6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vsLCwsLCwsLCwsbGxsbGxsbGx srKys7OztLS0tbW1tra2t7e3t7e3uLi4ubm5rq6uj4+PjY2NoKCgoaGhoaGhnp6enZ2djo6Oi4uL sbGxsrKysbGxsLCwr6+vrq6ura2trKysrKysq6urq6urq6urq6urq6urq6urq6urrKysrKysrKys rKysrKysrKysrKysra2tra2tra2tra2tra2tra2tra2tra2trq6ur6+vr6+vr6+vsLCwsbGxsbGx srKys7OztLS0tbW1tra2t7e3uLi4ubm5ubm5ubm5k5OTjo6OoaGhoaGhnp6elpaWgYGBqqqqr6+v rq6urKysrKysqqqqqampqKiop6enp6enp6enpqampqampqampqamp6enp6enp6enp6enp6enp6en p6enqKioqKioqKioqKioqKioqampqampqampqampqampqqqqqqqqqqqqq6urrKysrKysra2trq6u r6+vsLCwsrKys7OztLS0tLS0tbW1tra2t7e3tLS0jIyMk5OToaGhnZ2diYmJmZmZq6urqampqKio pqampaWlpKSko6OjoqKioaGhoaGhoKCgn5+fn5+fn5+fn5+fn5+fn5+foKCgoaGhoaGhoaGhoaGh oaGhoaGhoqKioqKioqKioqKioqKio6Ojo6Ojo6Ojo6OjpKSkpKSkpaWlpqampqamp6enqKioqamp q6urrKysra2trq6ur6+vsLCwsbGxsrKysrKyqqqqg4ODn5+fmJiYgoKCpKSkpKSko6OjoaGhn5+f n5+fnZ2dnJycm5ubmpqamZmZmZmZmZmZmZmZmJiYmZmZmZmZmZmZmZmZmZmZmZmZmZmZmpqampqa mpqam5ubm5ubm5ubm5ubm5ubm5ubm5ubnJycnJycnZ2dnZ2dnp6en5+fn5+foKCgoaGho6OjpKSk pqampqamqKioqampqqqqqqqqq6urrKysrKyskJCQlZWVkJCQi4uLoKCgnp6enZ2dm5ubmZmZmJiY l5eXlpaWlZWVlJSUk5OTk5OTkpKSkpKSqHp36jMovmNdkpKSk5OTk5OTk5OTk5OTk5OTk5OTlJSU lJSUlJSUlZWVlZWVlZWVlZWVlZWVlZWVlpaWlpaWl5eXl5eXmJiYmZmZmpqam5ubnZ2dnp6en5+f oKCgoqKio6OjpKSkpKSkpaWlpqampqamnJyciYmJiIiIjo6OmJiYl5eXlpaWlJSUk5OTkpKSkJCQ j4+Pjo6OjY2NjY2NjIyMjIyMi4uLonVy6DImul9ZjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY2N jo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+PkJCQkJCQkZGRkpKSkpKSk5OTlJSUlpaWl5eXmJiYmpqa m5ubnJycnZ2dnZ2dnp6en5+fn5+fnZ2dgoKCgoKCjo6OkpKSkZGRj4+Pjo6OjY2Njo6Ojo6Ok4eH xVhR6Dku6Dku0U1FnHx6ioqKonZz6Dku3UM66Dku3UM6nHx6i4uLqHFu4z006DkutGdiumJd6Dku pHh1k4eHxVhR6Dku4z40umJejo6Ojo6O6Dku0k5HkJCQ0k5H6Dkuk5OTwmBb4z416Dku3UM6sHh0 lpaWlpaWl5eXl5eXmJiYmJiYl5eXgoKCf39/i4uLjIyMi4uLioqKioqKkJCQlJSUlJSU01tT6Eg+ t3JsrHp3401D401DloyLpn576Eg+x2RcrHl36Eg+0ltTkZGR0ltT6Eg+rHp3ooOBvG1o6Eg+qIB9 vW1o6Eg+uHJtyGRd6Eg+qIF+lJSU6Eg+01xUlZWV01xU6Eg+l5eXwHFrsoB8rYaD3lNJ5E1Dmpqa lZWVkZGRkZGRkpKSkpKSkZGRgoKCfn5+h4eHh4eHhoaGhYWFjIyMmJiYm5ubpJKQ6lhPy3FrmJiY mJiYt4B86lhPtn98q4eE6lhPwHhzl5eX1Whh6lhPmJiY1Whh6lhPmJiYmJiYwXh06lhPrYiH1mlh 6lhPmZmZrYiH6lhPwnl0mpqa6lhP1mlim5ub1mli6lhPnZ2drJCP22Ve6lhP6lhP3GVeoqKinZ2d kJCQi4uLjIyMjIyMjIyMgoKCf39/g4ODgoKCgoKChISEl5eXpKSkpKSktZWT62tjx4eDoqKioqKi tJSS62tjxoaCtJSR62tjxoaDoqKi3XVv62tjoqKi2Xlz62tjoqKioqKix4eD62tjtZSS1Xx462tj p6CfupGP62tjw4qHpKSk62tj2npzpKSk2np062tjpqam2np062tjzoaBvpWTsqKgqampqKiolpaW iIiIh4eHh4eHiIiIgoKChISEgICAgICAf39/iIiIpqamsLCwsLCwu6al7X940pSQr6+vrq6uwZ+d 7X94ypmWvqKg7X945oV/4YeD7X941ZCMzZeU7X947X947X94zpeUzpeU7X94vqOhvqOh7X945oV/ 6oJ86oJ8s6ysr6+v7X946oJ83oyG7X945oWAsbGxz5iV7X9444mD44mD34yHtLS0tLS0paWliYmJ hISEhISEhYWFgoKCioqKf39/gYGBgICAlJSUubm5vr6+vr6+vr6+6pqV7piTx7a1wLq6552Y8ZWQ w7i3wLq6yrOxw7i30K6s1KupwLq6w7i3552Y8ZWQyrOyxLi4xLi4yrOywLu6vb29xLm416qn1Kyq wbu7vr6+vr6+y7SzyLe1y7Sz2Kqnxbq5v7+/wMDAzLW02Kuo2auoyrm4wcHBwcHBt7e3kZGRhISE hISEhYWFgoKCkpKSf39/gYGBgoKCm5ubxsbGzMzMzMzMzMzM08bE7q+r9Kun9Kun8a2p2r+9y8vL y8vLy8vLy8vLy8vLy8vLy8vLy8vL4rm36bOwy8vLy8vL37u59Kun1cPCzMzMzMzMzMzMzMzMzMzM zMzMzMzMzMzMzMzMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzs7Ozs7Ozs7Ow8PDlpaWhISEhISE g4ODioqKnJycfn5+goKCgYGBlpaWzMzM2dnZ2dnZ2dnZ2dnZ2dnZ4NLR4NLR2tfW2NjY2NjY2NjY 2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ3NbV4NLR2tfX2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ 2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2traxMTEkZGRhISEhISEgoKC l5eXn5+fjo6OgICAgoKCjY2NyMjI5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl 5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl 5eXl5eXl5eXl5eXl5eXl5eXl5ubm5ubm5ubm5ubm5ubm5ubm5OTku7u7iYmJhISEhISEgICAoKCg n5+fm5ubfn5+gYGBhISEtbW16enp8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw 8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw 8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw39/fo6OjhISEg4ODgYGBlZWVoaGhoKCg n5+fkpKSf39/g4ODmZmZ2NjY+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn57+/vv7+/jIyMhISEgYGBkZGRoaGhoaGhoKCgoKCg oKCgj4+Pf39/hYWFp6en19fX7e3t9PT09fX19/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3 9/f39/f39/f39/f39/f39/f37+/v3d3du7u7k5OTg4ODgYGBkJCQoaGhoaGhoaGhoKCgoKCgoKCg oKCglpaWf39/gYGBj4+Po6Ojra2tr6+vs7OztLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0 tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0 tLS0tLS0tLS0tLS0srKypqamk5OThYWFgYGBgICAmZmZoaGhoaGhoaGhoaGh'; } elsif ($opt == 17) { $imagedata = 'Qk2mDgAAAAAAADYAAAAoAAAAOAAAABYAAAABABgAAAAAAHAOAAAmDgAAJg4AAAAAAAAAAAAAoaGh oaGhoKCgoKCgoKCgnJyckJCQiIiIh4eHh4eHhYWFhYWFhYWFhISEhISEhISEg4ODg4ODgoKCgoKC goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg4ODg4ODhISEhISEhYWFhYWFhoaGhoaGh4eHh4eHh4eH h4eHiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIjIyMlJSUnp6eoaGhoaGhoaGhoaGhoaGhoaGhoaGh oKCgoKCgkpKSj4+Purq61NTU29vb2dnZ2tra2tra2NjY2NjY1tbW1dXV1dXV1dXV1NTU09PT09PT 0tLS0tLS0tLS0tLS09PT09PT1NTU1dXV1dXV1tbW2NjY2dnZ29vb3Nzc3Nzc3Nzc3d3d3t7e3t7e 39/f39/f39/f39/f39/f39/f39/f39/f0dHRsrKyioqKlJSUoaGhoaGhoaGhoaGhoaGhoKCgoKCg jo6OoqKi6urq/Pz8+/v7+vr6+fn5+Pj49/f39vb29fX19PT08/Pz8vLy8fHx8PDw7+/v7u7u7u7u 7u7u7u7u7u7u7+/v7+/v8PDw8fHx8/Pz9PT09vb29/f3+fn5+vr6+/v7/Pz8/f39/v7+/v7+//// ////////////////////////////////////5ubmoaGhjo6OoaGhoaGhoaGhoaGhoKCgkZGRoKCg +fn5/Pz8/Pz8+/v7+vr6+fn59/f39vb29PT08/Pz8vLy8fHx8PDw7+/v7u7u7Ozs7Ozs6+vr6+vr 6+vr6+vr7Ozs7e3t7u7u7+/v8fHx8/Pz9PT09vb2+Pj4+fn5+vr6+/v7/f39/f39/v7+//////// /////////////////////////////////////Pz8qqqqj4+PoaGhoaGhoaGhmZmZi4uL5+fn9/f3 9vb29fX19PT08/Pz8vLy8PDw7+/v7e3t7Ozs6+vr6enp6Ojo5ubm5eXl5OTk5OTk5OTk5OTk5OTk 5OTk5OTk5eXl5ubm5+fn6enp6+vr7e3t7+/v8fHx8/Pz9PT09fX19vb29/f3+Pj4+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn58/PznJyck5OToaGhoaGhjIyMxcXF7+/v7u7u7u7u 7e3t7Ozs6urq6enp6Ojo5ubm5eXl4+Pj4uLi4eHh39/f3d3d3Nzc29vb2tra2tra2tra2tra2tra 29vb3Nzc3d3d3t7e4eHh4+Pj5eXl5+fn6Ojo6urq6+vr7e3t7u7u7+/v8PDw8fHx8fHx8fHx8fHx 8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx4ODgh4eHn5+fnJycjo6O4eHh5eXl5OTk4+Pj4uLi 4uLi4eHh39/f3d3d29vb2dnZ2dnZ2NjY1tbW1NTU09PT0dHR0NDQz8/Pz8/Pz8/Pz8/P0NDQ0NDQ 0tLS09PT1NTU19fX2dnZ29vb3d3d3t7e4eHh4uLi4+Pj5OTk5eXl5ubm5+fn5+fn5+fn5+fn5+fn 5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fnp6enlZWVlJSUpKSk2tra2tra2dnZ2dnZ2NjY19fX 1dXV09PT0tLS0dHRz8/Pzc3NzMzMy8vLycnJyMjIxsbGxsbGxcXFxcXFxcXFxcXFxsbGxsbGx8fH yMjI25aS90A190A18lJI4JuX09PT1tbW19fX2NjY2dnZ2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc 3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzcxMTEiYmJjIyMsrKyzs7Ozs7Ozs7Ozc3NzMzMy8vLycnJ yMjIxsbGxcXFw8PDwsLCwcHBwMDAvr6+vLy8vLy8u7u7urq6ubm5ubm5urq6u7u7vLy8vLy8vb29 zJ6c0ZiUz6Gf61dO9D0yzre1ysrKy8vLzMzMzs7Ozs7Oz8/P0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ 0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQy8vLgoKChoaGt7e3wsLCwsLCwsLCwcHBwMDAwMDAwMDAvr6+ vb29vb29u7u7urq6uLi4uLi48kI48kI48kI48kI48kI4srKyxo+M6lBH8kI4419XwJ+dtra2yZOP 7ko/7kpA6FlQ8kI4zKCdwcHBwcHBw8PDxMTExMTExcXFxsbGxsbGxsbGxsbGxsbGxsbGxsbGxcXF xcXFxMTExMTExMTExMTExMTEwMDAgoKCg4ODs7OzuLi4uLi4t7e3t7e3urq6vb29vb29u7u7urq6 urq6uLi4t7e3tra2tbW18FBG5WNbwpqXwpmWwpmWtauq7VZN5WNaxpSQ7VZN4GlhtLS06FxU7VZN yZeU33Jq8FBGyaCdvb29vr6+v7+/wMDAwcHBwcHBwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwMDA vLy8ubm5ubm5ubm5ubm5tra2goKCgoKCq6urrq6urq6ura2tsrKyu7u7vLy8u7u7u7u7ubm5ubm5 t7e3t7e3t7e3tra28F5V4XRts7Ozs7Ozs7Ozwp2b8F5V0YiEs7Oz4XRt8F5VtLS08F5V4nRut7e3 1IyI8F5VyaSivLy8vb29vb29vr6+v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/u7u7 srKyr6+vr6+vr6+vrKysgoKCg4ODoqKipqampqamp6entra2v7+/v7+/vr6+vr6+vLy8vLy8u7u7 u7u7urq6urq68HBo4oJ8uLi4t7e3t7e3wqqp8HBo14+LuLi45n137XVturq67XVt6XlzvLy81paS 8HBoyqqovr6+v7+/wMDAwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwMDAs7Oz qKiop6enp6enpaWlgoKCh4eHmZmZoKCgoKCgqKiovr6+xMTExMTExMTExMTEw8PDw8PDwcHBwcHB wcHBwcHB8oN95ZKNwMDAv7+/v7+/v7+/5ZKN8oN96I+J8oN92aKewcHB3J6b8oN96Y+K7IuG8oN9 z7SyxMTExMTExcXFxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGurq6paWl oaGhoaGhn5+fgoKCjY2Nk5OToKCgoKCgr6+vysrKz8/Pz8/Pz8/Pzs7Ozs7Ozs7Ozc3Nzc3NzMzM zMzM9JmT6qahzMzMy8vLy8vLy8vLy8vL27i24LKw1r++zMzMzMzMzMzM3Lm34bOw18C/2MG/0cvL z8/Pz8/Pz8/P0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQx8fHq6uroaGh oaGhn5+fgoKClZWVi4uLoKCgoKCgtLS01dXV2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY19fX19fX19fX 9q6p7ri119fX1tbW1tbW1tbW1tbW19fX19fX19fX19fX19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ 2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra0dHRr6+voaGhoaGh l5eXioqKnp6egoKCnp6eoKCgsLCw2dnZ4uLi4uLi4uLi4uLi4uLi4uLi4uLi4eHh4eHh4eHh4eHh 4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4+Pj 4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj0tLSq6uroaGhoaGhioqK l5eXoaGhkJCQkJCQoKCgqamp1tbW7Ozs6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr 6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr7Ozs7Ozs7Ozs 7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs6+vry8vLpaWloaGhmZmZgYGBoKCg oaGhnZ2dgYGBmZmZoqKixsbG7u7u8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz 8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz 9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT05+fnubm5oaGhnZ2dhYWFlZWVoaGhoaGh oaGhlJSUhYWFnZ2dsbGx4eHh+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6 +vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6 +vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr68/Pzzs7Op6ennp6eiIiIkZGRoaGhoaGhoaGhoaGh oaGhkZGRhISEmpqavLy84ODg8vLy9/f39/f3+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn58/Pz5eXly8vLrKyslpaWhYWFkJCQoaGhoaGhoaGhoaGhoaGhoaGh oaGhl5eXgoKCjIyMoaGhsrKyurq6vb29wMDAwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHB wcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHB wcHBwcHBwcHBwcHBwMDAtra2pqamlpaWioqKgICAmZmZoaGhoaGhoaGhoaGh'; } elsif ($opt == 171) { $imagedata = 'Qk2mDgAAAAAAADYAAAAoAAAAOAAAABYAAAABABgAAAAAAHAOAAAmDgAAJg4AAAAAAAAAAAAAoaGh oaGhoKCgoKCgoKCgnJyckJCQiIiIh4eHh4eHhYWFhYWFhYWFhISEhISEhISEg4ODg4ODgoKCgoKC goKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg4ODg4ODhISEhISEhYWFhYWFhoaGhoaGh4eHh4eHh4eH h4eHiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIjIyMlJSUnp6eoaGhoaGhoaGhoaGhoaGhoaGhoaGh oKCgoKCgkpKShoaGmpqapqamqampqKioqKioqKiop6enp6enpaWlpaWlpaWlpKSko6Ojo6Ojo6Oj oqKioqKioqKioqKio6Ojo6Ojo6OjpKSkpaWlpaWlp6enp6enqampqampqampqqqqq6urq6urq6ur rKysrKysrKysrKysrKysrKysrKysrKyspqaml5eXhYWFlJSUoaGhoaGhoaGhoaGhoaGhoKCgoKCg jo6Oj4+PsbGxubm5uLi4t7e3t7e3tra2tbW1tLS0tLS0s7OzsrKysbGxsbGxsLCwr6+vr6+vr6+v r6+vr6+vr6+vr6+vr6+vsLCwsbGxsrKys7OztLS0tbW1t7e3t7e3uLi4ubm5urq6urq6urq6u7u7 u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7r6+vkJCQjo6OoaGhoaGhoaGhoaGhoKCgkZGRj4+P uLi4ubm5ubm5uLi4t7e3t7e3tbW1tLS0s7OzsrKysbGxsbGxsLCwr6+vr6+vra2tra2trKysrKys rKysrKysra2trq6ur6+vr6+vsbGxsrKys7OztLS0tra2t7e3t7e3uLi4urq6urq6urq6u7u7u7u7 u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7urq6lJSUj4+PoaGhoaGhoaGhmZmZhISEsLCwt7e3 tra2tbW1tLS0tLS0s7OzsrKysbGxr6+vr6+vrq6urKysrKysqqqqqqqqqampqKioqKioqKioqKio qKioqampqqqqqqqqq6urrKysrq6ur6+vsbGxsrKytLS0tLS0tbW1tra2t7e3t7e3uLi4uLi4uLi4 uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4tbW1jY2Nk5OToaGhoaGhjIyMnp6esrKysbGxsbGx sLCwr6+vrq6ura2trKysq6urqqqqqKioqKiop6enpqampKSkpKSko6OjoqKioqKioqKioqKioqKi o6OjpKSkpKSkpaWlp6enqKioqqqqq6urra2trq6ur6+vsLCwsbGxsrKysrKys7Ozs7Ozs7Ozs7Oz s7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozq6urg4ODn5+fnJychYWFqqqqrKysq6urqqqqqqqq qampqKiop6enpqampKSko6OjoqKioaGhoKCgn5+fnp6enZ2dnJycm5ubm5ubm5ubm5ubnJycnJyc nZ2dnp6en5+foaGhoqKipKSkpqampqamqKioqampqqqqq6urrKysrKysra2tra2tra2tra2tra2t ra2tra2tra2tra2tra2tra2tra2tra2tra2tkZGRlZWVlJSUj4+PpqampqampaWlpKSkpKSko6Oj oqKioKCgn5+fnp6enZ2dnJycm5ubmpqamZmZmJiYl5eXlpaWlZWVlZWVlZWVlZWVlpaWl5eXl5eX mJiYt3Nu6jMo6jMo4EA3u3ZyoKCgoqKio6OjpKSkpaWlpqampqamp6enp6enp6enp6enp6enp6en p6enp6enp6enp6enp6enp6enp6enp6ennZ2diYmJjIyMk5OTn5+fn5+fnp6enZ2dnZ2dnJycm5ub mpqamJiYl5eXlpaWlZWVlJSUk5OTkpKSkZGRkJCQkJCQj4+Pjo6Ojo6Oj4+PkJCQkJCQkZGRkpKS qHt4rnVxq3162UU76DImpI2LnJycnJycnZ2dnp6en5+fn5+foKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgnp6egoKChoaGk5OTmJiYmJiYl5eXl5eXl5eXl5eXl5eXl5eX l5eXlpaWlZWVlJSUk5OTkpKS6Dku6Dku6Dku6Dku6Dkujo6OqnNw3UM66Dku0k5GoIB+kZGRrHVy 4z414z412UpB6DkurIF+mZmZmZmZm5ubm5ubnJycnJycnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnJycm5ub mpqamZmZmZmZmZmZmZmZmZmZmJiYgoKCg4ODkJCQkpKSkpKSkZGRk5OTl5eXnJycnZ2dm5ubm5ub mpqamJiYmJiYl5eXlpaW6Eg+2FZOqYF+qYF+qYF+mI+O401D2FZOrnx5401D01xUlpaW3lJJ405D sn980GJb6Eg+r4eEnZ2dnZ2dnp6enp6en5+fn5+foKCgoKCgoKCgoKCgoKCgoKCgoKCgn5+fnZ2d mJiYk5OTk5OTk5OTk5OTkpKSgoKCgoKCi4uLjIyMjIyMi4uLlJSUn5+foqKioaGhoKCgn5+fn5+f np6enp6enZ2dnJyc6lhP1mlim5ubmpqampqaromH6lhPwnl0mpqa1mli6lhPm5ub6lhP1mljnp6e xHx36lhPs4+MoqKioqKio6Ojo6Ojo6Ojo6OjpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSknp6e kpKSjY2NjY2NjY2NjIyMgoKCg4ODhoaGh4eHh4eHiYmJnJycqqqqqampqampqampqKiop6enp6en p6enpqampaWl62tj2npzpKSkpKSkpKSksZmY62tjzIR/pKSk3nVv525npaWl525n43Nsp6enyYmG 62tjupmXqampqqqqqqqqq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urqampmJiY iYmJiIiIiIiIiIiIgoKCh4eHg4ODhISEhISEjo6Oq6urtLS0tLS0tLS0s7Ozs7OzsrKysrKysbGx sbGxsbGx7X943oyGsLCwr6+vr6+vr6+v3ouG7X944oiD7X94z5iVsLCw05WR7X944omD5oaA7X94 wqaktLS0tLS0tLS0tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1pqamioqK hYWFhYWFhYWFgoKCjY2NgoKChISEhISEmJiYu7u7wcHBwcHBwcHBwcHBwMDAwMDAwMDAv7+/v7+/ v7+/8ZWQ5KCcvr6+vr6+vr6+vr6+vr6+0a+t16qny7Szv7+/v7+/v7+/0q+t2KuozLW0zba0xL6+ wcHBwcHBwcHBwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCt7e3kpKShYWF hYWFhYWFgoKClZWVgYGBhISEhYWFnp6eyMjIzs7Ozs7Ozs7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3NzMzM 9Kun6rOwzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzs7Ozs7O zs7Ozs7Ozs7Ozs7Ozs7Oz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/PxMTEl5eXhYWFhYWF g4ODioqKnp6egICAhISEhISEmZmZzc3N2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ 2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra 2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbxcXFkpKShYWFhYWFgoKC l5eXoaGhkJCQgoKChISEkJCQysrK5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5eXl5eXl5eXl5eXl 5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm 5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5OTku7u7ioqKhYWFhISEgICAoKCg oaGhnZ2df39/g4ODhoaGtra26urq8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw 8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw 8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw39/fpKSkhYWFhISEgYGBlZWVoaGhoaGh oaGhlJSUgICAhISEmpqa2NjY+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn57+/vwMDAjY2NhYWFgYGBkZGRoaGhoaGhoaGhoaGh oaGhkZGRgICAhoaGqKio19fX7u7u9PT09fX19/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3 9/f39/f39/f39/f39/f39/f37+/v3t7evLy8lJSUg4ODgYGBkJCQoaGhoaGhoaGhoaGhoaGhoaGh oaGhl5eXgICAgYGBkJCQpKSkra2tr6+vs7OztLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0 tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tbW1tbW1tbW1tbW1tbW1tbW1tbW1 tbW1tbW1tbW1tbW1s7Ozp6enlJSUhYWFgYGBgICAmZmZoaGhoaGhoaGhoaGh'; } elsif ($opt == 18) { $imagedata = 'Qk2mDgAAAAAAADYAAAAoAAAAOAAAABYAAAABABgAAAAAAHAOAAAmDgAAJg4AAAAAAAAAAAAAoaGh oaGhoKCgoKCgoKCgnJyckJCQiIiIh4eHh4eHhYWFhYWFhISEhISEhISEhISEg4ODg4ODgoKCgoKC goKCgoKCgYGBgYGBgYGBgYGBgYGBgoKCgoKCgoKCgoKCgoKCg4ODhISEhISEhYWFhYWFhoaGhoaG hoaGh4eHh4eHh4eHh4eHiIiIiIiIiIiIiIiIjIyMlJSUnp6eoaGhoaGhoaGhoaGhoaGhoaGhoaGh oKCgoKCgkpKSj4+Purq61NTU29vb2dnZ2tra2dnZ2NjY19fX1tbW1dXV1dXV1NTU1NTU09PT09PT 0tLS0tLS0dHR0dHR0tLS0tLS0tLS0tLS09PT09PT1NTU1dXV1tbW19fX2dnZ2tra29vb3Nzc3Nzc 3Nzc3d3d3t7e3t7e39/f39/f39/f39/f0dHRsrKyioqKlJSUoaGhoaGhoaGhoaGhoaGhoKCgoKCg jo6OoqKi6urq/Pz8+/v7+vr6+fn5+Pj49/f39fX19PT08/Pz8vLy8fHx8PDw7+/v7+/v7u7u7e3t 7Ozs7Ozs7Ozs7Ozs7e3t7e3t7u7u7u7u7+/v8PDw8vLy8/Pz9PT09vb2+Pj4+fn5+vr6+/v7/Pz8 /f39/v7+/v7+////////////////////////5ubmoaGhjo6OoaGhoaGhoaGhoaGhoKCgkZGRoKCg +fn5/Pz8+/v7+vr6+fn5+Pj49/f39fX18/Pz8vLy8fHx8PDw7+/v7u7u7e3t7Ozs6+vr6urq6urq 6urq6urq6urq6urq6urq6+vr7Ozs7e3t7u7u8PDw8fHx8/Pz9fX19/f3+Pj4+fn5+/v7/Pz8/f39 /f39/v7+/v7+/////////////////////////Pz8qqqqj4+PoaGhoaGhoaGhmZmZi4uL5+fn9/f3 9vb29fX19PT08vLy8fHx7+/v7e3t7Ozs6urq6enp6Ojo5ubm5eXl5OTk5OTk4+Pj4+Pj4uLi4uLi 4uLi4uLi4uLi4+Pj5OTk5OTk5OTk5ubm6Ojo6urq7Ozs7e3t7+/v8fHx8/Pz9PT09fX19vb29/f3 +Pj4+Pj4+fn5+fn5+fn5+fn5+fn5+fn5+fn58/PznJyck5OToaGhoaGhjIyMxcXF7+/v7u7u7e3t 7Ozs6+vr6urq6Ojo5+fn5eXl4+Pj4uLi4ODg3t7e3d3d3Nzc29vb2tra2dnZ2NjY19fX19fX19fX 2NjY2NjY2NjY2dnZ2tra29vb3d3d39/f4eHh4+Pj5eXl5+fn6Ojo6urq7Ozs7e3t7u7u7+/v8PDw 8PDw8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx4ODgh4eHn5+fnJycjo6O4uLi5eXl5OTk4+Pj4uLi 4eHh4ODg3t7e3Nzc2tra2NjY1tbW1dXV09PT0tLS0dHRz8/Pz8/Pzs7Ozc3NzMzMzMzMzMzMzc3N zc3Nzs7Oz8/Pz8/P0dHR0tLS1NTU1tbW2dnZ2tra3Nzc3t7e4eHh4uLi4+Pj5OTk5eXl5ubm5ubm 5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fnp6enlZWVlJSUpKSk2tra2tra2dnZ2dnZ19fX1tbW 1NTU09PT0dHRz8/PzMzMy8vLycnJyMjIxsbGxsbGxMTEw8PDwsLCwcHBwcHBwcHBwcHBwcHBwsLC wsLCw8PDxMTExsbGx8fHycnJ90A17GNb0NDQ0tLS09PT1dXV19fX2NjY2dnZ2tra29vb29vb3Nzc 3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzcxMTEiYmJjIyMsrKyzs7Ozs7Ozs7OzMzMy8vLycnJyMjI xsbGxcXFw8PDwcHBv7+/vr6+vLy8u7u7ubm5uLi4uLi4t7e3tra2tra2tra2tra2t7e3t7e3uLi4 uLi4ubm5u7u7vLy8vr6+9D0y515WxcXFxsbGyMjIycnJy8vLzMzMzs7Ozs7Oz8/Pz8/P0NDQ0NDQ 0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQy8vLgoKChoaGt7e3wsLCwsLCwsLCwMDAv7+/v7+/vr6+vb29 vLy8u7u7uLi4t7e3tbW1tbW18kI44l5WsbGxsLCw0Hl08kI4v5SRrq6ux4WC6U9H8kI47kk/0Xp1 wZaT8kI403x3tra28kI47kpA7kpA70pA0pCMwMDAwcHBwsLCxMTExMTExcXFxcXFxsbGxsbGxcXF xcXFxMTExMTExMTExMTExMTEwMDAgoKCg4ODs7OzuLi4uLi4t7e3tra2urq6u7u7u7u7urq6ubm5 t7e3tbW1tLS0s7Ozs7Oz8FBG4GhgsLCwr6+vz4B68FBGv5aUv5aU8FBG5GJZv5aUw5GO0IF7wZiW 8FBG0YF8tLS08FBG5mRbx56c6V1V7VdNwba1vr6+v7+/wMDAwcHBwcHBwcHBwsLCwsLCwsLCwMDA vLy8ubm5ubm5ubm5ubm5tra2goKCgoKCq6urrq6urq6ura2tsrKyurq6u7u7u7u7ubm5uLi4t7e3 tra2tLS0tLS0s7Oz8F5V4HNtsbGxsLCw0IiD8F5Vv5uYz4eC8F5V2Hx40IiD0IiDyZKPwp2b8F5V 0omEtLS08F5V4nRuuLi41IyI8F5VyaSivb29vb29vr6+v7+/v7+/v7+/v7+/v7+/v7+/v7+/u7u7 srKyr6+vr6+vr6+vrKysgoKCg4ODoqKipqampqamp6entbW1v7+/vr6+vr6+vLy8vLy8u7u7urq6 ubm5uLi4t7e38HBo7XRt4oF84oF86Xhy8HBow6Oiz5aT8HBo2oqF05OP8HBo4oF8xaWk8HBo1JSQ ubm58HBo44N9vLy82ZGN8HBoy6upv7+/v7+/wMDAwcHBwcHBwcHBwcHBwcHBwcHBwcHBwMDAs7Oz qKiop6enp6enpaWlgoKCh4eHmZmZoKCgoKCgp6envb29xMTExMTExMTEw8PDwsLCwcHBwcHBwMDA wMDAv7+/8oN964qF2KGd16Cd5JKN8oN9yq+twLq56I6J64qE6I6J8oN90qimy6+u8oN92KGewMDA 8oN974eB5pOO8oN97IuGxMTExMTExcXFxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGurq6paWl oaGhoaGhn5+fgoKCjY2Nk5OToKCgoKCgr6+vysrKz8/Pz8/Pzs7Ozs7Ozc3Nzc3NzMzMzMzMzMzM y8vL9JmT6qWhysrKysrK37Gv9JmT1L28ysrKzMfG3LSy37Gv1L28ysrK1b699JmT4LKwzMzM1r++ 1MPC18C/4bSx08jHz8/Pz8/Pz8/P0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQx8fHq6uroaGh oaGhn5+fgoKClZWVi4uLoKCgoKCgtLS01NTU2dnZ2dnZ2NjY2NjY2NjY19fX19fX19fX19fX1tbW 9q6p7ri11dXV1dXV5sLA9q6p3cvK1dXV1dXV1dXV1dXV1tbW1tbW3szL9q6p5sLA19fX19fX19fX 2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra0dHRr6+voaGhoaGh l5eXioqKnp6egoKCnp6eoKCgsLCw2NjY4uLi4uLi4uLi4uLi4uLi4eHh4eHh4eHh4eHh4eHh4eHh 4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4t/f59nY5N3d4eHh4eHh4uLi4uLi 4uLi4uLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj0tLSq6uroaGhoaGhioqK l5eXoaGhkJCQkJCQoKCgqamp1tbW6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6urq6urq 6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr 6+vr6+vr7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs6+vry8vLpaWloaGhmZmZgYGBoKCg oaGhnZ2dgYGBmZmZoqKixsbG7u7u8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz 8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz 8/Pz8/Pz8/Pz8/Pz8/Pz9PT09PT09PT09PT09PT09PT05+fnubm5oaGhnZ2dhYWFlZWVoaGhoaGh oaGhlJSUhYWFnZ2dsbGx4eHh+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6 +vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6 +vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr68/Pzzs7Op6ennp6eiIiIkZGRoaGhoaGhoaGhoaGh oaGhkZGRhISEmpqavLy84ODg8vLy9/f39/f3+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn58/Pz5eXly8vLrKyslpaWhYWFkJCQoaGhoaGhoaGhoaGhoaGhoaGh oaGhl5eXgYGBjIyMoaGhsrKyurq6vb29wMDAwcHBwcHBwcHBwMDAwMDAwMDAwMDAwMDAwMDAwMDA wMDAwMDAwMDAwMDAwMDAwMDAwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHB wcHBwcHBwcHBwcHBwMDAtra2pqamlpaWioqKgICAmZmZoaGhoaGhoaGhoaGh'; } elsif ($opt == 181) { $imagedata = 'Qk2mDgAAAAAAADYAAAAoAAAAOAAAABYAAAABABgAAAAAAHAOAAAmDgAAJg4AAAAAAAAAAAAAoaGh oaGhoKCgoKCgoKCgnJyckJCQiIiIh4eHh4eHhYWFhYWFhISEhISEhISEhISEg4ODg4ODgoKCgoKC goKCgoKCgYGBgYGBgYGBgYGBgYGBgoKCgoKCgoKCgoKCgoKCg4ODhISEhISEhYWFhYWFhoaGhoaG hoaGh4eHh4eHh4eHh4eHiIiIiIiIiIiIiIiIjIyMlJSUnp6eoaGhoaGhoaGhoaGhoaGhoaGhoaGh oKCgoKCgkpKShoaGmpqapqamqampqKioqKiop6enp6enpqampaWlpaWlpKSko6Ojo6Ojo6Ojo6Oj oqKioqKioaGhoaGhoqKioqKioqKioqKio6Ojo6Ojo6OjpKSkpaWlpqamp6enqKioqampqampqqqq qqqqq6urq6urq6urrKysrKysrKysrKyspqaml5eXhYWFlJSUoaGhoaGhoaGhoaGhoaGhoKCgoKCg jo6Oj4+PsbGxubm5uLi4t7e3t7e3tra2tbW1tLS0s7OzsrKysbGxsbGxsLCwr6+vr6+vr6+vrq6u ra2tra2tra2tra2trq6urq6ur6+vr6+vr6+vsLCwsbGxsrKys7OztLS0tra2t7e3t7e3uLi4ubm5 urq6urq6urq6u7u7u7u7u7u7u7u7u7u7u7u7r6+vkJCQjo6OoaGhoaGhoaGhoaGhoKCgkZGRj4+P uLi4ubm5uLi4t7e3t7e3tra2tbW1tLS0srKysbGxsbGxsLCwr6+vr6+vrq6ura2trKysrKysrKys rKysrKysrKysrKysrKysrKysra2trq6ur6+vsLCwsbGxsrKytLS0tbW1tra2t7e3uLi4ubm5urq6 urq6urq6urq6u7u7u7u7u7u7u7u7u7u7u7u7urq6lJSUj4+PoaGhoaGhoaGhmZmZhISEsLCwt7e3 tra2tbW1tLS0s7OzsrKysbGxr6+vr6+vra2trKysrKysqqqqqqqqqampqKiop6enp6enp6enp6en p6enp6enp6enp6enqKioqKioqampqqqqrKysra2tr6+vr6+vsbGxsrKytLS0tLS0tbW1tra2t7e3 t7e3t7e3uLi4uLi4uLi4uLi4uLi4uLi4uLi4tbW1jY2Nk5OToaGhoaGhjIyMnp6esrKysbGxsLCw r6+vr6+vrq6ura2tq6urqqqqqKioqKiopqampaWlpKSkpKSko6OjoqKioaGhoaGhoKCgoKCgoKCg oaGhoaGhoaGhoaGhoqKio6OjpKSkpqamp6enqKioqqqqq6urra2trq6ur6+vsLCwsbGxsrKysrKy srKys7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozq6urg4ODn5+fnJychYWFqqqqrKysq6urqqqqqqqq qKioqKiopqampaWlpKSkoaGhoKCgn5+fnp6enZ2dnZ2dm5ubm5ubmpqamZmZmZmZmZmZmZmZmZmZ mZmZmpqam5ubm5ubnZ2dnZ2dn5+foKCgoqKipKSkpaWlpqamqKioqampqqqqq6urrKysrKysrKys ra2tra2tra2tra2tra2tra2tra2tra2tra2tkZGRlZWVlJSUj4+PpqampqampaWlpKSko6OjoqKi oaGhoKCgnp6enZ2dm5ubmpqamZmZmJiYl5eXlpaWlZWVlJSUk5OTk5OTk5OTk5OTk5OTk5OTk5OT k5OTlJSUlZWVlpaWl5eXmZmZ6jMo1k1Fnp6en5+foKCgoqKio6OjpKSkpaWlpqampqampqamp6en p6enp6enp6enp6enp6enp6enp6enp6ennZ2diYmJjIyMk5OTn5+fn5+fnp6enZ2dnJycm5ubmpqa mJiYl5eXlpaWlJSUk5OTkpKSkZGRkJCQjo6Ojo6OjY2NjY2NjIyMjIyMjIyMjIyMjY2NjY2NjY2N jo6Ojo6OkJCQkZGRkpKS6DIm00tCl5eXmJiYmpqam5ubnJycnZ2dnp6en5+fn5+fn5+foKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgnp6egoKChoaGk5OTmJiYmJiYl5eXlpaWlpaWlpaWl5eXlpaW lpaWlJSUk5OTkZGRkJCQkJCQ6Dku0U1GjY2NjIyMuWFd6DkuonZ0i4uLrmxn3UM66Dku4z00umJe pHh16DkuvGRfkZGR6Dku4z414z414z41tnRwmJiYmZmZmpqam5ubnJycnJycnJycnZ2dnJycm5ub mpqamZmZmZmZmZmZmZmZmZmZmJiYgoKCg4ODkJCQkpKSkpKSkZGRkpKSl5eXm5ubm5ubmpqamZmZ mJiYlpaWlpaWlZWVlJSU6Eg+0ltTkpKSkZGRvG1o6Eg+pn57pn576Eg+11ZOp398rHp3vW1oqIF+ 6Eg+vm9qlpaW6Eg+2VdOrYWC3lNJ405EoZeWnZ2dnp6enp6en5+fn5+fn5+foKCgoKCgn5+fnZ2d mJiYk5OTk5OTk5OTk5OTkpKSgoKCgoKCi4uLjIyMjIyMi4uLk5OTn5+foaGhoKCgn5+fn5+fnp6e nJycm5ubm5ubmpqa6lhP1mlhmZmZmJiYwXh06lhPq4eEwHhz6lhPynBqwXh0wXh0t4B9rYiH6lhP wnl1m5ub6lhP1mljn5+fxHx46lhPs4+MoqKio6Ojo6Ojo6Ojo6Ojo6OjpKSkpKSkpKSkpKSknp6e kpKSjY2NjY2NjY2NjIyMgoKCg4ODhoaGh4eHh4eHiYmJnJycqampqampqampqKiop6enp6enpaWl pKSkpKSkpKSk62tj5m5n2Xlz2Xlz4nJr62tjtJSSwoqG62tjz397x4eD62tj2XlztZWT62tjyIiD pKSk62tj2np0p6enzoaB62tjupqYqampqqqqqqqqq6urq6urq6urq6urq6urq6urq6urqampmJiY iYmJiIiIiIiIiIiIgoKCh4eHg4ODhISEhISEjY2Nq6urtLS0tLS0s7OzsrKysrKysbGxsLCwsLCw sLCwr6+v7X945oV/zpeUzZeU3ouG7X94vqKgsqqq4YeD5oV/4YiD7X94xp2av6Oh7X94z5iUsLCw 7X946oJ83oyH7X945oaAtLS0tLS0tLS0tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1pqamioqK hYWFhYWFhYWFgoKCjY2NgoKChISEhISEmJiYu7u7wcHBwcHBwMDAwMDAwMDAv7+/v7+/v7+/vr6+ vr6+8ZWQ5J+bvb29vb2916mm8ZWQyrOxvb29wLq61Kup16mnyrOyvb29y7Sy8ZWQ16qnv7+/zLWz ybe2zLW02Kuox7u7wcHBwcHBwcHBwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCt7e3kpKShYWF hYWFhYWFgoKClZWVgYGBhISEhYWFnp6eyMjIzs7Ozc3Nzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzM 9Kun6rOwy8vLy8vL37u59Kun1cPCy8vLy8vLy8vLy8vLzMzMzMzM1cPC9Kun4Ly5zMzMzMzMzc3N zc3Nzc3Nzc3Nzs7Ozs7Ozs7Ozs7Ozs7Ozs7Oz8/Pz8/Pz8/Pz8/Pz8/Pz8/PxMTEl5eXhYWFhYWF g4ODioqKnp6egICAhISEhISEmZmZzc3N2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ 2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tfX4NPS3NbV2dnZ2dnZ2dnZ2tra 2tra2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vbxcXFkpKShYWFhYWFgoKC l5eXoaGhkJCQgoKChISEkJCQysrK5ubm5ubm5ubm5ubm5ubm5eXl5eXl5eXl5eXl5eXl5eXl5eXl 5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5ubm5ubm5ubm 5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5OTku7u7ioqKhYWFhISEgICAoKCg oaGhnZ2df39/g4ODhoaGtra26urq8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw 8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw 8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw39/fpKSkhYWFhISEgYGBlZWVoaGhoaGh oaGhlJSUgICAhISEmpqa2NjY+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn57+/vwMDAjY2NhYWFgYGBkZGRoaGhoaGhoaGhoaGh oaGhkZGRgICAhoaGqKio19fX7u7u9PT09fX19/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3 9/f39/f39/f39/f39/f39/f37+/v3t7evLy8lJSUg4ODgYGBkJCQoaGhoaGhoaGhoaGhoaGhoaGh oaGhl5eXf39/gYGBkJCQpKSkra2tr6+vs7OztLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0 tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tbW1tbW1 tbW1tbW1tbW1tbW1s7Ozp6enlJSUhYWFgYGBgICAmZmZoaGhoaGhoaGhoaGh'; } elsif ($opt == 19) { $imagedata = 'Qk2mDgAAAAAAADYAAAAoAAAAOAAAABYAAAABABgAAAAAAHAOAAAmDgAAJg4AAAAAAAAAAAAAoaGh oaGhoKCgoKCgoKCgnJyckJCQiIiIh4eHh4eHhYWFhYWFhISEhISEhISEg4ODg4ODg4ODg4ODgoKC goKCgoKCgoKCgoKCg4ODg4ODg4ODhISEhISEhISEhYWFhYWFhoaGhoaGhoaGh4eHh4eHh4eHh4eH h4eHiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIjIyMlJSUnp6eoaGhoaGhoaGhoaGhoaGhoaGhoaGh oKCgoKCgkpKSj4+Purq61NTU29vb2dnZ2tra2dnZ2NjY1tbW1dXV1dXV1dXV1dXV1NTU1NTU1NTU 1NTU1NTU1NTU1NTU1dXV1dXV1dXV1tbW19fX2NjY2dnZ2tra29vb3Nzc3Nzc3d3d3d3d3t7e3t7e 39/f39/f39/f39/f39/f39/f39/f39/f0dHRsrKyioqKlJSUoaGhoaGhoaGhoaGhoaGhoKCgoKCg jo6OoqKi6enp+/v7+/v7+vr6+fn59/f39vb29PT08/Pz8/Pz8vLy8fHx8fHx8PDw7+/v7+/v7+/v 7+/v8PDw8PDw8fHx8vLy8vLy8/Pz9PT09fX19/f3+Pj4+fn5+vr6+/v7/Pz8/f39/v7+/v7+/v7+ ////////////////////////////////////5ubmoaGhjo6OoaGhoaGhoaGhoaGhoKCgkZGRoKCg +Pj4/Pz8+/v7+vr6+fn5+Pj49vb29PT08/Pz8vLy8fHx8PDw7+/v7u7u7u7u7e3t7Ozs7Ozs7Ozs 7e3t7u7u7+/v8PDw8PDw8fHx8/Pz9PT09fX19/f3+fn5+vr6+/v7/Pz8/f39/f39/v7+/v7+//// /////////////////////////////////////Pz8qqqqj4+PoaGhoaGhoaGhmZmZi4uL5+fn9vb2 9fX19PT08/Pz8vLy8PDw7u7u7e3t6+vr6urq6enp6Ojo5ubm5ubm5eXl5OTk5OTk5OTk5OTk5eXl 5eXl5ubm6Ojo6Ojo6urq6+vr7e3t7u7u8PDw8vLy8/Pz9PT09fX19vb29/f3+Pj4+Pj4+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn58/PznJyck5OToaGhoaGhjIyMxcXF7+/v7u7u7e3t 7Ozs6urq6enp6Ojo5ubm5OTk4+Pj4eHh39/f3t7e3d3d3Nzc29vb29vb2tra2tra29vb29vb3Nzc 3d3d3t7e39/f4eHh4uLi5OTk5ubm6Ojo6enp6urq7Ozs7e3t7u7u7+/v8PDw8PDw8fHx8fHx8fHx 8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx4ODgh4eHn5+fnJycjo6O4eHh5OTk4+Pj4uLi4uLi 4eHh39/f3d3d29vb2dnZ2NjY1tbW1NTU09PT0tLS0dHR0NDQz8/Pz8/Pz8/Pz8/P0NDQ0dHR0tLS 09PT1NTU1dXV2NjY2dnZ29vb3d3d3t7e4eHh4uLi4uLi4+Pj5eXl5eXl5ubm5+fn5+fn5+fn5+fn 5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fnp6enlZWVlJSUpKSk2tra2dnZ2dnZ2NjY19fX1dXV 09PT0tLS0NDQzs7OzMzMy8vLycnJyMjIx8fHxsbGxsbGxMTExMTExMTExMTExsbGxsbGxsbGyMjI ycnJysrKzMzMzs7O0NDQ0tLS09PT1dXV19fX2NjY2dnZ2dnZ2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc 3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzcxMTEiYmJjIyMsrKyzs7Ozs7Ozc3NzMzMysrKycnJyMjI xsbGxcXFw8PDwcHBv7+/vr6+vLy8vLy8u7u7urq6ubm5uLi4uLi4ubm5ubm5u7u7vLy8vLy8vb29 v7+/wcHBwsLCxMTExsbGyMjIycnJysrKzMzMzc3Nzs7Ozs7Oz8/P0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ 0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQy8vLgoKChoaGt7e3wsLCwsLCwcHBwMDAv7+/v7+/vr6+vb29 vLy8urq6uLi4t7e3tbW1tbW18kI48kI48kI48kI48kI4vZya7kk/5VdOsrKy1nRu8kI4zIqG1H13 8kI4yJyZwauq61FJ8kI442liwcHBwsLCw8PDxMTExMTExcXFxsbGxsbGxsbGxsbGxsbGxsbGxcXF xcXFxMTExMTExMTExMTExMTEwMDAgoKCg4ODs7OzuLi4t7e3tra2tra2ubm5u7u7u7u7urq6ubm5 t7e3tbW1tLS0s7Ozs7Oz8FBG5GNawJiWwJiWwJiWsLCwxJKP8FBG4Glh8FBG1Xt1s7Oz0oJ98FBG xZ2b1IWA8FBG1oaByaGevb29vr6+v7+/wMDAwcHBwcHBwsLCwsLCwsLCwsLCwsLCwsLCwsLCwMDA vLy8ubm5ubm5ubm5ubm5tra2goKCgoKCq6urrq6ura2trKyssrKyurq6u7u7urq6ubm5t7e3t7e3 tra2tLS0tLS0s7Oz8F5V4XRtsrKysbGxsbGxsbGxsbGx1YN+8F5V5W5ns7OztLS00omF8F5VxaCe 04uH8F5Vx6Ogu7u7vLy8vb29vb29vr6+v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/u7u7 srKyr6+vr6+vr6+vrKysgoKCg4ODoqKipqampaWlpqamtbW1vr6+vr6+vb29vLy8u7u7urq6urq6 ubm5uLi4t7e38HBo7XRt4oF84oF814+Ktra2wamn7XRt7XRt8HBozJ2ZuLi41JSR8HBoyKem1paR 8HBoyqmovr6+vr6+v7+/wMDAwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwMDAs7Oz qKiop6enp6enpaWlgoKCh4eHmZmZoKCgoKCgp6envb29xMTExMTEw8PDw8PDwcHBwcHBwcHBwMDA wMDAv7+/8oN964qF2KGe2KGd0aelwbq66I6J74eBwbu65ZKN74eBybSz2aKe8oN92qOf8oN98oN9 8oN95pSPxMTExMTExcXFxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGurq6paWl oaGhoaGhn5+fgoKCjY2Nk5OToKCgoKCgrq6uysrKz8/Pzs7Ozs7Ozs7Ozc3NzMzMzMzMzMzMy8vL y8vL9JmT7KKe1b681b681L28z8TD1b680MTDy8vLzcjH1r+908LB0cXF1r++0cbF5q2p9JmT37e0 1cTDz8/Pz8/Pz8/P0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQx8fHq6uroaGh oaGhn5+fgoKClZWVi4uLoKCgoKCgs7Oz1NTU2dnZ2dnZ2NjY2NjY19fX19fX19fX19fX1tbW1tbW 9q6p9q6p9q6p9q6p9q6p1dXV1tbW1tbW1tbW1tbW1tbW1tbW5sLA9q6p383M48jG77i13tDP2dnZ 2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra0dHRr6+voaGhoaGh l5eXioqKnp6egoKCnp6eoKCgsLCw2NjY4uLi4uLi4uLi4uLi4uLi4eHh4eHh4eHh4eHh4eHh4eHh 4eHh4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh5N3d59nZ49/f4uLi4uLi4uLi4uLi4uLi 4uLi4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj0tLSq6uroaGhoaGhioqK l5eXoaGhkJCQkJCQoKCgqamp1tbW6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6urq6urq 6urq6urq6urq6urq6urq6urq6urq6urq6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr7Ozs 7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs6+vry8vLpaWloaGhmZmZgYGBoKCg oaGhnZ2dgYGBmZmZoqKixsbG7u7u8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz 8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz 8/Pz8/Pz9PT09PT09PT09PT09PT09PT09PT09PT09PT05+fnubm5oaGhnZ2dhYWFlZWVoaGhoaGh oaGhk5OThYWFnZ2dsbGx4eHh+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6 +vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6 +vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr68/Pzzs7Op6ennp6eiIiIkZGRoaGhoaGhoaGhoaGh oaGhkJCQhISEmpqavLy84ODg8vLy9/f39/f3+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn58/Pz5eXly8vLrKyslpaWhYWFkJCQoaGhoaGhoaGhoaGhoaGhoaGh oaGhlpaWgYGBjIyMoaGhsrKyurq6vb29wMDAwcHBwcHBwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA wMDAwMDAwMDAwMDAwMDAwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHB wcHBwcHBwcHBwcHBwMDAtra2pqamlpaWioqKgICAmZmZoaGhoaGhoaGhoaGh'; } elsif ($opt == 191) { $imagedata = 'Qk2mDgAAAAAAADYAAAAoAAAAOAAAABYAAAABABgAAAAAAHAOAAAmDgAAJg4AAAAAAAAAAAAAoaGh oaGhoKCgoKCgoKCgnJyckJCQiIiIh4eHh4eHhYWFhYWFhISEhISEhISEg4ODg4ODg4ODg4ODgoKC goKCgoKCgoKCgoKCg4ODg4ODg4ODhISEhISEhISEhYWFhYWFhoaGhoaGhoaGh4eHh4eHh4eHh4eH h4eHiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIjIyMlJSUnp6eoaGhoaGhoaGhoaGhoaGhoaGhoaGh oKCgoKCgkpKShoaGmpqapaWlqampqKioqKiop6enp6enpaWlpaWlpaWlpKSkpKSko6Ojo6Ojo6Oj o6Ojo6Ojo6Ojo6OjpKSkpaWlpaWlpaWlpqamp6enp6enqKioqampqampqqqqq6urq6urq6urq6ur rKysrKysrKysrKysrKysrKysrKysrKyspqaml5eXhYWFlJSUoaGhoaGhoaGhoaGhoaGhoKCgoKCg jo6Oj4+PsLCwuLi4uLi4t7e3t7e3tbW1tLS0s7OzsrKysrKysbGxsbGxsbGxsLCwr6+vr6+vr6+v r6+vsLCwsLCwsbGxsbGxsbGxsrKys7OztLS0tbW1tra2t7e3t7e3uLi4ubm5urq6urq6urq6urq6 u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7r6+vkJCQjo6OoaGhoaGhoaGhoaGhoKCgkZGRj4+P t7e3ubm5uLi4t7e3t7e3tra2tLS0s7OzsrKysbGxsbGxsLCwr6+vr6+vr6+vrq6ura2tra2tra2t rq6ur6+vr6+vsLCwsLCwsbGxsrKys7OztLS0tbW1t7e3t7e3uLi4ubm5urq6urq6urq6urq6u7u7 u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7urq6lJSUj4+PoaGhoaGhoaGhmZmZhISEsLCwtra2 tbW1tLS0tLS0s7OzsrKysLCwr6+vrq6ura2trKysrKysqqqqqqqqqqqqqampqampqampqampqqqq qqqqqqqqrKysrKysra2trq6ur6+vsLCwsrKys7OztLS0tLS0tbW1tra2t7e3t7e3t7e3uLi4uLi4 uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4tbW1jY2Nk5OToaGhoaGhjIyMnp6esrKysbGxsLCw r6+vrq6ura2trKysq6urqampqKiop6enpqampaWlpKSkpKSko6Ojo6OjoqKioqKio6Ojo6OjpKSk pKSkpaWlpqamp6enqKioqampq6urrKysra2trq6ur6+vsLCwsbGxsrKysrKysrKys7Ozs7Ozs7Oz s7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozq6urg4ODn5+fnJychYWFqqqqq6urqqqqqqqqqamp qKiop6enpqampKSko6OjoaGhoKCgn5+fnp6enZ2dnZ2dnJycm5ubm5ubm5ubm5ubnJycnZ2dnZ2d np6en5+fn5+foaGho6OjpKSkpqampqamqKioqampqqqqqqqqrKysrKysrKysra2tra2tra2tra2t ra2tra2tra2tra2tra2tra2tra2tra2tra2tkZGRlZWVlJSUj4+PpqampaWlpKSkpKSko6OjoqKi oKCgn5+fnp6enZ2dm5ubmpqamZmZmJiYl5eXl5eXlpaWlZWVlZWVlZWVlZWVlpaWlpaWl5eXmJiY mZmZmZmZm5ubnZ2dnp6en5+foKCgoqKio6OjpKSkpKSkpaWlpqampqamp6enp6enp6enp6enp6en p6enp6enp6enp6enp6enp6enp6enp6ennZ2diYmJjIyMk5OTn5+fnp6enZ2dnZ2dnJycm5ubmpqa mJiYl5eXlpaWlJSUk5OTkpKSkZGRkJCQkJCQj4+Pjo6Ojo6Ojo6Ojo6Ojo6OkJCQkJCQkZGRkpKS k5OTlJSUlZWVl5eXmJiYmpqam5ubnJycnZ2dnZ2dnp6en5+fn5+foKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgnp6egoKChoaGk5OTmJiYl5eXl5eXlpaWlpaWlpaWl5eXlpaW lpaWlJSUk5OTkZGRkJCQkJCQ6Dku6Dku6Dku6Dku6Dkunn174z4010lAjo6OwF5Y6DkusW9rvGRf 6DkuqX16n4mI3kQ76Dkuz1ZPmZmZmpqam5ubm5ubnJycnJycnZ2dnZ2dnZ2dnZ2dnZ2dnJycm5ub mpqamZmZmZmZmZmZmZmZmZmZmJiYgoKCg4ODkJCQkpKSkZGRkZGRkpKSl5eXm5ubm5ubmpqamZmZ mJiYlpaWlpaWlZWVlZWV6Eg+2FZOqIB9qIB9qIB9kpKSrXt46Eg+01tT6Eg+w2pklZWVv29q6Eg+ rIOBwXFr6Eg+wnJsr4eEnZ2dnZ2dnp6enp6en5+fn5+foKCgoKCgoKCgoKCgoKCgoKCgn5+fnZ2d mJiYk5OTk5OTk5OTk5OTkpKSgoKCgoKCi4uLjIyMi4uLi4uLk5OTn5+foaGhn5+fn5+fnp6enZ2d nJycm5ubm5ubm5ub6lhP1mlimZmZmZmZmZmZmZmZmZmZxnRw6lhP2mVdm5ubm5ubwnp16lhPsIyJ w3t36lhPso2MoaGhoqKioqKio6Ojo6Ojo6Ojo6OjpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSknp6e kpKSjY2NjY2NjY2NjIyMgoKCg4ODhoaGh4eHhoaGiYmJm5ubqampqampqKiop6enp6enpqampaWl pKSkpKSkpKSk62tj525n2Xlz2Xlzy4N/oqKisJiW5m5n525n62tjvo+LpKSkyIiE62tjt5eVyYmF 62tjuZmWqampqampqampqqqqq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6urqampmJiY iYmJiIiIiIiIiIiIgoKCh4eHg4ODhISEhISEjY2Nq6urtLS0s7Ozs7OzsrKysrKysbGxsLCwsLCw sLCwr6+v7X945oV/zpeUzpeUxp2as6yr4YiD6YJ8s6yr3ouG6oJ8u6emz5iV7X94z5iV7X947X94 7X9434yHtLS0tLS0tLS0tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1pqamioqK hYWFhYWFhYWFgoKCjY2NgoKChISEhISEl5eXu7u7wcHBwcHBwMDAwMDAwMDAv7+/v7+/vr6+vr6+ vr6+8ZWQ552YyrOyyrOyyrOyxLi4yrOyxLi4vr6+wbu7y7SzyLe1xbq5y7Szxbq53qWi8ZWQ1q2r yrm4wcHBwcHBwcHBwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCt7e3kpKShYWF hYWFhYWFgoKClZWVgYGBhISEhYWFnZ2dyMjIzs7Ozc3Nzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzM 9Kun9Kun9Kun9Kun9Kuny8vLzMzMzMzMzMzMzMzMzMzMzMzM4Ly59Kun18TD3MC+6rSw1cfGzc3N zs7Ozs7Ozs7Ozs7Ozs7Ozs7Oz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/PxMTEl5eXhYWFhYWF g4ODioqKnp6egICAhISEhISEmZmZzc3N2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ 2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3NbV4dPS29jY2dnZ2tra2tra2tra2tra 2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbxcXFkpKShYWFhYWFgoKC l5eXoaGhkJCQgoKChISEkJCQysrK5ubm5ubm5ubm5ubm5ubm5eXl5eXl5eXl5eXl5eXl5eXl5eXl 5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5ubm5ubm5ubm5ubm5ubm5ubm 5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5OTku7u7ioqKhYWFhISEgICAoKCg oaGhnZ2df39/g4ODhoaGtra26urq8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw 8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw 8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw39/fpKSkhYWFhISEgYGBlZWVoaGhoaGh oaGhk5OTgICAhISEmpqa2NjY+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5 +fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn57+/vwMDAjY2NhYWFgYGBkZGRoaGhoaGhoaGhoaGh oaGhkJCQgICAhoaGqKio19fX7u7u9PT09fX19/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3 9/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3 9/f39/f39/f39/f39/f39/f37+/v3t7evLy8lJSUg4ODgYGBkJCQoaGhoaGhoaGhoaGhoaGhoaGh oaGhlpaWf39/gYGBkJCQpKSkra2tr6+vs7OztLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0 tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tbW1tbW1tbW1tbW1 tbW1tbW1tbW1tbW1s7Ozp6enlJSUhYWFgYGBgICAmZmZoaGhoaGhoaGhoaGh'; } elsif ($opt == 1) { $imagedata = 'R0lGODlh9AEgAcQAABISEpeRiFdNRNPa2Gppbi0qKbKzsXJqXP///4F9dhsXIKOhoEA4O8TFxFdW V+Xp5QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAA 9AEgAUAF/+AijqRBLqaJrkbapuwrz3Tz2m1j7wbv90CdUNgbGo9I3UC4VDaWUGf0qYxCB9dnFku1 ar1WbvhLvmLP6DT6qza33+IzW8uGi+luc/cub3q7Un9ggH5MhkOFVEmLSUWOOkVDjzw0OZaXlZkv MS4iMCwnoaEwKp0uMyiamZQ4j0GvREeRjLSItYeFfHhuhGW+a2p1dnN9eXZ6w8fJxsV1u2/EXMJx 02C6yHzWe3iAhlODt+E7sZDlrpCTM62qqDKpK/AqI/LznjGpLe/s6zeXPv+TxombUiuXlG3bxsTZ ogwYtTbVGko882DigIoVL2LJaHEjxY52OIK0uKuMQojFrP9dq/KtG8FuTmzFFBdkXM1zsNhlwrfJ lD5PpUCd0lmpFcBySJM0EXdw6aCTvfpwWwgt5Ug1Ij2iySqy60eNHjli/Dh2rFawGsWGTWMWbVm2 X9HGjWs269VlDKlG3IOsJCFw3mTOZJoUpzkcrIjy1PfJlCp+iGWYg/Uv3FLBBhFqy9bQ5NWMduGe fQta7luwD0qn1Zp6Lem0r0unrgvb9emyGGevXh177UWxssmK3g0n9F1sDvs+1WxQ6pHLhGfFemWY uuKePNVZSvxDElOnimw1j3rtWMSQFtuq552bde3greP/5s2+/ezc8vHDxo37d3/+/r13n3/x8Vdg fvOhxl7/bfSBZp+CdAl3XBrnLURMQlEpAh14z90ySyTVRUZUUUBIRtl0hB2i4VO8PFTNM8q05VaE u8G3kW4DtnZjgPkdWCCBOM5335BEFkkkj0AeuR+ORjbppI/4IThkkkwKmaN+Vs74HoQ2jibhVhLt tcZUW2iIRCKCIQEiiomV6KaJ/iBmU1JKnSnTZhZSaFVDXv1HI4T1Scljj08WaqQOCCSq6KKMNuro o5BGKumklFZqKaUPNGDopqRVueCPOp4WoVojeQZMTFIR9FJ4RkBnxDndWXfUiQOZKUhLVIHUp5a+ 2QfqoFByKuywv2l66bHIJqvsssw2agCVw0b7pJAK9kbc/7Vh5pmQNII0FZ6rTIV4mEAFtUretpyh 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 2FmbflKMvkPcuei/iktk7eCizHvoml/efORbN1879E2Lnrvd2MtONMaIWXzW2K87enZHq4evduyz M95X6d6bwiRa73sv/1kVu18/+/Z7P8r8Zo2y//78C6D9ANi/SXAufggJoPwcISzzeK8slDhPAxu4 JJ9lClOaUpIFEXM686VuBq3jjgg9SLJIbc92mpOY+whQOhWewn0NsZjE6CdA+83whgrM4QIr5j8m EdCH/OthEPs3PwD20H9CLMv/MCUsJh6xgkiEYossKMEllQZ8JJxOobTDqCyS/+wBsZue8AREP4cg UIb3wyH/ZnhGG5oxf2ssYhnZV4khGtCIFttfWYjYxO5ZTIl8BCID81hAJu6RikT83yhGlEH/WYgA a/Hio+aiKElmsQEw809DKJSgF6KRhmcEZRrvR8cYvs99e6yfxBqEoAOwkI6hrNgeKUHLOvrxh7ZM jC4j+EA/EhFdsrSTE205CXQpRomDXBIGLcgzmBgAi5askeqi6UEwQq5xYWPhg2IIQ8zlEIatPKAr x2nGF5KxjpQI5x95iEB08WyTqGTSK3nWpGDOD4L80+YfFVPHY06wlhA0ETox1M9i8nJnmKKlSxAU gGVRk2Pje+jrHjCABjSgZv8zq5xG4zMp6G3vcR49yWTGOc5WNkhzAOKPQ7TJQs+00j+uZCVJ1XlS mMrElhJqUi0HusdX1rOlj6mjNqfHwk2axafptFgrIQMZhyQVQyYthc0GAE2JSrOSVs3iALbK1QZw date9SpFNULWslJ0q2OlakUNYFGLspVmF60ZRr8l18ENbnIczSjRZGZXuMb1onS1a1sH69a4vhWu iB2cYf3aVrZedLGMbataqQoytIkMhGZdVFY3lqPNevazoA2taFlR1dGa9rSoTe0kVcva1rr2tbCN rWxnS9va2va2uM2tbnfL29769rfADa5wh0vc4hr3uMhNrnKXy9zmOve50I1JrnSnS93qWve62M2u drfL3e5697vgDa94x0ve8pr3vOhNr3rXy972uve98I2vfOdL3/ra9774za9+98vf/vr3vwAOsIAH vN8QAAA7'; } return ($imagedata); } ########################################################################WORKERS sub worker #------------------------------------------------------------ { #called from main my $TID = $_[0] || 0; $| = 1; while(1) { if ($shash{$TID}{die} == 1) { #DIE last; } elsif ($shash{$TID}{rss} == 1) { #RSS my $xml; my @URLs = split (',', $shash{$TID}{optionCSV}); foreach my $url (@URLs) { #Download XML from RSS feed print '='x79 . "\nFetching URL: [$url]\n" . '='x79 . "\n"; eval { $xml = XML::FeedPP->new($url) }; if (! $@) { #Parse RSS XML if (! parseRSS(\$xml)) { warn "Error processing URL: [$url]\n$!"; } } else { warn "Error downloading URL: [$url]\n$!"; } } } elsif ($shash{$TID}{post} == 1) { #POST #collect stringRef from sub post_post my $message = $shash{$TID}{optionCSV} || 'NULL'; undef $shash{$TID}{optionCSV}; #connect, post message, and disconnect my $nntpRef = nntpconnect(); if($nntpRef) { warn "Posting message\n"; #close STDERR; my $ret = $$nntpRef->post([$message]); #open ('STDERR', '>>', 'NewsSurfer.log') # || warn "Cannot append NewsSurfer.log\n$!"; $$nntpRef->quit; #check return if ($ret) { warn "Message posted\n"; } else { warn "Error - Unable to post message, could not send\n"; } } else { warn "Error - Unable to post message, could not connect\n"; } #go back to sleep $shash{$TID}{optionCSV} = 0; $shash{$TID}{post} = 0; } elsif ($shash{$TID}{decode} == 1) { #DECODE #gather files into an array ref for the decoder #look for any part 0 nfo files my(@art, $cvt, $nfochk, $result,); my @pt_files = glob "part*.pt"; unless ($pt_files[0]) { $shash{$TID}{return} = 0; $shash{$TID}{optionCSV} = 0; $shash{$TID}{article} = 0; next; } foreach my $partfile (@pt_files) { open ('PTFH', '< :raw', "$partfile") || die $!; if (!defined $nfochk && $partfile eq 'part0.pt') { #part 0 nfo fix $nfochk = 1; } else { my @a = (); push (@art, @a); } close PTFH; } #initialize decoder my $ddir; { dbmopen(my %OPT, 'settings', '0640') || die "Cannot create settings.\n$!"; $ddir = "$OPT{DDir}"; dbmclose %OPT; } warn "decoding attachment(s)\n"; $cvt = new Convert::BulkDecoder( destdir => $ddir, tmpdir => '.', force => 1, #todo - add option verbose => 1, debug => 1, crc => 0, ); #decode partfiles eval { $result = $cvt->decode(\@art) }; unless (defined $result) { $result = "DECODE ERROR"; } if ($@ || $result eq 'EMPTY') { #decode failed warn "Error - Could not decode the file\n[$result]\n"; $shash{$TID}{return} = 0; } else { #decode succeded my ($dirname, $filename,) = 0; my $size = $cvt->{size} || 0; my $file = $cvt->{file} || 'NULL'; warn "Extracted [$size] bytes to file: [$file]\n"; if ($size && $file ne 'NULL') { #determine filename and path $file =~ m#(\b.+)\/(.+\..{3,4})#; $file =~ m#(.+)\/(.+\..{3,4})# unless ($2); if (defined $1 && defined $2) { $dirname = $1; $filename = $2; #copy any part0 nfo files found if (defined $nfochk && $nfochk == 1) { #found part 0 nfo file if ($^O eq 'MSWin32') { $file =~ s#\/#\\#g; system("copy part0.pt $file.nfo"); warn "copy part0.pt $file.nfo\n"; } else { system("cp part0.pt $file.nfo"); warn "cp part0.pt $file.nfo\n"; } } $shash{$TID}{return} = $dirname . '*' . $filename; } else { warn "Error - parsing filename and path\n"; $shash{$TID}{return} = 0; } } else { $shash{$TID}{return} = 0; } } #remove temporary part files foreach (@pt_files) { unlink $_ || warn "Error - Can not delete part.\n$!"; } #go back to sleep $shash{$TID}{decode} = 0; } elsif ($shash{$TID}{article} == 1) { #ARTICLE #gather and verify startup parameters, connect to nntp server #expects: group name *, 1st part number, message id's # * when a zero is provided for group name, multipart is on my (@options, $groupName, $firstPart, $nntpRef, $retried,); warn "DEBUG - optionCSV has: [$shash{1}{optionCSV}\n"; @options = split(',', $shash{$TID}{optionCSV}); $groupName = shift(@options) || 0; $firstPart = shift(@options) || return (0); #connect to NNTP server retryArticleDownload: eval { $nntpRef = nntpconnect() }; if (! $nntpRef) { warn "Retrying NNTP connect\n"; eval { $nntpRef = nntpconnect() }; } if (! $nntpRef) { warn "Error - Could not connect to server\n"; $shash{$TID}{return} = 0; } else { #connected, download article my $ok; if ($groupName) { #for singlepart messages my $partNumber = $firstPart; eval { $$nntpRef->group($groupName) }; if (defined $options[0]) { #create a temporary file and download the part open ('FH', '> :raw', "part$partNumber.pt") || die $!; eval { $ok = $$nntpRef->article($options[0], *FH) }; close FH; } else { warn "Article number not supplied\n$!"; } } else { #for multipart messages my $partNumber = $firstPart; foreach my $i (@options) { #create a temporary file and download the part open ('FH', '> :raw', "part$partNumber.pt") || die $!; #download each part of the multipart message eval { $ok = $$nntpRef->article($i, *FH) }; if (! $ok) { #retry article download once eval { $$nntpRef->quit }; close FH; sleep (1); if (! $retried) { $retried++; warn "Warning - Retrying article download\n"; goto retryArticleDownload; } else { #cant download part, delete temporary part files foreach (glob "part*.pt") { unlink $_ || warn "Error - cant delete part.\n$!"; } warn "Error - Unable to download article\n"; close FH; last; } } else { #part downloaded, try next part $shash{$TID}{progress} = $partNumber; $partNumber++; } close FH; } } #close nntp connection and set return eval { $$nntpRef->quit }; if ($ok) { $shash{$TID}{return} = 1; } else { $shash{$TID}{return} = 0; } } #go back to sleep $shash{$TID}{optionCSV} = 0; $shash{$TID}{article} = 0; } elsif ($shash{$TID}{list} == 1) { #LIST my ($nntpRef, $connected,); #connect eval { $nntpRef = nntpconnect() }; if (! $nntpRef) { #retry once eval { $nntpRef = nntpconnect() }; if (! $nntpRef) { $connected = 0; } else { $connected = 1; } } else { $connected = 1; } if ($connected) { my (%HoA, $HoA_ref,); #get list of newsgroups eval { $HoA_ref = $$nntpRef->list() }; if ($HoA_ref) { #(HoA_ref) groupname = last, first, moderated #pl.misc.telefonia.gsm: 0000339959 0000307277 y #mvis.lists.apache.talk: 0000003574 0000003322 m %HoA = %$HoA_ref; undef $HoA_ref; } eval { $$nntpRef->quit() }; #create groups database { my (%groups,); tie %groups, 'MLDBM', 'groups', O_CREAT|O_RDWR, '0640' or die $!; for my $groupname (keys %HoA) { my $articleTot = $HoA{$groupname}[0] - $HoA{$groupname}[1]; $groups{"$groupname"} = $articleTot; } untie %groups; } } else { warn "Error - Unable to connect to server, try again\n"; } $shash{$TID}{list} = 0; } sleep(1); } warn "Thread [$TID] is closing.\n"; return (0); } ########################################################################DOCUMENTATION =head1 NAME NewsSurfer =head1 DESCRIPTION Read/Download/Post - To/From - NNTP Newsgroups. =head1 README NewsSurfer v3.02 (New and Improved!) A Multi-Threaded Perl Tk GUI based NNTP client with yEnc support. =head1 PREREQUISITES Net-NNTP Date-Parse Date-Format Convert-BulkDecoder Tk =head1 COREQUISITES Win32::Console (Optional) =pod OSNAMES MSWin32 Unix Linux =pod SCRIPT CATEGORIES News =head1 Copyright NewsSurfer - Download and upload messages and attachments via NNTP Copyright (C) 2004-2008 Jason David McManus This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA =head1 History v1_00 *Initial release. (Jan. 2004) v1_10 *Improved Ctrl-A function. *Added Shift-End and Shift-Home functions to the message display. v1_20 *Will no longer attempt to authenticate unless user/pass fields have been completed. *Cosmetic improvements to Post & Read functions. *Added preformance improving option (limits message age). v1_30 *Added option to open files after download (Win32 only?). *Message reply and post functions are faster now. *Improved error display. v1_40 *Made improvements to memory management. *Added search function to groups screen. *Added right-click menus to main window. *Fixed a bug in the scanning multipart function. v1_50 *Minor GUI fixes/enhancements. *Fixed a bug with opening file when the Dl Dir is not configured. *Added a button to browse or ls the download directory. v1_60 *Some window decoration improvements. *Optimized for Tk 804.25 beta 15. *Added chooseDirectory function to the options page. *Fixed a bug in grab&open when opening files with 4 char ext's. *Improved delete function and overall responsiveness. *Speed up sorting function slightly. v1_70 *Added 'wrote:' line. *Fixed a bug in grab function, when article doesnt exist on server. v1_80 *Implemented 'quoted-printable' message parsing. *Added ability to attach signatures. *Disabled as many widgets as possible while groups window is open. *Improved search function for the groups screen. v1_90 *Fixed a major bug with the duplicates function. *Fixed a bug with selecting text in the read/post screens. v2_00 *Removed popup progressbar, added statusbar. v2_10 *Created new option (limit to 5k messages per scan). *Made some minor improvements to statusbar. Minor GUI tweaks. *Added error routine for invalid logins. *Fixed a bug scan a group which hasnt been scanned for 30 days. *Improved speed. v2_20 *Fixed a subject line bug. *Fixed a bug when all messages are older than 30 days. *Added a screen to select the number of new message to download. *Added a new function - message_load. *Changed error message for configure download directory. v2_30 *Added a much needed new function 'Clear newsgroup'. *Added logging option. *Added option to beep on errors. *Fixed a display bug in group unsubscribe from main screen. *Improved groups update function (uses less memory). v2_40 *Slightly improved code readability. *Reworked the sort function. *Added a time-out for the non-fatal error dialogs. *Changed message display update from time based to count based. *Replaced some backtick operations with 'system' ones. *Created a subroutine for loading program images. *Added splashscreen. *Improved Grid. v2_50 *Added a save function to Log. Improved Log. *Improved Error system, integrated it into Log. *Added new functions to d/l messages dialog (all, newest). *Improved groups/search. *Minor gui enhancements. *Added references header line. v2_60 *Added some extra error handling for some connect sequences. *Wrapped the decode attachment process in an 'Eval'. *Added a function to search subject headers in group. *Configured some error messages to appear in the statusbar. *Changed timeout from 30 to 5. *Removed some timed mw updates. *Improved group/search. v2_80 *Rolled back changes to the connection timeout values. *Changed right-click bindings for message hlist. *Fixed a bug where program would freeze if there was a problem connecting during a post operation. *Messages are no longer marked read if the attachment is not. *decoded properly. v2_90 *Added new images for buttons. *Implemented paned window for main screen. v2_91 *Improved error handling. *Retries once on a bad article download. *More efficient. v3_00 *First Beta release. *Code has been re-structured. *Some functions now use threads. *Newsgroup storage now uses MLDBM instead of a flat file format. *Now only using two images for each main button. *Various other bug fixes, performance, and memory improvements. *Disabled posting of attachments untill yEnc bugs are fixed. v3_01 *Fixed reply quoting (changed '>' to '> '). v3_02 *Fixed regex character escaping in the groups subscribe window. *Improved functionality of the groups subscribe window search, it is now possilble to search before displaying all newsgroups. *Handles timeout and other network errors better. *Cleaned code, removed most goto's, added ready subroutine. *Move nearly all blocking functions to a threaded model. =head1 Caveats *If you are upgrading from a version of NewsSurver < 3.00, then it is recommended that you use a new directory for this version. *This is beta software.. =head1 Main data structure Each subscribed newsgroup gets its own database file (groupname.grp) MULTIPARTDB is a HoHoH HEADERDB is a HoHoA RSSDB is a HoHoS $mldbm{MULTIPARTDB}{SUBJECT}{PART} #Message ID $mldbm{HEADERDB}{MESSAGENUMBER}[0] #subject $mldbm{HEADERDB}{MESSAGENUMBER}[1] #from $mldbm{HEADERDB}{MESSAGENUMBER}[2] #date $mldbm{HEADERDB}{MESSAGENUMBER}[3] #message-id $mldbm{HEADERDB}{MESSAGENUMBER}[4] #references $mldbm{HEADERDB}{MESSAGENUMBER}[5] #bytes $mldbm{HEADERDB}{MESSAGENUMBER}[6] #lines *parts* $mldbm{HEADERDB}{MESSAGENUMBER}[7] #xref:full *read* $mldbm{HEADERDB}{MESSAGENUMBER}[8] #old message? $mldbm{RSSDB}{URL} #XML as string =head1 Posting spaghetti code (subroutines) [raise the post message window] | | [wait for user input] {press a button (Attach&Send | Send)} | --------<-------|---------->----------- | Attach&Send Send | | | [post_attach] | ^ {more attachment data? (yes | no)} | | | | | ------<------|----->--------- | | | yes no | | | | | | [post_yEnc] [post_send] | | | | | --------------------<---------- | | [lower the post message window] *allows for 1 attachment of >= 1 part(s) per post =head1 TODO *Test and research the newnews(since) method, this can be utilized in the case where xover is not implemented on the server. (rare) *Implement references based discussion grouping *Improve posting attachments (high priority) *Internationalization (unicode::lite perhaps?) *Finish integrating RSS and Email functions *Consider using News::NNTP instead of Net::NNTP =head1 Contact Please send comments/suggestions/bugs to: QoS.nospam@cpan.org (remove dot nospam to send email) Thank you. =cut