anlpasswd-3.0/0040755000107400004540000000000007333632661012410 5ustar rackowmcszanlpasswd-3.0/anlpasswd0100555000107400004540000005727507333631710014337 0ustar rackowmcsz#!/usr/local/bin/perl # # ANL passwd program # $Version = "Version 3.0"; # # Last modified: 2001-Jul-03 # ################################################## # Mayor changes: # - program is using libcrack library (by Alec Muffett) for dictionary lookups # - program is tested on the following architectures: # SunOS, Solaris, Irix-6, AIX-4, linux # - password changes in local file are not supported any more (only YP) # (this is due to differences in /etc/passwd structure on different # UNIX platforms) # ################################################# ############# # Configs $debug = 0; # 1 is on 0 is off # # Customizable items. # Change these to reflect your local environment # # Legal shells; This is a list of valid login shells # If you add any new valid shells, this variable should # be updated. The shells listed here _must_ exist on # all machines on your network that use YP; otherwise, # a user may not be able to log in to all of the machines. @legal_shells = ( '/usr/local/bin/tcsh', '/usr/local/bin/zsh', '/bin/csh', '/bin/sh' ); # location of dictionaries $dict = "/usr/local/etc/dict"; # location of ypstuff executable $ypstuffdir = "/usr/local/adm/bin/"; # End configs ############### use IPC::Open2; use Getopt::Std; # These two are standard PERL5 libs #use libcrack; # Use libcrack module use Crypt::Cracklib; # Use libcrack module # This one has to be installed on your system # Below used for the prompter $shell_prompt = join(' ', @legal_shells); # Security blankets. $ENV{'IFS'} = '' if $ENV{'IFS'}; $ENV{'PATH'} = '/bin:/usr/bin:/usr/local/bin:/usr/ucb:/usr/bsd'; umask(022); chdir '/etc' || die "Can't find /etc.\n"; if ( ! -f "$ypstuffdir/ypstuff" ){ die "Can't find ", $ypstuffdir, "/ypstuff"; } # Uncustomizable items. $| = 1; # command buffering on STDOUT chop($host = `hostname`); ########################## ac #1 start # Get the name of the command the user typed in to call this # program (either "passwd" or "yppasswd") and chop off the # path. ($program = $0) =~ s/.*\/(\w*)/\1/; ########################## ac #1 end # So that messages speak truth about what is being changed. --mwh $what = "password"; # Define the usage statement --mwh 8-26-92 $usage = "Usage: $0 [-f] [-s] [-a] [-r] [name]\n"; $usage .= "\t-f change the gecos information field.\n"; $usage .= "\t-s change the login shell.\n"; $usage .= "\t-a change without resetting password aging. Unsupported.\n"; $usage .= "\t-r forgo the good password checks. Root only.\n"; $usage .= "\n$Version\n"; if ( ! getopts( "fsar") ) { die "$usage"; } # Only one option is permitted at a time, so... $total_opts = $opt_f + $opt_s + $opt_a + $opt_r; # total number of options if ( $total_opts > 1 ) { die "Use only one of -f, -s, -a, -r, at a time.\n$usage\n"; } # relax the password "goodness" checks? $relax = 0; if ( $opt_r ) { if ( $< != 0 ) { die "\nThe -r (relax) option is for root only.\n$usage"; } $relax = $opt_r; print "\nWarning: Not checking if new password is \"good\"!\n."; } # changing shells if ( $opt_s ) { $what = "shell"; } # password aging if ( $opt_a ) { die "\nThe aging option is not supported.\n$usage" } # Change the gecos field if ( $opt_f ) { $what = "gcos"; } # Whose password are we changing, anyway? # (We use getlogin in preference to getpwuid($<)[0] in case # different accounts are sharing uids.) ($me) = @ARGV; die "You can't change the password for $me.\n" if $me && $<; $me = getlogin unless $me; $me = (getpwuid($<))[0] unless $me; # Trap these signals $SIG{'INT'} = 'cleanup'; $SIG{'HUP'} = 'cleanup'; $SIG{'QUIT'} = 'cleanup'; $SIG{'PIPE'} = 'cleanup'; $SIG{'ALRM'} = 'cleanup'; # Get passwd entry and remember all logins ############################# # Program supports only password changes through YP # starting with version 2.4 ($login,$opasswd,$uid,$gid,$ogcos,$home,$shell) = &getyp($me); if ($login) { # YP entry exists print "Changing $what entry for $me on yp server\n"; } else { die "Error: no entry for $me in YP database\n"; } # get rid of wherever it was acquired chop( $shell ); die "You aren't you! ($< $uid $me $x $login)\n" if $< && $< != $uid; # Just being paranoid... $salt = substr($opasswd,0,2); # ###### # added to save the original gcos $gcos = $ogcos; ###### # # Canonicalize name. # $ogcos =~ s/,.*//; $mynames = $ogcos; $mynames =~ s/\W+/ /; $mynames =~ s/^ //; $mynames =~ s/ $//; $mynames =~ s/ . / /g; $mynames =~ s/ . / /g; $mynames =~ s/^. //; $mynames =~ s/ .$//; $mynames =~ s/ /|/; $mynames = '^$' if $mynames eq ''; #################################### ac #3 end # Finally we can begin. system 'stty', '-echo'; if ($<) { print "Old password: "; chop($pass0 = ); print "\n"; if (length($pass0) > 8) { $passa = $pass0; $pass0 = substr($passa,0,8); } # Note: we shouldn't use die while echo is off. # Now it deals with "no password" accounts # do myexit(1) unless $pass0; if ( ! $pass0 ) { &myexit(1) if $opasswd; } if (crypt($pass0,$salt) ne $opasswd) { print "Sorry.\n"; do myexit(1); } } system 'stty', 'echo'; # This will get changed if in fact we are changing the password $cryptpass = $opasswd; # OK, now we believe they know who they are, what are we doing? if ( $opt_s ) { &shell_game; } if ( $opt_f ) { &gecos_update; } if ( ! $opt_s && ! $opt_f ) { &get_new_pw; $cryptpass = &encrypt_passwd($login,$pass1); } ####### # ## $login the login name ## $pass0 the original passwd ## $pass1 the new passwd to be encrypted and installed ## $uid the old user id ## $gid the group id ## $gcos the gcos stuff to be installed ## $home the home file system ## $shell the shell the gets installed ######## # @pw = ("$login","$cryptpass","$uid","$gid","","",$gcos,"$home","$shell"); # chop($host = `ypwhich -m passwd`); if ( ! &open2(READ, WRITE, "$ypstuffdir/ypstuff $host")) { die "Open2 failed\n"; } print "Opening $ypstuffdir/ypstuff $host\n" if $debug; print "$pass0\n" if $debug; print WRITE "$pass0\n"; print WRITE join("\n", @pw, ""); print join("\n", @pw, "") if $debug; close(WRITE); $repl = ; close(READ); if ($repl =~ /^SUCCESS\s*$/) { print "Success\n"; die "\n Password entry updated on server.\n\n"; } elsif ($repl =~ /^ERROR:\s+(.*)\s*$/) { die "\nPassword update on server not possible at this time. Failure: $1\nTry again later.\n"; } else { print "Unknown reply <$repl>\n"; die "\nPassword update on server failed. Failure: unknown\nTry again later.\n"; } ############################################################### # # # This subroutine is the whole reason for this program. It # # checks for many different kinds of bad password. We don't # # tell people what kind of pattern they MUST have, because # # that would reduce the search space unnecessarily. # # # # goodenough() returns 1 if password passes muster, else 0. # # # ############################################################### sub goodenough{ return 1 if $relax; # Only root can bypass this. $pass = shift(@_); $mono = $pass !~ /^.+([A-Z].*[a-z]|[a-z].*[A-Z])/; $mono = 0 if $pass =~ /[^a-zA-Z0-9 ]/; $now = time; ($nsec,$nmin,$nhour,$nmday,$nmon,$nyear) = localtime($now); # Embedded null can spoof crypt routine. if ($pass =~ /\0/) { print "Please don't use the null character in your password.\n"; return 0; } if ($pass =~ /:/) { print "Please don't use the colon character in your password. Some vendors have\n"; print "a problem in changing passwds to something new when the old has a colon.\n"; return 0; } # Do a little checking on the passwd for regex characters like * --Gene $tstring = $pass; $tstring =~ s/[\\()*.|\$^+\[\]]/\\$&/g; $tstring =~ s/[\\()?.|\$^+\[\]]/\\$&/g; print "$tstring is the new string comprared to $pass\n" if $debug; # Same password they just had? # This needs modified also to handle accounts that started with # no password. Without a salt from opasswd, crypt returns null, # so don't test. --Mark Henderson 8-26-92 # if (crypt($pass,$salt) eq $opasswd) { if ((crypt($pass,$salt) eq $opasswd) && ($opasswd)) { print "Please use a different password than you just had.\n"; return 0; } # Password is a part of the gecos field? if( $gcos =~ /$tstring/i ) { print "Please don't use a part of your gcos entry.\n"; return 0; } # Password in .plan file? if(&checkfile("$home/.plan", $tstring)) { print "Please don't use a part of your .plan file!\n"; return 0; } # Password in .project file? if(&checkfile("$home/.project", $tstring)) { print "Please don't use a part of your .project file!\n"; return 0; } # Too much like the old password? if ($pass0 && length($pass0) == length($pass)) { $diff = 0; for ($i = length($pass)-1; $i >= 0; --$i) { ++$diff if substr($pass,$i,1) ne substr($pass0,$i,1); } if ($diff <= 2) { print "That's too close to your old password. Please try again.\n"; return 0; } } # Too short? Get progressively nastier. if (length($pass) < 6) { print "I SAID, " if $isaid++; print "Please use at least 6 characters.\n"; print "\nIf you persist I will log you out!\n\n" if $isaid == 3; print "\nI mean it!!\n\n" if $isaid == 4; print "\nThis is your last warning!!!\n\n" if $isaid == 5; if ($isaid == 6) { print "\nGoodbye!\n\n"; seek(STDIN,-100,0); # Induce indigestion in shell. exit 123; } return 0; } $isaid = 0; # run it through the pattern matcher.. if ( $pass =~/^[A-Z]*$/ ) { print "Only upper case strings are not allowed.\n"; return 0;} if ( $pass =~/^[a-z]*$/ ) { print "Only lower case letters can be easily cracked.\n"; return 0;} if ( $pass =~/^[a-zA-Z]*$/ ) { print "Only letters can be easily cracked.\n"; return 0;} if ( $pass =~/^\d+$/ ) { print "You need to have more than a random number\n"; return 0;} if ( $pass =~/^[a-z]*\d+$/ ) { print "Only lower case letters with a number can be easily cracked.\n"; return 0;} if ( $pass =~/^[A-Z]*\d+$/ ) { print "Only upper case letters with a number can be easily cracked.\n"; return 0;} if ( $pass =~/^\d+[a-z]*$/ ) { print "Numbers with lower case strings can be easily cracked.\n"; return 0;} if ( $pass =~/^\d+[A-Z]*$/ ) { print "Numbers with upper case strings can be easily cracked.\n"; return 0;} if ( $pass =~/^\d+[a-zA-Z]*$/ ) { print "Numbers with only letters can be easily cracked.\n"; return 0;} if ( $pass =~/^[a-zA-Z]*\d+$/ ) { print "Only letters followed a number can be easily cracked.\n"; return 0;} if ( $pass =~/^\d+[a-zA-Z]*\d+$/ ) { print "DOE prohibits use of numbers in the first and/or last location.\n"; return 0;} # Call cracklib routine -- Added by EMir(); $foo = fascist_check($pass, $dict); if ( $foo ne "ok" ) { print "$foo!\n"; return 0; } endif; if ($pass =~ /(ibm|dec|sun|at&t|nasa)/i) { print qq#A common substring such as "$1" makes your# . " password too easy to guess.\n"; return 0; } # Does it look like a date? if ($pass =~ m!^[-\d/]*$!) { if ($pass =~ m!^\d{3}-\d{2}-\d{4}$! || $pass =~ m!^\d\d\d\d\d\d\d\d\d$!) { print "Please don't use a Social Security Number!\n"; return 0; } if ($pass =~ m!^\d*/\d*/\d*$! || $pass =~ m!^\d*-\d*-\d*$! || $pass =~ m!$nyear$!) { print "Please don't use dates.\n"; return 0; } if ($pass =~ m!^\d\d\d-?\d\d\d\d$!) { print "Please don't use a phone number.\n"; return 0; } if ($pass =~ m!^\d{6,7}$!) { print "Please don't use a short number.\n"; return 0; } } # minor cleanup to get matched parens --gene if ($mo = ($pass =~ /^[ \d]*([a-zA-Z]{3,5})[ \d]*$/) && ($mo =~ /^(jan|feb|mar(ch)?|apr(il)?|may|june?|july?|aug|sept?|oct|nov|dec)$/i) ) { print "Please don't use dates.\n"; return 0; } # Login id? if ($pass =~ /$me/i) { print "Please don't use your login id.\n"; return 0; } # My own name? if ($pass =~ /$mynames/i) { print "Please don't use part of your name.\n"; return 0; } # My host name? if ($pass =~ /$host/i) { print "Please don't use your host name.\n"; return 0; } # License plate number? if ($pass =~ /^\d?[a-zA-Z][a-zA-Z][a-zA-Z]\d\d\d$/ || $pass =~ /^\d\d\d[a-zA-Z][a-zA-Z][a-zA-Z]$/) { print "Please don't use a license number.\n"; return 0; } # A function key? (This pattern checks Sun-style fn keys.) if ($pass =~ /^\033\[\d+/) { print "Please don't use a function key.\n"; return 0; } # A sequence of closely related ASCII characters? @ary = unpack('C*',$pass); $ok = 0; for ($i = 0; $i < $#ary; ++$i) { $diff = $ary[$i+1] - $ary[$i]; $ok = 1 if $diff > 1 || $diff < -1; } if (!$ok) { print "Please don't use sequences.\n"; return 0; } # A sequence of keyboard keys? ($foo = $pass) =~ y/A-Z/a-z/; $foo =~ y/qwertyuiop[]asdfghjkl;'zxcvbnm,.\//a-la-ka-j/; $foo =~ y/!@#\$%^&*()_+|~/abcdefghijklmn/; $foo =~ y/-1234567890=\\`/kabcdefghijlmn/; @ary = unpack('C*',$foo); $ok = 0; for ($i = 0; $i < $#ary; ++$i) { $diff = $ary[$i+1] - $ary[$i]; $ok = 1 if $diff > 1 || $diff < -1; } if (!$ok) { print "Please don't use consecutive keys.\n"; return 0; } # Repeated patterns: ababab, abcabc, abcdabcd if ( $pass =~ /^(..)\1\1/ || $pass =~ /^(...)\1/ || $pass =~ /^(....)\1/ ) { print "Please don't use repeated sequences of $1.\n"; return 0; } # Reversed patterns: abccba abcddcba if ( $pass =~ /^(.)(.)(.)\3\2\1/ || $pass =~ /^(.)(.)(.)(.)\4\3\2\1/ ) { print "Please don't use palindromic sequences of $1$2$3$4.\n"; return 0; } # Some other login name? if ($isalogin{$pass}) { print "Please don't use somebody's login id.\n"; return 0; } # A local host name? if (-f "/usr/hosts/$pass") { print "Please don't use a local host name.\n"; return 0; } # Reversed login id? $reverse = reverse $me; if ($pass =~ /$reverse/i) { print "Please don't use your login id spelled backwards.\n"; return 0; } 1; } sub cleanup { system 'stty', 'echo'; print "\n\nAborted.\n"; exit 1; } sub myexit { system 'stty', 'echo'; exit shift(@_); } 1; # getyp($user): Accepts a text string (the username) as its argument. # Searches the yp database for this name. # Returns a list of all the fields of the passwd entry, # or null if the entry does not exist. sub getyp { print "Inside getyp.\n" if $debug; local($user) = @_; print "Getting the user entry for $user.\n"; $match = `ypcat passwd | grep ${user}:`; @ypentry = split(/:/, `ypmatch $user passwd`) if($match); print "The returned entry is @ypentry.\n" if $debug; return @ypentry; } 1; sub get_new_pw { system 'stty', '-echo'; # Pick a password for (;;) { $goodenough = 0; until ($goodenough) { print "New password: "; chop($pass1 = ); print "\n"; do myexit(1) unless $pass1; print "(Checking for lousy passwords...)\n"; $goodenough = &goodenough($pass1); if ($goodenough eq 0) { print "Password is not acceptable, try again!\n"; } # If longer than 8 chars, check first 8 chars alone. if ($goodenough && length($pass1) > 8) { $pass8 = substr($pass1,0,8); print "(Rechecking first 8 characters...)\n"; unless ($goodenough = &goodenough($pass8)) { print "(Note that only the first 8 characters count.)\n"; } } }; print "Retype new passwd: "; chop($pass2 = ); print "\n"; last if ($pass1 eq $pass2); print "Password mismatch--try again.\n"; } system 'stty', 'echo'; } 1; sub shell_game { # we have the original shell in $shell # offer the options ( This takes care of what is legal ) $result = &im_prompt2("c", "Which shell would you like?", $shell_prompt, $shell, @legal_shells); if($shell eq $result){ print "\nLeaving shell unchanged.\n\n"; exit(0); } $shell = $result; #leave here so debugging statement doesn't lie - KMS $new_shell = $result; #so that it really changes in non-yp passwd file -KMS } 1; sub gecos_update { local($name, $where, $office, $home); local($ngcos, $nname, $nwhere, $noffice, $nhome, $ok); # we have the gcos field from $gcos print "Current gcos is: $gcos\n" if $debug; ($name, $where, $office, $home) = split (",", $gcos); $ok = "no"; while ( $ok eq 'no' ) { # print"NOTICE: To deter silly names, changes to gecos field are logged.\n\n"; $nname = &im_prompt2("x", "Please enter name:", "", $name); $nwhere = &im_prompt2("x", "Please enter Affiliation:", "", $where); $noffice = &im_prompt2("x", "Please enter Office phone:", "", $office); $nhome = &im_prompt2("x", "Please enter Home phone:", "", $home); print "\nName: $nname\nLocation: $nwhere\n"; print "Office phone: $noffice\nHome phone: $nhome\n"; $ok = &im_prompt2("i", "\nAre these values ok?", "Yes/no", "Yes", "yes","no" ); # safety check for ":" and 's in the password file. $ngcos = join(",", $nname, $nwhere, $noffice, $nhome); if ( $ngcos =~ /:/ || $ngcos =~ /\n/ ) { $ok = "no"; print "Invalid gcos entry! \":\" and are not allowed.\n"; } } # $subject = "$0: $me changing gecos field\n"; # $subject .= "Old: $gcos\n"; # $subject .= "New: $ngcos\n"; # `/usr/ucb/Mail -s "$subject" $accounts &`; $gcos = $ngcos; #so the debugging statement tells the truth -KMS $new_gcos = $ngcos; #so the new value gets written to passwd file -KMS } 1; ################################################################## # checkfile(file, string): Searches a file for any occurances # of the string specified. Matches are done in a case-insensitive # manner. # If an occurance exists, returns 1; otherwise, returns 0 sub checkfile { local($file, $string) = @_; local($line); if ( -f $file ) { open (FILE, "$file"); while ($line = ) { return 1 if( $line =~ /$string/i ); } } return 0; } # This perl subroutine will encrypt passwords # The use of the subroutine is: # $crypted = &encrypt_passwd( $plaintext, $salt ); # # --Mark Henderson # # Merged it with main anlpasswd program # -- EMir(); sub encrypt_passwd { local($user,$pass)=@_; local($nsalt,$week,$now,$pert1,$pert2); local(@salt_set)=('a'..'z','A'..'Z','0'..'9','.','/'); $now=time; ($pert1,$pert2) = unpack("C2",$user); $week = $now / (60*60*24*7) + $pert1 + $pert2; $nsalt = $salt_set[$week % 64] . $salt_set[$now %64]; return crypt($pass,$nsalt); } # This perl routine will take a prompt, a default response and a list of # possible responses and deal with the user interface, ( and the user! ), # by displaying the prompt, showing the default, and checking to be sure # that the response is one of the legal choices. # --Mark Henderson # # Additional "types" that could be added would be a phone type, # a social security type, a generic numeric pattern type... # The usage is the following: # x = don't care, a = alpha-only, n = numeric-only, i = ignore case # c = case sensitive, r = ranged by the low and high values # # $result = &prompt("x", "text prompt", "help prompt", "default" ); # # $result = &prompt("a", "text prompt", "help prompt", "default" ); # # $result = &prompt("n", "text prompt", "help prompt", "default" ); # # $result = &prompt("i", "text prompt", "help prompt", "default", # "legal_options-ignore-case-list"); # # $result = &prompt("c", "text prompt", "help prompt", "default", # "legal_options-case-sensitive-list"); # # $result = &prompt("r", "text prompt", "help prompt", "default", # "low", "high"); # # What, you might ask, is the difference between a "text prompt" and a # "help prompt"? Think about the case where the "legal_options" look # something like: "1-1000". Now consider what happens when you tell someone # that "0" is not between 1-1000 and that the possible choices are: :) # 1 2 3 4 5 ..... # This is what the "help prompt" is for. # It will work off of unique parts of "legal_options". sub im_prompt2 { local ($debug) = 0; # debugging local($mopt, $prompt, $prompt_options, $default, @things); local($repl, @match, $tmp, $match_options, $case, $low, $high); # Figure out just what we are doing here ($mopt) = @_; print "mopt is: $mopt\n" if $debug; # check the size of the match option, it should just have one char. die "Illegal call in im_prompt2 prompter." if ( length($mopt) > 1 ); WHAT: { # What sort of checking are we doing $type = 0; $legal = 0; $range = 0; if ( $mopt =~ /x/ || $mopt =~ /a/ || $mopt =~ /n/ ) { ($mopt, $prompt, $prompt_options, $default) = @_; $type = 1; last WHAT; } if ( $mopt =~ /c/ || $mopt =~ /i/ ) { ($mopt, $prompt, $prompt_options, $default, @things) = @_; $legal = 1; last WHAT; } if ( $mopt =~ /r/ ) { ($mopt, $prompt, $prompt_options, $default, $low, $high) = @_; $range = 1; last WHAT; } } $ok = 0; while (1) { # print out the prompt string in all it's gore print "$prompt "; if ( $prompt_options ne '' ) { print "($prompt_options) "; } print "[default $default] " if $default ne ''; $_ = scalar; chop; # nuke the s/^\s*//; # ignore leading white space s/\s*$//; # ignore trailing white space $_ = $default if $_ eq ''; if ($_ eq '') { print "Invalid option\n"; next; } print "Reply: '$_'\n" if $debug; $repl = $_; # Now here is where things get real interesting HOW: { if ( $type ) { &typeit; last HOW; } if ( $legal ) { &legalit; last HOW; } if ( $range ) { &rangeit; last HOW; } } if ( $ok ) { return $repl; } else { if ( $prompt_options ne '' ) { print "Options are:\n$prompt_options\n"; } } } sub rangeit { # this routine makes sure that the reply is within a given range if ( $low <= $repl && $repl <= $high ) { $ok = 1; } else { print "Invalid range value. "; } } sub legalit { # this routine checks to see if a repl is one of a set of "things" # it checks case based on c = case check, i = ignore case if ( $mopt eq "c" ) { @match = grep(/^$repl/, @things); # check w/case } else { @match = grep(/^$repl/i, @things); # check ignoring case } # this is to check for unique stings if they aren't at the beginning if ( @match == 0 ) { if ( $mopt eq "c" ) { @match = grep(/$repl/, @things); # check w/case } else { @match = grep(/$repl/i, @things); # check ignoring case } } print join(":", @match), "\n" if $debug; if (@match == 1) { $repl = $match[0]; $ok = 1; } elsif (@match == 0) { print "Invalid legal match. "; } else { foreach $tmp ( @match ) { print "testing $tmp for $repl.\n" if ($debug); $ok = 1 if ($tmp eq $repl); } if ( ! $ok ) { print "Ambiguous reply. "; } } } sub typeit { # this routine does checks based on the following: # x = no checks, a = alpha only, n = numeric only print "inside of typeit\n" if $debug; if ( $mopt eq "x" ) { $ok = 1; } if ( $mopt eq "a" ) { if ( $repl =~ /^[a-zA-Z]*$/ ) { $ok = 1; } else { print "Invalid type value. "; } } if ( $mopt eq "n" ) { if ( $repl =~/^[0-9]*$/ ) { $ok = 1; } else { print "Invalid numeric value. "; } } } } anlpasswd-3.0/c-routines/0040755000107400004570000000000007333613767014324 5ustar rackowsrcanlpasswd-3.0/c-routines/makefile0100644000107400004570000000070106562404353016007 0ustar rackowsrc# On gamma, add -Dsun # On anagram, add -Ddynix # For Solaris or SUNOS #CFLAGS = -g #LIBS = -lnsl -lrpcsvc # For Irix #CFLAGS = -cckr -Dsun -n32 #LIBS = -lrpcsvc # For Linux CFLAGS = -DLINUX LIBS = -lrpcsvc # For Aix #CFLAGS = -DAIX #LIBS = -lrpcsvc ##################### # End of config part# ##################### all: ypstuff clean: /bin/rm -f *.o suidwrap ypstuff ypstuff: ypstuff.o $(CC) $(CFLAGS) -o ypstuff ypstuff.o $(LIBS) anlpasswd-3.0/c-routines/ypstuff.c0100644000107400004570000000443706544211271016160 0ustar rackowsrc#include #include #include #ifndef LINUX #include #endif #include /* * Invoke the rpc call to argv[1]. Stdin should be, on separate lines, * the cleartext passwd, followed by the elements of the new passwd * struct. */ #define LINE_CLEAR 0 #define LINE_NAME 1 #define LINE_PASSWD 2 #define LINE_UID 3 #define LINE_GID 4 #define LINE_AGE 5 #define LINE_COMMENT 6 #define LINE_GECOS 7 #define LINE_DIR 8 #define LINE_SHELL 9 typedef char Line[100]; main(argc, argv) int argc; char **argv; { int rc, why; char *host, *s; Line lines[10]; int i; int ypport; struct yppasswd ypp; if (argc != 2) { printf("ERROR: args\n"); exit(1); } host = argv[1]; for (i = 0; i < 10; i++) { if (fgets(lines[i], sizeof(lines[i]), stdin) == NULL) { printf("ERROR: Short input\n"); exit(1); } if ((s = (char *) index(lines[i], '\n')) != NULL) *s = 0; } ypp.oldpass = lines[LINE_CLEAR]; ypp.newpw.pw_name = lines[LINE_NAME]; ypp.newpw.pw_passwd = lines[LINE_PASSWD]; ypp.newpw.pw_uid = atoi(lines[LINE_UID]); ypp.newpw.pw_gid = atoi(lines[LINE_GID]); #ifdef sun ypp.newpw.pw_age = lines[LINE_AGE]; #else #ifndef AIX #ifndef LINUX ypp.newpw.pw_quota = atoi(lines[LINE_AGE]); #endif #endif #endif #ifndef AIX #ifndef LINUX ypp.newpw.pw_comment = lines[LINE_COMMENT]; #endif #endif ypp.newpw.pw_gecos = lines[LINE_GECOS]; ypp.newpw.pw_dir = lines[LINE_DIR]; ypp.newpw.pw_shell = lines[LINE_SHELL]; if ((ypport = getrpcport(host, YPPASSWDPROG, YPPASSWDPROC_UPDATE, IPPROTO_UDP)) == 0) { printf("ERROR: %s is not running ypassswdd.\n", host); exit(1); } if (ypport >= IPPORT_RESERVED) { printf("ERROR: yppasswdd on %s not privleged.\n", host); exit(1); } rc = callrpc(host, YPPASSWDPROG, YPPASSWDVERS, YPPASSWDPROC_UPDATE, xdr_yppasswd, &ypp, xdr_int, &why); if (rc > 0) { #ifdef dynix printf("ERROR: callrpc failed: rc=%d Dynix won't decode\n", rc); #else printf("ERROR: callrpc failed: rc=%d %s\n", rc,clnt_sperrno(rc)); #endif exit(1); } if (why > 0) { printf("ERROR: callrpc failed: why=%d\n", why); exit(1); } printf("SUCCESS\n"); exit(0); } anlpasswd-3.0/Crypt-Cracklib-0.01.tar.gz0100644000107400004540000000571607333613630016725 0ustar rackowmcsz‹µJ_6Crypt-Cracklib-0.01.taríZ{sÚHϿ̧è`r€×¼ÁÎBœ 9á–‡po’£„ŒÎBb%aÇ{?ûu�$�°¼v¼Yß^•ºìzzº{z^¿ž™†yµ°3 SVÎ5uœÉgó…ܳïLPÎïU*ð övƒŸ.åvw‹{»åJ  P*”*Ï òì hiÙ² ðl"ë*×î–»¯üÿ”!ýß‘ÏùTÕxö¨ý]lòùÝrùÎþ/–Š»^ÿ—KEêÿJ1_zù¨ÿÿrÚ‚DkR_—ï\@![€Â�?¾Ì ¹âKÈç«¥RµP' }Yx_Œ™ü·¥jr¨dóùò(_®±¥ÅQÆ>¶UͪVI5ý›NAÃЧêüv™zá|M׳–cèœV«8-EÖá+‹Í¯ •°¸6ÝI,d{–†}x3BјÉí¥©C2 ê4%Ê`ÿw˜Ws©~cpÝx?¸4ƒt® ××,óI|üýÅçÄmö§lÊ0Õ³k“ÿ;�¨²XÚgEˆÕØ c SÕmˆÒ%Ýæ&Ø3l¶bæ\Î8F@¡Y”�åøÁÍì T 4C‘m>ù¤Çk ›”PuE[N8¶&™[ZfŽÊµœËM®d¨/H&Ót”í°Ìuᣧä3 Rv9CÙÔ«×iŠZbt‡f äþõIOäj,¦ÌŒù‚Z‰ÌrÛ‰œ¨óù—ÀhÇ„Df q¯`Õ¸¸S!¦É–M‚7À5ë–´O8Ø4Q(Z¶©‡;â•C¼!ëI¦ª>o™‚—'Ø ¤ê¹-Öcø÷°~B Ž_)˸–ÓaÝDF‚�DŽ¿ ðçCÂOµzǦvŠÕÁÄ‚ÜÊgˈƒa†È‚Sµ¹7£S,–ìÖ;R2Û I±ÞW«^$“;Xü^êZ½îè°ßë$])§8»˜ ‰vë`à(øÏ´…§M˜�¦ò¦tØêJ¢®×ÅÄnuN­x¦å ‰8LTËvJ¾Æ½ÎQ_ € ŸýG]@æÇ)YE¶>àᔹÜfk0¡Éúq{(Jp±øf‡áü}ÑŸØÿ3Y?ãÖw³qÏþżƒÿv”ˈ åò^!ÚÿŸ‚úüBµTC‡N Z"§¸¸qSþÅæº(ÚX3²ŒÑ0è`Y׸@…|µ\®VÊ6°XhGUuYƒ n’’–X_Á¬øÅ"�ñ’E3õo8ÿmnÙÙ…öTó¿¼[,¯ó¿Jžæ¥¼Íÿ§ ém«+ Ë5‚�!ãi\F ÆW0J`$ZŒ)\K—£‰ªØ†U–Œ ²f²é"A,n-B}+4E §b ÝÕð굇–Àáù´»Bˆ�ÜoÏ'„em ˆµÒ[Èâ#üBP$u›ðÜݰÁ8‡ÂR׸e!ä3SNjpã¤)Á5¯ÆÜr'H®Wmë. q+l¬¡"˜Ëgª‚ë'ALjH±æÖ©l)¸�”WÎSgÜ^\.ÕI*ñ*�M’;¢åiÊW0°ÜÔå9ÏÁOƒ„‡êªIøk‡Ð/:•°ø�\Õ&ˆ;ÆÞœÀr�èôžlY—†9¡6¯Vbˆ«Õ œšÆüNÁäåV å1‚þ©ücIOô¤~ ¶a€53L;4„ɱ< Ä «|kÈɳ• þ$7j%¿ÅÜÄà�ˆb趬êØ`cy6ƒfëðPêKÝ!(8�dg£îŽ,h<´zUý[Û.k¦K˜HX˜ññp‹KkáG…Y�/4T­*9ëʲù—åŽvŽ• Ÿlûj‹mÍ0Î1÷SÏ9ÈЋ"––n-MYW8èËùs]¶uG¼'‚ä€+«Ú÷z²:AqzÊ@êÈJYqð‡Ça-p`Í~Ü !H™œ€Ÿ¤oùrG0 �*OÅ7¢wÞÔ�ªtûÀ¦›qþÀª³[ºàý·Vâ;ª<)艥r>øŽ*Š·Ëü½ù=ÎÏÞ Ô?}œJÑK�¡ .Mìxnº†ž‡-Œßàè]=óèbóQ*VÍà˜Âü'nEúa:þçù¿—è}±žÿ—ö*ëóÿJ‰ÎÿKÅÿ?Íù¿:ÅÍF#e¡--úg”ø›:ÄqÌ ¶8"ì)ÛòÎ…ãÒ‡¡ÔïfgqW-Èù08>p8·Ôßx:YnÛ¹|ð�·Íˇ2äéæ¡Z©„]>ÀvŽy&œséµ ¯¼ƒê×+{®¤ÈD|‚îõZG"  ‰ŒStDgÆ)_°m‰£ZÅ4äóTü…ƒ×zð9¥Ibï´gžL…Ð�b/MŽ“ÛJ×V7 ™‚HG\c‰x—!æC†n§Øï`õ³4s,£ÆÈdÖØWF3†›¦n`ú�¯‰ŸÖ¥j+3H aò�˜ %oÉz²Êbc“Ëç5÷ ”Ûå6C¹R(÷0”û6”û.”Û åþ3”ûs(·Êí—ŽÜ-Û”~qÃïÔ?´{�ŸÛR7žN{ãÃÇe1Ráöœ��˜…n)œâ3Ã6Ä@¡ ‡×¼ajî¤×oÞ²æ27�¹ìÙºÕànhƒ»ÇÒ:ðÙ÷Xëóq¶{¡]pêÑÑa¯?:lÞù|Z3^­Ù�‹¿¨<�Þ�t›Ö\öm{nÁŸ°xÒo ¥M{‚yÛš`?ÒVëݨSÛjøMy¼ %�û¸îý%´{û¡ÜAh§†ýV÷í õ«?,kfÀÙ5ûqÞC=ö�»�P76J¾l”=ΡãÐ@½åž„r?„rOC¹¿npoˆÔ꾯·�·�¸§°U3ªAénOê7¥q3ëôšÇm %6NÍb±£zãçúÛÐ"Æþ`ó‹­w?ì=Üý€øLlŠÛìÐIhe{'D; Þ xU=öú·=c±£~oØžIUH$¢Ë‡{ðÿbþø¿´»Wòðq¯Pø?¿áÿ§ BÉòYÈy7ÛÚç‹ù]à¼ô2üe�£ãª+Îîéû…lZôð'á>8€7­AÞHŽzý!$êÇÃ^»WoB¢Ùj éŽ÷´Õ¦M/ˆÒ"ê'ΑJV<Š È­žE­–<ï´M<�Z_�Püèvä9nhªŽy‰Sb˜î—}ßuÉ*1‰‡�ûÆÅ%ËêÞ_qU¯køÏ­WÔ©Ê'ñ‡z­J\ÈúXÚ7JmtÄÄyU@?ñI½(q“ ÄfµŠ°wxåDÚa×HðÜìÍÈÿ0¬ CrîéÙÚ’³'’ÎÕˆvÕŠ�ÎÉèb©õ/ê2OT�Z¹ìvµš#ï×Þ¬¶ÉuÅìwø £�ùÏP…|Ú{X”xÏ1=t¹ çpu©“œ÷«¾´ gNT«+g}Þˆ—YÙü#Ltó½Ö¥Lãá”îm.þ`wÌd'Iöºic™�¹ŒÉ´/0ë§\,Æ©ÝqŠãziøêDã†ä¿|¾b¥±aظäÈ‹[–¼EC„øh$u›£cûô”¬ôBбÍ:ç%„JW Sœ €ëW ³œN¹MQ¾G®ªÁi·w4h â¤Ð›Dü£~ETfú­�¶õÎdq&õ-x÷—½ó8Є{j¬*Èî|¼ßDbÃájU,'t§K*gë»\ßDí��"#n¤šÒ Ño ±WÒ¹ ­?ÎU¿?êôŽÏDÓëлkýd5W,j�q¾ ëäü9'SBðglàË©ÀŸ³À­ÌÁó è»^Ÿ±¦³1¾r6ÈŒ²�õŒÉ7H[¥)«zV1æ¯×ãI’ Þô£c¶T!MíU–6ûËð_§ÞmJƒáS½ÿ÷ü×÷þ«TŒÞ= þwÞú1Ìc¾óXæ�æ{!ÎÜBQþQDEQDEQDEQDEQDEQDEQDEô÷¡ÿWÕPanlpasswd-3.0/cracklib25_small.tar.gz0100440000107400004540000004562207333622236016645 0ustar rackowmcsz‹ž$o;cracklib25_small.tarì[ksãÆ±õWίÃש%©ÇJZGW.%Q+:z•He½•¤¶@`@ˆKß8¿ýžî@PÒ&·R¾þ�2+ÉRf¦§§O÷L¼Ìõ¢pºøÑ.Ü(Úùâ—ÿh­ßìîjü{°·{Ôü·úìj}x°÷æõáÞÑá!½¾¿¿û…þâ·ÏÿûÇ{jÿ»áàìjøKÛÿèóößß;xs¸¶ÿ|aowoÿ7ûÿŸS²ÿe8=n ôm– ¼<|4úÖµv™d¾»q˜¯4^ÈÜl¥ÔÉêX·ZƒÈxúª“ç]½w”ÏõwElðõ÷¿­ÔÀ÷3cíqËÅ{ý…¼÷ßÅCßqßKªµùD~îåƒ�Õƒyˆ·ûQ‘÷]�+ÕÓ“yhµM‚|éfFã{œäz±Ò�[D¹cíÆ+½tW]<Èð·oŒO¿Mµeu“looë÷s7§ÑÕþ5~Ä£úO7‹Ž^bŸs½pWzjè©ÏÛPNJVð�^>�fÉ,s}¥&sìÛ7.ÉhÃE™c�CJL�fæÑÄ9M’YdÉB{ó$±$yZÚÔbU7W^RD>-8+`+¬9]i‡·ïÐ× Œr“Ñ8’Q' �Ù¤È<Ó¢¨{ ,ÊËMñ!ié°ž·2¦Š}Uj•�¯[ÊÜidt\,¦&£™h—0pè=@>Þ Í›e=$ä²b¸`•.³0‡Ø]±,‡€a ?‚žr£Û6£H»K—_Ó)ö3w­Q /š'˜eš|êèo„¹“b6ÇQ˜�“Ûåä„Ë~ëB†¿èQìAZlˆíú ®¡á�p=2ö’G³%a'ÇOb77¶~ÆÅ'Ú·:øæèìûýÞÑÑÕÅO$ƒnGãÁÎÞÑÕTß ®v�W'úâlgp1Ø{s°ÛÑ.é·ɣ$]`q•Fn$ÙBãD]=Úb3/–¶‚å&("dnÜL4KÑú›^Gÿ qp}3êÉÅh¬ß//�uÓÜx†e3ƒÅÍ¡¶  °=ü�é�É2þøLF݆‘ð\Í]žøuç­vÉía  òÙŒëÃsØ–üÁO–Žb" ªˆMŽí~ÀpRSÈó :ÁÃLó ¶ $ØÇ“·Üh‘Ø\„]³Õ¯›�ýµþ£ ›Æ›'صסÑïoîþ4þR©"!ÉMC``EÁÜmg–$>©Ã� éá´‚X=e4Z’]õн\béñuÿ$yWŽÊ€¢dIÑŒh™ÍVümÄÛ{ aè ´6¬!˜Y©›å…/N\ªºHRrJRz½¯%…ª-RxyY-¶†p0J´"½ìÓ¶�ìçƒñäË0À~«Sè/»Qÿ~,€( Ï+HǨs¦øD°Gª\Ï*j?d@§ÀC»²Õ•~0&•t�3fÁ30}ˆýMCz]YhÔ#µ“ˆ¯KÇWƒËˆŒ[+À‹‰¡ñ{gƒ÷ï4�V&àÌVN΋øÁ†?1Òí)ÙOÛS™è°¿«ýÄÃ�ðœ˜l€YÈ]Š¼Ã¨à€nd àh/pÇX‘Ã6öA¦ð¿+Ë|A‡�0…ë²eð)@Ÿ1Ÿ¢“A± ÅÚ äØ~"Ó¿[êG‹~Œ%7põ^ÿ@Ã9#JÌ;jig.ðžöü½wx5íHZ%™«E‰�-ûnî¾â•^-�q¡ všx^‘®$ ÿC¿¹šÂÝÚ‡_žÃĉxúb†ŒDT› ½�cQ¨¯ÏÇvS¥!¯F×g½ëû«“Ñõ»ËÊ›»›ûwx¥Í LÍ”¾>P‚¿«Oz‹ä14:ˆV&ëRŠ üc§áº ÷Û‰Bl�ò‰†ÊÁ¨|úÜX° Ì Cb‡!å–¹aTXm=…Œo iuŠE+¯‡Å¶õˆð64<|fbC‰@»Îs‡ØE$÷˜/±¥õ1ˆG+|Y¸9@‚©�;£$ž œ‹ZD¨Ö„�½ËÞÇ|az�,'¨µµd䯵xDd2kz&†�l.«w#Xì6Ü„CA³r-^PP—¯_î‘t,_:® _gÃÞÞÝœ N`RW[70í^hç�µ9A–X<¦³B/E1ã“Á+;öûüãÉðV#Yã€[D­ I=£­mos¡}ÐO÷ÞµŽ¢5sòz´ ÂOÆv•Ãü�o‡? 2 'ç³Ò$R…±yƒHê¶}-RPRß”¤ˆç&J‰'AøÝ2å éý¸X}ÔÀløWv…q Hgl¼% S�ÖZï„ó£€lR¾×Õ&d×e~�¨*i#ýDÂãÝ�\ŸéwÃÉÆdœmëT»ÉH…¢Lnn.iż*\]óÀ/ÃÍÇj�*WUFY ‘•}d/G¾!måBj )& ¤_í†p¾õxì¢T2KX.«? ”°€šÄ Q¨êƒ¶è¤ÃTÖè›;I +½9ŠÒ”0Ñj)ó)—!¨+!E¿¦Á¦è˜ ’r^n2cÚ,9>d-Þ™™›ù¥‹Ùg®C|,2 {¬SJç¦*<u¥@Ñ hvk¢ [§Ý–1=§Ô„0ÓD�|�-L„S#ÉïðX•^ õåEV×ì²U`Npª 'œ³˜NIm±c|sw:$­“Ï�¸ã³‰Ÿ!õjîØ|Ê‘f4ÉKä×…A¨l“f7¤&�~?8�€ÄpG"„Yu›`Ãñ©Ã4NÕéVæ”È“Q¦á )í’¬CC)éD(êhßHô®ßïT Œúkàs⢠Ö{äÂàÊ]nɉtÔób‘^°¹Ìö©Õ»�¯ÃSà®Ù6X˜ŒŠ_ÂM)´«°q˜1 îBc Øx °ÞL°éÍ]LrS’¡º°²UòyÇPDÕ'C0BJy¬¬†vûý£Ý¯Åàeõ%Ä‘ê¦êMLމȆØ6uPŽQ õÙð|p9Ñ\Þõ͹vÖJrôéÍõd0ºk‡£�y‡•â螪QAD@#b‚ ìŽ|}Aê=Ÿõ¨q"Î(l ìp£sIÄ›[dRÊR]Gì Ù"”R–¨,™œ"C9Õù€³& D¦¤oR²t¤ø€z‰Ê[“_”¿~Bàõ5W6¤:¥˜lüLžÅ�)¢Œð&nV̱þ¯ ĪÉfçJZ#¥àÜI ^ø2dwÐ`^UŸ8¹>ñ<ì¬É8»m’Öyó&æÖ`�¡ü¶ ”xÿµõ†§+–Þ± Q3i8`Wqq.Ä£YÿsÙ��Œ“㗴ݶîªS²¦ýÝ«©, -°ëä‹T·Ër’`RÁÀÝhj€‚+$fSÑ xv8H’èfLÀ¼°Ñ qA KµšoëžÔÒ˜øy_‹¥åb°$뤛×7·ãÑAF¨·7”"?¥Ë®–o¤fä¸yç-†ž ǧw£ÛÉèæZmJÑîèœû°é¬àÒ�Â8]ROIÜ4�ž6/'ekÂy.½ƒ ªõ1�TMÄ–éonG¼Ò5×%5�Q­ ¡[²ÕPjYj†—Onªj¡¯Zí ø`€"�ê$[Pß�ºç ì6z`åÀ«§Cþp7Ù»h®¦Ì€ÁÄœdôõ=Ð(M¸ÆfS¹šú™µºªÅ?V¯”ý w'Ü.)ÕrùÌ)áI{G�Ü¿«V�{~\zܤá62—¥}ýaw—¥�aÕ€(² äyº,B¿�/ôO§Cb0*€*Uf„¤Z¸ )ìl8M’ p@%+L[9<¿ð õ'á˜eæ�Ú¡ôÑ…�½ÅØi_õ·Ó&wu09†ÓÑÿ;^¥cäϽêÆ\6Ëë¼ü?åÐÔ8ÚÎ ÔX�w#±z.¡Ñ×ö¯±Ó¥Y;$ÌÏŠ6­Á…‰©YiArÇÈÕQáS'aðç›Ñ™Môè\ßތǣ“ËaŸ‡Ý³~(¬›´ÿ§}_è¦î92aZº+±Îíû`ò&Á[eP´²Ç§ÝÔð-Ûl•¤Ô$@"âH©| ¾.å-–¿_“ÑÑÁðŒØãÕí%ܹ‡OÝ’¾F#j º±.7) zÚáâ£`kß}ÁG©¯Âì%óÝàôO—£“�Uüè�mòæ4±\wÉûÖ‡|–â¼®éÝæAíŽúJ°ò…9�—KG}…" Z-,JÝr#εBâ”,×á-ùâù XžúzÕ[Êíiüe÷oð¿­¿înuË.æ·z÷íÛŽ&KñtÓv®Í²ŽÛc§Sùú—Û©¼Üj?&¡ß©ü³>‹/bÄG<»„kò0@îG“eIÖ&téê]ü§r×Ïê½\¶𶱿¾Õ‡úw¿C�úúKH� Ò¯^É&þ~ÿ²XÒÿ1 VD ÙºA»Qò@aD¬–è+‡>Ò·z;§uC:C2Y{;ï¼¥uÉÿm¹ü„Pίœ³¦)ä}ÌD¿§ ¿Qø“+ă¤Î’¨Q9PU燳0—«,ÍÍgwú•‰¬)áfØÈV¦àÎSÜ‚?uŸ[®ÚpëÉ^…©®‹ØçF¨GLJøYU}�2#Џ.Ö Øß@ÁÆ)�f aRì3M“oÔ‹¤5BáŒÌ’…³yNQÓûÿ\†"…ÿ‹Ñ¥*‹ÂC½tÕf]¤k§ Ÿ©ü\ÇÔ�áâ'Þ -ÆûÖôíá­zê(W¡åSŒ·\ƒó)FWQž!ì„&*íý,8h¨Ø jdpû8ÿ{vÿëjp=:Ž'¿Úý/½ðfÿéý¯ƒ×o~»ÿõk| ÿsʰ×È·­Ö€|¨ðUëÌHÉßdÿÿ÷>Jnê—>{­“„)-¹«ªÜîŹSOD@¡®ŸÜÜ}xi¾ýÖŸË}S³�‘\]ŽN‡×§Ã—¸ =걓\ÆÈ�šu¼´Fý�O3sƒ)оÉðN¿,ÞiAG3ËXO£"›ò÷ãáõp¢ª üŒ�r MN›ξ©ì<—u¿µ~HVé{�énåØUNpIý¯ôàv´33qV€õÓè…SnèöçÍõJ3"5áLÌ´ñ>þÝ�€°­·wTÙ¬ºiÇüïôp=�Èâmh¼‹©®Í‹ (‡Èe¯õ8)—šKïÓ8>ÜÿÜ`¹ËógçÅÔn4Çôwç@ðê wÐL9Iy�¶{z¹1Iõ4™Z¯ÈLßk¼°ßú!˜Ó|åC§n¬¯àPs�ú2ZFJjq‹­»ÑüúÎË. Ã6š<϶‘›`(”tt'&ÉdPé Þ?įÈëÔrÞty½î^X¹iJïM�¿‹gƒð›ÉPÓZ=*O©:}:ðl`YDv\¿´­�MU¯¨ÿþ÷4ÿ—€ùëÝÿÞÛ{}ôº‘ÿ÷(ÿ¿Þ{ý[þÿ5>ím9¯R ±Pê*G+:ž…nÚæåÛ­A–Ëý�2ynuUóÜ•:]﫺¹·&‹ôãHé¨èt¥/Ý AôÞ¥+$UëS5Úæ´7¨îÔ+ ‰´ZµÝQ›ÒZº¿›&–Oièp5w˃,£ÊÝÔ%&+ã#u+—?@’Ç`ÎÜLàwQø LìèÇð§ãêÒ2ߢ�S•ºç'Ôãþt…Ì/¿J-×E9ÃU»¦rn"êN*/IWR&AA|·þÌ}DÍ;ô—.¦¨/Ú—7ÄùhŽ®›¼¡²_¿ždžD´á�.óýjº—¢­YL#¾‘B‡W•«:—o¹Ñ4�ÛÄ• Ë«2–E‡�fáãfWwó=žF$©Ï4IÌSZ€/ºs>î%Y/¢+—^aódA%ØËœ‹ñ4*¤‡ZÏÊçE(ël·�˺ÉcþÆ÷CÆÜrçûáÛ¿ÜG©³ÚW¨å­Ú)wâÈé—­šý^Á�yy_D?›q"çBê´¶Ú[MŽ<ð%|ä;È¥rÝüÅ =¨“©|žñIcQ7£©>޶f&áÂJIR‘3α9XÉ››[(Ïõj3q×™`è,jj˜DI©ÚU˜Ÿžlüʆõ¨)Ç•ÃO%+¾³oõ&mÏ™�“ô5©u ¤f�ô›b¯­É…x*®Ze~­1X‚‚Gg°ãåûhª…·ÅÒìþ HgP U÷ޥךÐ13ªrlæâ™®4 Áƒ—nàÉb'­šR:‰[slzš”,ÂMÔwàŽu&F,š¨xdRG2Ä[`­ž}£¹7íMÃh¡§,Ëv�I�Yˆu¹{\ ¬Âh]"Á,gÝXÚ1�32»M®ë yŽwØx´óâÃB]œµêÄu«ÎÁ�INæôâLè£02)Óvm ñí¼þ{íè¸Þ¨1˜jcLÚ3TjE`§¸Dœ`:ÀÝØ3ò€`ΞØ)±…ø—j>yU’›I;…ĶPó@�OÙC(bŠ—é7¯ÔIi%ÕBkhB›ï gY( rA³&¨�~R¯¿®½Ù�üβîR?~wpÃßÿYÔ~:<ª5è½R¸W¯½v>ìíì×k�¢¨ïïî�¼®ï¿-êZ{õ÷õã´7+’Ù¬¬&¢jâà�ó¾vÔ?_Õ÷êÇ?S¿oêÇûØR¨‹;€úÝ“½�#qxrtxШ¡ ü!zkƒ¶³Øÿû¿Äù¯¾AùÅY†ç¿››‹øÿ™ø/ÉËïÿeu}³;ÿ¯½,æÿ!þV–±Ä¾w*0žÌh6a†z¡ð.Ë$¦Ü Èâ‘t^ÀØkj¡/Ot/PÇ$™±*Û¸C›˜I(ÕV´¬òؘš Ñ4T#’WÁHL¡¤tn 6�rG0cX�¢PKRKÎÊ›­lt×!�â¥Fê›G´¬±u”Y Þ``[d3?ÄcyPgÉZ‰vò-¶ FÁS¿ý-³Ñå{U\T–׆•2¿ïAž#N³[h¯ÇR´Nç;öl”öC Í›–»Ï�$@à …ʰ“‡Ó6&hÉz£ñcý0Y€íBH^ øý×_aš‡è– ¿ Qitl¯¿y“Ù0SöjûâY”°ó›ÜÛc_�¶=ÖvA!!üâàúÎV³Å ^‚`(J¼ •>ªÊI “?»X#R©ÞGUf¤ß§;ØwÀç zÎõؤvð+PùÏÙ¢¬øQ}ûl¤‰˜ÊßW^ _¾ªŽ†“ÑI B΄$òJxÕo½pÅênåEøòE¨]yñÓË?Eí>‡üî ìÃâYŒÍgg)Ö›˜f¡œðÆ­ååå¨íõpÝÕMWÂJôc-\óô�Õp5Ð?ÊaÙ×? �®™ÓÓ?2;ÛO¶›l" •]†Z¶Ú¡”�v;TÆ"¥Xe fì&Ân¢�n¢÷nbn?~¢wßnÇ‚™RRqèÚZeÔ(b#µZ¦«µ“,3;ÙOÁTràš ÒqŸ6à”“$«Ën’>RHt&’ˆŽJDZäÏšÞäÜXÉÝôátÓÛN+=Àt²š3 i“6»íÞ¬¹H¢ÁžÕyðÎÂÓ¼‰H@ –yýÅɬ7‹2cý%yÈlú÷oFísÇpM›Ý9cèÎé¯;ŸÝy8»97j¡;oÊnÔÅ\"»Q�îÜ.æÑø5-ø×¯ [2wuÜ¡”êQ[†­:¿m%4-�ªjñ—‘úÒV_::Eçuô·Q'½[PPœ·Ç£+ŒÁ„ÆEm[V â#ï T\Š E€q©­´etýâ° C¾�AïÝÁYÏÓm5Éáò †q!;÷ oÏëÚ«“·Ž6îk—KÏ?�Ÿ„â"ÔþkâÂÀÊžŽö£ #…Q¤ˆ£4:eÿE‘/³ÄŒ^+Øë(ÿ$,Ü®c5ýaá¦`Òo˜+AÓ�šy"Mj&íɲ–Òõ³¥áLÔœ9[éhk¥Î•AX3'+"˜›âJå s$ñêr¤Íé[ ñePáÄ—‹;¾nÕR„jk¿žG_§-þÎb˜Ûèl,×45~ÖĽðècãø¨¾ÿ¶QÿGí³‘»4!÷–¹³ªÆÙÎx“稃Æì§òjùSycýSy}þ_ûT®lÂ'¤=ƒïåUNVÁϬ\ÝLºôâ#YDSAŠÂp}ñÀOc(‘½Rä«í÷<´Í5& {!^ •ž§§x`PD²/vnº!Gð±¢·Å—¾TáE±‡Þpè §{£HoÅЦ-Zô�Q(«ª|²Ì#z5\FºíɃ*)üzú”™Q6~¤[·Ê},••K¥¬ bÚzús Ì–láÝ1D É:¥Ò´õÙ´¸^%6 � ¼^FÀ"?5¬¥|Æ~lÆm7–hŠÁ‹!àÑÍ0À8T¹KyÊ/˜çy´ØHœ�IÀbü ÿÕ gRE~CœF—ÖD"™ÍÍšÍhRÕù�Æ’E¨t®gó£ð‚Ù×"@Î�²ä971aõÅÀ€NAäBHToŽ[ç»ãxþ¹Î×U%ÌQJâëѺu›5P9Ì9@ž_¤g sw€Qr[òqÖÀÏ-+Û\¯_½‘­ø�?¿+ð¿í7…=]„GL'M–ïº� ‹lyš,/•Ñ)&~—T¡[èäÄsu x z­>·ëŒÔˆ¯—ÝqÕc­‚r•I9¤~ÂÔ~8ýppôº�ã—|Mãv;êuK Ä®ºHïQÈ(šbD–NY”„A1Z‚Ç7À”ÖÓ$7PÇ�Ÿ1Ɔs�S”�”¦ø0~–&0«±s–à8Yœ¾$S ØãœÔ(ˆ2=þTWJw”Çö‹fÑ‚)Öε\3“¹<6á˜À$ð’" XTYÅá½� Ò„jGµýcÃ¥?]GŠ(ÂP’ôÒ–è:ùýÄ.PËEvÜ€ï\–’zœJAm 6àGKö>;9׸A�b�N=qåÍ^INT±€'âôŽ‘ýY“šç4ÔªTÁ§¢\ ›£”¼æEÓíK '#•�Øð|ñ\]#Í¥e,x…ïüð $e¡¾G_Ö|ÖuÛôçfMfL!?úþHßÜÄ:C?ÀPgÞw9N+F÷�ŒÈw�Ÿ#XNé—q;c¥Cè$FˆúÞVBѹÑéóEwKíLÝßuŒ@�¼ñíÃ,4Üê⊧^£ÈÉ�£V€ô¤—XTjןXRwÀÂý á>ð�—ñªÛ…ëQr3Q.]Aõp(0×Ì}¹Jw•,—'† Éož$öÜ�nÙ’8¢oØñwPgª4Ãb‰IkÃqøa·ðÎRÒy†÷ÎyLa5Éñ°´}ì•dø#î2;ÊšÓ8äà7Y.£u'ïÒçKò$£$ýð·Ò¦'¡R™û›ó9ÿ�mÿ£]÷¿¶ÿïúfÙôÿ­ ýϳ�õ…ýÏÂþçO`ÿ“f·3Û((Їq#£ Å0Å)ð!†”n{–0 tS` ã”vNþVŠ\‚Œlõ|<;œqâÚž“7�“7뤣ˆ‹¥vghþôíŸSü $„v¹ËÑ8‡~÷´ïžùtòwXwú~çm}7:’ç^á Ãî<û$¬  ДÑn½8DŽ1.QxhA­å‰jCVô�½qþ[¬(£¿a|¦ ÃÀjí&”àø|ª Ð`ôk³;³TÛ,ÕžUj•êNûf)óØšpXòëà UãDCÆn„e)eÞlðfû¾Ñ¾ŸÚ~§ÅJ�û�}ú·ë“›˜=NÍõ€¨X§çž…âW �7G§'�Ú»ï±&±!= Îk‰šB§F¢M˜Ø3�/Ávš› ‡£úqmKå%i9"å´BÍ^ „®"÷OÞÓyGZ1سph0Úòé)‰HãüÖ¬aS¬L,Eíä• 'ÂSöí¶ø·92©¾upYÝ­ÇHÁK]ÄD4“oj¹²½r¥v8 ëRO”$Ƀ4SÚQÊ ’Œî/Ò;yd±¤¹Ãá }�î�3Mj�"Z»f(™î2IœÖº7( S¨iŠ E9N˜� d k�6„É<ã¤7uIh~3÷L—×oÑâÂÜ@%�o1÷g¥ç×�Þ,i(û¨ Bo’MvL[©8ƾ-Óò�X_”¯8ß›½“Æ;höp2Vms Œç4�Þ$ìÒ¶T¾G] ‰}š�zÀžUBJy5%¬|ÌD1–›¡jfm<×~d@&žDB/:—’ ‹7T€­IŸØ¤uk„l–@ÙxêE¥ ¢3öz=‹Ú’jÕÑ´M¿b<…ªÁ>84¦wõ³, Ôêɸ•_µÒœ ‚¥–­¬Em©S×2ßûh­Ò¾H·nÏ·b‰ ÿ€N9ƒxgþg¥à,`6ôoHO}׿º%Ò�çt11ˆ¾æU2èØ2¹ÀÆᎆ|.)ÐÆ†D�ôTœÛ™—IÅfHÌÉá!–Û>=¼øÎO¥ôÊbšÒ·2¿Í1ËzëifÂW3˜‰¼¥"öN_æ ot™^gÎgJFӾЕû{E9bÉ`-Ÿ“‡ÎDª°Ébì²<|КQÄL-ÿ™@/"*!y…þ�SÆ/I¯{¥H�‰ZÞŽ*%˜A+Û‰XÂç$g‰«%’”ý›*U Á|ã’*ÇL¢ÀªŒ½%ÏæåÛ¬†îR°4ë&!¾C�oÄ®ç13 gLo €�˜6"FöŸ6NDö零ňiXf¬ëYýÞzt&qÆÉ°É—ƒ–Ñ19ÉM K”Â7ãKù&ß’oIke л´"” ŒUŽ]œ¥³p9Ø�Q•.Þåͦ©aSLHnY·¥Á¯šz¡2{)±µVqÌK¸[kR&¯ÆÐ›¦ð@HïÎHïûívÏKex8¹‘i«ß¾Üš·Òú¸ÒÚ—l9n©Iòf  „L,òÂÔ„á7)\U%12]*hùœr4c4j×´Ìc°q=G ÃB¥¯SÜû'½Iÿ¡ˆ÷¤³CëEÄb¤¬Gd¸µe)K-4áŸa­žÕf†'@Çá×Ìã@JòW¹l½RPÇMªì65¢ÕmÆ ÅÈÝt[â•+!m·ÈÄ[¾, d¬ÛRÜ—Ö÷÷êû5˜"½ Å?CÐ]1–e •‹>7‹öÒŠ&.™#èR ¬ù¤5t§S“Ù÷2òöW�ÿ»ö¬¼fÆXÃû¿µÍEüÿÅýߟÚÿ_E®¯Ò£Ã5••Õ˜÷?¿ÖSß?Ua¿Í«EZ”t³ÈaÅçÞ:â+'Îk¯99Ë_¸=@SQ4‹¢šWQxE�Ϧ´0ƒ¦D…²KPx J/Añ%(¿–´��ŸdÅgi®x¸Špt²W;Ý?88Ìäª9;õð¨vXÛ�Éý3–±sÈé�céGµ¿×޵LnË8� G»;˜5‰eí|PY½xÿ{'G;{uÌƲvwëÇ2¯Ë{}rô´s Yí€oöj»Ç™\'–Ñ8yÕ8®Ÿ`¥0–÷~çx÷]&·’‹ã ÚyÍq&“û!–øŸÇk?5A—±ŒÄáñQýG%ˆåÕ÷µ#¨ãÇûŸ“�½F&·ÇàÉÑ[hæe{{; (ý"‡¸D’GÝ AÑFé-R|-wz…Þ±|µñü¦€frãø‡Ö!ùs�²x>žÎÅ 9>°kÀ*ô/óý+¶­ é§y¡Î9–®Iend)mºBE>ƒÜ¤ÜAœGé²ó-Û<ò<±…éÚ}˜—í€ äƒ2t^ÐЧ^Ô¥œ…E' ÊuŽT!‹Ç^!dÛ6·§ (cÚ1éû·C‹É4ñ]Фq"È@^¨m&Õ6$4<�¨‰R‰Î¥—BÓäÿ¥ÜóèðÒÔ†0Ï:}9¥Íï5X€�Eo�—˜ýõxàm$æÍ¾á3DÂãôø€x!—â­ž�’¥„ý÷L„DFÐ×"¤§ŠþBà^²+ŸŠ» FZºlû¡prOHIbE/%ò£± M¦®Y\‡½ÉHc7÷îÂ8×RáÙh›å·ìâ Í`o†:.m1lË4^Æšú<Â4®‘bDm³-õ"i"Ç»œ•ãÏÌ g¶†Ùè 0Øô Ç–žóvZÏHÿ%>ëEÞÑÎTþ¹¨H;_<¡�‰|ß“•³ìr¥³GÖõü`’-&jUL·€ 1_!lô%Ô–6x!›IÛ;a|bp‚�LCmüâ{vu95 #˜£^h]GÃ�1À0gáÒ‡í¢>o„I£.=¸‹;¡d­¸³ÉÌ5Ò˜4ñ?†�Žžï :ÊÀ›ÌÕb­•pê‚0jA,¯Y7É,è$-ºýª<Û¼¸48”Êà ÈÄ zÚ±ª Ù|›ÃÆç³¢Éè,Âð#nŽmvd3£ ½Tp'Ìrã†Eò)–Ø{´­†–æ`¬a–fòw@'àK½õGQ}a³Q;¤ú×¢q¼st,ÞÕŽjQ)ÔðùÐ�ä:f £žò“âã)FfÇ »">wI»¿�Á˜;>¾3‹ÏD\tÀ§€D ÍxUrÃÃÍÇ.,Ä ø{®jüºPð\€Ùc¾ÛJ¨*Œá­tIÔ*\oÔá®Õ}Ku�žÁÀÅÛ·¡Ùjwκç_zýÁðGáøbzyõ·éƒÒT�¹ùéIRý~‹¬¢»Ûôthõ4T=1]-ÿ«XÝÊ=zñ){§V�¡êQFVLôöøÉ“~»”/”NŸnÿúéÓÇÏ¿üöÍË•ߢkl=I—6 îY@õPÖ>†…|¢úöã>±º˜¨.¬½£ì‚ÒîÐÅŽÕ…«ºp{îÛôP¨D}PâúøÉêãÒêC½ÆhöiwèåµÕK[õ"ŸÝŽÚ§„[µßö:î¤7®:>E=1bàU1|àÓ¬,qž´èRŠ9©qLf¦²Ù¸K«œ>®“8¼yÄÀÒÌ?t–¡�½«/¥¢lýÆš‡”;¿\§.$E™*•ô}Œ°JÃ5î�44Ôqí‘}}w¦þO©¸³±þÔ]Àº­ò2=}…×"»ÑwÝ„‚¿žæû qŒo?½ß¡g ,uµÅ]g¥>çµ2j7ë4Ó(T±¹¨B‚«DŠmIäVsÉ ¾’[7mÃÍáÕújZC’½Ý°¡»!'aÏ‘¦tÜ&n^TRÎ=’ez@Ÿ\YQ¨ŠjBJu” Ë›AËz~ßoýNÕY•d^tRÑ�uœ¤ôÈÈv‚INË�p´¨È´WêøQÌ(•úz­j›=D™òÒ¬š8<‰ò‰²•µ@²}»–ÖFtj~M+ú".­•è¨ùšV¢‹¹´fŒÚkÚÑwiÍD‡•×´"ïûª)çZ7Ä­¾LLÂQ) Ér’­SþìVß*�ؼ_ÆøÐ&·¦"„‹¨*rÏs‚ž}Á˜£3ùð@äž„9VˆäâÜ2"Yb>c‹éŽh­á>J±À¥üÓ§ Û¡sH*Áæ4ô`6VM‡oêù£öõÐÍTDðiîLÆ*CØ?l3K0˜]ß°N!ñ[£ý‡?8Úøjh~h—v·Ä=¾kï¡Éý㟉…ylÀ\Û(#£õ�±Ø�µ¸gŽš�$n9hT¥¿Î˜g¨ˆ™Œ:Í•ê\&²&UÚW¡•“‘M´éó`3DÛL´H»‡$^ÈÍ¿Væ£È»£2óUq¤¼IÈR´�ÑXýPWXˆ| lÖ"Ö—W³×87kG.Ë_»âåè«÷´ìÓÅ™¼‘!}ùÛo¥FÅ€?:øO0éVtÙŸ(*{¤» Uz:Ò½¡ßÙ?Ù£#…LÔÜMH+²œ¹;uákëHÏ_¼"°¹$â_OÀ³IY7¦ ´î”€R•,9-™„匩Z2JÿvñÀFMwŸ2ù¾ïƒLW|GRNK¬ÜËÄÊaÝפ¢'VÙàòÊZ¤Ï÷q‘èLÈüRIµ ÛôŠr/–¥¶lf$äé8˰|;1*ï˜ñ±Á7{°5�-QKCÕþç¤~Tã›,AÆy˜Iæß†Î�–oUä6//ÑDõå‹–¾ ŽÑ˜3/²Ž£(Á’øæR_Ûëyã$³ïL~*~‚ôÈÉÃÞ Ñáׄ6‹¤íšú艫ñ} —ɶ¨\Çt#ËIÂvxy…8 _´®fá[¢õzÔ¯]ƒúÏ*ïoÝßñ†=@„¿òçùx¼n>øÖœþ\³Û[»n^haД¬\"ªW¾ÖÈ­ävÌÀ¦qª¿ùf%6Ô¨q¶o/ˆ5{ã%³p\%EèÍÌ£¯63�þ3ó5&æ«Î ‹þD7‚ÞÃô�ñ)û‰|:ÙÍ è{øÂ³òüå*Þ}¨7¢ÇÝ=.®›ÑȰa€–nO°×à8à·éñIŒÖ2u»ž2c2h{#Ý¿ë=�0ÈÆ´ëá×ô .E§nzmù01 Üsû 9{mhÈâ#*V#0hé5 嫳aÏ Ï ýÞ•È�§þå8ê­7ôX¼vgDaœÐȃ\CZ“Ñ…G�aSc ƒ^aKWµ?¾Èé&è¹2ûp‡Ë*Õ–ØlÃNk{@ c{0{eÄ…Hå®B$·�{ McXZ¡<(Üàœgû>Ïy$¾â«X÷o¬—¸Ê�•ä w¤úÏèNëÿñý„!¢©5®‰°ƒ¢ÚJnÕUÚ ·ŽsÉ ÁØk(óØy3gzñJ¨fl|U(UJ"ÝΜ¹•µE¯ˆû‚sën0¼�#ëþ$Sþ«,º9"Ê$>Š€Çì}Rv唽zWÊ6æ'F#÷7=…ቱƒ¦Éê�òs›;Êýh÷3™Þï" ÿÁ ã®,ÏÉD–4éRD[Òý>Jò'äà%žaŒ‰��SÛ};ºE¦A)â&·‹�·MñE¸)l’Ûð)†Lù”}Â;D`S÷êEJø”Ðévæ‰ãÌK𣱣}Ý<×gÁ¶f #…Ó•?1‡º÷ÈÀA†êÒ‘ºú¼RFš)Å 2²¥”øü (Xã©@Å:°LÚó|»¿¸ÿÿsÜÿÏöÿz7>Söµýÿ…ØÜX7üÿ7ÐÿcõÙÂÿÿ!þ¾ùæç›ûñÿ‡vîÃûš¹ßhçž<ÿ¡%ËïqæìÕ_mg`�°k¾ë¼úÛv¦Ão,ã«“è;àgDá“y*¥9»oövÞ6¶Eé@”êËËzщÒk+Àã<|ª™Çyh¾€Ž®bt!8U<~ádJ°áÆzœ<µç¹ƒ*¦÷E©#¸žÊMó³×ÿ™7`Ї½ß¿þ7ç¬ÿòæújlý¯UÖñÿfý?Z™„£•^Ðr{+M°2ôF=ÇY°…;²…pÒ¯®ö¼Šk¾ÕÎ?&£çBýl²þóÒÅ«²|ŽÞÉEŽÞ¡/ø.}Á·Aè ¾B_ð�´ô|éVæÔî][{ín}»\{ýn}SmÂÑ¡7êÃÔ–�öò/aâåÞËÓ-•öØ-õåÇß`94’•2/;A€Õ0÷,²†`ÉÒO×Ä‚²"ÕÄ�!h@ Oa˜ÊÉ™Çðó—¬lèñiö7Þ³Ñ1‹ny[„]¿3æÊz(Óh4´u�Ôoåh!u_ãgÅþ¹fÿ\Ç‘+ ñ®D> FcI`yHóO°wØü"#kQ9Ø�Á~ ©ìºýßü÷_0°ÌW×ÿ*kÏ þÿŒõ¿�ÿ_Äú3½ÿòC8nûÁr÷yÁ&Úf*Ï!1ÊÓt†)Ò tüÝV2�^räS¬Á¸ü,¥D/À›.°VÙÒA¤ThE ‡Íš)?S±™T^5³V1S_í€ZÛ™¼zÉx À‰7µ¢ÐêØÙ[±Ä(´L/?æƒñô¡ÛÞ¢G°¸[ÙYê³1홯È®qK6Š·�Y½\]]-Û9 šs*vŽŒôÈyëf¢æüsôܨ…)ùlE• Áæk;sÂäþ&bnE¤¦Ã^@½¿,¤ÇÓŽŠ«ÄêåæêææÆ³µ²ãx—x-©£mÊG‡@É Þ5È›x²õn]ÁÍöŸ](£ÝIÜ‹qÀ.*n¡ ÿD¢šŒ0ÂÕTY¨¦ZˆU“a’Üb³À†ýaJóM�x‹ó¿øùßlùíW[_Yþ¯VVcò­R^ìÿòÿ¯÷þ›±¨nö6áìvƒ¡õÊÃÍ¢!¥Æ‘ˆ?ã�ò 4DËF­sè-ëíÛGÛ"æ‹Ù"ãÌRIg&¼(mîÚ²îèIå;2ϵ0™/CŠ{Båxk½ØÌ¶´ì*mŒÒc„ñp�a ™yÖXn0„ÔàZ>!oZy;JÅAŽæD:’ï€à)?§ñ«æz /ÖÿÙú�Ëÿ°ë¶ƒéÊ}ʘkÎá/.ÿWûÿú›5ÿGµ�×ïkÅݽ¯ÿ[T6*•Xüïòæúbþäï�_tRÿºÞÈËÑ];î6H�þ-èÄñÎ�œu!+Ë´‘Õ/a+•±ˆÜüÌ;>º\áv&K|sÏof—…¨çúÂíŒ\¿-êd­1È�á˜÷: †Ã`4ž PB ý¦R;ù:ði.xáû} A‚ɨåá“_À©¡ù6™/d늶'¢ ÿ_ç …À@Bä�—§.ŸÍFî^e^.ˆ#|ø{Á.‹W¿×f+T(Ž‚M f™«T ¢.s°VÏE˜‰Ïcà$QyÂeÏ»ðzâ³nQî…ë÷Ü&Ú¦Œ‚> ¶e9¤å>HTáŽZ]ÿĺ�_Mqfd×u™ ŸŒ�•c8”~08ƒ¾C, CÛyø(8в|Ó#Ë…?öÝÇÁ1ä[Ô‚�0ˆ³ŒiàyŒÜ ’—IÐde&¡7ðÆ+ pW.‚ÈÓÊ3É;®/ùÝ�K~Ó’k«7.YQ% #ködzz9¡-Ðô5‰lÐ [˜€V¦ŽT–`л®#ÙàóЋ‚upæ‹¢Ozˆ"Ê.ª@Ò®h¿hWz½ŽœÑõ‚¨µÑT:Ç /fP—[¥\PÑ&žœ uE|Š'5‡;ÇïN kM»@“@̇ӞÐ1¶£¨Y‘7Åûâú4Vj2V¦ ´>¡iÁ ÐÖš°üÁŒžÇ¤æ©NŠÂ;“+�‡‚Ðà ІJ½Öèj8†ÏA»Ù—Ï7F�"ýIt.¡¾,»© <+¤,`5.²Y ‰ÐL"#ñ`z­/°ô¸BÛ\ã;`“�Œ ]e`)£ê–/?ƒlÔ٠ΟüüGÊM…÷ Ì—ÿåÕÕÍ�øýÏfeu!ÿîügWï�Êß÷})y•þ-Ó¿•¢T–Yõ:ÖÚ�•EµB”ÉÞèÂk㦳ðm{A‚j:Â-3‘Ÿa@)\š­‘€!©†ÀšñQáàÂo“�²öªƒ6]ž £, �Üÿ!€r(A<³P€„64†;OÞÁ!»ÝIßÐãÒ, ƒQ_íû04äÐoM‚Iü$é°ç^A­ Þ~Ð<Ç],¶ÍcuS슾×öÝÄ푌’ù\ßâ¼j¼¶.—pír¾Jë{ý`tEid /R–<g—)Áïêš©”<’Éòn(zx$tü3~yDÂÕãp¹ÁeΆ÷­V¨ö¸/óß4û�2amù™<ë­®mV×*jã·¶²¹ò}%½ú$¯èJÿ@‡ƒNO›AÐ3nâÙn°½4%ökµ×§�ctÔ—Áfa ø1Ed~;+ a>;¨ë~¶†dÏð›¾YÅ“5Œ¯) K [’[žÖùay)Qé àjÍÓÉ]AŸî‚FëÍ=ãõï¶Û¨U‘æ�ZÏ»TŠ?,fÝÌ(€µ2 ¬í… Õ¢Z]­S< Ü tDÿJtÜ‹€žPžºW!4¥[!Q®!W'6+K;Go'�Úkø¥&G )¯ƒmGSK¡±õ/.PO+zŨL( yðq­òÙH…)©Ó…4üølý³zÅ ª“Í02š{eýÒ™ T� ŠÌ�=Üi4Nß×÷O÷jûY|aQ0•ð“="Ÿ=¾Vdf-¿ ý€:9).Á–Öp�Huˆá†È¿ÜúÖ©`œâ‘¹B³¯»'GµÓÝwµÝ§µý�WY#1Ã%‚ÒÕIኂ<È»A‘ç2ñšˆ®¨¦Â½]“Ëhìñ… 5HqÕå¿p(ò’tû•5ÂÛ~ ÕâYxcßXc{„t™—Ã(*Š(˜"1fª0 R?fc 0íflpɾ› Žø} ä]Ìb�›7,sAý¾ßóÝÑlÀ©¿óIub½Õ�½�ëÚXJ‘øƒÖÐ|‰¢ãK�imñ¶ÈË•Á´¥¢ë§çI ×ùr`…Ø’8 @’wI_È­isÓ%Ç’5L(ÉrjzÚö[ã¬ÃžDRrÃF¶fòµ¡ðL»"ÁwóÜߺU'ªM´¤=”õÓŠ‡£æ©_OB=0Óiƒ,Ù~SZ½‚Šò3l…xó÷¤tÚ= l0¶ö )¸€Á.--‰*kei=¼ŒÝKÁàæY ¼ ³ÿ&¨L¡˜ E?Ç$ `;4 1æéÒ’”ESj?ŽÅM~S2«åâyìG­%Vâ}ø¿ŽÄŽx ÿåPçû×{ùó}nŽT0—ôíCŸ;r2¾!î±¾æbüÞõ9pq뜙½Ž�Ìßvb?ÊGÛØ+>wm:jñ Ñd¼c€ª¦<G 1âæÞÅ»•^GÁW±;™Ñî;°ñàñ™7WlFŒãŽèɘé96—?7dn’mžÅ�,=Î÷imdÎQßq”§6º$*g&6INÊ‘ÍŦ+¸ãèû—ˆÉ‹× ÌæŽ7E˜ ƒMÿu"YÁÄ ñÄ&:‘ˆ¬wËÒefÉf­oʸ´Z(†66“��µK2À‰’¶ §’<Ѝ$¦ñ ¤úªµŠOÐâ«Kâ>%bRaÅžØ-OAàv‹*÷'!1�ï@gÓ@»:Œz0 ¨TX›|ÙЈÔ~@¡ØÚßK‰Ã((JÉ{y´±DX,‘G%*Q }ü°-|ƒZW´Ú ’�OBd~?ŒP!€ö¸®"R‚èÓ€hZ7‚ƒã •B!“et÷0¶ʸ ñßþôñßç°ïê­ÜïÓ­î7VñH°¼¹8ÿûÏÜÿÒüߟïç îË›ëæýï&Ýÿ®•ó¿ðÿü;z1âpËô¾þöݱ˜¢¼�a�¼>°w‘-½â3Ò, ¼Y…‘àƒH0²ÆdpÐè[]ŸÔëoD�Šˆ�£>;…ž‡WRr †¼âãW¢ãM96«ø±Iå¡×šŒ¹x) K–!›é\š+½Nl§¶³�óz#™Í 6ú·6¶3FõÃÙÕ�é®fØà vˆò ^ƒƒº@Ÿ¸ùÆO¨ädÆ÷!‰8\´*¤±TÀ¾©#£Õ‚ï ;ˆjÈx ÿÕOU÷x«êºªóÖ•aHU5¶[WçàÓ-ý|rj©Õ†”O«å ¤®–¾çŒÇØ~™ üÿÅϳ‘7¥ ‘ûç79û÷㜳àÿ)þ/ÑÛzý¿R®¬Åùÿ³Í…ÿÏÂÿçOkÿ�&YÞ�µðÈë좠==1Í O…¹?oYγh€âµMÏÙé({œ ü3‡Ó¡ÑN“v v$*' 3wÖÂsIJöéÈË¢pÜöF£¢ÈžàDT?�Ÿš·ïÑG/»g¬ø]±ˆa�òŒØÒe”ja�êì4[ˆž ÒM�Ê�×&�ÖxÜ–Î )|`Ø9óÆažÇ\4­ÑÏ¥í [xyû-Š…»´ _†íð�€Äšáál¯t2ä{Á¥ôç#Y‹BeÊ×åø ¿øÃ!öŽ1s«âIoBåÎÕÙžðùƒ‰'ϳ)ñd|øÑY”SZ˜Ó !´*¨�RoØÙõ¦õŠÝvcqß?ì¢á+v¬œžÔu"´¿ÈTˆùAñK� û�?‘ýGºüWŠJë!ä¹²±;ÿ­¬n.â¿-äÿŸ^þ‹|ÁëþMäµb»E¼èƒAö¯Š�é*oV‘Ù///óužiVNâQÌ‘�–@d=„½O“�=Q-CÕnÒE‹HòD¥+;®Ÿ ¾dQüdŒkÇ'aUE†U-š�$§È–…ü¿gù?›ÿãùaøÿúÆZœÿƒLXðÿÿÿ‹òÿ;làì –È'8/0ƒQr¯L–kdçí¶l‰ƒGÿhç;ºd?Ão‘ܫԑ§EVžaËt¢Z¸ÝÎõ­oÛdå –'h² ¹~Ä‹ó-Ó^ò­‡œ�Ù§_0X'–Êæ“^¯�•lP·\Ì“=ÉùŸÍÿñ”ó�øåY‚ÿ¯-ôÿÿ_ðÿ?ÿ¿ÿí†ÆE\»&Cµ7þ S€·â{†Þ$¶mð‹"ïooë(xxŠ%^ˆ,Z“/‰ýƒcñæàdÿ5ýÌŠªÈf óXý»þ¯/ØZÁÿ7Lû/æÿ•µ…þ¿àÿÿ½÷?þŸä¦GW=w?l¾½º%ðÅb‹‡KÛoëðƶyÛ}À,Êž´EÇ‘Ö&”ø3Ø´!Œ®ß6üÉøÿ»zãøàèç{¶ÿžûþK¥b¾ÿ²Žößkë› þÿ•å�ŒÛnÓ»Y-v@èB>¤©#ÀDH2bвã@Õutâ@n(ƒ;tÅ·â¼Ó]£%ÝôÆ.Y¥€´"�Cª¶VÊÐsN·•R^¥¡³àÿÇÿëÿ~MÿodÿSÙ¨Ä×ÿæúbÿ¿°ÿÿãÛÿc_äq(¦Û ƒ¾kl²+ò=|娻 ä �á»ÇÈka� ,4²ÂŸåB.ûiÄú¡æÉ±‘ðC^½¸jC©Q¸¸ñÄÝ{†…̺q´‹�5¶©#l{…6÷d8:#O,¯`ü¹RÓ?+aªã8Ñë�/½V7Yt[ð0Ï`ŒAq(báÃdÊï¡`ìq�Bàø’Yö$p2yÑjk]�ñÕgüDóñøñ Œ!A…pª hüN ±Z0>®H×§íùU£2f¿†ùª¶ÆL˜²ãÕKI¸ÓÊ! ¥4HÓå¾pÛ%ƒœUº£ñ’XZ~µó#üÛt¿ $¢Ì*Û�ò¤åüŽ2In#éSÂR;GB«ã"E}ɾٜ“1~ŠÇyE5ñ«0ŒF…�O…: ! R�D¡B´ñ WäØÉÄ™|bȯx…³°ÿyûŸÃƒÆqíèÿ= þ_YÛŒ¿ÿ¸ZÙXø<ÈŸEƒÄˆ@ #<øE)"¹bWt&:ù©×ëÑU�d¤J`ì½ÞdÅeK÷*˜ºa“¤¢hý‚¿}÷ ï)>%º98Y^ýÙEì�úÈ2Ƨõˆaäð U1‘Õ Ô �=½G’“w ȧZ/| Zé´‚I¯�žMX7¯dœÚ,~ñ † ’ÙG ´Œ± @XˆÂ0¯XJèÐÇ!4(:ŠŒ‹³¡Û ƒÎ•RX‰Õ�ß° aH#Š2Ç7¬ØŽ2Ä _0)ŽFÅU-- gglÄÃí#ñÇ¥Œ5– аq%0EÐû1L§;u©†Ñz3Ï.òÑfp‰îñMÚ(ÆŸ`„Á�B†@«¤ÂÁì ÎþÁqM¿«7ćÚÞ^U˜èÁóvdý„ŠGú–šY=©"Fx{õWG;G?c2ÓI‰�¼Aû ¨eô˜Ý(ðÛ–ô€Ï�›€E Y#03YÝ9Ê"˜&錥Jã‘s%°EŠz;§Átpš€RäÙwÓ¡¡L …-¥´wÅ …Hò‰Q4±áѱ>Jó t£Hfà!#FÒ–; E‚Ÿ=Šˆs…þ=Åq¼98?œ‰ú>|}¿s\?دD 3 ¤í h+ ´ƒ�PÌ ô6Åà ÒÅ{"·#Óè@‘錂 è·†Y)ëCŽ мwVUO!c˜W"4ŠU!y…�ñ1¼q«à`fX]>`oìu&=}(�ÂÉPÌÅá•V®îüSÐ ./anlpasswd ypcat passwd | grep # again to see that it worked. MCS Systems Group Mathematics & Computer Science Division Argonne National Laboratory Argonne, Illinois Email: systems@mcs.anl.gov