Commits

Alexandre Macabies committed 65d4aaf

initial commit

Comments (0)

Files changed (11)

+syntax: glob
+
+__pycache__
+*.pyc
+This is the MIT license: http://www.opensource.org/licenses/mit-license.php
+
+Copyright 2012 Alexandre `Zopieux` MACABIES
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this
+software and associated documentation files (the "Software"), to deal in the Software
+without restriction, including without limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
+to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or
+substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+This doc is still TODO.
+# -*- coding: utf-8 -*-
+
+# Copyright 2008-2012 Alexandre `Zopieux` Macabies
+# This module is part of avatarsio and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+from PySide import QtCore, QtGui
+
+def printRect(rect):
+    print('+ %d, %d -- (%d) ------ +' % (rect.top(), rect.left(), rect.width()))
+    print('| %d' % rect.height())
+    print('+ --------------------- +')
+
+class ListviewDelegate(QtGui.QStyledItemDelegate):
+    maxPixmapSize = (200, 200)
+    imageRole = QtCore.Qt.UserRole + 1
+    isThumbRole = QtCore.Qt.UserRole + 2
+
+    def _get_element_rects(self, option, index):
+        name = index.data(QtCore.Qt.DisplayRole)
+        image = index.data(self.imageRole)
+        font = index.data(QtCore.Qt.FontRole)
+        fm = QtGui.QFontMetrics(font)
+
+        nameRect = QtCore.QRect(option.rect)
+        bd = fm.boundingRect(name)
+        nameRect.setWidth(fm.width(name))
+        nameRect.setHeight(fm.height())
+        nameRect.adjust(4, 4, 4, 4)
+
+        if index.data(self.isThumbRole) and (image.width(), image.height()) > self.maxPixmapSize:
+            # we scale only if 1. it's thumb and 2. larger than maxSize
+            image = image.scaled(*self.maxPixmapSize, aspectMode=QtCore.Qt.KeepAspectRatio, mode=QtCore.Qt.SmoothTransformation)
+
+        imageRect = QtCore.QRect(option.rect)
+        imageRect.setWidth(image.width())
+        imageRect.setHeight(image.height())
+        imageRect.moveTop(nameRect.bottom())
+        imageRect.adjust(4, 4, 4, 4)
+
+        return nameRect, imageRect
+
+    def sizeHint(self, option, index):
+        nameRect, imageRect = self._get_element_rects(option, index)
+        return nameRect.united(imageRect).size()
+
+    def paint(self, painter, option, index):
+        name = index.data(QtCore.Qt.DisplayRole)
+        image = index.data(self.imageRole)
+        font = index.data(QtCore.Qt.FontRole)
+
+        nameRect, imageRect = self._get_element_rects(option, index)
+
+        painter.save()
+        painter.drawImage(imageRect, image)
+        painter.setFont(font)
+        painter.drawText(nameRect, name)
+        painter.restore()
+# -*- coding: utf-8 -*-
+
+# Copyright 2008-2012 Alexandre `Zopieux` Macabies
+# This module is part of avatarsio and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+from PySide import QtCore, QtGui, QtUiTools
+from collections import OrderedDict
+import sys
+import traceback
+import inspect
+import resrc
+import io
+import cgi
+
+from utils import RedirectedStream
+from delegates import ListviewDelegate
+
+sys.stdout = RedirectedStream(sys.__stdout__)
+
+try:
+    from PIL import Image, ImageDraw
+except ImportError:
+    import Image, ImageDraw
+
+class PilPreview(QtGui.QWidget):
+    INITIAL_CODE = """### Please note Image and ImageDraw modules are already imported.
+
+# im = Image.open('path')
+
+size = (255, 255)
+im = Image.new('RGBA', size)"""
+
+    def __init__(self, parent=None):
+        super(PilPreview, self).__init__(parent)
+
+        loader = QtUiTools.QUiLoader()
+        file = QtCore.QFile(":/main.ui")
+        file.open(QtCore.QFile.ReadOnly)
+        self.ui = loader.load(file, self)
+        file.close()
+        layout = QtGui.QVBoxLayout()
+        layout.addWidget(self.ui)
+        layout.setContentsMargins(4, 4, 4, 4)
+        self.setLayout(layout)
+        self.setWindowTitle("PIL Preview")
+        self.setWindowIcon(QtGui.QIcon(":/img/pilpreview.png"))
+
+        self.settings = QtCore.QSettings(QtCore.QSettings.IniFormat, QtCore.QSettings.UserScope,
+            "ZopiSoftware", "pilpreview", self)
+
+        # Models
+        self.hiddenImagesModel = QtGui.QStandardItemModel(self)
+        self.hiddenImagesModel.setColumnCount(1)
+        self.ui.inspectList.setModel(self.hiddenImagesModel)
+
+        self.imagePreviewModel = QtGui.QStandardItemModel(self)
+        self.imagePreviewModel.setColumnCount(1)
+        self.ui.imageView.setModel(self.imagePreviewModel)
+
+        # Delgates
+        listDelegate = ListviewDelegate()
+        self.ui.imageView.setItemDelegate(listDelegate)
+
+        # Timers
+        self.autoUpdateTimer = QtCore.QTimer()
+        self.autoUpdateTimer.setSingleShot(False)
+
+        # Actions
+
+        # Connections
+        self.ui.settingReset.clicked.connect(self.reinitSettings)
+        self.ui.settingAutoUpdate.stateChanged.connect(self.updateUi)
+        self.ui.settingAutoUpdateDelay.valueChanged.connect(self.updateUi)
+        self.ui.settingThumb.stateChanged.connect(self.generatePreview)
+        self.ui.updateNow.clicked.connect(self.inspectCode)
+        self.ui.inspectAll.clicked.connect(lambda: self.clearInspect(True))
+        self.ui.inspectNone.clicked.connect(lambda: self.clearInspect(False))
+
+        self.hiddenImagesModel.itemChanged.connect(self.updateInspector)
+        self.autoUpdateTimer.timeout.connect(self.inspectCode)
+
+        # Inits
+        self.lastSource = ''
+        self.inspectedImages = {}
+        self.hiddenImageNames = set()
+
+        self.readSettings()
+        self.updateUi()
+
+    def reinitSettings(self):
+        self.settings.clear()
+        self.readSettings()
+
+    def readSettings(self):
+        self.settings.beginGroup('main')
+        self.restoreGeometry(self.settings.value('geometry', self.saveGeometry()))
+        self.ui.splitterH.restoreState(self.settings.value('splitterHState', self.ui.splitterH.saveState()))
+        self.ui.splitterV.restoreState(self.settings.value('splitterVState', self.ui.splitterV.saveState()))
+        self.ui.sourceEditor.setPlainText(self.settings.value('sourceText', PilPreview.INITIAL_CODE))
+        self.ui.settingAutoUpdate.setChecked(bool(self.settings.value('settingAutoUpdate', '1')))
+        self.ui.settingAutoUpdateDelay.setValue(int(self.settings.value('settingAutoUpdateDelay', '2')))
+        self.ui.settingThumb.setChecked(bool(self.settings.value('settingThumb', '1')))
+        self.settings.endGroup()
+
+    def writeSettings(self):
+        self.settings.beginGroup('main')
+        self.settings.setValue('geometry', self.saveGeometry())
+        self.settings.setValue('splitterHState', self.ui.splitterH.saveState())
+        self.settings.setValue('splitterVState', self.ui.splitterV.saveState())
+        self.settings.setValue('sourceText', self.ui.sourceEditor.toPlainText())
+        self.settings.setValue('settingAutoUpdate', self.ui.settingAutoUpdate.isChecked() and '1' or '')
+        self.settings.setValue('settingAutoUpdateDelay', self.ui.settingAutoUpdateDelay.value())
+        self.settings.setValue('settingThumb', self.ui.settingThumb.isChecked() and '1' or '')
+        self.settings.endGroup()
+
+    def closeEvent(self, event):
+        self.writeSettings()
+        super(PilPreview, self).closeEvent(event)
+
+    def updateUi(self):
+        autoUpdate = self.ui.settingAutoUpdate.isChecked()
+        self.ui.settingAutoUpdateDelay.setEnabled(autoUpdate)
+        self.autoUpdateTimer.stop()
+        if autoUpdate:
+            self.autoUpdateTimer.start(self.ui.settingAutoUpdateDelay.value() * 1000)
+
+    def clearInspect(self, all):
+        if all:
+            self.hiddenImageNames = set()
+        else:
+            self.hiddenImageNames = set(self.inspectedImages.keys())
+
+        self.buildInspectorList()
+        self.generatePreview()
+
+    def inspectCode(self):
+        newSource = self.ui.sourceEditor.toPlainText()
+        if self.lastSource.strip() == newSource.strip():
+            return
+
+        self.lastSource = newSource
+
+        # First, run and inspect
+        fake_stdout = io.StringIO()
+        sys.stdout.redirect_start(fake_stdout)
+
+        execGlobals = {'Image': Image, 'ImageDraw': ImageDraw}
+        execLocals = {}
+
+        try:
+            exec(newSource, execGlobals, execLocals)
+            self.ui.consoleOutput.setPlainText(fake_stdout.getvalue())
+        except: # ya, except *everything*
+            self.ui.consoleOutput.setHtml(
+                '<span style="color: #F92672;">An exception was catched</span>'
+                '<pre style="margin:0; padding:0;"><code>%s</code></pre>' % \
+                cgi.escape(traceback.format_exc().strip()))
+            return
+        finally:
+            sys.stdout.redirect_end()
+
+        self.inspectedImages = OrderedDict((name, obj) for name, obj in sorted(execLocals.items()) if isinstance(obj, Image.Image))
+
+        # Build the inspector list
+        self.buildInspectorList()
+        # Display images
+        self.generatePreview()
+
+    def updateInspector(self, item):
+        name = item.data(QtCore.Qt.DisplayRole)
+        if item.checkState() == QtCore.Qt.Checked:
+            self.hiddenImageNames.discard(name)
+        else:
+            self.hiddenImageNames.add(name)
+
+        self.generatePreview()
+
+    def buildInspectorList(self):
+        self.hiddenImagesModel.clear()
+
+        for row, (name, obj) in enumerate(self.inspectedImages.items()):
+            item = QtGui.QStandardItem()
+            item.setCheckable(True)
+            item.setEditable(False)
+            item.setData(name, QtCore.Qt.DisplayRole)
+            item.setData(QtCore.Qt.Unchecked if name in self.hiddenImageNames else QtCore.Qt.Checked, QtCore.Qt.CheckStateRole)
+
+            self.hiddenImagesModel.insertRow(row, item)
+
+    def generatePreview(self):
+        self.imagePreviewModel.clear()
+
+        for row, (name, obj) in enumerate(_ for _ in self.inspectedImages.items() if _[0] not in self.hiddenImageNames):
+            buff = io.BytesIO()
+            obj.save(buff, 'PNG')
+            image = QtGui.QImage.fromData(buff.getvalue(), 'PNG')
+
+            item = QtGui.QStandardItem()
+            item.setEditable(False)
+            item.setCheckable(False)
+            item.setData(name, QtCore.Qt.DisplayRole)
+            item.setData(image, ListviewDelegate.imageRole)
+            item.setData(self.ui.settingThumb.isChecked(), ListviewDelegate.isThumbRole)
+
+            self.imagePreviewModel.insertRow(row, item)
+
+
+if __name__ == '__main__':
+    app = QtGui.QApplication(sys.argv)
+    mainw = PilPreview()
+    mainw.show()
+    sys.exit(app.exec_())
+
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>widget</class>
+ <widget class="QWidget" name="widget">
+  <property name="styleSheet">
+   <string notr="true">QPlainTextEdit, QTextEdit {
+background: #272822;
+color: #F8F8F2;
+font-family:  'Consolas',monospace;
+font-size: 11pt;
+}</string>
+  </property>
+  <layout class="QHBoxLayout" name="horizontalLayout_3">
+   <item>
+    <widget class="QSplitter" name="splitterH">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <widget class="QSplitter" name="splitterV">
+      <property name="orientation">
+       <enum>Qt::Vertical</enum>
+      </property>
+      <widget class="QWidget" name="">
+       <layout class="QVBoxLayout" name="verticalLayout_2">
+        <item>
+         <widget class="QPlainTextEdit" name="sourceEditor"/>
+        </item>
+        <item>
+         <widget class="QPushButton" name="updateNow">
+          <property name="text">
+           <string>Update now</string>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QTabWidget" name="tabWidget">
+       <property name="currentIndex">
+        <number>2</number>
+       </property>
+       <widget class="QWidget" name="tabConsole">
+        <attribute name="title">
+         <string>Console output</string>
+        </attribute>
+        <layout class="QHBoxLayout" name="horizontalLayout_2">
+         <item>
+          <widget class="QTextEdit" name="consoleOutput">
+           <property name="lineWrapMode">
+            <enum>QTextEdit::NoWrap</enum>
+           </property>
+           <property name="readOnly">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </widget>
+       <widget class="QWidget" name="tabInspect">
+        <attribute name="title">
+         <string>Inspector</string>
+        </attribute>
+        <layout class="QGridLayout" name="gridLayout">
+         <item row="0" column="0" colspan="3">
+          <widget class="QListView" name="inspectList"/>
+         </item>
+         <item row="1" column="0">
+          <spacer name="horizontalSpacer">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>88</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item row="1" column="2">
+          <widget class="QPushButton" name="inspectAll">
+           <property name="text">
+            <string>Inspect all</string>
+           </property>
+           <property name="flat">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+         <item row="1" column="1">
+          <widget class="QPushButton" name="inspectNone">
+           <property name="text">
+            <string>Inspect none</string>
+           </property>
+           <property name="flat">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </widget>
+       <widget class="QWidget" name="tabSettings">
+        <attribute name="title">
+         <string>Settings</string>
+        </attribute>
+        <layout class="QVBoxLayout" name="verticalLayout">
+         <item>
+          <layout class="QFormLayout" name="formLayout">
+           <property name="fieldGrowthPolicy">
+            <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
+           </property>
+           <item row="0" column="1">
+            <widget class="QCheckBox" name="settingAutoUpdate">
+             <property name="text">
+              <string>Auto update</string>
+             </property>
+            </widget>
+           </item>
+           <item row="1" column="0">
+            <widget class="QLabel" name="label">
+             <property name="text">
+              <string>Auto update delay</string>
+             </property>
+            </widget>
+           </item>
+           <item row="1" column="1">
+            <widget class="QSpinBox" name="settingAutoUpdateDelay"/>
+           </item>
+           <item row="3" column="0">
+            <widget class="QLabel" name="label2">
+             <property name="text">
+              <string>Display thumbnails</string>
+             </property>
+            </widget>
+           </item>
+           <item row="3" column="1">
+            <widget class="QCheckBox" name="settingThumb"/>
+           </item>
+          </layout>
+         </item>
+         <item>
+          <widget class="QPushButton" name="settingReset">
+           <property name="text">
+            <string>Reset all settings</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </widget>
+      </widget>
+     </widget>
+     <widget class="QListView" name="imageView">
+      <property name="styleSheet">
+       <string notr="true">background: transparent;</string>
+      </property>
+      <property name="frameShape">
+       <enum>QFrame::NoFrame</enum>
+      </property>
+      <property name="frameShadow">
+       <enum>QFrame::Plain</enum>
+      </property>
+      <property name="lineWidth">
+       <number>0</number>
+      </property>
+      <property name="autoScroll">
+       <bool>false</bool>
+      </property>
+      <property name="editTriggers">
+       <set>QAbstractItemView::NoEditTriggers</set>
+      </property>
+      <property name="showDropIndicator" stdset="0">
+       <bool>false</bool>
+      </property>
+      <property name="selectionMode">
+       <enum>QAbstractItemView::NoSelection</enum>
+      </property>
+     </widget>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>

res/pilpreview.png

Added
New image
Added
New image
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="260"
+   height="255"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.3.1 r9886"
+   sodipodi:docname="pilprev.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.979899"
+     inkscape:cx="142.49251"
+     inkscape:cy="142.23292"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     units="px"
+     inkscape:window-width="1600"
+     inkscape:window-height="838"
+     inkscape:window-x="-8"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Calque 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-797.36089)">
+    <g
+       style="font-size:268.84539795px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Adobe Gothic Std B;-inkscape-font-specification:Adobe Gothic Std B Bold"
+       id="text2985">
+      <path
+         d="m 69.071603,1031.6466 0,-77.42647 c 4.032565,0.76179 8.871715,1.12025 14.517464,1.07537 10.698827,0.19424 22.039963,-1.59804 34.023433,-5.37684 11.98326,-3.77864 22.24903,-10.70879 30.79734,-20.79045 8.54803,-10.08146 13.01877,-24.47942 13.41223,-43.19393 -0.0562,-9.62215 -1.82603,-18.40431 -5.30963,-26.34651 -3.48389,-7.94186 -8.34544,-14.57329 -14.58467,-19.89431 -6.58676,-5.62308 -14.78643,-9.76773 -24.59904,-12.43394 -9.81283,-2.66581 -21.238602,-3.98761 -34.277346,-3.96541 -11.420245,0.0282 -21.580221,0.44268 -30.479961,1.2434 -8.899826,0.80113 -16.573014,1.82049 -23.019585,3.05807 l 0,204.05102 z m 0,-175.82262 c 1.74181,-0.41989 4.038167,-0.78955 6.889076,-1.10898 2.850777,-0.31907 6.289709,-0.4871 10.316808,-0.50407 11.145648,0.0226 19.905403,2.86783 26.279303,8.53573 6.37368,5.66825 9.62219,14.02474 9.74552,25.06951 -0.0897,11.27469 -3.53987,20.11286 -10.35042,26.51453 -6.81076,6.40191 -16.444255,9.66161 -28.900506,9.77913 -2.93493,0.006 -5.533733,-0.0727 -7.796417,-0.23523 -2.262815,-0.16232 -4.323934,-0.44237 -6.183364,-0.84014 z"
+         style="font-family:Adobe Gothic Std B;-inkscape-font-specification:Adobe Gothic Std B Bold"
+         id="path3003" />
+    </g>
+    <g
+       style="font-size:85.77176666px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0.02662348px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Adobe Gothic Std B;-inkscape-font-specification:Adobe Gothic Std B Bold"
+       id="text2989">
+      <path
+         d="m 103.1168,1031.6466 0,-24.7019 c 1.28654,0.243 2.83041,0.3574 4.63162,0.343 3.41332,0.062 7.03157,-0.5098 10.85475,-1.7154 3.82311,-1.2055 7.09827,-3.4165 9.8255,-6.63291 2.72715,-3.21636 4.15348,-7.80985 4.27901,-13.78048 -0.0179,-3.06983 -0.58257,-5.87167 -1.69397,-8.40553 -1.11149,-2.53375 -2.66251,-4.64942 -4.65306,-6.34703 -2.10142,-1.79397 -4.71742,-3.11627 -7.84802,-3.96689 -3.13066,-0.85049 -6.77591,-1.2722 -10.93575,-1.26512 -3.64349,0.009 -6.8849,0.14123 -9.724255,0.39669 -2.839379,0.2556 -5.287413,0.58081 -7.344111,0.97564 l 0,65.09993 z m 0,-56.09401 c 0.5557,-0.13396 1.28833,-0.25189 2.19788,-0.3538 0.9095,-0.1018 2.00665,-0.1554 3.29144,-0.16082 3.55588,0.007 6.35057,0.91494 8.38409,2.72322 2.03344,1.80838 3.06984,4.47442 3.10918,7.99811 -0.0286,3.59705 -1.12935,6.41676 -3.30217,8.45913 -2.17289,2.04245 -5.24633,3.08242 -9.22034,3.11991 -0.93636,0.002 -1.76547,-0.0232 -2.48735,-0.0751 -0.72193,-0.0518 -1.3795,-0.14113 -1.97273,-0.26803 z"
+         style="letter-spacing:12px;font-family:Adobe Gothic Std B;-inkscape-font-specification:Adobe Gothic Std B Bold"
+         id="path2996" />
+      <path
+         d="m 166.63213,1031.6466 0,-65.95763 -12.69406,0 0,65.95763 z"
+         style="letter-spacing:12px;font-family:Adobe Gothic Std B;-inkscape-font-specification:Adobe Gothic Std B Bold"
+         id="path2998" />
+      <path
+         d="m 204.26314,1020.9253 0,-55.23633 -12.69406,0 0,65.95763 36.28099,0 0,-10.7213 z"
+         style="letter-spacing:12px;font-family:Adobe Gothic Std B;-inkscape-font-specification:Adobe Gothic Std B Bold"
+         id="path3000" />
+    </g>
+  </g>
+</svg>
+<!DOCTYPE RCC>
+<RCC version="1.0">
+<qresource>
+  <file>main.ui</file>
+</qresource>
+<qresource prefix="img">
+  <file>pilpreview.png</file>
+</qresource>
+</RCC>
+# -*- coding: utf-8 -*-
+
+# Resource object code
+#
+# Created: mar. 4. sept. 22:53:11 2012
+#      by: The Resource Compiler for PySide (Qt v4.7.4)
+#
+# WARNING! All changes made in this file will be lost!
+
+from PySide import QtCore
+
+qt_resource_data = b"\x00\x00\x16\x98<?xml version=\x221.0\x22 encoding=\x22UTF-8\x22?>\x0d\x0a<ui version=\x224.0\x22>\x0d\x0a <class>widget</class>\x0d\x0a <widget class=\x22QWidget\x22 name=\x22widget\x22>\x0d\x0a  <property name=\x22styleSheet\x22>\x0d\x0a   <string notr=\x22true\x22>QPlainTextEdit, QTextEdit {\x0d\x0abackground: #272822;\x0d\x0acolor: #F8F8F2;\x0d\x0afont-family:  'Consolas',monospace;\x0d\x0afont-size: 11pt;\x0d\x0a}</string>\x0d\x0a  </property>\x0d\x0a  <layout class=\x22QHBoxLayout\x22 name=\x22horizontalLayout_3\x22>\x0d\x0a   <item>\x0d\x0a    <widget class=\x22QSplitter\x22 name=\x22splitterH\x22>\x0d\x0a     <property name=\x22orientation\x22>\x0d\x0a      <enum>Qt::Horizontal</enum>\x0d\x0a     </property>\x0d\x0a     <widget class=\x22QSplitter\x22 name=\x22splitterV\x22>\x0d\x0a      <property name=\x22orientation\x22>\x0d\x0a       <enum>Qt::Vertical</enum>\x0d\x0a      </property>\x0d\x0a      <widget class=\x22QWidget\x22 name=\x22\x22>\x0d\x0a       <layout class=\x22QVBoxLayout\x22 name=\x22verticalLayout_2\x22>\x0d\x0a        <item>\x0d\x0a         <widget class=\x22QPlainTextEdit\x22 name=\x22sourceEditor\x22/>\x0d\x0a        </item>\x0d\x0a        <item>\x0d\x0a         <widget class=\x22QPushButton\x22 name=\x22updateNow\x22>\x0d\x0a          <property name=\x22text\x22>\x0d\x0a           <string>Update now</string>\x0d\x0a          </property>\x0d\x0a         </widget>\x0d\x0a        </item>\x0d\x0a       </layout>\x0d\x0a      </widget>\x0d\x0a      <widget class=\x22QTabWidget\x22 name=\x22tabWidget\x22>\x0d\x0a       <property name=\x22currentIndex\x22>\x0d\x0a        <number>2</number>\x0d\x0a       </property>\x0d\x0a       <widget class=\x22QWidget\x22 name=\x22tabConsole\x22>\x0d\x0a        <attribute name=\x22title\x22>\x0d\x0a         <string>Console output</string>\x0d\x0a        </attribute>\x0d\x0a        <layout class=\x22QHBoxLayout\x22 name=\x22horizontalLayout_2\x22>\x0d\x0a         <item>\x0d\x0a          <widget class=\x22QTextEdit\x22 name=\x22consoleOutput\x22>\x0d\x0a           <property name=\x22lineWrapMode\x22>\x0d\x0a            <enum>QTextEdit::NoWrap</enum>\x0d\x0a           </property>\x0d\x0a           <property name=\x22readOnly\x22>\x0d\x0a            <bool>true</bool>\x0d\x0a           </property>\x0d\x0a          </widget>\x0d\x0a         </item>\x0d\x0a        </layout>\x0d\x0a       </widget>\x0d\x0a       <widget class=\x22QWidget\x22 name=\x22tabInspect\x22>\x0d\x0a        <attribute name=\x22title\x22>\x0d\x0a         <string>Inspector</string>\x0d\x0a        </attribute>\x0d\x0a        <layout class=\x22QGridLayout\x22 name=\x22gridLayout\x22>\x0d\x0a         <item row=\x220\x22 column=\x220\x22 colspan=\x223\x22>\x0d\x0a          <widget class=\x22QListView\x22 name=\x22inspectList\x22/>\x0d\x0a         </item>\x0d\x0a         <item row=\x221\x22 column=\x220\x22>\x0d\x0a          <spacer name=\x22horizontalSpacer\x22>\x0d\x0a           <property name=\x22orientation\x22>\x0d\x0a            <enum>Qt::Horizontal</enum>\x0d\x0a           </property>\x0d\x0a           <property name=\x22sizeHint\x22 stdset=\x220\x22>\x0d\x0a            <size>\x0d\x0a             <width>88</width>\x0d\x0a             <height>20</height>\x0d\x0a            </size>\x0d\x0a           </property>\x0d\x0a          </spacer>\x0d\x0a         </item>\x0d\x0a         <item row=\x221\x22 column=\x222\x22>\x0d\x0a          <widget class=\x22QPushButton\x22 name=\x22inspectAll\x22>\x0d\x0a           <property name=\x22text\x22>\x0d\x0a            <string>Inspect all</string>\x0d\x0a           </property>\x0d\x0a           <property name=\x22flat\x22>\x0d\x0a            <bool>true</bool>\x0d\x0a           </property>\x0d\x0a          </widget>\x0d\x0a         </item>\x0d\x0a         <item row=\x221\x22 column=\x221\x22>\x0d\x0a          <widget class=\x22QPushButton\x22 name=\x22inspectNone\x22>\x0d\x0a           <property name=\x22text\x22>\x0d\x0a            <string>Inspect none</string>\x0d\x0a           </property>\x0d\x0a           <property name=\x22flat\x22>\x0d\x0a            <bool>true</bool>\x0d\x0a           </property>\x0d\x0a          </widget>\x0d\x0a         </item>\x0d\x0a        </layout>\x0d\x0a       </widget>\x0d\x0a       <widget class=\x22QWidget\x22 name=\x22tabSettings\x22>\x0d\x0a        <attribute name=\x22title\x22>\x0d\x0a         <string>Settings</string>\x0d\x0a        </attribute>\x0d\x0a        <layout class=\x22QVBoxLayout\x22 name=\x22verticalLayout\x22>\x0d\x0a         <item>\x0d\x0a          <layout class=\x22QFormLayout\x22 name=\x22formLayout\x22>\x0d\x0a           <item row=\x220\x22 column=\x221\x22>\x0d\x0a            <widget class=\x22QCheckBox\x22 name=\x22settingAutoUpdate\x22>\x0d\x0a             <property name=\x22text\x22>\x0d\x0a              <string>Auto update</string>\x0d\x0a             </property>\x0d\x0a            </widget>\x0d\x0a           </item>\x0d\x0a           <item row=\x221\x22 column=\x220\x22>\x0d\x0a            <widget class=\x22QLabel\x22 name=\x22label\x22>\x0d\x0a             <property name=\x22text\x22>\x0d\x0a              <string>Auto update delay</string>\x0d\x0a             </property>\x0d\x0a            </widget>\x0d\x0a           </item>\x0d\x0a           <item row=\x221\x22 column=\x221\x22>\x0d\x0a            <widget class=\x22QSpinBox\x22 name=\x22settingAutoUpdateDelay\x22/>\x0d\x0a           </item>\x0d\x0a           <item row=\x223\x22 column=\x220\x22>\x0d\x0a            <widget class=\x22QLabel\x22 name=\x22label2\x22>\x0d\x0a             <property name=\x22text\x22>\x0d\x0a              <string>Display thumbnails</string>\x0d\x0a             </property>\x0d\x0a            </widget>\x0d\x0a           </item>\x0d\x0a           <item row=\x223\x22 column=\x221\x22>\x0d\x0a            <widget class=\x22QCheckBox\x22 name=\x22settingThumb\x22/>\x0d\x0a           </item>\x0d\x0a          </layout>\x0d\x0a         </item>\x0d\x0a         <item>\x0d\x0a          <widget class=\x22QPushButton\x22 name=\x22settingReset\x22>\x0d\x0a           <property name=\x22text\x22>\x0d\x0a            <string>Reset all settings</string>\x0d\x0a           </property>\x0d\x0a          </widget>\x0d\x0a         </item>\x0d\x0a        </layout>\x0d\x0a       </widget>\x0d\x0a      </widget>\x0d\x0a     </widget>\x0d\x0a     <widget class=\x22QListView\x22 name=\x22imageView\x22>\x0d\x0a      <property name=\x22styleSheet\x22>\x0d\x0a       <string notr=\x22true\x22>background: transparent;</string>\x0d\x0a      </property>\x0d\x0a      <property name=\x22frameShape\x22>\x0d\x0a       <enum>QFrame::NoFrame</enum>\x0d\x0a      </property>\x0d\x0a      <property name=\x22frameShadow\x22>\x0d\x0a       <enum>QFrame::Plain</enum>\x0d\x0a      </property>\x0d\x0a      <property name=\x22lineWidth\x22>\x0d\x0a       <number>0</number>\x0d\x0a      </property>\x0d\x0a      <property name=\x22autoScroll\x22>\x0d\x0a       <bool>false</bool>\x0d\x0a      </property>\x0d\x0a      <property name=\x22editTriggers\x22>\x0d\x0a       <set>QAbstractItemView::NoEditTriggers</set>\x0d\x0a      </property>\x0d\x0a      <property name=\x22showDropIndicator\x22 stdset=\x220\x22>\x0d\x0a       <bool>false</bool>\x0d\x0a      </property>\x0d\x0a      <property name=\x22selectionMode\x22>\x0d\x0a       <enum>QAbstractItemView::NoSelection</enum>\x0d\x0a      </property>\x0d\x0a     </widget>\x0d\x0a    </widget>\x0d\x0a   </item>\x0d\x0a  </layout>\x0d\x0a </widget>\x0d\x0a <resources/>\x0d\x0a <connections/>\x0d\x0a</ui>\x0d\x0a\x00\x00\x0f\x1d\x89PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\x00\x01\x04\x00\x00\x00\xff\x08\x06\x00\x00\x00\x17*\xa8d\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\x00\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\x01B(\x9bx\x00\x00\x00\x19tEXtSoftware\x00www.inkscape.org\x9b\xee<\x1a\x00\x00\x0e\x9aIDATx\x9c\xed\xdd}\xb0\x5c\xf5]\xc7\xf1\xf7\x97$\x08\x84\xa7\x84\x0a\x12(\x94\x87J*Z\xeaX\x1fxj\x1bg\x8c\xd2\x0e:\x22c\x0b\x83\x0a\xd4\x99:\xa2\xb6\x02\x15\xa7\xe2\xf8G-\xda\xb1*Ep\xc6\xe2P\xa88>\x95*U\xa9t\x00\xe9\xd4I\x09\x942mZ \x14\xa1\x85B\x81\xc0\x05\x9aH\xc8\x03\xf9\xfa\xc7\xd9\x9c{\x037\xd9\xbb{w\xef\xef\x9c\xb3\xef\xd7\xcc\x99\xdd;\x99\xb3\xe7\x03\xb9\xfb\xc9\xef\x9c=\xfb\xfbEf\x22I\x00{\x95\x0e \xa99,\x04I5\x0bAR\xcdB\x90T\xb3\x10$\xd5,\x04I5\x0bAR\xcdB\x90T\xb3\x10$\xd5,\x04I5\x0bAR\xcdB\x90T\xb3\x10$\xd5,\x04I5\x0bAR\xcdB\x90T\xb3\x10$\xd5,\x04I5\x0bAR\xcdB\x90T\xb3\x10$\xd5,\x04I5\x0bAR\xcdB\x90T[\x5c:@\xdbE\xc4\x22`Io\x03\xd8\x0alMW\xc0Q\x0bE\x97\x7fo#b/\xe0\xe0\xde\xb6l\xc6\xb6\xbb\x9f\xf7\xa3zc/f\xfaM\xdeo\x8b\xdd\x1c~;\xbdr\xe8m\xdbz\x8f/\x03\xcf\x01\xcf\xf4\xb6\x0d\xb3<\xffnfN\x8d\xe4\x7f\x824\x80V\x16BD\xec\x0f\x1c\x01\x1c9c;b\xc6\xe3r\xaa7\xf8\x81\xec\xfe\x0d\xdbtS\xc0z\xe0\xa1\xde\xe3\xce\xed\xe1\xcc\xdcR2\x98\xba\xab\x91\x85\x10\x11K\x81\x95\xc0\x9b\x807\xb2\xeb\x1b\xfeH\xe0\xa0r\xe9\x8a\xdb\x01<\x0a\xdc\x0d\xac\xe9m_\xcd\xccW\x8a\xa6R'\x14-\x84\x888\x18\xf8!\xaa7\xfe\xcc\xc7\xa3h\xef\xbf\xec%\xfc\x1f\xb0\x96\xe9\x82X\x93\x99/\x96\x8d\xa46*R\x08\x11\xf1n\xe0/\x81\xc3\x17\xfc\xe0\x93a\x1bp;p\x13psfn(\x9cG-Q\xeac\xc7\xc3\xb1\x0c\xc6i\x09\xf0s\xc0\xb5\xc0w#\xe2\x8e\x88\xb8(\x22V\x14\xce\xa5\x86\xf3>\x84\xee[\x04\xac\x02\xae\x06\xbe\x13\x11wF\xc4Y\xbd\x8fK\xa5]X\x08\x93%\x80\xb7S\x9dJ\xfcoD\x5c\xda\xbb\x8e#\x01\x16\xc2$;\x1a\xf83\xaaQ\xc35\x11qB\xe9@*\xcfB\xd0R\xe07\x81\x07\x22\xe2\xba\x888\xact \x95c!h\xa7\x00.\x00\x1e\x8a\x88K\x22bI\xbf\x1d\xd4=\x16\x82^\xed@\xe0c\xc0\xba\x888\xa3t\x18-,\x0bA\xbbs\x02pKD\xdc\x1c\x11\x87\x96\x0e\xa3\x85a!\xa8\x9f\x9f\x07\xee\x8b\x88\xb7\x97\x0e\xa2\xf1\xb3\x104\x17+\x80\xdb#\xe2\xf2\xde7H\xd5Q\xfe\xe5j\xae\x16\x01\x1f\x06>\xe7)DwY\x08\x1a\xd4j\xaaS\x88\x93J\x07\xd1\xe8Y\x08\x1a\xc6\x0a\xe0\xbf#\xe2'J\x07\xd1hY\x08\x1a\xd62\xe0\xb6\x88x[\xe9 \x1a\x1d\x0bA\xf3q\x00\xd55\x85\xd5\xa5\x83h4,\x04\xcd\xd7~\xc0g\xbd\x89\xa9\x1b,\x04\x8d\xc2\xf7\x01\xff\x14\x11'\x96\x0e\xa2\xf9\xb1\x104*\x07P\x8d\x14\x96\x97\x0e\xa2\xe1Y\x08\x1a\xa5c\x81\x7f\x89\x08\xd7\xfbh)\x0bA\xa3\xf6\xd3\xc0\x95\xa5Ch8\x16\x82\xc6\xe1\xa2\x88\xf8\x95\xd2!48\x0bA\xe3\xf2\xf1\x88\xf8\x81\xd2!4\x18\x0bA\xe3\xb2\x0c\xb8\xa6t\x08\x0d\xc6B\xd08\x9d\x15\x11g\x97\x0e\xa1\xb9\xb3\x104nW\xfbQd{X\x08\xa3\xb5\x0dx\x1ex\x0cx\xa4\xf7|G\xd1D\xe5\x1dF5%\x9bZ\xc0\xcf\x8b\xfb{\x1a\xb8\x1fx\xa0\xf7\xf8$\xb0\x11\xd8\xd4\xdbv>\xdf\x98\x99[_\xbd\xf3\x8c%\xe9\x97\x03\x87\xf4\x1e\x97SM\x83~\x0apr\xef\xe7.\xfb\xd5\x88\xf8hf\xae/\x1dD{f!\xcc\xee\xfd\xc0W\x80\xfb3sj>/\x94\x99;\xa8\x96v\x9f\x02\x1e~\xf5\x9fGDP\xcd_x\xca\x8cm%\xddZ\xecv\x11\xf0\x87\xc0y\xa5\x83h\xcfJ-\xf6\xfa\x01\xaa\xc5^\x9bjYf\xbeP\xea\xe0\x11q\x0c\xf0\xdb\xc0\x85\xc0A\xa5r\x8c\xd8+\xc0\x89\x8e\x12\x9a\xcdk\x08\x0d\x94\x99\x8ff\xe6\xc5\xc0\x91T\xc5\xf0P\xe1H\xa3\xb0s\x94\xa0\x06\xb3\x10\x1a,37e\xe6\xd5T\xa7\x10\xef\x02\xd6\x14\x8e4_\xefq\xc9\xb8f\xb3\x10Z +\xb7\x00\xa7\x03\x7f\x00l/\x1ciX\x8b\x80KJ\x87\xd0\xeeY\x08-\x92\x99;2\xf3\x0a\xe0Tf\xb9@\xd9\x12\xef\x8e\x88\xfdJ\x87\xd0\xec,\x84\x16\xca\xcc\xbb\x81\x1f\x05>Y:\xcb\x10\x0e\x04\xce*\x1dB\xb3\xb3\x10Z\xaaw}\xe1B\xe0|`\xe1?*\x9a\x9f\x0bJ\x07\xd0\xec,\x84\x96\xcb\xcc\x1b\x80\x0f\x96\xce1\xa0U\x11qt\xe9\x10z-\x0b\xa1\x032\xf3\xcf\x81\xabK\xe7\x18@\x00\xbfV:\x84^\xcbB\xe8\x8e\xf7\x037\x97\x0e1\x80sK\x07\xd0kY\x08\x1d\xd1\xbbE\xfa\x5c\xe0\xee\xd2Y\xe6\xe8\x84\x88XQ:\x84ve!tHf\xbeDu\x05\x7fs\xe9,s\xb4\xaat\x00\xed\xcaB\xe8\x98\xcc|\x82\xf6\x5cOxG\xe9\x00\xda\x95\x85\xd0M\x7f\x0a\xbcX:\xc4\x1c8Bh\x18\x0b\xa1\x83z_\xd9n\xc3\xa4$\xc7E\xc4\xebK\x87\xd04\x0b\xa1\xbb\xae\x04\x9e)\x1db\x0e\xdeQ:\x80\xa6Y\x08\x1d\x95\x99\x9b\x80+J\xe7\x98\x83\x93J\x07\xd04\x0b\xa1\xdb>E\xf3\xe7t\xf4\xeb\xd0\x0db!tXf>\x0f|\xb9t\x8e>,\x84\x06\xb1\x10\xba\xef\xf3\xa5\x03\xf4qlD\xec]:\x84*\x16B\xf75\xbd\x10\x16\x01\xc7\x95\x0e\xa1\x8a\x85\xd0}wQM\x15\xdfd\x9e64\x84\x85\xd0q\x99\xb9\x0d\xb8\xb3t\x8e>\x8e/\x1d@\x15\x0ba2\xdc^:@\x1f\x07\x97\x0e\xa0\x8a\x850\x19\x1e)\x1d\xa0\x8f\xfdK\x07P\xc5B\x98\x0cM\xbfc\xf1\x80\xd2\x01T\xb1\x10&\xc3\xd3\xa5\x03\xf4\xe1\x08\xa1!,\x84\xc9\xd0\xf4Bp\x84\xd0\x10\x16\xc2\x04\xc8\xcc\xcdT+T7\x95#\x84\x86\xb0\x10&G\x93G\x09.\xdc\xd2\x10\x16\xc2\xe4hr!\x14[i[\xbb\xb2\x10&G\x93\xdft\xcf\x96\x0e\xa0\x8a\x8509\x96\x97\x0e\xb0\x07\x1bJ\x07P\xc5B\x98\x1c\x87\x95\x0e\xb0\x07\x8e\x10\x1a\xc2B\x98\x1cM.\x04G\x08\x0da!L\x80\x88\xd8\x9ff_\xc9w\x84\xd0\x10\x16\xc2dh\xf2\xe8\x00\x1c!4\x86\x850\x19\x9a^\x08\x8e\x10\x1a\xc2B\x98\x0cM/\x04G\x08\x0da!L\x86\xa3J\x07\xe8\xc3\x11BCX\x08\x93\xa1\xc9K\xa6\xbd\x90\x99\xdbK\x87P\xc5B\xe8\xb8\x88XL\xb3\x0b\xc1\xd3\x85\x06\xb1\x10\xba\xef\xa7\x80\x03K\x87\xd8\x03\x0b\xa1A,\x84\xee\xfb\xd9\xd2\x01\xfa\xf8z\xe9\x00\x9af!t\xdf\xea\xd2\x01\xfa\xf8R\xe9\x00\x9af!tXD,\x07\xdeZ:G\x1f\x16B\x83X\x08\xdd\xf6N\x9a\xfdw\xfc<\xf0P\xe9\x10\x9a\xd6\xe4_\x16\xcdCD\xec\x05|\xa8t\x8e>\xee\xca\xcc,\x1dB\xd3,\x84\xee:\x0fxS\xe9\x10}\xdcU:\x80ve!tPD,\x01\xfe\xa8t\x8e9\xf0\xfaA\xc3X\x08\xdd\xf4^\xe0\xd8\xd2!\xfa\xd8\x01\xdc]:\x84ve!tLD\xec\x03\x5c^:\xc7\x1c<\x90\x99/\x96\x0e\xa1]Y\x08\xdd\xf3;\xc0\x11\xa5C\xcc\x81\xa7\x0b\x0dd!tHD\xac\x02\xfe\xb8t\x8e9\xf2\x82b\x03Y\x08\x1d\x11\x11+\x81\x9b\x80%\xa5\xb3\xcc\xd1\x17J\x07\xd0kY\x08\x1d\x10\x11\xdf\x0f\xfc'\xb0\xact\x969\xba'3\x1f.\x1dB\xafe!\xb4\x5c\xef\x22\xe2\xbf\xd1\xfcO\x15f\xba\xb1t\x00\xcd\xceBh\xb1\x88\x08\xe0\x93\xc0)\xa5\xb3\x0c`;\xf0\x8f\xa5Chv\x16BK\xf5\xbe\xb8t3\xf0\x9e\xd2Y\x06\xf4\xf9\xcc|\xa6t\x08\xcdnq\xe9\x00\x1a\x5cD\x9cL\xf5\xafl\xd3\xe7J\x9c\xcd\x0d\xa5\x03h\xf7\x1c!\xb4HT.\xa1\xbaB\xdf\xc62\xf8\x16\xf0\x99\xd2!\xb4{\x8e\x10Z\xa2w\x8ap=pf\xe1(\xf3\xf11'Tm6G\x08\x0d\x17\x11\x07D\xc4\xef\x02\xebhw\x19l\x00\xae+\x1dB{\xe6\x08\xa1\xa1\x22\xe2\x08\xaa\xdb\x90\xdf\x07\x1cT8\xce(\x5c\x95\x99\x9bK\x87\xd0\x9eY\x08\x0d\x13\x11o\x06.\x01\xce\xa1=w\x1d\xf63\x05\x5cS:\x84\xfa\xb3\x10\x0a\x8b\x88\x03\x80\x93\x81\xd3\xa9\xd6O8\xb5l\xa2\xb1\xf8Pf>_:\x84\xfa\xb3\x10fwZD\xac\x03\xbe\x93\x99\xaf\x8c\xf2\x85#\xe2P\xe04\xaa\x028\x1dx\x0b\xb0h\x94\xc7h\x98/\x03\xd7\x96\x0e\xa1\xb9\xb1\x10f\xf7\xef\xbd\xc7m\x11\xf1\x18\xf0\x08\xf0(\xf0\x04\xb0\x19xy\xc66\xf3\xe7\xc5\xc0\xeb\xfalM_xu\x94\x12\xb8(3w\x94\x0e\xa2\xb9\xb1\x10\xf6l\x09p\x5co\xd3\xe0\xfe63\x9d\x15\xa9E\xfc\xd8Q\xe3\xb2\x1e\xb8\xb8t\x08\x0d\xc6B\xd08\xbc\x04\x9c\x9d\x99\x9bJ\x07\xd1`,\x04\x8d\xc3E\x99\xe9\x9a\x8d-d!h\xd4\xae\xcb\xcc\xebK\x87\xd0p,\x04\x8d\xd2g\x81\xdf(\x1dB\xc3\xb3\x104*\xb7\x02\xbf\x9c\x99\xdbJ\x07\xd1\xf0,\x04\x8d\xc2\x9d\xc0/f\xe6\x96\xd2A4?\x16\x82\xe6k\x0dp\xa6_\x5c\xea\x06\x0bA\xf3q/\xf0N?^\xec\x0e\x0bA\xc3\xfa\x1a\xb0\xda\xe5\xd8\xba\xc5B\xd00\xbe\x01\xfcLfN\x95\x0e\xa2\xd1\xb2\x104\xa8\xcf\x00';sr7Y\x08\x9a\xabW\x80\xcb2\xf3\x972sc\xe90\x1a\x0f\xbf\xed\xa8\xb9\xd8\x00\x9c\x93\x99\xb7\x97\x0e\xa2\xf1\xb2\x10\xd4\xcf\xddT_Tz\xbct\x10\x8d\x9f\xa7\x0c\xda\x93O\x00o\xb3\x0c&\x87\x85\xa0\xd9L\x01\xe7g\xe6\xfb\xbc\xfbp\xb2X\x08\x9ai;p\x15p|f\xba\xe4\xda\x04\xf2\x1a\x82v\xfa\x1cpqf>X:\x88\xca\xb1\x10\xf4\x00U\x11\xfcW\xe9 *\xcfS\x86\xc95E\xb52\xd4\x9b-\x03\xed\xe4\x08a\xf2|\x83j\x9d\x84\x1b2\xf3\x85\xd2a\xd4,\x16\xc2d\xd8\x0c\xfc3\xf0\x89\xcc\x5cS:\x8c\x9a\xcbB\xe8\xb6\xafQ\xddKp\xa3\xdfJ\xd4\x5cX\x08\xdd\xf3m\xe0\x16\xaaS\x82\xb5\xa5\xc3\xa8],\x84\xf6{\x89j\x0a\xb3[\x81[3s}\xd98j3\x0b\xa1\x9d\xd6\xd1+\x00\xe0\x8b\xdeM\xa8Q\xb1\x10\x9a\xef\xdbTS\x95\xd5[f>[6\x92\xba\xcaB\x98\xdd\xd3\xc0\xa1@,\xe01_\x00\x1e\x07\x1eb\xfa\xcd\xff\x15\xdf\xfcZH\x16\xc2\xecVR-\xef~4\xf0\x06\xe0\x98\xde\xe3\xd1\xc0A\xc0>\xb3l\xfb\x02{S}\x1f`Ko\xdb:\xe3\xf9\x96\xdek>E\xf5\xc6\x7fl\xe6\xa3\x93\x8e\xa8\x09,\x84\xdd\xc8\xcc\x97\xa9V0\xf6\x22\x9d&\x86\xb7.K\xaaY\x08\x92j\x16\x82\xa4\x9a\x85 \xa9f!H\xaaY\x08\x92j\x16\x82\xa4\x9a\x85 \xa9\xe6\x8dI\x0d\x16\x11\x8b\x81\xa5\xc0~\xbd\xc7}\xa9\xbe\xdd\xf8=`c\xef\xe6)id,\x84\x05\x16\x11\x87\x00\xc7\xf6\xb6cf<?\x84\xe97\xfe\xce\x12\xd8\xbb\xcfkm\xa3*\x87\xe7\xa8&C\xb9o\xe7\x96\x99O\x8d\xe9?a`\x11\xb1\x14\xf8\xfb\x01w\xbb#3\xaf\x1aG\x9e\x9d\x22\xe2L\xe0\xbd\x03\xeevyf~}\x1cy\x9a\xc0BX \x11\xf1[\xc0G\x80\x03G\xf8\xb2K\xa8\x8a\xe4\x10\xe0\x07\x81\xb3g\x1c\xefq\xaa7\xe1\xf5\x0d\x98#a\x09\xf0\x0b\x03\xee\xb3\x10\xf3=\x1e\xc7\xe0\xb9\xae\x1cG\x90\xa6\xf0\x1a\xc2\xc2y\x1d\xa3-\x83~^\x0f\xfc>\xf0`D\xac\x89\x88_\x8f\x88%\x0bx|\xb5\x90\x850\x19N\xa6\x9ai\xf9\x9e\x88\xf8\xb1\xd2a\xd4\x5c\x16\xc2d9\x09X\x1b\x11\x1f\x8d\x88}J\x87Q\xf3X\x08\x93g\x11\xf0{\xc0m\x11\xb1_\xe90j\x16\x0bar\x9d\x0a|\xda\xeb\x0a\x9a\xc9B\x98lg\x00\xd7G\xc4BN\x15\xa7\x06\xb3\x10t.p^\xe9\x10j\x06\xefCh\xbe\xcdT3/\x7f\x0f\xd8D5/\xe3\x91\xc0\xf1T7/\x8d\xc2\x15\x11\xf1\xe9\xcc\xdc<\xa2\xd7SKY\x08\xcdv*pWf\xee\x98\xed\x0f#b\x05\xf0F\xe0\x14\xe0\x83\xc0\xb2!\x8fs$p)\xf0\xe1!\xf7WGx\xca\xd0lO\xee\xae\x0c\x002\xf3\xc9\xcc\xfcBf\xfe\x09\xd5\x88\xe1\xe3\xc0\xb6!\x8fuYD,\xe4\x8dSj \x0b\xa1#2s*3?\x00\x9cH5\xb5\xfb\xa0\x96\x02\xef\x1am*\xb5\x8d\x85\xd01\x99\xf9M\xe0\x02 \x87\xd8\xfd\xac\x11\xc7Q\xcbX\x08\x1d\x94\x99w\x00W\x0f\xb1\xeb\x19\x11\xb1\xef\xa8\xf3\xa8=,\x84\xee\xba\x0cxd\xc0}\x96\x02\xa7\x8d!\x8bZ\xc2B\xe8\xa8\xdeG\x88\xb7\x0e\xb1\xebQ\xa3\xce\xa2\xf6\xb0\x10\xbam\xdd\x10\xfb\xac\x18y\x0a\xb5\x86\x85\xd0m\xc3\xcc\xecs\xf8\xc8S\xa85,\x84n\x1bf\x84`!L0\x0b\xa1\xc32\xf3\x05\xaa\xdb\x9d\x07\xb1u\x1cY\xd4\x0e\x16B\x87E\xc4\xe1\xc0\xfe\x03\xee\xb6a\x1cY\xd4\x0e\x16B\xb7\xfd\xf0\x10\xfbX\x08\x13\xccB\xe8\xb6\x1f\x19b\x9fgG\x9eB\xada!t\xdb0\x85Pz\xcav\x15d!tT\xef\x9b\x8b\xab\x07\xdc\xed\x15`\xed\x18\xe2\xa8%,\x84\xee\xfa\x0b\x06\xbf\xc9h]fn\x1cG\x18\xb5\x83\x85\xd0A\x11q\x06\x83/Q\x06\xf0\xc5QgQ\xbbX\x08\x1d\xd3[;\xf2\xda!w\xff\xbbQfQ\xfbX\x08\x1d\x11\x95\x0b\x81\xfb\x81#\x86x\x89{3\xf3\x9e\x11\xc7R\xcb8\xa7b\x07D\xc4O\x02\x7f\x05\xfc\xf8<^\xe6\xafG\x14G-f!4\xdb\xea\x88\xf8\x12\xf0\x14\xb0\x05\xd8\x01\xbc\x018\x01X9\xe3\xf1\xad\xc0|\xd6V\xb8\x0f\xf8\xd4\xbc\x92\xaa\x13,\x84f\xfb\x9b\x058\xc66\xe0\x82\xcc\xdc\xbe\x00\xc7R\xc3y\x0dA\x97g\xe6WK\x87P38B\x98\x5c\x09\x5c\x9c\x99W\x96\x0e\xa2\xe6\xb0\x10&\xd3V\xe0\xfc\xcc\xfc\x87\xd2A\xd4,\x16\xc2\xe4\xd9\x08\x9c\x95\x99\xb7\x95\x0e\xa2\xe6\xf1\x1a\xc2d\xf9&\xb0\xca2\xd0\xeeX\x08\x93a\x1dp\x0e\xb023\xef-\x1dF\xcd\xe5)C\xb7\xad\x05>\x02\xfcGf\x0e\xb3\x92\x93&\x8c\x85\xd0-/\x02k\x80\xff\x01\xee\xc8\xcc\xbb\x0a\xe7Q\xcbX\x08\xcdv\x13\xb07pHo[\x0el\xa6\x9a\xd5\xe8Y\xe0\xb9\xde\xe3z\xaa\x12X\xb7\xa7\xd5\xa2\xa5~,\x84f\xbb43\xbfU:\x84&\x87\x17\x15%\xd5,\x04I5\x0bAR\xcdB\x90T\xb3\x10$\xd5,\x04I5\x0bAR\xcdB\x90T\xb3\x10$\xd5,\x04I5\x0bAR\xcdB\x90T\xf3\xcbM\xd2`\xce\x8e\x88\xb7\x8c\xe9\xb5\xa72\xb3\xe8\xfa\x18\x16\x824\x98\x8b\xc6\xf8\xda\xeb)\xbc`\x8e\xa7\x0c\x92j\x16\x82\xa4\x9a\x85 \xa9f!H\xaaY\x08\x92j\x16\x82\xa4\x9a\x85 \xa9f!H\xaaY\x08\x92j\xa5\xeeT\xfcW\xe0\xc1B\xc7\x9e\x8bMcx\xcd\x1b\x81AWRzz\x0c9J\xd8\x04\x9c1\xe0>O\x8c#\xc8\xab4\xed\xf7p\x1c\xbfw\x03\x09\x97\xfc\x93\xb4\x93\xa7\x0c\x92j\x16\x82\xa4\x9a\x85 \xa9f!H\xaaY\x08\x92j\x16\x82\xa4\x9a\x85 \xa9f!H\xaaY\x08\x92j\x16\x82\xa4\x9a\x85 \xa9f!H\xaaY\x08\x92j\x16\x82\xa4\x9a\x85 \xa9f!H\xaaY\x08\x92j\x16\x82\xa4\x9a\x85 \xa9\xf6\xffE\xc34\x9e\xa2\xeb[`\x00\x00\x00\x00IEND\xaeB`\x82"
+qt_resource_name = b"\x00\x07\x03\x80\x15Y\x00m\x00a\x00i\x00n\x00.\x00u\x00i\x00\x03\x00\x00p7\x00i\x00m\x00g\x00\x0e\x0f\xa9S\x07\x00p\x00i\x00l\x00p\x00r\x00e\x00v\x00i\x00e\x00w\x00.\x00p\x00n\x00g"
+qt_resource_struct = b"\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x14\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x01\x00\x00\x16\x9c"
+def qInitResources():
+    QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+def qCleanupResources():
+    QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+qInitResources()
+# -*- coding: utf-8 -*-
+
+# Copyright 2008-2012 Alexandre `Zopieux` Macabies
+# This module is part of avatarsio and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+
+from threading import RLock
+
+class RedirectedStream(object):
+    def __init__(self, original):
+        self.original = original
+        self.redirect = original
+        self.lock = RLock()
+
+    def redirect_start(self, redirect):
+        self.lock.acquire()
+        self.redirect = redirect
+
+    def redirect_end(self):
+        self.redirect = self.original
+        self.lock.release()
+
+    def __getattr__(self, name):
+        self.lock.acquire()
+        ret = getattr(self.redirect, name)
+        self.lock.release()
+        return ret