# ---------------------------------------------------------------------------- # This Software is Copyright (C) 2006, All Rights Reserved # ---------------------------------------------------------------------------- # This program is protected by local and international copyright laws. Any # use of this program is subject to the terms of the license agreement # included as part of this distribution archive. Any other uses are strictly # prohibited without the written permission of the Vendor and all # other rights are reserved. # ----------------------------------------------------------------------------- # Warning : Modifying this program violates your license agreement! # ----------------------------------------------------------------------------- ($cgidir,$cgiurl)=&tu();unless($cgidir){print"Content-type: text/html\n\nUnable to determine cgidir!"; exit}%hc=("cgidir"=>$cgidir,"cgiurl"=>$cgiurl,"datadir"=>"$cgidir/data","filelock"=>"$cgidir/data/filelock.lock","tbcolor"=>"003399","bgcolor"=>"003366","_prog_ver"=>"1.25","prod_id"=>"11","prog_build"=>"700","imageurl"=>"images/",); $SIG{__DIE__}=$SIG{__WARN__}=\&sp;srand(time+$$+($$<<15));$|++; use Fcntl qw(:DEFAULT :flock);%hj=("datafile"=>"$hc{'datadir'}/page.dat","fields"=>"num name path url updated users allow_all_users","search"=>"name","sortcode"=>sub{ lc((split(/\¡/,$a,3))[1])cmp lc((split(/\¡/,$b,3))[1])});%ho=("datafile"=>"$hc{'datadir'}/setup.dat.cgi","fields"=>"num product ver titlebar tbcolor1 tbcolor2 tbcolor3 bgcolor1 bgcolor2 bgcolor3 imageurl "."helpurl client_id client_pw admin_id admin_pw login_timeout login_timeout_min logoff_action "."logoff_url client_add client_edithtml client_remove confirm_erase confirm_erased confirm_saved "."license_name license_domain license_id d c f demo footerbar branding perpage "."client_upload upload_max upload_max_filesize image_max image_max_width image_max_height upload_allowed_extensions upload_dir upload_url");%hp=("datafile"=>"$hc{'datadir'}/user.dat.cgi","search"=>"name","filelock"=>"filelock.lock","fields"=>"num name login_id login_pw created_mon created_day created_year expires_mon expires_day "."expires_year expires_date expires_never disabled notes","sortcode"=>sub{ lc((split(/\¡/,$a,3))[1])cmp lc((split(/\¡/,$b,3))[1])});%hq=("filelock"=>"filelock.lock","fields"=>"num url"); sub sh{my$max_filelock_wait=$hi{'max_filelock_wait'}||5;&va('exclusive',$max_filelock_wait)} sub sk{my$max_filelock_wait=$hi{'max_filelock_wait'}||5;&vu($max_filelock_wait)} sub si{my($filelock)=$_[0]||"$hc{'datadir'}/$hc{'filelock'}";my($i); my($pdir)=$filelock;$pdir=~s/\\/\//g;if($pdir=~m/^(.*?)[^\/]+$/&&!-w $1){&tg('dirnotwritable',$1)} if(-e $filelock&&(stat($filelock))[9]<$^T-300){&tg("persistentfilelock",$filelock)} while(!mkdir($filelock,0777)){sleep 1;if(++$i>3){&tg('serverbusy')}}} sub sl{my($filelock)=$_[0]||"$hc{'datadir'}/$hc{'filelock'}";rmdir($filelock)} sub sa{if(ref($_[0])ne"HASH"){die"DB_Add : The first argument must be a HASH reference!\n"} if(ref($_[1])ne"HASH"){die"DB_Add : The second argument must be a HASH reference!\n"} my($datafile)="$_[0]->{'datafile'}";my(@fields)=split(/ /,$_[0]->{'fields'}); my($in)=$_[1];my($newnum)=int$_[2];my(@aa);my(@ab);my(%hu);if((-e $datafile)&&$backup){&sb($_[0])} &sh();if(-e $datafile){open(F,"<$datafile") or &sd("DB_Add : Can't open '$datafile'"); @aa=;close(F)}foreach(@aa){/^\d/||next;$hu{(split(/\¡/))[0]}=1} if($newnum&&$hu{$newnum}){&sk();return &sj(@_)}elsif($newnum){$nnum=$newnum} else{$nnum=1;while($hu{$nnum}){$nnum++}}open(F,">$datafile.tmp$$") or &sd("DB_Add : Can't open '$datafile.tmp$$'for write"); print F qq|#!$^X\n| or &sd("DB_Add : Can't write to '$datafile'"); print F qq|print"Content-type: text/html\\n\\n";\n__END__\n| or &sd("DB_Add : Can't write to '$datafile'"); foreach(@aa){/^\d/||next;s/[^¡]+$//;print F"$_\n" or &sd("DB_Add : Can't write to '$datafile'")} my($line)="$nnum¡";for$i(1..$#fields){my($enc)=$in->{$fields[$i]}; $enc=~s/([\x1a\r\n\¡\¿])/sprintf("¿%02x",ord($1))/egx;$line.="$enc¡"} print F"$line\n" or &sd("DB_Add : Can't open '$datafile'");close(F) or &sd("DB_Add : Can't close '$datafile'"); rename("$datafile.tmp$$",$datafile) or &sd("DB_Add : Can't rename '$datafile'"); &sk();return $nnum}sub sg{if(ref($_[0])ne"HASH"){die"DB_Load : The first argument must be a HASH reference!\n"} if(ref($_[1])ne"HASH"){die"DB_Load : The second argument must be a HASH reference!\n"} if(!$_[2]){die"DB_Load : No record number was specified!\n"}my($datafile)="$_[0]->{'datafile'}"; my(@fields)=split(/ /,$_[0]->{'fields'});my($out)=$_[1];my($rnum)=int$_[2]; my(@aa);my(@ab);unless(-e $datafile){return(0)}if($_[0]->{'backup'}){&sb($_[0])} if(-e "$datafile"){&sh();open(F,"<$datafile") or &sd("DB_Load : Can't open '$datafile'"); @aa=;close(F);&sk()}foreach(@aa){/^$rnum\¡/||next;s/[^¡]+$//; undef %$out;@ab=split(/\¡/);for$i(0..$#fields){$out->{$fields[$i]}=$ab[$i]; $out->{$fields[$i]}=~s/¿([A-F0-9]{2})/pack("C",hex($1))/egix}return 1} return 0}sub sc{if(ref($_[0])ne"HASH"){die"DB_Del : The first argument must be a HASH reference!\n"} if(!$_[1]){die"DB_Del : The second argument must be a record number!\n"} my($datafile)="$_[0]->{'datafile'}";my(@fields)=split(/ /,$_[0]->{'fields'}); my($rnum)=int$_[1];my(%hu);my($erased)=0;for(1..$#_){$hu{$_[$_]}++} my(@aa);unless(-e $datafile){return(0)}if($_[0]->{'backup'}){&sb($_[0])} &sh();if(-e "$datafile"){open(F,"<$datafile") or &sd("DB_Del : Can't open '$datafile'"); @aa=;close(F)}open(F,">$datafile.tmp$$") or &sd("DB_Del : Can't open '$datafile'for write"); print F qq|#!$^X\n| or &sd("DB_Del : Can't write to '$datafile'"); print F qq|print"Content-type: text/html\\n\\n";\n__END__\n| or &sd("DB_Del : Can't write to '$datafile'"); foreach(@aa){/^(\d+)\¡/||next;if($hu{$1}){$erased++; next}s/[^¡]+$//; print F"$_\n" or &sd("DB_Del : Can't write to '$datafile'")}close(F) or &sd("DB_Del : Can't close '$datafile'"); rename("$datafile.tmp$$",$datafile) or &sd("DB_Del : Can't rename '$datafile'"); &sk();return $erased}sub se{my($datafile)="$_[0]->{'datafile'}"; my(@fields)=split(/ /,$_[0]->{'fields'});my($out)=$_[1];my($sortcode)=$_[2]; my($rowcode)=$_[3];my($rcount)=0;my(@aa);my(@ab);unless(defined &$rowcode){ die("DB_List : no rowcode defined!")}unless(-e $datafile){die("DB_List : $datafile does not exist!")} if($_[0]->{'backup'}){&sb($_[0])}&sh();open(F,"<$datafile") or &sd("DB_List : Can't open '$datafile'"); @aa=;close(F);&sk();if($sortcode&&&$sortcode ne""){@aa=sort{&$sortcode} @aa} foreach(@aa){/^\d/||next;$rcount++;s/[^\¡]+$//;undef %$out;@ab=split(/\¡/); for$i(0..$#fields){$out->{$fields[$i]}=$ab[$i];$out->{$fields[$i]}=~s/¿([A-F0-9]{2})/pack("C",hex($1))/egix} if($rowcode){&$rowcode}}return ($rcount)}sub sf{if(ref($_[0])ne"HASH"){ die"DB_ListPage : The first argument must be a HASH reference!\n"} if(ref($_[1])ne"CODE"&&$_[1]){die"DB_ListPage : The second argument must be a CODE reference!\n"} if(ref($_[2])ne"CODE"&&$_[2]){die"DB_ListPage : The third argument must be a CODE reference!\n"} if(ref($_[3])ne"CODE"&&$_[3]){die"DB_ListPage : The fourth argument must be a CODE reference!\n"} if(ref($_[4])ne"HASH"&&$_[4]){die"DB_ListPage : The fifth argument must be a HASH reference!\n"} my($datafile)="$_[0]->{'datafile'}";my(@fields)=split(/ /,$_[0]->{'fields'}); my($querycode)=$_[1];my($matchcode)=$_[2];my($sortcode)=$_[3];my($out)=$_[4]; my($perpage)=int$_[6];my($pcount)=0;my($mcount)=0;my($rcount)=0; my($cpage)=int$_[5]||1;my($lpage)=0;my($npage)=0;my(@aa);my(@ab); unless(-e $datafile){return(0,0,0,0,0,0)}if($_[0]->{'backup'}){&sb($_[0])} &sh();open(F,"<$datafile") or &sd("DB_ListPage : Can't open '$datafile'"); @aa=;close(F);&sk();if($sortcode&&&$sortcode ne""){@aa=sort{&$sortcode} @aa} foreach(@aa){/^\d/||next;$rcount++;s/[^\¡]+$//;undef %$out;@ab=split(/\¡/); for$i(0..$#fields){$out->{$fields[$i]}=$ab[$i];$out->{$fields[$i]}=~s/¿([A-F0-9]{2})/pack("C",hex($1))/egix} if(&$querycode()){$mcount++;my($thispage)=($mcount%$perpage) ?int($mcount/$perpage)+1 : $mcount/$perpage; if($thispage==$cpage){&$matchcode()}}}$pcount=int($mcount / $perpage); if($mcount % $perpage){$pcount++}if(($cpage-1)<1||($cpage-1)>$pcount){ $lpage=$pcount}else{$lpage=$cpage-1}if(($cpage+1)>$pcount){$npage=1} else{$npage=$cpage+1}if(!$pcount){$cpage=$lpage=$npage=0}return ($pcount,$mcount,$rcount,$cpage,$lpage,$npage)} sub sj{if(ref($_[0])ne"HASH"){die"DB_Save : The first argument must be a HASH reference!\n"} if(ref($_[1])ne"HASH"){die"DB_Save : The second argument must be a HASH reference!\n"} if(!$_[2]){die"DB_Save : No record number was specified!\n"}my($datafile)="$_[0]->{'datafile'}"; my(@fields)=split(/ /,$_[0]->{'fields'});my($in)=$_[1];my($rnum)=int$_[2]; my($saved)=0;my(@aa);my(@ab);if(!-e $datafile){return &sa(@_)}if($_[0]->{'backup'}){&sb($_[0])} &sh();open(F,"<$datafile") or &sd("DB_Save : Can't open '$datafile'"); @aa=;close(F);open(F,">$datafile.tmp$$") or &sd("DB_Save : Can't open '$datafile'for write"); print F qq|#!$^X\n| or &sd("DB_Save : Can't write to '$datafile'"); print F qq|print"Content-type: text/html\\n\\n";\n__END__\n| or &sd("DB_Save : Can't write to '$datafile'"); foreach(@aa){/^\d/||next;if(/^$rnum\¡/){my($line)="$rnum¡";for$i(1..$#fields){ my($enc)=$in->{$fields[$i]};$enc=~s/([\x1a\r\n\¡\¿])/sprintf("¿%02x",ord($1))/egx; $line.="$enc¡"}print F"$line\n" or &sd("DB_Save : Can't write to '$datafile'"); $saved++;next}s/[^¡]+$//;print F"$_\n" or &sd("DB_Save : Can't write to '$datafile'")} close(F) or &sd("DB_Save : Can't close '$datafile'");rename("$datafile.tmp$$",$datafile) or &sd("DB_Save : Can't rename '$datafile'"); &sk();unless($saved){return &sa(@_)}}sub sd{my($msg)=(@_);my($file_error)=$!; if($file_error eq''){$file_error="Unknown error.Maybe disk quota exceeded?"} &sq("$msg : $file_error\n")}sub sn{my$subProp=$hc{'_subs'}{'FH_Create'}||={}; my$num=int++$subProp->{'num'};my$name="FH$num";return(eval "local *$name")} sub va{return if($hi{'disable_filelocking'});my$subProp=$hc{'_subs'}{'lock'}||={}; $subProp->{'stack'}||=[];my($lock_type,$timeout)=@_;$lock_type||='exclusive'; $timeout||=0;if($lock_type ne'exclusive' and $lock_type ne'shared'){&tw("lock: invalid lock type: '$lock_type'")} my$previous_lock;if(@{$subProp->{'stack'}}>0){$previous_lock=$subProp->{'stack'}[-1]} if($previous_lock eq'exclusive'){$lock_type=$previous_lock}if($previous_lock eq$lock_type){ push(@{$subProp->{'stack'}},$lock_type);return 1}my$return_value; if($previous_lock eq'shared' and $lock_type eq'exclusive'){&tw("lock: cannot upgrade a 'shared' lock to an 'exclusive' lock")}$return_value=&ue('',$lock_type,$timeout); if($return_value){push(@{$subProp->{'stack'}},$lock_type)}return $return_value} sub vu{return if($hi{'disable_filelocking'});my$subProp=$hc{'_subs'}{'lock'}||={}; $subProp->{'stack'}||=[];my($timeout)=@_;$timeout||=0;unless(@{ $subProp->{'stack'}}>0){&tw('unlock: nested filelock underrun')} my$previous_lock=pop(@{$subProp->{'stack'}});return if(@{$subProp->{'stack'}}>0 and $subProp->{'stack'}[-1]eq$previous_lock); if(@{$subProp->{'stack'}}==0){&uh('')}}sub ue{my$subProp=$hc{'_subs'}{'lock'}||={}; my($lock_name,$lock_type,$timeout)=@_;my$lock_filename;if($lock_name){ $lock_filename="$hc{'datadir'}/$lock_name.lock"}else{$lock_filename=$hc{'filelock'}} if(not exists $subProp->{'lockinfo'}{$lock_name}){$subProp->{'lockinfo'}{ $lock_name}{'filename'}=$lock_filename;$subProp->{'lockinfo'}{$lock_name}{'handle'}=&sn(); sysopen($subProp->{'lockinfo'}{$lock_name}{'handle'},$subProp->{'lockinfo'}{ $lock_name}{'filename'},O_RDWR|O_CREAT)||&tw('filelock',"error opening $lock_type file lock $subProp->{'lockinfo'}{ $lock_name}{'filename'}: $!\n")}else{&tw("_lock_flock: already a lock for semaphore '$lock_name'")} my$operation;if($lock_type eq'shared'){$operation=LOCK_SH}if($lock_type eq'exclusive'){ $operation=LOCK_EX}if($timeout>0){$operation|=LOCK_NB}my$Giveup_time=time()+$timeout; until (flock($subProp->{'lockinfo'}{$lock_name}{'handle'},$operation)){ if(time()<$Giveup_time){sleep(1)}else{close($subProp->{'lockinfo'}{ $lock_name}{'handle'});&tw('serverbusy')}}return 1}sub uh{my$subProp=$hc{'_subs'}{'lock'}||={}; my($lock_name)=@_;unless(flock($subProp->{'lockinfo'}{$lock_name}{'handle'},LOCK_UN)){&tw('filelock',"error releasing a flock() on file lock $subProp->{'lockinfo'}{ $lock_name}{'filename'}: $!\n")}unless(close($subProp->{'lockinfo'}{ $lock_name}{'handle'})){&tw('filelock',"error closing file lock $subProp->{'lockinfo'}{ $lock_name}{'filename'}: $!\n")}delete $subProp->{'lockinfo'}{$lock_name}; return 1}sub tw{&sp(@_)}sub sx{my($in)=$_[0];my(@ar)=((A..Z,a..z,0..9),'+','/'); my($out)=unpack("B*",$in);$out=~s/(\d{6}|\d+$)/$ar[ord(pack"B*","00$1")]/ge; while(length($out)%4){$out.="="}return $out}sub sw{my($in)=$_[0]; my(%ih);my($out);for((A..Z,a..z,0..9),'+','/'){$ih{$_}=$i++}$in=$_[0]||return "MIME64 : Nothing to decode"; $in=~s/[^A-Za-z0-9+\/]//g;$in=~s/([A-Za-z0-9+\/])/unpack"B*",chr($ih{ $1})/ge;$in=~s/\d\d(\d{6})/$1/g;$in=~s/(\d{8})/$out.=pack("B*",$1)/ge; return $out}sub tk{my($text)=$_[0];$text=~s/([^A-Za-z0-9\*\.\@\_\-])/uc sprintf('%%%02x',ord($1))/egx; $text=~tr/ /+/;return $text}sub tj{my($text)=$_[0];$text=~tr/+/ /; $text=~s/%([A-F0-9]{2})/pack('C',hex($1))/egi;return $text}sub sm{ my$str=$_[0];my$time=$_[1];my$GMT=$_[2];if(!$time||$time ne int($time)){ return undef}my($sec,$min,$hour,$day,$mon,$year,$wday);if($GMT){($sec,$min,$hour,$day,$mon,$year,$wday)=gmtime($time)} else{($sec,$min,$hour,$day,$mon,$year,$wday)=localtime($time)}my(%ie,%ij,%ii,%ig); my(@aj)=qw(Sun Mon Tue Wed Thu Fri Sat);my(@ak)=qw(Sunday Monday Tuesday Wednesday Thursday Friday Saturday); my(@ac)=qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);my(@ae)=qw(January February March April May June July August September October November December); foreach(@aj){$ie{lc$_}++}foreach(@ak){$ij{lc$_}++}foreach(@ac){ $ii{lc$_}++}foreach(@ae){$ig{lc$_}++}$str=~s/(\b[A-Za-z]{3,9}\b)/if($ie{ lc$1}){if(uc($1)eq$1){uc $aj[$wday]}elsif(lc($1)eq$1){lc$aj[$wday]} else{ucfirst lc$aj[$wday]}}elsif($ij{lc$1}){if(uc($1)eq$1){uc $ak[$wday]} elsif(lc($1)eq$1){lc$ak[$wday]}else{ucfirst lc$ak[$wday]}}elsif($ii{ lc$1}){if(uc($1)eq$1){uc $ac[$mon]}elsif(lc($1)eq$1){lc$ac[$mon]} else{ucfirst lc$ac[$mon]}}elsif($ig{lc$1}){if(uc($1)eq$1){uc $ae[$mon]} elsif(lc($1)eq$1){lc$ae[$mon]}else{ucfirst lc$ae[$mon]}}else{$1}/ge; $str=~s/(\d{1,4}\b)/if(length $1==4){$year+1900}elsif(length $1<=2){ if(substr($1,0,1)eq 0){sprintf("%02d",$day)}else{$day}}else{$1}/ge; $str=~s/(\d{1,2})(st|nd|rd|th)/if($day==1||$day==21||$day==31){ $day."st"}elsif($day==2||$day==22){$day."nd"}elsif($day==3||$day==23){ $day."rd"}else{$day."th"}/gei;$str=~s/SS/sprintf("%02d",$sec)/gei; $str=~s/MM/sprintf("%02d",$min)/gei;$str=~s/HH/sprintf("%02d",$hour)/gei; return $str}sub f{my($script,@au)=@_;my$data;my$fh=do{local *F; *F}; if(open($fh,"<$cgidir/$script")){<$fh>;binmode($fh);$data.=join '',<$fh>; close($fh)}foreach(@au){if(open($fh,"<$cgidir/$_")){binmode($fh); $data.=join '',<$fh>;close($fh)}}$data=~tr/\r\n//d;return (unpack('%32C*',$data))} sub uf{use Socket;my($reginfo);my$host=$ENV{'HTTP_HOST'}||$ENV{'SERVER_NAME'}||$ENV{'SERVER_ADDR'}; my$path=$ENV{'SCRIPT_NAME'}||$ENV{'PATH_INFO'};$reginfo.='&'.'reg1='.&tk($hd{'license_name'}); $reginfo.='&'.'reg2='.&tk($hd{'license_domain'});$reginfo.='&'.'lnum='.&tk(&uz($hd{'license_id'})); $reginfo.='&'.'prog='.$hc{'prod_id'};$reginfo.='&'.'ver='.&tk($hc{'_prog_ver'}); $reginfo.='&'.'url='.&tk("$host$path");$reginfo.='&'.'csum='.&tk(&f($file)); my$paddr=gethostbyname('registersoftware.to')||return;my$sock=&vs(); socket ($sock,&PF_INET,&SOCK_STREAM,0)||die('No Socket: '.$!);connect ($sock,pack "SnA4x8",&PF_INET,80,$paddr)||return; select ($sock); $|=1; select(STDOUT);print$sock "GET /register/register.cgi?$reginfo HTTP/1.0\n"; print$sock 'Referer: '.$ENV{'HTTP_REFERER'}."\n";print$sock 'User-Agent: software'."\n\n"; my$reply=join("",<$sock>);close($sock);if($reply=~/license\.invalid/){ $hd{'d'}=1}if($reply=~/license\.valid/){$hd{'d'}=0}&sj(\%ho,\%hd,1); if($hd{'d'}){&tg('expired')}}sub ur{my$fh=&vs();my$filepath=shift; my$data;open($fh,"<$filepath")||return;binmode($fh);read($fh,$data,-s $fh); close($fh);return $data}sub vs{local *F;return *F}sub so{my$html=shift; $html=~s/&/&/g;$html=~s/"/"/g;$html=~s//>/g; return $html}sub us{my($filename,$image_type)=@_;$image_type||=$filename; if($image_type=~/\.gif(\.|$)/i){return &ut($filename)}elsif($image_type=~/\.jpe?g(\.|$)/i){ return &uv($filename)}elsif($image_type=~/\.png(\.|$)/i){return &uw($filename)} else{return()}}sub uw{my($filename)=@_;my($buf);open(PNG,$filename)||return(undef,undef,"PNG - Couldn't Open $filename"); binmode(PNG);seek(PNG,12,0);read(PNG,$buf,4);if($buf ne"IHDR"){ close PNG; return(undef,undef,"PNG - Missing Image Header - $buf")} read(PNG,$buf,8);close PNG;return unpack("NN",$buf)}sub uv{my($filename)=@_; my($buf,$segheader,$marker,$code,$len);open(JPEG,$filename)||return(undef,undef,"JPEG - Couldn't Open $filename"); binmode(JPEG);read(JPEG,$buf,2);while(1){read(JPEG,$segheader,4); ($marker,$code,$len)=unpack("a a n",$segheader);if($marker ne"\xFF"){ close JPEG; return(undef,undef,"JPEG - Marker not Found")}if((ord($code)>=0xC0)&&(ord($code)<=0xC3)){ read(JPEG,$buf,5);close(JPEG);my($y,$x)=unpack("xnn",$buf);return ($x,$y)} else{read(JPEG,$buf,$len - 2)}}}sub uu{my($fh,$skip)=@_;my($lbuf); read($fh,$lbuf,$skip);while(1){if(eof($fh)){close GIF; return(undef)} read($fh,$lbuf,1);last if ord($lbuf)==0;read($fh,$lbuf,ord($lbuf))}1} sub ut{my($filename)=@_;my($buf,$type,$cmapsize,$mapdata,$x,$w,$y,$h); open(GIF,$filename)||return(undef,undef,"GIF - Couldn't Open $filename"); binmode(GIF);read(GIF,$type,6);read(GIF,$buf,7);if(length($buf)!=7){ close GIF; return(undef,undef,"GIF - Corrupted Header")}($x)=unpack("x4 C",$buf); if($x & 0x80){$cmapsize=3 * (2**(($x & 0x07)+1));read(GIF,$mapdata,$cmapsize); if(!$mapdata){close GIF; return(undef,undef,"GIF - Corrupted Colour Map")}} while(1){if(eof(GIF)){close GIF; return(undef,undef,"GIF - EOF at BlockStart")} read(GIF,$buf,1);($x)=unpack("C",$buf);if($x==0x2c){read(GIF,$buf,8); if(length($buf)!=8){close GIF; return(undef,undef,"GIF - Missing Image Header")}($x,$w,$y,$h)=unpack("x4 C4",$buf); close(GIF);return($x+$w * 256,$y+$h * 256)}if($x==0x21){read(GIF,$buf,1); ($x)=unpack("C",$buf);if($x==0xF9){read(GIF,$buf,6)}elsif($x==0xFE){&uu(\*GIF,0)||return(undef,undef,"GIF - Bad Block - skip=0")} elsif($x==0x01){&uu(\*GIF,13)||return(undef,undef,"GIF - Bad Block - skip=13")} elsif($x==0xFF){&uu(\*GIF,12)||return(undef,undef,"GIF - Bad Block - skip=12")} else{close GIF; return(undef,undef,"GIF - Unknown Block Extension")}} else{close GIF;return(undef,undef,"GIF - Unknown Block Type")}}} sub vq{if(!$id{'contentheader'}++){print'Content-type: text/html'."\n\n"} print&ud();exit}sub ud{if(&uk($hi{'vendor_name'})){return &ul()} else{return &th('_license.html')}}sub uk{my$vendor=shift||die("No 'vendor' name specified (make sure it's defined in INI file)"); my$vendor_hash=$vendor;$vendor_hash=~s/^\s+|\s+$//sg;$vendor_hash=~s/(.{1,8})/crypt($1,'AA')/sge; $vendor_hash=~s/AA//gs;if($vendor_hash eq'WhkMKzyGr7g0JXhsaugam24y7UOthz/E62TMdkIYlsVw'){ return 1}return 0}sub ug{my$s=pack 'H*','3c7461626c6520626f726465723d312063656c6c73706163696e673d3'. '02063656c6c70616464696e673d382077696474683d313030253e3c74'.'723e3c7464206267636f6c6f723d2223454545454545223e3c666f6e7'. '420666163653d226d732073616e732073657269662c20617269616c22'.'2073697a653d323e0a3c703e3c623e506c65617365204e6f74653a3c2'. 'f623e20245f76656e646f725f6e616d65242068617320676976656e20'.'796f752074686520726967687420746f203c623e7375626c6963656e7'. '3653c2f623e200a7468697320736f66747761726520756e6465722074'.'6865207465726d73206f6620746865203c6120687265663d222463676'. '975726c243f73686f775f6c6963656e73653d3122207461726765743d'.'225f6e6577223e6c6963656e73652061677265656d656e743c2f613e2'. 'e3c2f703e0a0a3c703e466f7220696e737472756374696f6e73206f6e'.'20686f7720746f207375626c6963656e736520616e642f6f722070726'. '976617465206c6162656c207468697320736f6674776172652c20636f'.'6e73756c7420796f757220646f63756d656e746174696f6e206f72206'. '36f6e74616374203c6120687265663d22245f76656e646f725f75726c'.'2422207461726765743d225f6e6577223e245f76656e646f725f6e616'. 'd65243c2f613e20666f7220696e666f726d6174696f6e2e3c2f703e0a'.'3c2f666f6e743e3c2f74643e3c2f74723e3c2f7461626c653e'; $s=~s|\$cgiurl\$|$id{'cgiurl'}|iges;return &tx($s)}sub ul{my$s=pack 'H*','3c68746d6c3e0a3c686561643e0a3c7469746c653e245f76656e646f7'. '25f6e616d6524202d20536f667477617265204c6963656e7365204167'.'7265656d656e743c2f7469746c653e0a3c7374796c6520747970653d2'. '2746578742f637373223e3c212d2d0a2e686561646572202020207b20'.'666f6e742d66616d696c793a20417269616c2c2048656c76657469636'. '12c2073616e732d73657269663b20666f6e742d73697a653a20313670'.'783b20666f6e742d7765696768743a20626f6c643b207d0a2e6d61696'. 'e7465787420207b20666f6e742d66616d696c793a2056657264616e61'.'2c20417269616c2c2048656c7665746963612c2073616e732d7365726'. '9663b20666f6e742d73697a653a20313170787d0a2d2d3e3c2f737479'.'6c653e0a3c2f686561643e0a3c626f6479206267636f6c6f723d22234'. '646464646462220746578743d222330303030303022206c696e6b3d22'.'233030303043432220766c696e6b3d22233030303043432220616c696'. 'e6b3d222330303030434322206d617267696e77696474683d3135206d'.'617267696e6865696768743d313520746f706d617267696e3d3135206'. 'c6566746d617267696e3d3135206f6e6c6f61643d2277696e646f772e'.'666f6375732829223e0a0a3c666f6e7420636c6173733d226d61696e7'. '4657874223e0a0a3c703e3c666f6e7420666163653d22617269616c22'.'2073697a653d3420636c6173733d22686561646572223e3c623e3c666'. 'f6e7420636f6c6f723d2223434330303030223e536f66747761726520'.'4c6963656e73652041677265656d656e743c2f666f6e743e3c2f623e3'. 'c2f666f6e743e3c62723e0a0a3c703e3c623e494d504f5254414e5420'.'2d2052454144204341524546554c4c593a3c2f623e2054686973204c6'. '963656e73652041677265656d656e742069732061206c6567616c200a'.'61677265656d656e74206265747765656e20596f7520616e642056656'. 'e646f722e2052656164206974206361726566756c6c79206265666f72'.'6520636f6d706c6574696e6720746865200a696e7374616c6c6174696'. 'f6e2070726f6365737320616e64207573696e672074686520536f6674'.'776172652e2049742070726f76696465732061206c6963656e7365207'. '46f2075736520746865200a536f66747761726520616e6420636f6e74'.'61696e732077617272616e747920696e666f726d6174696f6e20616e6'. '4206c696162696c69747920646973636c61696d6572732e203c623e42'.'59200a494e5354414c4c494e472c20434f5059494e47204f52204f544'. '8455257495345205553494e472054484520534f4654574152452c2059'.'4f552041524520434f4e4649524d494e4720594f5552200a414343455'. '054414e4345204f462054484520534f46545741524520414e44204147'.'524545494e4720544f204245434f4d4520424f554e442042592054484'. '5205445524d53204f462054484953200a41475245454d454e542e2049'.'4620594f5520444f204e4f542041475245452c20444f204e4f5420494'. 'e5354414c4c204f5220555345205448452050524f445543542e3c2f62'.'3e0a0a3c703e54686520536f667477617265206973206f776e6564206'. '2792056656e646f7220616e642f6f7220697473206c6963656e736f72'.'7320616e642069732070726f746563746564206279200a636f7079726'. '9676874206c61777320616e6420696e7465726e6174696f6e616c2063'.'6f707972696768742074726561746965732c2061732077656c6c20617'. '3206f74686572200a696e74656c6c65637475616c2070726f70657274'.'79206c61777320616e642074726561746965732e203c623e544845205'. '34f465457415245204953204c4943454e5345442c204e4f54200a534f'.'4c442e3c2f623e0a0a3c703e3c68722073697a653d313e0a0a3c703e3'. '12e203c623e444546494e4954494f4e532e3c2f623e0a0a3c6f6c2074'.'7970653d2261223e0a3c6c693e202256656e646f7222206d65616e732'. '03c6120687265663d22245f76656e646f725f75726c24222074617267'.'65743d225f6e6577223e245f76656e646f725f6e616d65243c2f613e0'. 'a3c6c693e2022596f75222c2022596f757222206d65616e7320796f75'.'20616e6420796f757220636f6d70616e792e0a3c6c693e2022536f667'. '47761726522206d65616e73207468652070726f647563742070726f76'.'6964656420746f20596f752c20776869636820696e636c75646573206'. '36f6d707574657220736f6674776172650a616e64206d617920696e63'.'6c756465206173736f636961746564206d656469612c207072696e746'. '564206d6174657269616c732c20616e6420226f6e6c696e6522206f72'.'20656c656374726f6e69630a646f63756d656e746174696f6e2e0a3c2'. 'f6f6c3e0a0a3c703e322e203c623e4f574e4552534849502e3c2f623e'.'0a0a54686520536f667477617265206973206f776e656420616e64206'. '36f7079726967687465642062792056656e646f7220616e642f6f7220'.'697473206c6963656e736f72732e20596f7572200a6c6963656e73652'. '0636f6e66657273206e6f207469746c65206f72206f776e6572736869'.'7020696e2074686520536f66747761726520616e64206973206e6f742'. '0612073616c65206f66200a616e792072696768747320696e20746865'.'20536f6674776172652e200a0a3c703e332e203c623e4752414e54204'. 'f46204c4943454e53452e3c2f623e200a0a56656e646f72206772616e'.'747320596f752074686520666f6c6c6f77696e6720726967687473207'. '0726f766964656420596f7520636f6d706c79207769746820616c6c20'.'7465726d73200a616e6420636f6e646974696f6e73206f66207468697'. '32061677265656d656e742e2020466f722065616368206c6963656e73'.'6520596f75206861766520616371756972656420666f7220746865200'. 'a536f6674776172653a0a3c6f6c20747970653d2261223e0a3c6c693e'.'596f7520617265206772616e7465642061206e6f6e2d6578636c75736'. '9766520726967687420746f2075736520616e6420696e7374616c6c20'.'4f4e4520636f7079206f662074686520736f667477617265206f6e204'. 'f4e4520776562736974652e0a3c6c693e596f75206d617920616c6c6f'.'7720616e20756e6c696d69746564206e756d626572206f66207573657'. '27320746f20616363657373206f72206f746865727769736520757469'.'6c697a65207468650a7365727669636573206f722066756e6374696f6'. 'e616c697479206f662074686520696e7374616c6c656420736f667477'.'6172652e0a3c6c693e596f75206d6179206d616b65206f6e6520636f7'. '07920666f72206261636b7570206f7220617263686976616c20707572'.'706f7365732e0a3c6c693e596f75206d6179206d6f646966792074686'. '52074656d706c6174652066696c657320636f6e7461696e656420696e'.'207468652074656d706c6174657320666f6c646572202869662061707'. '06c696361626c65292e0a3c2f6f6c3e0a0a3c703e342e203c623e5245'.'5354524943544544205553452e3c2f623e0a0a3c6f6c20747970653d2'. '261223e0a3c6c693e20596f7520616772656520746f20757365207265'.'61736f6e61626c65206566666f72747320746f2070726576656e74207'. '56e617574686f72697a656420636f7079696e67206f66207468652053'.'6f6674776172652e0a3c6c693e20596f75206d6179206e6f742064697'. '361626c6520616e79206c6963656e73696e67206f7220636f6e74726f'.'6c206665617475726573206f662074686520536f667477617265206f7'. '220616c6c6f772074686520536f6674776172650a746f206265207573'.'6564207769746820737563682066656174757265732064697361626c6'. '5642e0a3c6c693e596f75206d6179206e6f742073686172652c207265'.'6e742c206f72206c6561736520596f757220726967687420746f20757'. '3652074686520536f6674776172652e0a3c6c693e20596f75206d6179'.'206e6f74206d6f646966792c207375626c6963656e73652c20636f707'. '92c2072656e742c2073656c6c2c2064697374726962757465206f7220'.'7472616e7366657220616e792070617274200a6f662074686520536f6'. '67477617265206578636570742061732070726f766964656420696e20'.'746869732041677265656d656e742e0a3c6c693e596f75206d6179206'. 'e6f74207265766572736520656e67696e6565722c206465636f6d7069'.'6c652c207472616e736c6174652c20637265617465206465726976617'. '469766520776f726b732c200a64656369706865722c20646563727970'.'742c20646973617373656d626c652c206f72206f74686572776973652'. '0636f6e766572742074686520536f66747761726520746f2061206d6f'.'7265200a68756d616e2d7265616461626c6520666f726d20666f72206'. '16e7920726561736f6e2e0a3c6c693e20596f752077696c6c20726574'.'75726e206f722064657374726f7920616c6c20636f70696573206f662'. '074686520536f66747761726520616e642067656e6572617465642063'.'6f6e74656e740a286966206170706c696361626c652920696620616e6'. '4207768656e20596f757220726967687420746f207573652069742065'.'6e64732e200a3c6c693e3c623e596f75206d6179206e6f74207573652'. '074686520536f66747761726520666f7220616e7920707572706f7365'.'207468617420697320756e6c617766756c2e3c2f623e0a3c2f6f6c3e0'. 'a0a3c703e352e203c623e4144444954494f4e414c20534f4654574152'.'453c2f623e2054686973206c6963656e7365206170706c69657320746'. 'f20757064617465732c2075706772616465732c200a706c75672d696e'.'7320616e6420616e79206f74686572206164646974696f6e7320746f2'. '0746865206f726967696e616c20536f6674776172652070726f766964'.'65642062792056656e646f722c200a756e6c6573732056656e646f722'. '070726f7669646573206f74686572207465726d7320616c6f6e672077'.'69746820746865206164646974696f6e616c20736f6674776172652e0'. 'a0a3c703e362e203c623e335244205041525459205345525649434553'.'3c2f623e205468697320536f667477617265206d6179206d616b65207'. '57365206f662c206f72206861766520746865200a6162696c69747920'.'746f206d616b6520757365206f662c206c696e6b20746f2c206f72206'. '96e7465677261746520776974682033726420706172747920636f6e74'.'656e74206f72200a73657276696365732e2054686520617661696c616'. '2696c697479206f662074686520636f6e74656e74206f722073657276'.'696365732069732061742074686520736f6c652064697363726574696'. 'f6e200a6f662074686520337264207061727479207365727669636520'.'70726f76696465727320616e64206d6179206265207375626a6563742'. '0746f2075736167652061677265656d656e747320616e64200a6f7468'.'6572207265737472696374696f6e732e2020596f75206167726565207'. '46f20696e64656d6e69667920616e642073617665206861726d6c6573'.'732056656e646f7220616e6420697473200a6c6963656e736f7273206'. '6726f6d20616c6c20636c61696d732c2064616d616765732c20616e64'.'20657870656e736573206f66207768617465766572206e61747572652'. '074686174206d6179206265200a6d61646520616761696e7374205665'.'6e646f7220616e6420697473206c6963656e736f72732062792033726'. '420706172747920636f6e74656e7420616e6420736572766963652070'.'726f766964657273200a6173206120726573756c74206f6620596f757'. '220757365206f662074686520536f6674776172652e0a0a3c703e372e'.'203c623e524547495354524154494f4e2e3c2f623e2054686520736f6'. '674776172652077696c6c20656c656374726f6e6963616c6c79207265'.'67697374657220697473656c66200a647572696e6720696e7374616c6'. 'c6174696f6e206f722072656c6f636174696f6e20616e6420636f6e66'.'69726d207468617420596f75206861766520656e74657265642061207'. '6616c6964200a2250726f64756374204944222e205468652072656769'.'7374726174696f6e2070726f63657373206f6e6c792073656e6473207'. '46865206c6963656e736520696e666f726d6174696f6e207468617420'.'0a596f7527766520656e74657265642028436f6d70616e79204e616d6'. '52c20446f6d61696e204e616d652c2050726f64756374204944292061'.'6e6420696e666f726d6174696f6e2061626f757420746865200a736f6'. '6747761726520696e7374616c6c6564202850726f6772616d2049442c'.'2056657273696f6e2c20496e7374616c6c2055524c2c20436865636b7'. '3756d292e20204e6f206f74686572200a696e666f726d6174696f6e20'.'69732073656e742e0a0a3c703e382e203c623e55504752414445532e2'. '03c2f623e204966207468697320636f7079206f662074686520736f66'.'747761726520697320616e20757067726164652066726f6d20616e200'. 'a6561726c6965722076657273696f6e206f662074686520736f667477'.'6172652c2069742069732070726f766964656420746f20596f75206f6'. 'e2061206c6963656e73652065786368616e6765200a62617369732e20'.'20596f757220757365206f662074686520536f6674776172652075706'. '772616465206973207375626a65637420746f20746865207465726d73'.'206f662074686973200a6c6963656e73652c20616e6420596f7520616'. '772656520627920596f757220696e7374616c6c6174696f6e20616e64'.'20757365206f66207468697320636f7079206f662074686520536f667'. '477617265200a746f20766f6c756e746172696c79207465726d696e61'.'746520596f7572206561726c696572206c6963656e736520616e64207'. '468617420596f752077696c6c206e6f7420636f6e74696e756520746f'.'200a75736520746865206561726c6965722076657273696f6e206f662'. '074686520536f667477617265206f72207472616e7366657220697420'.'746f20616e6f7468657220706572736f6e206f72200a656e746974792'. 'e0a0a3c703e392e203c623e5452414e534645522e203c2f623e202059'.'6f75206d6179206d616b652061206f6e652d74696d65207472616e736'. '66572206f662074686520536f667477617265200a616e6420596f7572'.'2072696768747320756e6465722074686973206c6963656e736520746'. 'f20616e6f746865722070617274792070726f76696465642074686174'.'3a0a0a3c6f6c20747970653d2261223e0a3c6c693e20596f752070726'. 'f766964652074686520706172747920776974682074686520536f6674'.'776172652c20616e79202250726f647563742049442220636f6465732'. 'c20616e642074686973206c6963656e73652e0a3c6c693e2054686520'.'7061727479206163636570747320746865207465726d73206f6620746'. '86973206c6963656e7365206173206120636f6e646974696f6e206f66'.'20746865207472616e736665722e0a3c6c693e20596f7520646573747'. '26f7920616e79206f7468657220636f70696573206f66207468652053'.'6f66747761726520616e642067656e65726174656420636f6e74656e7'. '420286966206170706c696361626c652920696e20596f757220706f73'.'73657373696f6e2e0a3c6c693e20596f75206e6f746966792056656e6'. '46f72206f6620746865207472616e736665722e0a3c2f6f6c3e0a0a59'.'6f75722072696768747320756e6465722074686973206c6963656e736'. '5206175746f6d61746963616c6c79207465726d696e6174652075706f'.'6e207472616e736665722e0a0a3c703e31302e203c623e5355424c494'. '3454e53494e472e3c2f623e20596f75206d6179207375626c6963656e'.'73652074686520536f66747761726520616e6420596f7572207269676'. '8747320756e6465720a74686973206c6963656e736520746f20616e6f'.'746865722070617274792070726f766964656420746861743a0a0a3c6'. 'f6c20747970653d2261223e0a3c6c693e20596f7520756e6465727374'.'616e6420616e6420616772656520746f20746865207465726d73206f6'. '62074686973206c6963656e73652061677265656d656e742e0a3c6c69'.'3e2054686520536f667477617265206973206f6e6c79207375626c696'. '3656e736564204f4e43452c20746f20612073696e676c652070617274'.'792e0a3c6c693e20596f7520617265206e6f74207573696e672074686'. '520536f667477617265206166746572206772616e74696e6720746865'.'207375626c6963656e73652e0a3c6c693e20546865207375626c69636'. '56e736520697320612076616c69642c2062696e64696e67206c696365'.'6e73652e0a3c6c693e20546865207375626c6963656e736520636f6e7'. '461696e73207465726d73207468617420617265206e6f206c65737320'.'7265737472696374697665207468616e20746869732061677265656d6'. '56e740a20202020286f72207468652073616d65207465726d73206173'.'20746869732061677265656d656e742920616e6420646f6573206e6f7'. '420636f6e7461696e207468697320726967687420746f207375626c69'.'63656e73652e0a3c6c693e20546865206c6567616c206a75726973646'. '96374696f6e20666f7220746865207375626c6963656e736520697320'.'646566696e6564206173206569746865722074686174206f662074686'. '52056656e646f72206f720a202020202074686174206f6620596f7572'.'20636f72706f726174652068656164206f66666963652e0a3c6c693e2'. '0596f7520646f206e6f74206d616b6520616e7920726570726573656e'.'746174696f6e73206f722077617272616e74696573206f6e206265686'. '16c66206f662056656e646f722e0a0a3c6c693e20596f752061677265'.'6520746f20656e666f72636520746865207465726d73206f6620616e7'. '9207375626c6963656e7365207468617420596f752061726520617574'.'686f72697a656420746f206d616b652e200a496620596f75206661696'. 'c20746f20646f20736f2c20596f752061677265652074686174205665'.'6e646f72206d61792074616b65207375636820737465707320696e205'. '96f7572206e616d6520616e64200a617320596f7572206167656e742c'.'20696e636c7564696e67206c6567616c2070726f63656564696e67732'. '06966206e65636573736172792c20746f20656e666f72636520746865'.'200a7375626c6963656e7365206772616e74656420627920596f752e0'. 'a0a3c6c693e20596f75206e6f746966792056656e646f72206f662074'.'6865207375626c6963656e736520616e6420616e79207375627365717'. '5656e74207472616e736665727320627920746865207375626c696365'.'6e7365642070617274792e0a3c2f6f6c3e0a0a3c703e31312e203c623'. 'e5445524d494e4154494f4e2e3c2f623e2056656e646f72206d617920'.'7465726d696e61746520596f7572206c6963656e736520696620596f7'. '520646f206e6f74206162696465200a627920746865206c6963656e73'.'65207465726d732e205465726d696e6174696f6e206f6620746865206'. 'c6963656e7365206d617920696e636c7564652c20627574206e6f7420'.'6265206c696d69746564200a746f2c206d61726b696e6720746865205'. '0726f6475637420494420617320696e76616c696420746f2070726576'.'656e74206675727468657220696e7374616c6c6174696f6e732e20557'. '06f6e200a7465726d696e6174696f6e206f66206c6963656e73652c20'.'596f75207368616c6c20696d6d6564696174656c7920646973636f6e7'. '4696e75652074686520757365206f6620746865200a536f6674776172'.'6520616e64207368616c6c2077697468696e2074656e2028313029206'. '46179732072657475726e20746f2056656e646f7220616c6c20636f70'.'696573206f6620746865200a536f667477617265206f7220636f6e666'. '9726d207468617420596f7520686176652064657374726f7965642061'.'6c6c20636f70696573206f662069742e203c623e596f7572200a6f626'. 'c69676174696f6e7320746f2070617920616363727565642063686172'.'67657320616e6420666565732c20696620616e792c207368616c6c207'. '375727669766520616e79200a7465726d696e6174696f6e206f662074'.'6869732041677265656d656e742e3c2f623e2056656e646f722773207'. '468697264207061727479206c6963656e736f7273206d61792070726f'.'74656374200a74686569722072696768747320696e207468652065766'. '56e74206f6620616e792076696f6c6174696f6e206f66207468652074'.'65726d7320616e6420636f6e646974696f6e73206f662074686973200'. 'a6c6963656e73652e20596f7520616772656520746f20696e64656d6e'.'6966792056656e646f7220616e6420697473206c6963656e736f72732'. '0666f7220726561736f6e61626c65206174746f726e6579200a666565'.'7320696e20656e666f7263696e6720697473207269676874732070757'. '27375616e7420746f2074686973206c6963656e73652e0a0a3c703e31'.'322e203c623e444953434c41494d4552204f462057415252414e54592'. 'e3c2f623e2054686520536f6674776172652069732070726f76696465'.'64206f6e20616e2022415320495322200a62617369732c20776974686'. 'f75742077617272616e7479206f6620616e79206b696e642c20696e63'.'6c7564696e672c20776974686f7574206c696d69746174696f6e2c207'. '46865200a77617272616e74696573206f66206d65726368616e746162'.'696c6974792c206669746e65737320666f72206120706172746963756'. 'c617220707572706f736520616e64206e6f6e2d0a696e6672696e6765'.'6d656e742e2054686520656e74697265207269736b20617320746f207'. '46865207175616c69747920616e6420706572666f726d616e6365206f'.'662074686520536f667477617265200a697320626f726e65206279205'. '96f752e2053686f756c642074686520536f6674776172652070726f76'.'65206465666563746976652c20596f752c206e6f742056656e646f722'. '06f7220697473200a6c6963656e736f72732c20617373756d65207468'.'6520656e7469726520636f7374206f6620616e7920736572766963652'. '0616e64207265706169722e2049662074686520536f66747761726520'.'6973200a696e74656e64656420746f206c696e6b20746f2c206578747'. '261637420636f6e74656e742066726f6d206f72206f74686572776973'.'6520696e7465677261746520776974682061207468697264200a70617'. '2747920736572766963652c2056656e646f72206d616b6573206e6f20'.'726570726573656e746174696f6e206f722077617272616e747920746'. '8617420596f757220706172746963756c6172200a757365206f662074'.'686520536f667477617265206973206f722077696c6c20636f6e74696'. 'e756520746f20626520617574686f72697a6564206279206c61772069'.'6e20596f7572200a6a7572697364696374696f6e206f7220746861742'. '074686520746869726420706172747920736572766963652077696c6c'.'20636f6e74696e756520746f20626520617661696c61626c6520746f2'. '00a596f752e205468697320646973636c61696d6572206f6620776172'.'72616e747920636f6e737469747574657320616e20657373656e74696'. '16c2070617274206f66207468652061677265656d656e742e0a0a3c70'.'3e31332e203c623e4c494d49544154494f4e204f46204c494142494c4'. '954592e20554e444552204e4f2043495243554d5354414e4345532041'.'4e4420554e444552204e4f204c4547414c200a5448454f52592c20544'. 'f52542c20434f4e54524143542c204f52204f54484552574953452c20'.'5348414c4c2056454e444f52204f5220495453204c4943454e534f525'. '3204245204c4941424c45200a544f20594f55204f5220414e59204f54'.'48455220504552534f4e20464f5220414e5920494e4449524543542c2'. '05350454349414c2c2050554e49544956452c20494e434944454e5441'.'4c2c204f52200a434f4e53455155454e5449414c2044414d414745532'. '04f4620414e592043484152414354455220494e434c5544494e472c20'.'574954484f5554204c494d49544154494f4e2c2044414d41474553200'. 'a464f5220574f524b2053544f50504147452c20434f4d505554455220'.'4641494c555245204f52204c4f5353204f4620524556454e5545532c2'. '050524f464954532c20474f4f4457494c4c2c205553452c200a444154'.'41204f52204f5448455220494e54414e4749424c45204f522045434f4'. 'e4f4d4943204c4f535345532e20494e204e4f204556454e542057494c'.'4c2056454e444f52204f5220495453200a4c4943454e534f525320424'. '5204c4941424c4520464f5220414e592044414d4147455320494e2045'.'5843455353204f462054484520414d4f554e54205041494420544f204'. 'c4943454e534520544845200a534f4654574152452c204556454e2049'.'4620594f55204f5220414e59204f54484552205041525459205348414'. 'c4c204841564520494e464f524d45442056454e444f52204f52204954'.'53200a4c4943454e534f5253204f462054484520504f53534942494c4'. '95459204f4620535543482044414d414745532c204f5220464f522041'.'4e5920434c41494d2e204e4f20434c41494d2c200a5245474152444c4'. '55353204f4620464f524d2c204d4159204245204d414445204f522041'.'4354494f4e2042524f5547485420425920594f55204d4f52452054484'. '14e204f4e452059454152200a41465445522054484520424153495320'.'464f522054484520434c41494d204245434f4d4553204b4e4f574e205'. '44f2054484520504152545920415353455254494e472049542e3c2f62'.'3e0a0a3c703e31342e203c623e4150504c494341424c45204c41572e3'. 'c2f623e2054686973206c6963656e7365207368616c6c20626520696e'.'74657270726574656420696e206163636f7264616e6365200a7769746'. '820746865206c617773206f6620245f76656e646f725f6c6f63617469'.'6f6e242e20416e792064697370757465732061726973696e67206f757'. '4206f662074686973206c6963656e7365200a7368616c6c2062652061'.'646a756469636174656420696e206120636f757274206f6620636f6d7'. '06574656e74206a7572697364696374696f6e20696e20245f76656e64'.'6f725f6c6f636174696f6e242e0a0a3c703e31352e203c623e474f564'. '5524e494e47204c414e47554147452e3c2f623e20416e79207472616e'.'736c6174696f6e206f662074686973204c6963656e736520697320646'. 'f6e6520666f72200a6c6f63616c20726571756972656d656e74732061'.'6e6420696e20746865206576656e74206f66206120646973707574652'. '06265747765656e2074686520456e676c69736820616e6420616e7920'.'0a6e6f6e2d456e676c6973682076657273696f6e732c2074686520456'. 'e676c6973682076657273696f6e206f662074686973204c6963656e73'.'65207368616c6c20676f7665726e2e0a0a3c703e31362e203c423e454'. 'e544952452041475245454d454e542e3c2f623e2054686973206c6963'.'656e736520636f6e73746974757465732074686520656e74697265206'. '1677265656d656e74200a6265747765656e2074686520706172746965'.'732072656c6174696e6720746f2074686520536f66747761726520616'. 'e64207375706572736564657320616e792070726f706f73616c206f72'.'200a7072696f722061677265656d656e742c206f72616c206f7220777'. '2697474656e2c20616e6420616e79206f7468657220636f6d6d756e69'.'636174696f6e2072656c6174696e6720746f20746865200a7375626a6'. '56374206d6174746572206f662074686973206c6963656e73652e2041'.'6e7920636f6e666c696374206265747765656e20746865207465726d7'. '3206f662074686973204c6963656e7365200a41677265656d656e7420'.'616e6420616e79205075726368617365204f726465722c20696e766f6'. '963652c206f7220726570726573656e746174696f6e207368616c6c20'.'6265207265736f6c766564200a696e206661766f7572206f662074686'. '5207465726d73206f662074686973204c6963656e7365204167726565'.'6d656e742e20496e20746865206576656e74207468617420616e79206'. '36c61757365200a6f7220706f7274696f6e206f6620616e7920737563'.'6820636c61757365206973206465636c6172656420696e76616c69642'. '0666f7220616e7920726561736f6e2c20737563682066696e64696e67'.'200a7368616c6c206e6f74206166666563742074686520656e666f726'. '3656162696c697479206f66207468652072656d61696e696e6720706f'.'7274696f6e73206f662074686973204c6963656e7365200a616e64207'. '4686520756e656e666f72636561626c6520636c61757365207368616c'.'6c20626520736576657265642066726f6d2074686973206c6963656e7'. '3652e203c623e416e79200a616d656e646d656e7420746f2074686973'.'2061677265656d656e74206d75737420626520696e2077726974696e6'. '720616e64207369676e656420627920626f746820706172746965732e'.'3c2f623e0a0a0a3c703e536f667477617265204c6963656e736520416'. '77265656d656e742076332e3120284a756e652033302c203230303329'.'0a0a0a3c703e3c68722073697a653d313e0a53686f756c6420796f752'. '06861766520616e79207175657374696f6e7320636f6e6365726e696e'.'672074686973206c6963656e73652c0a6f7220696620796f752064657'. '369726520746f20636f6e7461637420757320666f7220616e79207265'.'61736f6e2c20706c6561736520656d61696c206f722074656c6570686'. 'f6e652e0a0a3c2f666f6e743e0a0a3c2f626f64793e3c2f68746d6c3e'.'0a'; return &tx($s)}sub tx{my$s=shift;$s=~s|\$_vendor_name\$|$hc{'_vendor_name'}|iges; $s=~s|\$_vendor_url\$|$hc{'_vendor_url'}|iges;$s=~s|\$_vendor_location\$|$hc{'_vendor_location'}|iges; return $s}sub tt{my$hash=shift;my($s,$key,$value);foreach$key(keys %$hash){ $value=&tk($hash->{$key});$s.="&"if($s);$s.="$key=$value"}$s=unpack('H*',$s); $s=~tr/[A-F][a-f][0-9]/[A-F][A-F][G-P]/;return $s}sub ts{my$s=shift; my$hash={};my($namevalue,$name,$value);$s=~tr/[A-F][G-P]//cd;$s=~tr/[G-P]/[0-9]/; $s=pack('H*',$s);foreach$namevalue(split('&',$s)){($name,$value)=split('=',$namevalue); $value=&tj($value);$hash->{$name}=$value}return $hash}1;@ac=qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); @ae=qw(January February March April May June July August September October November December);%hi=&sr("$hc{'cgidir'}/config.ini"); &ss("$hc{'cgidir'}/vconfig.dat",\%hi);%hb=&tb();%hs=&ta();&uj();%hd=&tc(); if($hd{'ver'}<$hc{'_prog_ver'}){&ui($hd{'ver'})}if($hd{'d'}){$hc{'header_license_num'}=&uz($hd{'license_id'}); &tg('expired')}umask oct($hi{'umask'})if$hi{'umask'};foreach(qw(license_name license_domain license_id reg4)){ $hc{$_}=$hd{$_}}$hc{'_prog_name'}=$hd{'titlebar'};$hc{'_vendor_name'}=$hi{'vendor_name'}; $hc{'_vendor_url'}=$hi{'vendor_url'};$hc{'_vendor_location'}=$hi{'vendor_location'}; if($hb{'show_license'}){&vq()}&ux();$hc{'header_license_name'}=$hd{'license_name'}; $hc{'header_license_domain'}=$hd{'license_domain'};$hc{'header_license_num'}=&uz($hd{'license_id'}); if($hb{"logoff"}){&sv}elsif($hb{"nojavascript"}){&tg('nojs')}elsif($hb{"about"}){&tg('about')} elsif($hb{'show_license'}){&vq()}else{&su}if($hd{'demo'}){if($hb{"demo_no_browse"}){&tg('demo_no_browse')} if(($hb{'browse'}||$hb{'browse_dir'})&&$hb{'dir'}){&tg('demo_no_browse_redir')} if($hb{'setup_save'}){&tg('demo_no_setup_save')}if($hb{"page_add"}){&tg('demo_no_page_add')} if($hb{"page_save"}){&tg('demo_no_page_add')}if($hb{'page_settings_save'}){&tg('demo_no_page_add')}} if($hb{"editpage"}){&vg()}if($hb{"savepage"}){&vl()}if($hc{'cuser_admin'}||$hd{'client_edithtml'}){ if($hb{"edithtml"}){&vf()}if($hb{"savehtml"}){&vk()}}if($hc{'cuser_admin'}||$hd{'client_remove'}){ if($hb{"page_confirm_erase"}){&ve()}if($hb{"page_erase"}){&vh()}} if($hc{'cuser_admin'}||$hd{'client_add'}){if($hb{"page_add"}){&vd()} if($hb{"browse"}){&up()}if($hb{"page_save"}){&vj()}}if($hb{"page_listall"}){&vi()} if($hb{"page_list"}){&vi()}if($hb{'browse_file'}){&up()}if($hb{"add_image_select"}){&un()} if($hb{"add_image_select_save"}){&uo()}if($hb{"add_file_select"}){&um()} if($hb{"add_file_select_save"}){&uo()}if($hb{"remove_image_select"}){&vo()} if($hb{"remove_image_select_confirm"}){&vp()}if($hb{"remove_file_select"}){&vo()} if($hb{"remove_file_select_confirm"}){&vp()}if($hc{'cuser_admin'}){&th("_setup_menus.html"); foreach(grep /^header_tab/,keys %ia){$hc{$_}=&ti($_)}if($hb{"setup_save"}){&tf()} if($hb{"setup_edit"}){&te()}if($hb{"setup_tab1"}){&te()}if($hb{"setup_tab2"}){&te()} if($hb{"setup_tab3"}){&tq()}if($hb{"setup_tab9"}){&te()}if($hb{'browse_file'}||$hb{'browse_dir'}){&up()} if($hb{"user_list"}||$hb{'user_keyname'}||$hb{'search_user_list'}||$hb{'user_listall'}){&tq()} if($hb{'user_add'}){&tm()}if($hb{'user_edit'}){&to()}if($hb{'user_save'}){&tr()} if($hb{'user_confirm_erase'}){&tn()}if($hb{'user_erase'}){&tp()} if($hb{'page_settings_edit'}){&sy()}if($hb{'page_settings_save'}){&sz()}} &vi;exit;sub sy{unless($hc{'cuser_admin'}){&sp("Must be logged in as administrator.")} unless($hb{'page_settings_edit'}){die("Page_Settings_Edit : Page number not received from form.")} my(%ha);&th('_page_menus.html');&sg(\%hj,\%ha,$hb{'page_settings_edit'}); if($hc{'cuser_admin'}){my$user_menu=&tv($ha{'users'});my$checked_radio='allow_all_users_checked_'.$ha{'allow_all_users'}; my%ic=('user_menu'=>$user_menu,$checked_radio=>' checked');$ha{'users'}=&ti('user_menu',\%ic); $ha{'name_he'}=&so($ha{'name'});$ha{'path_he'}=&so($ha{'path'}); $ha{'url_he'}=&so($ha{'url'})}print"Content-type: text/html\n\n" unless($ContentType++); print&st("edit_users",\%ha);exit}sub sz{if(!$hb{'name'}){$ha{'msg'}="You must specify a page name"} elsif(!$hb{'path'}){$ha{'msg'}="You must specify a filepath"}elsif(!$hb{'url'}||$hb{'url'} eq"http://"){$ha{'msg'}="You must specify a page URL"}if($ha{'msg'}){ print"Content-type: text/html\n\n" unless($ContentType++);print&ti("showmsg",\%ha); exit}unless($hc{'cuser_admin'}){&sp("Must be logged in as administrator.")} unless($hb{'num'}){die("Page_Settings_Save : Page number not received from form.")} my%ik;unless(&sg(\%hj,\%ik,$hb{'num'})){die("Page_Settings_Save : Invalid record number.")}$hb{'updated'}=$ik{'updated'}; &sj(\%hj,\%hb,$hb{'num'})}sub tp{unless($hc{'cuser_admin'}){&sp("Must be logged in as administrator.")} unless($hb{'num'}){die("User_Erase : User record number not received from form.")} &sc(\%hp,$hb{'num'});my%hy;my$remove_user=sub{if($hy{'users'}=~s/(^|,)$hb{'num'},/$1/x){&sj(\%hj,\%hy,$hy{'num'})}}; &se(\%hj,\%hy,undef,$remove_user);&tq()}sub tn{unless($hb{'user_confirm_erase'}){ die("User_Confirm_Erase : User record number not received from form.")} my%ha;&th('_user_menus.html');unless(&sg(\%hp,\%ha,$hb{'user_confirm_erase'})){ die("User_Confirm_Erase : User number not found in DB.")}print"Content-type: text/html\n\n" unless($ContentType++); print&st("confirm_erase",\%ha);exit}sub tr{unless($hc{'cuser_admin'}){&sp("Must be logged in as administrator.")} my%ha=%hb;&th('_user_menus.html');unless(length($ha{'name'})){$ha{'error'}=&ti('no_user_name')} unless(length($ha{'login_id'})){$ha{'error'}.=&ti('no_login_name')} unless(length($ha{'login_pw'})){$ha{'error'}.=&ti('no_login_pw')} my$duplicate_username=0;my%hk;if(lc($hb{'login_id'}eq lc($hd{'admin_id'}))){ $duplicate_username=1} elsif($hb{'rnum'}){$check_login=sub{if(($hk{'num'}!=$hb{'rnum'})&&(lc($hb{'login_id'})eq lc($hk{'login_id'}))){ $duplicate_username=1}};&se(\%hp,\%hk,undef,$check_login)}else{ $check_login=sub{if(lc($hb{'login_id'})eq lc($hk{'login_id'})){ $duplicate_username=1}};&se(\%hp,\%hk,undef,$check_login)}if($duplicate_username){ $ha{'error'}.=&ti('duplicate_username')}if($ha{'error'}){$ha{"created_mon_$ha{'created_mon'}_selected"}="selected"; $ha{"created_day_$ha{'created_day'}_selected"}="selected";$ha{"created_year_$ha{'created_year'}_selected"}="selected"; $ha{"expires_mon_$ha{'expires_mon'}_selected"}="selected";$ha{"expires_day_$ha{'expires_day'}_selected"}="selected"; $ha{"expires_year_$ha{'expires_year'}_selected"}="selected";$ha{"expires_never_checked"}="checked"if$ha{'expires_never'}; $ha{"disabled_$ha{'disabled'}_checked"}="checked";$ha{'name_he'}=&so($ha{'name'}); $ha{'login_id_he'}=&so($ha{'login_id'});$ha{'login_pw_he'}=&so($ha{'login_pw'}); $ha{'notes_he'}=&so($ha{'notes'});print"Content-type: text/html\n\n" unless($ContentType++); if($hb{'rnum'}){print&st("edit",\%ha)}else{print&st("add",\%ha)} exit}else{my@an=qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); $ha{'expires_date'}="$ha{'expires_day'} $an[$ha{'expires_mon'} - 1] $ha{'expires_year'}"; if($hb{'rnum'}){&sj(\%hp,\%ha,$hb{'rnum'})}else{&sa(\%hp,\%ha)} &tq()}}sub to{unless($hc{'cuser_admin'}){&sp("Must be logged in as administrator.")} &th('_user_menus.html');my%ha;unless(&sg(\%hp,\%ha,$hb{'user_edit'})){ die("User_Edit : User number not found in DB.")}$ha{"created_mon_$ha{'created_mon'}_selected"}="selected"; $ha{"created_day_$ha{'created_day'}_selected"}="selected";$ha{"created_year_$ha{'created_year'}_selected"}="selected"; $ha{"expires_mon_$ha{'expires_mon'}_selected"}="selected";$ha{"expires_day_$ha{'expires_day'}_selected"}="selected"; $ha{"expires_year_$ha{'expires_year'}_selected"}="selected";$ha{"expires_never_checked"}="checked"if$ha{'expires_never'}; $ha{"disabled_$ha{'disabled'}_checked"}="checked";$ha{'name_he'}=&so($ha{'name'}); $ha{'login_id_he'}=&so($ha{'login_id'});$ha{'login_pw_he'}=&so($ha{'login_pw'}); $ha{'notes_he'}=&so($ha{'notes'});print"Content-type: text/html\n\n" unless($ContentType++); print&st("edit",\%ha);exit}sub tm{unless($hc{'cuser_admin'}){&sp('Must be logged in as administrator.')} &th('_user_menus.html');my($day,$mon,$year)=(localtime)[3,4,5]; $mon++; $year+=1900;$ha{'created_day_'.$day.'_selected'}='selected'; $ha{'created_mon_'.$mon.'_selected'}='selected';$ha{'created_year_'.$year.'_selected'}='selected'; $year++;$ha{'expires_day_'.$day.'_selected'}='selected';$ha{'expires_mon_'.$mon.'_selected'}='selected'; $ha{'expires_year_'.$year.'_selected'}='selected';print"Content-type: text/html\n\n" unless($ContentType++); print&st("add",\%ha);exit}sub tq{unless($hc{'cuser_admin'}){&sp("Must be logged in as administrator.")} my($sortcode)=${'hp'}{'sortcode'}||die("User_List : no sort routine defined\n"); my(@ao)=split(/ /,${'hp'}{'search'});&th('_user_menus.html');my(%he,%ha); $perpage=$hd{"perpage"}||10;$pagenum=$hb{'pagenum'}||$hs{"user_pagenum"}||1; if(defined $hb{'user_keyname'}){$user_keyname=$hb{'user_keyname'}; $pagenum=1} else{$user_keyname=$hs{"user_keyname"}}if($hb{"user_listall"}){ $user_keyname=""; $pagenum=1}&td("user_pagenum",$pagenum);&td("user_keyname",$user_keyname); $ha{'user_keyname_he'}=&so($user_keyname);my%hk;my$user_match_code=sub{ if($hk{'expires_never'}){$hk{'expires'}='Never'}else{$hk{'expires'}=$hk{'expires_date'}}$ha{'list'}.=&ti("user",\%hk)}; my$keyname_query=sub{return (!length($user_keyname)||$hk{'name'}=~/$user_keyname/i)}; ($ha{'pcount'},$ha{'mcount'},$ha{'rcount'},$ha{'cpage'},$ha{'lpage'},$ha{'npage'})=&sf(\%{'hp'},$keyname_query,$user_match_code,$sortcode,\%hk,$pagenum,$perpage); unless($ha{'list'}){$ha{'list'}=&ti("not_found")}print"Content-type: text/html\n\n" unless($ContentType++); print&st("list",\%ha);exit}sub tv{my$page_users=$_[0]||0;my%ha; my$options;my$rowcode;if($page_users){$rowcode=sub{$options.=qq|\n"}} else{$rowcode=sub{$options.=qq|