mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 19:34:08 +00:00 
			
		
		
		
	Major overhaul: this is now little more than a user interface, the
preference handling code is in modules pythonprefs and preferences. This should finally make it easier for someone (Just?) to write a decent interface to preference setting, and it'll allow setting initial sys.path and such from ConfigurePython.
This commit is contained in:
		
							parent
							
								
									d0240837fc
								
							
						
					
					
						commit
						3b3a287d12
					
				
					 2 changed files with 123 additions and 404 deletions
				
			
		| 
						 | 
				
			
			@ -13,9 +13,8 @@ import MacOS
 | 
			
		|||
import os
 | 
			
		||||
import sys
 | 
			
		||||
import Res # For Res.Error
 | 
			
		||||
 | 
			
		||||
# Resource in the Python resource chain
 | 
			
		||||
PREFNAME_NAME="PythonPreferenceFileName"
 | 
			
		||||
import pythonprefs
 | 
			
		||||
import EasyDialogs
 | 
			
		||||
 | 
			
		||||
# resource IDs in our own resources (dialogs, etc)
 | 
			
		||||
MESSAGE_ID = 256
 | 
			
		||||
| 
						 | 
				
			
			@ -31,88 +30,46 @@ OPTIONS_ITEM = 7
 | 
			
		|||
# The options dialog. There is a correspondence between
 | 
			
		||||
# the dialog item numbers and the option.
 | 
			
		||||
OPT_DIALOG_ID = 510
 | 
			
		||||
# 1 thru 9 are the options
 | 
			
		||||
 | 
			
		||||
# Map dialog item numbers to option names (and the reverse)
 | 
			
		||||
opt_dialog_map = [
 | 
			
		||||
	None,
 | 
			
		||||
	"inspect",
 | 
			
		||||
	"verbose",
 | 
			
		||||
	"optimize",
 | 
			
		||||
	"unbuffered",
 | 
			
		||||
	"debugging",
 | 
			
		||||
	"keepopen",
 | 
			
		||||
	"keeperror",
 | 
			
		||||
	"nointopt",
 | 
			
		||||
	"noargs",
 | 
			
		||||
	"delayconsole"]
 | 
			
		||||
opt_dialog_dict = {}
 | 
			
		||||
for i in range(len(opt_dialog_map)):
 | 
			
		||||
	if opt_dialog_map[i]:
 | 
			
		||||
		opt_dialog_dict[opt_dialog_map[i]] = i
 | 
			
		||||
# 1 thru 10 are the options
 | 
			
		||||
# The GUSI creator/type and delay-console
 | 
			
		||||
OD_CREATOR_ITEM = 10
 | 
			
		||||
OD_TYPE_ITEM = 11
 | 
			
		||||
OD_DELAYCONSOLE_ITEM = 12
 | 
			
		||||
OD_CREATOR_ITEM = 11
 | 
			
		||||
OD_TYPE_ITEM = 12
 | 
			
		||||
OD_OK_ITEM = 13
 | 
			
		||||
OD_CANCEL_ITEM = 14
 | 
			
		||||
 | 
			
		||||
# Resource IDs in the preferences file
 | 
			
		||||
PATH_STRINGS_ID = 128
 | 
			
		||||
DIRECTORY_ID = 128
 | 
			
		||||
OPTIONS_ID = 128
 | 
			
		||||
GUSI_ID = 10240
 | 
			
		||||
 | 
			
		||||
# Override IDs (in the applet)
 | 
			
		||||
OVERRIDE_PATH_STRINGS_ID = 129
 | 
			
		||||
OVERRIDE_DIRECTORY_ID = 129
 | 
			
		||||
OVERRIDE_OPTIONS_ID = 129
 | 
			
		||||
OVERRIDE_GUSI_ID = 10241
 | 
			
		||||
 | 
			
		||||
# Things we know about the GUSI resource. Note the code knows these too.
 | 
			
		||||
GUSIPOS_TYPE=0
 | 
			
		||||
GUSIPOS_CREATOR=4
 | 
			
		||||
GUSIPOS_SKIP=8
 | 
			
		||||
GUSIPOS_FLAGS=9
 | 
			
		||||
GUSIPOS_VERSION=10
 | 
			
		||||
GUSIVERSION='0181'
 | 
			
		||||
GUSIFLAGS_DELAY=0x20 # Mask
 | 
			
		||||
 | 
			
		||||
READ = 1
 | 
			
		||||
WRITE = 2
 | 
			
		||||
smAllScripts = -3
 | 
			
		||||
kOnSystemDisk = 0x8000
 | 
			
		||||
 | 
			
		||||
def restolist(data):
 | 
			
		||||
	"""Convert STR# resource data to a list of strings"""
 | 
			
		||||
	if not data:
 | 
			
		||||
		return []
 | 
			
		||||
	num, = struct.unpack('h', data[:2])
 | 
			
		||||
	data = data[2:]
 | 
			
		||||
	rv = []
 | 
			
		||||
	for i in range(num):
 | 
			
		||||
		strlen = ord(data[0])
 | 
			
		||||
		if strlen < 0: strlen = strlen + 256
 | 
			
		||||
		str = data[1:strlen+1]
 | 
			
		||||
		data = data[strlen+1:]
 | 
			
		||||
		rv.append(str)
 | 
			
		||||
	return rv
 | 
			
		||||
	
 | 
			
		||||
def listtores(list):
 | 
			
		||||
	"""Convert a list of strings to STR# resource data"""
 | 
			
		||||
	rv = struct.pack('h', len(list))
 | 
			
		||||
	for str in list:
 | 
			
		||||
		rv = rv + chr(len(str)) + str
 | 
			
		||||
	return rv
 | 
			
		||||
 | 
			
		||||
def message(str = "Hello, world!", id = MESSAGE_ID):
 | 
			
		||||
	"""Show a simple alert with a text message"""
 | 
			
		||||
	d = GetNewDialog(id, -1)
 | 
			
		||||
	d.SetDialogDefaultItem(1)
 | 
			
		||||
	tp, h, rect = d.GetDialogItem(2)
 | 
			
		||||
	SetDialogItemText(h, str)
 | 
			
		||||
	while 1:
 | 
			
		||||
		n = ModalDialog(None)
 | 
			
		||||
		if n == 1: break
 | 
			
		||||
		
 | 
			
		||||
def optinteract((options, creator, type, delaycons)):
 | 
			
		||||
def optinteract(options):
 | 
			
		||||
	"""Let the user interact with the options dialog"""
 | 
			
		||||
	old_options = (options[:], creator, type, delaycons)
 | 
			
		||||
	d = GetNewDialog(OPT_DIALOG_ID, -1)
 | 
			
		||||
	tp, h, rect = d.GetDialogItem(OD_CREATOR_ITEM)
 | 
			
		||||
	SetDialogItemText(h, creator)
 | 
			
		||||
	SetDialogItemText(h, options['creator'])
 | 
			
		||||
	tp, h, rect = d.GetDialogItem(OD_TYPE_ITEM)
 | 
			
		||||
	SetDialogItemText(h, type)
 | 
			
		||||
	SetDialogItemText(h, options['type'])
 | 
			
		||||
	d.SetDialogDefaultItem(OD_OK_ITEM)
 | 
			
		||||
	d.SetDialogCancelItem(OD_CANCEL_ITEM)
 | 
			
		||||
	
 | 
			
		||||
	while 1:
 | 
			
		||||
		for i in range(len(options)):
 | 
			
		||||
			tp, h, rect = d.GetDialogItem(i+1)
 | 
			
		||||
			h.as_Control().SetControlValue(options[i])
 | 
			
		||||
		tp, h, rect = d.GetDialogItem(OD_DELAYCONSOLE_ITEM)
 | 
			
		||||
		h.as_Control().SetControlValue(delaycons)
 | 
			
		||||
		for name in opt_dialog_dict.keys():
 | 
			
		||||
			num = opt_dialog_dict[name]
 | 
			
		||||
			tp, h, rect = d.GetDialogItem(num)
 | 
			
		||||
			h.as_Control().SetControlValue(options[name])
 | 
			
		||||
		n = ModalDialog(None)
 | 
			
		||||
		if n == OD_OK_ITEM:
 | 
			
		||||
			tp, h, rect = d.GetDialogItem(OD_CREATOR_ITEM)
 | 
			
		||||
| 
						 | 
				
			
			@ -120,25 +77,24 @@ def optinteract((options, creator, type, delaycons)):
 | 
			
		|||
			tp, h, rect = d.GetDialogItem(OD_TYPE_ITEM)
 | 
			
		||||
			ntype = GetDialogItemText(h)
 | 
			
		||||
			if len(ncreator) == 4 and len(ntype) == 4:
 | 
			
		||||
				return options, ncreator, ntype, delaycons
 | 
			
		||||
				options['creator'] = ncreator
 | 
			
		||||
				options['type'] = ntype
 | 
			
		||||
				return options
 | 
			
		||||
			else:
 | 
			
		||||
				sys.stderr.write('\007')
 | 
			
		||||
				MacOS.SysBeep()
 | 
			
		||||
		elif n == OD_CANCEL_ITEM:
 | 
			
		||||
			return old_options
 | 
			
		||||
			return
 | 
			
		||||
		elif n in (OD_CREATOR_ITEM, OD_TYPE_ITEM):
 | 
			
		||||
			pass
 | 
			
		||||
		elif n == OD_DELAYCONSOLE_ITEM:
 | 
			
		||||
			delaycons = (not delaycons)
 | 
			
		||||
		elif 1 <= n <= len(options):
 | 
			
		||||
			options[n-1] = (not options[n-1])
 | 
			
		||||
		elif 1 <= n <= len(opt_dialog_map):
 | 
			
		||||
			options[opt_dialog_map[n]] = (not options[opt_dialog_map[n]])
 | 
			
		||||
 | 
			
		||||
			
 | 
			
		||||
def interact(list, pythondir, options, title):
 | 
			
		||||
def interact(options, title):
 | 
			
		||||
	"""Let the user interact with the dialog"""
 | 
			
		||||
	opythondir = pythondir
 | 
			
		||||
	try:
 | 
			
		||||
		# Try to go to the "correct" dir for GetDirectory
 | 
			
		||||
		os.chdir(pythondir.as_pathname())
 | 
			
		||||
		os.chdir(options['dir'].as_pathname())
 | 
			
		||||
	except os.error:
 | 
			
		||||
		pass
 | 
			
		||||
	d = GetNewDialog(DIALOG_ID, -1)
 | 
			
		||||
| 
						 | 
				
			
			@ -146,7 +102,7 @@ def interact(list, pythondir, options, title):
 | 
			
		|||
	SetDialogItemText(h, title)
 | 
			
		||||
	tp, h, rect = d.GetDialogItem(TEXT_ITEM)
 | 
			
		||||
##	SetDialogItemText(h, string.joinfields(list, '\r'))
 | 
			
		||||
	h.data = string.joinfields(list, '\r')
 | 
			
		||||
	h.data = string.joinfields(options['path'], '\r')
 | 
			
		||||
	d.SelectDialogItemText(TEXT_ITEM, 0, 32767)
 | 
			
		||||
	d.SelectDialogItemText(TEXT_ITEM, 0, 0)
 | 
			
		||||
##	d.SetDialogDefaultItem(OK_ITEM)
 | 
			
		||||
| 
						 | 
				
			
			@ -164,272 +120,34 @@ def interact(list, pythondir, options, title):
 | 
			
		|||
		if n == DIR_ITEM:
 | 
			
		||||
			fss, ok = macfs.GetDirectory('Select python home folder:')
 | 
			
		||||
			if ok:
 | 
			
		||||
				pythondir = fss
 | 
			
		||||
				options['dir'] = fss
 | 
			
		||||
		if n == OPTIONS_ITEM:
 | 
			
		||||
			options = optinteract(options)
 | 
			
		||||
			noptions = options
 | 
			
		||||
			for k in options.keys():
 | 
			
		||||
				noptions[k] = options[k]
 | 
			
		||||
			noptions = optinteract(noptions)
 | 
			
		||||
			if noptions:
 | 
			
		||||
				options = noptions
 | 
			
		||||
	tmp = string.splitfields(h.data, '\r')
 | 
			
		||||
	rv = []
 | 
			
		||||
	newpath = []
 | 
			
		||||
	for i in tmp:
 | 
			
		||||
		if i:
 | 
			
		||||
			rv.append(i)
 | 
			
		||||
	return rv, pythondir, options
 | 
			
		||||
	
 | 
			
		||||
def getprefpath(id):
 | 
			
		||||
	# Load the path and directory resources
 | 
			
		||||
	try:
 | 
			
		||||
		sr = GetResource('STR#', id)
 | 
			
		||||
	except (MacOS.Error, Res.Error):
 | 
			
		||||
		return None, None
 | 
			
		||||
	d = sr.data
 | 
			
		||||
	l = restolist(d)
 | 
			
		||||
	return l, sr
 | 
			
		||||
 | 
			
		||||
def getprefdir(id):
 | 
			
		||||
	try:
 | 
			
		||||
		dr = GetResource('alis', id)
 | 
			
		||||
		fss, fss_changed = macfs.RawAlias(dr.data).Resolve()
 | 
			
		||||
	except (MacOS.Error, Res.Error):
 | 
			
		||||
		return None, None, 1
 | 
			
		||||
	return fss, dr, fss_changed
 | 
			
		||||
 | 
			
		||||
def getoptions(id):
 | 
			
		||||
	try:
 | 
			
		||||
		opr = GetResource('Popt', id)
 | 
			
		||||
	except (MacOS.Error, Res.Error):
 | 
			
		||||
		return [0]*9, None
 | 
			
		||||
	options = map(lambda x: ord(x), opr.data)
 | 
			
		||||
	while len(options) < 9:
 | 
			
		||||
		options = options + [0]
 | 
			
		||||
	return options, opr
 | 
			
		||||
	
 | 
			
		||||
def getgusioptions(id):
 | 
			
		||||
	try:
 | 
			
		||||
		opr = GetResource('GU\267I', id)
 | 
			
		||||
	except (MacOS.Error, Res.Error):
 | 
			
		||||
		return '????', '????', 0, None
 | 
			
		||||
	data = opr.data
 | 
			
		||||
	type = data[GUSIPOS_TYPE:GUSIPOS_TYPE+4]
 | 
			
		||||
	creator = data[GUSIPOS_CREATOR:GUSIPOS_CREATOR+4]
 | 
			
		||||
	flags = ord(data[GUSIPOS_FLAGS])
 | 
			
		||||
	version = data[GUSIPOS_VERSION:GUSIPOS_VERSION+4]
 | 
			
		||||
	if version <> GUSIVERSION:
 | 
			
		||||
		message('GU\267I resource version "%s", fixing to "%s"'%(version, GUSIVERSION))
 | 
			
		||||
		flags = 0
 | 
			
		||||
	delay = (not not (flags & GUSIFLAGS_DELAY))
 | 
			
		||||
	return creator, type, delay, opr
 | 
			
		||||
	
 | 
			
		||||
def setgusioptions(opr, creator, type, delay):
 | 
			
		||||
	data = opr.data
 | 
			
		||||
	flags = ord(data[GUSIPOS_FLAGS])
 | 
			
		||||
	version = data[GUSIPOS_VERSION:GUSIPOS_VERSION+4]
 | 
			
		||||
	if version <> GUSIVERSION:
 | 
			
		||||
		flags = 0x88
 | 
			
		||||
		version = GUSIVERSION
 | 
			
		||||
	if delay:
 | 
			
		||||
		flags = flags | GUSIFLAGS_DELAY
 | 
			
		||||
	else:
 | 
			
		||||
		flags = flags & ~GUSIFLAGS_DELAY
 | 
			
		||||
	data = type + creator + data[GUSIPOS_SKIP] + chr(flags) + GUSIVERSION + data[GUSIPOS_VERSION+4:]
 | 
			
		||||
	return data
 | 
			
		||||
	
 | 
			
		||||
def openpreffile(rw):
 | 
			
		||||
	# Find the preferences folder and our prefs file, create if needed.	
 | 
			
		||||
	vrefnum, dirid = macfs.FindFolder(kOnSystemDisk, 'pref', 0)
 | 
			
		||||
	try:
 | 
			
		||||
		pnhandle = GetNamedResource('STR ', PREFNAME_NAME)
 | 
			
		||||
	except Res.Error:
 | 
			
		||||
		message("No %s resource (old Python?)"%PREFNAME_NAME)
 | 
			
		||||
		sys.exit(1)
 | 
			
		||||
	prefname = pnhandle.data[1:]
 | 
			
		||||
	preff_fss = macfs.FSSpec((vrefnum, dirid, prefname))
 | 
			
		||||
	try:
 | 
			
		||||
		preff_handle = FSpOpenResFile(preff_fss, rw)
 | 
			
		||||
	except Res.Error:
 | 
			
		||||
		# Create it
 | 
			
		||||
		message('No preferences file, creating one...')
 | 
			
		||||
		FSpCreateResFile(preff_fss, 'Pyth', 'pref', smAllScripts)
 | 
			
		||||
		preff_handle = FSpOpenResFile(preff_fss, rw)
 | 
			
		||||
	return preff_handle
 | 
			
		||||
	
 | 
			
		||||
def openapplet(name):
 | 
			
		||||
	fss = macfs.FSSpec(name)
 | 
			
		||||
	try:
 | 
			
		||||
		app_handle = FSpOpenResFile(fss, WRITE)
 | 
			
		||||
	except Res.Error:
 | 
			
		||||
		message('File does not have a resource fork.')
 | 
			
		||||
		sys.exit(0)
 | 
			
		||||
	return app_handle
 | 
			
		||||
			newpath.append(i)
 | 
			
		||||
	options['path'] = newpath
 | 
			
		||||
	return options
 | 
			
		||||
	
 | 
			
		||||
	
 | 
			
		||||
def edit_preferences():
 | 
			
		||||
	preff_handle = openpreffile(WRITE)
 | 
			
		||||
	
 | 
			
		||||
	l, sr = getprefpath(PATH_STRINGS_ID)
 | 
			
		||||
	if l == None:	
 | 
			
		||||
		message('Cannot find any sys.path resource! (Old python?)')
 | 
			
		||||
		sys.exit(0)
 | 
			
		||||
		
 | 
			
		||||
	fss, dr, fss_changed = getprefdir(DIRECTORY_ID)
 | 
			
		||||
	if fss == None:
 | 
			
		||||
		fss = macfs.FSSpec(os.getcwd())
 | 
			
		||||
		fss_changed = 1
 | 
			
		||||
		
 | 
			
		||||
	options, opr = getoptions(OPTIONS_ID)
 | 
			
		||||
	saved_options = options[:]
 | 
			
		||||
	
 | 
			
		||||
	creator, type, delaycons, gusi_opr = getgusioptions(GUSI_ID)
 | 
			
		||||
	saved_gusi_options = creator, type, delaycons
 | 
			
		||||
	
 | 
			
		||||
	# Let the user play away
 | 
			
		||||
	result = interact(l, fss, (options, creator, type, delaycons),
 | 
			
		||||
			 'System-wide preferences')
 | 
			
		||||
	
 | 
			
		||||
	# See what we have to update, and how
 | 
			
		||||
	if result == None:
 | 
			
		||||
		sys.exit(0)
 | 
			
		||||
		
 | 
			
		||||
	pathlist, nfss, (options, creator, type, delaycons) = result
 | 
			
		||||
	if nfss != fss:
 | 
			
		||||
		fss_changed = 1
 | 
			
		||||
		
 | 
			
		||||
	if fss_changed:
 | 
			
		||||
		alias = nfss.NewAlias()
 | 
			
		||||
		if dr:
 | 
			
		||||
			dr.data = alias.data
 | 
			
		||||
			dr.ChangedResource()
 | 
			
		||||
		else:
 | 
			
		||||
			dr = Resource(alias.data)
 | 
			
		||||
			dr.AddResource('alis', DIRECTORY_ID, '')
 | 
			
		||||
			
 | 
			
		||||
	if pathlist != l:
 | 
			
		||||
		if pathlist == []:
 | 
			
		||||
			if sr.HomeResFile() == preff_handle:
 | 
			
		||||
				sr.RemoveResource()
 | 
			
		||||
		elif sr.HomeResFile() == preff_handle:
 | 
			
		||||
			sr.data = listtores(pathlist)
 | 
			
		||||
			sr.ChangedResource()
 | 
			
		||||
		else:
 | 
			
		||||
			sr = Resource(listtores(pathlist))
 | 
			
		||||
			sr.AddResource('STR#', PATH_STRINGS_ID, '')
 | 
			
		||||
			
 | 
			
		||||
	if options != saved_options:
 | 
			
		||||
		newdata = reduce(lambda x, y: x+chr(y), options, '')
 | 
			
		||||
		if opr and opr.HomeResFile() == preff_handle:
 | 
			
		||||
			opr.data = newdata
 | 
			
		||||
			opr.ChangedResource()
 | 
			
		||||
		else:
 | 
			
		||||
			opr = Resource(newdata)
 | 
			
		||||
			opr.AddResource('Popt', OPTIONS_ID, '')
 | 
			
		||||
			
 | 
			
		||||
	if (creator, type, delaycons) != saved_gusi_options:
 | 
			
		||||
		newdata = setgusioptions(gusi_opr, creator, type, delaycons)
 | 
			
		||||
		if gusi_opr.HomeResFile() == preff_handle:
 | 
			
		||||
			gusi_opr.data = newdata
 | 
			
		||||
			gusi_opr.ChangedResource()
 | 
			
		||||
		else:
 | 
			
		||||
			ngusi_opr = Resource(newdata)
 | 
			
		||||
			ngusi_opr.AddResource('GU\267I', GUSI_ID, '')
 | 
			
		||||
				
 | 
			
		||||
	CloseResFile(preff_handle)
 | 
			
		||||
	handler = pythonprefs.PythonOptions()
 | 
			
		||||
	result = interact(handler.load(), 'System-wide preferences')
 | 
			
		||||
	if result:
 | 
			
		||||
		handler.save(result)
 | 
			
		||||
	
 | 
			
		||||
def edit_applet(name):
 | 
			
		||||
	pref_handle = openpreffile(READ)
 | 
			
		||||
	app_handle = openapplet(name)
 | 
			
		||||
	
 | 
			
		||||
	notfound = ''
 | 
			
		||||
	l, sr = getprefpath(OVERRIDE_PATH_STRINGS_ID)
 | 
			
		||||
	if l == None:
 | 
			
		||||
		notfound = 'path'
 | 
			
		||||
		
 | 
			
		||||
		l, dummy = getprefpath(PATH_STRINGS_ID)
 | 
			
		||||
		if l == None:	
 | 
			
		||||
			message('Cannot find any sys.path resource! (Old python?)')
 | 
			
		||||
			sys.exit(0)
 | 
			
		||||
		
 | 
			
		||||
	fss, dr, fss_changed = getprefdir(OVERRIDE_DIRECTORY_ID)
 | 
			
		||||
	if fss == None:
 | 
			
		||||
		if notfound:
 | 
			
		||||
			notfound = notfound + ', directory'
 | 
			
		||||
		else:
 | 
			
		||||
			notfound = 'directory'
 | 
			
		||||
		fss, dummy, dummy2 = getprefdir(DIRECTORY_ID)
 | 
			
		||||
		if fss == None:
 | 
			
		||||
			fss = macfs.FSSpec(os.getcwd())
 | 
			
		||||
			fss_changed = 1
 | 
			
		||||
 | 
			
		||||
	options, opr = getoptions(OVERRIDE_OPTIONS_ID)
 | 
			
		||||
	if not opr:
 | 
			
		||||
		if notfound:
 | 
			
		||||
			notfound = notfound + ', options'
 | 
			
		||||
		else:
 | 
			
		||||
			notfound = 'options'
 | 
			
		||||
		options, dummy = getoptions(OPTIONS_ID)
 | 
			
		||||
	saved_options = options[:]
 | 
			
		||||
	
 | 
			
		||||
	creator, type, delaycons, gusi_opr = getgusioptions(OVERRIDE_GUSI_ID)
 | 
			
		||||
	if not gusi_opr:
 | 
			
		||||
		if notfound:
 | 
			
		||||
			notfound = notfound + ', GUSI options'
 | 
			
		||||
		else:
 | 
			
		||||
			notfound = 'GUSI options'
 | 
			
		||||
		creator, type, delaycons, gusi_opr = getgusioptions(GUSI_ID)
 | 
			
		||||
	saved_gusi_options = creator, type, delaycons
 | 
			
		||||
	
 | 
			
		||||
	dummy = dummy2 = None # Discard them.
 | 
			
		||||
	
 | 
			
		||||
	if notfound:
 | 
			
		||||
		message('Warning: initial %s taken from system-wide defaults'%notfound)
 | 
			
		||||
	# Let the user play away
 | 
			
		||||
	result = interact(l, fss, (options, creator, type, delaycons), name)
 | 
			
		||||
	
 | 
			
		||||
	# See what we have to update, and how
 | 
			
		||||
	if result == None:
 | 
			
		||||
		sys.exit(0)
 | 
			
		||||
		
 | 
			
		||||
	pathlist, nfss, (options, creator, type, delaycons) = result
 | 
			
		||||
	if nfss != fss:
 | 
			
		||||
		fss_changed = 1
 | 
			
		||||
		
 | 
			
		||||
	if fss_changed:
 | 
			
		||||
		alias = nfss.NewAlias()
 | 
			
		||||
		if dr:
 | 
			
		||||
			dr.data = alias.data
 | 
			
		||||
			dr.ChangedResource()
 | 
			
		||||
		else:
 | 
			
		||||
			dr = Resource(alias.data)
 | 
			
		||||
			dr.AddResource('alis', OVERRIDE_DIRECTORY_ID, '')
 | 
			
		||||
			
 | 
			
		||||
	if pathlist != l:
 | 
			
		||||
		if pathlist == []:
 | 
			
		||||
			if sr.HomeResFile() == app_handle:
 | 
			
		||||
				sr.RemoveResource()
 | 
			
		||||
		elif sr and sr.HomeResFile() == app_handle:
 | 
			
		||||
			sr.data = listtores(pathlist)
 | 
			
		||||
			sr.ChangedResource()
 | 
			
		||||
		else:
 | 
			
		||||
			sr = Resource(listtores(pathlist))
 | 
			
		||||
			sr.AddResource('STR#', OVERRIDE_PATH_STRINGS_ID, '')
 | 
			
		||||
			
 | 
			
		||||
	if options != saved_options:
 | 
			
		||||
		newdata = reduce(lambda x, y: x+chr(y), options, '')
 | 
			
		||||
		if opr and opr.HomeResFile() == app_handle:
 | 
			
		||||
			opr.data = newdata
 | 
			
		||||
			opr.ChangedResource()
 | 
			
		||||
		else:
 | 
			
		||||
			opr = Resource(newdata)
 | 
			
		||||
			opr.AddResource('Popt', OVERRIDE_OPTIONS_ID, '')
 | 
			
		||||
			
 | 
			
		||||
	if (creator, type, delaycons) != saved_gusi_options:
 | 
			
		||||
		newdata = setgusioptions(gusi_opr, creator, type, delaycons)
 | 
			
		||||
		id, type, name = gusi_opr.GetResInfo()
 | 
			
		||||
		if gusi_opr.HomeResFile() == app_handle and id == OVERRIDE_GUSI_ID:
 | 
			
		||||
			gusi_opr.data = newdata
 | 
			
		||||
			gusi_opr.ChangedResource()
 | 
			
		||||
		else:
 | 
			
		||||
			ngusi_opr = Resource(newdata)
 | 
			
		||||
			ngusi_opr.AddResource('GU\267I', OVERRIDE_GUSI_ID, '')
 | 
			
		||||
			
 | 
			
		||||
	CloseResFile(app_handle)
 | 
			
		||||
	handler = pythonprefs.AppletOptions(name)
 | 
			
		||||
	result = interact(handler.load(), os.path.split(name)[1])
 | 
			
		||||
	if result:
 | 
			
		||||
		handler.save(result)
 | 
			
		||||
 | 
			
		||||
def main():
 | 
			
		||||
	try:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,64 +1,65 @@
 | 
			
		|||
(This file must be converted with BinHex 4.0)
 | 
			
		||||
 | 
			
		||||
:&%9NDA43HA4SEfj3FQ9QFbjbFh*M!(*cFQ058d9%!3#3"`m+@DJ!N!3"!!!!$FN
 | 
			
		||||
!!!c*!!!"36B8)&3JD!!8)&"p%E"S%3!k!@FQ%Lm-6VS#$!`k!&Tj&%9NDA43HA4
 | 
			
		||||
SEfj3FQ9QFbjbFh*MF`)!!!!rN!B!!$q3#!#3',!EP68!N!B2#[m4`+KT!4e!%Ir
 | 
			
		||||
c%h!!%#lrmlh5%@B386Dq9@X"!8*%[D'q9@X"!6"4-J&R(N39$!!!('85F!!3,N-
 | 
			
		||||
9$!!!(f)'F!&J!!%"!LaD9#dZ4,d"!"Xm!@B`*e8q'NU!)&-#+!#r!#iL!1d*!J%
 | 
			
		||||
!3)-Sfc36UGF[$%kk!3P+CfX"!+CA3cS!!!%!!!%!!!!#J!!!"%!!!!JJ!!!3%!!
 | 
			
		||||
!)BJ!!%'%!!#$`J!"!m%!!JIiJ!3(K%!)"!)J%!MK%#!6))K!(L"mJ!2J1N!-!$N
 | 
			
		||||
J%`!k%"$J2!J-(MJ%!!(i!J`!1!%5!%!!N[L!!%`"!!!J!J!!%!3!!!J)!!!%%!!
 | 
			
		||||
!!L!!!!&!!!!!J!!!!3!!!!1!!!!(`!!!$q!!!"r`!!!rq!!!Ir`!!2rq!!(rr`!
 | 
			
		||||
$rrq!"rrr`!rrrq!Irrr`2rrrq(rrrrcrrrrqIrrrrcrrrriIrrrm$rrrq!IrrrJ
 | 
			
		||||
$rrri!Irr`!$rri!!Irm!!$rq!!!Ir!!!$rJ!!!I`!!!$i!!!!F!!!!#!!*!%#P$
 | 
			
		||||
J!"k%J!!(S5!!!!!(39"36!#3"N!"!!+!"%!,B"13!#))455#id%$)--62`X,""!
 | 
			
		||||
#)!&!!)!"!!1!"m!2i"r`2rKrr2rrIrmrrarr$rX(m!2J!F!!J!!!"!#3%2m!N"l
 | 
			
		||||
r!2m!N"cr!!!!r`#3'[m!!2Ae!2m!N"Mr!!$eN!3!r`#3&[m!!2AeX,$ep3$r!*!
 | 
			
		||||
8r`!!pIAeX,$epI8!r`#3%[m!!2AepE#3"2Aep3$r!*!3r`!!pC!%X*!%pC!%!2m
 | 
			
		||||
!N!lr!!$eN!5`N!6rN!6ep3$r!*!-r`!!pC!&X2rrr`L3"2rep3$r!*!+r`!!pC!
 | 
			
		||||
'rc-)N!IrpI8!r`#3#2m!!2@3"[m)#$2rrrm)N!6rpI8!r`#3"[m!!2@3"[m)-rr
 | 
			
		||||
rprIr#*!&rrAe!2m!N!6r!!$eN!IrN!6hpIAr-`L3"Iq3"3!!r`!!pC!,rj!&!3L
 | 
			
		||||
3"62rrrrhr`!!rrIeN!Rrrc-)N!ScrrrrprIr!!$rpr@3"rm&prrr-c-c#*!'-rr
 | 
			
		||||
rrrIr!*!%rrIeN!Er"3Ahprrrrc13"!J)-rq3"!#3"[rhpC!'rrrepIIhprq3"$-
 | 
			
		||||
c-rrrr`#3#2rhpC!-pj!%rj!'!*!*rrIeN!6rrr@3#2H3"2rrr`#3#[rhpIArpIA
 | 
			
		||||
rpC!)prIr!*!1rrIerrAerrArN!AeprIr!*!3rrIerrreN!Ihprm!N",rpr@3#2I
 | 
			
		||||
hr`#3&2rhpC!'prIr!*!@rrIeN!6hprm!N"MrprAeprIr!*!DrrIhprm!N"crprm
 | 
			
		||||
!N"lr!*!4!3#3#2m!N!lrpIm!N!crpIAer`#3#[reX,$errm!N!MrpI@`rrm)#2m
 | 
			
		||||
!N!ErpIAer`L3"Im!N!6rpIAer`Mr#!Mr#!Mr!!$rpC!&rrIrrrm)#$2rr`$rpC!
 | 
			
		||||
'rc-c#$-crrm!!2reN!Arrc13"2rr!!!!rrAerrrepIq3"J#3"2rerrrepIAhr`$
 | 
			
		||||
rr`#3"IreN!6hr`#3#[repIIr!*!-rrIr!*!1r`#3#S!!!!!2!*!(m2!!N!82!!m
 | 
			
		||||
!N!A`93r`!!!!$`"Im!m!!!$`!2!!!2!!$`!2c`$`$`$`!!$mrr!0r`m!!!$pd0h
 | 
			
		||||
r!2!!!2rGhIm!$`$r!2rrr`!!m2m!$2$r!!!2!!$2!*!&m!c`!*!&$mm!N!I`!*!
 | 
			
		||||
&!J#3#!m!N!r`m!#3$3m!$`#3$I!!!2!!N!X2!!!!$`#3#r!!"9!!m!#3#3m!!!9
 | 
			
		||||
3!!m!N!R`!!"993!!m!#3"`m!!!"993!!$`#3"r!!!!99Arr`!2!!N!82!!!!"Ir
 | 
			
		||||
`!!m!$`#3"I!!!!!2d!!!!2!!m!!!!!m!N!6mcIr`!!m!$`!!!2!!!!!2cIr-m!!
 | 
			
		||||
!m!$`!!m!N!32rr`!m!!!$rrr!2!!N!Errr!!!!hrr2!2`!#3"2r3!*!%$Irmc`$
 | 
			
		||||
m!!!!$acrhG!!!!hrr2!!$m!!!!m4c2rphG!0rrm!!!$m!!!!r`$-crrphIr`!!!
 | 
			
		||||
!$m!!N!8-c-rrrr!!N!6m!!$r!*!%c-crm!#3"!r!$`$`!!!!$-m!N!Im$`$`rrr
 | 
			
		||||
`c2!!N!F2`2m!!!!-c`#3#I`!N!6-m!#3#3r!!!!-c`#3#r`!!-c`!*!,$m!-c`#
 | 
			
		||||
3$Ic-m!#3$3r2!*!2m!#3#K8!)J"S!B!"R`!"!!!"!*!&!Im!N!3"!*!%"bU3"!!
 | 
			
		||||
"!*!%*&"jG$!!!!!"4P*&4J!"!!!!J!!"!)&*3diM!!%!!!%X!!%!N!3"#J!'!*!
 | 
			
		||||
&8J!9!2-"*a!*4@4TG#"8CAKdK`#3"!%l!2!"6`%X"!*25`#3"!%l!"3"6`"1"!C
 | 
			
		||||
$B@jMC@`!N!Ak!"3"$!%V""p6C@aPBh3J*#K3@94)6diT)'K[E@8JCQpXC'9b,Li
 | 
			
		||||
ZCJ#3"3d!&`!H!5B)#89NDA3J9'9iG#i!N!8U!"8!6J%RL%p&ER4PFL"cHA-ZF'&
 | 
			
		||||
dD#"MEfe`EfjPER4c,#"[EQ8JF'9b)'aTEQ80+&9cC5!N+&"C9%K26LNJCQpb)("
 | 
			
		||||
jG'K[EL"SEfeP)'C[E'4PFLNk!*!&!4-!&!%P!5X%'N4PCQ&eE(3JFh4KFR4eF#"
 | 
			
		||||
[F(4TEfjc,LiZ!!!!&3!X!&B"CJ&T!!%"!!%!N!8"rJ!!!!*F!"%!N!8H!!N!-!%
 | 
			
		||||
1"50&ER4PFL"TER4PFQ&MG'PfC5"YEf4P)'&QG'9b)(0MFQP`G#-!N!8c!!N!43%
 | 
			
		||||
1"4G8FQ&MC5"TEA"[FR3JFh4KG'9YC@jdFi)!N!9*!!N!@`%0"4a6GA"`FQ9cFb"
 | 
			
		||||
PH("bCA0cD@pZ)("bD@jdD@jR!*!&A`!*!(%"$!8B9@jLG@CQCA*PC#"cG'4[GA3
 | 
			
		||||
[Fh4NCA*b!*!&G3!*!)F"#`864'9LG@FJF'&bFf9b)'peG("eG'8!N!@J!"i!XJ#
 | 
			
		||||
-"3Y1Eh*YB@`JCAKTG(-!N!@J!+!!XJ%+"3TPFR*[FL"PH'Pd!*!&i3!+!2-"$!8
 | 
			
		||||
L4'PcB@*XC5"TER4PFQ&MG'PfC5"[F(4TEfiYFf9dG'PZC`#3"I8!#J%'!3X&'d4
 | 
			
		||||
TFf&LE'8JBA*RBbpKFQGf)'9YG@aKG'P[EQF!N!@i!+!!b!$V%!#3"X`!S!$F!1X
 | 
			
		||||
3!*!&!3J!#J%D!3X&)84PE'&j)'0[ER0[E'8JGfPZC'ph)(9ZG'PX)'jPC@4PC!#
 | 
			
		||||
3"3%I!08"-`%2"!*25`#3"!%I!!S"-`"("!C$B@jMC@`!N!8'!#B!&`$ZL"T3HA4
 | 
			
		||||
SEfiJD@jdCA*`FQ9dCA)JEh"dD@pZF`#3"B`!#J#F!3Z)'NYPCA!JFh4ND@mJGfP
 | 
			
		||||
ZC'ph)'p`C@iJEfik!*!&Z!!+!-N!PiJ94'9QBA9XG#"QD@aP)'0bC@&dEh)kC3#
 | 
			
		||||
3"F`!#J$G!*H)%N4PCQ&eE(3JCQPXC5"dHA"P1J!!!3!!!!h*!!!-b3!!!8%$@l4
 | 
			
		||||
),HJ!!!!F!6)!#d*14%`!!!"L5801)`!!!'j659T&!!!!HNC548B!!3#'D@0c)`!
 | 
			
		||||
!!*jTBf`i!!!!UQPMFcJ!!!#fD@0c0!!!!-*TBf`d!!!!cN4-6dF!!3$D4%P86!!
 | 
			
		||||
"!2*3HA3`!!!"#J#!rrm!!!ND!*!%!5crr`#3#2q3"!!!!33!N!@!rrm!!!%5!*!
 | 
			
		||||
&JIrr!!!*$`#3"!%Xrrm!!!%G!*!%!5crr`!!!@%!N!3",2rr!!!&C3#3"!%Xrrm
 | 
			
		||||
!!!CT!*!%!5crr`!!"Zd!N!3"rrrr!!!)m3#3"!(qrrm!!!T3!*!%!Irrr`!!#8)
 | 
			
		||||
$@lF-!Ilrr`!!#QN$@lF%!*!'#3S!N!316hGZCA)JFQ9cEh9bBf9kD`:
 | 
			
		||||
:&%9NDA43HA4SEfj3FQ9QFbjbFh*M!(*cFQ058d9%!3#3"`m!q1)!N!3"!!!!$Em
 | 
			
		||||
!!!br!!!"36B8)&3JD!!8)&"p%E"S%3!k!@FQ%Lm-6VS#$!`k!&Tj&%9NDA43HA4
 | 
			
		||||
SEfj3FQ9QFbjbFh*MC3)!!!"bFh*M8P-!!(*cFQ058d9%!3!!J!%"!*!2!6`"X"Z
 | 
			
		||||
903#3"Jm+ra(!U'N"(8!4rr-6F!!3,[rc[G)4CK"40Vj9D`%"3N5pSEj9D`%"-&%
 | 
			
		||||
b!@FH4"8-!!!FC4*`!"!Z3a8-!!!IBJC`!@!!!3%#,&T8,5j%[3%!'c`"CM!R96i
 | 
			
		||||
D5S!J8`)S!,m!,L)!l3N#!3"!JbME0"1Tebm-6VS"#8TRD`%!TPG$1J!!!3!!!3!
 | 
			
		||||
!!!+!!!!%3!!!##!!!"!3!!!KL!!!3B3!!)2#!!%$`3!#"rL!"!H%3!J%!L!3#1%
 | 
			
		||||
3)"-JL%!H)(b!!q!k3!`!15!6!$S3%1!m#!`H1!3!!IJ#$!!i!4)!3!#5q)!!6!%
 | 
			
		||||
!!#!#!!!3"!!!#!J!!!33!!!#)!!!!8!!!!#!!!!"!!!!!i!!!!I!!!!2i!!!(r!
 | 
			
		||||
!!$ri!!"rr!!!rri!!Irr!!2rri!(rrr!$rrri"rrrr!rrrriIrrrr2rrrrjrrrr
 | 
			
		||||
r2rrrrKrrrr`2rrri"rrrq!2rrrJ"rrr!!2rrJ!"rr`!!2ri!!"rm!!!2q!!!"r!
 | 
			
		||||
!!!2J!!!"`!!!!)!!N!3+81!!(S5!!!HK)!!!!!G"8&"-!*!'3!%!!S!%3!YJ%j!
 | 
			
		||||
!)JK&*),M33-J`a-r#`X%%!)J!8!!J!%!!i!(`!rJ(r!rq(rmrrprrcrr(rm2q`I
 | 
			
		||||
`!q!"`!#!!!!%!*!3r`#3([m!r`#3(2m!!!$r!*!Dr`!!pI8!r`#3'2m!!2@3"!$
 | 
			
		||||
r!*!@r`!!pI@`X2Ae!2m!N"6r!!$epI@`X2Aep3$r!*!5r`!!pIAeX*!%pIAe!2m
 | 
			
		||||
!N"$r!!$eN!5`N!6eN!3!r`#3$[m!!2@3",#3"2q3"2Ae!2m!N!cr!!$eN!@`rrr
 | 
			
		||||
r#*!%rrAe!2m!N!Vr!!$eN!Er-`L3"rrep3$r!*!)r`!!pC!'r`J)-rrrr`L3"2r
 | 
			
		||||
ep3$r!*!'r`!!pC!'r`Jcrrrhprm)N!ArpI8!r`#3"2m!!2@3"rq3"2IepImc#*!
 | 
			
		||||
&rj!&!!$r!!$eN![rN!8"#*!&-rrrrrIr!!$rpr@3#Irr-`L3#M2rrrrhprm!!2r
 | 
			
		||||
hpC!(r`Ahrrmc-c-)N!Bcrrrrprm!N!6rpr@3"[m&"IIhrrrr-j!%#!Jcrj!%!*!
 | 
			
		||||
'rrIeN!ErrrAeprIhrj!%-c-crrrr!*!)rrIeN!chN!6rN!B!N!Rrpr@3"2rrpC!
 | 
			
		||||
)pj!%rrrr!*!+rrIepIrepIreN!Mhprm!N!lrprArpIArpIq3"IAhprm!N"$rprA
 | 
			
		||||
rrr@3"rIhr`#3%[rhpC!)prIr!*!8rrIeN!Ehprm!N"Erpr@3"2Ihr`#3'2rhpIA
 | 
			
		||||
hprm!N"VrprIhr`#3(2rhr`#3([m!N"%"!*!)r`#3$[rer`#3$2repIAr!*!+rr@
 | 
			
		||||
`X2Arr`#3#2repE$rr`J)r`#3"[repIAr#*!&r`#3"2repIAr#2m)#2m)#2m!!2r
 | 
			
		||||
eN!Arprrrr`J)-rrr!2reN!Er-c-)-c2rr`!!rr@3"Irr-j!%rrm!!!$rpIArrrA
 | 
			
		||||
erj!'!*!%rrArrrAepIIr!2rr!*!&rr@3"2Ir!*!+rrAeprm!N!crprm!N!lr!*!
 | 
			
		||||
+J!!!!!m!N!I`m!#3"3m!$`#3"I"9$r!!!!!2!&r`$`!!!2!!m!!!m!!2!!r2!2!
 | 
			
		||||
2!2!!!2crm!hr$`!!!2h3hIm!m!!!rphGr`!2!2m!rrrr!!$`r`!-m2m!!!m!!-m
 | 
			
		||||
!N!A`$2!!N!82c`#3"r!!N!8#!*!)$`#3$r$`!*!0$`!2!*!0m!!!m!#3#`m!!!!
 | 
			
		||||
2!*!,m!!&8!$`!*!*$`!!"9!!$`#3#I!!!&99!!$`!*!($`!!!&99!!!2!*!(m!!
 | 
			
		||||
!"99Irr!!m!#3"3m!!!!&rr!!$`!2!*!&m!!!!!r3!!!!m!$`!!!!$`#3"2c0rr!
 | 
			
		||||
!$`!2!!!!m!!!!!r0rmc`!!$`!2!!$`#3"!rrr!$`!!!2rrm!m!#3"[rrm!!!$Ir
 | 
			
		||||
mm!r!!*!%rp!!N!30rrc2!2`!!!!2(2rGd!!!$Irmm!!2`!!!$a(-rrhGd!hrr`!
 | 
			
		||||
!!2`!!!$r!-c2rrhGrr!!!!!2`!#3"3c-crrrm!#3"2`!!2m!N!6-c2r`!*!%$m!
 | 
			
		||||
2!2!!!!!-c`#3"r`2!2$rrr$-m!#3"`r!r`!!!!c2!*!*r!#3"-c`!*!*$m!!!!c
 | 
			
		||||
2!*!,r!!!c2!!N!X2`!c2!*!0r-c`!*!0$mm!N!r`!*!+&3!L!'J"J!'I!!%!!!%
 | 
			
		||||
!N!8"r`#3"!%!N!3(+T!%!!%!N!3N8(Pd-!!!!!&'8N9'!!%!!!#!!!%!J8P$6L-
 | 
			
		||||
!!3!!!5`!!3#3"!%+!!B!N!95!"8!m`%R%!P&C'Pd)&4PH(5(!*!%!6X!m!&2!5`
 | 
			
		||||
%!Np,!*!%!6X!&!&2!%i%"N0KEQ0PE!#3"IS!&!%-!5X%(e0PE'9MG#!N+&"C9%K
 | 
			
		||||
26LNJD'pYC5"QEfaNCA)Z,LjQ!*!&$3!A!"i"*JJ*4@4TG#"8CAKd,J#3"5S!&3"
 | 
			
		||||
1!5H)6d9ZG'9b)(0jFbj`BA4S)'0[EA"[EQ9ZG(-X)'pZC5"`CA)JE'PZC3dS9A0
 | 
			
		||||
P)#3S8&P85%p1+5"QEh)JF(PdD'pZ)'K[E@8JCQpXC'9b+6S!N!8"%`!8!58"+`3
 | 
			
		||||
D4'9QBA9XG#"cG'&bG(9`)'p`G'P[ER-Z,Li!!!!9!#`!9J&Q!@N!!3%!!3#3"3(
 | 
			
		||||
q!!!!!P)!%3#3"4i!#3!`!3i&)d9ZG'9b)'PZG'9bB@0dDACP)'e[C'8JB@CdCA)
 | 
			
		||||
JFf0bDA"d)`#3"6-!#3"&!3i&&e4bB@0P)'PYF'pbG#"cG'&dC@ePER4cJJ#3"8N
 | 
			
		||||
!#3"E!3d&%8p`G'PYDATP)'*jG'9MEf4P!*!'A`!*!(%"$!8B9@jLG@CQCA*PC#"
 | 
			
		||||
cG'4[GA3[Fh4NCA*b!*!&G3!*!)F"#`864'9LG@FJF'&bFf9b)'peG("eG'8!N!@
 | 
			
		||||
J!"i!XJ#-"3Y1Eh*YB@`JCAKTG(-!N!@J!+!!XJ%+"3TPFR*[FL"PH'Pd!*!&i3!
 | 
			
		||||
+!2-"$!8L4'PcB@*XC5"TER4PFQ&MG'PfC5"[F(4TEfiYFf9dG'PZC`#3"I8!#J%
 | 
			
		||||
'!3X&'d4TFf&LE'8JBA*RBbpKFQGf)'9YG@aKG'P[EQF!N!3"#!!+!4S"#`8K4'9
 | 
			
		||||
XBANJBfpZFfpXC5"hD@jNEhFJG@jdD@`JEQ9PC'9N)!#3"EJ!S!$)!1X3!*!'c!#
 | 
			
		||||
J!0`!ka!!N!8"(`$9!6-"$`3#6dX!N!3"(`!+!6-!4`3'3f&ZBf9X!*!&"J!Q!"F
 | 
			
		||||
!lSJD8(PdD'pZ)'PZG'9bF(*PG'9b)'p`G'P[ER-!N!@-!!S!R!%,L"T,C@9`)(0
 | 
			
		||||
dC'P[)(GTEQ4[Gb"[F'9Z)'pZ1J#3"EJ!#J$*!*H)&84PCQ&eE(3JCQPXC5"MFQ9
 | 
			
		||||
KG'pb1Q8!N!A-!!S!h3#AL"*%C@CKG@ad)'CTE'8JG(P`C6S!!!%!!!!0[`!!$,m
 | 
			
		||||
!!!&"!9bMV$%f!!!!(!%b!!Y#6N4-!!!!BNP$6L-!!!"Z8dPD43!!!(T'8N9'!!%
 | 
			
		||||
!KQPMFb-!!!#HD@0X1!!!!+TTBh-i!!!!YQPMFc3!!!$#D@0X0!!!!-j%6%p(!!%
 | 
			
		||||
!fN4*9%`!!3$b8(Pd-!!!!3S!J2rr!!!*'J#3"!%Xrrm!N!MrN!3!!!%%!*!&J2r
 | 
			
		||||
r!!!"%J#3"B(rr`!!#3m!N!3",2rr!!!"(3#3"!%Xrrm!!!&K!*!%!5crr`!!"@8
 | 
			
		||||
!N!3",2rr!!!'D3#3"!%Xrrm!!!EY!*!%!Irrr`!!#2%!N!3"r[rr!!!+8!#3"!(
 | 
			
		||||
rrrm!!!P#!9bM+!(qrrm!!!TT!9bP$!#3"JN+!*!%$NphEQ9b)(*PFfpeFQ0P8i%
 | 
			
		||||
:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue