pymoul-svn Mailing List for pyMoul (Page 6)
Status: Alpha
Brought to you by:
tiran
You can subscribe to this list here.
2007 |
Jan
(89) |
Feb
(108) |
Mar
(62) |
Apr
(8) |
May
(9) |
Jun
(2) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
---|
From: <ti...@us...> - 2007-02-16 13:09:45
|
Revision: 174 http://pymoul.svn.sourceforge.net/pymoul/?rev=174&view=rev Author: tiran Date: 2007-02-16 05:09:45 -0800 (Fri, 16 Feb 2007) Log Message: ----------- Added hacky code to move the number in the right position Modified Paths: -------------- pymoul/trunk/src/moul/qt/dninumbers.py pymoul/trunk/src/moul/qt/mainwindow.py Property Changed: ---------------- pymoul/trunk/src/moul/qt/dninumbers.py Modified: pymoul/trunk/src/moul/qt/dninumbers.py =================================================================== --- pymoul/trunk/src/moul/qt/dninumbers.py 2007-02-15 18:18:46 UTC (rev 173) +++ pymoul/trunk/src/moul/qt/dninumbers.py 2007-02-16 13:09:45 UTC (rev 174) @@ -19,8 +19,8 @@ """Moul QT D'ni Number renderer """ __author__ = "Christian Heimes" -__version__ = "$Id: wdysini.py 144 2007-02-06 03:51:21Z tiran $" -__revision__ = "$Revision: 144 $" +__version__ = "$Id$" +__revision__ = "$Revision$" import sys from PyQt4 import QtCore @@ -127,6 +127,7 @@ self.dni = None self.height = None self.numbers = () + self._layout = None def setDniNumbers(self, dninumbers): """Set D'ni number instance @@ -163,6 +164,20 @@ self.setMaximumSize(self.width, self.height) self.resize(self.width, self.height) + def setPosition(self, layout, row, col, position): + """Set position (hack) + """ + self._layout = None + if position == QtCore.Qt.AlignLeft: + return + elif position == QtCore.Qt.AlignCenter: + pass + elif position == QtCore.Qt.AlignRight: + pass + else: + raise ValueError(position) + self._layout = layout, row, col, position + def paintEvent(self, event): """Render and paint numbers """ @@ -178,3 +193,14 @@ painter.drawPixmap(0, 0, self._pmleft) painter.drawPixmap(self.width-self._pmright.width(), 0, self._pmright) painter.end() + + # remove the hack! + if self._layout is not None: + layout, row, col, position = self._layout + x, y, w, h = layout.cellRect(row, col).getRect() + geometry = self.geometry() + movex = self.width - w + if position == QtCore.Qt.AlignCenter: + movex = movex // 2 + self.move(geometry.x()+movex, geometry.y()) + self._layout = None Property changes on: pymoul/trunk/src/moul/qt/dninumbers.py ___________________________________________________________________ Name: svn:keywords + Id Revision Name: svn:eol-style + native Modified: pymoul/trunk/src/moul/qt/mainwindow.py =================================================================== --- pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-15 18:18:46 UTC (rev 173) +++ pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-16 13:09:45 UTC (rev 174) @@ -554,9 +554,10 @@ dnipix = QDniNumberWidget(widget) dnipix.setDniNumbers(self._dninumbers) dnipix.setHeight(25) - dnipix.setNumbers(5, 24) - dnipix.setObjectName("dnw_dninumber_test") - grid.addWidget(dnipix, 5, 8, 1, 2) + dnipix.setNumbers(1, 0) + dnipix.setObjectName("dnw_dninumber_250") + dnipix.setPosition(grid, 5, 0, QtCore.Qt.AlignRight) + grid.addWidget(dnipix, 5, 0, 1, 2) class PingServerThread(QtCore.QThread): def __init__(self, parent=None): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ti...@us...> - 2007-02-15 18:18:46
|
Revision: 173 http://pymoul.svn.sourceforge.net/pymoul/?rev=173&view=rev Author: tiran Date: 2007-02-15 10:18:46 -0800 (Thu, 15 Feb 2007) Log Message: ----------- Added Dni number stuff for Qt Modified Paths: -------------- pymoul/trunk/src/moul/qt/mainwindow.py Added Paths: ----------- pymoul/trunk/src/moul/qt/dninumbers.py Added: pymoul/trunk/src/moul/qt/dninumbers.py =================================================================== --- pymoul/trunk/src/moul/qt/dninumbers.py (rev 0) +++ pymoul/trunk/src/moul/qt/dninumbers.py 2007-02-15 18:18:46 UTC (rev 173) @@ -0,0 +1,180 @@ +# pyMoul - Python interface to Myst Online URU Live +# Copyright (C) 2007 Christian Heimes <christian (at) cheimes (dot) de> + +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +# more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., 59 +# Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +"""Moul QT D'ni Number renderer +""" +__author__ = "Christian Heimes" +__version__ = "$Id: wdysini.py 144 2007-02-06 03:51:21Z tiran $" +__revision__ = "$Revision: 144 $" + +import sys +from PyQt4 import QtCore +from PyQt4 import QtGui +from PyQt4.QtCore import Qt +from PyQt4.QtCore import SIGNAL +from PyQt4.QtCore import pyqtSignature + +from moul.qt.utils import QNamespaceContainer +from moul.qt.utils import QSignalLoggerMetaclass +from moul.qt.utils import questionMB +from moul.qt.utils import criticalMB + + +class QDniNumbers(object): + """Qt D'ni Number helper class + + Lookup and scale pixmaps for D'ni numbers + """ + def __init__(self): + self.pixmaps = {} + for i in range(0, 26): + self.pixmaps[i] = QtGui.QPixmap( + ":/dninumbers/resources/dninumbers/%02i.png" % i) + self.pixmaps['cyclic'] = QtGui.QPixmap( + ":/dninumbers/resources/dninumbers/00c.png") + # w, h = 67, 55 + self._rectleft = QtCore.QRect(0, 0, 60, 55) # with right border + self._rectright = QtCore.QRect(12, 0, 55, 55) # w/o left border + self._rectmiddle = QtCore.QRect(12, 0, 49, 55) # right line + + @staticmethod + def _scale(pixmap, height=None): + """Scale a pixmap to height + """ + if height is not None: + return pixmap.scaledToHeight(height, QtCore.Qt.SmoothTransformation) + else: + return pixmap + + def get(self, nr, height=None): + """Get pixmap by number and scale it + + @param nr: number (0-25, 'cyclic') + @type nr: int or str + @param height: scale pixmap to height + @param height: int or None for default size + @return: (scaled) pixmap + @rtype: QPixmap instance + """ + try: + nr = int(nr) + except ValueError: + pass + pixmap = self.pixmaps[nr] + return self._scale(pixmap, height) + + def getLeft(self, nr, height=None): + """Get pixmap for left digit of combined number + + @param nr: number (0-25, 'cyclic') + @type nr: int or str + @param height: scale pixmap to height + @param height: int or None for default size + @return: (scaled) pixmap + @rtype: QPixmap instance + """ + pixmap = self.get(nr).copy(self._rectleft) + return self._scale(pixmap, height) + + def getRight(self, nr, height=None): + """Get pixmap for right digit of combined number + + @param nr: number (0-25, 'cyclic') + @type nr: int or str + @param height: scale pixmap to height + @param height: int or None for default size + @return: (scaled) pixmap + @rtype: QPixmap instance + """ + pixmap = self.get(nr).copy(self._rectright) + return self._scale(pixmap, height) + + def getMiddle(self, nr, heigh=None): + """Get pixmap for middle digit of combined number + + @param nr: number (0-25, 'cyclic') + @type nr: int or str + @param height: scale pixmap to height + @param height: int or None for default size + @return: (scaled) pixmap + @rtype: QPixmap instance + """ + pixmap = self.get(nr).copy(self._rectmiddle) + return self._scale(pixmap, height) + +class QDniNumberWidget(QtGui.QWidget): + """Q D'ni number widget + + Displays combined number + """ + def __init__(self, parent): + QtGui.QWidget.__init__(self, parent) + self.dni = None + self.height = None + self.numbers = () + + def setDniNumbers(self, dninumbers): + """Set D'ni number instance + """ + if not isinstance(dninumbers, QDniNumbers): + raise TypeError(type(dninumbers)) + self.dni = dninumbers + + def setHeight(self, height=None): + """Set height to scale + """ + self.height=height + + def setNumbers(self, *args): + """Set numbers to display + """ + valid = tuple(range(0, 26)) + ('cyclic',) + for number in args: + if not isinstance(number, int): + raise TypeError(number) + if number not in valid: + raise ValueError(number) + self.numbers = args + self._pmleft = self.dni.getLeft(self.numbers[0], height=self.height) + self._pmright = self.dni.getRight(self.numbers[-1], height=self.height) + self._pmmiddle = [self.dni.getMiddle(nr, height=self.height) + for nr in self.numbers[1:-1]] + if self._pmmiddle: + raise NotImplementedError + else: + middlewidth = 0 + self.width = self._pmleft.width() + self._pmright.width() + middlewidth + self.setMinimumSize(self.width, self.height) + self.setMaximumSize(self.width, self.height) + self.resize(self.width, self.height) + + def paintEvent(self, event): + """Render and paint numbers + """ + painter = QtGui.QPainter() + painter.begin(self) + #rect = painter.viewport() + #size = QtCore.QSize(width, height) + #size.scale(rect.size(), QtCore.Qt.KeepAspectRatio) + #painter.setViewport(0, 0, size.width(), size.height()) + #painter.setWindow(self.parent().rect()) + + # left + painter.drawPixmap(0, 0, self._pmleft) + painter.drawPixmap(self.width-self._pmright.width(), 0, self._pmright) + painter.end() Modified: pymoul/trunk/src/moul/qt/mainwindow.py =================================================================== --- pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-15 12:30:31 UTC (rev 172) +++ pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-15 18:18:46 UTC (rev 173) @@ -52,6 +52,8 @@ from moul.qt.threadlet import Threadlet from moul.qt.ui.mainwindow import Ui_MainWindow from moul.qt import utils as qtutils +from moul.qt.dninumbers import QDniNumbers +from moul.qt.dninumbers import QDniNumberWidget LOG = getLogger('moul.qt') @@ -505,6 +507,8 @@ LOG.error("Ping thread is already running") def _dninumbers_init(self): + self._dninumbers = QDniNumbers() + height = 25 widget = self.gridLayout_3 grid = self.gridlayout3 alignl = QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter @@ -516,9 +520,7 @@ nr.setAlignment(alignc) nr.setText(str(i + j*5)) grid.addWidget(nr, j, i*2) - dni_pic = QtGui.QPixmap(":/dninumbers/resources/dninumbers/%02i.png" % (i + j*5)) - #dni_pic.scale(20, 20, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation) - dni_pic = dni_pic.scaledToHeight(30, QtCore.Qt.SmoothTransformation) + dni_pic = self._dninumbers.get(i + j*5, height=height) dni = QtGui.QLabel(widget) dni.setObjectName("lb_dninumber_%02i_%02i" % (i, j)) dni.setPixmap(dni_pic) @@ -530,8 +532,7 @@ nr.setAlignment(alignc) nr.setText("25") grid.addWidget(nr, 5, 2) - dni_pic = QtGui.QPixmap(":/dninumbers/resources/dninumbers/25.png") - dni_pic = dni_pic.scaledToHeight(30, QtCore.Qt.SmoothTransformation) + dni_pic = self._dninumbers.get(25, height=height) dni = QtGui.QLabel(widget) dni.setObjectName("lb_dninumber_25") dni.setAlignment(alignl) @@ -541,16 +542,22 @@ nr = QtGui.QLabel(widget) nr.setObjectName("lb_dninumber_nr_00c") nr.setAlignment(alignc) - nr.setText("cyclic 0") + nr.setText(self.trUtf8("cyclic 0")) grid.addWidget(nr, 5, 5, 1, 2) - dni_pic = QtGui.QPixmap(":/dninumbers/resources/dninumbers/00c.png") - dni_pic = dni_pic.scaledToHeight(30, QtCore.Qt.SmoothTransformation) + dni_pic = self._dninumbers.get("cyclic", height=height) dni = QtGui.QLabel(widget) dni.setObjectName("lb_dninumber_00c") dni.setAlignment(alignl) dni.setPixmap(dni_pic) grid.addWidget(dni, 5, 7) + dnipix = QDniNumberWidget(widget) + dnipix.setDniNumbers(self._dninumbers) + dnipix.setHeight(25) + dnipix.setNumbers(5, 24) + dnipix.setObjectName("dnw_dninumber_test") + grid.addWidget(dnipix, 5, 8, 1, 2) + class PingServerThread(QtCore.QThread): def __init__(self, parent=None): QtCore.QThread.__init__(self, parent) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ti...@us...> - 2007-02-15 12:30:31
|
Revision: 172 http://pymoul.svn.sourceforge.net/pymoul/?rev=172&view=rev Author: tiran Date: 2007-02-15 04:30:31 -0800 (Thu, 15 Feb 2007) Log Message: ----------- Much better alignement of D'ni numbers Modified Paths: -------------- pymoul/trunk/src/moul/qt/mainwindow.py pymoul/trunk/src/moul/qt/ui/mainwindow.py pymoul/trunk/src/moul/qt/ui/mainwindow.ui Modified: pymoul/trunk/src/moul/qt/mainwindow.py =================================================================== --- pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-15 03:14:42 UTC (rev 171) +++ pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-15 12:30:31 UTC (rev 172) @@ -505,48 +505,51 @@ LOG.error("Ping thread is already running") def _dninumbers_init(self): - # XXX needs better alignment widget = self.gridLayout_3 grid = self.gridlayout3 - alignvcr = QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter + alignl = QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter + alignc = QtCore.Qt.AlignCenter | QtCore.Qt.AlignVCenter for i in range(0, 5): for j in range(0, 5): nr = QtGui.QLabel(widget) nr.setObjectName("lb_dninumber_nr_%02i_%02i" % (i, j)) - nr.setAlignment(alignvcr) + nr.setAlignment(alignc) nr.setText(str(i + j*5)) grid.addWidget(nr, j, i*2) - dni = QtGui.QLabel(widget) - dni.setObjectName("lb_dninumber_%02i_%02i" % (i, j)) dni_pic = QtGui.QPixmap(":/dninumbers/resources/dninumbers/%02i.png" % (i + j*5)) #dni_pic.scale(20, 20, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation) dni_pic = dni_pic.scaledToHeight(30, QtCore.Qt.SmoothTransformation) + dni = QtGui.QLabel(widget) + dni.setObjectName("lb_dninumber_%02i_%02i" % (i, j)) dni.setPixmap(dni_pic) + dni.setAlignment(alignl) grid.addWidget(dni, j, i*2+1) nr = QtGui.QLabel(widget) nr.setObjectName("lb_dninumber_nr_25") - nr.setAlignment(alignvcr) + nr.setAlignment(alignc) nr.setText("25") - grid.addWidget(nr, 5, 3) + grid.addWidget(nr, 5, 2) + dni_pic = QtGui.QPixmap(":/dninumbers/resources/dninumbers/25.png") + dni_pic = dni_pic.scaledToHeight(30, QtCore.Qt.SmoothTransformation) dni = QtGui.QLabel(widget) dni.setObjectName("lb_dninumber_25") - dni_pic = QtGui.QPixmap(":/dninumbers/resources/dninumbers/25.png") - dni_pic = dni_pic.scaledToHeight(30, QtCore.Qt.SmoothTransformation) + dni.setAlignment(alignl) dni.setPixmap(dni_pic) - grid.addWidget(dni, 5, 4) + grid.addWidget(dni, 5, 3) nr = QtGui.QLabel(widget) nr.setObjectName("lb_dninumber_nr_00c") - nr.setAlignment(alignvcr) + nr.setAlignment(alignc) nr.setText("cyclic 0") - grid.addWidget(nr, 5, 5) + grid.addWidget(nr, 5, 5, 1, 2) + dni_pic = QtGui.QPixmap(":/dninumbers/resources/dninumbers/00c.png") + dni_pic = dni_pic.scaledToHeight(30, QtCore.Qt.SmoothTransformation) dni = QtGui.QLabel(widget) dni.setObjectName("lb_dninumber_00c") - dni_pic = QtGui.QPixmap(":/dninumbers/resources/dninumbers/00c.png") - dni_pic = dni_pic.scaledToHeight(30, QtCore.Qt.SmoothTransformation) + dni.setAlignment(alignl) dni.setPixmap(dni_pic) - grid.addWidget(dni, 5, 6) + grid.addWidget(dni, 5, 7) class PingServerThread(QtCore.QThread): def __init__(self, parent=None): Modified: pymoul/trunk/src/moul/qt/ui/mainwindow.py =================================================================== --- pymoul/trunk/src/moul/qt/ui/mainwindow.py 2007-02-15 03:14:42 UTC (rev 171) +++ pymoul/trunk/src/moul/qt/ui/mainwindow.py 2007-02-15 12:30:31 UTC (rev 172) @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file './src/moul/qt/ui/mainwindow.ui' # -# Created: Thu Feb 15 03:57:16 2007 +# Created: Thu Feb 15 13:28:03 2007 # by: PyQt4 UI code generator 4.1.1 # # WARNING! All changes made in this file will be lost! @@ -875,7 +875,7 @@ self.gb_dninumbers.setObjectName("gb_dninumbers") self.gridLayout_3 = QtGui.QWidget(self.gb_dninumbers) - self.gridLayout_3.setGeometry(QtCore.QRect(10,20,431,341)) + self.gridLayout_3.setGeometry(QtCore.QRect(10,20,411,341)) self.gridLayout_3.setObjectName("gridLayout_3") self.gridlayout3 = QtGui.QGridLayout(self.gridLayout_3) @@ -930,9 +930,9 @@ self.lb_doc_status.setBuddy(self.pb_doc_loadjournals) self.retranslateUi(MainWindow) - self.tabwidget.setCurrentIndex(3) + self.tabwidget.setCurrentIndex(0) self.tab_sub_settings.setCurrentIndex(0) - self.tabWidget.setCurrentIndex(2) + self.tabWidget.setCurrentIndex(0) self.tabwidget_about.setCurrentIndex(0) QtCore.QObject.connect(self.main_buttonbox,QtCore.SIGNAL("rejected()"),MainWindow.close) QtCore.QMetaObject.connectSlotsByName(MainWindow) Modified: pymoul/trunk/src/moul/qt/ui/mainwindow.ui =================================================================== --- pymoul/trunk/src/moul/qt/ui/mainwindow.ui 2007-02-15 03:14:42 UTC (rev 171) +++ pymoul/trunk/src/moul/qt/ui/mainwindow.ui 2007-02-15 12:30:31 UTC (rev 172) @@ -110,7 +110,7 @@ <enum>QTabWidget::North</enum> </property> <property name="currentIndex" > - <number>3</number> + <number>0</number> </property> <widget class="QWidget" name="tab_tasks" > <attribute name="title" > @@ -1648,7 +1648,7 @@ </rect> </property> <property name="currentIndex" > - <number>2</number> + <number>0</number> </property> <widget class="QWidget" name="tab_sub_chatlogs" > <attribute name="title" > @@ -1891,7 +1891,7 @@ <rect> <x>10</x> <y>20</y> - <width>431</width> + <width>411</width> <height>341</height> </rect> </property> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ti...@us...> - 2007-02-15 03:14:41
|
Revision: 171 http://pymoul.svn.sourceforge.net/pymoul/?rev=171&view=rev Author: tiran Date: 2007-02-14 19:14:42 -0800 (Wed, 14 Feb 2007) Log Message: ----------- Property fixes Modified Paths: -------------- pymoul/trunk/Makefile.in pymoul/trunk/src/moul/crypt/tests/test_binaryrecord.py pymoul/trunk/src/moul/time/utils.py Property Changed: ---------------- pymoul/trunk/src/moul/crypt/binaryrecord.py pymoul/trunk/src/moul/crypt/tests/test_binaryrecord.py pymoul/trunk/src/moul/time/utils.py Modified: pymoul/trunk/Makefile.in =================================================================== --- pymoul/trunk/Makefile.in 2007-02-15 03:13:10 UTC (rev 170) +++ pymoul/trunk/Makefile.in 2007-02-15 03:14:42 UTC (rev 171) @@ -75,7 +75,9 @@ propset: $(FINDPYTXT) | xargs svn propset svn:keywords "Id Revision" - $(FINDTEXT) | xargs svn propset svn:eol-style "native" + $(FINDTEXT) | xargs svn propset svn:eol-style "native" + find src/moul -name '*.png' $(NOTSVN) | xargs svn propset \ + svn:mimetype image/png fixlineendings: $(FINDPY) | xargs recode -f ibmpc..latin1 Property changes on: pymoul/trunk/src/moul/crypt/binaryrecord.py ___________________________________________________________________ Name: svn:keywords + Id Revision Name: svn:eol-style + native Modified: pymoul/trunk/src/moul/crypt/tests/test_binaryrecord.py =================================================================== --- pymoul/trunk/src/moul/crypt/tests/test_binaryrecord.py 2007-02-15 03:13:10 UTC (rev 170) +++ pymoul/trunk/src/moul/crypt/tests/test_binaryrecord.py 2007-02-15 03:14:42 UTC (rev 171) @@ -18,8 +18,8 @@ """moul.crypt.binaryrecord unit tests """ __author__ = "Christian Heimes" -__version__ = "$Id: test_elf.py 122 2007-02-02 17:34:06Z tiran $" -__revision__ = "$Revision: 122 $" +__version__ = "$Id$" +__revision__ = "$Revision$" import os import unittest Property changes on: pymoul/trunk/src/moul/crypt/tests/test_binaryrecord.py ___________________________________________________________________ Name: svn:keywords + Id Revision Name: svn:eol-style + native Modified: pymoul/trunk/src/moul/time/utils.py =================================================================== --- pymoul/trunk/src/moul/time/utils.py 2007-02-15 03:13:10 UTC (rev 170) +++ pymoul/trunk/src/moul/time/utils.py 2007-02-15 03:14:42 UTC (rev 171) @@ -18,8 +18,8 @@ """pyMoul cavern time tool """ __author__ = "Christian Heimes" -__version__ = "$Id: cavern.py 124 2007-02-02 17:45:42Z tiran $" -__revision__ = "$Revision: 124 $" +__version__ = "$Id$" +__revision__ = "$Revision$" from moul.osdependent import __FROZEN__ # pytz is an egg Property changes on: pymoul/trunk/src/moul/time/utils.py ___________________________________________________________________ Name: svn:keywords + Id Revision Name: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ti...@us...> - 2007-02-15 03:13:11
|
Revision: 170 http://pymoul.svn.sourceforge.net/pymoul/?rev=170&view=rev Author: tiran Date: 2007-02-14 19:13:10 -0800 (Wed, 14 Feb 2007) Log Message: ----------- Added D'ni number tab to UI Modified Paths: -------------- pymoul/trunk/src/moul/qt/mainwindow.py pymoul/trunk/src/moul/qt/ui/mainwindow.py pymoul/trunk/src/moul/qt/ui/mainwindow.ui Modified: pymoul/trunk/src/moul/qt/mainwindow.py =================================================================== --- pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-15 02:26:43 UTC (rev 169) +++ pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-15 03:13:10 UTC (rev 170) @@ -87,6 +87,7 @@ self.urupersonaldir.initializeFactories() # init handlers + self._dninumbers_init() self._timezone_init() self._ping_init() self._systray_init() @@ -336,10 +337,9 @@ mb.exec_() return logzipper = self.urupersonaldr.logzipper - logzipper.setZip(self.radio_ziplogs.isChecked() - # always remove + logzipper.setZip(self.radio_ziplogs.isChecked()) + # always remove: self.radio_deletelogs.isChecked() logzipper.setRemove(True) - #doremove = self.radio_deletelogs.isChecked() # ************************************************************************ # system tray @@ -504,6 +504,50 @@ else: LOG.error("Ping thread is already running") + def _dninumbers_init(self): + # XXX needs better alignment + widget = self.gridLayout_3 + grid = self.gridlayout3 + alignvcr = QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter + for i in range(0, 5): + for j in range(0, 5): + nr = QtGui.QLabel(widget) + nr.setObjectName("lb_dninumber_nr_%02i_%02i" % (i, j)) + nr.setAlignment(alignvcr) + nr.setText(str(i + j*5)) + grid.addWidget(nr, j, i*2) + dni = QtGui.QLabel(widget) + dni.setObjectName("lb_dninumber_%02i_%02i" % (i, j)) + dni_pic = QtGui.QPixmap(":/dninumbers/resources/dninumbers/%02i.png" % (i + j*5)) + #dni_pic.scale(20, 20, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation) + dni_pic = dni_pic.scaledToHeight(30, QtCore.Qt.SmoothTransformation) + dni.setPixmap(dni_pic) + grid.addWidget(dni, j, i*2+1) + + nr = QtGui.QLabel(widget) + nr.setObjectName("lb_dninumber_nr_25") + nr.setAlignment(alignvcr) + nr.setText("25") + grid.addWidget(nr, 5, 3) + dni = QtGui.QLabel(widget) + dni.setObjectName("lb_dninumber_25") + dni_pic = QtGui.QPixmap(":/dninumbers/resources/dninumbers/25.png") + dni_pic = dni_pic.scaledToHeight(30, QtCore.Qt.SmoothTransformation) + dni.setPixmap(dni_pic) + grid.addWidget(dni, 5, 4) + + nr = QtGui.QLabel(widget) + nr.setObjectName("lb_dninumber_nr_00c") + nr.setAlignment(alignvcr) + nr.setText("cyclic 0") + grid.addWidget(nr, 5, 5) + dni = QtGui.QLabel(widget) + dni.setObjectName("lb_dninumber_00c") + dni_pic = QtGui.QPixmap(":/dninumbers/resources/dninumbers/00c.png") + dni_pic = dni_pic.scaledToHeight(30, QtCore.Qt.SmoothTransformation) + dni.setPixmap(dni_pic) + grid.addWidget(dni, 5, 6) + class PingServerThread(QtCore.QThread): def __init__(self, parent=None): QtCore.QThread.__init__(self, parent) Modified: pymoul/trunk/src/moul/qt/ui/mainwindow.py =================================================================== --- pymoul/trunk/src/moul/qt/ui/mainwindow.py 2007-02-15 02:26:43 UTC (rev 169) +++ pymoul/trunk/src/moul/qt/ui/mainwindow.py 2007-02-15 03:13:10 UTC (rev 170) @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file './src/moul/qt/ui/mainwindow.ui' # -# Created: Mon Feb 12 20:15:18 2007 +# Created: Thu Feb 15 03:57:16 2007 # by: PyQt4 UI code generator 4.1.1 # # WARNING! All changes made in this file will be lost! @@ -866,6 +866,23 @@ self.tb_journal_view.setOpenExternalLinks(True) self.tb_journal_view.setObjectName("tb_journal_view") self.tabWidget.addTab(self.tab_sub_journals,"") + + self.tab = QtGui.QWidget() + self.tab.setObjectName("tab") + + self.gb_dninumbers = QtGui.QGroupBox(self.tab) + self.gb_dninumbers.setGeometry(QtCore.QRect(10,0,451,371)) + self.gb_dninumbers.setObjectName("gb_dninumbers") + + self.gridLayout_3 = QtGui.QWidget(self.gb_dninumbers) + self.gridLayout_3.setGeometry(QtCore.QRect(10,20,431,341)) + self.gridLayout_3.setObjectName("gridLayout_3") + + self.gridlayout3 = QtGui.QGridLayout(self.gridLayout_3) + self.gridlayout3.setMargin(0) + self.gridlayout3.setSpacing(6) + self.gridlayout3.setObjectName("gridlayout3") + self.tabWidget.addTab(self.tab,"") self.tabwidget.addTab(self.tab_browse,"") self.tab_about = QtGui.QWidget() @@ -913,9 +930,9 @@ self.lb_doc_status.setBuddy(self.pb_doc_loadjournals) self.retranslateUi(MainWindow) - self.tabwidget.setCurrentIndex(0) + self.tabwidget.setCurrentIndex(3) self.tab_sub_settings.setCurrentIndex(0) - self.tabWidget.setCurrentIndex(0) + self.tabWidget.setCurrentIndex(2) self.tabwidget_about.setCurrentIndex(0) QtCore.QObject.connect(self.main_buttonbox,QtCore.SIGNAL("rejected()"),MainWindow.close) QtCore.QMetaObject.connectSlotsByName(MainWindow) @@ -926,9 +943,9 @@ self.lb_log_archive.setText(QtGui.QApplication.translate("MainWindow", "Archive chatlogs and zip log files", None, QtGui.QApplication.UnicodeUTF8)) self.pb_log_remove.setText(QtGui.QApplication.translate("MainWindow", "Remove", None, QtGui.QApplication.UnicodeUTF8)) self.pb_log_archive.setText(QtGui.QApplication.translate("MainWindow", "Archive", None, QtGui.QApplication.UnicodeUTF8)) - self.radio_ziplogs.setText(QtGui.QApplication.translate("MainWindow", "Zip debug logs", None, QtGui.QApplication.UnicodeUTF8)) + self.radio_ziplogs.setText(QtGui.QApplication.translate("MainWindow", "Zip and delete debug logs", None, QtGui.QApplication.UnicodeUTF8)) self.radio_deletelogs.setText(QtGui.QApplication.translate("MainWindow", "Delete debug logs", None, QtGui.QApplication.UnicodeUTF8)) - self.lb_log_remove.setText(QtGui.QApplication.translate("MainWindow", "Remove zipped logs", None, QtGui.QApplication.UnicodeUTF8)) + self.lb_log_remove.setText(QtGui.QApplication.translate("MainWindow", "Remove all zipped logs", None, QtGui.QApplication.UnicodeUTF8)) self.groupBox_2.setTitle(QtGui.QApplication.translate("MainWindow", "KI Image repair", None, QtGui.QApplication.UnicodeUTF8)) self.pb_kiimage_repair.setText(QtGui.QApplication.translate("MainWindow", "Repair", None, QtGui.QApplication.UnicodeUTF8)) self.pb_kiimage_repair1.setText(QtGui.QApplication.translate("MainWindow", "Fix KI and avatar images", None, QtGui.QApplication.UnicodeUTF8)) @@ -996,6 +1013,8 @@ self.pb_doc_loadjournals.setText(QtGui.QApplication.translate("MainWindow", "Load journals", None, QtGui.QApplication.UnicodeUTF8)) self.lb_doc_status.setText(QtGui.QApplication.translate("MainWindow", "TextLabel", None, QtGui.QApplication.UnicodeUTF8)) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_sub_journals), QtGui.QApplication.translate("MainWindow", "Journals", None, QtGui.QApplication.UnicodeUTF8)) + self.gb_dninumbers.setTitle(QtGui.QApplication.translate("MainWindow", "D\'ni Numbers", None, QtGui.QApplication.UnicodeUTF8)) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), QtGui.QApplication.translate("MainWindow", "D\'ni Numbers", None, QtGui.QApplication.UnicodeUTF8)) self.tabwidget.setTabText(self.tabwidget.indexOf(self.tab_browse), QtGui.QApplication.translate("MainWindow", "Browse", None, QtGui.QApplication.UnicodeUTF8)) self.tb_abouttext.setHtml(QtGui.QApplication.translate("MainWindow", "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n" "p, li { white-space: pre-wrap; }\n" Modified: pymoul/trunk/src/moul/qt/ui/mainwindow.ui =================================================================== --- pymoul/trunk/src/moul/qt/ui/mainwindow.ui 2007-02-15 02:26:43 UTC (rev 169) +++ pymoul/trunk/src/moul/qt/ui/mainwindow.ui 2007-02-15 03:13:10 UTC (rev 170) @@ -110,7 +110,7 @@ <enum>QTabWidget::North</enum> </property> <property name="currentIndex" > - <number>0</number> + <number>3</number> </property> <widget class="QWidget" name="tab_tasks" > <attribute name="title" > @@ -1648,7 +1648,7 @@ </rect> </property> <property name="currentIndex" > - <number>0</number> + <number>2</number> </property> <widget class="QWidget" name="tab_sub_chatlogs" > <attribute name="title" > @@ -1870,6 +1870,42 @@ </widget> </widget> </widget> + <widget class="QWidget" name="tab" > + <attribute name="title" > + <string>D'ni Numbers</string> + </attribute> + <widget class="QGroupBox" name="gb_dninumbers" > + <property name="geometry" > + <rect> + <x>10</x> + <y>0</y> + <width>451</width> + <height>371</height> + </rect> + </property> + <property name="title" > + <string>D'ni Numbers</string> + </property> + <widget class="QWidget" name="gridLayout_3" > + <property name="geometry" > + <rect> + <x>10</x> + <y>20</y> + <width>431</width> + <height>341</height> + </rect> + </property> + <layout class="QGridLayout" > + <property name="margin" > + <number>0</number> + </property> + <property name="spacing" > + <number>6</number> + </property> + </layout> + </widget> + </widget> + </widget> </widget> </widget> <widget class="QWidget" name="tab_about" > This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ti...@us...> - 2007-02-15 02:26:42
|
Revision: 169 http://pymoul.svn.sourceforge.net/pymoul/?rev=169&view=rev Author: tiran Date: 2007-02-14 18:26:43 -0800 (Wed, 14 Feb 2007) Log Message: ----------- Added image to resource Fixed mimetype of images Modified Paths: -------------- pymoul/trunk/src/moul/qt/ui/moulqt.qrc pymoul/trunk/src/moul/qt/ui/moulqt_rc.py Property Changed: ---------------- pymoul/trunk/src/moul/qt/ui/resources/dninumbers/00.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/00c.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/01.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/02.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/03.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/04.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/05.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/06.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/07.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/08.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/09.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/10.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/11.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/12.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/13.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/14.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/15.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/16.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/17.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/18.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/19.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/20.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/21.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/22.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/23.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/24.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/25.png pymoul/trunk/src/moul/qt/ui/resources/moul_logo.png pymoul/trunk/src/moul/qt/ui/resources/uru_icon_32x32.png Modified: pymoul/trunk/src/moul/qt/ui/moulqt.qrc =================================================================== --- pymoul/trunk/src/moul/qt/ui/moulqt.qrc 2007-02-15 02:14:13 UTC (rev 168) +++ pymoul/trunk/src/moul/qt/ui/moulqt.qrc 2007-02-15 02:26:43 UTC (rev 169) @@ -3,4 +3,33 @@ <file>resources/moul_logo.png</file> <file>resources/uru_icon_32x32.png</file> </qresource> + <qresource prefix="/dninumbers" > + <file>resources/dninumbers/00.png</file> + <file>resources/dninumbers/00c.png</file> + <file>resources/dninumbers/01.png</file> + <file>resources/dninumbers/02.png</file> + <file>resources/dninumbers/03.png</file> + <file>resources/dninumbers/04.png</file> + <file>resources/dninumbers/05.png</file> + <file>resources/dninumbers/06.png</file> + <file>resources/dninumbers/07.png</file> + <file>resources/dninumbers/08.png</file> + <file>resources/dninumbers/09.png</file> + <file>resources/dninumbers/10.png</file> + <file>resources/dninumbers/11.png</file> + <file>resources/dninumbers/12.png</file> + <file>resources/dninumbers/13.png</file> + <file>resources/dninumbers/14.png</file> + <file>resources/dninumbers/15.png</file> + <file>resources/dninumbers/16.png</file> + <file>resources/dninumbers/17.png</file> + <file>resources/dninumbers/18.png</file> + <file>resources/dninumbers/19.png</file> + <file>resources/dninumbers/20.png</file> + <file>resources/dninumbers/21.png</file> + <file>resources/dninumbers/22.png</file> + <file>resources/dninumbers/23.png</file> + <file>resources/dninumbers/24.png</file> + <file>resources/dninumbers/25.png</file> + </qresource> </RCC> Modified: pymoul/trunk/src/moul/qt/ui/moulqt_rc.py =================================================================== --- pymoul/trunk/src/moul/qt/ui/moulqt_rc.py 2007-02-15 02:14:13 UTC (rev 168) +++ pymoul/trunk/src/moul/qt/ui/moulqt_rc.py 2007-02-15 02:26:43 UTC (rev 169) @@ -2,7 +2,7 @@ # Resource object code # -# Created: Fr Feb 2 18:43:48 2007 +# Created: Do Feb 15 03:19:29 2007 # by: The Resource Compiler for PyQt (Qt v4.2.0) # # WARNING! All changes made in this file will be lost! @@ -3355,9 +3355,1169 @@ \xce\xc7\x8e\x8b\x69\x60\x6f\x6f\xc5\xad\xbd\x43\x54\x55\xb0\x1b\ \x06\x3a\xeb\x71\x51\x32\x26\xcd\xff\x03\xbd\xf7\x7d\xa3\xd4\x5a\ \x95\xe9\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x02\xa5\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x44\x00\x00\x00\x37\x08\x06\x00\x00\x00\xb5\xa5\xec\xdd\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ +\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd7\x02\ +\x0f\x02\x08\x14\x30\xcb\x4f\x1a\x00\x00\x00\x1d\x74\x45\x58\x74\ +\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\x64\x20\ +\x77\x69\x74\x68\x20\x54\x68\x65\x20\x47\x49\x4d\x50\xef\x64\x25\ +\x6e\x00\x00\x02\x1b\x49\x44\x41\x54\x68\xde\xed\xd9\x4b\x2f\x24\ +\x51\x14\xc0\xf1\x7f\x99\xde\x11\x66\xb0\xf4\x18\x63\xec\x25\x3a\ +\xd6\x16\x76\x7c\x05\x44\x87\x19\x91\x09\x3e\x80\x05\x11\x11\xef\ +\x2f\xc0\x77\xf0\x01\x2c\x24\x88\xa0\xd1\x7b\xe6\xe1\x31\xbb\x59\ +\x0c\x6b\xaf\x85\xae\x85\x4e\x9d\xea\x94\xae\xae\x7b\xda\xbd\x27\ +\xa9\xcd\xbd\x95\x53\x55\xbf\x4a\xee\xe3\x5c\x0f\xa8\x01\x76\x70\ +\x01\x30\x95\x02\x3e\x00\x5d\xce\x02\x80\xba\x2a\x67\xf0\x3a\x1c\ +\x88\x03\x71\x20\x91\xc2\xcb\x0f\xaa\x9d\x42\x7f\x56\x68\x4f\xc7\ +\xf0\xec\x01\x60\x32\xa0\xfd\x2f\x30\x08\xdc\xc6\xf0\x8c\x0d\xe1\ +\xdb\xa6\x80\xbd\x80\xf6\x8b\x62\x09\x9f\x84\xab\xd4\x18\x02\xee\ +\x03\xf2\xde\x00\x1d\x31\xfe\xf0\x5d\xe1\xfd\xfb\xde\x9a\xb0\x1c\ +\x20\x12\xc6\x75\xcc\x18\x15\x01\x32\x1c\x82\xf1\xb5\x0c\x43\x82\ +\x6a\x90\x61\xe0\x21\x20\xd7\x15\xd0\x5e\xa6\x31\x52\x2d\x48\xc6\ +\x00\x86\x5a\x90\x0c\xf0\x18\x90\xe3\x12\xf8\x52\xe6\x59\x54\x1d\ +\xc8\x88\x41\x0c\x75\x20\xa3\x02\xc6\x1f\xa0\x2d\xa1\x75\x96\x1a\ +\x90\x6f\x0a\x30\xd4\x80\x7c\x0f\xc1\xf8\x9c\xf0\x4a\xdc\x38\xc8\ +\x98\x80\xf1\xdb\x00\x86\x71\x90\xf1\x10\x8c\x56\x43\x7b\x35\x63\ +\x20\x12\xc6\x2f\x83\x18\xc6\x40\x7e\x84\x60\xb4\x18\xde\xcd\x27\ +\x0e\x22\x61\xfc\x54\x80\x91\x38\xc8\x44\x08\x46\xb3\x92\x7a\x4f\ +\x62\x20\x93\x02\xc6\x85\x22\x8c\x44\x41\x24\x8c\x26\x65\x15\xc1\ +\xc8\x20\xa9\x12\x4a\x8f\x85\xd1\x9e\xaf\x6b\x54\x74\xb8\x22\xb3\ +\x03\x71\x20\x91\x22\x15\x63\xae\x73\x60\x53\xd9\xf7\x8d\xc5\xbd\ +\x87\x92\x66\x99\x9c\xd0\x3e\x53\xe9\xb3\xcc\x5b\x41\x1a\x81\x33\ +\xa1\x6f\xd6\x46\x10\x2a\x04\x25\xf1\xbd\x4c\x03\x70\x2a\xdc\x33\ +\x67\x23\x88\x76\x14\x63\xf5\x90\x7a\xe0\x44\xb8\x77\xde\x46\x10\ +\xad\x28\xc6\x6b\xaa\x9f\x42\x50\x16\x6c\x04\xf1\x51\xb2\x4a\x50\ +\xd4\x9c\xcb\x7c\x0c\x41\x59\xb4\x11\xc4\x47\x39\x36\x8c\xa2\xee\ +\x6c\xb7\x2e\x04\x65\xc9\x46\x10\x1f\xe5\x50\xc8\xb3\x6c\x23\x48\ +\x31\x94\x15\x1b\x41\x7c\x94\x03\x21\xdf\xaa\x8d\x20\xc5\x50\xd6\ +\x6c\x04\xf1\x51\xf6\x85\xbc\xeb\x04\x17\xb0\xdf\x35\x48\x92\x28\ +\x91\x41\x3c\xa0\x1a\xd8\x12\xfa\x7b\x85\xf6\xed\x18\x5e\xb6\x16\ +\xe8\x16\xfa\x8e\x80\xbb\x18\x9e\x91\xce\xaf\x87\x0a\x23\x07\xfc\ +\x0b\x68\x9f\xf6\xf2\x7f\xeb\x3f\x2e\x00\xfa\x5d\xd5\xbd\x20\x1c\ +\x88\x03\x71\x20\x91\xc2\xe3\xe5\xb0\xaa\xc7\x51\xbc\xcc\x3e\xcf\ +\x20\x47\xa9\xd6\x8f\x2b\x9c\x8e\x00\x00\x00\x00\x49\x45\x4e\x44\ +\xae\x42\x60\x82\ +\x00\x00\x01\x80\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x43\x00\x00\x00\x37\x08\x06\x00\x00\x00\x57\x79\xf7\xa4\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ +\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd7\x02\ +\x0f\x02\x02\x05\xa0\x94\x87\x62\x00\x00\x00\x1d\x74\x45\x58\x74\ +\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\x64\x20\ +\x77\x69\x74\x68\x20\x54\x68\x65\x20\x47\x49\x4d\x50\xef\x64\x25\ +\x6e\x00\x00\x00\xf6\x49\x44\x41\x54\x68\xde\xed\xdb\x2f\x0e\xc2\ +\x30\x18\x87\xe1\x17\xb2\x20\x26\xc0\x00\x41\x21\x08\x16\xcf\x31\ +\xa6\xb9\x01\x47\xe1\x02\x68\x0c\x37\xe0\x1a\x18\x14\x82\x3f\x09\ +\x8a\x40\x82\xc2\x83\x22\x98\x36\x24\x4b\x17\x20\x79\x7f\xc9\xcc\ +\x9a\xad\xdb\xb3\xf5\xeb\x26\x5a\x03\x86\x40\x0b\x73\x03\x58\x01\ +\x0f\x37\x96\x75\x5f\x88\x77\xc4\x10\x43\x8c\x8f\xc9\x80\x1d\xb0\ +\x0e\xb4\xc5\x66\x99\xe3\xab\xf2\xfe\x78\x3a\x40\x3f\xb0\xff\x0a\ +\x9c\x22\xf7\x15\x4d\x6c\x96\x99\xfc\xc9\x83\x9e\x46\xae\x7f\xee\ +\x30\xb1\x66\x88\x21\x86\x18\x62\x54\xfb\x9d\xf1\xcd\x6c\x80\x91\ +\x6f\x86\xc3\x44\x0c\x6b\x46\xc9\x6c\x81\x45\xa2\x73\x8d\x81\xe2\ +\x9f\x31\xf6\xc0\x2c\xe1\xbf\x49\xe1\x30\xb1\x66\x88\x21\x86\x18\ +\x62\x88\x21\x86\x18\x62\x88\x21\x86\x18\x62\x88\x21\x86\x18\x62\ +\x88\x21\x86\x11\x43\x0c\x31\xc4\x10\x43\x0c\x31\xc4\xa8\x36\x19\ +\xd0\x03\xf2\x40\x5b\x1e\x39\xa6\x0b\x0c\x12\xf5\xdf\x08\xf4\x99\ +\xea\xdc\xed\xc8\xfe\x66\xa4\x8f\x3b\xb8\xde\xc4\xf5\x26\xd6\x0c\ +\x31\xc4\x28\x3d\x9b\x9c\x81\x83\x14\x5c\x9e\x60\xfb\xa1\xec\xd4\ +\x4a\xd7\x99\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x01\x7c\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x43\x00\x00\x00\x37\x08\x06\x00\x00\x00\x57\x79\xf7\xa4\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ +\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd7\x02\ +\x0f\x02\x03\x2d\x8c\x3a\x1e\xd9\x00\x00\x00\x1d\x74\x45\x58\x74\ +\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\x64\x20\ +\x77\x69\x74\x68\x20\x54\x68\x65\x20\x47\x49\x4d\x50\xef\x64\x25\ +\x6e\x00\x00\x00\xf2\x49\x44\x41\x54\x68\xde\xed\xdb\x4d\x0a\x82\ +\x40\x18\x87\xf1\xc7\x92\xa0\x36\xee\x5a\x47\x75\x80\xa0\xdb\xd4\ +\xa6\x6b\x74\x94\xee\xd1\x29\x82\xa0\x13\xd8\xbe\x85\x04\xb5\xed\ +\x63\x61\x20\x88\x16\xb6\x51\xeb\xf9\x83\x9b\x57\x50\xe7\x27\xf3\ +\x0e\x0c\x4c\x00\xcc\x31\x00\xc7\x00\x78\xe8\x00\xc0\xb2\xa3\x41\ +\x16\x31\xc4\x10\xe3\x63\x42\x60\x5f\x72\x6f\x06\x74\x0b\xea\x07\ +\xe0\xd6\x82\xb1\x4d\x81\xa8\x68\xd5\x00\x92\x82\x7a\xf2\xee\x61\ +\xe7\xd7\x4a\x93\xbf\xa2\x96\xfc\xe8\x6d\xc9\xf7\x2f\x9c\x26\xf6\ +\x0c\x31\xc4\x10\x43\x0c\x31\xc4\x10\x43\x0c\x31\xc4\x10\x43\x0c\ +\x31\xc4\x10\xe3\x07\x13\xd6\xf8\xee\x1e\xb0\xca\xd5\x76\xa4\xdb\ +\x8a\x7f\x87\xd1\x07\x36\xb9\xda\xba\x4e\x0c\xa7\x89\x18\x62\x34\ +\xba\x67\x5c\x80\x49\xae\x96\xfc\x2b\xc6\x1d\x88\x9d\x26\xf6\x0c\ +\x31\xc4\x10\x43\x0c\x31\xc4\x10\x43\x0c\x31\x8c\x18\x62\x88\x21\ +\x86\x18\xdf\x27\x04\xc6\x15\xa1\x46\xa4\xbb\x54\x4d\xcf\xa0\xa4\ +\x3e\x2c\x19\xf3\xc9\xf3\x26\x59\x3c\x6f\x62\xcf\x10\x43\x8c\xca\ +\xab\x49\x2c\x03\x00\xd7\x27\x81\xed\x21\xfc\xab\x1b\xcf\x92\x00\ +\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x03\x68\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x44\x00\x00\x00\x37\x08\x06\x00\x00\x00\xb5\xa5\xec\xdd\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ +\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd7\x02\ +\x0f\x02\x05\x23\x3d\xd8\x94\x58\x00\x00\x00\x1d\x74\x45\x58\x74\ +\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\x64\x20\ +\x77\x69\x74\x68\x20\x54\x68\x65\x20\x47\x49\x4d\x50\xef\x64\x25\ +\x6e\x00\x00\x02\xde\x49\x44\x41\x54\x68\xde\xed\xdb\x49\x4f\x14\ +\x41\x14\xc0\xf1\x3f\x66\xe2\xc9\xa3\x37\x13\x0e\xa2\xa0\x12\x70\ +\x47\xa2\x5e\x4c\x54\x44\xc5\x8d\x2d\x84\x10\x02\x12\x34\xc6\x9b\ +\x9e\x39\x78\xd5\xc4\x9b\x77\x3f\x84\xdf\x43\x4d\xd4\x78\x04\x1d\ +\x05\x67\x58\x5c\xa2\x32\xe0\x72\xa0\x3a\x69\x3a\x55\x35\x5d\xd0\ +\x5d\x55\x3d\xa9\x97\xf4\x65\xba\xaa\xfb\xf5\x6f\x92\x57\x93\x37\ +\xd5\x4d\x40\x33\xf0\x84\x10\x00\x0f\x9b\x80\x0e\xe0\x75\xb0\x00\ +\xa0\x73\x47\x30\xd8\x1c\x01\x24\x80\x04\x10\xa3\x28\x01\x73\xc0\ +\x90\xe4\xdc\x6e\xe0\x59\x8a\x6b\x3c\x07\x5e\x78\xf2\x3c\x17\x81\ +\xa9\x34\xab\x89\x78\xee\x64\xcc\xe9\x26\x35\x03\xff\x52\x1c\xab\ +\x40\x9f\x07\x18\x3d\xc0\xcf\x94\x39\x77\x6c\xe5\x06\x69\x41\x7c\ +\x40\xe9\x01\x7e\x19\xe4\x9b\x29\xc8\x0f\x60\xc5\x23\x94\x4b\x0a\ +\x8c\xef\x22\xd7\xdc\x41\x66\x81\x6e\x0d\xca\x35\x4f\x30\xce\x8a\ +\x5c\xad\x80\x00\x74\x69\x50\xae\x5b\xc2\xf8\x2d\xb9\xff\x37\x81\ +\x81\x6d\x10\x80\x93\x8e\x50\x54\x18\x5f\x81\x33\xb1\x71\xd6\x41\ +\x00\x4e\x00\xcb\x0a\x94\x1b\x39\x60\xf4\x6a\x30\x4e\x27\xc6\x3a\ +\x01\x01\x38\x0e\x2c\x29\x50\x6e\x5a\xc0\x58\x91\x60\x38\x05\xb1\ +\x81\xd2\x2b\xae\x25\xc3\xe8\x56\xcc\x71\x0a\x02\x70\x0c\x58\xcc\ +\x01\xe5\xb2\x06\xe3\x94\x66\x9e\x73\x10\x80\xa3\x40\x55\x81\x72\ +\x2b\x63\x8c\xae\x3a\x73\xbd\x00\x01\x38\xa2\x41\xe9\x37\xc8\xe1\ +\x8a\x02\x63\x59\x14\x73\x8a\x02\x12\xa1\x54\xb6\x81\xb2\x5d\x0c\ +\xef\x40\x00\x0e\x03\x5f\x24\xd7\xa8\xd5\x41\xb9\xaa\xc0\x58\x12\ +\xc5\x9b\xa2\x82\x00\x74\x1a\xa2\xf4\x29\x30\x16\x45\xd1\xa6\xe8\ +\x20\x88\x04\x54\x28\x03\x39\x61\x78\x0d\x02\xd0\x0e\x2c\x68\x50\ +\x54\x18\x55\xb1\x72\xd1\x68\x20\x3a\x94\x35\x05\x46\x45\x14\x67\ +\x6c\x81\xd8\xee\xa9\xbe\x01\xce\x09\x94\x64\x2b\x73\x67\xe2\xb3\ +\x2a\x70\x01\x78\xd9\xe8\x4d\xe6\xb7\x02\x65\x5e\x33\xa6\x02\x9c\ +\xb7\x8d\xe1\x0a\x04\xe0\x1d\xf0\x58\x73\xfe\x29\xf0\x0a\xcf\x22\ +\x8f\x1a\x12\x45\xbf\xa2\x66\x44\xc7\x3a\x30\x9c\xc1\x7d\xbc\x2f\ +\xaa\x11\x46\x2d\x45\x23\x78\x1d\x18\x69\x74\x90\x01\x05\xc6\x02\ +\x50\x56\xa0\x8c\x36\x2a\xc8\xa0\x58\x5e\x65\x18\xed\x40\x5b\x0e\ +\x28\xde\x82\x0c\x8a\x07\x93\x61\x1c\x8a\x8d\xd3\xa1\x8c\x35\x0a\ +\xc8\xb0\x02\x63\x3e\x81\x11\x45\xab\x06\x65\xbc\xe8\x20\x23\x86\ +\x18\x71\x94\x8f\x19\xa0\x78\x05\xb2\x55\x8c\x34\x28\x13\x45\x03\ +\x19\xd5\x60\x1c\x34\xc8\x61\xbf\x02\xe5\x0f\x30\x59\x14\x90\x31\ +\x05\xc6\x67\x43\x8c\x2c\x50\x9c\x83\x64\x8d\x11\x47\xf9\x20\xb9\ +\xee\x5f\xf4\xfb\x41\x9c\x82\x8c\x6b\x30\x0e\x64\xf0\x33\x5c\x87\ +\x32\xed\x1b\xc8\x44\xce\x18\x51\xec\x33\x44\x71\x02\xa2\xc2\xf8\ +\x94\x31\x46\x14\x2d\x1a\x94\xbb\xae\x41\x26\x45\x71\xb3\x85\x91\ +\x06\xe5\x9e\x2b\x90\xdb\x22\x01\x19\x46\x9b\x85\xf6\x44\x0b\x1b\ +\x9b\xe4\x74\x28\xd6\x40\xa6\x14\x18\x65\x4b\x18\x69\x50\xee\xdb\ +\x02\xa9\x79\x82\x11\xc5\x5e\x0d\xca\x1a\x8e\x76\x21\xba\xc2\x88\ +\xa3\xcc\xe2\x68\x17\xa2\x0c\xa3\xd5\x83\x96\xa7\x09\x8a\x12\xa4\ +\x04\xec\x01\x66\x24\xe7\x76\x19\x34\x8c\x1f\x78\xd2\x07\x7e\x2f\ +\xbe\xc8\x7a\x31\xc3\xc6\xff\xc4\xc9\x78\x14\xde\x97\xd9\x1c\xe1\ +\x7d\x99\x64\x04\x90\x00\x12\x40\x8c\xa2\x24\x96\xcd\x3b\x81\x02\ +\x80\xf2\x7f\x73\xe2\xb4\xaf\xf2\xe9\x93\x8e\x00\x00\x00\x00\x49\ +\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x01\xd5\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x43\x00\x00\x00\x37\x08\x06\x00\x00\x00\x57\x79\xf7\xa4\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ +\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd7\x02\ +\x0f\x02\x0a\x2a\xc3\x9c\x30\x33\x00\x00\x00\x1d\x74\x45\x58\x74\ +\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\x64\x20\ +\x77\x69\x74\x68\x20\x54\x68\x65\x20\x47\x49\x4d\x50\xef\x64\x25\ +\x6e\x00\x00\x01\x4b\x49\x44\x41\x54\x68\xde\xed\xd9\xa1\x4b\x43\ +\x41\x1c\xc0\xf1\xef\x93\x17\xc4\xa0\xc5\xa2\x41\x64\x33\x88\x20\ +\x88\xc8\x92\xc5\x22\x83\xfd\x07\x26\x83\xe5\x81\x98\x4d\x06\xff\ +\x04\x9b\x60\x5d\xb2\x2e\x59\x0c\x33\x8b\x60\xb1\xac\x58\x2c\xcb\ +\xc6\x69\x19\x38\x1e\x77\x4f\x9e\x1c\x43\xb6\xef\x0f\x5e\xb8\xbb\ +\xdf\xbb\xbb\x7d\xc6\xfd\xc2\xbb\x0c\xb8\x04\xf6\x31\x9e\x73\xe0\ +\x10\xe8\x68\xc1\xd2\x82\x06\x3f\x21\x86\x18\x62\xfc\x1a\xd9\xb8\ +\x80\xae\x05\xc6\x2e\xc6\x63\xe5\xb8\x03\x1e\x22\xf3\x1d\x03\x67\ +\xa5\xbe\x53\xe0\x33\x92\x7f\x0d\x6c\x4f\xb4\xdf\x80\xab\x44\xbf\ +\x2d\xb4\x17\x80\x27\xe0\x26\xd0\xff\x51\x35\x59\x17\xf8\x0a\x3c\ +\x45\xc5\x3b\x45\x20\x7f\xa5\x22\xbf\x5f\xca\xed\x27\xfc\xa3\x8b\ +\xc8\xfe\xbb\x1e\x13\x6b\x86\x18\x62\x88\x21\x86\x18\x62\x88\x21\ +\x86\x18\x62\x88\x21\x86\x18\x62\x88\x31\x83\x91\x4f\x61\x8d\x17\ +\x60\x14\x19\x5b\x2f\xb5\x0f\x80\x41\xa2\x75\x97\xff\x23\xc6\x66\ +\x8d\xdc\x45\xa0\xe1\x31\xb1\x66\xcc\x76\xcd\x18\x00\xf7\x35\xf2\ +\x8f\x80\xd5\x89\xf6\x10\x78\x4c\xb4\x97\x26\x09\x2f\xd4\xff\x72\ +\x55\x50\x37\xbc\x2a\xb0\x66\x88\x21\x86\x18\x62\x88\x21\x86\x18\ +\x62\x88\x61\x88\x21\x86\x18\x62\x88\x21\x46\x9a\xc8\x81\x73\x60\ +\x37\x30\xd6\x8a\xbc\x73\x02\xec\x25\x5a\x7f\x2b\xd0\xbe\x4d\x34\ +\xf7\x4e\xa4\xbf\x15\x59\xe3\x15\xa0\x47\xf8\xf3\xd8\xbc\x3d\x3d\ +\x8f\x89\x35\x43\x0c\x31\xea\x44\x06\xb4\x81\x0d\x29\x78\xff\x06\ +\x62\x34\x7f\xf6\xf9\x47\xa2\x7f\x00\x00\x00\x00\x49\x45\x4e\x44\ +\xae\x42\x60\x82\ +\x00\x00\x03\x4a\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x43\x00\x00\x00\x38\x08\x06\x00\x00\x00\xa6\x2f\x45\x71\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ +\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd7\x02\ +\x0f\x02\x0b\x01\x76\x3b\xf8\x32\x00\x00\x00\x1d\x74\x45\x58\x74\ +\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\x64\x20\ +\x77\x69\x74\x68\x20\x54\x68\x65\x20\x47\x49\x4d\x50\xef\x64\x25\ +\x6e\x00\x00\x02\xc0\x49\x44\x41\x54\x68\xde\xed\xdb\xcb\x4e\x14\ +\x41\x14\x80\xe1\x7f\x94\x4b\xa2\xa0\x42\x82\x57\xdc\x78\xe3\x22\ +\x6e\x04\x2f\xd1\x71\x6b\xa2\xc6\x28\x3b\x07\x6f\x4b\xe3\x4b\xb8\ +\xf3\x15\x78\x03\x10\x74\x14\x17\x66\x04\x45\x86\x88\x6f\xe0\x1b\ +\xf8\x02\x2e\x18\x50\x51\xa3\x8b\x39\xa3\x63\x5b\x35\xd3\x3d\xd3\ +\x55\xdd\x9d\x9c\x93\xcc\xa6\x1b\x3a\x55\xdf\x9c\x3e\xd5\x5d\x55\ +\x93\x03\x7a\x80\x4e\x34\xb6\x00\x5e\x01\xbf\xf4\xc3\xcc\x36\x4d\ +\x88\xbf\xa1\x18\x8a\xa1\x18\x4d\xa3\x03\xa8\x00\x9f\x0d\xe7\x6c\ +\xa3\xcc\x46\xad\xf2\xa6\x3c\xba\x81\x1d\x86\xe3\xdf\x80\x4d\x4b\ +\xbf\xac\x61\x1b\x65\xa6\x32\xf2\x45\x3f\xb4\xb4\x7f\x5a\x6f\x13\ +\xad\x19\x8a\xa1\x18\x8a\xa1\x18\x6e\x9f\x33\x92\x8c\x12\x30\xe4\ +\xe8\xda\xbb\xb2\x86\x31\x08\x1c\xd1\xdb\x44\x6b\x86\xd6\x8c\x28\ +\xf1\x09\x58\x8c\xe9\x5a\xa3\x40\x3e\xcb\x18\x1f\x81\x07\x31\xbe\ +\x9b\xe4\xf5\x36\xd1\x9a\xa1\x18\x8a\x91\x26\x8c\xed\x19\xe9\x5b\ +\x97\x0f\x8c\xc7\xc0\xd1\x94\x43\x9c\x06\x1e\xf9\xc0\x38\x0c\xac\ +\x02\xc7\x52\x0c\xf1\x16\xe8\xf7\x55\x33\x06\x81\x32\x70\x3c\x65\ +\x10\xe3\xc0\x72\x2b\x10\xed\x16\xd0\xb4\x81\x8c\x4b\x46\xf4\x25\ +\x35\x9a\x1c\x12\x90\x13\x09\x43\x4c\x48\x46\xf4\xb5\x73\x91\x38\ +\x86\xd6\xa4\x41\x26\x24\x23\xf6\x24\x31\xb4\xbe\x04\x7e\x06\x8e\ +\x1d\x14\x90\x21\xcf\x10\x67\x24\x23\x82\x10\x5f\x81\x05\x1f\x18\ +\xcf\x80\xfb\x29\x00\x39\x2b\x19\xb1\x3b\x70\xfc\x0b\x70\x53\xce\ +\x79\xb9\x4d\x66\x80\x7b\x06\x90\x03\x02\x32\xec\x18\xe2\x1c\xf0\ +\xc6\x02\x31\x09\x2c\xf9\xae\x19\xb3\xc0\x5d\x0b\xc8\x8a\x43\x90\ +\xf3\xd2\xd9\x20\xc4\xa6\x64\xc4\x92\xcf\x9a\x51\x1f\x4f\x80\x3b\ +\x0d\x32\x64\xc4\x01\xc4\xa2\x05\x62\x52\xb2\x25\xd1\xd1\x64\x0e\ +\xb8\x6d\x00\xd9\x2f\x19\x12\x17\xc8\x85\x06\x10\x37\xda\x85\x88\ +\xf3\xad\x75\xbe\x01\x48\x99\xea\x14\x5c\xbb\x10\xa5\x06\x10\xcb\ +\x69\x7b\x85\x9f\xa7\xba\x5d\x21\x08\xb2\x4f\x32\xa4\x55\x90\x8b\ +\xc0\x6b\x0b\xc4\xf5\xb8\x20\x5c\xcc\x67\x3c\x05\x0a\xc0\x0f\x03\ +\x48\x19\x38\xd9\x02\x44\x89\xff\x17\x84\x6a\x10\x2b\x49\xcf\x67\ +\x84\x79\x0e\x99\x32\x80\xec\x95\xc6\x87\x05\xc9\x4b\x46\x98\x20\ +\xae\xc5\x0d\xe1\x0a\xa3\x06\x52\xb0\x80\x94\x81\xb1\x10\x10\x25\ +\xa0\xd7\x02\xb1\xea\xa2\xd1\x2e\xa7\xfd\x8a\x02\xf2\x3d\x70\x7c\ +\x40\xbe\xd5\x53\x96\xff\xbb\x24\x19\x61\x82\xb8\xea\x0a\x02\xdc\ +\xaf\x9b\x14\xeb\x1e\xd0\x3a\x03\x20\xef\xa8\xee\xb1\xaa\x8f\x61\ +\xc9\x88\x9e\xc0\xf1\x0d\x81\x78\xef\xb2\xb1\x3e\x16\x91\x8a\xd2\ +\xe9\x59\xfe\x9d\x97\x1c\x30\xfc\xad\x69\x3a\xd1\x0b\x84\xeb\xdb\ +\xa4\x3e\x9e\x4b\x51\x8d\xba\x65\xb2\x02\x5c\xf1\x01\xe1\x13\xa3\ +\x06\x52\x88\x00\x52\x91\x8c\x58\xf3\xd5\x40\xdf\xeb\x26\x2f\x80\ +\x5b\x21\x40\xd6\x25\x23\xd6\x7c\x36\x2e\x89\x45\xa4\x85\x26\x20\ +\xeb\x92\x11\x1f\x7c\x37\x2c\x27\x2f\x5a\x97\x0d\xe7\x5c\x6f\x97\ +\xee\xb5\x14\xf0\x2d\x9a\x6c\x5d\x0e\x19\x51\xb7\x4b\x17\x3b\xa4\ +\xd3\x51\x26\x52\x77\xca\xc7\x55\x74\xd1\xc2\x6a\x58\x44\xa4\x6e\ +\x53\xbf\x74\xad\x35\xe1\x9a\xa1\x18\x8a\x91\xb1\xc8\xa1\x3f\xe5\ +\xfc\x33\x8a\xfd\x06\x73\x42\xd1\xe3\xd7\x79\x9a\x4a\x00\x00\x00\ +\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x02\xbd\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x43\x00\x00\x00\x38\x08\x06\x00\x00\x00\xa6\x2f\x45\x71\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ +\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd7\x02\ +\x0f\x02\x0b\x23\xa3\x5b\xb9\xd6\x00\x00\x00\x1d\x74\x45\x58\x74\ +\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\x64\x20\ +\x77\x69\x74\x68\x20\x54\x68\x65\x20\x47\x49\x4d\x50\xef\x64\x25\ +\x6e\x00\x00\x02\x33\x49\x44\x41\x54\x68\xde\xed\xdb\x4d\x4f\x13\ +\x41\x18\xc0\xf1\x7f\x49\x4b\xb0\x45\x28\x27\x51\xf8\x32\x98\xf8\ +\x25\xf0\x4e\x08\x41\xad\x8d\x11\xce\x7c\x00\x0c\x11\x50\xc1\xa3\ +\x27\xce\x1c\x78\x57\x04\x8e\x1c\x2d\x2a\x7c\x01\x2e\xc8\x05\x12\ +\x7b\x60\x39\xd8\x01\x42\xf6\x99\xe9\xb6\xfb\x32\x8d\xcf\x24\x7b\ +\xd9\x79\x66\x3a\xfb\xdb\x76\x76\x3b\x2f\x39\x60\x00\x4d\x00\x17\ +\x39\x20\x50\x07\x00\x9e\x77\xa9\xc1\x6d\x52\x0c\xc5\x50\x0c\x67\ +\xca\x03\x7f\x84\xbc\x32\x90\x0b\x39\x7f\xde\x21\x9d\x6e\x2f\x50\ +\x08\x7b\x6a\x00\xf5\x90\xf3\x75\x5b\x65\xe6\xa2\xef\x1f\xfd\x1d\ +\x72\xa3\x57\x85\xf6\x8f\xea\xcf\x44\xfb\x0c\xc5\x50\x0c\xc5\x50\ +\x0c\xc5\x50\x0c\xc5\x50\x0c\xc5\x50\x0c\xc5\x50\x0c\xc5\x50\x8c\ +\xff\x19\xa3\xd0\x21\xd7\x56\x48\x03\xe3\x0b\xd0\xe3\x39\xc4\x18\ +\xf0\x2c\xce\x0a\xa5\x61\xbf\x00\x58\x03\x1e\x78\x0a\x31\x0e\x5c\ +\x59\xda\x3e\x1a\x37\x46\x00\xac\x7b\x08\xe2\x82\x48\x0c\xc3\x80\ +\x14\x3d\x81\x98\x68\x02\x22\x51\x8c\x00\xd8\xf0\x00\xa4\x59\x88\ +\xc4\x31\x02\x60\x33\x43\x90\xc9\x08\x10\xb1\x63\xac\x08\xe7\xb7\ +\x32\x00\x91\x20\x4e\x80\xc3\x34\x30\xca\xc0\x67\x21\x6f\x3b\x45\ +\x90\x17\x16\x88\x61\x5a\x98\x44\x6a\x05\xa3\x9f\x7f\xd3\x8e\xcb\ +\x42\xfe\x4e\x0a\x20\x2f\x05\x88\xe3\x06\x04\x69\x62\xd0\x00\x59\ +\x12\x62\xbe\x26\x08\xf2\x4a\x80\xf8\x7d\x07\x22\x75\x0c\x03\xf2\ +\x49\x88\xfb\x96\x00\x48\xa5\x49\x88\x4c\x30\x0c\xc8\x47\x21\x76\ +\x37\x46\x90\x8a\xf0\x19\xbf\x80\xa1\x90\xf8\x4c\x30\x0c\xc8\x07\ +\x0b\x48\xa9\x4d\x88\x6a\x44\x88\x4c\x31\x0c\xc8\xa2\x50\xe6\x7b\ +\x1b\x20\x36\x88\x27\x96\x72\x99\x62\x18\x90\x05\x0b\x48\x6f\xc4\ +\x36\xbc\x11\xea\xfa\xe9\x80\xf0\x02\xc3\x80\xcc\x0b\x65\xf7\x22\ +\x80\xb4\x03\xe1\x0d\x86\x01\x79\x6f\x01\x79\xe8\x28\xff\x56\x28\ +\x7b\x04\x3c\x6e\xb2\xfd\xde\x60\xb8\x40\xf6\x2d\x20\x71\x40\x78\ +\x87\x61\x40\xe6\x2c\x20\x7d\xf7\xe2\xa7\x2c\x10\x83\x11\xdb\xef\ +\x1d\x86\x0b\xe4\xe0\x0e\xc8\xb4\x10\x53\x6b\x01\xc2\x5b\x0c\x03\ +\xf2\xce\x02\x32\x13\x33\x84\xd7\x18\x2e\x90\xb0\xe3\x07\xf0\xa8\ +\x8d\x17\x35\xaf\x97\x3e\x06\xc0\xeb\x06\x88\x2b\xd5\x80\xa7\xc0\ +\x69\x9a\x83\x23\x59\x4c\x22\x55\x81\x59\x07\xc4\x48\xda\x10\xe6\ +\xab\x7b\x26\xe4\x25\xbd\x5c\x5a\xda\xf4\x73\x09\xfc\x8d\xa1\xfe\ +\xa8\xcb\xa5\xc7\xf2\x44\xdf\x89\x54\x4e\xf8\x06\x15\x13\x1e\x1c\ +\x2a\x09\xff\x93\xba\x75\xae\x35\xe3\x3e\x43\x31\x14\xa3\xc3\x52\ +\x0e\xdd\xca\x79\xf3\x94\xb9\x06\xe3\xdb\x11\x7e\xe1\x58\xb6\x71\ +\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x02\xb9\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x43\x00\x00\x00\x37\x08\x06\x00\x00\x00\x57\x79\xf7\xa4\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ +\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd7\x02\ +\x0f\x02\x07\x35\xfb\x3a\x43\x8b\x00\x00\x00\x1d\x74\x45\x58\x74\ +\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\x64\x20\ +\x77\x69\x74\x68\x20\x54\x68\x65\x20\x47\x49\x4d\x50\xef\x64\x25\ +\x6e\x00\x00\x02\x2f\x49\x44\x41\x54\x68\xde\xed\xdb\xbb\x6b\x54\ +\x41\x14\xc7\xf1\xcf\x6a\x40\xc1\x20\x22\x11\xdf\x21\x8a\xb1\x88\ +\x8d\x9d\x20\x41\x30\x95\x95\xa8\x10\xd0\x56\x45\x0c\x62\xa1\x7f\ +\x80\x8d\x85\x0a\x41\x42\x48\x61\x1d\x08\x58\x09\x91\x28\x56\x16\ +\x66\x55\x04\xb1\x11\xe2\x83\x08\x2a\x84\x88\x58\x29\x88\xab\x82\ +\x16\x3b\x60\x58\xee\x3e\xbd\xd9\x44\x39\x07\xa6\xb8\x33\xb3\xe7\ +\x9c\xfd\xce\xe3\xce\x85\xdf\x14\x70\x08\xdd\xc2\xde\xc3\x14\x7e\ +\x45\x31\xb5\x22\x26\xc4\x1f\x0b\x18\x01\x23\x60\xd4\xb5\x0e\xdc\ +\xc3\x5c\x46\xdb\x00\x76\x65\xd4\x17\x31\x93\x53\xfc\xc3\xd8\xb4\ +\xe0\xf9\x03\x6e\xe7\xe4\xbb\x0f\xfd\x19\xf5\xb3\xb8\x9f\x51\xff\ +\xbc\x96\xb3\x89\x2a\xbb\xee\x50\x8e\x83\x31\x5d\xe1\x7b\x3a\x47\ +\xdf\x43\x55\xf2\x9f\x88\x65\x12\x7b\x46\xc0\x08\x18\x01\x23\x60\ +\x04\x8c\x80\x11\x30\x02\x46\xc0\x08\x18\x01\x23\x60\x04\x8c\x80\ +\x11\x30\x02\x46\xc0\x08\x18\x01\x23\x60\x84\x05\x8c\x80\x11\x30\ +\x02\x46\xc0\x08\x18\x01\xe3\xbf\x82\xb1\x46\x59\x32\xd0\x59\x51\ +\xdf\x89\x9d\x58\xb5\x14\x49\x75\xb4\x21\xc6\x46\x1c\xc0\x7e\xec\ +\x53\xd6\x7c\x6c\xa8\xd2\x77\x2f\xde\x28\x4b\x07\xe6\xf0\x1a\x8f\ +\x95\x35\x21\x0f\xf1\xe5\x5f\x84\xb1\x1e\xc7\x31\x98\x40\x34\x3b\ +\x03\x0b\xd8\x96\xca\x40\xaa\xfb\x86\xbb\xb8\xa9\x2c\x68\x29\x2d\ +\x77\x18\x3b\x70\x01\x27\xd3\x52\xc8\xd3\x56\xe3\x58\x2a\xf3\x18\ +\xc1\x0d\x7c\x5e\x6e\x7b\xc6\x3a\x0c\xe3\x25\xce\x2f\x02\x88\x4a\ +\xdb\x8c\x6b\x78\x87\x73\x79\x0d\x6a\x1e\x4e\x4e\x60\x14\x5d\x0d\ +\xf4\x9d\x55\xd6\x83\xbd\xc0\x5b\x5c\x44\x6f\x45\xfb\xf5\x34\xc3\ +\xfa\xb0\x07\x3d\x75\x06\x61\x0c\xa7\x70\x06\x4f\x17\x8b\x7e\x3d\ +\x4d\xd7\x5a\x8c\xab\xad\xba\xfd\x8e\x49\x9c\x4e\xeb\xbf\xd2\x1a\ +\xd1\x74\xf5\xe0\x2c\xee\xe0\x47\x8d\x58\xa5\xb4\x44\x0b\xe9\x77\ +\x4d\x6b\xba\x5a\x85\xd1\x8b\x57\x35\x12\xfb\x88\xcb\xd8\x52\x27\ +\x46\xb3\x02\xb7\xed\xb8\x82\x4f\x35\x62\x4f\xa6\x65\xda\x16\x18\ +\xe3\x35\x92\x29\xe1\x6a\xc6\xf9\x21\x2f\x18\x16\xcc\xca\xe1\x34\ +\xf3\xb2\xf2\x78\x82\x4b\xed\x80\x51\xad\x14\xb1\xbb\xc9\x18\x7f\ +\x2b\x7d\xec\x4b\xe7\x90\xac\x7c\x7e\x5a\x22\xe9\xe3\x08\x0e\xa6\ +\x43\x52\x3b\x6d\x26\x9d\x63\xc6\x32\xda\x56\xb6\xf2\x36\xe9\x4f\ +\xaf\xaa\x4a\x6b\xf4\x0e\xca\x2d\x3c\xc2\x91\x16\xfe\x4c\x57\xc6\ +\xf3\x60\x0b\x7e\x1e\x60\x2b\x8e\x36\xd0\xb7\xbb\x4a\x8c\x79\xe2\ +\xbe\x49\xdc\x37\x89\x4f\xf8\x80\x11\x30\x5a\xfe\x36\x29\xe2\x6b\ +\xa0\xf0\xec\x37\x24\xa6\x4c\x90\x46\x18\xbe\x34\x00\x00\x00\x00\ +\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x01\xdc\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x43\x00\x00\x00\x37\x08\x06\x00\x00\x00\x57\x79\xf7\xa4\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ +\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd7\x02\ +\x0f\x02\x08\x0b\xbd\xc3\x42\xef\x00\x00\x00\x1d\x74\x45\x58\x74\ +\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\x64\x20\ +\x77\x69\x74\x68\x20\x54\x68\x65\x20\x47\x49\x4d\x50\xef\x64\x25\ +\x6e\x00\x00\x01\x52\x49\x44\x41\x54\x68\xde\xed\xda\x21\x4b\x03\ +\x61\x18\xc0\xf1\xff\xc9\x45\xd1\xb2\x60\x10\x8b\x0b\x2b\x82\x30\ +\xd0\x05\xb3\xc9\x60\x30\xf9\x0d\xd6\x8c\x06\xa3\x61\xc1\x60\x5a\ +\xb6\x08\x06\xe3\xc2\x92\x7e\x02\x41\xc4\xa0\x20\x58\x0c\x03\x87\ +\x60\xb1\x6a\x50\x70\x8c\xf7\x45\x4e\xde\x39\x6f\xfb\x3f\x70\xe1\ +\x9e\x83\xe7\x76\xbf\xed\x79\x5e\x76\x77\x19\x70\x0c\x6c\x60\x74\ +\x73\xa0\x0a\xd4\xb5\xe0\x7e\x46\x83\xef\x10\x43\x0c\x31\x7e\x8c\ +\xec\x6b\x80\xce\x07\x8e\xc5\x56\x99\x03\xa0\x5b\x82\x6b\xdb\x01\ +\xf6\x03\xf9\x73\xa0\x15\xc8\xbf\xe4\xc0\x43\xa4\xd8\x6b\x24\xff\ +\x08\x5c\x95\x00\x63\x2d\x92\x7f\x8e\x7d\x7e\xdb\x44\x0c\x31\xc4\ +\x10\xe3\x97\x91\x8f\xf9\xfc\x47\xc0\xd2\x88\x6a\x2f\x97\x0d\x63\ +\x13\x58\xb1\x4d\x9c\x19\xce\x8c\x22\xf1\x06\xf4\x12\xd5\x9a\x03\ +\x2a\x65\xc6\xb8\x04\xb6\x12\xd5\x6a\x02\x6d\xdb\xc4\x99\x21\x86\ +\x18\x62\x88\xf1\x7f\xa2\x03\xbc\x4f\xe0\xd6\xf6\x97\x61\x9b\x88\ +\xf1\xa7\xff\x4d\xce\x80\xeb\x44\xe7\xdf\x03\x16\x06\xf6\xef\x80\ +\x93\x44\xb5\x1b\xc0\xf6\xa8\x07\xe8\x6e\xc2\x2f\xe3\x66\xa8\x76\ +\x27\x61\xed\xa6\x03\xd4\x99\x21\x86\x18\x62\x88\x21\x86\x18\x62\ +\x88\x21\x86\x18\x62\x88\x21\x86\x18\x62\x4c\x51\x64\xc0\x21\xb0\ +\x1e\x38\xb6\x4a\xf8\x91\xfe\x2d\xe9\x5e\x1b\x68\x00\xb3\x03\xfb\ +\x7d\xd2\xdd\x52\x5c\x04\x6a\x81\xfc\x13\x9f\xb7\x17\x87\xe3\x02\ +\x26\xf7\xf9\x48\xd1\xed\xd4\x36\x71\x66\x88\x21\x46\xd1\xd5\x24\ +\xb6\x6a\x4c\x5b\xf4\x3e\x00\x87\x29\xa8\x51\xc2\x15\x79\x34\x00\ +\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x01\x76\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x43\x00\x00\x00\x37\x08\x06\x00\x00\x00\x57\x79\xf7\xa4\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ +\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd7\x02\ +\x0f\x02\x04\x03\x1f\xad\x85\xd1\x00\x00\x00\x1d\x74\x45\x58\x74\ +\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\x64\x20\ +\x77\x69\x74\x68\x20\x54\x68\x65\x20\x47\x49\x4d\x50\xef\x64\x25\ +\x6e\x00\x00\x00\xec\x49\x44\x41\x54\x68\xde\xed\xd9\xa1\x0a\xc2\ +\x50\x14\x87\xf1\x6f\xb2\x28\x08\xe2\x43\x18\x05\xab\x61\xc1\xa7\ +\xd0\xe2\x83\x18\x6c\x56\x1f\xc6\x20\x58\xf6\x00\x46\xbb\xd5\xb8\ +\x60\x30\x08\x1a\x16\x2c\x67\x93\x89\xe5\xca\xf7\x87\x95\x33\x76\ +\xd9\xfd\x6d\xf7\x5c\xd8\x32\xe0\x84\x01\x58\xe7\xc0\x54\x07\x00\ +\x86\x3d\x0d\xde\x11\x43\x0c\x31\x3e\x26\x6b\x69\xa0\x25\xd0\x0f\ +\xea\x05\x70\x4b\x60\x6e\x3b\x60\x16\xed\x1a\xc0\x21\xa8\x5f\xda\ +\x06\xab\x80\x67\x70\x0c\x12\x79\xd0\xfb\x86\xfb\x5f\xb8\x4c\xec\ +\x19\x62\x88\x21\x86\x18\x62\x88\x21\x86\x18\x62\x88\x21\x86\x18\ +\x62\x88\x21\xc6\x1f\x26\xff\xe2\x9a\xca\x37\xc3\x65\x22\x86\x3d\ +\xa3\x43\x36\xc0\x3d\x81\xb9\xad\x80\xf1\xaf\x06\xf3\x57\x81\x3d\ +\xc3\x88\x21\x86\x18\x62\x88\x21\x86\x18\x62\x88\x21\x86\x18\x62\ +\x88\x21\x86\x18\xe9\x24\x03\x8e\x0d\xe7\x0a\xe2\xcf\x82\x25\xf0\ +\x48\x60\x6e\x13\x60\x14\xd4\xcf\xc0\x35\xa8\x6f\x33\xea\x4f\x61\ +\x06\x96\x2e\x13\x7b\x86\x18\x62\x74\xdd\x4d\xe6\x32\xd4\xbb\xcc\ +\x0b\xdb\x19\x29\xb5\xa9\xcc\xe7\xf4\x00\x00\x00\x00\x49\x45\x4e\ +\x44\xae\x42\x60\x82\ +\x00\x00\x01\x6f\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x43\x00\x00\x00\x37\x08\x06\x00\x00\x00\x57\x79\xf7\xa4\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ +\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd7\x02\ +\x0f\x02\x02\x38\xf8\xfc\xcb\x73\x00\x00\x00\x1d\x74\x45\x58\x74\ +\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\x64\x20\ +\x77\x69\x74\x68\x20\x54\x68\x65\x20\x47\x49\x4d\x50\xef\x64\x25\ +\x6e\x00\x00\x00\xe5\x49\x44\x41\x54\x68\xde\xed\xdb\x31\x0a\xc2\ +\x30\x14\x80\xe1\x5f\xe9\x20\x12\x10\xa4\x82\x93\xa0\x08\x9e\xad\ +\x07\xeb\x0d\x7a\x83\xce\x1e\x40\x28\x0a\x4e\x05\x41\x10\xc4\x55\ +\x47\x45\x12\x05\xc9\x24\xff\x83\x0e\x79\xa1\xef\x85\xaf\x6d\x3a\ +\x65\x00\xac\x81\x09\xc6\x05\xa0\x01\xee\x5e\x34\x43\x5f\x88\x67\ +\x88\x21\x86\x18\x5f\xa3\x00\x3a\x60\x1b\x99\x5b\x02\xd3\x48\xfe\ +\x08\x9c\x32\xf5\xdf\x00\xe1\x65\x7c\x05\x76\x99\x6a\xcf\x80\x45\ +\x24\x7f\x06\x0e\x91\x7c\xf7\xa9\x58\x9d\xd8\x75\xab\x8c\x0f\xa3\ +\x7d\xab\xdd\x66\xac\x5d\x25\xd6\x5f\xfb\x99\xb8\x67\x88\x21\x86\ +\x18\x62\x88\x21\x86\x18\x62\x88\x21\x86\x18\x62\x88\x21\x86\x18\ +\x62\x88\x21\x86\x18\x62\x18\x62\x88\x21\x86\x18\x62\x88\x21\x86\ +\x18\x62\x88\x21\x86\x18\x62\x88\x21\x86\x18\x62\x88\xf1\x5f\x51\ +\x00\x73\x60\x1c\x99\x0b\x89\x7b\x4a\x60\x95\xa9\xff\x28\x32\xce\ +\x55\xbb\x4c\xe4\x43\xa2\xc7\x0d\x3c\x6f\xe2\x79\x13\xf7\x0c\x31\ +\xc4\xf8\xf9\x6f\xd2\x03\x7b\x29\xe8\x1f\x56\x5d\xa3\x76\xb7\xf5\ +\xc3\x9c\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x02\x9e\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x43\x00\x00\x00\x37\x08\x06\x00\x00\x00\x57\x79\xf7\xa4\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ +\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd7\x02\ +\x0f\x02\x0a\x20\x23\x49\xd9\x2d\x00\x00\x00\x1d\x74\x45\x58\x74\ +\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\x64\x20\ +\x77\x69\x74\x68\x20\x54\x68\x65\x20\x47\x49\x4d\x50\xef\x64\x25\ +\x6e\x00\x00\x02\x14\x49\x44\x41\x54\x68\xde\xed\x9a\x4d\x28\x45\ +\x41\x14\xc7\x7f\x4f\xcf\x67\x24\x25\x4b\x2b\xd9\x58\xfb\x58\xc8\ +\x82\x52\x16\x24\xb2\x60\x25\xb2\xb0\x60\x85\xd8\x52\x16\x56\x4a\ +\x94\x48\x62\x2b\x94\x14\x16\x4a\x94\x6c\x58\x88\x85\x8f\x7c\x95\ +\x95\x22\xca\x47\xd1\xb3\xb8\x53\xf7\xb9\x86\xde\xe3\x3e\xd7\x7d\ +\x73\xfe\x35\x8b\x39\xf3\xee\x34\xf7\x37\xef\x9c\x99\xd3\x3d\x01\ +\xa0\x14\xe8\x44\x44\x10\xc8\x05\x1a\x04\x05\x24\x08\x02\x81\x21\ +\x30\x04\x46\x14\x0a\xa8\x00\x5a\xac\x19\x8b\xe4\x94\xd9\x07\x06\ +\xc2\xfa\xd9\xc0\x98\xe3\x37\x93\xc0\x9a\x07\xef\x96\x06\x4c\x6b\ +\xec\x8f\x40\x73\xb4\x93\x35\x01\xa1\x08\x5a\x6f\xd8\x33\xb9\x9a\ +\xf1\x76\x8f\x36\x3a\xf3\x8b\xf5\xde\xc5\xd2\x4d\x06\x81\x3a\x89\ +\x19\xb6\xab\x4d\xaa\x7f\x85\x71\x30\x76\x80\x33\x87\x2d\x0b\x98\ +\xf5\x7b\x40\xfe\xc9\xe2\x6f\x80\x7a\x15\x88\xc2\x55\x06\xb4\x98\ +\xe8\x26\x7b\x40\x87\xc6\xde\x6d\x6a\xcc\x98\xd2\x1c\x99\x29\x26\ +\x07\xd0\x0e\xe0\x45\x6e\xa0\x96\x8e\x34\x97\x2c\xa3\x8f\xd6\x61\ +\xe0\x55\x60\x58\xba\x04\xe6\x05\x86\xad\x19\x81\x61\x6b\x1d\x78\ +\x12\x18\x96\x9e\x14\x10\x81\xa1\xb4\x29\x30\x6c\x1d\x08\x0c\x5b\ +\x87\x02\xc3\xd6\x85\xdf\x61\x04\x5d\x9c\xeb\x4d\x65\xb2\x69\x0e\ +\x7b\x3f\xd0\xe5\x87\x8d\x0e\xba\xbc\x80\x07\x0d\x8c\x6c\xd5\x8c\ +\x72\x13\xfc\x9e\xb4\xb9\x0d\x23\x5d\x62\x86\xad\x0c\x47\xff\x14\ +\xd8\xf5\xe8\xdd\x12\x81\x5a\xaf\x60\xa4\xaa\x05\x84\x6b\x8e\x8f\ +\x9f\x12\xfe\x52\x99\x7c\xf3\x59\x20\xd6\x6e\x92\xaf\xb1\x9d\x99\ +\x1a\x33\x0a\x34\xb6\x73\x81\xe1\xd3\x5b\xa9\x9b\x30\x2a\x1c\xfd\ +\x4b\xe0\xca\x44\x18\x39\x40\xa1\xc3\xb6\x65\xea\x3d\xa3\x5a\x33\ +\xd7\xaa\xa9\x30\xda\x1c\xfd\x67\x60\xd1\x44\x18\x25\x7c\xae\xef\ +\x58\x02\xee\x4d\x84\xd1\xa7\xb1\x8d\x9a\x98\x9b\x54\x02\x35\x0e\ +\xdb\x36\xb0\x61\x1a\x8c\x64\x60\x44\x63\xef\x37\x31\x6b\x1d\xd2\ +\x5c\xc1\x97\x81\x15\xd3\x60\x34\xf2\xb9\xf8\xed\x19\x7d\x99\x42\ +\x5c\xc3\xc8\x07\x26\x34\xf6\x1e\xbf\x25\x66\xd1\x28\xd2\x6a\xbf\ +\x10\xb0\x80\x55\xdb\xf5\x9f\xe4\x49\xb5\xdf\x09\x56\xf9\x52\xc8\ +\xef\xbb\xff\x5b\x18\xd7\x40\x15\x70\x1b\x0f\xae\x10\x04\x8a\x80\ +\x56\xcd\x58\x5e\x04\xcf\x1f\xf3\x7f\xeb\xb8\x92\xbe\xb0\xa7\x02\ +\xe3\x6e\xc4\x86\xb8\x6e\x52\x48\x1f\x83\xac\x55\x60\x08\x8c\x38\ +\x56\x40\x9d\x1a\xe5\x82\x02\xde\x01\xb9\xce\xad\x29\x36\xe7\x60\ +\x02\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x02\xf7\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x43\x00\x00\x00\x38\x08\x06\x00\x00\x00\xa6\x2f\x45\x71\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ +\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd7\x02\ +\x0f\x02\x0b\x1b\x8b\x59\x01\x48\x00\x00\x00\x1d\x74\x45\x58\x74\ +\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\x64\x20\ +\x77\x69\x74\x68\x20\x54\x68\x65\x20\x47\x49\x4d\x50\xef\x64\x25\ +\x6e\x00\x00\x02\x6d\x49\x44\x41\x54\x68\xde\xed\xdb\x5b\x4f\x13\ +\x41\x14\xc0\xf1\x7f\xe5\x96\x20\x86\x96\x9b\x2f\x1a\x7d\x15\xd2\ +\x54\x2e\x9f\xc1\x57\xc0\xbb\x1f\x81\xef\xa0\x1f\x87\xc4\x27\xb0\ +\x14\x28\xd7\xf8\xc0\x07\xf2\x41\xa8\x05\x4c\xf4\x81\x53\x35\xeb\ +\xcc\xb6\xdb\xce\x9e\x1d\xc2\x39\x49\x5f\xa6\xbb\x33\x67\x7e\x3b\ +\x9d\xc9\xee\x4e\x4b\xc0\x04\x30\x82\xc5\x35\xc0\x2e\xf0\xcb\x3e\ +\xec\xde\xb3\x01\xf1\x37\x0c\xc3\x30\x0c\xa3\x6b\x0c\x03\xe7\xc0\ +\x37\xc7\x77\xf7\x81\x51\x47\x79\x0b\xb8\x0c\xd4\xfe\x03\xc9\xa1\ +\x13\x3f\x81\xef\x81\xea\x1e\x03\xc6\x1d\xe5\x57\xc0\x85\xa3\xfc\ +\x3c\xad\xb2\x4d\xcf\xac\xbb\x11\xf0\x62\x9c\x25\xea\x3e\x0b\x58\ +\xf7\x86\x27\xff\x4d\xfb\x99\xd8\x9c\x61\x18\x86\x61\x18\x86\x61\ +\x18\x86\x61\x18\x86\x61\x18\x86\x61\x18\x86\x61\x18\x86\x71\x97\ +\x31\x86\x6e\x49\xdf\x86\x34\x30\x3e\x02\xcf\x22\x87\x98\x07\x3e\ +\x69\x60\x3c\x04\xbe\x4a\x83\x31\xc6\x82\xe4\x37\xa7\x35\x67\xc4\ +\x0a\xd2\x37\xc4\xa0\x13\xe8\x9c\x34\xbc\x10\x09\x44\x55\xf2\x99\ +\x2d\x6a\x35\x89\x05\xa4\x0a\x9c\x0e\x02\x11\x6a\x69\x9d\x15\x90\ +\x6a\x41\x10\xb5\x10\x10\xfd\x62\x34\xb9\x79\x11\x93\x04\x39\x2d\ +\x00\xa4\x06\x1c\x3b\x20\xae\x80\x3d\x0d\x8c\x06\xf0\x21\x05\xa4\ +\xa6\x08\x71\xe2\x81\x78\xa7\x85\x01\xb0\x05\xbc\xf7\x80\x1c\x2b\ +\x80\x3c\x17\x88\x19\x07\xc4\x5b\xe0\x8b\xf6\x9c\xb1\x9d\x02\x72\ +\x22\x09\x6b\x43\xbc\x01\xea\x45\x4d\xa0\xdb\x72\x25\x92\x20\x33\ +\x32\x42\x42\x83\x2c\x0a\xc4\xb4\x03\xe2\x35\xb0\x53\xf4\x6a\x52\ +\x4f\x01\x09\x39\x42\xd2\x20\x5e\xc9\x5c\x16\xc5\x5d\x6b\x5d\x86\ +\x68\x12\x64\x5a\x3a\xb0\x38\x60\xfd\x4b\x52\xcf\x94\x03\xe2\x25\ +\x37\xfb\xd2\xa2\xba\x85\xdf\x91\xa1\x1a\x1a\x24\x0d\x62\xbd\x9f\ +\x55\x43\xeb\x79\x46\xc3\x03\x32\x25\x1d\x5a\xca\x58\xdf\xb2\x9c\ +\x57\x71\x40\xac\x01\xfb\xb1\x3f\xdc\x69\xc8\xd0\x1d\x14\xc4\x07\ +\x71\x29\x10\xcd\x18\x1e\xee\xf4\x12\x7b\x1e\x90\x8a\x74\x70\xb9\ +\xcb\xf9\x2b\x72\x5c\x59\x0b\x22\x4f\x8c\x0e\xc8\x7a\x1f\x20\x3e\ +\x88\xb6\x40\x1c\xe4\x95\x70\xde\xcf\x40\xf7\xa5\x03\x49\x90\xb2\ +\x74\xf8\x49\xa2\xfc\xa9\x94\x4f\x6a\x43\x68\x60\x74\x6e\xec\xd6\ +\xf8\x7f\x87\x60\x19\x78\x9c\x28\x7b\xe4\x80\xf8\x21\xe7\x1f\xe6\ +\x9d\xa8\xd6\xd3\xf1\xa6\xfc\x64\xb2\x6e\x99\x54\x83\xd0\xc4\xf8\ +\x77\x84\xb4\x7b\x3c\xbe\x25\xc7\x1f\x69\x25\xa8\xfd\xde\xe4\x40\ +\x46\x48\x3b\x36\x88\x22\x30\x3a\x20\x69\x23\xa4\x05\xac\xca\x8d\ +\x9e\x6a\x94\x80\xcf\xc0\x0b\xc7\x77\x79\x6f\x97\xf6\xfd\xe9\xe7\ +\x9a\x2e\x5b\x97\x7b\x8c\xac\xdb\xa5\x8f\x86\x25\xa9\x4a\x86\x46\ +\xc6\x3d\x8d\x84\x8a\x91\x8c\xf9\x64\x8d\x51\xcf\x45\x9e\xb0\x77\ +\xad\x05\xcf\x19\x86\x61\x18\xb7\x2c\x4a\xd8\x5f\x39\xff\xac\x62\ +\xbf\x01\xf5\x9d\xd3\x0f\x74\xaa\x37\xd0\x00\x00\x00\x00\x49\x45\ +\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x03\x63\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x43\x00\x00\x00\x37\x08\x06\x00\x00\x00\x57\x79\xf7\xa4\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ +\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd7\x02\ +\x0f\x02\x07\x2d\xe8\x56\xdb\xdd\x00\x00\x00\x1d\x74\x45\x58\x74\ +\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\x64\x20\ +\x77\x69\x74\x68\x20\x54\x68\x65\x20\x47\x49\x4d\x50\xef\x64\x25\ +\x6e\x00\x00\x02\xd9\x49\x44\x41\x54\x68\xde\xed\xdb\x4d\x68\xdc\ +\x45\x18\xc7\xf1\xcf\xb6\xa9\x79\x91\x12\x0f\x0a\x16\x4a\x90\x52\ +\x31\x6d\x72\x2a\x48\xb5\x4a\x43\x15\x6f\x16\x41\xe3\xa5\x60\x91\ +\x36\x68\x4f\xa5\x97\x7a\x53\xef\x3d\x88\x04\xe9\xc1\x78\x10\xf1\ +\xd0\x2a\xc5\x4b\xbd\x58\x08\x82\x60\xa3\x17\x41\x31\xb4\x35\x98\ +\x52\xa5\x3d\x14\x92\xf8\x92\x6a\x13\x9b\xf4\xf0\x1f\x68\x18\x66\ +\x5f\x62\x36\xd9\xa4\xf3\x7f\x60\xd8\x9d\xdf\x7f\xd9\x99\xfd\xce\ +\xcc\x33\x6f\xcf\x56\xb0\x13\xcf\x29\x0d\x1c\xc2\x62\x99\x2c\x6e\ +\x2a\xfb\xc2\x3d\x2b\x61\x94\x30\x4a\x18\x75\xad\x0d\x13\xf8\x30\ +\xf1\xac\x91\x59\x66\x12\x17\xd6\xe9\x6f\x7b\x00\xaf\x27\xf4\x39\ +\x7c\xbc\x1a\xb3\xcc\x7f\x78\x71\x9d\xc2\xe8\xae\x52\xe7\x99\xd5\ +\x1a\x26\x9b\xf1\x29\xfa\x4b\x9f\x71\xaf\x05\x3e\x43\x57\x8e\x30\ +\x7e\xc1\x6c\xa4\xed\xc2\x7b\x39\xc2\xb8\x82\xa3\x09\xfd\x4d\x1c\ +\xc8\x71\x98\x9c\xc5\xfb\x09\x7d\x38\xcc\x50\xd9\xf9\x8c\xb7\x70\ +\x29\xd2\xfa\x71\x24\x47\x18\xf3\x38\x9e\xd0\x4f\x6e\xd4\xde\xb1\ +\xd2\xd9\xe4\x02\xbe\x48\x2c\xd6\x5e\xce\x75\x6a\x3d\x95\xd0\x8e\ +\xe5\x0a\x63\x2c\xa4\xa5\x36\x80\x47\x73\xdd\xa8\x9d\x4e\x7c\xef\ +\x60\xae\x30\xbe\xc4\x9d\x48\x7b\x21\x57\x18\x53\xb8\x18\x69\x4f\ +\xa3\x92\xeb\x79\xc6\x68\x94\x7f\x04\x8f\xe7\x0a\x63\x3c\xa1\x65\ +\x0b\xe3\xe7\x84\xb6\x23\x57\x18\x57\x12\xda\x63\xb9\xc2\x98\x0b\ +\x69\xa9\x75\xe6\x0a\x03\xfe\x8a\xf2\x0f\xe6\x0c\x23\x3e\xf4\x69\ +\xcb\x19\x46\x3c\x2c\xee\xe4\x0c\x63\x6b\x94\xff\x3b\x57\x18\x6d\ +\xe8\x88\xb4\xdb\xb9\xc2\x48\xad\x29\xae\xe6\x0a\x63\x57\x42\xfb\ +\x35\x57\x18\x7d\x09\x6d\x22\x57\x18\x03\x51\x7e\x1a\x97\x73\x84\ +\xd1\x89\xfd\x91\xf6\x2d\x16\x72\x84\xf1\x7c\x62\x26\x19\xb5\xc1\ +\xac\x59\x2b\xc4\xa1\x28\xbf\x80\xcf\xeb\x94\xbb\x4d\x71\xe6\x51\ +\x51\xdc\xd7\xfe\x13\xf6\x36\xb3\xb8\x81\x3f\x36\x22\x8c\x9d\x38\ +\x18\x69\xdf\xe0\xb7\xf0\xbe\x03\x4f\xe1\x19\xec\xc3\x6e\x6c\x6f\ +\xa0\xec\x29\x45\xfc\xc7\xf7\x61\xc8\x7d\x8d\xdf\x5b\xd5\x6b\xaa\ +\xc5\x67\x9c\x8f\x3e\x37\x9c\xf8\xcc\x6b\x8a\xb8\x8d\x4f\x42\x0b\ +\x37\x2b\x22\x6f\x0c\x27\x42\xaf\xaa\x67\xcb\x8e\xcf\x58\x29\x8c\ +\xde\xd0\xb5\x97\x3e\x5f\x08\x2d\xba\x9a\x61\x8a\xff\xe2\x23\x3c\ +\xd1\x4c\x18\x2b\x75\xa0\xc3\xd8\x12\x69\x95\x35\x38\xd4\x69\x57\ +\x44\x02\x8c\x63\x04\x0f\xb7\xda\x67\x0c\x59\xfe\x75\xc0\x14\x7e\ +\x54\x5c\x58\x5f\x0a\xad\x34\x1b\x5e\xdb\xc3\xf9\xc7\x43\x8a\x0b\ +\xa8\xbe\xe0\x5f\x7a\x6b\xd4\x73\x53\xa8\xc7\xa0\xe2\x22\x7c\xa4\ +\x15\x3e\x63\x4f\xf0\xfe\x8d\x74\xe9\x1f\xf0\x36\x9e\xf4\xff\xae\ +\x0e\xba\xf1\x4a\x18\x16\x53\x75\xca\x3a\x17\x60\xae\x99\xcf\x18\ +\x0b\x7b\x8e\x5a\x95\x9a\xc3\x19\xc5\xdd\x49\x33\xad\x0b\x6f\xe0\ +\xa7\x1a\x65\x4f\x2a\x42\x23\xd6\x04\x46\xbd\xf4\x55\x95\x4d\x5b\ +\x33\xad\x82\xc3\xb8\x5e\xa5\x0e\xd3\x78\xa9\x95\x30\x6e\x5a\xfb\ +\x50\x84\xad\xf8\xa0\x4a\x7d\xe6\x5b\x05\xe3\x3b\xf4\xb4\x70\x25\ +\xfd\x2a\xfe\x6c\xb0\xae\x33\xb5\xba\x5b\x0f\xf6\x26\x9e\x3d\x2b\ +\x1d\x99\x13\xdb\x24\xde\x59\x07\xa7\x5a\xbd\x78\x57\x11\x9b\x5a\ +\xcb\x6e\x49\x47\x0e\xaf\xc8\x37\x94\xff\x37\xb9\x9f\xad\x84\x51\ +\xc2\x28\x61\x34\xb4\x37\xb9\x56\xe7\x20\x26\x1b\xbb\x0b\x8a\xcf\ +\xbf\x6f\x9f\xf5\x6a\xf1\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ +\x60\x82\ +\x00\x00\x01\xc7\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x43\x00\x00\x00\x37\x08\x06\x00\x00\x00\x57\x79\xf7\xa4\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ +\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd7\x02\ +\x0f\x02\x04\x30\xa0\x7d\xe4\xc7\x00\x00\x00\x1d\x74\x45\x58\x74\ +\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\x64\x20\ +\x77\x69\x74\x68\x20\x54\x68\x65\x20\x47\x49\x4d\x50\xef\x64\x25\ +\x6e\x00\x00\x01\x3d\x49\x44\x41\x54\x68\xde\xed\xda\xa1\x4e\xc3\ +\x50\x14\x80\xe1\xbf\xa4\x9e\x09\x04\x62\x02\x81\x40\x20\x96\x40\ +\x60\x82\x07\x40\x22\x78\x04\x04\x7b\x03\x04\x12\x81\x44\x22\xb0\ +\x73\x08\xc4\x04\x7e\x08\x48\x58\x82\x40\x20\x10\x84\x20\x26\x08\ +\x61\x09\x1e\x04\x24\x34\xe4\x0c\xb2\xe5\x60\xb6\xff\x24\x15\xf7\ +\x34\x3d\xb7\xfd\xda\x7b\x2a\xda\x02\x38\x02\x36\x30\x2e\x4a\x60\ +\x11\x58\xd1\x82\xfe\x8c\x06\xdf\x21\x86\x18\x62\xfc\x19\xc5\x57\ +\x03\x9d\x0d\xf6\x1d\x00\x9b\x41\xfe\x10\x38\x4d\x9a\xff\x04\x68\ +\x54\xc6\x37\xc0\x4e\x52\xed\x6d\x60\x2f\xc8\x9f\x03\xfb\x41\x7e\ +\x50\x02\xf7\x43\x8a\xbd\x0c\xc9\x3f\x02\xbd\xa4\x13\x7e\x0b\xc6\ +\x59\xb5\xd7\x7e\xb9\xae\x9e\xcb\xc4\x9e\x21\x86\x18\x62\x88\x21\ +\x86\x18\x62\x88\x21\x86\x18\x62\x88\x21\x86\x18\x62\x4c\x51\xb4\ +\x81\xf7\x09\xdc\xda\x3e\x19\x2e\x13\x31\xc6\x8e\x72\x8c\x63\xce\ +\x80\xcb\xa4\xf9\x77\x81\x85\xca\xf8\x01\x38\x4e\xaa\xdd\x04\xb6\ +\xfe\xbb\x81\xb6\x12\x6f\x46\xf7\x47\xed\x6e\x62\xed\x96\x0d\xd4\ +\x9e\x21\x86\x18\x62\x88\x21\x86\x18\x62\x88\x21\x86\x18\x62\x88\ +\x21\x86\x18\x62\x4c\x51\x14\x7c\xfe\x09\xbc\x1e\xec\x5b\x06\xe6\ +\x83\xfc\x1d\xf0\x94\x34\xff\x2a\x50\xab\x8c\x5f\x81\xeb\xa4\xda\ +\x75\x60\x29\xc8\xf7\x81\xdb\x20\x7f\x05\xd0\x61\x32\xbf\x8f\x8c\ +\xba\x75\x5c\x26\xf6\x0c\x31\xc4\x18\xf5\x6d\xd2\x00\xe6\xa4\xe0\ +\xf9\x03\xc6\x6f\xa8\x02\xb1\x08\xb6\x06\x00\x00\x00\x00\x49\x45\ +\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x02\x9e\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x43\x00\x00\x00\x37\x08\x06\x00\x00\x00\x57\x79\xf7\xa4\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ +\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd7\x02\ +\x0f\x02\x02\x2c\xe2\x26\x1f\x0e\x00\x00\x00\x1d\x74\x45\x58\x74\ +\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\x64\x20\ +\x77\x69\x74\x68\x20\x54\x68\x65\x20\x47\x49\x4d\x50\xef\x64\x25\ +\x6e\x00\x00\x02\x14\x49\x44\x41\x54\x68\xde\xed\xdb\x4f\x88\x4d\ +\x61\x18\xc7\xf1\xcf\x35\x57\x24\x93\xff\x93\xb2\x31\x1a\x1b\xa5\ +\x6c\x94\x61\x2d\xf2\x67\x2f\x92\x2c\x58\x59\xd9\xa8\x29\x0b\xb1\ +\x10\xd9\x33\x25\xd9\x49\x62\x61\xc1\xc2\x6a\x76\x42\x8d\x92\x66\ +\x81\x85\x22\x0d\xa3\x69\x58\x90\xc6\x58\xdc\x53\x73\xbd\xf3\xce\ +\x5c\x69\x6e\xcd\x9d\xe7\xfd\xd5\x59\xbc\xbf\xd3\xa9\x73\xbe\x3d\ +\xe7\x79\x9f\xe7\xbc\xef\xa9\x61\x2d\x7a\x15\x81\xa3\x98\x2a\x87\ +\xa9\x25\x25\x16\xa6\x55\x60\x14\x18\x05\x46\x4b\xd5\xf1\x15\x2f\ +\x32\xe7\xfe\x65\x96\xf9\x84\x0f\x0b\xf4\xd9\xba\xb0\x23\xe3\x4f\ +\x62\xb8\x1d\xb3\xcc\x28\xfa\x16\x28\x8c\x55\xb3\xdc\xf3\x78\xbb\ +\x5e\x93\x0d\x78\x84\xf5\x25\x67\x34\xd4\x87\x5b\xa8\x45\x84\xf1\ +\xa5\x0a\xb7\x66\x1d\xc2\x99\x88\x30\x9e\xe2\x72\xc6\xbf\x82\xad\ +\x11\x5f\x93\xf3\x78\x92\x78\xcb\x71\x2d\x22\x8c\x49\x1c\xc3\x58\ +\xe2\x1f\xc6\xde\x88\x09\x74\xb4\x8a\x90\x54\x17\xa2\xce\x26\x83\ +\x78\x9e\x78\xfd\xd8\x15\x11\xc6\x24\x2e\x65\xfc\xb3\x51\xeb\x8c\ +\x87\x78\x93\x78\x07\xb1\x32\x22\x8c\xdf\xb8\x91\x78\x2b\xaa\x64\ +\x1a\xb2\x6b\x7d\x90\xf1\x0e\x44\x85\xf1\x16\x23\x89\xb7\x27\xf2\ +\xf7\x8c\xc7\xc9\xb8\x17\x1b\xa3\xc2\x78\x99\xf1\xb6\x47\x85\xf1\ +\x3a\xe3\x6d\x8e\x0a\x63\xa4\xc0\x98\xd6\x44\x55\x84\x35\x6b\x4d\ +\x54\x18\xf0\x2d\x19\x2f\x8b\x0c\x63\x22\xd3\xd6\x87\x85\xb1\x54\ +\x07\x6b\xbe\x61\x74\xb7\x88\x94\x30\x30\x6a\x99\xe6\xec\x57\x54\ +\x18\x9b\x32\xde\xc7\xa8\x30\xb6\x65\xbc\x77\x05\xc6\xdf\x0d\x5c\ +\x48\x18\x3b\x93\xf1\x0f\xbc\x8a\x08\xa3\x0b\xfb\x13\xef\x19\x7e\ +\x46\x84\xd1\xaf\xb1\x6a\xdf\xac\xa1\xa8\x75\xc6\x91\x8c\x77\x2f\ +\x22\x8c\xd5\x38\x91\x69\xe7\x87\x23\xc2\x38\x95\x29\xb6\x6e\x47\ +\x2c\xc7\xd7\xe1\x5c\xe2\x8d\x6b\x2c\x2e\x85\x83\x71\xb1\x02\xd2\ +\xac\xeb\xe6\xd8\x1d\xb3\x58\x61\xec\xc6\xe9\xc4\xfb\x8c\xab\xd1\ +\xba\xd6\x1e\xdc\xad\xea\x8b\x66\x0d\x68\x6c\x98\x0b\x03\xa3\x0b\ +\x77\x32\x8d\xd9\x10\x6e\xea\x60\xd5\xff\xe3\x9a\x7d\x66\xee\xdf\ +\x1a\xc3\x71\x33\xb7\x37\x2d\xfa\xc8\x48\x41\x4c\xe1\x24\xde\xeb\ +\x70\xcd\x47\x9d\x31\xa0\xb1\x12\xdf\xf1\xaa\x57\x05\x53\xcf\x2c\ +\x49\xb2\x95\xee\x57\x89\x74\xcb\x02\x7c\xb6\xee\x39\x02\x60\xd6\ +\xfb\x2d\xff\x9b\x94\xff\x4d\xda\xd7\xb5\x16\x18\x05\xc6\x22\x56\ +\x1d\xdf\x75\xd8\x57\xec\x76\xe9\x0f\x34\xc7\xdb\xc6\x22\x99\x78\ +\x07\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x03\x12\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x44\x00\x00\x00\x37\x08\x06\x00\x00\x00\xb5\xa5\xec\xdd\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ +\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd7\x02\ +\x0f\x02\x0a\x14\x02\xfd\x2d\x98\x00\x00\x00\x1d\x74\x45\x58\x74\ +\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\x64\x20\ +\x77\x69\x74\x68\x20\x54\x68\x65\x20\x47\x49\x4d\x50\xef\x64\x25\ +\x6e\x00\x00\x02\x88\x49\x44\x41\x54\x68\xde\xed\xdb\x39\x6b\x14\ +\x51\x1c\x00\xf0\xdf\xea\x2a\x98\xc6\xc6\x4a\x30\x5e\x11\x6d\xfc\ +\x04\x5a\x18\x35\x6a\x8c\x57\x65\x23\x12\x15\xf1\x88\xa9\xfc\x02\ +\x82\x95\x85\x85\x88\x8d\x95\x8a\x5d\x14\xf1\x6c\x6c\xbd\x0f\x24\ +\x68\x93\xc2\x78\x0b\x82\x07\xd9\x88\xd8\x78\x15\x99\x85\x64\x99\ +\x37\x1a\x77\xd9\x99\xec\xcc\x1f\xb6\xd8\x37\xc3\x9b\x99\xdf\xbc\ +\x99\xf7\x7f\xf3\x66\x4a\x68\xc3\x59\x45\xc0\xb1\x12\x66\x63\xa4\ +\xb0\x00\x9b\xa6\x15\x06\x13\xa3\x00\x29\x40\x0a\x90\x49\x45\x09\ +\x33\xb0\x2d\xb0\x7c\x20\x50\xbe\x3d\xa1\xce\xe3\x68\x1f\xf7\xff\ +\x09\x8e\xc5\xac\xb7\x0a\x7d\x31\xe5\x5f\x71\x18\x95\x06\x1c\xdf\ +\x51\x2c\x8b\xeb\x4d\xa2\xfd\xaa\x8d\xdb\x7f\xab\xf0\x77\xe0\x97\ +\x14\x4f\x6b\xd6\xbd\x1e\xc0\xf8\x16\x53\xef\x28\x56\x36\xf0\x84\ +\xdf\x0a\xec\x7f\x4f\x96\x2e\x99\xd5\xb8\x11\xe5\x3f\xe3\x63\x14\ +\xdd\xff\x72\x96\x5a\xe9\x1e\xb2\x06\xd7\x02\x18\x1b\x71\x27\x4f\ +\x37\xd5\xb5\xb8\x9a\xd0\x32\x52\xc7\x68\x26\x48\x17\xae\xc4\x60\ +\x54\x22\x8c\xbb\x59\xe9\x65\xca\x4d\xd8\xc6\x72\x5c\x4e\xc0\xb8\ +\x97\xa5\x6e\xb7\x19\x20\xed\x31\x65\x15\x6c\xc0\xfd\xac\xe5\x21\ +\xe5\x14\xb6\x59\xc1\x7a\x3c\xc8\x62\x62\x56\x4e\x01\x63\x1d\x1e\ +\x66\x35\x53\x2d\x37\x19\xa3\x0b\x8f\xf2\x34\x96\xe9\xc6\xd2\x98\ +\xf2\x91\xa8\xdb\xcd\x34\x46\xa3\x41\xba\xa3\xde\x64\x66\xa0\x65\ +\x3c\xce\xd3\x68\xb7\x27\x80\x51\x1d\x30\x4d\x09\x8c\x46\x81\xf4\ +\xe0\x52\x00\x23\x77\xcf\x43\x36\xb7\x12\x46\xbd\x20\x5b\x70\xb1\ +\x95\x30\xea\x01\xd9\x8a\x0b\x31\x18\x5f\xf0\x31\x8f\x20\x03\x31\ +\x18\x9f\xa3\xae\xf5\xc3\x54\x06\xf9\xdf\xc4\x2c\x84\x31\x18\xb3\ +\x6e\x27\x86\x53\x3a\xbe\xb9\x69\x64\xaa\x9f\xa2\x3c\x63\x30\xb0\ +\xbc\x0d\x8b\xf2\xd4\xed\x9e\x4c\xc0\xc8\x5d\xb7\x0b\x47\xb0\xa3\ +\x55\x40\x1a\x71\xc9\x4c\xc7\xb9\x08\xf7\x3c\x6e\x62\x28\x23\xc7\ +\xd7\x89\x39\x8d\xac\x30\x34\x0d\xf1\x2e\xa6\xec\x07\x76\x66\xec\ +\x84\x37\x6d\x1a\xa2\x13\xef\x63\x5a\xca\x19\xf4\x6a\xe1\x48\x9a\ +\xa8\x5a\x82\xb7\x81\x96\xd2\x3b\x55\x5b\x48\x3d\x20\xd0\x91\x80\ +\xb2\x2b\x8f\x20\xb0\x18\x6f\x02\x28\xbb\xf3\x08\x92\x84\xf2\x33\ +\x65\x94\xd4\x40\x44\xd9\xe8\xeb\x00\xca\x9e\x3c\x82\x24\xa1\xfc\ +\x4a\x09\x25\x75\x10\x58\x88\x57\x01\x94\xbd\x79\x04\xc9\x12\x4a\ +\x66\x40\x60\x41\x02\xca\xbe\x3c\x82\x54\x51\x5e\xa6\x88\x92\x39\ +\x10\x98\x9f\x80\x72\x20\x8f\x20\x55\x94\x17\x29\xa0\x64\x16\x84\ +\xb1\xd7\x22\x42\x28\x07\xf3\x08\x52\x45\x19\x0e\xa0\xf4\xe5\x11\ +\x04\xe6\x25\xa0\x1c\xca\x23\x48\x15\xe5\x79\x00\xa5\x3f\x4d\x90\ +\x32\x66\xe1\xc4\x24\x37\x74\xba\x01\x3b\x3b\x14\x0d\x0a\xc7\x47\ +\xc9\xd8\x43\xeb\x15\xc6\xde\x4e\xac\x37\x3a\x02\xe5\xfd\xc6\x66\ +\x1e\x6b\xe3\x54\xf1\xbd\xcc\xc4\x28\xbe\x97\xa9\x8d\x02\xa4\x00\ +\x29\x40\x26\x15\x65\x7c\xc7\xfe\x82\x02\x3c\xfb\x03\xc1\xfc\x98\ +\xc9\x91\x70\x72\xe2\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ +\x82\ +\x00\x00\x02\x97\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x44\x00\x00\x00\x37\x08\x06\x00\x00\x00\xb5\xa5\xec\xdd\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ +\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd7\x02\ +\x0f\x02\x06\x07\x2a\xf6\x23\x4a\x00\x00\x00\x1d\x74\x45\x58\x74\ +\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\x64\x20\ +\x77\x69\x74\x68\x20\x54\x68\x65\x20\x47\x49\x4d\x50\xef\x64\x25\ +\x6e\x00\x00\x02\x0d\x49\x44\x41\x54\x68\xde\xed\xdb\x3b\x6f\x53\ +\x31\x14\xc0\xf1\x3f\x34\x62\x65\x85\x52\x1e\x2d\xea\x63\x61\xe9\ +\xcc\xc2\xcc\xc0\xc6\xc2\x02\x7d\xab\x42\x25\xaa\x2a\x14\x5e\x45\ +\x94\x2f\xc0\x0e\xdf\x86\x9d\x05\xa9\x09\x51\x69\x0b\x7d\xe6\x0b\ +\x14\xb5\xaa\x68\x87\xa4\x12\x44\x3e\x56\xee\xcd\x8d\x7d\xec\xf8\ +\x48\x59\x4e\xae\xed\xf8\x27\xe7\x38\x0f\xdf\x4b\xc0\x24\x50\x21\ +\x05\xc0\x53\x80\x87\xc0\x59\x7a\x70\x06\x5c\xbd\x9c\x16\xc5\xff\ +\x91\x40\x12\x48\x02\xc9\x14\x25\xe0\x1b\xf0\xd8\xf0\xdc\x04\xb0\ +\x66\xc8\xd7\x80\x55\xa5\xf3\x79\x02\x3c\xea\x70\x37\x39\x32\xe4\ +\x8f\x6c\x8d\xee\x0b\x95\xf8\xab\x52\x8c\x67\xc0\x69\xa7\xbb\x49\ +\xec\x6f\x99\x29\xe0\x0b\x30\x90\x6a\x48\x13\xe3\xb3\x61\x2e\x8d\ +\x7e\x04\x99\x6e\xad\x8c\xf6\x79\x1c\x02\x0f\x8a\x1e\x4c\x7b\x0d\ +\x99\x01\xfe\x1a\x5e\xdf\x41\x6b\x43\x20\x4f\x0d\x09\x15\x64\x56\ +\xc0\xd8\xff\x07\xa3\x6f\x40\xe6\x2c\x18\xe3\x6d\xd7\x46\x0f\x22\ +\x61\xec\x19\x30\xa2\x07\x59\xc8\x88\x11\x35\x88\x84\xb1\x0b\x8c\ +\x59\xda\x45\x09\xb2\x98\x13\x23\x4a\x10\x09\x63\x07\x18\xed\xa0\ +\x7d\x54\x20\xcf\xbb\xc4\x88\x0a\xc4\x86\x71\x37\x43\x3f\x51\x80\ +\x2c\x09\x18\xbf\x33\x62\x44\x01\x62\xc3\x18\xc9\xd1\x5f\xd0\x20\ +\x2f\x04\x8c\x5f\x39\x31\x82\x06\x29\x5b\x30\x86\xbb\xe8\x37\x48\ +\x90\xb2\x30\xce\x76\x97\x18\x41\x82\x2c\xf7\x10\x23\x38\x10\x09\ +\x63\x0b\xb8\x53\xd0\x18\xc1\x80\xac\x38\xc0\x08\x06\x44\xc2\xd8\ +\x04\x6e\x17\x5c\x9f\xd4\x83\xbc\x74\x88\xa1\x1e\x44\xc2\xf8\x09\ +\xdc\xea\xd1\x67\x1b\xb5\x20\x15\x0f\x18\x6a\x41\x24\x8c\x0d\xe0\ +\x66\x8f\xbf\x17\xa9\x03\x79\xe5\x11\x43\x1d\xc8\x6b\x0b\xc6\x90\ +\xa3\xdf\x54\xd4\x80\xbc\x11\xda\xd6\x1d\x62\xa8\x01\x79\xab\x04\ +\x43\x05\xc8\x3b\xa1\xcd\x0f\xe0\x06\xee\xc3\x2b\xc8\xaa\x32\x0c\ +\xaf\x20\xef\x85\x6b\x6b\xc0\x20\xfe\xc2\x0b\xc8\x07\xa5\x18\x5e\ +\x40\x24\x8c\x2a\x70\x1d\xff\xe1\x14\x64\x4d\x39\x86\x53\x90\x8f\ +\x16\x8c\x6b\xe8\x09\x27\x20\xc7\x42\x7e\x5d\x19\x46\x2e\x90\x52\ +\x8e\x41\xae\x18\x72\x55\x9a\x67\xba\x1a\x04\x1e\x45\x1c\xba\x5b\ +\x8f\x05\xe3\x62\x85\xdc\xa3\xf9\x5f\x6a\x7b\x74\xba\xfc\xeb\x98\ +\x4f\x3c\x6b\x8e\x4f\xc0\x89\x21\x5f\x86\x74\xbf\x4c\xba\x5f\xa6\ +\xd7\x35\x24\x81\x24\x90\x3e\x8a\x12\xf0\x1d\x98\x4f\x14\x00\xfc\ +\x39\x07\x4e\x22\x30\x54\x3a\x0d\x90\xff\x00\x00\x00\x00\x49\x45\ +\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x03\xc3\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x43\x00\x00\x00\x38\x08\x06\x00\x00\x00\xa6\x2f\x45\x71\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ +\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd7\x02\ +\x0f\x02\x0b\x11\x6b\x8c\xe8\x56\x00\x00\x00\x1d\x74\x45\x58\x74\ +\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\x64\x20\ +\x77\x69\x74\x68\x20\x54\x68\x65\x20\x47\x49\x4d\x50\xef\x64\x25\ +\x6e\x00\x00\x03\x39\x49\x44\x41\x54\x68\xde\xed\x9b\x4b\x68\xd4\ +\x40\x18\x80\xbf\xd4\xd5\xd2\xf4\x61\x2b\x48\x5b\x11\x41\x10\x41\ +\x41\x2f\x0a\x82\x27\x51\xa9\x07\x0f\x82\xa8\x07\x8f\x42\x5d\x6f\ +\x16\x11\xe9\xcd\x07\xe8\x45\x7c\xf7\xa9\x1e\x7b\x50\x3c\x68\xa9\ +\xe2\xb1\x3e\xaf\x0a\x8a\x0f\xac\x56\xd1\x83\x82\x4a\x8b\x2d\xdb\ +\xda\x4a\xd7\xc3\x8e\x18\xc2\x4c\x92\xcd\x63\xb2\x3a\xf9\x21\x2c\ +\xf9\xff\xc9\x3f\x93\x6f\x27\x33\xff\xfc\x93\x58\xc0\x02\xa0\x96\ +\x4c\x00\xd8\x0b\x14\xb3\x83\x62\x55\xd6\x17\xfe\x4a\x06\x23\x83\ +\x91\xc1\xf0\x95\x1c\x30\x03\x8c\x49\x6c\x41\x66\x99\x29\x60\xba\ +\x42\xef\xcd\x02\x1a\x25\xfa\x22\x30\x9e\xc4\x2c\x33\x02\x2c\xae\ +\x50\x18\x0b\x15\x6d\x1e\x4f\xea\x31\x59\x01\x0c\x01\x76\x36\x66\ +\x94\x64\x03\x70\xd6\x54\x18\x05\x89\x2e\x0f\xec\x34\x11\xc6\x30\ +\x30\x20\xd1\x5f\xa9\xe0\xf1\x23\xd1\xc7\x24\x0f\x3c\x73\xe9\x16\ +\x01\xa7\x4c\x84\x51\x00\x76\x4b\xa6\xd5\x7d\xc0\x7a\x13\x07\xd0\ +\x37\x92\x9e\x50\x05\x1c\x35\x75\x36\x39\x0d\xbc\x77\xe9\xb6\x03\ +\xab\x4d\x84\x31\x0d\x1c\x93\x44\x7e\x07\x4d\x8d\x33\xae\x01\xdf\ +\x5c\xba\x3d\x22\x9c\x37\x0e\xc6\x0c\xd0\xef\xd2\x35\x02\x6d\xa6\ +\xae\x5a\xaf\x4b\x74\x3b\x4c\x85\xf1\x1c\xf8\xe8\xd2\x6d\x34\x39\ +\x9f\x71\xd7\x75\xbe\x4a\x04\x62\x46\xc2\x78\x2a\x99\x55\xd6\x98\ +\x0a\xe3\x85\x44\xb7\xfc\x7f\x87\x91\x53\xe8\x5f\x55\x18\x8c\xf9\ +\x3a\x60\xb4\x01\xed\x12\xfd\x77\x4a\x99\x24\xa7\xa4\xb5\x8a\xad\ +\x51\xac\xac\x63\x87\x61\x89\xb8\x62\xbf\xc4\xf6\x23\xea\xbf\x13\ +\x13\x88\x9b\xc0\x36\x5d\x63\x86\x05\xf4\x89\xa5\xbc\x53\x26\x5c\ +\xe7\xba\xd3\x81\x36\x70\x2b\x0c\x88\xa8\x03\xa8\x05\xf4\x02\x07\ +\x5c\xba\xb4\xc4\x16\x3d\x22\x74\xe4\x9b\x8b\xd8\x00\x0b\xe8\x71\ +\x80\xa9\x77\xd9\x27\x35\x82\x18\x04\xb6\x46\x71\x92\x8b\xa1\x21\ +\x16\xd0\x2d\x7e\x1b\x5c\xb6\xd9\x7f\x05\x44\xd8\xc7\xe4\x09\x30\ +\x2a\x01\xd2\x25\x29\xfb\x45\x03\x88\x21\x05\x88\x1b\x3a\x60\x7c\ +\x06\x36\x29\x80\xb8\x65\x54\x03\x88\xcd\x12\xdb\x55\xc5\x6c\x97\ +\xc8\x00\xfa\x49\x00\x79\xe7\x53\xee\x43\x82\x20\xee\xf8\x80\x28\ +\xc6\x59\xa1\x6a\x7b\xf1\xb6\xa3\xcc\x52\xe0\xad\xa2\xdc\x2c\x50\ +\x97\x10\x88\x61\x45\x9d\xfd\x8e\x1e\x5a\xf6\xf6\x62\x54\x18\x7f\ +\x80\x8c\x48\xca\xcd\x11\x7f\xfa\xcf\x06\xee\x05\x00\x91\x1a\x0c\ +\x80\x2d\x8a\xb2\x73\x40\x47\x4c\x20\x6a\x81\xfb\x8a\x7a\x7a\x25\ +\x63\x56\x6a\x30\x4e\xe2\xbd\x5b\xdf\xa1\x19\x44\x6a\x30\x6a\x80\ +\xaf\xf8\xbf\xbe\x70\x28\x24\x88\x3a\xe0\x81\xc2\x67\xb7\x47\xd4\ +\x9b\x0a\x8c\x76\x49\x99\x9f\x31\x01\x09\x0b\x22\x15\x18\x36\xa5\ +\x4d\x24\xa7\x7d\x0a\x58\x07\xbc\x56\x5c\x7f\x38\x60\xfd\xf5\xc0\ +\x43\x85\x8f\xae\x00\xeb\x20\xed\x30\x4e\x48\xec\x7d\xc2\xb6\x24\ +\x02\x10\x2f\x10\x97\x02\x2e\x08\xb5\xc2\x58\x29\x7a\x81\xd3\x36\ +\x09\x2c\x73\xf8\x68\xf5\x00\x72\x44\x51\x6f\x03\xf0\x48\x71\xcd\ +\xc5\x32\x56\xc6\xda\x60\xd8\x94\xb6\x07\xdc\xb6\x4e\x89\x9f\x56\ +\x91\x12\x0c\x02\xc4\x0b\xc4\x85\x32\x53\x04\xda\x60\x0c\x48\xf4\ +\x2f\x81\x6a\x85\xaf\x16\x0f\x20\x9d\x0e\x10\x8f\x15\x65\xce\x87\ +\xc8\x95\x68\x81\x51\x50\xe8\xd6\xfa\xf8\x6b\x11\xc0\x64\x3e\x8f\ +\x7b\x80\x38\x17\x32\x69\xa4\x05\x86\xec\xc8\x07\xf4\xd9\xec\x01\ +\x44\x05\x22\xac\xa4\x02\xa3\xa7\x4c\xbf\xcd\x94\xf6\x58\xfc\xfc\ +\x9e\x89\x18\xb5\x6a\x87\x31\x08\xcc\x0b\xe1\xdb\x0f\x48\x54\x10\ +\xa1\x60\x58\xc0\x2e\xe0\xb2\xc4\x16\xe4\x75\xe9\x09\xe0\x57\xc8\ +\xc6\x56\xa3\xce\x9e\x8f\xc5\x94\x8e\x2c\xeb\x75\xe9\x9c\xb8\xe9\ +\xa6\x90\x15\xd6\x27\x94\xbc\x69\x22\x39\xb1\x54\xfe\xb3\xaf\x0a\ +\x32\x18\x19\x8c\x0c\x46\xb9\x83\x49\xf6\x29\xa7\x90\xdf\xeb\x61\ +\x37\x61\xcd\xc7\x11\xff\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ +\x60\x82\ +\x00\x00\x03\xa7\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x44\x00\x00\x00\x37\x08\x06\x00\x00\x00\xb5\xa5\xec\xdd\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ +\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd7\x02\ +\x0f\x02\x07\x24\x91\x8a\x63\x79\x00\x00\x00\x1d\x74\x45\x58\x74\ +\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\x64\x20\ +\x77\x69\x74\x68\x20\x54\x68\x65\x20\x47\x49\x4d\x50\xef\x64\x25\ +\x6e\x00\x00\x03\x1d\x49\x44\x41\x54\x68\xde\xed\xdb\xcd\x6f\x0c\ +\x61\x1c\xc0\xf1\xef\xe8\x12\xaf\x51\x2f\x89\x97\x06\x6d\x59\x24\ +\x1c\xd4\x4a\x13\x2f\x07\x84\x48\x54\x04\x71\xd2\x08\x1a\x1a\x11\ +\x71\xe0\xea\xd2\x43\xc5\xc5\x3f\xd0\x88\x8b\x38\xa8\x83\x83\x34\ +\x1a\xed\x89\x26\x42\x84\x93\x88\x78\xab\x16\x3d\x70\x68\x2b\x94\ +\xda\xb5\x0e\xfb\x6b\x6c\x37\xf3\xcc\x74\x66\x67\x67\x9e\xdd\x79\ +\x7e\xc9\x73\xd8\x67\x77\x9f\x79\xf6\xb3\xcf\xdb\x3c\xfb\xac\x05\ +\xcc\x00\x4e\x62\x02\xa0\xdb\x02\xe6\x03\xc3\xc6\x02\x80\x03\xd3\ +\x8c\xc1\xe4\x30\x20\x06\xc4\x80\x78\x8a\x04\x30\x0e\x74\x28\x9e\ +\x6f\x55\xe4\x77\x04\x70\xed\x1a\xa0\xc9\x26\x3f\x0b\xdc\x06\x46\ +\x03\xb8\xc6\x41\x60\xa9\xdd\x6c\x02\x0c\xd8\xe4\x0f\xb8\x15\x98\ +\x55\xa4\x62\x63\x05\xf0\xd6\xa6\xdc\xbf\xc0\xf9\x00\xbf\xf0\x47\ +\x8a\xfa\x37\xf9\x2d\xb0\x14\x20\x2b\x81\x77\x21\x60\x94\x05\x88\ +\x13\xc6\xb9\x12\x0c\x09\x5a\x83\xac\x02\xde\x87\x88\xa1\x35\x88\ +\x13\xc6\xd9\x12\x4e\x1a\x5a\x82\xd4\x02\x1f\x22\xc0\xd0\x12\xa4\ +\x16\xe8\x57\x60\xb4\x86\xb0\xac\xd0\x0a\xa4\x2e\x62\x0c\xad\x40\ +\xea\x80\x8f\x0a\x8c\xd3\x21\x2e\x3c\xb5\x00\xa9\xd7\x04\x43\x0b\ +\x90\x7a\x59\xfe\xda\x61\xb4\x44\x70\x6b\x12\x29\xc8\x6a\x05\x46\ +\x26\x22\x8c\x48\x41\xd6\x00\x83\x9a\x61\x44\x06\x92\x54\x60\xa4\ +\x81\x53\x11\xdf\xcd\x87\x0e\x92\x04\x3e\x69\x8a\x11\x3a\xc8\x5a\ +\x07\x8c\x13\x9a\xec\xf7\x84\x06\xb2\x0e\xf8\xac\x39\x46\xa8\x20\ +\x2a\x8c\xe3\x9a\xed\x08\x7a\x06\xf1\xbb\xa7\xba\xbc\xe0\x71\x46\ +\xc6\x8c\x9b\x94\x79\x24\x02\x28\x23\x23\xdd\xe4\x16\x15\x10\x41\ +\xec\xba\xb7\x55\x0a\x46\x50\x20\x17\x80\x4d\x06\xe4\x7f\x2c\x06\ +\x7a\x2b\x05\xc5\x2f\xc8\x78\xc1\xe3\x45\x82\xd2\x10\x57\x90\xa3\ +\x95\x8a\xe2\x17\xe4\x1e\x70\xc4\x06\x65\xa1\xa0\x6c\x8e\xe3\x18\ +\xd2\xe5\x80\xd2\x53\xae\x28\xc5\x0e\xaa\x5d\xc0\x21\x87\x96\x92\ +\x8a\xe3\x2c\x73\x5f\x50\x7e\x17\xe4\x2f\x90\x96\x92\x8a\x1b\x88\ +\x1b\x4a\x2f\xb0\x25\x4e\x4b\xf7\x89\xe8\x16\x94\xbb\xc0\xcc\xbc\ +\xfc\x6a\x69\x29\x7b\x81\x67\x79\xf9\x4b\x80\x65\x40\x15\x30\x0f\ +\xb0\xc8\x1d\x81\x48\x03\x5f\x81\x21\x82\x39\x69\x10\x68\xf8\xd9\ +\x75\xdf\x07\x8c\xd9\xbc\x67\x58\x96\xf8\x2f\x81\x9f\x0e\x65\x4f\ +\xa4\x31\xe0\x15\xd0\x29\xab\xe1\x94\x8f\x16\xad\xcd\xef\x32\x2a\ +\x94\x62\xd3\x20\x70\xcd\xc3\xb8\x14\x39\x88\x25\x18\x3d\x25\xc0\ +\x28\x4c\x0f\xe5\x83\x59\xba\x82\x34\x48\x25\xb3\x21\xa7\x27\x40\ +\x63\x50\x20\x41\x0c\xaa\x73\xa4\x19\x9f\xf1\xd1\xc7\xaf\x03\x0f\ +\x80\x11\x72\x3f\x66\x55\x03\x73\x65\x76\x5a\x0f\x6c\x00\x36\x92\ +\x3b\x5c\xac\x8a\x46\xe0\x31\x70\x03\xb8\x44\x30\x67\xd3\x7c\xb7\ +\x90\x14\xf0\xda\xe5\x1b\xfc\x22\x95\xfd\xa1\x18\x68\xb7\xb9\xd4\ +\xa1\x0a\xd8\x0a\xb4\xcb\x80\xec\x74\xad\x37\x05\x53\x7c\xa8\x5d\ +\xa6\x45\x56\xa8\xaa\xd7\x3c\x05\x8e\x91\x3b\x4b\x0f\xb0\xa7\x08\ +\x94\xfc\xd8\x25\x53\x7b\x5a\x71\xdd\x5f\xd2\x5a\x43\x05\x69\x77\ +\x78\xae\x1f\x38\xac\x28\x6f\xb7\x02\x65\x04\xd8\xee\xb1\x6e\x6e\ +\x63\x56\x1b\xd0\x17\x16\x88\x5d\xca\x00\x57\x80\x59\x2e\x65\x06\ +\x89\x62\x01\xcd\xd2\xca\xec\xea\x94\x8e\x0a\xe4\x1b\xb0\xdf\x43\ +\xb9\x3b\x15\x28\xa3\xc0\x0e\x1f\xf5\x4c\x02\x2f\x3c\xd4\xb7\xc9\ +\x49\x78\xba\x2c\xb9\xed\xa2\x73\x8a\xbb\x67\x97\xa5\xab\xe0\x11\ +\xc5\xee\xf4\xe1\x77\xe0\xa2\xb4\x18\x2f\x31\x5b\xba\x72\xcd\x14\ +\x5e\x7b\x15\x78\x6e\x93\xdf\x67\xfe\x2f\x33\x39\xcc\xff\x65\x4a\ +\x75\xfb\x6f\x40\x0c\x48\x4c\x22\x01\xfc\x01\xee\x18\x0a\x00\x86\ +\xfe\x01\xc7\x2c\xc6\x33\xb5\x4e\x77\xd4\x00\x00\x00\x00\x49\x45\ +\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x02\xa8\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x43\x00\x00\x00\x37\x08\x06\x00\x00\x00\x57\x79\xf7\xa4\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ +\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd7\x02\ +\x0f\x02\x08\x20\x11\x7f\xbb\xaf\x00\x00\x00\x1d\x74\x45\x58\x74\ +\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\x64\x20\ +\x77\x69\x74\x68\x20\x54\x68\x65\x20\x47\x49\x4d\x50\xef\x64\x25\ +\x6e\x00\x00\x02\x1e\x49\x44\x41\x54\x68\xde\xed\xda\x41\x88\x8c\ +\x61\x1c\xc7\xf1\xcf\xab\x89\x15\x21\xa5\x56\xa4\xdd\x72\x40\x28\ +\x94\x93\x24\x87\xcd\x19\x27\xb5\x4e\x7b\x11\x0e\x22\x11\x49\x72\ +\x50\xeb\xa4\x70\x12\x07\x72\x91\x1c\x36\xc4\x81\x83\x58\xe5\xa2\ +\x8d\xa4\x24\x07\x25\xb6\xac\x4d\xb4\x49\xe3\x60\x44\x4f\xcf\xd4\ +\x0c\xbb\x76\x67\xfe\xef\xaf\x9e\xc3\xf3\x7b\xde\x67\x9a\xf7\x3b\ +\xcf\xf3\x7f\x9e\xff\xf3\x4c\x81\x2d\x38\xa9\x94\x0a\xe6\x63\x5d\ +\x89\x82\x69\x25\x82\x12\x46\x09\xa3\x84\xd1\x84\x8a\x5a\x00\xed\ +\xce\xb4\x35\xb2\xca\x0c\xa1\x0f\xdf\xa7\xe0\xbb\xcd\xc6\xfd\x8c\ +\xff\x19\x9b\x9a\x... [truncated message content] |
From: <ti...@us...> - 2007-02-15 02:14:14
|
Revision: 168 http://pymoul.svn.sourceforge.net/pymoul/?rev=168&view=rev Author: tiran Date: 2007-02-14 18:14:13 -0800 (Wed, 14 Feb 2007) Log Message: ----------- Added D'ni number pictures Added Paths: ----------- pymoul/trunk/src/moul/qt/ui/resources/dninumbers/ pymoul/trunk/src/moul/qt/ui/resources/dninumbers/00.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/00c.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/01.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/02.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/03.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/04.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/05.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/06.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/07.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/08.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/09.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/10.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/11.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/12.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/13.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/14.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/15.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/16.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/17.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/18.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/19.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/20.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/21.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/22.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/23.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/24.png pymoul/trunk/src/moul/qt/ui/resources/dninumbers/25.png Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/00.png =================================================================== (Binary files differ) Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/00.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/00c.png =================================================================== (Binary files differ) Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/00c.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/01.png =================================================================== (Binary files differ) Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/01.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/02.png =================================================================== (Binary files differ) Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/02.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/03.png =================================================================== (Binary files differ) Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/03.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/04.png =================================================================== (Binary files differ) Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/04.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/05.png =================================================================== (Binary files differ) Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/05.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/06.png =================================================================== (Binary files differ) Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/06.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/07.png =================================================================== (Binary files differ) Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/07.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/08.png =================================================================== (Binary files differ) Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/08.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/09.png =================================================================== (Binary files differ) Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/09.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/10.png =================================================================== (Binary files differ) Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/10.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/11.png =================================================================== (Binary files differ) Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/11.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/12.png =================================================================== (Binary files differ) Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/12.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/13.png =================================================================== (Binary files differ) Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/13.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/14.png =================================================================== (Binary files differ) Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/14.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/15.png =================================================================== (Binary files differ) Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/15.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/16.png =================================================================== (Binary files differ) Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/16.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/17.png =================================================================== (Binary files differ) Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/17.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/18.png =================================================================== (Binary files differ) Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/18.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/19.png =================================================================== (Binary files differ) Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/19.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/20.png =================================================================== (Binary files differ) Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/20.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/21.png =================================================================== (Binary files differ) Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/21.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/22.png =================================================================== (Binary files differ) Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/22.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/23.png =================================================================== (Binary files differ) Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/23.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/24.png =================================================================== (Binary files differ) Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/24.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/25.png =================================================================== (Binary files differ) Property changes on: pymoul/trunk/src/moul/qt/ui/resources/dninumbers/25.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ti...@us...> - 2007-02-14 22:48:23
|
Revision: 167 http://pymoul.svn.sourceforge.net/pymoul/?rev=167&view=rev Author: tiran Date: 2007-02-14 14:48:22 -0800 (Wed, 14 Feb 2007) Log Message: ----------- Some time and ui fixes Modified Paths: -------------- pymoul/trunk/src/moul/file/plasmalog.py pymoul/trunk/src/moul/qt/mainwindow.py pymoul/trunk/src/moul/qt/ui/mainwindow.ui pymoul/trunk/src/moul/time/__init__.py pymoul/trunk/src/moul/time/cavern.py pymoul/trunk/src/moul/time/dni.py pymoul/trunk/src/moul/time/utils.py Modified: pymoul/trunk/src/moul/file/plasmalog.py =================================================================== --- pymoul/trunk/src/moul/file/plasmalog.py 2007-02-14 22:47:45 UTC (rev 166) +++ pymoul/trunk/src/moul/file/plasmalog.py 2007-02-14 22:48:22 UTC (rev 167) @@ -72,7 +72,7 @@ """ self._dozip = bool(boolean) - def setRemoe(self, boolean): + def setRemove(self, boolean): """Set remoe flag """ self._doremove = bool(boolean) Modified: pymoul/trunk/src/moul/qt/mainwindow.py =================================================================== --- pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-14 22:47:45 UTC (rev 166) +++ pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-14 22:48:22 UTC (rev 167) @@ -334,6 +334,12 @@ """ mb = qtutils.notImplementedMB(self) mb.exec_() + return + logzipper = self.urupersonaldr.logzipper + logzipper.setZip(self.radio_ziplogs.isChecked() + # always remove + logzipper.setRemove(True) + #doremove = self.radio_deletelogs.isChecked() # ************************************************************************ # system tray Modified: pymoul/trunk/src/moul/qt/ui/mainwindow.ui =================================================================== --- pymoul/trunk/src/moul/qt/ui/mainwindow.ui 2007-02-14 22:47:45 UTC (rev 166) +++ pymoul/trunk/src/moul/qt/ui/mainwindow.ui 2007-02-14 22:48:22 UTC (rev 167) @@ -244,7 +244,7 @@ <bool>true</bool> </property> <property name="text" > - <string>Zip debug logs</string> + <string>Zip and delete debug logs</string> </property> <property name="checked" > <bool>true</bool> @@ -266,7 +266,7 @@ <item row="1" column="1" colspan="3" > <widget class="QLabel" name="lb_log_remove" > <property name="text" > - <string>Remove zipped logs</string> + <string>Remove all zipped logs</string> </property> <property name="buddy" > <cstring>pb_log_remove</cstring> Modified: pymoul/trunk/src/moul/time/__init__.py =================================================================== --- pymoul/trunk/src/moul/time/__init__.py 2007-02-14 22:47:45 UTC (rev 166) +++ pymoul/trunk/src/moul/time/__init__.py 2007-02-14 22:48:22 UTC (rev 167) @@ -21,8 +21,4 @@ __version__ = "$Id$" __revision__ = "$Revision$" -from moul.osdependent import __FROZEN__ -# pytz is an egg -if not __FROZEN__: - import pkg_resources - pkg_resources.require("pytz>=2006p") +import moul.time.utils Modified: pymoul/trunk/src/moul/time/cavern.py =================================================================== --- pymoul/trunk/src/moul/time/cavern.py 2007-02-14 22:47:45 UTC (rev 166) +++ pymoul/trunk/src/moul/time/cavern.py 2007-02-14 22:48:22 UTC (rev 167) @@ -24,14 +24,14 @@ __all__ = ['CavernTime'] from datetime import datetime -from pytz import all_timezones -from pytz import timezone -from pytz import utc as UTC +from moul.time.utils import diffTD +from moul.time.utils import normalizeTZ from moul.time.utils import td2sec -from moul.time.utils import diffTD +from moul.time.utils import timezone from moul.time.utils import utcnow -from moul.time.utils import normalizeTZ +from moul.time.utils import UNIX_0 +from moul.time.utils import UTC ## not used in the current version #SUPPORTED_TZ = ('America', 'Canada', 'Etc', 'Europe', 'US') Modified: pymoul/trunk/src/moul/time/dni.py =================================================================== --- pymoul/trunk/src/moul/time/dni.py 2007-02-14 22:47:45 UTC (rev 166) +++ pymoul/trunk/src/moul/time/dni.py 2007-02-14 22:48:22 UTC (rev 167) @@ -94,13 +94,14 @@ __revision__ = "$Revision$" from datetime import datetime -from pytz import utc as UTC -from pytz import timezone from time import mktime import sys from moul.time.utils import td2sec +from moul.time.utils import timezone from moul.time.utils import utcnow +from moul.time.utils import UNIX_0 +from moul.time.utils import UTC # list of month names with approx. dates VAILEETEE = ( @@ -120,8 +121,6 @@ BASE_GREGORIAN = datetime(1998, 4, 21, 10, 35, 18, 0, tzinfo=UTC) BASE_HAHR = 9654 FAHRAH_1 = -7656 # hahrtee fahrah 1 starts ~April 21st 7656 B.C -# timestamp 0 - start of unix time -UNIX_0 = datetime(1970, 1, 1, 0, 0, 0, 0, tzinfo=UTC) BASE_SEC = td2sec(BASE_GREGORIAN - UNIX_0) # WTF? no tottimestamp in datetime # factors Modified: pymoul/trunk/src/moul/time/utils.py =================================================================== --- pymoul/trunk/src/moul/time/utils.py 2007-02-14 22:47:45 UTC (rev 166) +++ pymoul/trunk/src/moul/time/utils.py 2007-02-14 22:48:22 UTC (rev 167) @@ -21,9 +21,18 @@ __version__ = "$Id: cavern.py 124 2007-02-02 17:45:42Z tiran $" __revision__ = "$Revision: 124 $" +from moul.osdependent import __FROZEN__ +# pytz is an egg +if not __FROZEN__: + import pkg_resources + pkg_resources.require("pytz>=2006p") + from datetime import datetime from pytz import utc as UTC +from pytz import timezone +# timestamp 0 - start of unix time +UNIX_0 = datetime(1970, 1, 1, 0, 0, 0, 0, tzinfo=UTC) def diffTD(td1, td2): """Difference of two time delta objects -> int @@ -71,4 +80,6 @@ """ if utc_dt is None: utc_dt = utcnow() + if isinstance(tz, basestring): + tz = timezone(tz) return tz.normalize(utc_dt.astimezone(tz)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ti...@us...> - 2007-02-14 22:47:48
|
Revision: 166 http://pymoul.svn.sourceforge.net/pymoul/?rev=166&view=rev Author: tiran Date: 2007-02-14 14:47:45 -0800 (Wed, 14 Feb 2007) Log Message: ----------- Updated XXX report and languages Modified Paths: -------------- pymoul/trunk/doc/XXXreport.html pymoul/trunk/src/moul/qt/i18n/pymoul_de.ts pymoul/trunk/src/moul/qt/i18n/pymoul_es.ts pymoul/trunk/src/moul/qt/i18n/pymoul_fr.ts pymoul/trunk/src/moul/qt/i18n/pymoul_it.ts pymoul/trunk/src/moul/qt/i18n/pymoul_nl.ts Modified: pymoul/trunk/doc/XXXreport.html =================================================================== --- pymoul/trunk/doc/XXXreport.html 2007-02-13 19:37:02 UTC (rev 165) +++ pymoul/trunk/doc/XXXreport.html 2007-02-14 22:47:45 UTC (rev 166) @@ -3,11 +3,11 @@ <body> <h1>pyMoul - Developer report tools: XXX/TODO/FIXME comments</h1> -<p>Generated on Wed, 07 Feb 2007 16:03:30 CET, based on Zope 3's XXX report</p> +<p>Generated on Tue, 13 Feb 2007 20:37:41 CET, based on Zope 3's XXX report</p> <hr> <h3>Summary</h3> <p> - There are currently 88 XXX/TODO/FIXME comments. + There are currently 133 XXX/TODO/FIXME comments. </p> <hr/> <h3>Listing</h3> @@ -63,14 +63,14 @@ base-106- base-107- def test_publicapi_create(self): base-108- inipath = os.path.join(self.tmpdir, os.path.basename(self.enc)) -</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/test_wdysini.py.svn-base:116</b><br/><pre> # TODO: more -base-117- -base-118-class AudioIniTest(GenericIniTest): -base-119- enc = aud_enc -</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/test_wdysini.py.svn-base:154</b><br/><pre> #XXX self.failIf(p.isChanged()) -base-155- -base-156- p.screenres = 0 -base-157- eq(p._get('Graphics.Width'), 800) +</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/test_wdysini.py.svn-base:114</b><br/><pre> # TODO: more +base-115- +base-116-class AudioIniTest(GenericIniTest): +base-117- enc = aud_enc +</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/test_wdysini.py.svn-base:152</b><br/><pre> #XXX self.failIf(p.isChanged()) +base-153- +base-154- p.screenres = 0 +base-155- eq(p._get('Graphics.Width'), 800) </pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/utils.py.svn-base:80</b><br/><pre> for fname in ('UruLauncher.exe', 'UruExplorer.exe'): # XXX: win32 base-81- fd = open(os.path.join(path, fname), 'wb') base-82- fd.write('dummy') @@ -79,14 +79,26 @@ def test_publicapi_create(self): inipath = os.path.join(self.tmpdir, os.path.basename(self.enc)) -</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py:116</b><br/><pre> # TODO: more +</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py:114</b><br/><pre> # TODO: more class AudioIniTest(GenericIniTest): enc = aud_enc -</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py:154</b><br/><pre> #XXX self.failIf(p.isChanged()) +</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py:152</b><br/><pre> #XXX self.failIf(p.isChanged()) p.screenres = 0 eq(p._get('Graphics.Width'), 800) +</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py~:105</b><br/><pre> # TODO: more + + def test_publicapi_create(self): + inipath = os.path.join(self.tmpdir, os.path.basename(self.enc)) +</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py~:116</b><br/><pre> # TODO: more + +class AudioIniTest(GenericIniTest): + enc = aud_enc +</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py~:154</b><br/><pre> #XXX self.failIf(p.isChanged()) + + p.screenres = 0 + eq(p._get('Graphics.Width'), 800) </pre></li><li><b>File: utilities/../src/moul/file/tests/utils.py:80</b><br/><pre> for fname in ('UruLauncher.exe', 'UruExplorer.exe'): # XXX: win32 fd = open(os.path.join(path, fname), 'wb') fd.write('dummy') @@ -155,110 +167,164 @@ return len([name for name in os.listdir(path) if os.path.isfile(os.path.join(path, name))]) -</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/whatdoyousee.py.svn-base:77</b><br/><pre> # XXX: dos format -base-78- return data.replace("\r\n", "\n") -base-79- -base-80-def encryptWDYS(instr, fout): -</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/whatdoyousee.py.svn-base:87</b><br/><pre> # XXX: dos format -base-88- instr = instr.replace("\n", "\r\n") -base-89- fout.seek(0) -base-90- fout.write(HEADER) -</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/elf.py.svn-base:71</b><br/><pre> # XXX NotImplemented -base-72- raise NotImplementedError -base-73- -base-74-def decipher(crypt, size, key): -</pre></li><li><b>File: utilities/../src/moul/crypt/whatdoyousee.py:77</b><br/><pre> # XXX: dos format +</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/whatdoyousee.py.svn-base:76</b><br/><pre> # XXX: dos format +base-77- return data.replace("\r\n", "\n") +base-78- +base-79-def encryptWDYS(instr, fout): +</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/whatdoyousee.py.svn-base:86</b><br/><pre> # XXX: dos format +base-87- instr = instr.replace("\n", "\r\n") +base-88- fout.seek(0) +base-89- fout.write(HEADER) +</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/elf.py.svn-base:28</b><br/><pre># TODO: use BinaryFile +base-29- +base-30-def list2int(lst): +base-31- return [ord(s) for s in lst] +</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/elf.py.svn-base:72</b><br/><pre> # XXX NotImplemented +base-73- raise NotImplementedError +base-74- +base-75-def decipher(crypt, size, key): +</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/binary.py.svn-base:293</b><br/><pre> if size > 1024: # XXX: ??? +base-294- raise ValueError("string is too long: %i" % size) +base-295- if self.version == 5: +base-296- size |= 0xF000 +</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/binary.py.svn-base:315</b><br/><pre> if size > 1024: # XXX: ??? +base-316- raise ValueError("size '%i' > 1024 at position %s(%s)" % +base-317- (size, fd.tell(), repr(fd))) +base-318- if self.version == 5: +base:319: # XXX: testme +base-320- # read data as tuple of integeres +base-321- data = fd.readPacked("<%iI" % size) +base-322- # OR integers with 0xff and write their char equivalent to string +</pre></li><li><b>File: utilities/../src/moul/crypt/tests/.svn/text-base/test_binary.py.svn-base:98</b><br/><pre> # XXX: no test data +base-99- pass +base-100- +base-101- def test_string0(self): +</pre></li><li><b>File: utilities/../src/moul/crypt/tests/test_binary.py:98</b><br/><pre> # XXX: no test data + pass + + def test_string0(self): +</pre></li><li><b>File: utilities/../src/moul/crypt/tests/test_binary.py~:98</b><br/><pre> # XXX: no test data + pass + + def test_string0(self): +</pre></li><li><b>File: utilities/../src/moul/crypt/whatdoyousee.py:76</b><br/><pre> # XXX: dos format return data.replace("\r\n", "\n") def encryptWDYS(instr, fout): -</pre></li><li><b>File: utilities/../src/moul/crypt/whatdoyousee.py:87</b><br/><pre> # XXX: dos format +</pre></li><li><b>File: utilities/../src/moul/crypt/whatdoyousee.py:86</b><br/><pre> # XXX: dos format instr = instr.replace("\n", "\r\n") fout.seek(0) fout.write(HEADER) -</pre></li><li><b>File: utilities/../src/moul/crypt/elf.py:71</b><br/><pre> # XXX NotImplemented +</pre></li><li><b>File: utilities/../src/moul/crypt/binary.py~:293</b><br/><pre> if size > 1024: # XXX: ??? + raise ValueError("string is too long: %i" % size) + if self.version == 5: + size |= 0xF000 +</pre></li><li><b>File: utilities/../src/moul/crypt/binary.py~:315</b><br/><pre> if size > 1024: # XXX: ??? + raise ValueError("size '%i' > 1024 at position %s(%s)" % + (size, fd.tell(), repr(fd))) + if self.version == 5: + # read data as tuple of integeres + data = fd.readPacked("<%iI" % size) + # OR integers with 0xff and write their char equivalent to string +</pre></li><li><b>File: utilities/../src/moul/crypt/elf.py:28</b><br/><pre># TODO: use BinaryFile + +def list2int(lst): + return [ord(s) for s in lst] +</pre></li><li><b>File: utilities/../src/moul/crypt/elf.py:72</b><br/><pre> # XXX NotImplemented raise NotImplementedError def decipher(crypt, size, key): -</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:152</b><br/><pre> # FIXME: signal doesn't do anything -base-153- self.emit(SIGNAL("close()")) -base-154- event.accept() -base-155- event.ignore() -</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:291</b><br/><pre> del self._kiimage_threadlet# TODO: other message box -base-292- del self._kiimage_progressbar -base-293- self.pb_kiimage_repair.setEnabled(True) -base-294- mb = qtutils.infoMB(self, -</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:390</b><br/><pre> # TODO: change timer from every second to every minute -base-391- self._timezone_timer = timer = QtCore.QTimer(self) -base-392- timer.setInterval(1000) # 1 sec -base:393: # TODO: needs optimization? run only when timer tab is active -base-394- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout) -base-395- timer.start() -base-396- -</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:487</b><br/><pre> # TODO: thread safety! -base-488- self.servers = servers -base-489- if not self.isRunning(): -base-490- self.start() -</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:493</b><br/><pre> # TODO: thread safety! -base-494- # emit a list of names first -base-495- for server in self.servers: -base-496- self.emit(SIGNAL("server(const QString&)"), server.name) -</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:531</b><br/><pre> # TODO check this -base-532- self._running = False -base-533- self.condition.wakeAll() -base-534- +</pre></li><li><b>File: utilities/../src/moul/crypt/binary.py:293</b><br/><pre> if size > 1024: # XXX: ??? + raise ValueError("string is too long: %i" % size) + if self.version == 5: + size |= 0xF000 +</pre></li><li><b>File: utilities/../src/moul/crypt/binary.py:315</b><br/><pre> if size > 1024: # XXX: ??? + raise ValueError("size '%i' > 1024 at position %s(%s)" % + (size, fd.tell(), repr(fd))) + if self.version == 5: + # read data as tuple of integeres + data = fd.readPacked("<%iI" % size) + # OR integers with 0xff and write their char equivalent to string +</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:154</b><br/><pre> # FIXME: signal doesn't do anything +base-155- self.emit(SIGNAL("close()")) +base-156- event.accept() +base-157- event.ignore() +</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:293</b><br/><pre> del self._kiimage_threadlet# TODO: other message box +base-294- del self._kiimage_progressbar +base-295- self.pb_kiimage_repair.setEnabled(True) +base-296- mb = qtutils.infoMB(self, +</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:392</b><br/><pre> # TODO: change timer from every second to every minute +base-393- self._timezone_timer = QtCore.QTimer(self) +base-394- self._timezone_timer.setInterval(1000) # 1 sec +base:395: # TODO: needs optimization? run only when timer tab is active +base-396- self.connect(self._timezone_timer, SIGNAL('timeout()'), +base-397- self.on_timezone_timer_timeout) +base-398- self._timezone_timer.start() +</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:507</b><br/><pre> # TODO: thread safety! +base-508- self.servers = servers +base-509- if not self.isRunning(): +base-510- self.start() +</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:513</b><br/><pre> # TODO: thread safety! +base-514- # emit a list of names first +base-515- for server in self.servers: +base-516- self.emit(SIGNAL("server(const QString&)"), server.name) +</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:551</b><br/><pre> # TODO check this +base-552- self._running = False +base-553- self.condition.wakeAll() +base-554- </pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/errorhandler.py.svn-base:45</b><br/><pre> # TODO: translation aware base-46- LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback)) base-47- if getattr(sys, 'frozen', False): base-48- try: -</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:151</b><br/><pre> # FIXME: signal doesn't do anything +</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:154</b><br/><pre> # FIXME: signal doesn't do anything self.emit(SIGNAL("close()")) event.accept() event.ignore() -</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:290</b><br/><pre> del self._kiimage_threadlet# TODO: other message box +</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:293</b><br/><pre> del self._kiimage_threadlet# TODO: other message box del self._kiimage_progressbar self.pb_kiimage_repair.setEnabled(True) mb = qtutils.infoMB(self, -</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:389</b><br/><pre> # TODO: change timer from every second to every minute - self._timezone_timer = timer = QtCore.QTimer(self) - timer.setInterval(1000) # 1 sec - self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout) - timer.start() - -</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:486</b><br/><pre> # TODO: thread safety! +</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:392</b><br/><pre> # TODO: change timer from every second to every minute + self._timezone_timer = QtCore.QTimer(self) + self._timezone_timer.setInterval(1000) # 1 sec + self.connect(self._timezone_timer, SIGNAL('timeout()'), + self.on_timezone_timer_timeout) + self._timezone_timer.start() +</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:507</b><br/><pre> # TODO: thread safety! self.servers = servers if not self.isRunning(): self.start() -</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:492</b><br/><pre> # TODO: thread safety! +</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:513</b><br/><pre> # TODO: thread safety! # emit a list of names first for server in self.servers: self.emit(SIGNAL("server(const QString&)"), server.name) -</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:530</b><br/><pre> # TODO check this +</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:551</b><br/><pre> # TODO check this self._running = False self.condition.wakeAll() -</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:152</b><br/><pre> # FIXME: signal doesn't do anything +</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:154</b><br/><pre> # FIXME: signal doesn't do anything self.emit(SIGNAL("close()")) event.accept() event.ignore() -</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:291</b><br/><pre> del self._kiimage_threadlet# TODO: other message box +</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:293</b><br/><pre> del self._kiimage_threadlet# TODO: other message box del self._kiimage_progressbar self.pb_kiimage_repair.setEnabled(True) mb = qtutils.infoMB(self, -</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:390</b><br/><pre> # TODO: change timer from every second to every minute - self._timezone_timer = timer = QtCore.QTimer(self) - timer.setInterval(1000) # 1 sec - self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout) - timer.start() - -</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:487</b><br/><pre> # TODO: thread safety! +</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:392</b><br/><pre> # TODO: change timer from every second to every minute + self._timezone_timer = QtCore.QTimer(self) + self._timezone_timer.setInterval(1000) # 1 sec + self.connect(self._timezone_timer, SIGNAL('timeout()'), + self.on_timezone_timer_timeout) + self._timezone_timer.start() +</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:507</b><br/><pre> # TODO: thread safety! self.servers = servers if not self.isRunning(): self.start() -</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:493</b><br/><pre> # TODO: thread safety! +</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:513</b><br/><pre> # TODO: thread safety! # emit a list of names first for server in self.servers: self.emit(SIGNAL("server(const QString&)"), server.name) -</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:531</b><br/><pre> # TODO check this +</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:551</b><br/><pre> # TODO check this self._running = False self.condition.wakeAll() @@ -270,6 +336,18 @@ _thismodule = sys.modules[__name__] if __WIN32__: from moul.osdependent import win32 as osdep_win32 +</pre></li><li><b>File: utilities/../src/moul/osdependent/darwin/__init__.py:37</b><br/><pre>EXEC_NAME = "???" # XXX +UPDATER = "Uru Live.app/Contents/Resources/Game.app/Contents/Resources/URU Live Updater.app/Contents/MacOS/URU Live Updater" +LOCATIONS = [ + "/Applications", +</pre></li><li><b>File: utilities/../src/moul/osdependent/darwin/.svn/text-base/__init__.py.svn-base:37</b><br/><pre>EXEC_NAME = "???" # XXX +base-38-UPDATER = "Uru Live.app/Contents/Resources/Game.app/Contents/Resources/URU Live Updater.app/Contents/MacOS/URU Live Updater" +base-39-LOCATIONS = [ +base-40- "/Applications", +</pre></li><li><b>File: utilities/../src/moul/osdependent/darwin/__init__.py~:37</b><br/><pre>EXEC_NAME = "???" # XXX +UPDATER = "Uru Live.app/Contents/Resources/Game.app/Contents/Resources/URU Live Updater.app/Contents/MacOS/URU Live Updater" +LOCATIONS = [ + "/Applications", </pre></li><li><b>File: utilities/../src/moul/osdependent/.svn/text-base/__init__.py.svn-base:120</b><br/><pre># XXX: what about cygwin, bsd and others? base-121-_thismodule = sys.modules[__name__] base-122-if __WIN32__: @@ -290,10 +368,10 @@ base-27-base-691- from zope.tales.tales import TALESTracebackSupplement base-28-base-692- from zope.pagetemplate.pagetemplate \ base-29-base-693- import PageTemplateTracebackSupplement -base:30:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/chatlog.py.svn-base:208</b><br/><pre> # TODO: inefficient, compare list with directory content -base-31-base-209- if not os.path.isdir(self._logdir): -base-32-base-210- LOG.warning("%s is not a directory" % logdir) -base-33-base-211- return +base:30:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/chatlog.py.svn-base:216</b><br/><pre> # TODO: inefficient, compare list with directory content +base-31-base-217- if not os.path.isdir(self._archivedir): +base-32-base-218- LOG.warning("%s is not a directory" % self._archivedir) +base-33-base-219- return base:34:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/kiimage.py.svn-base:112</b><br/><pre> # XXX use struct base-35-base-113- if header is None: base-36-base-114- fd = self._fd @@ -354,10 +432,10 @@ base-91- fd = open(os.path.join(path, fname), 'wb') base-92- fd.write('dummy') base-93- fd.close() -base:94:</pre></li><li><b>File: utilities/../src/moul/file/chatlog.py:208</b><br/><pre> # TODO: inefficient, compare list with directory content -base-95- if not os.path.isdir(self._logdir): -base-96- LOG.warning("%s is not a directory" % logdir) -base-97- return +base:94:</pre></li><li><b>File: utilities/../src/moul/file/chatlog.py:216</b><br/><pre> # TODO: inefficient, compare list with directory content +base-95- if not os.path.isdir(self._archivedir): +base-96- LOG.warning("%s is not a directory" % self._archivedir) +base-97- return base:98:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py:112</b><br/><pre> # XXX use struct base-99- if header is None: base-100- fd = self._fd @@ -406,10 +484,10 @@ base-143- base-144-class GraphicsIni(ConfFile): base-145- _filename = 'graphics.ini' -base:146:</pre></li><li><b>File: utilities/../src/moul/file/chatlog.py~:208</b><br/><pre> # TODO: inefficient, compare list with directory content -base-147- if not os.path.isdir(logdir): -base-148- LOG.warning("%s is not a directory" % logdir) -base-149- return +base:146:</pre></li><li><b>File: utilities/../src/moul/file/chatlog.py~:216</b><br/><pre> # TODO: inefficient, compare list with directory content +base-147- if not os.path.isdir(self._archivedir): +base-148- LOG.warning("%s is not a directory" % self._archivedir) +base-149- return base:150:</pre></li><li><b>File: utilities/../src/moul/file/directory.py:59</b><br/><pre> # TODO: fnmatch base-151- return len([name for name in os.listdir(path) base-152- if os.path.isfile(os.path.join(path, name))]) @@ -442,89 +520,89 @@ base-179- raise NotImplementedError base-180- base-181-def decipher(crypt, size, key): -base:182:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:149</b><br/><pre> # FIXME: signal doesn't do anything -base-183-base-150- self.emit(SIGNAL("close()")) -base-184-base-151- event.accept() -base-185-base-152- event.ignore() -base:186:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:250</b><br/><pre> del self._kiimage_threadlet# TODO: other message box -base-187-base-251- del self._kiimage_progressbar -base-188-base-252- self.pb_kiimage_repair.setEnabled(True) -base-189-base-253- mb = qtutils.infoMB(self, -base:190:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:345</b><br/><pre> # TODO: change timer from every second to every minute -base-191-base-346- self._timezone_timer = timer = QtCore.QTimer(self) -base-192-base-347- timer.setInterval(1000) # 1 sec -base:193:base:348: # TODO: needs optimization? run only when timer tab is active -base-194-base-349- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout) -base-195-base-350- timer.start() -base-196-base-351- -base:197:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:442</b><br/><pre> # TODO: thread safety! -base-198-base-443- self.servers = servers -base-199-base-444- if not self.isRunning(): -base-200-base-445- self.start() -base:201:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:448</b><br/><pre> # TODO: thread safety! -base-202-base-449- # emit a list of names first -base-203-base-450- for server in self.servers: -base-204-base-451- self.emit(SIGNAL("server(const QString&)"), server.name) -base:205:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:484</b><br/><pre> # TODO check this -base-206-base-485- self._running = False -base-207-base-486- self.condition.wakeAll() -base-208-base-487- -base:209:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/errorhandler.py.svn-base:46</b><br/><pre> # TODO: translation aware -base-210-base-47- LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback)) -base-211-base-48- if not getattr(sys, 'frozen', False): -base-212-base-49- return -base:213:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:149</b><br/><pre> # FIXME: signal doesn't do anything +base:182:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:152</b><br/><pre> # FIXME: signal doesn't do anything +base-183-base-153- self.emit(SIGNAL("close()")) +base-184-base-154- event.accept() +base-185-base-155- event.ignore() +base:186:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:291</b><br/><pre> del self._kiimage_threadlet# TODO: other message box +base-187-base-292- del self._kiimage_progressbar +base-188-base-293- self.pb_kiimage_repair.setEnabled(True) +base-189-base-294- mb = qtutils.infoMB(self, +base:190:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:390</b><br/><pre> # TODO: change timer from every second to every minute +base-191-base-391- self._timezone_timer = timer = QtCore.QTimer(self) +base-192-base-392- timer.setInterval(1000) # 1 sec +base:193:base:393: # TODO: needs optimization? run only when timer tab is active +base-194-base-394- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout) +base-195-base-395- timer.start() +base-196-base-396- +base:197:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:487</b><br/><pre> # TODO: thread safety! +base-198-base-488- self.servers = servers +base-199-base-489- if not self.isRunning(): +base-200-base-490- self.start() +base:201:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:493</b><br/><pre> # TODO: thread safety! +base-202-base-494- # emit a list of names first +base-203-base-495- for server in self.servers: +base-204-base-496- self.emit(SIGNAL("server(const QString&)"), server.name) +base:205:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:531</b><br/><pre> # TODO check this +base-206-base-532- self._running = False +base-207-base-533- self.condition.wakeAll() +base-208-base-534- +base:209:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/errorhandler.py.svn-base:45</b><br/><pre> # TODO: translation aware +base-210-base-46- LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback)) +base-211-base-47- if getattr(sys, 'frozen', False): +base-212-base-48- try: +base:213:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:151</b><br/><pre> # FIXME: signal doesn't do anything base-214- self.emit(SIGNAL("close()")) base-215- event.accept() base-216- event.ignore() -base:217:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:250</b><br/><pre> del self._kiimage_threadlet# TODO: other message box +base:217:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:290</b><br/><pre> del self._kiimage_threadlet# TODO: other message box base-218- del self._kiimage_progressbar base-219- self.pb_kiimage_repair.setEnabled(True) base-220- mb = qtutils.infoMB(self, -base:221:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:345</b><br/><pre> # TODO: change timer from every second to every minute +base:221:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:389</b><br/><pre> # TODO: change timer from every second to every minute base-222- self._timezone_timer = timer = QtCore.QTimer(self) base-223- timer.setInterval(1000) # 1 sec base-224- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout) -</pre></li><li><b>File: utilities/../doc/.svn/text-base/XXXreport.html.svn-base:227</b><br/><pre></pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:442</b><br/><pre> # TODO: thread safety! +</pre></li><li><b>File: utilities/../doc/.svn/text-base/XXXreport.html.svn-base:227</b><br/><pre></pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:486</b><br/><pre> # TODO: thread safety! base-228- self.servers = servers base-229- if not self.isRunning(): base-230- self.start() -base:231:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:448</b><br/><pre> # TODO: thread safety! +base:231:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:492</b><br/><pre> # TODO: thread safety! base-232- # emit a list of names first base-233- for server in self.servers: base-234- self.emit(SIGNAL("server(const QString&)"), server.name) -base:235:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:484</b><br/><pre> # TODO check this +base:235:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:530</b><br/><pre> # TODO check this base-236- self._running = False base-237- self.condition.wakeAll() base-238- -base:239:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:149</b><br/><pre> # FIXME: signal doesn't do anything +base:239:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:152</b><br/><pre> # FIXME: signal doesn't do anything base-240- self.emit(SIGNAL("close()")) base-241- event.accept() base-242- event.ignore() -base:243:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:250</b><br/><pre> del self._kiimage_threadlet# TODO: other message box +base:243:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:291</b><br/><pre> del self._kiimage_threadlet# TODO: other message box base-244- del self._kiimage_progressbar base-245- self.pb_kiimage_repair.setEnabled(True) base-246- mb = qtutils.infoMB(self, -base:247:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:345</b><br/><pre> # TODO: change timer from every second to every minute +base:247:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:390</b><br/><pre> # TODO: change timer from every second to every minute base-248- self._timezone_timer = timer = QtCore.QTimer(self) base-249- timer.setInterval(1000) # 1 sec base-250- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout) -</pre></li><li><b>File: utilities/../doc/.svn/text-base/XXXreport.html.svn-base:253</b><br/><pre></pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:442</b><br/><pre> # TODO: thread safety! +</pre></li><li><b>File: utilities/../doc/.svn/text-base/XXXreport.html.svn-base:253</b><br/><pre></pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:487</b><br/><pre> # TODO: thread safety! base-254- self.servers = servers base-255- if not self.isRunning(): base-256- self.start() -base:257:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:448</b><br/><pre> # TODO: thread safety! +base:257:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:493</b><br/><pre> # TODO: thread safety! base-258- # emit a list of names first base-259- for server in self.servers: base-260- self.emit(SIGNAL("server(const QString&)"), server.name) -base:261:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:484</b><br/><pre> # TODO check this +base:261:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:531</b><br/><pre> # TODO check this base-262- self._running = False base-263- self.condition.wakeAll() base-264- -base:265:</pre></li><li><b>File: utilities/../src/moul/qt/errorhandler.py:46</b><br/><pre> # TODO: translation aware +base:265:</pre></li><li><b>File: utilities/../src/moul/qt/errorhandler.py:45</b><br/><pre> # TODO: translation aware base-266- LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback)) -base-267- if not getattr(sys, 'frozen', False): -base-268- return +base-267- if getattr(sys, 'frozen', False): +base-268- try: base:269:</pre></li><li><b>File: utilities/../src/moul/osdependent/__init__.py:120</b><br/><pre># XXX: what about cygwin, bsd and others? base-270-_thismodule = sys.modules[__name__] base-271-if __WIN32__: @@ -549,836 +627,1179 @@ base-290-base-27-base-691- from zope.tales.tales import TALESTracebackSupplement base-291-base-28-base-692- from zope.pagetemplate.pagetemplate \ base-292-base-29-base-693- import PageTemplateTracebackSupplement -base:293:base:30:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/chatlog.py.svn-base:280</b><br/><pre> # TODO: add parser, currently simply iterates over the file -base-294-base-31-base-281- return iter(self._fd) -base:295:base:32:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/kiimage.py.svn-base:112</b><br/><pre> # XXX use struct -base-296-base-33-base-113- if header is None: -base-297-base-34-base-114- fd = self._fd -base-298-base-35-base-115- fd.seek(0) -base:299:base:36:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/kiimage.py.svn-base:127</b><br/><pre> # XXX use struct -base-300-base-37-base-128- if size is None: -base-301-base-38-base-129- size = self.getFileSize() -base-302-base-39-base-130- leading = 4* [None] -base:303:base:40:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/kiimage.py.svn-base:267</b><br/><pre> # XXX: move checks to copy method! -base-304-base-41-base-268- if os.path.isfile(fixed): -base-305-base-42-base-269- if fixedNewer(ki, fixed): -base-306-base-43-base-270- LOG.debug("File %s exists but was changed." % name) -base:307:base:44:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/wdysini.py.svn-base:157</b><br/><pre> # TODO: write me -base-308-base-45-base-158- pass -base-309-base-46-base-159- -base-310-base-47-base-160-class Constrain(object): -base:311:base:48:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/wdysini.py.svn-base:541</b><br/><pre> 'Audio.SetDeviceName' : (QuotedString, Constrain()), # TODO: add check -base-312-base-49-base-542- 'Audio.SetChannelVolume GUI' : (FloatString, MinMax(0.0, 1.0)), # 0-100%, no ui -base-313-base-50-base-543- # microphon missing -> OS mixer -base-314-base-51-base-544- } -base:315:base:52:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/wdysini.py.svn-base:629</b><br/><pre> # TODO: microphon needs an extra handler. The mic slider changes the OS mixer. -base-316-base-53-base-630- -base-317-base-54-base-631-class GraphicsIni(ConfFile): -base-318-base-55-base-632- _filename = 'graphics.ini' -base:319:base:56:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/directory.py.svn-base:59</b><br/><pre> # TODO: fnmatch -base-320-base-57-base-60- return len([name for name in os.listdir(path) -base-321-base-58-base-61- if os.path.isfile(os.path.join(path, name))]) -base-322-base-59-base-62- -base:323:base:60:</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/test_wdysini.py.svn-base:105</b><br/><pre> # TODO: more -base-324-base-61-base-106- -base-325-base-62-base-107- def test_publicapi_create(self): -base-326-base-63-base-108- inipath = os.path.join(self.tmpdir, os.path.basename(self.enc)) -base:327:base:64:</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/test_wdysini.py.svn-base:116</b><br/><pre> # TODO: more -base-328-base-65-base-117- -base-329-base-66-base-118-class AudioIniTest(GenericIniTest): -base-330-base-67-base-119- enc = aud_enc -base:331:base:68:</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/test_wdysini.py.svn-base:154</b><br/><pre> #XXX self.failIf(p.isChanged()) -base-332-base-69-base-155- -base-333-base-70-base-156- p.screenres = 0 -base-334-base-71-base-157- eq(p._get('Graphics.Width'), 800) -base:335:base:72:</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/utils.py.svn-base:80</b><br/><pre> for fname in ('UruLauncher.exe', 'UruExplorer.exe'): # XXX: win32 -base-336-base-73-base-81- fd = open(os.path.join(path, fname), 'wb') -base-337-base-74-base-82- fd.write('dummy') -base-338-base-75-base-83- fd.close() -base:339:base:76:</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py:105</b><br/><pre> # TODO: more -base-340-base-77- -base-341-base-78- def test_publicapi_create(self): -base-342-base-79- inipath = os.path.join(self.tmpdir, os.path.basename(self.enc)) -base:343:base:80:</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py:116</b><br/><pre> # TODO: more -base-344-base-81- -base-345-base-82-class AudioIniTest(GenericIniTest): -base-346-base-83- enc = aud_enc -base:347:base:84:</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py:154</b><br/><pre> #XXX self.failIf(p.isChanged()) -base-348-base-85- -base-349-base-86- p.screenres = 0 -base-350-base-87- eq(p._get('Graphics.Width'), 800) -base:351:base:88:</pre></li><li><b>File: utilities/../src/moul/file/tests/utils.py:80</b><br/><pre> for fname in ('UruLauncher.exe', 'UruExplorer.exe'): # XXX: win32 -base-352-base-89- fd = open(os.path.join(path, fname), 'wb') -base-353-base-90- fd.write('dummy') -base-354-base-91- fd.close() -base:355:base:92:</pre></li><li><b>File: utilities/../src/moul/file/chatlog.py:280</b><br/><pre> # TODO: add parser, currently simply iterates over the file -base-356-base-93- return iter(self._fd) -base:357:base:94:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py:112</b><br/><pre> # XXX use struct -base-358-base-95- if header is None: -base-359-base-96- fd = self._fd -base-360-base-97- fd.seek(0) -base:361:base:98:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py:127</b><br/><pre> # XXX use struct -base-362-base-99- if size is None: -base-363-base-100- size = self.getFileSize() -base-364-base-101- leading = 4* [None] -base:365:base:102:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py:267</b><br/><pre> # XXX: move checks to copy method! -base-366-base-103- if os.path.isfile(fixed): -base-367-base-104- if fixedNewer(ki, fixed): -base-368-base-105- LOG.debug("File %s exists but was changed." % name) -base:369:base:106:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py:157</b><br/><pre> # TODO: write me -base-370-base-107- pass -base-371-base-108- -base-372-base-109-class Constrain(object): -base:373:base:110:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py:541</b><br/><pre> 'Audio.SetDeviceName' : (QuotedString, Constrain()), # TODO: add check -base-374-base-111- 'Audio.SetChannelVolume GUI' : (FloatString, MinMax(0.0, 1.0)), # 0-100%, no ui -base-375-base-112- # microphon missing -> OS mixer -base-376-base-113- } -base:377:base:114:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py:629</b><br/><pre> # TODO: microphon needs an extra handler. The mic slider changes the OS mixer. -base-378-base-115- -base-379-base-116-class GraphicsIni(ConfFile): -base-380-base-117- _filename = 'graphics.ini' -base:381:base:118:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py~:112</b><br/><pre> # XXX use struct -base-382-base-119- if header is None: -base-383-base-120- fd = self._fd -base-384-base-121- fd.seek(0) -base:385:base:122:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py~:127</b><br/><pre> # XXX use struct -base-386-base-123- if size is None: -base-387-base-124- size = self.getFileSize() -base-388-base-125- leading = 4* [None] -base:389:base:126:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py~:267</b><br/><pre> # XXX: move checks to copy method! -base-390-base-127- if os.path.isfile(fixed): -base-391-base-128- if fixedNewer(ki, fixed): -base-392-base-129- LOG.debug("File %s exists but was changed." % name) -base:393:base:130:</pre></li><li><b>File: utilities/../src/moul/file/chatlog.py~:280</b><br/><pre> # TODO: add parser, currently simply iterates over the file -base-394-base-131- return iter(self._fd) -base:395:base:132:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py~:156</b><br/><pre> # TODO: write me -base-396-base-133- pass -base-397-base-134- -base-398-base-135-class Constrain(object): -base:399:base:136:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py~:540</b><br/><pre> 'Audio.SetDeviceName' : (QuotedString, Constrain()), # TODO: add check -base-400-base-137- 'Audio.SetChannelVolume GUI' : (FloatString, MinMax(0.0, 1.0)), # 0-100%, no ui -base-401-base-138- # microphon missing -> OS mixer -base-402-base-139- } -base:403:base:140:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py~:628</b><br/><pre> # TODO: microphon needs an extra handler. The mic slider changes the OS mixer. -base-404-base-141- -base-405-base-142-class GraphicsIni(ConfFile): -base-406-base-143- _filename = 'graphics.ini' -base:407:base:144:</pre></li><li><b>File: utilities/../src/moul/file/directory.py:59</b><br/><pre> # TODO: fnmatch -base-408-base-145- return len([name for name in os.listdir(path) -base-409-base-146- if os.path.isfile(os.path.join(path, name))]) -base-410-base-147- -base:411:base:148:</pre></li><li><b>File: utilities/../src/moul/file/directory.py~:59</b><br/><pre> # TODO: fnmatch -base-412-base-149- return len([name for name in os.listdir(path) -base-413-base-150- if os.path.isfile(os.path.join(path, name))]) -base-414-base-151- -base:415:base:152:</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/whatdoyousee.py.svn-base:77</b><br/><pre> # XXX: dos format -base-416-base-153-base-78- return data.replace("\r\n", "\n") -base-417-base-154-base-79- -base-418-base-155-base-80-def encryptWDYS(instr, fout): -base:419:base:156:</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/whatdoyousee.py.svn-base:87</b><br/><pre> # XXX: dos format -base-420-base-157-base-88- instr = instr.replace("\n", "\r\n") -base-421-base-158-base-89- fout.seek(0) -base-422-base-159-base-90- fout.write(HEADER) -base:423:base:160:</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/elf.py.svn-base:71</b><br/><pre> # XXX NotImplemented -base-424-base-161-base-72- raise NotImplementedError -base-425-base-162-base-73- -base-426-base-163-base-74-def decipher(crypt, size, key): -base:427:base:164:</pre></li><li><b>File: utilities/../src/moul/crypt/whatdoyousee.py:77</b><br/><pre> # XXX: dos format -base-428-base-165- return data.replace("\r\n", "\n") -base-429-base-166- -base-430-base-167-def encryptWDYS(instr, fout): -base:431:base:168:</pre></li><li><b>File: utilities/../src/moul/crypt/whatdoyousee.py:87</b><br/><pre> # XXX: dos format -base-432-base-169- instr = instr.replace("\n", "\r\n") -base-433-base-170- fout.seek(0) -base-434-base-171- fout.write(HEADER) -base:435:base:172:</pre></li><li><b>File: utilities/../src/moul/crypt/elf.py:71</b><br/><pre> # XXX NotImplemented -base-436-base-173- raise NotImplementedError -base-437-base-174- -base-438-base-175-def decipher(crypt, size, key): -base:439:base:176:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:151</b><br/><pre> # FIXME: signal doesn't do anything -base-440-base-177-base-152- self.emit(SIGNAL("close()")) -base-441-base-178-base-153- event.accept() -base-442-base-179-base-154- event.ignore() -base:443:base:180:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:222</b><br/><pre> # TODO: msg -base-444-base-181-base-223- return -base-445-base-182-base-224- -base-446-base-183-base-225- self.pb_kiimage_repair.setEnabled(False) -base:447:base:184:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:248</b><br/><pre> del self._kiimage_threadlet# TODO: other message box -base-448-base-185-base-249- del self._kiimage_progressbar -base-449-base-186-base-250- self.pb_kiimage_repair.setEnabled(True) -base:450:base:187:base:251: # TODO: msg -base-451-base-188-base-252- -base-452-base-189-base-253- # ************************************************************************ -base-453-base-190-base-254- # system tray -base:454:base:191:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:281</b><br/><pre> # TODO: needs optimization? run only when timer tab is active -base-455-base-192-base-282- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout) -base-456-base-193-base-283- timer.start() -base-457-base-194-base-284- -base:458:base:195:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:375</b><br/><pre> # TODO: thread safety! -base-459-base-196-base-376- self.servers = servers -base-460-base-197-base-377- if not self.isRunning(): -base-461-base-198-base-378- self.start() -base:462:base:199:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:381</b><br/><pre> # TODO: thread safety! -base-463-base-200-base-382- # emit a list of names first -base-464-base-201-base-383- for server in self.servers: -base-465-base-202-base-384- self.emit(SIGNAL("server(const QString&)"), server.name) -base:466:base:203:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:417</b><br/><pre> # TODO check this -base-467-base-204-base-418- self._running = False -base-468-base-205-base-419- self.condition.wakeAll() -base-469-base-206-base-420- -base:470:base:207:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/errorhandler.py.svn-base:46</b><br/><pre> # TODO: translation aware -base-471-base-208-base-47- LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback)) -base-472-base-209-base-48- if not getattr(sys, 'frozen', False): -base-473-base-210-base-49- return -base:474:base:211:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/wdysini.py.svn-base:67</b><br/><pre> self.context.emit(SIGNAL("audioini_load()")) # XXX: hard coded emit -base:475:base:212:base:68: self.context.emit(SIGNAL("graphicsini_load()")) # XXX: hard coded emit -base-476-base-213-base-69- -base-477-base-214-base-70- @pyqtSignature("bool") -base-478-base-215-base-71- def on_graphicsChanged(self, boolean): -base:479:base:216:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:143</b><br/><pre> # FIXME: signal doesn't do anything -base-480-base-217- self.emit(SIGNAL("close()")) -base-481-base-218- event.accept() -base-482-base-219- event.ignore() -base:483:base:220:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:214</b><br/><pre> # TODO: msg -base-484-base-221- return -base-485-base-222- -base-486-base-223- self.pb_kiimage_repair.setEnabled(False) -base:487:base:224:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:241</b><br/><pre> del self._kiimage_threadlet# TODO: other message box -base-488-base-225- del self._kiimage_progressbar -base-489-base-226- self.pb_kiimage_repair.setEnabled(True) -base-490-base-227- -base:491:</pre></li><li><b>File: utilities/../doc/.svn/text-base/XXXreport.html.svn-base:230</b><br/><pre></pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:288</b><br/><pre> # TODO: needs optimization? run only when timer tab is active -base-492-base-231- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout) -base-493-base-232- timer.start() -base-494-base-233- -base:495:base:234:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:382</b><br/><pre> # TODO: thread safety! -base-496-base-235- self.servers = servers -base-497-base-236- if not self.isRunning(): -base-498-base-237- self.start() -base:499:base:238:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:388</b><br/><pre> # TODO: thread safety! -base-500-base-239- # emit a list of names first -base-501-base-240- for server in self.servers: -base-502-base-241- self.emit(SIGNAL("server(const QString&)"), server.name) -base:503:base:242:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:424</b><br/><pre> # TODO check this -base-504-base-243- self._running = False -base-505-base-244- self.condition.wakeAll() -base-506-base-245- -base:507:base:246:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:143</b><br/><pre> # FIXME: signal doesn't do anything -base-508-base-247- self.emit(SIGNAL("close()")) -base-509-base-248- event.accept() -base-510-base-249- event.ignore() -base:511:base:250:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:214</b><br/><pre> # TODO: msg -base-512-base-251- return -base-513-base-252- -base-514-base-253- self.pb_kiimage_repair.setEnabled(False) -base:515:base:254:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:241</b><br/><pre> del self._kiimage_threadlet# TODO: other message box -base-516-base-255- del self._kiimage_progressbar -base-517-base-256- self.pb_kiimage_repair.setEnabled(True) -base-518-base-257- -base:519:</pre></li><li><b>File: utilities/../doc/.svn/text-base/XXXreport.html.svn-base:260</b><br/><pre></pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:288</b><br/><pre> # TODO: needs optimization? run only when timer tab is active -base-520-base-261- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout) -base-521-base-262- timer.start() -base-522-base-263- -base:523:base:264:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:382</b><br/><pre> # TODO: thread safety! -base-524-base-265- self.servers = servers -base-525-base-266- if not self.isRunning(): -base-526-base-267- self.start() -base:527:base:268:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:388</b><br/><pre> # TODO: thread safety! -base-528-base-269- # emit a list of names first -base-529-base-270- for server in self.servers: -base-530-base-271- self.emit(SIGNAL("server(const QString&)"), server.name) -base:531:base:272:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:424</b><br/><pre> # TODO check this -base-532-base-273- self._running = False -base-533-base-274- self.condition.wakeAll() -base-534-base-275- -base:535:base:276:</pre></li><li><b>File: utilities/../src/moul/qt/errorhandler.py:46</b><br/><pre> # TODO: translation aware -base-536-base-277- LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback)) -base-537-base-278- if not getattr(sys, 'frozen', False): -base-538-base-279- return -base:539:base:280:</pre></li><li><b>File: utilities/../src/moul/qt/errorhandler.py~:46</b><br/><pre> # TODO: translation aware -base-540-base-281- LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback)) -base-541-base-282- if not getattr(sys, 'frozen', False): -base-542-base-283- return -base:543:base:284:</pre></li><li><b>File: utilities/../src/moul/qt/wdysini.py~:68</b><br/><pre> self.context.emit(SIGNAL("audioini_load()")) # XXX: hard coded emit -base-544-base-285- -base-545-base-286- @signalLogDecorator(LOG) -base-546-base-287- @pyqtSignature("bool") -base:547:base:288:</pre></li><li><b>File: utilities/../src/moul/qt/wdysini.py:67</b><br/><pre> self.context.emit(SIGNAL("audioini_load()")) # XXX: hard coded emit -base-548-base-289- -base-549-base-290- @pyqtSignature("bool") -base-550-base-291- def on_graphicsChanged(self, boolean): -base:551:base:292:</pre></li><li><b>File: utilities/../src/moul/osdependent/__init__.py:117</b><br/><pre># XXX: what about cygwin, bsd and others? -base-552-base-293-_thismodule = sys.modules[__name__] -base-553-base-294-if __WIN32__: -base-554-base-295- from moul.osdependent import win32 as osdep_win32 -base:555:base:296:</pre></li><li><b>File: utilities/../src/moul/osdependent/.svn/text-base/__init__.py.svn-base:117</b><br/><pre># XXX: what about cygwin, bsd and others? -base-556-base-297-base-118-_thismodule = sys.modules[__name__] -base-557-base-298-base-119-if __WIN32__: -base-558-base-299-base-120- from moul.osdependent import win32 as osdep_win32 -base:559:base:300:</pre></li><li><b>File: utilities/../doc/.svn/text-base/XXXreport.html.svn-base:14</b><br/><pre><ol><li><b>File: utilities/../.svn/text-base/ez_setup.py.svn-base:92</b><br/><pre> # XXX could we install in a subprocess here? -base-560-base-301-base-15-base-93- print >>sys.stderr, ( -base-561-base-302-base-16-base-94- "The required version of setuptools (>=%s) is not available, and\n" -base-562-base-303-base-17-base-95- "can't be installed while this script is running. Please install\n" -base:563:base:304:base:18:</pre></li><li><b>File: utilities/../.svn/text-base/test.py.svn-base:548</b><br/><pre> # XXX bug: doctest may report several failures in one test, they are -base-564-base-305-base-19-base-549- # separated by a horizontal dash line. Only the first one of -base-565-base-306-base-20-base-550- # them is now colorized properly. -base-566-base-307-base-21-base-551- header = lines[0] -base:567:base:308:base:22:</pre></li><li><b>File: utilities/../.svn/text-base/test.py.svn-base:603</b><br/><pre> # TODO: Scrape and colorize the traceback. -base-568-base-309-base-23-base-604- result.append(self.colorize('doctest_got', line)) -base-569-base-310-base-24-base-605- elif remaining[0] == 'Differences (ndiff with -expected +actual):': -base-570-base-311-base-25-base-606- result.append(self.colorize('doctest_title', remaining.pop(0))) # E. raised: -base:571:base:312:base:26:</pre></li><li><b>File: utilities/../.svn/text-base/test.py.svn-base:623</b><br/><pre> # TODO: We only deal with the output from Zope 3's doctest module. -base-572-base-313-base-27-base-624- # A colorizer for the Python's doctest module would be nice too. -base-573-base-314-base-28-base-625- if doctest: -base-574-base-315-base-29-base-626- # If we have a doctest, we do not care about this header. All the -base:575:base:316:base:30:</pre></li><li><b>File: utilities/../.svn/text-base/test.py.svn-base:690</b><br/><pre> # TODO these should be hookable -base-576-base-317-base-31-base-691- from zope.tales.tales import TALESTracebackSupplement -base-577-base-318-base-32-base-692- from zope.pagetemplate.pagetemplate \ -base-578-base-319-base-33-base-693- import PageTemplateTracebackSupplement -base:579:base:320:base:34:</pre></li><li><b>File: utilities/../.svn/text-base/setup_win32.py.svn-base:84</b><br/><pre> pexe['innosetup'] = os.environ.get('INNOSETUP') # TODO: -base-580-base-321-base-35-base-85- pexe['inno_templates'] = "template.iss" -base-581-base-322-base-36-base-86- pexe['app_name'] = 'pyMoul' -base-582-base-323-base-37-base-87- pexe['includes'].extend(findPyTz()) -base:583:base:324:base:38:</pre></li><li><b>File: utilities/../.svn/text-base/distutils_upx.py.svn-base:117</b><br/><pre> sys.exit(retcode) # XXX -base-584-base-325-base-39-base-118- -base-585-base-326-base-40-base-119- def _upxAvailable(self): -base-586-base-327-base-41-base-120- """Search for UPX in search path -base:587:base:328:base:42:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/chatlog.py.svn-base:268</b><br/><pre> # TODO: add parser, currently simply iterates over the file -base-588-base-329-base-43-base-269- return iter(self._fd) -base:589:base:330:base:44:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/kiimage.py.svn-base:112</b><br/><pre> # XXX use struct -base-590-base-331-base-45-base-113- if header is None: -base-591-base-332-base-46-base-114- fd = self._fd -base-592-base-333-base-47-base-115- fd.seek(0) -base:593:base:334:base:48:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/kiimage.py.svn-base:127</b><br/><pre> # XXX use struct -base-594-base-335-base-49-base-128- if size is None: -base-595-base-336-base-50-base-129- size = self.getFileSize() -base-596-base-337-base-51-base-130- leading = 4* [None] -base:597:base:338:base:52:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/wdysini.py.svn-base:156</b><br/><pre> # TODO: write me -base-598-base-339-base-53-base-157- pass -base-599-base-340-base-54-base-158- -base-600-base-341-base-55-base-159-class Constrain(object): -base:601:base:342:base:56:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/wdysini.py.svn-base:540</b><br/><pre> 'Audio.SetDeviceName' : (QuotedString, Constrain()), # TODO: add check -base-602-base-343-base-57-base-541- 'Audio.SetChannelVolume GUI' : (FloatString, MinMax(0.0, 1.0)), # 0-100%, no ui -base-603-base-344-base-58-base-542- # microphon missing -> OS mixer -base-604-base-345-base-59-base-543- } -base:605:base:346:base:60:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/wdysini.py.svn-base:628</b><br/><pre> # TODO: microphon needs an extra handler. The mic slider changes the OS mixer. -base-606-base-347-base-61-base-629- -base-607-base-348-base-62-base-630-class GraphicsIni(ConfFile): -base-608-base-349-base-63-base-631- _filename = 'graphics.ini' -base:609:base:350:base:64:</pre></li><li><b>File: utilities/../src/moul/file... [truncated message content] |
From: <ti...@us...> - 2007-02-13 19:37:09
|
Revision: 165 http://pymoul.svn.sourceforge.net/pymoul/?rev=165&view=rev Author: tiran Date: 2007-02-13 11:37:02 -0800 (Tue, 13 Feb 2007) Log Message: ----------- Fixed broken unit tests Modified Paths: -------------- pymoul/trunk/Makefile.in pymoul/trunk/src/moul/file/chatlog.py pymoul/trunk/src/moul/file/plasmalog.py pymoul/trunk/src/moul/file/tests/test_wdysini.py Modified: pymoul/trunk/Makefile.in =================================================================== --- pymoul/trunk/Makefile.in 2007-02-13 15:32:47 UTC (rev 164) +++ pymoul/trunk/Makefile.in 2007-02-13 19:37:02 UTC (rev 165) @@ -38,10 +38,10 @@ ui: $(PYTHON) utilities/compileui.py ./src/moul/ -test_build: build ui +test_build: build PYTHONPATH="src" $(PYTHON) test.py $(TESTFLAGS) $(TESTOPTS) -test_inplace: ui +test_inplace: PYTHONPATH="src" $(PYTHON) test.py $(TESTFLAGS) $(TESTOPTS) doc_html: Modified: pymoul/trunk/src/moul/file/chatlog.py =================================================================== --- pymoul/trunk/src/moul/file/chatlog.py 2007-02-13 15:32:47 UTC (rev 164) +++ pymoul/trunk/src/moul/file/chatlog.py 2007-02-13 19:37:02 UTC (rev 165) @@ -101,7 +101,7 @@ return False if not os.path.isdir(self._destdir): LOG.info("Creating chatlog directory %s" % self._destdir) - os.mkdir(destdir) + os.mkdir(self._destdir) return False return True @@ -232,6 +232,12 @@ self._chatlogs.append(chatlog) self._chatlogs.sort(key=lambda element:element.name) + @property + def names(self): + """list of names + """ + return [clv.name for clv in self._chatlogs] + def __len__(self): """len() support """ @@ -239,10 +245,10 @@ def __iter__(self): return iter(self._chatlogs) - + def __contains__(self, other): return other in self._chatlogs - + def __getitem__(self, idx): return self._chatlogs[idx] Modified: pymoul/trunk/src/moul/file/plasmalog.py =================================================================== --- pymoul/trunk/src/moul/file/plasmalog.py 2007-02-13 15:32:47 UTC (rev 164) +++ pymoul/trunk/src/moul/file/plasmalog.py 2007-02-13 19:37:02 UTC (rev 165) @@ -48,6 +48,7 @@ self._doremove = True self._dozip = True LOG.debug("PlasmalogZipper: %s -> %s" % (srcdir, destdir)) + self.clear() def clear(self): """Clear state @@ -56,15 +57,15 @@ self._not_removed = [] # files with full path if not os.path.isdir(self._srcdir): - LOG.warning("%s is not a directory" % srcdir) + LOG.warning("%s is not a directory" % self._srcdir) if not self.isPlasmaLogDir(): self._ispldir = False - LOG.warning("%s is not a plasma log directory" % srcdir) + LOG.warning("%s is not a plasma log directory" % self._srcdir) else: self._ispldir = True if not os.path.isdir(self._destdir): - LOG.info("Creating chatlog directory %s" % destdir) - os.mkdir(destdir) + LOG.info("Creating chatlog directory %s" % self._destdir) + os.mkdir(self._destdir) def setZip(self, boolean): """Set ZIP flag Modified: pymoul/trunk/src/moul/file/tests/test_wdysini.py =================================================================== --- pymoul/trunk/src/moul/file/tests/test_wdysini.py 2007-02-13 15:32:47 UTC (rev 164) +++ pymoul/trunk/src/moul/file/tests/test_wdysini.py 2007-02-13 19:37:02 UTC (rev 165) @@ -111,8 +111,6 @@ self.failIf(p.exists()) p.create() self.failUnless(p.exists()) - p.write() - self.failUnless(p.exists()) # TODO: more class AudioIniTest(GenericIniTest): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ti...@us...> - 2007-02-13 15:32:55
|
Revision: 164 http://pymoul.svn.sourceforge.net/pymoul/?rev=164&view=rev Author: tiran Date: 2007-02-13 07:32:47 -0800 (Tue, 13 Feb 2007) Log Message: ----------- Dni time cleanup Added fromString method Modified Paths: -------------- pymoul/trunk/src/moul/time/dni.py Modified: pymoul/trunk/src/moul/time/dni.py =================================================================== --- pymoul/trunk/src/moul/time/dni.py 2007-02-13 03:16:06 UTC (rev 163) +++ pymoul/trunk/src/moul/time/dni.py 2007-02-13 15:32:47 UTC (rev 164) @@ -70,13 +70,24 @@ >>> compareDT(dni.toUTC(), other) True ->>> dni.bell +>>> dni.pahrtovo 24 ->>> dni.secondsToBell(25) +>>> dni.secondsToPahrtovo(25) 2616 ->>> dni.secondsToBell(18) +>>> dni.secondsToPahrtovo(18) 80964 +>>> CET = timezone('CET') +>>> dni.fromString("2007-02-12 14:55:10", tzinfo=CET) +>>> str(dni) +'04:21:24:22, Leevotar 4, 9662' +>>> dni.fromString("2007-02-12 6:55:10", tzinfo='MST') +>>> str(dni) +'04:21:24:22, Leevotar 4, 9662' +>>> dni.fromString("2007-02-12 13:55:10") +>>> str(dni) +'04:21:24:22, Leevotar 4, 9662' + """ __author__ = "Christian Heimes" __version__ = "$Id$" @@ -84,28 +95,13 @@ from datetime import datetime from pytz import utc as UTC +from pytz import timezone from time import mktime import sys from moul.time.utils import td2sec from moul.time.utils import utcnow - -FAHRAH_1 = -7656 # hahrtee fahrah 1 starts at April 21st 7656 B.C - -# name -> amount of smaller element, e.g. a hartee fahrah as 625 hahr -DNI_FACTORS = ( - ('hahrtee fahrah', 625), - ('hahr', 10), # year - ('vai-lee', 29), # month - ('yahr', 5), # day (~30h and 14min) - # pahr-to-vo (bell) each yahr has 25 bells (~74 min) - ('gahr-tah-vo', 25), # ~6h 3min - ('tah-vo', 25), # ~14,5 min - ('gor-ahn', 25), # ~34,8 seconds - ('pro-rahn', None), # ~1.39 seconds - ) - # list of month names with approx. dates VAILEETEE = ( 'Leefo', # 1: April 21st to May 27th @@ -120,15 +116,24 @@ 'Leenovoo', # 10: March 16th to April 21st ) -# 00:00:00:00, Leefo 1, 9654 DE -BASE = datetime(1998, 4, 21, 10, 35, 18, 0, tzinfo=UTC) +# 00:00:00:00, Leefo 1, 9654 DE = 10:35:18 1998/4/21 +BASE_GREGORIAN = datetime(1998, 4, 21, 10, 35, 18, 0, tzinfo=UTC) +BASE_HAHR = 9654 +FAHRAH_1 = -7656 # hahrtee fahrah 1 starts ~April 21st 7656 B.C # timestamp 0 - start of unix time UNIX_0 = datetime(1970, 1, 1, 0, 0, 0, 0, tzinfo=UTC) -BASE_SEC = td2sec(BASE-UNIX_0) # WTF? datetime has no totimestamp() method -BASE_HAHR = 9654 -BASE_YEAR = 1998 +BASE_SEC = td2sec(BASE_GREGORIAN - UNIX_0) # WTF? no tottimestamp in datetime + +# factors +HAHR_PER_HAHRTEE_FAHRAH = 625 # ~ 625 years SECONDS_PER_HAHR = 31556925 -PRORAHN_PER_HAHR = 22656250 +PRORAHN_PER_HAHR = 22656250 # ~ 1 year, 25 * 25 * 25 * 5 * 29 * 10 +PRORAHN_PER_VAILEE = 2265625 # ~ 36 days, 25 * 25 * 25 * 5 * 29 +PRORAHN_PER_YAHR = 78125 # ~30h 14min, 25 * 25 * 25 * 5 +PRORAHN_PER_GAHRTAHVO = 15625 # ~6h 3min, 25 * 25 * 25 +PRORAHN_PER_PAHRTOVO = 3125 # ~74min, 25 * 25 * 5 +PRORAHN_PER_TAHVO = 625 # ~14,5 min, 25 * 25 +PRORAHN_PER_GORAHN = 25 # ~34,8 sec, 25 FACTOR_SP = float(SECONDS_PER_HAHR) / float(PRORAHN_PER_HAHR) # 1.39285737931 FACTOR_PS = float(PRORAHN_PER_HAHR) / float(SECONDS_PER_HAHR) # 0.717948596069 @@ -149,34 +154,32 @@ class DniTime(object): """D'ni time representation - + The D'ni were using a complex calendar based on a pentovigesimal (25) numbering system. - + The DniTime class assumes the following rules: - + - Hahrtee Farah 1 started on 21st of April 7656 B.C. - Hahrtee Fahrah 15 started 1719 A.C. - - A new hahr starts on 21st of April. - - The reference time for the calculation is Mountain Standard Time (MST) - without (!) DST. The UTC offset is always UTC-7. - - To compensate leap years a new hahr starts on midnight (0:00am) in every - forth year (year % 4 == 0). - - To simplify the code special cases like year % 100 and year % 400 are - NOT taken into account. I'm assuming a year has 365,25 days (which is - wrong). A year according to the Gregorian Calendar has 365,2425 days. - + - A new hahr starts around midnight 21st of April. + - Each D'ni year has a fixed length + - The exact start of a D'ni year is calculated relatively to + 00:00:00:00, Leefo 1, 9654 DE = 10:35:18 1998/4/21 + Overview -------- - + fahrah millenium 625 years hahr year 1 year vailee month 10 per year yahr day 29 per vailee, about 30h 14min gahrtahvo section about 6h, 3min + pahrtovo hour about 1h 14min tahvo quarter about 14,5min gorahn minute 36 seconds prorahn second about 1.3929 seconds + """ def __init__(self, hahr=0, vailee=0, yahr=0, gahrtahvo=0, tahvo=0, gorahn=0, prorahn=0): @@ -202,10 +205,20 @@ """ if utc_dt is None: utc_dt = utcnow() - sec = td2sec(utc_dt - BASE) + sec = td2sec(utc_dt - BASE_GREGORIAN) prorahn = int(round(sec * FACTOR_PS)) self.set(hahr=BASE_HAHR, prorahn=prorahn) + def fromString(self, s, fmt="%Y-%m-%d %H:%M:%S", tzinfo=UTC): + """Convert date from string to Dni Time + """ + if isinstance(tzinfo, basestring): + tzinfo = timezone(tzinfo) + dt = datetime.strptime(s, fmt) + dt = tzinfo.localize(dt) + utc_dt = UTC.normalize(dt.astimezone(UTC)) + return self.fromUTC(utc_dt) + def toUTC(self): """Convert to UTC datetime value """ @@ -242,45 +255,45 @@ hahr = property(_getHahr, _setHahr) def _getVailee(self): - return ((self._prorahn // 2265625) % 10) +1 + return ((self._prorahn // PRORAHN_PER_VAILEE) % 10) +1 @valueCheck(int, 0, 10) def _setVailee(self, value): - self._addProrahn(value * 2265625) + self._addProrahn(value * PRORAHN_PER_VAILEE) vailee = property(_getVailee, _setVailee) def getVaileeName(self): return VAILEETEE[self.vailee-1] def _getYahr(self): - return ((self._prorahn // 78125) % 29) +1 + return ((self._prorahn // PRORAHN_PER_YAHR) % 29) +1 @valueCheck(int, 0, 29) def _setYahr(self, value): - self._addProrahn(value * 78125) + self._addProrahn(value * PRORAHN_PER_YAHR) yahr = property(_getYahr, _setYahr) def _getGahrtahvo(self): - return (self._prorahn // 15625) % 5 + return (self._prorahn // PRORAHN_PER_GAHRTAHVO) % 5 @valueCheck(int, 0, 5) def _setGahrtahvo(self, value): - self._addProrahn(value * 15625) + self._addProrahn(value * PRORAHN_PER_GAHRTAHVO) gahrtahvo = property(_getGahrtahvo, _setGahrtahvo) def _getPahrtovo(self): - return (self._prorahn // 3125) % 25 + return (self._prorahn // PRORAHN_PER_PAHRTOVO) % 25 pahrtovo = property(_getPahrtovo) def _getTahvo(self): - return (self._prorahn // 625) % 25 + return (self._prorahn // PRORAHN_PER_TAHVO) % 25 @valueCheck(int, 0, 25) def _setTahvo(self, value): - self._addProrahn(value * 625) + self._addProrahn(value * PRORAHN_PER_TAHVO) tahvo = property(_getTahvo, _setTahvo) def _getGorahn(self): - return (self._prorahn // 25) % 25 + return (self._prorahn // PRORAHN_PER_GORAHN) % 25 @valueCheck(int, 0, 25) def _setGorahn(self, value): - self._addProrahn(value * 25) + self._addProrahn(value * PRORAHN_PER_GORAHN) gorahn = property(_getGorahn, _setGorahn) def _getProrahn(self): @@ -301,5 +314,6 @@ def prorahnOfYahr(self): """Get numbers of prorahntee since start of yahr """ - return (self.gahrtahvo * 15625 + self.tahvo * 625 + - self.gorahn * 25 + self.prorahn) + return (self.gahrtahvo * PRORAHN_PER_GAHRTAHVO + + self.tahvo * PRORAHN_PER_TAHVO + + self.gorahn * PRORAHN_PER_GORAHN + self.prorahn) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ti...@us...> - 2007-02-13 03:16:08
|
Revision: 163 http://pymoul.svn.sourceforge.net/pymoul/?rev=163&view=rev Author: tiran Date: 2007-02-12 19:16:06 -0800 (Mon, 12 Feb 2007) Log Message: ----------- Renamed bell to pahrtove Modified Paths: -------------- pymoul/trunk/src/moul/qt/mainwindow.py pymoul/trunk/src/moul/time/dni.py Modified: pymoul/trunk/src/moul/qt/mainwindow.py =================================================================== --- pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-12 19:34:10 UTC (rev 162) +++ pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-13 03:16:06 UTC (rev 163) @@ -439,7 +439,7 @@ SIGNAL: QTimer timeout """ dni = self._dnitime.fromUTC() # set to now - self.le_dnitime.setText(str(self._dnitime)+", bell: %s" % self._dnitime.bell) + self.le_dnitime.setText(str(self._dnitime)+", bell: %s" % self._dnitime.pahrtovo) # ************************************************************************ # ping Modified: pymoul/trunk/src/moul/time/dni.py =================================================================== --- pymoul/trunk/src/moul/time/dni.py 2007-02-12 19:34:10 UTC (rev 162) +++ pymoul/trunk/src/moul/time/dni.py 2007-02-13 03:16:06 UTC (rev 163) @@ -23,6 +23,15 @@ official sources say that: 00:00:00:00, Leefo 1, 9654 DE = 10:35:18 UTC, April 21, 1998 CE +D'ni New Year - Leefo 1, April 21 +First Feast of the Maker - Lenovoo 10, March 27 (Pre-earth celebration) +The Common Library Opened - Leefo 12, May 5 +Second Feast of the Maker - Leebro 20, June 21 (Pre-earth celebration) +The Day of Dancing - Leetar 21, September 3 +First Arrival of the Great King - Leevot 12, September 28 +Third Feast of the Maker - Leevofo 18, November 11 (Pre-earth celebration) +Coronation of King Kerath - Leevofo 27, November 23 + >>> from datetime import timedelta >>> LEEFO_1_TABLE = [ @@ -74,7 +83,6 @@ __revision__ = "$Revision$" from datetime import datetime -from operator import mul from pytz import utc as UTC from time import mktime import sys @@ -91,7 +99,7 @@ ('hahr', 10), # year ('vai-lee', 29), # month ('yahr', 5), # day (~30h and 14min) - # bell - each yahr has 25 bells (~74 min) + # pahr-to-vo (bell) each yahr has 25 bells (~74 min) ('gahr-tah-vo', 25), # ~6h 3min ('tah-vo', 25), # ~14,5 min ('gor-ahn', 25), # ~34,8 seconds @@ -206,8 +214,8 @@ sec = hahr_sec + BASE_SEC + prorahn_sec return UTC.localize(datetime.utcfromtimestamp(sec)) - def secondsToBell(self, bell): - """Calculate seconds until bell + def secondsToPahrtovo(self, bell): + """Calculate seconds until bell (pahr-to-vo) """ if bell < 1 or bell > 25: raise ValueError("%s too large or small" % bell) @@ -257,9 +265,9 @@ self._addProrahn(value * 15625) gahrtahvo = property(_getGahrtahvo, _setGahrtahvo) - def _getBell(self): + def _getPahrtovo(self): return (self._prorahn // 3125) % 25 - bell = property(_getBell) + pahrtovo = property(_getPahrtovo) def _getTahvo(self): return (self._prorahn // 625) % 25 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ti...@us...> - 2007-02-12 19:34:23
|
Revision: 162 http://pymoul.svn.sourceforge.net/pymoul/?rev=162&view=rev Author: tiran Date: 2007-02-12 11:34:10 -0800 (Mon, 12 Feb 2007) Log Message: ----------- Show D'ni time Modified Paths: -------------- pymoul/trunk/src/moul/qt/mainwindow.py pymoul/trunk/src/moul/qt/ui/mainwindow.py pymoul/trunk/src/moul/qt/ui/mainwindow.ui pymoul/trunk/src/moul/time/dni.py Modified: pymoul/trunk/src/moul/qt/mainwindow.py =================================================================== --- pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-12 17:15:11 UTC (rev 161) +++ pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-12 19:34:10 UTC (rev 162) @@ -42,6 +42,8 @@ from moul.server.ping import isSocketError from moul.server.ping import fmtSocketError from moul.time.cavern import CavernTime +from moul.time.dni import DniTime +from moul.time.dni import FACTOR_SP from moul.qt.localization import LocalizationContainer from moul.qt.wdysini import IniFileContainer @@ -388,12 +390,21 @@ # create a timer to update the display every second # TODO: change timer from every second to every minute - self._timezone_timer = timer = QtCore.QTimer(self) - timer.setInterval(1000) # 1 sec + self._timezone_timer = QtCore.QTimer(self) + self._timezone_timer.setInterval(1000) # 1 sec # TODO: needs optimization? run only when timer tab is active - self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout) - timer.start() + self.connect(self._timezone_timer, SIGNAL('timeout()'), + self.on_timezone_timer_timeout) + self._timezone_timer.start() + self._dnitime = DniTime() + self.on_dnitimer_timeout() + self._dnitime_timer = QtCore.QTimer(self) + self._dnitime_timer.setInterval(FACTOR_SP*1000) + self.connect(self._dnitime_timer, SIGNAL('timeout()'), + self.on_dnitimer_timeout) + self._dnitime_timer.start() + def _timezone_update(self): """ Update datetime widgets @@ -421,6 +432,15 @@ self.dt_cavern.setDateTime(ct['cavern']) self.dt_pacific.setDateTime(ct['pacific']) + @pyqtSignature("") + @qtutils.skipLogging + def on_dnitimer_timeout(self): + """ + SIGNAL: QTimer timeout + """ + dni = self._dnitime.fromUTC() # set to now + self.le_dnitime.setText(str(self._dnitime)+", bell: %s" % self._dnitime.bell) + # ************************************************************************ # ping def _ping_init(self): Modified: pymoul/trunk/src/moul/qt/ui/mainwindow.py =================================================================== --- pymoul/trunk/src/moul/qt/ui/mainwindow.py 2007-02-12 17:15:11 UTC (rev 161) +++ pymoul/trunk/src/moul/qt/ui/mainwindow.py 2007-02-12 19:34:10 UTC (rev 162) @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file './src/moul/qt/ui/mainwindow.ui' # -# Created: Tue Feb 6 04:38:34 2007 +# Created: Mon Feb 12 20:15:18 2007 # by: PyQt4 UI code generator 4.1.1 # # WARNING! All changes made in this file will be lost! @@ -117,7 +117,7 @@ self.gridlayout.addWidget(self.lb_log_remove,1,1,1,3) self.groupBox_2 = QtGui.QGroupBox(self.tab_tasks) - self.groupBox_2.setGeometry(QtCore.QRect(10,130,451,81)) + self.groupBox_2.setGeometry(QtCore.QRect(10,120,451,81)) self.groupBox_2.setObjectName("groupBox_2") self.layoutWidget1 = QtGui.QWidget(self.groupBox_2) @@ -142,7 +142,7 @@ self.hboxlayout1.addItem(spacerItem3) self.gb_caverntime = QtGui.QGroupBox(self.tab_tasks) - self.gb_caverntime.setGeometry(QtCore.QRect(10,220,451,101)) + self.gb_caverntime.setGeometry(QtCore.QRect(10,200,451,101)) self.gb_caverntime.setObjectName("gb_caverntime") self.gridLayout = QtGui.QWidget(self.gb_caverntime) @@ -201,6 +201,16 @@ spacerItem4 = QtGui.QSpacerItem(40,20,QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Minimum) self.gridlayout1.addItem(spacerItem4,0,3,1,1) + + self.gb_dnitime = QtGui.QGroupBox(self.tab_tasks) + self.gb_dnitime.setGeometry(QtCore.QRect(10,300,451,101)) + self.gb_dnitime.setObjectName("gb_dnitime") + + self.le_dnitime = QtGui.QLineEdit(self.gb_dnitime) + self.le_dnitime.setGeometry(QtCore.QRect(10,40,281,25)) + self.le_dnitime.setEchoMode(QtGui.QLineEdit.Normal) + self.le_dnitime.setReadOnly(True) + self.le_dnitime.setObjectName("le_dnitime") self.tabwidget.addTab(self.tab_tasks,"") self.tab_settings = QtGui.QWidget() @@ -927,6 +937,7 @@ self.lb_pacific_utc.setText(QtGui.QApplication.translate("MainWindow", "UTC -0", None, QtGui.QApplication.UnicodeUTF8)) self.label_4.setText(QtGui.QApplication.translate("MainWindow", "Cavern time:", None, QtGui.QApplication.UnicodeUTF8)) self.label_5.setText(QtGui.QApplication.translate("MainWindow", "Cyan time:", None, QtGui.QApplication.UnicodeUTF8)) + self.gb_dnitime.setTitle(QtGui.QApplication.translate("MainWindow", "D\'ni time", None, QtGui.QApplication.UnicodeUTF8)) self.tabwidget.setTabText(self.tabwidget.indexOf(self.tab_tasks), QtGui.QApplication.translate("MainWindow", "Tasks", None, QtGui.QApplication.UnicodeUTF8)) self.groupBox_screenres.setTitle(QtGui.QApplication.translate("MainWindow", "Screen Resolution", None, QtGui.QApplication.UnicodeUTF8)) self.lb_screenres.setText(QtGui.QApplication.translate("MainWindow", "800x600 (4:3)", None, QtGui.QApplication.UnicodeUTF8)) Modified: pymoul/trunk/src/moul/qt/ui/mainwindow.ui =================================================================== --- pymoul/trunk/src/moul/qt/ui/mainwindow.ui 2007-02-12 17:15:11 UTC (rev 161) +++ pymoul/trunk/src/moul/qt/ui/mainwindow.ui 2007-02-12 19:34:10 UTC (rev 162) @@ -280,7 +280,7 @@ <property name="geometry" > <rect> <x>10</x> - <y>130</y> + <y>120</y> <width>451</width> <height>81</height> </rect> @@ -347,7 +347,7 @@ <property name="geometry" > <rect> <x>10</x> - <y>220</y> + <y>200</y> <width>451</width> <height>101</height> </rect> @@ -466,6 +466,35 @@ </layout> </widget> </widget> + <widget class="QGroupBox" name="gb_dnitime" > + <property name="geometry" > + <rect> + <x>10</x> + <y>300</y> + <width>451</width> + <height>101</height> + </rect> + </property> + <property name="title" > + <string>D'ni time</string> + </property> + <widget class="QLineEdit" name="le_dnitime" > + <property name="geometry" > + <rect> + <x>10</x> + <y>40</y> + <width>281</width> + <height>25</height> + </rect> + </property> + <property name="echoMode" > + <enum>QLineEdit::Normal</enum> + </property> + <property name="readOnly" > + <bool>true</bool> + </property> + </widget> + </widget> </widget> <widget class="QWidget" name="tab_settings" > <attribute name="title" > Modified: pymoul/trunk/src/moul/time/dni.py =================================================================== --- pymoul/trunk/src/moul/time/dni.py 2007-02-12 17:15:11 UTC (rev 161) +++ pymoul/trunk/src/moul/time/dni.py 2007-02-12 19:34:10 UTC (rev 162) @@ -18,10 +18,13 @@ """pyMoul D'ni time tool Based on informations from http://www.dpwr.net/archive.php?showarticle=2193 +Verified with http://home.earthlink.net/~seizuretown/myst/ccconverter.html official sources say that: 00:00:00:00, Leefo 1, 9654 DE = 10:35:18 UTC, April 21, 1998 CE +>>> from datetime import timedelta + >>> LEEFO_1_TABLE = [ ... datetime(1998, 4, 21, 10, 35, 18, 0, tzinfo=UTC), ... datetime(1999, 4, 21, 16, 24, 3, 0, tzinfo=UTC), @@ -118,8 +121,8 @@ BASE_YEAR = 1998 SECONDS_PER_HAHR = 31556925 PRORAHN_PER_HAHR = 22656250 -FACTOR_SP = float(SECONDS_PER_HAHR) / float(PRORAHN_PER_HAHR) -FACTOR_PS = float(PRORAHN_PER_HAHR) / float(SECONDS_PER_HAHR) +FACTOR_SP = float(SECONDS_PER_HAHR) / float(PRORAHN_PER_HAHR) # 1.39285737931 +FACTOR_PS = float(PRORAHN_PER_HAHR) / float(SECONDS_PER_HAHR) # 0.717948596069 def valueCheck(typ, minv, maxv): """Value and type checking decorator This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ti...@us...> - 2007-02-12 17:19:23
|
Revision: 161 http://pymoul.svn.sourceforge.net/pymoul/?rev=161&view=rev Author: tiran Date: 2007-02-12 09:15:11 -0800 (Mon, 12 Feb 2007) Log Message: ----------- Better round() Added method to calculate seconds to next bell Modified Paths: -------------- pymoul/trunk/src/moul/time/dni.py Modified: pymoul/trunk/src/moul/time/dni.py =================================================================== --- pymoul/trunk/src/moul/time/dni.py 2007-02-12 16:06:42 UTC (rev 160) +++ pymoul/trunk/src/moul/time/dni.py 2007-02-12 17:15:11 UTC (rev 161) @@ -34,10 +34,10 @@ >>> def compareDT(dt1, dt2): ... delta = td2sec(dt1 - dt2) ... # smaller than 5 seconds -... if abs(delta) < 5: +... if abs(delta) >0: # 1 off is fine +... return delta +... else: ... return True -... else: -... return delta >>> dni = DniTime() >>> dni.fromUTC(LEEFO_1_TABLE[1]) @@ -51,13 +51,20 @@ >>> other = datetime(2007, 2, 12, 13, 55, 10, 0, tzinfo=UTC) >>> dni.fromUTC(other) >>> dni.get() -(9662, 9, 4, 4, 21, 24, 21) +(9662, 9, 4, 4, 21, 24, 22) >>> str(dni) -'04:21:24:21, Leevotar 4, 9662' +'04:21:24:22, Leevotar 4, 9662' >>> compareDT(dni.toUTC(), other) True +>>> dni.bell +24 +>>> dni.secondsToBell(25) +2616 +>>> dni.secondsToBell(18) +80964 + """ __author__ = "Christian Heimes" __version__ = "$Id$" @@ -185,17 +192,29 @@ if utc_dt is None: utc_dt = utcnow() sec = td2sec(utc_dt - BASE) - prorahn = int(sec * FACTOR_PS) + prorahn = int(round(sec * FACTOR_PS)) self.set(hahr=BASE_HAHR, prorahn=prorahn) def toUTC(self): """Convert to UTC datetime value """ hahr_sec = (self.hahr - BASE_HAHR) * SECONDS_PER_HAHR - prorahn_sec = int(self._prorahn * FACTOR_SP) + prorahn_sec = int(round(self._prorahn * FACTOR_SP)) sec = hahr_sec + BASE_SEC + prorahn_sec return UTC.localize(datetime.utcfromtimestamp(sec)) + def secondsToBell(self, bell): + """Calculate seconds until bell + """ + if bell < 1 or bell > 25: + raise ValueError("%s too large or small" % bell) + pro = self.prorahnOfYahr() # prorahn of day + probells = bell * 3125 # prorahn of start of bell + diff = probells - pro + if diff < 0: + diff = diff + 78125 + return int(round(diff * FACTOR_SP)) + def __str__(self): """00:00:00:00, Leefo 1, 9654 """ @@ -228,10 +247,6 @@ self._addProrahn(value * 78125) yahr = property(_getYahr, _setYahr) - def _getBell(self): - return (self.gahrtahvo // 5) % 25 - bell = property(_getBell) - def _getGahrtahvo(self): return (self._prorahn // 15625) % 5 @valueCheck(int, 0, 5) @@ -239,6 +254,10 @@ self._addProrahn(value * 15625) gahrtahvo = property(_getGahrtahvo, _setGahrtahvo) + def _getBell(self): + return (self._prorahn // 3125) % 25 + bell = property(_getBell) + def _getTahvo(self): return (self._prorahn // 625) % 25 @valueCheck(int, 0, 25) @@ -261,9 +280,15 @@ prorahn = property(_getProrahn, _setProrahn) def _addProrahn(self, value): - value = int(value) + value = int(round(value)) addhahr = value // PRORAHN_PER_HAHR if addhahr: self._hahr += addhahr value = value - (addhahr * PRORAHN_PER_HAHR) self._prorahn = value + + def prorahnOfYahr(self): + """Get numbers of prorahntee since start of yahr + """ + return (self.gahrtahvo * 15625 + self.tahvo * 625 + + self.gorahn * 25 + self.prorahn) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ti...@us...> - 2007-02-12 16:06:48
|
Revision: 160 http://pymoul.svn.sourceforge.net/pymoul/?rev=160&view=rev Author: tiran Date: 2007-02-12 08:06:42 -0800 (Mon, 12 Feb 2007) Log Message: ----------- Finished D'ni time calculation Modified Paths: -------------- pymoul/trunk/src/moul/time/dni.py Added Paths: ----------- pymoul/trunk/src/moul/time/utils.py Modified: pymoul/trunk/src/moul/time/dni.py =================================================================== --- pymoul/trunk/src/moul/time/dni.py 2007-02-12 13:36:09 UTC (rev 159) +++ pymoul/trunk/src/moul/time/dni.py 2007-02-12 16:06:42 UTC (rev 160) @@ -21,20 +21,43 @@ official sources say that: 00:00:00:00, Leefo 1, 9654 DE = 10:35:18 UTC, April 21, 1998 CE + >>> LEEFO_1_TABLE = [ -... datetime(1998, 4, 21, 10, 35, 18, 0, UTC), -... datetime(1999, 4, 21, 16, 24, 3, 0, UTC), -... datetime(2000, 4, 20, 22, 12, 48, 0, UTC), -... datetime(2001, 4, 21, 4, 1, 33, 0, UTC), -... datetime(2002, 4, 21, 9, 50, 18, 0, UTC), -... datetime(2003, 4, 21, 15, 39, 3, 0, UTC), +... datetime(1998, 4, 21, 10, 35, 18, 0, tzinfo=UTC), +... datetime(1999, 4, 21, 16, 24, 3, 0, tzinfo=UTC), +... datetime(2000, 4, 20, 22, 12, 48, 0, tzinfo=UTC), +... datetime(2001, 4, 21, 4, 1, 33, 0, tzinfo=UTC), +... datetime(2002, 4, 21, 9, 50, 18, 0, tzinfo=UTC), +... datetime(2003, 4, 21, 15, 39, 3, 0, tzinfo=UTC), ... ] +>>> def compareDT(dt1, dt2): +... delta = td2sec(dt1 - dt2) +... # smaller than 5 seconds +... if abs(delta) < 5: +... return True +... else: +... return delta + >>> dni = DniTime() >>> dni.fromUTC(LEEFO_1_TABLE[1]) >>> dni.get() -(9655, 0, 0, 0, 0, 0, 0) +(9655, 1, 1, 0, 0, 0, 0) +>>> str(dni) +'00:00:00:00, Leefo 1, 9655' +>>> compareDT(dni.toUTC(), LEEFO_1_TABLE[1]) +True +>>> other = datetime(2007, 2, 12, 13, 55, 10, 0, tzinfo=UTC) +>>> dni.fromUTC(other) +>>> dni.get() +(9662, 9, 4, 4, 21, 24, 21) +>>> str(dni) +'04:21:24:21, Leevotar 4, 9662' + +>>> compareDT(dni.toUTC(), other) +True + """ __author__ = "Christian Heimes" __version__ = "$Id$" @@ -43,6 +66,7 @@ from datetime import datetime from operator import mul from pytz import utc as UTC +from time import mktime import sys from moul.time.utils import td2sec @@ -79,12 +103,16 @@ ) # 00:00:00:00, Leefo 1, 9654 DE -BASE = datetime(1998, 4, 21, 10, 35, 18, 0, UTC) +BASE = datetime(1998, 4, 21, 10, 35, 18, 0, tzinfo=UTC) +# timestamp 0 - start of unix time +UNIX_0 = datetime(1970, 1, 1, 0, 0, 0, 0, tzinfo=UTC) +BASE_SEC = td2sec(BASE-UNIX_0) # WTF? datetime has no totimestamp() method BASE_HAHR = 9654 +BASE_YEAR = 1998 SECONDS_PER_HAHR = 31556925 PRORAHN_PER_HAHR = 22656250 -FACTOR_SH = float(SECONDS_PER_HAHR) / float(PRORAHN_PER_HAHR) -FACTOR_HS = float(PRORAHN_PER_HAHR) / float(SECONDS_PER_HAHR) +FACTOR_SP = float(SECONDS_PER_HAHR) / float(PRORAHN_PER_HAHR) +FACTOR_PS = float(PRORAHN_PER_HAHR) / float(SECONDS_PER_HAHR) def valueCheck(typ, minv, maxv): """Value and type checking decorator @@ -157,14 +185,25 @@ if utc_dt is None: utc_dt = utcnow() sec = td2sec(utc_dt - BASE) - prorahn = sec * FACTOR_HS + prorahn = int(sec * FACTOR_PS) self.set(hahr=BASE_HAHR, prorahn=prorahn) def toUTC(self): """Convert to UTC datetime value """ - raise NotImplementedError + hahr_sec = (self.hahr - BASE_HAHR) * SECONDS_PER_HAHR + prorahn_sec = int(self._prorahn * FACTOR_SP) + sec = hahr_sec + BASE_SEC + prorahn_sec + return UTC.localize(datetime.utcfromtimestamp(sec)) + def __str__(self): + """00:00:00:00, Leefo 1, 9654 + """ + return ("%02i:%02i:%02i:%02i, %s %i, %i" % ( + self.gahrtahvo, self.tahvo, self.gorahn, self.prorahn, + self.getVaileeName(), self.yahr, self.hahr + )) + def _getHahr(self): return self._hahr @valueCheck(int, 0, sys.maxint) @@ -173,42 +212,42 @@ hahr = property(_getHahr, _setHahr) def _getVailee(self): - return self._prorahn // 2265625 + return ((self._prorahn // 2265625) % 10) +1 @valueCheck(int, 0, 10) def _setVailee(self, value): self._addProrahn(value * 2265625) vailee = property(_getVailee, _setVailee) def getVaileeName(self): - return VAILEETEE[self.vailee] + return VAILEETEE[self.vailee-1] def _getYahr(self): - return self._prorahn // 78125 + return ((self._prorahn // 78125) % 29) +1 @valueCheck(int, 0, 29) def _setYahr(self, value): self._addProrahn(value * 78125) yahr = property(_getYahr, _setYahr) def _getBell(self): - return self.gahrtahvo // 5 + return (self.gahrtahvo // 5) % 25 bell = property(_getBell) def _getGahrtahvo(self): - return self._prorahn // 15625 + return (self._prorahn // 15625) % 5 @valueCheck(int, 0, 5) def _setGahrtahvo(self, value): self._addProrahn(value * 15625) gahrtahvo = property(_getGahrtahvo, _setGahrtahvo) def _getTahvo(self): - return self._prorahn // 625 + return (self._prorahn // 625) % 25 @valueCheck(int, 0, 25) def _setTahvo(self, value): self._addProrahn(value * 625) tahvo = property(_getTahvo, _setTahvo) def _getGorahn(self): - return self._prorahn // 25 + return (self._prorahn // 25) % 25 @valueCheck(int, 0, 25) def _setGorahn(self, value): self._addProrahn(value * 25) @@ -222,7 +261,9 @@ prorahn = property(_getProrahn, _setProrahn) def _addProrahn(self, value): - self._prorahn += int(value) - addhahr = self._prorahn // PRORAHN_PER_HAHR + value = int(value) + addhahr = value // PRORAHN_PER_HAHR if addhahr: self._hahr += addhahr + value = value - (addhahr * PRORAHN_PER_HAHR) + self._prorahn = value Added: pymoul/trunk/src/moul/time/utils.py =================================================================== --- pymoul/trunk/src/moul/time/utils.py (rev 0) +++ pymoul/trunk/src/moul/time/utils.py 2007-02-12 16:06:42 UTC (rev 160) @@ -0,0 +1,74 @@ +# pyMoul - Python interface to Myst Online URU Live +# Copyright (C) 2007 Christian Heimes <christian (at) cheimes (dot) de> + +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +# more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., 59 +# Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +"""pyMoul cavern time tool +""" +__author__ = "Christian Heimes" +__version__ = "$Id: cavern.py 124 2007-02-02 17:45:42Z tiran $" +__revision__ = "$Revision: 124 $" + +from datetime import datetime +from pytz import utc as UTC + + +def diffTD(td1, td2): + """Difference of two time delta objects -> int + + >>> from datetime import timedelta + >>> type(diffTD(timedelta(0, 3600), timedelta(0, -3600))) + <type 'int'> + >>> diffTD(timedelta(0, 3600), timedelta(0, -3600)) + 7200 + >>> diffTD(timedelta(0, 3600), timedelta(0, 3600)) + 0 + >>> diffTD(timedelta(0, -3600), timedelta(0, -3600)) + 0 + >>> diffTD(timedelta(0, -7200), timedelta(0, -3600)) + -3600 + >>> diffTD(timedelta(0, -3600), timedelta(0, -7200)) + 3600 + >>> diffTD(timedelta(0, 3600, 1), timedelta(0, -3600)) + Traceback (most recent call last): + ... + ValueError: Can't handle microseconds + """ + if td1.microseconds or td2.microseconds: + raise ValueError("Can't handle microseconds") + return (td1.seconds + 86400 * td1.days) - (td2.seconds + 86400 * td2.days) + +def td2sec(td): + """timedelta to seconds + + >>> from datetime import timedelta + >>> td2sec(timedelta(0, 3600)) + 3600 + >>> td2sec(timedelta(0, -3600)) + -3600 + """ + return td.seconds + 86400 * td.days + +def utcnow(): + """Get current time in UTC + """ + return UTC.localize(datetime.utcnow()) + +def normalizeTZ(tz, utc_dt=None): + """Normalize a datetime object with UTC tz using another tz + """ + if utc_dt is None: + utc_dt = utcnow() + return tz.normalize(utc_dt.astimezone(tz)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ti...@us...> - 2007-02-12 13:36:27
|
Revision: 159 http://pymoul.svn.sourceforge.net/pymoul/?rev=159&view=rev Author: tiran Date: 2007-02-12 05:36:09 -0800 (Mon, 12 Feb 2007) Log Message: ----------- Added mac pathes First work on DNI time module Modified Paths: -------------- pymoul/trunk/src/moul/log.py pymoul/trunk/src/moul/osdependent/darwin/__init__.py pymoul/trunk/src/moul/osdependent/linux/__init__.py pymoul/trunk/src/moul/time/__init__.py pymoul/trunk/src/moul/time/cavern.py pymoul/trunk/src/moul/time/dni.py pymoul/trunk/src/moul/time/tests/test_cavern.py Modified: pymoul/trunk/src/moul/log.py =================================================================== --- pymoul/trunk/src/moul/log.py 2007-02-10 16:01:28 UTC (rev 158) +++ pymoul/trunk/src/moul/log.py 2007-02-12 13:36:09 UTC (rev 159) @@ -117,7 +117,7 @@ shdlr = logging.StreamHandler(sys.stderr) shdlr.setFormatter(format) root.addHandler(shdlr) - _systemInfo() + #_systemInfo() else: _installMemoryHdlr() _systemInfo() Modified: pymoul/trunk/src/moul/osdependent/darwin/__init__.py =================================================================== --- pymoul/trunk/src/moul/osdependent/darwin/__init__.py 2007-02-10 16:01:28 UTC (rev 158) +++ pymoul/trunk/src/moul/osdependent/darwin/__init__.py 2007-02-12 13:36:09 UTC (rev 159) @@ -30,9 +30,17 @@ LOG = getLogger('moul.darwin') LOG.critical('Darwin/Mac support is not tested') -MOUL_DIR = "Uru Live" -EXEC_NAME = "UruLauncher" -HOME = os.environ['HOME'] +HOME = os.path.expanduser('~') +MOUL_DIR = "Library/Preferences/UruLive Preferences/p_drive/My Documents/Uru Live" +APP_PATH = "Uru Live.app/Contents/Resources/Game.app/Contents/Resources/transgaming/c_drive/Program Files/Uru Live/" +APP_NAME = "Uru Live.app" +EXEC_NAME = "???" # XXX +UPDATER = "Uru Live.app/Contents/Resources/Game.app/Contents/Resources/URU Live Updater.app/Contents/MacOS/URU Live Updater" +LOCATIONS = [ + "/Applications", + "%s/Applications" % HOME, + ] +PYMOUL_DIR = "Library/Preferences/pyMoul" def getMoulUserDataDir(): """Get path of MOUL data directory @@ -45,7 +53,7 @@ def getPyMoulDataDir(): """Get path to the pyMoul ini directory """ - inidir= os.path.join(HOME, '.pymoul') + inidir= os.path.join(HOME, PYMOUL_DIR) return inidir def startMoul(installdir, *args, **kwargs): Modified: pymoul/trunk/src/moul/osdependent/linux/__init__.py =================================================================== --- pymoul/trunk/src/moul/osdependent/linux/__init__.py 2007-02-10 16:01:28 UTC (rev 158) +++ pymoul/trunk/src/moul/osdependent/linux/__init__.py 2007-02-12 13:36:09 UTC (rev 159) @@ -31,10 +31,10 @@ LOG = getLogger('moul.linux') LOG.critical('Linux support is not tested') +HOME = os.path.expanduser('~') MOUL_DIR = ".urulive" INI_FILE = ('pyMoul', 'pymoul.ini') EXEC_NAME = "UruLauncher" -HOME = os.environ['HOME'] PROCESSES = ('urulauncher', 'uruexplorer') LOCATIONS = [ "%s/dev/pymoul/MystOnline" % HOME, Modified: pymoul/trunk/src/moul/time/__init__.py =================================================================== --- pymoul/trunk/src/moul/time/__init__.py 2007-02-10 16:01:28 UTC (rev 158) +++ pymoul/trunk/src/moul/time/__init__.py 2007-02-12 13:36:09 UTC (rev 159) @@ -20,3 +20,9 @@ __author__ = "Christian Heimes" __version__ = "$Id$" __revision__ = "$Revision$" + +from moul.osdependent import __FROZEN__ +# pytz is an egg +if not __FROZEN__: + import pkg_resources + pkg_resources.require("pytz>=2006p") Modified: pymoul/trunk/src/moul/time/cavern.py =================================================================== --- pymoul/trunk/src/moul/time/cavern.py 2007-02-10 16:01:28 UTC (rev 158) +++ pymoul/trunk/src/moul/time/cavern.py 2007-02-12 13:36:09 UTC (rev 159) @@ -24,17 +24,15 @@ __all__ = ['CavernTime'] from datetime import datetime - -from moul.osdependent import __FROZEN__ -# pytz is an egg -if not __FROZEN__: - import pkg_resources - pkg_resources.require("pytz>=2006p") - from pytz import all_timezones from pytz import timezone from pytz import utc as UTC +from moul.time.utils import td2sec +from moul.time.utils import diffTD +from moul.time.utils import utcnow +from moul.time.utils import normalizeTZ + ## not used in the current version #SUPPORTED_TZ = ('America', 'Canada', 'Etc', 'Europe', 'US') #ADDITIONAL_TZ = ('GMT', 'UTC') @@ -73,42 +71,6 @@ PACIFIC_TZ_NAME = ('US/Pacific', 'PST', 'PDT') # PST / PDT PACIFIC_TZ = timezone(PACIFIC_TZ_NAME[0]) -def diffTD(td1, td2): - """Difference of two time delta objects -> int - - >>> from datetime import timedelta - >>> type(diffTD(timedelta(0, 3600), timedelta(0, -3600))) - <type 'int'> - >>> diffTD(timedelta(0, 3600), timedelta(0, -3600)) - 7200 - >>> diffTD(timedelta(0, 3600), timedelta(0, 3600)) - 0 - >>> diffTD(timedelta(0, -3600), timedelta(0, -3600)) - 0 - >>> diffTD(timedelta(0, -7200), timedelta(0, -3600)) - -3600 - >>> diffTD(timedelta(0, -3600), timedelta(0, -7200)) - 3600 - >>> diffTD(timedelta(0, 3600, 1), timedelta(0, -3600)) - Traceback (most recent call last): - ... - ValueError: Can't handle microseconds - """ - if td1.microseconds or td2.microseconds: - raise ValueError("Can't handle microseconds") - return (td1.seconds + 86400 * td1.days) - (td2.seconds + 86400 * td2.days) - -def td2int(td): - """timedelta to int - - >>> from datetime import timedelta - >>> td2int(timedelta(0, 3600)) - 3600 - >>> td2int(timedelta(0, -3600)) - -3600 - """ - return td.seconds + 86400 * td.days - class CavernTime(object): """Cavern time calculator @@ -167,41 +129,27 @@ _cavern_name = CAVERN_TZ_NAME _pacific = PACIFIC_TZ _pacific_name = PACIFIC_TZ_NAME - - @staticmethod - def _utcnow(): - """Get current time in UTC - """ - return UTC.localize(datetime.utcnow()) - @staticmethod - def _normalize(tz, utc_dt=None): - """Normalize a datetime object with UTC tz using another tz - """ - if utc_dt is None: - utc_dt = self._utcnow() - return tz.normalize(utc_dt.astimezone(tz)) - def __call__(self): - now = self._utcnow() + now = utcnow() result = {} for id, tz in (('cavern', self._cavern), ('pacific', self._pacific)): - result[id] = self._normalize(tz, now) + result[id] = normalizeTZ(tz, now) return result def info(self): - now = self._utcnow() + now = utcnow() result = {} for id, tz in (('cavern', self._cavern), ('pacific', self._pacific)): info = result.setdefault(id, {}) - utcoffset = td2int(tz.utcoffset(now)) + utcoffset = td2sec(tz.utcoffset(now)) signum = utcoffset < 0 and '-' or '+' info['tz'] = tz info['utcoffset'] = signum,int(utcoffset/3600), float((utcoffset%3600)/3600.0) - info['datetime'] = self._normalize(tz, now) + info['datetime'] = normalizeTZ(tz, now) info['name'] = str(tz) info['id'] = tz._tzname - info['dst'] = td2int(tz.dst(now)) + info['dst'] = td2sec(tz.dst(now)) result['utc'] = {'datetime' : now} return result Modified: pymoul/trunk/src/moul/time/dni.py =================================================================== --- pymoul/trunk/src/moul/time/dni.py 2007-02-10 16:01:28 UTC (rev 158) +++ pymoul/trunk/src/moul/time/dni.py 2007-02-12 13:36:09 UTC (rev 159) @@ -15,53 +15,94 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # Temple Place, Suite 330, Boston, MA 02111-1307 USA # -"""pyMoul D'ni time tool +"""pyMoul D'ni time tool + +Based on informations from http://www.dpwr.net/archive.php?showarticle=2193 + +official sources say that: +00:00:00:00, Leefo 1, 9654 DE = 10:35:18 UTC, April 21, 1998 CE +>>> LEEFO_1_TABLE = [ +... datetime(1998, 4, 21, 10, 35, 18, 0, UTC), +... datetime(1999, 4, 21, 16, 24, 3, 0, UTC), +... datetime(2000, 4, 20, 22, 12, 48, 0, UTC), +... datetime(2001, 4, 21, 4, 1, 33, 0, UTC), +... datetime(2002, 4, 21, 9, 50, 18, 0, UTC), +... datetime(2003, 4, 21, 15, 39, 3, 0, UTC), +... ] + +>>> dni = DniTime() +>>> dni.fromUTC(LEEFO_1_TABLE[1]) +>>> dni.get() +(9655, 0, 0, 0, 0, 0, 0) + """ __author__ = "Christian Heimes" __version__ = "$Id$" __revision__ = "$Revision$" +from datetime import datetime from operator import mul +from pytz import utc as UTC +import sys +from moul.time.utils import td2sec +from moul.time.utils import utcnow -FARAH_1 = -7656 # hahrtee fahrah 1 starts at April 21st 7656 B.C + +FAHRAH_1 = -7656 # hahrtee fahrah 1 starts at April 21st 7656 B.C + +# name -> amount of smaller element, e.g. a hartee fahrah as 625 hahr DNI_FACTORS = ( ('hahrtee fahrah', 625), - ('hahr', 10), - ('vai-lee', 29), - ('yahr', 5), - ('gahr-tah-vo', 25), - ('tah-vo', 25), - ('gor-ahn', 25), - ('pro-rahn', 1), -) + ('hahr', 10), # year + ('vai-lee', 29), # month + ('yahr', 5), # day (~30h and 14min) + # bell - each yahr has 25 bells (~74 min) + ('gahr-tah-vo', 25), # ~6h 3min + ('tah-vo', 25), # ~14,5 min + ('gor-ahn', 25), # ~34,8 seconds + ('pro-rahn', None), # ~1.39 seconds + ) -VAILATEE = ( - ('Leefo', ( 4, 21), ( 5, 27)), # 1: April 21st to May 27th - ('Leebro', ( 5, 28), ( 7, 3)), # 2: May 28th to July 3rd - ('Leesahn', ( 7, 3), ( 8, 8)), # 3: July 3rd to August 8th - ('Leetar', ( 8, 9), ( 9, 15)), # 4: August 9th and September 14th - ('Leevot', ( 9, 14), (10, 20)), # 5: September 14th to October 20th - ('Leevofo', (10, 21), (11, 26)), # 6: October 21st to November 26th - ('Leevobro', (11, 26), ( 1, 1)), # 7: November 26th to January 1st - ('Leevosahn', ( 1, 2), ( 2, 7)), # 8: January 2nd to February 7th - ('Leevotar', ( 2, 7), ( 3, 15)), # 9: February 7th to March 15th - ('Leenovoo', ( 3, 16), ( 4, 21)), # 10: March 16th to April 21st -) +# list of month names with approx. dates +VAILEETEE = ( + 'Leefo', # 1: April 21st to May 27th + 'Leebro', # 2: May 28th to July 3rd + 'Leesahn', # 3: July 3rd to August 8th + 'Leetar', # 4: August 9th and September 14th + 'Leevot', # 5: September 14th to October 20th + 'Leevofo', # 6: October 21st to November 26th + 'Leevobro', # 7: November 26th to January 1st + 'Leevosahn', # 8: January 2nd to February 7th + 'Leevotar', # 9: February 7th to March 15th + 'Leenovoo', # 10: March 16th to April 21st + ) -PRORAHN_PER_HAHR = reduce(mul, - [float(factor) for name, factor in DNI_FACTORS[1:-1]]) +# 00:00:00:00, Leefo 1, 9654 DE +BASE = datetime(1998, 4, 21, 10, 35, 18, 0, UTC) +BASE_HAHR = 9654 +SECONDS_PER_HAHR = 31556925 +PRORAHN_PER_HAHR = 22656250 +FACTOR_SH = float(SECONDS_PER_HAHR) / float(PRORAHN_PER_HAHR) +FACTOR_HS = float(PRORAHN_PER_HAHR) / float(SECONDS_PER_HAHR) -# Official SI year 365.25 days = 31.557.600 seconds -YEAR_SI = 31557600 -# Sidereal year: 365.256 363 051 days (365 d 6 h 9 min 9 s) -# YEAR_SIDEREAL = (((((365 * 24) + 6 ) * 60 ) + 9 ) * 60 ) + 9 -YEAR = float(YEAR_SI) +def valueCheck(typ, minv, maxv): + """Value and type checking decorator + """ + def wrapper(func): + def checker(self, value): + if not isinstance(value, typ): + raise TypeError("%s <%s>" % (value, type(value))) + if value < minv or value > maxv: + raise ValueError("%s not in (%i, %i)" % (value, minv, maxv)) + return func(self, value) + checker.__doc__ = func.__doc__ + checker.__name__ = func.__name__ + return checker + return wrapper -FACTOR = YEAR / PRORAHN_PER_HAHR - class DniTime(object): - """D'ni time handler + """D'ni time representation The D'ni were using a complex calendar based on a pentovigesimal (25) numbering system. @@ -91,11 +132,97 @@ gorahn minute 36 seconds prorahn second about 1.3929 seconds """ - _fahrah = None # millenium (625 years) - _hahr = None # year (1 year) - _vailee = None # month (10 per year) - _yahr = None # day (29 per vailee) - _gahrtahvo = None # section (about 6h, 3min) - _tahvo = None # quarter (about 14,5min) - _gorahn = None # minute (about 36 seconds) - _prorahn = None # second (1,4 seconds) + def __init__(self, hahr=0, vailee=0, yahr=0, gahrtahvo=0, tahvo=0, + gorahn=0, prorahn=0): + self.set(hahr, vailee, yahr, gahrtahvo, tahvo, gorahn, prorahn) + + def set(self, hahr=0, vailee=0, yahr=0, gahrtahvo=0, tahvo=0, + gorahn=0, prorahn=0): + self.hahr = hahr + self._prorahn = 0 + self.vailee = vailee + self.yahr = yahr + self.gahrtahvo = gahrtahvo + self.tahvo = tahvo + self.gorahn = gorahn + self._addProrahn(prorahn) + + def get(self): + return (self.hahr, self.vailee, self.yahr, self.gahrtahvo, self.tahvo, + self.gorahn, self.prorahn) + + def fromUTC(self, utc_dt=None): + """Convert from UTC datetime + """ + if utc_dt is None: + utc_dt = utcnow() + sec = td2sec(utc_dt - BASE) + prorahn = sec * FACTOR_HS + self.set(hahr=BASE_HAHR, prorahn=prorahn) + + def toUTC(self): + """Convert to UTC datetime value + """ + raise NotImplementedError + + def _getHahr(self): + return self._hahr + @valueCheck(int, 0, sys.maxint) + def _setHahr(self, value): + self._hahr = value + hahr = property(_getHahr, _setHahr) + + def _getVailee(self): + return self._prorahn // 2265625 + @valueCheck(int, 0, 10) + def _setVailee(self, value): + self._addProrahn(value * 2265625) + vailee = property(_getVailee, _setVailee) + + def getVaileeName(self): + return VAILEETEE[self.vailee] + + def _getYahr(self): + return self._prorahn // 78125 + @valueCheck(int, 0, 29) + def _setYahr(self, value): + self._addProrahn(value * 78125) + yahr = property(_getYahr, _setYahr) + + def _getBell(self): + return self.gahrtahvo // 5 + bell = property(_getBell) + + def _getGahrtahvo(self): + return self._prorahn // 15625 + @valueCheck(int, 0, 5) + def _setGahrtahvo(self, value): + self._addProrahn(value * 15625) + gahrtahvo = property(_getGahrtahvo, _setGahrtahvo) + + def _getTahvo(self): + return self._prorahn // 625 + @valueCheck(int, 0, 25) + def _setTahvo(self, value): + self._addProrahn(value * 625) + tahvo = property(_getTahvo, _setTahvo) + + def _getGorahn(self): + return self._prorahn // 25 + @valueCheck(int, 0, 25) + def _setGorahn(self, value): + self._addProrahn(value * 25) + gorahn = property(_getGorahn, _setGorahn) + + def _getProrahn(self): + return self._prorahn % 25 + @valueCheck(int, 0, 25) + def _setProrahn(self, value): + self._prorahn+= value + prorahn = property(_getProrahn, _setProrahn) + + def _addProrahn(self, value): + self._prorahn += int(value) + addhahr = self._prorahn // PRORAHN_PER_HAHR + if addhahr: + self._hahr += addhahr Modified: pymoul/trunk/src/moul/time/tests/test_cavern.py =================================================================== --- pymoul/trunk/src/moul/time/tests/test_cavern.py 2007-02-10 16:01:28 UTC (rev 158) +++ pymoul/trunk/src/moul/time/tests/test_cavern.py 2007-02-12 13:36:09 UTC (rev 159) @@ -31,6 +31,7 @@ def test_suite(): return unittest.TestSuite(( DocTestSuite('moul.time.cavern'), + DocTestSuite('moul.time.utils'), )) if __name__ == '__main__': This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ti...@us...> - 2007-02-10 16:01:33
|
Revision: 158 http://pymoul.svn.sourceforge.net/pymoul/?rev=158&view=rev Author: tiran Date: 2007-02-10 08:01:28 -0800 (Sat, 10 Feb 2007) Log Message: ----------- Added binary record Modified Paths: -------------- pymoul/trunk/src/moul/crypt/binary.py Added Paths: ----------- pymoul/trunk/src/moul/crypt/binaryrecord.py pymoul/trunk/src/moul/crypt/tests/test_binaryrecord.py Modified: pymoul/trunk/src/moul/crypt/binary.py =================================================================== --- pymoul/trunk/src/moul/crypt/binary.py 2007-02-10 13:14:18 UTC (rev 157) +++ pymoul/trunk/src/moul/crypt/binary.py 2007-02-10 16:01:28 UTC (rev 158) @@ -25,6 +25,9 @@ from struct import unpack from struct import calcsize +from moul.crypt.binaryrecord import parseRecord +from moul.crypt.binaryrecord import registerRecord + class BinaryFile(file): """Binary file @@ -136,6 +139,13 @@ def readString32(self, terminate=False): return String32('', terminate=terminate).readfd(self) + def readRecord(self, name): + return parseRecord(name, self) + + @staticmethod + def registerRecord(name, fmt): + return registerRecord(name, fmt) + #write def writeChar(self, data, _pack=pack): self.write(_pack('<c', data)) @@ -198,6 +208,9 @@ def writeString32(self, data, terminate=False): String32(data, terminate=terminate).writefd(self) + def writeRecord(self, rec): + self.write(rec.read()) + class AbstractString(object): """Abstract string class """ Added: pymoul/trunk/src/moul/crypt/binaryrecord.py =================================================================== --- pymoul/trunk/src/moul/crypt/binaryrecord.py (rev 0) +++ pymoul/trunk/src/moul/crypt/binaryrecord.py 2007-02-10 16:01:28 UTC (rev 158) @@ -0,0 +1,170 @@ +# pyMoul - Python interface to Myst Online URU Live +# Copyright (C) 2007 Christian Heimes <christian (at) cheimes (dot) de> + +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +# more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., 59 +# Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +"""Binary file helper: Records + +This module is roughly based on Maciej Obarski's recipe "parse and create +fixed size binary data" from +http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/465219 +""" +__author__ = "Christian Heimes" +__version__ = "$Id" +__revision__ = "$Revision" + +from struct import pack +from struct import unpack +from struct import calcsize + +_marker = object() + +class RecordRegistry(dict): + """Registry for record definitions + """ + __slots__ = () + def register(self, name, fmt): + """Register a format by name + + @param name: name of the format + @type name: str + @param fmt: a record format + @type fmt: str + + Example: + >>> reg = RecordRegistry() + >>> registerRecord = reg.register + >>> parseRecord = reg.parse + >>> obj = registerRecord("connection", "4B.ip >H.port >I.session_id") + >>> isinstance(obj, RecordDefinition) + True + >>> data = "\\xc0\\xa8\\x00\\x01" + "\\x00P" + "\\xFE\\xDC\\xBA\\x98" + + >>> rec = parseRecord("connection", data) + >>> rec.ip + (192, 168, 0, 1) + >>> rec.port + 80 + >>> rec.session_id + 4275878552L + >>> rec.read() == data or rec.read() + True + """ + if name in self: + raise NameError("%s already registered!" % name) + self[name] = RecordDefinition(name, fmt) + return self[name] + + def parse(self, name, fd_data): + """Parse data using the RecordDefinition 'name' + + @param name: name of the format + @type name: str + @param fd_data: data to parse: either a string or an open file + @type fd_data: str or file + """ + return self[name](fd_data) + +class RecordDefinition(object): + """A record definition + """ + __slots__ = ('_fields', '_recordsize', '_name') + + def __init__(self, name, recordfmt): + self._name = name + self._fields = [] + pos = 0 + for field in recordfmt.split(): + if field.startswith('#'): + continue + fmt, name = field.split('.') + if '#' in name: + name = name.split('#')[0] + name = name.strip() + size = calcsize(fmt) + self._fields.append((name, fmt, pos, pos+size)) + pos += size + + self._recordsize = pos + + @property + def name(self): + return self._name + + @property + def size(self): + return self._recordsize + + def __call__(self, fd_data): + """Parse data using the format string + + @param fd_data: data to parse: either a string or an open file + @type fd_data: str or file + """ + if isinstance(fd_data, basestring): + # handle string + data = fd_data + elif hasattr(fd_data, 'read'): + data = fd_data.read(self._recordsize) + else: + raise TypeError(type(fd_data)) + if len(data) != self._recordsize: + raise ValueError("Data has wrong size: %i, required: %i" % + (len(data), self._recordsize)) + return Record(self._fields, data) + +class Record(object): + __slots__ = ('_fields', '_data') + + def __init__(self, fields, data=None): + self._fields = fields + self._data = {} + if data is not None: + self.write(data) + + def write(self, data): + """Write data + + Creates the instance attributes defined in fmt + """ + for name, fmt, start, stop in self._fields: + value = unpack(fmt, data[start:stop]) + if len(value) == 1: + value = value[0] + self._data[name] = value + + def read(self): + """Convert data to binary string + """ + result = [] + for name, fmt, start, stop in self._fields: + value = self._data[name] + if not isinstance(value, (tuple, list)): + value = (value,) + result.append(pack(fmt, *value)) + return ''.join(result) + + def __getattr__(self, name, default=_marker): + value = self._data.get(name, default) + if value is _marker: + raise AttributeError(name) + return value + + def __str__(self): + return self.read() + +_recordRegistry = RecordRegistry() +registerRecord = _recordRegistry.register +parseRecord = _recordRegistry.parse Added: pymoul/trunk/src/moul/crypt/tests/test_binaryrecord.py =================================================================== --- pymoul/trunk/src/moul/crypt/tests/test_binaryrecord.py (rev 0) +++ pymoul/trunk/src/moul/crypt/tests/test_binaryrecord.py 2007-02-10 16:01:28 UTC (rev 158) @@ -0,0 +1,38 @@ +# pyMoul - Python interface to Myst Online URU Live +# Copyright (C) 2007 Christian Heimes <christian (at) cheimes (dot) de> + +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +# more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., 59 +# Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +"""moul.crypt.binaryrecord unit tests +""" +__author__ = "Christian Heimes" +__version__ = "$Id: test_elf.py 122 2007-02-02 17:34:06Z tiran $" +__revision__ = "$Revision: 122 $" + +import os +import unittest +from doctest import DocTestSuite + +import moul.crypt.binaryrecord + +def test_suite(): + return unittest.TestSuite(( + DocTestSuite('moul.crypt.binaryrecord'), + )) + +if __name__ == '__main__': + unittest.main(defaultTest="test_suite") + + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ti...@us...> - 2007-02-10 13:14:21
|
Revision: 157 http://pymoul.svn.sourceforge.net/pymoul/?rev=157&view=rev Author: tiran Date: 2007-02-10 05:14:18 -0800 (Sat, 10 Feb 2007) Log Message: ----------- Updated binary file, added String16, String32 and UruString Added unit tests Modified Paths: -------------- pymoul/trunk/src/moul/crypt/binary.py Added Paths: ----------- pymoul/trunk/src/moul/crypt/tests/test_binary.py Property Changed: ---------------- pymoul/trunk/src/moul/crypt/binary.py Modified: pymoul/trunk/src/moul/crypt/binary.py =================================================================== --- pymoul/trunk/src/moul/crypt/binary.py 2007-02-08 20:02:58 UTC (rev 156) +++ pymoul/trunk/src/moul/crypt/binary.py 2007-02-10 13:14:18 UTC (rev 157) @@ -18,14 +18,12 @@ """Binary file helper """ __author__ = "Christian Heimes" -__version__ = "$Id: elf.py 122 2007-02-02 17:34:06Z tiran $" -__revision__ = "$Revision: 122 $" +__version__ = "$Id" +__revision__ = "$Revision" -from _struct import Struct from struct import pack from struct import unpack from struct import calcsize -from tempfile import NamedTemporaryFile class BinaryFile(file): """Binary file @@ -48,15 +46,22 @@ - double: readDouble / writeDouble - packed data: readPacked(fmt) / writePacked(fmt, data) - quad (two int16): readQuad / writeQuad) + - NULL: read0 / write0 + - null string: readString0 / writeString0 (size is string + NULL) + - uru string: readUruString(version), writeUruString + - string w/ 16bit size header: readString16(null terminated) / writeString16 + - string w/ 32bit size header: readString32(null terminated) / writeString32 For conveniance the class has a size() method - - The class is using some optimization tricks like using _struct.Struct - directly and binding functions to the local namespace of a method. + + The class is using some optimization tricks like binding functions to the + local namespace of a method. """ def __new__(cls, fname, mode='rb'): assert 'b' in mode - return file.__new__(cls, fname, mode) + self = file.__new__(cls, fname, mode) + self.NULL = '\x00' + return self def size(self): pos = self.tell() @@ -66,93 +71,296 @@ finally: self.seek(pos) - def readChar(self, __unpack=Struct('<c').unpack): - return __unpack(self.read(1))[0] + def readChar(self, _unpack=unpack): + return _unpack('<c', self.read(1))[0] - def readByte(self, __unpack=Struct('<B').unpack): - return __unpack(self.read(1))[0] + def readByte(self, _unpack=unpack): + return _unpack('<B',self.read(1))[0] - def readBool(self, __unpack=Struct('<B').unpack): - return bool(__unpack(self.read(1))[0]) + def readBool(self, _unpack=unpack): + return bool(_unpack('<B', self.read(1))[0]) - def read8(self, __unpack=Struct('<B').unpack): - return __unpack(self.read(1))[0] + def read8(self, _unpack=unpack): + return _unpack('<B', self.read(1))[0] - def read8s(self, __unpack=Struct('<b').unpack): - return __unpack(self.read(1))[0] + def read8s(self, _unpack=unpack): + return _unpack('<b', self.read(1))[0] - def read16(self, __unpack=Struct('<H').unpack): - return __unpack(self.read(2))[0] + def read16(self, _unpack=unpack): + return _unpack('<H', self.read(2))[0] - def read16s(self, __unpack=Struct('<h').unpack): - return __unpack(self.read(2))[0] + def read16s(self, _unpack=unpack): + return _unpack('<h', self.read(2))[0] - def read32(self, __unpack=Struct('<I').unpack): - return __unpack(self.read(4))[0] + def read32(self, _unpack=unpack): + return _unpack('<I', self.read(4))[0] - def read32s(self, __unpack=Struct('<i').unpack): - return __unpack(self.read(4))[0] + def read32s(self, _unpack=unpack): + return _unpack('<i', self.read(4))[0] - def read64(self, __unpack=Struct('<Q').unpack): - return __unpack(self.read(8))[0] + def read64(self, _unpack=unpack): + return _unpack('<Q', self.read(8))[0] - def read64s(self, __unpack=Struct('<q').unpack): - return __unpack(self.read(8))[0] + def read64s(self, _unpack=unpack): + return _unpack('<q',self.read(8))[0] - def readQuad(self, __unpack=Struct('<2I').unpack): - return __unpack(self.read(8)) + def readQuad(self, _unpack=unpack): + return _unpack('<2I', self.read(8)) - def readFloat(self, __unpack=Struct('<f').unpack): - return __unpack(self.read(4))[0] + def readFloat(self, _unpack=unpack): + return _unpack('<f', self.read(4))[0] - def readDouble(self, __unpack=Struct('<d').unpack): - return __unpack(self.read(8))[0] + def readDouble(self, _unpack=unpack): + return _unpack('<d', self.read(8))[0] - def readPacked(self, fmt): + def readPacked(self, fmt, _unpack=unpack): return unpack(fmt, self.read(calcsize(fmt))) + def read0(self): + null = self.read(1) + if null != self.NULL: + raise ValueError("%s != NULL at %i" % (null, self.tell()-1)) + return null + + def readUruString(self, version=5): + return UruString('', version=version).readfd(self) + + def readString0(self, size): + s = self.read(size-1) + self.read0() + return s + + def readString16(self, terminate=False): + return String16('', terminate=terminate).readfd(self) + + def readString32(self, terminate=False): + return String32('', terminate=terminate).readfd(self) + #write - def writeChar(self, data, __pack=Struct('<c').pack): - self.write(__pack(data)) + def writeChar(self, data, _pack=pack): + self.write(_pack('<c', data)) - def writeByte(self, data, __pack=Struct('<B').pack): - self.write(__pack(data)) + def writeByte(self, data, _pack=pack): + self.write(_pack('<B', data)) - def writeBool(self, data, __pack=Struct('<B').pack): - self.write(__pack(data)) + def writeBool(self, data, _pack=pack): + self.write(_pack('<B', bool(data))) - def write8(self, data, __pack=Struct('<B').pack): - self.write(__pack(data)) + def write8(self, data, _pack=pack): + self.write(_pack('<B', data)) - def write8s(self, data, __pack=Struct('<b').pack): - self.write(__pack(data)) + def write8s(self, data, _pack=pack): + self.write(_pack('<b', data)) - def write16(self, data, __pack=Struct('<H').pack): - self.write(__pack(data)) + def write16(self, data, _pack=pack): + self.write(_pack('<H', data)) - def write16s(self, data, __pack=Struct('<h').pack): - self.write(__pack(data)) + def write16s(self, data, _pack=pack): + self.write(_pack('<h', data)) - def write32(self, data, __pack=Struct('<I').pack): - self.write(__pack(data)) + def write32(self, data, _pack=pack): + self.write(_pack('<I', data)) - def write32s(self, data, __pack=Struct('<i').pack): - self.write(__pack(data)) + def write32s(self, data, _pack=pack): + self.write(_pack('<i', data)) - def write64(self, data, __pack=Struct('<Q').pack): - self.write(__pack(data)) + def write64(self, data, _pack=pack): + self.write(_pack('<Q', data)) - def write64s(self, data, __pack=Struct('<q').pack): - self.write(__pack(data)) + def write64s(self, data, _pack=pack): + self.write(_pack('<q', data)) - def writeQuad(self, data, __pack=Struct('<2I').pack): - self.write(__pack(data)) + def writeQuad(self, tupl, _pack=pack): + self.write(_pack('<2I', *tupl)) - def writeFloat(self, data, __pack=Struct('<f').pack): - self.write(__pack(data)) + def writeFloat(self, data, _pack=pack): + self.write(_pack('<f', data)) - def writeDouble(self, data, __pack=Struct('<d').pack): - self.write(__pack(data)) + def writeDouble(self, data, _pack=pack): + self.write(_pack('<d', data)) + def write0(self): + self.write(self.NULL) + + def writeString0(self, s): + self.write(s) + self.write0() + def writePacked(self, data, fmt): - return self.write(pack(fmt, data)) + self.write(pack(fmt, data)) + + def writeUruString(self, data, version=5): + UruString(data, version=version).writefd(self) + + def writeString16(self, data, terminate=False): + String16(data, terminate=terminate).writefd(self) + + def writeString32(self, data, terminate=False): + String32(data, terminate=terminate).writefd(self) + +class AbstractString(object): + """Abstract string class + """ + def __init__(self, s=''): + self._data = s + + def readfd(self, fd): + raise NotImplementedError + + def writefd(self, fd): + raise NotImplementedError + + def clear(self): + """Clear data + """ + self._data = '' + + def set(self, urustr): + """Replace current data with urustr + """ + self._data = urustr + + def __repr__(self): + """repr(self) + """ + return ("<%s at %x (%i)" % (self.__class__.__name__, id(self), + len(self))) + + def __len__(self): + """len(self) + """ + return len(self._data) + + def __cmp__(self, other): + if isinstance(other, AbstractString): + return cmp(self._data, other._data) + else: + return cmp(self._data, other) + +class UruString(AbstractString): + """Uru Safe String + + The algorithm is based on Alcug's Ustr. This version is optimized to + copy and convert as less data as possible. + + version 0 - normal str + version 1 - auto (normal/inverted) + version 5 - inverted + version 6 - myst5 + """ + MYST5KEY = [ord(s) for s in "mystnerd"] + + def __init__(self, urustr='', version=1): + AbstractString.__init__(self, urustr) + self.version = version + + def _setVersion(self, version): + assert version in (0, 1, 5, 6) + self._version = version + + def _getVersion(self): + return self._version + + version = property(_getVersion, _setVersion) + + def setInverted(self, b): + """Set inverted flag + """ + if b: + self.version=5 + else: + self.version=0 + + def writefd(self, fd): + """Write uru string to a file + """ + if self.version == 1: + raise RuntimeError("Version is not explicit") + size = len(self._data) + if size > 1024: # XXX: ??? + raise ValueError("string is too long: %i" % size) + if self.version == 5: + size |= 0xF000 + data = ''.join([chr(ord(d) ^ 0xff) for d in self._data]) + elif self.version == 6: + data = ''.join([chr(ord(d) ^ self.MYST5KEY[i%8]) + for i, d in enumerate(self._data)]) + else: + data = self._data + fd.write16(size) + fd.write(data) + + def readfd(self, fd): + """Read uru string from a file + """ + size = fd.read16() + if self.version == 1: + inv = (size & 0xF000) == 0xF000 + self.version = 0 if not inv else 5 + if self.version in (0, 5): + size = size & 0x0FFF + if size > 1024: # XXX: ??? + raise ValueError("size '%i' > 1024 at position %s(%s)" % + (size, fd.tell(), repr(fd))) + if self.version == 5: + # XXX: testme + # read data as tuple of integeres + data = fd.readPacked("<%iI" % size) + # OR integers with 0xff and write their char equivalent to string + result = ''.join([chr(d ^ 0xff) for d in data]) + elif self.version == 6: + data = fd.readPacked("<%iI" % size) + result = ''.join([chr(d ^ self.MYST5KEY[i%8]) + for i, d in enumerate(data)]) + else: + result = fd.read(size) + self._data = result + return result + +class String32(AbstractString): + """String with 32 bit size header + """ + def __init__(self, s='', terminate=False): + AbstractString.__init__(self, s) + self._terminate = bool(terminate) + + def readfd(self, fd): + size = fd.read32() + if self._terminate: + self._data = fd.readString0(size) + else: + self._data = fd.read(size) + return self._data + + def writefd(self, fd): + size = len(self) + if self._terminate: + fd.write32(size+1) + fd.writeString0(self._data) + else: + fd.write32(size) + fd.write(self._data) + +class String16(AbstractString): + """String with 16 bit size header + """ + def __init__(self, s='', terminate=False): + AbstractString.__init__(self, s) + self._terminate = bool(terminate) + + def readfd(self, fd): + size = fd.read16() + if self._terminate: + self._data = fd.readString0(size) + else: + self._data = fd.read(size) + return self._data + + def writefd(self, fd): + size = len(self) + if self._terminate: + fd.write16(size+1) + fd.writeString0(self._data) + else: + fd.write16(size) + fd.write(self._data) Property changes on: pymoul/trunk/src/moul/crypt/binary.py ___________________________________________________________________ Name: svn:keywords + Id Revision Name: svn:eol-style + native Added: pymoul/trunk/src/moul/crypt/tests/test_binary.py =================================================================== --- pymoul/trunk/src/moul/crypt/tests/test_binary.py (rev 0) +++ pymoul/trunk/src/moul/crypt/tests/test_binary.py 2007-02-10 13:14:18 UTC (rev 157) @@ -0,0 +1,148 @@ +# pyMoul - Python interface to Myst Online URU Live +# Copyright (C) 2007 Christian Heimes <christian (at) cheimes (dot) de> + +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +# more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., 59 +# Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +"""moul.crypt.binary unit tests +""" +__author__ = "Christian Heimes" +__version__ = "$Id$" +__revision__ = "$Revision$" + +import os +import unittest +from doctest import DocTestSuite +from tempfile import mkstemp + +from moul.crypt.binary import BinaryFile + +class BinaryFileTest(unittest.TestCase): + def setUp(self): + self.tmpname = mkstemp()[1] + self.b = BinaryFile(self.tmpname, 'wb+') + + def tearDown(self): + self.b.close() + os.unlink(self.tmpname) + + def _testrw(self, name, data): + #import pdb; pdb.set_trace() + read = getattr(self.b, 'read%s' % name) + write = getattr(self.b, 'write%s' % name) + write(data) + self.b.seek(0) + fdata = read() + self.failUnlessEqual(data, fdata) + + def test_char(self): + self._testrw('Char', 'a') + + def test_byte(self): + self._testrw('Byte', 127) + + def test_bool(self): + self._testrw('Bool', True) + + def test_8(self): + self._testrw('8', 42) + + def test_8s(self): + self._testrw('8s', -42) + + def test_16(self): + self._testrw('16', 2**15) + + def test_16s(self): + self._testrw('16s', -2**15) + + def test_32(self): + self._testrw('32', 2*31) + + def test_32s(self): + self._testrw('32s', -2*31) + + def test_64(self): + self._testrw('64', 2*63) + + def test_64s(self): + self._testrw('64s', -2*63) + + def test_float(self): + data = -0.07 + self.b.writeFloat(data) + self.b.seek(0) + self.failUnlessAlmostEqual(data, self.b.readFloat()) + + def test_double(self): + self._testrw('Double', -23*10e200) + + def test_quad(self): + data = (23, 42) + self.b.writeQuad(data) + self.b.seek(0) + self.failUnlessEqual(data, self.b.readQuad()) + + def test_urustring(self): + # XXX: no test data + pass + + def test_string0(self): + s = "a test string" + l = len(s) + self.b.writeString0(s) + self.b.seek(0) + self.failUnlessEqual(self.b.size(), l+1) + self.failUnlessEqual(self.b.readString0(l+1), s) + self.b.seek(0) + self.failUnlessEqual(self.b.read(), s+'\x00') + + def test_string16(self): + s = "a test string" + l = len(s) + self.b.writeString16(s, terminate=False) + self.b.seek(0) + self.failUnlessEqual(self.b.size(), l+2) + self.failUnlessEqual(self.b.readString16(terminate=False), s) + + self.b.seek(0) + self.b.truncate(0) + self.b.writeString16(s, terminate=True) + self.b.seek(0) + self.failUnlessEqual(self.b.size(), l+3) + self.failUnlessEqual(self.b.readString16(terminate=True), s) + + def test_string32(self): + s = "a test string" + l = len(s) + self.b.writeString32(s, terminate=False) + self.b.seek(0) + self.failUnlessEqual(self.b.size(), l+4) + self.failUnlessEqual(self.b.readString32(terminate=False), s) + + self.b.seek(0) + self.b.truncate(0) + self.b.writeString32(s, terminate=True) + self.b.seek(0) + self.failUnlessEqual(self.b.size(), l+5) + self.failUnlessEqual(self.b.readString32(terminate=True), s) + + +def test_suite(): + return unittest.TestSuite(( + unittest.makeSuite(BinaryFileTest), + )) + +if __name__ == '__main__': + unittest.main(defaultTest="test_suite") Property changes on: pymoul/trunk/src/moul/crypt/tests/test_binary.py ___________________________________________________________________ Name: svn:keywords + Id Revision Name: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ti...@us...> - 2007-02-08 20:03:37
|
Revision: 156 http://pymoul.svn.sourceforge.net/pymoul/?rev=156&view=rev Author: tiran Date: 2007-02-08 12:02:58 -0800 (Thu, 08 Feb 2007) Log Message: ----------- Added binary file class Updated languages Updated XXX report and Readme Modified Paths: -------------- pymoul/trunk/README.txt pymoul/trunk/doc/TODO.txt pymoul/trunk/doc/XXXreport.html pymoul/trunk/src/moul/crypt/elf.py pymoul/trunk/src/moul/crypt/whatdoyousee.py pymoul/trunk/src/moul/metadata.py pymoul/trunk/src/moul/qt/i18n/pymoul_de.ts pymoul/trunk/src/moul/qt/i18n/pymoul_es.ts pymoul/trunk/src/moul/qt/i18n/pymoul_fr.ts pymoul/trunk/src/moul/qt/i18n/pymoul_it.ts pymoul/trunk/src/moul/qt/i18n/pymoul_nl.ts Added Paths: ----------- pymoul/trunk/src/moul/crypt/binary.py Modified: pymoul/trunk/README.txt =================================================================== --- pymoul/trunk/README.txt 2007-02-07 15:01:15 UTC (rev 155) +++ pymoul/trunk/README.txt 2007-02-08 20:02:58 UTC (rev 156) @@ -8,6 +8,29 @@ pyMoul is a set of Python libraries around MOUL (Myst Online : Uru Live). At the moment the main focus is on the Qt4 based graphical tool. +Bug reporting and feature requests +================================== + +Please do not mail me bug reports or feature requests. You should use the bug +and feature tracker at http://sourceforge.net/projects/pymoul instead. Do not +forget to include a log file! The location of the log file is stated in the +about tab of pyMoul. + +GnuPG / PGP +=========== + +Every released file is signed with my GPG key 0xAD16AB1B for security reasons. +You can grab my keys from http://cheimes.de/heimes.asc. + +Anti virus +========== + +The windows builds are scanned for viruses and trojaners with the personal +edition of Avira AntiVir (formally known as H+BEDV AntiVir) +http://www.freeav.de/. Although the files are scanned under Windows and Linux +and my Windows box is kept up to date I cannot gurantee that the files are +clean. + Donate ====== @@ -15,5 +38,4 @@ use the link below to send me money over PayPal. You don't need a PayPal account. A credit card or bank account is sufficient. -https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=christian%40cheimes%2ede&item_name=Donate%20for%20Tiran%27s%20open%20source%20activities&page_style=PayPal&no_shipping=2&cn=Your%20note%20for%20me&tax=0¤cy_code=EUR&lc=DE&bn=PP%2dDonationsBF&charset=UTF%2d8 - +https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=christian%40cheimes%2ede&item_name=Donate%20for%20Tiran%27s%20open%20source%20activities&page_style=PayPal&no_shipping=0&cn=Your%20note%20for%20me&tax=0¤cy_code=EUR&lc=DE&bn=PP%2dDonationsBF&charset=UTF%2d8 Modified: pymoul/trunk/doc/TODO.txt =================================================================== --- pymoul/trunk/doc/TODO.txt 2007-02-07 15:01:15 UTC (rev 155) +++ pymoul/trunk/doc/TODO.txt 2007-02-08 20:02:58 UTC (rev 156) @@ -6,13 +6,19 @@ ----------- * get official OK from Chogon - * API for create Uru Live directory with config files with default values. * integrate log zipper - * integrate chat archiver - * complete chatlog viewer * more checks and exceptions! Never fail silentely * update readme.txt * connect QThread.terminate() slots with its parents close/destroy signal handler * clean documents/journal/localization naming + * table model for PING tab +future +------ + + * better chatlog viewer + * ElementTree based generator chatlog xml and color coded html + * more unit tests + * more epydoc strings + * UI enhancements like whatisthis bubbles and accelerators Modified: pymoul/trunk/doc/XXXreport.html =================================================================== --- pymoul/trunk/doc/XXXreport.html 2007-02-07 15:01:15 UTC (rev 155) +++ pymoul/trunk/doc/XXXreport.html 2007-02-08 20:02:58 UTC (rev 156) @@ -3,7 +3,7 @@ <body> <h1>pyMoul - Developer report tools: XXX/TODO/FIXME comments</h1> -<p>Generated on Tue, 06 Feb 2007 18:05:35 CET, based on Zope 3's XXX report</p> +<p>Generated on Wed, 07 Feb 2007 16:03:30 CET, based on Zope 3's XXX report</p> <hr> <h3>Summary</h3> <p> @@ -27,10 +27,10 @@ base-691- from zope.tales.tales import TALESTracebackSupplement base-692- from zope.pagetemplate.pagetemplate \ base-693- import PageTemplateTracebackSupplement -</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/chatlog.py.svn-base:208</b><br/><pre> # TODO: inefficient, compare list with directory content -base-209- if not os.path.isdir(self._logdir): -base-210- LOG.warning("%s is not a directory" % logdir) -base-211- return +</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/chatlog.py.svn-base:216</b><br/><pre> # TODO: inefficient, compare list with directory content +base-217- if not os.path.isdir(self._archivedir): +base-218- LOG.warning("%s is not a directory" % self._archivedir) +base-219- return </pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/kiimage.py.svn-base:112</b><br/><pre> # XXX use struct base-113- if header is None: base-114- fd = self._fd @@ -91,10 +91,10 @@ fd = open(os.path.join(path, fname), 'wb') fd.write('dummy') fd.close() -</pre></li><li><b>File: utilities/../src/moul/file/chatlog.py:208</b><br/><pre> # TODO: inefficient, compare list with directory content - if not os.path.isdir(self._logdir): - LOG.warning("%s is not a directory" % logdir) - return +</pre></li><li><b>File: utilities/../src/moul/file/chatlog.py:216</b><br/><pre> # TODO: inefficient, compare list with directory content + if not os.path.isdir(self._archivedir): + LOG.warning("%s is not a directory" % self._archivedir) + return </pre></li><li><b>File: utilities/../src/moul/file/kiimage.py:112</b><br/><pre> # XXX use struct if header is None: fd = self._fd @@ -143,10 +143,10 @@ class GraphicsIni(ConfFile): _filename = 'graphics.ini' -</pre></li><li><b>File: utilities/../src/moul/file/chatlog.py~:208</b><br/><pre> # TODO: inefficient, compare list with directory content - if not os.path.isdir(logdir): - LOG.warning("%s is not a directory" % logdir) - return +</pre></li><li><b>File: utilities/../src/moul/file/chatlog.py~:216</b><br/><pre> # TODO: inefficient, compare list with directory content + if not os.path.isdir(self._archivedir): + LOG.warning("%s is not a directory" % self._archivedir) + return </pre></li><li><b>File: utilities/../src/moul/file/directory.py:59</b><br/><pre> # TODO: fnmatch return len([name for name in os.listdir(path) if os.path.isfile(os.path.join(path, name))]) @@ -179,93 +179,93 @@ raise NotImplementedError def decipher(crypt, size, key): -</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:149</b><br/><pre> # FIXME: signal doesn't do anything -base-150- self.emit(SIGNAL("close()")) -base-151- event.accept() -base-152- event.ignore() -</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:250</b><br/><pre> del self._kiimage_threadlet# TODO: other message box -base-251- del self._kiimage_progressbar -base-252- self.pb_kiimage_repair.setEnabled(True) -base-253- mb = qtutils.infoMB(self, -</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:345</b><br/><pre> # TODO: change timer from every second to every minute -base-346- self._timezone_timer = timer = QtCore.QTimer(self) -base-347- timer.setInterval(1000) # 1 sec -base:348: # TODO: needs optimization? run only when timer tab is active -base-349- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout) -base-350- timer.start() -base-351- -</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:442</b><br/><pre> # TODO: thread safety! -base-443- self.servers = servers -base-444- if not self.isRunning(): -base-445- self.start() -</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:448</b><br/><pre> # TODO: thread safety! -base-449- # emit a list of names first -base-450- for server in self.servers: -base-451- self.emit(SIGNAL("server(const QString&)"), server.name) -</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:484</b><br/><pre> # TODO check this -base-485- self._running = False -base-486- self.condition.wakeAll() -base-487- -</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/errorhandler.py.svn-base:46</b><br/><pre> # TODO: translation aware -base-47- LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback)) -base-48- if not getattr(sys, 'frozen', False): -base-49- return -</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:149</b><br/><pre> # FIXME: signal doesn't do anything +</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:152</b><br/><pre> # FIXME: signal doesn't do anything +base-153- self.emit(SIGNAL("close()")) +base-154- event.accept() +base-155- event.ignore() +</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:291</b><br/><pre> del self._kiimage_threadlet# TODO: other message box +base-292- del self._kiimage_progressbar +base-293- self.pb_kiimage_repair.setEnabled(True) +base-294- mb = qtutils.infoMB(self, +</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:390</b><br/><pre> # TODO: change timer from every second to every minute +base-391- self._timezone_timer = timer = QtCore.QTimer(self) +base-392- timer.setInterval(1000) # 1 sec +base:393: # TODO: needs optimization? run only when timer tab is active +base-394- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout) +base-395- timer.start() +base-396- +</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:487</b><br/><pre> # TODO: thread safety! +base-488- self.servers = servers +base-489- if not self.isRunning(): +base-490- self.start() +</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:493</b><br/><pre> # TODO: thread safety! +base-494- # emit a list of names first +base-495- for server in self.servers: +base-496- self.emit(SIGNAL("server(const QString&)"), server.name) +</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:531</b><br/><pre> # TODO check this +base-532- self._running = False +base-533- self.condition.wakeAll() +base-534- +</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/errorhandler.py.svn-base:45</b><br/><pre> # TODO: translation aware +base-46- LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback)) +base-47- if getattr(sys, 'frozen', False): +base-48- try: +</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:151</b><br/><pre> # FIXME: signal doesn't do anything self.emit(SIGNAL("close()")) event.accept() event.ignore() -</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:250</b><br/><pre> del self._kiimage_threadlet# TODO: other message box +</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:290</b><br/><pre> del self._kiimage_threadlet# TODO: other message box del self._kiimage_progressbar self.pb_kiimage_repair.setEnabled(True) mb = qtutils.infoMB(self, -</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:345</b><br/><pre> # TODO: change timer from every second to every minute +</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:389</b><br/><pre> # TODO: change timer from every second to every minute self._timezone_timer = timer = QtCore.QTimer(self) timer.setInterval(1000) # 1 sec self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout) timer.start() -</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:442</b><br/><pre> # TODO: thread safety! +</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:486</b><br/><pre> # TODO: thread safety! self.servers = servers if not self.isRunning(): self.start() -</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:448</b><br/><pre> # TODO: thread safety! +</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:492</b><br/><pre> # TODO: thread safety! # emit a list of names first for server in self.servers: self.emit(SIGNAL("server(const QString&)"), server.name) -</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:484</b><br/><pre> # TODO check this +</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:530</b><br/><pre> # TODO check this self._running = False self.condition.wakeAll() -</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:149</b><br/><pre> # FIXME: signal doesn't do anything +</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:152</b><br/><pre> # FIXME: signal doesn't do anything self.emit(SIGNAL("close()")) event.accept() event.ignore() -</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:250</b><br/><pre> del self._kiimage_threadlet# TODO: other message box +</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:291</b><br/><pre> del self._kiimage_threadlet# TODO: other message box del self._kiimage_progressbar self.pb_kiimage_repair.setEnabled(True) mb = qtutils.infoMB(self, -</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:345</b><br/><pre> # TODO: change timer from every second to every minute +</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:390</b><br/><pre> # TODO: change timer from every second to every minute self._timezone_timer = timer = QtCore.QTimer(self) timer.setInterval(1000) # 1 sec self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout) timer.start() -</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:442</b><br/><pre> # TODO: thread safety! +</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:487</b><br/><pre> # TODO: thread safety! self.servers = servers if not self.isRunning(): self.start() -</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:448</b><br/><pre> # TODO: thread safety! +</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:493</b><br/><pre> # TODO: thread safety! # emit a list of names first for server in self.servers: self.emit(SIGNAL("server(const QString&)"), server.name) -</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:484</b><br/><pre> # TODO check this +</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:531</b><br/><pre> # TODO check this self._running = False self.condition.wakeAll() -</pre></li><li><b>File: utilities/../src/moul/qt/errorhandler.py:46</b><br/><pre> # TODO: translation aware +</pre></li><li><b>File: utilities/../src/moul/qt/errorhandler.py:45</b><br/><pre> # TODO: translation aware LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback)) - if not getattr(sys, 'frozen', False): - return + if getattr(sys, 'frozen', False): + try: </pre></li><li><b>File: utilities/../src/moul/osdependent/__init__.py:120</b><br/><pre># XXX: what about cygwin, bsd and others? _thismodule = sys.modules[__name__] if __WIN32__: @@ -290,752 +290,1095 @@ base-27-base-691- from zope.tales.tales import TALESTracebackSupplement base-28-base-692- from zope.pagetemplate.pagetemplate \ base-29-base-693- import PageTemplateTracebackSupplement -base:30:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/chatlog.py.svn-base:280</b><br/><pre> # TODO: add parser, currently simply iterates over the file -base-31-base-281- return iter(self._fd) -base:32:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/kiimage.py.svn-base:112</b><br/><pre> # XXX use struct -base-33-base-113- if header is None: -base-34-base-114- fd = self._fd -base-35-base-115- fd.seek(0) -base:36:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/kiimage.py.svn-base:127</b><br/><pre> # XXX use struct -base-37-base-128- if size is None: -base-38-base-129- size = self.getFileSize() -base-39-base-130- leading = 4* [None] -base:40:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/kiimage.py.svn-base:267</b><br/><pre> # XXX: move checks to copy method! -base-41-base-268- if os.path.isfile(fixed): -base-42-base-269- if fixedNewer(ki, fixed): -base-43-base-270- LOG.debug("File %s exists but was changed." % name) -base:44:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/wdysini.py.svn-base:157</b><br/><pre> # TODO: write me -base-45-base-158- pass -base-46-base-159- -base-47-base-160-class Constrain(object): -base:48:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/wdysini.py.svn-base:541</b><br/><pre> 'Audio.SetDeviceName' : (QuotedString, Constrain()), # TODO: add check -base-49-base-542- 'Audio.SetChannelVolume GUI' : (FloatString, MinMax(0.0, 1.0)), # 0-100%, no ui -base-50-base-543- # microphon missing -> OS mixer -base-51-base-544- } -base:52:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/wdysini.py.svn-base:629</b><br/><pre> # TODO: microphon needs an extra handler. The mic slider changes the OS mixer. -base-53-base-630- -base-54-base-631-class GraphicsIni(ConfFile): -base-55-base-632- _filename = 'graphics.ini' -base:56:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/directory.py.svn-base:59</b><br/><pre> # TODO: fnmatch -base-57-base-60- return len([name for name in os.listdir(path) -base-58-base-61- if os.path.isfile(os.path.join(path, name))]) -base-59-base-62- -base:60:</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/test_wdysini.py.svn-base:105</b><br/><pre> # TODO: more -base-61-base-106- -base-62-base-107- def test_publicapi_create(self): -base-63-base-108- inipath = os.path.join(self.tmpdir, os.path.basename(self.enc)) -base:64:</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/test_wdysini.py.svn-base:116</b><br/><pre> # TODO: more -base-65-base-117- -base-66-base-118-class AudioIniTest(GenericIniTest): -base-67-base-119- enc = aud_enc -base:68:</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/test_wdysini.py.svn-base:154</b><br/><pre> #XXX self.failIf(p.isChanged()) -base-69-base-155- -base-70-base-156- p.screenres = 0 -base-71-base-157- eq(p._get('Graphics.Width'), 800) -base:72:</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/utils.py.svn-base:80</b><br/><pre> for fname in ('UruLauncher.exe', 'UruExplorer.exe'): # XXX: win32 -base-73-base-81- fd = open(os.path.join(path, fname), 'wb') -base-74-base-82- fd.write('dummy') -base-75-base-83- fd.close() -base:76:</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py:105</b><br/><pre> # TODO: more -base-77- -base-78- def test_publicapi_create(self): -base-79- inipath = os.path.join(self.tmpdir, os.path.basename(self.enc)) -base:80:</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py:116</b><br/><pre> # TODO: more -base-81- -base-82-class AudioIniTest(GenericIniTest): -base-83- enc = aud_enc -base:84:</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py:154</b><br/><pre> #XXX self.failIf(p.isChanged()) -base-85- -base-86- p.screenres = 0 -base-87- eq(p._get('Graphics.Width'), 800) -base:88:</pre></li><li><b>File: utilities/../src/moul/file/tests/utils.py:80</b><br/><pre> for fname in ('UruLauncher.exe', 'UruExplorer.exe'): # XXX: win32 -base-89- fd = open(os.path.join(path, fname), 'wb') -base-90- fd.write('dummy') -base-91- fd.close() -base:92:</pre></li><li><b>File: utilities/../src/moul/file/chatlog.py:280</b><br/><pre> # TODO: add parser, currently simply iterates over the file -base-93- return iter(self._fd) -base:94:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py:112</b><br/><pre> # XXX use struct -base-95- if header is None: -base-96- fd = self._fd -base-97- fd.seek(0) -base:98:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py:127</b><br/><pre> # XXX use struct -base-99- if size is None: -base-100- size = self.getFileSize() -base-101- leading = 4* [None] -base:102:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py:267</b><br/><pre> # XXX: move checks to copy method! -base-103- if os.path.isfile(fixed): -base-104- if fixedNewer(ki, fixed): -base-105- LOG.debug("File %s exists but was changed." % name) -base:106:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py:157</b><br/><pre> # TODO: write me -base-107- pass -base-108- -base-109-class Constrain(object): -base:110:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py:541</b><br/><pre> 'Audio.SetDeviceName' : (QuotedString, Constrain()), # TODO: add check -base-111- 'Audio.SetChannelVolume GUI' : (FloatString, MinMax(0.0, 1.0)), # 0-100%, no ui -base-112- # microphon missing -> OS mixer -base-113- } -base:114:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py:629</b><br/><pre> # TODO: microphon needs an extra handler. The mic slider changes the OS mixer. -base-115- -base-116-class GraphicsIni(ConfFile): -base-117- _filename = 'graphics.ini' -base:118:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py~:112</b><br/><pre> # XXX use struct -base-119- if header is None: -base-120- fd = self._fd -base-121- fd.seek(0) -base:122:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py~:127</b><br/><pre> # XXX use struct -base-123- if size is None: -base-124- size = self.getFileSize() -base-125- leading = 4* [None] -base:126:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py~:267</b><br/><pre> # XXX: move checks to copy method! -base-127- if os.path.isfile(fixed): -base-128- if fixedNewer(ki, fixed): -base-129- LOG.debug("File %s exists but was changed." % name) -base:130:</pre></li><li><b>File: utilities/../src/moul/file/chatlog.py~:280</b><br/><pre> # TODO: add parser, currently simply iterates over the file -base-131- return iter(self._fd) -base:132:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py~:156</b><br/><pre> # TODO: write me -base-133- pass -base-134- -base-135-class Constrain(object): -base:136:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py~:540</b><br/><pre> 'Audio.SetDeviceName' : (QuotedString, Constrain()), # TODO: add check -base-137- 'Audio.SetChannelVolume GUI' : (FloatString, MinMax(0.0, 1.0)), # 0-100%, no ui -base-138- # microphon missing -> OS mixer -base-139- } -base:140:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py~:628</b><br/><pre> # TODO: microphon needs an extra handler. The mic slider changes the OS mixer. -base-141- -base-142-class GraphicsIni(ConfFile): -base-143- _filename = 'graphics.ini' -base:144:</pre></li><li><b>File: utilities/../src/moul/file/directory.py:59</b><br/><pre> # TODO: fnmatch -base-145- return len([name for name in os.listdir(path) -base-146- if os.path.isfile(os.path.join(path, name))]) -base-147- -base:148:</pre></li><li><b>File: utilities/../src/moul/file/directory.py~:59</b><br/><pre> # TODO: fnmatch -base-149- return len([name for name in os.listdir(path) -base-150- if os.path.isfile(os.path.join(path, name))]) -base-151- -base:152:</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/whatdoyousee.py.svn-base:77</b><br/><pre> # XXX: dos format -base-153-base-78- return data.replace("\r\n", "\n") -base-154-base-79- -base-155-base-80-def encryptWDYS(instr, fout): -base:156:</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/whatdoyousee.py.svn-base:87</b><br/><pre> # XXX: dos format -base-157-base-88- instr = instr.replace("\n", "\r\n") -base-158-base-89- fout.seek(0) -base-159-base-90- fout.write(HEADER) -base:160:</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/elf.py.svn-base:71</b><br/><pre> # XXX NotImplemented -base-161-base-72- raise NotImplementedError -base-162-base-73- -base-163-base-74-def decipher(crypt, size, key): -base:164:</pre></li><li><b>File: utilities/../src/moul/crypt/whatdoyousee.py:77</b><br/><pre> # XXX: dos format -base-165- return data.replace("\r\n", "\n") -base-166- -base-167-def encryptWDYS(instr, fout): -base:168:</pre></li><li><b>File: utilities/../src/moul/crypt/whatdoyousee.py:87</b><br/><pre> # XXX: dos format -base-169- instr = instr.replace("\n", "\r\n") -base-170- fout.seek(0) -base-171- fout.write(HEADER) -base:172:</pre></li><li><b>File: utilities/../src/moul/crypt/elf.py:71</b><br/><pre> # XXX NotImplemented -base-173- raise NotImplementedError -base-174- -base-175-def decipher(crypt, size, key): -base:176:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:151</b><br/><pre> # FIXME: signal doesn't do anything -base-177-base-152- self.emit(SIGNAL("close()")) -base-178-base-153- event.accept() -base-179-base-154- event.ignore() -base:180:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:222</b><br/><pre> # TODO: msg -base-181-base-223- return -base-182-base-224- -base-183-base-225- self.pb_kiimage_repair.setEnabled(False) -base:184:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:248</b><br/><pre> del self._kiimage_threadlet# TODO: other message box -base-185-base-249- del self._kiimage_progressbar -base-186-base-250- self.pb_kiimage_repair.setEnabled(True) -base:187:base:251: # TODO: msg -base-188-base-252- -base-189-base-253- # ************************************************************************ -base-190-base-254- # system tray -base:191:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:281</b><br/><pre> # TODO: needs optimization? run only when timer tab is active -base-192-base-282- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout) -base-193-base-283- timer.start() -base-194-base-284- -base:195:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:375</b><br/><pre> # TODO: thread safety! -base-196-base-376- self.servers = servers -base-197-base-377- if not self.isRunning(): -base-198-base-378- self.start() -base:199:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:381</b><br/><pre> # TODO: thread safety! -base-200-base-382- # emit a list of names first -base-201-base-383- for server in self.servers: -base-202-base-384- self.emit(SIGNAL("server(const QString&)"), server.name) -base:203:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:417</b><br/><pre> # TODO check this -base-204-base-418- self._running = False -base-205-base-419- self.condition.wakeAll() -base-206-base-420- -base:207:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/errorhandler.py.svn-base:46</b><br/><pre> # TODO: translation aware -base-208-base-47- LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback)) -base-209-base-48- if not getattr(sys, 'frozen', False): -base-210-base-49- return -base:211:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/wdysini.py.svn-base:67</b><br/><pre> self.context.emit(SIGNAL("audioini_load()")) # XXX: hard coded emit -base:212:base:68: self.context.emit(SIGNAL("graphicsini_load()")) # XXX: hard coded emit -base-213-base-69- -base-214-base-70- @pyqtSignature("bool") -base-215-base-71- def on_graphicsChanged(self, boolean): -base:216:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:143</b><br/><pre> # FIXME: signal doesn't do anything -base-217- self.emit(SIGNAL("close()")) -base-218- event.accept() -base-219- event.ignore() -base:220:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:214</b><br/><pre> # TODO: msg -base-221- return -base-222- -base-223- self.pb_kiimage_repair.setEnabled(False) -base:224:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:241</b><br/><pre> del self._kiimage_threadlet# TODO: other message box -base-225- del self._kiimage_progressbar -base-226- self.pb_kiimage_repair.setEnabled(True) -base-227- -</pre></li><li><b>File: utilities/../doc/.svn/text-base/XXXreport.html.svn-base:230</b><br/><pre></pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:288</b><br/><pre> # TODO: needs optimization? run only when timer tab is active -base-231- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout) -base-232- timer.start() -base-233- -base:234:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:382</b><br/><pre> # TODO: thread safety! -base-235- self.servers = servers -base-236- if not self.isRunning(): -base-237- self.start() -base:238:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:388</b><br/><pre> # TODO: thread safety! -base-239- # emit a list of names first -base-240- for server in self.servers: -base-241- self.emit(SIGNAL("server(const QString&)"), server.name) -base:242:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:424</b><br/><pre> # TODO check this -base-243- self._running = False -base-244- self.condition.wakeAll() -base-245- -base:246:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:143</b><br/><pre> # FIXME: signal doesn't do anything -base-247- self.emit(SIGNAL("close()")) -base-248- event.accept() -base-249- event.ignore() -base:250:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:214</b><br/><pre> # TODO: msg -base-251- return -base-252- -base-253- self.pb_kiimage_repair.setEnabled(False) -base:254:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:241</b><br/><pre> del self._kiimage_threadlet# TODO: other message box -base-255- del self._kiimage_progressbar -base-256- self.pb_kiimage_repair.setEnabled(True) -base-257- -</pre></li><li><b>File: utilities/../doc/.svn/text-base/XXXreport.html.svn-base:260</b><br/><pre></pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:288</b><br/><pre> # TODO: needs optimization? run only when timer tab is active -base-261- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout) -base-262- timer.start() -base-263- -base:264:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:382</b><br/><pre> # TODO: thread safety! -base-265- self.servers = servers -base-266- if not self.isRunning(): -base-267- self.start() -base:268:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:388</b><br/><pre> # TODO: thread safety! -base-269- # emit a list of names first -base-270- for server in self.servers: -base-271- self.emit(SIGNAL("server(const QString&)"), server.name) -base:272:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:424</b><br/><pre> # TODO check this -base-273- self._running = False -base-274- self.condition.wakeAll() -base-275- -base:276:</pre></li><li><b>File: utilities/../src/moul/qt/errorhandler.py:46</b><br/><pre> # TODO: translation aware -base-277- LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback)) -base-278- if not getattr(sys, 'frozen', False): -base-279- return -base:280:</pre></li><li><b>File: utilities/../src/moul/qt/errorhandler.py~:46</b><br/><pre> # TODO: translation aware -base-281- LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback)) -base-282- if not getattr(sys, 'frozen', False): -base-283- return -base:284:</pre></li><li><b>File: utilities/../src/moul/qt/wdysini.py~:68</b><br/><pre> self.context.emit(SIGNAL("audioini_load()")) # XXX: hard coded emit -base-285- -base-286- @signalLogDecorator(LOG) -base-287- @pyqtSignature("bool") -base:288:</pre></li><li><b>File: utilities/../src/moul/qt/wdysini.py:67</b><br/><pre> self.context.emit(SIGNAL("audioini_load()")) # XXX: hard coded emit -base-289- -base-290- @pyqtSignature("bool") -base-291- def on_graphicsChanged(self, boolean): -base:292:</pre></li><li><b>File: utilities/../src/moul/osdependent/__init__.py:117</b><br/><pre># XXX: what about cygwin, bsd and others? -base-293-_thismodule = sys.modules[__name__] -base-294-if __WIN32__: -base-295- from moul.osdependent import win32 as osdep_win32 -base:296:</pre></li><li><b>File: utilities/../src/moul/osdependent/.svn/text-base/__init__.py.svn-base:117</b><br/><pre># XXX: what about cygwin, bsd and others? -base-297-base-118-_thismodule = sys.modules[__name__] -base-298-base-119-if __WIN32__: -base-299-base-120- from moul.osdependent import win32 as osdep_win32 -base:300:</pre></li><li><b>File: utilities/../doc/.svn/text-base/XXXreport.html.svn-base:14</b><br/><pre><ol><li><b>File: utilities/../.svn/text-base/ez_setup.py.svn-base:92</b><br/><pre> # XXX could we install in a subprocess here? -base-301-base-15-base-93- print >>sys.stderr, ( -base-302-base-16-base-94- "The required version of setuptools (>=%s) is not available, and\n" -base-303-base-17-base-95- "can't be installed while this script is running. Please install\n" -base:304:base:18:</pre></li><li><b>File: utilities/../.svn/text-base/test.py.svn-base:548</b><br/><pre> # XXX bug: doctest may report several failures in one test, they are -base-305-base-19-base-549- # separated by a horizontal dash line. Only the first one of -base-306-base-20-base-550- # them is now colorized properly. -base-307-base-21-base-551- header = lines[0] -base:308:base:22:</pre></li><li><b>File: utilities/../.svn/text-base/test.py.svn-base:603</b><br/><pre> # TODO: Scrape and colorize the traceback. -base-309-base-23-base-604- result.append(self.colorize('doctest_got', line)) -base-310-base-24-base-605- elif remaining[0] == 'Differences (ndiff with -expected +actual):': -base-311-base-25-base-606- result.append(self.colorize('doctest_title', remaining.pop(0))) # E. raised: -base:312:base:26:</pre></li><li><b>File: utilities/../.svn/text-base/test.py.svn-base:623</b><br/><pre> # TODO: We only deal with the output from Zope 3's doctest module. -base-313-base-27-base-624- # A colorizer for the Python's doctest module would be nice too. -base-314-base-28-base-625- if doctest: -base-315-base-29-base-626- # If we have a doctest, we do not care about this header. All the -base:316:base:30:</pre></li><li><b>File: utilities/../.svn/text-base/test.py.svn-base:690</b><br/><pre> # TODO these should be hookable -base-317-base-31-base-691- from zope.tales.tales import TALESTracebackSupplement -base-318-base-32-base-692- from zope.pagetemplate.pagetemplate \ -base-319-base-33-base-693- import PageTemplateTracebackSupplement -base:320:base:34:</pre></li><li><b>File: utilities/../.svn/text-base/setup_win32.py.svn-base:84</b><br/><pre> pexe['innosetup'] = os.environ.get('INNOSETUP') # TODO: -base-321-base-35-base-85- pexe['inno_templates'] = "template.iss" -base-322-base-36-base-86- pexe['app_name'] = 'pyMoul' -base-323-base-37-base-87- pexe['includes'].extend(findPyTz()) -base:324:base:38:</pre></li><li><b>File: utilities/../.svn/text-base/distutils_upx.py.svn-base:117</b><br/><pre> sys.exit(retcode) # XXX -base-325-base-39-base-118- -base-326-base-40-base-119- def _upxAvailable(self): -base-327-base-41-base-120- """Search for UPX in search path -base:328:base:42:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/chatlog.py.svn-base:268</b><br/><pre> # TODO: add parser, currently simply iterates over the file -base-329-base-43-base-269- return iter(self._fd) -base:330:base:44:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/kiimage.py.svn-base:112</b><br/><pre> # XXX use struct -base-331-base-45-base-113- if header is None: -base-332-base-46-base-114- fd = self._fd -base-333-base-47-base-115- fd.seek(0) -base:334:base:48:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/kiimage.py.svn-base:127</b><br/><pre> # XXX use struct -base-335-base-49-base-128- if size is None: -base-336-base-50-base-129- size = self.getFileSize() -base-337-base-51-base-130- leading = 4* [None] -base:338:base:52:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/wdysini.py.svn-base:156</b><br/><pre> # TODO: write me -base-339-base-53-base-157- pass -base-340-base-54-base-158- -base-341-base-55-base-159-class Constrain(object): -base:342:base:56:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/wdysini.py.svn-base:540</b><br/><pre> 'Audio.SetDeviceName' : (QuotedString, Constrain()), # TODO: add check -base-343-base-57-base-541- 'Audio.SetChannelVolume GUI' : (FloatString, MinMax(0.0, 1.0)), # 0-100%, no ui -base-344-base-58-base-542- # microphon missing -> OS mixer -base-345-base-59-base-543- } -base:346:base:60:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/wdysini.py.svn-base:628</b><br/><pre> # TODO: microphon needs an extra handler. The mic slider changes the OS mixer. -base-347-base-61-base-629- -base-348-base-62-base-630-class GraphicsIni(ConfFile): -base-349-base-63-base-631- _filename = 'graphics.ini' -base:350:base:64:</pre></li><li><b>File: utilities/../src/moul/file/.svn/text-base/directory.py.svn-base:58</b><br/><pre> # TODO: fnmatch -base-351-base-65-base-59- return len([name for name in os.listdir(path) -base-352-base-66-base-60- if os.path.isfile(os.path.join(path, name))]) -base-353-base-67-base-61- -base:354:base:68:</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/test_wdysini.py.svn-base:104</b><br/><pre> # TODO: more -base-355-base-69-base-105- -base-356-base-70-base-106- def test_publicapi_create(self): -base-357-base-71-base-107- inipath = os.path.join(self.tmpdir, os.path.basename(self.enc)) -base:358:base:72:</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/test_wdysini.py.svn-base:115</b><br/><pre> # TODO: more -base-359-base-73-base-116- -base-360-base-74-base-117-class AudioIniTest(GenericIniTest): -base-361-base-75-base-118- enc = aud_enc -base:362:base:76:</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/test_wdysini.py.svn-base:153</b><br/><pre> #XXX self.failIf(p.isChanged()) -base-363-base-77-base-154- -base-364-base-78-base-155- p.screenres = 0 -base-365-base-79-base-156- eq(p._get('Graphics.Width'), 800) -base:366:base:80:</pre></li><li><b>File: utilities/../src/moul/file/tests/.svn/text-base/utils.py.svn-base:79</b><br/><pre> for fname in ('UruLauncher.exe', 'UruExplorer.exe'): # XXX: win32 -base-367-base-81-base-80- fd = open(os.path.join(path, fname), 'wb') -base-368-base-82-base-81- fd.write('dummy') -base-369-base-83-base-82- fd.close() -base:370:base:84:</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py:104</b><br/><pre> # TODO: more -base-371-base-85- -base-372-base-86- def test_publicapi_create(self): -base-373-base-87- inipath = os.path.join(self.tmpdir, os.path.basename(self.enc)) -base:374:base:88:</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py:115</b><br/><pre> # TODO: more -base-375-base-89- -base-376-base-90-class AudioIniTest(GenericIniTest): -base-377-base-91- enc = aud_enc -base:378:base:92:</pre></li><li><b>File: utilities/../src/moul/file/tests/test_wdysini.py:153</b><br/><pre> #XXX self.failIf(p.isChanged()) -base-379-base-93- -base-380-base-94- p.screenres = 0 -base-381-base-95- eq(p._get('Graphics.Width'), 800) -base:382:base:96:</pre></li><li><b>File: utilities/../src/moul/file/tests/utils.py:79</b><br/><pre> for fname in ('UruLauncher.exe', 'UruExplorer.exe'): # XXX: win32 -base-383-base-97- fd = open(os.path.join(path, fname), 'wb') -base-384-base-98- fd.write('dummy') -base-385-base-99- fd.close() -base:386:base:100:</pre></li><li><b>File: utilities/../src/moul/file/chatlog.py:268</b><br/><pre> # TODO: add parser, currently simply iterates over the file -base-387-base-101- return iter(self._fd) -base:388:base:102:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py:112</b><br/><pre> # XXX use struct -base-389-base-103- if header is None: -base-390-base-104- fd = self._fd -base-391-base-105- fd.seek(0) -base:392:base:106:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py:127</b><br/><pre> # XXX use struct -base-393-base-107- if size is None: -base-394-base-108- size = self.getFileSize() -base-395-base-109- leading = 4* [None] -base:396:base:110:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py:156</b><br/><pre> # TODO: write me -base-397-base-111- pass -base-398-base-112- -base-399-base-113-class Constrain(object): -base:400:base:114:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py:540</b><br/><pre> 'Audio.SetDeviceName' : (QuotedString, Constrain()), # TODO: add check -base-401-base-115- 'Audio.SetChannelVolume GUI' : (FloatString, MinMax(0.0, 1.0)), # 0-100%, no ui -base-402-base-116- # microphon missing -> OS mixer -base-403-base-117- } -base:404:base:118:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py:628</b><br/><pre> # TODO: microphon needs an extra handler. The mic slider changes the OS mixer. -base-405-base-119- -base-406-base-120-class GraphicsIni(ConfFile): -base-407-base-121- _filename = 'graphics.ini' -base:408:base:122:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py~:112</b><br/><pre> # XXX use struct -base-409-base-123- if header is None: -base-410-base-124- fd = self._fd -base-411-base-125- fd.seek(0) -base:412:base:126:</pre></li><li><b>File: utilities/../src/moul/file/kiimage.py~:127</b><br/><pre> # XXX use struct -base-413-base-127- if size is None: -base-414-base-128- size = self.getFileSize() -base-415-base-129- leading = 4* [None] -base:416:base:130:</pre></li><li><b>File: utilities/../src/moul/file/chatlog.py~:268</b><br/><pre> # TODO: add parser, currently simply iterates over the file -base-417-base-131- return iter(self._fd) -base:418:base:132:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py~:156</b><br/><pre> # TODO: write me -base-419-base-133- pass -base-420-base-134- -base-421-base-135-class Constrain(object): -base:422:base:136:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py~:540</b><br/><pre> 'Audio.SetDeviceName' : (QuotedString, Constrain()), # TODO: add check -base-423-base-137- 'Audio.SetChannelVolume GUI' : (FloatString, MinMax(0.0, 1.0)), # 0-100%, no ui -base-424-base-138- # microphon missing -> OS mixer -base-425-base-139- } -base:426:base:140:</pre></li><li><b>File: utilities/../src/moul/file/wdysini.py~:628</b><br/><pre> # TODO: microphon needs an extra handler. The mic slider changes the OS mixer. -base-427-base-141- -base-428-base-142-class GraphicsIni(ConfFile): -base-429-base-143- _filename = 'graphics.ini' -base:430:base:144:</pre></li><li><b>File: utilities/../src/moul/file/directory.py:58</b><br/><pre> # TODO: fnmatch -base-431-base-145- return len([name for name in os.listdir(path) -base-432-base-146- if os.path.isfile(os.path.join(path, name))]) -base-433-base-147- -base:434:base:148:</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/whatdoyousee.py.svn-base:76</b><br/><pre> # XXX: dos format -base-435-base-149-base-77- return data.replace("\r\n", "\n") -base-436-base-150-base-78- -base-437-base-151-base-79-def encryptWDYS(instr, fout): -base:438:base:152:</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/whatdoyousee.py.svn-base:86</b><br/><pre> # XXX: dos format -base-439-base-153-base-87- instr = instr.replace("\n", "\r\n") -base-440-base-154-base-88- fout.seek(0) -base-441-base-155-base-89- fout.write(HEADER) -base:442:base:156:</pre></li><li><b>File: utilities/../src/moul/crypt/.svn/text-base/elf.py.svn-base:70</b><br/><pre> # XXX NotImplemented -base-443-base-157-base-71- raise NotImplementedError -base-444-base-158-base-72- -base-445-base-159-base-73-def decipher(crypt, size, key): -base:446:base:160:</pre></li><li><b>File: utilities/../src/moul/crypt/whatdoyousee.py:76</b><br/><pre> # XXX: dos format -base-447-base-161- return data.replace("\r\n", "\n") -base-448-base-162- -base-449-base-163-def encryptWDYS(instr, fout): -base:450:base:164:</pre></li><li><b>File: utilities/../src/moul/crypt/whatdoyousee.py:86</b><br/><pre> # XXX: dos format -base-451-base-165- instr = instr.replace("\n", "\r\n") -base-452-base-166- fout.seek(0) -base-453-base-167- fout.write(HEADER) -base:454:base:168:</pre></li><li><b>File: utilities/../src/moul/crypt/elf.py:70</b><br/><pre> # XXX NotImplemented -base-455-base-169- raise NotImplementedError -base-456-base-170- -base-457-base-171-def decipher(crypt, size, key): -base:458:base:172:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/localization.py.svn-base:78</b><br/><pre> # TODO: other message box -base-459-base-173-base-79- self._journal_progressbar = SimpleProgressbar(self) -base-460-base-174-base-80- self._journal_progressbar.setWindowTitle(self.trUtf8("Loading journals")) -base-461-base-175-base-81- self._journal_progressbar.setProgressbar(0, 1, 0) -base:462:base:176:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:76</b><br/><pre> # TODO: checks -base-463-base-177-base-77- self.urudatadir.initializeFactories() -base-464-base-178-base-78- -base-465-base-179-base-79- # init handlers -base:466:base:180:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:152</b><br/><pre> # FIXME: signal doesn't do anything -base-467-base-181-base-153- self.emit(SIGNAL("close()")) -base-468-base-182-base-154- event.accept() -base-469-base-183-base-155- event.ignore() -base:470:base:184:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:189</b><br/><pre> # TODO: msg -base-471-base-185-base-190- return -base-472-base-186-base-191- -base-473-base-187-base-192- self.pb_kiimage_repair.setEnabled(False) -base:474:base:188:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:219</b><br/><pre> # TODO: msg -base-475-base-189-base-220- -base-476-base-190-base-221- # ************************************************************************ -base-477-base-191-base-222- # graphics settings -base:478:base:192:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:237</b><br/><pre> self.emit(SIGNAL("graphicsini_loaded()")) # XXX: hard coded emit -base-479-base-193-base-238- -base-480-base-194-base-239- @signalLogDecorator(LOG) -base-481-base-195-base-240- def on_graphicsini_loaded(self): -base:482:base:196:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:297</b><br/><pre> # XXX: fixme -base-483-base-197-base-298- txt = videoModes.getVidModeHuman(idx) -base-484-base-198-base-299- self.lb_screenres.setText(QtCore.QString(txt)) -base-485-base-199-base-300- self._graphics_ini.screenres = idx -base:486:base:200:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:387</b><br/><pre> self.emit(SIGNAL("audioini_loaded()")) # XXX: hard coded emit -base-487-base-201-base-388- -base-488-base-202-base-389- @signalLogDecorator(LOG) -base-489-base-203-base-390- def on_audioini_loaded(self): -base:490:base:204:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:506</b><br/><pre> # TODO: needs optimization? run only when timer tab is active -base-491-base-205-base-507- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout) -base-492-base-206-base-508- timer.start() -base-493-base-207-base-509- -base:494:base:208:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:602</b><br/><pre> # TODO: thread safety! -base-495-base-209-base-603- self.servers = servers -base-496-base-210-base-604- if not self.isRunning(): -base-497-base-211-base-605- self.start() -base:498:base:212:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:608</b><br/><pre> # TODO: thread safety! -base-499-base-213-base-609- # emit a list of names first -base-500-base-214-base-610- for server in self.servers: -base-501-base-215-base-611- self.emit(SIGNAL("server(const QString&)"), server.name) -base:502:base:216:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/mainwindow.py.svn-base:644</b><br/><pre> # TODO check this -base-503-base-217-base-645- self._running = False -base-504-base-218-base-646- self.condition.wakeAll() -base-505-base-219-base-647- -base:506:base:220:</pre></li><li><b>File: utilities/../src/moul/qt/.svn/text-base/errorhandler.py.svn-base:46</b><br/><pre> # TODO: translation aware -base-507-base-221-base-47- LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback)) -base:508:base:222:base:48: return # XXX: remove -base-509-base-223-base-49- try: -base-510-base-224-base-50- title= QtGui.QApplication.translate("excepthook", -base-511-base-225-base-51- "An unhandled error has occured", -base:512:base:226:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:76</b><br/><pre> # TODO: checks -base-513-base-227- self.urudatadir.initializeFactories() -base-514-base-228- -base-515-base-229- # init handlers -base:516:base:230:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:152</b><br/><pre> # FIXME: signal doesn't do anything -base-517-base-231- self.emit(SIGNAL("close()")) -base-518-base-232- event.accept() -base-519-base-233- event.ignore() -base:520:base:234:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:189</b><br/><pre> # TODO: msg -base-521-base-235- return -base-522-base-236- -base-523-base-237- self.pb_kiimage_repair.setEnabled(False) -base:524:base:238:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:236</b><br/><pre> self.emit(SIGNAL("graphicsini_loaded()")) # XXX: hard coded emit -base-525-base-239- -base-526-base-240- @signalLogDecorator(LOG) -base-527-base-241- def on_graphicsini_loaded(self): -base:528:base:242:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:296</b><br/><pre> # XXX: fixme -base-529-base-243- txt = videoModes.getVidModeHuman(idx) -base-530-base-244- self.lb_screenres.setText(QtCore.QString(txt)) -base-531-base-245- self._graphics_ini.screenres = idx -base:532:base:246:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:386</b><br/><pre> self.emit(SIGNAL("audioini_loaded()")) # XXX: hard coded emit -base-533-base-247- -base-534-base-248- @signalLogDecorator(LOG) -base-535-base-249- def on_audioini_loaded(self): -base:536:base:250:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:505</b><br/><pre> # TODO: needs optimization? run only when timer tab is active -base-537-base-251- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout) -base-538-base-252- timer.start() -base-539-base-253- -base:540:base:254:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:601</b><br/><pre> # TODO: thread safety! -base-541-base-255- self.servers = servers -base-542-base-256- if not self.isRunning(): -base-543-base-257- self.start() -base:544:base:258:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:607</b><br/><pre> # TODO: thread safety! -base-545-base-259- # emit a list of names first -base-546-base-260- for server in self.servers: -base-547-base-261- self.emit(SIGNAL("server(const QString&)"), server.name) -base:548:base:262:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py~:643</b><br/><pre> # TODO check this -base-549-base-263- self._running = False -base-550-base-264- self.condition.wakeAll() -base-551-base-265- -base:552:base:266:</pre></li><li><b>File: utilities/../src/moul/qt/localization.py:78</b><br/><pre> # TODO: other message box -base-553-base-267- self._journal_progressbar = SimpleProgressbar(self) -base-554-base-268- self._journal_progressbar.setWindowTitle(self.trUtf8("Loading journals")) -base-555-base-269- self._journal_progressbar.setProgressbar(0, 1, 0) -base:556:base:270:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:76</b><br/><pre> # TODO: checks -base-557-base-271- self.urudatadir.initializeFactories() -base-558-base-272- -base-559-base-273- # init handlers -base:560:base:274:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:152</b><br/><pre> # FIXME: signal doesn't do anything -base-561-base-275- self.emit(SIGNAL("close()")) -base-562-base-276- event.accept() -base-563-base-277- event.ignore() -base:564:base:278:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:189</b><br/><pre> # TODO: msg -base-565-base-279- return -base-566-base-280- -base-567-base-281- self.pb_kiimage_repair.setEnabled(False) -base:568:base:282:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:219</b><br/><pre> # TODO: msg -base-569-base-283- -base-570-base-284- # ************************************************************************ -base-571-base-285- # graphics settings -base:572:base:286:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:237</b><br/><pre> self.emit(SIGNAL("graphicsini_loaded()")) # XXX: hard coded emit -base-573-base-287- -base-574-base-288- @signalLogDecorator(LOG) -base-575-base-289- def on_graphicsini_loaded(self): -base:576:base:290:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:297</b><br/><pre> # XXX: fixme -base-577-base-291- txt = videoModes.getVidModeHuman(idx) -base-578-base-292- self.lb_screenres.setText(QtCore.QString(txt)) -base-579-base-293- self._graphics_ini.screenres = idx -base:580:base:294:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:387</b><br/><pre> self.emit(SIGNAL("audioini_loaded()")) # XXX: hard coded emit -base-581-base-295- -base-582-base-296- @signalLogDecorator(LOG) -base-583-base-297- def on_audioini_loaded(self): -base:584:base:298:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:506</b><br/><pre> # TODO: needs optimization? run only when timer tab is active -base-585-base-299- self.connect(timer, SIGNAL('timeout()'), self.on_timezone_timer_timeout) -base-586-base-300- timer.start() -base-587-base-301- -base:588:base:302:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:602</b><br/><pre> # TODO: thread safety! -base-589-base-303- self.servers = servers -base-590-base-304- if not self.isRunning(): -base-591-base-305- self.start() -base:592:base:306:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:608</b><br/><pre> # TODO: thread safety! -base-593-base-307- # emit a list of names first -base-594-base-308- for server in self.servers: -base-595-base-309- self.emit(SIGNAL("server(const QString&)"), server.name) -base:596:base:310:</pre></li><li><b>File: utilities/../src/moul/qt/mainwindow.py:644</b><br/><pre> # TODO check this -base-597-base-311- self._running = False -base-598-base-312- self.condition.wakeAll() -base-599-base-313- -base:600:base:314:</pre></li><li><b>File: utilities/../src/moul/qt/errorhandler.py:46</b><br/><pre> # TODO: translation aware -base-601-base-315- LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback)) -base-602-base-316- try: -base-603-base-317- title= QtGui.QApplication.translate("excepthook", -base:604:</pre></li><li><b>File: utilities/../doc/.svn/text-base/XXXreport.html.svn-base:319</b><br/><pre></pre></li><li><b>File: utilities/../src/moul/osdependent/__init__.py:116</b><br/><pre># XXX: what about cygwin, bsd and others? -base-605-base-320-_thismodule = sys.modules[__name__] -base-606-base-321-if __WIN32__: -base-607-base-322- from moul.osdependent import win32 as osdep_win32 -base:608:base:323:</pre></li><li><b>File: utilities/../src/moul/osdependent/.svn/text-base/__init__.py.svn-base:116</b><br/><pre># XXX: what about cygwin, bsd and others? -base-609-base-324-base-117-_thismodule = sys.modules[__name__] -base-610-base-325-base-118-if __WIN32__: -base-611-base-326-base-119- from moul.osdependent import win32 as osdep_win32 -base:612:base:327:</pre></li><li><b>File: utilities/../test.py:548</b><br/><pre> # XXX bug: doctest may report several failures in one test, they are -base-613-base-328- # separated by a horizontal dash line. Only the first one of -base-614-base-329- # them is now colorized properly. -base-615-base-330- header = lines[0] -base:616:base:331:</pre></li><li><b>File: utilities/../test.py:603</b... [truncated message content] |
From: <ti...@us...> - 2007-02-07 15:01:57
|
Revision: 155 http://pymoul.svn.sourceforge.net/pymoul/?rev=155&view=rev Author: tiran Date: 2007-02-07 07:01:15 -0800 (Wed, 07 Feb 2007) Log Message: ----------- Fix for Windows socket error issue Modified Paths: -------------- pymoul/trunk/src/moul/qt/mainwindow.py pymoul/trunk/src/moul/server/ping.py Modified: pymoul/trunk/src/moul/qt/mainwindow.py =================================================================== --- pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-07 13:28:12 UTC (rev 154) +++ pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-07 15:01:15 UTC (rev 155) @@ -40,6 +40,7 @@ from moul.osdependent import isMoulRunning from moul.server.ping import ServerList from moul.server.ping import isSocketError +from moul.server.ping import fmtSocketError from moul.time.cavern import CavernTime from moul.qt.localization import LocalizationContainer @@ -498,15 +499,17 @@ name = server.name dns = server.dns() if isSocketError(dns): + errno, msg = fmtSocketError(dns) self.emit(SIGNAL("dnserror(const QString&, int, const QString&)"), - name, dns.args[0], dns.args[1]) + name, errno, msg) continue self.emit(SIGNAL("dns(const QString&, float)"), name, dns) ping = server.portping() if isSocketError(ping): + errno, msg = fmtSocketError(dns) self.emit(SIGNAL("pingerror(const QString&, int, const QString&)"), - name, ping.args[0], ping.args[1]) + name, errno, msg) continue self.emit(SIGNAL("ping(const QString&, float)"), name, ping) Modified: pymoul/trunk/src/moul/server/ping.py =================================================================== --- pymoul/trunk/src/moul/server/ping.py 2007-02-07 13:28:12 UTC (rev 154) +++ pymoul/trunk/src/moul/server/ping.py 2007-02-07 15:01:15 UTC (rev 155) @@ -28,6 +28,29 @@ def isSocketError(stat): return isinstance(stat, socket.error) +def fmtSocketError(exc): + """Formats the output of a socket error + + @param exc: a socket exception + @type. exc: socket.error instance + @return: errno, msg + @rtype: tuple (int, str) + """ + errno, msg = -1, '' + if isinstance(exc, socket.timeout): + msg = str(exc) + elif isinstance(exc, socket.gaierror): + # address-related errors + errno, msg = exc[0], exc[1] + elif isinstance(exc, socket.herror): + # address-related errors using h_errno + errno, msg = exc[0], exc[1] + elif isinstance(exc, socket.error): + errno, msg = exc[0], exc[1] + else: + msg = str(exc) + return errno, msg + class Server(object): """A server object """ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ti...@us...> - 2007-02-07 13:28:12
|
Revision: 154 http://pymoul.svn.sourceforge.net/pymoul/?rev=154&view=rev Author: tiran Date: 2007-02-07 05:28:12 -0800 (Wed, 07 Feb 2007) Log Message: ----------- Removed clear call from Threadlet.run() Implemented first version of chat log browser Modified Paths: -------------- pymoul/trunk/src/moul/file/chatlog.py pymoul/trunk/src/moul/qt/mainwindow.py pymoul/trunk/src/moul/qt/threadlet.py Modified: pymoul/trunk/src/moul/file/chatlog.py =================================================================== --- pymoul/trunk/src/moul/file/chatlog.py 2007-02-07 11:31:49 UTC (rev 153) +++ pymoul/trunk/src/moul/file/chatlog.py 2007-02-07 13:28:12 UTC (rev 154) @@ -204,40 +204,47 @@ Lists all chat logs in the directory """ - def __init__(self, logdir): - self._logdir = logdir - self._logfiles = [] # list of ChatlogViews + def __init__(self, archivedir): + self._archivedir = archivedir + self._chatlogs = [] # list of ChatlogViews + LOG.debug("Chatlogs DV in %s" % archivedir) self.refresh() def refresh(self): """Refresh list """ # TODO: inefficient, compare list with directory content - if not os.path.isdir(self._logdir): - LOG.warning("%s is not a directory" % logdir) - return - self._logfiles[:] = [] + if not os.path.isdir(self._archivedir): + LOG.warning("%s is not a directory" % self._archivedir) + return + self._chatlogs[:] = [] self._findChatlogs() def _findChatlogs(self): """Find chat logs in logdir directory """ - for name in os.listdir(self._logdir): - fname = os.path.join(self._logdir, name) + for name in os.listdir(self._archivedir): + fname = os.path.join(self._archivedir, name) if not os.path.isfile(fname): continue chatlog = ChatlogView(fname) if chatlog.date is not None: - self._logfiles.append(chatlog) - self._logfiles.sort(key=lambda element:(element.date, element.name)) + self._chatlogs.append(chatlog) + self._chatlogs.sort(key=lambda element:element.name) def __len__(self): """len() support """ - return len(self._logfiles) + return len(self._chatlogs) def __iter__(self): - return iter(self._logfiles) + return iter(self._chatlogs) + + def __contains__(self, other): + return other in self._chatlogs + + def __getitem__(self, idx): + return self._chatlogs[idx] class ChatlogView(object): """A view of a single chat log file @@ -271,9 +278,21 @@ if not mo: # urks return None - d = mo.groupdict() + d = {} + for key, value in mo.groupdict().items(): + d[key] = int(value) self._date = d return d + + @property + def humanname(self): + """Human readable name + """ + d = self.date + if not d: + return self.name + return "Chatlog %02i:%02i - %02i:%02i %02i-%02i-%02i" % ( + d['ch'], d['cm'], d['sh'], d['sm'], d['Y'], d['M'], d['D']) def open(self): """Open fhe file @@ -281,6 +300,7 @@ if not self._opened: self._fd = open(self._fname, 'r') self._opened = True + self._fd.seek(0) def close(self): """Close the file @@ -298,4 +318,4 @@ @rtype: str """ self.open() - self._fd.read() + return self._fd.read() Modified: pymoul/trunk/src/moul/qt/mainwindow.py =================================================================== --- pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-07 11:31:49 UTC (rev 153) +++ pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-07 13:28:12 UTC (rev 154) @@ -46,6 +46,7 @@ from moul.qt.wdysini import IniFileContainer from moul.qt.simpleprogressbar import SimpleProgressbar from moul.qt.threadlet import YieldingThreadlet +from moul.qt.threadlet import Threadlet from moul.qt.ui.mainwindow import Ui_MainWindow from moul.qt import utils as qtutils @@ -87,6 +88,7 @@ self._ping_init() self._systray_init() self._about_init() + self._chatlog_init() self.qcLocalization = LocalizationContainer(self) self.qcIniFile = IniFileContainer(self) @@ -208,7 +210,45 @@ # ************************************************************************ # tasks + def _chatlog_init(self): + self._chatlog_threadlet = Threadlet(self) + self.connect(self, SIGNAL("chatlogsUpdated()"), + self._chatlog_threadlet.start) + self.connect(self._chatlog_threadlet, SIGNAL("finished()"), + self.on_chatlogview_refresh) + # detach and fire + self._chatlog_threadlet.detach(self.on_chatlogs_updated) + @pyqtSignature("") + def on_chatlogs_updated(self): + """ + Called as detached method inside a threadlet + """ + self.urupersonaldir.chatview.refresh() + + @pyqtSignature("") + def on_chatlogview_refresh(self): + """ + Called when the chatlet threadlet has finished + """ + self.cb_chatlog.clear() + lst = [chatview.humanname + for chatview in self.urupersonaldir.chatview] + lst.insert(0, "<choose>") + self.cb_chatlog.addItems(QtCore.QStringList(lst)) + + @pyqtSignature("int") + def on_cb_chatlog_currentIndexChanged(self, idx): + """ + """ + self.tb_chatlog_view.clear() + if idx < 1: + # chooser or -1 + return + chatview = self.urupersonaldir.chatview[idx-1] + self.tb_chatlog_view.setPlainText(chatview.view()) + + @pyqtSignature("") def on_pb_kiimage_repair_clicked(self): """ Clicked repair button @@ -262,7 +302,6 @@ def on_pb_log_archive_clicked(self): """ """ - self.emit(SIGNAL("chatlogsUpdated()")) chatmover = self.urupersonaldir.chatmover logzipper = self.urupersonaldir.logzipper if chatmover.findLogs(): @@ -273,12 +312,16 @@ len(chatmover)) ) mb.exec_() + self.emit(SIGNAL("chatlogsUpdated()")) else: mb = qtutils.infoMB(self, self.trUtf8("Chatlog archive"), self.trUtf8("No chatlog(s) to archive") ) mb.exec_() + # also emit the signal here so the button reacts as a refresh + # button, too + self.emit(SIGNAL("chatlogsUpdated()")) #mb = qtutils.notImplementedMB(self) #mb.exec_() Modified: pymoul/trunk/src/moul/qt/threadlet.py =================================================================== --- pymoul/trunk/src/moul/qt/threadlet.py 2007-02-07 11:31:49 UTC (rev 153) +++ pymoul/trunk/src/moul/qt/threadlet.py 2007-02-07 13:28:12 UTC (rev 154) @@ -79,6 +79,9 @@ self._args = None self._kwargs = None + def __del__(self): + self.clear() + def detach(self, obj, *args, **kwargs): """ Detach a function call @@ -89,8 +92,8 @@ """ self.mutex.lock() self._obj = obj - self._args = args - self._kwargs = kwargs + self._args = args or () + self._kwargs = kwargs or {} self.mutex.unlock() if not self.isRunning(): self.start() @@ -107,7 +110,6 @@ self.mutex.lock() result = self._obj(*self._args, **self._kwargs) self.emit(SIGNAL("done(result)"), result) - self.clear() self.mutex.unlock() class YieldingThreadlet(Threadlet): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ti...@us...> - 2007-02-07 11:31:54
|
Revision: 153 http://pymoul.svn.sourceforge.net/pymoul/?rev=153&view=rev Author: tiran Date: 2007-02-07 03:31:49 -0800 (Wed, 07 Feb 2007) Log Message: ----------- Fixed typo in file.chatlog Added PBML parser to localization Modified Paths: -------------- pymoul/trunk/src/moul/file/chatlog.py pymoul/trunk/src/moul/file/localization.py pymoul/trunk/src/moul/qt/mainwindow.py Modified: pymoul/trunk/src/moul/file/chatlog.py =================================================================== --- pymoul/trunk/src/moul/file/chatlog.py 2007-02-06 20:35:26 UTC (rev 152) +++ pymoul/trunk/src/moul/file/chatlog.py 2007-02-07 11:31:49 UTC (rev 153) @@ -131,7 +131,7 @@ 'modtime' : mtime, 'created' : created, 'newname' : newname, - 'newpath' : os.path.join(self._destdirt, newname), + 'newpath' : os.path.join(self._destdir, newname), } self._logs.append(details) Modified: pymoul/trunk/src/moul/file/localization.py =================================================================== --- pymoul/trunk/src/moul/file/localization.py 2007-02-06 20:35:26 UTC (rev 152) +++ pymoul/trunk/src/moul/file/localization.py 2007-02-07 11:31:49 UTC (rev 153) @@ -20,9 +20,11 @@ from __future__ import with_statement import glob import os +from sgmllib import SGMLParser from xml.sax import ContentHandler from xml.sax import make_parser from xml.sax.handler import feature_namespaces +from xml.sax.saxutils import unescape from moul.log import getLogger @@ -197,8 +199,42 @@ def __str__(self): return self.content +class PBMLParser(SGMLParser): + """Plasma Book Markup Language parser + + Handles the PBML language used to describe books in Uru. + """ + def __init__(self): + self.pbml_content = [] + return SGMLParser.__init__(self) + + def handle_data(self, data): + """Handle data outside tags + """ + self.pbml_content.append(data) + + def getPBML(self): + """Get PBML data and close parser + + @return: pbml data w/o tags + @rtype: unicode + """ + self.close() + return u''.join(self.pbml_content) + + def feedEscaped(self, data): + """Feed escaped data as read from loc files + + @param data: data to parse + @type data: str or unicode + """ + self.feed(unescape(data)) + class MoulLocHandler(ContentHandler): - """Content handler for Myst Online Uru Live locatization""" + """Content handler for Myst Online Uru Live localization + + Reads and parsed .loc files which contain MOUL's i18n text. + """ def __init__(self, fname=''): self._fname = fname @@ -246,11 +282,13 @@ """</translation> handler """ content = u''.join(self._content) + pbml = PBMLParser() + pbml.feedEscaped(content) tl = Translation(age = self._age, set = self._set, element = self._element, language = self._language, - content = content, + content = pbml.getPBML(), fname = self._fname) self.translations.append(tl) Modified: pymoul/trunk/src/moul/qt/mainwindow.py =================================================================== --- pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-06 20:35:26 UTC (rev 152) +++ pymoul/trunk/src/moul/qt/mainwindow.py 2007-02-07 11:31:49 UTC (rev 153) @@ -262,6 +262,7 @@ def on_pb_log_archive_clicked(self): """ """ + self.emit(SIGNAL("chatlogsUpdated()")) chatmover = self.urupersonaldir.chatmover logzipper = self.urupersonaldir.logzipper if chatmover.findLogs(): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ti...@us...> - 2007-02-06 20:35:25
|
Revision: 152 http://pymoul.svn.sourceforge.net/pymoul/?rev=152&view=rev Author: tiran Date: 2007-02-06 12:35:26 -0800 (Tue, 06 Feb 2007) Log Message: ----------- Fixed the unicode fix for windows process info code Modified Paths: -------------- pymoul/trunk/src/moul/osdependent/processinfo.py Modified: pymoul/trunk/src/moul/osdependent/processinfo.py =================================================================== --- pymoul/trunk/src/moul/osdependent/processinfo.py 2007-02-06 20:31:12 UTC (rev 151) +++ pymoul/trunk/src/moul/osdependent/processinfo.py 2007-02-06 20:35:26 UTC (rev 152) @@ -203,10 +203,11 @@ name = u"".join([c for c in modname if c != NULL]) except UnicodeError, msg: LOG.exception("Can't decode name of pid %i" % pid) + else: + mapping[pid] = name modname[:] = sizeof(modname) * NULL KERNEL.CloseHandle(hProcess) - mapping[pid] = name - + return mapping def getPidDetails(self, pid): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ti...@us...> - 2007-02-06 20:31:15
|
Revision: 151 http://pymoul.svn.sourceforge.net/pymoul/?rev=151&view=rev Author: tiran Date: 2007-02-06 12:31:12 -0800 (Tue, 06 Feb 2007) Log Message: ----------- Fix for chatlog directory doesn't exist Modified Paths: -------------- pymoul/trunk/src/moul/file/chatlog.py pymoul/trunk/src/moul/qt/i18n/__init__.py Modified: pymoul/trunk/src/moul/file/chatlog.py =================================================================== --- pymoul/trunk/src/moul/file/chatlog.py 2007-02-06 17:51:25 UTC (rev 150) +++ pymoul/trunk/src/moul/file/chatlog.py 2007-02-06 20:31:12 UTC (rev 151) @@ -90,14 +90,20 @@ self.clear() def clear(self): + """Clear results and check the existence of directories + + @return: state of directories, True if everything is ok + @rtype: bool """ - """ self._logs = [] if not os.path.isdir(self._srcdir): LOG.warning("%s is not a directory" % self._srcdir) + return False if not os.path.isdir(self._destdir): LOG.info("Creating chatlog directory %s" % self._destdir) os.mkdir(destdir) + return False + return True def findLogs(self): """Find log files in self._srcdir @@ -105,7 +111,8 @@ Also calls and stores _findCreated(), modtime() and _makeFile() for the file. """ - self.clear() + if not self.clear(): + return for file in os.listdir(self._srcdir): if not fnmatch(file.lower(), self._pat): continue Modified: pymoul/trunk/src/moul/qt/i18n/__init__.py =================================================================== --- pymoul/trunk/src/moul/qt/i18n/__init__.py 2007-02-06 17:51:25 UTC (rev 150) +++ pymoul/trunk/src/moul/qt/i18n/__init__.py 2007-02-06 20:31:12 UTC (rev 151) @@ -56,7 +56,7 @@ @rtype: str or None """ global TRANSLATIONS - if True: #__FROZEN__: + if __FROZEN__: basedir = os.path.dirname(os.path.abspath(sys.argv[0])) #basedir = sys.prefix qm = os.path.join(basedir, 'i18n', '%s.qm' % name) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ti...@us...> - 2007-02-06 17:51:40
|
Revision: 150 http://pymoul.svn.sourceforge.net/pymoul/?rev=150&view=rev Author: tiran Date: 2007-02-06 09:51:25 -0800 (Tue, 06 Feb 2007) Log Message: ----------- Added run.bat to run the program under windows w/o build the py2exe version first Fixed error handler Fixed translation installer Modified Paths: -------------- pymoul/trunk/src/moul/qt/errorhandler.py pymoul/trunk/src/moul/qt/i18n/__init__.py pymoul/trunk/src/moul/qt/moulqt.py Added Paths: ----------- pymoul/trunk/run.bat Added: pymoul/trunk/run.bat =================================================================== --- pymoul/trunk/run.bat (rev 0) +++ pymoul/trunk/run.bat 2007-02-06 17:51:25 UTC (rev 150) @@ -0,0 +1,5 @@ +@echo off +cls +set PYTHONPATH=src +python src\moul\qt\moulqt.py +pause Modified: pymoul/trunk/src/moul/qt/errorhandler.py =================================================================== --- pymoul/trunk/src/moul/qt/errorhandler.py 2007-02-06 17:15:50 UTC (rev 149) +++ pymoul/trunk/src/moul/qt/errorhandler.py 2007-02-06 17:51:25 UTC (rev 150) @@ -32,7 +32,6 @@ from traceback import format_exception from moul.log import getLogger - from moul.qt.utils import criticalMB @@ -45,21 +44,20 @@ """ # TODO: translation aware LOG.critical("UNHANDLED ERROR", exc_info=(typ, value, traceback)) - if not getattr(sys, 'frozen', False): - return - try: - title= QApplication.translate("excepthook", - "An unhandled error has occured", - None, QQApplication.UnicodeUTF8) - msg = ("Please report the error:\n\n" + - '\n'.join([line.strip() for line in - format_exception(typ, value, traceback)]) - ) - mb = criticalMB(None, title, msg) - mb.exec_() - except Exception, msg: - print msg - #sys.exit(100) + if getattr(sys, 'frozen', False): + try: + title= QApplication.translate("excepthook", + "An unhandled error has occured", + None, QApplication.UnicodeUTF8) + msg = ("Please report the error:\n\n" + + '\n'.join([line.strip() for line in + format_exception(typ, value, traceback)]) + ) + mb = criticalMB(None, title, msg) + mb.exec_() + except Exception, msg: + print msg + sys.exit(100) def setupQtExceptHook(): """ Modified: pymoul/trunk/src/moul/qt/i18n/__init__.py =================================================================== --- pymoul/trunk/src/moul/qt/i18n/__init__.py 2007-02-06 17:15:50 UTC (rev 149) +++ pymoul/trunk/src/moul/qt/i18n/__init__.py 2007-02-06 17:51:25 UTC (rev 150) @@ -36,11 +36,11 @@ # pkg_resources is incompatible with os.listdir() LANGS = ('de', 'es', 'fr', 'it', 'nl') PREFIX = "pymoul" +TRANSLATIONS = {} if not __FROZEN__: # pkg_resources don't work under py2exe yet import pkg_resources - TRANSLATIONS = {} for lang in LANGS: name = "%s_%s" % (PREFIX, lang) qm = pkg_resources.resource_string(__name__, "%s.qm" % name) @@ -55,15 +55,21 @@ @return: binary file data or None @rtype: str or None """ - if __FROZEN__: - qm = os.path.join(sys.prefix, 'i18n', '%s.qm' % name) + global TRANSLATIONS + if True: #__FROZEN__: + basedir = os.path.dirname(os.path.abspath(sys.argv[0])) + #basedir = sys.prefix + qm = os.path.join(basedir, 'i18n', '%s.qm' % name) if os.path.isfile(qm): - return open(qm, 'rb').read() + # TRICKY: we have to make sure that the data is NEVER garbage + # collected! But the data in a global dict + data = open(qm, 'rb').read() + TRANSLATIONS[name] = data else: LOG.debug("QM file not found: %s" % qm) - else: - return TRANSLATIONS.get(name, None) + return TRANSLATIONS.get(name, None) + def installTranslator(app): """ Installs a translator for the ap @@ -91,6 +97,6 @@ LOG.info("Loading translation %s" % longname) if qm is not None: - #LOG.debug("len(qm) %i" % len(qm)) + LOG.debug("len(%i), type(%s)" % (len(qm), type(qm))) translator.load(qm, len(qm)) app.installTranslator(translator) Modified: pymoul/trunk/src/moul/qt/moulqt.py =================================================================== --- pymoul/trunk/src/moul/qt/moulqt.py 2007-02-06 17:15:50 UTC (rev 149) +++ pymoul/trunk/src/moul/qt/moulqt.py 2007-02-06 17:51:25 UTC (rev 150) @@ -58,7 +58,7 @@ singleapp = SimpleSingleApp('pymoulqt', path=getPyMoulDataDir(check=True)) try: singleapp.acquire() - createLogfile() + except OSError: mb = criticalMB(None, app.trUtf8("pyMoul QT already running"), @@ -67,6 +67,7 @@ mb.exec_() sys.exit(1) + createLogfile() setupQtExceptHook() installTranslator(app) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |