diff --git a/Demo/cwilib/cwilib.py b/Demo/cwilib/cwilib.py
index ebe468a..2b19637 100755
--- a/Demo/cwilib/cwilib.py
+++ b/Demo/cwilib/cwilib.py
@@ -18,22 +18,22 @@
     tn = telnetlib.Telnet(host, 0)
     #
     try:
-	vt.send(tn.read_until('login: ', 10))
-	tn.write('cwilib\r')
-	#
-	vt.send(tn.read_until('Hit <RETURN> to continue...', 10))
-	tn.write('\r')
-	#
-	vt.send(tn.read_until('QUIT', 20))
+        vt.send(tn.read_until('login: ', 10))
+        tn.write('cwilib\r')
+        #
+        vt.send(tn.read_until('Hit <RETURN> to continue...', 10))
+        tn.write('\r')
+        #
+        vt.send(tn.read_until('QUIT', 20))
     except EOFError:
-	sys.stderr.write('Connection closed prematurely\n')
-	sys.exit(1)
+        sys.stderr.write('Connection closed prematurely\n')
+        sys.exit(1)
     #
     define_screens(vt)
     matches = vt.which_screens()
     if 'menu' not in matches:
-	sys.stderr.write('Main menu does not appear\n')
-	sys.exit(1)
+        sys.stderr.write('Main menu does not appear\n')
+        sys.exit(1)
     #
     tn.write('\r\r')
     vt.open('Progress -- CWI Library')
@@ -41,109 +41,109 @@
     ui = UserInterface()
     #
     while 1:
-	try:
-	    data = tn.read_very_eager()
-	except EOFError:
-	    stdwin.message('Connection closed--goodbye')
-	    break
-	if data:
-	    print 'send...'
-	    vt.send(data)
-	    print 'send...done'
-	    continue
-	event = stdwin.pollevent()
-	if event:
-	    type, window, detail = event
-	    if window == None and type == WE_LOST_SEL:
-		window = ui.queryform.window
-		event = type, window, detail
-	    if type == WE_CLOSE:
-		break
-	    if window in ui.windows:
-		ui.dispatch(type, window, detail)
-	    elif window == vt.window:
-		if type == WE_NULL:
-		    pass
-		elif type == WE_COMMAND:
-		    if detail == WC_RETURN:
-			tn.write('\r')
-		    elif detail == WC_BACKSPACE:
-			tn.write('\b')
-		    elif detail == WC_TAB:
-			tn.write('\t')
-		    elif detail == WC_UP:
-			tn.write('\033[A')
-		    elif detail == WC_DOWN:
-			tn.write('\033[B')
-		    elif detail == WC_RIGHT:
-			tn.write('\033[C')
-		    elif detail == WC_LEFT:
-			tn.write('\033[D')
-		    else:
-			print '*** Command:', detail
-		elif type == WE_CHAR:
-		    tn.write(detail)
-		elif type == WE_DRAW:
-		    vt.draw(detail)
-		elif type in (WE_ACTIVATE, WE_DEACTIVATE):
-		    pass
-		else:
-		    print '*** VT100 event:', type, detail
-	    else:
-		print '*** Alien event:', type, window, detail
-	    continue
-	rfd, wfd, xfd = select.select([tn, stdwin], [], [])
+        try:
+            data = tn.read_very_eager()
+        except EOFError:
+            stdwin.message('Connection closed--goodbye')
+            break
+        if data:
+            print 'send...'
+            vt.send(data)
+            print 'send...done'
+            continue
+        event = stdwin.pollevent()
+        if event:
+            type, window, detail = event
+            if window == None and type == WE_LOST_SEL:
+                window = ui.queryform.window
+                event = type, window, detail
+            if type == WE_CLOSE:
+                break
+            if window in ui.windows:
+                ui.dispatch(type, window, detail)
+            elif window == vt.window:
+                if type == WE_NULL:
+                    pass
+                elif type == WE_COMMAND:
+                    if detail == WC_RETURN:
+                        tn.write('\r')
+                    elif detail == WC_BACKSPACE:
+                        tn.write('\b')
+                    elif detail == WC_TAB:
+                        tn.write('\t')
+                    elif detail == WC_UP:
+                        tn.write('\033[A')
+                    elif detail == WC_DOWN:
+                        tn.write('\033[B')
+                    elif detail == WC_RIGHT:
+                        tn.write('\033[C')
+                    elif detail == WC_LEFT:
+                        tn.write('\033[D')
+                    else:
+                        print '*** Command:', detail
+                elif type == WE_CHAR:
+                    tn.write(detail)
+                elif type == WE_DRAW:
+                    vt.draw(detail)
+                elif type in (WE_ACTIVATE, WE_DEACTIVATE):
+                    pass
+                else:
+                    print '*** VT100 event:', type, detail
+            else:
+                print '*** Alien event:', type, window, detail
+            continue
+        rfd, wfd, xfd = select.select([tn, stdwin], [], [])
 
 
 # Subroutine to define our screen recognition patterns
 
 def define_screens(vt):
     vt.define_screen('menu', {
-	      'title': ('search', 0, 0, 80,
-			' SEARCH FUNCTIONS  +OTHER FUNCTIONS '),
-	      })
+              'title': ('search', 0, 0, 80,
+                        ' SEARCH FUNCTIONS  +OTHER FUNCTIONS '),
+              })
     vt.define_screen('search', {
-	      'title': ('search', 0, 0, 80, ' Search '),
-	      })
+              'title': ('search', 0, 0, 80, ' Search '),
+              })
     vt.define_screen('shortlist', {'title': ('search', 0, 0, 80,
-	      ' Short-list')})
+              ' Short-list')})
     vt.define_screen('showrecord', {
-	      'title': ('search', 0, 0, 80, ' Show record '),
-	      })
+              'title': ('search', 0, 0, 80, ' Show record '),
+              })
     vt.define_screen('timelimit', {
-	      'limit': ('search', 12, 0, 80, ' TIME LIMIT '),
-	      })
+              'limit': ('search', 12, 0, 80, ' TIME LIMIT '),
+              })
     vt.define_screen('attention', {
-	      'BASE': ('copy', 0, 0, 0, 'search'),
-	      'title': ('search', 10, 0, 80, ' ATTENTION ')})
+              'BASE': ('copy', 0, 0, 0, 'search'),
+              'title': ('search', 10, 0, 80, ' ATTENTION ')})
     vt.define_screen('syntaxerror', {
-	      'BASE': ('copy', 0, 0, 0, 'attention'),
-	      'message': ('search', 12, 0, 80, ' Syntax error'),
-	      })
+              'BASE': ('copy', 0, 0, 0, 'attention'),
+              'message': ('search', 12, 0, 80, ' Syntax error'),
+              })
     vt.define_screen('emptyerror', {
-	      'BASE': ('copy', 0, 0, 0, 'attention'),
-	      'message': ('search', 12, 0, 80,
-			  ' Check your input. Search at least one term'),
-	      })
+              'BASE': ('copy', 0, 0, 0, 'attention'),
+              'message': ('search', 12, 0, 80,
+                          ' Check your input. Search at least one term'),
+              })
     vt.define_screen('unsortedwarning', {
-	      'BASE': ('copy', 0, 0, 0, 'attention'),
-	      'message': ('search', 12, 0, 80,
-			  ' Number of records exceeds sort limit'),
-	      })
+              'BASE': ('copy', 0, 0, 0, 'attention'),
+              'message': ('search', 12, 0, 80,
+                          ' Number of records exceeds sort limit'),
+              })
     vt.define_screen('thereismore', {
-	      'BASE': ('copy', 0, 0, 0, 'showrecord'),
-	      'message': ('search', 15, 0, 80,
-		 'There is more within this record. Use the arrow keys'),
-	      })
+              'BASE': ('copy', 0, 0, 0, 'showrecord'),
+              'message': ('search', 15, 0, 80,
+                 'There is more within this record. Use the arrow keys'),
+              })
     vt.define_screen('nofurther', {
-	      'BASE': ('copy', 0, 0, 0, 'showrecord'),
-	      'message': ('search', 17, 0, 80, 'You cannot go further\.'),
-	      })
+              'BASE': ('copy', 0, 0, 0, 'showrecord'),
+              'message': ('search', 17, 0, 80, 'You cannot go further\.'),
+              })
     vt.define_screen('nofurtherback', {
-	      'BASE': ('copy', 0, 0, 0, 'showrecord'),
-	      'message': ('search', 17, 0, 80,
-			  'You cannot go further back'),
-	      })
+              'BASE': ('copy', 0, 0, 0, 'showrecord'),
+              'message': ('search', 17, 0, 80,
+                          'You cannot go further back'),
+              })
 
 
 # Class to implement our user interface.
@@ -151,29 +151,29 @@
 class UserInterface:
 
     def __init__(self):
-	stdwin.setfont('7x14')
-	self.queryform = QueryForm()
-	self.listform = ListForm()
-	self.recordform = RecordForm()
-	self.forms = [self.queryform, self.listform, self.recordform]
-	define_query_fields(self.queryform)
-	self.windows = []
-	for form in self.forms:
-	    if form.formheight > 0:
-		form.open()
-		self.windows.append(form.window)
+        stdwin.setfont('7x14')
+        self.queryform = QueryForm()
+        self.listform = ListForm()
+        self.recordform = RecordForm()
+        self.forms = [self.queryform, self.listform, self.recordform]
+        define_query_fields(self.queryform)
+        self.windows = []
+        for form in self.forms:
+            if form.formheight > 0:
+                form.open()
+                self.windows.append(form.window)
 
     def __del__(self):
-	self.close()
+        self.close()
 
     def close(self):
-	for form in self.forms:
-	    form.close()
+        for form in self.forms:
+            form.close()
 
     def dispatch(self, type, window, detail):
-	for form in self.forms:
-	    if window == form.window:
-		form.dispatch(type, detail)
+        for form in self.forms:
+            if window == form.window:
+                form.dispatch(type, detail)
 
 
 def define_query_fields(f):
@@ -189,25 +189,25 @@
 class QueryForm(Form):
 
     def __init__(self):
-	Form.__init__(self, 'Query form -- CWI Library')
+        Form.__init__(self, 'Query form -- CWI Library')
 
     def dispatch(self, type, detail):
-	if type == WE_COMMAND and detail == WC_RETURN:
-	    print '*** SUBMIT ***'
-	else:
-	    Form.dispatch(self, type, detail)
+        if type == WE_COMMAND and detail == WC_RETURN:
+            print '*** SUBMIT ***'
+        else:
+            Form.dispatch(self, type, detail)
 
 
 class ListForm(Form):
 
     def __init__(self):
-	Form.__init__(self, 'Short list -- CWI Library')
+        Form.__init__(self, 'Short list -- CWI Library')
 
 
 class RecordForm(Form):
 
     def __init__(self):
-	Form.__init__(self, 'Record detail -- CWI Library')
+        Form.__init__(self, 'Record detail -- CWI Library')
 
 
 main()
diff --git a/Demo/dns/asgethost.py b/Demo/dns/asgethost.py
index 9a90268..2e9185a 100755
--- a/Demo/dns/asgethost.py
+++ b/Demo/dns/asgethost.py
@@ -7,7 +7,7 @@
 import select
 
 def main():
-    server = 'cnri.reston.va.us'	# How?
+    server = 'cnri.reston.va.us'        # How?
     port = 53
     opcode = dnsopcode.QUERY
     rd = 0
@@ -15,21 +15,21 @@
     qname = sys.argv[1:] and sys.argv[1] or 'www.python.org'
     m = dnslib.Mpacker()
     m.addHeader(0,
-		0, opcode, 0, 0, rd, 0, 0, 0,
-		1, 0, 0, 0)
+                0, opcode, 0, 0, rd, 0, 0, 0,
+                1, 0, 0, 0)
     m.addQuestion(qname, qtype, dnsclass.IN)
     request = m.getbuf()
     s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
     s.connect((server, port))
     s.send(request)
     while 1:
-	r, w, x = [s], [], []
-	r, w, x = select.select(r, w, x, 0.333)
-	print r, w, x
-	if r:
-	    reply = s.recv(1024)
-	    u = dnslib.Munpacker(reply)
-	    dnslib.dumpM(u)
-	    break
+        r, w, x = [s], [], []
+        r, w, x = select.select(r, w, x, 0.333)
+        print r, w, x
+        if r:
+            reply = s.recv(1024)
+            u = dnslib.Munpacker(reply)
+            dnslib.dumpM(u)
+            break
 
 main()
diff --git a/Demo/metaclasses/Eiffel.py b/Demo/metaclasses/Eiffel.py
index 38ee6bc..d9c8a9a 100644
--- a/Demo/metaclasses/Eiffel.py
+++ b/Demo/metaclasses/Eiffel.py
@@ -4,19 +4,19 @@
 
 class C:
     def m1(self, arg):
-	require arg > 0
-	return whatever
+        require arg > 0
+        return whatever
         ensure Result > arg
 
 can be written (clumsily, I agree) as:
 
 class C(Eiffel):
     def m1(self, arg):
-	return whatever
+        return whatever
     def m1_pre(self, arg):
-	assert arg > 0
+        assert arg > 0
     def m1_post(self, Result, arg):
-	assert Result > arg
+        assert Result > arg
 
 Pre- and post-conditions for a method, being implemented as methods
 themselves, are inherited independently from the method.  This gives
@@ -28,10 +28,10 @@
 
 class D(C):
     def m1(self, arg):
-	return whatever**2
+        return whatever**2
     def m1_post(self, Result, arg):
-	C.m1_post(self, Result, arg)
-	assert Result < 100
+        C.m1_post(self, Result, arg)
+        assert Result < 100
 
 This gives derived classes more freedom but also more responsibility
 than in Eiffel, where the compiler automatically takes care of this.
@@ -42,13 +42,13 @@
 the requirement that arg > 0 could write:
 
     def m1_pre(self, arg):
-	pass
+        pass
 
 but one could equally write a derived class that makes a stronger
 requirement:
 
     def m1_pre(self, arg):
-	require arg > 50
+        require arg > 50
 
 It would be easy to modify the classes shown here so that pre- and
 post-conditions can be disabled (separately, on a per-class basis).
@@ -66,27 +66,27 @@
 class EiffelMethodWrapper(MetaMethodWrapper):
 
     def __init__(self, func, inst):
-	MetaMethodWrapper.__init__(self, func, inst)
-	# Note that the following causes recursive wrappers around
-	# the pre-/post-condition testing methods.  These are harmless
-	# but inefficient; to avoid them, the lookup must be done
-	# using the class.
-	try:
-	    self.pre = getattr(inst, self.__name__ + "_pre")
-	except AttributeError:
-	    self.pre = None
-	try:
-	    self.post = getattr(inst, self.__name__ + "_post")
-	except AttributeError:
-	    self.post = None
+        MetaMethodWrapper.__init__(self, func, inst)
+        # Note that the following causes recursive wrappers around
+        # the pre-/post-condition testing methods.  These are harmless
+        # but inefficient; to avoid them, the lookup must be done
+        # using the class.
+        try:
+            self.pre = getattr(inst, self.__name__ + "_pre")
+        except AttributeError:
+            self.pre = None
+        try:
+            self.post = getattr(inst, self.__name__ + "_post")
+        except AttributeError:
+            self.post = None
 
     def __call__(self, *args, **kw):
-	if self.pre:
-	    apply(self.pre, args, kw)
-	Result = apply(self.func, (self.inst,) + args, kw)
-	if self.post:
-	    apply(self.post, (Result,) + args, kw)
-	return Result
+        if self.pre:
+            apply(self.pre, args, kw)
+        Result = apply(self.func, (self.inst,) + args, kw)
+        if self.post:
+            apply(self.post, (Result,) + args, kw)
+        return Result
     
 class EiffelHelper(MetaHelper):
     __methodwrapper__ = EiffelMethodWrapper
@@ -99,12 +99,12 @@
 
 def _test():
     class C(Eiffel):
-	def m1(self, arg):
-	    return arg+1
-	def m1_pre(self, arg):
-	    assert arg > 0, "precondition for m1 failed"
-	def m1_post(self, Result, arg):
-	    assert Result > arg
+        def m1(self, arg):
+            return arg+1
+        def m1_pre(self, arg):
+            assert arg > 0, "precondition for m1 failed"
+        def m1_post(self, Result, arg):
+            assert Result > arg
     x = C()
     x.m1(12)
 ##    x.m1(-1)
diff --git a/Demo/metaclasses/Enum.py b/Demo/metaclasses/Enum.py
index e1ae695..13a3ed7 100644
--- a/Demo/metaclasses/Enum.py
+++ b/Demo/metaclasses/Enum.py
@@ -12,9 +12,9 @@
     To define your own enumeration, do something like
 
     class Color(Enum):
-	red = 1
-	green = 2
-	blue = 3
+        red = 1
+        green = 2
+        blue = 3
 
     Now, Color.red, Color.green and Color.blue behave totally
     different: they are enumerated values, not integers.
@@ -25,66 +25,66 @@
     """
 
     def __init__(self, name, bases, dict):
-	"""Constructor -- create an enumeration.
+        """Constructor -- create an enumeration.
 
-	Called at the end of the class statement.  The arguments are
-	the name of the new class, a tuple containing the base
-	classes, and a dictionary containing everything that was
-	entered in the class' namespace during execution of the class
-	statement.  In the above example, it would be {'red': 1,
-	'green': 2, 'blue': 3}.
+        Called at the end of the class statement.  The arguments are
+        the name of the new class, a tuple containing the base
+        classes, and a dictionary containing everything that was
+        entered in the class' namespace during execution of the class
+        statement.  In the above example, it would be {'red': 1,
+        'green': 2, 'blue': 3}.
 
-	"""
-	for base in bases:
-	    if base.__class__ is not EnumMetaClass:
-		raise TypeError, "Enumeration base class must be enumeration"
-	bases = filter(lambda x: x is not Enum, bases)
-	self.__name__ = name
-	self.__bases__ = bases
-	self.__dict = {}
-	for key, value in dict.items():
-	    self.__dict[key] = EnumInstance(name, key, value)
+        """
+        for base in bases:
+            if base.__class__ is not EnumMetaClass:
+                raise TypeError, "Enumeration base class must be enumeration"
+        bases = filter(lambda x: x is not Enum, bases)
+        self.__name__ = name
+        self.__bases__ = bases
+        self.__dict = {}
+        for key, value in dict.items():
+            self.__dict[key] = EnumInstance(name, key, value)
 
     def __getattr__(self, name):
-	"""Return an enumeration value.
+        """Return an enumeration value.
 
-	For example, Color.red returns the value corresponding to red.
+        For example, Color.red returns the value corresponding to red.
 
-	XXX Perhaps the values should be created in the constructor?
+        XXX Perhaps the values should be created in the constructor?
 
-	This looks in the class dictionary and if it is not found
-	there asks the base classes.
+        This looks in the class dictionary and if it is not found
+        there asks the base classes.
 
-	The special attribute __members__ returns the list of names
-	defined in this class (it does not merge in the names defined
-	in base classes).
+        The special attribute __members__ returns the list of names
+        defined in this class (it does not merge in the names defined
+        in base classes).
 
-	"""
-	if name == '__members__':
-	    return self.__dict.keys()
+        """
+        if name == '__members__':
+            return self.__dict.keys()
 
-	try:
-	    return self.__dict[name]
-	except KeyError:
-	    for base in self.__bases__:
-		try:
-		    return getattr(base, name)
-		except AttributeError:
-		    continue
+        try:
+            return self.__dict[name]
+        except KeyError:
+            for base in self.__bases__:
+                try:
+                    return getattr(base, name)
+                except AttributeError:
+                    continue
 
-	raise AttributeError, name
+        raise AttributeError, name
 
     def __repr__(self):
-	s = self.__name__
-	if self.__bases__:
-	    s = s + '(' + string.join(map(lambda x: x.__name__,
-					  self.__bases__), ", ") + ')'
-	if self.__dict:
-	    list = []
-	    for key, value in self.__dict.items():
-		list.append("%s: %s" % (key, int(value)))
-	    s = "%s: {%s}" % (s, string.join(list, ", "))
-	return s
+        s = self.__name__
+        if self.__bases__:
+            s = s + '(' + string.join(map(lambda x: x.__name__,
+                                          self.__bases__), ", ") + ')'
+        if self.__dict:
+            list = []
+            for key, value in self.__dict.items():
+                list.append("%s: %s" % (key, int(value)))
+            s = "%s: {%s}" % (s, string.join(list, ", "))
+        return s
 
 
 class EnumInstance:
@@ -99,23 +99,23 @@
     """
 
     def __init__(self, classname, enumname, value):
-	self.__classname = classname
-	self.__enumname = enumname
-	self.__value = value
+        self.__classname = classname
+        self.__enumname = enumname
+        self.__value = value
 
     def __int__(self):
-	return self.__value
+        return self.__value
 
     def __repr__(self):
-	return "EnumInstance(%s, %s, %s)" % (`self.__classname`,
-					     `self.__enumname`,
-					     `self.__value`)
+        return "EnumInstance(%s, %s, %s)" % (`self.__classname`,
+                                             `self.__enumname`,
+                                             `self.__value`)
 
     def __str__(self):
-	return "%s.%s" % (self.__classname, self.__enumname)
+        return "%s.%s" % (self.__classname, self.__enumname)
 
     def __cmp__(self, other):
-	return cmp(self.__value, int(other))
+        return cmp(self.__value, int(other))
 
 
 # Create the base class for enumerations.
@@ -126,9 +126,9 @@
 def _test():
 
     class Color(Enum):
-	red = 1
-	green = 2
-	blue = 3
+        red = 1
+        green = 2
+        blue = 3
 
     print Color.red
     print dir(Color)
@@ -139,11 +139,11 @@
     print Color.red == 2
 
     class ExtendedColor(Color):
-	white = 0
-	orange = 4
-	yellow = 5
-	purple = 6
-	black = 7
+        white = 0
+        orange = 4
+        yellow = 5
+        purple = 6
+        black = 7
 
     print ExtendedColor.orange
     print ExtendedColor.red
@@ -151,11 +151,11 @@
     print Color.red == ExtendedColor.red
 
     class OtherColor(Enum):
-	white = 4
-	blue = 5
+        white = 4
+        blue = 5
 
     class MergedColor(Color, OtherColor):
-	pass
+        pass
 
     print MergedColor.red
     print MergedColor.white
diff --git a/Demo/metaclasses/Meta.py b/Demo/metaclasses/Meta.py
index 76193c1..771205c 100644
--- a/Demo/metaclasses/Meta.py
+++ b/Demo/metaclasses/Meta.py
@@ -9,33 +9,33 @@
 class MetaMethodWrapper:
 
     def __init__(self, func, inst):
-	self.func = func
-	self.inst = inst
-	self.__name__ = self.func.__name__
+        self.func = func
+        self.inst = inst
+        self.__name__ = self.func.__name__
 
     def __call__(self, *args, **kw):
-	return apply(self.func, (self.inst,) + args, kw)
+        return apply(self.func, (self.inst,) + args, kw)
 
 class MetaHelper:
 
     __methodwrapper__ = MetaMethodWrapper # For derived helpers to override
 
     def __helperinit__(self, formalclass):
-	self.__formalclass__ = formalclass
+        self.__formalclass__ = formalclass
 
     def __getattr__(self, name):
-	# Invoked for any attr not in the instance's __dict__
-	try:
-	    raw = self.__formalclass__.__getattr__(name)
-	except AttributeError:
-	    try:
-		ga = self.__formalclass__.__getattr__('__usergetattr__')
-	    except KeyError:
-		raise AttributeError, name
-	    return ga(self, name)
-	if type(raw) != types.FunctionType:
-	    return raw
-	return self.__methodwrapper__(raw, self)
+        # Invoked for any attr not in the instance's __dict__
+        try:
+            raw = self.__formalclass__.__getattr__(name)
+        except AttributeError:
+            try:
+                ga = self.__formalclass__.__getattr__('__usergetattr__')
+            except KeyError:
+                raise AttributeError, name
+            return ga(self, name)
+        if type(raw) != types.FunctionType:
+            return raw
+        return self.__methodwrapper__(raw, self)
 
 class MetaClass:
 
@@ -45,49 +45,49 @@
 
     """
 
-    __helper__ = MetaHelper		# For derived metaclasses to override
+    __helper__ = MetaHelper             # For derived metaclasses to override
 
     __inited = 0
 
     def __init__(self, name, bases, dict):
-	try:
-	    ga = dict['__getattr__']
-	except KeyError:
-	    pass
-	else:
-	    dict['__usergetattr__'] = ga
-	    del dict['__getattr__']
-	self.__name__ = name
-	self.__bases__ = bases
-	self.__realdict__ = dict
-	self.__inited = 1
+        try:
+            ga = dict['__getattr__']
+        except KeyError:
+            pass
+        else:
+            dict['__usergetattr__'] = ga
+            del dict['__getattr__']
+        self.__name__ = name
+        self.__bases__ = bases
+        self.__realdict__ = dict
+        self.__inited = 1
 
     def __getattr__(self, name):
-	try:
-	    return self.__realdict__[name]
-	except KeyError:
-	    for base in self.__bases__:
-		try:
-		    return base.__getattr__(name)
-		except AttributeError:
-		    pass
-	    raise AttributeError, name
+        try:
+            return self.__realdict__[name]
+        except KeyError:
+            for base in self.__bases__:
+                try:
+                    return base.__getattr__(name)
+                except AttributeError:
+                    pass
+            raise AttributeError, name
 
     def __setattr__(self, name, value):
-	if not self.__inited:
-	    self.__dict__[name] = value
-	else:
-	    self.__realdict__[name] = value
+        if not self.__inited:
+            self.__dict__[name] = value
+        else:
+            self.__realdict__[name] = value
 
     def __call__(self, *args, **kw):
-	inst = self.__helper__()
-	inst.__helperinit__(self)
-	try:
-	    init = inst.__getattr__('__init__')
-	except AttributeError:
-	    init = lambda: None
-	apply(init, args, kw)
-	return inst
+        inst = self.__helper__()
+        inst.__helperinit__(self)
+        try:
+            init = inst.__getattr__('__init__')
+        except AttributeError:
+            init = lambda: None
+        apply(init, args, kw)
+        return inst
     
 
 Meta = MetaClass('Meta', (), {})
@@ -95,18 +95,18 @@
 
 def _test():
     class C(Meta):
-	def __init__(self, *args):
-	    print "__init__, args =", args
-	def m1(self, x):
-	    print "m1(x=%s)" %`x`
+        def __init__(self, *args):
+            print "__init__, args =", args
+        def m1(self, x):
+            print "m1(x=%s)" %`x`
     print C
     x = C()
     print x
     x.m1(12)
     class D(C):
-	def __getattr__(self, name):
-	    if name[:2] == '__': raise AttributeError, name
-	    return "getattr:%s" % name
+        def __getattr__(self, name):
+            if name[:2] == '__': raise AttributeError, name
+            return "getattr:%s" % name
     x = D()
     print x.foo
     print x._foo
diff --git a/Demo/metaclasses/Synch.py b/Demo/metaclasses/Synch.py
index 1fb9160..df70337 100644
--- a/Demo/metaclasses/Synch.py
+++ b/Demo/metaclasses/Synch.py
@@ -40,64 +40,64 @@
     """
 
     def __init__(self):
-	"""Constructor.  Initialize all instance variables."""
-	self.__mutex = thread.allocate_lock()
-	self.__wait = thread.allocate_lock()
-	self.__tid = None
-	self.__count = 0
+        """Constructor.  Initialize all instance variables."""
+        self.__mutex = thread.allocate_lock()
+        self.__wait = thread.allocate_lock()
+        self.__tid = None
+        self.__count = 0
 
     def acquire(self, flag=1):
-	"""Acquire the lock.
+        """Acquire the lock.
 
-	If the optional flag argument is false, returns immediately
-	when it cannot acquire the __wait lock without blocking (it
-	may still block for a little while in order to acquire the
-	__mutex lock).
+        If the optional flag argument is false, returns immediately
+        when it cannot acquire the __wait lock without blocking (it
+        may still block for a little while in order to acquire the
+        __mutex lock).
 
-	The return value is only relevant when the flag argument is
-	false; it is 1 if the lock is acquired, 0 if not.
+        The return value is only relevant when the flag argument is
+        false; it is 1 if the lock is acquired, 0 if not.
 
-	"""
-	self.__mutex.acquire()
-	try:
-	    if self.__tid == thread.get_ident():
-		self.__count = self.__count + 1
-		return 1
-	finally:
-	    self.__mutex.release()
-	locked = self.__wait.acquire(flag)
-	if not flag and not locked:
-	    return 0
-	try:
-	    self.__mutex.acquire()
-	    assert self.__tid == None
-	    assert self.__count == 0
-	    self.__tid = thread.get_ident()
-	    self.__count = 1
-	    return 1
-	finally:
-	    self.__mutex.release()
+        """
+        self.__mutex.acquire()
+        try:
+            if self.__tid == thread.get_ident():
+                self.__count = self.__count + 1
+                return 1
+        finally:
+            self.__mutex.release()
+        locked = self.__wait.acquire(flag)
+        if not flag and not locked:
+            return 0
+        try:
+            self.__mutex.acquire()
+            assert self.__tid == None
+            assert self.__count == 0
+            self.__tid = thread.get_ident()
+            self.__count = 1
+            return 1
+        finally:
+            self.__mutex.release()
 
     def release(self):
-	"""Release the lock.
+        """Release the lock.
 
-	If this thread doesn't currently have the lock, an assertion
-	error is raised.
+        If this thread doesn't currently have the lock, an assertion
+        error is raised.
 
-	Only allow another thread to acquire the lock when the count
-	reaches zero after decrementing it.
+        Only allow another thread to acquire the lock when the count
+        reaches zero after decrementing it.
 
-	"""
-	self.__mutex.acquire()
-	try:
-	    assert self.__tid == thread.get_ident()
-	    assert self.__count > 0
-	    self.__count = self.__count - 1
-	    if self.__count == 0:
-		self.__tid = None
-		self.__wait.release()
-	finally:
-	    self.__mutex.release()
+        """
+        self.__mutex.acquire()
+        try:
+            assert self.__tid == thread.get_ident()
+            assert self.__count > 0
+            self.__count = self.__count - 1
+            if self.__count == 0:
+                self.__tid = None
+                self.__wait.release()
+        finally:
+            self.__mutex.release()
 
 
 def _testLock():
@@ -105,23 +105,23 @@
     done = []
 
     def f2(lock, done=done):
-	lock.acquire()
-	print "f2 running in thread %d\n" % thread.get_ident(),
-	lock.release()
-	done.append(1)
+        lock.acquire()
+        print "f2 running in thread %d\n" % thread.get_ident(),
+        lock.release()
+        done.append(1)
 
     def f1(lock, f2=f2, done=done):
-	lock.acquire()
-	print "f1 running in thread %d\n" % thread.get_ident(),
-	try:
-	    f2(lock)
-	finally:
-	    lock.release()
-	done.append(1)
+        lock.acquire()
+        print "f1 running in thread %d\n" % thread.get_ident(),
+        try:
+            f2(lock)
+        finally:
+            lock.release()
+        done.append(1)
 
     lock = Lock()
     lock.acquire()
-    f1(lock)				# Adds 2 to done
+    f1(lock)                            # Adds 2 to done
     lock.release()
 
     lock.acquire()
@@ -134,8 +134,8 @@
     lock.release()
     import time
     while len(done) < 9:
-	print len(done)
-	time.sleep(0.001)
+        print len(done)
+        time.sleep(0.001)
     print len(done)
 
 
@@ -147,19 +147,19 @@
 
 class LockingMethodWrapper(MetaMethodWrapper):
     def __call__(self, *args, **kw):
-	if self.__name__[:1] == '_' and self.__name__[1:] != '_':
-	    return apply(self.func, (self.inst,) + args, kw)
-	self.inst.__lock__.acquire()
-	try:
-	    return apply(self.func, (self.inst,) + args, kw)
-	finally:
-	    self.inst.__lock__.release()
+        if self.__name__[:1] == '_' and self.__name__[1:] != '_':
+            return apply(self.func, (self.inst,) + args, kw)
+        self.inst.__lock__.acquire()
+        try:
+            return apply(self.func, (self.inst,) + args, kw)
+        finally:
+            self.inst.__lock__.release()
 
 class LockingHelper(MetaHelper):
     __methodwrapper__ = LockingMethodWrapper
     def __helperinit__(self, formalclass):
-	MetaHelper.__helperinit__(self, formalclass)
-	self.__lock__ = Lock()
+        MetaHelper.__helperinit__(self, formalclass)
+        self.__lock__ = Lock()
 
 class LockingMetaClass(MetaClass):
     __helper__ = LockingHelper
@@ -169,73 +169,73 @@
 def _test():
     # For kicks, take away the Locking base class and see it die
     class Buffer(Locking):
-	def __init__(self, initialsize):
-	    assert initialsize > 0
-	    self.size = initialsize
-	    self.buffer = [None]*self.size
-	    self.first = self.last = 0
-	def put(self, item):
-	    # Do we need to grow the buffer?
-	    if (self.last+1) % self.size != self.first:
-		# Insert the new item
-		self.buffer[self.last] = item
-		self.last = (self.last+1) % self.size
-		return
-	    # Double the buffer size
-	    # First normalize it so that first==0 and last==size-1
-	    print "buffer =", self.buffer
-	    print "first = %d, last = %d, size = %d" % (
-		self.first, self.last, self.size)
-	    if self.first <= self.last:
-		temp = self.buffer[self.first:self.last]
-	    else:
-		temp = self.buffer[self.first:] + self.buffer[:self.last]
-	    print "temp =", temp
-	    self.buffer = temp + [None]*(self.size+1)
-	    self.first = 0
-	    self.last = self.size-1
-	    self.size = self.size*2
-	    print "Buffer size doubled to", self.size
-	    print "new buffer =", self.buffer
-	    print "first = %d, last = %d, size = %d" % (
-		self.first, self.last, self.size)
-	    self.put(item)		# Recursive call to test the locking
-	def get(self):
-	    # Is the buffer empty?
-	    if self.first == self.last:
-		raise EOFError		# Avoid defining a new exception
-	    item = self.buffer[self.first]
-	    self.first = (self.first+1) % self.size
-	    return item
+        def __init__(self, initialsize):
+            assert initialsize > 0
+            self.size = initialsize
+            self.buffer = [None]*self.size
+            self.first = self.last = 0
+        def put(self, item):
+            # Do we need to grow the buffer?
+            if (self.last+1) % self.size != self.first:
+                # Insert the new item
+                self.buffer[self.last] = item
+                self.last = (self.last+1) % self.size
+                return
+            # Double the buffer size
+            # First normalize it so that first==0 and last==size-1
+            print "buffer =", self.buffer
+            print "first = %d, last = %d, size = %d" % (
+                self.first, self.last, self.size)
+            if self.first <= self.last:
+                temp = self.buffer[self.first:self.last]
+            else:
+                temp = self.buffer[self.first:] + self.buffer[:self.last]
+            print "temp =", temp
+            self.buffer = temp + [None]*(self.size+1)
+            self.first = 0
+            self.last = self.size-1
+            self.size = self.size*2
+            print "Buffer size doubled to", self.size
+            print "new buffer =", self.buffer
+            print "first = %d, last = %d, size = %d" % (
+                self.first, self.last, self.size)
+            self.put(item)              # Recursive call to test the locking
+        def get(self):
+            # Is the buffer empty?
+            if self.first == self.last:
+                raise EOFError          # Avoid defining a new exception
+            item = self.buffer[self.first]
+            self.first = (self.first+1) % self.size
+            return item
 
     def producer(buffer, wait, n=1000):
-	import time
-	i = 0
-	while i < n:
-	    print "put", i
-	    buffer.put(i)
-	    i = i+1
-	print "Producer: done producing", n, "items"
-	wait.release()
+        import time
+        i = 0
+        while i < n:
+            print "put", i
+            buffer.put(i)
+            i = i+1
+        print "Producer: done producing", n, "items"
+        wait.release()
 
     def consumer(buffer, wait, n=1000):
-	import time
-	i = 0
-	tout = 0.001
-	while i < n:
-	    try:
-		x = buffer.get()
-		if x != i:
-		    raise AssertionError, \
-			  "get() returned %s, expected %s" % (x, i)
-		print "got", i
-		i = i+1
-		tout = 0.001
-	    except EOFError:
-		time.sleep(tout)
-		tout = tout*2
-	print "Consumer: done consuming", n, "items"
-	wait.release()
+        import time
+        i = 0
+        tout = 0.001
+        while i < n:
+            try:
+                x = buffer.get()
+                if x != i:
+                    raise AssertionError, \
+                          "get() returned %s, expected %s" % (x, i)
+                print "got", i
+                i = i+1
+                tout = 0.001
+            except EOFError:
+                time.sleep(tout)
+                tout = tout*2
+        print "Consumer: done consuming", n, "items"
+        wait.release()
 
     pwait = thread.allocate_lock()
     pwait.acquire()
diff --git a/Demo/metaclasses/Trace.py b/Demo/metaclasses/Trace.py
index a5b765a..86e199d 100644
--- a/Demo/metaclasses/Trace.py
+++ b/Demo/metaclasses/Trace.py
@@ -20,38 +20,38 @@
     __inited = 0
 
     def __init__(self, name, bases, dict):
-	self.__name__ = name
-	self.__bases__ = bases
-	self.__dict = dict
-	# XXX Can't define __dict__, alas
-	self.__inited = 1
+        self.__name__ = name
+        self.__bases__ = bases
+        self.__dict = dict
+        # XXX Can't define __dict__, alas
+        self.__inited = 1
 
     def __getattr__(self, name):
-	try:
-	    return self.__dict[name]
-	except KeyError:
-	    for base in self.__bases__:
-		try:
-		    return base.__getattr__(name)
-		except AttributeError:
-		    pass
-	    raise AttributeError, name
+        try:
+            return self.__dict[name]
+        except KeyError:
+            for base in self.__bases__:
+                try:
+                    return base.__getattr__(name)
+                except AttributeError:
+                    pass
+            raise AttributeError, name
 
     def __setattr__(self, name, value):
-	if not self.__inited:
-	    self.__dict__[name] = value
-	else:
-	    self.__dict[name] = value
+        if not self.__inited:
+            self.__dict__[name] = value
+        else:
+            self.__dict[name] = value
 
     def __call__(self, *args, **kw):
-	inst = TracingInstance()
-	inst.__meta_init__(self)
-	try:
-	    init = inst.__getattr__('__init__')
-	except AttributeError:
-	    init = lambda: None
-	apply(init, args, kw)
-	return inst
+        inst = TracingInstance()
+        inst.__meta_init__(self)
+        try:
+            init = inst.__getattr__('__init__')
+        except AttributeError:
+            init = lambda: None
+        apply(init, args, kw)
+        return inst
 
     __trace_output__ = None
 
@@ -59,52 +59,52 @@
     """Helper class to represent an instance of a tracing class."""
 
     def __trace_call__(self, fp, fmt, *args):
-	fp.write((fmt+'\n') % args)
+        fp.write((fmt+'\n') % args)
 
     def __meta_init__(self, klass):
-	self.__class = klass
+        self.__class = klass
 
     def __getattr__(self, name):
-	# Invoked for any attr not in the instance's __dict__
-	try:
-	    raw = self.__class.__getattr__(name)
-	except AttributeError:
-	    raise AttributeError, name
-	if type(raw) != types.FunctionType:
-	    return raw
-	# It's a function
-	fullname = self.__class.__name__ + "." + name
-	if not self.__trace_output__ or name == '__trace_call__':
-	    return NotTracingWrapper(fullname, raw, self)
-	else:
-	    return TracingWrapper(fullname, raw, self)
+        # Invoked for any attr not in the instance's __dict__
+        try:
+            raw = self.__class.__getattr__(name)
+        except AttributeError:
+            raise AttributeError, name
+        if type(raw) != types.FunctionType:
+            return raw
+        # It's a function
+        fullname = self.__class.__name__ + "." + name
+        if not self.__trace_output__ or name == '__trace_call__':
+            return NotTracingWrapper(fullname, raw, self)
+        else:
+            return TracingWrapper(fullname, raw, self)
 
 class NotTracingWrapper:
     def __init__(self, name, func, inst):
-	self.__name__ = name
-	self.func = func
-	self.inst = inst
+        self.__name__ = name
+        self.func = func
+        self.inst = inst
     def __call__(self, *args, **kw):
-	return apply(self.func, (self.inst,) + args, kw)
+        return apply(self.func, (self.inst,) + args, kw)
 
 class TracingWrapper(NotTracingWrapper):
     def __call__(self, *args, **kw):
-	self.inst.__trace_call__(self.inst.__trace_output__,
-				 "calling %s, inst=%s, args=%s, kw=%s",
-				 self.__name__, self.inst, args, kw)
-	try:
-	    rv = apply(self.func, (self.inst,) + args, kw)
-	except:
-	    t, v, tb = sys.exc_info()
-	    self.inst.__trace_call__(self.inst.__trace_output__,
-				     "returning from %s with exception %s: %s",
-				     self.__name__, t, v)
-	    raise t, v, tb
-	else:
-	    self.inst.__trace_call__(self.inst.__trace_output__,
-				     "returning from %s with value %s",
-				     self.__name__, rv)
-	    return rv
+        self.inst.__trace_call__(self.inst.__trace_output__,
+                                 "calling %s, inst=%s, args=%s, kw=%s",
+                                 self.__name__, self.inst, args, kw)
+        try:
+            rv = apply(self.func, (self.inst,) + args, kw)
+        except:
+            t, v, tb = sys.exc_info()
+            self.inst.__trace_call__(self.inst.__trace_output__,
+                                     "returning from %s with exception %s: %s",
+                                     self.__name__, t, v)
+            raise t, v, tb
+        else:
+            self.inst.__trace_call__(self.inst.__trace_output__,
+                                     "returning from %s with value %s",
+                                     self.__name__, rv)
+            return rv
 
 Traced = TraceMetaClass('Traced', (), {'__trace_output__': None})
 
@@ -112,13 +112,13 @@
 def _test():
     global C, D
     class C(Traced):
-	def __init__(self, x=0): self.x = x
-	def m1(self, x): self.x = x
-	def m2(self, y): return self.x + y
-	__trace_output__ = sys.stdout
+        def __init__(self, x=0): self.x = x
+        def m1(self, x): self.x = x
+        def m2(self, y): return self.x + y
+        __trace_output__ = sys.stdout
     class D(C):
-	def m2(self, y): print "D.m2(%s)" % `y`; return C.m2(self, y)
-	__trace_output__ = None
+        def m2(self, y): print "D.m2(%s)" % `y`; return C.m2(self, y)
+        __trace_output__ = None
     x = C(4321)
     print x
     print x.x
diff --git a/Demo/parser/example.py b/Demo/parser/example.py
index 363f5bb..821cef0 100644
--- a/Demo/parser/example.py
+++ b/Demo/parser/example.py
@@ -14,7 +14,7 @@
     """Retrieve information from the parse tree of a source file.
 
     fileName
-	Name of the file to read Python source code from.
+        Name of the file to read Python source code from.
     """
     source = open(fileName).read()
     import os
@@ -30,86 +30,86 @@
     _name = ''
 
     def __init__(self, tree = None):
-	self._class_info = {}
-	self._function_info = {}
-	if tree:
-	    self._extract_info(tree)
+        self._class_info = {}
+        self._function_info = {}
+        if tree:
+            self._extract_info(tree)
 
     def _extract_info(self, tree):
-	# extract docstring
-	if len(tree) == 2:
-	    found, vars = match(DOCSTRING_STMT_PATTERN[1], tree[1])
-	else:
-	    found, vars = match(DOCSTRING_STMT_PATTERN, tree[3])
-	if found:
-	    self._docstring = eval(vars['docstring'])
-	# discover inner definitions
-	for node in tree[1:]:
-	    found, vars = match(COMPOUND_STMT_PATTERN, node)
-	    if found:
-		cstmt = vars['compound']
-		if cstmt[0] == symbol.funcdef:
-		    name = cstmt[2][1]
-		    self._function_info[name] = FunctionInfo(cstmt)
-		elif cstmt[0] == symbol.classdef:
-		    name = cstmt[2][1]
-		    self._class_info[name] = ClassInfo(cstmt)
+        # extract docstring
+        if len(tree) == 2:
+            found, vars = match(DOCSTRING_STMT_PATTERN[1], tree[1])
+        else:
+            found, vars = match(DOCSTRING_STMT_PATTERN, tree[3])
+        if found:
+            self._docstring = eval(vars['docstring'])
+        # discover inner definitions
+        for node in tree[1:]:
+            found, vars = match(COMPOUND_STMT_PATTERN, node)
+            if found:
+                cstmt = vars['compound']
+                if cstmt[0] == symbol.funcdef:
+                    name = cstmt[2][1]
+                    self._function_info[name] = FunctionInfo(cstmt)
+                elif cstmt[0] == symbol.classdef:
+                    name = cstmt[2][1]
+                    self._class_info[name] = ClassInfo(cstmt)
 
     def get_docstring(self):
-	return self._docstring
+        return self._docstring
 
     def get_name(self):
-	return self._name
+        return self._name
 
     def get_class_names(self):
-	return self._class_info.keys()
+        return self._class_info.keys()
 
     def get_class_info(self, name):
-	return self._class_info[name]
+        return self._class_info[name]
 
     def __getitem__(self, name):
-	try:
-	    return self._class_info[name]
-	except KeyError:
-	    return self._function_info[name]
+        try:
+            return self._class_info[name]
+        except KeyError:
+            return self._function_info[name]
 
 
 class SuiteFuncInfo:
     #  Mixin class providing access to function names and info.
 
     def get_function_names(self):
-	return self._function_info.keys()
+        return self._function_info.keys()
 
     def get_function_info(self, name):
-	return self._function_info[name]
+        return self._function_info[name]
 
 
 class FunctionInfo(SuiteInfoBase, SuiteFuncInfo):
     def __init__(self, tree = None):
-	self._name = tree[2][1]
-	SuiteInfoBase.__init__(self, tree and tree[-1] or None)
+        self._name = tree[2][1]
+        SuiteInfoBase.__init__(self, tree and tree[-1] or None)
 
 
 class ClassInfo(SuiteInfoBase):
     def __init__(self, tree = None):
-	self._name = tree[2][1]
-	SuiteInfoBase.__init__(self, tree and tree[-1] or None)
+        self._name = tree[2][1]
+        SuiteInfoBase.__init__(self, tree and tree[-1] or None)
 
     def get_method_names(self):
-	return self._function_info.keys()
+        return self._function_info.keys()
 
     def get_method_info(self, name):
-	return self._function_info[name]
+        return self._function_info[name]
 
 
 class ModuleInfo(SuiteInfoBase, SuiteFuncInfo):
     def __init__(self, tree = None, name = "<string>"):
-	self._name = name
-	SuiteInfoBase.__init__(self, tree)
-	if tree:
-	    found, vars = match(DOCSTRING_STMT_PATTERN, tree[1])
-	    if found:
-		self._docstring = vars["docstring"]
+        self._name = name
+        SuiteInfoBase.__init__(self, tree)
+        if tree:
+            found, vars = match(DOCSTRING_STMT_PATTERN, tree[1])
+            if found:
+                self._docstring = vars["docstring"]
 
 
 from types import ListType, TupleType
@@ -118,14 +118,14 @@
     """Match `data' to `pattern', with variable extraction.
 
     pattern
-	Pattern to match against, possibly containing variables.
+        Pattern to match against, possibly containing variables.
 
     data
-	Data to be checked and against which variables are extracted.
+        Data to be checked and against which variables are extracted.
 
     vars
-	Dictionary of variables which have already been found.  If not
-	provided, an empty dictionary is created.
+        Dictionary of variables which have already been found.  If not
+        provided, an empty dictionary is created.
 
     The `pattern' value may contain variables of the form ['varname'] which
     are allowed to match anything.  The value that is matched is returned as
@@ -138,18 +138,18 @@
     values.
     """
     if vars is None:
-	vars = {}
-    if type(pattern) is ListType:	# 'variables' are ['varname']
-	vars[pattern[0]] = data
-	return 1, vars
+        vars = {}
+    if type(pattern) is ListType:       # 'variables' are ['varname']
+        vars[pattern[0]] = data
+        return 1, vars
     if type(pattern) is not TupleType:
-	return (pattern == data), vars
+        return (pattern == data), vars
     if len(data) != len(pattern):
-	return 0, vars
+        return 0, vars
     for pattern, data in map(None, pattern, data):
-	same, vars = match(pattern, data, vars)
-	if not same:
-	    break
+        same, vars = match(pattern, data, vars)
+        if not same:
+            break
     return same, vars
 
 
@@ -172,21 +172,21 @@
      (symbol.small_stmt,
       (symbol.expr_stmt,
        (symbol.testlist,
-	(symbol.test,
-	 (symbol.and_test,
-	  (symbol.not_test,
-	   (symbol.comparison,
-	    (symbol.expr,
-	     (symbol.xor_expr,
-	      (symbol.and_expr,
-	       (symbol.shift_expr,
-		(symbol.arith_expr,
-		 (symbol.term,
-		  (symbol.factor,
-		   (symbol.power,
-		    (symbol.atom,
-		     (token.STRING, ['docstring'])
-		     )))))))))))))))),
+        (symbol.test,
+         (symbol.and_test,
+          (symbol.not_test,
+           (symbol.comparison,
+            (symbol.expr,
+             (symbol.xor_expr,
+              (symbol.and_expr,
+               (symbol.shift_expr,
+                (symbol.arith_expr,
+                 (symbol.term,
+                  (symbol.factor,
+                   (symbol.power,
+                    (symbol.atom,
+                     (token.STRING, ['docstring'])
+                     )))))))))))))))),
      (token.NEWLINE, '')
      ))
 
diff --git a/Demo/parser/source.py b/Demo/parser/source.py
index b1690a5..b900628 100644
--- a/Demo/parser/source.py
+++ b/Demo/parser/source.py
@@ -9,18 +9,18 @@
     "This class does very little."
 
     def method(self):
-	"This method does almost nothing."
-	return 1
+        "This method does almost nothing."
+        return 1
 
     class Nested:
-	"This is a nested class."
+        "This is a nested class."
 
-	def nested_method(self):
-	    "Method of Nested class."
-	    def nested_function():
-		"Function in method of Nested class."
-		pass
-	    return nested_function
+        def nested_method(self):
+            "Method of Nested class."
+            def nested_function():
+                "Function in method of Nested class."
+                pass
+            return nested_function
 
 def function():
     "This function lives at the module level."
diff --git a/Demo/parser/test_parser.py b/Demo/parser/test_parser.py
index f91592f..3f02a96 100755
--- a/Demo/parser/test_parser.py
+++ b/Demo/parser/test_parser.py
@@ -11,24 +11,24 @@
     global _numFailed
     print '----', fileName,
     try:
-	ast = parser.suite(t)
-	tup = parser.ast2tuple(ast)
-	# this discards the first AST; a huge memory savings when running
-	# against a large source file like Tkinter.py.
-	ast = None
-	new = parser.tuple2ast(tup)
+        ast = parser.suite(t)
+        tup = parser.ast2tuple(ast)
+        # this discards the first AST; a huge memory savings when running
+        # against a large source file like Tkinter.py.
+        ast = None
+        new = parser.tuple2ast(tup)
     except parser.ParserError, err:
-	print
-	print 'parser module raised exception on input file', fileName + ':'
-	traceback.print_exc()
-	_numFailed = _numFailed + 1
+        print
+        print 'parser module raised exception on input file', fileName + ':'
+        traceback.print_exc()
+        _numFailed = _numFailed + 1
     else:
-	if tup != parser.ast2tuple(new):
-	    print
-	    print 'parser module failed on input file', fileName
-	    _numFailed = _numFailed + 1
-	else:
-	    print 'o.k.'
+        if tup != parser.ast2tuple(new):
+            print
+            print 'parser module failed on input file', fileName
+            _numFailed = _numFailed + 1
+        else:
+            print 'o.k.'
 
 def testFile(fileName):
     t = open(fileName).read()
@@ -38,8 +38,8 @@
     import sys
     args = sys.argv[1:]
     if not args:
-	import glob
-	args = glob.glob("*.py")
+        import glob
+        args = glob.glob("*.py")
     map(testFile, args)
     sys.exit(_numFailed != 0)
 
diff --git a/Demo/pdist/RCSProxy.py b/Demo/pdist/RCSProxy.py
index e29090c..7212ca6 100755
--- a/Demo/pdist/RCSProxy.py
+++ b/Demo/pdist/RCSProxy.py
@@ -31,147 +31,147 @@
 class DirSupport:
 
     def __init__(self):
-	self._dirstack = []
+        self._dirstack = []
 
     def __del__(self):
-	self._close()
+        self._close()
 
     def _close(self):
-	while self._dirstack:
-	    self.back()
+        while self._dirstack:
+            self.back()
 
     def pwd(self):
-	return os.getcwd()
+        return os.getcwd()
 
     def cd(self, name):
-	save = os.getcwd()
-	os.chdir(name)
-	self._dirstack.append(save)
+        save = os.getcwd()
+        os.chdir(name)
+        self._dirstack.append(save)
 
     def back(self):
-	if not self._dirstack:
-	    raise os.error, "empty directory stack"
-	dir = self._dirstack[-1]
-	os.chdir(dir)
-	del self._dirstack[-1]
+        if not self._dirstack:
+            raise os.error, "empty directory stack"
+        dir = self._dirstack[-1]
+        os.chdir(dir)
+        del self._dirstack[-1]
 
     def listsubdirs(self, pat = None):
-	files = os.listdir(os.curdir)
-	files = filter(os.path.isdir, files)
-	return self._filter(files, pat)
+        files = os.listdir(os.curdir)
+        files = filter(os.path.isdir, files)
+        return self._filter(files, pat)
 
     def isdir(self, name):
-	return os.path.isdir(name)
+        return os.path.isdir(name)
 
     def mkdir(self, name):
-	os.mkdir(name, 0777)
+        os.mkdir(name, 0777)
 
     def rmdir(self, name):
-	os.rmdir(name)
+        os.rmdir(name)
 
 
 class RCSProxyLocal(rcslib.RCS, DirSupport):
 
     def __init__(self):
-	rcslib.RCS.__init__(self)
-	DirSupport.__init__(self)
+        rcslib.RCS.__init__(self)
+        DirSupport.__init__(self)
 
     def __del__(self):
-	DirSupport.__del__(self)
-	rcslib.RCS.__del__(self)
+        DirSupport.__del__(self)
+        rcslib.RCS.__del__(self)
 
     def sumlist(self, list = None):
-	return self._list(self.sum, list)
+        return self._list(self.sum, list)
 
     def sumdict(self, list = None):
-	return self._dict(self.sum, list)
+        return self._dict(self.sum, list)
 
     def sum(self, name_rev):
-	f = self._open(name_rev)
-	BUFFERSIZE = 1024*8
-	sum = md5.new()
-	while 1:
-	    buffer = f.read(BUFFERSIZE)
-	    if not buffer:
-		break
-	    sum.update(buffer)
-	self._closepipe(f)
-	return sum.digest()
+        f = self._open(name_rev)
+        BUFFERSIZE = 1024*8
+        sum = md5.new()
+        while 1:
+            buffer = f.read(BUFFERSIZE)
+            if not buffer:
+                break
+            sum.update(buffer)
+        self._closepipe(f)
+        return sum.digest()
 
     def get(self, name_rev):
-	f = self._open(name_rev)
-	data = f.read()
-	self._closepipe(f)
-	return data
+        f = self._open(name_rev)
+        data = f.read()
+        self._closepipe(f)
+        return data
 
     def put(self, name_rev, data, message=None):
-	name, rev = self._unmangle(name_rev)
-	f = open(name, 'w')
-	f.write(data)
-	f.close()
-	self.checkin(name_rev, message)
-	self._remove(name)
+        name, rev = self._unmangle(name_rev)
+        f = open(name, 'w')
+        f.write(data)
+        f.close()
+        self.checkin(name_rev, message)
+        self._remove(name)
 
     def _list(self, function, list = None):
-	"""INTERNAL: apply FUNCTION to all files in LIST.
+        """INTERNAL: apply FUNCTION to all files in LIST.
 
-	Return a list of the results.
+        Return a list of the results.
 
-	The list defaults to all files in the directory if None.
+        The list defaults to all files in the directory if None.
 
-	"""
-	if list is None:
-	    list = self.listfiles()
-	res = []
-	for name in list:
-	    try:
-		res.append((name, function(name)))
-	    except (os.error, IOError):
-		res.append((name, None))
-	return res
+        """
+        if list is None:
+            list = self.listfiles()
+        res = []
+        for name in list:
+            try:
+                res.append((name, function(name)))
+            except (os.error, IOError):
+                res.append((name, None))
+        return res
 
     def _dict(self, function, list = None):
-	"""INTERNAL: apply FUNCTION to all files in LIST.
+        """INTERNAL: apply FUNCTION to all files in LIST.
 
-	Return a dictionary mapping files to results.
+        Return a dictionary mapping files to results.
 
-	The list defaults to all files in the directory if None.
+        The list defaults to all files in the directory if None.
 
-	"""
-	if list is None:
-	    list = self.listfiles()
-	dict = {}
-	for name in list:
-	    try:
-		dict[name] = function(name)
-	    except (os.error, IOError):
-		pass
-	return dict
+        """
+        if list is None:
+            list = self.listfiles()
+        dict = {}
+        for name in list:
+            try:
+                dict[name] = function(name)
+            except (os.error, IOError):
+                pass
+        return dict
 
 
 class RCSProxyServer(RCSProxyLocal, server.SecureServer):
 
     def __init__(self, address, verbose = server.VERBOSE):
-	RCSProxyLocal.__init__(self)
-	server.SecureServer.__init__(self, address, verbose)
+        RCSProxyLocal.__init__(self)
+        server.SecureServer.__init__(self, address, verbose)
 
     def _close(self):
-	server.SecureServer._close(self)
-	RCSProxyLocal._close(self)
+        server.SecureServer._close(self)
+        RCSProxyLocal._close(self)
 
     def _serve(self):
-	server.SecureServer._serve(self)
-	# Retreat into start directory
-	while self._dirstack: self.back()
+        server.SecureServer._serve(self)
+        # Retreat into start directory
+        while self._dirstack: self.back()
 
 
 def test_server():
     import string
     import sys
     if sys.argv[1:]:
-	port = string.atoi(sys.argv[1])
+        port = string.atoi(sys.argv[1])
     else:
-	port = 4127
+        port = 4127
     proxy = RCSProxyServer(('', port))
     proxy._serverloop()
 
@@ -179,19 +179,19 @@
 def test():
     import sys
     if not sys.argv[1:] or sys.argv[1] and sys.argv[1][0] in '0123456789':
-	test_server()
-	sys.exit(0)
+        test_server()
+        sys.exit(0)
     proxy = RCSProxyLocal()
     what = sys.argv[1]
     if hasattr(proxy, what):
-	attr = getattr(proxy, what)
-	if callable(attr):
-	    print apply(attr, tuple(sys.argv[2:]))
-	else:
-	    print `attr`
+        attr = getattr(proxy, what)
+        if callable(attr):
+            print apply(attr, tuple(sys.argv[2:]))
+        else:
+            print `attr`
     else:
-	print "%s: no such attribute" % what
-	sys.exit(2)
+        print "%s: no such attribute" % what
+        sys.exit(2)
 
 
 if __name__ == '__main__':
diff --git a/Demo/pdist/makechangelog.py b/Demo/pdist/makechangelog.py
index 5a0cf79..b26f30b 100755
--- a/Demo/pdist/makechangelog.py
+++ b/Demo/pdist/makechangelog.py
@@ -15,25 +15,25 @@
     opts, args = getopt.getopt(args, 'p:')
     prefix = ''
     for o, a in opts:
-	if p == '-p': prefix = a
+        if p == '-p': prefix = a
 
     f = sys.stdin
     allrevs = []
     while 1:
-	file = getnextfile(f)
-	if not file: break
-	revs = []
-	while 1:
-	    rev = getnextrev(f, file)
-	    if not rev:
-		break
-	    revs.append(rev)
-	if revs:
-	    allrevs[len(allrevs):] = revs
+        file = getnextfile(f)
+        if not file: break
+        revs = []
+        while 1:
+            rev = getnextrev(f, file)
+            if not rev:
+                break
+            revs.append(rev)
+        if revs:
+            allrevs[len(allrevs):] = revs
     allrevs.sort()
     allrevs.reverse()
     for rev in allrevs:
-	formatrev(rev, prefix)
+        formatrev(rev, prefix)
 
 parsedateprog = regex.compile(
     '^date: \([0-9]+\)/\([0-9]+\)/\([0-9]+\) ' +
@@ -48,46 +48,46 @@
 def formatrev(rev, prefix):
     dateline, file, revline, log = rev
     if parsedateprog.match(dateline) >= 0:
-	fields = parsedateprog.group(1, 2, 3, 4, 5, 6)
-	author = parsedateprog.group(7)
-	if authormap.has_key(author): author = authormap[author]
-	tfields = map(string.atoi, fields) + [0, 0, 0]
-	tfields[5] = tfields[5] - time.timezone
-	t = time.mktime(tuple(tfields))
-	print time.ctime(t), '', author
-	words = string.split(log)
-	words[:0] = ['*', prefix + file + ':']
-	maxcol = 72-8
-	col = maxcol
-	for word in words:
-	    if col > 0 and col + len(word) >= maxcol:
-		print
-		print '\t' + word,
-		col = -1
-	    else:
-		print word,
-	    col = col + 1 + len(word)
-	print
-	print
+        fields = parsedateprog.group(1, 2, 3, 4, 5, 6)
+        author = parsedateprog.group(7)
+        if authormap.has_key(author): author = authormap[author]
+        tfields = map(string.atoi, fields) + [0, 0, 0]
+        tfields[5] = tfields[5] - time.timezone
+        t = time.mktime(tuple(tfields))
+        print time.ctime(t), '', author
+        words = string.split(log)
+        words[:0] = ['*', prefix + file + ':']
+        maxcol = 72-8
+        col = maxcol
+        for word in words:
+            if col > 0 and col + len(word) >= maxcol:
+                print
+                print '\t' + word,
+                col = -1
+            else:
+                print word,
+            col = col + 1 + len(word)
+        print
+        print
 
 startprog = regex.compile("^Working file: \(.*\)$")
 
 def getnextfile(f):
     while 1:
-	line = f.readline()
-	if not line: return None
-	if startprog.match(line) >= 0:
-	    file = startprog.group(1)
-	    # Skip until first revision
-	    while 1:
-		line = f.readline()
-		if not line: return None
-		if line[:10] == '='*10: return None
-		if line[:10] == '-'*10: break
-##		print "Skipped", line,
-	    return file
-##	else:
-##	    print "Ignored", line,
+        line = f.readline()
+        if not line: return None
+        if startprog.match(line) >= 0:
+            file = startprog.group(1)
+            # Skip until first revision
+            while 1:
+                line = f.readline()
+                if not line: return None
+                if line[:10] == '='*10: return None
+                if line[:10] == '-'*10: break
+##              print "Skipped", line,
+            return file
+##      else:
+##          print "Ignored", line,
 
 def getnextrev(f, file):
     # This is called when we are positioned just after a '---' separator
@@ -95,14 +95,14 @@
     dateline = f.readline()
     log = ''
     while 1:
-	line = f.readline()
-	if not line: break
-	if line[:10] == '='*10:
-	    # Ignore the *last* log entry for each file since it
-	    # is the revision since which we are logging.
-	    return None
-	if line[:10] == '-'*10: break
-	log = log + line
+        line = f.readline()
+        if not line: break
+        if line[:10] == '='*10:
+            # Ignore the *last* log entry for each file since it
+            # is the revision since which we are logging.
+            return None
+        if line[:10] == '-'*10: break
+        log = log + line
     return dateline, file, revline, log
 
 if __name__ == '__main__':
diff --git a/Demo/pdist/rcsclient.py b/Demo/pdist/rcsclient.py
index 20dffec..5d88a57 100755
--- a/Demo/pdist/rcsclient.py
+++ b/Demo/pdist/rcsclient.py
@@ -22,8 +22,8 @@
 
 class RCSProxyClient(client.SecureClient):
 	
-    def __init__(self, address, verbose = client.VERBOSE):
-	client.SecureClient.__init__(self, address, verbose)
+	def __init__(self, address, verbose = client.VERBOSE):
+		client.SecureClient.__init__(self, address, verbose)
 
 
 def openrcsclient(opts = []):
diff --git a/Demo/pdist/rcslib.py b/Demo/pdist/rcslib.py
index 55d764d..223ddca 100755
--- a/Demo/pdist/rcslib.py
+++ b/Demo/pdist/rcslib.py
@@ -36,304 +36,304 @@
     okchars = string.letters + string.digits + '-_=+.'
 
     def __init__(self):
-	"""Constructor."""
-	pass
+        """Constructor."""
+        pass
 
     def __del__(self):
-	"""Destructor."""
-	pass
+        """Destructor."""
+        pass
 
     # --- Informational methods about a single file/revision ---
 
     def log(self, name_rev, otherflags = ''):
-	"""Return the full log text for NAME_REV as a string.
+        """Return the full log text for NAME_REV as a string.
 
-	Optional OTHERFLAGS are passed to rlog.
+        Optional OTHERFLAGS are passed to rlog.
 
-	"""
-	f = self._open(name_rev, 'rlog ' + otherflags)
-	data = f.read()
-	status = self._closepipe(f)
-	if status:
-	    data = data + "%s: %s" % status
-	elif data[-1] == '\n':
-	    data = data[:-1]
-	return data
+        """
+        f = self._open(name_rev, 'rlog ' + otherflags)
+        data = f.read()
+        status = self._closepipe(f)
+        if status:
+            data = data + "%s: %s" % status
+        elif data[-1] == '\n':
+            data = data[:-1]
+        return data
 
     def head(self, name_rev):
-	"""Return the head revision for NAME_REV"""
-	dict = self.info(name_rev)
-	return dict['head']
+        """Return the head revision for NAME_REV"""
+        dict = self.info(name_rev)
+        return dict['head']
 
     def info(self, name_rev):
-	"""Return a dictionary of info (from rlog -h) for NAME_REV
+        """Return a dictionary of info (from rlog -h) for NAME_REV
 
-	The dictionary's keys are the keywords that rlog prints
-	(e.g. 'head' and its values are the corresponding data
-	(e.g. '1.3').
+        The dictionary's keys are the keywords that rlog prints
+        (e.g. 'head' and its values are the corresponding data
+        (e.g. '1.3').
 
-	XXX symbolic names and locks are not returned
+        XXX symbolic names and locks are not returned
 
-	"""
-	f = self._open(name_rev, 'rlog -h')
-	dict = {}
-	while 1:
-	    line = f.readline()
-	    if not line: break
-	    if line[0] == '\t':
-		# XXX could be a lock or symbolic name
-		# Anything else?
-		continue 
-	    i = string.find(line, ':')
-	    if i > 0:
-		key, value = line[:i], string.strip(line[i+1:])
-		dict[key] = value
-	status = self._closepipe(f)
-	if status:
-	    raise IOError, status
-	return dict
+        """
+        f = self._open(name_rev, 'rlog -h')
+        dict = {}
+        while 1:
+            line = f.readline()
+            if not line: break
+            if line[0] == '\t':
+                # XXX could be a lock or symbolic name
+                # Anything else?
+                continue 
+            i = string.find(line, ':')
+            if i > 0:
+                key, value = line[:i], string.strip(line[i+1:])
+                dict[key] = value
+        status = self._closepipe(f)
+        if status:
+            raise IOError, status
+        return dict
 
     # --- Methods that change files ---
 
     def lock(self, name_rev):
-	"""Set an rcs lock on NAME_REV."""
-	name, rev = self.checkfile(name_rev)
-	cmd = "rcs -l%s %s" % (rev, name)
-	return self._system(cmd)
+        """Set an rcs lock on NAME_REV."""
+        name, rev = self.checkfile(name_rev)
+        cmd = "rcs -l%s %s" % (rev, name)
+        return self._system(cmd)
 
     def unlock(self, name_rev):
-	"""Clear an rcs lock on NAME_REV."""
-	name, rev = self.checkfile(name_rev)
-	cmd = "rcs -u%s %s" % (rev, name)
-	return self._system(cmd)
+        """Clear an rcs lock on NAME_REV."""
+        name, rev = self.checkfile(name_rev)
+        cmd = "rcs -u%s %s" % (rev, name)
+        return self._system(cmd)
 
     def checkout(self, name_rev, withlock=0, otherflags=""):
-	"""Check out NAME_REV to its work file.
+        """Check out NAME_REV to its work file.
 
-	If optional WITHLOCK is set, check out locked, else unlocked.
+        If optional WITHLOCK is set, check out locked, else unlocked.
 
-	The optional OTHERFLAGS is passed to co without
-	interpretation.
+        The optional OTHERFLAGS is passed to co without
+        interpretation.
 
-	Any output from co goes to directly to stdout.
+        Any output from co goes to directly to stdout.
 
-	"""
-	name, rev = self.checkfile(name_rev)
-	if withlock: lockflag = "-l"
-	else: lockflag = "-u"
-	cmd = 'co %s%s %s %s' % (lockflag, rev, otherflags, name)
-	return self._system(cmd)
+        """
+        name, rev = self.checkfile(name_rev)
+        if withlock: lockflag = "-l"
+        else: lockflag = "-u"
+        cmd = 'co %s%s %s %s' % (lockflag, rev, otherflags, name)
+        return self._system(cmd)
 
     def checkin(self, name_rev, message=None, otherflags=""):
-	"""Check in NAME_REV from its work file.
+        """Check in NAME_REV from its work file.
 
-	The optional MESSAGE argument becomes the checkin message
-	(default "<none>" if None); or the file description if this is
-	a new file.
+        The optional MESSAGE argument becomes the checkin message
+        (default "<none>" if None); or the file description if this is
+        a new file.
 
-	The optional OTHERFLAGS argument is passed to ci without
-	interpretation.
+        The optional OTHERFLAGS argument is passed to ci without
+        interpretation.
 
-	Any output from ci goes to directly to stdout.
+        Any output from ci goes to directly to stdout.
 
-	"""
-	name, rev = self._unmangle(name_rev)
-	new = not self.isvalid(name)
-	if not message: message = "<none>"
-	if message and message[-1] != '\n':
-	    message = message + '\n'
-	lockflag = "-u"
-	textfile = None
-	try:
-	    if new:
-		textfile = tempfile.mktemp()
-		f = open(textfile, 'w')
-		f.write(message)
-		f.close()
-		cmd = 'ci %s%s -t%s %s %s' % \
-		      (lockflag, rev, textfile, otherflags, name)
-	    else:
-		message = regsub.gsub('\([\\"$`]\)', '\\\\\\1', message)
-		cmd = 'ci %s%s -m"%s" %s %s' % \
-		      (lockflag, rev, message, otherflags, name)
-	    return self._system(cmd)
-	finally:
-	    if textfile: self._remove(textfile)
+        """
+        name, rev = self._unmangle(name_rev)
+        new = not self.isvalid(name)
+        if not message: message = "<none>"
+        if message and message[-1] != '\n':
+            message = message + '\n'
+        lockflag = "-u"
+        textfile = None
+        try:
+            if new:
+                textfile = tempfile.mktemp()
+                f = open(textfile, 'w')
+                f.write(message)
+                f.close()
+                cmd = 'ci %s%s -t%s %s %s' % \
+                      (lockflag, rev, textfile, otherflags, name)
+            else:
+                message = regsub.gsub('\([\\"$`]\)', '\\\\\\1', message)
+                cmd = 'ci %s%s -m"%s" %s %s' % \
+                      (lockflag, rev, message, otherflags, name)
+            return self._system(cmd)
+        finally:
+            if textfile: self._remove(textfile)
 
     # --- Exported support methods ---
 
     def listfiles(self, pat = None):
-	"""Return a list of all version files matching optional PATTERN."""
-	files = os.listdir(os.curdir)
-	files = filter(self._isrcs, files)
-	if os.path.isdir('RCS'):
-	    files2 = os.listdir('RCS')
-	    files2 = filter(self._isrcs, files2)
-	    files = files + files2
-	files = map(self.realname, files)
-	return self._filter(files, pat)
+        """Return a list of all version files matching optional PATTERN."""
+        files = os.listdir(os.curdir)
+        files = filter(self._isrcs, files)
+        if os.path.isdir('RCS'):
+            files2 = os.listdir('RCS')
+            files2 = filter(self._isrcs, files2)
+            files = files + files2
+        files = map(self.realname, files)
+        return self._filter(files, pat)
 
     def isvalid(self, name):
-	"""Test whether NAME has a version file associated."""
-	namev = self.rcsname(name)
-	return (os.path.isfile(namev) or
-		os.path.isfile(os.path.join('RCS', namev)))
+        """Test whether NAME has a version file associated."""
+        namev = self.rcsname(name)
+        return (os.path.isfile(namev) or
+                os.path.isfile(os.path.join('RCS', namev)))
 
     def rcsname(self, name):
-	"""Return the pathname of the version file for NAME.
+        """Return the pathname of the version file for NAME.
 
-	The argument can be a work file name or a version file name.
-	If the version file does not exist, the name of the version
-	file that would be created by "ci" is returned.
+        The argument can be a work file name or a version file name.
+        If the version file does not exist, the name of the version
+        file that would be created by "ci" is returned.
 
-	"""
-	if self._isrcs(name): namev = name
-	else: namev = name + ',v'
-	if os.path.isfile(namev): return namev
-	namev = os.path.join('RCS', os.path.basename(namev))
-	if os.path.isfile(namev): return namev
-	if os.path.isdir('RCS'):
-	    return os.path.join('RCS', namev)
-	else:
-	    return namev
+        """
+        if self._isrcs(name): namev = name
+        else: namev = name + ',v'
+        if os.path.isfile(namev): return namev
+        namev = os.path.join('RCS', os.path.basename(namev))
+        if os.path.isfile(namev): return namev
+        if os.path.isdir('RCS'):
+            return os.path.join('RCS', namev)
+        else:
+            return namev
 
     def realname(self, namev):
-	"""Return the pathname of the work file for NAME.
+        """Return the pathname of the work file for NAME.
 
-	The argument can be a work file name or a version file name.
-	If the work file does not exist, the name of the work file
-	that would be created by "co" is returned.
+        The argument can be a work file name or a version file name.
+        If the work file does not exist, the name of the work file
+        that would be created by "co" is returned.
 
-	"""
-	if self._isrcs(namev): name = namev[:-2]
-	else: name = namev
-	if os.path.isfile(name): return name
-	name = os.path.basename(name)
-	return name
+        """
+        if self._isrcs(namev): name = namev[:-2]
+        else: name = namev
+        if os.path.isfile(name): return name
+        name = os.path.basename(name)
+        return name
 
     def islocked(self, name_rev):
-	"""Test whether FILE (which must have a version file) is locked.
+        """Test whether FILE (which must have a version file) is locked.
 
-	XXX This does not tell you which revision number is locked and
-	ignores any revision you may pass in (by virtue of using rlog
-	-L -R).
+        XXX This does not tell you which revision number is locked and
+        ignores any revision you may pass in (by virtue of using rlog
+        -L -R).
 
-	"""
-	f = self._open(name_rev, 'rlog -L -R')
-	line = f.readline()
-	status = self._closepipe(f)
-	if status:
-	    raise IOError, status
-	if not line: return None
-	if line[-1] == '\n':
-	    line = line[:-1]
-	return self.realname(name_rev) == self.realname(line)
+        """
+        f = self._open(name_rev, 'rlog -L -R')
+        line = f.readline()
+        status = self._closepipe(f)
+        if status:
+            raise IOError, status
+        if not line: return None
+        if line[-1] == '\n':
+            line = line[:-1]
+        return self.realname(name_rev) == self.realname(line)
 
     def checkfile(self, name_rev):
-	"""Normalize NAME_REV into a (NAME, REV) tuple.
+        """Normalize NAME_REV into a (NAME, REV) tuple.
 
-	Raise an exception if there is no corresponding version file.
+        Raise an exception if there is no corresponding version file.
 
-	"""
-	name, rev = self._unmangle(name_rev)
-	if not self.isvalid(name):
-	    raise os.error, 'not an rcs file %s' % `name`
-	return name, rev
+        """
+        name, rev = self._unmangle(name_rev)
+        if not self.isvalid(name):
+            raise os.error, 'not an rcs file %s' % `name`
+        return name, rev
 
     # --- Internal methods ---
 
     def _open(self, name_rev, cmd = 'co -p', rflag = '-r'):
-	"""INTERNAL: open a read pipe to NAME_REV using optional COMMAND.
+        """INTERNAL: open a read pipe to NAME_REV using optional COMMAND.
 
-	Optional FLAG is used to indicate the revision (default -r).
+        Optional FLAG is used to indicate the revision (default -r).
 
-	Default COMMAND is "co -p".
+        Default COMMAND is "co -p".
 
-	Return a file object connected by a pipe to the command's
-	output.
+        Return a file object connected by a pipe to the command's
+        output.
 
-	"""
-	name, rev = self.checkfile(name_rev)
-	namev = self.rcsname(name)
-	if rev:
-	    cmd = cmd + ' ' + rflag + rev
-	return os.popen("%s %s" % (cmd, `namev`))
+        """
+        name, rev = self.checkfile(name_rev)
+        namev = self.rcsname(name)
+        if rev:
+            cmd = cmd + ' ' + rflag + rev
+        return os.popen("%s %s" % (cmd, `namev`))
 
     def _unmangle(self, name_rev):
-	"""INTERNAL: Normalize NAME_REV argument to (NAME, REV) tuple.
+        """INTERNAL: Normalize NAME_REV argument to (NAME, REV) tuple.
 
-	Raise an exception if NAME contains invalid characters.
+        Raise an exception if NAME contains invalid characters.
 
-	A NAME_REV argument is either NAME string (implying REV='') or
-	a tuple of the form (NAME, REV).
+        A NAME_REV argument is either NAME string (implying REV='') or
+        a tuple of the form (NAME, REV).
 
-	"""
-	if type(name_rev) == type(''):
-	    name_rev = name, rev = name_rev, ''
-	else:
-	    name, rev = name_rev
-	for c in rev:
-	    if c not in self.okchars:
-		raise ValueError, "bad char in rev"
-	return name_rev
+        """
+        if type(name_rev) == type(''):
+            name_rev = name, rev = name_rev, ''
+        else:
+            name, rev = name_rev
+        for c in rev:
+            if c not in self.okchars:
+                raise ValueError, "bad char in rev"
+        return name_rev
 
     def _closepipe(self, f):
-	"""INTERNAL: Close PIPE and print its exit status if nonzero."""
-	sts = f.close()
-	if not sts: return None
-	detail, reason = divmod(sts, 256)
-	if reason == 0: return 'exit', detail	# Exit status
-	signal = reason&0x7F
-	if signal == 0x7F:
-	    code = 'stopped'
-	    signal = detail
-	else:
-	    code = 'killed'
-	if reason&0x80:
-	    code = code + '(coredump)'
-	return code, signal
+        """INTERNAL: Close PIPE and print its exit status if nonzero."""
+        sts = f.close()
+        if not sts: return None
+        detail, reason = divmod(sts, 256)
+        if reason == 0: return 'exit', detail   # Exit status
+        signal = reason&0x7F
+        if signal == 0x7F:
+            code = 'stopped'
+            signal = detail
+        else:
+            code = 'killed'
+        if reason&0x80:
+            code = code + '(coredump)'
+        return code, signal
  
     def _system(self, cmd):
-	"""INTERNAL: run COMMAND in a subshell.
+        """INTERNAL: run COMMAND in a subshell.
 
-	Standard input for the command is taken fron /dev/null.
+        Standard input for the command is taken fron /dev/null.
 
-	Raise IOError when the exit status is not zero.
+        Raise IOError when the exit status is not zero.
 
-	Return whatever the calling method should return; normally
-	None.
+        Return whatever the calling method should return; normally
+        None.
 
-	A derived class may override this method and redefine it to
-	capture stdout/stderr of the command and return it.
+        A derived class may override this method and redefine it to
+        capture stdout/stderr of the command and return it.
 
-	"""
-	cmd = cmd + " </dev/null"
-	sts = os.system(cmd)
-	if sts: raise IOError, "command exit status %d" % sts
+        """
+        cmd = cmd + " </dev/null"
+        sts = os.system(cmd)
+        if sts: raise IOError, "command exit status %d" % sts
 
     def _filter(self, files, pat = None):
-	"""INTERNAL: Return a sorted copy of the given list of FILES.
+        """INTERNAL: Return a sorted copy of the given list of FILES.
 
-	If a second PATTERN argument is given, only files matching it
-	are kept.  No check for valid filenames is made.
-	
-	"""
-	if pat:
-	    def keep(name, pat = pat):
-		return fnmatch.fnmatch(name, pat)
-	    files = filter(keep, files)
-	else:
-	    files = files[:]
-	files.sort()
-	return files
+        If a second PATTERN argument is given, only files matching it
+        are kept.  No check for valid filenames is made.
+        
+        """
+        if pat:
+            def keep(name, pat = pat):
+                return fnmatch.fnmatch(name, pat)
+            files = filter(keep, files)
+        else:
+            files = files[:]
+        files.sort()
+        return files
 
     def _remove(self, fn):
-	"""INTERNAL: remove FILE without complaints."""
-	try:
-	    os.unlink(fn)
-	except os.error:
-	    pass
+        """INTERNAL: remove FILE without complaints."""
+        try:
+            os.unlink(fn)
+        except os.error:
+            pass
 
     def _isrcs(self, name):
-	"""INTERNAL: Test whether NAME ends in ',v'."""
-	return name[-2:] == ',v'
+        """INTERNAL: Test whether NAME ends in ',v'."""
+        return name[-2:] == ',v'
diff --git a/Demo/pysvr/pysvr.py b/Demo/pysvr/pysvr.py
index a62fc5c..dd0abdc 100755
--- a/Demo/pysvr/pysvr.py
+++ b/Demo/pysvr/pysvr.py
@@ -14,30 +14,30 @@
 
 import sys, os, string, getopt, thread, socket, traceback
 
-PORT = 4000				# Default port
+PORT = 4000                             # Default port
 
 def main():
     try:
-	opts, args = getopt.getopt(sys.argv[1:], "")
-	if len(args) > 1:
-	    raise getopt.error, "Too many arguments."
+        opts, args = getopt.getopt(sys.argv[1:], "")
+        if len(args) > 1:
+            raise getopt.error, "Too many arguments."
     except getopt.error, msg:
-	usage(msg)
+        usage(msg)
     for o, a in opts:
-	pass
+        pass
     if args:
-	try:
-	    port = string.atoi(args[0])
-	except ValueError, msg:
-	    usage(msg)
+        try:
+            port = string.atoi(args[0])
+        except ValueError, msg:
+            usage(msg)
     else:
-	port = PORT
+        port = PORT
     main_thread(port)
 
 def usage(msg=None):
     sys.stdout = sys.stderr
     if msg:
-	print msg
+        print msg
     print "\n", __doc__,
     sys.exit(2)
 
@@ -47,18 +47,18 @@
     sock.listen(5)
     print "Listening on port", port, "..."
     while 1:
-	(conn, addr) = sock.accept()
-	if addr[0] != conn.getsockname()[0]:
-	    conn.close()
-	    print "Refusing connection from non-local host", addr[0], "."
-	    continue
-	thread.start_new_thread(service_thread, (conn, addr))
-	del conn, addr
+        (conn, addr) = sock.accept()
+        if addr[0] != conn.getsockname()[0]:
+            conn.close()
+            print "Refusing connection from non-local host", addr[0], "."
+            continue
+        thread.start_new_thread(service_thread, (conn, addr))
+        del conn, addr
 
 def service_thread(conn, addr):
     (caddr, cport) = addr
     print "Thread %s has connection from %s.\n" % (str(thread.get_ident()),
-						   caddr),
+                                                   caddr),
     stdin = conn.makefile("r")
     stdout = conn.makefile("w", 0)
     run_interpreter(stdin, stdout)
@@ -67,57 +67,57 @@
 def run_interpreter(stdin, stdout):
     globals = {}
     try:
-	str(sys.ps1)
+        str(sys.ps1)
     except:
-	sys.ps1 = ">>> "
+        sys.ps1 = ">>> "
     source = ""
     while 1:
-	stdout.write(sys.ps1)
-	line = stdin.readline()
-	if line[:2] == '\377\354':
-	    line = ""
-	if not line and not source:
-	    break
-	if line[-2:] == '\r\n':
-	    line = line[:-2] + '\n'
-	source = source + line
-	try:
-	    code = compile_command(source)
-	except SyntaxError, err:
-	    source = ""
-	    traceback.print_exception(SyntaxError, err, None, file=stdout)
-	    continue
-	if not code:
-	    continue
-	source = ""
-	try:
-	    run_command(code, stdin, stdout, globals)
-	except SystemExit, how:
-	    if how:
-		try:
-		    how = str(how)
-		except:
-		    how = ""
-		stdout.write("Exit %s\n" % how)
-	    break
+        stdout.write(sys.ps1)
+        line = stdin.readline()
+        if line[:2] == '\377\354':
+            line = ""
+        if not line and not source:
+            break
+        if line[-2:] == '\r\n':
+            line = line[:-2] + '\n'
+        source = source + line
+        try:
+            code = compile_command(source)
+        except SyntaxError, err:
+            source = ""
+            traceback.print_exception(SyntaxError, err, None, file=stdout)
+            continue
+        if not code:
+            continue
+        source = ""
+        try:
+            run_command(code, stdin, stdout, globals)
+        except SystemExit, how:
+            if how:
+                try:
+                    how = str(how)
+                except:
+                    how = ""
+                stdout.write("Exit %s\n" % how)
+            break
     stdout.write("\nGoodbye.\n")
 
 def run_command(code, stdin, stdout, globals):
-	save = sys.stdin, sys.stdout, sys.stderr
-	try:
-	    sys.stdout = sys.stderr = stdout
-	    sys.stdin = stdin
-	    try:
-		exec code in globals
-	    except SystemExit, how:
-		raise SystemExit, how, sys.exc_info()[2]
-	    except:
-		type, value, tb = sys.exc_info()
-		if tb: tb = tb.tb_next
-		traceback.print_exception(type, value, tb)
-		del tb
-	finally:
-	    sys.stdin, sys.stdout, sys.stderr = save
+    save = sys.stdin, sys.stdout, sys.stderr
+    try:
+        sys.stdout = sys.stderr = stdout
+        sys.stdin = stdin
+        try:
+            exec code in globals
+        except SystemExit, how:
+            raise SystemExit, how, sys.exc_info()[2]
+        except:
+            type, value, tb = sys.exc_info()
+            if tb: tb = tb.tb_next
+            traceback.print_exception(type, value, tb)
+            del tb
+    finally:
+        sys.stdin, sys.stdout, sys.stderr = save
 
 from code import compile_command
 
diff --git a/Demo/rpc/nfsclient.py b/Demo/rpc/nfsclient.py
index 498e2d0..1bd5d0d 100644
--- a/Demo/rpc/nfsclient.py
+++ b/Demo/rpc/nfsclient.py
@@ -96,22 +96,22 @@
 		return status, attributes
 
 	def unpack_fattr(self):
-              type = self.unpack_enum()
-              mode = self.unpack_uint()
-              nlink = self.unpack_uint()
-              uid = self.unpack_uint()
-              gid = self.unpack_uint()
-              size = self.unpack_uint()
-              blocksize = self.unpack_uint()
-              rdev = self.unpack_uint()
-              blocks = self.unpack_uint()
-              fsid = self.unpack_uint()
-              fileid = self.unpack_uint()
-              atime = self.unpack_timeval()
-              mtime = self.unpack_timeval()
-              ctime = self.unpack_timeval()
-	      return (type, mode, nlink, uid, gid, size, blocksize, \
-		      rdev, blocks, fsid, fileid, atime, mtime, ctime)
+		type = self.unpack_enum()
+		mode = self.unpack_uint()
+		nlink = self.unpack_uint()
+		uid = self.unpack_uint()
+		gid = self.unpack_uint()
+		size = self.unpack_uint()
+		blocksize = self.unpack_uint()
+		rdev = self.unpack_uint()
+		blocks = self.unpack_uint()
+		fsid = self.unpack_uint()
+		fileid = self.unpack_uint()
+		atime = self.unpack_timeval()
+		mtime = self.unpack_timeval()
+		ctime = self.unpack_timeval()
+		return (type, mode, nlink, uid, gid, size, blocksize, \
+			rdev, blocks, fsid, fileid, atime, mtime, ctime)
 
 	def unpack_timeval(self):
 		secs = self.unpack_uint()
diff --git a/Demo/scripts/ftpstats.py b/Demo/scripts/ftpstats.py
index e931751..28b1d8b 100755
--- a/Demo/scripts/ftpstats.py
+++ b/Demo/scripts/ftpstats.py
@@ -53,44 +53,45 @@
 	bytype = {}
 	lineno = 0
 	try:
-	    while 1:
-		line = f.readline()
-		if not line: break
-		lineno = lineno + 1
-		if search and string.find(line, search) < 0:
-			continue
-		if prog.match(line) < 0:
-			print 'Bad line', lineno, ':', `line`
-			continue
-		items = prog.group(1, 2, 3, 4, 5, 6)
-		logtime, loguser, loghost, logfile, logbytes, logxxx2 = items
-##		print logtime
-##		print '-->', loguser
-##		print '--> -->', loghost
-##		print '--> --> -->', logfile
-##		print '--> --> --> -->', logbytes
-##		print '--> --> --> --> -->', logxxx2
-##		for i in logtime, loghost, logbytes, logxxx2:
-##			if '!' in i: print '???', i
-		add(bydate, logtime[-4:] + ' ' + logtime[:6], items)
-		add(bytime, logtime[7:9] + ':00-59', items)
-		direction, logfile = logfile[0], logfile[1:]
-		# The real path probably starts at the last //...
 		while 1:
-			i = string.find(logfile, '//')
-			if i < 0: break
-			logfile = logfile[i+1:]
-		add(byfile, logfile + ' ' + direction, items)
-		logdir = os.path.dirname(logfile)
+			line = f.readline()
+			if not line: break
+			lineno = lineno + 1
+			if search and string.find(line, search) < 0:
+				continue
+			if prog.match(line) < 0:
+				print 'Bad line', lineno, ':', `line`
+				continue
+			items = prog.group(1, 2, 3, 4, 5, 6)
+			(logtime, loguser, loghost, logfile, logbytes,
+			 logxxx2) = items
+## 			print logtime
+## 			print '-->', loguser
+## 			print '--> -->', loghost
+## 			print '--> --> -->', logfile
+## 			print '--> --> --> -->', logbytes
+## 			print '--> --> --> --> -->', logxxx2
+## 			for i in logtime, loghost, logbytes, logxxx2:
+## 				if '!' in i: print '???', i
+			add(bydate, logtime[-4:] + ' ' + logtime[:6], items)
+			add(bytime, logtime[7:9] + ':00-59', items)
+			direction, logfile = logfile[0], logfile[1:]
+			# The real path probably starts at the last //...
+			while 1:
+				i = string.find(logfile, '//')
+				if i < 0: break
+				logfile = logfile[i+1:]
+			add(byfile, logfile + ' ' + direction, items)
+			logdir = os.path.dirname(logfile)
 ##		logdir = os.path.normpath(logdir) + '/.'
-		while 1:
-			add(bydir, logdir + ' ' + direction, items)
-			dirhead = os.path.dirname(logdir)
-			if dirhead == logdir: break
-			logdir = dirhead
-		add(byhost, loghost, items)
-		add(byuser, loguser, items)
-		add(bytype, direction, items)
+			while 1:
+				add(bydir, logdir + ' ' + direction, items)
+				dirhead = os.path.dirname(logdir)
+				if dirhead == logdir: break
+				logdir = dirhead
+			add(byhost, loghost, items)
+			add(byuser, loguser, items)
+			add(bytype, direction, items)
 	except KeyboardInterrupt:
 		print 'Interrupted at line', lineno
 	show(bytype, 'by transfer direction', maxitems)
diff --git a/Demo/scripts/newslist.py b/Demo/scripts/newslist.py
index 59ffde4..f78ca30 100755
--- a/Demo/scripts/newslist.py
+++ b/Demo/scripts/newslist.py
@@ -96,11 +96,11 @@
 #######################################################################
 
 for dir in os.curdir, os.environ['HOME']:
-	rcfile = os.path.join(dir, '.newslistrc.py')
-	if os.path.exists(rcfile):
-		print rcfile
-		execfile(rcfile)
-		break
+    rcfile = os.path.join(dir, '.newslistrc.py')
+    if os.path.exists(rcfile):
+        print rcfile
+        execfile(rcfile)
+        break
 
 from nntplib import NNTP
 from stat import *
@@ -120,8 +120,8 @@
 def addtotree(tree, groups):
    print 'Updating tree...'
    for i in groups:
-	parts = string.splitfields(i,'.')
-	makeleaf(tree, parts)
+        parts = string.splitfields(i,'.')
+        makeleaf(tree, parts)
 
 # Makeleaf makes a leaf and the branch leading to it if necessary
 def makeleaf(tree,path):
@@ -135,7 +135,7 @@
    if l > 1:
       makeleaf(tree[j],path[1:])
 
-# Then the bits for outputting trees as pages ----------------	
+# Then the bits for outputting trees as pages ----------------  
 
 # Createpage creates an HTML file named <root>.html containing links
 # to those groups beginning with <root>.
@@ -177,24 +177,24 @@
    if l > 1:
       kl.sort()
       if indent > 0:
-	 # Create a sub-list
-	 f.write('<LI>'+p[1:]+'\n<UL>')
+         # Create a sub-list
+         f.write('<LI>'+p[1:]+'\n<UL>')
       else:
-	 # Create a main list
-	 f.write('<UL>')
+         # Create a main list
+         f.write('<UL>')
       indent = indent + 1
    
    for i in kl:
       if i == '.':
-	 # Output a newsgroup
-	 f.write('<LI><A HREF="news:' + p[1:] + '">'+ p[1:] + '</A> ')
-	 if desc.has_key(p[1:]):
-	    f.write('     <I>'+desc[p[1:]]+'</I>\n')
-	 else:
-	    f.write('\n')
+         # Output a newsgroup
+         f.write('<LI><A HREF="news:' + p[1:] + '">'+ p[1:] + '</A> ')
+         if desc.has_key(p[1:]):
+            f.write('     <I>'+desc[p[1:]]+'</I>\n')
+         else:
+            f.write('\n')
       else:
-	 # Output a hierarchy
-	 printtree(f,tree[i], indent, p+'.'+i)
+         # Output a hierarchy
+         printtree(f,tree[i], indent, p+'.'+i)
 
    if l > 1:
       f.write('\n</UL>')
@@ -209,7 +209,7 @@
    desc = {}
 
    if descfile == '':
-	return
+        return
 
    try:
       d = open(descfile, 'r')
@@ -221,12 +221,12 @@
    while l != '':
       bits = string.split(l)
       try:
-	 grp = bits[0]
-	 dsc = string.join(bits[1:])
-	 if len(dsc)>1:
-	    desc[grp] = dsc
+         grp = bits[0]
+         dsc = string.join(bits[1:])
+         if len(dsc)>1:
+            desc[grp] = dsc
       except (IndexError):
-	 pass
+         pass
       l = d.readline()
 
 # Check that ouput directory exists, ------------------------------
@@ -237,14 +237,14 @@
       print 'Directory '+pagedir+' does not exist.'
       print 'Shall I create it for you? (y/n)'
       if sys.stdin.readline()[0] == 'y':
-	 try:
-	    os.mkdir(pagedir,0777)
-	 except:
-	    print 'Sorry - failed!'
-	    sys.exit(1)
+         try:
+            os.mkdir(pagedir,0777)
+         except:
+            print 'Sorry - failed!'
+            sys.exit(1)
       else:
-	 print 'OK. Exiting.'
-	 sys.exit(1)
+         print 'OK. Exiting.'
+         sys.exit(1)
 
 # Read and write current local tree ----------------------------------
 
@@ -252,19 +252,19 @@
       print 'Reading current local group list...'
       tree = {}
       try:
-	 treetime = time.localtime(os.stat(treefile)[ST_MTIME])
+         treetime = time.localtime(os.stat(treefile)[ST_MTIME])
       except:
-	 print '\n*** Failed to open local group cache '+treefile
-	 print 'If this is the first time you have run newslist, then'
-	 print 'use the -a option to create it.'
-	 sys.exit(1)
+         print '\n*** Failed to open local group cache '+treefile
+         print 'If this is the first time you have run newslist, then'
+         print 'use the -a option to create it.'
+         sys.exit(1)
       treedate = '%02d%02d%02d' % (treetime[0] % 100 ,treetime[1], treetime[2])
       try:
-	 dump = open(treefile,'r')
-	 tree = marshal.load(dump)
-	 dump.close()
+         dump = open(treefile,'r')
+         tree = marshal.load(dump)
+         dump.close()
       except (IOError):
-	 print 'Cannot open local group list ' + treefile
+         print 'Cannot open local group list ' + treefile
       return (tree, treedate)
 
 def writelocallist(treefile, tree):
@@ -291,9 +291,9 @@
    for i in info:
       grpname = string.split(i[0])[0]
       if skipempty and string.atoi(i[1]) < string.atoi(i[2]):
-	 print grpname+' ',
+         print grpname+' ',
       else:
-	 groups.append(grpname)
+         groups.append(grpname)
    print '\n'
    if skipempty:
       print '(End of empty groups)'
@@ -326,9 +326,9 @@
    try:
       print 'Connecting to '+newshost+'...'
       if sys.version[0] == '0':
-	 s = NNTP.init(newshost)
+         s = NNTP.init(newshost)
       else:
-	 s = NNTP(newshost)
+         s = NNTP(newshost)
       connected = 1
    except (nntplib.error_temp, nntplib.error_perm), x:
       print 'Error connecting to host:', x
@@ -346,7 +346,7 @@
 
       (tree, treedate) = readlocallist(treefile)
       if connected:
-	 groups = getnewgroups(s, treedate)
+         groups = getnewgroups(s, treedate)
       
    if connected:
       addtotree(tree, groups)
diff --git a/Demo/sgi/gl/glstdwin/glstdwin.py b/Demo/sgi/gl/glstdwin/glstdwin.py
index 2228554..b7d02c7 100644
--- a/Demo/sgi/gl/glstdwin/glstdwin.py
+++ b/Demo/sgi/gl/glstdwin/glstdwin.py
@@ -217,108 +217,108 @@
 commands['\t'] = WC_TAB
 #
 def getevent():
-  while 1:
-	#
-	# Get next event from the processed queue, if any
-	#
-	if G.queue:
-		event = G.queue[0]
-		del G.queue[0]
-		#print 'getevent from queue -->', event
-		return event
-	#
-	# Get next event from the draw queue, if any,
-	# but only if there is nothing in the system queue.
-	#
-	if G.drawqueue and not gl.qtest():
-		win = G.drawqueue[0]
-		del G.drawqueue[0]
-		gl.winset(win._gid)
-		gl.color(win._bg)
-		gl.clear()
-		event = WE_DRAW, win, win._area
-		#print 'getevent from drawqueue -->', event
-		return event
-	#
-	# Get next event from system queue, blocking if necessary
-	# until one is available.
-	# Some cases immediately return the event, others do nothing
-	# or append one or more events to the processed queue.
-	#
-	dev, val = gl.qread()
-	#
-	if dev == REDRAW:
-		win = G.windowmap[`val`]
-		old_area = win._area
-		win._fixviewport()
-		win._needredraw()
-		if old_area <> win._area:
-			#print 'getevent --> WE_SIZE'
-			return WE_SIZE, win, None
-	elif dev == KEYBD:
-		if val == 3:
-			raise KeyboardInterrupt # Control-C in window
-		character = chr(val)
-		if commands.has_key(character):
-			return WE_COMMAND, G.focus, commands[character]
-		return WE_CHAR, G.focus, character
-	elif dev == LEFTARROWKEY:
-		if val:
-			return WE_COMMAND, G.focus, WC_LEFT
-	elif dev == RIGHTARROWKEY:
-		if val:
-			return WE_COMMAND, G.focus, WC_RIGHT
-	elif dev == UPARROWKEY:
-		if val:
-			return WE_COMMAND, G.focus, WC_UP
-	elif dev == DOWNARROWKEY:
-		if val:
-			return WE_COMMAND, G.focus, WC_DOWN
-	elif dev in (LEFTALTKEY, RIGHTALTKEY):
-		if val:
-			for code in codelist:
-				gl.qdevice(code)
+	while 1:
+		#
+		# Get next event from the processed queue, if any
+		#
+		if G.queue:
+			event = G.queue[0]
+			del G.queue[0]
+			#print 'getevent from queue -->', event
+			return event
+		#
+		# Get next event from the draw queue, if any,
+		# but only if there is nothing in the system queue.
+		#
+		if G.drawqueue and not gl.qtest():
+			win = G.drawqueue[0]
+			del G.drawqueue[0]
+			gl.winset(win._gid)
+			gl.color(win._bg)
+			gl.clear()
+			event = WE_DRAW, win, win._area
+			#print 'getevent from drawqueue -->', event
+			return event
+		#
+		# Get next event from system queue, blocking if necessary
+		# until one is available.
+		# Some cases immediately return the event, others do nothing
+		# or append one or more events to the processed queue.
+		#
+		dev, val = gl.qread()
+		#
+		if dev == REDRAW:
+			win = G.windowmap[`val`]
+			old_area = win._area
+			win._fixviewport()
+			win._needredraw()
+			if old_area <> win._area:
+				#print 'getevent --> WE_SIZE'
+				return WE_SIZE, win, None
+		elif dev == KEYBD:
+			if val == 3:
+				raise KeyboardInterrupt # Control-C in window
+			character = chr(val)
+			if commands.has_key(character):
+				return WE_COMMAND, G.focus, commands[character]
+			return WE_CHAR, G.focus, character
+		elif dev == LEFTARROWKEY:
+			if val:
+				return WE_COMMAND, G.focus, WC_LEFT
+		elif dev == RIGHTARROWKEY:
+			if val:
+				return WE_COMMAND, G.focus, WC_RIGHT
+		elif dev == UPARROWKEY:
+			if val:
+				return WE_COMMAND, G.focus, WC_UP
+		elif dev == DOWNARROWKEY:
+			if val:
+				return WE_COMMAND, G.focus, WC_DOWN
+		elif dev in (LEFTALTKEY, RIGHTALTKEY):
+			if val:
+				for code in codelist:
+					gl.qdevice(code)
+			else:
+				for code in codelist:
+					gl.unqdevice(code)
+		elif dev in codelist:
+			if val:
+				event = G.focus._doshortcut(code2key[`dev`])
+				if event:
+					return event
+		elif dev == LEFTMOUSE:
+			G.mousex = gl.getvaluator(MOUSEX)
+			G.mousey = gl.getvaluator(MOUSEY)
+			if val:
+				type = WE_MOUSE_DOWN
+				gl.qdevice(MOUSEX)
+				gl.qdevice(MOUSEY)
+			else:
+				type = WE_MOUSE_UP
+				gl.unqdevice(MOUSEX)
+				gl.unqdevice(MOUSEY)
+			return _mouseevent(type)
+		elif dev == MOUSEX:
+			G.mousex = val
+			return _mouseevent(WE_MOUSE_MOVE)
+		elif dev == MOUSEY:
+			G.mousey = val
+			return _mouseevent(WE_MOUSE_MOVE)
+		elif dev == RIGHTMOUSE:		# Menu button press/release
+			if val:			# Press
+				event = G.focus._domenu()
+				if event:
+					return event
+		elif dev == INPUTCHANGE:
+			if G.focus:
+				G.queue.append(WE_DEACTIVATE, G.focus, None)
+			G.focus = G.windowmap[`val`]
+			if G.focus:
+				G.queue.append(WE_ACTIVATE, G.focus, None)
+		elif dev in (WINSHUT, WINQUIT):
+			return WE_CLOSE, G.windowmap[`val`], None
 		else:
-			for code in codelist:
-				gl.unqdevice(code)
-	elif dev in codelist:
-		if val:
-			event = G.focus._doshortcut(code2key[`dev`])
-			if event:
-				return event
-	elif dev == LEFTMOUSE:
-		G.mousex = gl.getvaluator(MOUSEX)
-		G.mousey = gl.getvaluator(MOUSEY)
-		if val:
-			type = WE_MOUSE_DOWN
-			gl.qdevice(MOUSEX)
-			gl.qdevice(MOUSEY)
-		else:
-			type = WE_MOUSE_UP
-			gl.unqdevice(MOUSEX)
-			gl.unqdevice(MOUSEY)
-		return _mouseevent(type)
-	elif dev == MOUSEX:
-		G.mousex = val
-		return _mouseevent(WE_MOUSE_MOVE)
-	elif dev == MOUSEY:
-		G.mousey = val
-		return _mouseevent(WE_MOUSE_MOVE)
-	elif dev == RIGHTMOUSE:		# Menu button press/release
-		if val:			# Press
-			event = G.focus._domenu()
-			if event:
-				return event
-	elif dev == INPUTCHANGE:
-		if G.focus:
-			G.queue.append(WE_DEACTIVATE, G.focus, None)
-		G.focus = G.windowmap[`val`]
-		if G.focus:
-			G.queue.append(WE_ACTIVATE, G.focus, None)
-	elif dev in (WINSHUT, WINQUIT):
-		return WE_CLOSE, G.windowmap[`val`], None
-	else:
-		print '*** qread() --> dev:', dev, 'val:', val
+			print '*** qread() --> dev:', dev, 'val:', val
 
 # Helper routine to construct a mouse (up, move or down) event
 #
diff --git a/Demo/sgi/gl/kunst.py b/Demo/sgi/gl/kunst.py
index 6d9e04d..f37f979 100755
--- a/Demo/sgi/gl/kunst.py
+++ b/Demo/sgi/gl/kunst.py
@@ -17,37 +17,37 @@
 # Make a cylinder paralel with the Z axis with center (X,Y,0)
 # and radius 1
 def mkcyl(nslice, nparts, docircle):
-	cyl = []
-	step = 2.0 / float(nslice)
-	z = -1.0
-	for i in range(nslice):
-	    cyl.append(mkslice(z, z+step, nparts, docircle))
-	    z = z + step
-	return drawcylinder(cyl)
+        cyl = []
+        step = 2.0 / float(nslice)
+        z = -1.0
+        for i in range(nslice):
+            cyl.append(mkslice(z, z+step, nparts, docircle))
+            z = z + step
+        return drawcylinder(cyl)
 #
 # Make one part of a cylinder
 #
 def mkslice(z1, z2, nparts, docircle):
-	if docircle:
-	    w1 = z1
-	    w2 = z2
-	    w1 = sqrt(1.0-w1*w1)
-	    w2 = sqrt(1.0-w2*w2)
-	    normalz = 1.0
-	else:
-	    w1 = 1.0
-	    w2 = 1.0
-	    normalz = 0.0
-	slice = []
-	step = (2.0*pi)/float(nparts)
-	angle = 0.0
-	for i in range(nparts+1):
-	    vx = cos(angle)
-	    vy = sin(angle)
-	    slice.append( ((vx*w1,vy*w1,z1), (vx*w1, vy*w1, z1*normalz)) )
-	    slice.append( ((vx*w2,vy*w2,z2), (vx*w2, vy*w2, z2*normalz)) )
-	    angle = angle + step
-	return slice
+        if docircle:
+            w1 = z1
+            w2 = z2
+            w1 = sqrt(1.0-w1*w1)
+            w2 = sqrt(1.0-w2*w2)
+            normalz = 1.0
+        else:
+            w1 = 1.0
+            w2 = 1.0
+            normalz = 0.0
+        slice = []
+        step = (2.0*pi)/float(nparts)
+        angle = 0.0
+        for i in range(nparts+1):
+            vx = cos(angle)
+            vy = sin(angle)
+            slice.append( ((vx*w1,vy*w1,z1), (vx*w1, vy*w1, z1*normalz)) )
+            slice.append( ((vx*w2,vy*w2,z2), (vx*w2, vy*w2, z2*normalz)) )
+            angle = angle + step
+        return slice
 #
 # Drawcylinder : draw the cylinder
 #
@@ -55,370 +55,370 @@
 curobj = struct()
 curobj.curobj = 1
 def drawcylinder(cyl):
-	obj = curobj.curobj
-	curobj.curobj = curobj.curobj+1
-	makeobj(obj)
-	for slice in cyl:
-	    bgntmesh()
-	    vnarray(slice)
-	    endtmesh()
-	closeobj()
-	return obj
+        obj = curobj.curobj
+        curobj.curobj = curobj.curobj+1
+        makeobj(obj)
+        for slice in cyl:
+            bgntmesh()
+            vnarray(slice)
+            endtmesh()
+        closeobj()
+        return obj
 #
 def drawnormals(cyl):
-	for slice in cyl:
-	    for triang in slice:
-		bgnline()
-		v3f(triang[0])
-		v3f(triang[0][0] + triang[1][0], triang[0][1] + triang[1][1], triang[0][2] + triang[1][2])
-		endline()
+        for slice in cyl:
+            for triang in slice:
+                bgnline()
+                v3f(triang[0])
+                v3f(triang[0][0] + triang[1][0], triang[0][1] + triang[1][1], triang[0][2] + triang[1][2])
+                endline()
 def drawfloors():
-	obj = curobj.curobj
-	curobj.curobj = curobj.curobj+1
-	makeobj(obj)
-	bgnpolygon()
-	v3i(4,6,-6)
-	v3i(-6,6,-6)
-	v3i(-6,-6,-6)
-	v3i(4,-6,-6)
-	endpolygon()
-	for floor in range(3):
-	    pos = -1 + 5*floor
-	    bgnpolygon()
-	    v3i(4,4,pos)
-	    v3i(-6,4,pos)
-	    v3i(-6,6,pos)
-	    v3i(4,6,pos)
-	    endpolygon()
-	    bgnpolygon()
-	    v3i(-4,4,pos)
-	    v3i(-4,-4,pos)
-	    v3i(-6,-4,pos)
-	    v3i(-6,4,pos)
-	    endpolygon()
-	    bgnpolygon()
-	    v3i(-6,-4,pos)
-	    v3i(-6,-6,pos)
-	    v3i(4,-6,pos)
-	    v3i(4,-4,pos)
-	    endpolygon()
-	closeobj()
-	return obj
+        obj = curobj.curobj
+        curobj.curobj = curobj.curobj+1
+        makeobj(obj)
+        bgnpolygon()
+        v3i(4,6,-6)
+        v3i(-6,6,-6)
+        v3i(-6,-6,-6)
+        v3i(4,-6,-6)
+        endpolygon()
+        for floor in range(3):
+            pos = -1 + 5*floor
+            bgnpolygon()
+            v3i(4,4,pos)
+            v3i(-6,4,pos)
+            v3i(-6,6,pos)
+            v3i(4,6,pos)
+            endpolygon()
+            bgnpolygon()
+            v3i(-4,4,pos)
+            v3i(-4,-4,pos)
+            v3i(-6,-4,pos)
+            v3i(-6,4,pos)
+            endpolygon()
+            bgnpolygon()
+            v3i(-6,-4,pos)
+            v3i(-6,-6,pos)
+            v3i(4,-6,pos)
+            v3i(4,-4,pos)
+            endpolygon()
+        closeobj()
+        return obj
 def drawdoors():
-	obj = curobj.curobj
-	curobj.curobj = curobj.curobj+1
-	makeobj(obj)
-	for floor in range(3):
-	    pos = -1+5*floor
-	    bgnpolygon()
-	    v3i(-2,6,pos)
-	    v3i(-2,6,pos+3)
-	    v3i(0,6,pos+3)
-	    v3i(0,6,pos)
-	    endpolygon()
-	closeobj()
-	return obj
+        obj = curobj.curobj
+        curobj.curobj = curobj.curobj+1
+        makeobj(obj)
+        for floor in range(3):
+            pos = -1+5*floor
+            bgnpolygon()
+            v3i(-2,6,pos)
+            v3i(-2,6,pos+3)
+            v3i(0,6,pos+3)
+            v3i(0,6,pos)
+            endpolygon()
+        closeobj()
+        return obj
 def drawrailing():
-	obj = curobj.curobj
-	curobj.curobj = curobj.curobj+1
-	makeobj(obj)
-	for floor in range(3):
-	    pos = -1 + 5*floor
-	    bgnpolygon()
-	    v3i(4,4,pos)
-	    v3i(4,4,pos-1)
-	    v3i(-4,4,pos-1)
-	    v3i(-4,4,pos)
-	    endpolygon()
-	    bgnpolygon()
-	    v3i(-4,4,pos)
-	    v3i(-4,4,pos-1)
-	    v3i(-4,-4,pos-1)
-	    v3i(-4,-4,pos)
-	    endpolygon()
-	    bgnpolygon()
-	    v3i(-4,-4,pos)
-	    v3i(-4,-4,pos-1)
-	    v3i(4,-4,pos-1)
-	    v3i(4,-4,pos)
-	    endpolygon()
-	closeobj()
-	return obj
+        obj = curobj.curobj
+        curobj.curobj = curobj.curobj+1
+        makeobj(obj)
+        for floor in range(3):
+            pos = -1 + 5*floor
+            bgnpolygon()
+            v3i(4,4,pos)
+            v3i(4,4,pos-1)
+            v3i(-4,4,pos-1)
+            v3i(-4,4,pos)
+            endpolygon()
+            bgnpolygon()
+            v3i(-4,4,pos)
+            v3i(-4,4,pos-1)
+            v3i(-4,-4,pos-1)
+            v3i(-4,-4,pos)
+            endpolygon()
+            bgnpolygon()
+            v3i(-4,-4,pos)
+            v3i(-4,-4,pos-1)
+            v3i(4,-4,pos-1)
+            v3i(4,-4,pos)
+            endpolygon()
+        closeobj()
+        return obj
 def drawwalls():
-	obj = curobj.curobj
-	curobj.curobj = curobj.curobj+1
-	makeobj(obj)
-	bgnpolygon()
-	v3i(4,6,-6)
-	v3i(4,6,18)
-	v3i(-6,6,18)
-	v3i(-6,6,-6)
-	endpolygon()
-	bgnpolygon()
-	v3i(-6,6,-6)
-	v3i(-6,6,18)
-	v3i(-6,-6,18)
-	v3i(-6,-6,-6)
-	endpolygon()
-	bgnpolygon()
-	v3i(-6,-6,-6)
-	v3i(-6,-6,18)
-	v3i(4,-6,18)
-	v3i(4,-6,-6)
-	endpolygon()
-	bgnpolygon()
-	v3i(4,-6,-6)
-	v3i(4,-6,18)
-	v3i(4,4,18)
-	v3i(4,4,-6)
-	endpolygon()
-	closeobj()
-	return obj
+        obj = curobj.curobj
+        curobj.curobj = curobj.curobj+1
+        makeobj(obj)
+        bgnpolygon()
+        v3i(4,6,-6)
+        v3i(4,6,18)
+        v3i(-6,6,18)
+        v3i(-6,6,-6)
+        endpolygon()
+        bgnpolygon()
+        v3i(-6,6,-6)
+        v3i(-6,6,18)
+        v3i(-6,-6,18)
+        v3i(-6,-6,-6)
+        endpolygon()
+        bgnpolygon()
+        v3i(-6,-6,-6)
+        v3i(-6,-6,18)
+        v3i(4,-6,18)
+        v3i(4,-6,-6)
+        endpolygon()
+        bgnpolygon()
+        v3i(4,-6,-6)
+        v3i(4,-6,18)
+        v3i(4,4,18)
+        v3i(4,4,-6)
+        endpolygon()
+        closeobj()
+        return obj
 def axis():
-	bgnline()
-	cpack(0xff0000)
-	v3i(-1,0,0)
-	v3i(1,0,0)
-	v3f(1.0, 0.1, 0.1)
-	endline()
-	bgnline()
-	cpack(0xff00)
-	v3i(0,-1,0)
-	v3i(0,1,0)
-	v3f(0.1, 1.0, 0.1)
-	endline()
-	bgnline()
-	cpack(0xff)
-	v3i(0,0,-1)
-	v3i(0,0,1)
-	v3f(0.1,0.1,1.0)
-	endline()
+        bgnline()
+        cpack(0xff0000)
+        v3i(-1,0,0)
+        v3i(1,0,0)
+        v3f(1.0, 0.1, 0.1)
+        endline()
+        bgnline()
+        cpack(0xff00)
+        v3i(0,-1,0)
+        v3i(0,1,0)
+        v3f(0.1, 1.0, 0.1)
+        endline()
+        bgnline()
+        cpack(0xff)
+        v3i(0,0,-1)
+        v3i(0,0,1)
+        v3f(0.1,0.1,1.0)
+        endline()
 #
 green_velvet = [ DIFFUSE, 0.05, 0.4, 0.05, LMNULL]
 silver = [ DIFFUSE, 0.3, 0.3, 0.3, SPECULAR, 0.9, 0.9, 0.95, \
-	SHININESS, 40.0, LMNULL]
+        SHININESS, 40.0, LMNULL]
 floormat = [ AMBIENT, 0.5, 0.25, 0.15, DIFFUSE, 0.5, 0.25, 0.15, SPECULAR, 0.6, 0.3, 0.2, SHININESS, 20.0, LMNULL]
 wallmat = [ DIFFUSE, 0.4, 0.2, 0.1, AMBIENT, 0.4, 0.20, 0.10, SPECULAR, 0.0, 0.0, 0.0, SHININESS, 20.0, LMNULL]
 offwhite = [ DIFFUSE, 0.8, 0.8, 0.6, AMBIENT, 0.8, 0.8, 0.6, SPECULAR, 0.9, 0.9, 0.9, SHININESS, 30.0, LMNULL]
 doormat = [ DIFFUSE, 0.1, 0.2, 0.5, AMBIENT, 0.2, 0.4, 1.0, SPECULAR, 0.2, 0.4, 1.0, SHININESS, 60.0, LMNULL]
 
 toplight = [ LCOLOR, 1.0, 1.0, 0.5, \
-	POSITION, 0.0, 0.0, 11.0, 1.0, LMNULL]
+        POSITION, 0.0, 0.0, 11.0, 1.0, LMNULL]
 floor1light = [ LCOLOR, 1.0, 1.0, 1.0, POSITION, 3.9, -3.9, 0.0, 1.0, \
-	SPOTDIRECTION, 1.0, 1.0, 0.0, SPOTLIGHT, 10.0, 90.0, LMNULL]
+        SPOTDIRECTION, 1.0, 1.0, 0.0, SPOTLIGHT, 10.0, 90.0, LMNULL]
 
 lmodel = [ AMBIENT, 0.92, 0.8, 0.5, LOCALVIEWER, 1.0, LMNULL]
 #
 def lighting():
-	lmdef(DEFMATERIAL, 1, green_velvet)
-	lmdef(DEFMATERIAL, 2, silver)
-	lmdef(DEFMATERIAL, 3, floormat)
-	lmdef(DEFMATERIAL, 4, wallmat)
-	lmdef(DEFMATERIAL, 5, offwhite)
-	lmdef(DEFMATERIAL, 6, doormat)
-	lmdef(DEFLIGHT, 1, toplight)
-	lmdef(DEFLIGHT, 2, floor1light)
-	lmdef(DEFLMODEL, 1, lmodel)
-	lmbind(MATERIAL, 1)
-	lmbind(LIGHT0, 1)
-	lmbind(LIGHT1, 2)
-	lmbind(LMODEL, 1)
+        lmdef(DEFMATERIAL, 1, green_velvet)
+        lmdef(DEFMATERIAL, 2, silver)
+        lmdef(DEFMATERIAL, 3, floormat)
+        lmdef(DEFMATERIAL, 4, wallmat)
+        lmdef(DEFMATERIAL, 5, offwhite)
+        lmdef(DEFMATERIAL, 6, doormat)
+        lmdef(DEFLIGHT, 1, toplight)
+        lmdef(DEFLIGHT, 2, floor1light)
+        lmdef(DEFLMODEL, 1, lmodel)
+        lmbind(MATERIAL, 1)
+        lmbind(LIGHT0, 1)
+        lmbind(LIGHT1, 2)
+        lmbind(LMODEL, 1)
 IdMat=[1.0,0.0,0.0,0.0, 0.0,1.0,0.0,0.0, 0.0,0.0,1.0,0.0, 0.0,0.0,0.0,1.0]
 #
 def defun(axis):
-	done = 0
-	while not done:
-	    print 'F'+axis+'(t) = ',
-	    s = sys.stdin.readline(100)
-	    print
-	    try:
-		s = 'def f'+axis+'(t): return '+s
-		exec(s, main_dict)
-		done = 1
-	    except RuntimeError:
-		print 'Sorry, there is a syntax error in your expression'
+        done = 0
+        while not done:
+            print 'F'+axis+'(t) = ',
+            s = sys.stdin.readline(100)
+            print
+            try:
+                s = 'def f'+axis+'(t): return '+s
+                exec(s, main_dict)
+                done = 1
+            except RuntimeError:
+                print 'Sorry, there is a syntax error in your expression'
 def getfunctions():
-	print 'Welcome to the CWI art simulator. You can now enter X, Y and Z'
-	print 'coordinates as a function of t.'
-	print 'Normal trig functions are available. Please use floating point'
-	print 'values only (so 0.0 for 0). Comments to jack@cwi.nl'
-	defun('x')
-	defun('y')
-	defun('z')
-	print 'Ok, here you go. Use mouse+right button to move up/down,'
-	print 'mouse+middle to speed up/slow down time. type ESC to quit simulation'
+        print 'Welcome to the CWI art simulator. You can now enter X, Y and Z'
+        print 'coordinates as a function of t.'
+        print 'Normal trig functions are available. Please use floating point'
+        print 'values only (so 0.0 for 0). Comments to jack@cwi.nl'
+        defun('x')
+        defun('y')
+        defun('z')
+        print 'Ok, here you go. Use mouse+right button to move up/down,'
+        print 'mouse+middle to speed up/slow down time. type ESC to quit simulation'
 def main():
-	getfunctions()
-	foreground()
-	prefposition(100,600,100,600)
-	void = winopen('cyl')
-	qdevice(ESCKEY)
-	qdevice(MOUSE1)
-	qdevice(MOUSE2)
-	qdevice(PKEY)
-	RGBmode()
-	doublebuffer()
-	gconfig()
-	zbuffer(1)
-	mmode(MVIEWING)
-	perspective(400, 1.0, 1.0, 20.0)
-	loadmatrix(IdMat)
-	vx = 0.0
-	vy = -6.0
-	vz = 0.0
-	lookat(0.0, -6.0, 0.0, 0.0, 0.0, 0.0, 0)
-	lighting()
-	t = -1.0
-	step = 1.0
-	bol = mkcyl(12,24, 1)
-	cable = mkcyl(1, 6, 0)
-	floors = drawfloors()
-	walls = drawwalls()
-	pillar = mkcyl(1,4,0)
-	railing = drawrailing()
-	doors = drawdoors()
-	shademodel(GOURAUD)
-	mousing = -1
-	pausing = 0
-	while 1:
-	    #
-	    # Check for some user input
-	    #
-	    if qtest():
-		dev, value = qread()
-		if dev == PKEY and value == 1:
-			pausing = 1
-		if dev == ESCKEY:
-		    break
-		elif (dev==MOUSE1 or dev==MOUSE2) and value == 1:
-		    if mousing > 0:
-			vx = 0.0
-			vy = -6.0
-			vz = 0.0
-		    mousing = dev
-		    oldx = getvaluator(MOUSEX)
-		    oldy = getvaluator(MOUSEY)
-		elif (dev==MOUSE1 or dev==MOUSE2):
-		    mousing = -1
-	    if mousing >= 0:
-		newx = getvaluator(MOUSEX)
-		newy = getvaluator(MOUSEY)
-		if newy <> oldy and mousing==MOUSE1:
-		    vz = vz + float(newy - oldy)/100.0
-		    dist = sqrt(vx*vx + vy*vy + vz*vz)
-		    perspective(400, 1.0, 1.0, dist+16.0)
-		    loadmatrix(IdMat)
-		    if vz < 0.0:
-			lookat(vx, vy, vz, 0.0, 0.0, 0.0, 1800)
-		    else:
-			lookat(vx, vy, vz, 0.0, 0.0, 0.0, 0)
-		if newy <> oldy and mousing==MOUSE2:
-		    step = step * exp(float(newy-oldy)/400.0)
-	    if getbutton(CTRLKEY) == 0:
-		t = t + step
-	    else:
-		t = t - step
-	    if getbutton(LEFTSHIFTKEY) == 0:
-		shademodel(GOURAUD)
-	    else:
-		shademodel(FLAT)
-	    #
-	    # Draw background and axis
-	    cpack(0x105090)
-	    clear()
-	    zclear()
-	    cpack(0x905010)
-	    axis()
-	    #
-	    # Draw object
-	    #
-	    bolx = fx(t)
-	    boly = fy(t)
-	    bolz = fz(t)
-	    err = ''
-	    if bolx < -4.0 or bolx > 4.0:
-		err = 'X('+`bolx`+') out of range [-4,4]'
-	    if boly < -4.0 or boly > 4.0:
-		err = 'Y('+`boly`+') out of range [-4,4]'
-	    if bolz < -4.0 or bolz > 8.0:
-		err = 'Z('+`bolz`+') out of range [-4,8]'
-	    if not err:
-		pushmatrix()
-		translate(bolx, boly, bolz)
-		scale(0.3, 0.3, 0.3)
-		lmbind(MATERIAL, 2)
-		callobj(bol)
-		popmatrix()
-		#
-		# Draw the cables
-		#
-		bolz = bolz + 0.3
-		pushmatrix()
-		linesmooth(SML_ON)
-		bgnline()
-		v3i(-4,-4,9)
-		v3f(bolx, boly, bolz)
-		endline()
-		bgnline()
-		v3i(-4,4,9)
-		v3f(bolx, boly, bolz)
-		endline()
-		bgnline()
-		v3i(4,-4,9)
-		v3f(bolx, boly, bolz)
-		endline()
-		bgnline()
-		v3i(4,4,9)
-		v3f(bolx, boly, bolz)
-		endline()
-		popmatrix()
-	    #
-	    # draw the floors
-	    #
-	    lmbind(MATERIAL, 3)
-	    callobj(floors)
-	    lmbind(MATERIAL, 4)
-	    callobj(walls)
-	    lmbind(MATERIAL, 5)
-	    pushmatrix()
-	    translate(-4.5,4.5,3.0)
-	    scale(0.2,0.2,9.0)
-	    rotate(450,'z')
-	    callobj(pillar)
-	    popmatrix()
-	    callobj(railing)
-	    lmbind(MATERIAL, 6)
-	    pushmatrix()
-	    translate(0.0, -0.01, 0.0)
-	    callobj(doors)
-	    popmatrix()
-	    if mousing == MOUSE2 or err:
-		cpack(0xff0000)
-		cmov(0.0, 0.0, 0.4)
-		charstr('t='+`t`)
-	    if mousing == MOUSE2:
-		cpack(0xff0000)
-		cmov(0.0, 0.0, 0.2)
-		charstr('delta-t='+`step`)
-	    if err:
-		cpack(0xff00)
-		cmov(0.0, 0.0, 0.2)
-		print err
-		charstr(err)
-		pausing = 1
-	    if pausing:
-		cpack(0xff00)
-		cmov(0.0, 0.0, 0.0)
-		charstr('Pausing, type P to continue')
-	    swapbuffers()
-	    if pausing:
-		while 1:
-		    dv=qread()
-		    if dv==(PKEY,1):
-			break
-		    if dv==(ESCKEY,1):
-			sys.exit(0)
-		pausing = 0
+        getfunctions()
+        foreground()
+        prefposition(100,600,100,600)
+        void = winopen('cyl')
+        qdevice(ESCKEY)
+        qdevice(MOUSE1)
+        qdevice(MOUSE2)
+        qdevice(PKEY)
+        RGBmode()
+        doublebuffer()
+        gconfig()
+        zbuffer(1)
+        mmode(MVIEWING)
+        perspective(400, 1.0, 1.0, 20.0)
+        loadmatrix(IdMat)
+        vx = 0.0
+        vy = -6.0
+        vz = 0.0
+        lookat(0.0, -6.0, 0.0, 0.0, 0.0, 0.0, 0)
+        lighting()
+        t = -1.0
+        step = 1.0
+        bol = mkcyl(12,24, 1)
+        cable = mkcyl(1, 6, 0)
+        floors = drawfloors()
+        walls = drawwalls()
+        pillar = mkcyl(1,4,0)
+        railing = drawrailing()
+        doors = drawdoors()
+        shademodel(GOURAUD)
+        mousing = -1
+        pausing = 0
+        while 1:
+            #
+            # Check for some user input
+            #
+            if qtest():
+                dev, value = qread()
+                if dev == PKEY and value == 1:
+                        pausing = 1
+                if dev == ESCKEY:
+                    break
+                elif (dev==MOUSE1 or dev==MOUSE2) and value == 1:
+                    if mousing > 0:
+                        vx = 0.0
+                        vy = -6.0
+                        vz = 0.0
+                    mousing = dev
+                    oldx = getvaluator(MOUSEX)
+                    oldy = getvaluator(MOUSEY)
+                elif (dev==MOUSE1 or dev==MOUSE2):
+                    mousing = -1
+            if mousing >= 0:
+                newx = getvaluator(MOUSEX)
+                newy = getvaluator(MOUSEY)
+                if newy <> oldy and mousing==MOUSE1:
+                    vz = vz + float(newy - oldy)/100.0
+                    dist = sqrt(vx*vx + vy*vy + vz*vz)
+                    perspective(400, 1.0, 1.0, dist+16.0)
+                    loadmatrix(IdMat)
+                    if vz < 0.0:
+                        lookat(vx, vy, vz, 0.0, 0.0, 0.0, 1800)
+                    else:
+                        lookat(vx, vy, vz, 0.0, 0.0, 0.0, 0)
+                if newy <> oldy and mousing==MOUSE2:
+                    step = step * exp(float(newy-oldy)/400.0)
+            if getbutton(CTRLKEY) == 0:
+                t = t + step
+            else:
+                t = t - step
+            if getbutton(LEFTSHIFTKEY) == 0:
+                shademodel(GOURAUD)
+            else:
+                shademodel(FLAT)
+            #
+            # Draw background and axis
+            cpack(0x105090)
+            clear()
+            zclear()
+            cpack(0x905010)
+            axis()
+            #
+            # Draw object
+            #
+            bolx = fx(t)
+            boly = fy(t)
+            bolz = fz(t)
+            err = ''
+            if bolx < -4.0 or bolx > 4.0:
+                err = 'X('+`bolx`+') out of range [-4,4]'
+            if boly < -4.0 or boly > 4.0:
+                err = 'Y('+`boly`+') out of range [-4,4]'
+            if bolz < -4.0 or bolz > 8.0:
+                err = 'Z('+`bolz`+') out of range [-4,8]'
+            if not err:
+                pushmatrix()
+                translate(bolx, boly, bolz)
+                scale(0.3, 0.3, 0.3)
+                lmbind(MATERIAL, 2)
+                callobj(bol)
+                popmatrix()
+                #
+                # Draw the cables
+                #
+                bolz = bolz + 0.3
+                pushmatrix()
+                linesmooth(SML_ON)
+                bgnline()
+                v3i(-4,-4,9)
+                v3f(bolx, boly, bolz)
+                endline()
+                bgnline()
+                v3i(-4,4,9)
+                v3f(bolx, boly, bolz)
+                endline()
+                bgnline()
+                v3i(4,-4,9)
+                v3f(bolx, boly, bolz)
+                endline()
+                bgnline()
+                v3i(4,4,9)
+                v3f(bolx, boly, bolz)
+                endline()
+                popmatrix()
+            #
+            # draw the floors
+            #
+            lmbind(MATERIAL, 3)
+            callobj(floors)
+            lmbind(MATERIAL, 4)
+            callobj(walls)
+            lmbind(MATERIAL, 5)
+            pushmatrix()
+            translate(-4.5,4.5,3.0)
+            scale(0.2,0.2,9.0)
+            rotate(450,'z')
+            callobj(pillar)
+            popmatrix()
+            callobj(railing)
+            lmbind(MATERIAL, 6)
+            pushmatrix()
+            translate(0.0, -0.01, 0.0)
+            callobj(doors)
+            popmatrix()
+            if mousing == MOUSE2 or err:
+                cpack(0xff0000)
+                cmov(0.0, 0.0, 0.4)
+                charstr('t='+`t`)
+            if mousing == MOUSE2:
+                cpack(0xff0000)
+                cmov(0.0, 0.0, 0.2)
+                charstr('delta-t='+`step`)
+            if err:
+                cpack(0xff00)
+                cmov(0.0, 0.0, 0.2)
+                print err
+                charstr(err)
+                pausing = 1
+            if pausing:
+                cpack(0xff00)
+                cmov(0.0, 0.0, 0.0)
+                charstr('Pausing, type P to continue')
+            swapbuffers()
+            if pausing:
+                while 1:
+                    dv=qread()
+                    if dv==(PKEY,1):
+                        break
+                    if dv==(ESCKEY,1):
+                        sys.exit(0)
+                pausing = 0
 #
 try:
     main()
diff --git a/Demo/threads/sync.py b/Demo/threads/sync.py
index 3ad0fff..a8556c4 100644
--- a/Demo/threads/sync.py
+++ b/Demo/threads/sync.py
@@ -474,16 +474,16 @@
         self.rwOK.release()
 
     def write_to_read(self):
-	self.rwOK.acquire()
-	if not self.writing:
-	    raise ValueError, \
-		  '.write_to_read() invoked without an active writer'
-	self.writing = 0
-	self.nw = self.nw - 1
-	self.nr = self.nr + 1
-	if not self.nw:
-	    self.readOK.broadcast()
-	self.rwOK.release()
+        self.rwOK.acquire()
+        if not self.writing:
+            raise ValueError, \
+                  '.write_to_read() invoked without an active writer'
+        self.writing = 0
+        self.nw = self.nw - 1
+        self.nr = self.nr + 1
+        if not self.nw:
+            self.readOK.broadcast()
+        self.rwOK.release()
 
 # The rest of the file is a test case, that runs a number of parallelized
 # quicksorts in parallel.  If it works, you'll get about 600 lines of
diff --git a/Demo/zlib/minigzip.py b/Demo/zlib/minigzip.py
index 0bfe355..eefdc39 100755
--- a/Demo/zlib/minigzip.py
+++ b/Demo/zlib/minigzip.py
@@ -31,64 +31,64 @@
 
 if compressing:
     output.write('\037\213\010')        # Write the header, ...
-    output.write(chr(FNAME))		# ... flag byte ...
+    output.write(chr(FNAME))            # ... flag byte ...
 
-    import os				# ... modification time ...
+    import os                           # ... modification time ...
     statval=os.stat(filename)
     mtime=statval[8]
     write32(output, mtime)
-    output.write('\002')		# ... slowest compression alg. ...
-    output.write('\377')		# ... OS (=unknown) ...
-    output.write(filename+'\000')	# ... original filename ...
+    output.write('\002')                # ... slowest compression alg. ...
+    output.write('\377')                # ... OS (=unknown) ...
+    output.write(filename+'\000')       # ... original filename ...
 
     crcval=zlib.crc32("")
     compobj=zlib.compressobj(9, zlib.DEFLATED, -zlib.MAX_WBITS,
-			     zlib.DEF_MEM_LEVEL, 0)
+                             zlib.DEF_MEM_LEVEL, 0)
     while (1):
-	data=input.read(1024)
-	if data=="": break
-	crcval=zlib.crc32(data, crcval)
-	output.write(compobj.compress(data))
+        data=input.read(1024)
+        if data=="": break
+        crcval=zlib.crc32(data, crcval)
+        output.write(compobj.compress(data))
     output.write(compobj.flush())
-    write32(output, crcval)		# ... the CRC ...
-    write32(output, statval[6])		# and the file size.
+    write32(output, crcval)             # ... the CRC ...
+    write32(output, statval[6])         # and the file size.
 
 else:
     magic=input.read(2)
     if magic!='\037\213':
-	print 'Not a gzipped file' ; sys.exit(0)
+        print 'Not a gzipped file' ; sys.exit(0)
     if ord(input.read(1))!=8:
-	print 'Unknown compression method' ; sys.exit(0)
+        print 'Unknown compression method' ; sys.exit(0)
     flag=ord(input.read(1))
-    input.read(4+1+1)			# Discard modification time,
-					# extra flags, and OS byte.
+    input.read(4+1+1)                   # Discard modification time,
+                                        # extra flags, and OS byte.
     if flag & FEXTRA:
-	# Read & discard the extra field, if present
-	xlen=ord(input.read(1))		
-	xlen=xlen+256*ord(input.read(1))
-	input.read(xlen)
+        # Read & discard the extra field, if present
+        xlen=ord(input.read(1))         
+        xlen=xlen+256*ord(input.read(1))
+        input.read(xlen)
     if flag & FNAME:
-	# Read and discard a null-terminated string containing the filename
-	while (1):
-	    s=input.read(1)
-	    if s=='\000': break
+        # Read and discard a null-terminated string containing the filename
+        while (1):
+            s=input.read(1)
+            if s=='\000': break
     if flag & FCOMMENT:
-	# Read and discard a null-terminated string containing a comment
-	while (1):
-	    s=input.read(1)
-	    if s=='\000': break
+        # Read and discard a null-terminated string containing a comment
+        while (1):
+            s=input.read(1)
+            if s=='\000': break
     if flag & FHCRC:
-	input.read(2)			# Read & discard the 16-bit header CRC
+        input.read(2)                   # Read & discard the 16-bit header CRC
     decompobj=zlib.decompressobj(-zlib.MAX_WBITS)
     crcval=zlib.crc32("")
     length=0
     while (1):
-	data=input.read(1024)
-	if data=="": break
-	decompdata=decompobj.decompress(data)
-	print len(decompdata)
-	output.write(decompdata) ; length=length+len(decompdata)
-	crcval=zlib.crc32(decompdata, crcval)
+        data=input.read(1024)
+        if data=="": break
+        decompdata=decompobj.decompress(data)
+        print len(decompdata)
+        output.write(decompdata) ; length=length+len(decompdata)
+        crcval=zlib.crc32(decompdata, crcval)
     decompdata=decompobj.flush()
     output.write(decompdata) ; length=length+len(decompdata)
     crcval=zlib.crc32(decompdata, crcval)
