phamm-0.6.2/0000755000175300017530000000000012310633777011626 5ustar phammphammphamm-0.6.2/config.inc.php0000644000175300017530000001140412310633777014354 0ustar phammphamm * Copyright (C) 2004,2008 Alessandro De Zorzi and Mirko Grava * Project sponsored by RHX Studio Snc - www.rhx.it * * Phamm is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Phamm is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /** * The main Phamm config file * * @package Phamm * @subpackage configuration * @author Alessandro De Zorzi **/ // *============================* // *=== LDAP Server Settings ===* // *============================* // The server address (To use ldapssl change to ldaps://localhost) define ('LDAP_HOST_NAME','localhost'); // The protocol version [2,3] define ('LDAP_PROTOCOL_VERSION','3'); // The server port (To use ldapssl change to 636) define ('LDAP_PORT','389'); // Set LDAP_TLS to 1 if you want to use TLS define ('LDAP_TLS',0); // The container define ('SUFFIX','dc=example,dc=tld'); // The admin bind dn (could be rootdn) define ('BINDDN','cn=admin,dc=example,dc=tld'); // The Phamm container define ('LDAP_BASE','o=hosting,dc=example,dc=tld'); // *============================* // *=== Layout Settings ===* // *============================* // Page title define('ORG_TITLE','Phamm'); // URL define('ORG_URL','http://www.phamm.org'); // Logo define('ORG_LOGO', './img/phamm_logo.svg'); // CSS Style $style = 'phamm'; // Default language define ('DEFAULT_LANGUAGE','en_GB'); // The languages available $supported_languages = array(); $supported_languages["de_DE"] = "Deutsch"; $supported_languages["en_GB"] = "English"; $supported_languages["es_ES"] = "Español"; $supported_languages["fr_FR"] = "French"; $supported_languages["hu_HU"] = "Hungarian"; $supported_languages["it_IT"] = "Italiano"; $supported_languages["pl_PL"] = "Polish"; $supported_languages["ru_RU"] = "Russian"; $supported_languages["vi_VN"] = "Tiếng Việt"; // Vietnamese $supported_languages["da_DK"] = "Dansk"; // Danish $supported_languages["pt_BR"] = "Portuguese"; // $supported_languages["ll_CC"] = "Your language here"; // This TLDs menu $tld = array(); $tld[] = ".com"; $tld[] = ".org"; $tld[] = ".net"; // $tld[] = ".biz"; // $tld[] = ".info"; // $tld[] = ".eu"; // $tld[] = ".it"; // $tld[] = ".fr"; // $tld[] = ".de"; // *============================* // *=== Plugins Settings ===* // *============================* // The default plugin define ('DEFAULT_PLUGIN','mail'); // This array contains the active plugins // NOTE the display order reflect this order $plugins = array(); $plugins[] = "mail"; $plugins[] = "alias"; //$plugins[] = "dns"; //$plugins[] = "ftp"; //$plugins[] = "proxy"; //$plugins[] = "radius"; //$plugins[] = "radius_stats"; //$plugins[] = "rates"; //$plugins[] = "person"; //$plugins[] = "jabber"; //$plugins[] = "davical"; // Account can be mail OR alias $plugins_exclusion = array("mail","alias"); // *============================* // *=== System Settings ===* // *============================* // Phamm Version (+ indicate a SVN version) define ('VERSION','0.6.2'); // Useful if you want hide the version [0,1] define ('HIDE_VERSION',0); // Useful if you wish force SSL through PHP [0,1] define ('FORCE_SSL',0); // Min password length define ('PASSWORD_MIN_LENGHT',3); // Seconds after refresh page define ('REFRESH_TIME',1); // A Domain administrator (example: postmaster) define ('PHAMM_DOMAIN_ADMIN_NAME','postmaster'); // Welcome message define ('SEND_WELCOME',0); $welcome_msg = '../welcome_message.txt'; $welcome_subject = 'Welcome!'; # $welcome_sender = 'postmaster@localhost'; # $welcome_bcc = 'postmaster@localhost'; // *============================* // *=== Advanced Settings ===* // *============================* // Debug level [0,1] define ('DEBUG',0); // PHP Error Level [0,1,2,10] define ('ERROR_LEVEL',2); // Log level 0->don't log [0,1,2] define ('PHAMM_LOG',0); // Log file path define ('LOG_FILE','/var/log/phamm.log'); // Standard LDAP encryption type [CRYPT,MD5,CLEAR] define ('ENC_TYPE','CRYPT'); // Phamm autogenerate UID from e-mail // set char used instead @ (default=.) // i.e. info@example.com produce UID=info.example.com define ('CHR_UID_ACCOUNT','.'); // Permit login without @domain (use it with carefull) // define ('DEFAULT_DOMAIN','example.tld'); phamm-0.6.2/INSTALL0000644000175300017530000001466612256607224012671 0ustar phammphamm;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Phamm - INSTALL ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Copyright (c) 2005-2009 Alessandro De Zorzi, Mirko Grava http://www.phamm.org/ Project sponsored by RHX Studio Snc - www.rhx.it Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SECTIONS 0. PRELIMINARY 0.1 Prepare the files 0.2 Requirements 0.2.1 optional requirements required for email 0.2.2 optional requirements for ftp 0.3 Contents 1. LDAP 1.1 Schema 1.2 Change phamm password 1.3 Populate 1.3.1 populate plugin support 2. PHAMM CONFIGURATION 2.1 Config files 3. MAIL SERVICES 3.1 config postfix 3.2 config courier 3.3 config amavis 3.4 config gnarwl 3.5 cleaner.sh script 0. PRELIMINARY ^^^^^^^^^^^^^^ 0.1 Prepare the files Untar the archive tar xvfz phamm-X.X.X.tar.gz Put the directory phamm-X.X.X in a web accessible directory: (Example: mv phamm /var/www/) or configure httpd to use Alias. You can obtain for make accessible from web only the sub-directory phamm/www-data. 0.2 Requirements web server (tested with Apache) php4 or php5 with ldap extension enable (php-ldap php4-ldap...) OpenLDAP (recommend openldap 2.1 or 2.2) Webbrowser (doh!) 0.2.1 optional requirements required for email postfix email server pop3/imap: severs (that support ldap) examples: cyrus,courier. (tested with apache) gnarwl: for autoresponding:(to first user email) amavisd: for anti-virus/anti-spam: spamassassain clam-av or similar av-software (tested with Clam-AV) net::ldap cpan modules 0.2.2 optional requirements for ftp pure-ftpd pure-ftpd-ldap-backend 0.3 Contents In the examples folder you can find examples of all the configuration files for each server section outlined below. Please remember these are examples and they will have to be edited to suit your own personal requirements. 1. LDAP ^^^^^^^ 1.1 Schema Copy schema/phamm.schema file in your schema directory (ex. /etc/ldap/schema/ for Debian). Probably you need other schema files, you can copy they from respective projects or from http://open.rhx.it/phamm/schema/ amavis.schema dnsdomain2.schema ISPEnv2.schema pureftpd.schema radius.schema samba.schema Copy examples/conf/slapd/slapd.conf to override your slapd.conf (ex. /etc/ldap/ for Debian or /etc/openldap). Add YOUR password for the cn admin with the command slappasswd. The slapd.conf has the loglevel set to 0. For debugging set it to 128 or start slapd with /usr/sbin/slapd -d1 as this will display to screen and save you the trouble of searching your log files for problems. For improve security we suggest to use Phamm LDAP ACL definition if you do not use already ACL please copy examples/conf/phamm/phamm.acl in the same place of the slapd.conf (ex. /etc/ldap/ for Debian or /etc/openldap) otherwise comment the line below in your slapd.conf # include /etc/ldap/phamm.acl restart LDAP service 1.2 Change phamm password Create the password you want for the cn phamm with slappasswd and amend it in the examples/ldif/sample-mail.ldif (the default is rhx) with cut & paste :). 1.3 Populate ldapadd -v -x -D "cn=admin,dc=example,dc=tld" -W -h localhost -f examples/ldif/sample-main.ldif The password is the first one you created. 1.3.1 populate plugin support If you wish to use mail and DNS plugin: ldapadd -v -x -D "cn=admin,dc=example,dc=tld" -W -h localhost -f examples/ldif/sample-mail.ldif 2. PHAMM CONFIGURATION ^^^^^^^^^^^^^^^^^^^^^^^ 2.1 Config files Create the main config file in phamm directory from the sample: cp config.inc.example.php config.inc.php Then edit config.inc.php. 2.1.1 Config file (plugin support) If you wish to use the plugin, please decomment each line you want in $plugins[] lines Example: $plugins = array(); $plugins[] = "mail"; $plugins[] = "alias"; //$plugins[] = "ftp"; 3. SETTING MAIL SERVICES ^^^^^^^^^^^^^^^^^^^^^^^^^^ There are a couple of excellent general examples of how to setup postfix and courier below these should assist with a more detailed discription of what you find below. http://www.postfix.org/addon.html http://www.faqs.org/docs/Linux-HOWTO/LDAP-Implementation-HOWTO.html#AEN747 http://alinux.washcoll.edu/docs/plc/postfix-courier-howto.html 3.1 config postfix install postfix as a full internet email server, and then add the snips that are in the samples directory to the relevent parts of the postfix configuration files, remember to reload postfix after making the changes (most postfix configuration files are found in /etc/postfix) ensure the user vmail and the group vmail have been added. if not add them and remember the gid and uid as you need it here and in courier config don't forget to update your transport file and the transport.db file this is required. postmap /etc/postfix/transport test this by logging into smtp and sending a mail to yourself (then when you set up courier you should have the mail awaiting you) log with /etc/init.d/postfix start; tail -f /var/log/mail.log 3.2 config courier check that authdaemonrc is using ldap as a method to authenicate ie (authmodulelist=ldap), add the snips from the samples folder to the relevent file (normally found in /etc/courier) these files are authldap (configuration of ldap server) test by logging into your pop or imap server and collecting the mail that you sent to your self in setting up postfix. /etc/init.d/courier-authdaemonrc start; tail -f /var/log/mail.log 3.3 config amavis add the amavis sample data to your amavis.conf file. restart the services and check the logs for dependancies) 3.4 config gnarwl add the sample gnarwl.cfg snip to you gnarwl.cfg. (this normally lives in /etc/gnarwl.cfg) set debug to 3 and test. don't forget to set debug back again when working. 3.5 cleaner.sh script Edit the cleaner.sh script to reflect the your ldap layout. Phamm does not really delete accounts. Phamm mark them as "Deleting". You can use tools/cleaner.sh to do this with crond. phamm-0.6.2/PHAMM-LOGO-USE.POLICY0000644000175300017530000000105712256607224014601 0ustar phammphamm;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Phamm - LOGO USE POLICY ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Phamm logo created by Alessandro De Zorzi Copyright (c) 2004 Alessandro De Zorzi - - www.rhx.it PHAMM USE LOGO POLICY Phamm logo or a modified version may be used by anyone to refer to the Phamm project, but does not indicate endorsement by the project. Note: we would appreciate that you make the image a link to http://www.phamm.org/ if you use it on a web page. phamm-0.6.2/views/0000755000175300017530000000000012310633771012755 5ustar phammphammphamm-0.6.2/views/helpers.php0000644000175300017530000011717712310633125015137 0ustar phammphamm * Copyright (C) 2004,2008 Alessandro De Zorzi and Mirko Grava * * This file is part of Phamm. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ function page_start() { global $action; header('Content-type: text/html; charset=utf-8'); $tag = ''."\n"; $tag .= ''."\n"; $tag .= ''."\n"; $tag .= "\t".''.ORG_TITLE; if (isset($action)) $tag .= ' - '.str_replace('_',' ',$action); $tag .= ''."\n"; #$tag .= "\t".''."\n"; $tag .= "\t".''."\n"; $tag .= "\t".''."\n"; $tag .= "\t".''."\n"; $tag .= "\t".''."\n"; $tag .= "\t".''."\n"; $tag .= ''."\n"; $tag .= ""."\n"; $tag .= '
'."\n"; return $tag; } function page_end() { $tag = ''."\n"; $tag .= '
'."\n"; $tag .= ''."\n"; $tag .= ''."\n"; return $tag; } function page_exit() { $tag = ''."\n"; $tag .= ''."\n"; $tag .= ''."\n"; return $tag; } /** * Simple login form **/ function login_form() { if (isset($_POST["login_username"])) $login_username = $_POST["login_username"]; else $login_username = null; $tag = ''; $tag .= '
'; $tag .= '
"."\n"; if (HIDE_VERSION != 1) { $tag .= ""; $tag .= sprintf(_("Ver. %s"),VERSION); $tag .= ""."\n"; } return $tag; } /** * Set the style name **/ function style_set() { $style = 'phamm'; return $style; } /** * Prepare XHTML tag CSS style **/ function style_load($style) { return true; } /** * Prepare a XHTML domains list (attributes are plugin related) * * @param array $vds The domains * @param array $values The attributes * @return mixed **/ function domains_list($vds,$values) { $tag = '
'; $tag .= ''; $tag .= ''; $tag .= ''; $tag .= ''; $tag .= ''."\n"; if (isset($values["ATTRIBUTES"])) { foreach ($values["ATTRIBUTES"] as $key=>$value) { // Show only attributes with
'; $tag .= sprintf(ngettext("Domain %d", "Domains %d", $vds["count"]), $vds["count"]); $tag .= '
value if (isset($values["ATTRIBUTES"][$key]["TABLE"])) { $label = (isset($values["ATTRIBUTES"][$key]["PRETTYNAME"]) ? $values["ATTRIBUTES"][$key]["PRETTYNAME"] : $key); $tag .= ''."\n"; } } } $tag .= ''; $tag .= ''; $tag .= ''; foreach ($vds as $vd) { $domain = $vd["vd"][0]; if ($domain) // @todo primo valore null? { $postmaster = PhammLdap::phamm_search ('vd='.$domain.','.LDAP_BASE,'cn=postmaster'); $domain_values = PhammLdap::phamm_search ('vd='.$domain.','.LDAP_BASE,'vd='.$domain); $tag .= ''; // Group action checkbox $tag .= ''; // Domain name and link $tag .= ''; // Other attributes (current plugin) if (isset($values["ATTRIBUTES"])) { foreach ($values["ATTRIBUTES"] as $key => $value) { $reverse = (isset($values["ATTRIBUTES"][$key]["REVERSE"]) ? 1 : null); $cron = (isset($values["ATTRIBUTES"][$key]["CRON"]) ? 1 : null); if (isset($values["ATTRIBUTES"][$key]["TABLE"])) { $key_lower = strtolower($key); $tag .= '
'.gettext($label).'
'; $tag .= ''.$domain.''; $tag .= ''; // Show only attributes with value if (isset($domain_values[0][$key_lower][0])) { // The value $val = $domain_values[0][$key_lower][0]; // The reverse values $rev = ($val == 'TRUE' ? 'FALSE' : 'TRUE'); if (isset($values["ATTRIBUTES"][$key]["TABLENOEDIT"])) $tag .= $val; elseif (isset($values["ATTRIBUTES"][$key]["BOOL"])) $tag .= tof_icon('domains['.$domain.']',$val,'group_actions&command=domain;'.$key.';'.$rev,$reverse,$cron); else $tag .= $val; } elseif (isset($postmaster[0][$key_lower][0])) { // The value $val = $postmaster[0][$key_lower][0]; // The reverse values $rev = ($val == 'TRUE' ? 'FALSE' : 'TRUE'); if ($val == 'TRUE' || $val == 'FALSE') $tag .= tof_icon('domains['.$domain.']',$val,'group_actions&command=postmaster;'.$key.';'.$rev,$reverse,$cron); else $tag .= $val; } $tag .= ''; } } } $tag .= ''; } } $tag .= ''; $tag .= '
'; // End tag inside action_select() function return $tag; } /** * **/ function accounts_list($domain,$values,$initial, $domain_val) { global $pn; global $pv; global $action; // Rapresentative ObjectClass $myObjectClass = (isset($pv[$pn]["ACCOUNT"]["OBJECTCLASSES"]) ? key($pv[$pn]["ACCOUNT"]["OBJECTCLASSES"]) : 'virtualMailAccount'); if (isset($initial)) $account_array = PhammLdap::phamm_search ('vd='.$domain.','.LDAP_BASE,'(&(objectClass='.$myObjectClass.')(!(cn=postmaster))(!(mail=abuse@*))(mail='.$initial.'*))'); else $account_array = PhammLdap::phamm_search ('vd='.$domain.','.LDAP_BASE,'(&(objectClass='.$myObjectClass.')(!(cn=postmaster))(!(mail=abuse@*)))'); $max_account = ($pn == 'alias' ? $domain_val[0]["maxalias"][0] : $domain_val[0]["maxmail"][0]); $tag = '
'; $tag .= ''; $tag .= ''; $tag .= ''; $tag .= ''; $tag .= ''."\n"; $tag .= ''."\n"; if (count($values) > 0) { foreach ($values["ATTRIBUTES"] as $key=>$value) { if (isset($values["ATTRIBUTES"][$key]["TABLE"])) { $label = (isset($values["ATTRIBUTES"][$key]["PRETTYNAME"]) ? $values["ATTRIBUTES"][$key]["PRETTYNAME"] : $key); $tag .= ''."\n"; } } } $tag .= ''; $tag .= ''; $tag .= ''; foreach ($account_array as $account) { $mail = $account["mail"][0]; if (isset($mail)) // @todo empty row { $tag .= ''; // Group action checkbox $tag .= ''; // Account name and link $tag .= ''; $tag .= ''; // Other attributes (current plugin) if (isset($values["ATTRIBUTES"])) { foreach ($values["ATTRIBUTES"] as $key=>$value) { $reverse = (isset($values["ATTRIBUTES"][$key]["REVERSE"]) ? 1 : null); $cron = (isset($values["ATTRIBUTES"][$key]["CRON"]) ? 1 : null); if (isset($values["ATTRIBUTES"][$key]["TABLE"])) { $key_lower = strtolower($key); $tag .= ''."\n"; } } } $tag .= ''."\n"; } } $tag .= ''; $tag .= '
'; if (isset($max_account)) $tag .= sprintf(ngettext("Account %d/".$max_account."", "Accounts %d/".$max_account."", $account_array["count"]), $account_array["count"]); else $tag .= sprintf(ngettext("Account %d", "Accounts %d", $account_array["count"]), $account_array["count"]); $tag .= ''._("Common Name").''.gettext($label).'
'; $tag .= $mail; $tag .= ''.stripslashes($account["cn"][0]).''; if (isset($account[$key_lower][0])) { $val = $account[$key_lower][0]; $rev = ($val == 'TRUE' ? 'FALSE' : 'TRUE'); if (isset($values["ATTRIBUTES"][$key]["TABLENOEDIT"])) $tag .= $val; elseif (isset($values["ATTRIBUTES"][$key]["BOOL"])) $tag .= tof_icon('accounts['.$mail.']',$val,'group_actions&command=account;'.$key.';'.$rev,$reverse,$cron); // Print Standard Value else { if (isset($value["MULTIPLIER"]) && in_array($action,array('modify_account','domain_property','domain_view'))) $tag .= $account[$key_lower][0] / $value["MULTIPLIER"]; else $tag .= $val; } } $tag .= '
'; return $tag; } /** * **/ function form_add_domain () { $tag = ''; $tag .= ''; $tag .= '
'; $tag .= ''; $tag .= ''; return $tag; } /** * Create a XHTML form for plugin attribute * * @author Alessandro De Zorzi * * @param string $p_name The plugin name * @param array $attributes The attributes * @return mixed **/ function form_template($p_name,$attributes,$myvalues,$skip_table=null) { global $action; global $minAuthLevel; $tag = ''; if (!isset($skip_table)) $tag .= ''; if (is_array($attributes)) foreach ($attributes as $key => $attr) { if (!isset($hidden)) $tag .= '"; } // Exception, if last array attribute is hidden // XHTML Syntax required to close a TR if (isset($hidden)) $tag .= ""; if (!isset($skip_table)) $tag .= "
'; // Set attributes $name = strtolower($key); $hidden = (isset($attr["HIDDEN"]) ? 'type="hidden"' : null); $minAuthLevel = (isset($attr["MINAUTHLEVEL"]) ? $attr["MINAUTHLEVEL"] : 0); $size = (isset($attr["SIZE"]) && !isset($attr["HIDDEN"]) ? 'size="'.$attr["SIZE"].'"' : null); $maxlength = (isset($attr["MAXLENGHT"]) ? strtolower($attr["MAXLENGTH"]) : null); $subordinated = (isset($attr["SUBORDINATED"]) ? strtoupper($attr["SUBORDINATED"]) : null); $subordinatedreverse = (isset($attr["SUBORDINATEDREVERSE"]) ? strtoupper($attr["SUBORDINATEDREVERSE"]) : null); // Set XHTML Tags $required = (isset($attr["REQUIRED"]) ? ' *' : null); // Set Default value $value = ''; // Set standard value if (isset($myvalues[$p_name][$name])) $value = $myvalues[$p_name][$name]; // Existing value elseif (isset($myvalues[0][$name][0])) { // If attr is multiple if (isset($attr["MULTIPLE"])) $value = $myvalues[0][$name]; else $value = $myvalues[0][$name][0]; } // Multiplier (Ex. Quota x 1024) if (isset($attr["MULTIPLIER"]) && in_array($action,array('modify_account','domain_property'))) { $value = ( $value / $attr["MULTIPLIER"]); } // Action add_account elseif (isset($attr["DEFAULT"]) && ($action == 'add_account' || $action == 'add_domain')) { if (preg_match('/^=php\.(\w+)\((.*)\)$/',$attr["DEFAULT"],$matches)) { $args = preg_split('/,/',$matches[2]); $function_name = $matches[1]; switch ($function_name) : case "Value" : foreach ($args as $arg) { // Global vars if (preg_match('/^%(\w+)(\|.+)?(\/[lU])?%/U',$arg,$matches)) { $var_name = $matches[1]; global $$var_name; $value .= $$var_name; } // POST vars elseif (preg_match('/^\+(\w+)(\|.+)?(\/[lU])?\+/U',$arg,$matches)) { $var_name = $matches[1]; $value .= $_POST[$var_name]; } else $value .= $arg; } break; // Call PHP Function default : if (function_exists($function_name)) { // Escape a string to be used as a shell argument foreach ($args as $arg) $args_escaped = escapeshellarg($arg); $value = call_user_func_array($function_name,$args_escaped); } break; endswitch; } else { $value = $attr["DEFAULT"]; } } // Hide values if SUBORDINATED to another if (isset($attr["SUBORDINATED"])) { if (isset($myvalues[0][strtolower($subordinated)][0])) $hidden = ($myvalues[0][strtolower($subordinated)][0] == "TRUE" ? null : 1); elseif (isset($myvalues[$p_name][strtolower($subordinated)])) $hidden = ($myvalues[$p_name][strtolower($subordinated)] == "TRUE" ? null : 1); else $hidden = 1; } if (isset($attr["SUBORDINATEDREVERSE"])) { if (isset($myvalues[0][strtolower($subordinatedreverse)][0])) $hidden = ($myvalues[0][strtolower($subordinatedreverse)][0] == "FALSE" ? null : 1); elseif (isset($myvalues[$p_name][strtolower($subordinatedreverse)])) $hidden = ($myvalues[$p_name][strtolower($subordinatedreverse)] == "FALSE" ? null : 1); else $hidden = 1; } if (!isset($hidden)) { $label = (isset($attr["PRETTYNAME"]) ? $attr["PRETTYNAME"] : $key); $tag .= gettext($label); $tag .= $required; $tag .= ""; } if (isset($attr["BOOL"]) && !isset($hidden)) { $reverse = (isset($attr["REVERSE"]) ? 1 : null); $tag .= trueorfalse("values[".$p_name."]",$value,$name,$reverse); } // Options (select) elseif (isset($attr["OPTIONS"]) && !isset($hidden)) { if ($_SESSION["login"]["level"] < $minAuthLevel) $tag .= $value; else { $tag .= ''."\n\n"; } } elseif (isset($attr["DATE"]) && !isset($hidden)) { $current_date = ($value ? $value : date('Y'.'-'.'m'.'-'.'d')); if ($_SESSION["login"]["level"] < $minAuthLevel) $tag .= $value; else $tag .= date_input('values_date['.$p_name.']['.$name.']',$current_date,$format='ymd'); } elseif (isset($attr["TEXTAREA"]) && !isset($hidden)) { if ($_SESSION["login"]["level"] < $minAuthLevel) $tag .= nl2br($value); else { // Show box to add multiple values $tag .= '
"; } } elseif (isset($attr["MULTIPLE"]) && !isset($hidden)) { // Show box to add multiple values $tag .= '
"; // Show the values if (is_array($value)) { for ($i=0; $i < $value["count"]; $i++) { $tag .= ''; $tag .= $value[$i]."
"; } } } elseif (isset($attr["SUBORDINATEDDELETE"]) && $value) { $tag .= ''; $tag .= $value."
"; } else { if (isset($hidden)) $input_type = 'hidden'; else $input_type = 'text'; // Show Value Only if auth level > level required if ($_SESSION["login"]["level"] >= $minAuthLevel) $tag .= ''; elseif (!isset($hidden)) $tag .= $value; } if (!isset($hidden)) $tag .= "
"; return $tag; } /** * Print a form to add or modify a domain * * @package Phamm * @author Alessandro De Zorzi * * @param string $domain_new * @param string $action * @param array $values * @return mixed **/ function form_add_domain_2 ($domain_new, $action, $values, $values_postmaster) { global $plugins; global $pv; global $domain; if (in_array($action,array('update_account','modify_account'))) $submit_label = _("Modify domain"); else $submit_label = _("Add new domain"); $tag = '
'; $tag .= '
'; $tag .= '

'._("Domain").' '.$domain_new.'

'; $tag .= '
'; $tag .= '
'."\n"; $tag .= ''."\n"; $tag .= ''."\n"; $tag .= ''."\n"; $tag .= ''."\n"; $tag .= ''."\n"; $tag .= ''."\n"; $tag .= ''."\n"; foreach ($pv as $name => $p_value) { if ($p_value["ISDOMAINRELATED"]) { $class = 'pluginActive'; $tag .= ''."\n"; } } $tag .= '
'._("Password").'
'._("Confirm Password").'
'."\n"; $tag .= ''."\n"; $tag .= ''.$p_value["LABEL"].''."\n"; $tag .= ''."\n"; // Load domain values if (isset($p_value["DOMAIN"]["ATTRIBUTES"])) { $tag .= form_template('domain',$p_value["DOMAIN"]["ATTRIBUTES"],$values)."\n"; } if (isset($p_value["POSTMASTER"]["ATTRIBUTES"])) { $tag .= form_template($name,$p_value["POSTMASTER"]["ATTRIBUTES"], $values_postmaster)."\n"; } $tag .= '
'."\n"; $tag .= ''."\n"; $tag .= '
'."\n"; $tag .= '
'."\n"; $tag .= '
'."\n"; return $tag; } /** * **/ function form_add_account () { global $domain; $tag = '
'."\n"; $tag .= ''."\n"; $tag .= '
'."\n"; $tag .= ''; $tag .= ' '."\n"; $tag .= '
'."\n"; $tag .= '
'."\n\n"; return $tag; } /** * **/ function form_add_account_2 ($account_new,$action,$values) { global $plugins; global $pv; global $pn; global $domain; global $givenName; global $sn; #global $values; global $plugins_exclusion; if (in_array($action,array('modify_account','update_account'))) $submit_label = _("Modify account"); else $submit_label = _("Add new account"); $tag = '
'; $tag .= '
'; $tag .= '

'._("Account").' '.$account_new.'

'; $tag .= '
'; $tag .= '
'."\n"; $tag .= ''."\n"; $tag .= ''."\n"; $tag .= ''."\n"; $tag .= ''."\n"; $tag .= ''."\n"; $tag .= ''."\n"; $tag .= ''."\n"; $tag .= ''."\n"; $tag .= ''."\n"; $tag .= ''."\n"; $tag .= ''."\n"; $i = 0; foreach ($pv as $name => $p_value) { // Skip form if plugin is defined in $plugins_exclusion (mail||alias) if (in_array($name,$plugins_exclusion)) { // Search if the firsh OBJECTCLASSES defined in XML is present if (in_array($action,array('modify_account','update_account'))) { if (isset($values[0]["objectclass"])) $show_form = (in_array(key($p_value["ACCOUNT"]["OBJECTCLASSES"]),$values[0]["objectclass"]) ? true : false); else $show_form = isset($values[$name]); } else $show_form = ($name == $pn || !in_array($pn,$plugins_exclusion) ? true : false); } else $show_form = true; if ($show_form) if ($p_value["ISACCOUNTRELATED"]) { $tag .= ''."\n"; } } $tag .= '
'._("Password").'
'._("Confirm Password").'
'._("Name").' *
'._("Surname").' *
'."\n"; if (in_array($name,$plugins_exclusion)) $tag .= ''."\n"; else $tag .= ''."\n"; $tag .= ''.$p_value["LABEL"].''."\n"; $tag .= ''."\n"; $tag .= form_template($name,$p_value["ACCOUNT"]["ATTRIBUTES"],$values)."\n"; $tag .= '
'."\n"; $tag .= ''."\n"; $tag .= '
'."\n"; $tag .= '
'."\n"; $tag .= '
'."\n"; return $tag; } /** * Print a navigation bar with letters capital * * @package Phamm * @author Alessandro De Zorzi **/ function navigation ($initial) { global $domain; global $account; global $mail; global $action; $tag = ''."\n"; return $tag; } $tag .= '
    '."\n"; $all_class = (!$initial ? 'active' : ''); $tag .= '
  • '._("All").'
  • '."\n"; for ($i="A"; $i != "AA"; $i++) { if ($i == $initial) $tag .= '
  • '.$i.'
  • '; else { $tag .= '
  • '.$i.'
  • '; } } for ($i='0'; $i != '10'; $i++) { if ($i == $initial) $tag .= '
  • '.$i.'
  • '."\n"; else { $tag .= '
  • '.$i.'
  • '."\n"; } } $tag .= '
'."\n"; $tag .= '
'."\n\n"; return $tag; } /** * @author Alessandro De Zorzi * * @return mixed **/ function trueorfalse($table,$value,$field,$reverse) { global $minAuthLevel; $tag = ''; if (isset($reverse)) { $false = 'TRUE'; $true = 'FALSE'; $img = ($value == 'TRUE' ? 'FALSE' : 'TRUE'); } else { $false = 'FALSE'; $true = 'TRUE'; $img = ($value == 'TRUE' ? 'TRUE' : 'FALSE'); } $false_label = ($false == 'FALSE' ? _("NO") : _("YES")); $true_label = ($true == 'TRUE' ? _("YES") : _("NO")); if ($_SESSION["login"]["level"] >= $minAuthLevel) { $js_string = ($field == 'vacationactive' ? 'onchange="subordinatedelete.checked=true;"' : ''); $tag .= '"."\n\n"; } else { $tag .= ($value=='TRUE' ? $true_label : $false_label); } return $tag; } /* * */ function action_select($dispaly) { global $pv; $group_actions = array(); // Alias require immediate cancellation if ($_SESSION["phamm"]["pn"] == 'alias') $group_actions[] = "account;delete;TRUE;Delete;0"; $attribute_array = array(); $p_active = $_SESSION["phamm"]["pn"]; $values = ($pv[$p_active]); if ($dispaly == 'domain') { if (isset($values["DOMAIN"]["ATTRIBUTES"])) $attribute_array = array_merge($attribute_array,$values["DOMAIN"]["ATTRIBUTES"]); if (isset($values["POSTMASTER"]["ATTRIBUTES"])) $attribute_array = array_merge($attribute_array,$values["POSTMASTER"]["ATTRIBUTES"]); } elseif ($dispaly == 'account') { if (isset($values["ACCOUNT"]["ATTRIBUTES"])) $attribute_array = array_merge($attribute_array,$values["ACCOUNT"]["ATTRIBUTES"]); } foreach ($attribute_array as $attribute_name => $attribute_values) { $is_bool = (isset($attribute_values["BOOL"]) ? $attribute_values["BOOL"] : null); $is_table = (isset($attribute_values["TABLE"]) ? $attribute_values["TABLE"] : null); $prettyname = (isset($attribute_values["PRETTYNAME"]) ? $attribute_values["PRETTYNAME"] : $attribute_name); $is_reverse = (isset($attribute_values["REVERSE"]) ? 1 : 0); if ($is_bool && $is_table) { $group_actions[] = $dispaly.';'.$attribute_name.';TRUE;'.$prettyname.';'.$is_reverse; $group_actions[] = $dispaly.';'.$attribute_name.';FALSE;'.$prettyname.';'.$is_reverse; } } // Open
tag inside domains_list() function $tag = ''; $tag .= ''."\n"; $tag .= '
'; $tag .= '"; $tag .= "
"; $tag .= ''."\n"; $tag .= "
"."\n\n"; return $tag; } /* * */ function tof_icon($table,$value,$tof_action,$reverse=null,$cron=null) { if (isset($reverse)) $value = ($value == 'TRUE' ? 'FALSE' : 'TRUE'); if (isset($cron) && $value == 'TRUE') $value = 'waiting'; switch (strtolower($value)): case "true" : $bt_class = 'label-success'; break; case "false" : $bt_class = 'label-default'; break; case "waiting" : $bt_class = 'label-warning'; break; endswitch; $tag = ''; $tag .= ''; $tag .= ''.strtoupper($value).''; $tag .= ''; return $tag; } /** * Format date input with select YYYY-MM-DD **/ function date_input($name,$current_date,$format='ymd') { $tag = ''; if(preg_match("/-/", $current_date)) { list($year,$month,$day) = explode("-", $current_date); } else { $year = substr($current_date,0,4); $month = substr($current_date,4,2); $day = substr($current_date,6,2); } // Days $tag .= '"; // Months $tag .= '"; // Years $this_year = date('Y'); $min_year = ( $this_year - 1 ); $max_year = ( $this_year + 4 ); $tag .= '"; return $tag; } /** * Create a select with languages **/ function locale_select() { global $locale; global $supported_languages; $tag = '
'; $tag .= '\n"; $tag .= "
\n\n"; return $tag; } function form_catch_all($domain) { $tag = '
'._("Catch-all").'
'; $tag .= '
'."\n"; $tag .= ''."\n"; $tag .= ''."\n"; $tag .= ''."\n"; $tag .= ''."\n"; $tag .= ''."\n"; $tag .= ''."\n"; $tag .= ''."\n"; $tag .= ''."\n"; $tag .= '
'; $tag .= ''."\n"; $tag .= '
'."\n"; return $tag; } /* * Generate the plugin menu * * @author Alessandro De Zorzi * @return mixed */ function plugins_menu () { global $plugins; global $pv; global $action; $tag = ''."\n\n"; return $tag; } /* * @author Alessandro De Zorzi * * @param string $date_format * @return string **/ function phamm_date($date_format) { switch ($date_format) { case "test" : // YYYY-MM-DD return date(Ymd); break; default : // YYYY-MM-DD return date(Ymd); break; } } /** * Set the PHP ERROR_LEVEL * * @package Phamm * @author Alessandro De Zorzi * * @constant int ERROR_LEVEL * @return mixed **/ function phamm_php_error_level () { // Set PHP error level one of 0,1,2,10 if (ERROR_LEVEL == 0) { error_reporting(E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR); } elseif (ERROR_LEVEL == 1) { error_reporting(E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR); } elseif (ERROR_LEVEL == 2) { error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED); } if (ERROR_LEVEL == 10) { error_reporting(E_ALL); } } /** * Set Phamm var * * @param string $name The variable name * @param array $values Possible values * @param string $methods @todo * @param int $level * @return mixed **/ function phamm_set_var($name, $values=null, $methods=null, $level=0) { if (isset($_GET[$name])) { if ($_GET[$name] == 'NONE') $_SESSION["phamm"][$name] = null; else $_SESSION["phamm"][$name] = $_GET[$name]; } elseif (isset($_POST[$name])) $_SESSION["phamm"][$name] = $_POST[$name]; // Prevent non wanted values if (is_array($values) && !in_array($_SESSION["phamm"]["$name"],$values)) return null; if (isset($_SESSION["phamm"][$name])) return $_SESSION["phamm"][$name]; return null; } function phamm_print_message ($class,$message,$newline=false,$type="alert") { switch ($class) : case "error" : $bt_class = $type.' '.$type.'-danger'; $msg = _('Error: ').$message; break; case "warning" : $bt_class = $type.' '.$type.'-warning'; $msg = _('Warning: ').$message; break; default : $bt_class = $type.' '.$type.'-info'; $msg = $message; break; endswitch; echo '
'.$msg.'
'; } function phamm_print_xhtml ($tag) { echo $tag; } /** * Refresh the page * * Initial code Copyright (C) 2004, Bruno Pelaia (PFLAdmin) * Redirect a client to the specified url. * The 'url' should be HTTP/1.1 compliant: it should start with the * protocol specification. * The 'force_meta' and 'seconds' parameter are optional. * The 'force_meta' behaviour is assumed if headers have been already sent. * * * @param string $url The page to redirect to * @param bool $force_meta Whenever you need an HTML-meta tag or not * @param int $seconds The amount of seconds to wait before **/ function refresh ($url, $force_meta = false, $seconds = 0) { // Check the protocol if (isset($_SERVER['HTTPS'])) $PROTOCOL = 'https'; else $PROTOCOL = 'http'; // HTTP/1.1 requires an absolute URI $uri = ereg ( '^http', $url ) ? $url : "$PROTOCOL://". $_SERVER['HTTP_HOST']; // Server Root Check if(dirname ($_SERVER['PHP_SELF']) != '' && dirname ($_SERVER['PHP_SELF']) != '/') $uri .= dirname($_SERVER['PHP_SELF']); $uri .= '/'.$url; if ( $force_meta || headers_sent () ) { ob_start(); ob_clean (); echo "

"; echo _("You will be automatically redirected to a new page within a few seconds.
If this does not happen, please follow the link:")." ".''._("click here").''; echo "

"; ob_end_flush (); } else { ob_end_clean (); header ( "Location: ${uri}" ); } exit; } phamm-0.6.2/README.PLUGINS0000644000175300017530000000155112256607224013625 0ustar phammphamm;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Phamm - README.PLUGINS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Copyright (c) 2006 Alessandro De Zorzi, Mirko Grava http://www.phamm.org/ Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Create a file .xml inside plugins directory .xml Take a look at DTD/phamm-plugins.dtd To validate a XML plugin description file use on-line or other tools http://validator.w3.org/ http://www.stg.brown.edu/service/xmlvalid/ Enable plugin with a new entry in config.inc.php $plugins[] = ""; phamm-0.6.2/docs/0000755000175300017530000000000012310633771012550 5ustar phammphammphamm-0.6.2/docs/install.txt0000644000175300017530000001672012256607311014765 0ustar phammphammPhamm Install Phamm Team Copyright 2008 Alessandro De Zorzi, Mirko Grava Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation. __________________________________________________________ Table of Contents 1. Preliminary 1.1. Obtain Phamm 1.2. Prepare the files 1.3. Requirements 1.3.1. Optional requirements required for email 1.3.2. Optional requirements for ftp 1.4. Contents 2. Configure LDAP Service 2.1. Schema 2.2. Change phamm password 2.3. Populate 3. Phamm configuration 3.1. Config file 3.1.1. Config file (plugin support) 4. Setting mail services 4.1. Config Postfix 4.2. Config Courier 4.3. Config Amavis 4.4. Config Gnarwl 4.5. cleaner.sh script __________________________________________________________ Chapter 1. Preliminary 1.1. Obtain Phamm To obtain last version of Phamm, please visit the web site www.phamm.org. Files can be download directly from http://open.rhx.it/phamm/ __________________________________________________________ 1.2. Prepare the files Untar the archive and put the directory phamm-X.X.X in a web accessible director (Example: /var/www/). tar xvfz phamm-X.X.X.tar.gz mv phamm /var/www/ You can obtain to configure httpd to use Alias and make accessible from web only the sub-directory phamm/www-data. __________________________________________________________ 1.3. Requirements Phamm should works any web server that support PHP. Phamm Team tested Phamm with Apache and lighttpd. You need a OpenLDAP server configured and a Webbrowser (doh!). __________________________________________________________ 1.3.1. Optional requirements required for email * postfix email server * pop3/imap: severs (that support ldap)examples: cyrus,courier. (tested with apache) * gnarwl: for autoresponding:(to first user email) * amavisd: for anti-virus/anti-spam: * spamassassain * clam-av or similar av-software (tested with Clam-AV) __________________________________________________________ 1.3.2. Optional requirements for ftp * pure-ftpd * pure-ftpd-ldap-backend __________________________________________________________ 1.4. Contents In the examples folder you can find examples of all the configuration files for each server section outlined below. Please relistitem these are examples and they will have to be edited to suit your own personal requirements. __________________________________________________________ Chapter 2. Configure LDAP Service 2.1. Schema Copy schema/phamm.schema file in your schema directory (ex. /etc/ldap/schema/ for Debian). Probably you need other schema files, you can copy they from respective projects or from http://open.rhx.it/phamm/schema/ amavis.schema dnsdomain2.schema ISPEnv2.schema pureftpd.schema radius.schema samba.schema Copy examples/conf/slapd/slapd.conf to override your slapd.conf (ex. /etc/ldap/ for Debian or /etc/openldap). Add YOUR password for the cn admin with the command slappasswd. The slapd.conf has the loglevel set to 0. For debugging set it to 128 or start slapd with /usr/sbin/slapd -d1 as this will display to screen and save you the trouble of searching your log files for problems. For improve security we suggest to use Phamm LDAP ACL definition if you do not use already ACL please copy examples/conf/phamm/phamm.acl in the same place of the slapd.conf (ex. /etc/ldap/ for Debian or /etc/openldap) otherwise comment the line below in your slapd.conf # include /etc/ldap/phamm.acl then restart LDAP service. __________________________________________________________ 2.2. Change phamm password Create the password you want for the cn phamm with slappasswd and amend it in the examples/ldif/sample-mail.ldif (the default is rhx) with cut and paste :). __________________________________________________________ 2.3. Populate ldapadd -v -x -D "cn=admin,dc=example,dc=tld" -W -h localhost -f example s/ldif/sample-main.ldif The password is the first one you created. __________________________________________________________ Chapter 3. Phamm configuration 3.1. Config file If not exists you need to create the main config file in phamm directory from the sample cp config.inc.example.php config.inc.php Then edit config.inc.php. __________________________________________________________ 3.1.1. Config file (plugin support) If you wish to use the plugin, please decomment each line you want in $plugins[] lines: $plugins = array(); $plugins[] = "mail"; $plugins[] = "alias"; //$plugins[] = "ftp"; //$plugins[] = "proxy"; __________________________________________________________ Chapter 4. Setting mail services There are a couple of excellent general examples of how to setup postfix and courier below these should assist with a more detailed discription of what you find below. http://www.postfix.org/addon.html http://www.faqs.org/docs/Linux-HOWTO/LDAP-Implementation-HOWTO. html#AEN747 http://alinux.washcoll.edu/docs/plc/postfix-courier-howto.html __________________________________________________________ 4.1. Config Postfix Install Postfix as a full internet email server, and then add the snips that are in the samples directory to the relevent parts of the Postfix configuration files, remember to reload postfix after making the changes (most postfix configuration files are found in /etc/postfix) ensure the user vmail and the group vmail have been added. if not add them and remember the gid and uid as you need it here and in courier config don't forget to update your transport file and the transport.db file this is required. postmap /etc/postfix/transport Test this by logging into smtp and sending a mail to yourself (then when you set up courier you should have the mail awaiting you) log with /etc/init.d/postfix start; tail -f /var/log/mail.log __________________________________________________________ 4.2. Config Courier check that authdaemonrc is using ldap as a method to authenicate ie (authmodulelist=ldap), add the snips from the samples folder to the relevent file (normally found in /etc/courier) these files are authldap (configuration of ldap server) test by logging into your pop or imap server and collecting the mail that you sent to your self in setting up postfix. /etc/init.d/courier-authdaemonrc start; tail -f /var/log/mail.log __________________________________________________________ 4.3. Config Amavis Add the amavis sample data to your amavis.conf file. restart the services and check the logs for dependancies) __________________________________________________________ 4.4. Config Gnarwl add the sample gnarwl.cfg snip to you gnarwl.cfg. (this normally lives in /etc/gnarwl.cfg) set debug to 3 and test. don't forget to set debug back again when working. __________________________________________________________ 4.5. cleaner.sh script Edit the cleaner.sh script to reflect the your ldap layout. Phamm does not really delete accounts. Phamm mark them as "Deleting". You can use tools/cleaner.sh to do this with crond. phamm-0.6.2/docs/install.pdf0000644000175300017530000031017512256607311014720 0ustar phammphamm%PDF-1.4 % 1 0 obj << /S /GoTo /D (1.0) >> endobj 4 0 obj (Phamm Install) endobj 5 0 obj << /S /GoTo /D (2.0) >> endobj 8 0 obj (Table of Contents) endobj 9 0 obj << /S /GoTo /D (3.0) >> endobj 12 0 obj (Chapter 1. Preliminary) endobj 13 0 obj << /S /GoTo /D (3.1.1) >> endobj 16 0 obj (1.1. Obtain Phamm) endobj 17 0 obj << /S /GoTo /D (3.2.1) >> endobj 20 0 obj (1.2. Prepare the files) endobj 21 0 obj << /S /GoTo /D (3.3.1) >> endobj 24 0 obj (1.3. Requirements) endobj 25 0 obj << /S /GoTo /D (3.3.1.2) >> endobj 28 0 obj (1.3.1. Optional requirements required for email) endobj 29 0 obj << /S /GoTo /D (3.3.2.2) >> endobj 32 0 obj (1.3.2. Optional requirements for ftp) endobj 33 0 obj << /S /GoTo /D (3.4.1) >> endobj 36 0 obj (1.4. Contents) endobj 37 0 obj << /S /GoTo /D (4.0) >> endobj 40 0 obj (Chapter 2. Configure LDAP Service) endobj 41 0 obj << /S /GoTo /D (4.5.1) >> endobj 44 0 obj (2.1. Schema) endobj 45 0 obj << /S /GoTo /D (4.6.1) >> endobj 48 0 obj (2.2. Change phamm password) endobj 49 0 obj << /S /GoTo /D (4.7.1) >> endobj 52 0 obj (2.3. Populate) endobj 53 0 obj << /S /GoTo /D (5.0) >> endobj 56 0 obj (Chapter 3. Phamm configuration) endobj 57 0 obj << /S /GoTo /D (5.8.1) >> endobj 60 0 obj (3.1. Config file) endobj 61 0 obj << /S /GoTo /D (5.8.3.2) >> endobj 64 0 obj (3.1.1. Config file \(plugin support\)) endobj 65 0 obj << /S /GoTo /D (6.0) >> endobj 68 0 obj (Chapter 4. Setting mail services) endobj 69 0 obj << /S /GoTo /D (6.9.1) >> endobj 72 0 obj (4.1. Config Postfix) endobj 73 0 obj << /S /GoTo /D (6.10.1) >> endobj 76 0 obj (4.2. Config Courier) endobj 77 0 obj << /S /GoTo /D (6.11.1) >> endobj 80 0 obj (4.3. Config Amavis) endobj 81 0 obj << /S /GoTo /D (6.12.1) >> endobj 84 0 obj (4.4. Config Gnarwl) endobj 85 0 obj << /S /GoTo /D (6.13.1) >> endobj 88 0 obj (4.5. cleaner.sh script) endobj 89 0 obj << /S /GoTo /D [90 0 R /Fit ] >> endobj 92 0 obj << /Length 148 /Filter /FlateDecode >> stream xeλ0 O1jl+eCH`bȆ*ehA_r|!h`Yѻ\M@"Q aPٜhVt8QFfv֓942&U)4a"ؽ\NEfYM[\=s1 endstream endobj 90 0 obj << /Type /Page /Contents 92 0 R /Resources 91 0 R /MediaBox [0 0 609.714 789.041] /Parent 97 0 R >> endobj 93 0 obj << /D [90 0 R /XYZ 71.731 729.265 null] >> endobj 94 0 obj << /D [90 0 R /XYZ 71.731 718.306 null] >> endobj 95 0 obj << /D [90 0 R /XYZ 71.731 718.306 null] >> endobj 2 0 obj << /D [90 0 R /XYZ 388.894 700.755 null] >> endobj 91 0 obj << /Font << /F27 96 0 R >> /ProcSet [ /PDF /Text ] >> endobj 100 0 obj << /Length 365 /Filter /FlateDecode >> stream x]KS ,aRIjmGG]X4ISV9|l *M, NlDGS "lu)Y:QU#,?FƔ3)>#D38&ܛQFmKS!WV4~j.~P WVF F1ErνV*xnh…MDs{ΨuChusUٸrHezm\JpWK#" w^mdce|AR(ͩSY7C`D(n svmV)[g'']~ g}=&ù endstream endobj 99 0 obj << /Type /Page /Contents 100 0 R /Resources 98 0 R /MediaBox [0 0 609.714 789.041] /Parent 97 0 R >> endobj 101 0 obj << /D [99 0 R /XYZ 71.731 729.265 null] >> endobj 98 0 obj << /Font << /F27 96 0 R /F34 102 0 R >> /ProcSet [ /PDF /Text ] >> endobj 145 0 obj << /Length 926 /Filter /FlateDecode >> stream xn@}%, 0/ӴTUxvAbܴw_~lL*?2`3Xqy'"4댂(0s#PzFJGȑ15ͩf|cy*ad<*Ukc 5x$F!Љg^踑l99)-/2U,.{7@6yvz!(3cH_tˌo8W+ݯ R#/M)83T٩WZ~sCN?7 ƍ/&)һ?lpk̍]VQ%y^^?mylUx㎹F[(ΫB[2[ђ=xWoLKO}N7$.iq!v^4?d`M+U'$3a-@‚|a?׏^͖jkSdhqaCѯ<8_٢)۱7z}WO孾A{E ]ýI^lҸR 0*>fncU?Tpʮy}!bUCԣY",_o"/Ǟv' 80 C'f\Jv> endobj 103 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [118.555 683.134 181.798 694.014] /Subtype /Link /A << /S /GoTo /D (0:preliminary) >> >> endobj 104 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.005 683.134 538.979 694.014] /Subtype /Link /A << /S /GoTo /D (0:preliminary) >> >> endobj 105 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [142.466 669.715 221.947 678.561] /Subtype /Link /A << /S /GoTo /D (0:15) >> >> endobj 106 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.005 669.715 538.979 678.561] /Subtype /Link /A << /S /GoTo /D (0:15) >> >> endobj 107 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [142.466 654.706 226.081 665.61] /Subtype /Link /A << /S /GoTo /D (0:18) >> >> endobj 108 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.005 654.706 538.979 665.61] /Subtype /Link /A << /S /GoTo /D (0:18) >> >> endobj 109 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [142.466 641.755 217.235 652.659] /Subtype /Link /A << /S /GoTo /D (0:23) >> >> endobj 110 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.005 641.755 538.979 652.659] /Subtype /Link /A << /S /GoTo /D (0:23) >> >> endobj 111 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [166.376 628.803 357.069 639.707] /Subtype /Link /A << /S /GoTo /D (0:26) >> >> endobj 112 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.005 628.803 538.979 639.707] /Subtype /Link /A << /S /GoTo /D (0:26) >> >> endobj 113 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [166.376 615.852 310.315 626.756] /Subtype /Link /A << /S /GoTo /D (0:41) >> >> endobj 114 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.005 615.852 538.979 626.756] /Subtype /Link /A << /S /GoTo /D (0:41) >> >> endobj 115 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [142.466 604.958 197.32 613.804] /Subtype /Link /A << /S /GoTo /D (0:48) >> >> endobj 116 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.005 604.958 538.979 613.804] /Subtype /Link /A << /S /GoTo /D (0:48) >> >> endobj 117 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [118.555 587.692 235.586 598.571] /Subtype /Link /A << /S /GoTo /D (0:ldap) >> >> endobj 118 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.005 587.692 538.979 598.571] /Subtype /Link /A << /S /GoTo /D (0:ldap) >> >> endobj 119 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [142.466 574.273 193.434 583.119] /Subtype /Link /A << /S /GoTo /D (0:53) >> >> endobj 120 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.005 574.273 538.979 583.119] /Subtype /Link /A << /S /GoTo /D (0:53) >> >> endobj 121 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [142.466 559.264 264.726 570.168] /Subtype /Link /A << /S /GoTo /D (0:61) >> >> endobj 122 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.005 559.264 538.979 570.168] /Subtype /Link /A << /S /GoTo /D (0:61) >> >> endobj 123 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [142.466 546.313 196.762 557.216] /Subtype /Link /A << /S /GoTo /D (0:64) >> >> endobj 124 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.005 546.313 538.979 557.216] /Subtype /Link /A << /S /GoTo /D (0:64) >> >> endobj 125 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [118.555 531.105 223.222 541.984] /Subtype /Link /A << /S /GoTo /D (0:configuration) >> >> endobj 126 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.005 531.105 538.979 541.984] /Subtype /Link /A << /S /GoTo /D (0:configuration) >> >> endobj 127 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [142.466 515.628 204.244 526.532] /Subtype /Link /A << /S /GoTo /D (0:70) >> >> endobj 128 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.005 515.628 538.979 526.532] /Subtype /Link /A << /S /GoTo /D (0:70) >> >> endobj 129 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [166.376 502.676 302.594 513.58] /Subtype /Link /A << /S /GoTo /D (0:75) >> >> endobj 130 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.005 502.676 538.979 513.58] /Subtype /Link /A << /S /GoTo /D (0:75) >> >> endobj 131 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [118.555 487.468 217.294 498.347] /Subtype /Link /A << /S /GoTo /D (0:mail) >> >> endobj 132 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.005 487.468 538.979 498.347] /Subtype /Link /A << /S /GoTo /D (0:mail) >> >> endobj 133 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [142.466 471.991 219.198 482.895] /Subtype /Link /A << /S /GoTo /D (0:83) >> >> endobj 134 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.005 471.991 538.979 482.895] /Subtype /Link /A << /S /GoTo /D (0:83) >> >> endobj 135 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [142.466 459.04 221.947 469.944] /Subtype /Link /A << /S /GoTo /D (0:89) >> >> endobj 136 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.005 459.04 538.979 469.944] /Subtype /Link /A << /S /GoTo /D (0:89) >> >> endobj 137 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [142.466 446.088 222.306 456.992] /Subtype /Link /A << /S /GoTo /D (0:93) >> >> endobj 138 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.005 446.088 538.979 456.992] /Subtype /Link /A << /S /GoTo /D (0:93) >> >> endobj 139 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [142.466 433.137 221.389 444.041] /Subtype /Link /A << /S /GoTo /D (0:96) >> >> endobj 140 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.005 433.137 538.979 444.041] /Subtype /Link /A << /S /GoTo /D (0:96) >> >> endobj 141 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [142.466 420.186 226.081 431.089] /Subtype /Link /A << /S /GoTo /D (0:99) >> >> endobj 142 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [532.005 420.186 538.979 431.089] /Subtype /Link /A << /S /GoTo /D (0:99) >> >> endobj 146 0 obj << /D [144 0 R /XYZ 71.731 729.265 null] >> endobj 6 0 obj << /D [144 0 R /XYZ 244.332 703.236 null] >> endobj 143 0 obj << /Font << /F27 96 0 R /F40 147 0 R /F34 102 0 R /F41 148 0 R >> /ProcSet [ /PDF /Text ] >> endobj 171 0 obj << /Length 991 /Filter /FlateDecode >> stream xڵV[8~_T 6JUٛ:fmׯd*;RH_|4i]owT(^` J e>o2(*e뉞iu2K ΍4Ǎ"wvuV9˃%X0y q,uHCxZnTVGTH敕I zOQC03.kXK+n^#CrR$MI KjR3A+>[;+5J $hS:V*/F'"D}[HDT 3ْɾv%/j3¥:eNx,l^رI!]]o7!hY3pJ9B\x" :SEW+͢ziEIbwTڜ ʥ s &y+w'{F-#|3z'QP9nWjo kc'wW6^֥{0rXC٧N>Q|r!+RR٦Se U3;7W*ز݄uΐz|wQM_OiƛƟFؾ%ռiv 992gK cnǤ#1Gu>S6B+;aqw&`Y y@?~$O.)ǣMw|Z̲0d ȰnOTSĶ&TM|UQ0ƞ9O$#ɛF/H{ EP9fn5E})_Ѿ$HN+.s2r c<)_ ?SՒ.@7QZbɷj_H&[cu3l&>\OYGA7vU-%Lt#=O|Ql /-w~}?Q endstream endobj 170 0 obj << /Type /Page /Contents 171 0 R /Resources 169 0 R /MediaBox [0 0 609.714 789.041] /Parent 97 0 R >> endobj 149 0 obj << /D [170 0 R /XYZ 71.731 718.306 null] >> endobj 10 0 obj << /D [170 0 R /XYZ 291.225 703.236 null] >> endobj 150 0 obj << /D [170 0 R /XYZ 71.731 692.504 null] >> endobj 14 0 obj << /D [170 0 R /XYZ 226.72 651.526 null] >> endobj 172 0 obj << /D [170 0 R /XYZ 71.731 631.386 null] >> endobj 151 0 obj << /D [170 0 R /XYZ 71.731 602.296 null] >> endobj 18 0 obj << /D [170 0 R /XYZ 239.183 559.198 null] >> endobj 173 0 obj << /D [170 0 R /XYZ 71.731 535.709 null] >> endobj 174 0 obj << /D [170 0 R /XYZ 71.731 501.624 null] >> endobj 176 0 obj << /D [170 0 R /XYZ 71.731 437.255 null] >> endobj 152 0 obj << /D [170 0 R /XYZ 71.731 407.95 null] >> endobj 22 0 obj << /D [170 0 R /XYZ 220.023 364.853 null] >> endobj 177 0 obj << /D [170 0 R /XYZ 71.731 341.364 null] >> endobj 153 0 obj << /D [170 0 R /XYZ 71.731 316.868 null] >> endobj 26 0 obj << /D [170 0 R /XYZ 437.373 279.652 null] >> endobj 178 0 obj << /D [170 0 R /XYZ 71.731 276.683 null] >> endobj 179 0 obj << /D [170 0 R /XYZ 71.731 273.814 null] >> endobj 180 0 obj << /D [170 0 R /XYZ 129.514 255.981 null] >> endobj 181 0 obj << /D [170 0 R /XYZ 71.731 253.824 null] >> endobj 182 0 obj << /D [170 0 R /XYZ 129.514 238.048 null] >> endobj 183 0 obj << /D [170 0 R /XYZ 71.731 235.892 null] >> endobj 184 0 obj << /D [170 0 R /XYZ 129.514 220.116 null] >> endobj 185 0 obj << /D [170 0 R /XYZ 71.731 217.959 null] >> endobj 186 0 obj << /D [170 0 R /XYZ 129.514 202.183 null] >> endobj 187 0 obj << /D [170 0 R /XYZ 71.731 200.026 null] >> endobj 188 0 obj << /D [170 0 R /XYZ 129.514 184.25 null] >> endobj 189 0 obj << /D [170 0 R /XYZ 71.731 182.093 null] >> endobj 190 0 obj << /D [170 0 R /XYZ 129.514 166.317 null] >> endobj 154 0 obj << /D [170 0 R /XYZ 71.731 159.553 null] >> endobj 30 0 obj << /D [170 0 R /XYZ 357.623 121.964 null] >> endobj 191 0 obj << /D [170 0 R /XYZ 71.731 118.994 null] >> endobj 192 0 obj << /D [170 0 R /XYZ 71.731 116.125 null] >> endobj 193 0 obj << /D [170 0 R /XYZ 129.514 98.292 null] >> endobj 194 0 obj << /D [170 0 R /XYZ 71.731 96.136 null] >> endobj 169 0 obj << /Font << /F27 96 0 R /F34 102 0 R /F45 175 0 R /F41 148 0 R >> /ProcSet [ /PDF /Text ] >> endobj 197 0 obj << /Length 416 /Filter /FlateDecode >> stream xuS?s SPb! m2\u]rQ6r Τ`v#EmMkcQQp 9Ih9}iD:xa[};%IIZe3IYGa n R!ZO MD7J* endstream endobj 196 0 obj << /Type /Page /Contents 197 0 R /Resources 195 0 R /MediaBox [0 0 609.714 789.041] /Parent 97 0 R >> endobj 198 0 obj << /D [196 0 R /XYZ 129.514 708.344 null] >> endobj 155 0 obj << /D [196 0 R /XYZ 71.731 691.243 null] >> endobj 34 0 obj << /D [196 0 R /XYZ 179.826 648.145 null] >> endobj 199 0 obj << /D [196 0 R /XYZ 71.731 628.005 null] >> endobj 195 0 obj << /Font << /F41 148 0 R /F34 102 0 R /F27 96 0 R >> /ProcSet [ /PDF /Text ] >> endobj 202 0 obj << /Length 1092 /Filter /FlateDecode >> stream xڍW]&}_a$q>lgvV+5ZUm!16 q}0½{. ~~!AM͂)cqG)HMp@_6*ɷGQrn96 ߞhyo8Z/9 ' V*67$ >KeU tnl:$Viync*,ZBM b3'c33GB2~uYqxf!IJ)Mh/3'fzG6*<t#1 e6]0d /_.u,تm\l9V!wڐYΡZ VAR'w6Rh7'٠;pH{#2GX5*uaS((l &1ճYZjgs ݟe4Z2PqݥgHi/rEw!w5"FspF>%ޱUD) "@LE{>8NFHK?<GRW($%GE;RT:Fc{*ь .Y{tN.hȋ` wK*1͡- ҤR{ֻkiCU,<[ak2Q+\b5YCٓk&+ ؙj[=0i,CQ䔚KU?3Ji`:VQ1*e\KImgGL.Nm,hCLzCIN!0O0FYzֻ{/꺈}5zLu Tя>h$|+=]e0P j)⛛:r4jSDT>VSR!|o*zV $-Z9wh}]2<6{ִTLM7&RbW;>]QT|=;۱4#e%-̈oZTIr"7Mi,nQt47BI`m]j|H'_8\u endstream endobj 201 0 obj << /Type /Page /Contents 202 0 R /Resources 200 0 R /MediaBox [0 0 609.714 789.041] /Parent 97 0 R >> endobj 203 0 obj << /D [201 0 R /XYZ 71.731 729.265 null] >> endobj 156 0 obj << /D [201 0 R /XYZ 71.731 718.306 null] >> endobj 38 0 obj << /D [201 0 R /XYZ 416.642 703.236 null] >> endobj 157 0 obj << /D [201 0 R /XYZ 71.731 692.184 null] >> endobj 42 0 obj << /D [201 0 R /XYZ 171.08 651.526 null] >> endobj 204 0 obj << /D [201 0 R /XYZ 71.731 631.386 null] >> endobj 205 0 obj << /D [201 0 R /XYZ 71.731 596.567 null] >> endobj 206 0 obj << /D [201 0 R /XYZ 71.731 560.702 null] >> endobj 207 0 obj << /D [201 0 R /XYZ 71.731 472.856 null] >> endobj 208 0 obj << /D [201 0 R /XYZ 71.731 425.01 null] >> endobj 209 0 obj << /D [201 0 R /XYZ 71.731 379.182 null] >> endobj 158 0 obj << /D [201 0 R /XYZ 71.731 326.131 null] >> endobj 46 0 obj << /D [201 0 R /XYZ 318.736 283.034 null] >> endobj 210 0 obj << /D [201 0 R /XYZ 71.731 259.278 null] >> endobj 159 0 obj << /D [201 0 R /XYZ 71.731 233.803 null] >> endobj 50 0 obj << /D [201 0 R /XYZ 177.243 190.706 null] >> endobj 211 0 obj << /D [201 0 R /XYZ 71.731 177.18 null] >> endobj 212 0 obj << /D [201 0 R /XYZ 71.731 147.781 null] >> endobj 200 0 obj << /Font << /F27 96 0 R /F34 102 0 R /F45 175 0 R /F41 148 0 R >> /ProcSet [ /PDF /Text ] >> endobj 215 0 obj << /Length 475 /Filter /FlateDecode >> stream x}ˎ y uaK fcꦣjW]x73 d䋚}dɊs 9'AC~^? 4PԀc)QHh hV'Bݼݳގ )yFem{A^cRN5 rZdizL;޸b?55[9wHNTNᅈkE" Fr2s}ι-b6X·7oo>!Z%#ݺ>F8/z_1Brc4g0cE @/p endstream endobj 214 0 obj << /Type /Page /Contents 215 0 R /Resources 213 0 R /MediaBox [0 0 609.714 789.041] /Parent 222 0 R >> endobj 216 0 obj << /D [214 0 R /XYZ 71.731 729.265 null] >> endobj 160 0 obj << /D [214 0 R /XYZ 71.731 718.306 null] >> endobj 54 0 obj << /D [214 0 R /XYZ 390.84 703.236 null] >> endobj 161 0 obj << /D [214 0 R /XYZ 71.731 692.184 null] >> endobj 58 0 obj << /D [214 0 R /XYZ 189.397 651.526 null] >> endobj 217 0 obj << /D [214 0 R /XYZ 71.731 627.77 null] >> endobj 218 0 obj << /D [214 0 R /XYZ 71.731 606.53 null] >> endobj 219 0 obj << /D [214 0 R /XYZ 71.731 575.724 null] >> endobj 162 0 obj << /D [214 0 R /XYZ 71.731 561.997 null] >> endobj 62 0 obj << /D [214 0 R /XYZ 343.823 524.781 null] >> endobj 220 0 obj << /D [214 0 R /XYZ 71.731 501.664 null] >> endobj 221 0 obj << /D [214 0 R /XYZ 71.731 479.785 null] >> endobj 213 0 obj << /Font << /F27 96 0 R /F34 102 0 R /F45 175 0 R /F41 148 0 R >> /ProcSet [ /PDF /Text ] >> endobj 225 0 obj << /Length 1269 /Filter /FlateDecode >> stream xڵWn6+tQ `QF3-pݤM4:@MDHBRK=kDQ$sȻx<> %D3\yy }$w.v]G?~i!nuq?}iI}F YC7Џ]chhgS. wʍ|$EPHvQ<H`xH|y@q iߔ*h N)3B17^g1]"!N`Ja\khz(֝}yݩ~U/qavѿ,)hY4j' r?b?}3ϳ).*N+UtUnV.u(:uAƻ]T-_.q8KB 4RFSQN5W9ԼI.`czA:L$ 2uGp|٣Or@D,2; rd|ʨ3Tʞ6p2$9,Ӯ  &=#ԌthQ`Ij--SXnvu h)PԐ\-eQKBٹu4c9h?JY"14yDxrV Hpu5T%@TPU@ߢ&6\.n/ +4 buHTXJW"Y ׋퓡V wbrIz %-=Dш ?kEZ.rb{σavC/ )Bi[)JڜLٍ*5Euu#W~nKb[u絽jyiF; .yä}Z`Yv[]')Lbp@TP o@|AeAŹmPf3TԨj KZJXaʀ.YM  ƾ>DǃF#,ǖ}yuIq3U'rmVVѦ\W:הWBY+;=_ Sf`!nEKNJWmW>^GyLvmausBD66""bY)d Qה,S~Ƿ R#oW=j-,0 o9 j X`Y2c2 /p =Fu@R`57V3f#ރ4=yA<5doot endstream endobj 224 0 obj << /Type /Page /Contents 225 0 R /Resources 223 0 R /MediaBox [0 0 609.714 789.041] /Parent 222 0 R >> endobj 226 0 obj << /D [224 0 R /XYZ 71.731 729.265 null] >> endobj 163 0 obj << /D [224 0 R /XYZ 71.731 718.306 null] >> endobj 66 0 obj << /D [224 0 R /XYZ 384.228 703.236 null] >> endobj 227 0 obj << /D [224 0 R /XYZ 71.731 672.259 null] >> endobj 228 0 obj << /D [224 0 R /XYZ 71.731 628.87 null] >> endobj 164 0 obj << /D [224 0 R /XYZ 71.731 590.016 null] >> endobj 70 0 obj << /D [224 0 R /XYZ 221.229 546.918 null] >> endobj 229 0 obj << /D [224 0 R /XYZ 71.731 523.163 null] >> endobj 230 0 obj << /D [224 0 R /XYZ 71.731 450.116 null] >> endobj 231 0 obj << /D [224 0 R /XYZ 71.731 419.311 null] >> endobj 232 0 obj << /D [224 0 R /XYZ 71.731 382.669 null] >> endobj 165 0 obj << /D [224 0 R /XYZ 71.731 361.826 null] >> endobj 74 0 obj << /D [224 0 R /XYZ 225.739 317.953 null] >> endobj 233 0 obj << /D [224 0 R /XYZ 71.731 294.197 null] >> endobj 234 0 obj << /D [224 0 R /XYZ 71.731 234.102 null] >> endobj 166 0 obj << /D [224 0 R /XYZ 71.731 213.259 null] >> endobj 78 0 obj << /D [224 0 R /XYZ 225.498 169.386 null] >> endobj 235 0 obj << /D [224 0 R /XYZ 71.731 145.63 null] >> endobj 167 0 obj << /D [224 0 R /XYZ 71.731 120.156 null] >> endobj 223 0 obj << /Font << /F27 96 0 R /F34 102 0 R /F45 175 0 R /F41 148 0 R >> /ProcSet [ /PDF /Text ] >> endobj 238 0 obj << /Length 493 /Filter /FlateDecode >> stream xڍn0V.`^f#T\xW*o_IRNA E=l՛l_Pû>\3T7Orɓce$/}oې 7!+=u= (/*~JI|xߖ2ڳ==y8{*KF|ޓT6剌/QJIl76F%K^ TO]x>?/z~e&\Z ̫G=RhhHX#q?;9 qv7hX;[?]A>1rMP})]T|9O:̔}68bq/;jtvW1+Ж Woכ endstream endobj 237 0 obj << /Type /Page /Contents 238 0 R /Resources 236 0 R /MediaBox [0 0 609.714 789.041] /Parent 222 0 R >> endobj 239 0 obj << /D [237 0 R /XYZ 71.731 729.265 null] >> endobj 82 0 obj << /D [237 0 R /XYZ 222.881 705.748 null] >> endobj 240 0 obj << /D [237 0 R /XYZ 71.731 681.992 null] >> endobj 168 0 obj << /D [237 0 R /XYZ 71.731 656.517 null] >> endobj 86 0 obj << /D [237 0 R /XYZ 240.681 613.42 null] >> endobj 241 0 obj << /D [237 0 R /XYZ 71.731 589.931 null] >> endobj 236 0 obj << /Font << /F41 148 0 R /F27 96 0 R /F34 102 0 R >> /ProcSet [ /PDF /Text ] >> endobj 243 0 obj [600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] endobj 244 0 obj [250 278 500 500 500 500 500 500 500 500 500 500 333 333 675 675 675 500 920 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 389 278 389 422 500 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444] endobj 245 0 obj [556 556 167 333 667 278 333 333 0 333 570 0 667 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 278 250 333 555 500 500 1000 833 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 581 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500] endobj 246 0 obj [556 556 167 333 611 278 333 333 0 333 564 0 611 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 180 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 541 0 0 0 333 500 444 1000 500 500 333 1000 556 333 889 0 0 0 0 0 0 444 444 350 500 1000 333 980 389 333 722 0 0 722 0 333 500 500 500 500 200 500 333 760] endobj 247 0 obj [611 611 167 333 611 278 333 333 0 333 584 0 611 500 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 238 278 333 474 556 556 889 722 278 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 333 333 584 584 584 611 975 722 722 722 722 667 611 778 722 278 556 722 611 833 722 778 667 778 722 667 611 722 667 944 667 667 611 333 278 333 584 556 278 556 611 556 611 556 333 611 611 278 278 556 278 889 611 611 611 611 389 556 333 611 556 778 556 556] endobj 248 0 obj << /Length1 1612 /Length2 12064 /Length3 0 /Length 12897 /Filter /FlateDecode >> stream xڭweT]ݒ-{p= ܃;ݷ}?{U՚5f5+ \Ʈrvt sW qXۉ S( `D<,-\jT440ONgKs;Njdި\,@3K@DAQKJ^@)!فl6&YK3 `f`bogjWiXB#crtvxX:̝\>zb3q5oBN0E{gg'KGVEQt0r+`oijoWI>`>.Fv_ASKg#Ϗ`Npu3'ZWwY'Uo`n3ƌ#GnsK;8E@N7򯙡 adjog 01ۻ|PTo"E?qUvB~ ?. cu9_F6Æ GBv03h,n2Ut1|to)112Oֳ3W"MAE\HRH_Կ?wQt ٛ/ aa{WH`H?dk9#'KGɌL?Wz#fgbo׬ٙ~r:9}(?:2[]7 Jp74!1P֠Z\_cUiRB8x'M?҃iCѝ (!-D d/C8Ոz Ψ=_E0syOOVNvkVщ%'TֶOvxƀ.q -eq5@PX`p_ ޑ_a\T ةIQd<.LhMU@j Okٵ;K`d%Pg7 ˖kCEb|>J !2f7NIӥQ,NusO7HL^`cNP QP@ !j ErK7m?P"pzxq&#h˧x<EBjq+ *K6Aa,7o҂z+}oŇ:0 VA EO=8֕5p'/T :cBq'rLe__",r?D2g*~lF饵!;ȕ~]-(üo2o9S_ *X&Am+B ?& wfi2_hk %ۂW J3 }41 Q&Q<#-94[$e<(23 ބv:3X$2,ƹcr7z*]{^\,ftDe_`Tʦ6>w!99QiM2`Gqշ,lrOewCT=n.aOly6uyBG<-~՚јgYZoD93̗P"A,`$1d2 9Jwz!l+"5,HiU2D]XL|k*Li;BKh3}x(ܫjgrouI^nZ؏й'9xD;bLܷx+RW(ؔlw_MB):kpZD2 &^,s , oka#q-o(y?1[6GWQiuQ0xG3݊BE4C}sL fWrq ܌Dsub Q?_%*Tafn=K!ԱBT9H- 6&$,v{H$dP$qe9RT4ŀ2KB,BEe~-;9 f p&э0,X+>LI|>`n]֧]U~fΑ|Kﳮ4޼vx]xsd*0Hu`K\7YZ"\{Gؒok>k=)frc\֢/*Fe/Cv_%&~#1xLJ [<#MsCboryY"Jtt{\diUa;&6$g[Q\8lqF%?+alWj 9-/ÃgEU6hKm.xm B_'lɦwuФĎ9ufHd}ܸEj8pY˝-CEwE7Z**}4YSUx  Ž@6=7CwlHDPoc}m89{_,>nI'ͮHu L2.ozKŻo(+t/7рg 3C^䵤SRm}y/7/Ia*YL<rΧk;Ԧ.RoˊiYzLp'7w0lȑ3G[0V_{W(ʓ S{PS0a%g6.q CGpHDb4u. l{,/xH\2}iyRZFV\[:&);!= 1A=[w]nZA~K65C+RҸlUBESX:' `,LŐ5 YrMĨjt&A4#k*g?EZEVz{z7Rw7m^'Fw!'2T4=#S1]trL/w1mS_[@@#GJHmv=ꡓKhZw-dF[L80Nr|D1Րb+nNBjk\OyDocGb":(RZs9Tr\Zeo.- +p=f%d^\]u(9bW:@x׽|3Kahj ~8?5>6 olߩ湇3y{/=-SFɻϷ' 7=dvwԯePyڅDg H ][R^nz"̳a܀R^a֒7ȁa'S[hMc vfL$D-ؽ]-~4;'䷯VW?vp n&,-KsA@vh,ꫬ>씕{7GW߄£ d ":7OA81svx W`CTxBh7@gOf 7įv,5!)oE٢q3TӭnN434YB$luqۻdl3#rI96&PTBPoԌq0a!PH_paVw}Ŗ9C0+Lv.ay= ~Fa* Y GSlzueVZM{`]3 V5BI[rs}O8- f-(b5Ԣ{:6ޱiϑ׫Ri iⲟ%tmHzC*;Thz$e1_kHAG&lo9 r : S8ub2Po}L{X wfT&1fV1_Պg7[ њl!|&D]vZw2O^k=//J#twiV-JbQNNٛ70Uf>B\]9^wQ`Mg9ol`+U,Ê2oVUCora cJp"ˆ-nx5Ɋ:HF+ W)ݝnbpiAa-(ܿ}Ԕ4 u$B3s`U,!Uf 4pp 7u@#wW{K"C|NI]Y A{lE*{UֱڦDOV'3v ^ތP1ޕFj 5. %%yLZb^>`MqRWOnጦr*<2V WҨej%("KkR䐲dD ߸`4݊Zu[e*F+}~DӴ58;3K*hHwfΛĬfmwE}i|ܼ0|b֧a=&buXK92(2Gɦ66OΎ85^VvOK.}CR:ݳ괘+?6yaJTei+(B)rІcw#>UNǛf+Ra06O mG\Q_+O1qeRŴ:-p1L!+TX}1Ih 2}ZF<:n[ݗ剳*=/F("-/(ns[jv}h8ҼsDtI[3Q"l*CErƵ+Ώؔk%~{%њn*<]#zW(\[>T">Jç?k ; "umP~WENIϭ۴B|W%QAs6W:32guEF#q%rJ3 { t2YY0f"kdV͝>`ٶ 99 |Z&}Vroew+w7TnWR!.[vc?czCw> p}bJo0 l66;k:xw[,sFᕟm9(M-+NKd\͈.&GS+SEMJΨ/I6kbho+%@- ZZ{$ή2JtjV}H5Jh ?LJ|]MLJJ:P( p6@ln|oO cU8$+|vn1JGH#mN/B\oO:A p BnjF#;Ӣbgw3U+?vu:IO/cdz.[fۥޮq'f i:"Ԕ^uej&r sO¯i[nI?`Jk؂%ij7]PN*vyVBVttAdnQˮ(> u:Bo4%uUE~{w*KKUϦ}GUlR׈6\',JLz٘pN\ |p"!/Jsac'MWˠzEԏ\U?$h!4Dɚs}Imd;7n8E”ƪfi湙:y4 NLݎS &1)7diZ{BU0^pb]Pep!Wbk[Co F ƃ-͌ _9o^o4ݺ_s7'8,%e禼YL ~p&m>;.a/.&E"]Z/_hK#v΅pl "rˆq _N;,OAfpʽzs]ggT=3n, o}2E vC'¯PѮnȉhym/.#Tdêi^ۆ'ϏCAVCuFM"=B61ܯNd(ډ'ՙw^H-'$B쬱ɐjQ{8)(m*ol _/}W+ųLږ [ =xj.vͯ_, W v1cx_XSI8 HY~v0x :ҝ=؊nyr Iz L(g |g0'g!;Qŧ]L{oCۯQS~R ^z5* Gvq][籣W@pA>(O,ͫ^ d=fL 5Ǻ򼉉\Ŷ`AmgˑA.J:TIY@F5DBC=^wJuB-Ӂq9+JBlxAK_L^J9NwJ))͛h ގ1YO"ޅep2Y! )b2ӣ#,`C,$XLv&*b桊bл3&p6\3ig&qU~z?*rxm*XK{g[-asj'(܎j%J‡5ob|:OYQ1E?ة BꊍI`JlxAf-K^AZ*M1;q{vp]b2crS3eP↊blݥa=Ҿ(B>C*i0K.n"9ϩ=n}WM39RWS0}:&$?{~/HxjZ89rq~~z/#٧>Gf׎ѽ?Zu_ ւH%잷PǸ[m@hP,~yȬ yc|˽~ܓCl!R8Y 'Uea%e8xl!"E[hF N&[:gaDHdžC힗䒃N$@Ĝ@zK2LFAn^S9nM,aVyzQ'w|""M Mx\¹yiP#2F~[!G|d!:B'/":Q1[8nѬSm=s"؎/rh[0 u7[V:ģO9u1BP1իscov [KFz*Vu6njJ%֮썄ƮʯԞtE-F9N$,."$2~F~ֈsmV&ĵgUE+1xԿeEa2u^A9.\L ?Uw+Qp&q|@\2܃eG#|VZ?Gx!pwZ_){>ty xT S~g9 i¾=5iɫ H[= lR<*=ڼoM[wy3ZB.bzU d؉.@W07X};G~X)L%zoopFJ(<"5N]a.oVR#^|,*Wzpuswq+ (,cq`qqA'T[ F$)-EB\=wUNߺ4?mw]<6h0Lt\tC3#Qd75eѼ]x qF2p+]KvGHWᆱK(i5xWv{USӊ6ũHs#^x!@i&.|dSf!Շ=$O4Mv}B1>P@i*iGT[obˣco 5F'{vβ6eӅDbjS!Wҁɳ0).Gh $șNe ^P+3^(S2S͇tGVjO~Z?|[!֜r̕,ˢ$}Q&8EuCf{8|74̨0])yw9~9ʠr;|I] .ѷ#Z{lV-( ˦̲` (Ϣܴ0z|igzaI<-Ta°!}&gm$y|lOpUuDpՃkspNreiq> Q5ۨҡ)aҪRDP0/+#`<~DN"$sDS{l#6Fnʎ=eZȃ-mzy /dx1CU:_;lg?ﺗ?/-ng}B0# z8(C;^WsTO(~4._OhYl n7, k %~!Y׋ir6wKd%2]ߗ%B:[ƎA9>5S!uV>P܋]_Ӯ {:+,qhHaG;1ɟYh-9&[m 7W)ƓV &h7?E)gj&Wb,{>f JNhy ?>3Nag$e.EV++d5ʟjSjߖq&fe vd4%·C4_Q!0= 3Ǽlz@xm{13ȯ"8BPy CŚxq:h}p171S*{E_g,ej2)F'jEV$6T> endobj 250 0 obj << /Length1 1608 /Length2 9337 /Length3 0 /Length 10163 /Filter /FlateDecode >> stream xڭxUTђ5N ih-Hpw'!x XHpw ?ɝ;4szTٵvyh:ju-6 GsS 7wi$,OF>L::)(8:H`! \t)G'(`cbaaO?=O7a+Ӈ+__pk0bH(Tur`0hPw1fX:Bv8@?؟$` AA`?.Vj t?8\,x[:%u|=;0EZ8\!0 O4\`2`@V@{yӝ o:X69LJ{N*/snjhߡQ 7@^2v'p!*Gsy~ڱAƒA'슂EM&nSm^̕Y-CgqU2p4W nzߚG+6_:O~dFMqf9#]AmS8h\c7Wm`wz6Zsp藸Ar0s%q+ۺ`K_?чݱb"zs2_x%ma^xymldgupuk:q/ʲbw!>Fk,*_|[FEłcMsؗ΂d]'$'< LBfs-(kSlǹPcQ%0 )*i"L%1OZ;|PȈa˕:yP#)L &?^L|@ GX7FS_ <c:s(uc ψ`I7_>5kÅx$*t2`).(b@X0$Pܽ3_4d#. :cq OEz[iQ "^9y6~٨9e mB{F(ÛB,D/RM q9H<7z\Zɹ_+*HOFTlڛNw"zٵ>ۃ?=ayDN7cՍή# _ZRIs7ͳZȻ" B`'o4 ߞ8@3q^'1DbԢ8\s=wUD}5= d-Ҳ@aJPE';a43Π5wIāgق lKT8F3Ga1dE/EOr^% \O DGv/Eq ?ސؾ=?My2a,JW0_Dm?{ɜ\#v뽞hfaR=Z21OڌZ[/#j=qQ]' K'U4=M[?|,]ztF.mmSj(fyjVmR}sY ?ʎ"jdl,HC Bl%]rj0Z7Ȩ6>Ƿ/:QʳvgEnvjR9gcϼ;|9l&P#F)Ɋ<dȒ*Vԉ"7rJyGQ>ÓMUR7H[qBGוa.UOTR;H._o(m^uyRZzwol.[?0p ?4ϗ j IVzxȂ2V64fnQ&I)و|84vnT͛2w= [y9/v֩fVZ+wcxE9R> +j'dHZxv2DD}}c疷WԐrx8E,%cޙ kSO2ϏJB#ug~*5@Om䷘Y޻ ȚJ,$(2VH(!&T2ۃQQ+kwh0Us:5)gͬ?/VL~4S^CLrvZLHq&b{X$_o_>HwysnG*h T{;DLuxGծʿ<d[qZS#j' y61L]A"e%x2g tìeS20=2vu,sI{:;M b:gNDDjmxw-Ϝ H Jg3;JCvG)c<=Jdy Qk3i&r3L\U(W]2i4HXqEJ݊ Vzb5삳$kq>`WYvt3?&\UWm3a|] =k\]ZQ'a>R W1VZd2[!t;cmM?zH9uNȂ{Pmؘ BmaV;Kkk'Q4lrreLMK[yӶ'Qww¶ ~jItwνZh:V2DyצGۀͿ5RmPx0uwϗZJ.ºtHQ`rmCE>@6Q6!Rz@%Lg#5ϣ]ذP~t:۩[y`-e}*(y:wb 9vTS?hsI0\4p06 MKl*v'  +x}%f2 ? B Әy(-&8>Jׅe-}OtJ &xF2=(f55&El5b|7qV8-X–pa==|h3ċ"%:4aks=,#uǻX#5k'kYakڏӺsy9LW5dmCDm3ϴ,•Mwg$F*,qw u^M$+@=KṭN yð'1$eJ/*LLuH'00zxq8Vy۷hFPJoLC J _Sȥ׮ڵ@Fj[nTN (7Br)GKVjK\szk\޳+CUlU{TOflx1R)2Lb*V/3g]DQ!CC}o.D#trp4kPVFP _XhW~!B.m;2^+$L׹4qۖu? MqNJ,k-gb13'N0jx㈙o~gfF9XZ;$PP(@{78<]oENe#ԓ}WzpM8"[{.l{#V‹ugҷ%Կl짇\J~_8/cz#d7=SjyQ+u|U4x'-2K>Cx T8N Խw(0!X y#(H)×?@f,^7XOŷ9,L)ˉOKRTv,Ǎ|ozyJM  {r^;򥞎GSBFFDggUT#yWpiqmgMUЊ_+>_ 7(jt'fd^յ-inL`QF"2DS׎ pa7ۙGx MU1ݚ'/~[:JXIƮEY3/3!s[:ɖIdsFQR5~.1E ط$53-!>ӯB4ilVoMaǩJa/ H5?E c-\ ntX҄ ៿ To鎂~ R z3-*,1ꭒ)o9 U}XgڜWޅُ ៥ [=Yf2.Q)N+i|snFx^#?nE@B)-=8Z~ZyҙPNwMyQ5!z;KrVJn]DBGT5 9ПȘ"{4҇ cB#JsX@زAeI[ffluwg}^tliۺCjW- _P@ڥ]L~BBײC6iI]]_(Qs KEc@?eƆ͓SOՈJ~@^vy%U5zrjUK~`j~i/|wRvU56RLB F2Į1٧2mW@DDID"qS1/%Fɚgo`25s] ᴛfϻ_ͫ<w| @&ʺM: gn: 3\,w`K kCh7q@}c l.=3}s~Hn爒 }{|3d9$zzyrJZNp*wߥ oW_T ; b{x*MhB+z,)E3xgH uZWèyf<)~abbB7W(qxJp5"TgwyMx1Y /~EIYC52J'00sk倅λ^dđar /]0-q]<5h~^Hž "5 Xl,; 'Tq&@/rfj3( J H~1m:`}tϧ>Jp`KzقW6?Fy<0Dx4)@9jd)p9<|;ZQpK,OŶ(-­"k&{5^? R 5Xi>/n ~˘bCu=<\e;><anM[C&/R֑ٹVf :Weobz?5.1~kf :\ݓ^i&n} fpX$&cIu 6  趼נy9c10kTy^<4'f%̼4ɤf٠^VXIgČ۫^^G{p\16sMMncSFڐi#W.[ǦHG4Mt}BCƫ5tZLg.2c (3Fy;,o!;<4N:!Yk@Yg>/@֬gYz0q|9!0 Zs bxY@v}Ԇ6dC~{%L7)5!{\+RKd5>=ymy֮43EZ)Mes,. *zV{em+@͍p `J䌁~$jhx&/Cr/Zp/BFDUHjA 7&ro6F=BpYO PLuRkSK!6"ERNQB r1C6ĨP91icqX,:g[99[jz$JI x΍מC)K &NE2qz~f+ԛck8d?[rmZ֋L8FԜS=kg,޵zf?LnFuj-z6I̗*mlܞS>C'wNge;IVq/o8]fd1޵3V{6eVQxr?#qXaۙ_Sފ$L\pS!9"C>\_?/[on P T~Ux+ı,gY .#龻C#z">޶k!,s-vBDo D>;%ɠ l_ؠUj][%ވA+pu0*Z*!)LoCգR2F T1a.N[W2쉣vyzB@ }:u:l8Z;pe+V %-+ nn.؀IӐޜA%0F{e1f57rw%B94v GtCτ]1˘lϼg>??> endobj 252 0 obj << /Length1 1626 /Length2 9908 /Length3 0 /Length 10748 /Filter /FlateDecode >> stream xڭteT.޸;!@piqAK.!hpgfάs{~|k}oST&;Heb\5T텔T@@0U·BG'2!2P0@Ȁ.!!!: `ebaa/j^=+_;j@`?)U bf 6(Ag `U3kwSr79b8ί3}ۺ*ݫ53 fUN)W5hoWI^üj`3 r lM=^ssp  'V h rv~ Noo  `G~i}m p5+ {?@Թn_3 hA(ה> [Grߖw5^)zgʀbj9.hmSNvr`wP 5Xھo6rC@R'贬6 +W!?׿ ^?JQ0RR/6.~A/RoS`Z7'ϗῄM):i%KmJZyd0ko.h "1P\UWi.Tf=nLci[yg# tKCԕB"aTzu:ϩ1aT| ɏ5yrM4~+V NU!}5C`_oٛmRhd:Wt?,R }2!n\‡hI2ݫw])8_Po? &W8ҭQiֱN_$LB9md-jc^"7+J%F?$J`p$9Wlmb]%ʌ(_S=)Z U8P!3ď\c vfG*d  tTgu~#'}m\ ~ R*^}HbXE9^#{?ZVgbuF2o]{F||# RQE϶WC9^cid9&?U1[?bi=JzMZDd`F&}%5*)L'lZd$`t54zXqy "5:/hÑx}c 1,G Q1࡫x/E}$G\D>י1B>:Jg4u% Z.K\\^O 'D$H! I4adoqNS /paF:5{$Դ}5T ^+&{;Pѿ 2xevo*@RЩc['bE7?Jh͈y1g?b3'nal{Uuk' ,'SMp'D8f=4siO,UڸDG#NPq+BV8onQZO*Wqir{)X֨H^nCa5/G(Hew3DSE[;rYH.帬 CT^38;kBБ-Ĺ,!d2*x ! <;˴[8;UW$~|WȆ5ߢLI`)@8ǕֺV5/[t8юhGNc{ YdؓIoq(;:A`(Fc( zPb.^[z /9_h[?% CbωpJhIXx{얕4 奊&۷DpUNT ; ܮ߸0:yBzir"yW Bůcp=8f!mύV$3H/5i:LR~4TVv5('uRrchiGOT.y;k-|a8c!X,->cEwҤQ9m2\/jQ]i3j-j?=>diGJߺ˔4UP<-4eHh5kJcHDWDM%Dx<,f|{{YּǺH> v~A~ŧrt*dj)y@v#WQ8wtX5&ٱ@ pXŶje||@G גZJx!b;iJ kT;]Sjn$,T+]n׮@<y}Dd_w7/2MDumMhͯB HpU5=6G2)7 &oKo82WsLϝR8Jn`KY6˃bEx,4?osO蓘W$R7ͼK umQ>OR7!u Plo{O?;p @siLe$,bK<6W+LKIK'M&hh+# \E3cO.U\ͻeX{ST:?)u^0LkIXo^F}!}[,ܜ 6 Gu\(kyQiRƾPaE#vyt.]PcE*&4$NyI6>r!c_)\ΦVX`,wP 8-f%;NƷ<۫G;8ZqئPiV%J5pH>@Bad62LLf Ͽڝ,@|kR׵;d63dfvO U[{WmGlso(gazdZz}N?#P{ s|O-\}"s&t[2xsWt7{{eF{`gFߦ¨+0>z18eb5JIwXEZo}y iic ~ߊuru$h'cëEh7e=eh&Fc#bη]lcݭ.^V*JiS$/#{O4#:s> @EsSmqu0iRھ zCuXeXrKzfgn r?<0=-:2 Zm(3!oJHO \xfu$4gS2!VI^+UNKs[X[䢽{&M,fc)oXcrQS%0&>#|J% sOi!ni8BƟ$Տ}ubg>wb yM_T\?fb~Q\yh́WUTS㻾IGw`0Io2 ^r^W::4<&!Ydhe3.7a(lBpaO3waĐ &Xc.gAq'_YcR ;5E*#f1,`w1JBSӍ ǚ2aJa{X$DHWтrds"%s{{fvucn'KUXAנ m=9>> EMWp/5sF_Fy3K[FI"jZ/B떬5mxi[湧OM-&_ќA'|r՜|/uRGCXHA7R-sy)F_WAS&_ 7U?T}/϶\K*U^mQWsN =*^}ݎ/VZG4ȶ KR tߞ̀~Q={D. cCՋN%\yf|Dl)JC't;5H49~hi P"P ԗng+5 {A>4#ˇQ+l-@%ޙi7ljd3ܧ84:(;rB%y-'q/+EN<͔mՓ%DmYDs6Ο}?*TᗳBr6No2s!q+x2st Q(0B@s_JuD"DK?oYv oE3$8^p/jXɅbrk KK<#YTa=ڳ?|(DRL޵h.Vj8ٸ\N`jG0]>LTaoCeꨁ/ 銈n6JROل_eޓ(-i?"Y*jP䖬4GHKҸR*grE r`]=`[ 6Mء2!K!AQu۩Ua9٨\()dUH3g  '͐UyTdcxD>)h~P̀FZ!䓒^d9KЛ$wFy|+Q8VZV$ y{ƶg- 7K>Y8iys7ȀϽJvC&~vG|xdH$c65v ݾ) z3f(֯ݐ\ry4;Q ⶽ{y 0᎔fxϟ#ٺ0:i;S.իg⇢*w>I%x+Hedsx԰9۩&gnߺR+1+`nq0L/6W"4є0$ i[ u_ Ep<,(]~4 ֗>JG^k^&Wp$rZ<SWX+rG`ˍDYwټlI KrF;x]&.T*F5(= YhM7}RS ۣ),>NН$-d& ?2凎<\IvKq1I!HQL15'ӞJ>~-ǀ6 ů{b.t] xSGS&g!qO=$P:hi]}i~ZW`c =q]$!iF-Ɂ! 9IK z<s8blZs`l-*GTqj**xֶEXjфn:K_J&GH; i>ϘF DOUqk]hRltp׶;=Q1Ox1ՎST.f,4v8%57bZ[zkĢĕBǩ_L@y wL-i }ȞAM(-nfzl1t(T;ӥs놬Q b=u߶Nd1c4?w+B!DoOǪs-N3sc#Q-=c&oDl"x.x/Ld+W3Ey`bӠ ¯!6ѹRB *פ_2lJ2Fݾf(C}cPjV^)w`~ʌq1R5õG&qA =;{̕o=0 +څ'XQW$2_S\Q44CdEӤ}ǵ;\ 3՗>Ψ%'[שDriSB|M[~]v4M%Qܞ/tfB,aDFh46\~C  ' A%φ#UH+Mb2k/ 34B T(hq6y4oK{HeINGԺ?:Ang+i+*W LݔgeEi^Q.Wɱmdbv H2vۮ/F8y^+5#6f2I%Ȓ qC2d*=Ǣ@5Y}Fʲ~>mGR6Ҏx3s5Ed~miϣ010R4~p.󷷽1Fp d-R Oخs~xwawu;lD̫:A|}]!Vj=!&|`L V=ipg:~ )a,W|D1"#FRePċrt0?Ŭ FlQU;.?؛$wƷl3z';Bzdޛ+倬7[CJS='FKY7[5l/??ѭ|1rkGHzNS4r.vlv>GOr&2wJ <ʜ[(ҀəhПMe&]wnVT fh1CFor'`ӻ4 u JHȌ5=_J[_I @D3bADQFk-5nnT ﷌%jjP7 KQ~I>Z8LbkpaR0|Ic ϟWh=hjףZng:y~M|"Orzޙ'Qh.}*s g*j=' H+Mg*2AZY@J|"!zusQۄ]/<'KFZ+)%sG2 ~xw[r| hwz')șvuy1K5 >5MbqAkͭ@Xx?mg)լ&^Kym*E\lD^32cY01ۯHu֨vSe{f3Kܤva\?b6|ZtԤto=D8Ƒi8 t0wsu3!: OlM_- PXVvtY!J=Jvr'VAȏ ,6-˦k>=v)6z NfC`3zfo/QƨK@_nK/ԷsȻM|iݭ*>{PKʂ3b(ءkK" C [ [z!v)^GjW?Znfq=)chOQKh0uX}#|XCaՀ^C!WL|( WҍAިǕ:u([duө|ߣ^FroԊﭟŀ5aǔQ./)v,M6|eN6 ѐ>zeLbg܇$£Ę:r5F4~VDv$*F.g /Q^z,2 qB%4|Tk6?X|XHhY#'͋_"pÎs*RO^8wĘBkDbUE"{ |N5 _|LцV؎{46R9`+]D{~ObjNe҃ /KC _o ooBWX% yV_%V}0DTou**MqHfF=\&osiu/l&JG`!՝az*QoA#ȐIh'f\hBtg_ U/[қ)'\=b-WX$$z6i=6m9v\T*5-b]udЧHإ|Ka?QmšX#& rOj2H=`2x+u,N-qVĢHkLqm`BE봆z+oEd%7}x~J}U82Tv 8\(Nw8\D!psLL7J;u)6bF $}T%iYkƋyE]vw74xuaHgrC]HQ {τjL8cfc-~H,xL~JXָF)"gq euhNdFd5t!{>ԮK-n&u!jK/֐H zxtO?5ZcIoׄID.Zhzڍ=q|D **~ >c; (ըUܩ.Z>{"PՈr7?Cx;Y᳊ t{o_S-9y'jlIU5*+,'SSXKmt !!쟷Gj/ j)^Ri>O&=G7+SM n'௢{VJbP *.1i8ZMA/mpSiݱ`ܿx)ZNx endstream endobj 253 0 obj << /Type /FontDescriptor /FontName /BNHWSW+NimbusRomNo9L-Medi /Flags 4 /FontBBox [-168 -341 1000 960] /Ascent 690 /CapHeight 690 /Descent -209 /ItalicAngle 0 /StemV 140 /XHeight 461 /CharSet (/A/C/D/L/P/S/a/c/e/fi/five/four/g/h/i/l/m/n/o/one/period/r/s/t/three/two/u/v/y) /FontFile 252 0 R >> endobj 254 0 obj << /Length1 1630 /Length2 17223 /Length3 0 /Length 18070 /Filter /FlateDecode >> stream xڬc%͕mVm۶m۶mݧOǹϏN1Hil Elmhh92Ύ 2R4 Ʀ΀z(Ac}'s[!}'cN@`"ڹ99ȕT)S ?,#Mm?\lmB_*̌&VAY9uqQ2@A l`en274q4:- mmi͑/#@hglh757`owNsC+g 7WAv=::9:9fwNfNv4kؚ45t:8]e` 02ww/pv41 ƦFVƎab3togghy̝Lh4t]10[ol6c [NoJ˴}$7PB oWG+=26w X;bͭOQ[ĝ/5V;ə;L_ze#c+skzbS237mkWt¢ *T/Gfэux0hq02{oR ?ei}'sW߾_`m mYE'}? ƮƆPk˶-R3Ҝjs'4{@J }m{|RCw9*>jh9ܖ>%(F{Ѭzp(H;بtJ`.T#=nv4XU&t?q; n^(|\}Q ScP;j /HN_Fz~bSe@r%PF;?W=T$6;07.qŪmy.8D/L;ԗ۴T{F +ү%#y-`rҌ MMQ_Oڴ>j"vq1wXD.;$5NmdFG:ZμfBs Gtr7D0G[=%הVѦ._K+h&(E+k]W |]k\CB}6k'( }ݸ}-= AX<~ d|[l~~`_b[m!N,y B"[=|nÎ;seа>}*Z.=zJMzg/_Hz 5m}I(iziTaH 'uҖpl힥R)avɔ-֌ZV' iYHO w K@#֋F>Yүغ<ٟ3BYt՞ (őS <2(S괤f$-y.hIaA{q XOyXA4Q=&=P dp};2X"W ԀCkpz&~R.:sh`/p.[D8";Wc|Gbf(4?}6sT ;Ƭ`fЯ*Ӫ)+hЎRC$5Cx~+5{lT?,ApPG%ߠd'})q6mqHEgV9l19sOOB&>"C5I3Zf2NMڂU5HHX/gmW1H`괶3e!W>uHpn}ґ|v ڦ<= DTl{Y'ġiNldk?}I,ύ_!(qn%{@qd!Ĩ|\1i$ bZ+FfT2-)eJ8ܾd[%"Q_fzJp HF"X^=UbP͜Qc<{cer""wNJt\0,HxE'-ϸ0TVC%0ƀ8b=S„HŔ`Ƶ&l[ ^|@YbO%,.  HY/~/'ss^!v+1^ᑂ3\{B&*u<@N'%TX\!"36r[Lig%8z#{ĀãN / 7=qGBR[y2`&ߊpNg3E?L u_~xX` r,W~H8(&ߚ{A|:.|Ѝ[?PHi=Cum.}b4eՔoDcӐӓ'pNaX S\Eגu5T x+"*!#S6jj(0i\ }΁h':$`#'hٽt+RP{%ʢ _:/&9Dr|G }v@aĬ2*$.^^FȈY!E1}[,w̘=s7V&H(s֠ZfC AMSsW@jVdQ,zh6~BW+eM%vgV,;?=nMīNx'( J4c~ghsL4/ X]SqM 솦-]ZSR$Qe*!Xaqٴ!Aź~ tpiʋ@ٌ:>HoNu!A6NQkSuJwv?aHf~' u9A$x'>@&yI@8]udhNg? &=CXzX{ej/>YtjVo$S!@zvf*",ܶ JR]'񻘑I [O!"=y6Ԍ" z^-"& w7 DZPZ])mgקX{pKRRޔ}Gp |7~کT9 "Y9GZъUj%LnAݠH\~ps-@2D1G pkF .K"!U1YQhMD1Hl4Vwnk@a>lSIĘsv)6*hV*uYT*v$JBQ%pVN>ubdK h%y2 `J8GbF]sD}{ω#<ւdŒG Lę|'d$ )k{/LE;%(!&bPfL$^pXїľƑ2 hm{ea0k#εpPxe4VKsQ^81;dnWIZ uuELE$!Zx;ֿ [8Y%ɭIwDO$rD}466Fޗ@1z1Ph8fMDSMK_h8 v 䴅X;YRVtf_I[7AM0[HV.+yb|QD]+XJ$28 K̅7HfDZ?3 f|xG.L_<ق>ǁ썗 bRV(Aoj:: 9l4Țt0%Ya.U{H8o`3߿8Q^\ܓ#'f8"V Bqk+쁀Gڙ0}"*t^0Yl%K5Keh,-QG8'k]{U-ǔz/uoϕ~;Rv6iNY7Y,FhQ{k1:/)ČWX5/?=szX>ݒXSLPܸx*>kB(++wKMpUk3=!0/l'!|Q֢-aǘꑶ8fhn@d?gSL䡰_b>, lTLTT Ĵ?0C0[^?l@oFDz7E_G$|!WrMߣm^vJ m5TxJc&O-q2x+H}Y w6AjN͐,sof̎‹hӠq |13bH]~Wf018u·3[7i3PT)U[d;-yłѱ yDJ';C-R]qWg s>Tumg8kJ@;{ Q{䉞ߊ{xB/|>@: "l ԼE2M)+SQ&ac{Q;0FbEOsL8.P}:k 9pgK>2N9FlO4AL"isYw'6TAX1 3G)-u☡LȚl3smaȧf{LS }Q]P8K KVμ"Y̵>p/D:ld6Ҡ̂NjT9z=p9WҘcZ3U7Re<[H# ٻHĜyf2.إ< |MF$˶=G^(qJKaɼ3bo)u?/GB],nMIzVo(<nG Бs9E^cl4|^V;('/Pi}R,G0Mڿݿ!c^+ى%eHd V A^`}+Z|:uT D2 APeX" !B.1WR7My@\AIb qwA38K*=d<3'<~YL-9V2YE֓$I2򮽵]E$IP'WUuE>_K42 7u zdS'/FT2}WXEgV~{OJB6X 3 t kOjIALDvgu?4F9a @_"A!0G J׼hbپǭ*.0`rvQ^F}H [ߢ(vUUlpx3~%O(oc5@kWq/yVȆ})[˪\'_7%|VҿE 7'8K eK.cX:G`] ͂AU OէF[~Lh8GKWWǾPbR}<<7kusA7c%8퇅 > @ TH$J:?Ⱥr ^1DYNLj8Yb͉Yה aI6%jG!MG`?<8 SaՊfkBcoJ/O1iU##+3 91aw|JfB#`:I $|W6%WԎqUfj|%;3ظfAr? ãS$罽onDzbۃ2cvk`K J2seٯr^o w {fUvBM=4ܬk=<:W3rlߜ~Hr{OvtX ,3_Zj[f^3b0JLF+ΖҔ3NxϏ(($=YZvM0պis|`(] ",[6#dX*_pUJ(S\/B2bݑAwZ{PK4. ?sUvFd0J}|n|LT}ՃSglQ/ɧZHn3J[ ] u*#;'.4MF̮Dʄ@e~cƩWBj@zBYhn4![!є* };8}#j4_$>t}@ 6Ԑ^'-7oBr uEW}3y5\ U+s]pXbejiMh27eM{#kC։qV'K$!&?W(y~3>ampR'XP=< ?2iZXxpWP̖2-iV ``XC6  ?^P.y`^Т)|0X`M:C:THԺ~p2(Sk~lFy3I+A?;Q[1&2!REh%k_Y1 ȥ}ĽoM$Z3Xjy0xj?p9p$G,Z"<`l6a=+gt$GoKPgcUDgGCֶ,ldTUE^ȠV @x*sŵq#WfvCR@GfzC| 16A- -mtjC{p Qm/pYܺ)JYwBzid܋۬wl'/h;| VJnjv|*]6~\3bXw{+ޙ0snS'I%sfb.u< 3" & eWLq]{8t"DQ4pžm? [1Xjwz LMDT%3t@>^e3B`^Uiw̧泉nB׀Pe2m.E0RM7sNB7~CW!̆N%'Kt;yȽw6ʅw$R;vڙ6@cmY*J6{~S?$igm @wEqmI1(CL It~͖qtaNTAPG6u*F* knb'Q ;vZÐ+_SQ=J/jG!xrδ/,? a[^껢Uv_9>@͡8dT8/aD |p\:8x$BDST$øïm&j@ɗ i}6*Ӆ R[8J8FE}Q&yF{T ӥF8wra-!AȎwWF'3?⢈@R/lBW,džXObH &ȅ`hY i.d7̟tڒӦ,>p/ "NIm#<]gyKE;ݛCD$! |_t̵9B-A☟ۙ^p ݘȹ5, ]pbC= v(iV 0^"S+M5t5 V HMqVvl?]+*7.Y<=i>ne._GE-]fD;p6`_lN %8ڕ;0vq8a]xS\{1zUagvc@Y{?q{dy.^;As>99&(uʞ"uH-iC+\vze;a,mQgwV@F-Kk4km0Dm8=TN <"$&/uγrԑePGͅdKIuˬ=hS[CO(">$fDvyWxևl _"8|y" O(NNs!TF"L-JU5PyD \0i WeXJc<"!lvVH+hYwnA(haqiͲx;Y@__l>q<wW!0VGY:ɨl X*ۖFr#"b sb{$OgqaIMYZ籀4:Br3x(?elU箅Q֏4KͮFRǻabdˡ F^#hV4A`}`zJО>LX>XCm7YP2A/!)_av"7nO;4I }y-,npiJ HՉ7q^YuU {f|CR(A~\Mz0{L.LnRlc?Zsr% 0U.oIk ('Rxhb_,rX|' :G>g(?H2 cH}IF3<aJ AOM\R2M"hhSC Ko„ٕô9|=a1Bڐ8/ǪGkaN=gf(֯Kf|OPn3$z9R>W|%@cECF6BqZ\!2LcbHAQ1$T8+_HZ=v e[ӯAE6Kae*W i/8E&3 Qe4ǔ5r-`K)iwMݩ ˚wԻw2z^r)&6.v:2.rAY&ː\IP.V 15tΝF\y갼Ns_jk7-倀lKl1)h*7]o4%gFZ@Stp GA#dz,.:ؑ#Y}?,h ?֬#癳i<K9ݽWޢ}?PDC1PO0! DaD-?<|ƌ"gRm̦E{rӟ-CEZ)('߱W(A?"X/G:[I1Z@Fշ(`1h=WMRFV1zV QrE>l!nزNCR 'T.nI*ɤ`ȹw)qaQ"詄u^+ȿH>XLq`wZSH2'6{Kr:Gk.vtŶ4aA~Cbm3nV&.WpE{PTQύ`^<3!pc- a[şp&UQAoIJVpu(UhMmI_`1Ac׾@e0A jp[Ps&ҧj?6()hʣAclz2Ux©L;Untd >9C@bV쫿=KV$.T@@Ɛ dGʑJ:Q/e%bV2`bY{hg_,wO7jS%n /ͺ~&֚ 3M ˼6d4IQN >C3GĀ^|RFȾ2FN EIWBE=j!)˃42FydOu_mTN͆):4ڛy$OjVi9 0-E[髒xfqkAp;3':Da)`,f;I@% U?xĔE_;V ;?BFsx݋T } )qebsÿf(;Yo蔟5_o 鵘V6lI{n6@t>uB11ӱkaԓΝX:Wٵ"q!MmbR4"gkTASEfBFrRK\K)/}1OkiFjNV/DnO<}cF LZy\٨z"(\<~Q+;uu=mD!&bgL`손MTˣ] "2B%o[0: ΅7ٰVgS2"Ku`%'4/G ="$]ĩI7hb('[/wGIi8Ug"f`!]udlUűq U2(-^Wb@u8^N~A>a.pm?A9Cq-Jpij:. nM HP7Y=1;շf(LF~a9sJ4ʼn\T`>Ժ)]V9NoXufGWĵ?][ޙ KeV ZC !^+%0 A=%` MO]Wu,IX0?;$ɘK|u NՋMԌ Mؕ!k,>(/$#R~,$j?i{inQʌln8mmE|Vc\t+韝j= g%H_-PT|Hj\&匉*8Le˝QGvFN D09 O_C.9f&!(&鉄f|F vڶAbG;?h\\cBMF)/%IM\~=, ̄9dNǙ-s_i8umb|wD+S6'[v?'Yu&GK @}Vo- TqvtR4A4KBACFu۵2qQr‘ 5hǕ ynƙ-)#-kE$`<&ߨE땖ӾF /_h'Y7%EbSlۚCz|yxO#Nyl>hr;*#HG[0>?ȳ#OJiNh/TTMRj6w,3!lB: nC~Y&0Ke!Q,v )X]a&p-BX#)BK15=UILix\דvŽ]udS;9}+`cE nD6r78LWm7rzPmd,-]n곇QC_7ڄ~"j@oGt.C<9Ř{`!!YӌLVPhee!l&c]Q!OZ7'i-,H$(dFL0V9ii: e筇]qܣ܆3Ai"fsgE&hw >Y}y.adFL؄$!Q-ZYRtPsI{ 7,+TKKA>Nk MČJ}ڥf1S{K2*~G [ڒm)8x% 'Wx @ݿp/wί.Tʏ&DMUɔ#q.-MT2Tn'l%[mBj. P9֧,, W64$^ (+HVo7xC躌m"F^: 9CN] 5+[<!ypXF3jBe:@޺uq<'XD;wO*+B]~أ!i36Vxdԙ*{S0wnwQX = NE Ibi|B臺{{">R,V28: 3y ~ 'y*a ~aتY>NTiwG*fiK{% 7˒#'m@R#n;>w`\rǒ3,=1 ܞ(D LU`nmw HotiL$T;QZ?5 OsWmM~; 47*=WL@ttxR+"^0zAI Y7f1֚f~7 "F\~ЩQUIHx¶aeLN09ّ$ghי(A9FP~qw6`UEjH$> EFaj(xJ 3B% ˯Z{ ٙڔea[S84$kGFɕy/3c?\/Wº4ɢLUgnMy^['x9MIVveN6v.fBHT̖~-:+*z/\<1̪tم &nk*@I3!Yh%m-QtNLtΖx˯-c '-4:_lY$P3ÿt\gI] IY=qKZ3mJu yCy}I3Zerxr8iտ,20ҾP#WSBE裣)-xjlɦ8aN{eoL$O\uͰ?4nH߳?٨/փ꬛ԧo=]ihb |?-xͳ[ɹdJCœEmUZMR`M#fgQVPfè$P=e7L"!Jr|Dsb3:u<yGnܘQ5&4h7Q0sk}!\>!Sg,Eb{mf `)Z#LiP7XUiF7r*Smf@֣:$lHUN֥ꂂ%WGj: 9Xsy`% 9)d8E-7/6b Eޞϣ7 ulܳ}b_{T)B*ʜ9y};h Hgb֤d4E]nV3)g2445d7@9Yأ M[]^:kltܬTPnewuҤ+)$Ԍm6% SGƆ:~Fj茸df^?"53:4WNF7$Fp_GqFpeAt|E=-V䟇]Ep>,rsguΔ+]6FK 6ǏJJdw@d8&j= ^''.ʞf)Fv"V{|VaG_ ͈ Zf[Fr|z5]7xa[b$#UdZ$NceS~H$Zrc?8-4ٕ4,ߔW8xKrf+,S v.܉f ȿKIBe@ iǮ©Gʟt@jb7-་ #(VzE9Lؘ F U.3mƲTJ[`ٸh4HE/hd%uEWW0 Gq%4]]&[v$ɬEf1^|?یRP?}k}gh"^ވ(e$ҍ;[!SNI %WJȯ$|pZޑye]tܻeIF 9@ᡢ%jQV/M!ٴ^Y)?fd&4 M@E|B9 i9Ķ[V3{8PS xu"Ax>ށ^X"5fV;Ӵm]^ApTsA`ql2X{-4aS$u+dt8'!$۱<(*“j>:X~qbHt#[:GFRJ9 sdB1yI.VL2x pL  ;cOoN"#~3+HR Qhu\mn5f͜LBM%bs~hz1>[7DMe9!XP |pVĜ.3ae(|`:SA ߀wQ\,n6JM. DtutRa$ot/9  |ʩb췣 ?.d{ 1i+g2 Sig ?|"J}ѶljՆ{;4@( +_^4(OgI4Rp3^ ꃺ+CC 8wލ37tx.|RMGz,b E-rk!6'~%]g^}ư<UOYn@JVGlmTEN)7Bcj ޵- 5oȃ2:#s=Y рh ȋ3'>b/@,&l}~.}~|;6wI6aZ5iWVU xuR%-}Y^IM.6ޏDJ4(䷁kF)GpN9-qX۲Wmz#=H? dti([RI-ICMgMi:+qVmèdsV}ižNT*:deRC ﹒ӳE~'Wc@Koٶ32c$^I6|P)875ϔtZ }  !eOj R4⊲S?I^>7Pk-qrb![.!D(J)> endobj 256 0 obj << /Length1 1647 /Length2 8956 /Length3 0 /Length 9802 /Filter /FlateDecode >> stream xڭweTܲ6Z܂KRݭx @HRwhZŊ/n-)R]/}{|syfY+z2vP"h:xt.P1un]  xĄ܁pG(D@[_LL  uqwtlF윜\qy9:@,?<` _8wrZ&*J6%MtlBh PwB`@v=By䒁0Wc]aG8{)n Ww裇#H apcVmyſ넃raj񧥿GGn@o\6@#l2<`Vp:Xہ0##gֽ+h_^U#` <洅?vp`=' b33EXA!`W L `ߩ E7qU_=`Mk{5k?lpmPkGFON!qxT_Go#Lhbt;B"uA||m!BGPIIض9k?N\LFP:zEs g k7?OFb 3Gzpkl_z@7 V")=+^G;,o7̵ _\\J\ 0"~gznMc )# _@YH9zE^ƎQʰE-:H;{0ga3sW@w $늶wX7/Y{zvuQqc1Kxⱼ v˥zijPTCcdf$ O{Hl˨KsE-jk(~XXH "w6>b˶z A>r.,T~g[j28LӼWt@ &+um%1Y7'Rt8B>`P Ak !j;*-jPλΆ3X/)@veفYsn\(9d0gzٍjZlb~M*1bN+C߲*MQϬe2% {hM fr~q]Ï_f,*F̭Oc_O1ܔfj4f%zeN)bښQ~;B}2yzО1j-QLОclJb*W9؀U}oƌ>ԉ)QwQ[-g?)nZ rVlʻNE"\%|[>[Oun'FP~\9—1 xv0AƏW:;!W:`t#T \64h^).:X9Q< !O/VACz`BbTx_WÉ[A&T]øx盢l{yFe`_#Bo9O߀z3ۼ 2mmqhUu<1eY9}?hUd[J5xAO,ŊixpC&#O>N'4 ϰFru/&\uj|odBl8e3?mB45W R,]7hƟ'תpwQvW$NUkv-Q[=l0Ğ'y>@l W1OUz*h/qTg2`|؏ޏ__pqVC<{ ʪys%#3賢/`;vwĤΣ`e4 "hWe*J! jh5vZh5o.z"q@!ɲχGû'pm!oO/O1޸ɉke:]n) W@g:ӂBc_,5b]{T.9Mf]G"jY>ǤF}y"֫u{EY̺Q&xڡ%X)t1O5'\uq_2 xBvf|imgq ^u$tL\|gc|#&"2qנ\W99fISíCt7/?+Sr'1;; |ʝz$w#fӉ35ϐ9XTrM2\2+j3t+PuC4(˄⸌z%A!RWx QT}WqUakyk\}8nmj%>+Uit1PGh}HK @h(n-dÐj_xGf{N*@"^!UTP VZNC=}Or$Px\@)vڐke9(ofLŚw)d4]B~k⦵gIA˰#G:&0/4+k߬-zSJrMug![H.%e\Jyk눌[ρ{86F- -N}-gt^EU]y"! o0f%i9Tn78 ;x8G_XHaInj2{_W߿K4ע/+o5)F;ȖgM<aÌ=jd29o*@۵ OwՓBs'NY(őjL ܅:5ggbԙ9IbAQ$gl0eNж;ĽߤeMX0;=]jOH4IC_V Q*ϟP$+ܖ=B7]b-g@$֘ 2g!~i _,J.Ta̕Tcm6݄ *򭝂b5߇,B\>Wu 0hNj]p$zR:6n%3 /:mPݰ'7#7;ԋlpaӊG FogQXҐ+ZRnUbg[}҈jhp{J.'ں"dVQQN<1"(c^Byy?n(B8BfapJRRU$|@xTYXjS![{r&rQmRhesBpK<({eRZ$Lo B00!]&ޒ2r7 ʕvK*]GKˣf쵲/=4۽Fj LzgaTpbYɪo@cuOV %~cEnT NlŲIOn~j xؼoUjƋϤ]QOVj-O2UB3 v*"lѫ<Iޤ؝f:VN ,N3|Uhuky~VuF+%P:J N,4^B׍_gb= _fo+Cr}N#~H-2MFU b yIv %3@ Dx"S0h7HνÜ[XڳBlӸ47/}dkR c5U7iVāp`/aO]& >8uV :cJ%ڵ>-:JiЎ~[LIVcNwȘA4E=ս@F^A׾j ?W8o/̡ Zw෡k\-p(Q5o46 $j-*̾µ4y%>U =3a- f>k 'j٣략r.AkZ\4FJ6Y" ?ϻyMJQb`Ϝf]ƞnmpig4$y;&0<̽mSi]/yAjlk7|/k0=?vj' V hrڮqFhr:;mޜC\34ԽSǹKL=^Չ/fq֌>ɳv!2Cӎʕ$k޺h. >mhz"w"Q|cpFOxAS.]O?A77N9 { jTTF%ϻIJsBk#òÜսVfN7_] |=g0nw MF[pr+uȧ/s`[KeVl!S!v:  ?[ 84zۏPcF%[42z`*ʣͳ!4 YgٽkN܄ 71|S6E^nc?*ƌl ܣ.g"CSԪ|Uֽ+$Z{IF9I$ g~m)7 $]=+(#WRs[lГ-G{L|Kg#^X!#+9|0B8;ڪ6j>Lf46U+mCo` ܉A5@ W&:8()9K3U{+򏂾NTh3$VQ 0\8 xMmgDlHN򿢄9@OyGf<d;Hĸ?.tGS&}8ȝr**2pdGS@iaĚ; vRxBNzrjN(-^.9_@903хfw zyWQvBVC“Chl A,͆A-8^#y0ʽdPN_0!Lj1P֌}6!5ڵJq2iYA&snK<6e|‰P9yWc9r}UJSu-MM|sRhܯ=i]Aj-k-~#^ no1-Q>P`Rq9,!8װ6˶%Q32M [jRTgÐYO?`) RK1e\rIIaA~/Ts̺$>=w äY7- 9}! rZcHŇsCnd/1]֫Lz {Ҧe>yQBXWVNf4O1U!]sO7 RAb1m RۮL{_i.N_?{<RuR^l5wVih /)jĊ$ye徥im@&Sgo[l4be}RGj .Cb(LDγ%}ꅹNу17oc|;w# cp6lK\nJN{k'e},=u5O; 6UZCޔN`@^LR+*PV<| AU?^,o=؞-除۪E (\k!Ag}?ԙ*\Y 0UYX2fc0sTNuhx=xd |+%칕 o=c_BW>FyM̉cb%.[Ոuǩ}0cڅOΎ" fMRnF,:Ƈc4uGw?YGp|{XrAh, ۴KR}O77~?:A0f{r>v )qtE2{np1H& ?W>F8bRL)aAD48~dpKGdw3.[,ƒyy/z M*{xF+C6K C?Q]{GCVl|@,v҈YRM2{VSa@)HCш}He%I%CH]tkr}U|VNɏSLu gs  w~uIP436gB+[Rv)2"pAQLmKțXm+J]ѩߔ\7Bj2(I8 VzoCfEa3>7(Ry%Dp=U˔3e*r,uX}f5uuxqFxZ$5]!0",KE< dSe/n y}=(}ҙyiroT=y7ae^뉩e6;[~RUg svN}EyO1MI.XR׊%n w~9$61ot'RKeHOz.⮴r1 B@v>j)81I1#V*zZ-7Y)gNl-7Ăԡg>SۛYu+TD17['6K UC:.n6p0{m~A ۬KՍ;\ /sZwŮl^ ֝ԔG.lD%9Ou|* ިp>P#hXCK!Zm+lF6;2WXcc%}&P >Z}}mJDg*6l,\G$.XZY)t}5yRih ٶN9LTJEl4tldh{YZԍ $xȢ%TԶ\q.T>/IC8iڨ RkN:+ _.%d1t brS(tI5v8^p-㩣;&q1|?+4$S'+:`\6lԶbE%o#0WYb&̪qziNÛ .hxĹv֖K]Ե]-v_N3+cCp+ ,]gG߮abKXObMW>э`9:x]$AmI'^u.mO]-kdUJ`vX1itNv~#,n!=`p2m޷D[?z7ϵO^+ESK#zV|j3r c_v>ϬLK2IuOf"ͅwܣ92 "&@~uŚ+ʼnx':AQuPaU4\•(d:& n+d4P1g=Yj܂6̃L XLb"0T50u>(y7QuUk=r Iq!=^YiƏ%#g ok [N :l{(!h1\itސKT'ͬ2#u h\}R@K*'0/-JnmI^(w)mm|fG >Bm[DU203wllwC3q3_iT-3Z_ D2 e"9fCY졊QᨬfhT`b_2wUy0 ,!Hz@Is웢`ksOPg"5ӰB?0H;ZP?޲{g f` :]Œ~]5.宛\xjo-/*Rk8Rr [E ǧgFaˡt F/mK99S/`t3_JI"R1H\EFA'QՒ(QbgmסW3<XOg<)|VlڼFC9XhhM[X&RX} I|flu\IYq#?'<3{JX#'x0=Xq* +6zzHēG|f*o#.-ci"V;!F򮠸0;oK dissɾ#N*.#̺i-aN D."{ǹГ'Rhzc;%VXA^En endstream endobj 257 0 obj << /Type /FontDescriptor /FontName /YVGGEZ+NimbusRomNo9L-ReguItal /Flags 4 /FontBBox [-169 -270 1010 924] /Ascent 669 /CapHeight 669 /Descent -193 /ItalicAngle -15 /StemV 78 /XHeight 441 /CharSet (/C/P/S/a/c/e/five/four/g/h/i/l/m/n/one/p/period/r/s/six/t/three/two/v/y) /FontFile 256 0 R >> endobj 242 0 obj << /Type /Encoding /Differences [2/fi/fl 33/exclam/quotedbl/numbersign/dollar 39/quoteright/parenleft/parenright 44/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight 58/colon/semicolon 61/equal 64/at/A 67/C/D/E/F/G/H/I 76/L/M/N/O/P 82/R/S/T/U/V/W/X/Y/Z/bracketleft 93/bracketright 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 149/bullet 169/copyright] >> endobj 175 0 obj << /Type /Font /Subtype /Type1 /BaseFont /SFAHAV+NimbusMonL-Regu /FontDescriptor 249 0 R /FirstChar 34 /LastChar 122 /Widths 243 0 R /Encoding 242 0 R >> endobj 96 0 obj << /Type /Font /Subtype /Type1 /BaseFont /TEHGZT+NimbusSanL-Bold /FontDescriptor 251 0 R /FirstChar 2 /LastChar 121 /Widths 247 0 R /Encoding 242 0 R >> endobj 147 0 obj << /Type /Font /Subtype /Type1 /BaseFont /BNHWSW+NimbusRomNo9L-Medi /FontDescriptor 253 0 R /FirstChar 2 /LastChar 121 /Widths 245 0 R /Encoding 242 0 R >> endobj 102 0 obj << /Type /Font /Subtype /Type1 /BaseFont /EEEGRV+NimbusRomNo9L-Regu /FontDescriptor 255 0 R /FirstChar 2 /LastChar 169 /Widths 246 0 R /Encoding 242 0 R >> endobj 148 0 obj << /Type /Font /Subtype /Type1 /BaseFont /YVGGEZ+NimbusRomNo9L-ReguItal /FontDescriptor 257 0 R /FirstChar 46 /LastChar 121 /Widths 244 0 R /Encoding 242 0 R >> endobj 97 0 obj << /Type /Pages /Count 6 /Parent 258 0 R /Kids [90 0 R 99 0 R 144 0 R 170 0 R 196 0 R 201 0 R] >> endobj 222 0 obj << /Type /Pages /Count 3 /Parent 258 0 R /Kids [214 0 R 224 0 R 237 0 R] >> endobj 258 0 obj << /Type /Pages /Count 9 /Kids [97 0 R 222 0 R] >> endobj 259 0 obj << /Type /Outlines /First 3 0 R /Last 67 0 R /Count 6 >> endobj 87 0 obj << /Title 88 0 R /A 85 0 R /Parent 67 0 R /Prev 83 0 R >> endobj 83 0 obj << /Title 84 0 R /A 81 0 R /Parent 67 0 R /Prev 79 0 R /Next 87 0 R >> endobj 79 0 obj << /Title 80 0 R /A 77 0 R /Parent 67 0 R /Prev 75 0 R /Next 83 0 R >> endobj 75 0 obj << /Title 76 0 R /A 73 0 R /Parent 67 0 R /Prev 71 0 R /Next 79 0 R >> endobj 71 0 obj << /Title 72 0 R /A 69 0 R /Parent 67 0 R /Next 75 0 R >> endobj 67 0 obj << /Title 68 0 R /A 65 0 R /Parent 259 0 R /Prev 55 0 R /First 71 0 R /Last 87 0 R /Count -5 >> endobj 63 0 obj << /Title 64 0 R /A 61 0 R /Parent 59 0 R >> endobj 59 0 obj << /Title 60 0 R /A 57 0 R /Parent 55 0 R /First 63 0 R /Last 63 0 R /Count -1 >> endobj 55 0 obj << /Title 56 0 R /A 53 0 R /Parent 259 0 R /Prev 39 0 R /Next 67 0 R /First 59 0 R /Last 59 0 R /Count -1 >> endobj 51 0 obj << /Title 52 0 R /A 49 0 R /Parent 39 0 R /Prev 47 0 R >> endobj 47 0 obj << /Title 48 0 R /A 45 0 R /Parent 39 0 R /Prev 43 0 R /Next 51 0 R >> endobj 43 0 obj << /Title 44 0 R /A 41 0 R /Parent 39 0 R /Next 47 0 R >> endobj 39 0 obj << /Title 40 0 R /A 37 0 R /Parent 259 0 R /Prev 11 0 R /Next 55 0 R /First 43 0 R /Last 51 0 R /Count -3 >> endobj 35 0 obj << /Title 36 0 R /A 33 0 R /Parent 11 0 R /Prev 23 0 R >> endobj 31 0 obj << /Title 32 0 R /A 29 0 R /Parent 23 0 R /Prev 27 0 R >> endobj 27 0 obj << /Title 28 0 R /A 25 0 R /Parent 23 0 R /Next 31 0 R >> endobj 23 0 obj << /Title 24 0 R /A 21 0 R /Parent 11 0 R /Prev 19 0 R /Next 35 0 R /First 27 0 R /Last 31 0 R /Count -2 >> endobj 19 0 obj << /Title 20 0 R /A 17 0 R /Parent 11 0 R /Prev 15 0 R /Next 23 0 R >> endobj 15 0 obj << /Title 16 0 R /A 13 0 R /Parent 11 0 R /Next 19 0 R >> endobj 11 0 obj << /Title 12 0 R /A 9 0 R /Parent 259 0 R /Prev 7 0 R /Next 39 0 R /First 15 0 R /Last 35 0 R /Count -4 >> endobj 7 0 obj << /Title 8 0 R /A 5 0 R /Parent 259 0 R /Prev 3 0 R /Next 11 0 R >> endobj 3 0 obj << /Title 4 0 R /A 1 0 R /Parent 259 0 R /Next 7 0 R >> endobj 260 0 obj << /Names [(0:0) 95 0 R (0:101) 241 0 R (0:15) 150 0 R (0:17) 172 0 R (0:18) 151 0 R (0:20) 173 0 R] /Limits [(0:0) (0:20)] >> endobj 261 0 obj << /Names [(0:21) 174 0 R (0:22) 176 0 R (0:23) 152 0 R (0:25) 177 0 R (0:26) 153 0 R (0:28) 178 0 R] /Limits [(0:21) (0:28)] >> endobj 262 0 obj << /Names [(0:29) 179 0 R (0:30) 180 0 R (0:31) 181 0 R (0:32) 182 0 R (0:33) 183 0 R (0:34) 184 0 R] /Limits [(0:29) (0:34)] >> endobj 263 0 obj << /Names [(0:35) 185 0 R (0:36) 186 0 R (0:37) 187 0 R (0:38) 188 0 R (0:39) 189 0 R (0:40) 190 0 R] /Limits [(0:35) (0:40)] >> endobj 264 0 obj << /Names [(0:41) 154 0 R (0:43) 191 0 R (0:44) 192 0 R (0:45) 193 0 R (0:46) 194 0 R (0:47) 198 0 R] /Limits [(0:41) (0:47)] >> endobj 265 0 obj << /Names [(0:48) 155 0 R (0:50) 199 0 R (0:53) 157 0 R (0:55) 204 0 R (0:56) 205 0 R (0:57) 206 0 R] /Limits [(0:48) (0:57)] >> endobj 266 0 obj << /Names [(0:58) 207 0 R (0:59) 208 0 R (0:60) 209 0 R (0:61) 158 0 R (0:63) 210 0 R (0:64) 159 0 R] /Limits [(0:58) (0:64)] >> endobj 267 0 obj << /Names [(0:66) 211 0 R (0:67) 212 0 R (0:70) 161 0 R (0:72) 217 0 R (0:73) 218 0 R (0:74) 219 0 R] /Limits [(0:66) (0:74)] >> endobj 268 0 obj << /Names [(0:75) 162 0 R (0:77) 220 0 R (0:78) 221 0 R (0:81) 227 0 R (0:82) 228 0 R (0:83) 164 0 R] /Limits [(0:75) (0:83)] >> endobj 269 0 obj << /Names [(0:85) 229 0 R (0:86) 230 0 R (0:87) 231 0 R (0:88) 232 0 R (0:89) 165 0 R (0:91) 233 0 R] /Limits [(0:85) (0:91)] >> endobj 270 0 obj << /Names [(0:92) 234 0 R (0:93) 166 0 R (0:95) 235 0 R (0:96) 167 0 R (0:98) 240 0 R (0:99) 168 0 R] /Limits [(0:92) (0:99)] >> endobj 271 0 obj << /Names [(0:configuration) 160 0 R (0:ldap) 156 0 R (0:mail) 163 0 R (0:preliminary) 149 0 R (1.0) 2 0 R (2.0) 6 0 R] /Limits [(0:configuration) (2.0)] >> endobj 272 0 obj << /Names [(3.0) 10 0 R (3.1.1) 14 0 R (3.2.1) 18 0 R (3.3.1) 22 0 R (3.3.1.2) 26 0 R (3.3.2.2) 30 0 R] /Limits [(3.0) (3.3.2.2)] >> endobj 273 0 obj << /Names [(3.4.1) 34 0 R (4.0) 38 0 R (4.5.1) 42 0 R (4.6.1) 46 0 R (4.7.1) 50 0 R (5.0) 54 0 R] /Limits [(3.4.1) (5.0)] >> endobj 274 0 obj << /Names [(5.8.1) 58 0 R (5.8.3.2) 62 0 R (6.0) 66 0 R (6.10.1) 74 0 R (6.11.1) 78 0 R (6.12.1) 82 0 R] /Limits [(5.8.1) (6.12.1)] >> endobj 275 0 obj << /Names [(6.13.1) 86 0 R (6.9.1) 70 0 R (Doc-Start) 94 0 R (page.1) 93 0 R (page.2) 101 0 R (page.3) 203 0 R] /Limits [(6.13.1) (page.3)] >> endobj 276 0 obj << /Names [(page.4) 216 0 R (page.5) 226 0 R (page.6) 239 0 R (page.iii) 146 0 R] /Limits [(page.4) (page.iii)] >> endobj 277 0 obj << /Kids [260 0 R 261 0 R 262 0 R 263 0 R 264 0 R 265 0 R] /Limits [(0:0) (0:57)] >> endobj 278 0 obj << /Kids [266 0 R 267 0 R 268 0 R 269 0 R 270 0 R 271 0 R] /Limits [(0:58) (2.0)] >> endobj 279 0 obj << /Kids [272 0 R 273 0 R 274 0 R 275 0 R 276 0 R] /Limits [(3.0) (page.iii)] >> endobj 280 0 obj << /Kids [277 0 R 278 0 R 279 0 R] /Limits [(0:0) (page.iii)] >> endobj 281 0 obj << /Dests 280 0 R >> endobj 282 0 obj << /Type /Catalog /Pages 258 0 R /Outlines 259 0 R /Names 281 0 R /PageMode/UseOutlines/PageLabels << /Nums [0 << /P (1) >> 1 << /P (2) >> 2 << /P (iii) >> 3 << /P (1) >> 4 << /P (2) >> 5 << /P (3) >> 6 << /P (4) >> 7 << /P (5) >> 8 << /P (6) >> ] >> /OpenAction 89 0 R >> endobj 283 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.3)/Keywords() /CreationDate (D:20081228120010+01'00') /ModDate (D:20081228120010+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 (Web2C 7.5.6) kpathsea version 3.5.6) >> endobj xref 0 284 0000000000 65535 f 0000000015 00000 n 0000002419 00000 n 0000093056 00000 n 0000000054 00000 n 0000000085 00000 n 0000010694 00000 n 0000092972 00000 n 0000000124 00000 n 0000000159 00000 n 0000012116 00000 n 0000092849 00000 n 0000000198 00000 n 0000000239 00000 n 0000012238 00000 n 0000092775 00000 n 0000000281 00000 n 0000000317 00000 n 0000012420 00000 n 0000092688 00000 n 0000000359 00000 n 0000000400 00000 n 0000012724 00000 n 0000092564 00000 n 0000000442 00000 n 0000000478 00000 n 0000012907 00000 n 0000092490 00000 n 0000000522 00000 n 0000000588 00000 n 0000013827 00000 n 0000092416 00000 n 0000000632 00000 n 0000000687 00000 n 0000014980 00000 n 0000092342 00000 n 0000000729 00000 n 0000000761 00000 n 0000016613 00000 n 0000092217 00000 n 0000000801 00000 n 0000000853 00000 n 0000016735 00000 n 0000092143 00000 n 0000000895 00000 n 0000000925 00000 n 0000017221 00000 n 0000092056 00000 n 0000000967 00000 n 0000001012 00000 n 0000017404 00000 n 0000091982 00000 n 0000001054 00000 n 0000001086 00000 n 0000018494 00000 n 0000091857 00000 n 0000001126 00000 n 0000001175 00000 n 0000018615 00000 n 0000091759 00000 n 0000001217 00000 n 0000001252 00000 n 0000018918 00000 n 0000091698 00000 n 0000001296 00000 n 0000001352 00000 n 0000020803 00000 n 0000091586 00000 n 0000001392 00000 n 0000001443 00000 n 0000021046 00000 n 0000091512 00000 n 0000001485 00000 n 0000001523 00000 n 0000021412 00000 n 0000091425 00000 n 0000001566 00000 n 0000001604 00000 n 0000021656 00000 n 0000091338 00000 n 0000001647 00000 n 0000001684 00000 n 0000022703 00000 n 0000091251 00000 n 0000001727 00000 n 0000001764 00000 n 0000022886 00000 n 0000091177 00000 n 0000001807 00000 n 0000001848 00000 n 0000002126 00000 n 0000002478 00000 n 0000001898 00000 n 0000002242 00000 n 0000002301 00000 n 0000002360 00000 n 0000090135 00000 n 0000090828 00000 n 0000003171 00000 n 0000002994 00000 n 0000002548 00000 n 0000003111 00000 n 0000090477 00000 n 0000004712 00000 n 0000004868 00000 n 0000005024 00000 n 0000005171 00000 n 0000005318 00000 n 0000005464 00000 n 0000005610 00000 n 0000005757 00000 n 0000005904 00000 n 0000006051 00000 n 0000006198 00000 n 0000006345 00000 n 0000006492 00000 n 0000006638 00000 n 0000006785 00000 n 0000006934 00000 n 0000007083 00000 n 0000007230 00000 n 0000007377 00000 n 0000007524 00000 n 0000007671 00000 n 0000007818 00000 n 0000007965 00000 n 0000008123 00000 n 0000008281 00000 n 0000008428 00000 n 0000008575 00000 n 0000008721 00000 n 0000008867 00000 n 0000009016 00000 n 0000009165 00000 n 0000009312 00000 n 0000009459 00000 n 0000009605 00000 n 0000009751 00000 n 0000009898 00000 n 0000010045 00000 n 0000010192 00000 n 0000010339 00000 n 0000010486 00000 n 0000010754 00000 n 0000004261 00000 n 0000003254 00000 n 0000010633 00000 n 0000090304 00000 n 0000090650 00000 n 0000012055 00000 n 0000012177 00000 n 0000012359 00000 n 0000012664 00000 n 0000012846 00000 n 0000013766 00000 n 0000014919 00000 n 0000016552 00000 n 0000016674 00000 n 0000017160 00000 n 0000017343 00000 n 0000018433 00000 n 0000018554 00000 n 0000018857 00000 n 0000020742 00000 n 0000020985 00000 n 0000021351 00000 n 0000021595 00000 n 0000021777 00000 n 0000022825 00000 n 0000014131 00000 n 0000011936 00000 n 0000010864 00000 n 0000012298 00000 n 0000012481 00000 n 0000012542 00000 n 0000089964 00000 n 0000012603 00000 n 0000012785 00000 n 0000012968 00000 n 0000013029 00000 n 0000013090 00000 n 0000013152 00000 n 0000013213 00000 n 0000013275 00000 n 0000013336 00000 n 0000013398 00000 n 0000013459 00000 n 0000013521 00000 n 0000013582 00000 n 0000013643 00000 n 0000013704 00000 n 0000013888 00000 n 0000013949 00000 n 0000014010 00000 n 0000014071 00000 n 0000015102 00000 n 0000014738 00000 n 0000014241 00000 n 0000014857 00000 n 0000015041 00000 n 0000017586 00000 n 0000016372 00000 n 0000015199 00000 n 0000016491 00000 n 0000016795 00000 n 0000016856 00000 n 0000016917 00000 n 0000016978 00000 n 0000017039 00000 n 0000017099 00000 n 0000017282 00000 n 0000017465 00000 n 0000017525 00000 n 0000019101 00000 n 0000018252 00000 n 0000017696 00000 n 0000018372 00000 n 0000018676 00000 n 0000018736 00000 n 0000018796 00000 n 0000018979 00000 n 0000019040 00000 n 0000090942 00000 n 0000021838 00000 n 0000020561 00000 n 0000019211 00000 n 0000020681 00000 n 0000020864 00000 n 0000020925 00000 n 0000021107 00000 n 0000021168 00000 n 0000021229 00000 n 0000021290 00000 n 0000021473 00000 n 0000021534 00000 n 0000021717 00000 n 0000023007 00000 n 0000022522 00000 n 0000021948 00000 n 0000022642 00000 n 0000022764 00000 n 0000022946 00000 n 0000089561 00000 n 0000023104 00000 n 0000023479 00000 n 0000023802 00000 n 0000024275 00000 n 0000024917 00000 n 0000025388 00000 n 0000038406 00000 n 0000038800 00000 n 0000049083 00000 n 0000049438 00000 n 0000060306 00000 n 0000060616 00000 n 0000078807 00000 n 0000079331 00000 n 0000089253 00000 n 0000091035 00000 n 0000091103 00000 n 0000093127 00000 n 0000093271 00000 n 0000093417 00000 n 0000093563 00000 n 0000093709 00000 n 0000093855 00000 n 0000094001 00000 n 0000094147 00000 n 0000094293 00000 n 0000094439 00000 n 0000094585 00000 n 0000094731 00000 n 0000094905 00000 n 0000095055 00000 n 0000095197 00000 n 0000095349 00000 n 0000095509 00000 n 0000095641 00000 n 0000095743 00000 n 0000095845 00000 n 0000095943 00000 n 0000096025 00000 n 0000096063 00000 n 0000096353 00000 n trailer << /Size 284 /Root 282 0 R /Info 283 0 R /ID [<97AD9771D3233F41A2184F459653CAED> <97AD9771D3233F41A2184F459653CAED>] >> startxref 96684 %%EOF phamm-0.6.2/docs/install.xml0000644000175300017530000001670712256607311014753 0ustar phammphamm Phamm Install Phamm Team
team@phamm.org
24/09/2008 Copyright © 2008 Alessandro De Zorzi, Mirko Grava Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation.
Preliminary Obtain Phamm To obtain last version of Phamm, please visit the web site www.phamm.org. Files can be download directly from http://open.rhx.it/phamm/ Prepare the files Untar the archive and put the directory phamm-X.X.X in a web accessible director (Example: /var/www/). tar xvfz phamm-X.X.X.tar.gz mv phamm /var/www/ You can obtain to configure httpd to use Alias and make accessible from web only the sub-directory phamm/www-data. Requirements Phamm should works any web server that support PHP. Phamm Team tested Phamm with Apache and lighttpd. You need a OpenLDAP server configured and a Webbrowser (doh!). Optional requirements required for email postfix email server pop3/imap: severs (that support ldap)examples: cyrus,courier. (tested with apache) gnarwl: for autoresponding:(to first user email) amavisd: for anti-virus/anti-spam: spamassassain clam-av or similar av-software (tested with Clam-AV) Optional requirements for ftp pure-ftpd pure-ftpd-ldap-backend Contents In the examples folder you can find examples of all the configuration files for each server section outlined below. Please remember these are examples and they will have to be edited to suit your own personal requirements. Configure LDAP Service Schema Copy schema/phamm.schema file in your schema directory (ex. /etc/ldap/schema/ for Debian). Probably you need other schema files, you can copy they from respective projects or from http://open.rhx.it/phamm/schema/ amavis.schema dnsdomain2.schema ISPEnv2.schema pureftpd.schema radius.schema samba.schema Copy examples/conf/slapd/slapd.conf to override your slapd.conf (ex. /etc/ldap/ for Debian or /etc/openldap). Add YOUR password for the cn admin with the command slappasswd. The slapd.conf has the loglevel set to 0. For debugging set it to 128 or start slapd with /usr/sbin/slapd -d1 as this will display to screen and save you the trouble of searching your log files for problems. For improve security we suggest to use Phamm LDAP ACL definition if you do not use already ACL please copy examples/conf/phamm/phamm.acl in the same place of the slapd.conf (ex. /etc/ldap/ for Debian or /etc/openldap) otherwise comment the line below in your slapd.conf # include /etc/ldap/phamm.acl then restart LDAP service. Change phamm password Create the password you want for the cn phamm with slappasswd and amend it in the examples/ldif/sample-mail.ldif (the default is rhx) with cut and paste :). Populate ldapadd -v -x -D "cn=admin,dc=example,dc=tld" -W -h localhost -f examples/ldif/sample-main.ldif The password is the first one you created. Phamm configuration Config file If not exists you need to create the main config file in phamm directory from the sample cp config.inc.example.php config.inc.php Then edit config.inc.php. Config file (plugin support) If you wish to use the plugin, please decomment each line you want in $plugins[] lines: $plugins = array(); $plugins[] = "mail"; $plugins[] = "alias"; //$plugins[] = "ftp"; //$plugins[] = "proxy"; Setting mail services There are a couple of excellent general examples of how to setup postfix and courier below these should assist with a more detailed discription of what you find below. http://www.postfix.org/addon.html http://www.faqs.org/docs/Linux-HOWTO/LDAP-Implementation-HOWTO.html#AEN747 http://alinux.washcoll.edu/docs/plc/postfix-courier-howto.html Config Postfix Install Postfix as a full Internet email server, and then add the snips that are in the samples directory to the relevant parts of the Postfix configuration files, remember to reload postfix after making the changes (most postfix configuration files are found in /etc/postfix) ensure the user vmail and the group vmail have been added. if not add them and remember the gid and uid as you need it here and in courier config don't forget to update your transport file and the transport.db file this is required. postmap /etc/postfix/transport Test this by logging into smtp and sending a mail to yourself (then when you set up courier you should have the mail awaiting you) log with /etc/init.d/postfix start; tail -f /var/log/mail.log Config Courier check that authdaemonrc is using ldap as a method to authenticate ie (authmodulelist=ldap), add the snips from the samples folder to the relevent file (normally found in /etc/courier) these files are authldap (configuration of ldap server) test by logging into your pop or imap server and collecting the mail that you sent to your self in setting up postfix. /etc/init.d/courier-authdaemonrc start; tail -f /var/log/mail.log Config Amavis Add the amavis sample data to your amavis.conf file. restart the services and check the logs for dependancies) Config Gnarwl add the sample gnarwl.cfg snip to you gnarwl.cfg. (this normally lives in /etc/gnarwl.cfg) set debug to 3 and test. don't forget to set debug back again when working. cleaner.sh script Edit the cleaner.sh script to reflect the your ldap layout. Phamm does not really delete accounts. Phamm mark them as "Deleting". You can use tools/cleaner.sh to do this with crond.
phamm-0.6.2/docs/phamm_history-it.sgml0000644000175300017530000001421112256607311016730 0ustar phammphamm
Phamm 05 De Zorzi
team@phamm.org
0.1 2007-10-06 dza Prima versione Questo documento ... Phamm .
Storia del progetto Conoscevo Mirko Grava da neanche un anno e mi dimostr come nel 2002 installava e configurava server mail con domini virtuali utilizzando come base dati LDAP, certo un sistema all'avanguardia pensando che esso era totlamente basato su software open-source. Come front-end di gestione web Mirko usava Jamm, un software scritto in linguaggio JSP. Alle installazioni di base effettuate usando l'howto di Jamm Mirko aggiungeva via via sempre pi caratteristiche e novit, prima fra tutte il vacation e si present ben presto l'esigenza di avere a disposizione un software modificabile e velocemente adattabile alle nuove esigenze e qui fui interpellato. Non conoscendo il linguaggio JSP pensai che forse non sarebbe stato difficile riscrivere totalmente il front-end in PHP. L'idea piacque a Mirko in quanto l'installazione dell'esecutore di Java quasi sempre installato appositamente per il front-end Jamm poteva essere evitata adottando pi comodamente una installazione del server web con supporto PHP. Inoltre usando PHP si sarebbe usato solo software libero gi disponibili su tutte le distribuzioni Linux, un vantaggio non trascurabile. Non fu difficile dare le basi al progetto, in un pomeriggio c'era un qualcosa che fu la versione 0.0.1 che gestiva i dati in sola lettura. Inizialmente decidemmo di mantenere lo schema del progetto Jamm e di ricreare pezzo per pezzo tutte le caratteristiche di Jamm ma riscrivendo totalmente il codice in PHP. Il 04/06/2004 11:14 si annunciava sulla mailing list ufficiale di Phamm (che contava meno di cinque iscritti) la versione 0.0.2 destinata ai soli sviluppatori. Dalla versione 0.0.9 si cominciava a fare sul serio, Phamm a parte alcune feature mancante e qualche bug di giovinezza era usabile quanto Jamm, in sostanza la serie 0.1.x segna l'entrata di Phamm sui sistemi di produzione RHX (la nostra azienda). Gi da queste prime versioni alcuni temerari sistemisti iniziarono a usare Phamm e a fornire le prime traduzioni. Nello stesso periodo Mirko e io eravamo sorpresi ma carichi nel vedere che altre persone erano interessate al progetto, probabilmente per gli stessi motivi che avevano spinto noi alla scrittura iniziale di Phamm. I plugin L'idea dei plugin non nuova ed era un obiettivo a cui volevo arrivare, la versione 0.2.0 segna l'introduzione del supporto dei plugin. Il primo plugin a essere scritto fu il plugin pdns. phamm.schema Studiando pi a fondo LDAP e seguento una pianificazione mirata si decise di abbandonare jamm.schema questo non voleva essere una scelta per customizzare il progetto, anzi la idea di creare delle objectClass generiche che fossero sub di person dimostra il voler utilizzare quanto gi disponibile e aprire la strada per l'integrazione di nuove funzionalit: i plugin. La versione 0.3.0 segna l'entrata del phamm.schema. A breve fu richiesto a IANA e assegnato a RHX Studio Associato un OID utilizzato nel progetto. L'OID assegnato il numero 22339 ed pubblicato sulla URL http://www.iana.org/assignments/enterprise-numbers. phamm04 La versione 0.4.0 segna dei cambiamenti sostanziali alla struttura del file-system come la separazione della directory www-data per separare i file accessibili da web. Nel 2005 phamm04 era ormai utilizzato da molte persone si presentava tuttavia alcuni limiti derivanti dallo sviluppo precoce del progetto dettato dalla necessit di rimpiazzare in produzione Jamm. Si decise quindi di aprire non nuovo branch ma un nuovo modulo riscrivendo il codice al 100%. phamm05 Alla fine del 2005 buttai le basi per phamm05 il server CVS del progetto era ospitato Savannah (gnu.org) dopo essere transitato su diversi server cvs,svn di nostra propriet per dare un accesso pubblico al sorgente e pi in linea con le esigenze di un progetto open-source. Dopo una lunga gestazione durata quasi due anni, finalmente a settembre 2007 phamm05 era usabile. In breve periodo si sussegguirono alcune versioni che correggievano errori e introducevano le feature mancanti. XML Temaple 4 Phamm Parallelamente allo sviluppo di Phamm mi interesai al progetto PHPLdapAdmin che per sua natura (linguaggio PHP) era una montagna di codice che svolgeva raffinate funzioni di accesso in lettura/scrittura a diversi server LDAP. In particolare mi interessava il sistema di definizione dei Template che usava un file XML per la generazione di maschere di creazione di nuovi oggetti. Per un po' studiai il sistema e fornii anche alcune patch che furono accettate dagli sviluppatori perch tentavo di capire se PHPLdapAdmin avrebbe potuto essere un sistema che si prestava alla customizzazione, tramite appunto i template per le esigenze di Phamm. Dopo qualche mese decisi che PHPLdap admin i cui obiettivi erano quelli di fornire un frontedn generico di accesso ai server LDAP non erano compatibili con Phamm che doveva svolgere compiti molto pi precisi. Il lavoro effettuato con PLA fu comunque un buon punto di partenza per la creazione del nuovo sistema di template XML di Phamm.
phamm-0.6.2/docs/phamm_history-it.pdf0000644000175300017530000015511712256607311016552 0ustar phammphamm%PDF-1.4 1 0 obj << /S /GoTo /D (0.1.1) >> endobj 4 0 obj (1. Storia del progetto) endobj 5 0 obj << /S /GoTo /D (0.1.1.2) >> endobj 8 0 obj (1.1. I plugin) endobj 9 0 obj << /S /GoTo /D (0.1.2.2) >> endobj 12 0 obj (1.2. phamm.schema) endobj 13 0 obj << /S /GoTo /D (0.1.3.2) >> endobj 16 0 obj (1.3. phamm04) endobj 17 0 obj << /S /GoTo /D (0.1.4.2) >> endobj 20 0 obj (1.4. phamm05) endobj 21 0 obj << /S /GoTo /D (0.1.5.2) >> endobj 24 0 obj (1.5. XML Temaple 4 Phamm) endobj 25 0 obj << /S /GoTo /D [26 0 R /Fit ] >> endobj 28 0 obj << /Length 1459 /Filter /FlateDecode >> stream xڍWɒ6W6RE\E؉csJ&dTH@2N@,\DR: 7~xS/,Mߡ>~J^IZ+_EV%!-7&?>޽97iTIa1=a${/ Hm4J_^8>i!tKV!LW!EJW7 PW&8|'8$?7 ~3Bi{шXJqIئa-g3X 슢|H{CXN>3 hֱV,]>EC6.G;_AeAȐbJ1OBgCdC(ĕxTHj;b7:Kq_m+adC=ZpORp tg@g$ @uS@$ݸti;~S B KOPʐI3@wY_#*blh _SV5p7D@S ~r{,bt.0ù[ٞ}tT>R>~1?T3W2O/@J^e"68z2+ 9ng 0kd.%nX61Zpmt6Ny#Bj? bCf #c(0)AnSj|n,po< I|%0iN$4_L,KN_ # @_K.E ZaT쒋%PE"F_:u̳ ZGS7 _%zB^hz xcZ=+BhaB3=bpǎTJX(/hg@\6og"f"7.oz½H)-ja>#rP.8܋9hǒ.6㛑3]#YJ#SMj JyڮZpf3luJA>S6 }h=ȕ.쐷%GMXd(z'V|o٥F'e-q]{/Qҹc s!h2](=(C; Tmm-nPbV@_-yQqT 9 Q^YfxzfH!w?=z's {O._ܹYi-Waendstream endobj 26 0 obj << /Type /Page /Contents 28 0 R /Resources 27 0 R /MediaBox [0 0 609.7136 789.0411] /Parent 51 0 R >> endobj 29 0 obj << /D [26 0 R /XYZ 71.731 729.2652 null] >> endobj 30 0 obj << /D [26 0 R /XYZ 71.731 718.3063 null] >> endobj 31 0 obj << /D [26 0 R /XYZ 71.731 718.3063 null] >> endobj 35 0 obj << /D [26 0 R /XYZ 71.731 578.3402 null] >> endobj 42 0 obj << /D [26 0 R /XYZ 76.7123 480.2881 null] >> endobj 2 0 obj << /D [26 0 R /XYZ 243.7455 435.0338 null] >> endobj 43 0 obj << /D [26 0 R /XYZ 71.731 411.2782 null] >> endobj 44 0 obj << /D [26 0 R /XYZ 71.731 341.2206 null] >> endobj 45 0 obj << /D [26 0 R /XYZ 71.731 282.4411 null] >> endobj 46 0 obj << /D [26 0 R /XYZ 71.731 197.7586 null] >> endobj 47 0 obj << /D [26 0 R /XYZ 71.731 138.979 null] >> endobj 27 0 obj << /Font << /F29 34 0 R /F32 38 0 R /F33 41 0 R /F34 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 54 0 obj << /Length 1672 /Filter /FlateDecode >> stream xڍXKs6W҉4c|43nNg@v_Av2:>vh/Z`#΂xƋ> ,"k+~=xlYm~ ̒tK`Fmӑj2LW~8& wR3 $Qip$d+T6aK*0 3BԌ_/(\i׫*87c4vQCdkW{J /Vђp,9ڗ\k7(4vx6qDv)ؙŒ?fȸy*Zq>v}D8܅izq$O( 5&w[.لHΠ4vAЎAspZdOHHz:3Fj̈́ 7bH *)eǍii_~c_e1:1.jKFReͫ88IN+q%E# {8(|tSiqm+k]Sؤ4@@b*Sڀ{TG5e .? Zj2d(-z^Eƚ4n I<%<;@+GT8*XI1!=n`$;%HR*3sB`o= Ζ|L;')z0H(U]᜸&U58uE)u+{YWk m6MU=Қ|?7mW21]4!j./?8};0 ⹷fc`j|Z1pS{3N ZfvTKg ՐaϘZo*'ʩf)Y m2O2sWY5vkYw(2@5Z:Y2(tES)h@$}fzƵYõ XzmLi~/SV04-\G.-|ͳLWWI˱(D\w83SJ^BU.uH8._"Sܲr]@IKðbj?<#l|mǶm^_\<>>2z!h<\nuyWC3mrhh6Ց9#Zc6ꩡ8mZٙaBͮ]oۊzv6SGo. %XB7RlG?\6!8{ !kqԢj'mF>l&9m+VU,#!,:Vv_bo`42bi'ddJ_x|[~x33cd쑻C?8tϋנ&: @r]L!JVL( TߌR=~_hKz6΂-bǼ 'Sx`LBItby39k]c@̍nKwȚ< \H%(\yGΡ…IS3u{] Xd|B"ʉxӖb;(3?MυF4dA[o>G> endobj 55 0 obj << /D [53 0 R /XYZ 71.731 729.2652 null] >> endobj 56 0 obj << /D [53 0 R /XYZ 71.731 718.3063 null] >> endobj 57 0 obj << /D [53 0 R /XYZ 71.731 660.3587 null] >> endobj 58 0 obj << /D [53 0 R /XYZ 71.731 610.6103 null] >> endobj 6 0 obj << /D [53 0 R /XYZ 198.4832 571.3375 null] >> endobj 59 0 obj << /D [53 0 R /XYZ 71.731 548.2203 null] >> endobj 60 0 obj << /D [53 0 R /XYZ 71.731 522.1072 null] >> endobj 10 0 obj << /D [53 0 R /XYZ 255.7527 484.8916 null] >> endobj 61 0 obj << /D [53 0 R /XYZ 71.731 461.9968 null] >> endobj 62 0 obj << /D [53 0 R /XYZ 71.731 391.0785 null] >> endobj 63 0 obj << /D [53 0 R /XYZ 71.731 350.9789 null] >> endobj 14 0 obj << /D [53 0 R /XYZ 214.4362 313.7634 null] >> endobj 64 0 obj << /D [53 0 R /XYZ 71.731 290.8685 null] >> endobj 65 0 obj << /D [53 0 R /XYZ 71.731 245.8531 null] >> endobj 66 0 obj << /D [53 0 R /XYZ 71.731 205.7535 null] >> endobj 18 0 obj << /D [53 0 R /XYZ 214.4362 168.538 null] >> endobj 67 0 obj << /D [53 0 R /XYZ 71.731 145.6431 null] >> endobj 52 0 obj << /Font << /F34 50 0 R /F33 41 0 R /F29 34 0 R >> /ProcSet [ /PDF /Text ] >> endobj 70 0 obj << /Length 1100 /Filter /FlateDecode >> stream xڅVKo6WV(uLvMD+(R;h0`p|$R"I'l_fQ?QѾ=feӟfe^%YkÁ|!uRE^M|U[I@Xg r%VSwKGQN_5M3IEϤ B1?k\Ҵ1MFu;3, b$YRpƲ2ؑ2F\]sȜRYD1 zzqSFi94XaZ+{pF6U. f*z** O[VG3WP-dO*_I.C!?8HO(X(ǣn2yYţj*tYE!BV?C@P/@9 L`KUX?/-۞U⡖~ F𚖩ಳt3 d ^IC0 q4 [y2BXnQQ/f!W+7 ˴i8(|ͧ(Ѯ'l4?C ]zՆ7JЩ T1Wj.9<'~Gh^\lqW˦y "CiW9%esjЩB7* JBmdjٖes>pflP 0my8$k⢴rŒj /vA^&cfȵ?i rּ tuH:xȶZulޘf c X"2 oZA#  ůM{n: VM UF K%m G(0$lDZp g!~f1Xܠqj'(2!p4ccX+8@[5䬀;);IəqX9\3O ַW|{cbn =DXWd/W3->ű25jsh+Û(pYaSTj&,&O83~MȾ{x9\y$-9776endstream endobj 69 0 obj << /Type /Page /Contents 70 0 R /Resources 68 0 R /MediaBox [0 0 609.7136 789.0411] /Parent 51 0 R >> endobj 71 0 obj << /D [69 0 R /XYZ 71.731 729.2652 null] >> endobj 72 0 obj << /D [69 0 R /XYZ 71.731 718.3063 null] >> endobj 73 0 obj << /D [69 0 R /XYZ 71.731 681.096 null] >> endobj 22 0 obj << /D [69 0 R /XYZ 306.8531 641.8231 null] >> endobj 74 0 obj << /D [69 0 R /XYZ 71.731 618.9283 null] >> endobj 75 0 obj << /D [69 0 R /XYZ 71.731 509.1557 null] >> endobj 68 0 obj << /Font << /F34 50 0 R /F33 41 0 R /F29 34 0 R >> /ProcSet [ /PDF /Text ] >> endobj 76 0 obj << /Type /Encoding /Differences [ 0 /.notdef 1/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash/ogonek/ring 10/.notdef 11/breve/minus 13/.notdef 14/Zcaron/zcaron/caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity/lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde 127/.notdef 128/Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal 144/.notdef 147/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis 160/.notdef 161/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] >> endobj 49 0 obj << /Length1 1647 /Length2 6258 /Length3 532 /Length 7123 /Filter /FlateDecode >> stream xtgT.Mz#^B7   ЋAҫt  (D:J'Y߽9]7k%+<3̼ϼƤWnQÐ|R]!M.kqzP(>2BB0"08T `@PRR wC@NcCS. _.{ HO qA`H81@:CPW@YO:S]A&]`6 yBp 9@ɇR0CC<w z uH8 z9.ew)Gy0> F@ݑTV}D:s{BQ0t~CѠP$  !߹!+E掀) sW< ppxzhPܿo_}K wwW??^: rNP>yys;x \Br\G|~]8?S'Ayw]j^ 7gEP l\A 7woS_U'R(œP ezA}!P$rE]1p (/*H@o3_PDWl?@CTo*%%/ WPL+$.z()$IH_gX Pd7U{#A0{!(lT8y/3,$y`pTŲ `{EQiqH-iv̲du]$_mߧmuM(]93!EA,\=w7m*rvLf,L6VF mʯu #pθBXC)ސ6՗lﰧor tY'I{cLJx[W$hGcɮhC㬴]bZ.^c|ƻՉCko (8l(?8ćJ<o9 Ra/V=v$OL8 <,/3ǻpl/3~ެ`u8\I噜k?ME[6^9cI|J{V(I슌I\w\hK}(1Lz#J.(r* X MNr7JMXGDFmf_ |ˋەc`ʳoEyG4< iSrF#_8S3Bt.#;+#G:'{gQZ2Nh_b8D݇V"i(-/>Ңq09E:j+Mړbj;Jje9_]\{㻓Xx ]yŁeUqP[Q`%{+!nڈ+t: 2۶7;n=k%dURz`W3mKoJdi K:q=6Iz/^#@[fu4w {t#Ǒ׵+qfִy!JmjbvtE8 6m47c^;Z~I3pMfU@P<;&aV8+?b#^[6ܚ'Z ׇ霠MI.턙uŒ?H,}؏c|rbCD7gLU׏q]Ү*E0IV'9OH ]-n%O`6=fh1ѷ'{ƨX<(B3V9~_1x%1R5U+}VJI5z*!_Ġ5&X \ˇm`j{YP0)@|KsOjZEsꘈY<0X;yx0w28qL\MxH̠iA_ul8Th|Iɘo68TbYVW֦ynjL.n+Y0zn&$5MA=SC!3yt!50`92ܭ_L9˼"G_?ѭtڻ1}IXIzC|@nB.|ZAo=G2hEzR6lIk٩qMOK[t!? rs\VKf/kp1=R9fy@6b&;[#kjVc{Fxtz^ǫzOԀ狖m<_6c-"D}Ɓ_Cd%*$qU eӻF@bȤIFL~.oȵS D< <4c*q}GU*4/}lZDKG3vOI.7V}jgqSSWykw{a4bk3\?T'HJ>o:6M pXxOP*641~B{'7]9l`TXX\nAԢvNnorJ\+Y&sj5Y&>.hᅮD`-u\qM[I(3ڃs2IUfG'eafO?q" 2z8n}3;Eo8\~ݍa-1fڦJ ~X}F73.RlL"KZk MuwH4JÉ:mIr&GW̒{_[ Z3txt V5K C{MgB2?a6uRǵZ~3uA9W˜o$ȧn̯$>cܦEyڜ.V [l߫rԤ?ym8,QnͧNИvI):%>]`9ِKtGOKD(}|.vU9q!fm,[ ̌ʎD\svRy薴Uwip4N,EIݚT/UÈ);~Mɞ]=Q7l5̗klm&ġ:?žtfgG6u] DIT;68FTANfanHJ&cs2w.&[DR}[2ìٞwR}eM6쓟H4laHq4(b|Zji|%9MNmh=첧}LX!QEZYXd<-xZd/T~:Q٤d¨ULtO1 s*ʼiF&%sME5XyuspUCYAO8>/ٵtm|'}oD3~ugKb:lP;=ʍ (VD}.xbun'$y+:JgL klzmc3bpLA^qmg.nKt/n%d"Q2WjswdS2ZUȒѵY ?9®)Iӱn٬*mW/%ҥx^,sNkcw:! 8{$/k cm(bhJg&z _i"Ic=鰿6'GE*{ynAofm7ѓ nTZ ^}`>5ퟋ y U+ \)ŸHowQ[ ;]nRo304Q g89Ɩ" AxF]T- !sMc֡cǑ9 oBz}yY;1l{@j{d |†\t'_qɧ/^)upj(6% 5E! .K36X>ˮX.؝?^<b? 侑F&%r@Fu8#8E)D*Ua񹭨uӀM"(oѳ/G@q-Nµ_Y L^<7S>*I 艔ATA.r saM#`ۉN!Vxz鱻k+1ӋniDrW?r1-'5[Y::?6kӒi0V: O~V89豶(SmW2m v5c2:1[SE@0w⋍Ӂ]-iL0qTeJI><_re#:K#Dw)YFzL7fp^dZ|tՄ6Du+3R:tf'aֽk'e7@M~x`Be40v>gTfb{K\啞h5Ң]kꇡ*˓{:oGO_H.#SfedH%MIaH22*.}w8CGhNJ(Kc'-LO=Et>̗ }"i@g[߼,m"X]Czleb{168bQrx:wǚ_!M?U3ܒ9jP (/70ƖWw `ݸmi:~ܛ<Ųlw ABvjp@LRNqP(wօKcG2s˦2q+O)#nzk⣶ŢM.?J fF9oKMY?gиO<0S\~6LqzpeR˅ig~ˆ80VNrq 'kk'فb죄oO.4h/DƔO. b@7 +|JnWac6]M H{u;FBNE oah`vלpTFyX= PBtu{{IJrek4wvuf~w"UG'CIweGޒ",\Gë_§7mI􇥆[QſpD)A ܯ12{p}X[N1lc^=kvb"NjMw)!6dSBtZh|o: 0F[jc:P5G*SVHዚ\? Vj(ǥ?fOP @c΢5VqG]eƂR{lYAMʽg -<^ r-sN14o1O&r:A~btZU5+Z^^J<9GLp%,3hkK:xu1ߒ6Cz$>Rjm/̤\N|t '8XpWys^~Fg] VfvrvUk*M'l$xsUv2QuT@r؝NՇk&g&an;|j27dO1RWⲽ)X>nqcjjK|s3Yv<$pNa\/虃fН(o/ըInCwO(-xh.Orr0+lݦcEh;_O<0&W8+IZ=M?~4T 7^{$pW.o ss $`LUu+oq)_Qnq‹K)1v׳[$M FHբOӖt{|86~6-+ln_h\(վ(HڑӺ 7qa9QXyuqd)ՔS$ˣVj%e&7>-G>˿w^\VRUժ}$˻#ݎCp3 ﹩MS K&}{g<&N4Km7> endobj 48 0 obj << /Ascent 669 /CapHeight 669 /Descent -193 /FontName /VNDUXW+NimbusRomNo9L-ReguItal /ItalicAngle -15.5 /StemV 78 /XHeight 441 /FontBBox [-169 -270 1010 924] /Flags 4 /CharSet (/zero/one/two/three/five/P/a/h/m) /FontFile 49 0 R >> endobj 77 0 obj [500 500 500 500 0 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 611 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 0 0 0 0 500 0 0 0 0 722 ] endobj 40 0 obj << /Length1 1630 /Length2 16617 /Length3 532 /Length 17505 /Filter /FlateDecode >> stream xڬct]%۬m۶ܱJ۶mvRW|Ϗkk/̅XI^(`JP3qsQqSpWZEƮVbƮ@& 4^V*uMjZZc0_O+ {w/*p̭lQE%miI:@ht6(ZL.@j3?0v\V݀@TtG o\Vnf$WnZSrpqu1urt$&<]-]bW p0ki`OIu5w=]eY8{_iX[gtg-/_um/ ֜oLS׿-i{s3ӿfns:AT $mf@s8F׿!Tw,3@ -_9_.}n v;wEck1?yWkM?Im_j-r)YZ̍m_ru{3=/j+,Lm!*/]ʟQTL[IF`ew\ռ?w0`DD<>\z.oB,l7!gycWg+OߺU_`MUWc{?Mݜ8k@O)ꒃ)ouZfkv 1^f!jE5=?v+kC~M|y-9~bRRnRtp2"kF\/mCp0iN(CLu:\?Sc=9"6bvA+<;H J+%9A5,^הS@ƃVϒ:WG%/zڛ4 WN2p&ꏫ)K O΄n6]=.ISWHO>w~Ռ5ݕP}gfe\ AbC=4vy˂m-ǙH]hJ{xnioloYܣx> GIPJ߈@'B ͚ʢMJqbKCgi~eFn$.%._K±[0FRtAei&1+VՀ@IE z]7Þ `bM B3aޣɚy2[:8pka#Zwha 3c<"s sj:aH<7 ɼ"]+4XMKY"NǫmP@ oѡonC!wݓ `$J8* lЉuZiѓQ_S$Iߦ @ H|C^xβ(ڍP6?|crLi#+]OؑV1/md2457&gem oWШixN |ʞmeelVíZlyw ]BɑŴ]m}F; T#JŇ }9xt\yh]k}/_bm c( /\huHStJ (ŷ'h}{7ȟw/K/C#.N9M_i)Qk"Mm"" u;&+Ha 3E_ U%EÛ^ADK3 /16y=8G{^re(%Jل# X2Spӕ!I <腺{Mw=w[ޤjxma<ۦ345Nݭ}K +9Ψ)"(3]yM$D1K,y$9mKE\c5xd?bSHthU`%Oc#٣zJR3,$ un30ӿ/KV v(fc[XV l+[, *"Հ3tQ7E^*cQazVVM/d'asD'^א ʡU/ W6)mгyWhX GDYCgoK۵ C|9#߰>ZF}8ل'a;/!PY$& ߕ)Z UEp_d1+>ˈKWp4bh @cTr& {层a,w:-acps(C,AQh]roU C ͇d(Y +nXGVza#J;w-xCZǷn(L/^An5J%`O*`Q}f~p+>"y:%VW}i!E5}ך] &ʲ~)Q j&+ńrHU4_mUӯhav&j#9ŬETj,6SyLw>y "<s%Q>+9}{o'րEJ(1zt Y7K*Hehw* y&G]бiin&X_\+y5@g0:|kkrHMʘЏ .CwY: VOlU#B_SLWc7\PnS#uɦ{pzdΎU|Y50"0}_ŗc;,on[7;Dj'y_B8[e\D_Ń4,Bve ;V% (oB 2qq8f*eж, 6KXzF yFa51v'e"YTk rYZ%Ű?Ѹ")M3bg0 nzO6} P{tؠ土Xj,p5+s }ɆWg4R\*@Q R& /y.kc[ $/lnp| Xk2BޒZӏ7n9EY`d$āBJV1zĈ5"}l9]) rըx,j aSAel?ԢPhifDuMP 'tl#+\+pI z مsdG?`PDnW+SAg'#u|0\Nxd^űrnQ߄>t@d3;^4 *fa FkЧuHn2eK*б^i2bil&دd<]iϑ7 7fnm7  lYKAhϑDP=s $qR#󅐍ncǏ0hۦdJèsg .*3*!"A^oL -elE8#jkJ`.FTބHwNf3I%覎^~gWLkWkA#㤬?n]E(ÎCr+MF(z?;&qĘUw`m ᳠4Q Yr߲:Re;hY)\"m2j: Qz"P6ҩ޳m $Ԏ`A&FYc 8n5}G~BYciғ3l2`iy:56}_N> :h żVW`1a@waӔ=AxlU7@RˀÚLE瀰џ~We$ahs Lf;Doi[>'Lf-Gϧ+ɠu(v=BoS86 NBBvRΗg, b.3v}2VۀWq>CWܴ _C}[тZDa1TH/  GjMUA1 qZM㨎 ^ja* H[m'' v /,%MZd)&%Eh0(_Tu9?wa5&伇純/iިsHR|5kdVG:\}04o^#) 2oqfM`w/-Ͼ3,*Ǝan_EtGɽ C7 jxC6 “\-FvX/P*&vX}||g:˴`6 nVltz%TQ4w/<1 -\eXZ܉]t*kiB8rN7KY5JSbE'(0̿F}l<\1 ܠO _~\!X4@{JTK-RXs~ŘloJBcg@Ink~<@$s'EKfS7v"f!syZFcf{/!Z;P&@d8 >i}CAzDe ?kxeo01IyNҏʪd6Qǘc+´ +|$X!$@sAKPMbl-$u!e'v6 ~`Kh~,sC:aky^0TEEj cf}|D~'T"Q`tN]ET9<Qtu 7ƋGbTfFhP ro\ά <Ӿ)l[G1/8b gwġOnyt5ZU{s9t)ENu l-Mνht LWT#!%iScˑ{lu C#Qgk*hG`` &mkЎ9_'JL0_Ͱ of8 >~R/aMeƕPToɐqsnE@26ꔲw=_e E_:&y{7wi3s \~iJT7K~U!_G<+{?Z_a`CYЄm}az жvlyϪ-jf AƼf cY0ϝO)i98ۓرtGzOblT%?m;5}2Fn؇QTEl7G3KsoMAi^mB1XU Ea,PP PB o@kEFd7]|^^buࢮmS^Z(qB\d:8e08TdfN\ٚ u5ƁzJuhw6T~)7S*rb{TzV;9v\* *1;057_j3 :# ?}h"H-31 F~hNkaCr A1ֱ7nfζZ4 Pםyϕ:UZ.mShJ<.,ÁB7{Nyo;2m#$~L;81B۱à %Vҫ:}3n']%r%ݞT}4j ދMKEw`;?SL.^|7{1if$64$uǖ(ix歜,{FLf/D\QoӰۗx[;NkXm c[$)/be*a>:b2a\f!@1kk3敌}xmxwl[PlV}*is|;p # 0C>zH˜U_ 2.e ֳBBKU$ۣ[Ž>dK|z^n9NW;wv4jJ% $n}:YAZMvz`? c/>y<Uc-dSl6I}fT.l}߉>BhFQe nlkJ'5mq^iiW̨PL=[_e "ii"/<ʍ|Dd,H$S8,`k@i PP~1]$$G/gK.6$a[$9T՞o3(<ײl住ns%@c#됺ծgI9kxy'H.RrԲPwiTЯ0~$a.lMafܑf k1AiՃ _QFkQ#q 1|Oװ|px5҉bN2O갵?/G\z{s&5r%S- =9!8:(|9UiVd쏅PbK1Drw Hx 7 DlD&.mҾK# }!ec3]MP:~GS ΁ea(Р$̈wL Q+_M2ر6ӕɅڄS7c:>ACz9Nvގ?b FВj_oGנk3h`+mM!%_.چ @)oQuMo[zz5K'q"6ngmhUT Lb6'Ks򢹉`)ˠa)f'Yư'n< !F(cb٨0sKsy\"1Vmo.5Sj2csGHTG-r}r8#Ϛ5(͟My肄kJ>=15jL7@yg)V疝U/Xrs p'9)YitSL08pVNʄ1e'4]<8Tsq.0";"4x؉*R˃^~0J=1o؏g4z;eẩ9oAǹ0du=Q4Q5)?#'o%4Nvˆ\]grbV'8Jӆ;1=T"~#Nډ@ (T\DsPیWl2iaRök>ߋ}'R<<ٛ'͔*=侨gZ#Dr} !^h5:y=376M.^"|}rm)i8G=APlF6EOT|"Bwm5JB lô?JX WV_6xDzW(8'b}M >"xxLI|Y3N~by #%p6?5-Q21oSydyKm=$:eA", :rFNKxdWBO4Db*EJ_ ?ҙSÀu85J:|j[yv:tAKnWB{-hdc쌸sԵ`suxʨŕ`喬_|ﵠCsKH{)x$_Rqv-{;kF<˿+EN@p#<44՛S,d96-rɶ>Z%3ZUs3ޔ17_w.M6<}L\#C!v[gᘦr!B}qffW,Fp-b]F?8n GWVnq t)ĤVd4Qc"L4>0]{#6LĘ>nH8PR!NPCwcY~O󔺯|'杽m_\51A 4uXq/ . rl{ u CU0*b?sHec.ʱCK+aTkޠok_rI (5ՠhHEMxM% MfyaD ^)fNh3cr8X#o rLV0YmF#"ԉN}I Pa֕\CӿeD1Y:F>B_D,9)dIp!bYtgؓ$} jN|!R2@R56.㇥ wty&~ůjxёtǠ JY3y*CDhiRjEꬼzr,a'vy:/:gpvq4+LgiPDAӒfŨ*@~wi4~%N/q/7KpMxa?7pin]wfdBE~Q7ַþ"eyCξ] S"=q0!"Բ{_lE6F9jd3_Iay[B;n8Nš Oe z[p6bx\xt3o$\NBvUj?]nlEo^'Q|']ܧ][rT#_!KL1Ϫ…\FE^HϊT2|ֽ8PL "5U<ܱ=K5PǠLf\"=M/ܮ&R&ݠ%mXҘ#,-'n|f߱P~(7MðCZN;΃8𵋁nSn-ްTYA*0-1=ܽiiNFbE=cHT5 Vsv8/#Ӌ*&˲|Ek$!U|vIU,`4*w)tjnݍ Qh d2-{K;yLyzgk釤,J.kjh=/)0 ׉gxk!iS/-sמ|-RGThZ+KRŬb+m50U`5'↔hT/2(BVɪIﳗnV[n&AȄYyUK۶ vtAk+B'6gcc R[]D; b% R,_ؙ&'r%h Ѝ ZŧS O4xD4&{N^I˥UUdi.~3CR a@дksx>F8܂f{j,ԗ+⢓3쾩nM~l|.SDmDfdO`-ukm5/w!xtnuia ha~5:;hhLߘ}\"ʉ\Ye_}I9Ip޼el|Y![e dbMK$sDg:?c\# d}NBͿyr0F1J(__ 3RL?d({'k-hxG`׃ɛi&E~.l8{~dF#%;m[Lؒ˙ݐ؁>TFje̠j짯gkiyX7Jbuvze6ɜmɬ.ꇥ9I1m_ Y=*RS``*`"G > E?iT*.B)_?_Z# ~3l^鈹UDC]2r7=ms (-8B>a~75oCV̊z( tEӔfʆ?L/9k;6eĥ~ll?^nPeiucN6h/PUzmγ:[{kt& Ў\'yb2 n!~1rTNd.qpk0$2"; P0?ڔw4 .P2A7tRX|ҽ60HoqwewGTBvU6$# =(4&B4O5!ɾ!O9W_TWq'ͩБFJw8JE 0sKӯ _5.jQ6X+9D]9o7r HnxGꭷ\%fDp9%+$3Ҷcd$/fv٭;-wjX:D>Ӌ zi*7:ѷk.9x4Z)=_]Xa۪$t(zAEt9Y53T_:>~FV_fvH3+zmi ?ߜgG휺8O6}_bϡ3ZU9<{)d0W eikślee=gM-daʛfF_.]AYPP#- 9W/,^q|c*Ub-};W.cewEb$zEξ\ qg?Vݾ§gŲ$?nἄȿϿ|Ŷogo-h';{n>9%?fW3atW7>kִ_"+ 7O|L-2qK-/bryY%ۻ7Uamm:c~~hWnpˇi3_ΨSpGqRUXŧLֽѻ/OPa1Vs7\Gjт' 'y+1X!dEނS ޟ3YuA^wwOg=к(*~;?\Oz̓"Vֿ[S6]!ϴiB2ׇSm6$Ezvhn篒լ3JYebd!ڇ}gc_9\aƮ*CBhW+|Nb--g>f7?_ԂڞbM~;Wyk͘_!zxD+][TgM?7K{d7W:z\mZ]9)GJ81k#9SzA+sy{IA}Jf[Y~6vB= ͼb+m&lÿ paA]V ^iuV=O k@!5`XXTXendstream endobj 41 0 obj << /Type /Font /Subtype /Type1 /Encoding 76 0 R /FirstChar 2 /LastChar 249 /Widths 78 0 R /BaseFont /CDYPJK+NimbusRomNo9L-Regu /FontDescriptor 39 0 R >> endobj 39 0 obj << /Ascent 678 /CapHeight 651 /Descent -216 /FontName /CDYPJK+NimbusRomNo9L-Regu /ItalicAngle 0 /StemV 85 /XHeight 450 /FontBBox [-168 -281 1000 924] /Flags 4 /CharSet (/fi/percent/quoteright/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/nine/colon/A/C/D/G/H/I/J/L/M/N/O/P/Q/R/S/T/U/V/X/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/agrave/egrave/eacute/ograve/ugrave) /FontFile 40 0 R >> endobj 78 0 obj [556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 833 0 333 333 333 0 0 250 333 250 278 500 500 500 500 500 500 500 500 0 500 278 0 0 0 0 0 0 722 0 667 722 0 0 722 722 333 389 0 611 889 722 722 556 722 667 556 611 722 722 0 722 0 0 0 0 0 0 0 0 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 444 0 0 0 0 0 0 0 444 444 0 0 0 0 0 0 0 0 500 0 0 0 0 0 0 500 ] endobj 37 0 obj << /Length1 1166 /Length2 4316 /Length3 544 /Length 5117 /Filter /FlateDecode >> stream xXWXS[E4H! Kh J ! Ih"H( wDQ U 7zs=}o{?Ƙ{9ǚ!jl&#41h(X "=f0)@`4||P$M$pAD0 B5H@ 0!0wB: &y`($ncX/~X C~HGA㋇y"p`p"DF!7Ab y%(FnsC&P{+JUCHDeBT]//j CNߒ:hG @v>ْ''&@ ]C@:  H DG8X@~"x>#(07$?{%tt0A&$^鍀# ˟.}c KqPg+@Kvh'80/'u@w;""q|KehA Dީ$M4̼i%'əƯKo ЈrSm;Hɾ&V`ۤ|`p)5{Eͧ[{jў5 Y8%Ҳ%Ǖjq!9֣u#m r:%8"V͡ ڵ}F㝪µh2G΅MG}\)] [Ե\@T;祚" ]ϣiqqSl)u ≮ݴ* ܖN%o]dH20oWzfmp2aJ훷l[w|0B4M(x{!Kr6g1yoFU\;ƦZeQJ Wd͝oZA۽l%G%4X9K_{Dee5\D0AOsyrgg _p f|>Hw9*bwAWtc,(n301ޣ8%KRZrD3{R'b#үIC,lUcO"ֻ-os A|>EyRTh3,47pEwh9n i,>p[}iŗCbX!FCoG.q:3<(ho(=h*gVӠZJ6Bgv!+7$+ޮ͗o7ci.nw7lhKv<#,24wg߮ό[wPJ~@Z4yML5sķCtɪZ`I3',Ng䥧d~ϽxaN=Y\|wd_ f 7VpvEFKZ}q1>%LP]]=x.O@]:.]}sǹ3ɋ/yW?翦KE I-5#gnؽR~_fm^L~˻DpZJn-P Ui(NIч$ʨY!/k?Z7= 摇ph3 YeXY^ ɑE{) N $֧k62${sUYϬ&xϷYgo 3K.èI/Zc`-E$ѪU(Y/'$ǚnzzρX'w;jV/y(Qoh/- T و%|+y@{(FF$HW8x|JsYjo/|uux*lX`e\}yKVBnm~*n͍2RՌ Ut%'a?yPr&AΗ k%fMYO\ywyz$yOO[AޯgJc!]n6>?ANSZT,&M }DXDvKCE=sl΄iʱf1S~312*(P ҺR <\er2Ȟ*j)7$٩a7]E6޻e;}))ڸ@y#s+{TKhvy)pҷ8y~5?s(.z8芷^lPhye)1]Ssݳ[Q{|箷jWYD/怭Jn,HZ(\gN^ۧCe"(Câ>W=Hx=;-@wsQBUw\uχwP[䅇 }5`\/́ձܛ:74 VxRf-yxs6Z0yyӐZ4e?՜Z i6۰T4ΞBd/"G1G:'}Ÿhۚɇ8EIH^@"HVM4GUd8*VMyT2$z) WcH"|9򡄆=];c^XBpraˋ/*1˘ ennׯ3|EJ¥E9Kq +(͈3M>p#4Ufg#P"4b㝹Gxn?nB i>J%*'(Sn, /^64tޔo]$/uXS˃+VwZ/SLYy4M ;/M B(HODypn!ݩRxǛPDq:<\ݤ՛ݯ#=?1LR1e2a6>klWf lڊW~J S\i_ڐh_;(KUthhEҤtZ㕭|yv;Q63DTD"]|F=!Rn~ :/2M=6,oWF~N~n` U$mAEh ^udSn_.eFf|l\VV^|FUW0 Y;jȂwUrAu=400RMWMLcc ^wf^h½2G̝]w/L`{.*MO5qR=I?ovRxTaTL_r] č[zX*;ń'g]JFg;V2r%un3g_ <\nYeti"(q!SQȗ1S`dl Wjl\(?qQyJ޺=eWDcNƣ(g%jdLR)} ʍ:nr9}|/j]a^(obݩe^Z^blMи*骕飞f6Z8ڍ溣X혿`C{-3eٸQ#^eyn-Kf<> [Ō֪ y@=kـzy{}ϴZK5֝3ӢO׫e:{Vl&Op,8fau?@XawSqf<7Ng [orJLi(v5m dM~9GX);?:fV्yrKK gF2eZʵ}~N9lHukwEaJkP@UG a~z'urlfԺ.6N݇bS#+l`zmǹ` ̷xYl  2kt A˱5fw0/À#Xv ]76*HաQm"~?.P蓢nS,9@_X٤*>vwr!;hC:|SքJL+kDž5w|Tb$cH{dYo` 0.L=Ћ hVZ8OW C}]d,Yht"H~NYd:%{:CtyVN vj-<@PO;Cϝnj}޼KKdwɉcQ>Q݊JG~+ !M'J땼)cBgY(-f=~o'b_׍@Mr6/Ppm[;7կ͉|: "Xݰ#AN{p̅|ު?]6(OT nKFxga频*ETT,8:֤C<.Ci,ֵbY" #m\_)wuA+\DݘTLdtRF,"ȘKk悎 Rf29*0|9x=2!wp&qyčtFQgoV'XCº q9;%6hD@8$*Gt鹨RRڱCCEQ*$P2܃ ">yF=:Y΍21TDe-?L$:Λ[ȼY_/.9ч,ӤV鱖6i xwoEaPD.`7!mUrZKF5OiO-3aL)6k 4D>ќ즻prn Yj gItTLm *M"[b6UA;܅7aUYiv?jכs#OGq|٣+? ]R7%Q![l Q)e597‘#V0WD0( {i}i!ocp]&t+fR: \5/G]7+ԫۢs_;hzzX& g̤L0,OB]R0kI&uEtG\sY̔L!F'h\cZuuZC+ k1iWAJM>C=o#YYLw61 X~=koĘB&ޕEtЬ\AN%3&U)aYM]T{zu>Cւaa^79թk~OMp M癶ܗm'_oZ#I_ݶ"2S#zxk QƶcKN%N4NtO@Yv Wζ &*pcbhӁq^|tukjf 쏆yc,˕U&-(Js5 c2'Yfbg{7F򕿠vm"a~1⩲71(H,UւəkrE7P%@Ssx-]$BKlCWK~"gַvEO ,>XiթY B[T$()Zu^ pdNЮj ʴvz 06o#P=[˥aqgY;_ `]Tj;'t!5_^ӐʲW7[y[;?גy]an7JTGZQU|L$Hn‡q)Uuӝ  w졭"AgnUށGx( o|!"Ra6\i^;n,@+RB _S+Z? &.?w.aogf9ۙ 4d-3 rD<=r50՞OVثNDE$|#}fR{{khϮA|z K9}dL 㨁˯^)eV*Xf#W Oڗk1=ɭf$,+19˰ۯ N# ؛ǽDUdկ~΅dѻ.=VmkG-iVA 51lK3'nE1 hh<\+oGKMaVB$;Blz꡵Cq9G$% |i|*\ 5<>ˆ^,'@H=}5[4R*#E=%hm]bPG5w) oXO#݊a'/ GVKb_O:k+kuJ64TT]wia-b8`c屄! ]TjlEFnw dZox<>u+] %Hvo;';MNb´*C:(E|ʍ3@B"qok$ZR11tSMnUoB>4( 4jc9=40VGސȜ45_N/O0[= FA^uG-?RG>g ]ʙߠ%~o[4B7mUn-o3eVݒVB寸h|:]]@ؗ,RZ?f IԊRė|]OJ!dia/BË$#TuP֧˿ knd rk[s5ł$$#]9'Oxw8lE{,pwq!R<*=U<{::ō-)j2^`cm4$}M8=;eSac |I?Ue[B_(V{ױt}}?Vi<J2'Py*Q)h~w5rwC\JVHON%ih#_^V!Q,!OqՐ1}-4#~}_J$KF.mN%lXkdR F^!25ʘyuoS! ar3)FyZ۶2-FժSNHfLk3?،S(z f=gvXF7'{OwO'5|!zgz'4}s&x{A*D ?_%*V,;1Ϩ9-}f^R_,5߅'3Ō#tfۄ υo2T^\$fQ+/w>&?*TF%AvJM7MΉ_9{3fwȱuj2[j4)MTrB +Mks*z'7\Gh-sTRۂC g9W`CfVARnֳ087Q$L@Ĥ^sqB[n^ USO9% y6PnЄק옶._{>K+*Ϭ X9u6 SF{.zPū #blwUsk-1S|j{KB*`&ĴgRZ&[ &!jp3ʙ2 cr!Fa;LP'M~ɵLBא!#v=]xW l1/PrTIju\?@eXt=HE:AF>{{2QG9%*ڨpUez:vCNc_ч #s+MST ;uA[(s-ޞ?WCx)+Z95-h C1BV)säSt0OKH@TЕO||\8룐f]QǨXkY!50+ 1.p- '?M5COP7<ήP,yK9ֳZ?(/ /y\sk(U=g\c0gy@E_$D)  -=C[ӝC uL3B{Lc$x)z8~M[ LE_H8iNJ%sbGp0Gua,}7N"YY2wN lo2E,кw=L IQsy͹U ;ºorT.\k):7<ӱ,}n͵Dkch%#vmQ3TEPNKUyv37gBgˢ4_#q< y|4?kj& _0Y_U$ZTG}BǸe3.cd\B= F sWRuξ PUmh}ixew!BZWpS<e=²5˱@ZYbIs}󘥣?&$*B)WPYzpt5e~ T|NS },iʀtmAŀ3EuHy:Mq&^S!Kڐ4?]._ FC>@i2dVhBi m,a*,"Ml#AM7UܼnhV4)QE`yށ$s2˽lg -z}La-ڤ&GYz*Qd= ȯ|-\'1\D}zתF`D;VK3! ߔr-Г^uQRҾD@5u@yo?sl6~ 2a;6;[ !1!OHE.CZFV4[=3leK'\_f:Ӎ?&wXԃל+s-3Qv]"A9eT*uG^'] |5?}઱2 s+xAp")(UUƙ/jȓa2[hWtelş+P,%Ƀ'n)ay%JG) M{%b#A+pmpjz$uKٻδB%u *TϷo_xoi6f,maMI>(VmZ˾& +'"z Mfd邲d!Tq0$΅-޾_|ejFV!=@yᇗolW>gLŬ 6v`lڪR1z;}5 ?H8f80&!]l^I4}k-{ [GТ,^{9SP)`l~ 晬37|S).j3q%*~Xnf3C !5Ϣ0n )Sy+ia@Lc(K7L&_"9@.4RIr4p]>;<6IS눅{ٮ B'ݨiWGdO'Cz+dh{Q#}J^#)Pˈ *|{w!oF>T{e2{{ta}NOjtfa"Һ/J=Hѯ=c>PuV> endobj 32 0 obj << /Ascent 722 /CapHeight 722 /Descent -217 /FontName /OOCWCV+NimbusSanL-Bold /ItalicAngle 0 /StemV 141 /XHeight 532 /FontBBox [-173 -307 1003 949] /Flags 4 /CharSet (/period/zero/one/two/three/four/five/at/D/I/L/M/P/R/S/T/X/Z/a/c/d/e/g/h/i/l/m/n/o/p/r/s/t/u/v/z) /FontFile 33 0 R >> endobj 80 0 obj [278 0 556 556 556 556 556 556 0 0 0 0 0 0 0 0 0 0 975 0 0 0 722 0 0 0 0 278 0 0 611 833 0 0 667 0 722 667 611 0 0 0 667 0 611 0 0 0 0 0 0 556 0 556 611 556 0 611 611 278 0 0 278 889 611 611 611 0 389 556 333 611 556 0 0 0 500 ] endobj 51 0 obj << /Type /Pages /Count 3 /Kids [26 0 R 53 0 R 69 0 R] >> endobj 81 0 obj << /Type /Outlines /First 3 0 R /Last 3 0 R /Count 1 >> endobj 23 0 obj << /Title 24 0 R /A 21 0 R /Parent 3 0 R /Prev 19 0 R >> endobj 19 0 obj << /Title 20 0 R /A 17 0 R /Parent 3 0 R /Prev 15 0 R /Next 23 0 R >> endobj 15 0 obj << /Title 16 0 R /A 13 0 R /Parent 3 0 R /Prev 11 0 R /Next 19 0 R >> endobj 11 0 obj << /Title 12 0 R /A 9 0 R /Parent 3 0 R /Prev 7 0 R /Next 15 0 R >> endobj 7 0 obj << /Title 8 0 R /A 5 0 R /Parent 3 0 R /Next 11 0 R >> endobj 3 0 obj << /Title 4 0 R /A 1 0 R /Parent 81 0 R /First 7 0 R /Last 23 0 R /Count -5 >> endobj 82 0 obj << /Names [(0.1.1) 2 0 R (0.1.1.2) 6 0 R (0.1.2.2) 10 0 R (0.1.3.2) 14 0 R (0.1.4.2) 18 0 R (0.1.5.2) 22 0 R (0:0) 31 0 R (0:18) 43 0 R (0:19) 44 0 R (0:20) 45 0 R (0:21) 46 0 R (0:22) 47 0 R (0:23) 56 0 R (0:24) 57 0 R (0:27) 59 0 R (0:30) 61 0 R (0:31) 62 0 R (0:34) 64 0 R (0:35) 65 0 R (0:38) 67 0 R (0:39) 72 0 R (0:42) 74 0 R (0:43) 75 0 R (0:PHAMM.SCHEMA) 60 0 R (0:PHAMM04) 63 0 R (0:PHAMM05) 66 0 R (0:PLUGIN) 58 0 R (0:STORIA) 42 0 R (0:XMLTEMPLATE) 73 0 R (Doc-Start) 30 0 R (page.1) 29 0 R (page.2) 55 0 R (page.3) 71 0 R (table.1) 35 0 R] /Limits [(0.1.1) (table.1)] >> endobj 83 0 obj << /Kids [82 0 R] >> endobj 84 0 obj << /Dests 83 0 R >> endobj 85 0 obj << /Type /Catalog /Pages 51 0 R /Outlines 81 0 R /Names 84 0 R /PageMode /UseOutlines /OpenAction 25 0 R >> endobj 86 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.21a)/Keywords() /CreationDate (D:20071229120025+01'00') /PTEX.Fullbanner (This is pdfeTeX using libpoppler, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.4) >> endobj xref 0 87 0000000000 65535 f 0000000009 00000 n 0000002487 00000 n 0000052821 00000 n 0000000050 00000 n 0000000090 00000 n 0000005062 00000 n 0000052751 00000 n 0000000133 00000 n 0000000164 00000 n 0000005243 00000 n 0000052667 00000 n 0000000207 00000 n 0000000243 00000 n 0000005485 00000 n 0000052581 00000 n 0000000287 00000 n 0000000318 00000 n 0000005727 00000 n 0000052495 00000 n 0000000362 00000 n 0000000393 00000 n 0000007418 00000 n 0000052422 00000 n 0000000437 00000 n 0000000480 00000 n 0000002068 00000 n 0000002847 00000 n 0000000530 00000 n 0000002186 00000 n 0000002246 00000 n 0000002306 00000 n 0000051732 00000 n 0000042203 00000 n 0000051565 00000 n 0000002366 00000 n 0000041709 00000 n 0000036305 00000 n 0000041542 00000 n 0000035201 00000 n 0000017406 00000 n 0000035032 00000 n 0000002426 00000 n 0000002548 00000 n 0000002608 00000 n 0000002668 00000 n 0000002728 00000 n 0000002788 00000 n 0000016998 00000 n 0000009581 00000 n 0000016824 00000 n 0000052277 00000 n 0000005848 00000 n 0000004704 00000 n 0000002953 00000 n 0000004822 00000 n 0000004882 00000 n 0000004942 00000 n 0000005002 00000 n 0000005123 00000 n 0000005183 00000 n 0000005305 00000 n 0000005365 00000 n 0000005425 00000 n 0000005547 00000 n 0000005607 00000 n 0000005667 00000 n 0000005788 00000 n 0000007600 00000 n 0000007121 00000 n 0000005942 00000 n 0000007239 00000 n 0000007299 00000 n 0000007359 00000 n 0000007480 00000 n 0000007540 00000 n 0000007694 00000 n 0000017245 00000 n 0000035652 00000 n 0000041984 00000 n 0000052032 00000 n 0000052350 00000 n 0000052915 00000 n 0000053514 00000 n 0000053551 00000 n 0000053587 00000 n 0000053712 00000 n trailer << /Size 87 /Root 85 0 R /Info 86 0 R /ID [ ] >> startxref 53990 %%EOF phamm-0.6.2/docs/manpage.refs0000644000175300017530000000003312256607311015035 0ustar phammphamm{ '' => '', '' => '' } phamm-0.6.2/docs/manpage.links0000644000175300017530000000000012256607311015210 0ustar phammphammphamm-0.6.2/tools/0000755000175300017530000000000012310633771012760 5ustar phammphammphamm-0.6.2/tools/greylist_recipients_whitelists_ldap.pl0000755000175300017530000000464012256607224022675 0ustar phammphamm#!/usr/bin/perl -T -w # # Connect to LDAP Server and extract a list of # postgrey whitelist mail recipients # # Phamm - http://www.phamm.org - # Copyright (C) 2009 Alessandro De Zorzi # # This file is part of Phamm. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Example LDIF # bypassGreyListing: TRUE use Data::Dumper; use Net::LDAP; # File dove sono scritti uno per riga i destinatari e domini open(FILE_OUTPUT,'>/tmp/whitelist_recipients') or die "Can't open file"; print FILE_OUTPUT "# postgrey whitelist for mail recipients\n"; print FILE_OUTPUT "# --------------------------------------\n"; print FILE_OUTPUT "# Generated by read_recipients_whitelists_ldap.pl\n"; print FILE_OUTPUT "postmaster@\n"; print FILE_OUTPUT "abuse@\n"; $ldap = Net::LDAP->new ( "127.0.0.1" ) or die "$@"; $mesg = $ldap->bind( 'cn=admin,dc=example,dc=tld', password => 'secret'); $mesg = $ldap->search(base => "o=hosting,dc=example,dc=tld", filter => "(&(bypassGreyListing=TRUE)(objectClass=VirtualDomain))", attrs=> ['vd'] ); $mesg->code && die $mesg->error; foreach $entry ($mesg->entries) { $domain = $entry->get_value("vd"); push(@whitelist, $domain); } $mesg = $ldap->search(base => "o=hosting,dc=example,dc=tld", filter => "(&(bypassGreyListing=TRUE)(|(objectClass=VirtualMailAlias)(objectClass=VirtualMailAccount)))", attrs=> ['mail'] ); $mesg->code && die $mesg->error; foreach $entry ($mesg->entries) { $mail = $entry->get_value("mail"); push(@whitelist, $mail); } # Scrive uno per riga i risultati sul file di output foreach $entry(@whitelist) { print FILE_OUTPUT $entry."\n"; } close(FILE_OUTPUT); exit; phamm-0.6.2/tools/vacation.py0000644000175300017530000000575212256607224015152 0ustar phammphamm#!/usr/bin/python # # (c) 2010 Mirko Grava - RHX - www.rhx.it # # Usuful to activate the vacation # must be set in cron with the following string # 1 0 * * * /path/of/the/command/vacation.py # # many thanks to Michele Baldessari for great job import ldap, syslog, datetime, sys # Michele: Requires python2.5 due to datetime.strptime if sys.version_info < (2, 4): raise Exception("Must use python 2.5 or greater") LDAPHOST = "localhost" LDAPBASE = "dc=example,dc=tld" LDAPADMIN = "cn=admin,dc=example,dc=tld" LDAPPASSWD = "yourpasswordhere" DEBUG = True try: l = ldap.open(LDAPHOST) if DEBUG: syslog.syslog("simple_bind(%s, %s)" % (LDAPADMIN, "xxx")) l.simple_bind(LDAPADMIN, LDAPPASSWD) searchScope = ldap.SCOPE_SUBTREE retrieveAttributes = ['mail', 'vacationStart', 'vacationEnd', 'vacationActive'] # Production search filter searchFilter = "(&(objectClass=VirtualMailAccount)(accountActive=TRUE)(delete=FALSE)(forwardActive=FALSE)(mail=*))" # Find account where activate Vacation if DEBUG: syslog.syslog("search(%s, %s, %s, %s)" % (LDAPBASE, searchScope, searchFilter, retrieveAttributes)) ldap_result_id = l.search(LDAPBASE, searchScope, searchFilter, retrieveAttributes) today = datetime.datetime.utcnow() while 1: entry = None result_type, result_data = l.result(ldap_result_id, 0) if (result_data == []): break if result_type != ldap.RES_SEARCH_ENTRY: continue entry = result_data[0] mail = entry[1]['mail'][0] vacationStart = datetime.datetime.strptime(entry[1]['vacationStart'][0], "%Y%m%d%H%M") vacationEnd = datetime.datetime.strptime(entry[1]['vacationEnd'][0], "%Y%m%d%H%M") if entry[1]['vacationActive'][0].upper() == 'TRUE': vacationActive = True else: vacationActive = False if DEBUG: syslog.syslog("%s : (%s < %s < %s)" % (entry[0], vacationStart, today, vacationEnd)) if vacationStart < today < vacationEnd: if DEBUG: syslog.syslog("Vacation is to be set active") if vacationActive: if DEBUG: syslog.syslog("Vacation is already active, ignoring") continue mod_attrs = [( ldap.MOD_REPLACE, 'vacationActive', 'TRUE' )] ddn = l.search_s(LDAPBASE, ldap.SCOPE_SUBTREE, searchFilter) for dn, entry in ddn: l.modify_s(dn, mod_attrs) else: if DEBUG: syslog.syslog("Vacation is to be set inactive") if not vacationActive: if DEBUG: syslog.syslog("Vacation is already inactive, ignoring") continue mod_attrs = [( ldap.MOD_REPLACE, 'vacationActive', 'FALSE' )] ddn = l.search_s(LDAPBASE, ldap.SCOPE_SUBTREE , searchFilter) for dn, entry in ddn: l.modify_s(dn, mod_attrs) except ldap.LDAPError, error: print 'Problem with ldap', error l.unbind() if DEBUG: syslog.syslog("Unbind successful") phamm-0.6.2/tools/check_expiration.pl0000755000175300017530000000570612256607224016652 0ustar phammphammWARNING THIS IS NOT TESTED YET THANKS to Trieste Team #!/usr/bin/perl # # check_expiration.pl # # Expiration check for virtual mailboxes. # The activeAccount flag of the expired accounts is set to false. # use Time::Local; # for timelocal() # $lastlog_file="/mail/sysmgr/check_expiration/expire.lastlog"; $log_file="/mail/sysmgr/check_expiration/expire.log"; $message_file="/mail/sysmgr/check_expiration/message.txt"; $tmp_file="/mail/sysmgr/check_expiration/tmp.tmp"; $ldif_file="/mail/sysmgr/check_expiration/expire.ldif"; # $manager_dn="cn=admin,dc=example,dc=tld"; $manager_pass="rhx"; # chomp($today_readable=qx{date +"%Y%m%d"}); # open(LASTLOG,">".$lastlog_file); close(LASTLOG); # # Scan list of expiration dates # $buffer=qx { /usr/bin/ldapsearch -x -b "vd=example.com,o=hosting,dc=example,dc=tld" -D "$manager_dn" -ZZ -w $manager_pass -LLL mailboxExpiration }; $n=0; $today=int(time()/(24*60*60)); open(ENTRIES,"/usr/bin/ldapsearch -x -b \"vd=example.com,o=hosting,dc=example,dc=tld\" -D \"$manager_dn\" -ZZ -w $manager_pass -LLL mailboxExpiration |"); while () { chomp(); if (/^dn:/) { ($g1,$g2)=split(/=/,$_,2); ($user,$g3)=split(/\@/,$g2,2); next; } if (/^mailboxExpiration:/) { ($g1,$date)=split(/: /,$_,2); $expires_in=$date-$today; if ($expires_in < 0) { # Check that the account is still active chomp($is_active=qx { ldapsearch -x -b "vd=example.com,o=hosting,dc=example,dc=tld" -D "$manager_dn" -ZZ -w $manager_pass "(mail=$user\@example.com)" | grep "accountActive: TRUE" | wc -l }); if ($is_active != 0) { open(LDIF,">$ldif_file") || die "Can't open $ldif_file"; print LDIF sprintf "dn: mail=%s\@example.com,vd=example.com,o=hosting,dc=example,dc=tld\n",$user; printf LDIF "changetype: modify\n"; printf LDIF "replace: accountActive\n"; printf LDIF "accountActive: FALSE\n"; close (LDIF); # perform changes qx { /usr/bin/ldapmodify -x -v -D "$manager_dn" -w $manager_pass -ZZ -f $ldif_file >> $lastlog_file 2>&1 }; open (LOG,">>$log_file") || die "Can't open $log_file"; print LOG sprintf("%s: \"%s\" expired\n",$today_readable, $user); close(LOG); next; } } # Notify people whose expiration is approaching if (($expires_in == 30) || ($expires_in == 7) || ($expires_in == 2)) { open (MSG,$message_file); open (TMP,">$tmp_file"); while() { chomp(); $_=~s/DAYS/$expires_in/; $_=~s/USER/$user/; print TMP sprintf ("%s\n",$_); } close (TMP); close (MSG); $cmd=sprintf("/bin/mail -s \"Account %s expiring (-%s)\" %s < %s", $user,$expires_in,$user,$tmp_file); qx { $cmd }; open (LOG,">>$log_file") || die "Can't open $log_file"; print LOG sprintf("%s: \"%s\" expiring in %s days. Notified.\n",$today_readable, $user,$expires_in); close(LOG); unlink $tmp_file; } } } close (ENTRIES); exit; phamm-0.6.2/tools/lib_functions.sh0000755000175300017530000000044412256671320016160 0ustar phammphamm#!/bin/sh # FILE='../LIB_FUNCTIONS' echo "****************************************" > $FILE for i in `ls ../lib/*.php`; do echo "$i" >> $FILE echo "" >> $FILE cat $i | grep " function " >> $FILE echo "---------------------------------------------------------" >> $FILE done exit 0 phamm-0.6.2/tools/handle_vacation.sh0000755000175300017530000000321012256607224016435 0ustar phammphammWARNING THIS IS NOT TESTED YET THANKS to Pavol Luptak #!/bin/bash LDAPPASS="rhx" BASE="o=hosting,dc=example,dc=tld" BINDDN="cn=admin,dc=example,dc=tld" VACATION_USERS=`ldapsearch -L -x -w $LDAPPASS -b $BASE -D $BINDDN mail | grep ^mail | awk ' {print $2}'` for USER in $VACATION_USERS; do TMPFILE=`tempfile` ldapsearch -L -x -w $LDAPPASS -b $BASE -D $BINDDN "(mail=$USER)" vacationStart vacationEnd >$TMPFILE VACATION_START=`grep ^vacationStart: $TMPFILE | awk '{print $2}'` VACATION_END=`grep ^vacationEnd: $TMPFILE | awk '{print $2}'` DN=`grep ^dn: $TMPFILE` # we consider only users who use vacation if [ "x$VACATION_START" != "x" ] && [ "x$VACATION_END" != "x" ]; then VACATION_START_SECONDS=`date --date="$VACATION_START" +%s` VACATION_END_SECONDS=`date --date="$VACATION_END" +%s` NOW_SECONDS=`date +%s` # check for vacation dates if (( $VACATION_START_SECONDS > $VACATION_END_SECONDS )); then echo "Vacation End should not be earlier than Vacation Start" >&2 else LDAPMODIFY=`tempfile -p "ldap"` # if an user is on vacation if (( $VACATION_START_SECONDS <= $NOW_SECONDS && $NOW_SECONDS <= $VACATION_END_SECONDS+86400 )); then echo "$USER is on vacation ($VACATION_START-$VACATION_END)"; echo $DN > $LDAPMODIFY echo "changetype: modify" >>$LDAPMODIFY echo "replace: vacationActive" >>$LDAPMODIFY echo "vacationActive: TRUE" >>$LDAPMODIFY else echo "$USER is not on vacation ($VACATION_START-$VACATION_END)"; echo $DN > $LDAPMODIFY echo "changetype: modify" >>$LDAPMODIFY echo "replace: vacationActive" >>$LDAPMODIFY echo "vacationActive: FALSE" >>$LDAPMODIFY fi ldapmodify -x -w $LDAPPASS -D $BINDDN -f $LDAPMODIFY rm $LDAPMODIFY fi rm $TMPFILE fi done phamm-0.6.2/tools/ldap-schema-manage0000755000175300017530000000321212256607224016313 0ustar phammphamm#!/bin/bash # # This script help you to modify /etc/ldap/slapd.conf to manage # .schema files # # Phamm - http://www.phamm.org - # Copyright (C) 2008 Alessandro De Zorzi and Mirko Grava # # Phamm is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # Phamm is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software ACTION=$1 SCHEMA=$2 EXT=`echo $2 | cut -d "." -f 2` # Check if 2th argument is given if [ ! $SCHEMA ]; then echo "Usage: ldap-schema-manage [install|check|purge] file.schema" exit 1 fi # Check if 2th argument is a .schema file if [ $EXT != 'schema' ]; then echo "Error: 2th argument should be a .schema file" exit 2 fi # Check if .schema file exits if [ ! -f $SCHEMA ]; then echo "Error: $SCHEMA do not exits!" exit 3 fi # Check if .schema already in /etc/ldap/schema if [ ! -f "/etc/ldap/schema/$SCHEMA" ]; then echo "Error: $SCHEMA already present in /etc/ldap/schema/ !" exit 4 fi case "$ACTION" in install ) echo "Installing $SCHEMA" ;; check ) echo "Checking $SCHEMA" ;; purge ) echo "Purging $SCHEMA" ;; * ) echo "Usage: ldap-schema-manage [install|check|purge] file.schema" ;; esac exit 0 phamm-0.6.2/tools/backup-basedn.sh0000755000175300017530000000053312256607224016022 0ustar phammphamm#!/bin/bash # save all the base dn in a file .ldif ROOTDN="cn=admin,dc=example,dc=tld" ROOTPW="rhx" BASEDN="dc=example,dc=tld" LDAPSER="localhost" LDAPATH="/root/ldap" if [ ! -d $LDAPATH ] ; then mkdir $LDAPATH fi ldapsearch -LLL '(objectclass=*)' -D $ROOTDN -w $ROOTPW -b $BASEDN -v -x -h $LDAPSER > $LDAPATH/save-`date "+%d"`.ldif 2>/dev/null phamm-0.6.2/tools/insert-ldap.sh0000755000175300017530000000034712256607224015550 0ustar phammphamm#!/bin/bash # this is script help you to populate the basedn # use it with example ldif in this order # sample-main.ldif # sample-mail.ldif # sample-pdns.ldif # ldapadd -v -x -D "cn=admin,dc=example,dc=tld" -W -h localhost -f $1 phamm-0.6.2/tools/mod-ldap.sh0000755000175300017530000000040712256607224015020 0ustar phammphamm#!/bin/bash # this is a script useful to add sample-pureftpd.ldif and sample-squid.ldif # from the example dir to basedn, those ldif dont works on phpldapadmin # but could be a good sample ldapmodify -r -v -x -D "cn=admin,dc=example,dc=tld" -W -h localhost -f $1 phamm-0.6.2/tools/make-mail.sh0000755000175300017530000000344212256607224015162 0ustar phammphamm#!/bin/bash # # Phamm - http://www.phamm.org - # Copyright (C) 2004-2008 Alessandro De Zorzi and Mirko Grava # # Phamm is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # Phamm is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # This file MUST be in this path ~vmail/bin # the dir bin MUST be in the vmail path # something like this # # # set PATH so it includes user's private bin if it exists # if [ -d ~/bin ] ; then # PATH=~/bin:"${PATH}" # fi # # this script MUST be run as vmail user or the user # that you want use to store all mail. CREATEMAIL="$HOME/tmp/address" CREATEPATH="$HOME/tmp/path" CREATEDIR="$HOME/tmp/dir" if [ ! -d ~/tmp ]; then mkdir ~/tmp fi touch $CREATEMAIL touch $CREATEPATH touch $CREATEDIR /usr/bin/mailq > $HOME/tmp/mailq.$$ cat $HOME/tmp/mailq.$$ | awk 'BEGIN { FS = " " } ; { if ($8 == "create") { getline print $1 >> "'$CREATEMAIL'" } else { } }' cat $CREATEMAIL | awk 'BEGIN { FS = "@" } ; { print "/home/vmail/domains/"$2"/"$1 >> "'$CREATEPATH'" print "/home/vmail/domains/"$2 >> "'$CREATEDIR'" }' # for i in `cat $CREATEDIR`; do if [ ! -d $i ] ; then mkdir $i fi done for i in `cat $CREATEPATH`; do if [ ! -d $i ] ; then /usr/bin/maildirmake $i fi done rm $HOME/tmp/* exit 0; phamm-0.6.2/tools/phamm-useradd.pl0000755000175300017530000005001412256607224016052 0ustar phammphamm#!/usr/bin/perl -w # phamm-useradd # based on smbldap-useradd # code version 1.30 2006/01/02 17:01:19 jtournier Exp $ # from smbldap-tools (IDEALX http://IDEALX.org/) # (c) Jerome Tournier - IDEALX 2004 (http://www.idealx.com) # Licensed under the GPL # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, # USA. # Purpose of phamm-useradd : user (posix,shadow,samba) add using attribute # from phamm.schema use strict; use FindBin; use FindBin qw($RealBin); use lib "$RealBin/"; use smbldap_tools; use Crypt::SmbHash; ##################### use Getopt::Std; my %Options; my $ok = getopts('o:arnmwiPG:u:g:d:s:c:k:t:A:B:C:D:E:F:H:N:S:?', \%Options); if ( (!$ok) || (@ARGV < 1) || ($Options{'?'}) ) { print_banner; print "Usage: $0 [-awmugdsckABCDEFGHMNPST?] username\n"; print " -o add the user in the organizational unit (relative to the user suffix)\n"; print " -a is a Windows User (otherwise, Posix stuff only)\n"; print " -r is a PHAMM complete user\n"; print " -w is a Windows Workstation (otherwise, Posix stuff only)\n"; print " -i is a trust account (Windows Workstation)\n"; print " -u uid\n"; print " -g gid\n"; print " -G supplementary comma-separated groups\n"; print " -n do not create a group\n"; print " -d home\n"; print " -s shell\n"; print " -c gecos\n"; print " -m creates home directory and copies /etc/skel\n"; print " -k skeleton dir (with -m)\n"; print " -t time. Wait 'time' seconds before exiting (when adding Windows Workstation)\n"; print " -P ends by invoking smbldap-passwd\n"; print " -A can change password ? 0 if no, 1 if yes\n"; print " -B must change password ? 0 if no, 1 if yes\n"; print " -C sambaHomePath (SMB home share, like '\\\\PDC-SRV\\homes')\n"; print " -D sambaHomeDrive (letter associated with home share, like 'H:')\n"; print " -E sambaLogonScript (DOS script to execute on login)\n"; print " -F sambaProfilePath (profile directory, like '\\\\PDC-SRV\\profiles\\foo')\n"; print " -H sambaAcctFlags (samba account control bits like '[NDHTUMWSLKI]')\n"; print " -N surname\n"; print " -S family name\n"; print " -? show this help message\n"; exit (1); } my $ldap_master=connect_ldap_master(); # cause problems when dealing with getpwuid because of the # negative ttl and ldap modification my $nscd_status = system "/etc/init.d/nscd status >/dev/null 2>&1"; if ($nscd_status == 0) { system "/etc/init.d/nscd stop > /dev/null 2>&1"; } # Read only first @ARGV my $userName = $ARGV[0]; # For computers account, add a trailing dollar if missing if (defined($Options{'w'})) { if ($userName =~ /[^\$]$/s) { $userName .= "\$"; } } # untaint $userName (can finish with one or two $) if ($userName =~ /^([\w -.]+\$?)$/) { $userName = $1; } else { print "$0: illegal username\n"; exit (1); } # user must not exist in LDAP (should it be nss-wide ?) my ($rc, $dn) = get_user_dn2($userName); if ($rc and defined($dn)) { print "$0: user $userName exists\n"; exit (9); } elsif (!$rc) { print "$0: error in get_user_dn2\n"; exit(10); } # Read options # we create the user in the specified ou (relative to the users suffix) my $user_ou=$Options{'o'}; my $node; if (defined $user_ou) { if (!($user_ou =~ m/^ou=(.*)/)) { $node=$user_ou; $user_ou="ou=$user_ou"; } else { ($node)=($user_ou=~m/ou=(.*)/); } # $config{usersdn}="$user_ou,$config{usersdn}"; # if the ou does not exist, we create it my $mesg = $ldap_master->search ( base => "$config{usersdn}", scope => "one", filter => "(&(objectClass=organizationalUnit)(ou=$node))" ); $mesg->code && die $mesg->error; if ($mesg->count eq 0) { print "creating $user_ou first (as $user_ou,$config{usersdn})\n"; # add organizational unit my $add = $ldap_master->add ("ou=$node,$config{usersdn}", attr => [ 'objectclass' => ['top','organizationalUnit'], 'ou' => "$node" ] ); $add->code && die "failed to add entry: ", $add->error ; } $config{usersdn}="$user_ou,$config{usersdn}"; } my $userUidNumber = $Options{'u'}; if (!defined($userUidNumber)) { $userUidNumber=get_next_id($config{usersdn},"uidNumber"); } elsif (getpwuid($userUidNumber)) { die "Uid already exists.\n"; } if ($nscd_status == 0) { system "/etc/init.d/nscd start > /dev/null 2>&1"; } my $createGroup = 0; my $userGidNumber = $Options{'g'}; # gid not specified ? if (!defined($userGidNumber)) { # windows machine => $config{defaultComputerGid} if (defined($Options{'w'})) { $userGidNumber = $config{defaultComputerGid}; # } elsif (!defined($Options{'n'})) { # create new group (redhat style) # find first unused gid starting from $config{GID_START} # while (defined(getgrgid($config{GID_START}))) { # $config{GID_START}++; # } # $userGidNumber = $config{GID_START}; # $createGroup = 1; } else { # user will have gid = $config{defaultUserGid} $userGidNumber = $config{defaultUserGid}; } } else { my $gid; if (($gid = parse_group($userGidNumber)) < 0) { print "$0: unknown group $userGidNumber\n"; exit (6); } $userGidNumber = $gid; } my $group_entry; my $userGroupSID; my $userRid; my $user_sid; if (defined $Options{'a'} or defined $Options{'i'}) { # as grouprid we use the value of the sambaSID attribute for # group of gidNumber=$userGidNumber $group_entry = read_group_entry_gid($userGidNumber); $userGroupSID = $group_entry->get_value('sambaSID'); unless ($userGroupSID) { print "Error: SID not set for unix group $userGidNumber\n"; print "check if your unix group is mapped to an NT group\n"; exit (7); } # as rid we use 2 * uid + 1000 $userRid = 2 * $userUidNumber + 1000; # let's test if this SID already exist $user_sid="$config{SID}-$userRid"; my $test_exist_sid=does_sid_exist($user_sid,$config{usersdn}); if ($test_exist_sid->count == 1) { print "User SID already owned by\n"; # there should not exist more than one entry, but ... foreach my $entry ($test_exist_sid->all_entries) { my $dn= $entry->dn; chomp($dn); print "$dn\n"; } exit(7); } } my $userHomeDirectory; my ($givenName,$userCN, $userSN); my $tmp; if (!defined($userHomeDirectory = $Options{'d'})) { $userHomeDirectory = &subst_user($config{userHome}, $userName); } # RFC 2256 # sn: : nom (option S) # givenName: prenom (option N) # cn: person's full name $userHomeDirectory=~s/\/\//\//; $config{userLoginShell} = $tmp if (defined($tmp = $Options{'s'})); $config{userGecos} = $tmp if (defined($tmp = $Options{'c'})); $config{skeletonDir} = $tmp if (defined($tmp = $Options{'k'})); $givenName = (utf8Encode($Options{'N'}) || $userName); $userSN = (utf8Encode($Options{'S'}) || $userName); if ($Options{'N'} and $Options{'S'}) { $userCN="$givenName"." $userSN"; } else { $userCN=$userName; } ######################## # MACHINE ACCOUNT if (defined($Options{'w'}) or defined($Options{'i'})) { # if Options{'i'} and username does not end with $ caracter => we add it if ( $Options{'i'} and !($userName =~ m/\$$/) ) { $userName.="\$"; } if (!add_posix_machine ($userName,$userUidNumber,$userGidNumber,$Options{'t'})) { die "$0: error while adding posix account\n"; } if (defined($Options{'i'})) { # For machine trust account # Objectclass sambaSAMAccount must be added now ! my $pass; my $pass2; system "stty -echo"; print "New password : "; chomp($pass=); print "\n"; system "stty echo"; system "stty -echo"; print "Retype new password : "; chomp($pass2=); print "\n"; system "stty echo"; if ($pass ne $pass2) { print "New passwords don't match!\n"; exit (10); } my ($lmpassword,$ntpassword) = ntlmgen $pass; my $date=time; my $modify = $ldap_master->modify ( "uid=$userName,$config{computersdn}", changes => [ replace => [objectClass => ['top', 'person', 'organizationalPerson', 'inetOrgPerson', 'posixAccount', 'sambaSAMAccount']], add => [sambaLogonTime => '0'], add => [sambaLogoffTime => '2147483647'], add => [sambaKickoffTime => '2147483647'], add => [sambaPwdCanChange => '0'], add => [sambaPwdMustChange => '2147483647'], add => [sambaPwdLastSet => "$date"], add => [sambaAcctFlags => '[I ]'], add => [sambaLMPassword => "$lmpassword"], add => [sambaNTPassword => "$ntpassword"], add => [sambaSID => "$user_sid"], add => [sambaPrimaryGroupSID => "$config{SID}-5015"] ] ); $modify->code && die "failed to add entry: ", $modify->error ; } $ldap_master->unbind; exit 0; } # USER ACCOUNT # add posix account first my $add; # if PHAMM account, we must add first mail and other things if (defined($Options{'r'})) { $add = $ldap_master->add ("mail=$userName\@$config{mailDomain},$config{usersdn}", attr => [ 'objectclass' => ['top','VirtualMailAccount','Vacation','amavisAccount','VirtualForward','posixAccount','shadowAccount'], 'mail' => "$userName\@$config{mailDomain}", 'vdHome' => '/home/vmail/domains', 'mailbox' => "$config{mailDomain}\/$userName\/", 'delete' => 'FALSE', 'sn' => "$userSN", 'userPassword' => "{crypt}x", 'vacationActive' => 'FALSE', 'vacationStart' => '01 gennaio 2004', 'vacationEnd' => '01 gennaio 2004', 'vacationForward' => 'user@example.tld', 'forwardActive' => 'FALSE', 'accountActive' => 'TRUE', 'lastChange' => '1108499016', 'cn' => "$userCN", 'quota' => '5242880S', 'amavisSpamKillLevel' => '6.0', 'amavisSpamTag2Level' => '5.5', 'amavisSpamTagLevel' => '3.0', 'amavisBypassVirusChecks' => 'TRUE', 'amavisBypassSpamChecks' => 'TRUE', 'otherTransport' => 'phamm:', 'uid' => "$userName", 'uidNumber' => "$userUidNumber", 'gidNumber' => "$userGidNumber", 'homeDirectory' => "$userHomeDirectory", 'loginShell' => "$config{userLoginShell}", 'gecos' => "$config{userGecos}", 'description' => "$config{userGecos}" ] ); } else { $add = $ldap_master->modify ("mail=$userName\@$config{mailDomain},$config{usersdn}", changes => [ add => [objectClass => 'posixAccount'], add => [uid => "$userName"], add => [uidNumber => "$userUidNumber"], add => [gidNumber => "$userGidNumber"], add => [homeDirectory => "$userHomeDirectory"], add => [objectClass => 'shadowAccount'], add => [loginShell => "$config{userLoginShell}"], add => [gecos => "$config{userGecos}"], add => [description => "$config{userGecos}"], ] ); } $add->code && warn "failed to add entry: ", $add->error ; #if ($createGroup) { # group_add($userName, $userGidNumber); #} if ($userGidNumber != $config{defaultUserGid}) { group_add_user($userGidNumber, $userName); } my $grouplist; # adds to supplementary groups if (defined($grouplist = $Options{'G'})) { add_grouplist_user($grouplist, $userName); } # If user was created successfully then we should create his/her home dir if (defined($tmp = $Options{'m'})) { unless ( $userName =~ /\$$/ ) { if ( !(-e $userHomeDirectory) ) { system "mkdir $userHomeDirectory 2>/dev/null"; system "cp -a $config{skeletonDir}/.[a-z,A-Z]* $config{skeletonDir}/* $userHomeDirectory 2>/dev/null"; system "chown -R $userUidNumber:$userGidNumber $userHomeDirectory 2>/dev/null"; if (defined $config{userHomeDirectoryMode}) { system "chmod $config{userHomeDirectoryMode} $userHomeDirectory 2>/dev/null"; } else { system "chmod 700 $userHomeDirectory 2>/dev/null"; } } } } # Add Samba user infos my @adds; if (defined($Options{'a'})) { if (!$config{with_smbpasswd}) { my $winmagic = 2147483647; my $valpwdcanchange = 0; my $valpwdmustchange = $winmagic; my $valpwdlastset = 0; my $valacctflags = "[UX]"; if (defined($tmp = $Options{'A'})) { if ($tmp != 0) { $valpwdcanchange = "0"; } else { $valpwdcanchange = "$winmagic"; } } if (defined($tmp = $Options{'B'})) { if ($tmp != 0) { $valpwdmustchange = "0"; # To force a user to change his password: # . the attribut sambaPwdLastSet must be != 0 # . the attribut sambaAcctFlags must not match the 'X' flag $valpwdlastset=$winmagic; $valacctflags = "[U]"; } else { $valpwdmustchange = "$winmagic"; } } if (defined($tmp = $Options{'H'})) { $valacctflags = "$tmp"; } my $modify = $ldap_master->modify ( "mail=$userName\@$config{mailDomain},$config{usersdn}", changes => [ add => [objectClass => 'sambaSAMAccount'], add => [sambaPwdLastSet => "$valpwdlastset"], add => [sambaLogonTime => '0'], add => [sambaLogoffTime => '2147483647'], add => [sambaKickoffTime => '2147483647'], add => [sambaPwdCanChange => "$valpwdcanchange"], add => [sambaPwdMustChange => "$valpwdmustchange"], add => [displayName => "$config{userGecos}"], add => [sambaAcctFlags => "$valacctflags"], add => [sambaSID => "$config{SID}-$userRid"] ] ); $modify->code && die "failed to add entry: ", $modify->error ; } else { my $FILE="|smbpasswd -s -a $userName >/dev/null" ; open (FILE, $FILE) || die "$!\n"; print FILE < $valhomedrive); } if ($valsmbhome) { push(@adds, 'sambaHomePath' => $valsmbhome); } if ($valprofilepath) { push(@adds, 'sambaProfilePath' => $valprofilepath); } if ($valscriptpath) { push(@adds, 'sambaLogonScript' => $valscriptpath); } if (!$config{with_smbpasswd}) { push(@adds, 'sambaPrimaryGroupSID' => $userGroupSID); push(@adds, 'sambaLMPassword' => "XXX"); push(@adds, 'sambaNTPassword' => "XXX"); } my $modify = $ldap_master->modify ( "mail=$userName\@$config{mailDomain},$config{usersdn}", add => { @adds } ); $modify->code && die "failed to add entry: ", $modify->error ; } $ldap_master->unbind; # take down session if (defined($Options{'P'})) { exec "$RealBin/smbldap-passwd \"$userName\"" } exit 0; ######################################## =head1 NAME smbldap-useradd - Create a new user =head1 SYNOPSIS smbldap-useradd [-o user_ou] [-c comment] [-d home_dir] [-g initial_group] [-G group[,...]] [-m [-k skeleton_dir]] [-s shell] [-u uid [ -o]] [-P] [-A canchange] [-B mustchange] [-C smbhome] [-D homedrive] [-E scriptpath] [-F profilepath] [-H acctflags] login =head1 DESCRIPTION Creating New Users The smbldap-useradd command creates a new user account using the values specified on the command line and the default values from the system and from the configuration files (in /etc/smbldap-tools directory). For Samba users, rid is '2*uidNumber+1000', and sambaPrimaryGroupSID is '$SID-2*gidNumber+1001', where $SID is the domain SID. Thus you may want to use : $ smbldap-useradd -a -g "Domain Admins" -u 500 Administrator to create an domain administrator account (admin rid is 0x1F4 = 500 and grouprid is 0x200 = 512). Without any option, the account created will be an Unix (Posix) account. The following options may be used to add information: -o The user's account will be created in the specified organazional unit. It is relative to the user suffix dn ($usersdn) defined in the configuration file. -a The user will have a Samba account (and Unix). -r The user is a complete PHAMM account -w Creates an account for a Samba machine (Workstation), so that it can join a sambaDomainName. -i Creates an interdomain trust account (machine Workstation). A password will be asked for the trust account. -c "comment" The new user's comment field (gecos). -d home_dir The new user will be created using home_dir as the value for the user's login directory. The default is to append the login name to userHomePrefix (defined in the configuration file) and use that as the login directory name. -g initial_group The group name or number of the user's initial login group. The group name must exist. A group number must refer to an already existing group. The default group number is defined in the configuration file (defaultUserGid="513"). -G group,[...] A list of supplementary groups which the user is also a member of. Each group is separated to the next by a comma, with no intervening whitespace. The groups are subject to the same restrictions as the group given with the -g option. The default is for the user to belong only to the initial group. -m The user's home directory will be created if it does not exist. The files contained in skeletonDir will be copied to the home directory if the -k option is used, otherwise the files contained in /etc/skel will be used instead. Any directories contained in skeletonDir or /etc/skel will be created in the user's home directory as well. The -k option is only valid in conjunction with the -m option. The default is to not create the directory and to not copy any files. -s shell The name of the user's login shell. The default is to leave this field blank, which causes the system to select the default login shell. -t time Wait