From d56cebe7a497773d8753ea2ab874c4445bac18dc Mon Sep 17 00:00:00 2001 From: Robin Dunn Date: Fri, 15 Jun 2001 21:43:26 +0000 Subject: [PATCH] Added ability to use xml resource files. Still need to add ability to subclass wxXmlResourceHandler, etc... Added wxGridAutoEditMixin to the mixins library package. Made ColourSelect be derived from wxButton. Fixed a few bugs here and there, added some missing methods, etc. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10588 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- wxPython/CHANGES.txt | 10 + wxPython/contrib/xrc/.cvsignore | 1 + wxPython/contrib/xrc/b.bat | 5 + wxPython/contrib/xrc/xrc.cpp | 1283 ++++++++++ wxPython/contrib/xrc/xrc.i | 161 ++ wxPython/contrib/xrc/xrc.py | 139 + wxPython/demo/ColourSelect.py | 7 +- wxPython/demo/GridSimple.py | 15 +- wxPython/demo/Main.py | 16 +- wxPython/demo/PythonEvents.py | 2 +- wxPython/demo/XML_Resource.py | 49 + wxPython/demo/data/resource.wdr | Bin 0 -> 5248 bytes wxPython/demo/data/resource_wdr.xrc | 153 ++ wxPython/demo/demoMainLoop.py | 2 +- wxPython/demo/encode_bitmaps.py | 2 +- wxPython/demo/images.py | 3339 ++++++++++++------------- wxPython/demo/wxChoice.py | 5 +- wxPython/demo/wxListCtrl.py | 9 +- wxPython/demo/wxTextCtrl.py | 47 +- wxPython/demo/wxToolBar.py | 1 + wxPython/distrib/zipit.bat | 4 +- wxPython/setup.py | 98 +- wxPython/src/__version__.py | 2 +- wxPython/src/_defs.i | 2 + wxPython/src/controls.i | 33 +- wxPython/src/events.i | 3 +- wxPython/src/gdi.i | 33 +- wxPython/src/libpy.c | 2 + wxPython/src/misc2.i | 2 +- wxPython/src/msw/controls.cpp | 510 +++- wxPython/src/msw/controls.py | 57 + wxPython/src/msw/events.cpp | 40 +- wxPython/src/msw/events.py | 3 + wxPython/src/msw/gdi.cpp | 45 +- wxPython/src/msw/gdi.py | 4 +- wxPython/src/msw/misc2.cpp | 2 +- wxPython/src/msw/windows.cpp | 29 + wxPython/src/msw/windows.py | 3 + wxPython/src/msw/wx.cpp | 3 + wxPython/src/msw/wx.py | 3 + wxPython/src/windows.i | 2 + wxPython/wxPython/lib/colourselect.py | 31 +- wxPython/wxPython/lib/rpcMixin.py | 312 ++- 43 files changed, 4622 insertions(+), 1847 deletions(-) create mode 100644 wxPython/contrib/xrc/.cvsignore create mode 100755 wxPython/contrib/xrc/b.bat create mode 100644 wxPython/contrib/xrc/xrc.cpp create mode 100644 wxPython/contrib/xrc/xrc.i create mode 100644 wxPython/contrib/xrc/xrc.py create mode 100644 wxPython/demo/XML_Resource.py create mode 100644 wxPython/demo/data/resource.wdr create mode 100644 wxPython/demo/data/resource_wdr.xrc diff --git a/wxPython/CHANGES.txt b/wxPython/CHANGES.txt index ae25b80124..bfa06adb00 100644 --- a/wxPython/CHANGES.txt +++ b/wxPython/CHANGES.txt @@ -8,6 +8,16 @@ Added EVT_GRID_EDITOR_CREATED and wxGridEditorCreatedEvent so the user code can get access to the edit control when it is created, (to push on a custom event handler for example.) +Added wxTextAttr class and SetStyle, SetDefaultStyle and +GetDefaultStyle methods to wxTextCtrl. + +Added ability to use xml resource files. Still need to add ability to +subclass wxXmlResourceHandler, etc... + +Added wxGridAutoEditMixin to the mixins library package. + +Made ColourSelect be derived from wxButton. + 2.3.0 diff --git a/wxPython/contrib/xrc/.cvsignore b/wxPython/contrib/xrc/.cvsignore new file mode 100644 index 0000000000..41ca5f0c6b --- /dev/null +++ b/wxPython/contrib/xrc/.cvsignore @@ -0,0 +1 @@ +contrib diff --git a/wxPython/contrib/xrc/b.bat b/wxPython/contrib/xrc/b.bat new file mode 100755 index 0000000000..3f2fcd6854 --- /dev/null +++ b/wxPython/contrib/xrc/b.bat @@ -0,0 +1,5 @@ +@echo off +cd %WXWIN%\wxPython +call b.bat %$ +cd - + diff --git a/wxPython/contrib/xrc/xrc.cpp b/wxPython/contrib/xrc/xrc.cpp new file mode 100644 index 0000000000..7b981740ca --- /dev/null +++ b/wxPython/contrib/xrc/xrc.cpp @@ -0,0 +1,1283 @@ +/* + * FILE : contrib/xrc/xrc.cpp + * + * This file was automatically generated by : + * Simplified Wrapper and Interface Generator (SWIG) + * Version 1.1 (Build 883) + * + * Portions Copyright (c) 1995-1998 + * The University of Utah and The Regents of the University of California. + * Permission is granted to distribute this file in any manner provided + * this notice remains intact. + * + * Do not make changes to this file--changes will be lost! + * + */ + + +#define SWIGCODE +/* Implementation : PYTHON */ + +#define SWIGPYTHON +#include +#include +/* Definitions for Windows/Unix exporting */ +#if defined(__WIN32__) +# if defined(_MSC_VER) +# define SWIGEXPORT(a) __declspec(dllexport) a +# else +# if defined(__BORLANDC__) +# define SWIGEXPORT(a) a _export +# else +# define SWIGEXPORT(a) a +# endif +# endif +#else +# define SWIGEXPORT(a) a +#endif + +#include "Python.h" + +#ifdef __cplusplus +extern "C" { +#endif + +extern void SWIG_MakePtr(char *, void *, char *); +extern void SWIG_RegisterMapping(char *, char *, void *(*)(void *)); +extern char *SWIG_GetPtr(char *, void **, char *); +extern char *SWIG_GetPtrObj(PyObject *, void **, char *); +extern void SWIG_addvarlink(PyObject *, char *, PyObject *(*)(void), int (*)(PyObject *)); +extern PyObject *SWIG_newvarlink(void); +#ifdef __cplusplus +} +#endif +#define SWIG_init initxrcc + +#define SWIG_name "xrcc" + +#include "export.h" +#include "wx/xrc/xmlres.h" + + +static PyObject* t_output_helper(PyObject* target, PyObject* o) { + PyObject* o2; + PyObject* o3; + + if (!target) { + target = o; + } else if (target == Py_None) { + Py_DECREF(Py_None); + target = o; + } else { + if (!PyTuple_Check(target)) { + o2 = target; + target = PyTuple_New(1); + PyTuple_SetItem(target, 0, o2); + } + o3 = PyTuple_New(1); + PyTuple_SetItem(o3, 0, o); + + o2 = target; + target = PySequence_Concat(o2, o3); + Py_DECREF(o2); + Py_DECREF(o3); + } + return target; +} + +#if PYTHON_API_VERSION >= 1009 + static char* wxStringErrorMsg = "String or Unicode type required"; +#else + static char* wxStringErrorMsg = "string type is required for parameter"; +#endif +#ifdef __cplusplus +extern "C" { +#endif +static int _wrap_wxTheXmlResource_set(PyObject *val) { + + PyErr_SetString(PyExc_TypeError,"Variable wxTheXmlResource is read-only."); + return 1; +} + +static PyObject *_wrap_wxTheXmlResource_get() { + PyObject * pyobj; + char ptemp[128]; + + SWIG_MakePtr(ptemp, (char *) wxTheXmlResource,"_wxXmlResource_p"); + pyobj = PyString_FromString(ptemp); + return pyobj; +} + +static void *SwigwxXmlResourceTowxObject(void *ptr) { + wxXmlResource *src; + wxObject *dest; + src = (wxXmlResource *) ptr; + dest = (wxObject *) src; + return (void *) dest; +} + +#define new_wxXmlResourceEmpty(_swigarg0) (new wxXmlResource(_swigarg0)) +static PyObject *_wrap_new_wxXmlResourceEmpty(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + wxXmlResource * _result; + bool _arg0 = (bool ) TRUE; + int tempbool0 = (int) TRUE; + char *_kwnames[] = { "use_locale", NULL }; + char _ptemp[128]; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"|i:new_wxXmlResourceEmpty",_kwnames,&tempbool0)) + return NULL; + _arg0 = (bool ) tempbool0; +{ + wxPy_BEGIN_ALLOW_THREADS; + _result = (wxXmlResource *)new_wxXmlResourceEmpty(_arg0); + + wxPy_END_ALLOW_THREADS; +} if (_result) { + SWIG_MakePtr(_ptemp, (char *) _result,"_wxXmlResource_p"); + _resultobj = Py_BuildValue("s",_ptemp); + } else { + Py_INCREF(Py_None); + _resultobj = Py_None; + } + return _resultobj; +} + +static wxXmlResource *new_wxXmlResource(const wxString *filemask,bool use_locale) { + wxXmlResource* res = new wxXmlResource(*filemask, use_locale); + res->InitAllHandlers(); + return res; + } + +static PyObject *_wrap_new_wxXmlResource(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + wxXmlResource * _result; + wxString * _arg0; + bool _arg1 = (bool ) TRUE; + PyObject * _obj0 = 0; + int tempbool1 = (int) TRUE; + char *_kwnames[] = { "filemask","use_locale", NULL }; + char _ptemp[128]; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O|i:new_wxXmlResource",_kwnames,&_obj0,&tempbool1)) + return NULL; +{ +#if PYTHON_API_VERSION >= 1009 + char* tmpPtr; int tmpSize; + if (!PyString_Check(_obj0) && !PyUnicode_Check(_obj0)) { + PyErr_SetString(PyExc_TypeError, wxStringErrorMsg); + return NULL; + } + if (PyString_AsStringAndSize(_obj0, &tmpPtr, &tmpSize) == -1) + return NULL; + _arg0 = new wxString(tmpPtr, tmpSize); +#else + if (!PyString_Check(_obj0)) { + PyErr_SetString(PyExc_TypeError, wxStringErrorMsg); + return NULL; + } + _arg0 = new wxString(PyString_AS_STRING(_obj0), PyString_GET_SIZE(_obj0)); +#endif +} + _arg1 = (bool ) tempbool1; +{ + wxPy_BEGIN_ALLOW_THREADS; + _result = (wxXmlResource *)new_wxXmlResource(_arg0,_arg1); + + wxPy_END_ALLOW_THREADS; +} if (_result) { + SWIG_MakePtr(_ptemp, (char *) _result,"_wxXmlResource_p"); + _resultobj = Py_BuildValue("s",_ptemp); + } else { + Py_INCREF(Py_None); + _resultobj = Py_None; + } +{ + if (_obj0) + delete _arg0; +} + return _resultobj; +} + +#define delete_wxXmlResource(_swigobj) (delete _swigobj) +static PyObject *_wrap_delete_wxXmlResource(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + wxXmlResource * _arg0; + PyObject * _argo0 = 0; + char *_kwnames[] = { "self", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:delete_wxXmlResource",_kwnames,&_argo0)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxXmlResource_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of delete_wxXmlResource. Expected _wxXmlResource_p."); + return NULL; + } + } +{ + wxPy_BEGIN_ALLOW_THREADS; + delete_wxXmlResource(_arg0); + + wxPy_END_ALLOW_THREADS; +} Py_INCREF(Py_None); + _resultobj = Py_None; + return _resultobj; +} + +#define wxXmlResource_Load(_swigobj,_swigarg0) (_swigobj->Load(_swigarg0)) +static PyObject *_wrap_wxXmlResource_Load(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + bool _result; + wxXmlResource * _arg0; + wxString * _arg1; + PyObject * _argo0 = 0; + PyObject * _obj1 = 0; + char *_kwnames[] = { "self","filemask", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxXmlResource_Load",_kwnames,&_argo0,&_obj1)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxXmlResource_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxXmlResource_Load. Expected _wxXmlResource_p."); + return NULL; + } + } +{ +#if PYTHON_API_VERSION >= 1009 + char* tmpPtr; int tmpSize; + if (!PyString_Check(_obj1) && !PyUnicode_Check(_obj1)) { + PyErr_SetString(PyExc_TypeError, wxStringErrorMsg); + return NULL; + } + if (PyString_AsStringAndSize(_obj1, &tmpPtr, &tmpSize) == -1) + return NULL; + _arg1 = new wxString(tmpPtr, tmpSize); +#else + if (!PyString_Check(_obj1)) { + PyErr_SetString(PyExc_TypeError, wxStringErrorMsg); + return NULL; + } + _arg1 = new wxString(PyString_AS_STRING(_obj1), PyString_GET_SIZE(_obj1)); +#endif +} +{ + wxPy_BEGIN_ALLOW_THREADS; + _result = (bool )wxXmlResource_Load(_arg0,*_arg1); + + wxPy_END_ALLOW_THREADS; +} _resultobj = Py_BuildValue("i",_result); +{ + if (_obj1) + delete _arg1; +} + return _resultobj; +} + +#define wxXmlResource_InitAllHandlers(_swigobj) (_swigobj->InitAllHandlers()) +static PyObject *_wrap_wxXmlResource_InitAllHandlers(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + wxXmlResource * _arg0; + PyObject * _argo0 = 0; + char *_kwnames[] = { "self", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxXmlResource_InitAllHandlers",_kwnames,&_argo0)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxXmlResource_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxXmlResource_InitAllHandlers. Expected _wxXmlResource_p."); + return NULL; + } + } +{ + wxPy_BEGIN_ALLOW_THREADS; + wxXmlResource_InitAllHandlers(_arg0); + + wxPy_END_ALLOW_THREADS; +} Py_INCREF(Py_None); + _resultobj = Py_None; + return _resultobj; +} + +#define wxXmlResource_AddHandler(_swigobj,_swigarg0) (_swigobj->AddHandler(_swigarg0)) +static PyObject *_wrap_wxXmlResource_AddHandler(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + wxXmlResource * _arg0; + wxXmlResourceHandler * _arg1; + PyObject * _argo0 = 0; + PyObject * _argo1 = 0; + char *_kwnames[] = { "self","handler", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxXmlResource_AddHandler",_kwnames,&_argo0,&_argo1)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxXmlResource_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxXmlResource_AddHandler. Expected _wxXmlResource_p."); + return NULL; + } + } + if (_argo1) { + if (_argo1 == Py_None) { _arg1 = NULL; } + else if (SWIG_GetPtrObj(_argo1,(void **) &_arg1,"_wxXmlResourceHandler_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 2 of wxXmlResource_AddHandler. Expected _wxXmlResourceHandler_p."); + return NULL; + } + } +{ + wxPy_BEGIN_ALLOW_THREADS; + wxXmlResource_AddHandler(_arg0,_arg1); + + wxPy_END_ALLOW_THREADS; +} Py_INCREF(Py_None); + _resultobj = Py_None; + return _resultobj; +} + +#define wxXmlResource_ClearHandlers(_swigobj) (_swigobj->ClearHandlers()) +static PyObject *_wrap_wxXmlResource_ClearHandlers(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + wxXmlResource * _arg0; + PyObject * _argo0 = 0; + char *_kwnames[] = { "self", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxXmlResource_ClearHandlers",_kwnames,&_argo0)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxXmlResource_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxXmlResource_ClearHandlers. Expected _wxXmlResource_p."); + return NULL; + } + } +{ + wxPy_BEGIN_ALLOW_THREADS; + wxXmlResource_ClearHandlers(_arg0); + + wxPy_END_ALLOW_THREADS; +} Py_INCREF(Py_None); + _resultobj = Py_None; + return _resultobj; +} + +#define wxXmlResource_LoadMenu(_swigobj,_swigarg0) (_swigobj->LoadMenu(_swigarg0)) +static PyObject *_wrap_wxXmlResource_LoadMenu(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + wxMenu * _result; + wxXmlResource * _arg0; + wxString * _arg1; + PyObject * _argo0 = 0; + PyObject * _obj1 = 0; + char *_kwnames[] = { "self","name", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxXmlResource_LoadMenu",_kwnames,&_argo0,&_obj1)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxXmlResource_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxXmlResource_LoadMenu. Expected _wxXmlResource_p."); + return NULL; + } + } +{ +#if PYTHON_API_VERSION >= 1009 + char* tmpPtr; int tmpSize; + if (!PyString_Check(_obj1) && !PyUnicode_Check(_obj1)) { + PyErr_SetString(PyExc_TypeError, wxStringErrorMsg); + return NULL; + } + if (PyString_AsStringAndSize(_obj1, &tmpPtr, &tmpSize) == -1) + return NULL; + _arg1 = new wxString(tmpPtr, tmpSize); +#else + if (!PyString_Check(_obj1)) { + PyErr_SetString(PyExc_TypeError, wxStringErrorMsg); + return NULL; + } + _arg1 = new wxString(PyString_AS_STRING(_obj1), PyString_GET_SIZE(_obj1)); +#endif +} +{ + wxPy_BEGIN_ALLOW_THREADS; + _result = (wxMenu *)wxXmlResource_LoadMenu(_arg0,*_arg1); + + wxPy_END_ALLOW_THREADS; +}{ _resultobj = wxPyMake_wxObject(_result); } +{ + if (_obj1) + delete _arg1; +} + return _resultobj; +} + +#define wxXmlResource_LoadMenuBar(_swigobj,_swigarg0) (_swigobj->LoadMenuBar(_swigarg0)) +static PyObject *_wrap_wxXmlResource_LoadMenuBar(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + wxMenuBar * _result; + wxXmlResource * _arg0; + wxString * _arg1; + PyObject * _argo0 = 0; + PyObject * _obj1 = 0; + char *_kwnames[] = { "self","name", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxXmlResource_LoadMenuBar",_kwnames,&_argo0,&_obj1)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxXmlResource_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxXmlResource_LoadMenuBar. Expected _wxXmlResource_p."); + return NULL; + } + } +{ +#if PYTHON_API_VERSION >= 1009 + char* tmpPtr; int tmpSize; + if (!PyString_Check(_obj1) && !PyUnicode_Check(_obj1)) { + PyErr_SetString(PyExc_TypeError, wxStringErrorMsg); + return NULL; + } + if (PyString_AsStringAndSize(_obj1, &tmpPtr, &tmpSize) == -1) + return NULL; + _arg1 = new wxString(tmpPtr, tmpSize); +#else + if (!PyString_Check(_obj1)) { + PyErr_SetString(PyExc_TypeError, wxStringErrorMsg); + return NULL; + } + _arg1 = new wxString(PyString_AS_STRING(_obj1), PyString_GET_SIZE(_obj1)); +#endif +} +{ + wxPy_BEGIN_ALLOW_THREADS; + _result = (wxMenuBar *)wxXmlResource_LoadMenuBar(_arg0,*_arg1); + + wxPy_END_ALLOW_THREADS; +}{ _resultobj = wxPyMake_wxObject(_result); } +{ + if (_obj1) + delete _arg1; +} + return _resultobj; +} + +#define wxXmlResource_LoadToolBar(_swigobj,_swigarg0,_swigarg1) (_swigobj->LoadToolBar(_swigarg0,_swigarg1)) +static PyObject *_wrap_wxXmlResource_LoadToolBar(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + wxToolBar * _result; + wxXmlResource * _arg0; + wxWindow * _arg1; + wxString * _arg2; + PyObject * _argo0 = 0; + PyObject * _argo1 = 0; + PyObject * _obj2 = 0; + char *_kwnames[] = { "self","parent","name", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OOO:wxXmlResource_LoadToolBar",_kwnames,&_argo0,&_argo1,&_obj2)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxXmlResource_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxXmlResource_LoadToolBar. Expected _wxXmlResource_p."); + return NULL; + } + } + if (_argo1) { + if (_argo1 == Py_None) { _arg1 = NULL; } + else if (SWIG_GetPtrObj(_argo1,(void **) &_arg1,"_wxWindow_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 2 of wxXmlResource_LoadToolBar. Expected _wxWindow_p."); + return NULL; + } + } +{ +#if PYTHON_API_VERSION >= 1009 + char* tmpPtr; int tmpSize; + if (!PyString_Check(_obj2) && !PyUnicode_Check(_obj2)) { + PyErr_SetString(PyExc_TypeError, wxStringErrorMsg); + return NULL; + } + if (PyString_AsStringAndSize(_obj2, &tmpPtr, &tmpSize) == -1) + return NULL; + _arg2 = new wxString(tmpPtr, tmpSize); +#else + if (!PyString_Check(_obj2)) { + PyErr_SetString(PyExc_TypeError, wxStringErrorMsg); + return NULL; + } + _arg2 = new wxString(PyString_AS_STRING(_obj2), PyString_GET_SIZE(_obj2)); +#endif +} +{ + wxPy_BEGIN_ALLOW_THREADS; + _result = (wxToolBar *)wxXmlResource_LoadToolBar(_arg0,_arg1,*_arg2); + + wxPy_END_ALLOW_THREADS; +}{ _resultobj = wxPyMake_wxObject(_result); } +{ + if (_obj2) + delete _arg2; +} + return _resultobj; +} + +#define wxXmlResource_LoadDialog(_swigobj,_swigarg0,_swigarg1) (_swigobj->LoadDialog(_swigarg0,_swigarg1)) +static PyObject *_wrap_wxXmlResource_LoadDialog(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + wxDialog * _result; + wxXmlResource * _arg0; + wxWindow * _arg1; + wxString * _arg2; + PyObject * _argo0 = 0; + PyObject * _argo1 = 0; + PyObject * _obj2 = 0; + char *_kwnames[] = { "self","parent","name", NULL }; + char _ptemp[128]; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OOO:wxXmlResource_LoadDialog",_kwnames,&_argo0,&_argo1,&_obj2)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxXmlResource_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxXmlResource_LoadDialog. Expected _wxXmlResource_p."); + return NULL; + } + } + if (_argo1) { + if (_argo1 == Py_None) { _arg1 = NULL; } + else if (SWIG_GetPtrObj(_argo1,(void **) &_arg1,"_wxWindow_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 2 of wxXmlResource_LoadDialog. Expected _wxWindow_p."); + return NULL; + } + } +{ +#if PYTHON_API_VERSION >= 1009 + char* tmpPtr; int tmpSize; + if (!PyString_Check(_obj2) && !PyUnicode_Check(_obj2)) { + PyErr_SetString(PyExc_TypeError, wxStringErrorMsg); + return NULL; + } + if (PyString_AsStringAndSize(_obj2, &tmpPtr, &tmpSize) == -1) + return NULL; + _arg2 = new wxString(tmpPtr, tmpSize); +#else + if (!PyString_Check(_obj2)) { + PyErr_SetString(PyExc_TypeError, wxStringErrorMsg); + return NULL; + } + _arg2 = new wxString(PyString_AS_STRING(_obj2), PyString_GET_SIZE(_obj2)); +#endif +} +{ + wxPy_BEGIN_ALLOW_THREADS; + _result = (wxDialog *)wxXmlResource_LoadDialog(_arg0,_arg1,*_arg2); + + wxPy_END_ALLOW_THREADS; +} if (_result) { + SWIG_MakePtr(_ptemp, (char *) _result,"_wxDialog_p"); + _resultobj = Py_BuildValue("s",_ptemp); + } else { + Py_INCREF(Py_None); + _resultobj = Py_None; + } +{ + if (_obj2) + delete _arg2; +} + return _resultobj; +} + +#define wxXmlResource_LoadOnDialog(_swigobj,_swigarg0,_swigarg1,_swigarg2) (_swigobj->LoadDialog(_swigarg0,_swigarg1,_swigarg2)) +static PyObject *_wrap_wxXmlResource_LoadOnDialog(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + bool _result; + wxXmlResource * _arg0; + wxDialog * _arg1; + wxWindow * _arg2; + wxString * _arg3; + PyObject * _argo0 = 0; + PyObject * _argo1 = 0; + PyObject * _argo2 = 0; + PyObject * _obj3 = 0; + char *_kwnames[] = { "self","dlg","parent","name", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OOOO:wxXmlResource_LoadOnDialog",_kwnames,&_argo0,&_argo1,&_argo2,&_obj3)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxXmlResource_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxXmlResource_LoadOnDialog. Expected _wxXmlResource_p."); + return NULL; + } + } + if (_argo1) { + if (_argo1 == Py_None) { _arg1 = NULL; } + else if (SWIG_GetPtrObj(_argo1,(void **) &_arg1,"_wxDialog_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 2 of wxXmlResource_LoadOnDialog. Expected _wxDialog_p."); + return NULL; + } + } + if (_argo2) { + if (_argo2 == Py_None) { _arg2 = NULL; } + else if (SWIG_GetPtrObj(_argo2,(void **) &_arg2,"_wxWindow_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 3 of wxXmlResource_LoadOnDialog. Expected _wxWindow_p."); + return NULL; + } + } +{ +#if PYTHON_API_VERSION >= 1009 + char* tmpPtr; int tmpSize; + if (!PyString_Check(_obj3) && !PyUnicode_Check(_obj3)) { + PyErr_SetString(PyExc_TypeError, wxStringErrorMsg); + return NULL; + } + if (PyString_AsStringAndSize(_obj3, &tmpPtr, &tmpSize) == -1) + return NULL; + _arg3 = new wxString(tmpPtr, tmpSize); +#else + if (!PyString_Check(_obj3)) { + PyErr_SetString(PyExc_TypeError, wxStringErrorMsg); + return NULL; + } + _arg3 = new wxString(PyString_AS_STRING(_obj3), PyString_GET_SIZE(_obj3)); +#endif +} +{ + wxPy_BEGIN_ALLOW_THREADS; + _result = (bool )wxXmlResource_LoadOnDialog(_arg0,_arg1,_arg2,*_arg3); + + wxPy_END_ALLOW_THREADS; +} _resultobj = Py_BuildValue("i",_result); +{ + if (_obj3) + delete _arg3; +} + return _resultobj; +} + +#define wxXmlResource_LoadPanel(_swigobj,_swigarg0,_swigarg1) (_swigobj->LoadPanel(_swigarg0,_swigarg1)) +static PyObject *_wrap_wxXmlResource_LoadPanel(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + wxPanel * _result; + wxXmlResource * _arg0; + wxWindow * _arg1; + wxString * _arg2; + PyObject * _argo0 = 0; + PyObject * _argo1 = 0; + PyObject * _obj2 = 0; + char *_kwnames[] = { "self","parent","name", NULL }; + char _ptemp[128]; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OOO:wxXmlResource_LoadPanel",_kwnames,&_argo0,&_argo1,&_obj2)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxXmlResource_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxXmlResource_LoadPanel. Expected _wxXmlResource_p."); + return NULL; + } + } + if (_argo1) { + if (_argo1 == Py_None) { _arg1 = NULL; } + else if (SWIG_GetPtrObj(_argo1,(void **) &_arg1,"_wxWindow_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 2 of wxXmlResource_LoadPanel. Expected _wxWindow_p."); + return NULL; + } + } +{ +#if PYTHON_API_VERSION >= 1009 + char* tmpPtr; int tmpSize; + if (!PyString_Check(_obj2) && !PyUnicode_Check(_obj2)) { + PyErr_SetString(PyExc_TypeError, wxStringErrorMsg); + return NULL; + } + if (PyString_AsStringAndSize(_obj2, &tmpPtr, &tmpSize) == -1) + return NULL; + _arg2 = new wxString(tmpPtr, tmpSize); +#else + if (!PyString_Check(_obj2)) { + PyErr_SetString(PyExc_TypeError, wxStringErrorMsg); + return NULL; + } + _arg2 = new wxString(PyString_AS_STRING(_obj2), PyString_GET_SIZE(_obj2)); +#endif +} +{ + wxPy_BEGIN_ALLOW_THREADS; + _result = (wxPanel *)wxXmlResource_LoadPanel(_arg0,_arg1,*_arg2); + + wxPy_END_ALLOW_THREADS; +} if (_result) { + SWIG_MakePtr(_ptemp, (char *) _result,"_wxPanel_p"); + _resultobj = Py_BuildValue("s",_ptemp); + } else { + Py_INCREF(Py_None); + _resultobj = Py_None; + } +{ + if (_obj2) + delete _arg2; +} + return _resultobj; +} + +#define wxXmlResource_LoadOnPanel(_swigobj,_swigarg0,_swigarg1,_swigarg2) (_swigobj->LoadPanel(_swigarg0,_swigarg1,_swigarg2)) +static PyObject *_wrap_wxXmlResource_LoadOnPanel(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + bool _result; + wxXmlResource * _arg0; + wxPanel * _arg1; + wxWindow * _arg2; + wxString * _arg3; + PyObject * _argo0 = 0; + PyObject * _argo1 = 0; + PyObject * _argo2 = 0; + PyObject * _obj3 = 0; + char *_kwnames[] = { "self","panel","parent","name", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OOOO:wxXmlResource_LoadOnPanel",_kwnames,&_argo0,&_argo1,&_argo2,&_obj3)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxXmlResource_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxXmlResource_LoadOnPanel. Expected _wxXmlResource_p."); + return NULL; + } + } + if (_argo1) { + if (_argo1 == Py_None) { _arg1 = NULL; } + else if (SWIG_GetPtrObj(_argo1,(void **) &_arg1,"_wxPanel_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 2 of wxXmlResource_LoadOnPanel. Expected _wxPanel_p."); + return NULL; + } + } + if (_argo2) { + if (_argo2 == Py_None) { _arg2 = NULL; } + else if (SWIG_GetPtrObj(_argo2,(void **) &_arg2,"_wxWindow_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 3 of wxXmlResource_LoadOnPanel. Expected _wxWindow_p."); + return NULL; + } + } +{ +#if PYTHON_API_VERSION >= 1009 + char* tmpPtr; int tmpSize; + if (!PyString_Check(_obj3) && !PyUnicode_Check(_obj3)) { + PyErr_SetString(PyExc_TypeError, wxStringErrorMsg); + return NULL; + } + if (PyString_AsStringAndSize(_obj3, &tmpPtr, &tmpSize) == -1) + return NULL; + _arg3 = new wxString(tmpPtr, tmpSize); +#else + if (!PyString_Check(_obj3)) { + PyErr_SetString(PyExc_TypeError, wxStringErrorMsg); + return NULL; + } + _arg3 = new wxString(PyString_AS_STRING(_obj3), PyString_GET_SIZE(_obj3)); +#endif +} +{ + wxPy_BEGIN_ALLOW_THREADS; + _result = (bool )wxXmlResource_LoadOnPanel(_arg0,_arg1,_arg2,*_arg3); + + wxPy_END_ALLOW_THREADS; +} _resultobj = Py_BuildValue("i",_result); +{ + if (_obj3) + delete _arg3; +} + return _resultobj; +} + +#define wxXmlResource_LoadFrame(_swigobj,_swigarg0,_swigarg1,_swigarg2) (_swigobj->LoadFrame(_swigarg0,_swigarg1,_swigarg2)) +static PyObject *_wrap_wxXmlResource_LoadFrame(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + bool _result; + wxXmlResource * _arg0; + wxFrame * _arg1; + wxWindow * _arg2; + wxString * _arg3; + PyObject * _argo0 = 0; + PyObject * _argo1 = 0; + PyObject * _argo2 = 0; + PyObject * _obj3 = 0; + char *_kwnames[] = { "self","frame","parent","name", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OOOO:wxXmlResource_LoadFrame",_kwnames,&_argo0,&_argo1,&_argo2,&_obj3)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxXmlResource_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxXmlResource_LoadFrame. Expected _wxXmlResource_p."); + return NULL; + } + } + if (_argo1) { + if (_argo1 == Py_None) { _arg1 = NULL; } + else if (SWIG_GetPtrObj(_argo1,(void **) &_arg1,"_wxFrame_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 2 of wxXmlResource_LoadFrame. Expected _wxFrame_p."); + return NULL; + } + } + if (_argo2) { + if (_argo2 == Py_None) { _arg2 = NULL; } + else if (SWIG_GetPtrObj(_argo2,(void **) &_arg2,"_wxWindow_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 3 of wxXmlResource_LoadFrame. Expected _wxWindow_p."); + return NULL; + } + } +{ +#if PYTHON_API_VERSION >= 1009 + char* tmpPtr; int tmpSize; + if (!PyString_Check(_obj3) && !PyUnicode_Check(_obj3)) { + PyErr_SetString(PyExc_TypeError, wxStringErrorMsg); + return NULL; + } + if (PyString_AsStringAndSize(_obj3, &tmpPtr, &tmpSize) == -1) + return NULL; + _arg3 = new wxString(tmpPtr, tmpSize); +#else + if (!PyString_Check(_obj3)) { + PyErr_SetString(PyExc_TypeError, wxStringErrorMsg); + return NULL; + } + _arg3 = new wxString(PyString_AS_STRING(_obj3), PyString_GET_SIZE(_obj3)); +#endif +} +{ + wxPy_BEGIN_ALLOW_THREADS; + _result = (bool )wxXmlResource_LoadFrame(_arg0,_arg1,_arg2,*_arg3); + + wxPy_END_ALLOW_THREADS; +} _resultobj = Py_BuildValue("i",_result); +{ + if (_obj3) + delete _arg3; +} + return _resultobj; +} + +#define wxXmlResource_LoadBitmap(_swigobj,_swigarg0) (_swigobj->LoadBitmap(_swigarg0)) +static PyObject *_wrap_wxXmlResource_LoadBitmap(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + wxBitmap * _result; + wxXmlResource * _arg0; + wxString * _arg1; + PyObject * _argo0 = 0; + PyObject * _obj1 = 0; + char *_kwnames[] = { "self","name", NULL }; + char _ptemp[128]; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxXmlResource_LoadBitmap",_kwnames,&_argo0,&_obj1)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxXmlResource_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxXmlResource_LoadBitmap. Expected _wxXmlResource_p."); + return NULL; + } + } +{ +#if PYTHON_API_VERSION >= 1009 + char* tmpPtr; int tmpSize; + if (!PyString_Check(_obj1) && !PyUnicode_Check(_obj1)) { + PyErr_SetString(PyExc_TypeError, wxStringErrorMsg); + return NULL; + } + if (PyString_AsStringAndSize(_obj1, &tmpPtr, &tmpSize) == -1) + return NULL; + _arg1 = new wxString(tmpPtr, tmpSize); +#else + if (!PyString_Check(_obj1)) { + PyErr_SetString(PyExc_TypeError, wxStringErrorMsg); + return NULL; + } + _arg1 = new wxString(PyString_AS_STRING(_obj1), PyString_GET_SIZE(_obj1)); +#endif +} +{ + wxPy_BEGIN_ALLOW_THREADS; + _result = new wxBitmap (wxXmlResource_LoadBitmap(_arg0,*_arg1)); + + wxPy_END_ALLOW_THREADS; +} SWIG_MakePtr(_ptemp, (void *) _result,"_wxBitmap_p"); + _resultobj = Py_BuildValue("s",_ptemp); +{ + if (_obj1) + delete _arg1; +} + return _resultobj; +} + +#define wxXmlResource_LoadIcon(_swigobj,_swigarg0) (_swigobj->LoadIcon(_swigarg0)) +static PyObject *_wrap_wxXmlResource_LoadIcon(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + wxIcon * _result; + wxXmlResource * _arg0; + wxString * _arg1; + PyObject * _argo0 = 0; + PyObject * _obj1 = 0; + char *_kwnames[] = { "self","name", NULL }; + char _ptemp[128]; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxXmlResource_LoadIcon",_kwnames,&_argo0,&_obj1)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxXmlResource_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxXmlResource_LoadIcon. Expected _wxXmlResource_p."); + return NULL; + } + } +{ +#if PYTHON_API_VERSION >= 1009 + char* tmpPtr; int tmpSize; + if (!PyString_Check(_obj1) && !PyUnicode_Check(_obj1)) { + PyErr_SetString(PyExc_TypeError, wxStringErrorMsg); + return NULL; + } + if (PyString_AsStringAndSize(_obj1, &tmpPtr, &tmpSize) == -1) + return NULL; + _arg1 = new wxString(tmpPtr, tmpSize); +#else + if (!PyString_Check(_obj1)) { + PyErr_SetString(PyExc_TypeError, wxStringErrorMsg); + return NULL; + } + _arg1 = new wxString(PyString_AS_STRING(_obj1), PyString_GET_SIZE(_obj1)); +#endif +} +{ + wxPy_BEGIN_ALLOW_THREADS; + _result = new wxIcon (wxXmlResource_LoadIcon(_arg0,*_arg1)); + + wxPy_END_ALLOW_THREADS; +} SWIG_MakePtr(_ptemp, (void *) _result,"_wxIcon_p"); + _resultobj = Py_BuildValue("s",_ptemp); +{ + if (_obj1) + delete _arg1; +} + return _resultobj; +} + +#define wxXmlResource_AttachUnknownControl(_swigobj,_swigarg0,_swigarg1,_swigarg2) (_swigobj->AttachUnknownControl(_swigarg0,_swigarg1,_swigarg2)) +static PyObject *_wrap_wxXmlResource_AttachUnknownControl(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + bool _result; + wxXmlResource * _arg0; + wxString * _arg1; + wxWindow * _arg2; + wxWindow * _arg3 = (wxWindow *) NULL; + PyObject * _argo0 = 0; + PyObject * _obj1 = 0; + PyObject * _argo2 = 0; + PyObject * _argo3 = 0; + char *_kwnames[] = { "self","name","control","parent", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OOO|O:wxXmlResource_AttachUnknownControl",_kwnames,&_argo0,&_obj1,&_argo2,&_argo3)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxXmlResource_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxXmlResource_AttachUnknownControl. Expected _wxXmlResource_p."); + return NULL; + } + } +{ +#if PYTHON_API_VERSION >= 1009 + char* tmpPtr; int tmpSize; + if (!PyString_Check(_obj1) && !PyUnicode_Check(_obj1)) { + PyErr_SetString(PyExc_TypeError, wxStringErrorMsg); + return NULL; + } + if (PyString_AsStringAndSize(_obj1, &tmpPtr, &tmpSize) == -1) + return NULL; + _arg1 = new wxString(tmpPtr, tmpSize); +#else + if (!PyString_Check(_obj1)) { + PyErr_SetString(PyExc_TypeError, wxStringErrorMsg); + return NULL; + } + _arg1 = new wxString(PyString_AS_STRING(_obj1), PyString_GET_SIZE(_obj1)); +#endif +} + if (_argo2) { + if (_argo2 == Py_None) { _arg2 = NULL; } + else if (SWIG_GetPtrObj(_argo2,(void **) &_arg2,"_wxWindow_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 3 of wxXmlResource_AttachUnknownControl. Expected _wxWindow_p."); + return NULL; + } + } + if (_argo3) { + if (_argo3 == Py_None) { _arg3 = NULL; } + else if (SWIG_GetPtrObj(_argo3,(void **) &_arg3,"_wxWindow_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 4 of wxXmlResource_AttachUnknownControl. Expected _wxWindow_p."); + return NULL; + } + } +{ + wxPy_BEGIN_ALLOW_THREADS; + _result = (bool )wxXmlResource_AttachUnknownControl(_arg0,*_arg1,_arg2,_arg3); + + wxPy_END_ALLOW_THREADS; +} _resultobj = Py_BuildValue("i",_result); +{ + if (_obj1) + delete _arg1; +} + return _resultobj; +} + +static PyObject *_wrap_wxXmlResource_GetXMLID(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + int _result; + char * _arg0; + char *_kwnames[] = { "str_id", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"s:wxXmlResource_GetXMLID",_kwnames,&_arg0)) + return NULL; +{ + wxPy_BEGIN_ALLOW_THREADS; + _result = (int )wxXmlResource::GetXMLID(_arg0); + + wxPy_END_ALLOW_THREADS; +} _resultobj = Py_BuildValue("i",_result); + return _resultobj; +} + +#define wxXmlResource_GetVersion(_swigobj) (_swigobj->GetVersion()) +static PyObject *_wrap_wxXmlResource_GetVersion(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + long _result; + wxXmlResource * _arg0; + PyObject * _argo0 = 0; + char *_kwnames[] = { "self", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxXmlResource_GetVersion",_kwnames,&_argo0)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxXmlResource_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxXmlResource_GetVersion. Expected _wxXmlResource_p."); + return NULL; + } + } +{ + wxPy_BEGIN_ALLOW_THREADS; + _result = (long )wxXmlResource_GetVersion(_arg0); + + wxPy_END_ALLOW_THREADS; +} _resultobj = Py_BuildValue("l",_result); + return _resultobj; +} + +#define wxXmlResource_CompareVersion(_swigobj,_swigarg0,_swigarg1,_swigarg2,_swigarg3) (_swigobj->CompareVersion(_swigarg0,_swigarg1,_swigarg2,_swigarg3)) +static PyObject *_wrap_wxXmlResource_CompareVersion(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + int _result; + wxXmlResource * _arg0; + int _arg1; + int _arg2; + int _arg3; + int _arg4; + PyObject * _argo0 = 0; + char *_kwnames[] = { "self","major","minor","release","revision", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Oiiii:wxXmlResource_CompareVersion",_kwnames,&_argo0,&_arg1,&_arg2,&_arg3,&_arg4)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxXmlResource_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxXmlResource_CompareVersion. Expected _wxXmlResource_p."); + return NULL; + } + } +{ + wxPy_BEGIN_ALLOW_THREADS; + _result = (int )wxXmlResource_CompareVersion(_arg0,_arg1,_arg2,_arg3,_arg4); + + wxPy_END_ALLOW_THREADS; +} _resultobj = Py_BuildValue("i",_result); + return _resultobj; +} + +static PyMethodDef xrccMethods[] = { + { "wxXmlResource_CompareVersion", (PyCFunction) _wrap_wxXmlResource_CompareVersion, METH_VARARGS | METH_KEYWORDS }, + { "wxXmlResource_GetVersion", (PyCFunction) _wrap_wxXmlResource_GetVersion, METH_VARARGS | METH_KEYWORDS }, + { "wxXmlResource_GetXMLID", (PyCFunction) _wrap_wxXmlResource_GetXMLID, METH_VARARGS | METH_KEYWORDS }, + { "wxXmlResource_AttachUnknownControl", (PyCFunction) _wrap_wxXmlResource_AttachUnknownControl, METH_VARARGS | METH_KEYWORDS }, + { "wxXmlResource_LoadIcon", (PyCFunction) _wrap_wxXmlResource_LoadIcon, METH_VARARGS | METH_KEYWORDS }, + { "wxXmlResource_LoadBitmap", (PyCFunction) _wrap_wxXmlResource_LoadBitmap, METH_VARARGS | METH_KEYWORDS }, + { "wxXmlResource_LoadFrame", (PyCFunction) _wrap_wxXmlResource_LoadFrame, METH_VARARGS | METH_KEYWORDS }, + { "wxXmlResource_LoadOnPanel", (PyCFunction) _wrap_wxXmlResource_LoadOnPanel, METH_VARARGS | METH_KEYWORDS }, + { "wxXmlResource_LoadPanel", (PyCFunction) _wrap_wxXmlResource_LoadPanel, METH_VARARGS | METH_KEYWORDS }, + { "wxXmlResource_LoadOnDialog", (PyCFunction) _wrap_wxXmlResource_LoadOnDialog, METH_VARARGS | METH_KEYWORDS }, + { "wxXmlResource_LoadDialog", (PyCFunction) _wrap_wxXmlResource_LoadDialog, METH_VARARGS | METH_KEYWORDS }, + { "wxXmlResource_LoadToolBar", (PyCFunction) _wrap_wxXmlResource_LoadToolBar, METH_VARARGS | METH_KEYWORDS }, + { "wxXmlResource_LoadMenuBar", (PyCFunction) _wrap_wxXmlResource_LoadMenuBar, METH_VARARGS | METH_KEYWORDS }, + { "wxXmlResource_LoadMenu", (PyCFunction) _wrap_wxXmlResource_LoadMenu, METH_VARARGS | METH_KEYWORDS }, + { "wxXmlResource_ClearHandlers", (PyCFunction) _wrap_wxXmlResource_ClearHandlers, METH_VARARGS | METH_KEYWORDS }, + { "wxXmlResource_AddHandler", (PyCFunction) _wrap_wxXmlResource_AddHandler, METH_VARARGS | METH_KEYWORDS }, + { "wxXmlResource_InitAllHandlers", (PyCFunction) _wrap_wxXmlResource_InitAllHandlers, METH_VARARGS | METH_KEYWORDS }, + { "wxXmlResource_Load", (PyCFunction) _wrap_wxXmlResource_Load, METH_VARARGS | METH_KEYWORDS }, + { "delete_wxXmlResource", (PyCFunction) _wrap_delete_wxXmlResource, METH_VARARGS | METH_KEYWORDS }, + { "new_wxXmlResource", (PyCFunction) _wrap_new_wxXmlResource, METH_VARARGS | METH_KEYWORDS }, + { "new_wxXmlResourceEmpty", (PyCFunction) _wrap_new_wxXmlResourceEmpty, METH_VARARGS | METH_KEYWORDS }, + { NULL, NULL } +}; +#ifdef __cplusplus +} +#endif +/* + * This table is used by the pointer type-checker + */ +static struct { char *n1; char *n2; void *(*pcnv)(void *); } _swig_mapping[] = { + { "_signed_long","_long",0}, + { "_wxPrintQuality","_wxCoord",0}, + { "_wxPrintQuality","_int",0}, + { "_wxPrintQuality","_signed_int",0}, + { "_wxPrintQuality","_unsigned_int",0}, + { "_wxPrintQuality","_wxWindowID",0}, + { "_wxPrintQuality","_uint",0}, + { "_wxPrintQuality","_EBool",0}, + { "_wxPrintQuality","_size_t",0}, + { "_wxPrintQuality","_time_t",0}, + { "_byte","_unsigned_char",0}, + { "_long","_unsigned_long",0}, + { "_long","_signed_long",0}, + { "_size_t","_wxCoord",0}, + { "_size_t","_wxPrintQuality",0}, + { "_size_t","_time_t",0}, + { "_size_t","_unsigned_int",0}, + { "_size_t","_int",0}, + { "_size_t","_wxWindowID",0}, + { "_size_t","_uint",0}, + { "_uint","_wxCoord",0}, + { "_uint","_wxPrintQuality",0}, + { "_uint","_time_t",0}, + { "_uint","_size_t",0}, + { "_uint","_unsigned_int",0}, + { "_uint","_int",0}, + { "_uint","_wxWindowID",0}, + { "_wxChar","_char",0}, + { "_char","_wxChar",0}, + { "_EBool","_wxCoord",0}, + { "_EBool","_wxPrintQuality",0}, + { "_EBool","_signed_int",0}, + { "_EBool","_int",0}, + { "_EBool","_wxWindowID",0}, + { "_unsigned_long","_long",0}, + { "_signed_int","_wxCoord",0}, + { "_signed_int","_wxPrintQuality",0}, + { "_signed_int","_EBool",0}, + { "_signed_int","_wxWindowID",0}, + { "_signed_int","_int",0}, + { "_WXTYPE","_wxDateTime_t",0}, + { "_WXTYPE","_short",0}, + { "_WXTYPE","_signed_short",0}, + { "_WXTYPE","_unsigned_short",0}, + { "_unsigned_short","_wxDateTime_t",0}, + { "_unsigned_short","_WXTYPE",0}, + { "_unsigned_short","_short",0}, + { "_wxObject","_wxXmlResource",SwigwxXmlResourceTowxObject}, + { "_signed_short","_WXTYPE",0}, + { "_signed_short","_short",0}, + { "_unsigned_char","_byte",0}, + { "_unsigned_int","_wxCoord",0}, + { "_unsigned_int","_wxPrintQuality",0}, + { "_unsigned_int","_time_t",0}, + { "_unsigned_int","_size_t",0}, + { "_unsigned_int","_uint",0}, + { "_unsigned_int","_wxWindowID",0}, + { "_unsigned_int","_int",0}, + { "_short","_wxDateTime_t",0}, + { "_short","_WXTYPE",0}, + { "_short","_unsigned_short",0}, + { "_short","_signed_short",0}, + { "_wxWindowID","_wxCoord",0}, + { "_wxWindowID","_wxPrintQuality",0}, + { "_wxWindowID","_time_t",0}, + { "_wxWindowID","_size_t",0}, + { "_wxWindowID","_EBool",0}, + { "_wxWindowID","_uint",0}, + { "_wxWindowID","_int",0}, + { "_wxWindowID","_signed_int",0}, + { "_wxWindowID","_unsigned_int",0}, + { "_int","_wxCoord",0}, + { "_int","_wxPrintQuality",0}, + { "_int","_time_t",0}, + { "_int","_size_t",0}, + { "_int","_EBool",0}, + { "_int","_uint",0}, + { "_int","_wxWindowID",0}, + { "_int","_unsigned_int",0}, + { "_int","_signed_int",0}, + { "_wxDateTime_t","_unsigned_short",0}, + { "_wxDateTime_t","_short",0}, + { "_wxDateTime_t","_WXTYPE",0}, + { "_time_t","_wxCoord",0}, + { "_time_t","_wxPrintQuality",0}, + { "_time_t","_unsigned_int",0}, + { "_time_t","_int",0}, + { "_time_t","_wxWindowID",0}, + { "_time_t","_uint",0}, + { "_time_t","_size_t",0}, + { "_wxCoord","_int",0}, + { "_wxCoord","_signed_int",0}, + { "_wxCoord","_unsigned_int",0}, + { "_wxCoord","_wxWindowID",0}, + { "_wxCoord","_uint",0}, + { "_wxCoord","_EBool",0}, + { "_wxCoord","_size_t",0}, + { "_wxCoord","_time_t",0}, + { "_wxCoord","_wxPrintQuality",0}, +{0,0,0}}; + +static PyObject *SWIG_globals; +#ifdef __cplusplus +extern "C" +#endif +SWIGEXPORT(void) initxrcc() { + PyObject *m, *d; + SWIG_globals = SWIG_newvarlink(); + m = Py_InitModule("xrcc", xrccMethods); + d = PyModule_GetDict(m); + PyDict_SetItemString(d,"cvar", SWIG_globals); + SWIG_addvarlink(SWIG_globals,"wxTheXmlResource",_wrap_wxTheXmlResource_get, _wrap_wxTheXmlResource_set); + + + wxClassInfo::CleanUpClasses(); + wxClassInfo::InitializeClasses(); + + wxXmlInitXmlModule(); + wxXmlInitResourceModule(); + wxTheXmlResource->InitAllHandlers(); + +{ + int i; + for (i = 0; _swig_mapping[i].n1; i++) + SWIG_RegisterMapping(_swig_mapping[i].n1,_swig_mapping[i].n2,_swig_mapping[i].pcnv); +} +} diff --git a/wxPython/contrib/xrc/xrc.i b/wxPython/contrib/xrc/xrc.i new file mode 100644 index 0000000000..13b1fe766f --- /dev/null +++ b/wxPython/contrib/xrc/xrc.i @@ -0,0 +1,161 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: xrc.i +// Purpose: Wrappers for the XML based Resource system +// +// Author: Robin Dunn +// +// Created: 4-June-2001 +// RCS-ID: $Id$ +// Copyright: (c) 2001 by Total Control Software +// Licence: wxWindows license +///////////////////////////////////////////////////////////////////////////// + +%module xrc + + +%{ +#include "export.h" +#include "wx/xrc/xmlres.h" +%} + +//--------------------------------------------------------------------------- + +%include typemaps.i +%include my_typemaps.i + +%extern wx.i +%extern windows.i +%extern _defs.i +%extern events.i +%extern controls.i + + +//--------------------------------------------------------------------------- + +// This class holds XML resources from one or more .xml files +// (or derived forms, either binary or zipped -- see manual for +// details). + +class wxXmlResource : public wxObject +{ +public: + // Ctor. If use_locale is TRUE, translatable strings are + // translated via _(). You can disable it by passing use_locale=FALSE + // (for example if you provide resource file for each locale) + %name(wxXmlResourceEmpty)wxXmlResource(bool use_locale = TRUE); // TODO, a better %name + + %addmethods { + wxXmlResource(const wxString* filemask, bool use_locale = TRUE) { + wxXmlResource* res = new wxXmlResource(*filemask, use_locale); + res->InitAllHandlers(); + return res; + } + } + + ~wxXmlResource(); + + + // Loads resources from XML files that match given filemask. + // This method understands VFS (see filesys.h). + bool Load(const wxString& filemask); + + // Initialize handlers for all supported controls/windows. This will + // make the executable quite big because it forces linking against + // most of wxWin library + void InitAllHandlers(); + + // Initialize only specific handler (or custom handler). Convention says + // that handler name is equal to control's name plus 'XmlHandler', e.g. + // wxTextCtrlXmlHandler, wxHtmlWindowXmlHandler. XML resource compiler + // (xmlres) can create include file that contains initialization code for + // all controls used within the resource. + void AddHandler(wxXmlResourceHandler *handler); + + // Removes all handlers + void ClearHandlers(); + + // Loads menu from resource. Returns NULL on failure. + wxMenu *LoadMenu(const wxString& name); + + // Loads menubar from resource. Returns NULL on failure. + wxMenuBar *LoadMenuBar(const wxString& name); + + // Loads toolbar + wxToolBar *LoadToolBar(wxWindow *parent, const wxString& name); + + // Loads dialog. dlg points to parent window (if any). Second form + // is used to finish creation of already existing instance (main reason + // for this is that you may want to use derived class with new event table) + // Example (typical usage): + // MyDialog dlg; + // wxTheXmlResource->LoadDialog(&dlg, mainFrame, "my_dialog"); + // dlg->ShowModal(); + wxDialog *LoadDialog(wxWindow *parent, const wxString& name); + %name(LoadOnDialog)bool LoadDialog(wxDialog *dlg, wxWindow *parent, const wxString& name); + + // Loads panel. panel points to parent window (if any). Second form + // is used to finish creation of already existing instance. + wxPanel *LoadPanel(wxWindow *parent, const wxString& name); + %name(LoadOnPanel)bool LoadPanel(wxPanel *panel, wxWindow *parent, const wxString& name); + + bool LoadFrame(wxFrame* frame, wxWindow *parent, const wxString& name); + + // Loads bitmap or icon resource from file: + wxBitmap LoadBitmap(const wxString& name); + wxIcon LoadIcon(const wxString& name); + + // Attaches unknown control into given panel/window/dialog: + // (unknown controls are used in conjunction with ) + bool AttachUnknownControl(const wxString& name, wxWindow *control, + wxWindow *parent = NULL); + + // Returns numeric ID that is equivalent to string id used in XML + // resource. To be used in event tables + // Macro XMLID is provided for convenience + static int GetXMLID(const char *str_id); + + // Returns version info (a.b.c.d = d+ 256*c + 256^2*b + 256^3*a) + long GetVersion() const; + + // Compares resources version to argument. Returns -1 if resources version + // is less than the argument, +1 if greater and 0 if they equal. + int CompareVersion(int major, int minor, int release, int revision) const; + +}; + +//---------------------------------------------------------------------- + +%readonly +// Global instance of resource class. For your convenience. +wxXmlResource *wxTheXmlResource; +%readwrite + +//---------------------------------------------------------------------- + +%pragma(python) code = " +def XMLID(str_id): + return wxXmlResource_GetXMLID(str_id) + +def XMLCTRL(window, str_id, *args): + return window.FindWindowById(XMLID(str_id)) + +" + +//---------------------------------------------------------------------- + +// TODO: Add wxXmlResourceHandler and etc. + +//---------------------------------------------------------------------- + +%init %{ + + wxClassInfo::CleanUpClasses(); + wxClassInfo::InitializeClasses(); + + wxXmlInitXmlModule(); + wxXmlInitResourceModule(); + wxTheXmlResource->InitAllHandlers(); + +%} + +//--------------------------------------------------------------------------- diff --git a/wxPython/contrib/xrc/xrc.py b/wxPython/contrib/xrc/xrc.py new file mode 100644 index 0000000000..ada0084f5b --- /dev/null +++ b/wxPython/contrib/xrc/xrc.py @@ -0,0 +1,139 @@ +# This file was created automatically by SWIG. +import xrcc + +from misc import * + +from misc2 import * + +from windows import * + +from gdi import * + +from clip_dnd import * + +from events import * + +from streams import * + +from mdi import * + +from frames import * + +from stattool import * + +from controls import * + +from controls2 import * + +from windows2 import * + +from cmndlgs import * + +from windows3 import * + +from image import * + +from printfw import * + +from sizers import * + +from filesys import * + +from utils import * + +def XMLID(str_id): + return wxXmlResource_GetXMLID(str_id) + +def XMLCTRL(window, str_id, *args): + return window.FindWindowById(XMLID(str_id)) + + +class wxXmlResourcePtr(wxObjectPtr): + def __init__(self,this): + self.this = this + self.thisown = 0 + def __del__(self,xrcc=xrcc): + if self.thisown == 1 : + xrcc.delete_wxXmlResource(self) + def Load(self, *_args, **_kwargs): + val = apply(xrcc.wxXmlResource_Load,(self,) + _args, _kwargs) + return val + def InitAllHandlers(self, *_args, **_kwargs): + val = apply(xrcc.wxXmlResource_InitAllHandlers,(self,) + _args, _kwargs) + return val + def AddHandler(self, *_args, **_kwargs): + val = apply(xrcc.wxXmlResource_AddHandler,(self,) + _args, _kwargs) + return val + def ClearHandlers(self, *_args, **_kwargs): + val = apply(xrcc.wxXmlResource_ClearHandlers,(self,) + _args, _kwargs) + return val + def LoadMenu(self, *_args, **_kwargs): + val = apply(xrcc.wxXmlResource_LoadMenu,(self,) + _args, _kwargs) + return val + def LoadMenuBar(self, *_args, **_kwargs): + val = apply(xrcc.wxXmlResource_LoadMenuBar,(self,) + _args, _kwargs) + return val + def LoadToolBar(self, *_args, **_kwargs): + val = apply(xrcc.wxXmlResource_LoadToolBar,(self,) + _args, _kwargs) + return val + def LoadDialog(self, *_args, **_kwargs): + val = apply(xrcc.wxXmlResource_LoadDialog,(self,) + _args, _kwargs) + if val: val = wxDialogPtr(val) + return val + def LoadOnDialog(self, *_args, **_kwargs): + val = apply(xrcc.wxXmlResource_LoadOnDialog,(self,) + _args, _kwargs) + return val + def LoadPanel(self, *_args, **_kwargs): + val = apply(xrcc.wxXmlResource_LoadPanel,(self,) + _args, _kwargs) + if val: val = wxPanelPtr(val) + return val + def LoadOnPanel(self, *_args, **_kwargs): + val = apply(xrcc.wxXmlResource_LoadOnPanel,(self,) + _args, _kwargs) + return val + def LoadFrame(self, *_args, **_kwargs): + val = apply(xrcc.wxXmlResource_LoadFrame,(self,) + _args, _kwargs) + return val + def LoadBitmap(self, *_args, **_kwargs): + val = apply(xrcc.wxXmlResource_LoadBitmap,(self,) + _args, _kwargs) + if val: val = wxBitmapPtr(val) ; val.thisown = 1 + return val + def LoadIcon(self, *_args, **_kwargs): + val = apply(xrcc.wxXmlResource_LoadIcon,(self,) + _args, _kwargs) + if val: val = wxIconPtr(val) ; val.thisown = 1 + return val + def AttachUnknownControl(self, *_args, **_kwargs): + val = apply(xrcc.wxXmlResource_AttachUnknownControl,(self,) + _args, _kwargs) + return val + def GetVersion(self, *_args, **_kwargs): + val = apply(xrcc.wxXmlResource_GetVersion,(self,) + _args, _kwargs) + return val + def CompareVersion(self, *_args, **_kwargs): + val = apply(xrcc.wxXmlResource_CompareVersion,(self,) + _args, _kwargs) + return val + def __repr__(self): + return "" % (self.this,) +class wxXmlResource(wxXmlResourcePtr): + def __init__(self,*_args,**_kwargs): + self.this = apply(xrcc.new_wxXmlResourceEmpty,_args,_kwargs) + self.thisown = 1 + + + +def wxXmlResource(*_args,**_kwargs): + val = wxXmlResourcePtr(apply(xrcc.new_wxXmlResource,_args,_kwargs)) + val.thisown = 1 + return val + + + + +#-------------- FUNCTION WRAPPERS ------------------ + +wxXmlResource_GetXMLID = xrcc.wxXmlResource_GetXMLID + + + +#-------------- VARIABLE WRAPPERS ------------------ + +cvar = xrcc.cvar +wxTheXmlResource = wxXmlResourcePtr(xrcc.cvar.wxTheXmlResource) diff --git a/wxPython/demo/ColourSelect.py b/wxPython/demo/ColourSelect.py index ee1360218f..cd9a4cfda0 100644 --- a/wxPython/demo/ColourSelect.py +++ b/wxPython/demo/ColourSelect.py @@ -34,21 +34,22 @@ class TestColourSelect(wxPanel): self.y_pos = self.y_pos + delta wxStaticText(self, -1, "Default", wxPoint(self.x_pos, self.y_pos), wxSize(-1, -1)) # name - self.colour_def = ColourSelect(self, wxPoint(self.x_pos+100, self.y_pos)) # default colour selection control + self.colour_def = ColourSelect(self, -1, pos=wxPoint(self.x_pos+100, self.y_pos)) # default colour selection control self.y_pos = self.y_pos + delta colours = [[255, 255, 0], [255, 0, 255], [0, 255, 0], [0, 0, 255]] # list of initial colours for display self.names = names = [ "Default Size", "Another Size", "Another Colour", "Larger"] # display names - sizes = [ None, wxSize(60, 20), None, wxSize(60, 60)] # button sizes + sizes = [ wxDefaultSize, wxSize(60, 20), wxDefaultSize, wxSize(60, 60)] # button sizes self.set_val = [] for i in range(len(colours)): wxStaticText(self, -1, names[i], wxPoint(self.x_pos, self.y_pos), wxSize(-1, -1)) # name - val = ColourSelect(self, wxPoint(self.x_pos+100, self.y_pos), colours[i], sizes[i]) # colour selection button + val = ColourSelect(self, -1, colours[i], wxPoint(self.x_pos+100, self.y_pos), sizes[i]) # colour selection button self.set_val.append(val) # store control for reference self.y_pos = self.y_pos + delta + def OnClick(self, event): result = [] colour = self.colour_def.GetColour() # default control value diff --git a/wxPython/demo/GridSimple.py b/wxPython/demo/GridSimple.py index 630a4fd43c..7a135bd9e3 100644 --- a/wxPython/demo/GridSimple.py +++ b/wxPython/demo/GridSimple.py @@ -1,11 +1,13 @@ from wxPython.wx import * from wxPython.grid import * +from wxPython.lib.mixins.grid import wxGridAutoEditMixin #--------------------------------------------------------------------------- -class SimpleGrid(wxGrid): +class SimpleGrid(wxGrid, wxGridAutoEditMixin): def __init__(self, parent, log): wxGrid.__init__(self, parent, -1) + wxGridAutoEditMixin.__init__(self) self.log = log self.moveTo = None @@ -25,6 +27,10 @@ class SimpleGrid(wxGrid): self.SetCellBackgroundColour(2, 2, wxCYAN) self.SetReadOnly(3, 3, true) + self.SetCellEditor(5, 0, wxGridCellNumberEditor()) + self.SetCellValue(5, 0, "123") + self.SetCellEditor(6, 0, wxGridCellFloatEditor()) + self.SetCellValue(6, 0, "123.34") # attribute objects let you keep a set of formatting values # in one spot, and reuse them if needed @@ -135,11 +141,12 @@ class SimpleGrid(wxGrid): if value == 'no good': self.moveTo = evt.GetRow(), evt.GetCol() + def OnIdle(self, evt): if self.moveTo != None: self.SetGridCursor(self.moveTo[0], self.moveTo[1]) self.moveTo = None - + evt.Skip() def OnSelectCell(self, evt): @@ -155,9 +162,7 @@ class SimpleGrid(wxGrid): value = self.GetCellValue(row, col) if value == 'no good 2': return # cancels the cell selection - else: - evt.Skip() - + evt.Skip() def OnEditorShown(self, evt): diff --git a/wxPython/demo/Main.py b/wxPython/demo/Main.py index 1ba205d7b5..6f1c2b2787 100644 --- a/wxPython/demo/Main.py +++ b/wxPython/demo/Main.py @@ -22,9 +22,7 @@ import images _treeList = [ - ('New since last release', ['ColourSelect', 'ImageBrowser', 'infoframe', - 'ColourDB', 'wxToggleButton', 'OOR', 'wxWave', - 'wxJoystick', + ('New since last release', ['wxTextCtrl', 'XML_Resource' ]), ('Managed Windows', ['wxFrame', 'wxDialog', 'wxMiniFrame']), @@ -63,6 +61,7 @@ _treeList = [ 'PyShell', 'wxCalendar', 'wxMVCTree', 'wxVTKRenderWindow', 'FileBrowseButton', 'GenericButtons', 'wxEditor', 'PyShellWindow', 'ColourSelect', 'ImageBrowser', + 'infoframe', 'ColourDB', ]), ('Cool Contribs', ['pyTree', 'hangman', 'SlashDot', 'XMLtreeview']), @@ -112,6 +111,9 @@ class wxPythonDemo(wxFrame): splitter = wxSplitterWindow(self, -1, style=wxNO_3D|wxSP_3D) splitter2 = wxSplitterWindow(splitter, -1, style=wxNO_3D|wxSP_3D) + def EmptyHandler(evt): pass + EVT_ERASE_BACKGROUND(splitter, EmptyHandler) + EVT_ERASE_BACKGROUND(splitter2, EmptyHandler) # Prevent TreeCtrl from displaying all items after destruction self.dying = false @@ -176,7 +178,7 @@ class wxPythonDemo(wxFrame): EVT_LEFT_DOWN (self.tree, self.OnTreeLeftDown) # Create a Notebook - self.nb = wxNotebook(splitter2, -1) + self.nb = wxNotebook(splitter2, -1, style=wxCLIP_CHILDREN) # Set up a wxHtmlWindow on the Overview Notebook page # we put it in a panel first because there seems to be a @@ -187,7 +189,7 @@ class wxPythonDemo(wxFrame): self.nb.AddPage(self.ovr, "Overview") else: # hopefully I can remove this hacky code soon, see bug #216861 - panel = wxPanel(self.nb, -1) + panel = wxPanel(self.nb, -1, style=wxCLIP_CHILDREN) self.ovr = wxHtmlWindow(panel, -1, size=(400, 400)) self.nb.AddPage(panel, "Overview") @@ -195,6 +197,8 @@ class wxPythonDemo(wxFrame): ovr.SetSize(evt.GetSize()) EVT_SIZE(panel, OnOvrSize) + EVT_ERASE_BACKGROUND(panel, EmptyHandler) + self.SetOverview("Overview", overview) @@ -470,7 +474,7 @@ class MyApp(wxApp): def main(): try: - demoPath = os.path.split(__file__)[0] + demoPath = os.path.dirname(__file__) os.chdir(demoPath) except: pass diff --git a/wxPython/demo/PythonEvents.py b/wxPython/demo/PythonEvents.py index 5a9655fedc..d7454aac6b 100644 --- a/wxPython/demo/PythonEvents.py +++ b/wxPython/demo/PythonEvents.py @@ -4,7 +4,7 @@ import sys #---------------------------------------------------------------------- -myEVT_BUTTON_CLICKPOS = 5015 +myEVT_BUTTON_CLICKPOS = wxNewEventType() def EVT_BUTTON_CLICKPOS(win, id, func): win.Connect(id, -1, myEVT_BUTTON_CLICKPOS, func) diff --git a/wxPython/demo/XML_Resource.py b/wxPython/demo/XML_Resource.py new file mode 100644 index 0000000000..d89f84d036 --- /dev/null +++ b/wxPython/demo/XML_Resource.py @@ -0,0 +1,49 @@ + +from wxPython.wx import * +from wxPython.xrc import * + +#---------------------------------------------------------------------- + +RESFILE = "data/resource_wdr.xrc" + +class TestPanel(wxPanel): + def __init__(self, parent, log): + wxPanel.__init__(self, parent, -1) + self.log = log + + # make the components + label = wxStaticText(self, -1, "The lower panel was built from this XML:") + label.SetFont(wxFont(12, wxSWISS, wxNORMAL, wxBOLD)) + + text = wxTextCtrl(self, -1, open(RESFILE).read(), + style=wxTE_READONLY|wxTE_MULTILINE) + text.SetInsertionPoint(0) + + line = wxStaticLine(self, -1) + + res = wxXmlResource(RESFILE) + panel = res.LoadPanel(self, "MyPanel") + + # and do the layout + sizer = wxBoxSizer(wxVERTICAL) + sizer.Add(label, 0, wxEXPAND|wxTOP|wxLEFT, 5) + sizer.Add(text, 1, wxEXPAND|wxALL, 5) + sizer.Add(line, 0, wxEXPAND) + sizer.Add(panel, 1, wxEXPAND|wxALL, 5) + + self.SetSizer(sizer) + self.SetAutoLayout(true) + + +#---------------------------------------------------------------------- + +def runTest(frame, nb, log): + win = TestPanel(nb, log) + return win + +#---------------------------------------------------------------------- + + + +overview = """ +""" diff --git a/wxPython/demo/data/resource.wdr b/wxPython/demo/data/resource.wdr new file mode 100644 index 0000000000000000000000000000000000000000..55d91a641d94f0474268e7d12bb527a9b5a940a1 GIT binary patch literal 5248 zcmeHLTW^~%6lV9UcF`tHdztdyzHEA7A1ICQ%`_Np;pJ3e#5No-oV#-j zjnM^R6EuK?b``?9emvsufhrcWS?H-_DpXZZLGXz92xA=Hmbt(lU?ANZBNzqgCLfyETnI6Q#=uoKt&(~jiw_ma}WQrBR(f6?L?k#caTQ-cIPM=R~|V#&mjhq zZT76JY~?tZeVvW;Os98?#@1$0aExV5{yfdWd0M$m#dsjna`7QCE@N7oc77G(DqCm) z@a9hg09UuV0nDp&RFolyXd&@#NhCbJ5C2&&`U*Y%hY;<=JR5fZ_YK}ktEeGDGWnLmPo + + + + + + + + 2 + 0 + 0 + 0 + + wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxTOP + 5 + + + + + + wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxTOP + 5 + + 80,-1 + + + + + wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxTOP + 5 + + + + + + wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxTOP + 5 + + 80,-1 + + + + + wxALIGN_CENTRE + 5 + 20,20 + + + wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxTOP + 5 + + 80,-1 + + + + + wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxTOP + 5 + + + + + + wxGROW|wxALIGN_CENTER_VERTICAL + 5 + + wxHORIZONTAL + + wxALIGN_CENTRE|wxLEFT|wxTOP + 5 + + 100,-1 + + + + + wxALIGN_CENTRE|wxLEFT|wxTOP + 5 + + 30,-1 + + + + + wxALIGN_CENTRE|wxLEFT|wxRIGHT|wxTOP + 5 + + 50,-1 + + + + + + + wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL + 5 + + + + + + wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxTOP + 5 + + 80,-1 + + + + + wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL + 5 + + + + + + wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxTOP + 5 + + 80,-1 + + + + + wxALIGN_CENTRE|wxALL + 5 + 20,20 + + + wxGROW|wxALIGN_CENTER_VERTICAL + 5 + + wxHORIZONTAL + + wxALIGN_CENTRE|wxALL + 5 + + + + + + wxALIGN_CENTRE|wxALL + 5 + + + + + + + + + + diff --git a/wxPython/demo/demoMainLoop.py b/wxPython/demo/demoMainLoop.py index 23067e9329..78952b464d 100755 --- a/wxPython/demo/demoMainLoop.py +++ b/wxPython/demo/demoMainLoop.py @@ -90,7 +90,7 @@ class MyApp(wxApp): # This inner loop will process any GUI events until there # are no more waiting. - while self.Pending(): + while self.Pending(): self.Dispatch() # Send idle events to idle handlers. You may want to throtle diff --git a/wxPython/demo/encode_bitmaps.py b/wxPython/demo/encode_bitmaps.py index 90aafdc903..b4845b7f0e 100644 --- a/wxPython/demo/encode_bitmaps.py +++ b/wxPython/demo/encode_bitmaps.py @@ -44,7 +44,7 @@ command_lines = [ "-a -n Tog1 -m #C0C0C0 bmp_source/tog1.bmp images.py", "-a -n Tog2 -m #C0C0C0 bmp_source/tog2.bmp images.py", - "-a -n Smiles bmp_source/smiles.bmp images.py", + "-a -n Smiles -m #FFFFFF bmp_source/smiles.bmp images.py", "-a -n GridBG bmp_source/GridBG.gif images.py", diff --git a/wxPython/demo/images.py b/wxPython/demo/images.py index 8dcfa599cb..0055daccb9 100644 --- a/wxPython/demo/images.py +++ b/wxPython/demo/images.py @@ -7,12 +7,11 @@ import cPickle, zlib def getMondrianData(): return cPickle.loads(zlib.decompress( -'x\332\323\310)0\344\012V76R\000"3\005Cu\256\304`u\205\030\003C\303d\005\247\ -\234\304\344l\260\200\036D (5\005\314\215\200p\335\213\022+\015\015\014\300B\ -\3710-\245\251`\276?\204\037\231\232\223\223_\016\026\321\206\210(\033\030$\ -\245A5)\020\000\020Ez`\240\020\201\035\214\010ED\205\023T\007\026C\362\201`H\ -*"\312wH\3414\252\210$EX\000\246"\177$\240\240\015\002\303B\021\341,\245\007\ -\000\242\360a\004' )) +'x\332\323\310)0\344\012V76R\000"3\005Cu\256\304`u\005\205d\005\247\234\304\ +\344l0/\002\310Sv\003\0030?\037\3047\000\002(_\017"\017\022\001\363\265!\362\ +NnP\276?L?\224\257@\000@\024\351\201\201B\004v0"\024\021\025NP\035X\014\311\ +\007\202!\251\210(\337!\205\323\250"\222\024a\001\230\212\374\221\200\2026\ +\010\014\013E\204\263\224\036\000\277\004Z\355' )) def getMondrianBitmap(): return wxBitmapFromXPMData(getMondrianData()) @@ -23,24 +22,24 @@ def getMondrianImage(): #---------------------------------------------------------------------- def get_10s_Data(): return cPickle.loads(zlib.decompress( -'x\332\355\231=O\3030\020\206\367\376\012K\014a:\305\022\342cea\353\322%\003\ -KT1Qa\304\306\277G\215!\037\216\357\35659P\253&\025\252\343k\236\032\367=\ -\277\347\344\372\360\3567\273\352\316\273\207[w\343|\265iw\225{\256\275\337\ -\273mx{\351\316)\236?\036\332\375k\327\321\304\216\253\373\372\370\352\272B\ -\354z\372h?}\035\273\234\243\345\207s\221EMXz4\024Y\006\250#,\262\202\305\ -\321\263\250\373#2b\305)\264b\305\341\255\254\337\261x,\225\262\370\337\224\ -\211\360,^ \\\204e\021\25366\302i\265\317~\016\225\213\344sh\264\224p\2509,\ -\237\333\223u\011\214\374\003+Y0\241H\312";Vn\346\373+\250\2105\272.6\307*\ -\031\336\322H\2165\031D\327\030\251d\314\234F\362\372J\307MI>MN\225|\234_\ -\300$\001\220\217|\236\221\020d\346+PPP2,\253\211?c\211\222\002\362\361\264Y\ -l\022h\336\301;\304\\\352\232V\025\207H\332\262Ve\207\230\265E\357\300\035B\ -\367\0164mV\35787V\316!@\357Hay\207\200\274\003\256\330\226\347cQ-g\271\207\ -\271H\226\351\334\033i\302P\253\2269t\011k\316\251\256\367\246\236f\352\265\ -\2465\200imbZ3\231\326rg_\373\366\377\271\276F\253\303\262c\015{\037\304;\ -\024T\037\202\264*\355\371 \026\270\027UY%{\344\341{P\357\020\366\356\303g\ -\3205Z\270\247 j\242t\275\247\325;p\357\370V\011\031x\307\217J\010\366\016\ -\311U\206\373\226Kk9\210\005\326r\030\013\273\207\014\262\260\202we\025\262t\ -\255\026\301\202\021k\226\333\206\317\300,\237\315\331=3\244/\214 \022u' )) +'x\332\355\231?O\3030\020\305\367~\012K\014a:\021\011\361ge`d\351\222\265\ +\252\230\2500\337\177\242\261\213\2238\276\273gr\240V\215+T[\327\374\352\232\ +w~\347\344\366\360\325n\266\315c\353\236\037\334\275k\233\315n\333\220\333\ +\273\227\303n\377\021F\3768\272y\015-\214\273~\374t\327\277\302\330\035\307o\ +\376\363\3754\240\345\315\271\310\242\316/m\035E\226\001\252\207E\226\267h\ +\211E\341\217\310\210\025\227\320\212\025\247\267\262~\307\342\261T\313\342\ +\377\247L\204g\361\002\341",\213X\265\261\021N\253)\3739T)R\316\241\321V\302\ +\241\346\260rnO\366%0\362\017\254l\303\204"9\213\354X\245\225OWP\025kt]\354\ +\216U2\274\345\221\022k2\211\320\031\251d\314\234F\312\372\312\347MY>M\206J>\ +\316/`\222\000\310G>\317H\0102\353\345\311+(\031V\324\304\237\261DI\001\371x\ +\336,6\0114\357\340\035b.uM\253\212Cd}Y\253\262C\314\372\242w\340\016\241{\ +\007\2326\253w\\\032\253\344\020\240w\344\260\262C@\336\001Wl\313\363\261\ +\252\226\263<\303\\%\313t\355\2154a\250U\313\034\272\206=\347\\\367{SO3\365Z\ +\323\032\300\26461\255\231Lk\271\213\257}\323/\327\367huZv\254\341\354\203x\ +\207\202J!H\253\322\231\017b\201gQ\225UsF\036\276\007\365\016\341\354>|\006\ +\335\243\205{\012\242&j\367{Z\275\003\367\216\223J\310\300;~TB\260wH\2562\ +\334\267\\Z\313A,\260\226\303X\330=d\220\205\025\274+\253\222\245k\265\012\ +\346\215X\263\3346|\006f\371l\316\356\231!}\003g\012\016\340' )) def get_10s_Bitmap(): return wxBitmapFromXPMData(get_10s_Data()) @@ -51,19 +50,19 @@ def get_10s_Image(): #---------------------------------------------------------------------- def get_01c_Data(): return cPickle.loads(zlib.decompress( -"x\332\355\331=\013\3020\020\006\340\335_q\340P\247\243\001\361cuqsq\351\340\ -R\304\311\342\211\233\377\336\232\224h\272X\270\267p\226\304\251A\036\332\ -\244\357\265i\026\315\335\315\216\305\332\321vEKr\305\254>\026t*\235;\323An\ -\027\177\314\341x\327\324\347\253\357\250B\307|S\276\177\276KB\327\376Q?]\ -\031\272\210X\337\210\202\305\225h[\305\301\002Po,X\202h\251\3056\255v2,Z\ -\255\244\302F\262\274\243\301\022\3137\204\025s\005\261Dt\027\031\255\356\ -\2144'6\212\005\317\266\210\315\01410C\026-\237l\206\335\253\312\020\231\267\ -\302`\011\246N\330}v\230\315v\266\262\225\255\336\037\177\347~\2505\244H\016\ -\264\006U\334?\267p\343\305\3619\314Z+Y%\352\254\336\222s\222V7\207,\200\361\ -\352\262\310\202\230G\303\331\3165:[\331\032\317\212A\265d}\257|\224VR\273'j\ -%+k\375<~\252\367t-\350}o1\333\311\0278CV\362\305\022P'\342k\231z\354\277\ -\336\360\000V\274R\304}/\300\014\211\315\014A\363\310b\323\352e\033\270\007\ -\206\334\233\303\355\031\362\0130\006O\245" )) +"x\332\355\331=\017\2020\020\006\340\335_\321\304\001\247\213$\306\217\325\ +\301\321\205\205\225\020'\211\347\377\237,mS)\213M\356%9I\353t\211y\002-\357\ +Aa7\274\353MS\235js9\232\203\251\253M\327Tdzs\035\272\376\351*\266\325\366\ +\346\206\253\333\261>\357\307\237\253\215\255\357\374z\204\202\344\303\030oQ\ +\313\322\321\222\267\000\324\210y\213\021#\265H\247e\027C\243e%\021\266\220\ +\345\034\011\226Xn \254\230+\210\305,;\311h\205#\222\034\330\"\026<\333\314:\ +3D\300\014i\264\\\262\011v\255\012C\244\336\362\223\305\230>\241\367\336\241\ +6\333\305*V\261f\177\374\235\373\\+\247IfZY\035\367\317-\334|Q\274\017\223\ +\324Jv\2112k\266\345\\\245\025\326\220\0300_!\213\304\210uT\234\355\322\243\ +\213U\254\345\254\030TM\326t\347#\264\222\336\275R+\331Y\313\327\361\333\275\ +\327kA\257{\215\331N\336\300)\262\2227\226\200>\021\037\313\304s?y\302\003X\ +\361L\021\327=\0033\304:3\004\315#\261Nk\226m\34070\344\2679\3347C\372\000\ +\012\360L\020" )) def get_01c_Bitmap(): return wxBitmapFromXPMData(get_01c_Data()) @@ -74,51 +73,49 @@ def get_01c_Image(): #---------------------------------------------------------------------- def get_12h_Data(): return cPickle.loads(zlib.decompress( -'x\332\355\231=o\3330\020\206\367\374\012\001\035R\340\200\203\2754\355ft\ -\351\326\003\232%\005\272\004i\262\324(\213.E\377}\315{\357\310\243,KT# Kd\ -\344C\262\365\350\345\361\276H\277=\376\332_\335^\337\354\207\017\357\206\ -\233a\177}u\177{=|\333\355\367\017\303\347\364\363Q\317\031\347\037\217\367\ -\017?\364\302\035.\274y\277\313/\275\224p\351\323\357\373\277\373\035.\011.}\ -y\374\256\247\204\323\257\217\307c\372\243W\016\206yz\332\355\236\360\250a\ -\340\347\037\303\000\026\337\245\347\036w\014\326\006\250\014\003+mqT\226\ -\344c\033\226\310\263a\201\225\354\327+\353\305X+#g\236\025\337\345\224_\231\ -/\224\2173\247\356f\031\212\301b\240NNx8\3759\300\031y\326W9\2402\214S\325\ -\345\237;(\352l\024g1\024X\204\001*,\353\012\217\364\277\323,\340\002\213O7\ -\263\017\225E(\260d\221\325\332\213I8\214v-+\316\014g\026,\006\343+\254\213e\ -\006\015,\022\011(\205\261\331\334\217\303$\253\030\324\337ee\271N(c\363\205\ -\212\272\310jTg\024\265,\375o\013V\2015\250I\326al\001g\031\301l\326\300R\ -\247\337+*\204\237\011\213\260\313\3618\362{\310\262iD\010\214`3\261m^\037Y\ -\014\202\236\221\205%h\265\310\\\362\325\250:;*\001\006\024W\030\373GgX\251a\ -q\312\200\374\003T\253l\025\213))HS\015P\016+\361\336\307\312\367\222\2502\ -\034vR\336\'K\215\313,\250!3\024k\026\244\230\341\363\324H\227.\330I\225\201\ -\232\004\320 \234\244K\227\336\017e\224q\242&S\373 \371\'\233\020\024\2269\ -\026\333\364\225\361\231\355\355\306S\356a\262\231]dQ\221\305\221\354\363g(\ -\314O\207\256\352\0056\213\246AI>\0016\312.]\354I\313Yyx&\312\236\260h{\334\ -\311\304\325\336.+\243\324\031r\216\355\361\325\242K\357va\234\034\225KJ\257\ -\337\2330\350B\3227\333\271\254\322f\244U\366"\205\361\224\254\036\026W\177\ -\312\012Q%+\253\262\271[\227\261\264\342\302]\225\005\235\210Z\341\036]d\263\ -\2303\242\012S\270\264\365WM\327\241\213\305L\257\267\327\214\010oEO \226+\ -\226\374\336F\242\022E\315\006\265\242\225N\347T\372t\231|\267=\251\315\311\ -\032\024\014\037$ZbA\277\016\204\010\026\002\213\264q\242b\254Q\003;5F\267\ -\004[\372\304\360\034\025\374\366R\037]\257\270%BZ\360\024\226\305\011Y\323s\ -\326X_\320\325\264p,\346\023\252K,\201@\342b\216\266\252\240#!!S\247\036F%"\ -\250GW\252!\242\343\205\203XoXl_\002m\211\225\274D\010EVB\323\032dQ\'\313\ -\234;\370\255N\014LO\2362\227k\355\224,\253%\006\356\325\245 \201\271\212,/a\ -\354\272\274\012,\214\021Q\\\303)\326\017^e\257\246s\203\257\225\212b\371\ -\231J\345[d\251\000\210b\256\311\226\270\024\271n]\336x\261\345\247\352O\336\ -\020D\362<\313{\245\260\256\205\026\321\216\207\232\262\267h{\022\342\330$jJ\ -\254\015T\251y=\275\234\210\303\274/L\\\307\227\210\335V=\272l.\275G\245$\ -\241\3374e}\275\257Wxou\213\027x\343\225(6\211\213k\321\024[\360\330\334\331\ -\210W\261$\254\015,\371y=@v\255\237\226\005\226\255\216\232\316\255D\2304,_\ -\375\\b\325U\235\371\272\307UBY\012\254\262*\273\300\212KD\036y\2226?\225UW\ -\213\323\254v\275i\021\235<{WTjV\261\223\254\260\250\256\236Q\375\255a\205\ -\325\365\024k\264>\367\244\265\011\313\232\236\020a%\2416\273\021\023\254\ -\263\375\014\262\362\035\353o}r\335%\231`\235\355\263\320h\013\245\312Z\364\ -\3731+y\323Z:\216\232N9l2v\263$\304{(?\034\026\3623\254\340\204\204=\'\257\ -\302\355\276\305\274\337\217\367\361\210\310X\211\353\316N\247\337\217\366\ -\027\311u\371N\344\350\311\276\0137\233\277Bc\355clQK\254\265{\2653\254\325\ -\307+\353%Y\027}\365?ai\033\326(\347l\370\035\330\226\337\315m\367\235!\377\ -\003{\'s\236' )) +"x\332\355\231=o\0241\020\206\373\374\212\225(\2024\322(\327\020\350NH\244d\ +\2124i\243\210\212\210\341\377W\234\347\3033\336\333]{\311Ji\342\010\202\271\ +\333\347^\217\347\313\276\317\257\177O7\217\267\367\247\351\333\227\351~:\ +\335\336=\310\220\371S\231\177\275+?2'}\ +\375\3562d>]\346?\371\317/\231\234\375\305\207\0372\007\207\3257\343\333\307\ +4)\013\237\370\255\343\011\225u\000\252\300\224\305G\214`Q\031\307\260\210\ +\336\014K,\266\277>X\357\306\332\0319\333\254\374*r\371)|\2022\256\234z\230e\ +(T\026*\352\342\204\347\313\257\263:#n\372*&T\201!\207.\177\337YPW\253\270\ +\212\241\304\002]\240\300\212\256\364\221\376{\231\245\270\304\302\313\303\ +\350KE\"H,\352\262Z{!\020\246\325\356e\345\235\301\302R\213\251\361\0056\304\ +2\203&\026\020%\224\300\320l\356\343\274\310\252\006\365WQX\256S\225\241\371\ +B\240VY\215\352\202\202\226%\377:\202Ua\015j\221u\236[\300YF0\23350\036\364{\ +A\245\3603a\031\266\036\2173\277WY\266\215\032\0023\330Fl\233\327g\026*Af`a\ +\251\264(2k\276\232U\027G\005\205)\012\003\206\376\326\015\0267,\344\002(\ +\177\024\325*\333\305B`\001I\252Q\224\303j\274\217\261\312\263@\242L\207M\ +\352\353`\251\261\317R5`\206B\311\202\2203|\331\032\032\322\245v\022eJeRh\ +\022\0164\244K\236WePp$&\023\373h\362g\333\020-,[,\264\355\253\3533\333\333\ +\203\227\334\203`;\333eA\225\205\231\354\373g(\335\237\001]\341\005\266\213\ +\246AH\276\001\266\312!]\350I\313Yey&\312>\241k{}\022\001\303\336.\253\240\ +\304\031J\216\035\361\325\252K\236va\310\216*%e\324\357M\230\352\322\244o\ +\266sY\265\315\340]\366\002\201\341\222\254\021\026\206?\025\205Z%\203\025l\ +\034\326e,\251\270\352\256\302R\235\032\265\204#\272\300v\261dD\021&pj\353\ +\257\230n@\027\222\231^\036\217\214\250\336\252=\001Y\256\350\371\275\255D$\ +\222\230M\325\222T:\331S\032\323e\362\335\366 6\007kPt\371J\202\036K\365\313\ +B\000\324B\312\002i\234\240\032k\326\300.\255\321-\201\226>uy\216J~\273\326G\ +\307\377\270%RZ\360\024V\304\021X\323s\325X\257\350jZ8$\363\011\321E\226@Tb7\ +G[U\220\225\000\201\251\023\017\203\032\0210\242\213#Dd\275\352 \326\033V\ +\333\327@\353\261\330K\004Af\2616\255I\026\014\262\314\271\223\337\312\306\ +\250\351\301Sf\277\326.\311\262Zb\340Q]\002\"5W\225\345%\014]\227W\201\316\ +\0325\212#\234r\375\300]\366j:7\365\265ZQ,?C\255|]\226\010PQ\210\221l\001k\ +\221\033\326\345\215\027Z~\012\177\362\206 \223\267Y\336+\245s\255j!\351x\ +\240){]\333\003\001\346&QRb4P\265\346\215\364rD\016\363\276\2201\326\307\200\ +n\253\021]\266\227\336\243\002S\3527M\331X\357\353\025\336[\335\352\005\336x\ +1\344&\261{\026\345\334\202\347\346\316V\274\213E\351l`\311\317\353\201f\327\ +x7uXv:j:\267\032a\324\260\374\364\263\306\212S\235\371\272\307\025kYJ\254z*[\ +a\345#\"\316\367\244u\010\313\232\236\024a5\2416\ +\267\021\013\254\253\373\014\260\362\235\353o|r\334\222,\260\256\356Y`v\205\ +\022\262\272~?g\2617\255\265\343\210t\212\351\222q\230E)\336S\371\301t\220\ +\337`%'\004\275s\362*\334\336[l\373\375\374\036\017\000\214\305\0307;\203~?\ +\273_\004\327\3457\221\263O\366[\270\315\374\225\032k_c\213\352\261\366\336\ +\325n\260v\217\017\326{\262V}\365?a|\014k\226s\016\374\016\354\310\357\346\ +\216\373\316\020\377\001\021~l\222" )) def get_12h_Bitmap(): return wxBitmapFromXPMData(get_12h_Data()) @@ -129,49 +126,48 @@ def get_12h_Image(): #---------------------------------------------------------------------- def get_13d_Data(): return cPickle.loads(zlib.decompress( -"x\332\315\231Kk\0341\014\200\357\371\025\003{H\301 v/mz\033z\351\255\206\ -\346\222B/!M.]\352R(\245\377\276c\353a\3113~\354\003\232I2\313x\263\237eI\ -\226d\355\233\343\317\303\315\375\355\273\303\364\376\355t7\035no\036\357o\ -\247\257\373\303\341i\372\024~<\247g\300\347\017\307\307\247\357i\340\001\ -\007vw\373\370\223\206\002\016}\374\365\370\367\260\307!\217C\237\237\277\ -\245G\207\217_\236\217\307\360'\215\314\204yy\331\357_p\252\035O\365\033\237\ -\247\011.\277\246\011Y\360\020.\275\036\000YW@E\030\262\3025.f\371\345\302\ -\333\353b\205H\271\210dY\027\2424\353R\224a\205\360*\345\"}\235\270s\232v\ -\264~\013n\271\200\376\362%\377Te\245\033\277\353\005\266\314\236\3762\017P\ -\376xk\372*\275+\352\003OW\346%T\274\203\037ay\261\205hFxI Wg\251\221x\233\ -\023k\016\2451\3220\204SX3-kV\352]\244\311\266K\250\252\035E\333\033\254\364\ -\011\010\002#m-J\011\025\026)\210\374\226.2\030\020\213~\220^g\315$\007hT\ -\204\355x\355\232\345\204\276\301\022m\227rA\330d\265\364e>\253\364\245<\\\ -\261\332v\324r\031\026\354\252\202U}\"\353k\303\277V\312o\371\275\261\243\ -\361{4\033\254W\031g\360}\377\012&6\302\246\372q\257\016\354\241\034'\224\ -\337\233u\216\262\012S\003\023\317\220\213v\213\354\302\220w\322\351,\245`QV\ -\241\375A\026h72\343\253@\337g\311\304\000\016\014\207C\252\203\020\032\271\ -\243\320\027\003\234\226\004x\033\",=t\355H\240%\204&X|\005\324c\312$\274\ -\265\235\203\276\177-\037\217\224\304X^\010\266\322\030\270\320\267#\206u\ -\207\313\212\244\210\266\011\022\206\364E\244\005\342hy\361\266\212\205C,\"\ -\245\\\015(^Y\203\322\372+\271\326\260\210\304\371\032\254w%\024\301\272,\ -\310\012\211\346\"\223\345\374\237\326\356\330\272m}1)\260\\\220u\215\250\ -\345\231am\026\241pa\262R \323\242\3363\254\307\222\031E0*PH,\275\037:,vN\ -\315\222\025\262;x\224\254\257/\206\221\266\270l\322b\015\262\274\2069%\027\ -\213\345\023e\314W\221\006fiA;;\344\011\273~\237fu\270\221(\0252\313q\004AX7\ -\256\246\3776,\200\274\013\222\032E\370\256\337\343/\373\246T\254\254\274\ -\014\033e\211\266\265\342\270\\E\030\270\2415f\261\330%4\213`\316\365\343W\ -\222\314\211\266\210\224=\236\246t}V\206\211oR\022\322\332\247\030\320]#\302\ -\020e\302\262\332Rih ?b8-\024o<\014\341\276\317bX\031\231\201\2036\223\274\ -\037\265\243-lT\036\241\254\342\373\361+\353\332&1\017&\317y\312N\355\374\ -\350`\363@J\316I\353\007O\225O/~\3454O/l]\220\234\011\\\220u\362\266\224\036\ -\\A\224\373\010 WW\003\372\342\322(\250$$\221'\027D\335\275]+\335T!d+\321\ -\016\253\250(U\251\251\212\315\356\032\231e\217x\272\0026\225\350\211,1>\224\ -\205\355YrA\321\216\360\255\376DO.+\226>,\345\323\317&\253v\226R\207%\257NO|\ -*\333\226\213\212.\263\316 \2561\333&\201\234\026k,\007[\253\334\001\330.\ -\2019\305\266X\033\260\260f\345\323\365\366\036\252\012\266q\262o\311\265\ -\352\032(\326.\024\035\207\216\276R\017#\024GU\255\232P\232\325\364{\266#'\177\033z\ -\346U\023\252\317\242\334jx+\277W]\270\246\337c\317\221y*\037\252\375\330d\ -\345\336\206\3443\335\177\\\305\211\334\265\254\366'B\321\005\345\276h\3213\ -\015\271\235\332\310\265\343\275Z\352\363^\347{\205\332~<\027\366\012\345\ -\272\242\276\352v=\337}}X\276}Y\036\227\207\273O\257\317w\260\274-\337\ +\337_\337~\343,m\263\323\023\016\234\237\362\374~\033<\177\311\363\307\373\ +\374\207\363H\237\317\237\300\371\262\315\177\246?\277p\262\312\233O?p\036\ +\004\256\037\206\353\307\262\020\013^\322\265\343\005\210u\003T\206\021+\335\ +b\010+n\203.\037\213\2252\345*\222g]\211\262\254kQ\216\225\322\207\224\213\ +\365u\346\316\351\332\321\373-\204m\000?\312\320\0175Yx\221w\243\302\266\273\ +\343\243\360\200\344\317\227\256\257\362\273\252>\210<\012\017Q\371\012q\206\ +\025\325\026\252\031\345\241@\241\3152\257\344\313\212\2545\325\306\300\227!\ +\235\303ZyY\253Q\357&M\261\035\242\232vTm\037\260\360\033\220\024\306\332\ +\332\224\222\032,V\020\373-\0176\0300\213\377\210\336f\255,\007XT\206\235d\ +\355\226\025\224~\300Rm\327rA:d\365\364\345\276k\364e<\334\260\372v\264r9\ +\026\234\232\2025}\242\350\353\300\277v\312\357\371\275\263\243\363{2\033\ +\354W\231\357\020\307\376\225\\l\204C\365\323^\235\330C%N\030\277w\353\234eU\ +\246\006!^ \027\357\026\335\205\251\354\244\363YF\301\252\254J\373\223,\260n\ +\344^\337\005\3721Ko\014\020\300q$\244\006H\251\223;*}\011 XI@\266!\301p2\ +\264#\203\266\020\212\260\374\014\244G\314$\262\265C\200\261\177m_\317\024dl\ +O\014\333i\014B\032\333\221\302z\240eeRF\373\004\011S\372b\322\006\011\274\ +\274|\331\305\302)\026\2230W\003\211W\327\240\274\376F\256u,&I\276\006\357]\ +\210b\330\220\005E!\331\\l\262\222\377q\355A\254\333\327\227\220\222\310\005\ +E\327\204\332\346\002\353\263\030E\013\323\225\002\233\226\364^`#\226\336Q\ +\005\343\002\205\305\262\373a\300\022\347\264,]\241\270C$\311\306\372\022\ +\030kK\312&+\326$+ZX0r\211X\021)s\276J4pKK\326\331\241\334p\350\367x\327@\ +\033\211S\241\260\202D\020\202\015\343*~\332\261\000\312.@5\252\360C\277\247\ +\177\361M\255XEy\0056\313Rm[\305I\271J0\010Sk,b\211KX\026\303B\030\307/\224,\ +\250\266\230T<\236o\031\306\254\002S\337\344$d\265\3171`\270F\202\021\312\ +\205e\263\245\360\245\211\374H\341\264R\274\3630\202\3071K`ud\006\011\332B\ +\212q\326\216\276\2601y\204\263J\034\307\257\242k\237\304"\270<\0279;\365\ +\363c\200\303\003);\'\257\037"W>\243\370U\322\364\254\273&\324\230\305\271\325\361v~o\272p]\277\247\236\243\ +\360L>4\373\261\313*\275\015\315g\266\377\270\213\023\245k\331\354O\244\252\ +\013*}\321\252g\232J;\265\223k\347{\265\334\347\275\315\357\012\255\375x)\ +\354\003\312uC}\265\355x\321\372\032\276\372?Y\273\275}\303\337\300n\371\333\ +\334\355~3\204\177L~vj' )) def get_13d_Bitmap(): return wxBitmapFromXPMData(get_13d_Data()) @@ -182,787 +178,780 @@ def get_13d_Image(): #---------------------------------------------------------------------- def getBackgroundData(): return cPickle.loads(zlib.decompress( -'x\332]}}\177\023G\262\356\377\367St\230q\223\350e\360\314h$\220f\346\'\360Y\ -\310nb\224\023\022\322\013\227\315\332F2\370\205\301\006Y\210\263\'\237\375v\ -=\365tK\334\370g\343\310\322LOu\275\327S\325\337_}\314\377\317\213\373yuh\ -\360]T\246\270\377\177N^\3347\346\377\036\346\371\231I\362\207\243\223\374!^\ -\313v\257U\005_s\341\265"\257\212"\307k]|\337\341\250\310\017\361\332"\274V>\ -\032\227\245\276\257\037_\313\307e\361\010\257\315\343\365\036\371\353\351k\ -\3117\257\351g\323\375\317\362z\007\273\265\214\302\372\354\336gOx\275\336\ -\356\263\361\265f\357\263\341y\207{4\010\3171\373\3465}\337\364\233{\350Z\ -\332\375\353\361\265\301\336\232O\271\346z\217.\247\245\256%\337]/\322\245\ -\330\243sXs\371\315kz\275\321\036\355\303sT\373\327\343}\307\337\254E\2577\ -\331}\266|t\250\237}\270\367Z\316\327\036}Cg\245\313\3417\373\241\327\273\ -\371f\317\365\265\315\356\265I9R^[\356\363\025\237\343\366\233\347\320{|\336\ -\347+\256e\033^\033\025\361z\353}\236$\015\336\357\356Q>\342\365>\356\350\ -\022\367\350d\367\331H\373O\373\367\340s\274\335\2756>\345}W\373\317\306\367\ -\235\177\263\277z\217w\373\237\345\373.\366y\222\357\273\374F\006u\315W\373{\ -\304\327\276\206\327\016\037F\272|\331]/\256\345l\377z|\336\273o\344W\337w\ -\272\273^\344\203\017q\315\'\223\323\321\011^\273\336\243K\240\301\361\276,\ -\3609\236\307\353\011\017\351\232\237\354\335#\360\325\313\375\347\340\263\ -\035}\363>}\355\3257\372E?\373\370\233\265\350\372^\354\356[<\342g\377\353\ -\0339\327\327\236\356\236\355\341\210\237}\266\367\331p\337\037wk\211\327\ -\373\307\336\263\205\327~\332\355y\244\301\317\341\265\252x8\252\224V\277\ -\354\363$i\360\367o\344M\257\367\373\276\274q\337\376\271\307/\341\265\337\ -\366\344(\354\357\257{\274\026\370\340o\2735\347\017y\217?\276\331_]\337\177\ -\177\303\317z\275\357\366\336\027\344\355\257oh\240\317\361\257ot\230~\366\ -\3017k\326\265|\277{\336(\253?\354\321%\360\306\237\337\360\244\256\371\337{\ -\373v\2464\275w\177\357\276^\336\356\311\373\336\354h\020\367\367\365\336\ -\263\205\347\375\237\335k\361}\377\273\317W\244\337\177\366\365\006\327l\262\ -=\036\342\376f\331n\317\271\276\373.\333_\237^\257\333\275\026eu\021?+\317\ -\246k\351g{:;\330\313l_\316\225\316I\266\367l\274^\232\355x7\360\325\301\356\ -\265(\0136\256%\217\372\245\267[_\224\267\346\233g\323\365\015\263\275}\013\ -\3662\276&2H{\371\315k\372\276\366\233\373\352\373\006\331\276\274\351ku\266\ -\257\307\365\265<\333\327\331J\203b\267\276G#\256\257\334\3214\2766\332\243_\ -\340\203j\377yy\275\361\336\232\003\375&\331\276\037\241\357{\270[s\224\255G\ -\2735\307\3478\314v2x\310\367\335\354\357\007\337\267\311\366l<\237w\231\355\ -\351\010\322\371v\307\177\221\257\214\311\2143\306t\376\347\302\364\315\334$\ -&5\007\306\232\236\377}n\03234335\255\177\217\305\327\300\324\376k\340\177\ -\313M\201okJ\3775\362\337\225\031\373\277\244\376\263\316L\314C\377\331\241y\ -\344?\237\340=\025\3365\366\237\031\373\337\012\\-\365\377\246\376\377+\377\ -\211\221\377>\364\177I\375\353\262\032\353?\347\360\273\376+\277M\375\317\ -\261\377)\357\252\374\225R\277\026Y}\356\377\257\357\377\222\372/Y\333\310\ -\277\232\033\375\257on\360\351\304?M\203\265\311\012K\377I\213\317\032\334m\ -\343\257\232\342\016SO\223)\276J\377\275\364\237\321\273\323\301\275\305E?\ -\373\017\366\314\326\1770\361d\352\374C\032\377=\363o\356\374\243\313\317\ -\016\313^\343\321\255_\236,l\351_\021\202/A\276\212\177+q\013\347\311>\361_\ -\357\315G\377\336)\010~\342\3776\306;\327\376\357\245\377.\374w\205\345\024\ -\274\252\365D\263~\015\013l\231<\214>\322\'<`\337\277\347\255Y\371\307\333\ -\372\353\310]\006\376\212\347 \325\000\304\224\355\024R-\375{\345\016\271\ -\377\377\324o\\\007\302\013#$ Xe\336\371\277]`\323,\010/?e]\227\376\323S\377\ -\267\276\277\217\363\317"L\225\370\367\323\273\316\374\333r\022\306\372\305\ -\010\301\016\300W\306\\\201G\206\376cr\303\006\013\267\340\011\341\261\034\ -\273X\373\305\227 X\212\005\016\260Oaq\215\277V\343\1777\346\253\177m\354\ -\227\360\005\234v\306\307\355@\246%\31160wxu\204\255\222\273\033\277\252S\ -\377\227\005\371N8hk>\370\257-\356\346\310\367\362\357\312\337O\376z\216\377\ -w\374\204\215\004\023\356j\261\231\251\277\336\326\\\373\357\024\317r\014\ -\002\311unA\236)h\322\367\233\224\362\251\204\230$X\351?X\203$\317\375\342:\ -\363\004$:\365\017*\257\265\376a[O\367\231\377\275\240P8\010\203\354a\346\ -\377\326\307\247\205\3076\330\333\024\214.W\030\372\375\023\222\311UO!6\265\ -\'\227\334\361\245\177m\012\316\356\300U\016\237+\374\357\207\270G\013\345 D\ -k\375;.\261l\007\036I!x[O\332\022\237\037\371\265\3516.\300#\312O\226_\372\ -\340\372\351!\236F\336\335\363w9\307\373*\374\375\306\377\253bg\300\367\362\ -\211s0\204\374U\204\267\305\235\031\343\004\016\223\305\253\020\315@\274\231\ -\177\333\221\337e\007N\261`V\007\221(q\331\002\237\323\0356\340\216-\036D\ -\365\202~\211\316\230A\334;ORY\240\210q\011\002\032l\206\354\334!EI\257\370\ -\312\337\273\203\366\274\302\025\344\016-\356n!\230*|)\224A\003"\236B6R\010\ -\276\360X\342\357\320#\337\245\320\320\216?{~5\035\337\2532q\210k\025\236\ -\360\031V\336\207\354\244\324\324+\022^5=\203G\203\375M\270\270\026\342s\340\ -\027\333@\227=\367\377Z\220\314Q\271\276\005Q*\317\227\217\241S\204\245Us\ -\345\370\251\034\266\246\252\356p\315\265\3777\243\3209(\370\016:\263\306\ -\327\230\217\260\004\341\034\210)\3023\203 \315\300\025\026\244P"d^pShB\207w\ -\006\375\352@,y\255\001OL\375\277\252\241\205\330\362t\265\177\347\020\374k!\ -\252+\377}\210O\\bC\205\204+\317]\362s\313\315I\241\013\347A\351[\352\035KM%\ -z\343\005\364\227\250\306\013\177\361\235%)\361{\212\007O\361\240\031\205!\ -\354\240\361\017[\202\033\317\260\317\252c\246~\007\015\364\235,rI\273<\201\ -\305K\361Ua\013\034x\254\302\303\012\307\317A\260\011\010\371\216:\3469\270\ -\363\226Z\305\201kz~\005\013|\246\201\251\372/h*\331\360K\362\223\345\025\ -\023Z\336>\245BM\225\360\317\022\344\274\206\001IA\260\032\237\352\341\036\ -\315N\207\335B\033M\361\010\013\354B\343\011&;\324\202\333\304\326\264\324\ -\035A\306]\344\245\332\357\303;\350\260\024B\320Q/\031\232q\307\2574j\276\ -\247\236\224\237\261\3733\010\210\211[Pc?\365\223\255\'\223\361\272Exs\216GX\ -`\005\316\023\254\244\033Sy\016\250\360@C\010\360\251\277\356\004\034\344`\ -\353\035x\357\024z\312\340\272\251\277\242\303\373+\177\377\227\376\332#\362\ -t\201\'Z\301\230\254h\353\035\270S\236\376\024B\337\031\346\310J(\312\032\ -\213\0225\373\304<\363\177V\375\322RG\005^\310i5\324\215\220\233\365ID]\220\ -\032\357\206"\234zb\246\020\317\212\304]\371\245MA\36297\340\302\377\337\205\ -\377\3531Ty\3525\230p\326\024\334\365#5\230\243X9\2227\205\371\021\357m\215\ -\367\212\320\212\013\322\203\3278\304V\325\376;\201\012I\311\215\347\376\357\ -\272\231\247x\236\021\256,\317\242\374\272\205\036U\243\363\212lr\027\271\ -\321\004\035\226\371\217\234c\251\026\032\240\205\020\264\020\264\0130\270Py\ -\013\225\234{;\370\311\337\340\037\236\2057\020cY\272h\020\021\301ids\341\ -\317\022\213\256\375\265\325\345=\367\032OwO\036\373\326\277*>\320\324\023\ -\312\322\266m\375\277K.\255\205\312\027\223\223\320Eq ^\211\315\320\015\256`\ -g\035\2104\007q\344\216=uT\333\006\374\247\257\364\374^w\260W\ -\005\037\244\205\343\232x\207wN\356\250!\222\372\3305,\330\2126z\346\177\316\ -\341\304\030\334}A\025 \302{\012#c\351\274Z\2306\371|\237\253\255`\017\205\ -\240oq=C\205r\2055\210>\277\202a\272A\244\0239,\370.\016d\032z\221\274\362\ -\267\272\202\330$\264Jg\330%\335\005}\340\022\213I\301w\216\017\032\264\307\ -\220\312U\224\356\023\360\237#\037\251\375<\303OK\275xG\'\303R\354\203\026K`\ -\253;<\244\274\363\202^`M\235g\341\014\251aY\343\201\364\256B8\011\206DS\336\ -\200\2709EX\3044\307oj\015\365:S\374\265\217Mr`\224\206~\202z\241)\025\277\ -\013\034\246v\322\300\255\230\203\256\032?\212\355\271\361\374Ty\246\254hh\ -\267\376\342%D\252\300N\013\3416\376/j\340\207\364\355\037z\336\020\262\035\ -\3001\230x\226\037R\003)\'\350C\226t%\014\036\326\320#\257\301\327\015xt\350\ -\257\324QO\335\371\367\213wh\270\222\032\217m\030i\026Q\317:\010\221:\241=\ -\274\262"\201\0260N\216Q\303\000\353\257\242\213\253\362\261\000\271\304\003\ -=\240\321\273\300\2735j\211\004\313\260\337\252%\236y\315a\351\262\016\243\ -\272+x\213\025\0269\002w\311BF\010\246\345\325\245\347&\025fQ\326\247>\202<\ -\202.T\035\323\3211n\250`\325k\033Co9j\317\324\223^\215\205\350\321\367P\342\ -?E+\233\322\275YC\021\374\354\277\006\320bb{\027$xI\221\263\320K\016v\256\ -\200\343\240\276^\010\230T\003\346XyM\017O\324\321\031\342\314+/\025\357\375\ -\263\310v\277\007\251\354>\301\2762\024\260\376\201[\177\3539#.\015\273[\360\ -N\006#>@\300[\200C\016\261k\026\267\375\202\014\205\245\327"\273\364\310\374\ -\342?\377wO\260G\364\366\015\355mM\362\227\360\367S\360\246\2450X\374~\007U~\ -\344\027}\340\371Tl\237\012t\237\217\253<"\306\307B\347)\227\251\265\356p\ -\205>r"\206\366\3340&\031\200\007\015#L\213x5g\300%\376Y\017.\262\250\221\ -\367\336\255z\017\242\275\367\034~\012U\243\033\036\323;\035\255\315\334\253\ -\351w\364_^\340\313\200T\225\277\245>\340\006\374\250^\312\022a\322\000\177\ -\315\261\370K\330\266\237\374\317\367\324\207-]?\203\250n\016\376\350\223\ -\3034\255c\370\272\274\347\025\311\321\372\345N\030\264_D\353\326\213!\312\ -\024*B\370\353\222\216\206F\014%\205\262\217\327\344}\035\034\327\234*>\304\ -\254\031\234\033CEr\211\253_\200X\302I3\244\245~\364O\362\273\377\377\207\ -\240\316lG\260\021\224vb\376\351\177\376\342\037\326"\255"\273\365\031\232\ -\314\202\037N\340\237\213\336\272\204\233`\270\327c\020\254\244\021\260t*\ -\014=\356\036\264\2138$\247\374\204,\361\214\004\377\015\033\240\351\233Y|\ -\207\206\311\022\321\212K\361\023#\201\206\034\323gd\233\321\313\267x\024\ -\013"\275\363\334y\016.\016aQ\013\2430\247\241r\364\034\007 c\356\035\232\ -\024!\270E\326k\337\316\213\355\025\036\237a-\226J\177\036tX\317/V.\376\213\ -\247\352\013xb\237\261/7X^\001Y\227\234\323\027XE\215\323\022\010l\206\324\ -\216\350\203\014\271\213)U\273\006!\206\301\357\330\377\345\324\177k\246\352\ -\006\216\343\010\304+\26013\270!\216>\223\332`\311\304\211@\376\312\350"pXB\ -\267\326\361\367!V2C\360\375!\346\265\032l\351\034\032\365\224\004]c{j\357\ -\015\256ht\032\317\032\003\304\014\232\230\022c\361\211\001Q\343\267\265Az\ -\353s\274\263\013"\351\240\236\1774\177\363\337\223\230\212\261p\002e\031O\ -\375\215N\340\213I\352\357\035\355R\017vn\203\272F\2364\003\3575\014U$\307\361\230\276\223\272\2339?\ -/Jy\213\324\233f\3525\330\261P\357i\264v\362\333\313\310q\0327\034RgY\354\ -\356\014N\212\001\007I\006\245\004g\215\374\265\336E\027!\301z\206 \340-\264\ -\323)m_G\357/\204C\232\263\253\030!L\021\330\347p\225\266\346\277I2\011\347/\ -=\035N\241\273R$@S\020\375.\270\025\222\257\377\316_\360\221\'\330\013&\344\ -\324\242(\255\327T\224\226\371\325S\177\301\205\017%4\217\025\362\233S\346\ -\234\034\265\336\302\223r\000\343_#\350\251\371\267\031w.\370wb\031E-/\241\ -\003\225\263\357\374o\235_\364_~\321w$\3603\377e\260}j\214\324\333j\310\015\ -\015=\371\012\226\274\304=W\024\350`*n\3510\227|2\375\022\205\363\207\177\ -\357\200)\006\365\335Ds]QwjL\275\306}\230\017K`<\305N6p\011\306\236\237\256!\ -\317%\325vM[\270\304~K$\2202\353y\022\263\367\222_(\261\234\234\2712\021\263\ -\307\010\236\022j\255\026\216\206,\341\220\017hi9\305I\311a\006\012\374\036\ -\310\240a\211\350\300\347\334\226\006\212@\362\037ZI\272\245[\233#\233\265b5\ -*\365\244\0303R\265\321)\267\221\005,\327,\033z\202\374I\216uOi|\324\025\232\ -\343}i\274J\324aC\277\177C\357;\035\200\305W\3761\257\231\215PrhRg\214\235\ -\232 y\335\367\227\310a9\325O\356\321\022\025\330=]\364opt\257\241r\023pJKr\ -\0373DVm9&\301\244\3246\002\037/\231\270^D>\037\302\256\272\350\251\257\231\ -\232I\361\371\025\376\025\221\252\240s+\220o\000?>$\031\205s\325Q=\215\351\ -\250\204\331\275\177\2019J\362\255Z\332\013>\225\376TMF\202\211\203y\344U\ -\376\021\0346\303\240\241\202\313\23205X\203U5@\377\014\371\266(Y\214\231/\ -\322\020\275c\200\222SW\250\016\323\034\252z\317\ -\015!\002"\232\007\376vG\314\216\205\200v\013\3534\206\235\022\242\255\220\ -\034\224\370`\204 \270 \213[*S\211;5x\321j\300\010\026S\2438)dI\221\341o\376\ -\373\002X\212+/\370sf\353Ua\177\245\313|\201\317\2351\311-\217t\306\334\325\ -\005H6e\004\370+\036\364#6\244eu\340\002\374\366\036\374\256\3373\272P\252B\ -\0264\012\216\241\323M\004\210\246\310\361u\250\322*\354\017:L<[-%\264p$\316\ -\300\214r\331\200\224p\220|-}\256P\205|\214\344\215\260\264&C2\272\265K\212R\ -\316\275\372\014\202\005\024F\001\327\363\026\311\337\031\012i\232\347}\342\ -\027\231\370\237\247>\006PP\235e.c\315J\316\015s\007\005\355h\005\225\275%\ -\360\240d\302\250\2059\221\312\327\257X\363\005\323\221\027\320m\247T\375j!\ -\013\020Z\365\245\203\003\021*\364)\264\371%\004W\0138\011\034Z\021\323{\032\ -|\253\272\277e:c\001\267M\310\267B\350+\217\366\225Q\375\030")\012\3715\363\ -\3749s\367\026\241wG\004\353\022n\307\206y\362\220\316\033\241\236y\010\035\ -\246\220\204\003\344\340fH.\237"n\334F\360\223\252\331+p\336\234>\236\332\ -\302\227\010\333\306\021\306\224\301\015\265\364\306{\320\236W\021\350g\300m\ -\247(\251\264\364\005\022\004\336\222.\374\200T\344\332\353\'uEz\374L\213\ -\364\247\012z\217\000\2514d\\w\310\23054\3261\0261\207\0030\0061_\221`\025\ -\221;9u\300\030l\333b\2674\011l\300_Kdi\007\020DAcd\346/\317k/\031 [\242\026\ -T\0357\236\003j\324\273/ \362\343X\215V$\366\013\317\205b\263\025qQ j5pd\362\ -\030\036\225,\306\365\300\217W\200\236\336\371\337\316\240\273\012VX\023\250\ -\2343z\372\251\217QS\206\376\216\2262E6\304\301\225}K\277\264!\207\271\220q\ -\325\034\271\002\263\025\364\326\322\255La\323\336B\225\346\2048.\315\367\ -\376\346\337C0\012\326}\032f55C\341\235\212l\005\007V\013\277\232+\220\344\ -\361\035\304\330!\260\036B7\014\241cj\230\205\012\016k\307\007P\217\357\200\ -\004\273\302\227\243\302\016\236\327\030\337%S>\216j}\002\015\366\004\036\ -\234r\344\035\371L\374\311\207\310\226H\354\362\300\257\342\010.S\007\217\ -\277\211\026\3230\377b\360W\005E\377\011\265\304\276@\011K\373\304\012+\251*\ -\346\222\324\377\236\3015Pd\276j\220<\376t\021\3417\305_\013\357\365o\0210\ -\311;\236\022\034n\251\254\013,\336!\2435\003\334\243\305\035n\300\331\207L$\ -\253\370\311\003\256=\011\3040L\340\2535~;\336B\025\034\023\324\'Z\365\016[\ -\254\372V\012\204\302S*\310r\215;\010\334\014\020\3639\324\300\004?\033l\330\ -\023\222\313a[S\302Tf(\311\325\340\265SO\252\003\004T=O\0036\216\252P\215\ -\231\317R\177\273\002\254I/6!\354\362\016\342&*\177C\247O|\351\206\334X\021z\ -^\261\022\276\204\350\246\021V[Q\343\024P\247-\253\211\035\012os\346%BX\264+\ -\251> \301Z(\366\304\023U\353\240\216\211\240)\263\3707t4\237 90\243\333*I\ -\363\300_\226\250\034E\205\267\310\376\211^\273#\202V\265\355\200d\223L\361\ -\015\034\243\277\303\251o\000e\201\225\264x\360P\033\326\240\364\003\037\360\ -\316\253\373\031rH\005Y\366>\375\257\034z\254&\362\'epQy\376J\321\2740`\026a\ -\305\364^/\222!E\031\315B\277(\002\177\006\313\234\202W\3362\354\267\214[E\ -\333Ic\204"\305\034\365\214&\010;\302\260,\253G\006\326PD\347\001\204\3350;2\ -\003\2476$\325G\\W\301\010\002R\325\036\224>\326\277d\305\240d\352 xx\011\ -\341\313\367\002\301\246\014\267\025\2748B\312\3051\306\353\300a=(\360\015\ -\274\260\001\334\326\222`5K4\273\203\347\377\033\362i_\240\2745BX\022\302\ -\251b9\217\220\243\226Y\3309|y\007\341\261\260\177/y?\207\022\263h\235\004\ -\017{F\264\232\362\352\010\374_"\000\377\014\273\354\2109ji1[f$f\004\237\316\ -\315?!\254\007xe\006>\023\277+\215\311l\203+\226\014\301D\336\372\014\274u\ -\253b\360\255\217\034\012\346!\222j!\220\272`\241x\226\375\314\372\344\000\ -\345\177C\367T{\215$\342[\301\255x\014\267V\323\210\012\364\310b\257\206\304\ -\377gx$\033\275\'!\334W,^\213\277\177\221(\011"\333\'\336S\233\000\374\224x\ -\316\354C\347\035\242\200[\022\222Y\000\016\334\262~\331\021\337e\210\001i\ -\211/\023\234\306\034\225\013\351CP\307vNr]Rw\017P\023\320m\236B\350{\014\ -\275\346\021\247\177\357\026N@\0157@\363\236\016qz\007S\335"E\235@\2027\010\ -\266\265\2701@\010\224\3403%R;KFg\003\362\327\024:l\327\326b\311I\3017:&\321\ -Z\200\354^D@\235C\012Hm\367\034\251\245\027\360\323g\314\234Y\266AX\362j\036\ -\035\354+rb\013\373\333A:\014\375\256\006\355f\011 &\357q\177\271\342\035\ -\254x\011\341\266p\312\277\203\014\205\200K\256=\213\265\014\206F\031\214\ -\352\030\332F\225^G\277X\203\333+\317c\232\326\325\344\263\252\365\320/&\227\ -\375\315\223\346\004\004\024\376z\015\301\325e\310\236\017"\220\3151\325;gD\ -\347P\300\355\321\261l\001\036\250)n\001G\241}O-\263\017C`\254\035\374\256\ -\001\334\335\006\036\231\202\221\207\0200\201\214\276\242\300\031\304\210=\ -\330\307\0113{\023\330\3479\034\362\263\010\246\312#v\366\032D\254cJ\324\320\ -$\010\270\201#\022~C\012x\000\246\273\301b\034\274\236\003\200\343>B\351\'\ -\314F\214Yp\315\341\201\255!\304\'\020\352\023X-\001\017\370\013y\341\255\ -\251\340\317\021\206\270\330\225\246(\3266r\334\014\245\221!\234\2221\202\ -\256\015<\265[\006$=\246e\236\200w\376\364\204\233\201\277>A\353e\360\343\ -\304u8\006\204=E\306B\035S%\330)\304J\373\250f\010\301\024Y\331"\036\030\021\ -pW\323\314]\303|\015\330`\350P\353\327\030\3438\024rS\030g\365l/i\316\015\ -\234\265\236\277x\213\254\325\234;/\026\352u\364\267*\230\206%k>\342LHj\333d\ -o\314\317\346\015,\3445DWk\230k,n\207\276Q%m\020\230\251\356\374\002\376\374\ -7x\364\032\376\337\220-\013W\010\217\244\246y\204\022~\217\350C\0074N\177\ -\257\265\247\301\325g\310\020\327\014\330B\2021\240\263\035[\025\226\334\306\ -,\332s\007`|\201\244\243@\264\376\021\333nl\254|\337+c\367\243|`\213l\247\ -\252\333\226\0058\003\277\344\206e\374k\220\346\204R\356_\311\006^sU\020J\ -\315\221)\324`@\367C\353\340%\037\321\360Q\246HTw\330u)kI\227\333\027\177\ -\215.{\355\011\246\271\370\206\275OWH=\315\3418\204\242\252zv\025\035\316\ -\036\013$\015M\214\241\220YF$)\011vE\322\2650\030\025\256\376\022l\242\010\ -\245)*\376}\244\021.\221\266\352\355\001\007\214\352\260\200bW(\355\004\254<\ -\201\273\252\022\177\312\366\026\005T\216\211\231\316\341Bjn\354\020D\253X\ -\011\037\300\326lX}\312\021\367i\202H\253\210gD\375iVVS\331[\230\224\247 \ -\331\367\360\360\264]\342\000zt\310`Z\001r\027pB-\274}\313\316:-\352\276\242\ -7\251H\355\2248\353C\264ch\254\373\225\010"\203@p\033\273\225,zVj 2\266\330\ -\316\320\231Y3\021\276\327\330\240]\265S6WNP(x\346\027\253\036\256\026\331f@\ -\030k\010Q\201\207*\335\244\332,\262\247\300\377_\323\331\265L\011\206\206\260;d\316\254\ -\267\325\212\354v\204.h\353\363\026\333\243Vl\004\214Ep\002L\204\300\274\206\ -\315n\231\265\263\360\356\267\010\2046\310\013\2671\001\251\230\374\036\340y\ -\023t\230\030\306\242\227\273n\266\200Z\321\306\231S$v\015B\213!\234\274\243\ -\230\340\011\335\331\212n\337\320\311\323\376\2201\210WGkS\002\203S\306\212e\ -\001A=\307Nn#`R\335\341\2471\253!\213\275c\235\246\211\336\233v\366N\250\361\ -R\006Ij\356\037C\337\325l\341\333\242G\333\306v\256\006\204\334\300\36488\ -\260\035\235\335wHt\253c\322as\326\014\256\224q\024\343{\036\373\222t=$\2306\ -\300knh\312\0335\264\226G^<\337\373\333]\220\244\025\371)\224\303\346\020\ -\323\307\340\2211\312\261%\023\3249\273\0165D/\331LP\262K\351\226\015\315\ -\033\0202\217\025f-\304\364hIs\022\254e\253\305\023\374\265\201V\325\\\377c\ -\010s\305,J\035[\260\024\013\356\230N\250b\032\332\021\256|N\357+tF\031\230\ -\267!Zu\264\263 e} @X\327;\214\253\342\016\002\230C\366\261\007m\321\207\337\ -\363\202\336\262\215C\023^\372\340E\323"\232iO\311\035)\301\266KZ\251\001\ -\325{\306J\367\224X\213\025R(#\370\326\217A4\215d\023\224\215\217\220\031\ -\260\014\366\013\304\223s\334Y\333\251\'\304\006\206\014\210\246\231\226\004\ -=\345\324@\301\367\352\220\014\260\204\215\032\370\000\222\335]\304\254\233t\ -$L\010@\226t\300g\372\007=>\367\021\023\022\261\362\235@\351;\366KvP\371\001\ -\211\\\263\377pF\037L\336\363\027\270#0\352)o{\034\011jb\335\257\244\347^\ -\200\323\016\331\374\340\250\372\265\347\362)\\\222*&\2045]\327 \351S\262\ -\325\331\260\361j\306I\003G\004\264,!\224\233h\255\237\002\357\330\'\037Y\ -\026\371,\\\362[\350\251\2068\236K\332\325\016\033\240C&\264\301p\002\216k\ -\270}\226\355\321\006)T\005\243\334S\327\321\240w\376\006\224\017\230y\235\ -\0331c!3 pF\354\314\276@:D\220\247\307\330\265\226\013\375\352o\030:\223r\ -\226J\013\317k\033$L\012\202#\035\0224\212\236\275O\250\211\332\300\367|\004\ -\235\213\241\331\216\036\204_\341X\016\001R\307C1u\254\210[\324>/p\215=\016s\220\346.\0261kZI\035sP0{\240}\ -\3775\343\300\016\331\252\027\204`>Gk\201\026\334\012,R\323\330K\016\333p \ -\325\022<\261\242u\024\255\363\205\302jY\002\266\\|\021\335\035U\331IL\006\ -\315"$\317\306\316\336\212\355b\252?\013\362\262\366\275\345\300\346\364i\ -\334\244\203\244\017QMcR\240\317\246\236>\257\251>\233\336}A$\354E\010\276g\ -\234\347\320\300\372h4\366\316|G\334J\203\304\336\005\033\202\025\205\277e\ -\233\361\014\241\261%y;N\007\030 \353\240\231\331\222\036~\310.Y\226\341\276\ -@MKf\343\215\'\232\006\274\031\021\324U\264\271\025\323\205\272=\257\2408t\ -\216\305\220\212B*\342k\326\345s\020J\021\330\003t\246\010tK\266\246\237\365\ -Q\024\276\204\016[cK\316\221g\236Fgc7Q\305\260\254\335A\337U\220\270\340\211\ -A$\0338t\357\370\026%\321\'\010\310e\234p2\243BO\221zI\251\342\015\373\302\ -\035s\245\342aIN\364\004\241\264\004\337\252\360\325R\215A\262\214\230\301\ -\212X\262\307\346g\020L=\251\337\340\340\256\360i\255\004\350>\037\342\216C\ -\020\355\212\335\302\012\0240L\320\270\230\315\333\341r\226X\3575\002\265)\ -\233h\373\236\324\302a\342\222J&\343ON\372\321(fJ\270C\315\030Xq\2167\344\ -\316\250\364\2257:\3022\365\377\264\177v\010\000\357)J\025)\364Hh\224\221$\ -\335\004\331\003\365\3366\021\212Tp\354\325\011\233\271\012\360\230\352\230\ -\2120\270bO,\267\340\305\025\302\251\222\220w)\244u\261F\251Wh\021\351>\207@\ -^1\275\2352\375\235\202<\031\341\304\035\034e\211t\347\331\312sp\226]s\254R\ -\212\376\002\0070\3609\334\012\035\031\222AU\204\3018)\334\223\200\244]\307^\ -\201i\350\004\311a\007.\221\371\266\310{:\264\266k\337\316\214]\272\212\337+\ -#\322O\373q\3443\343\275\370pI\3337 \012\343\032 \366\222!\273\206\330\2227\ -\313\331\341{\315Vu\265eK\0061\001\377\225\322WW\310\257\2059Y\343\341r>\334\ -\210\241w\201xq@W\367\204\351\242\215\217#\305v>\306\325\265\033\334`\306\ -\205e&\356\022\234u\0136\2201\037\212d\014\361\345\034\221O\237\203\261\264.\ -y\357\234XO\023\373\322T\222\357(\240\232\211r1\352\252\251c\016\342\250\205\ -1\305@\365\324\230\313\256\010\032\276\366\302\'\336\322\033\022o\011\356S\ -\342m\221\367*\251\300G\304c\017\010\373\274\301\324\225\227 \330\026\212}\ -\004r\025L\332\204&{\355\370P\254\305-T\303\200\316\354k\177W\223}\241k\274\ -\253\250;vTj\226\342\220\026\366\016\226\263Dz\3619\2337\2060\010a>\321=-\ -\344\206Vs\313\326\340\320\347c\230\233\034\362K\020z\2061\3269g\327Y&D4.\ -\024\267\343\032\034\246uK\315\235\235\200\277\264\336$~WF3p\315\361"\301\ -\343\272%\026\266b\266L\247]\030p\217\246\216%q-\3038Vq\334\313\000\002\364\ -\216<.\000\253\257|\026\341\263Ml\002:a\347z\032\247\336\365(\023\201\36058w\ -H\314P\307\266R\007!\326\272\376"4\230j\345g\025;\316:\006\267m\254\0267,b\ -\271\330\177\321\243\273\333r\000[IW\242 \026\261\360\376QI}\245\203\376V\ -\020\3007\234~\242\261\337\006Y\006\007\307C\021\367\327\004\261\204\252g\ -\312\301\201)\033\367\034H\367\030B\252\350\355-p\252\222\367\220\231va\225\ -\227h\230W\375(\2268\215|\034\022\014\011H\250.SE4\330\210\203f:l\325\035\ -\332\242SF:s\277\031\204\235\247\230?\221\323\301\354|\264\250u\243SB\277\ -\0372\016X"bo\001s\033\242\303\354\210{Qz\023p\211\307*\011\021Vd\365\030\ -\302\227\263WC\'\302U{I\344\032e\254u\014\355+\004\346!\327\245-\355\216\316\ -oh\3259\206\232/\341\337-a\311D\273\276\365\216P\017\351\202\204^\273\326Rs\ -\210\347c\220\267\216\256\3700\306\302}\202\215-a\246\347\254\376/\300\345S\ -\240\212Z\363\200\361\017\207\016;zK.\342]B\373\323\005x\3542\246\330,G\262\ -\250W<\344\310,\235\2773\302\337*\022\376\204\026\321!\327\257y\365/\310W\ -\325\354\346\030Q\241\317\030\251\365\341e\227Lr\253\031p\354\200\334\304irc\ -\204[\005\304f\311!\217.\002\337\024\241\243\253\355c\012](\015\2161\254dJ\ -\347i\032g\362\314\031\211\224\000\363)lj\312h\303\001\302\227\300\261\260\ -\346\367\320k\224\355e\2364\336J9c\251c!,t\340\032:xnotL\347\037\253\017\210\ -A\230\216X\003lg\301[+\264\340T\204\355\256\220\221=\307\025\324h;\016\244L\ -\230\007\355\263\376\264B\262{\000\233+\352\\\207\034\345\204\311h\212\373%\ -\264U\230\210"\272V\257\322\354u\014\2471\201^\263\205g\3675\215\015\215\001\ -\037\2273\236\014\235U\026\177\275\002\024t\376\355d\024\235\216\262\353\362\ -\276\341\200\003\303\211\016\273\262E\211\335\260\334\333\006.m\026\371S\265\ -\326\006\250\375\227pR\337\320$\2041\223E\304\026\272\330\372\234\020\343\ -\247\003m\226\337\300\015\024\3462f\3550@\350\226\254@\025\034\025\267\313\ -\276\327\314\267\010jR\032\357\257\221\376\221\254\354\317\346)\000\006\226\ -\343\207RN\272\320\331t\015\213\301)\034\017\027\303~\341\344~\234l\300\004b\ -\036+\276j\255\266\221<\3325\250\301\351\034~\361)\007\3028\206\351\035qa\ -\016^\320\230]FcX\245\023p[M\304\353*f\324B\333\247\346\3645\377\244 \225\ -\214\352}\023\363\2509\302\234\001P\214:\037\321\322\237O\211\337^\302\253K#\ -\334}\3136\344%\232\3457L1\205l\354\232n\256\213ZK\323A\011\236a\312y\214\ -\006\356K\017\004\033\263\303\251\037\352\222\031\004qC\367@\231x\316\204\ -\217\360ZC\007r\030\323\206\317aGt\276\300\220\013\260\\\222\316\321\324dt\ -\301\032rM\200^M\015\246[\241a\307;d\212Ct\264\310<\204\265\375\300\271*\226\212D\246mJ4*?\ -\357\351\204\3732\316\316\354\203ig\324Ss\004F3\000\271/1\377!%Gt\254\215_\ -\305VS\325P\033(\350\020\022\375F\242\215Q\237\254\370\210a*j\315\236\222>r\ -\370.\216\211\011\370\330MT\002g\310\255m\350\351\325Q+\325\3549z\035!\312\ -\372\327\032e\273\032\005\341\302\374\003\346\245\204=\325\326\276y\234s\267\ -\203\224\2523[\240\007\\\021o\267\234Q\233\233$\273\206!J2\216\276\267lmW\ -\232\376\205]P\304\253\202R>C1k\337s\315Dc\217\263u\002\214C]\206\025la\030/\ -S\342q\306\344\232\001\222/\031\241UK\026x3\210\374[V\023\035\376R@\363\350\ -\200\220\227\354\251\335B\270j\372k)\233\022r\216\210x\023\335bU\011[z}_\340\ -\344\214\330\3703\005\336\320F%!3\017\3025\027\224/\255h\031XM\365Oo\315\277\ -\374o\377\362_}\020\354^\237\350g\023\007\212\252{:\347o\011@h\232\037\017M\ -\017\357`\022\206,\256j7\221rV(\272\251\267\177\237\321\242\246{B\362f\203N\ -\361\214~\237\326\023l\314\207U\254#\245\254\364\030\330J\307\032\200\345\ -\320\021\025T\275\237\006`\343\230L\322\300\254\317\366\210\034^_\216\234\ -\307\232>VI\255ZC\335\033JOBGEi\221\321(\\Bp\377\005MxO\261\025\231\347\241\ -\177\300M\315\343\230W\265<7\210#\377\211j\316\020\205{E\324\274\343x\306\ -\367\210/\015\362\232\272\370O\364\351W\340*u,6\300\365o\220\275\327\304O\ -\301\234l Y\012-Z\023<\232\023\357\332\322\324\353dai^\025\236\375\200:vI\ -\016\371\022!\312\373\341zC\362\337R\251W\340:\231\315\363\231\255\015Z\'\ -\225U7\034\235\023\342K\235\3664&\277\21793;\007\207\2629\253\037\001\2756\ -\242b\346\354\212\355\200\011\025\224\2056o5\3208\357\320\217t\000t\263\336\ -\254\342\243\005n\262\364\364+\010\315\233H\262\234\304\274\317\006\234\232y\ -\266\001P\015\003"\\W\340\332\036S-O\301\033/\241\341\024\006\254\223\314\ -\307\344\243\001A\313\2578c.e\177wK\230\311\212\301s\212\270"\'\306r@\315\ -\232r\036U\202&\2150i}\314\272\252b+\336\371\255\371D\214\353}\307\\\367\222\ -\005\217\200lU\034\350\020\223\346\216\000\232<\342\224\352!J]G&\315\236\231\ -_\310\0079B\246\227\3405y\200\203\254\003\3114\261\363z\317\024\224\020"\015\ -\276\037c\'3Z\320\024\206B\363\360\241-9L\376\251\360\271\032`\253\212\020\ -\245\234\003\231C\327\355\020\\\251}\223\023V\312-\3208g,\254\311\224\204\ -\031*\333\241\305bivE -\344\204\2658\012\375\224u%\033\212 S\264\031\030\014\ -=Sm\325\242\002}\005\024\317CO\244_\320(\337\341\333r\276\252\214vI\263\037\ -\215\315\236\304qQ_\315\023z\314\206\332H\333\016N`\012\324\266)\026\266\202\ -\242V\353V\220\3415\223Q\202\010c\3168Q\242\234x\356\223"\255\224\3434\233\ -\246\374\253\272\362)3\031%\262\035S\330z\203\250\367\271\027\300\004\332\ -\265\361[\331p\314\226&\274k\266d/a\265\325\347s(.\207\366C\371\277\202\320\ -\2540a\217p\247\206\311\351+\324\200\017\000i\224\256\234g\2360\332\235s\305\ -\326_mBH0\032\367G\363\203\'W/k8\001\251G\257\314\306Tb\030\357]\261!\325\ -\321\263\271\206\247\366\332\377|\215\252\267\245\336\032@YW\320r\217\221=+\ -\315\367\320\210M\366\206:q\003B\236 c\361\006\334\254f\345\232\316\313\027h\ -\'\307\224\350\001\374\377\024\031\210W4Z7q\352b\012K\\x\201\257bw\323\241\ -\367G\267\250\221i\375~\211\364\251\012\354E\300\351;\024\306\347\310\250j\ -\213\234\200>~\000\252"\361q\324Oh_\351\220C\277A\277\333/\200\326>2\303\354\ -\357x\257! \274a:7\245\'\367},\207\234\320)\225\275{\014aT\255v\037\217\251\ -\275\331:X\367\232N\352}\266\346\014\320(=\346o5\202\371\001r\251\327 \246\ -\224oe\023N\330\377\264"X\364<\302\367\216c\377\301\002#b:\246\334\035\365uE\ -(\203\016\265i\021\244\027h\261\330p~\255%\246\210J?!\315?\262\037\367\000m\ -\237:\213\347\275\351e\037a\015/X?\321\216\236\207\340Eo;\263_0\017"\344\232\ -B2q\3056\256\012\374\224s\202\242b\237?\320b\216\321\321\253\216o\316\006\ -\370\232}\267c\266\027\016b\243\2616\341Wl\235\316A\\%o\216\327B\015<\313V\ -\330\232\005\347\354\247\321w\323\274\355\034\352\246\207\3374/\'6\373\030Z\ -\330\240\207$\340\276\013\026\3602\344b\\ X\302\232d\302i\372-@t\017\321}1\ -\313D[=\204X^0\202\324\221\037\017a\006\336\203\224a\036RB\027 \345\340\015K\ -\201\034s2\224\246ZVH\377\345\014hN\250\\\323\210b\256\366P\216\332\371}?N\ -\344)Y\011Z\261\211G\223\210Z\374\270\206=\275\217\221}uD&\36695\243\240S\ -\232\240\213\256\345\232e0\257\326Z\025p\367\025\234x\3032b\350\237tD\223,\ -\203\016\033\002\011\326\262=\376=\370\353G\377\357\003O\226\277\373\337~$\ -\307=\001w\235\262\331\370=R\213\023\\z\312\201{\227,\367\346\234\201\271\ -\202v\230g\0251\261\025\262^\012r:\004IK>\330\210Vp\303\224_\312(\361\015\ -\021\0315\275\267[B\015T\353,\301\213\005D^\303)\315\357\352,P\355\261;\344\ -\310\256\302\363\3341&tL\330\035"P\232\277\230\231\3530\253L\253\352)\'\017\ -\334\221\\\322m\254\305i\350\2609t\226h\242G\030\324\250j\377\031\006\374y\ -\023\234=\004\331\016\330Br\305\201RWD\037\\P\177\205,\246\341HlK\020\335\ -\230\235\341\003"\005\2138\234\243\244\010*\014j\312Y\3479K\305:\342\345\267\ -\230\370\036\320E\021\027vI\240J\2119,9\204{\311\211\262.\313\220n\257\230\ -\251\317\321AW\304\350\345\024\325\372!W\376\034\317\241\303.\357\330\232z\ -\304\263vd\020\341\025jFED\274\335\323B\356\334{\'\322L\234\340\024\220\003\ -\274\375#4\331\013\3637O2Q\357\037\301}\011\030Vb\314[(\323\335\014\270\006\ -\243\020\3228\000\255\300\236h\004\360\232~\230\205&\263\304\355\027\364\353\ -k\202J,s\0129gb\210\210\205lDI\017n\003\013\230\3231\331\260\026)\346c\300\ -\340\376\013&\261\334\347hH\213\204P\306q2%\267\372\024V\337\021\220\251\211\ -\035\351\013\0150\230\036k\372z\304\306\034!\332\031\010\316\346,\231\214\ -\373\004~\374\004\275\037?\001\210+\257>\303\344\315\003\214Ih3\035c{\265\ -\207a\260\360RR\244\177\207`\357P\256\3230Gc9zC\355\2312\247f\343\230\22190I\ -\357\241TTK]3#\\#\216\271\202\227 *\350\011\232\253\035\353\260I\204;\335[pD\ -\306\025\302\237\036|\345\036|\261\' \331\017T\356Cv8\236\022@p\314eW\324\ -\000\212\305\036\301h\177\245\350m\240\202\307\264n\001G\035\364\\\015?\374\ -\017N\250+\343<\035\365\360\257Q\177\376\215\351\306\202#\337\014\241}9\233\ -\350G\270\306\007\314\001\332\304\244\243\036\373\243k8\203\216\222\304`\237\ -\370\331\003\256\330r:\343\200\026^\273\000\016\330\360\330b\360m\213\316\ -\022m"Z\204\351NZg\321\003zt\002\322\015\247\2134\350V|\017-\366\236\010P\ -\361yG\234\234d)X\267\320\003\226\256D\311\331%\262\344~\266\241\227_\300\ -\025\014\207\024h\202\245\004)z\034t\254\356Eh\270\252\230{\3352\033?\346\ -\354\273-\307pW\021\014\232rt\340\030q\2046\360\034\262s\274\202\227e\010j\ -\321\341\311g\321qP\230\347\000\231c\3072\312G0\206\270X\277\203\022\015$O\ -\207\320\360\310\310\011\3479\210n2\300b-\330\332\244\305\332\003\220j\006\ -\323\320\306\332q\230]\322\021?\232\305\261\3579k>\031Ef\314\260~I\254L\216\ -\335\0361\347\220\3059\253\001\314y\313,\351\206\034W\201\034\033\246(\257\ -\221t)\2119\013\207\260\034\263\261\371\014\360\274-\260\2636\002\267\034\ -\3139-EKg\034\226\350@\311\271\345=V\212.@\264\337\361\304s\232\272\003R\210\ -S\005\302\004\222\204G\3528\316\2118\243\243*\303\022\036\342\003\247\354\ -\360VD\2536\313dqBf8\035\241\344\370\370;\357f\274\244\227\245\363\236\303\ -\304V\2354\247\345]\027k\224ZU\320F}u2\007\261\264W3m\2703(a\262\246\346\360\ -^\321\325\324\353\3534\212WqNb\230\320\244\315\024\027\030\344\027\206>\207\ -\321\312\26292\324\376\206-\316\242\220\006\331\013\030\273\011p\373M\000\ -\243(\302U\240\230\023\206\315[B4o\0103\372\021%\333+\344+\024\000\244\256\ -\350\222\370\347r\017\265\2233\324\250\230\020\034\323_vl\313\262\214\010\ -\304zj\']8>\354\017\0240\276\302d\204\024\343\212\231\266\234\007\035\024Q\ -\027\216\343h\254\226\232\325\305\376\243\015\022B\247\370\322\363\231Z\372X\ -3\350.\231`\240\265\000\211Kws\365\025\235\257\340\343:{\202d\302[\340\261?c\ -U\354\004\261L\337\245\334\021\203\035=\306\203\034s~\235x/G\320a\241P\342@\ -\260%\023\320\312\015!0\252(\202\003\3633\202\345\224y/\305:f\034\026\231d\ -\005\234\020\027\';\325\344\305\016-S\032\274k\365R\240\3069G\014\365\201B\ -\3239\263s\360\364\025cE%\305\026IFU\342\273\016\266!\261\26134\366\2470\014\ -\032\351\346\231zu:.R\0116C\337p\353\257\365\035<\200n7\016\313\022\362\355X\ -\351\023h\357!D\340\014\242\263 \227\235"\341\343\366\216\0128\211u\233P\322\ -XQ\177\250\237n8\263\367\253\277R\015\274\203\016\264\275\365K>G\273\275\246\ -\035\277\262\213)\234}S@Id\024\3070\331\253\343\014\351\232:1%\264}\010\254\ -\315\223\030\312Xv\020\335qLR\230\303:\207\222q\030\324\260dVE\254\370<[\306\ -F{-]OQR\024\177\364\014\211\324\206\223X\362\020\032\275E\035\270@w\240c\357\ -F\212\343+\014<\340!\307\357\353\011\037-\223q\012\240+x\254\211\352\237\232\ -MO+\326\310;\220\3556\242\252\007qZg\312\254\377\030na\020\313S\3523G}7%?\ -\027\250\223\347\024\374S\016\303r<\353\353\024h6\023\015\312;\236\303\225Rp\ -\265[S\335\221\025-\342\210\223\264\007\344\3412N\300\256A\217\031\361;\322\ -\312\365\022\001\371\315\356\364\277\320p\242\007\316\015\230\310\323s\177\ -\302)j\2638\264}F\010\347\210\2479(\276"\211\325o\255\364i\271\303\231pDK\ -\031\325\264\222\320\262U8\215\270\2554\036\330\244\001Vh\352\314\210As\021\ -\275\2211R\265\234\177\036\340\352\332x\325\217)\200\222\376^\305Sg\012n\234\ -\\\351\022\3570Y\212q\244\016\356v\213u\276c\276\325E\200\264\316\203\252w\ -\335l\273\216\300\257{8\203\234\251=\3033\370L<>i\306\007+\210Vv\314<\031^A\ -\035\217\225_C\275\247\234\267\0042\351\220\356\212\016\343\230Zk\210\022\\\ -\300\317\3474\020)\255nM\035\250\347\337h\010\246\210\304!\347\205\365\230\ -\217+\340\311+\024\305z\361\013\350\012\313x!\205\037w\313\346\214EV!\223\ -\257\022sI\267\270\027\207O\032\304?:\341Bf\032\220`\012\251\276e\232M\253@\ -\012\033)\342XP\027\365\3270\342#\306\230;R\306\351\250\322\305\372\012\2207\ -\355\252\374\300J\220\202\227\236\342\000M\303\243Kr\366\270\325\034\247\241\ -\367\235\342`\314\320\2023\005v\246\037\017i\014#\036w\243=\236x\222\250;\ -\332\347L\274\313\275N\026K\\\253xgk\236I\271\361D2Y?"\212ny:V\237\345\335\ -\004]\357]|f\303ru\213\273pR\260\341t\3714\202\232,\374\240\320\017\344\242\ -\2709\210\244\245y\320S\031]\304\264\347\234\342\233\262\334\021\200Fj9\237r\ -\012O\311q\313%\255ZN\304\205\213\007\253X\242U\007\321z\206\263\212\272\010\ -d\231"?\247\215\2019g\352;\216\021tq\276N/b\244K\006a\2538\212\331\261\271\'\ -L\333\017tX\260\003aH\221Lx\300\242\030>\036\346~\012\372\271XJ\267<\224\322\ -\320!\250\030i\265l\307\332\2653\013\2102c\032G\241(\337\023\337\023^?\341\ -\250\214\001\257\243\312\365\026\263\350r\036\243\227r\360d\001\010\310nF\ -\253\343\354\341]\253\305%\305USJM,$\3574\216r\327\004i\234!&Jw\320yB\256\ -\307,\233\015\2509u\316Y\217\371/=\036-!\010"\014\347\325\251w:\367\247\013\ -\010\304px\234\236\3702\213\036\221\213\201\307!\322#\031\275\036\027\301\ -\264\025\302\235*\366R\346\030\\{\002\377y\200z\344&\326\367R\366\000U0\324]\ -<_T\013\263\206Q\251\272\264\033\250\350[\342\347\207\034w\0260\257\206\005\ -\345\003V\343\225\337\302\011\222\017\000\365\323\223y\027 \3002\236\223ecE(\ -\217\223\247\303\261\216Cd1\206\324W\015\003\356p\004\333\034|\307^\243\036\ -\354\215\250\274\017\000\233\204\372N\312S?N8\252\312q\260\377[\266Y-Y\230\ -\312)\204K\314\337\331\000\354$m1&+\262\017{z\320\022\006\031\272F\372l:\314\ -a7\365\034\324""\302\316\243\372\037\302\250\2579\276\322Dt\367\020\244\011\ -\002\333\213\003\272\257\314\177y\002\376\023s\201g\310\002\213\343;\202#\ -\244s\316\376dR\260b\255KG\341\036\3015\377\0233\024u\260\326\356d\024\035p\ -\017?,\234\3277#\004I\037\356\222\361\235b\376\322\350^X\272\216j\267^F\024j\ -\3122\227E\311C\336\361\3064Y\231=\345)\010:\303rMO\253\213g\030\245\004\006\ -8\342\312\006\314aT\261\323r\315\243^ul\337\226\226S\333\215\245\322\360\231\ -Cj\'\000;h\257z\302\303\022\037\3059\377/\251k\007{\307E-\341\262w<\244\250\ -\211\011\254\036\304\317\360l\223|O\213\323\323W\202]\322X\207f\337\222\363\ -\337\\\304\373\031L\231\223\243\000\356\342|\362\234\323\357S6\307\334\247{\ -\250\010\013\315R\245{3x:X.\307Y\000\011\000\001\341\260\316M\014\323\325f\ -\347\021\245\265`NVB\344\357\360\260\237\021\016\267lQL\241\267\216\310)\023\ -\226\012\0372-\343`\277\035\315LA\340^8f4\000\004\347qD~\303P\250\302\231\ -\2305;\230NX5\202[\321F\220\323\200As\230\212\037\216:/8\177g\016hR\203.\360\ -\024\243\250\372q\314\243\212f\001\021\326j\244&c\32287\254\241\330\250\337t\ -I!KadR\316\3602\034\245\247\363\226\326\324kS\302J\035sf\023\034\204\366\'\ -\224\273\343Qt\247@N_\240R\255:n\015\215l\366\216bT~\357`\012\0143s\206\375\ -\267\012\020\234 \211\255p\225\232\005\345%\317\246\273\257\200\272:\342\342\ -\303\260\366\214)\024\025H\303\343\000\346,?\031\236\324l\366R3\201\264\216\ -\3737\206.[\305\246\365\006)\302a\234l\037\306\037\365`\011\333\350\355)\254\ -$\340\033kF\013\357\220\012\262\200\002+::\'\307\037\361d\312\036\234\314\ -\002\270\3729\361\335:bT\035\322\000\025]D@\352)2\020\347{\307\0065l\223\017\ -Y\2731;\362F\210[\2209\026\202\3250\271\033\222M!D\226\220K\3559|I\020z\013|\ -\305\021\002]\313\224\343nX\302\232\212T\307\266\345<\326\304\3063_Z\036Tm9\ -\352\324\261Jchff\021h\3548\271\354\222>w\2064\343]<\315\266\240\'\330`\003\ -\257\342\301fO0}\325D\267\243\217\202\215\302\246\006\200\207\216\321\271\ -\222\262\362\325Q\005\330\2756\345\005a\2035\207\223K\037\322-O\377^\005O?\ -\345\251-K&\365j\024XKrY\301\236p\305U=Anl\3101U3bFM<\245C\025\366%\335\305\ -\002A\217a`5\341\301p\302CC\346s\365T\367\005\004e\201\304\345)\313\305\241\ -\223N\265\236N\276\377\015\261\356NQ\344\260\223a\314\326\204\351\251\004\ -\001\320\356@\251\300\371["\244U\235KR\275\317\316\337\222\231\272\013h\350\ -\026q\201@\021FYpm\247P\031\204\235\027Tk\352\327\277\366\016\301S\372P\212\ -\263?\003\236"\341\004\341!\020=C\036g\267?\362\372\234X\257:Z\302<\206\356M\ -\276\215g\300\364\350\342-\351w\345D\017\276fz\ -\250b\313\250>\350S\234\254\375\230\377WS\010\312\230q\267<\350\244\211\001\ -\357\011\242\273\247<\324%g\371OO\272T\360\310\202[f\310\351s\326\246\364h\ -\012\341\263\007\304R\226\346\017j\336[\306\021%\006\364\032@e\256\315\377\ -\302L\335xq8a\233W\015\327\371\214J\007\004+\210\225\267q\370f\210\376\035.}\ -\305,f\003\247n\260\007 q\364\325-c\273\014\334w\014O\256\002\016Z\016S\334\ -\306a\313\332K\264%\3160 \272JvV\246qX\255\203\342\357E\354r\036\361g\005V%$\ -\375\214\000=A\267\332\202\331\260[4 d\010\267\326\260\261\232\335\377\017\ -\3106a\023\374\024\012^\210\365/\234k\323\367\317\370\031\323\233\006\350f\ -\0225\261\311$\017#S\306\372\030\332\224\360\000\016\020lD\241I9\340\240\343\ -\271\305\226\203\211\015+\203\216\330\367\012P\177CG\243\213g\316\206Q05\203\ -"\361\351M\366:V\305\265\3131g\255Qa\242\227\016\2765\020\032\235\346\033\026\265\2066{\344\231\331\262\234\ -\260\210\223Y;\216\367+\231\203r<\251xi\276CC\214\006\333cF\233\005\347\233\ -\350\000\3553\270\027\372\211\031?]\261\3535Er\362\002\315;\317\020\007&\270\ -\177\012\343\022Juk8\037\341\354\350\013Z\264\224\272Pg\225\317\221[\015\223\ -Y\345\234\301\277\307\262\\\312"\316sF\256:\201\277\241\271X\243\016\246\205\ -\030\313b\366\034\031>\263\323a\267<\335\270\004\346\264\2439?\300\0364p7oby\ -\302\241\225\374\222\265\353\232\363S\302\311|\362\377_!\363&\022\243"\364\ -\256\212g\205\337Q\001_QL*p\214N4\327\327\036\242\201\365G#\335\2303\224 \ -\016\211\335\010\011\244\204}\350=\302\000L\366\216\360\'\205\225|\364D=@7\ -\224"[[\274\177\306\326\206\013\0365z\200c\314\364i\033*\2360\331\352\2225\ -\212\'\250.i8\030G\311\354\260\021\352\217;\266*?\304\3454\357\024&9O#\212\ -\260\214X\232.\3524\303\266\314\021O\340rl\210_\242\372\034\332\330g\\\342\ -\214g\203\026<.\275\005??@s\253\304\200?b\260s\307\372@\312!6\252\002T\314Zb\ -\302B\030?$\254\356\035\310?\201c1A+\303\234\343W\035\233\374\346,\371\0169N\ -"\340)l\034\373\265;e\3222?\307\223\263\306\304\247\252[\031JO=\317_\341|\ -\3114b\013]\024\314\212\236X\305\021\222\011\363\347WL\365j9\354\030\036\334\ -\230\217\343p\256\313\030\011\304\026\370\205\206c\257\236\233\277\242\252o\ -\211sx\006p\210\215\003\320J:\235=$\261\023\240\273?\322_k\030\177>@\370\376\ -\253\'X\342\305\360\010z\352\000QC\303#\263[V.\237 \'\366\236~\201c`\246\351\ -\253>\341\011\001\037[\343\3571\343\232\306B\224\343o\232aH\342\370WQ\317g\ -\314\022e4\3576\236\243\321\343\231\244\025\217\275^\222X\341X\364\212\004|\ -\005\362h\215\350O,<\201~8\216\303\022\324\037|\305*\325\014\336T\035s\367\ -\012tS\335\363\231\232\256\241{\221pX\251\220\374\237\376\367\377xR>\004\311\ -\204\2447@\337\244\314\265\204\256\265\226\\>\345\201>C8V\035\313\276:W\350\ -\020\343\274\035G\002\203`S\026\375CA\177\212\372\312\3478\237n\010\361\263\ -\261!\241".\242\203f*9\270[\253\332)\271l\306\363\272C\230^\305\243$\336"71\ -\203\312\237sO\203Sk#*\361\220\333T\263\301A\271?\'\264DuT\2021\343=\240\236\ -o0\027a\010\261\033r:c\343\3115\363\026rH\327\333P\337^\340\000\327Kb)z<\320\ -Z\203\262.\216\321\272\001\200\302\221\333\2468n\370R\011\326\203\005\2549\ -\025\267\246\231>"\332fw6r\316i\372O9\273i\004\360\345\230\011\234\335y\266\ -\301\301\230\003\337\265\233\203\356\000\302[\240ji\260\025\027<7\3131\310^\ -\0029\361\030PO\313\214\204\256g\003\316N\031\004\317XH~\344y\350? FJQ^\340\ -\250\247\031F\223L\314\337x\252\211v\03044,\226\363_/x2\357\2243\315\277\202\ -@}\002\325\3039\271\023z{\016u\255\373a\252\200\2415\254\341\006\206\351\250\ -\206%\332\236\377\277\011 \344\3327T\263\202Y1}s\206~B\0231\374\226 <\255~\ -\213H%\260\204\226]&\015\2339\265"\371\212F\247F\361\364gSf\2179\263d\204\ -\014\235\036\3053\300\341+[Zb\025\275_\301O\023T\337\027\234\240\243\015\377\ -\013\240y\236A\350Ny$F\272\027k\312\035\277\203\255\274`k\177\230\254`y%\313\ -\241\245\257\330\0008\311\216BsV\303\363\361\346q\244\3729Ki_\341N\244\021\ -\035\241\3208\341\257\001\262\005e\234\340:\'h}N\036=dp>\206\347oq\326\310\ -\374\377;\001p\206~\327\217\330\367c\317U\037\360\376\307\234\213\271\001\ -\001UsN\343\200\233[\326GuH\333\003\010\233f\351\016\321\373m\231h\2529\273X\ -<\254\027\314\267\364x\004\273fi\027h(\035\022}m\270\231\015\177[\263@\\@l\ -\373,<\307\024\365\214E\212\320\355\225\306v\367:\242\340\015\007\274\2140Ub\ -\003\350\366W\036c\242\002\253\323T:T\227\302\031!\273\234\253\226(n0\0133\ -\024*Z\036\3614AG\317\006\244\376BX@\311\346\252\3202\026\206 \313\303}\246\ -\343\371\034\256m\301\200\276\342\330\356\014\365\037\307|[\201\026\276>G\ -\330\226\334\256>\247\034v\361h\2524f\364L\3648k\274c\215X`\010\277\214U#\ -\255\372\015i\230\325\313\351bW\343\021{u\035q\322K\316\242+\341W\215\221L\ -\254y\214\026op\206X\316ZeGM.%\036\211O\343,\352S\320O\003"\007\324\225\222\ -p\344\337\370\214g\317<\207\355+\367\006\217\032\272\223:\010\371\011\324~\ -\313^\235\034A\222\026\343\346t\027\236\020G\337\302\217\236 \377\371\020\ -\315\302a\344\373\222z\357\014j\3429\212\272\222b\2228\361\212#\000-\215A8\ -\260"\345@\007\035\323\220\261\303N@p+\362\235a\0023\215\211\202\224\202=cy\ -\3161\251\340Xl{\007\275\254\030\305\036Oz\230\206Y\324\232\334\263\214\232\ -\364\020\353#\252@i\223\222&\346!\225\253\335\033<\252\223\205\017\367\216X\ -\324\261\240m\234q?\006\236\272\005\351\017\366\362m\023\226\346g\344g=\254\ -\37496\251\210\300rE\253>d\312|\310\334E\030\037n\021\252\357\316N\035\304S \ -\012r\332\232\210Y\015\225\2468\332\321pdH\011\237.(\242\202\210\260\020\255\ -\366\331w\2420=\203c!\313\035\301*\302Ej\372\303\3038?\254\306\250b\361\226\ -\017\340A7\004\332U\261O\272G+i8j\352\224\243\216,\313l\031g\013\316P\001\ -\234px\203\360\322EDW\264\370D\217^x8bX\\\207\245\267L2\375\3476\023 \311[\ -\014\341\222\305o0\245l\020\007\003\3161r{\214C\005\3640\203-xu\300J\301%\ -\004-\3479\222+\022\3463\230\242\017\037o\020[|\302\331;C\366\216\036yM\275F\ -Fv\020\232\263\364l\355-k\207\011U\274C\210!\202\364\213\'\327/\000p\017I\ -\367\2329x\207\023CK\266\002\327\020\345\026\206\371&\326%\013\024\276nPS\ -\234\021\244k8\365\260\203\302\177\217*B8\204\305\3012\353q*2\302f\232I\306D\ -xlJX\224V\012\267\254h\016\250x\245O\266\357P\021\266\333w\350Y\306\031\ +\337\021\024\246g\342\013\372\221\213\370\002\325\341\017\352GT\207|\373\202\ +~\344\251>\206\375\370\364\253\370\016\036\343\007\225\351~xr\217\036\207w\ +\034\226\371#y\307\377R\035\342\355\017\263\360\021\336\234\313\342G\364\264\ +\373\024P|\330\317\371\364\343z\3719\2346\\\330\307\370\002\017\332\361\240q\ +\275\334\361\351\307\207]g\361#\372B\027\337\301c\274\331\276\240\357x\025\ +\256#\254\227g|\372\361\346n\303G\302\2635YxG\245\032\264\267}\207\036\364%\ +\017\032W\303\277\302A\217\370\221\177\204w\204\323~\317cT\341\302\236r\335\ +\306K\377k\373\021}\307\316\366\035\372\302o\361\005>\375\037\371\240\242~\ +\374wxG\270\227>5(\352G\263}\207\0364\215\357\3401\332\370\016\236ew\373\016\ +=F\237\212;:\344AW\374H\274\271A\370\310!\017\352\342;x\320\321\366\035z\214\ +\373\355;\364\205\224*\0255h\315\005T\205K\237\361:\242\011.\3031\302\245\ +\1775\361\035z\320b\373\016}aH-\214\217\341\027\256\375x\267\323\355;\364\ +\264/hr\242J\015\262\370\202\276c/\\X\260A\227\341\030\341\271|\010g\011\267\ +\377\023^\250\212\250tf\373\021=\350\021O\033\225\356}<\006\317r\270}\207~\ +\344,\036\203\362\370\302\217Dyd\031O\033\0247\343G\342\243\3743\0344\334\ +\355&\036\203\247m\266\307\320\025u\272\375\010}C\232\ +\317\376\275\023\010\374\304\377m\204w\256\374\337K\377]\370\357\012\227S\ +\360\250\326\013\315\372k\230\343\221\311\315\350-}\301\015\366\375{\336\233\ +\245\277\275\215?\216\234e\340\217x\016Q\015 Ly\234"\252\205\177\257\234!\ +\367\377\237\372\007\327A\360\242\010\011\004V\231\017\376o\027xh\026\202\ +\227\237r]\336@\370\353\315\375\347\227\376\377\274\221\366\367\230\370\3673\ +n\314\374\333r\012\306\372\213\021\201\355@\257\214\271\202\216\014\375\307\ +\344\204\015.\334B\'D\307r<\305\332_|\011\201\245\270\300\001\236S\270\270\ +\306\037\253\361\277\033\363\315\2776\362\227\360\025\232v\306\333\355 \246\ +\005\30560\367xu\017\217J\316n\374U\235\372\277\314\251w\242A\033\363\311\ +\177mp6G\275\227\177\227\376|\362\327s\374\277\343\'l\024\230hW\213\207\231\ +\372\343m\314\265\377Nq/\307\020\220\034\347\026\342\231@&}\377\220R\336\225\ +\010\223\002+\375\007k\210\344\245\277\270\316\034BD\247\376F\345\265\326\ +\337l\353\345>\365\277\027\\\024\016\213A\236a\346\377\326\307\247E\307\326x\ +\266)\024]\2160\364\317OD&G=\305\262\251\275\270\344\214\257\375k\023hv\007\ +\255r\370\\\341\177\337\3059Z\030\007\021Z\353\337q\211\313v\320\221\024\013\ +o\343E[\342\363{\376\332\3641\316\241#\252O\226_z\343\372\351!\356F\336\335\ +\363g9\307\373*\374\375\306\377\253\313\316@\357\345\023\347P\010\371\253,\ +\336\026g\246\343\014\032&\027\257\213h\012\341M\375\333\216\374Sv\320\024\ +\013euX\022%\016[\340s\372\204\015\264c\203\033Q\273\240_b3\246X\356\235\027\ +\251\\\240,\343\022\0024x\030\362\344v\271\224\364\210o\374\271;X\317+\034A\ +\316\320\342\354\026\013S\027_\012c\320@\210\247X\033)\026\276\350X\342\317\ +\320\243\336\245\260\320\216?{\376j:\276W\327\304.\216Ux\301g\270\362>\326NJ\ +K\275\244\340\325\322\207\270\033\3177\341\305\265X>;\376b\033\330\262\227\ +\376_\013\2219\032\327\367\020J\345\365\362\0006ETZ-W\216\237\252a+\232\352\ +\016\307\\\371\1773.:\007\003\337\301f\326\370\032\361\026\026\020\234\2030e\ +\361L\261\220\246\320\012\013Q\250\0202\277pSXB\207w\006\373\352 ,y\255\201N\ +L\374\277j\241E\330rw\265\177\347\020\372k\261T\227\376{\027\237\270\304\003\ +\025\021.\275v\311\317\015\037N\012[8\013F\337\322\356XZ*\261\033\257`\277\ +\3044^\370\203o=I\211\337S\334x\212\033\315\270\030\302\0234\376fKh\343\031\ +\236\263\332\230\211\177\202\006\366N.rA\277<\206\307K\361U\341\0218\350X\ +\205\233\025\215\237A`c\010\362\003m\314Kh\347-\255\212\203\326\364\374\025\ +\314\361\231\006\256\352\277a\251\344\201_R\237,\217\230\320\363\366\271*\ +\324U\211\376, \316k8\220\024\002\253\361\251\036\316\321lm\330-\254\321\004\ +\2670\307Sh\274\300\344\011\265\3206\3615-mGX\343.\352R\355\237\303\007\330\ +\260\024\213\240\243]2t\343\216_i\264|\317\274(\357\360\364\247X &>\202\032\ +\317S?\331z1\031o[D7g\270\2059\256\300y\201\225\014c*\257\001\025nh\210\005|\ +\352\217;\206\0069\370z\007\335;\205\23528n\352\217\350\360\376\312\237\377\ +\265?\366\036u\272\300\035-\341L\226\364\365\016\332)w\177\212E\337\031\246\ +\030%\014e\215\213\0223{h\236\373?\253}ii\243\202.\344\364\032\032F\310\311\ +\372\024\242^\220:\357\206K8\365\302L\261<+\012w\351/m\002\221\317\370\000.\ +\374\377]\370\277\036\303\224\247\336\202\211fM\240]/h\301\034\227\225\243xS\ +\270\037\211\336Vx\257,Z\011Az\210\032\207xT\265\377N`BRj\343\271\377\273>\ +\314S\334\317\036\216,\367\242\372\272\201\035U\247\363\206jr\037\265\321\ +\004\033\226\371\217\234\343R-,@\213E\320b\241]@\301E\312\033\230\344\334\ +\373\301/\376\004\377\360*\274\3062\226K\027\013"Kp\022\325\\\364\263\304E\ +\327\376\330\032\362\236{\213\247OOn\373\326\277*1\320\304\013\312\322\267m\ +\374\277\013^Z\013\223/.\'a\210\342 \274\022\017C\037p\005?\353 \244\031\204\ +#g\354\341F{\014 t9\352ZH\031l$\024~\007U\021\021\276\206\347\255qE\216.k\ +\346\177\233\362\312S\332EzIQ\277/\020I\212\3473\305\263\221\233\236\301\262\ +\254\274P\226\020\351\300\337\262\330 \215\250R(q\212\230jBo\322\203\270$\ +\240h`wB$d\341}\352h\266\015\364O_\351\371g\335\301_\025\274\221\026\201k\ +\342\003\336\031\265\243\306\222\324\333\256\341\301\226\364\321S\377s\206 \ +\306\340\354s\232\000Y\274\247p2\226\301\253\205k\223\317\367y\265\025\374\ +\241\010\364=\216ghP\256p\015b\317\257\340\230n\220\351D\015\013\261\213\203\ +\230\206~I^\371S]a\331$\364JgxJ\372\024\364\206K\\L\012\275s\274\321`=\2064\ +\256bt\017\241\177\216z\244\376\363\014?-\355\342=\203\014\313e\037\254X\002\ +_\335\341&\345\235\027\214\002k\332<\213`H\035\313\0127\244g\025\301I2$\226\ +\362\006\302\315\271\204e\231\346\370M\275\241\036g\202\277\366\361\220\034\ +\024\245a\234\240QhJ\303\357\202\206\251\2374\010+f\220\253\346\217\342{n\ +\274>U^)+:\332\215?x\211%U\340I\213\340\326\376/\352\340\207\214\355\367\275\ +n\210\330v\020\030\214\275\312\017i\201T\023\364&K\206\022\0067k\030\221\327\ +\320\353\006::\364G\352h\247\356\375\373%:4\274\222\032\267m\230i\026\321\ +\316:,"\015B{xeI\001\315\341\234\034\263\206\001\256\277\212!\256\256\2179\ +\304%\021\350\016\235\336\005\336\255YK\024X\206\347\255V\342\271\267\034\ +\226!\3530\232\273\202\247X\342"\367\240]r!{H\246\345\325\205\327&]\314b\254\ +O}\006y\004[\2506\246c`\334\320\300j\3246\202\335r\264\236\251\027\275:\013\ +\261\243\037a\304\177\214^6ex\263\202!\370\311\177\015`\305\304\367\316)\360\ +\222K\316\302.9\370\271\002\201\203\306z!aR\013\230\343\312kFxb\216\316\220g\ +^\371U\361\321\337\213<\356\217\020\225}(\260oL\005\254\277\341\326\237z\306\ +\214K\323\356\026\272\223\301\211\017\220\360\026\320\220]<5\213\323~\005Ba\ +\031\265\310Szj~\366\237\377\273\027\330SF\373\206\376\266\246\370K\304\373)\ +t\323r1X\374~\017S~\344/z\307\353\251\370>]\320}\336\256\352\2108\037\013\ +\233\247Z\246\336\272\303\021\372\300D\014\375\271aN2\200\016\032f\230\026\ +\371j\316\204K\342\263\036Bd1#\037}X\365\021B\373\3505\374\024\246F\037x\204\ +w:z\233\2317\323\037\030\277\274\302\227\201\250*\177J\275\3015\364Q\243\224\ +\005\322\244\001\376\232\343\342/\341\333~\364??\322\036\266\014\375\014\262\ +\272\031\364\243O\015SX\307\360uy\317\033\212\243\365\227;f\322~\021\275[/\ +\246(\023\230\010\321\257K\006\032\2321\224\\\224}\274&\357\353\020\270\3464\ +\361!g\315\020\334\030\032\222K\034\375\002\302\022M\232\002\226z\341\357\ +\3447\377\377\373\220\316t+\260=\030\355\304\374\323\377\374\331\337\254\005\ +\254"O\353\016\226\314B\037N\020\237\213\335\272D\230`\370\254G\020XI\'`\031\ +T\030F\334=X\027\011HN\371\011\271\3043\012\374W<\000\205o\246\361\035\232&K\ +F+!\305\217\314\004\032jL\237\231m\306(\337\342V,\204\364\301k\3479\2648\244\ +E-\234\302\214\216\3121r\034@\214\271\017hR\244\340\026\250\327C?/\276Wt|\ +\212k\2614\372\263`\303z\376b\345\340?{\251\276B$v\207\347r\203\313+\260\326\ +\005s\372\012\257\250yZ\202\005\233\001\332\021{\220\001\273\230\320\264k\ +\022b\230\374\216\374_N\375\267"U7\010\034\367 \274\002\017f\2120\3041fR\037\ +,H\234,\310_\230]\004\015K\030\326:\376>\304\225L\221|\177\212\270V\203G:\ +\203E=\245@Wx<\265\217\006\227t:\215W\215\001r\006\005\246\304Y|aB\324\370\ +\307\332\000\336\272\213gvaI:\230\347\027\346o\376{\034\241\030\213 P.\343\ +\231?\321\011b1\201\376>\320/\365\340\347\326\300\221R:\374c$\331\023\344\ +\240\023\254\373\0020_\007\357v\343\217x\301\305ac\336(g;Bd\275K\004\324\020\ +\326ihp\247tI!\243\2350\275\221\360D\363\307\306\037\177\010\204\266G\261\ +\253\240\306\376\310\202\026_\300\374;\004\3065\263\216\220\252[\340^\003\ +\230\212\021\201 C\344\317<\300j\222\260$\345\346\307\200\223_\300\314\216\ +\037\304L\032\031m\220\222\016\374WA\343\367\031qy?\342\255\347\376f\'8Y\207\ +`Q\003\322\016\216}\204Dc\317\237e\003\320\3171\015>\2436\335\303+\226\376/\ +\273\370\226\263\037\323W6\210\337\357`\004\356\000&\352\303*\231\265&t""\ +\236\227\020u\206\377_z\341u\270\305\206\276_\263\013\205\017\012\004\321\ +\2261\177\316G.\340\324\357\214G\01554\205\023\013A\005\321\212\306\337\366\ +\205\027\201\304G\250\2641\377C\221I:\177\351\345p\012\333\225\ +\002\000M!\364\373\020V\010^\377\235?\340S/\260W\004\344\324\243\250\254W4\ +\224\226\370\352\251?\340\334\247\022\212c\005|sB\314\311\321\352\315\275(\ +\007p\3765\222\236\232\177\233\362\311\205\370N<\243\230\345\005l\240j\366\ +\275\377\255\363\027\375\227\277\350{\012\370\271\3772x|\352\2144\332j\250\ +\015\015#\371\012\236\274\3049\227\\\320\301U\3342`.yg\372%\006\347w\377\336\ +\001!\006\215\335\304r]\321vjN\275\302y\210\207%p\236\342\'\033\204\004#\257\ +O\327X\317%\315vM_\270\300\363\226L %\352y\022\321{\301\027J\\NN\254L\226\ +\331\001\222\247\204V\253E\240!\227\260\313\033\264\364\234\022\244\344p\003\ +\005~\017b\320\264Dl\340K>\226\006\206@\360\017\255$\3352\254\315\201f-Y\215\ +J\275(F\314Tm\014\312mT\001\313k\226\007z\002\374$\307uO\350|4\024\232\341}i\ +v\332\201\212/\375m^\023\215Pq(\2503\302\223\032\003\ +\274\356\373C\344\360\234\032\'\367\350\211\012<=\275\350_\021\350^\303\344&\ +\320\224\226\342>f\212\254\326rD\201I\251m\017z\274 p=\217z>\204_u1R_\021\ +\232I\361\371%\376\225%U\301\346V\020\337\000q|\000\031Es5P=\215pTBt\357\017\ +(GI\275UO{\301\273\322\237j\311(0\0110\217\274\311?B\300f\2304T\010Y\023B\ +\2035TU\023\364;\254o\213\222\305\210x\221\246\350\035\023\224\234\313#Gf\ +\2406J.\340\211\027\331+\\\360\314|\363\277]\341\202\026\010/\276G\374^@\313\ +\344\322\357a\203\216\201S=C\371o\340-W\205\263i\275@\027\265\350\3715nQ\036\ +\317\332\377\366\205v\252 \022q\003\363\321g\265\250\241\2375\000\2304/\320\ +\320b\305H-\245\031\270\340\003\232B*1\371\226d[\274\344\0170u\227X"\2772\ +\3056\346O\030\371\366\377\224\255\3064\210\362d\227x\237^H\001\241Y\206\013\ +%\313\012\013\336\\\213\357\236?\313K\306^"\2705\263\311\316\277\2732\377\ +\362\031\242.\313\200\211\274\201\256|\360\347Q\334A\221\211\216\026s\025k\ +\232\212\300n\323\362\005\253\245\016\261b\010r%\345\273\204\261\017\211\332\ +\007\250\3079\020AM\320\005\001\251\221\3578TE\033<8\255.P`C&!\015\274\322\ +\002E\260\022K@L\257|\351\005f\260\004S\340\010=\010l\355\227\244\363\272\ +\322\370\337\002\342\257\317h\000\255\221Z\370q\204\207ES\217\375{\337P\270\ +\016\313\316A\247+\\\370.\354d\301|@\003\206\001\260\252\015\216; f\265\3074\ +-\247\250\012\226Q\034\363\307\224P\201C}J\253>\015\226\340\230AFBo\374;\226\ +\255\330\276/\014\245R/\322c\034K\201\203\323\030\031\250\206=ja\364\2557\ +\367s\254\326\032\027\362\025\0375\010\375^\261\224k\210E6\214\320r\363\330\ +\177-\200\\\006\330\247#:\240j]\300\302\350\357\032\233\2658\3024\026QvI\025\ +P4\341\204\005\335\033\177\254\251\277\360{\3025\025\213w\005\323\352\025\ +\323i=\207\242\265\232~\033\000\326\012\273\037#*31\214\271\214\205\350\004\ +\270\235\00625"L\301\3042\374]Cp\003\320p\212\353\035\022:h\314\243\020\3517\ +Xds\\^\205\003l\360\357\216\177\353\013\010\314D\020-\200\203\026&\177\304\'\ +\274\001\300\323y;W\375\037\376E\316\322FA!\317(t\207\317op\253\025\204\177\ +\354\337\275\213\000Fc\261{\272r\215\357\007\020\267\346\254\352~B\265i\000\ +\360&\347\302\356X\271\372\206OV\204qZ\177\363\011n\277\207\274\240\005\354.\ +f\244b\205!\203]+\221{\346x\2605r\014\027\001r\027\302\212\216K\257\361\353v\ +Nk\362+\026\205\305B\025W`|\224\226\322\012$\370\222X\347\235\367\246oa\370\ +\265j\255\230\324\222\002\250Y\324\255 HK\177\327F\200\272\300\242\032\341\ +\331\351\342\\z\241)pT1\001V]\\\241b\250B\222(}\215J\375\222"\313\361\351\ +\005\365\3060\214-pM\022\036Y\306\364}\234\375)\020\350\001\354\031"7\014 \ +\241\\\366\022&_t\254\300\345\357!\210\030<\210\342\373\344\336(\336YD@\250G\ +\353\226"U\352\350\342\027\270\341\300\340\231C\307\247\360\244\031\204Z\320\ +\350\017p\366\026\300L\215\254\260\210\240\240\372o\207\014\264cR\326\222\ +\031\321\306\362\316\224u\243O\376\016\316Y \311y\325\337X(V\204\343\345\203\ +\332j(\344>J\200\034u\314\331,p\250!\302X)s}\304zW\233\240\271\336\222IQ\351\ +\365i\015\233\023\322\215\012b\254\310\312\322\232s\260Ub\341\026X\276#h\257\ +De!\177\375\314\032\250a \273\306\361\257\341H2\177{{\020\271T.\035\323\247P\ +\360\375\200\263\256\274\345T\314Jj\252s\300:-|[\3535\272%KcH\017\257\344\ +\205\200\026\347\270\232\011\341\357;|*\201\332\030\352\230\206\027\032\322\ +\212\206=r0\210\006\325\310!\200\377\306\374f\376\015\334\3619p\246@_\312\ +\021\030\016\200\215\015\260\000\227\376\273f\206VFo\246\321\230\003H\223\ +\000\313\330\260\020Q\000N\264>dh\361\244\005R\332\361\376\371G,\363\226\226\ +\255\2461W\224W.W\037\321\010\347\0253~\014\364^\326\300\234\226l\340\037\ +\301=P\323\033\177,\251\247jXl#6\337\342\014\015\353@)\342\266\307L\376d\321\ +\016\031\001\244\200\265\024\306\274\244\301h\261N\356U`\023z\001-\263\217\ +\021\\<\361??\373\017\277\000\036\244\004\265\022I\307\032\266C\374c\352\277\ +\327\376\224\026\001\352\024\261\221f\203\031t`\316\220\3262\322V{\265@\304%\ +\336R\242\376\037\374\031\004\273\327\032\202.\243]\010\267\210\014\037\207\ +\327\344\262\217\261XG\210\326:\350\300\024 yJ\004\254\207[\275\240\325\321b\ +\254\205\012L\341!\023\374\353HJ\310\241\010\025\225\241\305\212p|\\\241~`\ +\230\226\275\306\347\012\265a\212\241j\364\334\220" Ks\307\237\356\210\350XH\ +h7\360N#\370)\021\332\022\340\240\344\007{H\202\013\252\270\2451\225\274S\ +\223\027\255\006\354\301cj\026\'\205,)2\374\315\177_\200Kq\345\027\376\214h\ +\275\032\354o\014\231/\360\2713\202\334rKg\304\256. \262\0113\300_p\243\237\ +\361@ZV\007.\240o\037\241\357\372=e\010\245&dN\247\340\230:\335D\202h\012\ +\214\257C\225Vi\177\260a\022\331j)\241E q\006e\224\303\006\246\204\303\312\ +\327\322\347\022U\310\003\2007\242\322\012\206d\014k\027\\J9\237\325\035\004\ +\026X\030\005B\317[\200\277S\024\322\024\347=\364\027\231\370\237\247>\007PR\ +\235%\226\261b%\347\206\330AA?Z\301doH<(\011\030\265p\'R\371\372\005\327|A8\ +\362\002\266\355\224\246_=d\001A\253\275t\010 B\205>\2055\277\304\302\325\ +\002N\202\200V\226\351#M\276\325\334\337\022\316\230#l\023\361-\221\372\312\ +\255}cV?\302\222\024\203\374\2268\177N\354\336"\365\356\310`] \354X\023\'\ +\017p\336\036\352\231\273\260aJI\330\001\0067\005\270|\212\274q\023\311Ojf\ +\257\240y3\306x\352\013_#m\033E\032S\2060\3242\032\357\301z^E\242\237\201\ +\266\235\242\244\3222\026H\220x\013\\\370\011P\344\312\333\'\015Ez\374L\013\ +\370S\027z\217\004\2514 \256[f\314\012\026\353\030\0271C\0000\2020\337P`\025\ +\231;9m\300\010j\333\342i)\010l\240_\013\240\264\003,Dacd\346/\257k\257\231 \ +[\262\026\324\0347^\003j\324\273/\260\344G\261\032\255L\354W^\013\305g+\343\ +\242@\326j\020\310\3441=*Y\214\353A\037\257@=\275\367\277\235\301v\025\254\ +\260&09g\214\364S\237\243\246L\375\035=e\0124\304!\224}\317\270\264\241\206\ +\271\200\270*F\256\304l%\275\265\014+S\370\264\3670\2459)\216\013\363\275?\ +\371\367X\030\005\353>\015QME(|P\221-\021\300j\341W\261\002\001\217\357\261\ +\214\035\022\353!l\303\0206\246\206[\250\020\260v\274\001\215\370v(\260+|9\ +\032\354\020y\215\360]\022\362q4\353cX\260CDp\252\221\367\3243\211\'\367\201\ +\226H\356\362\304_\305\021B\246\016\021\177\023=\246!\376b\360W%E\377\011\ +\263\304\236\024IK\373\344\012\253\250*bI\032\177O\021\032(3_-H\036\177\272\ +\310\360\233\340\257\205\217\3727H\230\344\035\317H\016\2674\326\005.\336\ +\001\321\232\202\356\321\342\0147\320\354]\002\311\272\374\344\006W^\004\342\ +\030\306\210\325\032\3778\336\303\024\034\223\324\'V\365\036\217X\355\255\ +\024\010E\247t!\3131\356\261\340\246\240\230\317`\006\306\370\331\340\201\ +\035R\\\016\2175%Me\212\222\\\015];\365\242\332AB\325\3632`\357\220.\252\021\ +\361,\215\267+\320\232\364`c\322.\357\261\334\304\344\257\031\364I,\335P\033\ ++R\317+V\302\027X\272i\244\325V\2648\005\314i\313jb\207\302\333\214\270DH\ +\213\266%\325\'\024X\013\303\236x\241j\035\324\021\010\232\020\305\277a\240y\ +\010p`\312\260U@\363\240_\226\254\034e\205\267@\377\304\256\335\223A\253\326\ +v@\261\011R|\203\300\350\357\010\352\033PY\340%-n<\324\2065)\375\304\033\274\ +\367\346~\012\014\251\240\312>f\374\225\303\216\325d\376\244L.*\257_)\232\ +\027\006D\021\226\204\367zQ\014)\312h\026\366E\031\370Sx\346\024\272\362\236\ +i\277e\336*\326N\032#\224)\346hg\024 \354H\303\262\254\036\031xCY:O\260\330\ +\015\321\221)4\265\241\250>\343\270JF\020\222\252\366\240\364q\375\013V\014J\ +B\007!\302KH_~\024\0046a\272\255\344\305=@.\2169^\007\015\353\301\200\257\ +\021\205\015\020\266\226$\253Y\262\331\035"\377_\201\247}\205\361\326\014aA\ +\012\247.\313Y\244\034\265Dag\210\345\035\026\217\205\377{\315\3639\224\230\ +\305\352$\270\3313\262\325TW\367\240\377%\022\360;\370eG\316QK\217\331\022\ +\221\230\222|:3\377\304b\335\301+S\350\231\304]i\004\263\015\216X2\005\223\ +\365\326g\342\255\217*&\337z\313\241`\0362\251\026\013R/X$\236e?\261>9@\371\ +\3370<\325^#\311\370\226\010+\016\020\326*\214\250D\217,\366jH\376\177\206[\ +\2621z\022\301}\303\305k\361\367/\012%Af{\350#\2651\310O\211\327\314>l\336.\ +\012\270%)\231\005\350\300-\353\227\035\371]\206\034\220\226\3742\341i\314P\ +\271\220>\004\015lg\024\327%m\367\0005\001}\314\023,\372\036S\257Y\344\351?\ +\272E\020P#\014P\334\323!O\357\340\252[@\324\011V\360\032\311\266\0267\006H\ +\201\022|\246\004\264\263`v6\240~M`\303\266m-\226\232\024b\243c\012\255\005\ +\311\356U$\3249@@\352\273g\200\226^!N\237\0229\263l\203\260\324\325<\006\330\ +W\324\304\026\376\267\303\3520\214\273\032\264\233%\240\230|\304\371\345\210\ +\367\360\342%\026\267EP\376\035\326PH\270\344\330\323X\313`j\224\301\251\216\ +`m\324\350u\214\2135\271\275\362:\246\260\256\202\317j\326C\277\230\034\366W\ +/\232\023\010P\364\353-\026\256^\206<\363A$\2629B\2753ft\016\005\334\036\003\ +\313\026\344\201\232\313-\360(\264\357\251%\3720\004\307\332!\356\032 \334m\ +\020\221)\031y\210\005&\224\3217\\p\0069b\017\376qLdo\014\377\301\242>\201\327\ +\022\362\200?\220_\2745\015\3749\322\020\027\273\322\224\305\332F\215\233\ +\24242DP2B\322\265F\244v\313\204\244GX\346\020\272\363\247\027\334\024\372\ +\365\005V/C\034\'\241\3031(\354)\020\013\015LU`\247XV\332G5E\012\246\314\312\ +\026\371\300\036\011w5\335\3345\334\327\200\015\206\016\265~\3151\216C!7\205\ +s\326\310\366\222\356\334 X\353\371\203\267@\255f|\362\342\241\336\306x\253\ +\202kX\260\346#\301\204@\333&{g~2\357\340!\257\261t\265\206\271\302\305m\331\ +7j\244\015\0223\265\235_\241\237\377\202\216^#\376\033\262e\341\012\351\221\ +\3244\217P\302\357\221}\350\300\306\351?h\355ip\364)\020\342\232\011[\000\ +\030\003;\333\261Ua\301\307\230E\177\356@\214/\000:\012E\353\037\261\355\306\ +\306\312\367\2432v?\312\0076@;\325\334\266,\300\031\304%7,\343_C4\'\\\345\ +\376\225l\340-W\205E\251\030\231R\015\006\014?\264\016^\362\026\015oe\002\ +\240\272\303S\227\262\226t\271}\365\307\350\262\267^`\212\3057\354}\272\002\ +\3644C\340\020\212\252\032\331U\0148{,\2204t1\206\213\3142#I)\260+\212\256\ +\205\303\250p\364\327P\023e(MP\361\357\003F\270\004l\325{@\0340j\303\002\213\ +]\251\264c\250\362\030\341\252\256\370S\266\267(\241rD\316t\216\020R\261\261\ +]\010\255b%|\000_\263f\365)G\336\247\000\221V\021\317\310\372STV\241\354\015\ +\\\3123\210\354{Dx\332.\261\003;:d2\255\004\271\013\004\241\026\321\276eg\ +\235\026u\3370\232T\246vJ\236\365.\33214\327\375F\006\221A"\270\211\335J\026\ +=+5\030\031\033<\316\320\231Y\023\010\177\320\330\240]\265\0236W\216Q(x\356/\ +V#\\-\262M\3010\326\024\242\202\016U\270\305\212\350\225\366\225U\360\217\ +\032\255\015H/\331\246\354\012d\017"\255@\235~\217Q\265b k\306\357)\312\303\ +\206\002\322\272\340\220\001\247\306c\252\335\005\327\305-5\340\003\037\212\ +\346\267K\346\250\003f\237-\316\247\334\263\015\321\275\015\311\315\026]\223\ +5Q6\303*\206\213\220\374\ +\026v\252!\217\347\222~\265\303\003\320!\023\332`8\206\3065||\226\355\321\ +\006\020\252\222Q\036i\350h\320;\177\003\311\007\316\274\316\215\230\262\220\ +\031\0308{\354\314\276\000\034"\314\323c<\265\226\027\372\315\2370t&\345,\ +\225\026^\327\326\000L\012\222#\035\000\032e\317>&\325D}\340G\336\202\316\ +\305P\264\243\207\305\257t,\207\004\251#\316\221\023Ay\354\217\376/\3204C\ +\253u\217\3670@\033\252t\337\226\244\014(\030\237\307\276\247\036\253\345\ +\212\034\317cW\234\215\274\212\204v\361QX\222\241\217V\214\341\015\224Q\327p\ +\027\231T5\240\3360\343\301\362\311\317\3604\004\035\327\312\361\033\244.\ +\337\250E\033\260\373\216\031\203\245$\272\2251\265R\236c\206\374 \214nhX\ +\277\036>`\002\272\030\311oK\376\001\2470\210\3764\3663\336}\350\030\210>\ +\036f\302R\312\200l\267>\264\352\234}#\232PMX5M\250\225\277\320!5\261\357\ +\3341*s\244l>J\301DP\320\266\201\261\264\321C\235\306\216\212\002\206wIn\215\ +B\215\362\327\2270\223\026\265\277\016\250\326-\006.h0\374\2301\276\202s\312\ +,] E_\302\265\277\363\377.\330U\226\322 [6\312\224\261\001\364\036\244\357\ +\240\361!*\354\003\330\356\030\350\352h\206\001}\266E\352\357\010\005\346\ +\024bJ\332\246b\304\347(\340\224h\245\276\241\030\023\204\022w0L\035+\342\ +\026\265\317\013\034\343\201\2069\254\346.\0261kzI\035sP\020=\320\276\377\ +\232y`\007\264\352\025)\230/\321Z\240\005\267\002\027\2510\366\202\3036\034D\ +\265\200N,\351\035\305\352|\345b\265,\001[^|\021\303\0355\331I\004\203\246\ +\221\222gcgo\305v1\265\237\005uY\373\336rps\372tn\322A\322\307RM#(\320gSO\ +\237\307\324\230M\317>\'\023\366"$\337S\316sh\340}4\033\373`\276#o\245\001\ +\260w\301\206`e\341o\330f\363\200\0052\366\0264\267!:\314\ +\216\370,J\357\002.q[%)\302\312\254\036a\361\345\354\325\320\211p\325\003\ +\020\271F\031k\025S\373\012\211y\300\272\264\245\3351\370\015\255:\3070\363%\ +\342\273\005<\231X\327\367>\020\352\001.H\030\265k-5\307\362<\200x\353\030\ +\212\017c.\334\'\331\330\222fz\316\352\377\034Z>\001\253\2505O\230\377p \250\ +c\264\344"\337%\264?]@\307.#\304f9\222E\243\342!Gf\351\374\235=\374\255\242\ +\340O\350\021\035\260~\305\325\277\002\257\252\331\315\261G\203>e\246\326G\ +\224]\022\344V7\340\330\001\271\216\323\344FH\267\012,\233\005\207<\272H|S\ +\206\216^m\037S\350Bip\204a%\023\006O\2238\223g\306L\244\004\231OiS\023f\033\ +\016\024\276\004\201\2055\277\205^\243\354\001\362\244\371V\312\031K\035\013\ +a\241\003\3270\300s\017F\307t\376\266\372\240\030\204\351\2105\310v\026\272\ +\265D\013NE\332\356\022\210\3549\216\240N\333q eB\034\264\317\372\323\022`\ +\367\000>W\314\271\0169\312I\223Q\210\3735\254U\230\210"\266V\217\322<\350\ +\030N#\200^\263\205g\3735\211\015\215\201\037\2273\237\014\235U\026\177\275\ +\002\025t\366\177\'\243\350t\224m\227\367\015\007\034\030Nt\330\226-J<\015\ +\313g\333 \244\315\242~\252\325Z\203\265\377\032A\352;\272\2040f\262\210\334\ +B\027[\237\023r\374t\240\315\342\377\320\015\224\3462b\3550P\350\026\254@\ +\025\034\025\267E\337k\342-\302\232\224\306\373k\300?\202\312\376d\236\201``\ +9~(\345\244\013\235M\327\260\030\234"\360p1\355\027M\356\307\311\006\004\020\ +\363X\361Uo\265\211\342\321\256AMNg\210\213O9\020\3061M\357\310\013s\210\202\ +F\3542\032\301+\235@\333j2^\227\021Q\013m\237\212\351+\376\244$\225\214\346}\ +\035q\324\034i\316\000,F\235\217h\031\317\247\344o/\020\325\245\221\356\276a\ +\033\362\002\315\362kBL\001\215]1\314u\321j)\034\224\340\036&\234\307h\020\ +\276\364 \260\021;\234\372\241.\231a!\256\031\036\250\022\317\010\370\210\ +\2565\014 \207\0216|\011?\242\363\005\206\274\000\313K\3229\232\012F\027\254\ +!\327$\350\325\264`\372(4\355\370\000\304\363\216\305\\G\242\3135\352\233\ +\012\013\246\221e\246\261\324\232hD\360\300E\314\037*j\261\022\001\037CO\007\ +\360\307\003&h\016\010\254e\334\276\027\207\350h\221y\010o\373\211sU,\015\ +\211L\333\224lT~>\322\351\313e\234\235\331\207\322Ni\247fH\214\246 r_b\376CJ\ +\215\350X\033\277\212\255\246j\241\3260\320!%\372\225B\033\241>Y\361\026\303\ +T\324\232=%}`\370.\216\211\011\374\330u4\002g\300\326\326\214\364\352h\225j\ +\366\034\275\215\024e\375k\215\262]\215\202pa\376\001\367R\302\237jk\337,\ +\316\271\333RJ5\230-\320\003\256\214\267[\316\250\315M\222]\303\021%\031g>[\ +\266\266\253L\377\302SP\306\253\222R\356`\230\265\357\271&\320\330\343l\235@\ +\343\320\220a\011_\030\306\313\224\270\235\021\265f\000\360%#\265j\301\002o\ +\206%\377\236\325D\207\277\024\260<: \3445{j7X\\5\343\265\224M\0119GD\274\ +\213a\261\232\204\015\243\276\257\010r\366\330\3703\001\337\320F#!3\017\3021\ +\347\\_Z\3212\360\232\032\237\336\232?\374o\177\370\257>\004\366\250O\366\ +\263\211\003E5<\235\361\267\004$4\305\307C\323\303\007\270\204!\213\253\332M\ +\244\232\025\212n\032\355?f\266\250pO\000o\326\350\024\317\030\367i=\301F<\ +\254b\035)e\245\307\300W:\326\000,\207\216\350B\325\363i\0026\212`\222&f}\ +\266G\344\210\372r`\036+\306X%\255j\015so\270z\022\006**\213\214N\341\022\ +\013\367\017X\302G\312\255\310\274\016\375\003aj\036\307\274\252\347\271A\ +\036\371OTs\206(\334+\243\346\003\3073~D~i\200k\352\305\177aL\277\204Vi`\261\ +\006\257\177\015\364^\201\237\202\230l\020Y\012+Z\223<\232\223\357\332\322\ +\325\353dai^\025\235\375\204:vI\015\371\032)\312\017\323\365\206\342\277\245\ +Q\257\240u2\233\347\216\255\015Z\'\225\253n8:\'\344\227:\355iD}\037qfv\016\ +\015esV?\022zmd\305\314\330\025\333\201\023*,\013m\336j`q>\240\037i\007\354f\ +=Y\305[\013\332d\031\351WX4\357\242\310r\012\3631\033pj\342l\003\260\032\006\ +d\270.\241\265=B-\317\240\033\257a\341\224\006\254\223\314G\324\243\001I\313\ +o8c.e\177wK\232\311\222\311s\212\274"\'\307r@\313\232r\036U\202&\2150i}\304\ +\272\252r+>\370G\363\205\034\327\307\216X\367\202\005\217\300lU\036\350\020\ +\223\346\216@\232<\342\224\352!J]G&\315\236\233\237\251\0079R\246\327\3205\ +\271\201\235\254\203\310\024\330y\373\300\025\224XD\232|\037\340If\364\240)\ +\034\205\342\360\241-9L\376\251\360\271\032d\253\212\024\245\234\003\231C\ +\327\355\020Z\251}\223cV\312-\3308g,\254\311\224\204)*\333\241\305ba\266E -\ +\344\204kq\\\364\023\326\225l(\202L\320f`0\364L\255U\213\012\364\025X<\373^H\ +?\243Q\276\303\267\345|U\031\355\222f/\214\315\016\343\270\250o\346\220\021\ +\263\2415\322\266\203\023\270\002\365m\312\205\255`\250\325\273\025TxE2J\010\ +a\304\031\'*\224\023\257}R\244\225r\234\242i\252\277j+\237\021\311(\201vL\ +\340\353\015\262\336\227~\001&\260\256\215\177\224\015\307l)\340]\263%{\001\ +\257\2551\237Cq9\264\037\312\377\025\244f\205\011{\244;5\004\247\257P\003\ +\336\001\245Q\272r\236{\301hw\316\025[\177\265\011!\301h\334\027\346\007/\ +\256^\326p\002R\217Q\231\215Pb\030\357]\261!\3251\262\271F\244\366\326\377|\ +\213\252\267\245\335\032\300XW\260r\007@\317J\363=,b\223\275\243M\\C\220\'@,\ +\336A\233\325\255\\3x\371\012\353\344\010\211\356 \376O\201@\274\241\323\272\ +\211S\027Sx\342\302/\370*v7\355\372xt\203\032\231\326\357\027\200Ou\301^\004\ +\236\276Ca|\006DU[\344\204\364\361\003X\025\211\317\243~D\373J\007\014\375\ +\006\375n?\203Z\373\324\014\263\277\343\275\206\204\360\206pn\312H\356\373X\ +\0169aP*\317\356\000\213Q\255\332c\334\246\366f\353`\335k\006\251\217\331\ +\2323@\243\364\210\277\325H\346\007\300R\257!L)\337\312C8a\377\323\222d\321\ +\363H\337;\216\375\007s\214\210\351\010\271;\332\353\212T\006\035j\323"I/\ +\320b\261\346\374ZKN\021\215~B\231\177f?\356\016\332>u\026\317G\323\313>\303\ +\033^\260~\242\035=\373\320E\357;\263\2371\017"`M\001L\\\262\215\253\202>\ +\345\234\240\250\334\347O\364\230#t\364j\340\233\263\001\276f\337\355\210\ +\355\205\203\330h\254M\370\025[\247s\010W\305\233\343\265P\003\317\262%\036\ +\315\234s\366\323\030\273)n;\203\271\351\3417\305\345\304g\037\303\012\033\ +\364\220\004\336w\301\002^\006,\306\005\201%\254I&\234\246\337\202D\267\217\ +\356\213i&\326j\037\313\362\202\031\244\216\374\330\207\033\370\010Q\206yH\ +\011C\200\224\2037,\027\344\210\223\241\024jY\002\376\313\231\320\234\320\ +\270\246\221\305\\=`9j\347\367\3438\221\247d%h\311&\036\005\021\265\370q\015\ +\177\372\030#\373\352\310L\354sjF\301\2404A\027]\313k\226\301\274ZkU\302\335\ +7h\342\015\313\210\241\177\322\221M\262\0106l\010&X\313\366\370\217\320\257\ +\027\376\337\'^,\177\367\277\275\240\306\035B\273N\331l\374\021\320\342\030\ +\207\236p\340\336%\313\2759g`.a\035fYENl\005\324KIN\273\020i\311\033\333\243\ +\027\\\023\362K\231%\276##\243f\364vK\252\201Z\235\005t\261\300\222\327tJ\ +\361]\235\005\252=v\273\034\331Ux\235;\306\204\2161\273C\204J\363\027\221\ +\271\016\263\312\264\252\236r\362\300=\305%\335\306Z\234\206\015\233\301f\ +\211%z\212A\215j\366\237c\300\237w\301\331>\304\266\303\026\222+\016\224\272\ +"\373\340\202\366+\240\230\206#\261-It#v\206\017\310\024,\342p\216\222KPiP\ +\023\316:\317Y*\326\021/\277F\340{\300\020EB\330\005\211*%\346\260\344X\334\ +\013N\224uY\006\270\275"R\237\243\203\256\210\331\313)\252\365C^\371K\334\ +\207\016\273\274gk\352\021\367\332\221A\204W\250\031\025\221\361\366H\013\ +\2713\037\235H3q\202]@v\360\366\317\260d\257\314\337\274\310\304\274\177\206\ +\366%PX\3111oaL\2673\340\032\214BH\343\000\264\002\317D3\200\267\214\303,,\ +\231%o\277`\\_\223Tb\211)\344\234\211!K,\240\021%#\2705<`\316\300d\315Z\244\ +\270\217\001\223\373\257\230\304\362\230\243!-\000\241\214\343dJ>\352Sx}GB\ +\246\002;\322\027\032h0=\326\364u\213\215\031R\2643\010\234\315Y2\031\367\ +\020q\374\030\275\037?\202\210+\257>\307\344\315\035\214Ih3\035c{\365\200\ +\303`\021\245\244\200\177\207P\357P\256\3234Gs<5\340\031\354\217\210G\372\ +\212td\307\031\254\226\322\335\007\344\251\346\234Ap\215\345\271\340D\374\ +\002\316^\223\363d\207\343\ +)\011\004\307\274\354\212\026@\271\330{p\332\337\270\364\3260\301#z\267\300\ +\243\016v\256F\034\376;\'\324\225q\236\216F\370\327\250?\377J\270\261\340\ +\3107Cj_\316&\372=\034\343\023\346\000\255#\350\250\333\376\3505\234\301F\ +\0110\330\'\177v\207Wl9\235q@\017\257]\000;lxl1\370\266Eg\2116\021\315\303t\ +\'\255\263\350\006=:\001\351\206\323E\032t+~\204\025\373H\006\250\304\274{\ +\234\234d\271\260na\007,C\211\222\263K\344\222\373\331\232Q~\201P0lR\240\000\ +K\011Q\3648\350X\303\213\320pU\021{\335\020\215\037q\366\335\206c\270\253H\ +\006M9:p\204\003=o\003\356\254\215\304-\ +\307rN\313\245\2453\016Kt\240\344|\344=V\212. \264\337p\3073\272\272\035J\ +\210S\005\302\004\222\204[\3528\316\2118c\240*\303\022\366\361\201Svx+\243U\ +\233e\2628!3\354\216Pr|\374\275\0173^3\312\322y\317ab\253N\232\323\362\256\ +\2135J\255*h\243\276\006\231\203X\332\253\011\033n\035J\230\254\251\030\336\ +\033\206\232z|\235F\361&\316I\014\023\232\264\231\342\002\203\374\302\320\ +\3470ZY\036\216\014\265\277a\213\263\030\244A\366\012\316n\014\336~\023\310(\ +\312p\025*\346\230i\363\206\024\315\033\322\214^\240d{\005\274B\011@\032\212\ +.\310\177.\037\260vr\246\032\025\001\301\021\343e\307\266,\313\214@\274\247v\ +\322\205\355\303~G\001\343\033\\F\200\030\227D\332rntPD[8\212\243\261ZZV\027\ +\373\217\326\000\204N\361\245\3733\265\214\261\246\260]2\301@k\001\222\227n\ +\347\352+;_\311\307uv\0100\341=\370\330w\270*v\202X\302w)\237\210\301\023=\ +\306\215\034s~\235D/G\260a\241P\342 \260\005\001h\325\206\220\030U\\\202\003\ +\363\023\222\345\224\270\227r\0353\016\213L\262\002A\210\213\223\235j\352b\ +\207\226)M\336\265z)T\343\234#\206\372`\241\351\234\331\031t\372\212\271\242\ +\212b\003\220Q\215\370\266\203mHn\354\024\215\375)\034\203f\272y\246Q\235\ +\216\213T\201M\3217\334\372c}\207\010\240\333\216\303\262\244|;V\372\204\332\ +\273\213%p\206\2453\247\226\235\002\360q\017\266\0128\211u\233P\322X\322~h\ +\234n8\263\367\233?R\015\276\203\016\264\275\365\227|\216v{\205\035\277\261\ +\213)\354}S\300Hd\\\216a\262W\307\031\3225mbJj\373\020\\\233\303\230\312Xv\ +\020\335sLR\230\303:\203\221q\030\324\260 \252"^|\226-b\243\275\226\256\'()J\ +%\205s\217\2739(\277"\211\325o\255\364i\271\303\231\260EK\ +\031\315\264\212\320\262U8\215\274\2554n\330\244\011Vh\352\314\310As\221\275\ +\2211S\265\234\177\036\350\352\332x\325\217\020@\311x\257\342\2563\005\037\ +\234\034\351\022\3570Y\212q\244\016\341v\213\353\374@\274\325E\202\264\316\ +\203\252\267\335l\333\216\300o\017x\0069\241=\303=\370L\334>i\312\033+\310Vv\ +D\236\014\217\240\201\307\322_C\375\3008oHd\322!\335\025\003\306\021\255\326\ +\020%\270\300\237\317\351 Rz\335\2326P\367\277\321\024L\031\211C\316\013\353\ +\021\217+\020\311+\025\305\372\345\027\330\025\226\371B\2128\356\226\315\031\ +\363\254\002\222\257+\346\222aq/\016\2374\310\177t\302\205\3144\240\300\224R\ +}K\230M\253@J\033)\342XP\027\355\3270\362#F\230;R\306\351\250\322\305\372\ +\006\2247\355\252\374\304J\220\222\227\236a\003M\303\255Kr\366\270\325\034\ +\247\241\347\235`c\314\320\2023\001w\246\0377i\014#\036\267\243=\016\275H4\ +\034\355s&\336\345\203N\026K^\253Dg+\356I\271\366B2Y?2\212n\271;V\237\345\ +\335\004]\357]\274g\303ru\213\263\204]\2269]>\215\244&\2138(\364\003\271\270\ +\334\034\226\244\245{\320]\031]\344\264\347\234\342\233\262\334\021\210F\352\ +9\237q\012O\311q\313%\275ZN\306\205\213\033\253X\262U\007\321{\206\275\212\ +\272Hd\231\000\237\323\306\300\2343\365\035\307\010\2728_\247\0279\322%\223\ +\260e\034\305\354\330\334\023\246\355\0079\314\331\2010\344\222L\270\301\242\ +8>\3560~\012\371\271XJ\267\334\224\3220 \250\230i\265l\307\332\2663\013\2112\ +#\214\243T\224\357\311\357\011\257\237pT\306\200\307Q\343z\213Yt9\267\321K9x\ +\262\000\005d;\243\325q\366\360\266\325\342\222\313U!\245&\026\222\267\026G\ +\265k\014\030g\210\211\322\035l\236\210\353\200e\263\001-\247\3169\353\021\ +\377\322\355\321\022\222 \302p^\235z\247s\177\272\300@\014\233\307\351\216/\ +\323\030\021\271\230x\354\002\036\311\030\365\270H\246\255\220\356T\261\2272\ +\307\340\332\023\304\317\003\324#\327\261\276\227\262\007\250\202\243\356\ +\342\376\242Z\2305\314J5\244]\303D\337\222??\344\270\263\300y5,(\357\260\032\ +\257\372\026v\220|\002\252\237\356\314;\207\000\026q\237,\033+By\234<\035\ +\266u\034\002\305\030\322^5L\270\303\026l3\350\035{\215z\3607b\362>\201l\022\ +\352;)w\3758\341\250*\307\301\376\357\331f\265`a*\347"\\`\376\316\032d\'i\ +\2131Y\221}z`\007-i\220\241k\244\317\246\303\034~S\367A-"#\354<\232\377!\234\ +\372\212\343+Mdw\017!\232\260`{q@\367\225\371o/\300\177b.\360\024(\260\004\ +\276{\010\204t\316\331\237\004\005+\326\272t\024\356\021B\363?1CQ\007kmwF\ +\321\001\367\210\303\302~}SR\220\364\346.\231\337)\347/\215\341\205e\350\250\ +~\353ud\241\246,sY\224<\344\035\357L\223\225\3313\356\202\2403,W\214\264\272\ +\270\207QJb\200#\257l@\014\243\212\235\226+n\365\252c\3736\364\234\332n,\225\ +\206;\016\251\035\203\354\240\275\352\0117K|\032\347\374\277\246\255\035<\ +\330.j\201\220\275\343&EM\004\260zX~\206{\233\344\017\2548#}\025\330%\235uh\ +\366-9\377\315E\276\237\301\2249\331\012\340>\316\'\3179\375>es\314c\206\207\ +\312\260P\224*}0\203\247\203\347r\234\005\220\200\020\0206\353\\\3074]}v\036\ +YZsb\262\222"\177\207\233\275C:\334\262E1\205\335:\242\246\214Y*\334\',\343\ +\340\277\035\335LA\342^\330f4\020\004gqD~\303T\250\302\236\2305;\230NX5BX\ +\321F\222\323\200Is\230\212\037\266:/8\177g\006jR\203.\360\024\243\250\372q\ +\314\243.\315\002KX\253\221\012\306\244qnX\303e\243q\323%\027Y\012\'\223r\ +\206\227\341(=\235\267\264\242]\233\220V\352\210\231\215\261\021\332\2370\ +\356\216[\321\235\2029}\201J\265\332\270\025,\262y\260\025\243\352{\007W`\ +\210\314\031\366\337*Ap\014\020[\351*5\013\312\013\356M\367X\011uu\344\305\ +\207a\355\031!\024]\220\206\333\001\314X~2\334\251\331<\200f\202h\035\237\ +\337\010\266l\031\233\326\033@\204\3038\331>\214?\352\301\023\2661\332SZI\ +\3407\326\314\026>\000\012\262\240\002+;:\247\306\037qg\312\036\202\314\002\ +\274\372\031\371\335:bT\003\322@\025\235GB\352)\020\210\363\007\333\0065l\ +\223\017\250\335\210\035y{\310[\200\034\213\300j\270\3345\305\246\024"K\312\ +\245\366\034\276&\011\275\005\277\342\010\211\256%\344\270\035\226\260\242!\ +\325\261m9\2675\261q\317\227\226\033U[\216:u\254\322\030\272\231i$\032;N.\ +\273d\314\235\001f\274\217\273\331\026\214\004\033<\300\253\270\261\331!\246\ +\257\232\030v\364Q\260Q\332\324\000\364\320\021:WRV\276:\232\000\373\240MyN\ +\332`\315\341\344\322\207t\313\335\277\227!\322O\271k\313\202\240^\215\002kI\ +-+\330\023\256\274\252C`cC\216\251\232\2223j\342.\035j\260/\031.\026Hz\014\ +\023\25317\206\023\035\032\022\317\325]\335\347X(s\000\227\247,\027\207N:\ +\265z:\371\376W\344\272[C\221\303O\2061[c\302S\011\022\240\355\206RA\3637dH\ +\2539\027P\275\317\316\337\222H\335\005,t\213\274@\250\010{Y\010m\'0\031\244\ +\235\0274k\032\327\277\365\001\3013\306P\312\263?\003\237"\341\004\341!\030=\ +Cng\367p\344\3659\271^u\364\204yL\335\233\270\225\312\204\263{\203&\364A\024\ +\277\342\264\376\206\014/q\361\016\317\273\344F\005a\202\376Wb\374\2325Lc`k)\ +,\261NsX:}\207\352\357\2305\204\261\267\326+\322\2506\314T+\244`j\307\204\ +\272\256m\376bP\366\262\257\264n\272\033\035\274dGRF\212\316\037)\202j\007\ +\330&RH\364\011i\277\265\300\267\0371I\334\241\312\324b+\272\016\016\377\003\ +\243\252\024\250\351\036\212\263\2417\311\241\223\272\341 \307>\273};^\246\ +\301\015%\214\333us\314\300\252\255X\340p\354\302<\300b\371B#\342\260\3145\ +\033\326f\011\363`\263\264\222\333L\251}\033\002\201}\305\375\000\204\300\ +\247\304\372\001\027\271N\033Mc\305b\211\022\264\343\254\340\313\260\'\210\ +\2163\233\000G_r\012\304\032\374\372\320L\2273fjx[\352M\224w\330GR\361\'{\ +\260\373\23471\005j\261\007\030GI\303E\344)\334\221r\034:Lt\302\304\030 \316\ +\005\313Y\032\025\031\230\350\224\023/u:\343\210T\313\212\3541\027g+j\313\ +\325\012Y\252\006\305\1770\334u\234\266\367\031&e\312y\02459\322UL\325\265*\ +\260\241\353\2518~\306>\260\230X\222\237\3218>#\272\371\025\300^ \370\206\ +\315\235t7\027\303\342g\312&\004%K:\352M\037\201F?&NE\234\342\225\263d6\200\ +\240\206\304@\033v\224\031N\363o8\356j\216\252\350%\321\3670\324jK\0159\217\ +\026l\203"Y\312\355O\304\305\254\200t\025\310\022\372\020\313\020$\007)\233M\ +\021\231\355\304\251\231\022\007\326\344\360\204\001\223\026\201\204\314\344\ +\030\241U\277e\012\327\017\273\354\210\300\302\202p\350\251\030\241\223\365\ +\035\0306)\260\320\362\001V\021\306al\020\205\237\013\271\210SKz\261\355\306\ +\261\3013\220\214B\221\366\234\304\\\245\373*\021w\302\351\020\016\245\274\ +\016\234\263W\230S0\214E\223\036B\200\227\334\243R\367\310)i-7\270\225\011\ +\3510kn fI\303\324\315Rd0\363\017\246\006\017\351\205\251\2621Zfu\212X\212QW\ +\301\323/8\257XK\320\037\314q\234\035\0332\321\307a\340ZHpN\260\030\227\221\ +\221z\306\013\260\334\226\342\013\266U\265\270\371\212\220\261\211\363\303\ +\3036qY,\207T\204\355\014\267\374\312\243\202_2\321\322\337\246\3301\341\360\ +\00175l\2402\201\345\274CX\362\022\013C\2734W({\245\014\204\025\325\350s\234\ +\250\215\264y\031\336\374\334\264\331\017f\230\311\334\3764\333\007\275&A\ +\245\251\003!E\315\302kp0,\352M\272iY\032\037\315\004\366\354<\264\316Xv\032\ +)E\374\035\014\235\214\350V\347\333\307\215_pxP\012\203\255N\266b\252\021,Q\ +\330/\315\262j\250\354\324`\267\014\331\370\227\240\256\205\022\206\356\234\ +\374\022\201\312\220\336\264\345\240\310.n\353\332p\200|\202\215\013\207x\ +\267\341(\206)\001\251;\236;\364\337\351n\312\272\315h\225\265Y/\033e\323\ +\354o \232\356\203j3\306l\002\303\\\340O\356\037~\300`{@\250\334q\223\273%B\ +\\\016\276\255AE[#P\323v\337\275\330\'{\001\005=G\365o\305\001\265\346\301\ +\254\207\005\342\350)\332\2335\310(\231TYb\\\227\021\004<\207\216i\277\3102\ +\316\'p\\\236Z\225\036gbO\317\331\373\257I\265\341\020\254\032\303"\224\2325\ +D&\3317O\260\011\335\304\377\337"b,3\214R\225\201\271\362\265\357\005\3654\ +\253\374\367\337\314n6\314v\274\216}Fy\332\2006pIv\233E"\247$\3653\010I3\222\ +>\267\204\035\2048\314\306\361\034J\315=a\247\363E\314\257B{ibJ>\371\011\363\ +M\275Y\37524\244\216S^\013\246\345-w\207\321\271\350\347\210\177RV\215\226\ +\3145\033\032\334\036\215~\017\217G\262\302\036\335\202\303\256\245s\356\216\ +\223\020mMq\344I\304\350,\2679\374\015S\023E@\372\265\357\0055\362\002K\275\ +\250\236x{\326`\377\356+\016k\2661\337\\\306\305\230#K\370\023I\2252\372\363\ +`\364k`\003\006[O\224\350|\010\233E\354\34096\021\2012t\3346b\365\267\240\ +\242\217\231\002\353\370\275P\314/I(\261q#\314?\343H\367\224,D\035\014\270\ +\301\302\226\177{\004\230u\263\326\036\264F\226m\230_7\1770u\330\341Al8\234\ +\357\234\347\320m\031\353l\037Lo\021\221\350X\212\005\231z\261=\361\002\2730\ +\277\320}\264\350u\012aE\301\2348\347\276_b.\276\320\340\347(\367R\303,B\317\ +\011\2629\207\310Y\206R\375\233\264\340a\334{\312\321\303\3450\214:\004\371%\ +;\333N\251y\216\303\\\264_RK\256+\0265\034j\326\001\012RTMg\275\206\275\001\ +\033\204\241=\272}\325&\305\011>\201\037\226GJK\207M9g\364\276Z\227^q\342\ +\324\005\2307\362\325z1\355BPC\277(\205#\362\033S\'\031BsF\236\233\332j\313\ +\276J\015v\317\231\346\235\243\375/E\267Q\364\222=\226\224N\211\005\011\274+\ +$M\233\331,l\335\025\246\346\313\301\276\220\202\244U\353)9|+\306]!\012?\341\ +"\267q\007\227{\366J\026,?\024D\004\352\270Q\335\025p\316\204\023\303\222\ +\310\367\2578u,\'\230\235\361FC\321\267\213\333\203\311\300\321\033\356c$"\ +\232z\221\371\337\345\033,J\241t\275a7I\021\347k\246\010\334%2\270\214\023\ +\316V\230A\264\344\3261\362\316?\324K\3668XLg\321\211F\011Cj\337\374\214\357\ +\217q\264{\030I\344\030*Lb\241b[\327\3231}\241\263\255"(\342\342\020\264\224\ +\273\036U\334\271(\347.\225\327l>8%\377T\275\234&O\322\334\360\230}\221r\334\ +\327d`/\330Dh\330\363\266\265D)v\375\232\301\222\265~q*}>\001\001@\331\320\ +\206\275\274\'8\367<\356:]\221\251\275\335(\275\346\344\227\034D\005\322\316\ +\015w,k\210\010%\030\340o3aP\377\235hC\2373\244\2771\365\010\373\373}y\320\ +\015\336\306\375K\007\354\315\370\012\377\233\222=\266@\\\265`\'\245Fw\031\ +\211,\0054t\010Ni\217\270\247\241>fX\334k\260\3727\240\220\210u|I\333\272\ +\342\376\035\366\301v\330\022\\\374\210\2252\303\336\345\011\313d\2725q\316\ +\271-\252\267\272\021\3479\247\003-YOJ\271$\373\214\006\222\355\264\363\216\ +\205\204S\326Kt\203\260\247`\037\216\201\177\015\261C\225\356f{\033y\3659|\ +\324\247\007\031\201\215\225\230Q\234\252\024\030\36791[M\222t\373\326%\272\ +\266K\002\340.n\225\347\270\011\3720ll\222\311\306,\012\005\014\310\346\227\ +\310k/\346z5\206bY\352\361\234\224\254\031f\350\177\206\013\233q\350\322Y\ +\244.|abw\207\361~\262\203\251\014\004Y\202\010\230\241\376\265bU\303\305@\ +\212\223Q&q3\313\206.\273%|3\204\300\032\242\255\022\274\035\363\366m\334\ +\003\246\307\020o\301\270+\'{\360-\341\241\212-\243z\243\317\260\263\366\001\ +\377\257\346"(#\342n\271\321I\023\023\336\023dw\317\270\251K\316\362\237\356\ +t\251\344\2219\037\231\241\246\317X\233\322\255)D\317\236\220KY\232\337iyo\ +\231G\224\030\320k@\225\2716\377\201\233\272\361\313\341\204m^5B\3473\032\ +\035\010\254 W\336\306\341\233!\373w8\364\025Q\314\006A\335\340\001\201\3041\ +V\267\314\3552h\3371"\271\012\032X_\030\351\306\234\242\004\261K\356F\000\ +\220\022\366\241\367H\0030\331\007\322\237\224V\362\331\013u\007\335P\312lm\ +\361\376)[\033.\270\325\350\016\2661\323\273mhx\302d\253K\326(\016Q]\322t0\ +\216\222\331r#4\036wlU\336\307\341\024w\012\223\234\'\221EXF.M\027m\232a[\ +\346\036w\340rl\210_\240\372\034\332\330\247\274\304)\367\006-\270]z\013}~\ +\202\346V\311\001_`\260s\307\372@\312!6j\002t\231\265\344\204\2054~HZ\335\ +\007\210\177\214\300b\214V\206\031\307\257:6\371\315X\362\035r\234D\340S\330\ +8\366k\273\313\244%>\307\235\263F\344\247jX\031JO=\257_a\177\3114r\013]\\\ +\230\025#\261\212#$\023\342\347W\204z\265\034v\214\010n\304\333q\330\327e\ +\004\000\261\005\177\241\341\330\253\227\346\257h\352[\362\034\236\203\034b\ +\343\000\264\222Ag\017 v\002v\367g\306k\015\363\317\'H\337\177\361\002K\3742\ +<\202\235\332A\326\320p\313\354\226\225\313C`b\037\031\0278&f\012_\365IO\010\ +\374\330\032\177\217\210k\032\013Q\216\277)\302\220\304\361\257b\236\317\210\ +\022et\3576\356\243\321\343\236\244\025\267\275^PXa[\364\212\002|\003\361h\ +\215\350O\\x\002\373p\034\207%h<\370\206U\252)\242\251:b\367JtS\333sGK\3270\ +\274H8\254TD\376O\377\373\277\275(\367!2\021\351\015\3307)\261\226\320\265\ +\326R\313\'\334\320g\210\300\252c\331W\347\012\355b\234\267\343H`\010l\302\ +\242\177(\350OP_\271\213\363\351\206X~66$T\344Et\260L%\007wkU;\245\226M\271_\ +wH\323\253\270\225\304{`\023S\230\374\031\237i\010jmd%\356\3621\325lpP\355\ +\317I-Q\033\225`\314x\017\254\347\033\314E\030b\331\0159\235\261\361\342\232\ +z\0179d\350mho/\260\201\353%\271\024=nh\255IY\027\307h\335\200@\341\250m\023\ +l7|\251\002\353\301\003\326\234\212[\323M\037\221m\263\335\0339\3474\375g\ +\234\335\264\007\362\345\210\000\316v?\333\020`\314\300\357\332\316Aw \341\ +\315Q\2654x\024\027\3347\3131\311^\2009q\000\252\247%"\241\327\263\206f\247L\ +\202\247,$?\365:\364o\010#\345R\236c\253\247)F\223\214\315\337\270\253\211v\ +\0304t,\226\363_/\2703\357\2043\315\277A@}\022\325\303>\271cF{\016u\255\307a\ +\252\200\2417\254\021\006\206\351\250\206%\332\236\377\2771(\344\3327T\263\ +\202Y\021\2769C?\241\211\034~K\022\236V\277eI%\360\204\226]&\015\2339\265"\ +\371\206N\247F\361\364\'Sf\007\234Y\262\007\204N\267\342\031`\363\225\015=\ +\261.\275_\240OcT\337\347\234\240\243\015\377s\260y\236c\321\235rK\214\364A\ +\256)g\374\016\276\362\202\255\375a\262\202\345\221,\207\226\276a\003\3408;\ +\012\315Y\015\367\307\233\305\221\352\347,\245}C8\221Fv\204R\343D\277\006@\ +\013\3128\301uF\322\372\214:\272\313\344|\204\310\337b\257\221\331\377\267\ +\003\340\024\375\256\237\361\334\217\275V}\302\373\0178\027s\015\001\252\345\ +\234\304\0017\267\254\217\352\220\266\'Xl\212\322\355\242\367\333\022h\2529\ +\273X"\254W\304[z\334\202]Q\3329\032J\207d_\033>\314\206\277\255X .\260l\373\ +,\ +\232\205\303\310\367\005\355\336\031\314\304K\024u\005b\222<\361\212#\000-\ +\235A\330\260"\345@\007\035\323\220\261\303NHpK\352\235!\200\231F\240 \345\ +\302\236\262<\347\010*8\026\333>\300.+G\261\307\235\036&a\026\265\202{\226Y\ +\223nb}D\023(mR\322\304<\244q\265\017\006\217\352d\341\335\007[,\352X\3206\ +\316\270\037\201O\335B\364;\017\360\2661K\363S\352\263nV\376\022\017\251\210\ +\304re\253\356\0232\037\022\273\010\343\303-R\365\355\336\251\203\270\013DAM\ +[\2211\253\251\322\004[;\032\216\014)\021\323\005CT\220\021\026\262\325>\373\ +N\224\246g\260-d\271\025XE\272H\315xx\030\347\207\325\030U,\321\362\016"\350\ +\206D\273*\366I\367\350%\015GM\235r\324\221e\231-\343l\301)*\200c\016o\020]\ +\272\210\354\212\026\237\3501\012\017[\014K\350\260\360\236I\246\377\334fB$y\ +\217!\\r\361kL)\033\304\301\2003\214\334\036aS\001\335\314`\003]\035\260Rp\ +\211\205\226s\037\311%\005s\007\245\350#\306\033\304\026\237\260\367\316\220\ +\275\243G\336R\257\200\310\016Bs\226\356\255\275a\3550\241\211wH1d!\375\354\ +\305\3653\010\334C\312\275&\006\357\260ch\311V\340\032K\271\205c\276\211u\ +\311\002\205\257\033\324\024\247$\351\032N=\354`\360?\242\212\0206aq\360\314\ +\272\235\212\214\260\231d\202\230\210\216MH\213\322J\341\206\025\315\201\027\ +d\237`\224%\237_Ks.\226\370\022\206\336\267lH\014\215\015+v\212\352jY\262\ +\251\314\321z]2\341\362\251\177\2661\377\301\031!\260\320|\036\206uX\226J\ +\035\024S&\362\374\023E\367\217@\015\002\314|\353E%\201\306K\364W~c=\3469\ +\230c\011C\327s\204\027\016\342\272a\300\251\241\313\234\177\321\301n\027\ +\020\337N\354h\323\006\260\236\371\321\213\3523HJ;\210\327O1\222\301B\267\ +\012\2241\264\270\366\206\006\\\275\235\270\233\367\024\236\201\335\235@\333\ +~\'\327P\264l\302\226\376\000)\234\303\341h\314\327`\332\276NK>E@[\242\372\ +\235s\006\342\343\222\253x\300\375\331*\202\203\005k\325sb\027-\275T\3122\ +\327kh\330+l|gc\015\\=\355\014z\225p\272\240\213\333\335Xh\322\204\240d\330\ +\337\324\201\250b\3434\342\014\331\245\266\367%@%\306\334SK\033+\264\007\251\ +\344p\206\332/\320]\2201u6\305\022\265\312c\236\327\261\3160\212C\273\267\ +\243\230C\354e\251\253k\266>*N\221\000\304\0322\024\311P\273|`\364\303\264\ +\3145\3731t\356_\026\353&\011y\312\257\010\010\016\310J\354a\231\265\\\373\ +\332\254\252\251x\022\267\243\350\230\012\271\310\264j`\224\265#S\341\305\ +\337\341>\372\214\237d\233\014\231< !\207n\331\250\221x\315\3550,\2232-\324}\ +\242\005\316\275\336\337\307\274\270%\361\257`\277\\@\350j\232\362\016\323\\\ +4Y\272!\244>b\027]\012\003\340\314:\263\020\177\012\376F\272\245;-X5\014D\ +\237\374A\012acW\227\372\251\022\021\376\2325\362\017l\244I\231\372\244\221[\ +\250\333\021O\343\246?\015k\3505\315jJ\016\303\202\230\375\204y\206\3458-\ +\245T\016Y\267\322\207S\203\026\232?\350\333=f\367\212a\205g\201\370/}\260\ +\253i\030hi\210\335j\233\325\030\025$\303\36183\204\277Kv\347\236\203\244|\ +\211/\341\313V\010k&a\'\3718\021\335)j\021#>\372\224]t\2758+\ +\252\303\232hh\312;Nvmc\\\257\333\200j+\343\234e\240\234\261\331%\222\262\ +\363-\267"gl]\260\242\222\203\027_\363\324\011\247\222\037\001\317\2320\316\ +\377\026k\324)\206f\314\342\310\2159/\265\2457T\232A\217\333/\335\360\371\ +\353\242\034qc\201O\321\247\325q\334\202\341>|\202\301^\262(\223r\347\321El\ +\326J\240]=\300M\033NL\027\255h\330\324h\3318\326\221\0161f\201m\013w\357\ +\260\201C\267\342\3168"\327\262j\344\310-Y\005\033\2262s\313\240\316\0259\ +\304\216\263q\266\335\211=\004\232\347\034n6"\366\231\342\262\012$\037-\347e\ +\326L\255;\\\364\204Krk\366\265\340\221R\337J\014\225\324\215\247V\261M94\ +\255\3179\334F\275k\037\3279\340\376!\253\210\321M9\355\'4x\315\201\351\015\ +\211\242\204\235\356U\313\207\034F\036\266\356l\030@\017\230\303N\230~\353\ +\256G\006q\276zZ\010,\373\177m.\007W' )) def getBackgroundBitmap(): return wxBitmapFromXPMData(getBackgroundData()) @@ -973,277 +962,278 @@ def getBackgroundImage(): #---------------------------------------------------------------------- def getTestStarData(): return cPickle.loads(zlib.decompress( -'x\332\355\233gW\0359\227\250\277\317\257(Z\207(\020U\'U\025i\311Dc\014\002\ -\023,\3541P\351\020\014\210`r\370\355W\007I[\233u\327\314}\333\356\227\361]c\ -\323\237\236U\247\264\265\363\226\252\007\216\317\242\377X\357O\302@\377\027\ -\267\243\240\336\377\037\331z\177\020\374g\030EE\260\242N\253\027\300, U^\ -\024\261yH"\326\261LyV6,\023\350\2714\216^\030E\254\264\214;\326\351dq\030\ -\2760\202\336\027\333\367\325\200\025\205~\360\205\365\372\337\246\225\375m\ -\037z_\313\262!\304J\313&\321o\035\033y\265\256\221o\034XYd\355\316\013\033\ -\363\262\224\211\225e\012=\227\266\215\376\206\021+,\233@\277M\355o#\304r\ -\313\352\300*\275\256\371m\003\311\334\26627=\313\035k\241\367\025V\3466z_n\ -\337\027\243\3679\335\'\210u,K\221\376\234\236C\264Fi\3278Gk\244\355\362\205\ -\335 VYV\2415R\373\276\013\264Fd\331\017\304\022\313\356\320~C\313\256\020s\ -\3738\364\266\254B+\337\031\260\216\326\251\221%C\2624\354o/\021\313-+\221,u\ -\313:\210e\226\355#Y\334>\016\020s\373=\362\254p\373\370\016\362e \3631\222\ -\271\2642\337#\371\234\217\337"VXV \371\334\336\256\021s\317\345H>\367\334)b\ -no\'Hf\247\203e\244\347\310\372\325\012<\027\202\315\247\321\373\234\314[\ -\210\271\030\234Ak4-\373\202\364\322\260k\274\203\347"\275F\361\302\326=+#\ -\273\356,\332\257\323\375\264\212\326p\262,zV:\177\ -\331\204u\023Xw\033\236k\224u\273\356\006z\237\323\351\'\304\234}\347\320\ -\032\316\276\237\321\032m\273\306\032Z\243e\327\350A\357s\362=#\346\342r\007\ -\255\341\374y\0241\227\233\006\320\272\261]w\020X[3\343\367\273\360\333&\310\ -\262\207Xl\330_\375H\317Z\226\277\272\317}C\314\345\253\257Hfg\217\007$\237\ -\363\361\'\317*\267\217G\220\257Y%V\276\200\271\347\322\274j\347\246^\002K\ -\200I\317\212\3202\005,."\313\004b\015\313(b-\3138bm\313\010b\251e5`m\235\ -\353\014\353E\254\260\254\0171\'\363\220g\245\223y\022X\253lX{\214 \326\264l\ -\034\261\304\2621\346u\357\342m\312\263\322\305\376\260g\225\213\243\011\307\ -\252V\225Z\335G\300B\355\273\206\325\035+\213\252ikh\003X\014\254\011\254Q\ -\325-k9VTUh\373\2156\260\274\254,\213\201\265\313"n\232z\011\254\256kw\313\ -\324K\307\362J\327\370\266\251\227\3002\335[\304\246^\002k\225m\313n\200\325\ -\313f\234\232z\351XV\352\376\312\260\013`I\031\306\231\251\227\300ZE\025\033\ -\335\337\001\323\266L\032\246^\002\323\271312\037:\226\352\274\221\030\231\ -\317\200\345E\236$\246^\002K\21241\276q\011\254]\304\211\311\273%\260f\321NM\ -/\325\001\373f\340\367\373\336\346m\027\253\007\2109\1779\362,\206z\211\230\ -\253G\307\210\271\234x\217\230\313W\267\210\271|P \346\326\275\366,q\2713\ -\267L\\d\247\373&\205\235Z4\233]|G\370\304\377:uR/\243hpYq\0051\027\015\323(\ -B\234\204[(B\334Nf\274V\25344\232\376\002,\252\332\241\361\336w\314g\336Fh\200\274\ -\322\371\313 b\256r\355"\346|h\017y\257\215\220\277\372\021k\271\212\211\230\ -\353L\276"\346\336\367\200\374\331E\334\223g\271c\217\310\237\235|\201\364\ -\376\354\236c\2109\177\226\210\271\214\240<\253\\T\013`U\345\342\203\002kU\ -\261\365{.a\012\323U\3050"}E\017\255\337\327\034+u\232\265~\337\013\254^\246\ -\326\357\373\034+R\335\325\030?\030\002\026\352\016\313\370\375\244cy\254\ -\253\236\311\320#\0222\271\356B\214}\307\2015u7e\374~L\372\314\333\014M.\231\ -\002V/"\353\367\303\216%I^Z6\341X\254;\367\310\3547\002\326\316\3336\026\352\ -\216\265\213\274nc\241\001\254\221U\326\357\233\216\265\322,\213\214\016Z\ -\300\302,\216\314~\333\2165\263\254\031\231X\215\201\265\263\260n\336\227H\\\ -\031\354\204\211\366\326\262\261\020\202-\013\350j\316\275\037\304\3167ny\017>\231\352\3705\371\ -\352V\372\256\241m\375\264\220\276\033p\371\371\032|\262\202\374\234\003k\ -\345\205\315\317\247\340\223\272\271\260>y\002\254\2367\255O.\203O\246:\265\ -\233\375\256\000\013\263\322\372\3514\370d[\373\251\331\357\026\370_\231\265\ -\255\237\316\000K\262z\335\326K\351\353Lb;\230w\022\345\347\304\354m\035\371\ -di}r\026\371\232\313C\363\2109?]\360,s\376\367\336\263\334\371\320\007\344\ -\177\356\267K\310\327`\302D~\345&\326U/_\225Y\277Z\004\326\200^`S\372\251\ -\335\365\002\333\300\352zY[/QN,\254\257}\002\026\351\251\311\344\2039\224\ -\377\352\326\257>\203\277T\220\353\326\244\357P\023\353W=\240\347B\327}\223\ -\353\236Q\216p\271n\007|(\323\316k\3666\012,\202\\7\000>\224@\335\037\004\ -\177\251\240\356\357J\\\367\315\336\366$\256\373\261\251\227\322\327\375$JM\ -\275\224\276\3567m\335\377\0122\307\332\207L\276\177\000\326\202\316\370\311\ -\333HO\362F/\217\210\271\3168P\336\207\\7\312\345\247\373\272\255\265C\216\225\245\ -\256\361\206M\002kA\016\033qL\207\233\353;\307\035\313\033\272\2374z\036S>\ -\0175l\036\232r,\351@\036\032\006\326\206<4\241p\036\262\365\022X3o\271z\351\ -X;\207<\324\000V\367\365\322\261\226vTW/\035kv|\275\004\231S=I\031\026+\234\ -\207\214_%\312\373F\323\372F\212\230;\031\010\221o8\033\235#[:v\003,\001\273\ -U\012\327\036\243\203\013\345O\277\\\355\371\001,\204\332s\007v\213u\2160:\ -\270\002\026j_3\354\020l\031\353\032j\362\363\031\330\262\333\023\032[f\300\ -\332\3207]*\3347\031\275\224\012\347\022\023[\035\345s\266\313\033\373\312\ -\347\215\312\332\374@\341\274a\330\021\330<\324\265\307\354\355;\330\267\235\ -\207\226\035\203}+\227#\372\357a\335\012&\352[\205\247g\363\\\241\360\364l\ -\366v\215l\351\372\234\034\305\257\353iN\201\325!\217\237(t2jm\264\014\254\ -\0166ZQ\276\217u9{\032\354\221\351>\326\260-\345O3\\\037;\243\374\311\205\ -\233\351\276(?\277\271\376\340\035\260\260\210m\036_W>\'\272\270\234\005=\ -\227yj\343m\376Ul\231|\260\000\277\315\212\334\236f\274W\276V\024V\317\037\ -\220\376\\M^B\314\235j}D:\205\023Y\345k\243\233\027\026\025\236\015\214N7A\ -\177\372}V\247\333(7\305V\177\033\012\317\304FW\237@\177\005\364\\s\300\232\ -\320s}\006\375\025Z\247\266^\002kh\235\032\037\357Azq\263\301\263\362\375sh\ -\365\274\243p\275\264\'\262\310\357\335\234<\000\366Ha6\030\004{\304\332\357\ -M\374\356b\335\307F\276=\224\303\262\2704\365\322\353^\247\304\334\324K\304\ -\\\315\373\252\360\271\205\235/A\367\005\324\217\'\345O\000\335\254\366\010\ -\366\250\300\036\201\360g\024\316\036L\370\023;\227s\244\360\247s\316\036J\ -\370^\245\260\272\027\300\332EjuO\205\217swF\301\205\257\361\256\007&\216%%\ -\324\236\032\260&\324\236^\307\342\006\324\231>\307\332\031\324\231!\341\317\ -FJ\253\373I\201\362\213\215\217\021\341\365\354N\221\307\201\345\225\253\037\ -c\302\327}\327;N\011<\223\330z)|\316\211m\255\230\020\336F\015\0333\221\3606\ -\212\254\215\352\002\327x[/\301\036\035\250\347M\341\353\202\233\247[\302\ -\327\005\227\207\332\300\022\250\0131\260\020\316\226\022\341\363\220\233SR\ -\201\373\003\0233!\260\260\010\255\215\316\301F1\364\2307\302\317\323._U\300\ -b\3501/\004\3561\315~\177 YJ{r{\'\274\337\2733\236+\304b\313\016\221\356]M>\ -\023\276ow\361\221\011\237\257\234\356/A\247\011\344\366\022X\004:\355\200\ -\376\272\227\340F\247\373\302\317\203N\247\007\260\217\014\362\375\021\260:\ -\344\246\357\002\347&{\203)PM\266\354\036\364\\\207\372{+|\036\212\255\236\ -\013`\021\314\203\327h\335\216\325i\376*>\314>N\261?[\235\236x\277\257\\\377\ -\274,|\037\353||E\370y\332\3654\323\002\3674\266^"\235\272|?#|\275\214\254N\ -\277\010\337\263\272|\377N\340|oo0\205\317\261.\267\317\012\177\336YY?\235\ -\027~\236vy|A\370\033\201\272\275Mx/\374\331\222\323\325\007\341\347x\247\ -\253%\341{\302\334\325K`qU\330\233\234U\244S\327;.\002k\372\371R\3709\300\ -\235el\013\334O\032[n\000k@n\377\364\312wM>\230\023\370\\\331\310\374\031\ -\351\317\365\204k\257\362\263\321_\317\253\374l\353\245\367g\320\325\016\260\ -V\031\306f\335Q\341\317\023\235\016\006@\346\010\316\314\007\3017r8;\334\005\ -\326\324=\227\361\241=\330[\345\362\337_\375h\277\272F\231z\371*V\215,_\275|\ -pf\376 |\177\345j\317\023\316k\226=\202\277\204\220\303\002\012\372+\033V\ -\007\014X\\FV\007\222\372<\344t\240\250\277_\310\355M\273\240\376~\301\315\ -\013\324\2612\2018\342\024\367\242\206\021\212g:{\203I\261}\355\015&\365\366\ -u\271\275\217\3423P\343\223C\024\337\230\2315&\201\245zof\277#\324\237\015\ -\273/B\306\021s\365m\214\37237W\313\246\250\357\237]\2771L}o\341\316A&`\335\ -\034\372\272\350\325>\214O\326)\316\211f\335\006\332G\323\356\243I}\317\237X\ -\231[H\367\211\275UoS\177v\030Y{\304\024\237g\333\363X\212\373S\023[)\365w6\ -\205\365\265\020\344KA\317\347\216\3059\314\3167~\277\020[\025\222\305}mp\ -\001,\202\330\377A\361y\223\221\357\216\342\363v\363\276+\212\347F\243\347C\ -\212\317\233\214\314g\336\346\320\303e\260\217\016\324\375K\344CnF,)>\0030\ -\362u\250\317\033\241\335\333>\365\347f\015{\033}@\361Ll\374\345\210\342\363\ -\015;_R\177\226\346\354qL\375\014\341z\326{\212\317m\215\215n\251\237\223+\ -\313\212Wv3\276vMq\037k\364\222St\276fs\304)\305\367ev\276\244\376\216\300\ -\235\233-\277\312\021F\367+\324\317)\256\316L\303\336*\335\363\2335\266\020k\ -\330\333\367\031\352o\332]\276\377\202|\322\345\373w\024\337\247\230\275\255\ -S_\337\\\0172K\321=\211\335\333<\305}\266\235/)\276\3770\366x\017\254\005\ -\363\376\007\307Z\035]\320\215\315\227(\272A\2675\364\243\367\335*\264{[\245\ -\376\014\336\331r\221\342\376\300\350j\023\336\327\001\273mS|/d\277\370\241\ -\276\317q\371\357\023\305\347\033\366\213\037\352\347i\267\267\317~op\336\ -\271F\375Y\206;G\357\241\376\374\312\335\367<\243u\335\354\267\203|\274\264\ -\373\035\205\275%`\267\001`-\360\323Ad#\027\203\273\324\367\324n\016\335\243\ -\370L\246i\352%\354\243\331\275\2575\365\022\336W\352Y\310\350\345+\310\327(\ -\013+\337\003\305\275\255\221\345\211\372\272\352|\350\221\342\031\302\344\ -\253\200\373\376\324\335W0\356\357\034\334\235\260\344\276\207\313c\343\177\ -\212\373\2768M\354\027\262\334\367\223\231\373B\226\373\371\3101\316q\3750~@\ -8:\333\264>^\343\370\254\312\330\262\027\344\313\340,\262\017X\023d\036r\254\ -Y\301=\311$\307\367yF\007#\034\337m\033\035\214\003k\245\235\272\371\355\030\ -\367\347\002\211=\247\231\342>\316\023\373E\3150\367q\344t?\201~\353f\265\ -\010\366[\201\277\3249\344\277\262e\277\274i\000k\002kr\177\247\351\356\367[\ -\034\373\270\321A\033X\275{\316o\352%\307\367G\306_\022\244\227\206\275\347L\ -\271\277\347tw\376!\260&\350\345\034X\224\026u\363\333\033\356{\270\330~ySq\ -\324\023\306v\276\344\370,\315\350\345\007\367gi\316\'\357\270\377\252\250au\ -p\305\361WE\366\213\037`\021\364\026g`\217J\377\326~\361\003z\311\301\207.9\ -\276\3775\317\225\260\267\002\276\205\350p|\327f\317c9\276\023\266\367\227HW\ -e\335\344\227#\244\253\274a\277\370q\254Q\245i\303\236\307r\177f\336\266g\ -\252\367\334\327\267\246\375J\351\226\243\373P\253\323\202\243Zk\3315\370Z\ -\016\275@\316q\357c\317c9\376\346\304\326K\216\373!{\036\213|\262nu\277\002,\ -\324\314\316\227>\316\241\367\336\342\276g\015m]\235\341\370>\312\326K\216\ -\357\243\354\375%\212\325z\335\310\267\376*V\215-g\201\205\251vhS/A\317e\232\ -4\214|\013\300\262\264\3250:}\017,I\033M{\177\311\375\274\337H\214\237.q4\ -\317X=\177D:uuk\225\373\363\027wF\266\010:mA\355\336D\372\213\254\376\266_1{\ -\036\313}\357\323\261u\372\023\367u\265\262\265l\016\307\264\365\323\317\257\ -b\332\326K\344\247\225\215\351\036\356\277\355)\352v\276\004\275t\264\237\ -\032\335\357\000+\322\270a\347K`\251\326\251\235/\201\305Z\247F\007\203\300\ -\232i\330\264\347\261\334\327\320\272\375\216b\217\243\276\311\350\371\257~\ -\320_\325\235+L\275\344\370\014\336\330\343+\367\367\246\256\376> \235\206V\ -\317O\334\337\305t\254\237>r\337\377\225\266\346\005\304\347v\335\300\230z\ -\351X\263\001\337AI\342\375\317\305\271"\336\377\\\234\013`\271\326\237\321=\ -%^\177\315\206\321=\007\326N\353M\263\017\002\254\221t\232\3067j\300\242\244\ -j\032Yz\035K\243"J\355y,\361\347\216\225\215\337!\342}\322\351j\222\370\036\ -\323\235U\215\020?\223t\254O\216\023?\327VV\177c\210\225\226M\021\337se\366\ -\313\315a\342\347\306\324\326\325\011\202c\325\254\021\021\024\227\015\373\ -\205,\260V\0325\355\367>\257\364bt\332\004\026&e\323\316\227\216\325\313$o\ -\331/d\011:gH\215,1\361\337~T\251\221%!\276\377\203/d\211\277\377(,\013\035k\ -\'p\356}Np\317j\374\357\206x\377s\272\252\210\357\221\012\313.\210\357\303\ -\022{\277\372\203\3703\363\330\326\212;\342\343\255\3364{\273\002V\327\276a\ -\236;Dz)\232\306\327\316\220^2\253\227\014X\256[\037#\363%\2604\321[1\365\ -\222\370s\27525\254C\374yvf\365\262\017:\210\262\312\326\337\003\342g\022w\ -\357|D\374wZ\256N\177\'\350\334\326\352\345\230\370\2318\267\354\236\370\376\ -\264e\277S\270%\376\314\274e\363x\201b\246\2641s\015{\353\350\007\355\367>\ -\300\212$m\031_;\005\226%q\313\254{\002,\321z1\271x\031X;i\266\214\357\256\ -\020\177\237RX]M\243\230Illm\201\016Z\320\333\316\000\213|\275$\350\373S[W\ -\337\0214\'\333Z\261N|\317\325\264\337\245\315\022\177\236\350r\304<\3615/L\ -\355|\371j\277f\215\367h\277\255\226\321\363\007\274\337\266\375\336\007X3\ -\251\267\315\373>"\177)R\373},\361\263_\236\032\033-"\373\266\255}7\211\377\ -\376\300\365\367\333\004\367kf\277\033H\007\261\275S\372D\320|dg\2539\330o=\ -\357\3308\377\354s\247ff\2155\330GK\267\021\246\226\365\000k\350\275\031\037\ -\177\006\026%a\333\310\274\343X\324\211\335\035\356(\361=C\236\331\377\243\ -\004\344\3236\262\365|\020\366\226\3027^\273\304\367\242\221\355\207\366\210\ -\357\005Z\356\376\022\261f\\\232zI\320\274e\375\357+\312uej\317c\375>\342N\ -\333\350\340\351\325>\314s\217\300\364\360lg\323\240\346\317\240t#f\352e\315\ -\353>\262\272\2275\350K\240\207S5\337\327U\226\211\232\277\'\251\333\372K\ -\021kX\306_1\243+R\363\361VZ\277\252\325|_\234\247&.{\035\323\343\233\233\ -\261\373\200\345qf{\275\241\232\357\353\222\314~\357S\363\375Ahe\031\251\241\ -\236\337\316G\343\350\271\310\316\316c5?\237G\2666Na\3712;_\326\274\277dV\ -\247\023 \237\216|\033\037\321+\371L>\255\3735\362*\261\365\022\261\216e\315\ -Wv3\254U\363\337\031\305\366}mXWO\246\261=S\370\315\377\375\021\362\217\220\ -\177\204\374#\344\037!\377\010\371G\310\377\365B\262@\006\352\367\026R\0044\ -\340ZH\362;\013Y\013z\203\276`\350w\027r\362E\310\221\337Y\310q+\344\330\357\ -+\344T0l\315=\021D\277\253\220\365\240a\205l\006\255\337U\310v\020\007\211\ -\216\356T\013\031\376\236B\236\0077A\025\\\004?\202\273\340J\013y\370;\012y\ -\026d\301eP\006\235`?8\010\216\202\357\277\243\220\307\301}p\033\024\301u\ -\220\007\247\301I\260\374;\012\271\002\0369\035l\0053\301\227\337O\310w\301\ -\372\213\261g_X\320B\276\377\335\204\374\240\365h\322\317R\360Q\033{5X\ -\0146\1777!\267\265\036Md7\265\2617\202O\301\\\360\371w\023rM\373cW\217\335\ -\240\351\011\236\203\235`4\030\010\006\377!!\377\372\'D\334\015\366t\\w\264\ -\036\373\203o:h\276j=>\004O\301\343?\360\356\277\376EM\262\356?\251\377\024\ -\023\372\2172\316\010\253\261^\326\307\206\330$\033a\343\254k\352n\\\033\177\ -\034c\243\301\024\033f\023,bu\326`M\326bm\026\263\204\245,d\347\354\206U\354\ -\202\375`w\354\212\035\2623\226\261KV\262_2w\207\355\277\374\035\260#\366\ -\235\035\263{v\313\012v\315rv\312NX\343\305\033\371\213\251\273I|\231\255\ -\260\271`\232=\005[l\206}a\357\330:\233e\363l\201\275g\037\330\022\373\310V\ -\331"\333d\333l\203}bs\3543[c=\354\231\355\260_2\367(\033\260\177\367l\220\ -\355j\001\367X?\373\306\276\262\007-\342\355\213\210\327\301\023\353\232z#x\ -\324\023\004\223R*)$\225\\\022Y\223\275\262O\016\311I9"\307\345\230\234\222\ -\303rBF\262.\033\262)[\262-c\231\310T\376\222\271C\031\312s\375W\260\033\271\ -\2475X\311\256\200\'\354B\376\220\223:7vE\334\327\331q+\270\223\217l\214]\ -\311Cy&3y)K\331\221\373\362@\316\263#\371]\036\313{y+\013y-sy*O\344\262\\\ -\221\323rK\316\310/\362\235\374\345\300Y\227\353\262\322\177\271\326\337\254\ -\234\227\',\323y\361RG\364\202\374\241\015\375\304\256\202\367\362DG\365\007\ -\271$\273!\363Q\256\312E\271)\267\345\206\374\244\3658\247\365\370Y\256\311\ -\036\371,w\344\250\034\220\203rW\356\311~\371M~\225\017\362\277\017\234\1771\ -\272\237\344\243\026.PL=\260\373\027\001{\265\231\245\352\004J\345/1\355D\ -\024\212*\256\210\252\251^\325\247\206\324\244\032Q\013\354\273\034W]=\216\ -\251)5\254&T\244\352\252\241\232\252\245\332*V\377Dt\277\374KT\252b\335\214\ -\205\352Vk\260\324Y\261\253\303}\035\321\007Z\304;\371\034t\003F()\207\331\ -\271\272Q\225\272P?\324\235\272R\207\352Le\352R\225\252Gv\324\276:P\003\362H\ -}W\307\352^\335\252B\375\243\311\374Z]\253\\]h\023K5\253\375\360N\307\363\ -\225N:G:3\256Z-J\355\215\347\352R\236\252\023\265\254jrEM\253-5\243>\260/\ -\352\235ZW\327rX\315j=\316k=.\250\367\352\337Pq>\250%-\336G5\004\002v\315\ -\274\314\272\341\342D\314\344\014[U\233rQmjSo\253\015\365I\315\251\317jM\365\ -\250g\265\243F\325\200\332`\203jW\355\251\177S\305\351W\337\264\0176\265\027\ -v\005\354\321)gU\233yQ\027\301\207\200\252a\226\311\257jU=\250\'\365\250E\ -\014t\356\227"SJ\010A\005\027D\324\304\251\354\025}bHL\212\177\266\342\274\ -\3727"\306\305\226n\306N\264\200\317\272\000vu8&\016\345S\240\264\241\247\ -\304\260\230\020\221\250\213\003\331\020M\321\022m\021\213%\226\210T\204\342\ -\\\334\210J\\\210\037bW\375\233\033\214;q%\226\331\252\356tvt\215\356\352\ -\260k\346\217:yO\211Cq&21\364\0220\227\242\024\035\261/\016\304\221\370.\216\ -\305\276\272\027\267\242\020\327"\027\177\257\301\370\251.\350T\234\212\235\ -\240\253\301\007]\243O\2643f:/.\213J\207K\246\265\270"\246E\237\334\0223\342\ -\213x\'\306\345\2726\365\254\230\027\263jA\274\027\037\304\337\355\202~\262U\ -[\022\037\305\264\256~\'b\230m1\242V\305\242\330\024\333bCl\252\256\241?\211\ --5\'t\300h\021\327D\217\350F\365\215x\026;\342\357\256\364K\255\332\250\030\ -\325\032\354\0128\303\272:\334\224\221\030\020\203bW\354\211~\361\355E\213\ -\237\305W\361\221=\210\'1,\037E@\031\375\367\265j\377\305?I\025\275\324F\376\ -\302\270\024tC<*J9\335\326\375\334\234\234Q\204\326h\251z\351\272\012E\037\ -\035\225Ct\222\376\314*\277\334\231\217\320J\215SA31FkrRM\213)\272\300\206i[\ -\207\313\004]\223\021\035\323"\356\310:m\320g\361sk\374\242\220M\332\242m\ -\255\301}9\250\023N\254ux\250\253KB3\225\322\203\027_\\e\241\010\351\2758\ -\2477\364gW\371E!+zA\037\325\017z 9\235gwtC]\321\216\016\226CzF\217D\217\\e\ -\031\275\324\206>\247%\355\374O\011\271O\017\350\021\375\256\005\274\024\307\ -tN\336\323[Z\320\317\342\232&\242G\345\364Z\236\213QyJ#uB\227\351\012\375\ -\037\020r\232n\321=1C\017u#6\'\277\320wt\\\353p\211\255S*\306\324,\235\025\ -\272%\223\333l\236.\320\367\364\003]\372\005!\177:\005}\244\375b\225~\023WtQ\ -{\341\276\330\244\367r\233n\320\036\305u\001\374Dk\272\004\016\350\376{\216~\ -\246k\264\207>\377\244\220\177\375\212\220;t\230~\227\243t\200\356\213K\335\ -\320\226\352V\367\335\353j\220\022\235\025\353tB\355\322=\332\'\372\351\261\ -\232\326\223\314\267_\020\362\247\315\375U\213\367@7\351\2046\361\023}\244=\ -\272\353>\026\031\015\351\274\230\220\001/\351\205X\326\243\326\236d\274\245\ -\276I\311\025\177c\237\024\234r\316\317t.\\S\033tLk\360X\020\276\243G\203Q\ -\331\325a!\026h\215\257\310^\336\307\207\370$\037\341\343|\354\255\205\234\ -\342\343r\230k\017\224\023\\7\0174\342\373Z\300\003\335u\327y\203\017\352I\ -\260\311\217U\213\267y\314\023\236\362\220\237\363\233\267\026\262\342=\352\ -\342E\274L\307q\037\315\345\201\372\301\007\344\035\277\342\207\374L\3530\ -\343\214_\362\222w\370>?\340G\374;?\346\367\374\015\205\274\345\005\017ugs\ -\315s\256gh~#N\370.\235\247\313|\345E\214i\276\305g\264\231\277\360w|\235?\ -\263Y>\317\027\370{\376\341-\205\\\342\037\371*\257\011\035\303\332\003o\305\ -"?\321s\364&\337\006!6\370\'>\307?\3635\336\303\237\371\016\037\345\003|\220\ -\357\3627\314\223{\274\237\177\343\333\354+_\344\363t\203\325\265\017>\360\ -\247W"<\362\2000"\211"\202P\302\011!5\322K\3360\005\365\221!2I\012\261\301\ -\346\350\262\334\225#d\234\214\375_\002L\221a2A\026xD\352\244A\232\244E\332$\ -&od\356\204\244\244+\\H\316IC\256\310\033R\375\027K_\220\037\344\216\014\362\ -+rH\316HF.I\371VBv\264h\373\344\200\254\321\214\037\221\357\344\370\277Y\370\ -\236\334\222\202\\\223\234\234\222\023\262LV\336J\310irDz\350\026\351\3433\ -\344\013y\367\377Xv\235\314\222y\262@\336\223\017d\211|$\253\344M\204\\$\233\ -d\210o\2235\266A>\375KK\316\221\317d\215\364\220g\262CF\311\033D\367\000\031\ - s|\220\354\222=\322\377//\370\215|%\017\344\211<\222\240\366\006\321\315j\ -\262\246j\242\246K\363\337Z\216\324j\265\336Z_m\250\366\006\346\236\254\215\ -\324\306kc\265\277\357&S\265\341\332D-z\013!\353\265\206\376\373\311\321\255\ -\326\252\265ko\0228\277\366\257\365\377\203\220o~8\360G\310?B\376\021\362\ -\217\220\177\204\374-\204d\377\007\333r\242}' )) +'x\332\355Z\327R$\275\222\276\337\247(\246\032\006\020\210\352\352\3522\270P\ +\271f\260\302# \360\336\0123x\363\354\253\256\314\024\261\261\261g\317?\363\ +\037\016\033;\303\\e\250K\231\251\374\2764R\367\371U\375?\026\276\307\236c\ +\376Ga\335\361\277\377\307\316\302\367\023\345\3549n\253U\344\236W\011\016\ +\334\266 \315\362<\212+\301j%\010\362\264YO+\301\276\260\202\274\022,\353\ +\266 \367\213\206\227T\202\311J\320\312\2132\314*\301\220\254\004Y\031\240\ +\340\241\372F\022\231M\302J\340V\2734\032q+\210*A\346\200bY\023\025\373Q}#\ +\015\362V\004\2734>~\002\202\024~R\317\313\020\024[\254~R6J\317\013*\301\033\ +~\324\010\340\243\367\225\371q\231\265\352 XcmA\226\027\236\007\326\316T\337\ +(B\343 \320\264\205\036\213K\374\206\002\007yI\326\000\301@e~\\\317\262z\275\ +\022l\240?J\037\315_\252vI[y\356\201\240\263\362G3M\263:\230\177L\346\'\270\ +\313"\234K\230G\021\030\327_}\243,\3124,*\301]\265K\341\025\011j\372X\375$\ +\211\363f\\\202O\245]\001\273\364q\364G\200\273\270\240iY\246(\030\202m\363\ +\274\304p\270\256\266\215\262,\256C\004]\010+hT\202+0.\311\023\017\024\253W\ +\273\224^\031\206\255J\360\202\333&>\356\262\006\202z\031z\360\321\216\312\ +\311I\2367=T\035b,-BT}\231\034T\3407\202\352\033E\243\364#\020lA\214\371\271\ +\237\340AU?)3\023A\260\313\236F\007%1\034\366\016\267\0028\227Qpa+Oc0n\034\ +\254mf\315:\204\3242\2710F=\226\024\354R6<\370\211W}#\214M44+\301,\354\022\ +\346\276\007\376h\240-IH\337\000M\343\262\031\202\371\035\270"\257\343\212\ +\251J\2178\311J\014\\\215\306\025\0154n\244\322#\213\362\026F\362\242\300\ +\010jE H\231]\001\326\276U\376(\233\026/-0\277\221{\011\010\032\325\212\320O\ +\313:\304\3301\232\037\266P\261C`\2078\365}\020\344\312\012\000\015q\365\321\ +\254\231g\021\370\203Uz\024\261\205\230\247\321\037\024\205K\325.q\303"\352R\ +X\001\036%\330R\267\210J>\004H\006\344B"\224Q \245\244$\210\335W\212\371-\ +\003\030\020\364\223O\243\010\266\275U\366\' p?V\200\036\253\260K\243\360\ +\221\203V\031\322V\214z\014)+\000x<\203\223S\003S\0204\340\'E\021D\340\217\ +\010\034\344[d\273\265\312\374"+\022\210\217NeW\000<\232\225\013\203V\032\ +\325\201\034\177B\340\026\026\246\215J\220\005E\023\217\241\223\242\220\210m\ +\266\3326o\026M\017\260?\016\3467,L\265@\325\223\030\004\333\202\3503\202]\ +\266\201.\274,@\274\\\203\307\312\221R\037\264o\261Q\025\004]\314\012 >8\325\3749b\356\021T\017\015\ +^@\365\301\352\240R/\257c\211\377\023\222V\323$`\210\323\022\\\350g\255\004\ +\216R\343Q\226\304cRa\333Dg;\205\011\247\364\020\373/\020c\365\250\025\202\ +\013\373\201r"\223\346`\333\016n\005`\376\263\302>*E\274\354P\201F\224\323\ +\005]c\220&u8\250g\310b\276I\236`\276\317\254\000\314\037e\330GE\010\217\032\ +\2465\223\221\341\243\033\344d\342\240\007\215\331\2030\327\353b\017\024b\ +\360\317U+\322\206\005\341T\265"\316\263<\001\201\203I\334\324A\260\355\016\ +\271\2208\350\001\262G\221\027\030t\275\340 \323\336b\005;\000\270\315lj\274\ +\222\330i\005\210\227\260:\312\272\311a\021\340%"\217\021K\215A\316\016\212\ +\000\263\330\242\266\002\330E\002\301fI\324\000\301\211Dr$\230.V\337\010[Y\ +\003K\332A \351\304\200\020\342t\205\332\267\020\333\267\013*X\211\307\352\ +\022;\255:M& \277x\271\207\371\345\224\262:\215*<\273\002c]A\256,-*\237 pMj\ +\304H\236\246\022\337\307\254\336\001>\365\223\334\007\305\216 y\372\006\225\ +\260\355-y\214"\371\247Dx\024XIOpl\254\012$\372A\210\365\226\205i\037\230_\ +\230\222\005v)\253\2374\3634Gv\330VV\200$M\005+\021\333&\314PR\213\354Me\005\ +\330\213\001\242\2228l\002\220\005uI)\346\250\031m\005\260K\277\213\031\250\ +\205QXhl\212\022\204\3070\303\351W\212\306m\010\273\002|*\204]\001\250\214\ +\311c\304t\034P\031ZT\316jl\233"\214 \0011\026&~\000\037\355dH\322!\002\310\ +\247.)E\027\326?V\200`\025\0027\267@~%\027\0229\216\273\310\037!"j\013\322Zd\ +q\373\306\220\351\010\267>\314P\3622@2x\246(\244\351\306\025\230_\032 \303G\ +\233\022\273$\032\376\011\205]R\200\326&\022[\236\006\252>\250\255\000\202n\ +\217\312\036"6)pP\225b\343\375@\376(\261k\260\270}\240J\211\250/\257\024k\326\323\030\021\365P\375$jY\334\ +\3064q\246\001\363\031T\027e\2224\300AS\324\361\021\261\005\022\033\232\020S\ +\001\203m\233\026\2461Q\037\241r\233:\234&\026\254\257\314\256\200\320\036\ +\240\216\217xl\300\305f\304\324,\220+\201\266\232q#\204sI9&\013\232\027v\003\ +)%\037\351\225cwB\003w\015\265e3)\261\266\334\000[\352\006\204\330\315\177\ +\010\000\225~e\\\230g>&\2551f\005\340\240.h\315cS\366\200@\223\307\210\330f\ +\030\246y\232\300\257*\314\036\036\252>\003\346{\026\246\2674\352\214p\266\ +\025\272\224\305\022\330\345\330\305\356\204&\212\207\260Kjp\013\306\275\220\ +O\211\330\\\211\323/\032\332\377\200\224\324\036\005\203b\245\264\002\210\ +\365-0?4 \204m\347\271\025\300\266\303P;$Q\202\304\246%&\013\232(2\200G\222\ +\004\0158\354a\216I+c\020<`V7u\020\026\2755\234me\011\ +\366\204V\220\342\255\006t\321\251Ee\207\304T\340#\324\305\207\000\276qA\267\ +\032D[Sd>Q\016#\343\012\232\'S\273B3\266\035\215\335\011\015\355S\272\366I0\ +\213\215\203b\201\305\234\253\254\000\373\006\215\245\002\015\335\\\010\272V\ +\326BM\217\340F\242n0\007\376\020\010\365\222hkT\323O\020b\357\330\277\304^\ +\010\'\227R\377\342\373\340\261\010J\353\320\034%\350q\014g\033\331)\334\223\ +\266\002\010\272~\340\261z\222\371\240\330\015\206vB\367Q\247\202V\340\335\ +\332;\303\013\231<\202X\337\2018\315,\346Z\344u\242\255\221\032\216\010\274\ +\030\004\373\324\235\024\011\370tR\020[\342\324\372\007Xk\352\371&\226\033\ +\234\266\305\373\31230\256nG\362\327\344Bb\251a\210\323\334^\224]*+\300F\223\ +\254\245\342\352\234a3B3\266K\215\275\007\015\334}\340\240fR\017\300\311\243\ +Tk\'X(vS\357\021\241\340\211\012#\342\240\234\341\030\212@\030j\354_\222\030\ +\350\263\217!\007\321(|\030\332\225\334N\276\33796\0224\371\236\006\202M\354\ +\344\373E\342d\202\340\361Hu21\314\002\307\276\241\205\201{\244\254\000\276\ +\361\003lI\3545X\252p\306\026\306\360\3211j\254\210a\346\031\266\011t/&\341\ +\364\375\334\307\323?\322v\005`n\315%\266\304\264\266\311i\027\234\366\204\ +\022S#\241\262\267\2064\036\247x/\006\3467l\026\253\177\254\300\001"U\32243\ +\350\201\313\203\304\336\213ypPyN\323\3001\215\267+4\350\316\024v\026)\326A\ +\273\224\242\211r\236\005N\361\003\274\300\014\251p\316\320\205k\016\021\033\ +\012N \244\2748\017@\320O\235\005M\320\326\311\311\304c\353\032G{\324\274;.B\ +,G\'\347\334\256\000\343\016$\366\03640\233S\230\370\350^l\335\305\253\370"\ +\001\301\276\266+\260\230\000\250{\246)\000\363_\253\237\324\015\243`\366h*\ +\273\002\216r\201|Z\240O[P\027\026\211\251\277 \264]+\000k\307\020/)q\020\ +\227Hl\366\032\014&\002\201E\345\036\030W\267\227\\SD\027t\2055M\355J\235\ +\3729\272M\310P\365Aj\337\210\266\316\251}\313\260 \341xW`G\3415\272\032HQp\ +\250\260\177\241Q\370$\360X\020\373!(6B\215DP\007=Be\005\200\250\202z\017\ +\032toQ\340\322\270tT\321\012\352N \253{\226.^\321\353\005\025$\307t#Q\370x\ +\0140/l\337\266`\316\376\020\000\366\235\266\203f\364\345\001P%\2657D\225k\ +\022\233\027\032{w\003E\325-\233\324\250\233)\251\233\001\227\033\265\2608\ +\235c\330\336\024\010\332\222*M\242\312Bb\246 6\331p)/b\352\350\2423\240C\ +\331\023\304\341\230K\372\251E\012\260Ez\241\273\005\017+\274a\205\335\014\ +\015\351\372\025\316\302h\226\236P{\323\304]n\265]\001\037}u\260\012\210\261\ +\030\353\000\343b;KW\002\237Td\021\254\250\203\203\342\244\321\300+\015r21tS\ +\330o@\010\376\020\364\223\000V\244\032\033\240\010\253\242m\000Ki\311\243\ +\001,\037\331\221\302 \316\237\013\242\354G\211\375\016M\333\207\310c1zlA`\ +\277\203\263\364o\337\251Z5dZ\325\242\313\324\357\320\030o\350\343\' \270\'\ +\027\022\273^P\003Dc\274\016\242[\232\266\237I+\300\002\227J\013\217.+a\333\ +\270M\015\225\036\221\306~\'\216A\365\021\230\2256,5\354\002$\3638i\202`M\ +\331\237@Xft?At{\246\260\233\241A\3373\263\002\210\302\033\215\211\222\200\ +\277*\255\000v9\003|\205\366\312\253&\254\000ot\030\246\016\002\376\0069\231\ +X\376\235.\221\011\370!\307J\242\304\341\372\0049\231\350v@`\317\324l\200?\ +\226\240\006\314\355\260p\222|Jt{-1s\322\240\257\233\341{\021\232\330\317\ +\013l\303K\254\001g \373z\026\310\214n\270\210LW\360Z\304\340\026\\\270\2461\ +\351\323\030/\241\026\211\306\357\005\307\207_t\007\266\362\261\002[WeW\300\ +\266+\034[$\232\374\255\223\013\211;\217\351i\030\015\350\013\201\217\307\ +\322\006\010\006\224]\341C\214\321\3431C\246\337*\001y,\306\340oR\213\224a\ +\213\324\240\006\250\205\015\320\002\276\2143\376\301G\027\022\253"\232\374]\ +\321<\236\250o\220\332N\232\307/C\246(\354<>\022V\200w\223@l~\021\340\004\ +\201\323;\036\272jz\340v\005|\243\007N\256\264 \274\221V\000\337X\220H[\204\ +\312\003\032\322\321p\275\007b,H\274\000\216\341\007\332\222\021\217m\202\ +\265M\303\270`K7\030\027\345\001F\320\0048\310\317[H9;\022\371\224\006\364S\ +\344 \242\255\035\2504[vH\327\005\023\204,J\221\371\023\027\257fs\364\3075u3\ +9\366;\317T\023SQ\270+\261p(\260\335\353\375\020\200\246\221\304\027\0244\ +\265{\005D\225\026Q\247T\256QQ\270Ko\305h\226\3561+\200\240K(\2457\261\342\ +\035\242\236\251\216\017{.\250#\012\233\260m\023\012\334\320\230\013^\237W\ +\330\021\321\264\375\210\236\206\321\234\342M`\322j\321@\332\305\247au\354!\ +\017\004\361)\272\360\030N.\2650\035\2208\244\243\253\352mj^R\034\240\034\ +\220O\211\266\226a*\323\264\250\354\243\033\235\010\213\323&=!\2101\244&\004\ +v\000\015|99DmV\212\351\325\343\370P!\302\221BN^\'\036\233\245\313}\2726\233\ +qql\225c\355P\207\274\037\332A\337\002\275\025#T\366\322K\260\006\226\012gT\ +\214\321\000\266\023\202.\217h\200r\300\355O\000bK.\276\004#\334\276hl\346\ +\350\332\354\206\036\343\322\200~A[\001X;B>%\036;U\3704\214\356\3216\001\204\ +\246\207j\3404U\340=<\215\360\233\220,\312\322\303dqF\235\010\215\360\337\ +\311\205T\3441\352\335\032\330V\210\017\001\262%\344\206\330\016\372\346\350\ +\375\235\235\307\013\354\314h\320\327M.\244Y\307\015\225=\304R5\310@\201\035\ +\322MHD\003\241\362\205\341\223,\232\245\037I+\000x\004\324U\025\001\034eD\ +\355M\211\227\310\203\324\001\304xr\363d>\321\226\246\373\011*\243\327\221\ +\307\354\\\257\207l\241\241\303\212F\326\246\373\253TZ\001\374d\012\3022\262\ +\000\322\324\000\321\244\374\232\343\233\265\020C\273\213\034D,\365\344\342\ +\333(?\200\243\274\242\322\232\336"\007\014\3176F\301"\315mh\226\336$\363s<}\ +G\342s*\272\320\032\223x\201CS\273M*\317\211\3306i\302D\375\037#\217Q\235\ +\274.\360\261\024Al\233\356k"4\377\032y="\226\352\245n\206F\347s\324\274\224\ +XJ\276Q{C\317\271;5>\247"D\225\014\273\031\032\256\017\323\0251A\254 \237\ +\332\307\247\224\221i\270~\003.\254\333\271\336\213\302\201#\315\322w\200\ +\223\2638nBh\217slWhj7I\243b"\2453\227\370\024)8\327\310c4:_\026\370h\313#=\ +\\L\3001N\207\\r2U\322+\370\234\312\016\327\227\250\303\251#m]\273v\005\016\ +\265\351m\224\217\247\277\372\361\0238\354m*\235\210\351\2664\352A\223\277\ +\036\2707\312\354\035X\240\261]\241Q`/9\231h\253Oc\322"d\377\260\037\305Y)\ +\257!\304\352t\305#\360\322\243\300\266\211\223O\211\245f1\034\312\024\211\ +\336\021\330\320\320\240\357Q\020[bZ\333\204\301\205\011:t\341\333\207\000\ +\302\362\200\356\300\210\245B\350\305\374\366\370\035\024\003\226\362\354\ +\035\330;P\260I|\015\020<\321\013,z0qK\355\012\015\350\217\250\224$\352\233\ +\377X\201\017i%>\270\242\\\331)\261\241\241\361{\213Y\001\304\351\243B\266$\ +\250\317\2728q\313\360\265\362;fu\213l\347\213\377\373\243\344\037%\377(\371\ +G\311?J\376Q\362\217\222\377\357\225\344\216r\364\327VR:\314\224\241\332q\ +\277\262\2225\247\323\351rz\277\272\222#\225\222\375_Y\311!Tr\360\353*9\352\ +\364\341q\017;\365\257\252\244\3574P\311\300i~U%C\'rb\203\356\304(\351}M%\ +\257\235\007\347\300\271q~:O\316\235Q\362\344+*y\345\3548\267\316\276s\350\ +\0349\307\316\251s\366\025\225\3526\256!\036\007\371\2003\312\373\3700\257s\237\ +7x\300\233<\344\021\217y\302=~\315\037\370\001\277\341?\371\023\277\343\'\ +\374\212\357\360[\276\317\177\353\270\017\371Q\365w\314O\371\031?\347\317\ +\374\221\357\361{\276\313/\371\005oT\321(\252\243n\223\3704\237\341\245\223\ +\3617g\231\347|\215\247|\201\027\274\305\307\370\017>\301\'\371\024\237\345\ +\343|\211\257\362E>\317K\276\302\347x\007\177\347\233\374\267\216{\200w\343\ +\3373\357\341[F\301m\376\235o\360u\376bT|\254T\274w\336x\373\250\027\235W\ +\323Ap\245\224VR1%\224\253j\252Su\251^5\242\372\325\220\032T\243\252O\015\ +\253\272\362UC\005\252\251B\025\251X%\352\267\216\333S\236\2726\177{\374Am\ +\033\017\036\250\266\202\027\374F\375T#\206\033\333*\036\031v\\v\236\324+\ +\037\344w\352D]\251\035u\253\366\325\241:R\307\252\305O\325\231:W\317\352Q\ +\355\251{\265\253.\325\205\232V3*S\313*Wk*U\277\015\234\005\265\240\016\314\ +\337\256\361_\241Z\352\202\357\030^\2745\210\036S?\315A\277\361;\347\207\272\ +0\250\236P\223\252\015\231)5\253\306\325\222ZU\213j\336\370\2614~\\Qs\252C\ +\275\253M5\240\272U\217\332R\333\352\273\332P\353\352E\375c\340\374\223\350~\ +S\257F9Gs\375\302\237+\005;\3151+}\350h\275[a\232T\224\232i\241]]\323\235\ +\272K\367\352\021\335\257\307\370\231\032\322m?\016\352Q\335\247\207u]\373\ +\272\241\003\335\324\241\216\364\337\201\356\352_\254\023\035\231b\314\323\ +\217\306\203\373\206\025\333><2\210>6*>\251w\247\015\030\251\225\352\343\327\ +\372A\037\350\033\375S?\351;}\242\257\364\216\276\325\373\272C\035\352#}\254\ +\273\325\251>\323\347\372Y?\352=\375\267\222\371\275\276\327\273\372\306\034\ +\261\322\205\211\303\'\203\347;C:\247\206\031g\321\213\312D\343\265\276U\227\ +\372BO\353\232\232\321\231^\326\271\236\340k:\325\013\372^\365\351\302\370\ +\261e\3748\246\177\350\177A\306\231\320\223F\275)\335k\025l\037\3634o\303\ +\205T\334Q9\237\325Kj\\/\231\243^\325\213z^\227zE\317\351\016\375\2567\365\ +\200\356\326\213\274Go\351m\375/\3128\337\365\206\211\301\300Da[\301\016C9\ +\263\346\230\307M\022|q\230\356\343;j]\317\352\027\375\246_\215\212\216\341~\ +%w\264\226R2)\244+k\362Ru\312.\331+G\344\337\233q\376\313\277~9$\227M1va\024\ +|7\011\260\355\303Ay\242\336\034m\016zT\366\311aY\227\276\350y\271\254Ki\ +\000cT\234\223\035\262\215\352\007\371.7\345_\335\351\267J\265\0019`<\330V0\ +\347m\037.\251\272\354\226=rKn\313\357r\243\362\342\212\\\227S\374E\276\311>\ +\365*\035\306\331\277\256T\373\037\376)\246\331\2559\3445.\224d\213\362U3&\ +\330\252\251\347J\225k\227\325\330\276\356d\013\332\223]l@\365\262\021\366+\ +\273\374ve\336\317\016\364\020\223lG\016\262\232\032\321\231\034ec\274\217\ +\205\006.\303lN\325\331\240QqS\371\254\301\336\345\257\355\361\233J\006\254\ +\311B\343\301#\325c\010\'2><1\331%f;:a\307U,\316rOz\354Y^\263\007\366\253\ +\273\374\246\222\007\354\206\275\352\237\354X\011\326\342OlQ\337\261C\003\ +\226\023v\305Ne\207\232\345;\354\326\034\3645\333g\207\377.%\217\3301;egF\ +\301[y\316J\365\314\036\331\036[\221\367,\226\035z\227\335\253k9\240.Y]_\260\ +i6\303\376\015Jfl\231m\313\234\235\230B\254Tk,eC\306\207\223|\20119\250\013V\ +HS\222\251U\336bc\354\007\233`\223\277\241\344/S\320\024\373.g\331\206\274c\ +\343&\012\217\344\022{V\253l\221uha\022\340<\253\231\024\330m\352\357\222\ +\255\2609\326\301\336\177Q\311o\277\243\344&\353cgj\200u\263#yk\012\332}\375\ +h\352\356\005\335\303\\\303\212>\033\326[l\233u\311\357\354\\g\246\223\331\ +\370\015%\177\371\270\327\215z/l\211\015\233#~c\257\254\303T\335\347r\207y\ +\254%\207\225#\366\331\215\2346\255\326\266\342\242\2517\224\022Z|rLJ\301\ +\204\020W\206\013\347\364"\0334\036<\227\256\3304\255\301\200j\373pO\216\261\ +\232\230Q\235\242K\364\212\021\321/\206\304\340g+9*\206T\2370\021\250\206\ +\205)\036X]\034\031\005\217M\325\355\213\206\3501\235` \316uS\204"\022\261H\ +\204\'\256\305\303g+y :\364M\245\336\216\301q\027\333U\307\372\247\350VO\342\ +N\234\210+\343\303\035\301\305\255\330\027\207\342H\034\213Sq&\316\305\263\ +\370D%\037\305\236\360Les/v\205\351\241\305\203\274\020[\254\305\246\305L\ +\245F&\226En\216yM\244bA\274\363B\264\304\230\370!&>S\311I1%fEM\032\014\233\ +\010|\224\343\342\302\364\321Kb\325*\261(\346E)V\304\234\350\020\357bS\014\ +\210n\321#\266\304\'\362\344\266\370.6\304*_\027\343\242\305\026\271ob\360E\ +\274\375\027\025^\205\343rW\271\332\225.s\205\353\2725\267\323\375D\012\352r\ +{\335\021wO.\362\222M\253-\325\357\016\271\203\377M\201Q\267\317\035v\307D\ +\335\365\335\206\033\270M7t#\367\223\216;v\023\267\255\234\347^\273\0155\243\ +\036\334\203\377a\353\033\367\247\373\344\366\210;\367\304\275rw\334[w\377\ +\263\224<4\252\035\271\307\356\034\333\021\247\356\231{\376\0176~v\037\335=\ +\367\336\335u/\335\013w\332\235\371,%3\367\324\355`\313n\227\310\33557\375_\ +\266]p\013\267\345\216\271?\334\011w\322\235rg\335OQr\334]r{\305\252;\307\ +\027\335\371\177j\313\322]q\347\334\016\367\335\335t\007\334O@w\267\333\355\ +\226\242\307\335r\267\335\357\377\364\206\033\356\272\373\342\276\271\257\ +\256S\373\004t\363\232\252\351\232\254\231\324\374\227\266sk\265Zg\255\253\ +\326[\373\204\343\036\251\365\327\206j\203\265\277\036&\243\265\276\332p\255\ +\376\031J\372\265\206\371\373\305\326\255\326\254\205\265O\001\316\357\375k\ +\376_P\362\323\207\003\177\224\374\243\344\037%\377(\371G\311/\241$\377O2\ +\017?\240' )) def getTestStarBitmap(): return wxBitmapFromXPMData(getTestStarData()) @@ -1254,279 +1244,277 @@ def getTestStarImage(): #---------------------------------------------------------------------- def getTestStar2Data(): return cPickle.loads(zlib.decompress( -'x\332\355\233gW\0359\227\250\277\317\257(Z\207(\020U\'U\025i\311Dc\014\002\ -\023,\3541P\351\020\014\210`r\370\355W\007I[\233u\327\314}\333\356\227\361]c\ -\323\237\236U\247\264\265\363\226\252\007\216\317\242\377X\357O\302@\377\027\ -\267\243\240\336\377\037\331z\177\020\374g\030EE\260p\221\335Ea\370\302\230e\ -\244\312\213"6\317I\304:\226)\317\312\206e\002=\227\306\321\013\243\210\225\ -\226q\307:\235,\266\353\022\364\276\330\276\257\006\254(\364\203/\254\327\ -\3776\255\354o\373\320\373Z\226\015!VZ6\211~\353\330\310\253u\215|\343\300\ -\312"kw^\330\230\227\245L\254,S\350\271\264]\275\260a\304\012\313&\320oS\373\ -\333\010\261\334\262:\260J\257k~\333@2\267\255\314M\317r\307Z\350}\205\225\ -\271\215\336\227\333\367\305\350}N\367\011b\035\313R\244?\247\347\020\255Q\ -\3325\316\321\032i\273|a7\210U\226Uh\215\324\276\357\002\255\341\374\357\007\ -b\211ewh\277\241eW\210\271}\034z[V\241\225\357\014XG\353\324\310\222!Y\032\ -\366\267\227\210\345\226\225H\226\272e\035\3042\313\366\221,n\037\007\210\ -\271\375\036yV\270}|\007\3712\220\371\030\311\\Z\231\357\221|\316\307o\021+,\ -+\220|no\327\210\271\347r$\237{\356\0241\267\267\023$\263\323\3012\322sd\375\ -j\005\236\013\301\346\323\350}N\346-\304\\\014\316\2405\232\226}Azi\3305\336\ -\301s\221^\243xa\353\236\225\221]w\026\355\327\351~\036\255\353||\001\255\ -\353|\350=\254\233V-\273\356\007x\256^t\354\272K\350}N\346\217\2109\037ZEk8Y\ -\026=+\235\277l\302\272\011\254\273\015\3175\312\272]w\003\275\317\351\364\ -\023b\316\276sh\015g\337\317h\215\266]c\015\255\321\262k\364\240\3679\371\ -\236\021sq\271\203\326p\376<\212\230\313M\003h\335\330\256;\010\254\255\231\ -\361\373]\370m\023d\331C,6\354\257~\244g-\313_\335\347\276!\346\362\325W$\ -\263\263\307\003\222\317\371\370\223g\225\333\307#\310\327\254\022+_\300\334\ -si^\265sS/\201%\300\244gEh\231\002\026\027\221e\002\261\206e\024\261\226e\ -\034\261\266e\004\261\324\262\032\260\266\316u\206\365"VX\326\207\230\223y\ -\310\263\322\311<\011\254U6\254=F\020kZ6\216Xb\331\030\363\272w\3616\345Y\ -\351b\177\330\263\312\305\321\204cU\253J\255\356#`\241\366]\303\352\216\225E\ -\325\2645\264\001,\006\326\004\326\250\352\226\265\034+\252*\264\375F\033X^V\ -\226\305\300\332e\0217M\275\004V\327\265\273e\352\245cy\245k|\333\324K`\231\ -\356-bS/\201\265\312\266e7\300\352e3NM\275t,+u\177e\330\005\260\244\014\343\ -\314\324K`\255\242\212\215\356\357\200i[&\015S/\201\351\334\231\030\231\017\ -\035Ku\336H\214\314g\300\362"O\022S/\201%E\232\030\337\270\004\326.\342\304\ -\344\335\022X\263h\247\246\227\352\200}3\360\373}o\363\266\213\325\003\304\ -\234\277\034y\026C\275D\314\325\243c\304\\N\274G\314\345\253[\304\\>(\020s\ -\353^{\226\270\334\231[&.\262\323}\223\302N-\232\315.\276#|\342\177\235:\251\ -\227Q4\270\254\270\202\230\213\206i\024!N\302-\024!n\'3^\253U\032\032M\177\ -\001\026U\355\320x\357;\3463o#4\236\260\016\321\320);\241\361\350Y`m\275\256\ -\361\216y\360\362\262LB\343\251\013\300\232e34\336\361\036\274\267[\320\215\ -\247~\000\026\351\275\031\253/y\357\325\225\320x\352G\344\201\255\320x\321*\ -\362\254zh"}\321\261\244\310;\221\255\230\300\032y\036\031\035l;\026gy\034\ -\231\375n8\326\326\235Nd\366\373\011X;\353D\306\363\347\034k\025]W5\025\023X\ -#K#\263\3375\307\232y\326\212l\305\004\026gQ\335\254\361\014\254\236\226u\ -\363\334\016\354\255\241#\304\330h\024\354\226Cv\037@^\351\374e\0201W\271v\ -\021s>\264\207\274\327F\310_\375\210\265\\\305D\314u&_\021s\357{@\376\354"\ -\356\311\263\334\261G\344\317N\276@z\177v\3171\304\234?K\304\\FP\236U.\252\ -\005\260\252r\361A\201\265\252\330\372=\2270\205\351\252b\030\221\276\242\ -\207\326\357k\216\225:\315Z\277\357\005V/S\353\367}\216\025\251\356j\214\037\ -\014\001\013u\207e\374~\322\261<\326U\317d\350\021\011\231\\w!\306\276\343\ -\300\232\272\2332~?&}\346m\206&\227L\001\253\027\221\365\373a\307\222$/-\233\ -p,\326\235{d\366\033\001k\347m\033\013u\307\332E^\267\261\320\000\326\310*\ -\353\367M\307Zi\226EF\007-`a\026Gf\277m\307\232Y\326\214L\254\306\300\332YX7\ -\357K$\256\014v\302D{k\331X\010\301\226\005t5\347\336\017b\347\0337\236%.\ -\307V\210\271\230\271\360,u\335\305\017\304`\302\364\254p\031\377\012\371\ -\244\363\277C\304\\\247}\206\374\324\3756C\314\305\326%\260\024rv\011,\324>n\ -l\324\001?\215\253\272e\373\022\347l\343\247\007\022\347l\243\347#\360\311\ -\026\344\347\357\322\347\347\310\372\3511\260zQY\237\274\007\237Lu\374\232|u\ -+}\327\320\266~ZH\337\015\270\374|\015>YA~\316\201\265\362\302\346\347S\360I\ -\335\\X\237<\001V\317\233\326\'\227\301\'S\235\332\315~W\200\205Yi\375t\032|\ -\262\255\375\324\354w\013\374\257\314\332\326Og\200%Y\275n\353\245\364u&\261\ -\035\314;\211\362sb\366\266\216|\262\264>9\213|\315\345\241y\304\234\237.x\ -\2269\377{\357Y\356|\350\003\362?\367\333%\344k0a"\277r\023\353\252\227\257\ -\312\254_-\002k@/\260)\375\324\356z\201m`u\275\254\255\227(\'\026\326\327>\ -\001\213\364\324d\362\301\034\312\177u\353W\237\301_*\310uk\322w\250\211\365\ -\253\036\320s\241\353\276\311u\317(G\270\\\267\003>\224i\3475{\033\005\026A\ -\256\033\000\037J\240\356\017\202\277TP\367w%\256\373fo{\022\327\375\330\324\ -K\351\353~\022\245\246^J_\367\233\266\356\177\005\231c\355C&\337?\000kAg\374\ -\344m\244\'y\243\227G\304\\g\034(\357C\256\033e\236\245n\032\227\236e.\327)\ -\304\334o\205g\245\313C\0241\367\034\367\254r\357#\312\327ZW\317k\300\332\ -\272\0275\366\350Up\332\247k\255\321}\237\362\323}\335\326\332!\307\312R\327\ -x\303&\201\265 \207\2158\246\303\315\365\235\343\216\345\015\335O\032=\217)\ -\237\207\0326\017M9\226t \017\015\003kC\036\232P8\017\331z\011\254\231\267\\\ -\275t\254\235C\036j\000\253\373z\351XK;\252\253\227\2165;\276^\202\314\251\ -\236\244\014\213\025\316C\306\257\022\345}\243i}#E\314\235\014\204\3107\234\ -\215\316\221-\035\273\001\226\200\335*\205k\217\321\301\205\362\247_\256\366\ -\374\000\026B\355\271\003\273\305:G\030\035\\\001\013\265\257\031v\010\266\ -\214u\0155\371\371\014l\331\355\011\215-3`m\350\233.\025\356\233\214^J\205s\ -\211\211\255\216\3629\333\345\215}\345\363Fem~\240p\3360\354\010l\036\352\ -\332c\366\366\035\354\333\316C\313\216\301\276\225\313\021\375\367\260n\005\ -\023\365\255\302\323\263y\256Pxz6{\273F\266t}N\216\342\327\3654\247\300\352\ -\220\307O\024:\031\2656Z\006V\007\033\255(\337\307\272\234=\015\366\310t\037\ -k\330\226\362\247\031\256\217\235Q\376\344\302\315t_\224\237\337\\\177\360\ -\016XX\3046\217\257+\237\023]\\\316\202\236\313<\265\3616\377*\266L>X\200\ -\337fEnO3\336+_+\012\253\347\017H\177\256&/!\346N\265>"\235\302\211\254\362\ -\265\321\315\013\213\012\317\006F\247\233\240?\375>\253\323m\224\233b\253\ -\277\015\205gb\243\253O\240\277\002z\2569`M\350\271>\203\376\012\255S[/\2015\ -\264N\215\217\367 \275\270\331\340Y\371\3769\264z\336Q\270^\332\023Y\344\367\ -nN\036\000{\2440\033\014\202=b\355\367&~w\261\356c#\337\036\312aY\\\232z\351\ -u\257Sbn\352%b\256\346}U\370\334\302\316\227\240\373\002\352\307\223\362\'\ -\200nV{\004{T`\217@\3703\012g\017&\374\211\235\3139R\370\3239g\017%|\257RX\ -\335\013`\355"\265\272\247\302\307\271;\243\340\302\327x\327\003\023\307\222\ -\022jO\015X\023jO\257cq\003\352L\237c\355\014\352\314\220\360g#\245\325\375\ -\244@\371\305\306\307\210\360zv\247\310\343\300\362\312\325\2171\341\353\276\ -\353\035\247\004\236Il\275\024>\347\304\266VL\010o\243\206\215\231Hx\033E\ -\326Fu\201k\274\255\227`\217\016\324\363\246\360u\301\315\323-\341\353\202\ -\313Cm`\011\324\205\030X\010gK\211\360y\310\315)\251\300\375\201\211\231\020\ -XX\204\326F\347`\243\030z\314\033\341\347i\227\257*`1\364\230\027\002\367\ -\230f\277?\220,\245=\271\275\023\336\357\335\031\317\025b\261e\207H\367\256&\ -\237\011\337\267\273\370\310\204\317WN\367\227\240\323\004r{\011,\002\235v@\ -\177\335Kp\243\323}\341\347A\247\323\003\330G\006\371\376\010X\035r\323w\201\ -s\223\275\301\024\250&[v\017z\256C\375\275\025>\017\305V\317\005\260\010\346\ -\301k\264n\307\3524\177\025\037f\037\247\330\237\255NO\274\337W\256\177^\026\ -\276\217u>\276"\374<\355z\232i\201{\032[/\221N]\276\237\021\276^FV\247_\204\ -\357Y]\276\177\'p\276\2677\230\302\347X\227\333g\205?\357\254\254\237\316\ -\013?O\273<\276 \374\215@\335\336&\274\027\376l\311\351\352\203\360s\274\323\ -\325\222\360=a\356\352%\260\270*\354M\316*\322\251\353\035\027\2015\375|)\ -\374\034\340\3162\266\005\356\'\215-7\2005 \267\177z\345\273&\037\314\011|\ -\256ld\376\214\364\347z\302\265W\371\331\350\257\347U~\266\365\322\3733\350j\ -\007X\253\014c\263\356\250\360\347\211N\007\003 s\004g\346\203\340\0339\234\ -\035\356\002k\352\236\313\370\320\036\354\255r\371\357\257~\264_]\243L\275|\ -\025\253F\226\257^>83\177\020\276\277r\265\347\011\3475\313\036\301_B\310a\ -\001\005\375\225\015\253\003\006,.#\253\003I}\036r:P\324\337/\344\366\246]P\ -\177\277\340\346\005\352X\231@\034q\212{Q\303\010\3053\235\275\301\244\330\ -\276\366\006\223z\373\272\334\336G\361\031\250\361\311!\212o\314\314\032\223\ -\300R\2757\263\337\021\352\317\206\335\027!\343\210\271\3726F\375\231\233\ -\253eS\324\367\317\256\337\030\246\276\267p\347 \023\260n\016}]\364j\037\306\ -\'\353\024\347D\263n\003\355\243i\367\321\244\276\347O\254\314-\244\373\304\ -\336\252\267\251?;\214\254=b\212\317\263\355y,\305\375\251\211\255\224\372;\ -\233\302\372Z\010\362\245\240\347s\307\342\034f\347\033\277_\210\255\012\311\ -\342\2766\270\000\026A\354\377\240\370\274\311\310wG\361y\273y\337\025\305s\ -\243\321\363!\305\347MF\3463os\350\3412\330G\007\352\376%\362!7#\226\024\237\ -\001\030\371:\324\347\215\320\356m\237\372s\263\206\275\215>\240x&6\376rD\ -\361\371\206\235/\251?Ks\3668\246~\206p=\353=\305\347\266\306F\267\324\317\ -\311\225e\305+\273\031_\273\246\270\2175z\311):_\2639\342\224\342\3732;_R\ -\177G\340\316\315\226_\345\010\243\373\025\352\347\024Wg\246ao\225\356\371\ -\315\032[\2105\354\355\373\014\3657\355.\337\177A>\351\362\375;\212\357S\314\ -\336\326\251\257o\256\007\231\245\350\236\304\356m\236\342>\333\316\227\024\ -\337\177\030{\274\007\326\202y\377\203c\255\216.\350\306\346K\024\335\240\ -\333\032\372\321\373n\025\332\275\255R\177\006\357l\271Hq\177`t\265\011\357\ -\353\200\335\266)\276\027\262_\374P\337\347\270\374\367\211\342\363\015\373\ -\305\017\365\363\264\333\333g\27778\357\\\243\376,\303\235\243\367P\177~\345\ -\356{\236\321\272n\366\333A>^\332\375\216\302\336\022\260\333\000\260\026\ -\370\351 \262\221\213\301]\352{j7\207\356Q|&\3234\365\022\366\321\354\336\ -\327\232z\011\357+\365,d\364\362\025\344k\224\205\225\357\201\342\336\326\ -\310\362D}]u>\364H\361\014a\362U\300}\177\352\356+\030\367w\016\356NXr\337\ -\303\345\261\361?\305}_\234&\366\013Y\356\373\311\314}!\313\375|\344\030\347\ -\270~\030? \034\235mZ\037\257q|Vel\331\013\362ep\026\331\007\254\0112\0179\ -\326\254\340\236d\222\343\373<\243\203\021\216\357\266\215\016\306\201\265\ -\322N\335\374v\214\373s\201\304\236\323Lq\037\347\211\375\242f\230\3738r\272\ -\237@\277u\263Z\004\373\255\300_\352\034\362_\331\262_\3364\2005\2015\271\ -\277\323t\367\373-\216}\334\350\240\015\254\336=\3477\365\222\343\373#\343/\ -\011\322K\303\336s\246\334\337s\272;\377\020X\023\364r\016,J\213\272\371\355\ -\015\367=\\l\277\274\2518\352\011c;_r|\226f\364\362\203\373\2634\347\223w\ -\334\177U\324\260:\270\342\370\253"\373\305\017\260\010z\2133\260G\245\177k\ -\277\370\001\275\344\340C\227\034\337\377\232\347J\330[\001\337Bt8\276k\263\ -\347\261\034\337\011\333\373K\244\253\262n\362\313\021\322U\336\260_\3748\ -\326\250\322\264a\317c\271?3o\3333\325{\356\353[\323~\245t\313\321}\250\325i\ -\301Q\255\265\354\032|-\207^ \347\270\367\261\347\261\034\177sb\353%\307\375\ -\220=\217E>Y\267\272_\001\026jf\347K\037\347\320{oq\337\263\206\266\256\316p\ -|\037e\353%\307\367Q\366\376\022\305j\275n\344[\177\025\253\306\226\263\300\ -\302T;\264\251\227\240\3472M\032F\276\005`Y\332j\030\235\276\007\226\244\215\ -\246\275\277\344~\336o$\306O\2278\232g\254\236?"\235\272\272\265\312\375\371\ -\213;#[\004\235\266\240vo"\375EV\177\333\257\230=\217\345\276\367\351\330:\ -\375\211\373\272Z\331Z6\207c\332\372\351\347W1m\353%\362\323\312\306t\017\ -\367\337\366\024u;_\202^:\332O\215\356w\200\025i\334\260\363%\260T\353\324\ -\316\227\300b\255S\243\203A`\3154l\332\363X\356kh\335~G\261\307Q\337d\364\ -\374W?\350\257\352\316\025\246^r|\006o\354\361\225\373{SW\177\037\220NC\253\ -\347\'\356\357b:\326O\037\271\357\377J[\363\002\342s\273n`L\275t\254\331\200\ -\357\240$\361\376\347\342\\\021\357\177.\316\005\260\\\353\317\350\236\022\ -\257\277f\303\350\236\003k\247\365\246\331\007\001\326H:M\343\0335`QR5\215,\ -\275\216\245Q\021\245\366<\226\370s\307\312\306\357\020\361>\351t5I|\217\351\ -\316\252F\210\237I:\326\'\307\211\237k+\253\2771\304J\313\246\210\357\2712\ -\373\345\3460\361scj\353\352\004\301\261j\326\210\010\212\313\206\375B\026X+\ -\215\232\366{\237Wz1:m\002\013\223\262i\347K\307\352e\222\267\354\027\262\ -\004\2353\244F\226\230\370o?\252\324\310\222\020\337\377\301\027\262\304\337\ -\177\024\226\205\216\265\0238\367>\'\270g5\376wC\274\3779]U\304\367H\205e\ -\027\304\367a\211\275_\375A\374\231ylk\305\035\361\361Vo\232\275]\001\253k\ -\3370\317\035"\275\024M\343kgH/\231\325K\006,\327\255\217\221\371\022X\232\ -\350\255\230zI\374\271^\231\032\326!\376<;\263z\331\007\035DYe\353\357\001\ -\3613\211\273w>"\376;-W\247\277\023tnk\365rL\374L\234[vO|\177\332\262\337)\ -\334\022\177f\336\262y\274@1S\332\230\271\206\275u\364\203\366{\037`E\222\ -\266\214\257\235\002\313\222\270e\326=\001\226h\275\230\\\274\014\254\2354[\ -\306wW\210\277O)\254\256\246Q\314$6\266\266@\007-\350mg\200E\276^\022\364\ -\375\251\255\253\357\010\232\223m\255X\'\276\347j\332\357\322f\211?Ot9b\236\ -\370\232\027\246v\276|\265_\263\306{\264\337V\313\350\371\003\336o\333~\357\ -\003\254\231\324\333\346}\037\221\277\024\251\375>\226\370\331/O\215\215\026\ -\221}\333\326\276\233\304\177\177\340\372\373m\202\3735\263\337\015\244\203\ -\330\336)}"h>\262\263\325\034\354\267\236wl\234\177\366\271S3\263\306\032\ -\354\243\245\333\010S\313z\2005\364\336\214\217?\003\213\222\260md\336q,\352\ -\304\356\016w\224\370\236!\317\354\377Q\002\362i\033\331z>\010{K\341\033\257\ -]\342{\321\310\366C{\304\367\002-w\177\211X3.M\275$h\336\262\376\367\025\345\ -\2722\265\347\261~\037q\247mt\360\364j\037\346\271G`zx\266\263iP\363gP\272\ -\0213\365\262\346u\037Y\335\313\032\364%\320\303\251\232\357\353*\313D\315\ -\337\223\324m\375\245\2105,\343\257\230\321\025\251\371x+\255_\325j\276/\316\ -S\023\227\275\216\351\361\315\315\330}\300\3628\263\275\336P\315\367uIf\277\ -\367\251\371\376 \264\262\214\324P\317o\347\243q\364\\dg\347\261\232\237\317\ -#[\033\247\260|\231\235/k\336_2\253\323\011\220OG\276\215\217\350\225|&\237\ -\326\375\032y\225\330z\211X\307\262\346+\273\031\326\252\371\357\214b\373\ -\2766\254\253\'\323\330\236)\374\346\377\376\010\371G\310?B\376\021\362\217\ -\220\177\204\374#\344\377z!Y \003\365{\013)\002\032p-$\371\235\205\254\005\ -\275A_0\364\273\0139\371"\344\310\357,\344\270\025r\354\367\025r*\030\266\ -\346\236\010\242\337U\310z\320\260B6\203\326\357*d;\210\203DGw\252\205\014\ -\177O!\317\203\233\240\012.\202\037\301]p\245\205<\374\035\205<\013\262\3402\ -(\203N\260\037\034\004G\301\367\337Q\310\343\340>\270\015\212\340:\310\203\ -\323\340$X\376\035\205\\\001\217\234\016\266\202\231\340\313\357\'\344\273`\ -\375\305\330\263/\0369\037,h!\337\377nB~\320z4\351g)\370\250\215\275\032,\ -\006\233\277\233\220\333Z\217&\262\233\332\330\033\301\247`.\370\374\273\011\ -\271\246\375\261\253\307n\320\364\004\317\301N0\032\014\004\203\377\220\220\ -\177\375\023"\356\006{:\256;Z\217\375\3017\0354_\265\036\037\202\247\340\361\ -\037x\367_\377\242&Y\367\237\324\177\212\011\375G\031g\204\325X/\353cCl\222\ -\215\260q\3265u7\256\215?\216\261\321`\212\015\263\011\026\261:k\260&k\2616\ -\213Y\302R\026\262sv\303*v\301~\260;v\305\016\331\031\313\330%+\331/\231\273\ -\303\366_\376\016\330\021\373\316\216\331=\273e\005\273f9;e\'\254\361\342\ -\215\374\305\324\335$\276\314V\330\\0\315\236\202-6\303\276\260wl\235\315\ -\262y\266\300\336\263\017l\211}d\253l\221m\262m\266\301>\2619\366\231\255\ -\261\036\366\314v\330/\231{\224\015\330\277{6\310v\265\200{\254\237}c_\331\ -\203\026\361\366E\304\353\340\211uM\275\021<\352\011\202I)\225\024\222J.\211\ -\254\311^\331\'\207\344\244\034\221\343rLN\311a9!#Y\227\015\331\224-\331\226\ -\261Ld*\177\311\334\241\014\345\271\376+\330\215\334\323\032\254dW\300\023v!\ -\177\310I\235\033\273"\356\353\354\270\025\334\311G6\306\256\344\241<\223\ -\231\274\224\245\354\310}y \347\331\221\374.\217\345\275\274\225\205\274\226\ -\271<\225\'rY\256\310i\271%g\344\027\371N\376r\340\254\313uY\351\277\\\353oV\ -\316\313\023\226\351\274x\251#zA\376\320\206~bW\301{y\242\243\372\203\\\222\ -\335\220\371(W\345\242\334\224\333rC~\322z\234\323z\374,\327d\217|\226;rT\ -\016\310A\271+\367d\277\374&\277\312\007\371\337\007\316\277\030\335O\362Q\ -\013\027(\246\036\330\375\213\200\275\332\314Ru\002\245\362\227\230v"\012E\ -\025WD\325T\257\352SCjR\215\250\005\366]\216\253\256\036\307\324\224\032V\ -\023*Ru\325PM\325Rm\025\253\177"\272_\376%*U\261n\306Bu\2535X\352\254\330\ -\325\341\276\216\350\003-\342\235|\016\272\001#\224\224\303\354\\\335\250J]\ -\250\037\352N]\251Cu\2462u\251J\325#;j_\035\250\001y\244\276\253cu\257nU\241\ -\376\321d~\255\256U\256.\264\211\245\232\325~x\247\343\371J\'\235#\235\031W\ -\255\026\245\366\306su)O\325\211ZV5\271\242\246\325\226\232Q\037\330\027\365\ -N\255\253k9\254f\265\036\347\265\036\027\324{\365o\2508\037\324\222\026\357\ -\243\032\002\001\273f^f\335pq"fr\206\255\252M\271\2506\265\251\267\325\206\ -\372\244\346\324g\265\246z\324\263\332Q\243j@m\260A\265\253\366\324\277\251\ -\342\364\253o\332\007\233\332\013\273\002\366\350\224\263\252\315\274\250\ -\213\340C@\3250\313\344W\265\252\036\324\223z\324"\006:\367K\221)%\204\240\ -\202\013"j\342T\366\212>1$&\305?[q^\375\033\021\343bK7c\'Z\300g]\000\273:\ -\034\023\207\362)P\332\320SbXL\210H\324\305\201l\210\246h\211\266\210\305\ -\022KD*Bq.nD%.\304\017\261\253\376\315\015\306\235\270\022\313lUw:;\272Fwu\ -\3305\363G\235\274\247\304\2418\023\231\030z\011\230KQ\212\216\330\027\007\ -\342H|\027\307b_\335\213[Q\210k\221\213\277\327`\374T\027t*N\305N\320\325\ -\340\203\256\321\'\332\0313\235\027\227E\245\303%\323Z\\\021\323\242On\211\ -\031\361E\274\023\343r]\233zV\314\213Y\265 \336\213\017\342\357vA?\331\252-\ -\211\217bZW\277\0231\314\266\030Q\253bQl\212m\261!6U\327\320\237\304\226\232\ -\023:`\264\210k\242Gt\243\372F<\213\035\361wW\372\245VmT\214j\015v\005\234a]\ -\035n\312H\014\210A\261+\366D\277\370\366\242\305\317\342\253\370\310\036\ -\304\223\030\226\217"\240\214\376\373Z\265\377\342\237\244\212^j#\177a\\\012\ -\272!\036\025\245\234n\353~nN\316(Bk\264T\275t]\205\242\217\216\312!:I\177f\ -\225_\356\314Gh\245\306\251\240\231\030\24359\251\246\305\024]`\303\264\255\ -\303e\202\256\311\210\216i\021wd\2356\350\263\370\2715~Q\310&m\321\266\326\ -\340\276\034\324\011\'\326:<\324\325%\241\231J\351\301\213/\256\262P\204\364\ -^\234\323\033\372\263\253\374\242\220\025\275\240\217\352\007=\220\234\316\ -\263;\272\241\256hG\007\313!=\243G\242G\256\262\214^jC\237\323\222v\376\247\ -\204\334\247\007\364\210~\327\002^\212c:\'\357\351--\350gqM\023\321\243rz-\ -\317\305\250<\245\221:\241\313t\205\376\017\0109M\267\350\236\230\241\207\ -\272\021\233\223_\350;:\256u\270\304\326)\025cj\226\316\012\335\222\311m6O\ -\027\350{\372\201.\375\202\220?\235\202>\322~\261J\277\211+\272\250\275p_l\ -\322{\271M7h\217\342\272\000~\2425]\002\007t\377=G?\3235\332C\237\177R\310\ -\277~E\310\035:L\277\313Q:@\367\305\245nhKu\253\373\356u5H\211\316\212u:\241\ -v\351\036\355\023\375\364XM\353I\346\333/\010\371\323\346\376\252\305{\240\ -\233tB\233\370\211>\322\036\335u\037\213\214\206t^L\310\200\227\364B,\353QkO\ -2\336R\337\244\344\212\277\261O\012N9\347g:\027\256\251\015:\2465x,\010\337\ -\321\243\301\250\354\352\260\020\013\264\306Wd/\357\343C|\222\217\360q>\366\ -\326BN\361q9\314\265\007\312\011\256\233\007\032\361}-\340\201\356\272\353\ -\274\301\007\365$\330\344\307\252\305\333<\346\011Oy\310\317\371\315[\013Y\ -\361\036u\361"^\246\343\270\217\346\362@\375\340\003\362\216_\361C~\246u\230\ -q\306/y\311;|\237\037\360#\376\235\037\363{\376\206B\336\362\202\207\272\263\ -\271\3469\32734\277\021\'|\227\316\323e\276\362"\3064\337\3423\332\314_\370;\ -\276\316\237\331,\237\347\013\374=\377\360\226B.\361\217|\225\327\204\216a\ -\355\201\267b\221\237\3509z\223o\203\020\033\374\023\237\343\237\371\032\357\ -\341\317|\207\217\362\001>\310w\371\033\346\311=\336\317\277\361m\366\225/\ -\362y\272\301\352\332\007\037\370\323+\021\036y@\030\221D\021A(\341\204\220\ -\032\351%o\230\202\372\310\020\231$\205\330`stY\356\312\0212N\306\376/\001\ -\246\3100\231 \013<"u\322 M\322"m\022\22372wBR\322\025.$\347\244!W\344\015\ -\251\376\213\245/\310\017rG\006\371\0259$g$#\227\244|+!;Z\264}r@\326h\306\ -\217\310wr\374\337,|OnIA\256INN\311\011Y&+o%\34449"=t\213\364\361\031\362\ -\205\274\373\177,\273Nf\311\222U\362&B.\222M2\304\267\ -\311\032\333 \237\376\245%\347\310g\262Fz\3103\331!\243\344\015\242{\200\014\ -\2209>Hv\311\036\351\377\227\027\374F\276\222\007\362D\036IP{\203\350f5YS5Q\ -\323\245\371o-Gj\265Zo\255\2576T{\003sO\326Fj\343\265\261\332\337w\223\251\ -\332pm\242\026\275\205\220\365ZC\377\375\344\350Vk\325\332\2657\011\234_\373\ -\327\372\377A\3107?\034\370#\344\037!\377\010\371G\310?B\376\026B\262\377\ -\003\036\241\243\021' )) +'x\332\355ZgS\035\275\222\376\276\277b\360\0340 \020s\346L$\225&\035L\024\ +\230$\354"\347d\021L\016\277}u\246\273Emm\355\335\373\332\357\345\262\2656\ +\376\324\2453\352n\365\363t\220z\317.\232\377\261\3709\361\034\363?\216\232\ +\216\377\371?\266\027?\037+g\327q\333\355\262\360\274Z\260\357v\004Y^\024qR\ +\013\326jAPda3\253\005{\302\012\212Z\260\242;\202\302/[^Z\013\246kA\273(\253\ +(\257\005#\262\026\344U\200\202\273\372\033il6\211j\201[\357\322j%\355 \256\ +\005\271\003\212\345!*\366\245\376F\026\024\355\030vi\275\375\004\004\031\ +\374\244YT\021(\266T\377\244jU\236\027\324\202\027\374\250\021\300Gok\363\ +\223*o7A\360\215u\004yQz\036X;W\177\243\214\214\203@\3236z,\251\360\033\012\ +\034\344\245y\013\004C\265\371I3\317\233\315Z\260\216\376\250|4\177\271\336%\ +k\027\205\007\202\356\332\037a\226\345M0\377\210\314Oq\227%8\227\250\210c0n\ +\260\376FUVYT\326\202\233z\227\322+S\324\364\276\376I\232\024aR\201O\245]\ +\001\273\014p\364G\200\273\270\240iUe(\030\201m\213\242\302p\270\254\267\215\ +\363\356\362\015\004\315*\362\340\243]\265\223\323\242\010=T\035b,+#T}\ +\205\034T\3427\202\372\033e\253\362c\020lB\214\371\205\237\342A\325?\251r\ +\023A\260\313\256F\007\245\011\034\3666\267\0028\227qpa\273\310\0220n\022\ +\254\015\363\260\011!\265B.LP\217e\005\273T-\017~\342\325\337\210\022\023\ +\015a-\230\207]\242\302\367\300\037-\264%\215\350\033\240iR\205\021\230\337\ +\205+\212&\256\230\251\365H\322\274\302\300\325h\\\331B\343\306j=\362\270hc$\ +/\011\214\240v\014\202\214\331\025`\355K\355\217*\264xi\203\371\255\302KA\ +\320\252WD~V5!\306\216\320\374\250\215\212\035\000;$\231\357\203\240PV\000hH\ +\352\217\346a\221\307\340\017V\353Q&\026b\236F\177P\024.\327\273$-\213\250\ +\037\302\012\360(\301\226\246ET\372&@2 \027\022\241\214\003)\245\025A\354\ +\266V\314o\033\300\200`\220|\032\307\260\355\265\262?\001\201\373\266\002\ +\364X\203]Z\245\217\034\264\306\220\266\022\324cDY\001\300\343\021\234\234\ +\031\230\202\240\005?)\313 \006\177\304\340 \337"\333m\324\346\227y\231B|t+\ +\273\002\340\021\326.\014\332Y\334\004r\374\011\201[Z\230\266jA\036\224!\036\ +C7E!\021\333|\275m\021\226\241\007\330\237\004\363[\026\246Z\240\352i\002\ +\202-A\364\031\303.[@\027^\036 ^.\301cU\221"m\235h\273\002\303\241>\227\2642\ +\247\000+\026\336\004`\355<\035%\235\034\007\217\305e\023Yj\366M\000\346\367\ +@hG\225\217\241\335\005\207\335J\374\010\266\275\201\200i\227>f\261\013m\005\ +\200\227\021b\334\026\232\317\201\371[i\351\303\331\366\324\232F\231\205\372\ +\003\370#4\250\004\301\256B\206!\354\357\241-\031q\3414\250n\262\030\302\364\ +\014\200\354\027\025\206\366O\260\305+\333\036|t\024|Z\224)R\337\034\242\262\ + rL`\333\240\210\220\013\177\200\371Y\022\207\340\261=nW@h\337\002\304r\3030\ + \230x\373\011\206\024\004nn\2228h\232p,\004\010\3317\234lI@p\000\330\367\ +\212\014W\334\243\246q\016\232~\372\014qZ\345Y\323\377\324Y\321`\230\201r4\ +\177L\342\2669f\302UiW \324\001\015\231!\024\330\345\'\263\002\000\220B\206\ +\311\210q\333\3657\222\3202Lo\255G+N[\001\010\2711,\004\014\ +\010\301\0377Tl\022\005O\002\3462\343 \320\264\220V\000!\345\200q&\317\241\ +\352\375\350\217\222<&\031\346J\037m\031h`j\3142\020\254C\006\312\263\000\ +\013\326/\365O\2420\367\020\246\337\204]\001\2243\007\376\360J\037)\330A\177\ +t\376\001*%\246\306&\002\371\026\217!iQ&\324\264\002S\364\012DaU\265\020\246\ +\343\365.E^&\230=~\330\224\204\306\245t\014\304\311g\002k\207\0101w\003U\260\ +\237T\001\010*\240\255\300\322\305,\320\205o\351b\252\326#l\033/\303\271HDCI\ +|\252\352\025m\277*0\213\235\200\352a\231\3437\306\264\025\200\203v\310\374\ +\030\277\261\012y\256\262\270\275\001\343\262*F\343\216\231]\001\273\254\327\ +\202\2644\310\206c\010\352o\204i\226\241\246/\270KNl\331\000\325#S~\001L\007\ +\004RN\214\331\243Uo[\264-Lg\201\307\242$\010\341\344\306\361\243%\261\345\ +\224]\021![B\026\313\014\346\340\240\026]\354_\202\024\363>\267+ \350\216!\ +\202\2326\211\253:,\203\310\240\022\364(\251\221\310\251\365\002[<\203J\370\ +\350\236\262\002\370\350\260B\376\0100\023\006T\005\023\217}W\250X\202\361\ +\321\015\2326\213f\212\360p1\233\246\310\311\347\022+Xb\251&0\177Ux\030\2709\ +\3704\267\351\365\253\3064O\270M\230\025\300\266}P(\032Z\307B\321\301\030K\ +\210\245\006%6E-\014\207\011`\334,\015[\010u\210\261\262\2540g\373\322\012@\ +\365\037d>\261\324\000\364s\211Q\025\004=\314\012 >85\001\005b\356\036T\217\ +\014^@\365\341\372\2402\257hb\315\377\023\262Xh22\304i\005.\364\363v\012G\ +\251\361(+"6\251\260\217\242\263\235\301\014Ty\210\375\'\210\261f\334\216\ +\300\205\203\300A\261\311{\260m\027\267\0020\377Qac\225!^\266\251b#\312\351\ +\20162\310\322&\034\324#\2445\337dS0\337gV\000\346\2173l\254b\204G\003\363\ +\234I\321\360\321ur2q\320\235\306tB\230\353w\261)\2120\370\027\352\025Y\313\ +\202p\246^\221\024y\221\202\300\301\254n\012#\330v\233\\H\034t\007\351\244,J\ +\014\272~p\220\351w\261\244\035\002\334\3466W^Hl\275\002\304KT\037e\323$\265\ +\030\360\022\223\307\210\245& \211\007e\200imI[\001\354"\201`\3634n\201\340X\ +"9\022L\227\352oD\355\274\2055\3560\220tj@\010q\272J\375\\\204\375\3349U\260\ +\304cM\211\255W\223F\025\220_\274\302\303\374rBi\236f\027\236]\201\261\256 y\ +V\026\225\017\020\270&Wb$\317R\315\357c\232\357\002\237\372i\341\203b\207\ +\220M}\203J\330\366\232\016@\323\324\316\372$\025\ +\337\224\222"@ClP\011\016*\201\371C\233M\235\006\346\227\024\213\315MP\335\ +\264\325X:\005o+\260N\206\3523\310\332\315\250\256\223_5\016\252\010\352\011\ +\240\322\324\257M\020\3641Z\201\301_\331\0258eiP\313S"\346\004\271\220\230nG\ +a\207S ^F \211\267\014n\301|\227Y\001\230\277\013a\331L\312\000l9\253\177\ +\022V\026\246\016U\364\304cc\340B\323\360\242\371\267\014\247N)\302CJ+\200\ +\223\323\014\207\1779\036\345&\244\371\300\342\366\216*%\242\276\242V,lf\011\ +"\352\256\376I\334\266\270Mh\004M\023\347S\250.\2524m\201\203f\250\005$b\013\ +$v8\021\246\002\006\333\206\026\246\011Q\037\241r\213Z\236\020\013\326gfW@h\ +\017Q\013H<6\344bwbj\026\310\225@[a\322\212\340\\2\216\311\202\006\210\275@J\ +\351[z\345\330\256\320\004^Cm\031\246\025\326\226\353`K\323\200\020\333\3737\ +\001\240\322\257\215\213\212\334\307\2445\301\254\000\034\324\003\275zb\312\ +\036\020h\362\030\021\333\034\3034O#\3715\205\331\303C\325\347\300|\317\302\ +\364\232f\2371\016\273"\227\262X\012\273\034\271\330\235\320\210\361\000v\ +\311\014n\301\270\'\362)\021\233+q\034FS\374/\220\222:\263aP\254\222V\000\ +\261\276\011\346G\006\204\260\355Wn\005\260\355(\324\016i\234"\261i\211\311\ +\202F\214\014\340\221\246A\013\016{\224c\022O\221\203N\\\354_h\254\277C\265\ +\024\021\333<\324\332\261E\345W\227(\030C*\345\230\325Sl$r\032\311\'\350\017\ +E $\246;\000\020v\262+h:\215\324gAx\010\374\021e\236\017\346\307\312\012`\ +\227\037\324\317\321\305P\001Y\254E\230\373\364YYAZ\363X\237\2033\266\030\ +\315\177\200\3322\265C\373\0332\237H\251G\331\025\340\344\357\220\263[e\201\ +\011GR\275\236"\363_\000^\312$\013\001\225M\200G\220\207\010\217=f\005\3307`\ +E\237W\011\010\3560\253\233:\010\213\336\006\016\273\362\024{B+\310\360\232\ +\003\272\350\314\242\262Kb*\360\021\352\342M\000\3378\247k\016\242\255\0312\ +\237(\207\221q%\015\230\251]\241\241\333\266\306\356\204\246\370\031\335\003\ +\245\230\305&A\261\300b\316UV\200}\203\306R\201\246p.\004];o\243\246\207pE\ +\3214\230\003\177\010\204zE\2645\256\351\'\010\261W\354_\022/\202\223\313\ +\250\177\361}\360X\014\245ud\216\022\3648\202\263\215\355X\356A[\001\004\335\ + \360X3\315}P\354\012C;\245\013\252\023A+\360\262\355\225\341\015M\021C\254o\ +C\234\346\026sm\362:\321\326X\003G\004^\002\202=\352N\312\024|:-\210-q\214\ +\375\005\2545\365|\210\345\006\247m\361\002\363\024\214k\332\031\375%\271\ +\220Xj\024\342\264\2607g?\224\025`\243I\326Rqu\306\260\031\241\241\333\017\ +\215\275\007M\340}\340\2400m\006\340\344q\252\265S,\024{\251\367\210Q\360@\ +\205\021qP\301p\014E \2144\366/i\002\3649\300\220\203h6>\012\355JaG\341\257\ +\034\033\011\032\205\317\002\301\246v\024\376$q2A\360\270\247:\231\030f\221c\ +\337\320\306\300=TV\000\337\370\002\266\244\366^,S8c\213\022\370\350\0045V\ +\3040_\031\266\011tQ&\341\364\375\302\307\323?\324v\005`\356\233Kl\211im\203\ +\323.8\355\211$\246FBe\177\003i<\311\360\242\014\314o\331,\326|[\001\2023\ +\252\244if\320\007\267\011\251\275(\363\340\240\212\202\246\201\023\032\257[\ +h\362\235+\354,2\254\203v(E\023\345<\012\034\353\007x\243\031Q\341\234\243\ +\013\2779Dl(8\206\220\362\222"\000\301 u\0264A\373NN&\036\373\256q\264G\315\ +\273\343"\304\012tr\301\355\0120n_b\357A\003\263\005\205\211\217.\312\276\ +\273x7_\246 \330\323v\005\026\023\000u\3174\005`\376s\375\223\246a\024\314\ +\036\241\262+\340(\027\311\247%\372\264\015ua\231\232\372\013B\333\265\002\ +\260v\002\361\222\021\007q\211\304f\357\305`"\020XT\356\202qM{\3535CtAwZ\263\ +\324\2564\251\237\243\353\205\034U\037\246\366\215h\353\214\332\267\034\013\ +\022\216\227\007v6\336\240\273\202\014\005\007\012\373\027\232\215O\003\217\ +\005\211\037\201bc\324H\004M\320#RV\000\210*\251\367\240A\367&\005.\215K\307\ +\025\255\240\356\004\262\272g\351\342\031\275^RArDW\024\245\217\307\000\363\ +\302\316\365\013\346\3547\001\336\341PCC\344\370Mb\273B\203\356^ \245\246\ +\345\217\006\365/\025\365/\340d\243\010\226\243\013\014\033\232\022aZQmI\344\ +XJ\314\015\304\037\353.eBL\026=\344u:\206]A\254\215\331c\220\232\242\000\233\ +\242\'\272^\360\260\246\033U\330\277\320XnP\341\364\213\246\347)54!\356r\255\ +\355\012\370\350\263\203y?\301\362\253\013\214K\354\364\\\011|U\221\307\260\ +\242\011\016J\322V\013/1\310\311\304\311\241\260\337\200\240\373"\350\'\001\ +\254\3104\266<1\326A[\000\217\312\322E\013x=\266C\204a\2348\227D\322\367\022\ +;\034\232\257\217\220\307\022\364\330\242\300\016\007\247\347\237>S}j\350\ +\263\256>W\250\303\241\301\335\310\333O@pK.$>=\247\226\207\006w]D\2604_?\225\ +V\200%-\025\023\036\335W\302\266I\207\014j=b\215\035N\222\200\352c0\035mY2\ +\330\001\020\026I\032\202\340\233\262?\201\260\314\351F\202\010\366Ta\377B\ +\243\275Gf\005\020\205W\032S#A}MZ\001\354r\012\210\212\354\255WCX\001\336\ +\3410L\026\004\365ur2\361\372+\335#\023\324#\216\265C\205\343\364)r2\021\354\ +\220\300.)l\201?\226\241\352+\354xp\232|J\004{)1W\322h\257\227\341\223\021\ +\232\321\177\025\330xWX\365\315A\276\365,\220\031\335i\021}\256\342E\210\301\ +-\270\360\233\3064O\203\273\224\232"\032\270\227\034\337~\321\255\327\352\ +\333\012lV\225]\001\333\256rl\212h\326\367\235\\HlyD\257\303h$_\012|?\226\ +\265@0\244\354\012\037b\214\336\217\031\372\374T\013\310c\011\006\177HMQ\216\ +MQ\213Z\2366\266<\213\3708\316\370\007\337]H\254\203h\326wA\023x\242\276aj4i\ +\002\277\002\271\241\264\023\370XX\001\336F\002\261\371e\2003\003NOy\350r\ +\351\216\333\025\360\215>8\271\312\202\360JZ\001|cQ"m\021*\367i,G\343\364>\ +\210\261 \365\0028\206/hKN<\266\001\326\206\206q\301\226^0..\002\214\240)p\ +\220_\264\221r\266%\362)\215\344g\310AD[\333P[\266\355X\256\007f\006y\234!\ +\363\247.^\306\026\350\217K\352_\012\354p\036\251\012\2462pGb\251Pb\203\327\ +\377&\000Mc\211\217(hN\367\014\210\252,\242N\250@\2432p\207\236\213\321\364\ +\334cV\000A\227R\022\017\261\306\035\241.\251\211o{\316\251\007\212B\3306\ +\204\22262\346\202\327\277*\354\201h\276~H\257\303h2\361"0i\265i\004\355\342\ +\353\260&v\215\373\202\370\024]x\004\'\227Y\230\016I\034\313\321\345\364\026\ +\265+\031\216L\366\311\247D[+0\207\011-*\007\350\016\'\306r4\244W\004\011\ +\206\324\224\300\232\277\205\217\'G\250\261\3120\275z\034\337*\3048D(\310\ +\353\304c\363t\235O\027es.\016\252\012\254\035\232\220\367#;\332[\244\347b\ +\204\312~z\014\326\302R\341\224\312/\032\271vC\320\0251\215L\366\271\375\011\ +@l\331\305\307`\204\333\'\215\355\033]\224]\321{\\\032\311/j+\000k\307\310\ +\247\304c\'\012_\207\321\315\331\006\200\320tM-\234\237\012\274y\247\241}\ +\010\311\242\252\232\222S\306\217@?\323\316\2149\354yg\322Y\376hJ\256\031?\002\262\ +\003s\330K\316W\247rV?\232\222\013&\036;~\354\200\246\313yu6\234!\247\327\ +\351\373\233\224\374\364w\250\270\351l\031\\\037\030?~v\326\015h\276\033?>9/\ +\316\363\337\360\355O\377\244\'y\347\2372\177\232K\363\307\270\340.o\360n\ +\336\303\373\371\030\037\344#\274s\324\035\\C<\016\363!g\234\017\360Q\336\ +\344>o\361\200\207<\3421Ox\312=~\311\357\370>\277\342?\371\003\277\341\307\ +\374\202o\363k\276\307\177\353\270\017\370a\375w\304O\370)?\343\217\374\236\ +\357\362[\276\303\177\360s\336\252\243Q\324G\335!\361Y>\307+\'\347/\316\012/\ +\3707\236\361E^\3626\237\340_\370\024\237\3463|\236O\362e\276\306\227\370W^\ +\361U\276\300\273\370+\337\340\277u\334C\274\027\377\036y\037\3374\012n\361\ +\317|\235\177\347OF\305\373Z\305[\347\205w\216z\311y6\035\004WJi%\025SB\271\ +\252\241\272U\217\352WcjP\215\250a5\256\006\324\250j*_\265T\240B\025\251X%*U\ +\277u\334\236\362\324\245\371\333\345wj\313xp_u\024<\347W\352\247\0323\334\ +\330Q\361\320\260\343\212\363\240\236\3710\277Q\307\352Bm\253k\265\247\016\ +\324\241:Rm~\242N\325\231zT\367jW\335\252\035\365C\235\253Y5\247r\265\242\ +\012\365Me\352\267\201\263\250\026\325\276\371\3331\376+U[\235\363m\303\213\ +\327\006\321\023\352\2479\350\027~\343|Q\347\006\325SjZu 3\243\346\325\244ZV\ +kjI}5~\254\214\037W\325\202\352R\257jC\015\251^\325\2476\325\226\372\254\326\ +\325w\365\244\3761p\376It\277\250g\243\234\243\271~\342\217\265\202\335\346\ +\230\225>p\264\336\2511M*J\315\264\320\256n\350n\335\243\373\365\230\036\324\ +\023\374T\215\350\216\037\207\365\270\036\320\243\272\251}\335\322\201\016u\ +\244c\375w\240\273\376\227\350T\307\246\030\363\364\275\361\340\236a\305\216\ +\017\017\015\242\217\214\212\017\352\325\351\000Fj\245\006\370\245\276\323\ +\373\372J\377\324\017\372F\037\353\013\275\255\257\365\236\356R\007\372P\037\ +\351^u\242O\365\231~\324\367zW\377\255d~\253o\365\216\2762G\254ti\342\360\ +\301\340\371\306\220\316\211a\306y\364\2422\321x\251\257\325\017}\256guC\315\ +\351\\\257\350BO\361o:\323\213\372V\015\350\322\370\261m\3748\241\277\350\ +\177A\306\231\322\323F\275\031\335o\025\354\034\363,\357\300\205T\334V\005\ +\237\327\313jR/\233\243^\323K\372\253\256\364\252^\320]\372Uo\350!\335\253\ +\227x\237\336\324[\372_\224q>\353u\023\203\201\211\302\216\202]\206r\346\315\ +1O\232$\370\3440=\300\267\325w=\257\237\364\213~6*:\206\373\225\334\326ZJ\ +\311\244\220\256l\310\037\252[\366\310~9&\377\336\214\363_\376\015\312\021\ +\271b\212\261s\243\340\253I\200\035\037\016\313c\365\342hs\320\343r@\216\312\ +\246\364\345\221j\311@\2062\222\261\234\346\211L\245\'/\345\235\334\227W\362\ +\247\334\324\377\342\002\343A\336\310Y>o*\235\015\223\243;>\354\034\363\214!\ +\357qy,/\344\266\354\257\001s-\367\344\201<\224G\362D\236\3123y\250\037\345\ +\275\334\225\267rG\376\265\002\343\227\252\240\037\362\207\334p:\036|29\372\ +\334\004\343\266\341\305Y\271o\340\262m\2748\'s\331\243Vd!\277\311L\216\250E\ +s\324\245l\313RO\310/rJ\376\325*\350\027K\265i9#s\223\375\316\345\000_\341\ +\256\236\227\223rY\256\311%\271\254;\007\375U\256\350J\032\300\030\025\027d\ +\227\354\240\372N\276\312\015\371Ww\372\255RmH\016\031\017v\024,x\307\207\ +\313\252){e\237\334\224[\362\263\\\257\275\270*\277\313\031\376$_\344\200z\ +\226\016\343\354_W\252\375\017\377\024\323\354\332\034\3627.\224dK\362Y3&\ +\330\232\251\347*Uh\2275\330\236\356f\213\332\223=lH\365\2631\366+\273\374ve\ +>\310\366\365\010\223l[\016\263\206\032\323\271\034g\023|\200E\006.\243lA5\ +\331\260QqC\371\254\305^\345\257\355\361\233J\006,d\221\361\340\241\3523\204\ +\023\033\037\036\233\354\222\260m\235\262\243:\026\347\271\'=\366(/\331\035\ +\373\325]~S\311}v\305\236\365Ov\244\004k\363\007\266\244o\330\201\001\3131\ +\273`\'\262K\315\363mvm\016\372\222\355\261\203\177\227\222\207\354\210\235\ +\260S\243\340\265\223\333\314cm9\252\034\261\307\256\344\254i\265\266\024\027\241^W\ +Jh\361\3161)\005\023B\\\030.\\\320Kl\330x\360L\272b\303\264\006C\252\343\303\ +]9\301\032bNu\213\036\321/\306\304\240\030\021\303\357\255\344\270\030Q\003\ +\302D\240\032\025\246x`Mqh\024<2U\267/Z\242\317t\202\2018\323\241\210D,\022\ +\221\012O\\\212\273\367Vr_t\351\253Z\275m\203\343\036\266\243\216\364O\321\ +\253\036\304\2158\026\027\306\207\333\202\213k\261\'\016\304\2418\022\'\342T\ +\234\211G\361\216J\336\213]\341\231\312\346V\354\010\323C\213;y.6Y\233\315\ +\212\271Z\215\\\254\210\302\034\3637\221\211E\361\312K\321\026\023\342\213\ +\230zO%\247\305\214\230\027\015i0l"\360^N\212s\323G/\2135\253\304\222\370**\ +\261*\026D\227x\025\033bH\364\212>\261)\336\221\'\267\304g\261.\326\370w1)\ +\332l\211\373&\006\237\304\313\177Q\341Y8.w\225\253]\3512W\270\256\333p\273\ +\335w\244\240\036\267\337\035sw\345\022\257\330\254\332T\203\356\210;\374\ +\337\024\030w\007\334QwB4]\337m\271\201\033\272\221\033\273\357t\334\211\233\ +\272\035\345<\367\322m\2519u\347\356\377\017[_\271?\335\007\267O\334\270\307\ +\356\205\273\355^\273{\357\245\344\201Q\355\320=r\027\330\2668qO\335\263\177\ +\260\361\243{\357\356\272\267\356\216\373\303=wg\335\271\367R2wO\334.\266\ +\342\366\210\302\375\346f\377\313\266\213n\351\266\335\011\367\213;\345N\273\ +3\356\274\373.JN\272\313n\277Xs\027\370\222\373\365\237\332\262rW\335\005\ +\267\313}u7\334!\367\035\320\335\353\366\272\225\350s7\335-\367\363?\275\341\ +\272\373\335}r_\334g\327i\274\003\272yC5tC6Lj\376K\333\271\215F\243\273\321\ +\323\350o\274\303q\2175\006\033#\215\341\306_\017\223\361\306@c\264\321|\017\ +%\375F\313\374\375b\353\326\010\033Q\343]\200\363{\377\302\377\013J\276\373p\ +\340\217\222\177\224\374\243\344\037%\377(\371!\224\344\377\011\313\000?\327\ +' )) def getTestStar2Bitmap(): return wxBitmapFromXPMData(getTestStar2Data()) @@ -1537,30 +1525,31 @@ def getTestStar2Image(): #---------------------------------------------------------------------- def getTestMaskData(): return cPickle.loads(zlib.decompress( -"x\332\265\231\261V\3030\014E\367~\205\2662\351$L\314,|@W\226\236\216t\340\ -\260\361\367\2644mbK\357I\216S\037\246\330\276\265-\371I2/\347\357qw\330\277\ -\015r\371{\225q\277;\036\366\3629\214\343I>~\216\277\3430\374\177\322\333\ -\247\367\363\361\364u\033si\272l\362h\3403oMPB-\272#hEU\202\234\273\333\240\ -\0220\247\021MPi\205\012\230l\241t\210bh\215X03\0362Ck\223\334\006\324\343\ -\275\3750\250,\227Y\314\353\203\012\235\207\314\231\200\372n\300\240\365nJ\ -\250p\250r\257u\241\312\240\022C\305\336\250\014T\003\250\271\373)hR],TR\302\ -r\367\260\030\252-\320\345!\306+\225\334B\311\031\324\327\324:\035\347\232\ -\021\276\364IN\213\360nfh\243\300a\357\277~\246P\276{\034S&\250\035\035B\261\ -\372\353&\320\272\013A5\202\262\276\264\314$$%N\011(6\310S\240\222\371\271\020*9+G\326\0173\244\226=\270P\ -R\325\031\027!7j\351\343@\227l\011TD\011q\241\202K\031\2648\243\255&\234\370\ -)Z\231\011\240\216\352{\023\324w#\273\001\\\232\303\\\334&\252\262\026\352\ -\230\011\224\327\333@e-\024\325\267\217\230\275\002\2126\352\217\003\326W%5N\ -8\262\206\322\242\311P\301H\247\342\013\260\250\374\365\241X}\224\274\001xFH\ -@\241\206\201\307\026\222\365\305P\254\226\011(\022\343\016\250M+\372\241$e\ -\352\206\246\336\270\034((\263I|\203Q\255\270\373\231\205R\227r_z\221\231\ -\242\027 PH\000\377\211\216\317\217\350N\305\247\032@\303w\364\000\252\000Z\ -\327\302k\240\366\031\230V*\035\320\326\177\036\020\367I,4\015ut9S\233z\242\ -\234K\361i\301k\314-\033@\343\366\024h\356H\257P\375\003\215B*\276" )) +'x\332\265\2311r\0021\014E\373\234\342\317\244 \225&\244J\235"\027\340\004\ +\014e(r\377*@\026vm\351\177\311,x\322\354\332\373\260-\371Kr\336\216\277\333\ +\227\335\346\363\035\247\277\017l7/\373\335\306p\300\327q\177\370\271<\341\ +\364\364\372}i\3233`\313\206[#\257u\033\202\012j\323\235A;\252\011\344\334=\ +\006E\302\234F\014A1\012\005\371\330C\345\020\343\320\036\261`V\326\357iE:\244\ +\311\273.\002\235\026\224\207\244\260o\202Z\224h\0049\304\032(\325\247\232\ +\302^\241\322\036\205\020\022C\333L\002%q*@\271A\236\002E\345\347R(jV\316\ +\254\237fH#k\010\241\242\252s."N\324\322\307\211.\371\022\250\211\022\010\ +\241\340\245\014\233\234\323V\027N\342\024\255\315\004XG\367~\010\032\273\ +\221_\000/\315i.\356\023U\334\013\015\314D\312\353\307@q/\224\325\267\267\ +\230}\007\224-4\036G\254o&j\234td\017\225E\223\243\222\221A\305\227`Y\371\ +\033C\271\372\230\270\003\210\214P\200R\015#\227-"\353\313\241\\-\013P&\306+\ +\240>\255X\017\025)\323jh\351\216+\200\2222[\3047\032\325\232\263_\231\250t\ +\251\360\246\227\231)\273\001"\205\004\361\237l\373\342\210\036T|f\0114\275G\ +O\240F\240}-|\017\324_\003\313Je\005t\364\237\007\302}\012\023-C\003]\256\ +\324\246\221(\327R|Y\360:s\343\001\320\274=\005Z\333\3223\324\376\000\327f(\ +\305' )) def getTestMaskBitmap(): return wxBitmapFromXPMData(getTestMaskData()) @@ -1571,113 +1560,114 @@ def getTestMaskImage(): #---------------------------------------------------------------------- def getTest2Data(): return cPickle.loads(zlib.decompress( -'x\332\305\232\373[\323J\023\307\177?\177\305p\277\311\220\244I\223\000\362\ -\240\240rQ.\242\270\036^\201\266IQA\020D\020o\177\373\231f3\263I\233^\200\ -\352\333=z\340\373\354\356|vfvv\223:~\362\331\376gg\254\354\002\375\347\330\ -\0018c\377Tv\306\000\376g\331v\015\036\237|\215\023\001Sa\250^/\225,+\321T\ -\252\275\215ON\316\256\023\351\314t\263\254r9\3216E\253\225\234t\350\224h~\ -\311N\265E\321\\\262\240\265!\321l\321\206Y\213=\'J\265\021\326\242\222SI\ -\265Q\326j\201\023\244\332\244h\236\343\247\332C\243Y\226\253\227;m\306Z\226\ -\247\373\315\031\033\244\271\2116kXH\253&\332\202a&\037\350\261\017\314\332H\ -\263\023m\336\370\2004\355w\333\370\2124m\303\021\033e\262QK\264\022k>\365+\ -\351\371\\\326\002\262[*%\232\307ZH\236/U\022\255\314Z\205b\344\352\030\371\ -\262^\032\353F\211\026\260V&/;zm\241\330\015i>\2756\213\265*\331p\375D;\227\ -\371\310\206\247\327v\315\032\271\312r\364\330X\264*iz\275\027b\203\374\354\ -\350x\\\312:hl)L\264\033\326\\\362\201\255\373}\225\030Q?O\373\340\203\370\ -\264"\371\367Y\346+\211_*2\037\001\332z\275_\304\007\015f\355\253H\326[u\274\ -t\276\272\214%\013\266\236\357H4\312![\307\355\275\304\310\267\253\351\330\ -\217&\346\215\250\'\332\261\311\215:\347\351\211h^\235\355~g\255D~\266\265_\ -\276\211O#\233\327[3>\250\363\376\270\222\274\012\3430\325\252\342?7rS\355Tb\ -I\237T\373$\375\374\210\371^\310|\364I\265\015\261\033\325y\257>\026\277\224\ --\356\267\313\032\271\331\012\365:\226LN\326\270F\374+q\363C\266\373H|\032\ -\006\274\216\035\311q\257\302\276Z\026\346 \342z\360T\374W\2638\036\317\204\ -\317\027\276\025\311\003\267\314~Y\023?\327<\366\313\272\260x\001\333}.\353\ -\250\324\330\367[\246\036\324y\276U\341\363"\036\373:\023_\266\3616\223W\314\ -\367J\354\006\222W/%Oc\247\234jOL\314\035\036\373\306\304H\366\307\266\251%\ -\001\373~\300\354_\217k\361oa\241\205\244\332\276\251M>3\317\230\032[\343\ -\265\215\233\272\0263\337\204\251\261\021\0373\007\246\026\3278n\207\231\375\ -\226\346\325\340\230\331\253\215\303b\260\321\357\235\331\3476\347\337\236\ -\251\021\016\347\313\017\231\217\022?\325~\231\332\031\262_~\232ZWe\015P\346\ -\213\330/\310\032\005\227}\240\320\324+\366\325\031J\255\2639\2377Ql8\354\ -\203)\024_I\334\026Qj\247\3071\0372\363\371\235G\311\361\200\363\300\226\261%\ -\227\327\346\210\026\270\334\257dXj\354{W\372\321\246N5\317\254#d\273eYoM\ -\326\353K\314]\271o\004\254\325Kuf\011E\253\3269F\226\314GE"\325\316E\263l\ -\266{-\353\265m\366_,\363yro\272\220u\204.\367\273\224<\010m\266q#>\260\245\ -\036|M\265g\027\225\033\236\357\203\314\347\270r^\032\033Rs*\022\243\310\346\ -X~A\271[H\356F\230\251\355u}\267\250g\265H\237\373G\271~\372\036\361>\253\ -\325\002}^\346\372y\372\2744,e\316\323\023\303R\341\230\177\227uD\262\007\ -\277e\347\363\3659]\313\331\3256\256rv5sU\374\034\373\354\227S\3613%4\237\ -\227\302g\227\331\317/$\327\312!\307c#k#\275\207=\226\334\240\203\201\317\ -\313\\?\255-\311\236\246\017\237\227\302\347\370\034\313G\222W\245\200c\264\ -\223\233O\337\327\226\263Zz\007~\232\325\002}\357|&\363\371\001\327\260\025a\ -\251Ty\177\254I}qbfY\317\331\325~~\236\263\253\343\261\225\325B}\257[\025\ -\277\204\036\347\375\353\334|\372\036\3616\253\225\265O_e\265J]\237\227Y-\ -\326,Odm\325\200}\372FbY/s\016m\213\237\313>\307r \307\242\327\361;\227k\232\ -o?\227k\332\2473\271\\\323\332\270\370/\2129\017&\244\036\020\014\237\227R\ -\233j\021\327\323C\211\207_\365\371\274\224\375aQ\210\322\363R\264\270\302\ -\371\274\'v\203\230k\311\017\321\250#\237\227b\2276!\237\227\302\027\327y>P<\ -\326\216y/ k\204\314kS\254U\335*\357\2433\326\350*\305k\333d\255\036\3269\ -\017\246X#W\311y)\375\354:\333\035b-\254\206\034\337a\326\002+\340Z<"v\235\ -\012\347\356\250\214\255\204\354\203I\225\211[U\357\243\207Y-\326\317\020\ -\323\254Q\272\360\236\231\313\366\253\351\234\2345Z\310k[`\315\243\017\237\ -\227\2429\036\363\315\263\346V\\\346\263\305\007A\235c\351\310X:\224\371\274\ -\224x\2045\266\353\212V\255\261\257\274,s\372\374[\316j\276\336\253~V\013\ -\323\3632\2636\366A(>u\344\276fe\307\326\365>:\317\214\345\365^\033-\340\365\ -\306J\356\242r\016^d\306\362z/\2636\242R\372\016\344\377\373\271\023\004vi\ -\367\200\3506\035\336\262\365\015\242\321T\332\360\016\355\226\020\355\021\ -\316\322vW\224{B\250\014B\026\305\364\330\204)XL\233\352\320\356\010Q\004\ -\220\367\311"\014\3010\214\300(L&\277?L\3324\314\301,,\300\003\230\007[\372w\ -\366H\033\210b\017\350\237l2\340\024\256\267D\315\005\017\312\340\'0\016\365\ -\2643\030\355\202T\010\241:\000\250\036Z\000a\002c\301y\012\242:fK\001D\221\ -\027z\007\340v\0151\\\300\245\200t\302\350\031B\335\241\335\010\310W\372\355\ -C7\210n\331p\367\246A>\323O\303m1\3768\204\202\012\201|\241\377G\205\030\005\ -\020\375Gh\264:\034\321\337\357\333bt\2010\023}\204c8\241?\037o\011\240\307}\ -\247\237\276\265\301\350\002a\246\252\301\025T\341\024>\301\013\330\270\005\ -\302\006\365\377D\343\252\364\363\3436\030\035!x\242\335\244-\301\277\360\ -\010v`\231V\326\033\200\036\267Lc\036\321\330%x\012\317\0121:@\344\247\332\ -\245iV`\015\326\341997\353\352\255L\313\007\213G\256\323\270\025\032\277\012\ -\257\341-a\274\202\227\360\004\3364A\014\266B\264N\265\015\003\360\033\366a\ -\206\214i\200-\030\207\0118 E\267\003\372m\234\324\217M#\367i\334\000\215? \ -\374C\302\030\203w\260G\'\217\201\030,\366D+\304>\374\240\306\020\273Mm\237\ -\3326\374\202\2374\325\025eP\273\221\210\207\240\360\0147q\012\337t\016\207\ -\352\010\261\333\246\015\300"\016\3410\216\340(\326\332\342#N\342C\234\3069\ -\\\274;\304n\2076\213\013\370\000\347\011\343\212\366E;\210f_\024B\250\016\ -\020\273]\232\215\016a\014\323T[m \232}Qp\200\335\016\242\021\200\274\342\ -\240M\336\030\302\237\224\242\355!\262\276(\204P\035!\3663[v;M\305\022\3461\ -\\\\D\017\215\332\014\241}Q\306w\340\343\324\335 f @]?\017dS\206\031\014\213\ - \264/:A\034\3029^\343(\304Xp\345\357\005b+S\246\216[\252\302.\\\340,\256\ -\301pGO *\274\304\033\034j}\356\000\370\212\275A\264\207\335\205\005\374\200\ -\215\342\324\031\3423V\360\013\016C\204-\217\201\275z\342~\020&+\352x\364g \ -\272\207\303d\305{\374\330?\210lb\316\342\005\036\343I\027\010\304\357\370\ -\015kx\325/\210\346J\361\033\252x\372w!Zk\346\'|\201\253\320\015b\243_\020Ee\ -\373qzzt\032\271\213\273\375\202hFp\323\003l)9G\377\012D3\202\203\026\376\ -\333\365(\357+DQ\030\036\321\236\350|\2511\020;\270\214O\357\267E\213\020\ -\236\341\012\256a\321\365\256\010b\035\237\343\026\026\026+h\013\261\016\253\ -\270\212|\321\335\315U\310\037`2\241\333H\016\306k|\213\257\360%F\267\201\ -\330\241\311\3263W~\326\237\340\033\334\316dB\367\221\032b\000\177\343>\316\ -\310):\330\011B?\302\214\343\004=9,5\216n\334\020#\023x\200\2078\206\357\360\ -\024\366\232\020\370\241\340\007e\311\022\205\342\027\232\307&\314e\204\334\ -\266;C\374\304\011:\345O\351I\012\324\004\376D~*\333\243\023Y\2513\265\004k\ -\270\251\212Fn\252Q\272\336\234\302\224ZT!f\217/\223\021\205/S\213\002rE^\ -\030RCd\356*Y\017\273\372\005VqX\215\250O\005\317ef\334\250\312\006\213\257w\ -\223\352\241\212z\2030\327\271i5\255\032\317Q\307\231\244\\\241{f>\351\212\ -\306\255\000\337\300s\027]u\205m^+\317*h\263;\026\324\003\245\237\243\262W]\ -\033\371\351\252\355\375B\315\023\306\250Z\006[\345\257\271Q{\210YU\274"\363\ -,j\014\254\022\202~\316\2443B-\000\355\245\342V$\036\ +\217,i\314\213\333\3216\012qA\300\326\365\214$J\004\354\332\252\224\231\343\ +\275\365R\346\305}\345 \353\217\026lk\243Q\316-\033\033\027\332F1.\212\227\ +\347\326F\205\327\262`\275T\362Zp\316A\246\220\031\225]-(\307e\261q\315^H%\ +\307\3510k\215&\034\302\233T\300\244\'\251\200\335\036\247\202\002\'\235\251\ +\354D\334:\026,\341\304=JU\270<\300\246\245Y\3760\247e\340\311\362\027\331(m\ +B\336l\024\357m\301\225\232\373\310\371\341\371\236\021\314p\247\013m\251\ +\237qJ\025\312\0053\343\015w\007\257 *#\034d\257(\202I4\035W8\226\271\324\ +\213%i\322\001\207\220\024r\305\232`p\214S\312q)u\0075\2726\032\320\307\250\ +\234rO.\347\305\350On\260\305\212\030\2755\021\013E\260\312\253\015B\2611c\ +\232\264+[9\240g\004\264V#@.\017\332mIKF\367<\351A\243\3546\250\330\323\3034\ +\003\333\351\3268\352\345Dl \307\203r\337\010\206\265\227\320\011\355\371"\ +\335AB\270`\332\270+\202\002g\241\357\311\342v\315F\305\322\371\337s\273 \ +\005W\307t\354\225\341\310\211\015\227K,LDe\230\343\221\213\354\342\214QOf\ +\370\214N\265.\205\314\345\221xR\246\3378\204eK\032rU\346\0221\272\311\011\ +\223/\210\215!\223\226\366\024\013y\367)^\036\237\036\016p\324\351H\342\362\ +\030\341m\250\224\244\027\256p\200\242@8~s\200(A\214`\236\275P\332\346\2719~\ +19F^\270\324\237\361\316\321\307\250\0249a\242P\214\346L\227\242<5\207\005\ +\007\310\265g\345\2059+])\017\217\023\327\017\244\220o\330KT\021\243\267|x\ +\272\256\010\224V)\371%Q9g/\364\221\266\305\361\250\330\316\377\2077\233\372\ +\205\021|\3452\255\235\267\334-\'\315-\307\0230e\216\002{x\316h\267\264-2\ +\343\304\034I\211\270}\303eZ\210d\306\'m\203.[bc^\333\360\213\276\244\345;\ +\305\021\263\327\257c9\305\250\352\270\220\315\276$b\364\267i\0066\371\037\ +\263J\301\036|s\246\241\370Rs%\336\375r %\026J\001\211\321\212\211\272\275~-\ +\230x\320\316U\370\266\245\005\305\240(F#\305\034\366\364\270\342\335\2474\ +\365Xe\205\203L~\245I3\007\265\030#8\342\215*y2cO\252R\214\216s\377(WD0\317\ +\351@\037#\370\314\253\215d\371\203c\034u\207b\314\315\0219\204INJ\0148\371k\ +NX\360\226\275\204\0251Zd/\271PT\276\230\255\264\215m\210\227_\212\344l\370\ +\016&a\034\227\227\357ss,\3052\343\302pP\211qEE\\\373\245Df\034pyT\012\262\ +\015?\264J\216T\\>\355\261\366\ +\223\223\237\002"\033\305\025\345U\304(\374\237?\367\202\300.\343\001\020\ +\335\314\341\035G\337 jC\231\201\367\030w\204h\217pa\306}Q\036\010\241\352\ +\020\352Q\322\031\3530\005Kf\250\016\343\236\020Y\000\2151Y\202!\030\206\021\ +\030\205I\375\373\202\0363\360\010\346`\021\246a\036\\;\277sD\332@dG\200\177\ +r\311\201\227\271\336\034\015\037\002\310CA\303x4\323\255\303h\267I\231\020\ +\252\003\200\352a\204\020i\030\007.\015\210\352\230-\031\020YQ\350\035@\306-\ +\274\203+\270\266 \2350z\206P\367\030\337-\310W\372\355c7\210n\331p\377\301 \ +\237\351\247\341\266\030\177\035B\301>\201|\241\377\036ebd@\364\037\2416\336\ +\3031\375\371\241-F\027\210\324\320\011\234\302\'\372\367\344\216\000\254\ +\367\203~\372\326\006\243\013Dj\352\020n\340\000\316\341\014\236\301\332\035\ +\020\326h\376\031\351\035\320\317\2456\030\035!\304PU\217\030\336@\021\266\ +\240L+\353\015\200\365\312\244S$\335\030\022x\234\211\321\001\242\321T\225\ +\314,\303\023X\205\247\024\334\372Po\324\215\306\315\022\315U\322[&\375\025x\ +\011\257\011\343\005<\207\012\274j\202\030l\205h5\265\011\003\360\007v`\226\ +\2341\300\006\214\303\004\354\222\204\307.\3756N\322\223&\315\035\322\033 \ +\375]\302\337#\2141\330\206\267t\362\244\020\203\331\221h\205\330\201\2374\ +\004\242\3324vhl\302o\240\353(\336P\006\265\323D\334\003\205\027\270\216S\ +\370\252\363v\250\216\020\3256c\000\226p\010\207q\004G\361\260->\342$.\340\ +\014>\302\245\373CT;\2149\\\304i\234\'\214\033\252\213v\020\315\261\310\204P\ +\035 \252]\206\213\036a\014\223\251\2156\020\315\261\3108\300\356\006Q\333\ +\200F\211\207.Ec\010\177Q\212\266\207\250\217E&\204\352\010\261SW\262\233&\ +\025s\330\210\341\343\022\006\230J\233!8\026y\334\206\002N\335\017b\026B\344\ +\376\271k\2132\252\303p\010\202c\321\011b\017.\361\026G\341\035f\\\371{\201\ +\330\250kS\247-]\241\012W8\207O`\270c$\020\025^\343w\034j}\356\000\370\212\ +\275A\264\207\255\302"~\304Zs\352\014\361\031\367\361\013\016\303\021\266<\ +\006\366\032\211\207A\244Y\361\036\217\377\016D\367\355H\263\342\003\236\364\ +\017\242>1\347\360\012O\361S\027\010\304\037\370\015\017\361\246_\020\315\ +\235\342\017\034\340\371\277\205h\355\231g\370\014W\240\033\304Z\277 \262\ +\332v\311\234\036\2354\253X\355\027D3\202o\016\260X\237\243\377\004\242\031\ +\301C\007\337t=\312\373\012\221\265\015E\252\211\316\227\232\024b\013\313\ +\230<\254D\263\020\036\3432>\301\254\353]\026\304*>\305\015\314lV\320\026b\ +\025Vp\005\345\242[m\350\220?!\315\204n\232\262\031/\3615\276\300\347xt\027\ +\210-2\266Zw\345\027y\005_\341f]&t\327d\210\001\374\203;8kO\321\301N\020\374\ +\0103\216\023\364\344\020\327\216n\\\263N&p\027\367p\014\267\361\034\3366!\ +\310C\301O\312\222\230\266\3427\246\217M\330\220\021\366\266\335\031\342\027\ +N\320)\177NOR\240&\360\027\312S\331[:\221\225\272P1<\301u\225\245\271\256F\ +\351zs\016SjIEX\177|\245\031\221\37125kCn(\012Cj\210\334\335\350\365H\250\ +\237\341\001\016\253\021u\226\361\\\226\352\215\252\372\315\222\353\335\244Z\ +PG\275A\244\327\271\0315\243j\317Q\247uI\271L\367\314\306\244\313\322[\006\ +\271\2017\\t\325\015\266y\255<\247\240Mu,\252i\305\317Q\365W]\027\345\351\ +\252\355\375B\315\023\306\250*\203\253\032\257\271G\355!\346T\366\212\322g\ +\321\324\301\012!\360s\346i[\210e\360(\206C\026"\275\360\267y\301^C\310\216E\ +\375Sy}\361m\352\'\356\233\214\027\006\251\336\252\235\323z\335\317(Q\206\ +\230k\311\364\326\367\023\374\346!\247vI.\215\272u\260\236\257dN\343\003\261\ +|\006\263"\221\205\321\372\246\246\365\306\335\376M\015\317\331kz5\320q;\262\ +1\036:\030\241\376%I\017\020\375\305hE\350\021\242\177\030\235\020\272B\364\ +\007#\013\241\031b\260\023\304\3031V\351\221o\214\322\261\365\205Y\327\352\ +\350\027\306\000\006*\257\266\251"\332!\364\260\035\017\002\321\000\0055\251\ +\336RQ~\354\376}G7\2109\025\336\011\344\222\232\363\005\326\000\036\321iy\ +\203\353\275|\351\322\035\242w\220}z\354\277\305H\255#\0038\012:~9\227y\200u\ +\003\271T\267\2310\357\324;Us\376\005\277\343(\214\200\000\264~\345\371`\010\ +\006\271"\224Y\272\250^\253\017\364\364 c\022j\316\207a\226\236\'\216\353\ +\000\032!\240?\0202\034uL\356\032G\263\363V\214\036\276+\357\035\341>_\316co\ +_\330\377M\204;\374\255\201\177\213\240!\360\177W\355\027J' )) def getTest2Bitmap(): return wxBitmapFromXPMData(getTest2Data()) @@ -1688,12 +1678,12 @@ def getTest2Image(): #---------------------------------------------------------------------- def getBulb1Data(): return cPickle.loads(zlib.decompress( -'x\332\323\310)0\344\012V71P\000"c\005Cu\256\304`u\205\030\003C\303d\005\247\ -\234\322T0_\017\306OL\316\006\013D@\004\334\213\022+\015\015\014 z\210\004#U\ -\261\036\010\020\247XO/\002\0040\224cS\014Q\012VNP1B-\272jL\305\310j\321Tc(F\ -U\213\252\032]1\272Z\024\325tS\214\251\026Y\3650P>I\367\345;\007\2771\030\213\307\317+.~\271\ -\377\270\323\265{=\303z\015\340\272\323|\355\340\323:\267\300\373\357\374\ -\357\254\345Q/#3X\037\036M2\372\270}\361#\311\343\333}^\276yp\321W\374\013\ -\203\274\202:Z\254\377\361h\214\342!P&\230\376n\262N\337OU E\026lA\324\202.k\ -&\276\370\266\017\245\034\201\016\3241\224Q\315\305\217@;&"\204*\033\210F\ -\242\032B:\000A\015\371>\263\206{\327{\256\012\220\037\240\341$x\007\022\211\ -\262\015\010\005@\246\2440\364E(.\240\373pa\015\205\225e\237\\\225\240\\eJ\ -\225B\343\030T\202a\241\012\020\201\252\324R\250"\204J\031=\203\\\225\233\ -\270POTTFT\205I\012Q\217R[\2510A\276{\3617\347&H\307PR\245\251\251B\332\230\ -\332\252x\230\241\257\225\0045\263\3712\307:T~O-d\013\001=+c\250\177\000>E&[\ -' )) +'x\332\215\222=k\303@\014\206\367\374\012\301\015.\010\214\323.\036\217\026\ +\272f\310\3425dl@\375\377S\357$\335\207|r\361\033\203y\223\307\217\304\305o\ +\257\337\353\345>}\274C\272V\270N\227\307}"x\302\347\353\361\374\341vK-,)\ +\353\302\035r\377\346p\017\345w\355\230\373\327\222?\334c\356\353\262\226\ +\347g\3519\3347\361\325\016\363\274\015\201\026\221x\020y\320-e\343\213o\307\ +P\313\031\350\3048\206:\312]\374\014t`"B\030\262\203(\022\215\020\322\011\ +\010F(\317\013)<7\335{U\201\362\027\0308\015>\200D\242\254\003\241\000\310\ +\224\014,\363*T\027\320}x\340\010\225\225e\237^\325\240^\025\254J\241\030\ +\213J04\252\002\021\250J-FU!T*\350\031\364\252\336\304\003\365DE\025DeL2\020\ +\365(u*\031\023\364\273\233\277\2717A;\006KY\223\253B\332\231|U=\3142\317K\ +\203\334\354\336\3148\206\354\373\344!{\010\350\277a\014\315\177-\005\037i' )) def getCalendarBitmap(): return wxBitmapFromXPMData(getCalendarData()) @@ -1747,10 +1736,10 @@ def getCalendarImage(): #---------------------------------------------------------------------- def getDbDecData(): return cPickle.loads(zlib.decompress( -'x\332\323\310)0\344\012V76R\000"#\005Cu\256\304`u\205\030\003C\303d\005\345\ -d\003\020\004\013\351A\204\234rJS!J\010\000\204"=$\022\227"==\004\211K\221\ -\036XZ\017\257"=\260\264\036^Ez`i=\004\300\242H\017\003\220k\022qn"\316w\304\ -\205\023q!N\\\334\215*\032U4\024\025\351\001\000!\344\263\037' )) +'x\332\323\310)0\344\012V76R\000"#\005Cu\256\304`u=\205d\005e\003 ps\003\363\ +\025@|g\003\020\204\362\361\003\204"=$\022\227"==\004\211K\221\036XZ\017\257\ +"=\260\264\036^Ez`i=\004\300\242H\017\003\220k\022qn"\316w\304\205\023q!N\\\ +\334\215*\032U4\024\025\351\001\000H\256\261\012' )) def getDbDecBitmap(): return wxBitmapFromXPMData(getDbDecData()) @@ -1761,10 +1750,10 @@ def getDbDecImage(): #---------------------------------------------------------------------- def getDecData(): return cPickle.loads(zlib.decompress( -'x\332\323\310)0\344\012V76R\000"#\005Cu\256\304`u\205\030\003C\303d\005\345\ -d\003\020\004\013\351A\205\014\014,\014\014 B\012\004\000\252"="\024\351\021\ -\241H\217\010EzD(\322C\000\234\212\364\210QD\224I\304\271\2118\337\021\027N\ -\304\2058qq7\252hT\321PS\244\007\000\317\272\260\352' )) +'x\332\323\310)0\344\012V76R\000"#\005Cu\256\304`u\005\205d\005eg\003\020\ +\004\363\365@|\003\003\013\003\003\003\250<~\200\252H\217\010EzD(\322#B\221\ +\036\021\212\364\020\000\247"=b\024\021e\022qn"\316w\304\205\023q!N\\\334\ +\215*\032U4\324\024\351\001\000I\272\256\356' )) def getDecBitmap(): return wxBitmapFromXPMData(getDecData()) @@ -1775,9 +1764,9 @@ def getDecImage(): #---------------------------------------------------------------------- def getPtData(): return cPickle.loads(zlib.decompress( -'x\332\323\310)0\344\012V76R\000"#\005Cu\256\304`u\205\030\003C\303d\005\345\ -d\003\020\004\013\351A\205,\014,\014\014 B\012\004\300\300(\322C\001#R\321`\ -\214\226QE\243\212\350\252H\017\000%#\263Z' )) +'x\332\323\310)0\344\012V76R\000"#\005Cu\256\304`u\005\205d\005eg\003\020\ +\004\363\365@|\013\003\013\003\003\003\250<~00\212\364P\300\210T4\030\243eT\ +\321\250"\272*\322\003\000\237\024\261^' )) def getPtBitmap(): return wxBitmapFromXPMData(getPtData()) @@ -1788,10 +1777,10 @@ def getPtImage(): #---------------------------------------------------------------------- def getDbIncData(): return cPickle.loads(zlib.decompress( -'x\332\323\310)0\344\012V76R\000"#\005Cu\256\304`u\205\030\003C\303d\005\345\ -d\003\020\004\013\351A\204\234rJS!J\010\000$Ezp\002\237"=\030\201W\221\036\ -\224 B\221\036vEzp\240\240\207M\025\232"\230ZrM"\312M$\371\216\230p"&\304\ -\211\212\273QE\243\212\206\240"=\000\033\215\262\331' )) +'x\332\323\310)0\344\012V76R\000"#\005Cu\256\304`u=\205d\005e\003 ps\003\363\ +\025@|g\003\020\204\362\361\003$Ezp\002\237"=\030\201W\221\036\224 B\221\036\ +vEzp\240\240\207M\025\232"\230ZrM"\312M$\371\216\230p"&\304\211\212\273QE\ +\243\212\206\240"=\000BW\260\304' )) def getDbIncBitmap(): return wxBitmapFromXPMData(getDbIncData()) @@ -1802,10 +1791,10 @@ def getDbIncImage(): #---------------------------------------------------------------------- def getIncData(): return cPickle.loads(zlib.decompress( -'x\332\323\310)0\344\012V76R\000"#\005Cu\256\304`u\205\030\003C\303d\005\345\ -d\003\020\004\013\351A\205\014\014,\014\014 B\012\004\000\262"=\242\024\351\ -\021\245H\217(Ezx\024\351!\000Q\212\364(3\211(7\221\344;j\205\270\302\250\ -\242QE\303S\221\036\000\326\202\260\352' )) +'x\332\323\310)0\344\012V76R\000"#\005Cu\256\304`u\005\205d\005eg\003\020\ +\004\363\365@|\003\003\013\003\003\003\250<~\200\254H\217(EzD)\322#J\221\036\ +\036Ez\010@\224"=\312L"\312M$\371\216Z!\2560\252hT\321\360T\244\007\000P\202\ +\256\356' )) def getIncBitmap(): return wxBitmapFromXPMData(getIncData()) @@ -1816,10 +1805,10 @@ def getIncImage(): #---------------------------------------------------------------------- def getNewData(): return cPickle.loads(zlib.decompress( -'x\332\323\310)0\344\012V74S04U0V0T\347J\014VW\210104LV\360\313\317K\005\363\ -\365 |\247\234\304\344l\260@\004D\300\275(\261\322\320\300\000\242\007\015\ -\300\004\365\240\000U0\002\014 \242\350\202\021z\330T\202\324\242\011\202\ -\304\007\267 \002 \004\321CI\017\000\315|U\331' )) +'x\332\323\310)0\344\012V74S04U0V0T\347J\014V\327SHVp\312IL\316\006\363"\200\ +\2468\ -\3372\004\205\313\222\222\274\262\210\312\351\031\337\354}\246Qi7\370\301\ -\257DM\032\004\360\207\310\027\033\3550\3246\233\240\210 \001\232\357G\220\ -\260\236\032\315B\373\022%\325\314\321b(RY\231Y\233\341\217\025,\331XH\331\ -\022>\244;Z\373' )) +'x\332m\220\273\016\2030\014Ew\276\302R\2070]%\003\025s\207\216e`\361\212\ +\020S\021\356\377O\245Nm\302\343F\031\316\211\355H\256\347O\252\372\220\356\ +\224\032j(\205j\350\003h\244\307<\214o%Y\351\366\324(w?nc\033cT\246\225_\262\ +L\012l\305\376\270\317A\0028I\350\305E;L\3466\233\220%X\0309\333G\020\376\ +\237R\232\343c%<\305\314\316bR\244p>\263t&w\316\245\347b!\276%|\001s\177U\ +\267' )) def getOpenBitmap(): return wxBitmapFromXPMData(getOpenData()) @@ -1847,12 +1835,11 @@ def getOpenImage(): #---------------------------------------------------------------------- def getCopyData(): return cPickle.loads(zlib.decompress( -"x\332u\220\261\012\3020\020@\367~\305\201C\234\216\034\2508\273\270\271d\ -\271\241K(N\026\257\270\365\357\233\334Q\232\236\372\010\201\274<\216\220\ -\3438Q\227\002]\200\316p\002\012]N\001\372H4\300C\336O=\243\235oc\036^*\330\ -\304\375\223g\212Q\225\230:\304\302\325\0248L\242\342%\0276\333JF'\261,Q\366\ -%\213n\322\226\210&Y\\Y\206\324\011_e\275\364%\326\270}\274+\015W\256\362W\ -\271\362\357\227p\001\237\325_S" )) +'x\332\323\310)0\344\012V74S04U0Q0T\347J\014V\327SHVp\312IL\316\006\363\362\ +\201\262J==\210`D>\232J\240! \0230T\202$\321U\352\201\024#;\036M%\004\240\251\ +\204\011bS\011\003\270BI\017\000\027\243[\276' )) def getCopyBitmap(): return wxBitmapFromXPMData(getCopyData()) @@ -1863,13 +1850,12 @@ def getCopyImage(): #---------------------------------------------------------------------- def getPasteData(): return cPickle.loads(zlib.decompress( -'x\332m\317\261\012\003!\014\006\340\375\236B\350`A\010fh\351\334\245[3\334\ -\342A\0279n\2524\245K\351\333W\215=\321\336/\212~&\240\373\360\304a\324xTxPq\ -\321\203\037\265\272Y\304Y]\371\261\3443\310\371\034\374|\317\340\004\246%\ -\004~ga\221\335\311\246\221\211\012\331\230BF\350\362\362\037\264B\252KE\210\ -i0\0018\007\345B\236\306\314\020\311\345M\305\322\011-\2264X\323"I:4)D[h\250\ -\305\330\234\346\177\245\331\250\244\265]\276\331U\312o\350\227\204\360\005\ -\233\352jQ' )) +'x\332m\217\261\012\003!\014\206\367{\212@\007\013B\320\241\305\271C\307f\ +\270\305\3658:\365\250}\377\251I\324J\256\367\201\342\377%\001s\336>q\232]\ +\274B\274\000_nZf\207\260\302m[\326\227&\342t\012L\012\232\275\344\273\242\ +\271HN!\365:p~\224\367SC\356\315\241\027-C"c\244\010\314\031[\241\376\254\ +\224\202\254\262>\206l\223he\303\310\201\225T\331I/\020\035IOV\362\260\234\ +\377N\177\320I\277\361\272\346\256\263nC\035\221\370\005\265(d?' )) def getPasteBitmap(): return wxBitmapFromXPMData(getPasteData()) @@ -1880,9 +1866,9 @@ def getPasteImage(): #---------------------------------------------------------------------- def getTog1Data(): return cPickle.loads(zlib.decompress( -'x\332\323\310)0\344\012V74S04U0V0T\347J\014VW\210104LV\360\313\317K\005\363\ -\365 |\247\234\304\344l\260@\004D@\331\302\000\004!z\320\000>A=$\200U0\002E;\ -\220\017\006\350\202\230\026\015BA\005\205\010\374\001\242\007\000{qDp' )) +'x\332\323\310)0\344\012V74S04U0V0T\347J\014V\327SHVp\312IL\316\006\363"\200\ +\305\345\ -\252\020\014NkJ\362P\021\223\343z\261"[ \344\000\266kA%\345\206\325r\024\354\ --\347\032Z9\333\371\374\215\370\304P\261/\3332K\233\277\231\024\252\242uW\ -\020\300\032\225\037i\226\010\372\307\277\265|\276N\011\337\003Q\206\015N\ -\021/\343\263l\217' )) +'x\332}\220\261\016\3020\014D\367~\205%\2060\235\210\204\370\000\206\216,]\ +\262V\025\023\025\346\377\'\334s\235\004!\260\222(\367|\262\023\037\327W\036\ +\246\224/b\353,9\015\363\224 \213\\\327yyP\251\251\3038\236,\250\305\364M\ +\237w\212\342\311-\275\'-P,\200\355\032\220\210\270\301\312,\002\366\314\274\ +\016\275\234o;\177C|\302Ra_\2669\243\315_\247\224J\321\272\023(\340\215\342G\ +t\251\242\177\374N\343\363uJ\370\036\0101|p\204x\003=\357h6' )) def getSmilesBitmap(): return wxBitmapFromXPMData(getSmilesData()) @@ -1923,17 +1908,17 @@ def getSmilesImage(): #---------------------------------------------------------------------- def getGridBGData(): return cPickle.loads(zlib.decompress( -"x\332\355\230\301\012\2030\014\206\357>Ea\007\007\202\2648e}\012\017^<\354\ -\222Nv\032\270\367?mD{pd\222\035\252\006\022\204\300o\373\265\2054M{~\276\\\ -\326\345\327\213\371|\215qy\006]nn\326\271\2739\371\032\032\030P*g\011\352P\ -\005\217R\037%\013\217P\2434\306\216\003\014\241B\251\215\222\007\037,JE\354\ -\350\202\015\3154b\002\233\300%\232\351\321\242\033\321\276D\266S\260xp\262p\ -k\3218S]\266\234\035\265`\005\213\007'\0137rr\344\256Y\272\002\215\024\025,\ -\036\274m\270\361\035\265k\024,\036\274m\270\221\251\227]\023(X<8Y\270\221y\ -\225\237\244\177\037\377\012\026\014\336\3630\345_u\246\226\012\026\017N\035\ -n\214\372\222\221\262\211D\257`\211\340\003\324nk\227\233\305\202\025,\036|\ -\200w7\366j\024,\036\274Qv[\011\373\177\037\246\025,\030\274g\355\266\266k\ -\250\177\012\226\015.\337F\021\023\224" )) +'x\332\355\230\301\012\2030\014\206\357>Ea\007\007\202(NY\217-\262\253\007/^\ +\307\256\003\367\376\247m\277zpd\222\301\252\006\022\204\220\246~4\220\246i\ +\217\367G\036\265\361\371d^_e\3628\272\266qcn\346`\255\263>\203\235\276mW\ +\372\302[\330\006\376\322U\256\206\235\300\237\373\314W\260{\370kW\373\002v\ +\007\177\346.\276\034\377\377\277\014\340\024b:\310\244z\310\307 [)X<8X\2725\ +\020\316R\3473GE\005\254`\361\340`\351F.\216\3345s\225@\310A\005\213\007\257\ +\233n|E\355\032\005\213\007\257\233nd\351e\367\004\012\026\017\016\226nd]\ +\345\027\351\357\307\277\202\005\203\267AppendText(text + '\n'); + self->AppendText(text); } } }; diff --git a/wxPython/src/events.i b/wxPython/src/events.i index 47a7825ade..03c1a0d1bb 100644 --- a/wxPython/src/events.i +++ b/wxPython/src/events.i @@ -291,7 +291,8 @@ public: class wxIconizeEvent: public wxEvent { public: - wxIconizeEvent(int id = 0); + wxIconizeEvent(int id = 0, bool iconized = TRUE); + bool Iconized(); }; //--------------------------------------------------------------------------- diff --git a/wxPython/src/gdi.i b/wxPython/src/gdi.i index c6423519f5..192668dbab 100644 --- a/wxPython/src/gdi.i +++ b/wxPython/src/gdi.i @@ -105,11 +105,12 @@ public: %new wxBitmap* wxEmptyBitmap(int width, int height, int depth=-1); %new wxBitmap* wxBitmapFromXPMData(PyObject* listOfStrings); %new wxBitmap* wxBitmapFromIcon(const wxIcon& icon); +%new wxBitmap* wxBitmapFromBits(char* bits, int width, int height, int depth = 1 ); -#ifdef __WXMSW__ -%new wxBitmap* wxBitmapFromData(PyObject* data, long type, - int width, int height, int depth = 1); -#endif +// #ifdef __WXMSW__ +// %new wxBitmap* wxBitmapFromData(PyObject* data, long type, +// int width, int height, int depth = 1); +// #endif @@ -137,6 +138,7 @@ public: return cArray; } + wxBitmap* wxBitmapFromXPMData(PyObject* listOfStrings) { char** cArray = NULL; wxBitmap* bmp; @@ -155,18 +157,21 @@ public: } + wxBitmap* wxBitmapFromBits(char* bits, int width, int height, int depth = 1 ) { + return new wxBitmap(bits, width, height, depth); + } -#ifdef __WXMSW__ - wxBitmap* wxBitmapFromData(PyObject* data, long type, - int width, int height, int depth = 1) { - if (! PyString_Check(data)) { - PyErr_SetString(PyExc_TypeError, "Expected string object"); - return NULL; - } - return new wxBitmap((void*)PyString_AsString(data), type, width, height, depth); - } -#endif +// #ifdef __WXMSW__ +// wxBitmap* wxBitmapFromData(PyObject* data, long type, +// int width, int height, int depth = 1) { +// if (! PyString_Check(data)) { +// PyErr_SetString(PyExc_TypeError, "Expected string object"); +// return NULL; +// } +// return new wxBitmap((void*)PyString_AsString(data), type, width, height, depth); +// } +// #endif %} //--------------------------------------------------------------------------- diff --git a/wxPython/src/libpy.c b/wxPython/src/libpy.c index 7e400062a8..1116e677df 100644 --- a/wxPython/src/libpy.c +++ b/wxPython/src/libpy.c @@ -409,6 +409,8 @@ SWIG_GetPtrObj(PyObject *obj, void **ptr, char *type) { Py_DECREF(sobj); } str = PyString_AsString(sobj); + if (str == NULL) + return ""; return SWIG_GetPtr(str,ptr,type); } diff --git a/wxPython/src/misc2.i b/wxPython/src/misc2.i index cb61fbe064..be23e14bf0 100644 --- a/wxPython/src/misc2.i +++ b/wxPython/src/misc2.i @@ -747,7 +747,7 @@ public: int GetUPosition() { return -1; } int GetVPosition() { return -1; } int GetMovementThreshold() { return -1; } - void SetMovementThreshold(int threshold) ; + void SetMovementThreshold(int threshold) {} bool IsOk(void) { return FALSE; } int GetNumberJoysticks() { return -1; } diff --git a/wxPython/src/msw/controls.cpp b/wxPython/src/msw/controls.cpp index a51db585b2..d1517f6b68 100644 --- a/wxPython/src/msw/controls.cpp +++ b/wxPython/src/msw/controls.cpp @@ -4401,6 +4401,388 @@ static PyObject *_wrap_wxCheckListBox_GetItemHeight(PyObject *self, PyObject *ar return _resultobj; } +#define new_wxTextAttr(_swigarg0,_swigarg1,_swigarg2) (new wxTextAttr(_swigarg0,_swigarg1,_swigarg2)) +static PyObject *_wrap_new_wxTextAttr(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + wxTextAttr * _result; + wxColour * _arg0 = (wxColour *) &wxNullColour; + wxColour * _arg1 = (wxColour *) &wxNullColour; + wxFont * _arg2 = (wxFont *) &wxNullFont; + wxColour temp; + PyObject * _obj0 = 0; + wxColour temp0; + PyObject * _obj1 = 0; + PyObject * _argo2 = 0; + char *_kwnames[] = { "colText","colBack","font", NULL }; + char _ptemp[128]; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"|OOO:new_wxTextAttr",_kwnames,&_obj0,&_obj1,&_argo2)) + return NULL; + if (_obj0) +{ + _arg0 = &temp; + if (! wxColour_helper(_obj0, &_arg0)) + return NULL; +} + if (_obj1) +{ + _arg1 = &temp0; + if (! wxColour_helper(_obj1, &_arg1)) + return NULL; +} + if (_argo2) { + if (_argo2 == Py_None) { _arg2 = NULL; } + else if (SWIG_GetPtrObj(_argo2,(void **) &_arg2,"_wxFont_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 3 of new_wxTextAttr. Expected _wxFont_p."); + return NULL; + } + } +{ + wxPy_BEGIN_ALLOW_THREADS; + _result = (wxTextAttr *)new_wxTextAttr(*_arg0,*_arg1,*_arg2); + + wxPy_END_ALLOW_THREADS; + if (PyErr_Occurred()) return NULL; +} if (_result) { + SWIG_MakePtr(_ptemp, (char *) _result,"_wxTextAttr_p"); + _resultobj = Py_BuildValue("s",_ptemp); + } else { + Py_INCREF(Py_None); + _resultobj = Py_None; + } + return _resultobj; +} + +#define delete_wxTextAttr(_swigobj) (delete _swigobj) +static PyObject *_wrap_delete_wxTextAttr(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + wxTextAttr * _arg0; + PyObject * _argo0 = 0; + char *_kwnames[] = { "self", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:delete_wxTextAttr",_kwnames,&_argo0)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxTextAttr_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of delete_wxTextAttr. Expected _wxTextAttr_p."); + return NULL; + } + } +{ + wxPy_BEGIN_ALLOW_THREADS; + delete_wxTextAttr(_arg0); + + wxPy_END_ALLOW_THREADS; + if (PyErr_Occurred()) return NULL; +} Py_INCREF(Py_None); + _resultobj = Py_None; + return _resultobj; +} + +#define wxTextAttr_SetTextColour(_swigobj,_swigarg0) (_swigobj->SetTextColour(_swigarg0)) +static PyObject *_wrap_wxTextAttr_SetTextColour(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + wxTextAttr * _arg0; + wxColour * _arg1; + PyObject * _argo0 = 0; + wxColour temp; + PyObject * _obj1 = 0; + char *_kwnames[] = { "self","colText", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxTextAttr_SetTextColour",_kwnames,&_argo0,&_obj1)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxTextAttr_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxTextAttr_SetTextColour. Expected _wxTextAttr_p."); + return NULL; + } + } +{ + _arg1 = &temp; + if (! wxColour_helper(_obj1, &_arg1)) + return NULL; +} +{ + wxPy_BEGIN_ALLOW_THREADS; + wxTextAttr_SetTextColour(_arg0,*_arg1); + + wxPy_END_ALLOW_THREADS; + if (PyErr_Occurred()) return NULL; +} Py_INCREF(Py_None); + _resultobj = Py_None; + return _resultobj; +} + +#define wxTextAttr_SetBackgroundColour(_swigobj,_swigarg0) (_swigobj->SetBackgroundColour(_swigarg0)) +static PyObject *_wrap_wxTextAttr_SetBackgroundColour(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + wxTextAttr * _arg0; + wxColour * _arg1; + PyObject * _argo0 = 0; + wxColour temp; + PyObject * _obj1 = 0; + char *_kwnames[] = { "self","colBack", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxTextAttr_SetBackgroundColour",_kwnames,&_argo0,&_obj1)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxTextAttr_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxTextAttr_SetBackgroundColour. Expected _wxTextAttr_p."); + return NULL; + } + } +{ + _arg1 = &temp; + if (! wxColour_helper(_obj1, &_arg1)) + return NULL; +} +{ + wxPy_BEGIN_ALLOW_THREADS; + wxTextAttr_SetBackgroundColour(_arg0,*_arg1); + + wxPy_END_ALLOW_THREADS; + if (PyErr_Occurred()) return NULL; +} Py_INCREF(Py_None); + _resultobj = Py_None; + return _resultobj; +} + +#define wxTextAttr_SetFont(_swigobj,_swigarg0) (_swigobj->SetFont(_swigarg0)) +static PyObject *_wrap_wxTextAttr_SetFont(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + wxTextAttr * _arg0; + wxFont * _arg1; + PyObject * _argo0 = 0; + PyObject * _argo1 = 0; + char *_kwnames[] = { "self","font", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxTextAttr_SetFont",_kwnames,&_argo0,&_argo1)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxTextAttr_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxTextAttr_SetFont. Expected _wxTextAttr_p."); + return NULL; + } + } + if (_argo1) { + if (_argo1 == Py_None) { _arg1 = NULL; } + else if (SWIG_GetPtrObj(_argo1,(void **) &_arg1,"_wxFont_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 2 of wxTextAttr_SetFont. Expected _wxFont_p."); + return NULL; + } + } +{ + wxPy_BEGIN_ALLOW_THREADS; + wxTextAttr_SetFont(_arg0,*_arg1); + + wxPy_END_ALLOW_THREADS; + if (PyErr_Occurred()) return NULL; +} Py_INCREF(Py_None); + _resultobj = Py_None; + return _resultobj; +} + +#define wxTextAttr_HasTextColour(_swigobj) (_swigobj->HasTextColour()) +static PyObject *_wrap_wxTextAttr_HasTextColour(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + bool _result; + wxTextAttr * _arg0; + PyObject * _argo0 = 0; + char *_kwnames[] = { "self", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxTextAttr_HasTextColour",_kwnames,&_argo0)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxTextAttr_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxTextAttr_HasTextColour. Expected _wxTextAttr_p."); + return NULL; + } + } +{ + wxPy_BEGIN_ALLOW_THREADS; + _result = (bool )wxTextAttr_HasTextColour(_arg0); + + wxPy_END_ALLOW_THREADS; + if (PyErr_Occurred()) return NULL; +} _resultobj = Py_BuildValue("i",_result); + return _resultobj; +} + +#define wxTextAttr_HasBackgroundColour(_swigobj) (_swigobj->HasBackgroundColour()) +static PyObject *_wrap_wxTextAttr_HasBackgroundColour(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + bool _result; + wxTextAttr * _arg0; + PyObject * _argo0 = 0; + char *_kwnames[] = { "self", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxTextAttr_HasBackgroundColour",_kwnames,&_argo0)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxTextAttr_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxTextAttr_HasBackgroundColour. Expected _wxTextAttr_p."); + return NULL; + } + } +{ + wxPy_BEGIN_ALLOW_THREADS; + _result = (bool )wxTextAttr_HasBackgroundColour(_arg0); + + wxPy_END_ALLOW_THREADS; + if (PyErr_Occurred()) return NULL; +} _resultobj = Py_BuildValue("i",_result); + return _resultobj; +} + +#define wxTextAttr_HasFont(_swigobj) (_swigobj->HasFont()) +static PyObject *_wrap_wxTextAttr_HasFont(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + bool _result; + wxTextAttr * _arg0; + PyObject * _argo0 = 0; + char *_kwnames[] = { "self", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxTextAttr_HasFont",_kwnames,&_argo0)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxTextAttr_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxTextAttr_HasFont. Expected _wxTextAttr_p."); + return NULL; + } + } +{ + wxPy_BEGIN_ALLOW_THREADS; + _result = (bool )wxTextAttr_HasFont(_arg0); + + wxPy_END_ALLOW_THREADS; + if (PyErr_Occurred()) return NULL; +} _resultobj = Py_BuildValue("i",_result); + return _resultobj; +} + +#define wxTextAttr_GetTextColour(_swigobj) (_swigobj->GetTextColour()) +static PyObject *_wrap_wxTextAttr_GetTextColour(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + wxColour * _result; + wxTextAttr * _arg0; + PyObject * _argo0 = 0; + char *_kwnames[] = { "self", NULL }; + char _ptemp[128]; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxTextAttr_GetTextColour",_kwnames,&_argo0)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxTextAttr_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxTextAttr_GetTextColour. Expected _wxTextAttr_p."); + return NULL; + } + } +{ + wxPy_BEGIN_ALLOW_THREADS; + const wxColour & _result_ref = wxTextAttr_GetTextColour(_arg0); + _result = (wxColour *) &_result_ref; + + wxPy_END_ALLOW_THREADS; + if (PyErr_Occurred()) return NULL; +} if (_result) { + SWIG_MakePtr(_ptemp, (char *) _result,"_wxColour_p"); + _resultobj = Py_BuildValue("s",_ptemp); + } else { + Py_INCREF(Py_None); + _resultobj = Py_None; + } + return _resultobj; +} + +#define wxTextAttr_GetBackgroundColour(_swigobj) (_swigobj->GetBackgroundColour()) +static PyObject *_wrap_wxTextAttr_GetBackgroundColour(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + wxColour * _result; + wxTextAttr * _arg0; + PyObject * _argo0 = 0; + char *_kwnames[] = { "self", NULL }; + char _ptemp[128]; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxTextAttr_GetBackgroundColour",_kwnames,&_argo0)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxTextAttr_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxTextAttr_GetBackgroundColour. Expected _wxTextAttr_p."); + return NULL; + } + } +{ + wxPy_BEGIN_ALLOW_THREADS; + const wxColour & _result_ref = wxTextAttr_GetBackgroundColour(_arg0); + _result = (wxColour *) &_result_ref; + + wxPy_END_ALLOW_THREADS; + if (PyErr_Occurred()) return NULL; +} if (_result) { + SWIG_MakePtr(_ptemp, (char *) _result,"_wxColour_p"); + _resultobj = Py_BuildValue("s",_ptemp); + } else { + Py_INCREF(Py_None); + _resultobj = Py_None; + } + return _resultobj; +} + +#define wxTextAttr_GetFont(_swigobj) (_swigobj->GetFont()) +static PyObject *_wrap_wxTextAttr_GetFont(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + wxFont * _result; + wxTextAttr * _arg0; + PyObject * _argo0 = 0; + char *_kwnames[] = { "self", NULL }; + char _ptemp[128]; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxTextAttr_GetFont",_kwnames,&_argo0)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxTextAttr_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxTextAttr_GetFont. Expected _wxTextAttr_p."); + return NULL; + } + } +{ + wxPy_BEGIN_ALLOW_THREADS; + const wxFont & _result_ref = wxTextAttr_GetFont(_arg0); + _result = (wxFont *) &_result_ref; + + wxPy_END_ALLOW_THREADS; + if (PyErr_Occurred()) return NULL; +} if (_result) { + SWIG_MakePtr(_ptemp, (char *) _result,"_wxFont_p"); + _resultobj = Py_BuildValue("s",_ptemp); + } else { + Py_INCREF(Py_None); + _resultobj = Py_None; + } + return _resultobj; +} + static void *SwigwxTextCtrlTowxControl(void *ptr) { wxTextCtrl *src; wxControl *dest; @@ -5689,8 +6071,120 @@ static PyObject *_wrap_wxTextCtrl_Redo(PyObject *self, PyObject *args, PyObject return _resultobj; } +#define wxTextCtrl_SetStyle(_swigobj,_swigarg0,_swigarg1,_swigarg2) (_swigobj->SetStyle(_swigarg0,_swigarg1,_swigarg2)) +static PyObject *_wrap_wxTextCtrl_SetStyle(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + bool _result; + wxTextCtrl * _arg0; + long _arg1; + long _arg2; + wxTextAttr * _arg3; + PyObject * _argo0 = 0; + PyObject * _argo3 = 0; + char *_kwnames[] = { "self","start","end","style", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OllO:wxTextCtrl_SetStyle",_kwnames,&_argo0,&_arg1,&_arg2,&_argo3)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxTextCtrl_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxTextCtrl_SetStyle. Expected _wxTextCtrl_p."); + return NULL; + } + } + if (_argo3) { + if (_argo3 == Py_None) { _arg3 = NULL; } + else if (SWIG_GetPtrObj(_argo3,(void **) &_arg3,"_wxTextAttr_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 4 of wxTextCtrl_SetStyle. Expected _wxTextAttr_p."); + return NULL; + } + } +{ + wxPy_BEGIN_ALLOW_THREADS; + _result = (bool )wxTextCtrl_SetStyle(_arg0,_arg1,_arg2,*_arg3); + + wxPy_END_ALLOW_THREADS; + if (PyErr_Occurred()) return NULL; +} _resultobj = Py_BuildValue("i",_result); + return _resultobj; +} + +#define wxTextCtrl_SetDefaultStyle(_swigobj,_swigarg0) (_swigobj->SetDefaultStyle(_swigarg0)) +static PyObject *_wrap_wxTextCtrl_SetDefaultStyle(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + bool _result; + wxTextCtrl * _arg0; + wxTextAttr * _arg1; + PyObject * _argo0 = 0; + PyObject * _argo1 = 0; + char *_kwnames[] = { "self","style", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"OO:wxTextCtrl_SetDefaultStyle",_kwnames,&_argo0,&_argo1)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxTextCtrl_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxTextCtrl_SetDefaultStyle. Expected _wxTextCtrl_p."); + return NULL; + } + } + if (_argo1) { + if (_argo1 == Py_None) { _arg1 = NULL; } + else if (SWIG_GetPtrObj(_argo1,(void **) &_arg1,"_wxTextAttr_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 2 of wxTextCtrl_SetDefaultStyle. Expected _wxTextAttr_p."); + return NULL; + } + } +{ + wxPy_BEGIN_ALLOW_THREADS; + _result = (bool )wxTextCtrl_SetDefaultStyle(_arg0,*_arg1); + + wxPy_END_ALLOW_THREADS; + if (PyErr_Occurred()) return NULL; +} _resultobj = Py_BuildValue("i",_result); + return _resultobj; +} + +#define wxTextCtrl_GetDefaultStyle(_swigobj) (_swigobj->GetDefaultStyle()) +static PyObject *_wrap_wxTextCtrl_GetDefaultStyle(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + wxTextAttr * _result; + wxTextCtrl * _arg0; + PyObject * _argo0 = 0; + char *_kwnames[] = { "self", NULL }; + char _ptemp[128]; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxTextCtrl_GetDefaultStyle",_kwnames,&_argo0)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxTextCtrl_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxTextCtrl_GetDefaultStyle. Expected _wxTextCtrl_p."); + return NULL; + } + } +{ + wxPy_BEGIN_ALLOW_THREADS; + const wxTextAttr & _result_ref = wxTextCtrl_GetDefaultStyle(_arg0); + _result = (wxTextAttr *) &_result_ref; + + wxPy_END_ALLOW_THREADS; + if (PyErr_Occurred()) return NULL; +} if (_result) { + SWIG_MakePtr(_ptemp, (char *) _result,"_wxTextAttr_p"); + _resultobj = Py_BuildValue("s",_ptemp); + } else { + Py_INCREF(Py_None); + _resultobj = Py_None; + } + return _resultobj; +} + static void wxTextCtrl_write(wxTextCtrl *self,const wxString & text) { - self->AppendText(text + '\n'); + self->AppendText(text); } static PyObject *_wrap_wxTextCtrl_write(PyObject *self, PyObject *args, PyObject *kwargs) { PyObject * _resultobj; @@ -8431,6 +8925,9 @@ static PyMethodDef controlscMethods[] = { { "wxScrollBar_GetRange", (PyCFunction) _wrap_wxScrollBar_GetRange, METH_VARARGS | METH_KEYWORDS }, { "new_wxScrollBar", (PyCFunction) _wrap_new_wxScrollBar, METH_VARARGS | METH_KEYWORDS }, { "wxTextCtrl_write", (PyCFunction) _wrap_wxTextCtrl_write, METH_VARARGS | METH_KEYWORDS }, + { "wxTextCtrl_GetDefaultStyle", (PyCFunction) _wrap_wxTextCtrl_GetDefaultStyle, METH_VARARGS | METH_KEYWORDS }, + { "wxTextCtrl_SetDefaultStyle", (PyCFunction) _wrap_wxTextCtrl_SetDefaultStyle, METH_VARARGS | METH_KEYWORDS }, + { "wxTextCtrl_SetStyle", (PyCFunction) _wrap_wxTextCtrl_SetStyle, METH_VARARGS | METH_KEYWORDS }, { "wxTextCtrl_Redo", (PyCFunction) _wrap_wxTextCtrl_Redo, METH_VARARGS | METH_KEYWORDS }, { "wxTextCtrl_Undo", (PyCFunction) _wrap_wxTextCtrl_Undo, METH_VARARGS | METH_KEYWORDS }, { "wxTextCtrl_IsEditable", (PyCFunction) _wrap_wxTextCtrl_IsEditable, METH_VARARGS | METH_KEYWORDS }, @@ -8467,6 +8964,17 @@ static PyMethodDef controlscMethods[] = { { "wxTextCtrl_Copy", (PyCFunction) _wrap_wxTextCtrl_Copy, METH_VARARGS | METH_KEYWORDS }, { "wxTextCtrl_Clear", (PyCFunction) _wrap_wxTextCtrl_Clear, METH_VARARGS | METH_KEYWORDS }, { "new_wxTextCtrl", (PyCFunction) _wrap_new_wxTextCtrl, METH_VARARGS | METH_KEYWORDS }, + { "wxTextAttr_GetFont", (PyCFunction) _wrap_wxTextAttr_GetFont, METH_VARARGS | METH_KEYWORDS }, + { "wxTextAttr_GetBackgroundColour", (PyCFunction) _wrap_wxTextAttr_GetBackgroundColour, METH_VARARGS | METH_KEYWORDS }, + { "wxTextAttr_GetTextColour", (PyCFunction) _wrap_wxTextAttr_GetTextColour, METH_VARARGS | METH_KEYWORDS }, + { "wxTextAttr_HasFont", (PyCFunction) _wrap_wxTextAttr_HasFont, METH_VARARGS | METH_KEYWORDS }, + { "wxTextAttr_HasBackgroundColour", (PyCFunction) _wrap_wxTextAttr_HasBackgroundColour, METH_VARARGS | METH_KEYWORDS }, + { "wxTextAttr_HasTextColour", (PyCFunction) _wrap_wxTextAttr_HasTextColour, METH_VARARGS | METH_KEYWORDS }, + { "wxTextAttr_SetFont", (PyCFunction) _wrap_wxTextAttr_SetFont, METH_VARARGS | METH_KEYWORDS }, + { "wxTextAttr_SetBackgroundColour", (PyCFunction) _wrap_wxTextAttr_SetBackgroundColour, METH_VARARGS | METH_KEYWORDS }, + { "wxTextAttr_SetTextColour", (PyCFunction) _wrap_wxTextAttr_SetTextColour, METH_VARARGS | METH_KEYWORDS }, + { "delete_wxTextAttr", (PyCFunction) _wrap_delete_wxTextAttr, METH_VARARGS | METH_KEYWORDS }, + { "new_wxTextAttr", (PyCFunction) _wrap_new_wxTextAttr, METH_VARARGS | METH_KEYWORDS }, { "wxCheckListBox_GetItemHeight", (PyCFunction) _wrap_wxCheckListBox_GetItemHeight, METH_VARARGS | METH_KEYWORDS }, { "wxCheckListBox_InsertItems", (PyCFunction) _wrap_wxCheckListBox_InsertItems, METH_VARARGS | METH_KEYWORDS }, { "wxCheckListBox_Check", (PyCFunction) _wrap_wxCheckListBox_Check, METH_VARARGS | METH_KEYWORDS }, diff --git a/wxPython/src/msw/controls.py b/wxPython/src/msw/controls.py index 99523aed00..79534558f0 100644 --- a/wxPython/src/msw/controls.py +++ b/wxPython/src/msw/controls.py @@ -442,6 +442,53 @@ class wxCheckListBox(wxCheckListBoxPtr): +class wxTextAttrPtr : + def __init__(self,this): + self.this = this + self.thisown = 0 + def __del__(self,controlsc=controlsc): + if self.thisown == 1 : + controlsc.delete_wxTextAttr(self) + def SetTextColour(self, *_args, **_kwargs): + val = apply(controlsc.wxTextAttr_SetTextColour,(self,) + _args, _kwargs) + return val + def SetBackgroundColour(self, *_args, **_kwargs): + val = apply(controlsc.wxTextAttr_SetBackgroundColour,(self,) + _args, _kwargs) + return val + def SetFont(self, *_args, **_kwargs): + val = apply(controlsc.wxTextAttr_SetFont,(self,) + _args, _kwargs) + return val + def HasTextColour(self, *_args, **_kwargs): + val = apply(controlsc.wxTextAttr_HasTextColour,(self,) + _args, _kwargs) + return val + def HasBackgroundColour(self, *_args, **_kwargs): + val = apply(controlsc.wxTextAttr_HasBackgroundColour,(self,) + _args, _kwargs) + return val + def HasFont(self, *_args, **_kwargs): + val = apply(controlsc.wxTextAttr_HasFont,(self,) + _args, _kwargs) + return val + def GetTextColour(self, *_args, **_kwargs): + val = apply(controlsc.wxTextAttr_GetTextColour,(self,) + _args, _kwargs) + if val: val = wxColourPtr(val) + return val + def GetBackgroundColour(self, *_args, **_kwargs): + val = apply(controlsc.wxTextAttr_GetBackgroundColour,(self,) + _args, _kwargs) + if val: val = wxColourPtr(val) + return val + def GetFont(self, *_args, **_kwargs): + val = apply(controlsc.wxTextAttr_GetFont,(self,) + _args, _kwargs) + if val: val = wxFontPtr(val) + return val + def __repr__(self): + return "" % (self.this,) +class wxTextAttr(wxTextAttrPtr): + def __init__(self,*_args,**_kwargs): + self.this = apply(controlsc.new_wxTextAttr,_args,_kwargs) + self.thisown = 1 + + + + class wxTextCtrlPtr(wxControlPtr): def __init__(self,this): self.this = this @@ -551,6 +598,16 @@ class wxTextCtrlPtr(wxControlPtr): def Redo(self, *_args, **_kwargs): val = apply(controlsc.wxTextCtrl_Redo,(self,) + _args, _kwargs) return val + def SetStyle(self, *_args, **_kwargs): + val = apply(controlsc.wxTextCtrl_SetStyle,(self,) + _args, _kwargs) + return val + def SetDefaultStyle(self, *_args, **_kwargs): + val = apply(controlsc.wxTextCtrl_SetDefaultStyle,(self,) + _args, _kwargs) + return val + def GetDefaultStyle(self, *_args, **_kwargs): + val = apply(controlsc.wxTextCtrl_GetDefaultStyle,(self,) + _args, _kwargs) + if val: val = wxTextAttrPtr(val) + return val def write(self, *_args, **_kwargs): val = apply(controlsc.wxTextCtrl_write,(self,) + _args, _kwargs) return val diff --git a/wxPython/src/msw/events.cpp b/wxPython/src/msw/events.cpp index 94e30fb420..2d2ec601d9 100644 --- a/wxPython/src/msw/events.cpp +++ b/wxPython/src/msw/events.cpp @@ -4719,20 +4719,23 @@ static void *SwigwxIconizeEventTowxObject(void *ptr) { return (void *) dest; } -#define new_wxIconizeEvent(_swigarg0) (new wxIconizeEvent(_swigarg0)) +#define new_wxIconizeEvent(_swigarg0,_swigarg1) (new wxIconizeEvent(_swigarg0,_swigarg1)) static PyObject *_wrap_new_wxIconizeEvent(PyObject *self, PyObject *args, PyObject *kwargs) { PyObject * _resultobj; wxIconizeEvent * _result; int _arg0 = (int ) 0; - char *_kwnames[] = { "id", NULL }; + bool _arg1 = (bool ) TRUE; + int tempbool1 = (int) TRUE; + char *_kwnames[] = { "id","iconized", NULL }; char _ptemp[128]; self = self; - if(!PyArg_ParseTupleAndKeywords(args,kwargs,"|i:new_wxIconizeEvent",_kwnames,&_arg0)) + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"|ii:new_wxIconizeEvent",_kwnames,&_arg0,&tempbool1)) return NULL; + _arg1 = (bool ) tempbool1; { wxPy_BEGIN_ALLOW_THREADS; - _result = (wxIconizeEvent *)new_wxIconizeEvent(_arg0); + _result = (wxIconizeEvent *)new_wxIconizeEvent(_arg0,_arg1); wxPy_END_ALLOW_THREADS; if (PyErr_Occurred()) return NULL; @@ -4746,6 +4749,34 @@ static PyObject *_wrap_new_wxIconizeEvent(PyObject *self, PyObject *args, PyObje return _resultobj; } +#define wxIconizeEvent_Iconized(_swigobj) (_swigobj->Iconized()) +static PyObject *_wrap_wxIconizeEvent_Iconized(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + bool _result; + wxIconizeEvent * _arg0; + PyObject * _argo0 = 0; + char *_kwnames[] = { "self", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxIconizeEvent_Iconized",_kwnames,&_argo0)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxIconizeEvent_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxIconizeEvent_Iconized. Expected _wxIconizeEvent_p."); + return NULL; + } + } +{ + wxPy_BEGIN_ALLOW_THREADS; + _result = (bool )wxIconizeEvent_Iconized(_arg0); + + wxPy_END_ALLOW_THREADS; + if (PyErr_Occurred()) return NULL; +} _resultobj = Py_BuildValue("i",_result); + return _resultobj; +} + static void *SwigwxMaximizeEventTowxEvent(void *ptr) { wxMaximizeEvent *src; wxEvent *dest; @@ -6820,6 +6851,7 @@ static PyMethodDef eventscMethods[] = { { "wxJoystickEvent_GetPosition", (PyCFunction) _wrap_wxJoystickEvent_GetPosition, METH_VARARGS | METH_KEYWORDS }, { "new_wxJoystickEvent", (PyCFunction) _wrap_new_wxJoystickEvent, METH_VARARGS | METH_KEYWORDS }, { "new_wxMaximizeEvent", (PyCFunction) _wrap_new_wxMaximizeEvent, METH_VARARGS | METH_KEYWORDS }, + { "wxIconizeEvent_Iconized", (PyCFunction) _wrap_wxIconizeEvent_Iconized, METH_VARARGS | METH_KEYWORDS }, { "new_wxIconizeEvent", (PyCFunction) _wrap_new_wxIconizeEvent, METH_VARARGS | METH_KEYWORDS }, { "wxShowEvent_GetShow", (PyCFunction) _wrap_wxShowEvent_GetShow, METH_VARARGS | METH_KEYWORDS }, { "wxShowEvent_SetShow", (PyCFunction) _wrap_wxShowEvent_SetShow, METH_VARARGS | METH_KEYWORDS }, diff --git a/wxPython/src/msw/events.py b/wxPython/src/msw/events.py index fafb968f4c..23b0f69519 100644 --- a/wxPython/src/msw/events.py +++ b/wxPython/src/msw/events.py @@ -640,6 +640,9 @@ class wxIconizeEventPtr(wxEventPtr): def __init__(self,this): self.this = this self.thisown = 0 + def Iconized(self, *_args, **_kwargs): + val = apply(eventsc.wxIconizeEvent_Iconized,(self,) + _args, _kwargs) + return val def __repr__(self): return "" % (self.this,) class wxIconizeEvent(wxIconizeEventPtr): diff --git a/wxPython/src/msw/gdi.cpp b/wxPython/src/msw/gdi.cpp index 618c1929c3..caa2634f5e 100644 --- a/wxPython/src/msw/gdi.cpp +++ b/wxPython/src/msw/gdi.cpp @@ -120,6 +120,7 @@ static PyObject* t_output_helper(PyObject* target, PyObject* o) { return cArray; } + wxBitmap* wxBitmapFromXPMData(PyObject* listOfStrings) { char** cArray = NULL; wxBitmap* bmp; @@ -138,18 +139,21 @@ static PyObject* t_output_helper(PyObject* target, PyObject* o) { } + wxBitmap* wxBitmapFromBits(char* bits, int width, int height, int depth = 1 ) { + return new wxBitmap(bits, width, height, depth); + } -#ifdef __WXMSW__ - wxBitmap* wxBitmapFromData(PyObject* data, long type, - int width, int height, int depth = 1) { - if (! PyString_Check(data)) { - PyErr_SetString(PyExc_TypeError, "Expected string object"); - return NULL; - } - return new wxBitmap((void*)PyString_AsString(data), type, width, height, depth); - } -#endif +// #ifdef __WXMSW__ +// wxBitmap* wxBitmapFromData(PyObject* data, long type, +// int width, int height, int depth = 1) { +// if (! PyString_Check(data)) { +// PyErr_SetString(PyExc_TypeError, "Expected string object"); +// return NULL; +// } +// return new wxBitmap((void*)PyString_AsString(data), type, width, height, depth); +// } +// #endif wxMask* wxMaskColour(const wxBitmap& bitmap, const wxColour& colour) { return new wxMask(bitmap, colour); @@ -335,27 +339,22 @@ static PyObject *_wrap_wxBitmapFromIcon(PyObject *self, PyObject *args, PyObject return _resultobj; } -static PyObject *_wrap_wxBitmapFromData(PyObject *self, PyObject *args, PyObject *kwargs) { +static PyObject *_wrap_wxBitmapFromBits(PyObject *self, PyObject *args, PyObject *kwargs) { PyObject * _resultobj; wxBitmap * _result; - PyObject * _arg0; - long _arg1; + char * _arg0; + int _arg1; int _arg2; - int _arg3; - int _arg4 = (int ) 1; - PyObject * _obj0 = 0; - char *_kwnames[] = { "data","type","width","height","depth", NULL }; + int _arg3 = (int ) 1; + char *_kwnames[] = { "bits","width","height","depth", NULL }; char _ptemp[128]; self = self; - if(!PyArg_ParseTupleAndKeywords(args,kwargs,"Olii|i:wxBitmapFromData",_kwnames,&_obj0,&_arg1,&_arg2,&_arg3,&_arg4)) + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"sii|i:wxBitmapFromBits",_kwnames,&_arg0,&_arg1,&_arg2,&_arg3)) return NULL; -{ - _arg0 = _obj0; -} { wxPy_BEGIN_ALLOW_THREADS; - _result = (wxBitmap *)wxBitmapFromData(_arg0,_arg1,_arg2,_arg3,_arg4); + _result = (wxBitmap *)wxBitmapFromBits(_arg0,_arg1,_arg2,_arg3); wxPy_END_ALLOW_THREADS; if (PyErr_Occurred()) return NULL; @@ -10987,7 +10986,7 @@ static PyMethodDef gdicMethods[] = { { "wxIconFromXPMData", (PyCFunction) _wrap_wxIconFromXPMData, METH_VARARGS | METH_KEYWORDS }, { "wxEmptyIcon", (PyCFunction) _wrap_wxEmptyIcon, METH_VARARGS | METH_KEYWORDS }, { "wxMaskColour", (PyCFunction) _wrap_wxMaskColour, METH_VARARGS | METH_KEYWORDS }, - { "wxBitmapFromData", (PyCFunction) _wrap_wxBitmapFromData, METH_VARARGS | METH_KEYWORDS }, + { "wxBitmapFromBits", (PyCFunction) _wrap_wxBitmapFromBits, METH_VARARGS | METH_KEYWORDS }, { "wxBitmapFromIcon", (PyCFunction) _wrap_wxBitmapFromIcon, METH_VARARGS | METH_KEYWORDS }, { "wxBitmapFromXPMData", (PyCFunction) _wrap_wxBitmapFromXPMData, METH_VARARGS | METH_KEYWORDS }, { "wxEmptyBitmap", (PyCFunction) _wrap_wxEmptyBitmap, METH_VARARGS | METH_KEYWORDS }, diff --git a/wxPython/src/msw/gdi.py b/wxPython/src/msw/gdi.py index 35e6cdaeff..b8a6156f14 100644 --- a/wxPython/src/msw/gdi.py +++ b/wxPython/src/msw/gdi.py @@ -1141,8 +1141,8 @@ def wxBitmapFromIcon(*_args, **_kwargs): if val: val = wxBitmapPtr(val); val.thisown = 1 return val -def wxBitmapFromData(*_args, **_kwargs): - val = apply(gdic.wxBitmapFromData,_args,_kwargs) +def wxBitmapFromBits(*_args, **_kwargs): + val = apply(gdic.wxBitmapFromBits,_args,_kwargs) if val: val = wxBitmapPtr(val); val.thisown = 1 return val diff --git a/wxPython/src/msw/misc2.cpp b/wxPython/src/msw/misc2.cpp index 5a6a508910..21a8d86023 100644 --- a/wxPython/src/msw/misc2.cpp +++ b/wxPython/src/msw/misc2.cpp @@ -221,7 +221,7 @@ public: int GetUPosition() { return -1; } int GetVPosition() { return -1; } int GetMovementThreshold() { return -1; } - void SetMovementThreshold(int threshold) ; + void SetMovementThreshold(int threshold) {} bool IsOk(void) { return FALSE; } int GetNumberJoysticks() { return -1; } diff --git a/wxPython/src/msw/windows.cpp b/wxPython/src/msw/windows.cpp index 7c66007aa3..a6b2983b80 100644 --- a/wxPython/src/msw/windows.cpp +++ b/wxPython/src/msw/windows.cpp @@ -1166,6 +1166,34 @@ static PyObject *_wrap_wxWindow_CenterOnScreen(PyObject *self, PyObject *args, P return _resultobj; } +#define wxWindow_Clear(_swigobj) (_swigobj->Clear()) +static PyObject *_wrap_wxWindow_Clear(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject * _resultobj; + wxWindow * _arg0; + PyObject * _argo0 = 0; + char *_kwnames[] = { "self", NULL }; + + self = self; + if(!PyArg_ParseTupleAndKeywords(args,kwargs,"O:wxWindow_Clear",_kwnames,&_argo0)) + return NULL; + if (_argo0) { + if (_argo0 == Py_None) { _arg0 = NULL; } + else if (SWIG_GetPtrObj(_argo0,(void **) &_arg0,"_wxWindow_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxWindow_Clear. Expected _wxWindow_p."); + return NULL; + } + } +{ + wxPy_BEGIN_ALLOW_THREADS; + wxWindow_Clear(_arg0); + + wxPy_END_ALLOW_THREADS; + if (PyErr_Occurred()) return NULL; +} Py_INCREF(Py_None); + _resultobj = Py_None; + return _resultobj; +} + #define wxWindow_ClientToScreenXY(_swigobj,_swigarg0,_swigarg1) (_swigobj->ClientToScreen(_swigarg0,_swigarg1)) static PyObject *_wrap_wxWindow_ClientToScreenXY(PyObject *self, PyObject *args, PyObject *kwargs) { PyObject * _resultobj; @@ -10556,6 +10584,7 @@ static PyMethodDef windowscMethods[] = { { "wxWindow_Close", (PyCFunction) _wrap_wxWindow_Close, METH_VARARGS | METH_KEYWORDS }, { "wxWindow_ClientToScreen", (PyCFunction) _wrap_wxWindow_ClientToScreen, METH_VARARGS | METH_KEYWORDS }, { "wxWindow_ClientToScreenXY", (PyCFunction) _wrap_wxWindow_ClientToScreenXY, METH_VARARGS | METH_KEYWORDS }, + { "wxWindow_Clear", (PyCFunction) _wrap_wxWindow_Clear, METH_VARARGS | METH_KEYWORDS }, { "wxWindow_CenterOnScreen", (PyCFunction) _wrap_wxWindow_CenterOnScreen, METH_VARARGS | METH_KEYWORDS }, { "wxWindow_CentreOnScreen", (PyCFunction) _wrap_wxWindow_CentreOnScreen, METH_VARARGS | METH_KEYWORDS }, { "wxWindow_CenterOnParent", (PyCFunction) _wrap_wxWindow_CenterOnParent, METH_VARARGS | METH_KEYWORDS }, diff --git a/wxPython/src/msw/windows.py b/wxPython/src/msw/windows.py index 0d0a66e585..9f0d9cb10b 100644 --- a/wxPython/src/msw/windows.py +++ b/wxPython/src/msw/windows.py @@ -130,6 +130,9 @@ class wxWindowPtr(wxEvtHandlerPtr): def CenterOnScreen(self, *_args, **_kwargs): val = apply(windowsc.wxWindow_CenterOnScreen,(self,) + _args, _kwargs) return val + def Clear(self, *_args, **_kwargs): + val = apply(windowsc.wxWindow_Clear,(self,) + _args, _kwargs) + return val def ClientToScreenXY(self, *_args, **_kwargs): val = apply(windowsc.wxWindow_ClientToScreenXY,(self,) + _args, _kwargs) return val diff --git a/wxPython/src/msw/wx.cpp b/wxPython/src/msw/wx.cpp index 50e05da9c8..8450c70e92 100644 --- a/wxPython/src/msw/wx.cpp +++ b/wxPython/src/msw/wx.cpp @@ -1931,6 +1931,7 @@ SWIGEXPORT(void) initwxc() { PyDict_SetItemString(d,"wxRESIZE_BORDER", PyInt_FromLong((long) wxRESIZE_BORDER)); PyDict_SetItemString(d,"wxDIALOG_MODAL", PyInt_FromLong((long) wxDIALOG_MODAL)); PyDict_SetItemString(d,"wxDIALOG_MODELESS", PyInt_FromLong((long) wxDIALOG_MODELESS)); + PyDict_SetItemString(d,"wxDIALOG_NO_PARENT", PyInt_FromLong((long) wxDIALOG_NO_PARENT)); PyDict_SetItemString(d,"wxDEFAULT_FRAME_STYLE", PyInt_FromLong((long) wxDEFAULT_FRAME_STYLE)); PyDict_SetItemString(d,"wxDEFAULT_DIALOG_STYLE", PyInt_FromLong((long) wxDEFAULT_DIALOG_STYLE)); PyDict_SetItemString(d,"wxFRAME_TOOL_WINDOW", PyInt_FromLong((long) wxFRAME_TOOL_WINDOW)); @@ -2115,6 +2116,8 @@ SWIGEXPORT(void) initwxc() { PyDict_SetItemString(d,"wxID_PASTE", PyInt_FromLong((long) wxID_PASTE)); PyDict_SetItemString(d,"wxID_CLEAR", PyInt_FromLong((long) wxID_CLEAR)); PyDict_SetItemString(d,"wxID_FIND", PyInt_FromLong((long) wxID_FIND)); + PyDict_SetItemString(d,"wxID_DUPLICATE", PyInt_FromLong((long) wxID_DUPLICATE)); + PyDict_SetItemString(d,"wxID_SELECTALL", PyInt_FromLong((long) wxID_SELECTALL)); PyDict_SetItemString(d,"wxID_FILE1", PyInt_FromLong((long) wxID_FILE1)); PyDict_SetItemString(d,"wxID_FILE2", PyInt_FromLong((long) wxID_FILE2)); PyDict_SetItemString(d,"wxID_FILE3", PyInt_FromLong((long) wxID_FILE3)); diff --git a/wxPython/src/msw/wx.py b/wxPython/src/msw/wx.py index 0847fbd21e..943321b27f 100644 --- a/wxPython/src/msw/wx.py +++ b/wxPython/src/msw/wx.py @@ -199,6 +199,7 @@ wxRESIZE_BOX = wxc.wxRESIZE_BOX wxRESIZE_BORDER = wxc.wxRESIZE_BORDER wxDIALOG_MODAL = wxc.wxDIALOG_MODAL wxDIALOG_MODELESS = wxc.wxDIALOG_MODELESS +wxDIALOG_NO_PARENT = wxc.wxDIALOG_NO_PARENT wxDEFAULT_FRAME_STYLE = wxc.wxDEFAULT_FRAME_STYLE wxDEFAULT_DIALOG_STYLE = wxc.wxDEFAULT_DIALOG_STYLE wxFRAME_TOOL_WINDOW = wxc.wxFRAME_TOOL_WINDOW @@ -383,6 +384,8 @@ wxID_COPY = wxc.wxID_COPY wxID_PASTE = wxc.wxID_PASTE wxID_CLEAR = wxc.wxID_CLEAR wxID_FIND = wxc.wxID_FIND +wxID_DUPLICATE = wxc.wxID_DUPLICATE +wxID_SELECTALL = wxc.wxID_SELECTALL wxID_FILE1 = wxc.wxID_FILE1 wxID_FILE2 = wxc.wxID_FILE2 wxID_FILE3 = wxc.wxID_FILE3 diff --git a/wxPython/src/windows.i b/wxPython/src/windows.i index 85b0a9aafd..275f9118de 100644 --- a/wxPython/src/windows.i +++ b/wxPython/src/windows.i @@ -206,6 +206,8 @@ public: void CentreOnScreen(int direction = wxBOTH ); void CenterOnScreen(int direction = wxBOTH ); + void Clear(); + // (uses apply'ed INOUT typemap, see above) %name(ClientToScreenXY)void ClientToScreen(int* x, int* y); wxPoint ClientToScreen(const wxPoint& pt); diff --git a/wxPython/wxPython/lib/colourselect.py b/wxPython/wxPython/lib/colourselect.py index 8728b84fc8..93774eb9a6 100644 --- a/wxPython/wxPython/lib/colourselect.py +++ b/wxPython/wxPython/lib/colourselect.py @@ -16,40 +16,31 @@ from wxPython.wx import * # button colour will change to new colour # GetColour method to get the selected colour -class ColourSelect: - def __init__(self, parent, position = wxPoint(20, 20), bcolour = [0, 0, 0], size = wxSize(20, 20)): - self.win = parent - if size is None: - size = wxSize(20, 20) +class ColourSelect(wxButton): + def __init__(self, parent, id, bcolour=(0, 0, 0), pos=wxDefaultPosition, size=wxDefaultSize): + wxButton.__init__(self, parent, id, "", pos=pos, size=size) + EVT_BUTTON(parent, self.GetId(), self.OnClick) + self.SetForegroundColour(wxWHITE) + self.SetColour(bcolour) - mID = NewId() - self.b = b = wxButton(parent, mID, "", position, size) - EVT_BUTTON(parent, mID, self.OnClick) + def SetColour(self, bcolour): self.set_colour_val = set_colour = wxColor(bcolour[0], bcolour[1], bcolour[2]) - b.SetBackgroundColour(set_colour) - b.SetForegroundColour(wxWHITE) + self.SetBackgroundColour(set_colour) self.set_colour = bcolour - def SetColour(self, bcolour): - self.b.SetBackgroundColour(bcolour) def GetColour(self): return self.set_colour + def OnClick(self, event): data = wxColourData() data.SetChooseFull(true) data.SetColour(self.set_colour_val) - dlg = wxColourDialog(self.win, data) + dlg = wxColourDialog(self.GetParent(), data) if dlg.ShowModal() == wxID_OK: data = dlg.GetColourData() - self.set_colour = set = data.GetColour().Get() - self.set_colour_val = bcolour = wxColour(set[0],set[1],set[2]) - self.b.SetBackgroundColour(bcolour) + self.SetColour(data.GetColour().Get()) dlg.Destroy() - - - - diff --git a/wxPython/wxPython/lib/rpcMixin.py b/wxPython/wxPython/lib/rpcMixin.py index 1d7821b326..26a640a3d0 100644 --- a/wxPython/wxPython/lib/rpcMixin.py +++ b/wxPython/wxPython/lib/rpcMixin.py @@ -1,6 +1,9 @@ +# +# This was modified from rpcMixin.py distributed with wxPython +# #---------------------------------------------------------------------- # Name: rpcMixin -# Version: 0.1 +# Version: 0.2.0 # Purpose: provides xmlrpc server functionality for wxPython # applications via a mixin class # @@ -9,51 +12,74 @@ # (http://www.pythonware.com/products/xmlrpc/) # the code was developed and tested using version 0.9.8 # -# Author: Greg Landrum (Landrum@RationalDiscovery.com) +# Author: greg Landrum (Landrum@RationalDiscovery.com) # -# Copyright: (c) 2000 by Greg Landrum and Rational Discovery LLC +# Copyright: (c) 2000, 2001 by Greg Landrum and Rational Discovery LLC # Licence: wxWindows license #---------------------------------------------------------------------- -""" -Some Notes: +"""provides xmlrpc server functionality for wxPython applications via a mixin class -1) The xmlrpc server runs in a separate thread from the main GUI - application, communication between the two threads using a custom - event (see the Threads demo in the wxPython docs for more info). +**Some Notes:** -2) Neither the server nor the client are particularly smart about - checking method names. So it's easy to shoot yourself in the foot - by calling improper methods. It would be pretty easy to add - either a list of allowed methods or a list of forbidden methods. + 1) The xmlrpc server runs in a separate thread from the main GUI + application, communication between the two threads using a custom + event (see the Threads demo in the wxPython docs for more info). -3) Authentication of xmlrpc clients is *not* performed. I think it - would be pretty easy to do this in a hacky way, but I haven't done - it yet. + 2) Neither the server nor the client are particularly smart about + checking method names. So it's easy to shoot yourself in the foot + by calling improper methods. It would be pretty easy to add + either a list of allowed methods or a list of forbidden methods. -4) The default port number is 800, it's a windows thing... at least - it seems like a windows thing to me. Since I'm not being smart - about port numbers, you can probably hork yourself arbitrarily by - firing up more than one xmlrpc-active frame at the same time, but - I haven't tried that. + 3) Authentication of xmlrpc clients is *not* performed. I think it + would be pretty easy to do this in a hacky way, but I haven't done + it yet. -5) See the bottom of this file for an example of using the class. + 4) See the bottom of this file for an example of using the class. -Obligatory disclaimer: +**Obligatory disclaimer:** This is my first crack at both using xmlrpc and multi-threaded programming, so there could be huge horrible bugs or design flaws. If you see one, I'd love to hear about them. """ + +""" ChangeLog +23 May 2001: Version bumped to 0.2.0 + Numerous code and design changes + +21 Mar. 2001: Version bumped to 0.1.4 + Updated rpcMixin.OnExternal to support methods with further references + (i.e. now you can do rpcClient.foo.bar() and have it work) + This probably ain't super legal in xmlrpc land, but it works just fine here + and we need it. + +6 Mar. 2001: Version bumped to 0.1.3 + Documentation changes to make this compatible with happydoc + +21 Jan. 2001: Version bumped to 0.1.2 + OnExternal() method in the mixin class now uses getattr() to check if + a desired method is present. It should have been done this way in + the first place. +14 Dec. 2000: Version bumped to 0.1.1 + rearranged locking code and made other changes so that multiple + servers in one application are possible. + +""" + from wxPython.wx import * -import xmlrpcserver -import Threading +import xmlrpcserver,xmlrpclib +import threading import SocketServer +import string +import new +import sys rpcPENDING = 0 rpcDONE = 1 rpcEXCEPT = 2 + class RPCRequest: """A wrapper to use for handling requests and their responses""" status = rpcPENDING @@ -64,6 +90,7 @@ wxEVT_EXTERNAL_EVENT = 25015 class ExternalEvent(wxPyEvent): """The custom event class used to pass xmlrpc calls from the server thread into the GUI thread + """ def __init__(self,method,args): wxPyEvent.__init__(self) @@ -71,8 +98,15 @@ class ExternalEvent(wxPyEvent): self.method = method self.args = args self.rpcStatus = RPCRequest() - self.rpcStatusLock = Threading.Lock() - self.rpcCondVar = Threading.Condition() + self.rpcStatusLock = threading.Lock() + self.rpcCondVar = threading.Condition() + + def Destroy(self): + self.method=None + self.args=None + self.rpcStatus = None + self.rpcStatusLock = None + self.rpcondVar = None def EVT_EXTERNAL_EVENT(win,func): win.Connect(-1,-1,wxEVT_EXTERNAL_EVENT,func) @@ -80,11 +114,28 @@ def EVT_EXTERNAL_EVENT(win,func): class Handler(xmlrpcserver.RequestHandler): """The handler class that the xmlrpcserver actually calls when a request comes in. + """ + def log_message(self,*args): + """ causes the server to stop spewing messages every time a request comes in + + """ + pass def call(self,method,params): """When an xmlrpc request comes in, this is the method that gets called. + + **Arguments** + + - method: name of the method to be called + + - params: arguments to that method + """ + if method == '_rpcPing': + # we just acknowledge these without processing them + return 'ack' + # construct the event evt = ExternalEvent(method,params) @@ -93,16 +144,16 @@ class Handler(xmlrpcserver.RequestHandler): evt.rpcStatus.status = rpcPENDING evt.rpcStatusLock.release() - # acquire the condition lock evt.rpcCondVar.acquire() # dispatch the event to the GUI wxPostEvent(self._app,evt) + # wait for the GUI to finish while evt.rpcStatus.status == rpcPENDING: evt.rpcCondVar.wait() evt.rpcCondVar.release() evt.rpcStatusLock.acquire() - if evt.rpcStatus.stwxTheColourDatabaseatus == rpcEXCEPT: + if evt.rpcStatus.status == rpcEXCEPT: # The GUI threw an exception, release the status lock # and re-raise the exception evt.rpcStatusLock.release() @@ -110,9 +161,36 @@ class Handler(xmlrpcserver.RequestHandler): else: # everything went through without problems s = evt.rpcStatus.result + evt.rpcStatusLock.release() + evt.Destroy() + self._app = None return s +# this global Event is used to let the server thread +# know when it should quit +stopEvent = threading.Event() +stopEvent.clear() + +class _ServerThread(threading.Thread): + """ this is the Thread class which actually runs the server + + """ + def __init__(self,server,verbose=0): + self._xmlServ = server + threading.Thread.__init__(self,verbose=verbose) + + def stop(self): + stopEvent.set() + + def shouldStop(self): + return stopEvent.isSet() + + def run(self): + while not self.shouldStop(): + self._xmlServ.handle_request() + self._xmlServ = None + class rpcMixin: """A mixin class to provide xmlrpc server functionality to wxPython frames/windows @@ -122,68 +200,148 @@ class rpcMixin: RPC is handled. """ - def __init__(self,host='',port=800): - """ - Arguments: - host: (optional) the hostname for the server - port: (optional) the port the server will use + + # we'll try a range of ports for the server, this is the size of the + # range to be scanned + nPortsToTry=20 + if sys.platform == 'win32': + defPort = 800 + else: + defPort = 8023 + + def __init__(self,host='',port=-1,verbose=0,portScan=1): + """Constructor + + **Arguments** + + - host: (optional) the hostname for the server + + - port: (optional) the port the server will use + + - verbose: (optional) if set, the server thread will be launched + in verbose mode + + - portScan: (optional) if set, we'll scan across a number of ports + to find one which is avaiable + """ - EVT_EXTERNAL_EVENT(swxTheColourDatabaseelf,self.OnExternal) + if port == -1: + port = self.defPort + self.verbose=verbose + EVT_EXTERNAL_EVENT(self,self.OnExternal) if hasattr(self,'OnClose'): self._origOnClose = self.OnClose + self.Disconnect(-1,-1,wxEVT_CLOSE_WINDOW) else: self._origOnClose = None - EVT_CLOSE(self,self.OnClose) + self.OnClose = self.RPCOnClose + EVT_CLOSE(self,self.RPCOnClose) - exec('class Handler%d(Handler): pass'%(port)) - exec('tClass= Handler%d'%(port)) + tClass = new.classobj('Handler%d'%(port),(Handler,),{}) tClass._app = self - self._xmlServ = SocketServer.TCPServer((host,port),tClass) - self.servThread = Threading.Thread(target=self._xmlServ.serve_forever) - self.servThread.setDaemon(1) + if portScan: + self.rpcPort = -1 + for i in xrange(self.nPortsToTry): + try: + xmlServ = SocketServer.TCPServer((host,port+i),tClass) + except: + pass + else: + self.rpcPort = port+i + else: + self.rpcPort = port + try: + xmlServ = SocketServer.TCPServer((host,port),tClass) + except: + self.rpcPort = -1 + + if self.rpcPort == -1: + raise 'RPCMixinError','Cannot initialize server' + self.servThread = _ServerThread(xmlServ,verbose=self.verbose) + self.servThread.setName('XML-RPC Server') self.servThread.start() - def OnClose(self,event): - """ be sure to shutdown the server and the server thread before - leaving + def RPCOnClose(self,event): + """ callback for when the application is closed + + be sure to shutdown the server and the server thread before + leaving + """ - self._xmlServ = None - self.servThread = None + # by setting the global stopEvent we inform the server thread + # that it's time to shut down. + stopEvent.set() + if event is not None: + # if we came in here from a user event (as opposed to an RPC event), + # then we'll need to kick the server one last time in order + # to get that thread to terminate. do so now + s1 = xmlrpclib.Server('http://localhost:%d'%(self.rpcPort)) + try: + s1._rpcPing() + except: + pass + if self._origOnClose is not None: self._origOnClose(event) + def RPCQuit(self): + """ shuts down everything, including the rpc server + + """ + self.RPCOnClose(None) def OnExternal(self,event): """ this is the callback used to handle RPCs + **Arguments** + + - event: an _ExternalEvent_ sent by the rpc server + Exceptions are caught and returned in the global _rpcStatus structure. This allows the xmlrpc server to report the exception to the client without mucking up any of the delicate thread stuff. + """ event.rpcStatusLock.acquire() + doQuit = 0 try: - res = eval('apply(self.%s,event.args)'%event.method) - except: - import sys,traceback - traceback.print_exc() - event.rpcStatus.result = sys.exc_info()[:2] + methsplit = string.split(event.method,'.') + meth = self + for piece in methsplit: + meth = getattr(meth,piece) + except AttributeError,msg: + event.rpcStatus.result = 'No Such Method',msg event.rpcStatus.status = rpcEXCEPT else: - if res is None: - event.rpcStatus.result = [] + try: + res = apply(meth,event.args) + except: + import traceback + if self.verbose: traceback.print_exc() + event.rpcStatus.result = sys.exc_info()[:2] + event.rpcStatus.status = rpcEXCEPT else: - event.rpcStatus.result = res - event.rpcStatus.status = rpcDONE + if res is None: + # returning None across the xmlrpc interface is problematic + event.rpcStatus.result = [] + else: + event.rpcStatus.result = res + event.rpcStatus.status = rpcDONE + event.rpcStatusLock.release() + + # broadcast (using the condition var) that we're done with the event event.rpcCondVar.acquire() event.rpcCondVar.notify() event.rpcCondVar.release() + if __name__ == '__main__': - import sys - port = 800 - if len(sys.argv)>1: - port = int(sys.argv[1]) + import time + if sys.platform == 'win32': + port = 800 + else: + port = 8023 class rpcFrame(wxFrame,rpcMixin): """A simple wxFrame with the rpcMixin functionality added @@ -199,6 +357,9 @@ if __name__ == '__main__': if kwargs.has_key('rpcPort'): mixinArgs['port'] = kwargs['rpcPort'] del kwargs['rpcPort'] + if kwargs.has_key('rpcPortScan'): + mixinArgs['portScan'] = kwargs['rpcPortScan'] + del kwargs['rpcPortScan'] apply(wxFrame.__init__,(self,)+args,kwargs) apply(rpcMixin.__init__,(self,),mixinArgs) @@ -220,17 +381,38 @@ if __name__ == '__main__': def OnClose(self,event): self.Destroy() + + class MyApp(wxApp): def OnInit(self): - frame = rpcFrame(NULL, -1, "wxPython RPCDemo", wxDefaultPosition, wxSize(300,300),rpcHost='localhost',rpcPort=port) - frame.Show(TRUE) - import time + self.frame = rpcFrame(NULL, -1, "wxPython RPCDemo", wxDefaultPosition, + wxSize(300,300), + rpcHost='localhost',rpcPort=port) + self.frame.Show(TRUE) + return TRUE - #self.SetTopWindow(frame) - frame2 = rpcFrame(NULL, -1, "wxPython RPCDemo2", wxDefaultPosition, wxSize(300,300),rpcHost='localhost',rpcPort=port+1) - frame2.Show(TRUE) - return TRUE + def testcon(port): + s1 = xmlrpclib.Server('http://localhost:%d'%(port)) + s1.SetTitle('Munged') + s1._rpcPing() + if doQuit: + s1.RPCQuit() + + doQuit = 1 + if len(sys.argv)>1 and sys.argv[1] == '-q': + doQuit = 0 + nT = threading.activeCount() app = MyApp(0) + activePort = app.frame.rpcPort + t = threading.Thread(target=lambda x=activePort:testcon(x),verbose=0) + t.start() + app.MainLoop() + # give the threads time to shut down + if threading.activeCount() > nT: + print 'waiting for all threads to terminate' + while threading.activeCount() > nT: + time.sleep(0.5) + -- 2.45.2