diff --git a/Lib/shelve.py b/Lib/shelve.py
index 807a0bb..a068536 100644
--- a/Lib/shelve.py
+++ b/Lib/shelve.py
@@ -10,19 +10,19 @@
 To summarize the interface (key is a string, data is an arbitrary
 object):
 
-	import shelve
-	d = shelve.open(filename) # open, with (g)dbm filename -- no suffix
+        import shelve
+        d = shelve.open(filename) # open, with (g)dbm filename -- no suffix
 
-	d[key] = data	# store data at key (overwrites old data if
-			# using an existing key)
-	data = d[key]	# retrieve data at key (raise KeyError if no
-			# such key)
-	del d[key]	# delete data stored at key (raises KeyError
-			# if no such key)
-	flag = d.has_key(key)	# true if the key exists
-	list = d.keys()	# a list of all existing keys (slow!)
+        d[key] = data   # store data at key (overwrites old data if
+                        # using an existing key)
+        data = d[key]   # retrieve data at key (raise KeyError if no
+                        # such key)
+        del d[key]      # delete data stored at key (raises KeyError
+                        # if no such key)
+        flag = d.has_key(key)   # true if the key exists
+        list = d.keys() # a list of all existing keys (slow!)
 
-	d.close()	# close it
+        d.close()       # close it
 
 Dependent on the implementation, closing a persistent dictionary may
 or may not be necessary to flush changes to disk.
@@ -31,127 +31,127 @@
 # Try using cPickle and cStringIO if available.
 
 try:
-	from cPickle import Pickler, Unpickler
+        from cPickle import Pickler, Unpickler
 except ImportError:
-	from pickle import Pickler, Unpickler
+        from pickle import Pickler, Unpickler
 
 try:
-	from cStringIO import StringIO
+        from cStringIO import StringIO
 except ImportError:
-	from StringIO import StringIO
+        from StringIO import StringIO
 
 
 class Shelf:
-	"""Base class for shelf implementations.
+        """Base class for shelf implementations.
 
-	This is initialized with a dictionary-like object.
-	See the module's __doc__ string for an overview of the interface.
-	"""
+        This is initialized with a dictionary-like object.
+        See the module's __doc__ string for an overview of the interface.
+        """
 
-	def __init__(self, dict):
-		self.dict = dict
-	
-	def keys(self):
-		return self.dict.keys()
-	
-	def __len__(self):
-		return len(self.dict)
-	
-	def has_key(self, key):
-		return self.dict.has_key(key)
+        def __init__(self, dict):
+                self.dict = dict
+        
+        def keys(self):
+                return self.dict.keys()
+        
+        def __len__(self):
+                return len(self.dict)
+        
+        def has_key(self, key):
+                return self.dict.has_key(key)
 
-	def get(self, key, default=None):
-	        if self.dict.has_key(key):
-			return self[key]
-		return default
-	
-	def __getitem__(self, key):
-		f = StringIO(self.dict[key])
-		return Unpickler(f).load()
-	
-	def __setitem__(self, key, value):
-		f = StringIO()
-		p = Pickler(f)
-		p.dump(value)
-		self.dict[key] = f.getvalue()
-	
-	def __delitem__(self, key):
-		del self.dict[key]
-	
-	def close(self):
-		try:
-			self.dict.close()
-		except:
-			pass
-		self.dict = 0
+        def get(self, key, default=None):
+                if self.dict.has_key(key):
+                        return self[key]
+                return default
+        
+        def __getitem__(self, key):
+                f = StringIO(self.dict[key])
+                return Unpickler(f).load()
+        
+        def __setitem__(self, key, value):
+                f = StringIO()
+                p = Pickler(f)
+                p.dump(value)
+                self.dict[key] = f.getvalue()
+        
+        def __delitem__(self, key):
+                del self.dict[key]
+        
+        def close(self):
+                try:
+                        self.dict.close()
+                except:
+                        pass
+                self.dict = 0
 
-	def __del__(self):
-		self.close()
+        def __del__(self):
+                self.close()
 
-	def sync(self):
-		if hasattr(self.dict, 'sync'):
-			self.dict.sync()
-	    
+        def sync(self):
+                if hasattr(self.dict, 'sync'):
+                        self.dict.sync()
+            
 
 class BsdDbShelf(Shelf):
-	"""Shelf implementation using the "BSD" db interface.
+        """Shelf implementation using the "BSD" db interface.
 
-	This adds methods first(), next(), previous(), last() and
-	set_location() that have no counterpart in [g]dbm databases.
+        This adds methods first(), next(), previous(), last() and
+        set_location() that have no counterpart in [g]dbm databases.
 
-	The actual database must be opened using one of the "bsddb"
-	modules "open" routines (i.e. bsddb.hashopen, bsddb.btopen or
-	bsddb.rnopen) and passed to the constructor.
+        The actual database must be opened using one of the "bsddb"
+        modules "open" routines (i.e. bsddb.hashopen, bsddb.btopen or
+        bsddb.rnopen) and passed to the constructor.
 
-	See the module's __doc__ string for an overview of the interface.
-	"""
+        See the module's __doc__ string for an overview of the interface.
+        """
 
-	def __init__(self, dict):
-	    Shelf.__init__(self, dict)
+        def __init__(self, dict):
+            Shelf.__init__(self, dict)
 
-	def set_location(self, key):
-	     (key, value) = self.dict.set_location(key)
-	     f = StringIO(value)
-	     return (key, Unpickler(f).load())
+        def set_location(self, key):
+             (key, value) = self.dict.set_location(key)
+             f = StringIO(value)
+             return (key, Unpickler(f).load())
 
-	def next(self):
-	     (key, value) = self.dict.next()
-	     f = StringIO(value)
-	     return (key, Unpickler(f).load())
+        def next(self):
+             (key, value) = self.dict.next()
+             f = StringIO(value)
+             return (key, Unpickler(f).load())
 
-	def previous(self):
-	     (key, value) = self.dict.previous()
-	     f = StringIO(value)
-	     return (key, Unpickler(f).load())
+        def previous(self):
+             (key, value) = self.dict.previous()
+             f = StringIO(value)
+             return (key, Unpickler(f).load())
 
-	def first(self):
-	     (key, value) = self.dict.first()
-	     f = StringIO(value)
-	     return (key, Unpickler(f).load())
+        def first(self):
+             (key, value) = self.dict.first()
+             f = StringIO(value)
+             return (key, Unpickler(f).load())
 
-	def last(self):
-	     (key, value) = self.dict.last()
-	     f = StringIO(value)
-	     return (key, Unpickler(f).load())
+        def last(self):
+             (key, value) = self.dict.last()
+             f = StringIO(value)
+             return (key, Unpickler(f).load())
 
 
 class DbfilenameShelf(Shelf):
-	"""Shelf implementation using the "anydbm" generic dbm interface.
+        """Shelf implementation using the "anydbm" generic dbm interface.
 
-	This is initialized with the filename for the dbm database.
-	See the module's __doc__ string for an overview of the interface.
-	"""
-	
-	def __init__(self, filename, flag='c'):
-		import anydbm
-		Shelf.__init__(self, anydbm.open(filename, flag))
+        This is initialized with the filename for the dbm database.
+        See the module's __doc__ string for an overview of the interface.
+        """
+        
+        def __init__(self, filename, flag='c'):
+                import anydbm
+                Shelf.__init__(self, anydbm.open(filename, flag))
 
 
 def open(filename, flag='c'):
-	"""Open a persistent dictionary for reading and writing.
+        """Open a persistent dictionary for reading and writing.
 
-	Argument is the filename for the dbm database.
-	See the module's __doc__ string for an overview of the interface.
-	"""
-	
-	return DbfilenameShelf(filename, flag)
+        Argument is the filename for the dbm database.
+        See the module's __doc__ string for an overview of the interface.
+        """
+        
+        return DbfilenameShelf(filename, flag)
