This commit is contained in:
Irony 2018-12-25 21:44:39 +08:00
parent 6807afe5be
commit 6cd4c94cf5
43 changed files with 184 additions and 2106 deletions

View file

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 54 KiB

View file

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 64 KiB

View file

Before

Width:  |  Height:  |  Size: 248 KiB

After

Width:  |  Height:  |  Size: 248 KiB

View file

Before

Width:  |  Height:  |  Size: 413 KiB

After

Width:  |  Height:  |  Size: 413 KiB

View file

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

View file

Before

Width:  |  Height:  |  Size: 97 KiB

After

Width:  |  Height:  |  Size: 97 KiB

View file

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 6.4 KiB

View file

@ -44,7 +44,7 @@ class Window(QWidget):
40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum))
# 原始图片
self.srcImage = QImage('images/fg.png')
self.srcImage = QImage('Data/fg.png')
self.imageLabel.setPixmap(QPixmap.fromImage(self.srcImage))
def doHorFilp(self):

View file

@ -6,7 +6,7 @@ Created on 2018年10月18日
@author: Irony
@site: https://pyqt5.com https://github.com/892768447
@email: 892768447@qq.com
@file: SlippedImgWidget
@file: ImageSlipped
@description:
"""
from PyQt5.QtGui import QPixmap, QPainter
@ -75,6 +75,6 @@ if __name__ == '__main__':
import sys
from PyQt5.QtWidgets import QApplication
app = QApplication(sys.argv)
w = SlippedImgWidget('images/bg1.jpg', 'images/fg1.png')
w = SlippedImgWidget('Data/bg1.jpg', 'Data/fg1.png')
w.show()
sys.exit(app.exec_())

View file

@ -6,7 +6,7 @@ Created on 2018年10月25日
@author: Irony
@site: https://pyqt5.com https://github.com/892768447
@email: 892768447@qq.com
@file: testNinePatch
@file: NinePatch
@description:
"""
@ -22,7 +22,7 @@ import sys
from PyQt5.QtGui import QImage, QPainter
from PyQt5.QtWidgets import QApplication, QLabel, QWidget
from NinePatch import NinePatch
from Lib.NinePatch import NinePatch
class Label(QWidget):
@ -30,7 +30,7 @@ class Label(QWidget):
def __init__(self, *args, **kwargs):
super(Label, self).__init__(*args, **kwargs)
#.9 格式的图片
self.image = NinePatch('skin_aio_friend_bubble_pressed.9.png')
self.image = NinePatch('Data/skin_aio_friend_bubble_pressed.9.png')
def paintEvent(self, event):
super(Label, self).paintEvent(event)

View file

@ -19,10 +19,13 @@ __Version__ = "Version 1.0"
import sys
from ctypes import CDLL
from PyQt5.QtGui import QImage
from PyQt5.QtWidgets import QApplication, QLabel
from QtNinePatch import QtNinePatch
CDLL('Lib/QtNinePatch/sip/QtNinePatch.dll')
from Lib.QtNinePatch.sip.QtNinePatch import QtNinePatch
class Label(QLabel):
@ -30,7 +33,7 @@ class Label(QLabel):
def __init__(self, *args, **kwargs):
super(Label, self).__init__(*args, **kwargs)
#.9 格式的图片
self.image = QImage('skin_aio_friend_bubble_pressed.9.png')
self.image = QImage('Data/skin_aio_friend_bubble_pressed.9.png')
def showEvent(self, event):
super(Label, self).showEvent(event)

View file

@ -6,7 +6,7 @@ Created on 2018年10月25日
@author: Irony
@site: https://pyqt5.com https://github.com/892768447
@email: 892768447@qq.com
@file: testQtNinePatch
@file: QtNinePatch2
@description:
"""
@ -22,7 +22,7 @@ import sys
from PyQt5.QtGui import QImage
from PyQt5.QtWidgets import QApplication, QLabel
import QtNinePatch
from Lib import QtNinePatch2
class Label(QLabel):
@ -30,17 +30,17 @@ class Label(QLabel):
def __init__(self, *args, **kwargs):
super(Label, self).__init__(*args, **kwargs)
#.9 格式的图片
self.image = QImage('skin_aio_friend_bubble_pressed.9.png')
self.image = QImage('Data/skin_aio_friend_bubble_pressed.9.png')
def showEvent(self, event):
super(Label, self).showEvent(event)
pixmap = QtNinePatch.createPixmapFromNinePatchImage(
pixmap = QtNinePatch2.createPixmapFromNinePatchImage(
self.image, self.width(), self.height())
self.setPixmap(pixmap)
def resizeEvent(self, event):
super(Label, self).resizeEvent(event)
pixmap = QtNinePatch.createPixmapFromNinePatchImage(
pixmap = QtNinePatch2.createPixmapFromNinePatchImage(
self.image, self.width(), self.height())
self.setPixmap(pixmap)

View file

@ -0,0 +1,96 @@
# QLabel
## 1、图片加载显示
[运行 ShowImage.py](ShowImage.py)
通过3种方式加载图片文件和显示gif图片
1. 通过`QPixmap("xxx.jpg")`加载
2. 通过`pyrcc5`转换res.qrc为res_rc.py文件可以直接import加载
1. 转换命令`pyrcc5 res.qrc -o res_rc.py`
2. `import res_rc`
3. 此时可以通过`QPixmap(":/images/head.jpg")`来加载
3. 通过rcc命令转成为二进制文件res.rcc
1. 转换命令`Tools/rcc.exe -binary res2.qrc -o res.rcc`
2. 这里把资源前缀修改下(/myfile),见res2.qrc文件
3. 通过`QResource.registerResource("res.rcc")`注册
4. 此时可以通过`QPixmap(":/myfile/images/head.jpg")`来加载
4. 通过xpm数组加载
1. 通过工具`Tools/Image2XPM.exe`来转换
2. 这里把转换的xpm数组直接放到py文件中当做一个变量
3. 见xpmres.py中的image_head
4. 此时可以通过`QPixmap(image_head)`来加载
5. 通过`QMovie`加载gif图片
![ShowImage](ScreenShot/ShowImage.gif)
## 2、图片旋转
[运行 ImageRotate.py](ImageRotate.py)
1. 水平翻转 `QImage.mirrored(True, False)`
2. 垂直翻转 `QImage.mirrored(False, True)`
3. 旋转90的整数倍使用`QTransform`比较友好
4. 任意角度采用`QPainter.rotate`
![ImageRotate](ScreenShot/ImageRotate.gif)
## 3、仿网页图片错位显示
[运行 ImageSlipped.py](ImageSlipped.py)
1. 设置`setMouseTracking(True)`开启鼠标跟踪
2. 重写`mouseMoveEvent`鼠标移动事件获取偏移量
3. 重写`paintEvent`事件绘制图片
![ImageSlipped](ScreenShot/ImageSlipped.gif)
## 4、显示.9格式图片(气泡)
[运行 NinePatch.py](NinePatch.py) | [运行 QtNinePatch.py](QtNinePatch.py) | [运行 QtNinePatch2.py](QtNinePatch2.py)
什么叫.9.PNG呢这是安卓开发里面的一种特殊的图片
这种格式的图片在android 环境下具有自适应调节大小的能力。
1允许开发人员定义可扩展区域当需要延伸图片以填充比图片本身更大区域时可扩展区的内容被延展。
2允许开发人员定义内容显示区用于显示文字或其他内容
目前手机QQ中很多漂亮的的聊天气泡就是.9格式的png图片
在Github开源库中搜索到两个C++版本的
1.一个是NinePatchQt https://github.com/Roninsc2/NinePatchQt
2.一个是QtNinePatch https://github.com/soramimi/QtNinePatch
### For PyQt
1、目前针对第一个库在2年前用Python参考源码重新写一个见 `Lib/NinePatch.py`
2、这次针对第二个库用Python编写的见`Lib/QtNinePatch2.py`。用C++编写的pyd版本见`Lib/QtNinePatch`目录
### 说明
1、建议优先使用pyd版本的后续提供Python3.4 3.5 3.6 3.7 编译好的32为库文件也可以自行编译编译步骤见下文。
2、其次可以使用Python写的第二个版本`Lib/QtNinePatch2.py`(个人觉得方便调用)
3、最后再考虑第一个版本吧
4、以上为个人意见两个C++版本的写法不一样,但是核心算法应该是类似的。
### 自行编译
1、首先要安装好Qt、PyQt5、编译安装对应的sip、对应的VC++编译工具
2、用Qt Creator 打开pro文件进行编译
3、进入源码中的sip文件夹
4、修改`configure.py`文件
```python
# 这里是你的VC版本和对应的Qt目录中的文件夹
config.platform = "win32-msvc2010"
qt_path = 'D:/soft/Qt/Qt5.5.1/5.5/msvc2010'
```
5、`python configure.py`
![NinePatchImage](ScreenShot/NinePatchImage.gif)

View file

Before

Width:  |  Height:  |  Size: 937 KiB

After

Width:  |  Height:  |  Size: 937 KiB

View file

Before

Width:  |  Height:  |  Size: 3.1 MiB

After

Width:  |  Height:  |  Size: 3.1 MiB

View file

Before

Width:  |  Height:  |  Size: 2.3 MiB

After

Width:  |  Height:  |  Size: 2.3 MiB

View file

Before

Width:  |  Height:  |  Size: 290 KiB

After

Width:  |  Height:  |  Size: 290 KiB

View file

Before

Width:  |  Height:  |  Size: 217 KiB

After

Width:  |  Height:  |  Size: 217 KiB

View file

@ -6,7 +6,7 @@ Created on 2017年12月23日
@author: Irony."[讽刺]
@site: http://alyl.vip, http://orzorz.vip, https://coding.net/u/892768447, https://github.com/892768447
@email: 892768447@qq.com
@file: LoadImage
@file: ShowImage
@description:
'''
import sys
@ -15,8 +15,8 @@ from PyQt5.QtCore import QResource
from PyQt5.QtGui import QPixmap, QMovie
from PyQt5.QtWidgets import QWidget, QApplication, QHBoxLayout, QLabel
import res_rc # @UnresolvedImport @UnusedImport
from xpmres import image_head # @UnresolvedImport
from Lib import res_rc # @UnresolvedImport @UnusedImport
from Lib.xpmres import image_head # @UnresolvedImport
__Author__ = "By: Irony.\"[讽刺]\nQQ: 892768447\nEmail: 892768447@qq.com"
@ -32,7 +32,7 @@ class ImageView(QWidget):
layout = QHBoxLayout(self)
# 从文件加载图片
layout.addWidget(QLabel(self, pixmap=QPixmap("images/head.jpg")))
layout.addWidget(QLabel(self, pixmap=QPixmap("Data/head.jpg")))
# QResource 参考 http://doc.qt.io/qt-5/resources.html
@ -46,7 +46,7 @@ class ImageView(QWidget):
# 转换命令tools/rcc.exe -binary res2.qrc -o res.rcc
# 这里把资源前缀修改下(/myfile),见res2.qrc文件
# 此时需要注册
QResource.registerResource("res.rcc")
QResource.registerResource("Data/res.rcc")
# 注意前缀
layout.addWidget(
QLabel(self, pixmap=QPixmap(":/myfile/images/head.jpg")))
@ -58,7 +58,7 @@ class ImageView(QWidget):
layout.addWidget(QLabel(self, pixmap=QPixmap(image_head)))
# 加载gif图片
movie = QMovie("images/loading.gif")
movie = QMovie("Data/loading.gif")
label = QLabel(self)
label.setMovie(movie)
layout.addWidget(label)

View file

@ -1,35 +0,0 @@
# 列表
## [1、QListView](QListView/)
### 1. [显示自定义Widget](QListView/显示自定义Widget.py)
![截图](QListView/ScreenShot/显示自定义Widget.png)
### 2. [显示自定义Widget并排序](QListView/显示自定义Widget并排序.py)
![截图](QListView/ScreenShot/显示自定义Widget并排序.gif)
## [2、QListWidget](QListWidget/)
### 1. [自定义可拖拽Item](QListWidget/自定义可拖拽Item.py)
![截图](QListWidget/ScreenShot/自定义可拖拽Item.gif)
### 2. [腾讯视频热播列表](QListWidget/腾讯视频热播列表)
1. 使用`flowlayout`布局
2. 使用`QGridLayout`布局
3. 使用`QListWidget`,设置`self.setFlow(self.LeftToRight)`和`self.setWrapping(True)`达到横向自动排列
4. 其它知识点:
1. 使用`QNetworkAccessManager`进行异步下载数据和图片
2. 滚动条滑动到底部加载更多
![截图](QListWidget/腾讯视频热播列表/ScreenShot/1.gif)
### 3. [删除自定义Item](QListWidget/删除自定义Item.py)
1. 删除item时先要通过`QListWidget.indexFromItem(item).row()`得到它的行数
2. 通过`takeItem`函数取出该Item并删除掉,`item = self.listWidget.takeItem(row)`
3. 移除item对应的自定义控件`self.listWidget.removeItemWidget(item)`
4. 如果是清空所有Item可以通过循环删除但是删除的时候行号一直是0即可原因和删除list数组一样。
![截图](QListWidget/ScreenShot/删除自定义Item.gif)

View file

@ -1,36 +0,0 @@
# 图片
## [1、图片加载](图片加载/)
通过3种方式加载图片文件和显示gif图片
1. 通过QPixmap("xxx.jpg")加载
2. 通过pyrcc5转换res.qrc为res_rc.py文件可以直接import加载
1. 转换命令pyrcc5 res.qrc -o res_rc.py
2. import res_rc
3. 此时可以通过QPixmap(":/images/head.jpg")来加载
3. 通过rcc命令转成为二进制文件res.rcc
1. 转换命令tools/rcc.exe -binary res2.qrc -o res.rcc
2. 这里把资源前缀修改下(/myfile),见res2.qrc文件
3. 通过QResource.registerResource("res.rcc")注册
4. 此时可以通过QPixmap(":/myfile/images/head.jpg")来加载
4. 通过xpm数组加载
1. 通过工具tools/Image2XPM.exe来转换
2. 这里把转换的xpm数组直接放到py文件中当做一个变量
3. 见xpmres.py中的image_head
4. 此时可以通过QPixmap(image_head)来加载
5. 通过QMovie加载gif图片
![截图](图片加载/ScreenShot/图片加载.gif)
## [2、仿网页图片错位特效](仿网页图片错位特效.py)
![截图](ScreenShot/仿网页图片错位特效.gif)![截图](ScreenShot/仿网页图片错位特效2.gif)
## [3、显示.9格式图片](显示.9格式图片/)
详情见子目录[显示.9格式图片](显示.9格式图片/)里
![截图](显示.9格式图片/ScreenShot/显示.9格式图片.gif)
## [4、图片旋转](图片旋转.py)
这里需要注意QTransform旋转的方式对90度的整数倍数比较友好, 由于这里测试旋转任意角度, 故采用`QPainter.rotate`来实现
![截图](ScreenShot/图片旋转.gif)

View file

@ -1,25 +0,0 @@
# 图片加载测试
### [Python3.4.4 or Python3.5][PyQt5]
### 一、通过3种方式加载图片文件和显示gif图片
1. 通过QPixmap("xxx.jpg")加载
2. 通过pyrcc5转换res.qrc为res_rc.py文件可以直接import加载
- 转换命令pyrcc5 res.qrc -o res_rc.py
- import res_rc
- 此时可以通过QPixmap(":/images/head.jpg")来加载
3. 通过rcc命令转成为二进制文件res.rcc
- 转换命令tools/rcc.exe -binary res2.qrc -o res.rcc
- 这里把资源前缀修改下(/myfile),见res2.qrc文件
- 通过QResource.registerResource("res.rcc")注册
- 此时可以通过QPixmap(":/myfile/images/head.jpg")来加载
4. 通过xpm数组加载
- 通过工具tools/Image2XPM.exe来转换
- 这里把转换的xpm数组直接放到py文件中当做一个变量
- 见xpmres.py中的image_head
- 此时可以通过QPixmap(image_head)来加载
5. 通过QMovie加载gif图片
# 截图
![截图](ScreenShot/1.gif)

View file

@ -1,471 +0,0 @@
# -*- coding: utf-8 -*-
# Resource object code
#
# Created by: The Resource Compiler for PyQt5 (Qt v5.9.3)
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore
qt_resource_data = b"\
\x00\x00\x19\xf0\
\xff\
\xd8\xff\xe0\x00\x10\x4a\x46\x49\x46\x00\x01\x01\x01\x00\x78\x00\
\x78\x00\x00\xff\xe1\x00\x3a\x45\x78\x69\x66\x00\x00\x4d\x4d\x00\
\x2a\x00\x00\x00\x08\x00\x03\x51\x10\x00\x01\x00\x00\x00\x01\x01\
\x00\x00\x00\x51\x11\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00\x51\
\x12\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\xff\
\xdb\x00\x43\x00\x02\x01\x01\x02\x01\x01\x02\x02\x02\x02\x02\x02\
\x02\x02\x03\x05\x03\x03\x03\x03\x03\x06\x04\x04\x03\x05\x07\x06\
\x07\x07\x07\x06\x07\x07\x08\x09\x0b\x09\x08\x08\x0a\x08\x07\x07\
\x0a\x0d\x0a\x0a\x0b\x0c\x0c\x0c\x0c\x07\x09\x0e\x0f\x0d\x0c\x0e\
\x0b\x0c\x0c\x0c\xff\xdb\x00\x43\x01\x02\x02\x02\x03\x03\x03\x06\
\x03\x03\x06\x0c\x08\x07\x08\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\
\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\
\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\
\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xff\xc0\x00\x11\x08\x00\x78\
\x00\x78\x03\x01\x22\x00\x02\x11\x01\x03\x11\x01\xff\xc4\x00\x1f\
\x00\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\
\x00\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\xff\xc4\x00\
\xb5\x10\x00\x02\x01\x03\x03\x02\x04\x03\x05\x05\x04\x04\x00\x00\
\x01\x7d\x01\x02\x03\x00\x04\x11\x05\x12\x21\x31\x41\x06\x13\x51\
\x61\x07\x22\x71\x14\x32\x81\x91\xa1\x08\x23\x42\xb1\xc1\x15\x52\
\xd1\xf0\x24\x33\x62\x72\x82\x09\x0a\x16\x17\x18\x19\x1a\x25\x26\
\x27\x28\x29\x2a\x34\x35\x36\x37\x38\x39\x3a\x43\x44\x45\x46\x47\
\x48\x49\x4a\x53\x54\x55\x56\x57\x58\x59\x5a\x63\x64\x65\x66\x67\
\x68\x69\x6a\x73\x74\x75\x76\x77\x78\x79\x7a\x83\x84\x85\x86\x87\
\x88\x89\x8a\x92\x93\x94\x95\x96\x97\x98\x99\x9a\xa2\xa3\xa4\xa5\
\xa6\xa7\xa8\xa9\xaa\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xc2\xc3\
\xc4\xc5\xc6\xc7\xc8\xc9\xca\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\
\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xf1\xf2\xf3\xf4\xf5\xf6\
\xf7\xf8\xf9\xfa\xff\xc4\x00\x1f\x01\x00\x03\x01\x01\x01\x01\x01\
\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x01\x02\x03\x04\x05\x06\
\x07\x08\x09\x0a\x0b\xff\xc4\x00\xb5\x11\x00\x02\x01\x02\x04\x04\
\x03\x04\x07\x05\x04\x04\x00\x01\x02\x77\x00\x01\x02\x03\x11\x04\
\x05\x21\x31\x06\x12\x41\x51\x07\x61\x71\x13\x22\x32\x81\x08\x14\
\x42\x91\xa1\xb1\xc1\x09\x23\x33\x52\xf0\x15\x62\x72\xd1\x0a\x16\
\x24\x34\xe1\x25\xf1\x17\x18\x19\x1a\x26\x27\x28\x29\x2a\x35\x36\
\x37\x38\x39\x3a\x43\x44\x45\x46\x47\x48\x49\x4a\x53\x54\x55\x56\
\x57\x58\x59\x5a\x63\x64\x65\x66\x67\x68\x69\x6a\x73\x74\x75\x76\
\x77\x78\x79\x7a\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x92\x93\x94\
\x95\x96\x97\x98\x99\x9a\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xb2\
\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\
\xca\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xe2\xe3\xe4\xe5\xe6\xe7\
\xe8\xe9\xea\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xff\xda\x00\x0c\
\x03\x01\x00\x02\x11\x03\x11\x00\x3f\x00\xfd\xfc\xa2\xbc\x87\xf6\
\xf5\xf8\xc3\xe2\xef\x80\x1f\xb1\xff\x00\x8f\x3c\x65\xe0\x5d\x36\
\xcf\x53\xf1\x3f\x87\xb4\xef\xb5\xda\xa5\xdd\xb4\xb7\x50\x5b\xa0\
\x74\x13\x5c\xc9\x0c\x4c\xb2\x4c\xb0\x42\x64\x98\xc6\x8c\x19\xc4\
\x5b\x41\x04\x8a\xf0\x6f\x1f\x7f\xc1\x4c\xbe\x20\x7e\xc7\xdf\x04\
\x34\xef\x88\x9f\x1a\x3e\x1e\x68\x3e\x22\xf8\x67\x34\x30\xdd\x5c\
\xf8\xf7\xe1\xae\xb0\x6f\xb4\xf8\x2d\xa7\x09\xe4\x5d\x49\x63\x74\
\xb1\xcf\x1c\x72\x17\x5e\x52\x49\x80\x2c\xa3\x71\xc8\xc8\x07\xda\
\xf4\x57\x8e\x7e\xca\xdf\xf0\x50\x4f\x82\xff\x00\xb6\xbf\x83\xe1\
\xd6\xbe\x18\xfc\x47\xf0\xb7\x8a\xad\xe4\x00\xbd\xbd\xbd\xea\xa5\
\xed\xa9\x3f\xc3\x2d\xbb\xe2\x58\xdb\xd9\x94\x67\xb6\x6b\xd8\xe8\
\x00\xa2\xbe\x49\xff\x00\x82\x80\x7f\xc1\x6e\xff\x00\x67\x5f\xf8\
\x26\xfc\x37\x16\x7e\x3c\xf1\xc5\xad\xf7\x8a\xa1\x52\x57\xc3\x1a\
\x16\xdd\x43\x56\x27\x9e\x1e\x35\x60\xb0\xfd\x66\x64\xf6\xcd\x7c\
\x51\xf1\x37\xfe\x0f\x47\xfd\x9f\x7c\x3a\x92\x7f\xc2\x2b\xf0\xff\
\x00\xe2\x47\x89\xda\x34\x8d\x81\xb8\x5b\x6d\x35\x19\x9b\xef\x28\
\xcc\x8e\xdf\x2f\xae\xdc\x1e\xd4\x01\xfb\x1b\x45\x7f\x3b\x7f\x19\
\xff\x00\xe0\xf7\x3f\x19\x5d\xeb\x93\x2f\xc3\xef\x82\xde\x18\xd3\
\xb4\xd5\x38\x8a\x4d\x7b\x52\x9e\xf6\x77\x1e\xac\xb0\xf9\x2a\xa7\
\xd8\x16\xfa\xd7\x07\xa3\xff\x00\xc1\xec\x3f\x1f\x6d\x2e\xc3\x5e\
\xfc\x2e\xf8\x4b\x79\x06\x79\x48\xe3\xbf\x85\xb1\xec\xdf\x68\x61\
\xfa\x50\x07\xf4\xc1\x58\x3f\x14\x7c\x7f\x67\xf0\xab\xe1\xbe\xbd\
\xe2\x6b\xf0\xcd\x67\xa0\xd8\x4d\x7f\x2a\xa9\xf9\xa4\x11\xa1\x6d\
\xa3\xfd\xa6\xc6\x07\xb9\x15\xf8\x63\xf0\x37\xfe\x0f\x74\xd3\xef\
\xee\xa3\x87\xe2\x27\xc0\xd9\xac\xe3\x66\x02\x4b\x9d\x03\x5f\x12\
\x32\x8e\xe4\x45\x3c\x4a\x0f\xd0\xca\x2b\xf4\x53\xe1\xc7\xfc\x15\
\x07\xe0\xbf\xfc\x15\x1b\xe0\x8f\x86\xed\x7e\x18\xf8\x9a\x3b\xfb\
\x8f\x11\x78\x97\x4a\xb4\xd5\x34\x0b\xf4\xfb\x26\xaf\x61\x6e\x97\
\x2b\x73\x2f\x9b\x6e\xc7\x26\x36\x8e\xdd\xd7\xcc\x42\xf1\x90\xd8\
\x0c\x7a\x50\x07\x5d\xf0\x87\xf6\xd1\xf1\x27\xc2\xcf\xda\x83\x41\
\xf8\x33\xf1\xc3\xfb\x3a\xc7\xc4\x5f\x11\x34\x81\xae\xf8\x27\x5c\
\xb6\x87\xec\xd6\x3a\xbc\xca\xa1\xaf\xb4\x56\x19\x21\x6e\xed\x09\
\x0c\x87\x3f\xbe\x85\x95\xb8\x75\x60\x7e\xaa\xaf\x8b\x3f\xe0\xe0\
\x0f\xd9\xbe\xf3\xf6\x82\xff\x00\x82\x63\xf8\xea\xff\x00\x41\x4b\
\x98\xfc\x69\xf0\xc7\xc9\xf1\xdf\x86\xef\x2c\xdc\xc5\x79\x65\x75\
\xa7\x38\x9d\xde\x09\x17\xe6\x49\x0c\x02\x65\x05\x79\xc9\x15\xc3\
\x7f\xc1\xbd\xff\x00\xf0\x59\xbb\x5f\xf8\x2a\x7f\xec\xfb\x7d\xa3\
\x78\x9a\xea\xc9\x7e\x2d\x7c\x3d\x58\xa0\xd6\x96\x30\x21\xfe\xdc\
\xb5\x60\x04\x5a\x94\x71\x7f\x06\xe3\x94\x95\x57\x2a\x92\x0c\x8c\
\x2c\x88\x28\x03\xf4\x32\x8a\x28\xa0\x02\x8a\x28\xa0\x06\x5c\x5b\
\xc7\x79\x6f\x24\x33\x46\xb2\x45\x2a\x94\x74\x61\x95\x75\x3c\x10\
\x47\xa1\xaf\x92\x7f\xe0\x99\x1f\x0f\x74\x2f\x8c\x5f\xf0\x4b\xcd\
\x33\xe1\xbf\x8b\xf4\xcb\x4d\x7f\x41\xd3\x64\xd7\x7c\x0d\xaa\x69\
\x97\xa9\xe6\x45\x2d\xb5\x9e\xa9\x79\x64\x20\x60\x7b\x08\x62\x40\
\x31\xd3\x00\x8c\x60\x57\xd7\x35\xf2\x7f\xc0\x2b\xc9\x3f\x63\xcf\
\xdb\x87\xc7\x9f\x0c\xf5\x80\x6d\xfc\x23\xf1\xa3\x55\xb8\xf1\xd7\
\x81\x6f\xdb\x88\x4e\xa5\x24\x6a\x75\x7d\x24\xb7\x41\x2f\x98\x9f\
\x6c\x8d\x7f\x8d\x27\x9f\x19\xf2\x9a\x80\x3f\x9f\xcf\xf8\x2c\xe7\
\xfc\x10\x8b\xe2\x67\xfc\x11\xe7\xe2\x95\xd7\xc5\x4f\x84\x7a\x86\
\xbd\xa9\x7c\x20\x6b\x8f\x36\xcf\x59\xb3\x99\x86\xa1\xe1\x62\xef\
\x81\x6d\x78\x57\xac\x7b\x88\x55\x9b\xee\xb8\x20\x30\x0d\xc1\xf2\
\x0f\x08\x7f\xc1\xc3\xdf\xb4\xce\x91\xfb\x3d\x6b\x1f\x0e\xb5\x2f\
\x88\xfe\x20\xbc\xd1\xef\x97\x6d\xb4\xb6\xaf\x1d\x9d\xf4\x00\xae\
\xd6\x8b\xed\x4a\xbe\x6a\xc2\x7a\x94\x8c\xa9\x27\x20\x32\x82\x6b\
\xee\x6f\xf8\x3b\x97\xfe\x0b\x01\x75\xe3\x7f\x88\xb2\x7e\xcb\xfe\
\x03\xd4\xb6\x68\x3e\x1d\x68\xee\x7c\x6d\x73\x03\x7f\xc7\xf5\xef\
\x0f\x15\x96\x7f\xbb\x08\xda\xee\x3f\xe7\xa1\x00\xf2\x95\xf8\x5f\
\x40\x16\x35\x6d\x5a\xe7\x5d\xd4\xa7\xbc\xbc\x9a\x5b\x8b\xab\xa9\
\x1a\x59\x65\x91\x8b\x34\x8e\xc7\x25\x89\x3c\x92\x7d\x4d\x57\xa2\
\x8a\x00\x28\xa2\x8a\x00\x2b\xf4\x47\xfe\x0d\x7e\xf8\xdd\xa4\x7c\
\x2d\xff\x00\x82\xbe\xfc\x35\xb7\xf1\x46\xa8\x2c\xf4\x8d\x59\x2f\
\xb4\xeb\x2f\xb4\x49\x88\x63\xbe\x9a\xd6\x44\x83\xaf\x00\xb3\x31\
\x41\xd0\x65\xc7\xb5\x7e\x77\x55\xef\x0d\x78\x8e\xf7\xc1\xfe\x22\
\xb0\xd5\xb4\xdb\x89\x2d\x35\x0d\x2e\xe2\x3b\xbb\x59\xe3\x38\x68\
\x65\x46\x0c\xac\x3d\xc3\x00\x68\x03\xfb\xe1\xd5\x34\xdb\x1f\x18\
\x78\x72\xe2\xce\xe1\x61\xbd\xd3\x75\x4b\x66\x86\x55\xc8\x68\xe7\
\x8a\x45\x20\x8f\x42\xac\xa7\xf1\x06\xbf\x8c\x4f\xd9\xe7\xf6\x8f\
\xf1\x37\xfc\x11\x8f\xfe\x0a\xc7\x79\xe2\x2d\x0d\x6e\x1b\xfe\x15\
\xaf\x8b\x2f\xf4\x4d\x4f\x4f\x0f\xb4\x6a\xda\x62\xdc\x3c\x33\xdb\
\xb7\x6f\x9e\x21\x95\x27\x21\x5d\x51\xba\xa8\xaf\x70\xfd\x85\x3f\
\xe0\xe5\xef\x8f\x5f\xb2\xcc\x27\x45\xd4\xf5\xcb\x7d\x5f\x43\x68\
\xed\x2d\x2d\x5e\xea\xd4\xdc\x7f\x64\xda\xc1\x34\x92\x0b\x78\x60\
\xde\x23\x58\xd9\x65\x74\x24\x28\x90\x05\x8f\x0d\x84\xda\x7c\x5f\
\xfe\x0a\x91\xf1\xf3\xc0\x9f\xb7\x4f\xc6\xe3\xf1\x5f\xc2\xf7\xba\
\x7e\x9f\xe2\x2f\x14\x41\x68\x3c\x41\x65\x24\x0b\x61\xe6\x5e\x6c\
\x21\xa6\x75\xc0\x8f\xcc\x2a\x14\x4b\x24\x78\x8d\x99\x77\xe1\x0c\
\x8c\x8a\x01\xfd\x8e\x7c\x1e\xf8\xb5\xa0\x7c\x7a\xf8\x53\xe1\xcf\
\x1b\x78\x57\x50\x87\x56\xf0\xdf\x8a\xf4\xe8\x35\x5d\x36\xee\x23\
\x95\x9e\x09\x90\x3a\x37\xb1\xc3\x0c\x83\xc8\x39\x07\x91\x5d\x25\
\x7e\x1b\xff\x00\xc1\xa6\xdf\xf0\x54\x4d\x23\x48\xf8\x67\xa4\x7e\
\xcb\x7e\x32\x76\xd2\xf5\xfb\x67\xbc\xbe\xf0\xb4\xb7\x53\xb3\x7d\
\xb4\x3b\xb5\xc4\x96\xca\x49\xda\x32\xa5\xe4\x8c\x2e\x01\x0b\x20\
\xe4\xed\x2d\xfb\x91\x40\x05\x14\x51\x40\x05\x7c\xc7\xff\x00\x05\
\x87\xf8\xe7\xe0\xcf\xd9\x9b\xfe\x09\xe9\xf1\x03\xc7\xfe\x34\xd3\
\xe1\xd4\xa1\xf0\xa5\xb4\x77\xda\x24\x26\x53\x0c\xeb\xac\x07\x0b\
\x60\xf0\x4a\xa4\x3c\x72\xac\xec\x84\x3a\x10\xc1\x43\x76\xc8\x3f\
\x4e\x57\xe1\xbf\xfc\x1e\xbb\xfb\x55\x2f\x86\xbe\x03\xfc\x2c\xf8\
\x37\x6b\x20\x37\x1e\x28\xd4\xa5\xf1\x2e\xa0\x81\xb0\x52\x1b\x51\
\xe5\x41\x9f\x50\xcf\x2c\xbf\x8c\x7e\xd4\x01\xfc\xf0\xf8\xfb\xc7\
\x5a\xb7\xc5\x0f\x1c\x6b\x1e\x24\xd7\xaf\xae\x35\x4d\x73\x5e\xbd\
\x9b\x50\xbf\xbc\x9d\xb7\x49\x73\x3c\xae\x5e\x47\x63\xea\x59\x89\
\xfc\x6b\x26\x8a\xfd\x0c\xff\x00\x82\x00\x7f\xc1\x1c\x97\xfe\x0a\
\x5f\xf1\xa7\x56\xf1\x67\x8e\x05\xc5\x8f\xc1\x5f\x86\x2a\x2f\xbc\
\x45\x32\x13\x1b\xeb\x12\xaa\x99\x12\xc2\x37\xfe\x1d\xca\xa5\xa4\
\x61\xca\xa0\xc0\xc3\x32\x9a\x00\xfc\xf3\xa2\xba\x2f\x8b\xbe\x28\
\xb7\xf1\xb7\xc5\x4f\x11\xea\xf6\x76\x96\xba\x7d\x96\xa5\xa9\x5c\
\x5c\x5b\x5a\xdb\x46\x23\x86\xda\x26\x91\x8a\x46\x8a\x38\x0a\xab\
\x85\x03\xd0\x57\x3b\x40\x16\x34\xbd\x22\xef\x5b\xba\x30\x59\xda\
\xdc\x5e\x4c\xb1\xbc\xc6\x38\x63\x32\x30\x44\x42\xee\xd8\x1c\xed\
\x54\x56\x62\x7a\x00\xa4\x9e\x05\x57\xaf\xbb\xbf\xe0\xda\xbf\x87\
\x31\xfc\x51\xff\x00\x82\xc8\xfc\x2a\xd2\xee\x6c\xe1\xbe\xd3\x5e\
\x3d\x55\xb5\x0b\x79\xa3\xf3\x22\x9e\xd8\xe9\x97\x4b\x2a\x38\xe8\
\x55\x95\x8a\x9c\xff\x00\x7a\xb8\x6f\xf8\x2d\x1f\xfc\x13\xff\x00\
\x4b\xff\x00\x82\x79\xfe\xdc\x7e\x28\xf0\x9f\x85\x75\x9b\x3f\x10\
\x78\x1a\xf2\xe5\xee\xf4\x3b\xab\x69\xbc\xef\xb1\xc6\xcc\x77\x59\
\x4c\xc3\x8f\x3a\x06\xca\x11\xd4\x80\xad\xc6\x71\x40\x1f\x25\x51\
\x45\x14\x00\x51\x45\x14\x01\xd5\x7c\x1d\xf8\xc7\xe2\x0f\x81\xff\
\x00\x14\x3c\x37\xe2\xef\x0d\xea\x37\x1a\x7e\xbd\xe1\x3d\x46\x0d\
\x53\x4c\xb9\x47\x39\xb6\x9e\x19\x04\x88\x47\xb6\xe0\x32\x3b\x8c\
\x8e\xf5\xfd\xc1\x7e\xc5\x5f\xb4\xde\x97\xfb\x66\x7e\xc9\xbf\x0f\
\xbe\x29\x68\xfb\x56\xcb\xc6\xda\x25\xbe\xa4\x62\x5f\xf9\x76\x99\
\x97\x13\x43\xf5\x8e\x51\x22\x1f\x74\xaf\xe1\x51\x4e\x18\x57\xf5\
\x01\xff\x00\x06\x71\x7e\xd2\x8f\xf1\x27\xf6\x06\xf1\x77\xc3\x9b\
\xb9\xcc\x97\x5f\x0e\x3c\x42\x2e\x2d\x15\x9f\x25\x2c\xb5\x08\xfc\
\xe5\x00\x7a\x0b\x88\xee\xbf\x3a\x00\xfd\x7b\xa2\x8a\x28\x00\xaf\
\xe4\x5b\xfe\x0e\x87\xfd\xab\x47\xed\x37\xff\x00\x05\x65\xf1\xa5\
\x9d\xac\x8d\x26\x97\xf0\xee\x38\xbc\x2f\x6a\x77\xee\x52\x61\x5d\
\xd3\x15\xf6\xf3\x9e\x4a\xfe\xb2\xfe\x28\xf8\xc5\x7e\x1d\xfc\x33\
\xf1\x17\x88\x1b\x69\x5d\x0f\x4c\xb9\xbf\x20\xf4\x3e\x54\x4c\xf8\
\xff\x00\xc7\x6b\xf8\x79\xfd\xbb\x3c\x49\xff\x00\x09\x6f\xed\x8d\
\xf1\x2b\x50\xf3\x1a\x66\xb9\xf1\x05\xdb\x33\xb1\xcb\x3b\x07\x20\
\x93\xf5\x20\x9a\x00\xf3\x5f\x0c\x78\x6e\xfb\xc6\x5e\x24\xd3\xf4\
\x8d\x36\xde\x5b\xcd\x47\x54\xb9\x8e\xd2\xd6\x08\xd7\x73\xcd\x2c\
\x8c\x15\x14\x0e\xe4\xb1\x03\xf1\xaf\xeb\xeb\xf6\x64\xff\x00\x82\
\x5b\x78\x4f\xf6\x15\xff\x00\x82\x5a\x58\xf8\x5e\xdf\x4f\x92\xf3\
\xc7\x9e\x0b\xf0\x4e\xad\x79\x73\x3c\x37\xb3\x2a\x4b\xac\x5d\xd8\
\xcb\xf6\x99\x0c\x48\xe2\x39\x1b\x27\xca\x47\x75\x2c\x12\x35\x00\
\x8a\xfe\x57\x3f\x61\x4f\x88\xf6\x1f\x02\x3e\x3f\xe9\x7f\x11\xb5\
\x38\x74\x8b\x9b\x7f\x01\x93\xaa\xdb\xc1\xa9\x43\x24\xf0\xdd\x5d\
\xaf\x16\xf1\x88\xa3\x64\x69\x1b\xcc\x2a\xc1\x77\xa2\xfc\x84\xb3\
\x00\x39\xf7\xfb\x0f\xf8\x38\x6b\xf6\x94\xf0\xb7\xc4\x4d\x67\x5e\
\xf0\xe6\xbd\xe1\x3f\x0f\x7f\x6e\x42\xf6\x77\x50\x59\x78\x47\x4d\
\x8d\x2e\x2d\x98\x9c\xc7\x21\xf2\x77\x37\xd4\xb6\x73\xde\x80\x3e\
\x1e\xb9\x84\xdb\xdc\x49\x19\xeb\x1b\x15\x3f\x85\x32\xa6\xd4\x2e\
\xda\xfe\xfe\x69\xdf\x6e\xf9\xa4\x69\x1b\x68\xc0\xc9\x39\xe0\x54\
\x34\x01\xfb\x29\xff\x00\x06\x5e\xfe\xcf\x32\x78\xdb\xf6\xec\xf1\
\xe7\xc4\x8b\x88\x5b\xfb\x3b\xe1\xff\x00\x85\xda\xd5\x27\x23\xe5\
\x4b\xab\xd9\x02\x28\xcf\x6f\xdc\xc5\x71\x5f\xae\xdf\xf0\x56\xe9\
\xff\x00\x66\x7f\xdb\x6b\xf6\x67\xd4\xbe\x15\xfc\x46\xd7\x22\x5b\
\x5b\xe9\xc7\xf6\x57\x88\xac\x6d\xc3\x43\xe1\xdb\xf0\x76\xa5\xd4\
\x77\x2e\x56\x16\x08\x49\x12\x22\x39\xca\x6f\x07\x1d\x47\x85\x7f\
\xc1\x0d\x3f\xe0\x98\x7e\x3c\xfd\x9d\xbf\xe0\x91\xbe\x1d\xf0\xf6\
\x9c\xf6\x3e\x11\xf1\x57\xc7\x8b\xa3\xe2\x4f\x18\x6b\x57\x96\xcb\
\x71\x75\xa1\x69\x4f\x12\x8b\x6b\x78\x2d\xdf\xe5\x7b\x86\x80\x29\
\x1e\x68\x29\x13\x4f\x29\x65\x72\xa1\x1b\xf0\x03\xfe\x0a\x81\xfb\
\x4c\x69\xbf\x1b\xff\x00\x6b\x1f\x19\x47\xe1\x3f\xed\x01\xe1\x3d\
\x1f\x50\x9b\x48\xd2\xee\x75\x0b\xd9\x2f\xaf\xf5\x0b\x68\x1c\xc6\
\x2e\x26\x9e\x42\x58\xb4\xc5\x4c\x85\x53\x6a\x28\x65\x55\x55\x55\
\x02\x80\x3c\xbb\xf6\xab\xfd\x9b\x75\x4f\xd9\x3b\xe3\x96\xb9\xe0\
\x9d\x53\x54\xf0\xff\x00\x88\x1b\x49\x9c\xad\xb6\xad\xa1\x6a\x31\
\x6a\x1a\x6e\xab\x01\xe6\x39\xe1\x9a\x36\x2a\x55\x97\x07\x07\x0c\
\xa7\x20\x80\x41\x15\xe7\x55\x7d\x3c\x43\x33\x68\xc3\x4f\x99\x63\
\x9a\xd5\x18\xbc\x41\x94\x6f\x85\x8f\x52\xad\xd4\x03\x8e\x47\x43\
\xe9\x9e\x6b\xd1\xfe\x32\xfe\xc5\x3f\x12\xfe\x05\xfc\x27\xf0\x4f\
\x8f\xb5\xff\x00\x09\xea\xf6\xbe\x07\xf8\x89\xa7\xae\xa5\xa0\x6b\
\x62\x02\xf6\x77\x88\x49\x05\x0c\x83\x84\x91\x4a\x9c\xa3\x60\x91\
\x86\x00\xa9\x06\x80\x3c\xa6\x8a\x28\xa0\x02\xbf\x6c\xff\x00\xe0\
\xcb\x5f\x89\xb3\x69\x3f\xb6\x5f\xc4\x0f\x0c\x33\xb0\xb7\xd7\xbc\
\x12\x6e\x0a\xe7\xe5\x69\x2d\x2f\xa3\xd8\x71\xea\x12\xe6\x41\xf8\
\xd7\xe2\x65\x7e\xb7\x7f\xc1\xa0\x1e\x26\xb5\xd0\x7f\xe0\xa5\x9a\
\x7c\x12\x17\xfb\x56\xb5\xa1\x6b\x5a\x6c\x63\xf8\x71\xe5\x5a\xdc\
\x8f\xfd\x27\x7f\xce\x80\x3f\xa8\xea\x28\xa2\x80\x3c\xbf\xf6\xcf\
\x2f\x27\xec\xc3\xe2\xeb\x78\xdb\x6b\x5f\xdb\x25\x89\x27\xd2\x79\
\xa3\x84\xfe\x8e\x6b\xf8\x9c\xfd\xb2\x34\x1b\x8f\x0c\x7e\xd6\xff\
\x00\x14\x34\xeb\xa4\x68\xe7\xb1\xf1\x66\xab\x6e\xea\x47\x2a\x52\
\xf2\x55\x23\xf4\xaf\xee\x27\xe3\x6f\x80\x24\xf8\xa3\xf0\xab\x5a\
\xd0\xa1\x99\x60\xb8\xbe\x80\x79\x12\x30\xf9\x52\x54\x61\x22\x13\
\xed\xb9\x57\x3e\xd5\xfc\x93\xff\x00\xc1\xc5\xbf\xb2\x56\xa5\xfb\
\x3e\xff\x00\xc1\x4f\xfe\x32\x6a\x1f\x63\x92\x2d\x1f\x5c\xf1\x02\
\x6b\xd0\x36\xcc\x2f\x97\xa9\xc6\xd7\x4a\x47\xb7\x9c\xb7\x49\xec\
\x63\x22\x80\x3e\x78\x87\xf6\x5b\xd6\x13\xfe\x09\xd9\x2f\xc6\x2f\
\x29\xbf\xb1\x24\xf1\xbf\xfc\x23\x3e\x66\x38\xf3\x56\xd1\x66\xc7\
\xe2\x1b\xff\x00\x1d\x35\x3f\xed\x57\xe0\xef\x80\xfe\x1f\xfd\x9e\
\x7e\x06\x6a\x1f\x0a\x7c\x4d\xe2\x0d\x63\xe2\x06\xb1\xa1\x5c\xc9\
\xf1\x27\x4f\xd4\x22\x65\x83\x48\xd4\x16\x65\x11\x2c\x04\xc6\xa0\
\xab\x29\x93\x85\x67\x1b\x52\x32\x48\x66\x22\xbf\x63\x3f\xe0\xdd\
\xff\x00\xd9\xb3\xc1\x5f\xf0\x54\x7f\xf8\x22\x57\xc6\x2f\xd9\xaf\
\xc6\x30\xff\x00\x67\x9d\x1f\xc5\x11\xea\x76\xfa\x9d\xaa\x06\xb9\
\xd3\xee\x2e\xad\xa3\x9a\xd6\xed\x73\xc1\x64\x78\x64\x52\x38\xdd\
\x1e\xe5\x38\xc9\x35\xf2\xb7\x89\xff\x00\xe0\xce\x8f\xda\xc7\x4b\
\xf8\x91\x75\xa4\xe9\xb7\x5f\x0d\x75\x5d\x0e\x36\xcc\x1a\xe9\xd7\
\x1a\xde\x09\x97\x23\xac\x2d\x11\x99\x58\x0e\x48\xda\x47\x1c\x31\
\xe3\x20\x1f\x9e\xfa\xbf\xec\xbb\xab\x69\x1f\x03\x5b\xc7\x53\xc7\
\x71\x0e\x9a\xda\x55\x86\xa5\x13\x3a\x61\x66\xfb\x55\xed\xdd\xa2\
\x80\x7b\xf3\x67\x31\xff\x00\x80\x9a\xfb\xcf\xfe\x0d\xc3\xff\x00\
\x82\x20\x6a\x1f\xf0\x50\x5f\xda\x07\x4c\xf8\x8d\xe3\xad\x26\x64\
\xf8\x3b\xe0\x3b\xe4\xbb\xbd\xfb\x44\x65\x62\xf1\x15\xe4\x78\x78\
\xb4\xf4\xcf\xdf\x4c\xed\x79\x88\xe1\x50\x04\xce\xe9\x3e\x5f\xde\
\xef\x86\x9f\xf0\x44\x4f\x82\x5a\x7f\xec\x65\xf0\xd3\xe1\x0f\x8e\
\x3c\x37\x6b\xe3\x0b\x3f\x02\xe9\xba\x75\xad\xe5\xcb\x49\x2d\xb0\
\xd6\xe6\xb4\x69\xe6\xcc\xc1\x18\x16\x84\xdc\x5d\x5c\xc8\x22\x62\
\x47\xef\x30\x73\x8a\xfa\xbb\xe1\xf7\xc3\xcd\x07\xe1\x3f\x83\x34\
\xff\x00\x0e\xf8\x67\x47\xd3\x7c\x3f\xa0\xe9\x30\x88\x2c\xb4\xfb\
\x0b\x75\xb7\xb7\xb6\x41\xfc\x28\x8a\x00\x1d\xcf\xb9\x24\xf5\x34\
\x01\x37\x8a\x74\x99\xb5\x5f\x08\xea\x56\x36\x6e\xb6\xd3\xdc\xd9\
\xcb\x04\x0e\x38\x11\x33\x21\x55\x3f\x81\x23\xf2\xaf\xe1\x87\xe1\
\x77\x8a\xee\xff\x00\x64\x0f\xda\xfb\xc3\xfa\xdf\x88\x34\x1b\x5d\
\x77\x50\xf8\x65\xe2\xe8\x2e\xf5\x3d\x16\xf7\xfd\x4d\xec\xb6\x37\
\x81\xa5\xb6\x90\x90\x78\x66\x89\x94\x92\x0f\x5e\x87\xa5\x7f\x76\
\x15\xf8\xef\xff\x00\x05\x75\xff\x00\x83\x4e\xfc\x3d\xfb\x73\xfc\
\x7b\xd6\xbe\x2a\x7c\x29\xf1\xb5\xa7\xc3\xbf\x15\x78\xaa\xe0\xde\
\x6b\xba\x4e\xa5\x62\xd7\x1a\x55\xfd\xd3\x7f\xac\xb9\x8d\xa3\x22\
\x48\x1d\xcf\xcc\xe3\x6b\xab\x31\x66\x1b\x49\x39\x00\xfe\x7b\x3f\
\x6f\xff\x00\xda\x8a\xc7\xf6\xd4\xfd\xb2\xbe\x21\x7c\x54\xd3\x3c\
\x2b\x67\xe0\x8b\x1f\x1b\x6a\x87\x50\x87\x45\xb6\x90\x4a\x96\x43\
\x62\x21\xcb\xaa\x20\x67\x62\xa5\xd9\x82\x8c\xb3\xb1\xc5\x7e\xec\
\xfc\x7b\xf8\x13\xac\x37\xfc\x19\x93\xe1\x7b\x3d\x69\x6e\xad\x75\
\x6d\x07\xc3\x9a\x77\x89\xa1\x07\x2a\xe9\x0b\x6a\xa2\xe2\x1c\xf7\
\xc1\xb7\x9d\x7e\x99\xaf\x31\xf8\x2b\xff\x00\x06\xa1\xfc\x25\xfd\
\x91\x3e\x2a\x78\x27\x50\xfd\xa6\x7e\x3a\x59\xeb\x50\xea\xd7\x8e\
\xd6\xbe\x15\xd0\xf4\x99\x6d\xe1\xd5\x3e\xce\xbe\x6c\xa6\x6b\x92\
\xcd\x22\xda\x46\x83\x74\xd2\x18\xe2\x54\x53\xcc\x89\x90\x4f\xe9\
\x77\xfc\x16\x2f\xc7\x3e\x0c\xf8\xb1\xff\x00\x04\x3e\xf8\xf1\x75\
\xe0\xbd\x57\x43\xd6\x3c\x33\x67\xe1\x79\xac\xe0\x9b\x4a\x95\x24\
\xb3\x88\xdb\xcb\x1a\x98\x90\xa7\xcb\x84\x2a\x17\x03\x81\x8c\x76\
\xa0\x0f\xe3\xa6\xea\xe9\xef\x27\x69\x24\x21\xa4\x73\x96\x20\x01\
\x93\xf8\x54\x74\x51\x40\x05\x7e\xc4\x7f\xc1\xaa\xbf\x09\x5b\x4d\
\xfd\xaa\xfe\x10\xf8\xf3\xec\xf2\x08\xf5\x0f\x13\x78\x97\x42\x69\
\x73\xf2\xb3\x27\x87\xfc\xe5\x1f\x80\x2f\x5f\x8e\xf5\xfd\x49\x7f\
\xc1\xae\xdf\xb1\x43\x78\x63\xfe\x09\xbd\xf0\xc3\xc5\x1a\xe6\x9f\
\x2d\x8e\xb1\x63\xe3\xad\x73\xc5\x10\x09\x17\x6c\x83\x7d\x9c\x9a\
\x56\xd3\xe9\xc6\xf3\x8f\xf6\x45\x00\x7e\xb5\x51\x45\x14\x00\x57\
\xc7\xdf\xf0\x57\x2f\xf8\x25\x0f\x87\x7f\xe0\xa5\xdf\x06\xf5\x6b\
\x36\xfb\x35\x8f\x8b\x7f\xb0\x6e\xb4\xbb\x1b\xb9\x23\x1b\x64\x62\
\xc9\x3d\xb6\xf6\xea\x3c\xab\x88\x94\x83\xd9\x65\x9c\x63\xe7\x35\
\xf6\x0d\x14\x01\xf8\x37\xff\x00\x06\x65\x49\x6f\xf0\xaf\xe2\xc7\
\xed\x49\xf0\xd3\x56\xba\x6b\x7f\x16\xe8\xf7\x9a\x52\xc9\x61\x32\
\xf9\x72\xb2\x59\xc9\x7b\x6b\x3b\x6c\xc9\xff\x00\x57\x2b\x22\xb7\
\x27\x05\xd7\xd6\xbf\x79\x2b\xf9\x65\xfd\xbb\x3e\x2a\xf8\xeb\xfe\
\x08\x8f\xff\x00\x07\x0d\xfc\x50\xf8\x9f\xe0\xdb\x1b\x7b\xff\x00\
\x33\x56\x3e\x23\x96\xc2\xf0\xed\xb7\xd6\x74\x8d\x5c\x09\x2e\x21\
\x2c\x06\x55\x44\xec\xc8\x24\x19\xd8\xe8\x84\x86\xc1\x07\xf6\x23\
\xe0\xd7\xfc\x1c\x4f\xf0\x9f\xf6\xd6\xf8\x0c\x63\xf8\x23\x71\x0d\
\xf7\xc7\x8d\x68\xc1\xa6\x68\x9f\x0f\x7c\x46\x4d\x8d\xd7\xf6\x84\
\xec\xa9\xe6\x3b\x80\x52\x6b\x58\x01\x79\xa5\x92\x16\x27\xca\x85\
\xb8\x56\x20\x50\x07\xd2\x3f\xb6\x4f\xed\xdf\x6b\xfb\x3a\x6b\x9a\
\x47\x80\xfc\x1b\xe1\xfb\xaf\x89\x5f\x1b\x3c\x61\x13\x3f\x87\x7c\
\x19\xa7\xcc\x23\x73\x10\x3b\x5a\xfe\xfa\x63\x95\xb3\xb0\x8c\x9f\
\x9e\x79\x3a\x9f\x95\x03\xb7\x03\xc9\x3e\x14\xfe\xc4\x1f\xb5\x9f\
\x83\x34\x8b\xdd\x62\xe3\xf6\xaa\xd3\x63\xf1\x37\x89\xb5\x3b\xad\
\x63\x55\xd1\xe6\xf0\x34\x5a\xa6\x81\xa5\x49\x75\xb3\x75\xbd\x89\
\x92\x74\xb9\x11\x5b\x88\xd4\x45\xba\x40\xa4\xf9\x8c\xc8\x7c\xc2\
\x07\xb6\xfe\xc5\x9f\xb1\x56\x9b\xfb\x2a\x68\x1a\xa6\xad\xaa\x6a\
\x52\x78\xcb\xe2\xa7\x8d\xa4\x5b\xef\x1a\x78\xce\xf6\x31\xf6\xcd\
\x76\xeb\x1f\x71\x3f\xe7\x8d\xa4\x5f\x72\x0b\x74\xc2\x44\x80\x70\
\x58\xb3\x37\xb7\xd0\x07\xc6\x5e\x0a\xf8\x55\xfb\x44\x7e\xc1\x1e\
\x23\xd7\xbc\x49\x71\xe3\xad\x73\xf6\x9e\xf0\x16\xb4\xd1\xdf\xeb\
\x5a\x6e\xa7\x04\x56\x7e\x2a\xd0\xa4\x8e\x20\x92\xc9\xa5\x47\x0a\
\xad\xb5\xcc\x2c\x15\x58\xda\x30\x89\xc6\xcf\x91\xdd\xd8\x87\xfa\
\x7b\xe0\x4f\xc7\xaf\x08\xfe\xd2\xff\x00\x0c\x74\xef\x18\xf8\x1f\
\x5b\xb4\xd7\xfc\x3f\xaa\x06\xf2\xae\x20\xc8\x68\xdd\x4e\xd9\x22\
\x95\x18\x07\x8a\x54\x60\x55\xe3\x70\x1d\x18\x10\xc0\x11\x8a\xeb\
\xeb\xe2\xbf\xdb\x0b\xc0\x3a\x9f\xfc\x13\xc7\xe2\x86\xab\xfb\x4c\
\x7c\x37\xb2\xba\x9f\xc1\xf7\x8e\xb3\xfc\x63\xf0\x75\x92\x6e\x8b\
\x55\xb2\x5c\x2b\xf8\x82\xd2\x21\xc2\xea\x16\xa9\xf3\xca\x17\x1f\
\x69\x81\x18\x37\xce\x88\xc4\x03\xec\x6d\x53\xc3\x5a\x6e\xb8\xec\
\xd7\xda\x7d\x8d\xe3\x34\x0f\x6a\x4c\xf0\x2c\x84\xc4\xfb\x4b\xc7\
\xc8\x3f\x23\x6d\x5c\xaf\x43\xb4\x67\xa0\xaf\x89\xff\x00\xe0\xe2\
\x2d\x7b\x4d\xf8\x41\xff\x00\x04\x44\xf8\xe5\x1d\xad\xbd\xae\x9d\
\x6b\x3e\x91\x6f\xa5\xdb\xdb\xc1\x12\xc5\x1a\xb5\xcd\xfd\xbc\x58\
\x55\x50\x00\xcf\x98\xc7\x8f\x7a\xfb\x5f\xc2\xbe\x29\xd3\xbc\x73\
\xe1\x7d\x37\x5a\xd1\xef\x2d\xf5\x2d\x27\x58\xb5\x8a\xf6\xca\xee\
\x07\xdf\x15\xd4\x12\x20\x78\xe4\x46\xee\xac\xac\x08\x3d\xc1\xaf\
\xc9\xef\xf8\x3b\xfb\xe3\xee\x97\x61\xff\x00\x04\xfd\xd0\x7e\x12\
\xe9\xba\x95\xad\xe7\x8c\xfe\x20\x78\xc3\x4b\x8c\x68\x96\xf2\xac\
\x97\xcf\x68\x9e\x7c\xa2\x4f\x24\x1d\xfb\x5a\x68\xa2\x55\x38\xc1\
\x6e\x07\x34\x01\xfc\xba\x30\xda\x68\x55\xdd\x9f\x61\x9a\xbb\xe2\
\x4d\x3a\x4d\x1f\x5a\xb8\xb3\x9a\x36\x86\x7b\x57\x68\x65\x8d\xbe\
\xf4\x6e\xa4\xab\x29\xf7\x04\x11\x56\x3c\x2f\xe0\xdb\xcf\x16\xcd\
\x75\x15\xa7\x93\xbe\xde\x23\x21\x12\x48\x13\x79\x1d\x11\x73\xd5\
\xce\x0e\x14\x72\x48\xc0\xe7\x02\x80\x13\xc0\xba\x1d\xd7\x89\xfc\
\x6d\xa3\xe9\xb6\x36\xf2\x5e\x5f\x6a\x17\xb0\xdb\x5b\xdb\xa2\xee\
\x69\xe4\x77\x0a\x88\x07\x72\xcc\x40\xfc\x6b\xfb\x98\xfd\x8b\x3e\
\x01\xa7\xec\xb9\xfb\x26\xfc\x3d\xf8\x7e\x36\x99\xbc\x2f\xa2\x5b\
\xda\x5d\xba\xf4\x96\xeb\x6e\xeb\x89\x3f\xe0\x53\x34\x8d\xff\x00\
\x02\xaf\xe5\xe3\xfe\x08\x93\xff\x00\x04\xee\xf1\x17\x87\xff\x00\
\xe0\xbe\x5f\x0d\x7e\x1b\xfc\x42\xd0\x66\xd3\x75\x2f\x87\xb7\x2d\
\xe2\x7d\x5a\xc6\xe9\x39\x85\xed\x6c\xbe\xd7\x06\x47\x71\xe7\xb5\
\xbf\xb5\x7f\x5a\xd4\x00\x51\x45\x14\x00\x51\x45\x14\x01\xf2\x07\
\xfc\x14\xa3\xfe\x09\x07\xe0\xbf\xf8\x28\x4f\x8e\x3c\x27\xe3\x0b\
\xa9\x21\xd2\xfc\x5d\xe1\xdb\x79\x74\x3b\xc9\xe5\x8b\xcd\xb7\xd6\
\xf4\x3b\x9c\xad\xd5\x8c\xe8\x30\x72\x15\xdd\xe1\x90\x10\x63\x93\
\x9e\x87\x8f\xcd\x8f\xf8\x20\xbf\xec\x79\xe0\x9f\xf8\x24\x07\xfc\
\x14\x97\xe2\xc6\x87\xf1\xc3\xc4\xd3\x78\x37\xc7\x92\x33\x78\x63\
\xc0\x57\x3a\xd5\xa7\xd8\x74\x3f\x15\xe9\x8e\xeb\x37\xda\xed\xaf\
\xe4\x1e\x53\xdd\x48\x12\x20\x60\x0e\xac\xbf\x30\xc3\x92\x42\x7e\
\xf3\x57\xc8\x5f\xf0\x5c\xed\x02\x1f\x19\xff\x00\xc1\x39\xfc\x4f\
\xe1\xd9\x74\x3d\x3f\x58\xff\x00\x84\xb7\x56\xd1\xfc\x3a\x67\xbe\
\xb1\x4b\xa8\x74\x48\xef\xb5\x1b\x7b\x59\xb5\x03\xbd\x48\x8b\xc8\
\x86\x59\x5c\x4b\xc7\x96\x40\x6c\x8c\x66\x80\x3e\xbb\x8e\x45\x9a\
\x35\x65\x65\x65\x61\x90\x41\xc8\x22\x9d\x5c\xef\xc2\x6b\xaf\x0c\
\x4d\xf0\xe7\x48\x83\xc1\xb7\x9a\x4d\xf7\x86\x74\xdb\x64\xd3\xf4\
\xf7\xd3\x2e\x52\xe2\xd6\x38\xa0\x1e\x50\x8d\x1d\x09\x5f\x93\x66\
\xdc\x03\xc1\x5c\x57\x45\x40\x05\x56\xd6\x34\x8b\x5f\x10\x69\x17\
\x5a\x7d\xf4\x11\xdd\x59\xdf\x42\xf6\xf3\xc3\x22\xee\x49\x63\x75\
\x2a\xca\xc0\xf5\x04\x12\x08\xf7\xab\x35\xf9\x1f\xff\x00\x07\x3a\
\xfe\xdf\xbe\x32\xfd\x89\x6e\x7c\x0f\xa7\xe8\xfe\x32\xf1\xff\x00\
\x87\x34\x3f\x1e\xe8\x5a\x85\xaa\xa7\x85\xef\x21\xd3\x5e\xdb\x50\
\x82\xea\xcc\xa4\xf3\x5d\x18\x24\x95\x63\x68\x26\x99\x36\xc6\x54\
\xe4\x2b\x73\x82\x08\x07\x3b\xfb\x01\x2f\xc6\x4b\x5f\xda\x0a\x1f\
\xd8\xf4\xfc\x66\xf1\x86\x9b\xe1\x3f\x84\xba\x87\x89\x74\x7d\x46\
\x1f\x0e\xe9\xf6\x36\x7a\xd6\x99\xa1\x59\x8b\x19\x74\x3b\x96\xbd\
\x96\x39\x64\x54\xb9\x8e\xfc\xc2\x36\xaa\x90\x6d\xf0\xad\x85\x26\
\xbc\x0f\xe2\x64\x3f\x0b\x7f\x65\x7f\xf8\x28\x47\xc7\x1f\x10\x7c\
\x4c\x97\xce\xf8\x95\xfb\x33\x78\x72\x3b\xaf\x87\xfa\x25\xf4\x93\
\xea\xba\xa7\xc4\x5d\x5e\xfd\x47\xd9\x75\xdb\xbb\x89\x9e\x57\x9a\
\x78\xbc\xeb\x45\x16\xca\x76\xc5\x82\xe8\xaa\xaa\x45\x74\x1f\xf0\
\x4d\x6f\xf8\x28\x17\x83\x7f\x63\x3f\xd9\xdb\x51\xd0\xff\x00\x65\
\x3f\x82\xdf\x16\xbf\x69\xef\x8f\x5e\x3f\x75\xbf\xf1\x67\x8b\xce\
\x87\x79\x6f\xa2\x4d\x7d\x83\xb5\x5e\xf2\xe3\x33\x9b\x58\x0b\xb0\
\x40\xe1\x0b\xfc\xce\xce\x8c\xe7\x17\xbf\x64\x5f\xf8\x37\x47\xf6\
\x9c\xf8\xf9\xfb\x52\xf8\x93\xf6\x9a\xf8\xff\x00\xf1\x2b\x4f\xf8\
\x77\xf1\x63\x53\x9e\x6d\x7b\x41\xb4\xd1\x4a\x5f\x5c\xe9\xda\xbe\
\xc1\xf6\x39\x27\x2a\x4c\x11\xdb\x40\x56\x34\xf2\x11\xa5\x2f\x1a\
\x6c\x2c\xbc\xe4\x03\xf3\xb7\xe0\x27\xfc\x11\x7f\xe2\x89\xfd\xa8\
\xfc\x1f\xe0\xad\x6f\xc3\x70\xeb\xdf\x17\xbc\x51\x69\x1f\x89\x21\
\xf0\x8d\xd8\x97\xca\xd0\xad\x26\x67\xf2\xaf\xf5\xc9\x02\xec\xb6\
\xb7\x42\x04\xaf\x0e\xe6\x96\x43\xb2\x10\xa1\x9d\xb1\xfb\x19\xfb\
\x1a\xff\x00\xc1\xa7\xbf\x0b\xff\x00\x67\x76\xf8\x5b\xe2\x6f\x12\
\x78\xa6\xfb\xc4\x9f\x10\x3c\x17\xe2\x2b\x1f\x12\xeb\x13\x0b\x48\
\xdb\x4b\xd4\xa4\xb7\xf3\x9c\xda\x45\x11\x0a\x52\x26\x9e\x48\x1c\
\xbb\xef\x62\x2d\x55\x40\x50\xc6\xbe\xc9\xff\x00\x82\x61\x7c\x4f\
\xf0\xf7\xc6\xef\x87\xfe\x2e\xf1\x35\xc7\x85\x2c\xbc\x23\xf1\x9a\
\x2d\x72\x4d\x13\xe2\x9d\x87\x98\xd3\xdd\x5b\xeb\x76\x8a\xa8\xca\
\x24\x72\x5d\xad\x1a\x32\x92\xdb\x00\x76\x08\x66\x5d\xa0\x12\xd5\
\xf4\xed\x00\x78\x3e\xb3\xff\x00\x04\xe5\xf8\x6b\xab\xfe\xdf\x9a\
\x37\xed\x28\xb6\xba\xad\x8f\xc4\xdd\x23\x44\x97\x40\x79\xad\x6e\
\xfc\xbb\x3d\x4a\xd9\xd1\x90\x1b\x88\xb6\x9f\x31\xd1\x5b\x0a\x77\
\x0c\x6d\x5c\x83\xb5\x71\xe9\x5f\x18\x3e\x3e\xf8\x17\xf6\x7b\xd0\
\x23\xd5\x7c\x7b\xe3\x2f\x0a\xf8\x2b\x4c\x99\x8a\x47\x75\xae\xea\
\xb0\x69\xf0\xca\xc3\xaa\xab\x4a\xca\x18\xf2\x38\x1c\xf3\x5a\x9f\
\x11\xfc\x7d\xa6\xfc\x2a\xf8\x7b\xaf\x78\xa3\x5a\x9b\xec\xda\x3f\
\x86\xf4\xeb\x8d\x52\xfa\x6c\x7f\xaa\x82\x08\xda\x59\x1b\xf0\x55\
\x26\xbf\x89\xdf\xf8\x29\x5f\xfc\x14\x4b\xc7\x1f\xf0\x53\x0f\xda\
\xab\xc4\x1f\x12\x3c\x65\x7d\x70\xd6\xf7\x53\xc9\x06\x87\xa4\x97\
\xdd\x6d\xa0\xe9\xe1\x8f\x95\x6d\x12\xf4\x18\x5c\x17\x61\xcb\xb9\
\x66\x3c\x9a\x00\xfe\xd7\x7e\x19\xfc\x56\xf0\xbf\xc6\x8f\x09\x41\
\xaf\xf8\x3f\xc4\x9a\x0f\x8a\xb4\x3b\xa2\x56\x1d\x47\x47\xbf\x8a\
\xfa\xd6\x52\x3a\x81\x24\x4c\xca\x48\xc8\xc8\xcf\x14\x57\xf3\xa9\
\xff\x00\x06\x4f\x6a\x1f\x10\x8f\xed\x77\xf1\x52\xd7\x4f\x93\x52\
\x6f\x85\xeb\xe1\x75\x97\x5a\x8c\xbb\x7d\x8a\x3d\x50\xdc\xc4\x2c\
\xdb\x1d\x3c\xe3\x12\xdd\x80\x47\x25\x03\x67\xa0\xa2\x80\x3f\xa4\
\xaa\x28\xa2\x80\x0a\xf9\x17\xf6\x9f\xf8\xa7\xe1\xbf\x10\xff\x00\
\xc1\x43\x3c\x2d\xf0\xb7\xe2\x86\xa9\xa4\x69\x7f\x0d\x57\xc0\x97\
\x3e\x30\xb5\xb3\xd5\xae\x52\xdb\x4e\xf1\x1e\xa5\x15\xfa\x41\x24\
\x57\x0d\x23\x04\x99\x6d\xa1\x64\x94\x40\xd9\x52\x67\xde\xc0\xf9\
\x63\x05\x14\x00\xdf\xf8\x26\x86\xa5\xe0\xbd\x33\xf6\x80\xfd\xa7\
\xbc\x3b\xe0\xfd\x4a\xc6\xf2\x2b\x7f\x1a\xd8\xeb\xad\x0e\x8c\x22\
\x1a\x1d\xad\xbd\xf6\x93\x68\xd6\xe2\xd8\x44\x4a\x09\x58\x43\x23\
\x4d\x8c\x16\x76\x57\x20\x6f\x15\xf5\xe5\x14\x50\x07\x01\xfb\x55\
\xfc\x6d\x87\xf6\x6c\xfd\x9a\x3c\x7b\xf1\x02\x68\x5a\xe2\x3f\x06\
\xe8\x37\x9a\xbf\x94\xab\x9f\x30\xc3\x0b\x3a\x83\xe8\x09\x03\x27\
\xb0\xc9\xed\x5f\x9b\xdf\x1d\xbf\xe0\x84\xbf\x0f\xfc\x4d\xff\x00\
\x04\xbf\xd6\x3c\x59\xe2\x9b\x7d\x3f\xe2\x07\xed\x01\x6f\xa3\x47\
\xe3\xad\x53\xc6\x5a\x8e\xa9\x7b\xab\x41\xe2\x0d\x4e\xda\x3f\xb5\
\xc9\x07\xcd\x27\x36\x13\x05\x78\x84\x51\x85\x5d\x8e\xa4\x0c\xa8\
\x34\x51\x40\x1b\x9f\x02\x3f\xe0\xe5\x6f\x80\x7a\x4e\x81\xa3\xea\
\xfe\x32\xb0\xf1\x47\xc1\x4f\x86\x3a\x96\x83\x6c\xbe\x0b\x8f\x50\
\xf0\x7d\xda\xda\xeb\x8d\x11\xf2\xee\xda\xd6\x5b\x68\xde\x2f\x26\
\xde\x41\xe4\x22\x2e\x09\x11\xbb\x1c\x02\x82\xba\xdf\x8d\xbf\xf0\
\x75\x2f\xec\x65\xf0\x93\xc1\xd2\xea\x3a\x5f\xc4\x4d\x4b\xc7\x9a\
\x87\x94\x64\x83\x4a\xd0\x74\x2b\xc3\x71\x33\x63\x85\x2f\x71\x1c\
\x51\x26\x4f\xf7\x9c\x63\xde\x8a\x28\x03\xe1\xaf\xf8\x24\xb7\xfc\
\x15\x03\xe2\xe7\xc6\x5f\xf8\x29\x27\x8c\x7f\x6a\x4f\x14\x78\x6d\
\x7c\x33\xf0\x07\xe3\x77\x8b\x34\xdf\x85\xd7\x51\x22\x15\x83\x4e\
\xbc\x30\xc8\x34\x99\xcc\x98\x02\x67\x89\x92\x3b\x79\xa6\x38\x1b\
\xaf\xd4\x60\x00\xaa\xbf\xbf\x94\x51\x40\x1f\x2f\x7f\xc1\x6b\xf5\
\x2b\xcd\x27\xfe\x09\x23\xfb\x45\x4d\x63\xe6\x0b\x81\xe0\x3d\x51\
\x33\x1f\xde\x08\xd0\x32\xb9\xfc\x10\xb7\xe1\x5f\xc5\x34\x60\x06\
\x56\x65\x2c\x99\x19\xf7\xa2\x8a\x00\xfe\xc0\xff\x00\xe0\xda\x2f\
\xd9\x7f\x4e\xfd\x99\xff\x00\xe0\x8f\xdf\x0b\x64\x87\x4f\x8a\xd3\
\x59\xf1\xfd\xb4\x9e\x2e\xd5\xe7\x09\x89\x2e\xe4\xbb\x72\xd0\x33\
\x1e\xa7\x6d\xa8\xb7\x41\xec\xbe\xe6\x8a\x28\xa0\x0f\xff\xd9\
"
qt_resource_name = b"\
\x00\x06\
\x07\x03\x7d\xc3\
\x00\x69\
\x00\x6d\x00\x61\x00\x67\x00\x65\x00\x73\
\x00\x08\
\x0b\x77\x5c\xa7\
\x00\x68\
\x00\x65\x00\x61\x00\x64\x00\x2e\x00\x6a\x00\x70\x00\x67\
"
qt_resource_struct_v1 = b"\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\
\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
"
qt_resource_struct_v2 = b"\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
\x00\x00\x01\x60\x83\x46\x10\xc7\
"
qt_version = QtCore.qVersion().split('.')
if qt_version < ['5', '8', '0']:
rcc_version = 1
qt_resource_struct = qt_resource_struct_v1
else:
rcc_version = 2
qt_resource_struct = qt_resource_struct_v2
def qInitResources():
QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data)
def qCleanupResources():
QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data)
qInitResources()

View file

@ -1,399 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
Created on 2017年12月23日
@author: Irony."[讽刺]
@site: http://alyl.vip, http://orzorz.vip, https://coding.net/u/892768447, https://github.com/892768447
@email: 892768447@qq.com
@file: xpmres
@description:
'''
__Author__ = "By: Irony.\"[讽刺]\nQQ: 892768447\nEmail: 892768447@qq.com"
__Copyright__ = "Copyright (c) 2017 Irony.\"[讽刺]"
__Version__ = "Version 1.0"
# 这里把转换的xpm数组直接放到py文件中当做一个变量
# 这里需要把xpm文件里的内容做下修改成python的list
image_head = [
"120 120 256 2",
"8 c Black",
"u. c #CACACA",
" . c #0F0F0F",
"I c #D9D9D9",
"x. c #1E1E1E",
"@X c #E8E8E8",
"%. c #2D2D2D",
"l c #F7F7F7",
"S c #3C3C3C",
"1. c #4B4B4B",
"XX c #5A5A5A",
"{ c #696969",
"U. c #787878",
"7 c #878787",
"wX c #969696",
"JX c #A5A5A5",
"SX c #B4B4B4",
"p. c #C3C3C3",
"| c #080808",
"9 c #D2D2D2",
"r. c #171717",
"2 c #E1E1E1",
"<. c #262626",
"0 c #F0F0F0",
"3. c #353535",
" c #FFFFFF",
"0X c #444444",
"OX c #535353",
"PX c #626262",
"/ c #717171",
"$X c #808080",
"7X c #8F8F8F",
"] c #9E9E9E",
"-X c #ADADAD",
"c c #BCBCBC",
"O. c #010101",
"B c #CBCBCB",
"b c #101010",
"@ c #DADADA",
";. c #1F1F1F",
"dX c #E9E9E9",
"F c #2E2E2E",
"j c #F8F8F8",
"C. c #3D3D3D",
"N. c #4C4C4C",
"J c #5B5B5B",
"G. c #6A6A6A",
"HX c #797979",
"FX c #888888",
"/. c #979797",
"m. c #A6A6A6",
"uX c #B5B5B5",
"$. c #C4C4C4",
"t. c #090909",
":. c #D3D3D3",
"a. c #181818",
"$ c #E2E2E2",
"#X c #272727",
"F. c #F1F1F1",
"VX c #363636",
"Q c #454545",
"K. c #545454",
"gX c #636363",
"C c #727272",
" X c #818181",
"KX c #909090",
"P c #9F9F9F",
"e c #AEAEAE",
"yX c #BDBDBD",
"5. c #020202",
"p c #CCCCCC",
"i c #111111",
"+X c #DBDBDB",
"J. c #202020",
"T c #EAEAEA",
"b. c #2F2F2F",
"r c #F9F9F9",
"6. c #3E3E3E",
"g. c #4D4D4D",
"v. c #5C5C5C",
",. c #6B6B6B",
"; c #7A7A7A",
"&X c #898989",
"D. c #989898",
"t c #A7A7A7",
"k. c #B6B6B6",
"w. c #C5C5C5",
".. c #0A0A0A",
"c. c #D4D4D4",
";X c #191919",
"6 c #E3E3E3",
"sX c #282828",
"{. c #F2F2F2",
"iX c #373737",
"-. c #464646",
"l. c #555555",
"~ c #646464",
"P. c #737373",
"a c #828282",
"*X c #919191",
"CX c #A0A0A0",
"BX c #AFAFAF",
"6X c #BEBEBE",
"w c #030303",
"s c #CDCDCD",
"R. c #121212",
"]. c #DCDCDC",
"q. c #212121",
"x c #EBEBEB",
"D c #303030",
"o c #FAFAFA",
"f. c #3F3F3F",
".X c #4E4E4E",
"4 c #5D5D5D",
"K c #6C6C6C",
"GX c #7B7B7B",
"jX c #8A8A8A",
"rX c #999999",
"8. c #A8A8A8",
"mX c #B7B7B7",
"4X c #C6C6C6",
"y. c #0B0B0B",
"|. c #D5D5D5",
"4. c #1A1A1A",
"B. c #E4E4E4",
"ZX c #292929",
", c #F3F3F3",
"1X c #383838",
"A c #474747",
"^ c #565656",
": c #656565",
"[ c #747474",
"W. c #838383",
"n. c #929292",
"V. c #A1A1A1",
"[. c #B0B0B0",
"tX c #BFBFBF",
"X. c #040404",
"IX c #CECECE",
"H. c #131313",
"U c #DDDDDD",
"`. c #222222",
">X c #ECECEC",
"G c #313131",
"+ c #FBFBFB",
"xX c #404040",
"T. c #4F4F4F",
"lX c #5E5E5E",
"E. c #6D6D6D",
"z c #7C7C7C",
"!. c #8B8B8B",
"i. c #9A9A9A",
"oX c #A9A9A9",
"zX c #B8B8B8",
"%X c #C7C7C7",
"v c #0C0C0C",
"*. c #D6D6D6",
"z. c #1B1B1B",
"= c #E5E5E5",
"R c #2A2A2A",
"k c #F4F4F4",
"H c #393939",
"_. c #484848",
"L. c #575757",
"d. c #666666",
"MX c #757575",
"Z. c #848484",
"LX c #939393",
"y c #A2A2A2",
"NX c #B1B1B1",
"UX c #C0C0C0",
"o. c #050505",
"'. c #CFCFCF",
"5X c #141414",
"h. c #DEDEDE",
",X c #232323",
") c #EDEDED",
"I. c #323232",
"O c #FCFCFC",
"3X c #414141",
"Q. c #505050",
"2. c #5F5F5F",
"bX c #6E6E6E",
"qX c #7D7D7D",
"# c #8C8C8C",
"V c #9B9B9B",
"9X c #AAAAAA",
"fX c #B9B9B9",
"(. c #C8C8C8",
"3 c #0D0D0D",
"h c #D7D7D7",
"@. c #1C1C1C",
"_ c #E6E6E6",
"M. c #2B2B2B",
"j. c #F5F5F5",
"A. c #3A3A3A",
":X c #494949",
"Z c #585858",
"8X c #676767",
"d c #767676",
"hX c #858585",
"AX c #949494",
"=. c #A3A3A3",
"0. c #B2B2B2",
"#. c #C1C1C1",
"+. c #060606",
"N c #D0D0D0",
"u c #151515",
"cX c #DFDFDF",
"Y. c #242424",
"s. c #EEEEEE",
"q c #333333",
". c #FDFDFD",
"> c #424242",
"<X c #515151",
"DX c #606060",
"S. c #6F6F6F",
"Y c #7E7E7E",
"e. c #8D8D8D",
"^. c #9C9C9C",
"1 c #ABABAB",
"pX c #BABABA",
">. c #C9C9C9",
"} c #0E0E0E",
"aX c #D8D8D8",
"E c #1D1D1D",
"( c #E7E7E7",
"}. c #2C2C2C",
"! c #F6F6F6",
"n c #3B3B3B",
"&. c #4A4A4A",
"~. c #595959",
"=X c #686868",
"& c #777777",
"L c #868686",
"< c #959595",
"7. c #A4A4A4",
"). c #B3B3B3",
"` c #C2C2C2",
"W c #070707",
"- c #D1D1D1",
"eX c #161616",
"g c #E0E0E0",
"f c #252525",
"5 c #EFEFEF",
"m c #343434",
"X c #FEFEFE",
"2X c #434343",
"nX c #525252",
"* c #616161",
"kX c #707070",
"% c #7F7F7F",
"M c #8E8E8E",
"vX c #9D9D9D",
"9. c #ACACAC",
"' c #BBBBBB",
" . . X . X X X X o ",
" . X O + O . + ",
" . X @ # $ X ",
" X o O % & * = ",
" . X . X - ; . : > , O X ",
" . . < 1 2 3 4 ",
" X 5 ; 6 7 8 % + ",
" X . X 9 % X O 0 q w e O ",
" r X o X . X X . . . X O X X X . X X X X X O O . t y X X X 9 u i p X . O ",
"+ X X + . . X X X X . X X + . O . X . O X . . . X X X X X . r . . a s . + d 8 f g O X ",
" X h r o X + . X X X . . X X X X . X . o j 0 5 0 k j + . X O X X . X l z x X . c v b n x . X ",
" X . X y 8 m M N . . . . . + O X . X O . X 5 B V C Z A S m D F G H A J K L P c I k X X X U Y . X X X T R E W Q ! X O ",
" O O r Q ~ Y m F ^ / 1 ( X . X X O . X + . = ) _ ` ' ] [ { C S } | .v W ..X.w X.o.O.8 8 X.O.+.3 @.m ^ # #.r O . . $.V . . J O.%...J + . + ",
". . + . &.% X . *.=.-.;.Q a :.+ O o O o X >.,.<.1.2.3.v E 4.8 o.+.| | X.8 8 8 O.8 8 8 5.w O.8 8 5.8 O...i 3 ..i 6.] o X 1 7. O X X 8.w b ;.8 9. . ",
" . O . 0.q.w. j e.D u f K B O o X o X ` 2.r.W O.5.8 8 | 3 t.w 8 O.O.8 8 8 5.O.8 X.O.8 8 8 8 8 8 8 8 8 8 8 X.y.b o.8 &.u. i.p. X X 6 a.5.5.O.<.s. + ",
"X X O d.-.l . f.5.8 5.b g.P p h.j. k.l.} 8 O.w 8 8 w 8 8 5.5.8 5.O.8 8 O.O.8 8 8 8 8 O.O.8 8 8 8 w 8 8 O.O.8 O.8 O.z.4.x.d a c.X X X . X ^ 8 5.8 5.v.. X ",
"X X O O c.x.B . 8.+.O.8 w 8 5.b.[ n.m.:. X ' l. .8 +.O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 | @.M.H N.B.X X . . < 8 8 O.8 O.V. + X . ",
" X . k C.# . O Z.w 8 O.8 5.5...A.: S.D.F.o - G.;.H.8 X.X.8 8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 o.8 5.W J.K.j. O O c.b 8 5.8 8 ;.s. + + O ",
" X . L.S.X j P.o.O.8 8 O.8 8 +.@.u l.z H R 3.W O.5.8 8 X.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.O.8 8 { o . X O + j.I.8 O.8 8 w z . + X X X ",
". . U.&. + r + d 5.O.5.O.O.5.O.8 8 5.Y.T.l.R.5.8 O.8 5.O.8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 X.8 8 8 5.E.O X . v.O.w O.8 8 H.I . X O ",
" X X X X 7 6.O + X X W.+.8 8 +.8 O.8 O.X.z.f 8 5.8 8 w O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.8 Q.O O + X !.8 8 8 5.8 5.~.. o + . ",
" + X . ^.I., O + /.J.5.8 5.8 w 8 O.5.8 8 8 o.8 8 8 8 O.5.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 X.8 5.8 3.( X o X . X 8.o.O.o.8 w O.o.(. + ",
" O X O c ;.U O X X X ).m 5.w 8 8 8 w 8 5.w 8 8 8 8 5.O.8 8 5.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.8 5.t.V O X X B z.8 5.X.8 8 O._.X X X . ",
" O X X - `.(.X + X X O . I b.8 O.8 w 8 O.8 8 O.8 X.O.8 5.8 8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 w 8 O.8 O.A.h '. O . . . X ].F +.8 8 O.w 8 5.[. X . ",
" {.}.i.. . X . X |.<.W 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.8 5.5.8 8 .. X.XN ].+ X k ,...O.o.8 w 8 8 R T O X ",
" XXZ o . O 0 * .8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.O.8 8 8 O.> d.G.oXOX+X . O . @X#X5.5.W 8 w O.8 V . . . ",
" 7.E 2 . . X X 7 b w 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 w 8 O.8 8 8 y.}...I.Q.+X8.$X%X&X].!.8 ..8 8 5.8 w *X . ",
" X ) <.L X c ;.8 5.O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.8 O.5.8 w 8 O.8 w ..Y.=XF : -Xd./.I.;XX.8 w O.z.:Xt O X . ",
" . *XJ.2 X O r >X1.8 O.8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.8 8 O.8 O.O.8 5.O.5.5.@.A ~.Z 1 { XX,X .8 8 5.8 3.<X` X ",
" O 0 1X=Xo X X n.o.8 w 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.5.8 8 O.8 O.5.8 8 8 5.5.b }.3 ~.; 2X3X@.3 .8 8 } > .Xs.. . ",
" X . 4Xz.[.. r h.Y.8 X.8 8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.O.8 8 w 8 8 8 X.X.w 8 O.8 O.8 .8 ;X3Xi y.1XJ.3 i ;Xx.S. ",
" . X i.}.h C X.O.8 8 5.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.8 O.8 8 5.8 8 8 5.8 O.O.8 8 8 5.O.8 w 8 u H x...5X5X6X ",
" O + W.N.s.9 z.5.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 w 8 5.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.W r. .| w > j . . X X ",
" X X . 7X& 8X5.8 O.8 8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 +.8 8 5.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 w 5.X.W +.9X O . X ",
" X O O oXi 8 8 w 8 8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.O.8 5.8 8 | 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.8 8 8 W X.8 0Xk X O . . ",
" + . . qX8 w 8 O.O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.8 8 w 8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.w 8 o.8 3 +.' . O ",
" + . . I ,XO.5.8 8 5.O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.8 8 5.5.5.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.5.O.: X O X ",
" + . X X % 5.8 8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.O.8 8 8 w 8 +.E $ X X X ",
" . x m 8 O.8 O.O.8 8 8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.8 8 8 X.5.O.w 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 o.8 5.wXX . X ",
" . X oX+.8 O.8 8 w 8 5.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 w 8 8 5.w K b 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.8 5.8 X.o.&.. X ",
" X * 8 O.8 8 8 8 8 8 8 8 8 5.8 8 8 O.8 O.r.5X8 8 5.8 w 8 8 8 8 8 8 8 8 8 w 8 8 8 O. .(.G.8 O.8 8 5.5.8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.5...eXc. X ",
" . . 0 n 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.8 5.f a z.5.8 8 8 8 w 8 8 8 8 8 8 8 8 8 O.w 8 8 ..B c.;.8 O.8 8 8 X.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.5.t.W rXX O X ",
" 4XY.8 5.8 8 8 8 8 8 8 8 8 5.o.8 w 8 a.tXM o.8 O.8 X.8 8 8 8 8 8 8 8 8 8 8 O.8 O.5.i yX W.W 8 w o.8 O.O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.O.t.o.^ X X ",
" . L ;X8 O.8 8 8 8 8 8 8 8 8 O.8 w 8 b uX ~.8 O.8 8 8 O.8 8 8 8 8 8 8 8 8 5.O.8 8 8 R.c ) 0XO.8 8 +.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.O.W b <.T X ",
" + k _.X.8 8 8 8 8 8 8 8 8 8 w 8 w 8 v wX F.iXo.8 8 5.8 O.O.8 8 8 8 8 8 8 8 8 8 O.8 8 a.:. r 4XE 8 W 8 8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.O.w u W pX O ",
" X aX;.8 O.8 8 8 8 8 8 8 8 8 O.8 8 W ~ . O 6 ;.8 8 O.5.8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 +.`.6 X M b 8 8 8 w 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.O.u 5. X . ",
" o P y.5.O.O.8 8 8 8 8 8 8 8 8 X.8 G ].O w.b 8 w 8 8 8 5.8 8 8 8 8 8 8 8 8 O.w 8 8 8 b.s. X _ uXsX8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.5.R.3 1.+ X ",
" . d.X.8 8 8 8 8 8 8 8 8 8 8 5.8 3 rX X O 9XX.8 5.8 5.8 8 8 8 8 8 8 8 8 8 8 8 8 O.O.w .XX . U qX,.XX;X8 8 5.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.O.} H.J.dXX ",
" @XA.X.8 O.8 w 8 8 O.O.8 8 8 O.w A dXk.L ( D.8 O.8 8 O.O.8 8 8 8 8 8 8 8 8 8 8 5.O.8 X.d. 5 k X pXz.8 8 8 O.8 8 O.O.8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 v 4.3 ` . ",
" X + ' #XO.8 O.8 8 8 5.8 8 O.8 X.8 u fX6XgXhX5 W.8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.8 8 O.y.jX O + o O D.3 8 8 8 8 5.8 O.w 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 t.4.o.D.X ",
" . jX;XO.8 O.8 8 8 8 8 8 5.8 8 o.T.k j + + hXO.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 w b k. O kX| 8 O.O.5.X.8 5.5.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.@.t.K ",
" k lXi O.8 O.8 O.8 8 O.8 8 O.8 5XzX . P.w 8 8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 O.w w J.h.X X X O . l XXt.8 O.8 8 5.8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 ;Xi T.X . ",
" O s %.o.8 8 8 O.8 8 8 O.8 8 +.w A r X O C +.8 8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 O.O.5.-.o X X X X F.> 8 O.5.w 8 X.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.8 i .iXF.X ",
" i.y.8 w 8 8 8 8 O.8 8 5.8 8 v 8.O . kX..O.8 O.8 8 O.8 8 8 8 8 8 8 8 8 8 O.8 w & X . . , c.).m.B.$ 6.8 8 5.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.3 3 sX$ ",
" l { 5.8 w O.8 8 8 O.8 8 w 8 8 xXF.X + 7 } O.8 O.8 8 O.8 8 8 8 8 8 8 8 8 8 8 O.i uX+ + cXV.a L V L 4Xo aXA.+.8 8 O.w 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.3 i J.*. . ",
" h.Q w 5.8 8 5.8 8 O.8 8 8 O.t.!. j j.s. X X 1 b 5.8 O.8 8 5.8 8 8 8 8 8 8 8 8 O.8 w Y.x ) P Z.[.pXvXbXlX&.> nXA.v o.8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.8 3 u 4.p ",
". X X X mX1X5.8 8 O.8 8 8 8 5.8 8 X.q.9.oXjXMX{ y . tXz.8 8 w 8 8 8 5.8 8 8 8 8 8 8 8 8 8 O.: O 6 ^.e 7.* %.y.z.u w O.8 x.sXw 8 5.8 8 8 8 5.8 5.8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 y.x. .>. X ",
" . X X rXm 8 O.O.8 8 O.5.O.8 5.o.5.Q.- cXcXN NXmX= l s J.X.8 8 8 O.8 O.8 8 8 8 8 8 8 8 8 w o.).. . B.BX^ D L.b.R ;Xw 8 8 w w sX}.v 8 O.O.8 8 8 o.8 8 5.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.8 X.`.3 w. ",
" . X X 0 L VX8 5.5.8 O.8 8 8 5.5.8 i CXc.% <Xb.,XE J.A._.5XO.8 O.8 5.8 8 8 8 8 8 8 8 8 8 5.O.R , vXF S.:.* ;Xi 8 8 X.8 8 +.8 3 @.o.5.8 w 8 5.8 5.5.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.8 8 %.i tX ",
" X X X |.L 3.8 O.8 8 5.8 O.8 O.8 w q.T.F ZX| 8 8 w 5.8 w w 8 O.w 8 8 8 8 8 8 8 8 8 8 8 8 8 w Z. + AXI.SXX D.i i O.w 8 8 O.O.8 O.8 8 } X.v 8 5.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.8 H @.0. X ",
"X X X zXL ZX8 8 8 O.5.8 8 8 w 8 +.u L.~.5X8 8 8 5.8 8 | w 8 5.O.8 8 O.5.8 8 8 8 8 8 8 8 O.5XB. ` lX+X _ b.+.| 5.8 8 8 8 8 X.8 8 X.O.8 W b 8 5.O.o.w 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 1XY.rX X ",
" X CXY z.5.w 8 8 O.8 5.O.8 X.8 2.~ t.5.5.O.8 5.8 O.8 o.O.8 8 8 O.O.8 8 8 8 8 8 8 8 8 O./ X + zXh.+ 8.w o.o.8 8 8 O.O.8 8 8 5.8 8 5.O.-.sX8 X.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.8 8 }.`.; ",
" X X O e.P.H.5.5.8 8 O.8 8 8 8 O.x.0Xo.8 8 8 8 8 8 8 5.w O.8 8 O.O.O.8 8 8 8 8 8 8 8 8 8 R.cX. X O O d.8 O.8 5.w 8 8 8 8 O.5.5.8 X.8 8 2.*.Q.X.5.8 w 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 ,X;.DX. ",
" O X . j XK .8 8 O.8 w 8 8 8 O.W J.i 8 w 5.8 o.8 8 w 8 8 8 O.8 8 8 8 O.O.8 8 8 8 8 8 8 8 U.. O j q w 8 8 8 8 5.O.8 8 5.8 O.8 8 8 O.# j.e.f 3 5.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.O.J.J.K.+ ",
" X = L kXW 5.O.8 8 5.8 8 O.8 H.4.t.5.8 8 8 O.O.8 5.O.8 X.8 8 8 5.8 w 8 8 w 8 8 8 O.8 ,Xs.X . X $ eX8 8 8 8 O.8 % B 1X8 8 5.8 8 X.X.{ + /.v eXH.W 8 8 O.8 8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 w 8 f Y.:XX ",
" X X X +XFXC o.8 O.8 O.8 8 8 5.8 r.J.t.8 O.8 8 8 8 X.8 8 5.8 w 8 w 8 8 8 O.8 8 8 5.8 8 X.vX+ X X s 8 8 o.8 8 O.H.x . e w 8 5.8 O.8 8 T.X O vX8 O.H.y.X.w 5.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.iXY._.X ",
"X X X . X u.7Xd 5.8 8 O.8 8 8 8 O.O.J.%.| 8 5.w R.lXeX8 O.8 8 8 +.w 8 5.w 8 8 5.O.O.5.| 8 1. X X X ' 5.w 8 8 8 8 4.{. zX8 O.8 5.O.8 8 xXo zXX.w 5.8 8 8 8 8 8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.8 ..Z M.&. ",
" . X pXrXGXO.8 8 8 8 8 O.8 8 o.VXxXt.8 8 8 e. [.X.8 O.8 5.v ;X8 R.a.8 8 8 5.8 5.5Xz.+X. O X X tX8 8 8 5.5.8 w -XX ; 8 O.O.8 8 O.8 S O . I a.O.8 8 O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O. .MXH g. ",
" . [.8.W.O.5.8 8 O.8 O.O.8 | DXZ i 5.8 8 1 $ W 8 8 5.8 5XH w }.VX8 O.5.8 +.J.t.m. . X . X *.w 5.X.X.8 5.8 H.D | 8 8 O.5.O.8 O.&. . @Xm 8 8 5.5.O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.3 L _._.+ ",
" X X 1 uXn.O.w 8 8 O.8 8 O.8 3 < z E 8 8 8 J r 9XO.w 8 w 8 eXK.8 _..X8 O.8 5.E t.; X . X . , D O.+.8 w O.8 O.O.8 5.X.O.O.8 o.8 d . O s.A O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.3 wXv.xXr ",
" X X t ' 9.+.w O.8 8 8 8 8 8 4.4X0.<.8 8 8 o.}.} o.8 5.8 8 x. XO.C OX8 8 O.5X..=X+ . X . kX8 O.8 8 8 +.8 O.8 8 8 8 X.8 8 w mX+ ! nX8 w 5.O.O.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.u [.HXS o ",
" X X X JXyXw.} o.X.8 8 5.8 8 8 R B.cX}.5.8 8 8 5.5.8 5.8 O.O.F mXu i.g.O.O.3 r.v.k . X X O e 8 O.8 5.5.8 8 8 8 O.5.8 8 5.8 Y.F. O X ~ 8 8 8 8 8 8 8 8 5.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 ;.(.KXn O . ",
" X X . [.k.B.z.3 O.w 8 8 8 8 8 :Xr X 4 8 O.O.O.8 w 8 w 8 5.8 2X2 :XpX=Xy.o.%.Z.r O X s.J.8 8 O.8 8 8 8 8 O.8 5.5.8 O.LX X X X kX8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 O.;.@ SXC., ",
" O 0.SXO }.} W 8 w 8 8 8 +.PX. B 3 8 8 8 O.8 O.O.5.O.8 : + NXaX&.q.$X(. + + O P 8 X.8 8 X.8 O.O.8 X.8 8 8 A.j X O [ W 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 w 8 b.x :.<Xj.X ",
"X o ` m. L.+...8 8 8 O.8 8 ,.O X P.8 5.8 8 8 8 8 8 8 o.e . l p.h O o X O o [ 8 8 O.8 X.8 5.8 8 8 8 A.cX . X $X| 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 _.j _ GX. . ",
". . X 2 CXX jX+.R.w 8 8 O.5...M._ O j.PX8 8 O.o.8 W 5.8 sX! . O + X X JX%.8 8 8 O.8 8 b D KX{.O X . hXt.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 +.* X T 0. ",
" X r tX zXH.q.t.O.O.O.8 .R.zX 0 S.J.O.8 8 8 5.} c . . . O O O . X l NXHXv.lX% p.2 j.. . . O O jX..8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.| qX 5 g O ",
" . X ) r B.#X,X,X8 O.8 o.3 o.M X . dXwXDX* V =.p O X . X X + O o r X O s.. . X 7X..8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 } t X {.j . X ",
"X X . X X j. gX;X.Xo.8 8 w q.8 v.+ o r X . X . X + . X X + X O O X o X X O +Xl.[ T @X'.cX !.| 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 4.R :.. ! X ",
"X O X . o NXeX,.;X8 8 +.x.8 3X o . O . . O . . X O . . . X X O {.1.K.h ,.~ f.zXX . jXO.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 <XN.T ",
" X j PXDX2.X.8 O.i O.%.O O . X g _ @X . X O O + + . F.7.j.s.1 9.yXX O FXO.8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.8 O.8 O.8 O.y.xX8X X X ",
" X r *.1.JXx.5.8 b 8 M.F.O o o + X X XN. U . 9 CX_.:.+ X O . . X + X O % 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.5.8 8 8 O.;X3.D. X ",
" X ; oX{ w 5.y.8 sX! O +X@.+.^ 4.E.mXY x.+.8 N. O r . O X X . O O . . S.w 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 5.8 8 O.8 8 4.G c. X X ",
" + ].9X0.E O.8 8 q l . O . O c ,Xt.S.C MXb.r.sX$Xw.=Xi <Xw. O . . + + . O X J 8 O.O.8 8 8 8 8 8 8 8 8 8 8 O.O.8 O.8 8 O.5.8 5.5X&.l ",
" . @X_ DXVX5X8 %.k . + X wXv n *.X . x aXF.. >.g.eX*X+ . + . X . X O O O O X . A 8 O.O.8 8 8 8 8 8 8 8 8 8 8 O.O.8 8 8 O.w 8 8 ..i 7 X ",
" O X ! p 1X| 8 ;X0 X O X . O O C w ~ T O O O X . O IXA ~.B.. . X . X X + + X O . r F O.O.O.O.8 8 8 8 8 8 8 8 8 8 5.5.8 8 8 O.8 8 8 o.5XB . X X X ",
" + X X O X & O.8 8 BX . X O 0 L.+.L + X X . + . X T ^ }.p X O . . O O . X + X dXr.8 O.O.O.8 8 8 8 8 8 O.8 8 8 5.5.8 8 8 8 8 5.O.8 2Xj.O X X ",
" + . . $.8 X.8 -.+ . _ xXy.e X X X X . X O X + {.~ r.NX O X . X . . :.| O.O.O.O.8 8 8 8 8 8 O.8 8 8 w 5.8 8 O.8 8 8 8 5.&X . X X ",
" B.eX8 8 8 oX O . O X . X cXVX4.yX . + ,.} e . X . . + X . X zX8 O.w +.8 8 5.8 w 8 8 w 8 O.8 w 8 5.8 O.O.8 8 5. .@ ",
" ) #XO.X.w 8XO X = q Y.@ . + + { +.). . o O O O . X < X.8 5.X.X.O.8 8 5.8 5.8 8 8 w 5.o.8 5.8 8 w O.8 2XO ",
" X 1XO.o.5...[.X O + . X + x f.#X2 O X X + J y.pX X . o [ 8 o.| o.o.5.8 O.8 8 8 +.8 5.8 8 8 O.8 W w 8 8 O.e. ",
" X hX8 .H.8 y.BX o j Q.J.].+ O l . . ! _.E @ O X + X :X8 W v t.5.O.8 8 8 O.8 8 5.8 8 X.X.8 5.} w 8 5.X.w.+ ",
" X pX| o.b 5.o.X.*X. O + GX} zX O O ( ZX3.r + X . X . X j D 8 b +.y.w 8 O.8 8 8 5.8 8 O.8 X.8 8 W @.X.5.8 5X>X ",
" _ f 8 ,X+.5.5.8 &.pXo 5 ,X=. X X . . O . + >.o./ . X X X I i 8 y.| | W 8 8 8 5.8 O.O.w 8 8 Y.a.| }.C.O.O.8 S X X ",
" X L.8 Y.q.8 3 X.8 8 > 9X/.C O + . O O L w p.X . O X X X {.9.8 W 4.#X5.+.8 8 8 O.8 8 o.8 8 b M.Q.v < $X| o.X.=X. ",
" . X t w W 3Xt.8 +.w 5.8 8 b pX . X X X O 0 sX_.. . X X g L.m 8 5.U.N.8 w 8 8 8 8 O.| 8 w 8 4.r.R.b.l '.,X+.8 jX X ",
" O >Xb.5.T.=XO.W 5.X.O. .c X . X X AX+.>.X O ) -Xm G @.O.VXh.m 5.w 8 8 O.8 5X .8 w H.t.W 8 JX 8X8 O.Z.. O X X O X . ",
" X ^.o.sX8.b.8 y.W 8 b.( X X X X O . X O U v E. = -X8XH ,XGX7 X.u pXT r.8 8 w 8 w o.kX@.5.#Xu %.3 D l . . u.4.5.-. . X . O ",
" + X O + / eXd D.O.R.v 8 f.x . X X X }.r.L [ l.I.q T.XXI , I.8 z X 9X+.8 O.8 eX5.lX; 8 ..q C.k.5.d. O vX3XFX + X . X O O O ",
" . X W.A.zXS 5.+.,X|.. X X X . X X + jX8 VXC i W.5 6XL qX+.^ r ~ w 5.5.@.r.I.# W 8 * '.dX5 _.yX. . O O . + . . O O O ",
" O X . X k 7.@X[.O.8 -X+ X X . X . X O . X 5 H.Z }.$XX ,.b -.j. +XZXeX8 ;XG 1.U.} z.,.+X . X X . O X O . . + X + O ",
" O . o r A 8 N.( X X r X . ~.q.>X`.P. {.) i.X.xX! X &XH. .m 9.7 ; y.a.|.+ . + O . o . X . O . o ",
" X X X . :.sX8 q.rXl + X + + X LXH.V.%.UX. o O >Xb.8 4 +X}.O.2X$ $.1X5.E c. . X O X r X X X + l _ {. X o ",
" X . X . X I V.A 8 }.AX5 j X . X . . X - a.i l. X A.8 v N.#XQ.) X < 8 I.+X . + . X X X X oXXXY.z.q.1.9X X X ",
" X X ! wX#X5.4 X X + X X X s.AXI.8 3 c. r B +.v ..o.{ X 6 g.nXT X . O X O . F.XX8 8 w 8 5.8 8 d.X X ",
" . O O 9 eXSX+ X X O X x aX0.G.}.t.W X.P X X . DX8 5.8 .x.4X KX% ! O X X X X r T.o.X.X.W O.8 5.8 5.a . . ",
" . X O jXq.s. X O + Z.M..X,Xu 0XH.jXo . X O /.8 8 8 5.x.0X#XB.{.O O . X X bX8 8 8 8 8 w w 8 O.8 ;X, ",
" X X r iX<XX X vXiX( GX=Xu ,.. . ].2.8 8 X.O.8 ; U x.l.X . O X X X X k.o.8 X.8 8 O.8 O.O.8 w W aX X ",
" X X X ].b &X + X o . X N #XE.6.b C. X h HXu O.O.5.8 A.fXX -X5.vXX . X X . j.6.8 O.8 O.8 5.8 8 o.8 8 W '. X ",
" . mXX.c O X . . g u b 3 ZXSXt qXQ v 8 8 8 .L.mXo . . O 2.b ]. X . X . #.w 8 O.5.8 8 8 w O.8 X.w eX( ",
" O . O 0.X.- + + X + . . aX .w 8 b v O.8 O.8 R.0Xn.U . . X g r.^ X o X X . . [ O.5.8 8 O.8 O.8 5.8 8 8 HXX . ",
" X ) C ; a / _ . + @ H u O.O.O.5XA.kX1 B. O X O + KXO.k.O X X X . H 8 8 O.w 8 8 5.8 8 8 8 f F. ",
" O . U / lX< C.:Xj. . X X X X . l V.6.;.`.a.O.O.~.>X+ X O X k A.D 0 . + X X _ r.O.O.8 8 O.8 8 8 w 8 w (. r ",
" . O '.XX8.o . h R.-X X X X + [ 8 i ~ vXM.8 { r o . . . + O X P.8 wX + . X s | 8 8 8 8 8 8 8 w 8 8 8XO . + X ",
" B.OX0. X ` ;.c + O X X X X + >X4.d.cX . p.sXrX j T B X X + 9 z.5.q.>X . + + k.8 8 O.8 8 8 8 5.W o.5.IX X X ",
" . . HX<Xo O a ^ X O X X X X mX8 yXr X X G.5XT F.Y >. O + O o X 0 ZX8 w 8 FX. X . X 9XO.8 O.O.8 8 8 5.| O.J.j.X X X ",
" . -.Z.. + + B d.+ X O O X bX3.aX O - E wX !.Y X O + O + p C.8 +.y.q.;._ O X X CXw 8 O.8 8 8 8 O.o.8 K.. X . ",
" O S DX . >X_.LXX X . . @ > - X . . J ;.Q.3 / mX5 U g ! ! @ m.Z t.O.8 8 `.=.8 AX X . X ^.8 8 8 8 8 8 8 8 O.8 a . O ",
" X =X,Xj. j K.n . . O c F {.O . . DX8 8 C.y.O.q.4.eXF f.f.#Xv 8 8 8 8 5.8 qXj.ZXG l . X X e 8 8 8 8 O.5.8 8 8 O.NXO X X O ",
" . ' 3 PX^.kXU.JXv d.O O . . . *.z.7X+ . . W.8 A.l 0.x.8 O.8 8 O.8 8 O.5.8 O.w 8 Q.+ O M 8 ' X %Xw 8 O.5.w X.O.8 O...@ X X "
]

View file

@ -1,51 +0,0 @@
# .9格式图片显示(气泡)
什么叫.9.PNG呢这是安卓开发里面的一种特殊的图片
这种格式的图片在android 环境下具有自适应调节大小的能力。
1允许开发人员定义可扩展区域当需要延伸图片以填充比图片本身更大区域时可扩展区的内容被延展。
2允许开发人员定义内容显示区用于显示文字或其他内容
目前手机QQ中很多漂亮的的聊天气泡就是.9格式的png图片
在Github开源库中搜索到两个C++版本的
1.一个是NinePatchQt https://github.com/Roninsc2/NinePatchQt
2.一个是QtNinePatch https://github.com/soramimi/QtNinePatch
### For PyQt
1、目前针对第一个库在2年前用[纯python版本1](纯python版本1/)参考源码重新写一个见
2、这次针对第二个写了[纯python版本2](纯python版本2/)的和[pyd编译好的](pyd版本)两个版本
### 说明
1、建议优先使用pyd版本的后续提供Python3.4 3.5 3.6 3.7 编译好的32为库文件也可以自行编译编译步骤见下文。
2、其次可以使用纯python版本2的个人觉得方便调用
3、最后再考虑纯python版本1的吧
4、以上为个人意见两个C++版本的写法不一样,但是核心算法应该是类似的。
### 自行编译
1、首先要安装好Qt、PyQt5、编译安装对应的sip、对应的VC++编译工具
2、用Qt Creator 打开pro文件进行编译
3、进入源码中的sip文件夹
4、修改configure.py文件
```python
# 这里是你的VC版本和对应的Qt目录中的文件夹
config.platform = "win32-msvc2010"
qt_path = 'D:/soft/Qt/Qt5.5.1/5.5/msvc2010'
```
5、python configure.py
![截图](ScreenShot/1.gif)

View file

@ -1,136 +0,0 @@
#include "QtNinePatch.h"
struct Part {
bool stretchable;
int pos;
int len;
Part()
: stretchable(false)
, pos(0)
, len(0)
{
}
Part(int pos, int len, bool stretchable)
: stretchable(stretchable)
, pos(pos)
, len(len)
{
}
};
static inline bool isStretchableMarker(QRgb pixel)
{
return (qAlpha(pixel) >> 7) & 1;
}
static QPixmap resize9patch(QImage const &image, int dw, int dh)
{
int sw = image.width();
int sh = image.height();
if (sw > 2 && sh > 2 && dw > 0 && dh > 0) {
QPixmap pixmap(dw, dh);
pixmap.fill(Qt::transparent);
QPainter pr(&pixmap);
pr.setRenderHint(QPainter::SmoothPixmapTransform);
std::vector<Part> horz;
std::vector<Part> vert;
int horz_stretch = 0;
int vert_stretch = 0;
{
int pos;
QRgb last;
QRgb next;
pos = 0;
last = image.pixel(1, 0);
for (int x = 1; x < sw - 1; x++) {
next = image.pixel(x + 1, 0);
if (isStretchableMarker(last) != isStretchableMarker(next) || x == sw - 2) {
bool stretchable = isStretchableMarker(last);
int len = x - pos;
horz.push_back(Part(pos, len, stretchable));
if (stretchable) horz_stretch += len;
last = next;
pos = x;
}
}
pos = 0;
last = image.pixel(0, 1);
for (int y = 1; y < sh - 1; y++) {
next = image.pixel(0, y + 1);
if (isStretchableMarker(last) != isStretchableMarker(next) || y == sh - 2) {
bool stretchable = isStretchableMarker(last);
int len = y - pos;
vert.push_back(Part(pos, len, stretchable));
if (stretchable) vert_stretch += len;
last = next;
pos = y;
}
}
}
double horz_mul = 0;
double vert_mul = 0;
if (horz_stretch > 0) horz_mul = (double)(dw - (sw - 2 - horz_stretch)) / horz_stretch;
if (vert_stretch > 0) vert_mul = (double)(dh - (sh - 2 - vert_stretch)) / vert_stretch;
int dy0 = 0;
int dy1 = 0;
double vstretch = 0;
for (int i = 0; i < (int)vert.size(); i++) {
int sy0 = vert[i].pos;
int sy1 = vert[i].pos + vert[i].len;
if (i + 1 == (int)vert.size()) {
dy1 = dh;
} else if (vert[i].stretchable) {
vstretch += (double)vert[i].len * vert_mul;
double s = floor(vstretch);
vstretch -= s;
dy1 += (int)s;
} else {
dy1 += vert[i].len;
}
int dx0 = 0;
int dx1 = 0;
double hstretch = 0;
for (int j = 0; j < (int)horz.size(); j++) {
int sx0 = horz[j].pos;
int sx1 = horz[j].pos + horz[j].len;
if (j + 1 == (int)horz.size()) {
dx1 = dw;
} else if (horz[j].stretchable) {
hstretch += (double)horz[j].len * horz_mul;
double s = floor(hstretch);
hstretch -= s;
dx1 += (int)s;
} else {
dx1 += horz[j].len;
}
pr.drawImage(QRect(dx0, dy0, dx1 - dx0, dy1 - dy0), image, QRect(sx0 + 1, sy0 + 1, sx1 - sx0, sy1 - sy0));
dx0 = dx1;
}
dy0 = dy1;
}
return pixmap;
}
return QPixmap();
}
QPixmap QtNinePatch::createPixmapFromNinePatchImage(const QImage &image, int dw, int dh)
{
int w = dw;
int h = dh;
if (w < image.width() || h < image.height()) { // shrink
if (w < image.width()) w = image.width();
if (h < image.height()) h = image.height();
QPixmap pm1 = resize9patch(image, w, h);
if (pm1.isNull()) return QPixmap();
QPixmap pm2(dw, dh);
pm2.fill(Qt::transparent);
QPainter pr(&pm2);
pr.setRenderHint(QPainter::SmoothPixmapTransform);
pr.drawPixmap(0, 0, dw, dh, pm1, 0, 0, w, h);
return pm2;
} else {
return resize9patch(image, w, h);
}
}

View file

@ -1,26 +0,0 @@
#ifndef QTNINEPATCH_H
#define QTNINEPATCH_H
#include <QtCore/qglobal.h>
#if defined(QTNINEPATCHLIB_LIBRARY)
# define QTNINEPATCHLIBSHARED_EXPORT Q_DECL_EXPORT
#else
# define QTNINEPATCHLIBSHARED_EXPORT Q_DECL_IMPORT
#endif
#include <QImage>
#include <QPixmap>
#include <QPainter>
#include <vector>
class QtNinePatch;
class QTNINEPATCHLIBSHARED_EXPORT QtNinePatch
{
public:
static QPixmap createPixmapFromNinePatchImage(const QImage &, int, int);
};
#endif // QTNINEPATCH_H

View file

@ -1,38 +0,0 @@
#-------------------------------------------------
#
# Project created by QtCreator 2018-10-25T14:12:10
#
#-------------------------------------------------
QT += core axcontainer gui
#greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = QtNinePatch
TEMPLATE = lib
CONFIG += release
CONFIG += warn_off exceptions_off hide_symbols
#CONFIG += staticlib
#CONFIG += dll static release
DESTDIR = build
DLLDESTDIR = build
DEFINES += QTNINEPATCHLIB_LIBRARY
SOURCES += QtNinePatch.cpp
HEADERS += QtNinePatch.h
unix {
target.path = /usr/lib
INSTALLS += target
}
DEFINES += _XKEYCHECK_H
INCLUDEPATH += .
INCLUDEPATH += $$[QT_INSTALL_HEADERS]
LIBS += -L$$[QT_INSTALL_LIBS]

View file

@ -1,202 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 3.5.1, 2018-10-26T00:09:02. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
<value type="QByteArray">{52a31565-4664-45f3-a98d-2ef2ad3b26ae}</value>
</data>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="int">0</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap">
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
<value type="QString" key="language">Cpp</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
</valuemap>
</valuemap>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
<value type="QString" key="language">QmlJS</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
</valuemap>
</valuemap>
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value>
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
<value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.PluginSettings</variable>
<valuemap type="QVariantMap"/>
</data>
<data>
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.5.1 MSVC2010 32bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.5.1 MSVC2010 32bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.55.win32_msvc2010_kit</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">F:/Python/PyhtonTest/PyQt/QtNinePatch/build</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibraryAuto">true</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">构建</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments"/>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">清理</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">部署</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">在本地部署</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
<value type="int">0</value>
<value type="int">1</value>
<value type="int">2</value>
<value type="int">3</value>
<value type="int">4</value>
<value type="int">5</value>
<value type="int">6</value>
<value type="int">7</value>
<value type="int">8</value>
<value type="int">9</value>
<value type="int">10</value>
<value type="int">11</value>
<value type="int">12</value>
<value type="int">13</value>
<value type="int">14</value>
</valuelist>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Arguments"></value>
<value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Executable"></value>
<value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.WorkingDirectory">%{buildDir}</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">自定义执行档</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="int">1</value>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
<value type="int">18</value>
</data>
<data>
<variable>Version</variable>
<value type="int">18</value>
</data>
</qtcreator>

View file

@ -1,14 +0,0 @@
%Module QtNinePatch
%Import QtCore/QtCoremod.sip
%Import QtGui/QtGuimod.sip
class QtNinePatch
{
%TypeHeaderCode
#include "../QtNinePatch.h"
%End
public:
static QPixmap createPixmapFromNinePatchImage(const QImage &, int, int);
};

View file

@ -1,87 +0,0 @@
#!/usr/bin/env python
# -*- encoding:utf-8 -*-
import os
import shutil
import PyQt5
from PyQt5.QtCore import PYQT_CONFIGURATION
import sipconfig
# 模块名
moduleName = 'QtNinePatch'
# The name of the SIP build file generated by SIP and used by the build
# system.
build_file = '%s.sbf' % moduleName
# Get the SIP configuration information.
config = sipconfig.Configuration()
# pyqt5.5 + python34 + msvc 2010
config.platform = "win32-msvc2010"
qt_path = 'D:/soft/Qt/Qt5.5.1/5.5/msvc2010'
print('QT_DIR: %s' % qt_path)
pyqtpath = os.path.dirname(PyQt5.__file__)
print('PyQt5 path: ', pyqtpath)
config.sip_bin = os.path.join(pyqtpath, 'sip.exe')
config.default_sip_dir = os.path.join(pyqtpath, 'sip')
sip_cmd = ' '.join([
config.sip_bin,
'-c', "build",
'-b', "build/" + build_file,
'-I', config.default_sip_dir + '/PyQt5',
PYQT_CONFIGURATION.get('sip_flags', ''),
'%s.sip' % moduleName,
])
os.makedirs('build', exist_ok=True)
print(sip_cmd)
os.system(sip_cmd)
# Create the Makefile.
makefile = sipconfig.SIPModuleMakefile(
config, build_file, dir='build'
)
# Add the library we are wrapping. The name doesn't include any platform
# specific prefixes or extensions (e.g. the 'lib' prefix on UNIX, or the
# '.dll' extension on Windows).
# 添加头文件路径
makefile.extra_include_dirs = [
'../', '.',
os.path.join(qt_path, 'include'),
os.path.join(qt_path, 'include', 'QtCore'),
os.path.join(qt_path, 'include', 'QtGui')
]
# 添加用C++编译的库文件路径
makefile.extra_lib_dirs = [
os.path.abspath('../build'),
os.path.join(qt_path, 'lib'),
]
print(makefile.extra_lib_dirs)
makefile.extra_libs = [
moduleName,
'Qt5Core',
'Qt5Gui'
]
print(makefile.extra_libs)
# Generate the Makefile itself.
makefile.generate()
shutil.copy('../build/%s.dll' % moduleName, '%s.dll' % moduleName)
os.chdir('build')
os.system('nmake')
os.chdir('../')
shutil.copy('build/%s.pyd' % moduleName, '%s.pyd' % moduleName)
print('ok')

View file

@ -1,361 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Created on 2018年10月25日
@author: Irony
@site: https://pyqt5.com https://github.com/892768447
@email: 892768447@qq.com
@file: NinePatch
@description:
"""
from math import fabs
from PyQt5.QtCore import QRect
from PyQt5.QtGui import QImage, QColor, QPainter, qRed, qGreen, qBlue, qAlpha
__Author__ = """By: Irony
QQ: 892768447
Email: 892768447@qq.com"""
__Copyright__ = "Copyright (c) 2018 Irony"
__Version__ = "Version 1.0"
class _Exception(Exception):
def __init__(self, imgW, imgH):
self.imgW = imgW
self.imgH = imgH
class NinePatchException(Exception):
def __str__(self):
return "Nine patch error"
class ExceptionIncorrectWidth(_Exception):
def __str__(self):
return "Input incorrect width. Mimimum width = :{imgW}".format(imgW=self.imgW)
class ExceptionIncorrectWidthAndHeight(_Exception):
def __str__(self):
return "Input incorrect width width and height. Minimum width = :{imgW} . Minimum height = :{imgH}".format(imgW=self.imgW, imgH=self.imgH)
class ExceptionIncorrectHeight(_Exception):
def __str__(self):
return "Input incorrect height. Minimum height = :{imgW}".format(imgW=self.imgW)
class ExceptionNot9Patch(Exception):
def __str__(self):
return "It is not nine patch image"
class NinePatch:
def __init__(self, fileName):
self.CachedImage = None # 缓存图片
self.OldWidth = -1
self.OldHeight = -1
self.ResizeDistancesX = []
self.ResizeDistancesY = [] # [(int,int)]数组
self.setImage(fileName)
def width(self):
return self.Image.width()
def height(self):
return self.Image.height()
def setImage(self, fileName):
self.Image = QImage(fileName)
if self.Image.isNull():
return
self.ContentArea = self.GetContentArea()
self.GetResizeArea()
if not self.ResizeDistancesX or not self.ResizeDistancesY:
raise ExceptionNot9Patch
def __del__(self):
if hasattr(self, "CachedImage"):
del self.CachedImage
if hasattr(self, "Image"):
del self.Image
def Draw(self, painter, x, y):
painter.drawImage(x, y, self.CachedImage)
def SetImageSize(self, width, height):
resizeWidth = 0
resizeHeight = 0
for i in range(len(self.ResizeDistancesX)):
resizeWidth += self.ResizeDistancesX[i][1]
for i in range(len(self.ResizeDistancesY)):
resizeHeight += self.ResizeDistancesY[i][1]
if (width < (self.Image.width() - 2 - resizeWidth) and height < (self.Image.height() - 2 - resizeHeight)):
raise ExceptionIncorrectWidthAndHeight(
self.Image.width() - 2, self.Image.height() - 2)
if (width < (self.Image.width() - 2 - resizeWidth)):
raise ExceptionIncorrectWidth(
self.Image.width() - 2, self.Image.height() - 2)
if (height < (self.Image.height() - 2 - resizeHeight)):
raise ExceptionIncorrectHeight(
self.Image.width() - 2, self.Image.height() - 2)
if (width != self.OldWidth or height != self.OldHeight):
self.OldWidth = width
self.OldHeight = height
self.UpdateCachedImage(width, height)
@classmethod
def GetContentAreaRect(self, width, height):
# print("GetContentAreaRect : width:%d height:%d" % (width, height))
return (QRect(self.ContentArea.x(), self.ContentArea.y(), (width - (self.Image.width() - 2 - self.ContentArea.width())),
(height - (self.Image.height() - 2 - self.ContentArea.height()))))
def DrawScaledPart(self, oldRect, newRect, painter):
if (newRect.width() and newRect.height()):
# print("DrawScaledPart newRect.width:%d newRect.height:%d" % (newRect.width() , newRect.height()))
img = self.Image.copy(oldRect)
img = img.scaled(newRect.width(), newRect.height())
painter.drawImage(newRect.x(), newRect.y(), img,
0, 0, newRect.width(), newRect.height())
def DrawConstPart(self, oldRect, newRect, painter):
# print("DrawConstPart oldRect:{oldRect} newRect:{newRect}".format(oldRect = oldRect, newRect = newRect))
img = self.Image.copy(oldRect)
painter.drawImage(newRect.x(), newRect.y(), img, 0,
0, newRect.width(), newRect.height())
def IsColorBlack(self, color):
r = qRed(color)
g = qGreen(color)
b = qBlue(color)
a = qAlpha(color)
if a < 128:
return False
return r < 128 and g < 128 and b < 128
def GetContentArea(self):
j = self.Image.height() - 1
left = 0
right = 0
for i in range(self.Image.width()):
if (self.IsColorBlack(self.Image.pixel(i, j)) and left == 0):
left = i
else:
if (left != 0 and self.IsColorBlack(self.Image.pixel(i, j))):
right = i
if (left and not right):
right = left
left -= 1
i = self.Image.width() - 1
top = 0
bot = 0
for j in range(self.Image.height()):
if (self.IsColorBlack(self.Image.pixel(i, j)) and top == 0):
top = j
else:
if (top and self.IsColorBlack(self.Image.pixel(i, j))):
bot = j
if (top and not bot):
bot = top
top -= 1
# print("GetContentArea left: %d top:%d %d %d" % (left, top, right - left, bot - top))
return (QRect(left, top, right - left, bot - top))
def GetResizeArea(self):
j = 0
left = 0
right = 0
for i in range(self.Image.width()):
if (self.IsColorBlack(self.Image.pixel(i, j)) and left == 0):
left = i
if (left and self.IsColorBlack(self.Image.pixel(i, j)) and not self.IsColorBlack(self.Image.pixel(i + 1, j))):
right = i
left -= 1
# print("ResizeDistancesX.append ", left, " ", right - left)
self.ResizeDistancesX.append((left, right - left))
right = 0
left = 0
i = 0
top = 0
bot = 0
for j in range(self.Image.height()):
if (self.IsColorBlack(self.Image.pixel(i, j)) and top == 0):
top = j
if (top and self.IsColorBlack(self.Image.pixel(i, j)) and not self.IsColorBlack(self.Image.pixel(i, j + 1))):
bot = j
top -= 1
# print("ResizeDistancesY.append ", top, " ", bot - top)
self.ResizeDistancesY.append((top, bot - top))
top = 0
bot = 0
# print(self.ResizeDistancesX, len(self.ResizeDistancesX))
# print(self.ResizeDistancesY, len(self.ResizeDistancesY))
def GetFactor(self, width, height, factorX, factorY):
topResize = width - (self.Image.width() - 2)
leftResize = height - (self.Image.height() - 2)
for i in range(len(self.ResizeDistancesX)):
topResize += self.ResizeDistancesX[i][1]
factorX += self.ResizeDistancesX[i][1]
for i in range(len(self.ResizeDistancesY)):
leftResize += self.ResizeDistancesY[i][1]
factorY += self.ResizeDistancesY[i][1]
factorX = float(topResize) / factorX
factorY = float(leftResize) / factorY
return factorX, factorY
def UpdateCachedImage(self, width, height):
# print("UpdateCachedImage: ", width, " " , height)
self.CachedImage = QImage(
width, height, QImage.Format_ARGB32_Premultiplied)
self.CachedImage.fill(QColor(0, 0, 0, 0))
painter = QPainter(self.CachedImage)
factorX = 0.0
factorY = 0.0
factorX, factorY = self.GetFactor(width, height, factorX, factorY)
# print("after GetFactor: ", width, height, factorX, factorY)
lostX = 0.0
lostY = 0.0
x1 = 0 # for image parts X
y1 = 0 # for image parts Y
# widthResize # width for image parts
# heightResize # height for image parts
resizeX = 0
resizeY = 0
offsetX = 0
offsetY = 0
for i in range(len(self.ResizeDistancesX)):
y1 = 0
offsetY = 0
lostY = 0.0
for j in range(len(self.ResizeDistancesY)):
widthResize = self.ResizeDistancesX[i][0] - x1
heightResize = self.ResizeDistancesY[j][0] - y1
self.DrawConstPart(QRect(x1 + 1, y1 + 1, widthResize, heightResize),
QRect(x1 + offsetX, y1 + offsetY, widthResize, heightResize), painter)
y2 = self.ResizeDistancesY[j][0]
heightResize = self.ResizeDistancesY[j][1]
resizeY = round(float(heightResize) * factorY)
lostY += resizeY - (float(heightResize) * factorY)
if (fabs(lostY) >= 1.0):
if (lostY < 0):
resizeY += 1
lostY += 1.0
else:
resizeY -= 1
lostY -= 1.0
self.DrawScaledPart(QRect(x1 + 1, y2 + 1, widthResize, heightResize),
QRect(x1 + offsetX, y2 + offsetY, widthResize, resizeY), painter)
x2 = self.ResizeDistancesX[i][0]
widthResize = self.ResizeDistancesX[i][1]
heightResize = self.ResizeDistancesY[j][0] - y1
resizeX = round(float(widthResize) * factorX)
lostX += resizeX - (float(widthResize) * factorX)
if (fabs(lostX) >= 1.0):
if (lostX < 0):
resizeX += 1
lostX += 1.0
else:
resizeX -= 1
lostX -= 1.0
self.DrawScaledPart(QRect(x2 + 1, y1 + 1, widthResize, heightResize),
QRect(x2 + offsetX, y1 + offsetY, resizeX, heightResize), painter)
heightResize = self.ResizeDistancesY[j][1]
self.DrawScaledPart(QRect(x2 + 1, y2 + 1, widthResize, heightResize),
QRect(x2 + offsetX, y2 + offsetY, resizeX, resizeY), painter)
y1 = self.ResizeDistancesY[j][0] + self.ResizeDistancesY[j][1]
offsetY += resizeY - self.ResizeDistancesY[j][1]
x1 = self.ResizeDistancesX[i][0] + self.ResizeDistancesX[i][1]
offsetX += resizeX - self.ResizeDistancesX[i][1]
x1 = self.ResizeDistancesX[len(
self.ResizeDistancesX) - 1][0] + self.ResizeDistancesX[len(self.ResizeDistancesX) - 1][1]
widthResize = self.Image.width() - x1 - 2
y1 = 0
lostX = 0.0
lostY = 0.0
offsetY = 0
for i in range(len(self.ResizeDistancesY)):
self.DrawConstPart(QRect(x1 + 1, y1 + 1, widthResize, self.ResizeDistancesY[i][0] - y1),
QRect(x1 + offsetX, y1 + offsetY, widthResize, self.ResizeDistancesY[i][0] - y1), painter)
y1 = self.ResizeDistancesY[i][0]
resizeY = round(float(self.ResizeDistancesY[i][1]) * factorY)
lostY += resizeY - (float(self.ResizeDistancesY[i][1]) * factorY)
if (fabs(lostY) >= 1.0):
if (lostY < 0):
resizeY += 1
lostY += 1.0
else:
resizeY -= 1
lostY -= 1.0
self.DrawScaledPart(QRect(x1 + 1, y1 + 1, widthResize, self.ResizeDistancesY[i][1]),
QRect(x1 + offsetX, y1 + offsetY, widthResize, resizeY), painter)
y1 = self.ResizeDistancesY[i][0] + self.ResizeDistancesY[i][1]
offsetY += resizeY - self.ResizeDistancesY[i][1]
y1 = self.ResizeDistancesY[len(
self.ResizeDistancesY) - 1][0] + self.ResizeDistancesY[len(self.ResizeDistancesY) - 1][1]
heightResize = self.Image.height() - y1 - 2
x1 = 0
offsetX = 0
for i in range(len(self.ResizeDistancesX)):
self.DrawConstPart(QRect(x1 + 1, y1 + 1, self.ResizeDistancesX[i][0] - x1, heightResize),
QRect(x1 + offsetX, y1 + offsetY, self.ResizeDistancesX[i][0] - x1, heightResize), painter)
x1 = self.ResizeDistancesX[i][0]
resizeX = round(float(self.ResizeDistancesX[i][1]) * factorX)
lostX += resizeX - (float(self.ResizeDistancesX[i][1]) * factorX)
if (fabs(lostX) >= 1.0):
if (lostX < 0):
resizeX += 1
lostX += 1.0
else:
resizeX -= 1
lostX += 1.0
self.DrawScaledPart(QRect(x1 + 1, y1 + 1, self.ResizeDistancesX[i][1], heightResize),
QRect(x1 + offsetX, y1 + offsetY, resizeX, heightResize), painter)
x1 = self.ResizeDistancesX[i][0] + self.ResizeDistancesX[i][1]
offsetX += resizeX - self.ResizeDistancesX[i][1]
x1 = self.ResizeDistancesX[len(
self.ResizeDistancesX) - 1][0] + self.ResizeDistancesX[len(self.ResizeDistancesX) - 1][1]
widthResize = self.Image.width() - x1 - 2
y1 = self.ResizeDistancesY[len(
self.ResizeDistancesY) - 1][0] + self.ResizeDistancesY[len(self.ResizeDistancesY) - 1][1]
heightResize = self.Image.height() - y1 - 2
self.DrawConstPart(QRect(x1 + 1, y1 + 1, widthResize, heightResize),
QRect(x1 + offsetX, y1 + offsetY, widthResize, heightResize), painter)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

View file

@ -1,140 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Created on 2018年10月25日
@author: Irony
@site: https://pyqt5.com https://github.com/892768447
@email: 892768447@qq.com
@file: QtNinePatch
@description:
"""
from math import floor
from PyQt5.QtCore import Qt, QRect
from PyQt5.QtGui import qAlpha, QPixmap, QPainter
__Author__ = """By: Irony
QQ: 892768447
Email: 892768447@qq.com"""
__Copyright__ = "Copyright (c) 2018 Irony"
__Version__ = "Version 1.0"
class Part:
def __init__(self, pos=0, length=0, stretchable=False):
self.pos = pos
self.length = length
self.stretchable = stretchable
def isStretchableMarker(pixel):
return (qAlpha(pixel) >> 7) & 1
def resize9patch(image, dw, dh):
sw = image.width()
sh = image.height()
if sw > 2 and sh > 2 and dw > 0 and dh > 0:
pixmap = QPixmap(dw, dh)
pixmap.fill(Qt.transparent)
pr = QPainter(pixmap)
pr.setRenderHint(QPainter.Antialiasing)
pr.setRenderHint(QPainter.SmoothPixmapTransform)
horz = []
vert = []
horz_stretch = 0
vert_stretch = 0
pos = 0
last = image.pixel(1, 0)
for x in range(1, sw - 1):
nextP = image.pixel(x + 1, 0)
if isStretchableMarker(last) != isStretchableMarker(nextP) or x == sw - 2:
stretchable = isStretchableMarker(last)
length = x - pos
horz.append(Part(pos, length, stretchable))
if stretchable:
horz_stretch += length
last = nextP
pos = x
pos = 0
last = image.pixel(0, 1)
for y in range(1, sh - 1):
nextP = image.pixel(0, y + 1)
if isStretchableMarker(last) != isStretchableMarker(nextP) or y == sh - 2:
stretchable = isStretchableMarker(last)
length = y - pos
vert.append(Part(pos, length, stretchable))
if stretchable:
vert_stretch += length
last = nextP
pos = y
horz_mul = 0
vert_mul = 0
if horz_stretch > 0:
horz_mul = float((dw - (sw - 2 - horz_stretch)) / horz_stretch)
if vert_stretch > 0:
vert_mul = float((dh - (sh - 2 - vert_stretch)) / vert_stretch)
dy0 = 0
dy1 = 0
vstretch = 0
len_vert = len(vert)
len_horz = len(horz)
for i in range(len_vert):
sy0 = vert[i].pos
sy1 = vert[i].pos + vert[i].length
if i + 1 == len_vert:
dy1 = dh
elif vert[i].stretchable:
vstretch += float(vert[i].length * vert_mul)
s = floor(vstretch)
vstretch -= s
dy1 += int(s)
else:
dy1 += vert[i].length
dx0 = 0
dx1 = 0
hstretch = 0
for j in range(len_horz):
sx0 = horz[j].pos
sx1 = horz[j].pos + horz[j].length
if j + 1 == len_horz:
dx1 = dw
elif horz[j].stretchable:
hstretch += float(horz[j].length * horz_mul)
s = floor(hstretch)
hstretch -= s
dx1 += int(s)
else:
dx1 += horz[j].length
pr.drawImage(QRect(dx0, dy0, dx1 - dx0, dy1 - dy0),
image, QRect(sx0 + 1, sy0 + 1, sx1 - sx0, sy1 - sy0))
dx0 = dx1
dy0 = dy1
return pixmap
return QPixmap()
def createPixmapFromNinePatchImage(image, dw, dh):
w = dw
h = dh
if w < image.width() or h < image.height(): # shrink
w = max(image.width(), w)
h = max(image.height(), h)
pm1 = resize9patch(image, w, h)
if pm1.isNull():
return QPixmap()
pm2 = QPixmap(dw, dh)
pm2.fill(Qt.transparent)
pr = QPainter(pm2)
pr.setRenderHint(QPainter.Antialiasing)
pr.setRenderHint(QPainter.SmoothPixmapTransform)
pr.drawPixmap(0, 0, dw, dh, pm1, 0, 0, w, h)
return pm2
else:
return resize9patch(image, dw, dh)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB