Datatrend Software - Digitizing software and CGI Scripts

DataTrend Software
CGI Scripts


AutoContact
AutoFollowUp
AutoMail
AutoMail Lite
Bookkeeper Lite
CountDown
CountDown Lite
CountLink
Script Feedback


PERL/CGI Books
 AutoMail Lite Text
#!/usr/local/bin/perl
####################################################################
# AutoMail Lite Version 2.1
# Copyright 1998-99 Edward Preble automail@datatrendsoftware.com
# Created 12/01/98 Last Modified 09/12/99
# Datatrend Software http://www.datatrendsoftware.com/cgi.html
####################################################################
# This script will do the following:
# 1. AutoMail Lite will attach a file to a text body and auto-forward it
# to the email address entered in the form.
# 2. Includes Formmail. Formmail instructions are included at the end of
# the AutoMail Lite instruction file. No formmail functions are changed.
# 3. In addition to the formmail functions, auto-responding is enabled.
# 4. Will either record the email address in a log file for you, or email
# you a short letter stating the email address of the user.
####################################################################
# This script requires:
# 1. The PERL Module called MIME::TOOLS, which contains MIME::ENTITY.
# This module is used to make the e-mail attachments. You do not need to
# do anything to use MIME::TOOLS, but you DO need to have access to it.
# 2. Sendmail. This program actually sends the email.
#
# If you can't find these programs yourself, check your service provider's
# website (which should list them), and lastly, contact your system
# administrator.
####################################################################
# COPYRIGHT NOTICE
# Modifications to Formmail Copyright 1998 Edward Preble
#
# This script is free. You may use and modify this script as you please.
# Do not remove this header, as it is the only thing that gives me credit
# for my work in writing this code. If you wish to sell this code, you
# must obtain permission from the authors (both Edward Preble and
# Matthew M. Wright) first.
#
# This script is a modification of Formmail 1.6 by Matthew M. Wright. His
# copyright and instructions are included in the zip package for Automail
# Lite.
#
# Scripts provided by Datatrend Software are supplied "as-is". You agree
# to indemnify the author's from any liability that may arise from the use
# of this script. We will provide support at automail@datatrendsoftware.com.
# If sending us email, please tell us the script, the error, and if at all
# possible, provide the error log message for your problem.
#
# Obtain permission before redistributing this software over the Internet or
# in any other medium. In all cases, copyright and header must remain intact
####################################################################
# FormMail Version 1.6
# Copyright 1996-1997 Matt Wright mattw@worldwidemart.com
# Created 06/09/95 Last Modified 05/02/97
# Matt's Script Archive, Inc.: http://www.worldwidemart.com/scripts/
####################################################################
# COPYRIGHT NOTICE
# Copyright 1995 - 1997 Matthew M. Wright All Rights Reserved.
#
# FormMail may be used and modified free of charge by anyone so long as this
# copyright notice and the comments above remain intact. By using this
# code you agree to indemnify Matthew M. Wright from any liability that
# might arise from its use.
#
# Selling the code for this program without prior written consent is
# expressly forbidden. In other words, please ask first before you try and
# make money off of my program.
#
# Obtain permission before redistributing this software over the Internet or
# in any other medium. In all cases copyright and header must remain intact
#
####################################################################
# You must modify the the location of PERL in the first line above to match
# the location on your server.
# You must also modify the following variables to match your system.
#
# Each variable is defined in the readme.txt file.

$mailprog = '/usr/lib/sendmail';
@referers = ('www.yoursite.com','www.othersite.com');
$auto_type = 'image/gif';
$auto_encoding = 'base64';
$auto_body = 'body.txt';
$message_type = 'multipart/mixed';
$log_or_email = 'B';
$email_log = 'automail_lite.log';

# This script requires the MIME::ENTITY module to function.
# It is included in the MIME::TOOLS module
# Ask your system admin if this module is installed for PERL on your server.
##########################################################
# No changes need to be made after these lines
##########################################################
use MIME::Entity;

open (TXT,"./automail/$auto_body") || &endIt;
flock (TXT,2); seek (TXT,0,0);
@Message_Text = <TXT>;
close (TXT);
$Body = "@Message_Text";

# Check Referring URL
&check_url;

# Retrieve Date
&get_date;

# Parse Form Contents
&parse_form;

# Secure the $RealFile variable. Removes possibility of backtracking
# up directories to grab other files from your website. Strips
# off all info up to last slash (/), if present.

$RealFile = $Config{'file'};
if ($RealFile =~ /\//) { ($RealFile) = $Config{'file'} =~ /^.*\/([^\/]+)$/g; }

# Check Required Fields
&check_required;

# Return HTML Page or Redirect User
&return_html;

# Send E-Mail
&send_mail;

sub send_mail {
# Localize variables used in this subroutine.
local($print_config,$key,$sort_order,$sorted_field,$env_report);

##### Send File attachments to form user
# First, format the email address for MIME::ENTITY

# Create the top-level, and set up the mail headers:
$top = build MIME::Entity Type => $message_type,
From => $Config{'recipient'},
To => $Config{'email'},
Subject => $Config{'subject'};

# Part #1: This is the body of the message:
attach $top Data=> $Body;

# Part #2: Make Attachment:
attach $top Path => "./automail/$RealFile",
Type => $auto_type,
Encoding => $auto_encoding;

# Send it:
open MAIL, "|$mailprog -t -i" or die "open: $!";
$top->print(\*MAIL);
close MAIL;

#Check for preference on Log and confirmation message
if ($log_or_email eq 'L') { &update_log; }
elsif ($log_or_email eq 'E') { &send_confirm; }
elsif ($log_or_email eq 'B') {
&send_confirm;
&update_log; }
}

sub update_log {
##### Updates log file specified with the email address of the form user.

open (LOG, ">>./automail/$email_log") || &endIt;
print LOG "$email\n";
close (LOG);

}

sub send_confirm {
##### Send a confirmation message to site owner

# Open The Mail Program
open(MAIL,"|$mailprog -t");

print MAIL "To: $Config{'recipient'}\n";
print MAIL "From: $Config{'email'}\n";

# Check for Message Subject
if ($Config{'subject'}) { print MAIL "Subject: $Config{'subject'}\n\n" }
else { print MAIL "Subject: WWW Form Submission\n\n" }

print MAIL "On $date,\n";
print MAIL "$Config{'realname'}$Config{'email'} requested $RealFile.\n";

if (@Print_Config) {
foreach $print_config (@Print_Config) {
if ($Config{$print_config}) {
print MAIL "$print_config: $Config{$print_config}\n\n";
}
}
}

# Sort alphabetically if specified: #
if ($Config{'sort'} eq 'alphabetic') {
foreach $field (sort keys %Form) {

# If the field has a value or the print blank fields option #
# is turned on, print out the form field and value. #
if ($Config{'print_blank_fields'} || $Form{$field} ||
$Form{$field} eq '0') {
print MAIL "$field: $Form{$field}\n\n";
}
}
}

# If a sort order is specified, sort the form fields based on that. #
elsif ($Config{'sort'} =~ /^order:.*,.*/) {

# Remove extraneous line breaks and spaces, remove the order: #
# directive and split the sort fields into an array. #
$Config{'sort'} =~ s/(\s+|\n)?,(\s+|\n)?/,/g;
$Config{'sort'} =~ s/(\s+)?\n+(\s+)?//g;
$Config{'sort'} =~ s/order://;
@sorted_fields = split(/,/, $Config{'sort'});

# For each sorted field, if it has a value or the print blank #
# fields option is turned on print the form field and value. #
foreach $sorted_field (@sorted_fields) {
if ($Config{'print_blank_fields'} || $Form{$sorted_field} ||
$Form{$sorted_field} eq '0') {
print MAIL "$sorted_field: $Form{$sorted_field}\n\n";
}
}
}

# Otherwise, default to the order in which the fields were sent. #
else {

# For each form field, if it has a value or the print blank #
# fields option is turned on print the form field and value. #
foreach $field (@Field_Order) {
if ($Config{'print_blank_fields'} || $Form{$field} ||
$Form{$field} eq '0') {
print MAIL "$field: $Form{$field}\n\n";
}
}
}

# Send any specified Environment Variables to recipient. #
foreach $env_report (@Env_Report) {
if ($ENV{$env_report}) {
print MAIL "$env_report: $ENV{$env_report}\n";
}
}

close (MAIL);
}

sub check_url {

# Localize the check_referer flag which determines if user is valid. #
local($check_referer) = 0;

# If a referring URL was specified, for each valid referer, make sure #
# that a valid referring URL was passed to FormMail. #

if ($ENV{'HTTP_REFERER'}) {
foreach $referer (@referers) {
if ($ENV{'HTTP_REFERER'} =~ m|https?://([^/]*)$referer|i) {
$check_referer = 1;
last;
}
}
}
else {
$check_referer = 1;
}

# If the HTTP_REFERER was invalid, send back an error. #
if ($check_referer != 1) { &error('bad_referer') }
}

sub get_date {

# Define arrays for the day of the week and month of the year. #
@days = ('Sunday','Monday','Tuesday','Wednesday',
'Thursday','Friday','Saturday');
@months = ('January','February','March','April','May','June','July',
'August','September','October','November','December');

# Get the current time and format the hour, minutes and seconds. Add #
# 1900 to the year to get the full 4 digit year. #
($sec,$min,$hour,$mday,$mon,$year,$wday) = (localtime(time))[0,1,2,3,4,5,6];
$time = sprintf("%02d:%02d:%02d",$hour,$min,$sec);
$year += 1900;

# Format the date. #
$date = "$days[$wday], $months[$mon] $mday, $year at $time";

}

sub parse_form {

# Define the configuration associative array. #

%Config = ('recipient','', 'subject','',
'email','', 'realname','',
'redirect','', 'bgcolor','',
'background','', 'link_color','',
'vlink_color','', 'text_color','',
'alink_color','', 'title','',
'sort','', 'print_config','',
'required','', 'env_report','',
'return_link_title','', 'return_link_url','',
'print_blank_fields','', 'missing_fields_redirect','',
'file','',);

# Determine the form's REQUEST_METHOD (GET or POST) and split the form #
# fields up into their name-value pairs. If the REQUEST_METHOD was #
# not GET or POST, send an error. #
if ($ENV{'REQUEST_METHOD'} eq 'GET') {
# Split the name-value pairs
@pairs = split(/&/, $ENV{'QUERY_STRING'});
}
elsif ($ENV{'REQUEST_METHOD'} eq 'POST') {
# Get the input
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});

# Split the name-value pairs
@pairs = split(/&/, $buffer);
}
else {
&error('request_method');
}

# For each name-value pair: #
foreach $pair (@pairs) {

# Split the pair up into individual variables. #
local($name, $value) = split(/=/, $pair);

# Decode the form encoding on the name and value variables. #
$name =~ tr/+/ /;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

# If they try to include server side includes, erase them, so they
# aren't a security risk if the html gets returned. Another
# security hole plugged up.
$value =~ s/<!--(.|\n)*-->//g;

# If the field name has been specified in the %Config array, it will #
# return a 1 for defined($Config{$name}}) and we should associate #
# this value with the appropriate configuration variable. If this #
# is not a configuration form field, put it into the associative #
# array %Form, appending the value with a ', ' if there is already a #
# value present. We also save the order of the form fields in the #
# @Field_Order array so we can use this order for the generic sort. #
if (defined($Config{$name})) {
$Config{$name} = $value;
}
else {
if ($Form{$name} && $value) {
$Form{$name} = "$Form{$name}, $value";
}
elsif ($value) {
push(@Field_Order,$name);
$Form{$name} = $value;
}
}
}

# The next six lines remove any extra spaces or new lines from the #
# configuration variables, which may have been caused if your editor #
# wraps lines after a certain length or if you used spaces between field #
# names or environment variables. #
$Config{'required'} =~ s/(\s+|\n)?,(\s+|\n)?/,/g;
$Config{'required'} =~ s/(\s+)?\n+(\s+)?//g;
$Config{'env_report'} =~ s/(\s+|\n)?,(\s+|\n)?/,/g;
$Config{'env_report'} =~ s/(\s+)?\n+(\s+)?//g;
$Config{'print_config'} =~ s/(\s+|\n)?,(\s+|\n)?/,/g;
$Config{'print_config'} =~ s/(\s+)?\n+(\s+)?//g;

# Split the configuration variables into individual field names. #
@Required = split(/,/,$Config{'required'});
@Env_Report = split(/,/,$Config{'env_report'});
@Print_Config = split(/,/,$Config{'print_config'});

}

sub check_required {

# Localize the variables used in this subroutine. #
local($require, @error);

if (!$Config{'recipient'}) {
if (!defined(%Form)) { &error('bad_referer') }
else { &error('no_recipient') }
}

# For each require field defined in the form: #
foreach $require (@Required) {

# If the required field is the email field, the syntax of the email #
# address if checked to make sure it passes a valid syntax. #
if ($require eq 'email' && !&check_email($Config{$require})) {
push(@error,$require);
}

# Otherwise, if the required field is a configuration field and it #
# has no value or has been filled in with a space, send an error. #
elsif (defined($Config{$require})) {
if (!$Config{$require}) {
push(@error,$require);
}
}

# If it is a regular form field which has not been filled in or #
# filled in with a space, flag it as an error field. #
elsif (!$Form{$require}) {
push(@error,$require);
}
}

# If any error fields have been found, send error message to the user. #
if (@error) { &error('missing_fields', @error) }
}

sub return_html {
# Local variables used in this subroutine initialized. #
local($key,$sort_order,$sorted_field);

# If redirect option is used, print the redirectional location header. #
if ($Config{'redirect'}) {
print "Location: $Config{'redirect'}\n\n";
}

# Otherwise, begin printing the response page. #
else {

# Print HTTP header and opening HTML tags. #
print "Content-type: text/html\n\n";
print "<html>\n <head>\n";

# Print out title of page #
if ($Config{'title'}) { print " <title>$Config{'title'}</title>\n" }
else { print " <title>Thank You</title>\n" }

print " </head>\n <body";

# Get Body Tag Attributes #
&body_attributes;

# Close Body Tag #
print ">\n <center>\n";

# Print custom or generic title. #
if ($Config{'title'}) { print " <h1>$Config{'title'}</h1>\n" }
else { print " <h1>Thank You For Filling Out This Form</h1>\n" }

print "</center>\n";

print "Below is what you submitted to $Config{'recipient'} on ";
print "$date<p><hr size=1 width=75\%><p>\n";

# Sort alphabetically if specified: #
if ($Config{'sort'} eq 'alphabetic') {
foreach $field (sort keys %Form) {

# If the field has a value or the print blank fields option #
# is turned on, print out the form field and value. #
if ($Config{'print_blank_fields'} || $Form{$field}) {
print "<b>$field:</b> $Form{$field}<p>\n";
}
}
}

# If a sort order is specified, sort the form fields based on that. #
elsif ($Config{'sort'} =~ /^order:.*,.*/) {

# Set the temporary $sort_order variable to the sorting order, #
# remove extraneous line breaks and spaces, remove the order: #
# directive and split the sort fields into an array. #
$sort_order = $Config{'sort'};
$sort_order =~ s/(\s+|\n)?,(\s+|\n)?/,/g;
$sort_order =~ s/(\s+)?\n+(\s+)?//g;
$sort_order =~ s/order://;
@sorted_fields = split(/,/, $sort_order);

# For each sorted field, if it has a value or the print blank #
# fields option is turned on print the form field and value. #
foreach $sorted_field (@sorted_fields) {
if ($Config{'print_blank_fields'} || $Form{$sorted_field}) {
print "<b>$sorted_field:</b> $Form{$sorted_field}<p>\n";
}
}
}

# Otherwise, default to the order in which the fields were sent. #
else {

# For each form field, if it has a value or the print blank #
# fields option is turned on print the form field and value. #
foreach $field (@Field_Order) {
if ($Config{'print_blank_fields'} || $Form{$field}) {
print "<b>$field:</b> $Form{$field}<p>\n";
}
}
}

print "<p><hr size=1 width=75%><p>\n";

# Check for a Return Link and print one if found. #
if ($Config{'return_link_url'} && $Config{'return_link_title'}) {
print "<ul>\n";
print "<li><a href=\"$Config{'return_link_url'}\">$Config{'return_link_title'}</a>\n";
print "</ul>\n";
}

# Print the page footer. #
print <<"(END HTML FOOTER)";
<hr size=1 width=75%><p>
<center><font size=-1><a href="http://www.worldwidemart.com/scripts/formmail.shtml">FormMail</a> V1.6 &copy; 1995 -1997 Matt Wright<br>
A Free Product of <a href="http://www.worldwidemart.com/scripts/">Matt's Script Archive, Inc.</a></font></center>
</body>
</html>
(END HTML FOOTER)
}
}

#Send mail went Here

sub check_email {
# Initialize local email variable with input to subroutine. #
$email = $_[0];

# If the e-mail address contains: #
if ($email =~ /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/ ||

# the e-mail address contains an invalid syntax. Or, if the #
# syntax does not match the following regular expression pattern #
# it fails basic syntax verification. #

$email !~ /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/) {

# Basic syntax requires: one or more characters before the @ sign, #
# followed by an optional '[', then any number of letters, numbers, #
# dashes or periods (valid domain/IP characters) ending in a period #
# and then 2 or 3 letters (for domain suffixes) or 1 to 3 numbers #
# (for IP addresses). An ending bracket is also allowed as it is #
# valid syntax to have an email address like: user@[255.255.255.0] #

# send error submission to sendmail so can see what the problem is#

local($print_config,$key,$sort_order,$sorted_field,$env_report);
open(MAIL,"|$mailprog -t");
print MAIL "To: $Config{'recipient'}\n";
print MAIL "From: Error Submission\n";

if ($Config{'subject'}) { print MAIL "Subject: $Config{'subject'}\n\n" }
else { print MAIL "Subject: WWW Form Submission\n\n" }

print MAIL "The following text was entered by a user\n";
print MAIL "$Config{'email'}\n";
print MAIL "on $date\n";
close (MAIL);

# Return a false value, since the e-mail address did not pass valid #
# syntax. #
return 0;
}

else {

# Return a true value, e-mail verification passed. #
return 1;
}
}

sub body_attributes {
# Check for Background Color
if ($Config{'bgcolor'}) { print " bgcolor=\"$Config{'bgcolor'}\"" }

# Check for Background Image
if ($Config{'background'}) { print " background=\"$Config{'background'}\"" }

# Check for Link Color
if ($Config{'link_color'}) { print " link=\"$Config{'link_color'}\"" }

# Check for Visited Link Color
if ($Config{'vlink_color'}) { print " vlink=\"$Config{'vlink_color'}\"" }

# Check for Active Link Color
if ($Config{'alink_color'}) { print " alink=\"$Config{'alink_color'}\"" }

# Check for Body Text Color
if ($Config{'text_color'}) { print " text=\"$Config{'text_color'}\"" }
}

sub error {
# Localize variables and assign subroutine input. #
local($error,@error_fields) = @_;
local($host,$missing_field,$missing_field_list);

if ($error eq 'bad_referer') {
if ($ENV{'HTTP_REFERER'} =~ m|^https?://([\w\.]+)|i) {
$host = $1;
print <<"(END ERROR HTML)";
Content-type: text/html

<html>
<head>
<title>Bad Referrer - Access Denied</title>
</head>
<body bgcolor=#FFFFFF text=#000000>
<center>
<table border=0 width=600 bgcolor=#9C9C9C>
<tr><th><font size=+2>Bad Referrer - Accvti_encoding:SR|utf8-nl vti_timelastmodified:TR|23 Feb 2001 03:47:06 -0000 vti_extenderversion:SR|4.0.2.2717 vti_nexttolasttimemodified:TR|26 Nov 2000 23:57:52 -0000 vti_author:SR|preble vti_modifiedby:SR|preble vti_timecreated:TR|04 Sep 2000 01:49:15 -0000 vti_filesize:IR|820 vti_title:SR|Shared Top Border vti_metatags:VR|HTTP-EQUIV=Content-Type text/html;\\ charset=windows-1252 vti_backlinkinfo:VX| vti_cacheddtm:TX|26 Nov 2000 22:57:52 -0000 vti_cachedlinkinfo:VX|H|http://www.datatrendsoftware.com/ S|../images/blue_pixel.gif H|http://www.datatrendsoftware.com/ S|../images/page_header.gif S|../images/blue_pixel.gif H|http://www.datatrendsoftware.com/ S|../images/blue_pixel.gif vti_cachedsvcrellinks:VX|NHHS|http://www.datatrendsoftware.com/ FSUS|images/blue_pixel.gif NHHS|http://www.datatrendsoftware.com/ FSUS|images/page_header.gif FSUS|images/blue_pixel.gif NHHS|http://www.datatrendsoftware.com/ FSUS|images/blue_pixel.gif vti_cachedtitle:SR|Shared Top Border vti_cachedbodystyle:SR|

vti_cachedhasbots:BR|false vti_cachedhastheme:BR|false vti_cachedhasborder:BR|false BdBKdxbl+ jZDnyLf/ZKx5JC1XBobmdS4S+eTZ89hrHRp6poTAUMjkL+VgUjGkhSbiO4mVjsF/gnN6tNCVDAQV Zs4JouCtCGYYySENvTyBykD49xDRWX0SieqswiSFyVnFG4hxVgliCBQ9qhYd56yM82pxVtxg8mwU Z+UU7xkh5KymNKUFgjIQZmetzQCI5Kqai6uayKVRUSEgjVTCPfOdagkdctOY0v5BE6gNoMiL0lGE qQGUtQGSiQY8lgZU5EWo4WrAVG1AVKIBTiPzI/ylY0kt5vLJpK0DdpVPWunM5ZNjls8Q0wPHEnLQ L0wK9c+6QlJATPxQT/y8lvgpSFGCiYi5kw64yxmzB0VNQn7lGfXVYm9a1IRCgADpEpPbDPK2s3Bu k6pcZ3FKhxRbhpzODuqqOtg60agrD2KZzjDYDJV0BsJ¼‡fü̉f¬…f43DCotVEHHV6hlMKk1rhDVq3NQAiD WgtLojoZtRIXlEJDra++Fd8JyFsIyhZ06EY2nd4arlNXJqOYG5VBgI4LSfKvbgvEDqTKg+MOS+Pi zmejxWqI0FA0LAcdfwr3XpnVzq7GHgSV394i06Zw+BvoLdQbv3SdOfKtxK6wjEJMjwt8d5piNQ+X b7jkJ+zWAETDiVYnTt1bihPxpzgRf2TFwguplkAjxv8VVP+HFBu7kh5EEEp68LrP6QFcTpYzhiJ6 ScC5HRJykz8MCyXir1qsF4AKwkPItf1onvyDA1FGDgVTScKSxqcJgwYSnxgyPyoQX89AJwP07ug/ 7SU/qkHmbSGBLtPmm9Y4axIFpW2mbQz4n66nW/XcV+JcwMIKIAI3pabgqTXAEL//2HJRE0hmK+0T x/ucTAuMmmmNUgikmVHmMzyZwUwzBDNDMnEuIHGI3H4amWTHfQUdPpRkSNp35AsYvYbsvu1t/B4U tXw7NsnEL̉füÜ‹f¼‡fTm95oEjiArCOc4Y3e5AfwTSPCOFsISOB+03rhmnXG5Sur/uZ1vU8r+R3nozQiCx 1hVkT+hP6BI44fefBewrmBEPHlEnBTLGqWNJKBpB2XvUKJR3/2pnB7qbdwANRutSSRWQRH9xT9Jh pE1AwxFheMHL6TfsIEIGEVIBkGYw56xm49r9KeheOKyl9BFO0lEASEY1GUrpOiYgIzFlGb8G/cWP 2QPyIaAaRmqQAgRqnBMJAIBMwCxqwiFRgH91MHIEDk2qxZsamH9wEPIIgjTairxvF6MxMKrGgHJQ NUYR/DmDhpLj/QzErcYWsXuBhlEfiQLhOchyB3dWrl0uUpUFBwM6NDH4/cOlP5lxrCC5JU7L/WNF DepbYWvBJJVAeDAKRJeOQpl/7fPv8P/9i1DQnOhBPmD8ZjR1DGBXh4MP3RIMAhew8GdFo4wtPfDt tTEkJIlR6NBtjrDvl8opFAkYTtFR76E1Bziccb65NR2Gn3uMe5zteÜ‹füìf̉f66N3FdilL7H06d2NRSJ YuJmpYvKnSS70xKe7rqymM5A5HLjJiGUH+iebAzPH/RnUO9cPPp2q9NWlUjw/Qtw+IUvKELfRG7b 0R74iZqhMwaybVtJ38hFcGesniUIR/EhHNdfKjE+5MoLfv/Ruq3wrtFG73hL3+UZR+bmCDzEkIy5 FNB6XvKhIiNcxwCROWilSTuAjlBDojQopTQoa60RSUxpeLng958eW6SwVnC5T1Ec0r4AYUmb2hpO J00B7gJAP87QgFwroaMgNjBV6QMCdP+aR44Qwy/OB58FgRjHxalis+wVwH0P1ycwOeiY5Se9vmeg A3Q0ye6X0hoC6JL8CYixQR1jjGBaQatd8jCS9godNpRkVTiShCJ1ii4xR9UC/yQFIRKTSJdakolk JuHROu2zPoCfIvAVxgEvUSHY96Jxi3cFNsZzxbOYXfCCgYMQ0GP+1c5FAqgycVAjv4riMaKFti/n gpqRfKmdgoDUEmUpaEtìfüüfÜ‹fapU0b9y7EEBKUW8GMpnXgq3s5PStJHH8qE+3pVSCk2fR3zpAmgCWW kgCL7ZrSvbeQHMuiBiT3Q+klLkX01ITkITkfMqgHb1VkJ03wSkN4oGsm0tVEwd8sZxNZ6iJsLRNI VKTdQakoLThOrMlbuVTjH4dP1We27EFpsZau9kIodWsbTYnH77Nzpi4IHZ+AxDzP95Tkj4abHwK1 UPAuyqytCoGhLyBXn0hUCO0XFvtia6xv3GJfHKTlPy9zsWTBd5fsAflJOdl8Cci1bwAPiDw2jcSM AcljUwGQ5BigPAYs9pgPhAJD6kGMuYNTL6eouYSGU0zhlOpshYlTNtltDsbEQ0s//7ZRvGGCJidT CVCcg/0xR+wG9WFXsLJauyLYozK5PKjVaxU2CgaRQmrTxLeIAQiVrlNIDSb9ZNcwWha60Rac4AX0 Bva5kV7hMuwNaXOIsvcGXhJaDWGWNscKcfPPnoc6PQFdThgrxDaefBiiBY4esO1üfü ’fìfqAFtaKFAA lCQgIwJBcToFngy0zkFOcOJL1iRtJGtoHTQ0LVmQE+wzTXrcU89sC4992gg0OH1ejuplxzb+qc4k OVBeOhq2bWJYM8xmzXNR3BnukHbp0DEAiKnWT4xvgaWfqANP11GO4upIPhXaFTtWq0GGfhCHi5x4 1AQE3AhnKtsiNAezjhF+w8h5U2tvzpSSCaxERejrjWDoIA7RPrWOFSLMzEMP1urAHlI/bk8HN7JB oCQHukr8gwCg0p+0zMXpXvwvoBafeYPuwMDyA6i2G9TYg7eb6T434x1QtpdUsrFLd2khUYtCkG3J uKslG+yZVr5sMtB6BqG0FkYa20Gyn0GnrnEUc5x33VHXDvB09HovPnox5/mpB8taIXjwYhJqrWdQ tz4jpJRanYDoTfpXgxpc0lnC0SOKmP/k2HIFXPt2FZOoGvvxEAQTewrpDoFOk3+181L4BJScNB+a okWcB4VkxPnH9Ci+Z2ocFCLvXGOvp ’fü”füffB1hnKCu4LIHUMbDShtlycUC+MMj9W2adge0xAqIRWA fhBswMQUDySXq0I+/vXCluxOY6s8qMjNYY/SHKI3t4hB18wgSRXSQIVd6wyAjL2yrCaUmEE2G1/+ k4ni4aB1fFR5uoVZwZOmfpI8VEAJYfokUSFI+MN252JNujwWbZ0zBH3p4S+H0mUPQNBXuRl26Vy6 bxA+rhUgoZnjHDFOdG6XAYEUJcJVPnmHBCHJXSjE8d+UJgDpOttRoLvGM1i0X1LaARSdgPwHDdCg R/CsCCQcESf8pP3UAGsSOVkG3qYOvCZXRtLKFWLohnscukcBi8ygPvAp24ZeS6UeM+MhhhRDgG6N 8ICT4JNC0Y+JIQ4YCmaIJWUOIxxp5JFwFSDQifHHnyqQgdciXU/sL4MlYqWjOvZvdPQ2VR0TCSOt OlegcgWTzZQqF9zpl8HEHXVmSf3YzBMTgbjMcRR8RCogV6TEPf4UBgdSYHAgF2nt7awQC7FOC”fü,–f ’f 7CP/okgZXFejfzxNXkwybOlPJAMppAqKDwyUKIVm5NYK6YeYQjgQK4RjI0FzgCRoWndP+t2nn0Zi IpFg/TFJR6ggCngGDVWCHi0QKibJOStx0FyhRwkSeN3gDj4p9ypiEsHqnG4kxcQbXjyDk17gXwBA 5+gBQNriapEDn5wW8mmDeuBWJ+WQ+jUgKAIUgP1IrMPgSOQWukr+sbCJTgQAwgFHQmNR4Mh4IS0N QRwcKcrvrUztMLDD+rlPzIcoU+PwJCA19fwnEYT+kQWNepJGJb89J26TWNlkkcwC6W9WcQRuIMF8 CpOrzBShr5iZ0XOAGocuEShYEH/momNS/pvepkyn1iKSYYuiQhbJ+mSljTszkGzPSOkFZXdRyq+s QR1+6HrI/JdH3GJMo7NI44vsK+xygZhsmJbHWkSLmeZpnPsLl04+STWCQbaL+SqMyXYJA/6cbXAE wpHtOLr+PDESE4ZsF+lfTyNiomS7NmyMY4Rsuxe,–fü<˜f”fIUXRX1ABRy8PUBEB3DeaXjmOInrZ6CSBn sxRYOzSLMFI27dnP2ZT4bqMWRlljhMJ4CYiLV1xa0ozSeXHNa5PspWL6cOhANEheXOhB8raxJyF5 JzHgsomwQf4xL4TITxawM8gdlMJpTE2K4IOixiJ3C5b9aCN8o8CHO6/FISczMYy6oTBYMbBWEiul jB0pNgGtolOSL162JBtWZRG7QOxozmFMsXL16KYCrQL0xeYqegBfE4hcf7QEGgQMaAKUECe/1idt 8BcL/CdHtYBY0CsBukQjWpDVR+F7veOBL8DpdzgJvPyU+Rds+wlIDVenoRwBqWA9+CRYn2YkuQgN WITpks+4J+kDUCa78ROtmy4BWbi7qfBZ7FgNc89AgzbEDZUmAjE0x49cAmUGDHT8zhNRLLwAvnSy AuJ4gYf/VjseC9wK/1fthILfpHYqXnq3Whwcfju4kDeQuv3QtrXCsPKY5Sfz0TPQTZEZHt8vqXPg oCZgf<˜füLšf,–fzyCwxSXR1twCaR+LEtB9WM0AFImrGCeVoy29shkrdUA9qiB0yR9yRnRlKYZQdXm6oBS OknYJ0nUIORXP+bTqZTeIT6DTEYPrNuJXmwvUGKMasg24/af7FtpEmRIE9AhjjUUWMVQuu94o6lE DXsBpYpswZC44g2QY8Zfh5c38OpKoCPKSfua2ukhYawmoD9RCqE34usuFg4hQ+X1Qq/SN2RZuocf rTTa8YuEseIgPxWBL6Ve+t45dCMmBkZE3+2grx0YFzB3M7Oa8PkngQfkVW5ldd1wp7kyCB0E/4Et +yUvUXq+b/qzOd6EJDENXanAaQ1u6o4KFL3j1DniGnOrX0C6DUoEgQhNKu++O+1prTjexXA7BgKS 0esOEm/UU2Xq1tcfcIyw6BnoKOwn81T+quaBTz5Bh2smEZ4SBAsNO8+MdEgdNPAV0KeRiDYOF/jv FVhf1bBn6dVjZwdB8y7ANaZ8EhaFZw1mb7vxqZx903gi9K4x2Lšfü\œf<˜fzvpLBI9wxWRfVU6iF6uZSG0 Fw4BbLFdIRs4lBASoMlIQUPYYpmMxr0NuP4YAVpCmlyEBjHCdOqvyacsQHM3fqJ10yVgDHc3VYDG jiU9CxrIkQhrjuIkgpXZhAA1QTxM3gOHQJwg1mE2C+JKGbHXYUEhomWp4JZvPHde3Gc0rwU9afsR BX00e1aFZQQ94DhqwQNZFfQ4J+PkGMVlXBfZSIJeWNsB9GoHQKLwFd3Uk3xFuo0of16dh5Gvoo/G V4kIz3lPxs6vWAIl3huEehuRbrDjBbYly0FeV6B9rHCmUj7ORfwkA7f+OF6oG/vM406ZwowSg78O 0mV1ZGfMP4BIi35mkc2EQsxMYGn/nGqeOnANyMwMgc3ITWfODflNRgEkvDuGdxvEDqEJP/w2CKCT UkX4m94qJDPRAUGNSa5ZP/ecVLDwbtTQ8NhDtA1cedtAxzl1IMYg3UljdfygGutHf/XN3sBfYcQV 8QoqhwUI7bMgFh2\œfülžfLšfR9sWUVn0kgawIj3gEIPgjiPh8wniXFhUNUL4dhmcyw3Nbgq9wiLnvCvwJ iLsrQQyV8s6MdAZNCsGf3lNrZOZfHQj/qlYK8btAv4bov86lD9FvHvrmoW+eoYyubp2h11f8fzUD 2MoauoctZdWlN6vqCYMTTD2gq+25aRoCvkA2SelDPeGXkd55iL1T/bsVEE9jsCCIQVwTpuIOOKDr Uz/O09pDzUNK7qi3fmyPQH9DNljaVOYIG/IL0Cbf/quKzZSlO4N0CD0DH7p06tNQ45zNQoDOmMSw MtSNqb7qlkRRqo5fqRvd60bQDjR1yFmCHgxWtQRebFyg3nyyLFx0DtAvJhG5Wp/PrXQSeQtE3oL4 rUezm5iYopfOJUbzk+me/gXk/5QyQfr/okXvX+00ULJQMgbdh5JXW9VE4MS6qgzcWVkECulU/63L 0EG7IHCzAD/uAuiNG3SRwrj9S3vt2+cbnMPRFUKOUuGMDjB+txKgCH+cD9Blžfü| f\œf/wrYw3DezKyhk lZAbEND5axhLRTCiQSK2greKpZ0YwwB48WsKKxAEuQBBdzUTAvrV4jOFflJ8v0yLsaF9PG+0+J4H Iqapj9NOsWyn3KIkLHIgQfHA0G7nudg1xAQGwmJgFeqpHUHfTK3iBlm3rAjC8l6XH34BCtCe9xcB hOFdEKotNeCAUM2Mz6A1wMiskHavZrZuC8lc2l4XENXpS0YwQPdt9YJvOhvqewc/dAFdjYCJAYSx IAc1RxWKxR+vajFhQBgXBnoYQj8MSgGEIQxAoBtLhgEhhqooY04IccU0WARjkWgFngwMG1SiYhwV vsDD/u2o8WpOe9Q83qnwV/VFUVNSAyZAEJzIqboI50MsAvVM1CCaeJ8cNXZ48dYUI+my9qBbSuOL MIKrWBEQg1uyB98Hi5eRdi8OSuqP8CBkMqEHdvUkHUnTVBjr6xCgI5dKoEDeZ+dwu/G0ajB9KRfZ XAFC8zbFZ/aHUEWiEDAfU4f/Q| füŒ¢flžf/ouEqvpbOdWBCHx4HVj3YZM9/I/WsaRCNhyQqtgXj1ohJC3 h5flcpkkXAgBdPy0BACwsz7Z+dGnY9BlbQCugKxesaEofKPUtYggFLHK0XjC/9bzPppNQBjJqzb9 9yTYPHFcIohrYXC6mXN+hUgSJeKALvv8uKZQQ2ILBnTmEDYKF/e4ENwkcweHpXzAKR9Q/KsBh/kj aqZJ/yrGE8f8o/eqLXKv9KbXkXzpmGLEL3oTUCI3oSZtouh8LEtEU1iiQtwFyF9NDIW5V85LoU9g FL2B+0ZWyZmDti2JCjGfn0IbsGpBQebt6AUyjFUzinocXg/qGrvENJlPG9TbbW4U8KkNNQv+1S1h EMJXGxR0YZQPwStAC65aGLQZoSbg5iIbFv5mJIOmlv/0VDrlgeLZMj590WbQ8NnASxa7oLMH4N4H FIWuP+bJH/f0CTobcsPW+hkaKMiS8j90Pu7Xuw578AsIiFHgY+u9c3s0CrXzNU8Cloz47Œ¢fü