diff --git a/Demo/scripts/unbirthday.py b/Demo/scripts/unbirthday.py
index 2c515c4..e3b7be7 100755
--- a/Demo/scripts/unbirthday.py
+++ b/Demo/scripts/unbirthday.py
@@ -10,97 +10,97 @@
 import calendar
 
 def main():
-	# Note that the range checks below also check for bad types,
-	# e.g. 3.14 or ().  However syntactically invalid replies
-	# will raise an exception.
-	if sys.argv[1:]:
-		year = eval(sys.argv[1])
-	else:
-		year = input('In which year were you born? ')
-	if year in range(100):
-		print 'I\'ll assume that by', year,
-		year = year + 1900
-		print 'you mean', year, 'and not the early Christian era'
-	elif year not in range(1850, 2000):
-		print 'It\'s hard to believe you were born in', year
-		return
-	#
-	if sys.argv[2:]:
-		month = eval(sys.argv[2])
-	else:
-		month = input('And in which month? (1-12) ')
-	if month not in range(1, 13):
-		print 'There is no month numbered', month
-		return
-	#
-	if sys.argv[3:]:
-		day = eval(sys.argv[3])
-	else:
-		day = input('And on what day of that month? (1-31) ')
-	if month == 2 and calendar.isleap(year):
-		maxday = 29
-	else:
-		maxday = calendar.mdays[month]
-	if day not in range(1, maxday+1):
-		print 'There are no', day, 'days in that month!'
-		return
-	#
-	bdaytuple = (year, month, day)
-	bdaydate = mkdate(bdaytuple)
-	print 'You were born on', format(bdaytuple)
-	#
-	todaytuple = time.localtime(time.time())[:3]
-	todaydate = mkdate(todaytuple)
-	print 'Today is', format(todaytuple)
-	#
-	if bdaytuple > todaytuple:
-		print 'You are a time traveler.  Go back to the future!'
-		return
-	#
-	if bdaytuple == todaytuple:
-		print 'You were born today.  Have a nice life!'
-		return
-	#
-	days = todaydate - bdaydate
-	print 'You have lived', days, 'days'
-	#
-	age = 0
-	for y in range(year, todaytuple[0] + 1):
-		if bdaytuple < (y, month, day) <= todaytuple:
-			age = age + 1
-	#
-	print 'You are', age, 'years old'
-	#
-	if todaytuple[1:] == bdaytuple[1:]:
-		print 'Congratulations!  Today is your', nth(age), 'birthday'
-		print 'Yesterday was your',
-	else:
-		print 'Today is your',
-	print nth(days - age), 'unbirthday'
+    # Note that the range checks below also check for bad types,
+    # e.g. 3.14 or ().  However syntactically invalid replies
+    # will raise an exception.
+    if sys.argv[1:]:
+        year = int(sys.argv[1])
+    else:
+        year = int(raw_input('In which year were you born? '))
+    if 0<=year<100:
+        print "I'll assume that by", year,
+        year = year + 1900
+        print 'you mean', year, 'and not the early Christian era'
+    elif not (1850<=year<=2002):
+        print "It's hard to believe you were born in", year
+        return
+    #
+    if sys.argv[2:]:
+        month = int(sys.argv[2])
+    else:
+        month = int(raw_input('And in which month? (1-12) '))
+    if not (1<=month<=12):
+        print 'There is no month numbered', month
+        return
+    #
+    if sys.argv[3:]:
+        day = int(sys.argv[3])
+    else:
+        day = int(raw_input('And on what day of that month? (1-31) '))
+    if month == 2 and calendar.isleap(year):
+        maxday = 29
+    else:
+        maxday = calendar.mdays[month]
+    if not (1<=day<=maxday):
+        print 'There are no', day, 'days in that month!'
+        return
+    #
+    bdaytuple = (year, month, day)
+    bdaydate = mkdate(bdaytuple)
+    print 'You were born on', format(bdaytuple)
+    #
+    todaytuple = time.localtime()[:3]
+    todaydate = mkdate(todaytuple)
+    print 'Today is', format(todaytuple)
+    #
+    if bdaytuple > todaytuple:
+        print 'You are a time traveler.  Go back to the future!'
+        return
+    #
+    if bdaytuple == todaytuple:
+        print 'You were born today.  Have a nice life!'
+        return
+    #
+    days = todaydate - bdaydate
+    print 'You have lived', days, 'days'
+    #
+    age = 0
+    for y in range(year, todaytuple[0] + 1):
+        if bdaytuple < (y, month, day) <= todaytuple:
+            age = age + 1
+    #
+    print 'You are', age, 'years old'
+    #
+    if todaytuple[1:] == bdaytuple[1:]:
+        print 'Congratulations!  Today is your', nth(age), 'birthday'
+        print 'Yesterday was your',
+    else:
+        print 'Today is your',
+    print nth(days - age), 'unbirthday'
 
 def format((year, month, day)):
-	return '%d %s %d' % (day, calendar.month_name[month], year)
+    return '%d %s %d' % (day, calendar.month_name[month], year)
 
 def nth(n):
-	if n == 1: return '1st'
-	if n == 2: return '2nd'
-	if n == 3: return '3rd'
-	return '%dth' % n
+    if n == 1: return '1st'
+    if n == 2: return '2nd'
+    if n == 3: return '3rd'
+    return '%dth' % n
 
 def mkdate((year, month, day)):
-	# Januari 1st, in 0 A.D. is arbitrarily defined to be day 1,
-	# even though that day never actually existed and the calendar
-	# was different then...
-	days = year*365			# years, roughly
-	days = days + (year+3)/4	# plus leap years, roughly
-	days = days - (year+99)/100	# minus non-leap years every century
-	days = days + (year+399)/400	# plus leap years every 4 centirues
-	for i in range(1, month):
-		if i == 2 and calendar.isleap(year):
-			days = days + 29
-		else:
-			days = days + calendar.mdays[i]
-	days = days + day
-	return days
+    # Januari 1st, in 0 A.D. is arbitrarily defined to be day 1,
+    # even though that day never actually existed and the calendar
+    # was different then...
+    days = year*365                 # years, roughly
+    days = days + (year+3)/4        # plus leap years, roughly
+    days = days - (year+99)/100     # minus non-leap years every century
+    days = days + (year+399)/400    # plus leap years every 4 centirues
+    for i in range(1, month):
+        if i == 2 and calendar.isleap(year):
+            days = days + 29
+        else:
+            days = days + calendar.mdays[i]
+    days = days + day
+    return days
 
 main()
