diff --git a/src/tools/uav_viewer_py/CMakeLists.txt b/src/tools/uav_viewer_py/CMakeLists.txt new file mode 100644 index 000000000..784cd15df --- /dev/null +++ b/src/tools/uav_viewer_py/CMakeLists.txt @@ -0,0 +1,14 @@ + + +## INSTALL ## + +# Install .py +FILE(GLOB_RECURSE HEADERS_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*py) +FOREACH(header ${HEADERS_FILES}) + INSTALL(FILES ${header} DESTINATION share/jderobot/python/uav_viewer_py/ COMPONENT tools) +ENDFOREACH(header) + +# Install gui +INSTALL (DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/gui DESTINATION share/jderobot/python/uav_viewer_py COMPONENT tools PATTERN .svn EXCLUDE) + + diff --git a/src/tools/uav_viewer_py/generateGUI b/src/tools/uav_viewer_py/generateGUI new file mode 100755 index 000000000..d2d26b788 --- /dev/null +++ b/src/tools/uav_viewer_py/generateGUI @@ -0,0 +1,9 @@ +#!/bin/bash + cd resources + pyrcc5 resources.qrc -o resources_rc.py + mv resources_rc.py .. + + cd ../gui + pyuic5 ui_gui.ui > ui_gui.py + cd .. + diff --git a/src/tools/uav_viewer_py/gui/GUI.py b/src/tools/uav_viewer_py/gui/GUI.py new file mode 100644 index 000000000..9e234979c --- /dev/null +++ b/src/tools/uav_viewer_py/gui/GUI.py @@ -0,0 +1,168 @@ +# +# Copyright (C) 1997-2016 JDE Developers Team +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see http://www.gnu.org/licenses/. +# Authors : +# Alberto Martin Florido +# Aitor Martinez Fernandez +# + + +from PyQt5.QtCore import pyqtSignal, Qt +from PyQt5.QtWidgets import QMainWindow +from gui.ui_gui import Ui_MainWindow +from gui.teleopWidget import TeleopWidget +from gui.cameraWidget import CameraWidget +from gui.communicator import Communicator +from gui.sensorsWidget import SensorsWidget + + +class MainWindow(QMainWindow, Ui_MainWindow): + updGUI = pyqtSignal() + + def __init__(self, parent=None): + super(MainWindow, self).__init__(parent) + self.setupUi(self) + self.teleop = TeleopWidget(self) + self.tlLayout.addWidget(self.teleop) + self.teleop.setVisible(True) + + self.record = False + + self.updGUI.connect(self.updateGUI) + + self.cameraCheck.stateChanged.connect(self.showCameraWidget) + self.sensorsCheck.stateChanged.connect(self.showSensorsWidget) + + self.rotationDial.valueChanged.connect(self.rotationChange) + self.altdSlider.valueChanged.connect(self.altitudeChange) + + self.cameraWidget = CameraWidget(self) + self.sensorsWidget = SensorsWidget(self) + + self.cameraCommunicator = Communicator() + self.trackingCommunicator = Communicator() + + self.stopButton.clicked.connect(self.stopClicked) + self.resetButton.clicked.connect(self.resetClicked) + self.takeoffButton.clicked.connect(self.takeOffClicked) + self.takeoff = False + self.reset = False + + def getCamera(self): + return self.camera + + def setCamera(self, camera): + self.camera = camera + + def getNavData(self): + return self.navdata + + def setNavData(self, navdata): + self.navdata = navdata + + def getPose3D(self): + return self.pose + + def setPose3D(self, pose): + self.pose = pose + + def getCMDVel(self): + return self.cmdvel + + def setCMDVel(self, cmdvel): + self.cmdvel = cmdvel + + def getExtra(self): + return self.extra + + def setExtra(self, extra): + self.extra = extra + + + def updateGUI(self): + self.cameraWidget.imageUpdate.emit() + self.sensorsWidget.sensorsUpdate.emit() + + def stopClicked(self): + if self.record == True: + self.extra.record(False) + self.rotationDial.setValue(self.altdSlider.maximum() / 2) + self.altdSlider.setValue(self.altdSlider.maximum() / 2) + self.cmdvel.sendCMDVel(0, 0, 0, 0, 0, 0) + self.teleop.stopSIG.emit() + + def takeOffClicked(self): + if (self.takeoff == True): + self.takeoffButton.setText("Take Off") + self.extra.land() + self.takeoff = False + else: + self.takeoffButton.setText("Land") + self.extra.takeoff() + self.takeoff = True + + def resetClicked(self): + if self.reset == True: + self.resetButton.setText("Reset") + self.extra.reset() + self.reset = False + else: + self.resetButton.setText("Unreset") + self.extra.reset() + self.reset = True + + def showCameraWidget(self, state): + if state == Qt.Checked: + self.cameraWidget.show() + else: + self.cameraWidget.close() + + def closeCameraWidget(self): + self.cameraCheck.setChecked(False) + + def showSensorsWidget(self, state): + if state == Qt.Checked: + self.sensorsWidget.show() + else: + self.sensorsWidget.close() + + def closeSensorsWidget(self): + self.sensorsCheck.setChecked(False) + + def rotationChange(self, value): + value = (1.0 / (self.rotationDial.maximum() / 2)) * (value - (self.rotationDial.maximum() / 2)) + self.rotValue.setText('%.2f' % value) + self.cmdvel.setYaw(value) + self.cmdvel.sendVelocities() + + def altitudeChange(self, value): + value = (1.0 / (self.altdSlider.maximum() / 2)) * (value - (self.altdSlider.maximum() / 2)) + self.altdValue.setText('%.2f' % value) + self.cmdvel.setVZ(value) + self.cmdvel.sendVelocities() + + def setXYValues(self, newX, newY): + self.XValue.setText('%.2f' % newX) + self.YValue.setText('%.2f' % newY) + self.cmdvel.setVX(-newY) + self.cmdvel.setVY(-newX) + self.cmdvel.sendVelocities() + + def closeEvent(self, event): + self.camera.stop() + self.navdata.stop() + self.pose.stop() + event.accept() + diff --git a/src/tools/uav_viewer_py/gui/__init__.py b/src/tools/uav_viewer_py/gui/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/tools/uav_viewer_py/gui/attitudeIndicator.py b/src/tools/uav_viewer_py/gui/attitudeIndicator.py new file mode 100644 index 000000000..893025904 --- /dev/null +++ b/src/tools/uav_viewer_py/gui/attitudeIndicator.py @@ -0,0 +1,156 @@ +# +# Copyright (C) 1997-2015 JDE Developers Team +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see http://www.gnu.org/licenses/. +# Authors : +# Alberto Martin Florido +# +import math +from PyQt4 import Qt +import PyQt4.Qwt5 as Qwt + +def enumList(enum, sentinel): + ''' + ''' + return [enum(i) for i in range(sentinel)] + +colorGroupList = enumList( + Qt.QPalette.ColorGroup, Qt.QPalette.NColorGroups) +colorRoleList = enumList( + Qt.QPalette.ColorRole, Qt.QPalette.NColorRoles) +handList = enumList( + Qwt.QwtAnalogClock.Hand, Qwt.QwtAnalogClock.NHands) + +class AttitudeIndicatorNeedle(Qwt.QwtDialNeedle): + + def __init__(self, color): + Qwt.QwtDialNeedle.__init__(self) + palette = Qt.QPalette() + for colourGroup in colorGroupList: + palette.setColor(colourGroup, Qt.QPalette.Text, color) + self.setPalette(palette) + + # __init__() + + def draw(self, painter, center, length, direction, cg): + direction *= math.pi / 180.0 + triangleSize = int(round(length * 0.1)) + + painter.save() + + p0 = Qt.QPoint(center.x() + 1, center.y() + 1) + p1 = Qwt.qwtPolar2Pos(p0, length - 2 * triangleSize - 2, direction) + + pa = Qt.QPolygon([ + Qwt.qwtPolar2Pos(p1, 2 * triangleSize, direction), + Qwt.qwtPolar2Pos(p1, triangleSize, direction + math.pi/2), + Qwt.qwtPolar2Pos(p1, triangleSize, direction - math.pi/2), + ]) + + color = self.palette().color(cg, Qt.QPalette.Text) + painter.setBrush(color) + painter.drawPolygon(pa) + + painter.setPen(Qt.QPen(color, 3)) + painter.drawLine( + Qwt.qwtPolar2Pos(p0, length - 2, direction + math.pi/2), + Qwt.qwtPolar2Pos(p0, length - 2, direction - math.pi/2)) + + painter.restore() + + # draw() + +# class AttitudeIndicatorNeedle + + +class AttitudeIndicator(Qwt.QwtDial): + + def __init__(self, *args): + Qwt.QwtDial.__init__(self, *args) + self.__gradient = 0.0 + self.setMode(Qwt.QwtDial.RotateScale) + self.setWrapping(True) + self.setOrigin(270.0) + self.setScaleOptions(Qwt.QwtDial.ScaleTicks) + self.setScale(0, 0, 30.0) + self.setNeedle(AttitudeIndicatorNeedle( + self.palette().color(Qt.QPalette.Text))) + + # __init__() + + def angle(self): + return self.value() + + # angle() + + def setAngle(self, angle): + self.setValue(angle) + + # setAngle() + + def gradient(self): + return self.__gradient + + # gradient() + + def setGradient(self, gradient): + self.__gradient = gradient + + # setGradient() + + def keyPressEvent(self, event): + if event.key() == Qt.Qt.Key_Plus: + self.setGradient(self.gradient() + 0.05) + elif event.key() == Qt.Qt.Key_Minus: + self.setGradient(self.gradient() - 0.05) + else: + Qwt.QwtDial.keyPressEvent(self, event) + + # keyPressEvent() + + def drawScale(self, painter, center, radius, origin, minArc, maxArc): + dir = (360.0 - origin) * math.pi / 180.0 + offset = 4 + p0 = Qwt.qwtPolar2Pos(center, offset, dir + math.pi) + + w = self.contentsRect().width() + + # clip region to swallow 180 - 360 degrees + pa = [] + pa.append(Qwt.qwtPolar2Pos(p0, w, dir - math.pi/2)) + pa.append(Qwt.qwtPolar2Pos(pa[-1], 2 * w, dir + math.pi/2)) + pa.append(Qwt.qwtPolar2Pos(pa[-1], w, dir)) + pa.append(Qwt.qwtPolar2Pos(pa[-1], 2 * w, dir - math.pi/2)) + + painter.save() + painter.setClipRegion(Qt.QRegion(Qt.QPolygon(pa))) + Qwt.QwtDial.drawScale( + self, painter, center, radius, origin, minArc, maxArc) + painter.restore() + + # drawScale() + + def drawScaleContents(self, painter, center, radius): + dir = 360 - int(round(self.origin() - self.value())) + arc = 90 + int(round(self.gradient() * 90)) + skyColor = Qt.QColor(38, 151, 221) + painter.save() + painter.setBrush(skyColor) + painter.drawChord( + self.scaleContentsRect(), (dir - arc)*16, 2*arc*16) + painter.restore() + + # drawScaleContents() + +# class AttitudeIndicator \ No newline at end of file diff --git a/src/tools/uav_viewer_py/gui/cameraWidget.py b/src/tools/uav_viewer_py/gui/cameraWidget.py new file mode 100644 index 000000000..84af07f61 --- /dev/null +++ b/src/tools/uav_viewer_py/gui/cameraWidget.py @@ -0,0 +1,83 @@ +# +# Copyright (C) 1997-2015 JDE Developers Team +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see http://www.gnu.org/licenses/. +# Authors : +# Alberto Martin Florido +# +from PyQt5.QtCore import QSize, pyqtSignal +from PyQt5.QtGui import QImage, QPixmap +from PyQt5.QtWidgets import QPushButton, QWidget, QLabel + + +class CameraWidget(QWidget): + IMAGE_COLS_MAX = 640 + IMAGE_ROWS_MAX = 360 + LINX = 0.3 + LINY = 0.3 + LINZ = 0.8 + ANGZ = 1.0 + ANGY = 0.0 + ANGX = 0.0 + + imageUpdate = pyqtSignal() + + def __init__(self, winParent): + super(CameraWidget, self).__init__() + self.winParent = winParent + self.imageUpdate.connect(self.updateImage) + self.initUI() + + def initUI(self): + + self.setMinimumSize(680, 500) + self.setMaximumSize(680, 500) + + self.setWindowTitle("Camera") + changeCamButton = QPushButton("Change Camera") + changeCamButton.resize(170, 40) + changeCamButton.move(245, 450) + changeCamButton.setParent(self) + changeCamButton.clicked.connect(self.changeCamera) + + self.imgLabel = QLabel(self) + self.imgLabel.resize(640, 360) + self.imgLabel.move(10, 5) + self.imgLabel.show() + + def updateImage(self): + + img = self.winParent.getCamera().getImage() + if img is not None: + image = QImage(img.data, img.shape[1], img.shape[0], img.shape[1] * img.shape[2], QImage.Format_RGB888); + + if img.shape[1] == self.IMAGE_COLS_MAX: + x = 20 + else: + x = (self.IMAGE_COLS_MAX + 20) / 2 - (img.shape[1] / 2) + if img.shape[0] == self.IMAGE_ROWS_MAX: + y = 40 + else: + y = (self.IMAGE_ROWS_MAX + 40) / 2 - (img.shape[0] / 2) + + size = QSize(img.shape[1], img.shape[0]) + self.imgLabel.move(x, y) + self.imgLabel.resize(size) + self.imgLabel.setPixmap(QPixmap.fromImage(image)) + + def closeEvent(self, event): + self.winParent.closeCameraWidget() + + def changeCamera(self): + self.winParent.getExtra().toggleCam() diff --git a/src/tools/uav_viewer_py/gui/communicator.py b/src/tools/uav_viewer_py/gui/communicator.py new file mode 100644 index 000000000..ac7c1a026 --- /dev/null +++ b/src/tools/uav_viewer_py/gui/communicator.py @@ -0,0 +1,24 @@ +# +# Copyright (C) 1997-2015 JDE Developers Team +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see http://www.gnu.org/licenses/. +# Authors : +# Alberto Martin Florido +# +#!/usr/bin/python +# -*- coding: utf-8 -*- + +from PyQt5 import QtCore +class Communicator(QtCore.QObject): + updateBW = QtCore.pyqtSignal() diff --git a/src/tools/uav_viewer_py/gui/sensorsWidget.py b/src/tools/uav_viewer_py/gui/sensorsWidget.py new file mode 100644 index 000000000..31aa19e0e --- /dev/null +++ b/src/tools/uav_viewer_py/gui/sensorsWidget.py @@ -0,0 +1,270 @@ +# +# Copyright (C) 1997-2015 JDE Developers Team +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see http://www.gnu.org/licenses/. +# Authors : +# Alberto Martin Florido +# +from PyQt5.QtWidgets import QWidget, QLabel, QGridLayout, QVBoxLayout, QSpacerItem, QSizePolicy, QHBoxLayout, QProgressBar +from PyQt5 import QtCore +from PyQt5.QtCore import pyqtSignal, Qt +# from gui.speedoMeter import SpeedoMeter +# from gui.attitudeIndicator import AttitudeIndicator +from qfi import qfi_ADI, qfi_ALT, qfi_SI, qfi_HSI +import math + + +class SensorsWidget(QWidget): + sensorsUpdate = pyqtSignal() + + def __init__(self, winParent): + super(SensorsWidget, self).__init__() + self.winParent = winParent + self.sensorsUpdate.connect(self.updateSensors) + self.initUI() + + def initUI(self): + + self.mainLayout = QHBoxLayout() + self.indLayout = QGridLayout() + self.horizonLayout = QVBoxLayout() + self.horizonData = QGridLayout() + self.compassLayout = QVBoxLayout() + self.compassData = QGridLayout() + self.altLayout = QVBoxLayout() + self.altData = QGridLayout() + self.batteryLayout = QVBoxLayout() + self.batteryData = QGridLayout() + + self.setMinimumSize(750, 450) + self.setMaximumSize(750, 450) + + self.setWindowTitle("Sensors") + + self.pitchLabel = QLabel('Pitch:', self) + self.pitchValueLabel = QLabel('0', self) + self.pitchValueLabel.setAlignment(Qt.AlignRight | Qt.AlignTrailing | Qt.AlignVCenter) + + self.rollLabel = QLabel('Roll:', self) + self.rollValueLabel = QLabel('0', self) + self.rollValueLabel.setAlignment(Qt.AlignRight | Qt.AlignTrailing | Qt.AlignVCenter) + + self.yawLabel = QLabel('Yaw:', self) + self.yawValueLabel = QLabel('0', self) + self.yawValueLabel.setAlignment(Qt.AlignRight | Qt.AlignTrailing | Qt.AlignVCenter) + + self.altLabel = QLabel('Alt:', self) + self.altValueLabel = QLabel('0', self) + self.altValueLabel.setAlignment(Qt.AlignRight | Qt.AlignTrailing | Qt.AlignVCenter) + + self.pitchgLabel = QLabel("\272", self) + self.rollgLabel = QLabel("\272", self) + self.yawgLabel = QLabel("\272", self) + self.altmLabel = QLabel('m', self) + + hSpacer = QSpacerItem(100, 30, QSizePolicy.Ignored, QSizePolicy.Ignored) + + self.horizonData.addItem(hSpacer, 0, 0, 1, 1, Qt.AlignLeft) + self.horizonData.addWidget(self.pitchLabel, 0, 1, Qt.AlignCenter) + self.horizonData.addWidget(self.pitchValueLabel, 0, 2, Qt.AlignCenter) + self.horizonData.addWidget(self.pitchgLabel, 0, 3, Qt.AlignCenter) + self.horizonData.addWidget(self.rollLabel, 0, 4, Qt.AlignCenter) + self.horizonData.addWidget(self.rollValueLabel, 0, 5, Qt.AlignCenter) + self.horizonData.addWidget(self.rollgLabel, 0, 6, Qt.AlignCenter) + self.horizonData.addItem(hSpacer, 0, 7, 1, 1, Qt.AlignRight) + + self.compassData.addItem(hSpacer, 0, 0, 1, 1, Qt.AlignLeft) + self.compassData.addWidget(self.yawLabel, 0, 1, Qt.AlignCenter) + self.compassData.addWidget(self.yawValueLabel, 0, 2, Qt.AlignCenter) + self.compassData.addWidget(self.yawgLabel, 0, 3, Qt.AlignCenter) + self.compassData.addItem(hSpacer, 0, 4, 1, 1, Qt.AlignRight) + + self.altData.addItem(hSpacer, 0, 0, 1, 1, Qt.AlignLeft) + self.altData.addWidget(self.altLabel, 0, 1, Qt.AlignCenter) + self.altData.addWidget(self.altValueLabel, 0, 2, Qt.AlignCenter) + self.altData.addWidget(self.altmLabel, 0, 3, Qt.AlignCenter) + self.altData.addItem(hSpacer, 0, 4, 1, 1, Qt.AlignLeft) + + self.altd = qfi_ALT.qfi_ALT(self) + + self.altd.setFixedSize(QtCore.QSize(200,200)) + self.altLayout.addWidget(self.altd) + self.altLayout.addLayout(self.altData) + # self.altd.move(420,50) + + self.compass = qfi_HSI.qfi_HSI(self) + self.compass.setFixedSize(QtCore.QSize(200, 200)) + self.compassLayout.addWidget(self.compass) + self.compassLayout.addLayout(self.compassData) + + self.horizon = qfi_ADI.qfi_ADI(self) + self.horizon.setFixedSize(QtCore.QSize(200, 200)) + self.horizonLayout.addWidget(self.horizon) + self.horizonLayout.addLayout(self.horizonData) + + + self.velLinX = qfi_SI.qfi_SI(self) + self.velLinX.setFixedSize(QtCore.QSize(150, 150)) + # self.velLinX.move(60,270) + self.velXLabel = QLabel('Linear X (m/s)', self) + # self.velXLabel.move(95,420) + + + self.velLinY = qfi_SI.qfi_SI(self) + self.velLinY.setFixedSize(QtCore.QSize(150, 150)) + # self.velLinY.move(240,270) + self.velYLabel = QLabel('Linear Y (m/s)', self) + # self.velYLabel.move(275,420) + + self.velLinZ = qfi_SI.qfi_SI(self) + self.velLinZ.setFixedSize(QtCore.QSize(150, 150)) + # self.velLinZ.setLabel("8 m/s") + # self.velLinZ.move(420,270) + self.velZLabel = QLabel('Linear Z (m/s)', self) + # self.velZLabel.move(455,420) + + self.indLayout.addLayout(self.horizonLayout, 0, 0, Qt.AlignCenter) + self.indLayout.addLayout(self.compassLayout, 0, 1, Qt.AlignCenter) + self.indLayout.addLayout(self.altLayout, 0, 2, Qt.AlignCenter) + self.indLayout.addWidget(self.velLinX, 1, 0, Qt.AlignCenter) + self.indLayout.addWidget(self.velLinY, 1, 1, Qt.AlignCenter) + self.indLayout.addWidget(self.velLinZ, 1, 2, Qt.AlignCenter) + self.indLayout.addWidget(self.velXLabel, 2, 0, Qt.AlignCenter) + self.indLayout.addWidget(self.velYLabel, 2, 1, Qt.AlignCenter) + self.indLayout.addWidget(self.velZLabel, 2, 2, Qt.AlignCenter) + + self.battery=QProgressBar(self) + self.battery.setValue(0) + self.battery.resize(56,241) + self.battery.setOrientation(Qt.Vertical) + self.battery.setTextVisible(False) + + self.batteryLabel=QLabel('Battery (%)',self) + self.batteryValueLabel = QLabel('0', self) + self.batteryValueLabel.setAlignment(Qt.AlignRight | Qt.AlignTrailing | Qt.AlignVCenter) + + self.batteryData.addItem(hSpacer, 0, 0, 1, 1, Qt.AlignLeft) + self.batteryData.addWidget(self.batteryLabel, 0, 1, Qt.AlignCenter) + self.batteryData.addWidget(self.batteryValueLabel, 0, 2, Qt.AlignCenter) + self.batteryData.addItem(hSpacer, 0, 4, 1, 1, Qt.AlignLeft) + + self.batteryLayout.addWidget(self.battery, 0, Qt.AlignHCenter) + self.batteryLayout.addLayout(self.batteryData) + + self.mainLayout.addLayout(self.indLayout) + self.mainLayout.addLayout(self.batteryLayout) + self.setLayout(self.mainLayout); + + def updateSensors(self): + pose = self.winParent.getPose3D().getPose3D() + + if pose != None: + qw = pose.q0 + qx = pose.q1 + qy = pose.q2 + qz = pose.q3 + self.drawAltd(pose.z) + self.drawYawValues(self.quatToYaw(qw, qx, qy, qz) * 180 / math.pi) + self.drawPitchRollValues(self.quatToPitch(qw, qx, qy, qz) * 180 / math.pi, + self.quatToRoll(qw, qx, qy, qz) * 180 / math.pi) + + navdata = self.winParent.getNavData().getNavdata() + + if navdata != None: + self.battery.setValue(navdata.batteryPercent) + self.batteryValueLabel.setText(str(navdata.batteryPercent)) + self.drawVelocities(navdata.vx, navdata.vy, navdata.vz) + + def drawYawValues(self, degress): + value = "{0:.2f}".format(degress) + self.yawValueLabel.setText(value) + self.compass.setHeading(degress) + self.compass.viewUpdate.emit() + + def drawAltd(self, meters): + + self.altd.setAltitude(meters * 10) + self.altd.viewUpdate.emit() + + value = "{0:.0f}".format(meters) + self.altValueLabel.setText(value) + + def drawPitchRollValues(self, pitch, roll): + if (pitch > 0 and pitch <= 90): + result = pitch / 90 + result = -result + elif (pitch < 0 and pitch >= -90): + result = pitch / -90 + else: + result = 0.0 + + self.horizon.setPitch(pitch) + self.horizon.setRoll(-roll) + self.horizon.viewUpdate.emit() + pitchValue = "{0:.2f}".format(pitch) + rollValue = "{0:.2f}".format(roll) + self.pitchValueLabel.setText(pitchValue) + self.rollValueLabel.setText(rollValue) + + def drawVelocities(self, vx, vy, vz): + + vx = math.fabs(vx) + vx /= 1000.0 + self.velLinX.setSpeed(vx) + self.velLinX.viewUpdate.emit() + vx = math.fabs(vx) + + vy = math.fabs(vy) + vy /= 1000.0 + self.velLinY.setSpeed(vy) + self.velLinY.viewUpdate.emit() + + vz = math.fabs(vz) + vz /= 1000.0 + self.velLinZ.setSpeed(vz) + self.velLinZ.viewUpdate.emit() + + def quatToRoll(self, qw, qx, qy, qz): + rotateXa0 = 2.0 * (qy * qz + qw * qx) + rotateXa1 = qw * qw - qx * qx - qy * qy + qz * qz + rotateX = 0.0 + + if (rotateXa0 != 0.0 and rotateXa1 != 0.0): + rotateX = math.atan2(rotateXa0, rotateXa1) + + return rotateX + + def quatToPitch(self, qw, qx, qy, qz): + rotateYa0 = -2.0 * (qx * qz - qw * qy) + rotateY = 0.0 + if (rotateYa0 >= 1.0): + rotateY = math.pi / 2.0 + elif (rotateYa0 <= -1.0): + rotateY = -math.pi / 2.0 + else: + rotateY = math.asin(rotateYa0) + + return rotateY + + def quatToYaw(self, qw, qx, qy, qz): + rotateZa0 = 2.0 * (qx * qy + qw * qz) + rotateZa1 = qw * qw + qx * qx - qy * qy - qz * qz + rotateZ = 0.0 + if (rotateZa0 != 0.0 and rotateZa1 != 0.0): + rotateZ = math.atan2(rotateZa0, rotateZa1) + + return rotateZ + + def closeEvent(self, event): + self.winParent.closeSensorsWidget() diff --git a/src/tools/uav_viewer_py/gui/teleopWidget.py b/src/tools/uav_viewer_py/gui/teleopWidget.py new file mode 100644 index 000000000..93c7ea405 --- /dev/null +++ b/src/tools/uav_viewer_py/gui/teleopWidget.py @@ -0,0 +1,113 @@ +# +# Copyright (C) 1997-2015 JDE Developers Team +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see http://www.gnu.org/licenses/. +# Authors : +# Alberto Martin Florido +# +import resources_rc +from PyQt5.QtGui import QImage, QPainter, QPen +from PyQt5.QtCore import pyqtSignal, QPointF, Qt, QPoint +from PyQt5.QtWidgets import QWidget, QGridLayout + + +class TeleopWidget(QWidget): + stopSIG = pyqtSignal() + + def __init__(self, winParent): + super(TeleopWidget, self).__init__() + self.winParent = winParent + self.line = QPointF(0, 0); + self.qimage = QImage() + self.qimage.load(':images/ball.png') + self.stopSIG.connect(self.stop) + self.initUI() + + def initUI(self): + layout = QGridLayout() + self.setLayout(layout) + self.setAutoFillBackground(True) + p = self.palette() + p.setColor(self.backgroundRole(), Qt.black) + self.setPalette(p) + self.resize(300, 300) + self.setMinimumSize(300, 300) + + def stop(self): + self.line = QPointF(0, 0); + self.repaint(); + + def mouseMoveEvent(self, e): + if e.buttons() == Qt.LeftButton: + x = e.x() - self.width() / 2 + y = e.y() - self.height() / 2 + self.line = QPointF(x, y) + self.repaint() + + def paintEvent(self, e): + _width = self.width() + _height = self.height() + + width = 2 + + painter = QPainter(self) + + pen = QPen(Qt.blue, width) + painter.setPen(pen) + + # Centro del widget + painter.translate(QPoint(_width / 2, _height / 2)) + + # eje + painter.drawLine(QPointF(-_width, 0), + QPointF(_width, 0)) + + painter.drawLine(QPointF(0, -_height), + QPointF(0, _height)) + + # con el raton + pen = QPen(Qt.red, width) + painter.setPen(pen) + + # Comprobamos que el raton este dentro de los limites + if abs(self.line.x() * 2) >= self.size().width(): + if self.line.x() >= 0: + self.line.setX(self.size().width() / 2) + elif self.line.x() < 0: + self.line.setX((-self.size().width() / 2) + 1) + + if abs(self.line.y() * 2) >= self.size().height(): + if self.line.y() >= 0: + self.line.setY(self.size().height() / 2) + elif self.line.y() < 0: + self.line.setY((-self.size().height() / 2) + 1) + + painter.drawLine(QPointF(self.line.x(), -_height), + QPointF(self.line.x(), _height)) + + painter.drawLine(QPointF(-_width, self.line.y()), + QPointF(_width, self.line.y())) + + # print "x: %f y: %f" % (self.line.x(), self.line.y()) + + v_normalized = (1.0 / (self.size().height() / 2)) * self.line.y() + v_normalized = float("{0:.2f}".format(v_normalized)) + w_normalized = (1.0 / (self.size().width() / 2)) * self.line.x() + w_normalized = float("{0:.2f}".format(w_normalized)) + + # print "v: %f w: %f" % (v_normalized,w_normalized) + self.winParent.setXYValues(w_normalized, v_normalized) + painter.drawImage(self.line.x() - self.qimage.width() / 2, self.line.y() - self.qimage.height() / 2, + self.qimage); + diff --git a/src/tools/uav_viewer_py/gui/threadGUI.py b/src/tools/uav_viewer_py/gui/threadGUI.py new file mode 100644 index 000000000..1c6e80781 --- /dev/null +++ b/src/tools/uav_viewer_py/gui/threadGUI.py @@ -0,0 +1,43 @@ +# +# Copyright (C) 1997-2015 JDE Developers Team +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see http://www.gnu.org/licenses/. +# Authors : +# Alberto Martin Florido +# +import threading, time +from datetime import datetime + +time_cycle = 50; + +class ThreadGUI(threading.Thread): + def __init__(self, gui): + self.gui = gui + + threading.Thread.__init__(self) + + def run(self): + + while(True): + + start_time = datetime.now() + self.gui.updGUI.emit() + + finish_Time = datetime.now() + + dt = finish_Time - start_time + ms = (dt.days * 24 * 60 * 60 + dt.seconds) * 1000 + dt.microseconds / 1000.0 + + if(ms < time_cycle): + time.sleep((time_cycle-ms) / 1000.0); \ No newline at end of file diff --git a/src/tools/uav_viewer_py/gui/ui_gui.py b/src/tools/uav_viewer_py/gui/ui_gui.py new file mode 100644 index 000000000..e623fb963 --- /dev/null +++ b/src/tools/uav_viewer_py/gui/ui_gui.py @@ -0,0 +1,107 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'ui_gui.ui' +# +# Created by: PyQt5 UI code generator 5.5.1 +# +# WARNING! All changes made in this file will be lost! + +from PyQt5 import QtCore, QtGui, QtWidgets + +class Ui_MainWindow(object): + def setupUi(self, MainWindow): + MainWindow.setObjectName("MainWindow") + MainWindow.resize(660, 370) + MainWindow.setMinimumSize(QtCore.QSize(660, 370)) + MainWindow.setMaximumSize(QtCore.QSize(660, 370)) + self.centralwidget = QtWidgets.QWidget(MainWindow) + self.centralwidget.setObjectName("centralwidget") + self.takeoffButton = QtWidgets.QPushButton(self.centralwidget) + self.takeoffButton.setGeometry(QtCore.QRect(470, 30, 161, 41)) + self.takeoffButton.setObjectName("takeoffButton") + self.altdSlider = QtWidgets.QSlider(self.centralwidget) + self.altdSlider.setGeometry(QtCore.QRect(400, 30, 19, 311)) + self.altdSlider.setMaximum(100) + self.altdSlider.setProperty("value", 49) + self.altdSlider.setOrientation(QtCore.Qt.Vertical) + self.altdSlider.setObjectName("altdSlider") + self.stopButton = QtWidgets.QPushButton(self.centralwidget) + self.stopButton.setGeometry(QtCore.QRect(470, 80, 161, 41)) + icon = QtGui.QIcon() + icon.addPixmap(QtGui.QPixmap(":/images/stop.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.stopButton.setIcon(icon) + self.stopButton.setObjectName("stopButton") + self.windowsLabel = QtWidgets.QLabel(self.centralwidget) + self.windowsLabel.setGeometry(QtCore.QRect(540, 190, 71, 21)) + self.windowsLabel.setObjectName("windowsLabel") + self.cameraCheck = QtWidgets.QCheckBox(self.centralwidget) + self.cameraCheck.setGeometry(QtCore.QRect(540, 220, 94, 26)) + self.cameraCheck.setObjectName("cameraCheck") + self.sensorsCheck = QtWidgets.QCheckBox(self.centralwidget) + self.sensorsCheck.setGeometry(QtCore.QRect(540, 250, 94, 26)) + self.sensorsCheck.setObjectName("sensorsCheck") + self.altdLabel = QtWidgets.QLabel(self.centralwidget) + self.altdLabel.setGeometry(QtCore.QRect(390, 340, 51, 21)) + self.altdLabel.setObjectName("altdLabel") + self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget) + self.verticalLayoutWidget.setGeometry(QtCore.QRect(20, 30, 361, 301)) + self.verticalLayoutWidget.setObjectName("verticalLayoutWidget") + self.tlLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget) + self.tlLayout.setObjectName("tlLayout") + self.rotationDial = QtWidgets.QDial(self.centralwidget) + self.rotationDial.setGeometry(QtCore.QRect(440, 220, 50, 64)) + self.rotationDial.setMaximum(100) + self.rotationDial.setProperty("value", 49) + self.rotationDial.setObjectName("rotationDial") + self.rotationLabel = QtWidgets.QLabel(self.centralwidget) + self.rotationLabel.setGeometry(QtCore.QRect(440, 280, 65, 21)) + self.rotationLabel.setObjectName("rotationLabel") + self.XLabel = QtWidgets.QLabel(self.centralwidget) + self.XLabel.setGeometry(QtCore.QRect(20, 340, 21, 21)) + self.XLabel.setObjectName("XLabel") + self.YLabel = QtWidgets.QLabel(self.centralwidget) + self.YLabel.setGeometry(QtCore.QRect(130, 340, 21, 21)) + self.YLabel.setObjectName("YLabel") + self.XValue = QtWidgets.QLabel(self.centralwidget) + self.XValue.setGeometry(QtCore.QRect(40, 340, 41, 21)) + self.XValue.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.XValue.setObjectName("XValue") + self.YValue = QtWidgets.QLabel(self.centralwidget) + self.YValue.setGeometry(QtCore.QRect(150, 340, 41, 21)) + self.YValue.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.YValue.setObjectName("YValue") + self.altdValue = QtWidgets.QLabel(self.centralwidget) + self.altdValue.setGeometry(QtCore.QRect(390, 10, 41, 21)) + self.altdValue.setAlignment(QtCore.Qt.AlignCenter) + self.altdValue.setObjectName("altdValue") + self.rotValue = QtWidgets.QLabel(self.centralwidget) + self.rotValue.setGeometry(QtCore.QRect(445, 200, 41, 21)) + self.rotValue.setAlignment(QtCore.Qt.AlignCenter) + self.rotValue.setObjectName("rotValue") + self.resetButton = QtWidgets.QPushButton(self.centralwidget) + self.resetButton.setGeometry(QtCore.QRect(470, 130, 161, 41)) + self.resetButton.setObjectName("resetButton") + MainWindow.setCentralWidget(self.centralwidget) + + self.retranslateUi(MainWindow) + QtCore.QMetaObject.connectSlotsByName(MainWindow) + + def retranslateUi(self, MainWindow): + _translate = QtCore.QCoreApplication.translate + MainWindow.setWindowTitle(_translate("MainWindow", "Uav Viewer")) + self.takeoffButton.setText(_translate("MainWindow", "Take off")) + self.stopButton.setText(_translate("MainWindow", "Stop")) + self.windowsLabel.setText(_translate("MainWindow", "Windows:")) + self.cameraCheck.setText(_translate("MainWindow", "Camera")) + self.sensorsCheck.setText(_translate("MainWindow", "Sensors")) + self.altdLabel.setText(_translate("MainWindow", "Altitude")) + self.rotationLabel.setText(_translate("MainWindow", "Rotation")) + self.XLabel.setText(_translate("MainWindow", "X:")) + self.YLabel.setText(_translate("MainWindow", "Y:")) + self.XValue.setText(_translate("MainWindow", "0")) + self.YValue.setText(_translate("MainWindow", "0")) + self.altdValue.setText(_translate("MainWindow", "0")) + self.rotValue.setText(_translate("MainWindow", "0")) + self.resetButton.setText(_translate("MainWindow", "Reset")) + +import resources_rc diff --git a/src/tools/uav_viewer_py/gui/ui_gui.ui b/src/tools/uav_viewer_py/gui/ui_gui.ui new file mode 100644 index 000000000..c515e08a9 --- /dev/null +++ b/src/tools/uav_viewer_py/gui/ui_gui.ui @@ -0,0 +1,279 @@ + + + MainWindow + + + + 0 + 0 + 660 + 370 + + + + + 660 + 370 + + + + + 660 + 370 + + + + Introrob_py + + + + + + 470 + 30 + 161 + 41 + + + + Take off + + + + + + 400 + 30 + 19 + 311 + + + + 100 + + + 49 + + + Qt::Vertical + + + + + + 470 + 80 + 161 + 41 + + + + Stop + + + + :/images/stop.png:/images/stop.png + + + + + + 540 + 190 + 71 + 21 + + + + Windows: + + + + + + 540 + 220 + 94 + 26 + + + + Camera + + + + + + 540 + 250 + 94 + 26 + + + + Sensors + + + + + + 390 + 340 + 51 + 21 + + + + Altitude + + + + + + 20 + 30 + 361 + 301 + + + + + + + + 440 + 220 + 50 + 64 + + + + 100 + + + 49 + + + + + + 440 + 280 + 65 + 21 + + + + Rotation + + + + + + 20 + 340 + 21 + 21 + + + + X: + + + + + + 130 + 340 + 21 + 21 + + + + Y: + + + + + + 40 + 340 + 41 + 21 + + + + 0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 150 + 340 + 41 + 21 + + + + 0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + 390 + 10 + 41 + 21 + + + + 0 + + + Qt::AlignCenter + + + + + + 445 + 200 + 41 + 21 + + + + 0 + + + Qt::AlignCenter + + + + + + 470 + 130 + 161 + 41 + + + + Reset + + + + + + + + + diff --git a/src/tools/uav_viewer_py/resources/__init__.py b/src/tools/uav_viewer_py/resources/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/tools/uav_viewer_py/resources/ball.png b/src/tools/uav_viewer_py/resources/ball.png new file mode 100644 index 000000000..7fbb31af9 Binary files /dev/null and b/src/tools/uav_viewer_py/resources/ball.png differ diff --git a/src/tools/uav_viewer_py/resources/play.png b/src/tools/uav_viewer_py/resources/play.png new file mode 100644 index 000000000..6c6ea8483 Binary files /dev/null and b/src/tools/uav_viewer_py/resources/play.png differ diff --git a/src/tools/uav_viewer_py/resources/resources.qrc b/src/tools/uav_viewer_py/resources/resources.qrc new file mode 100644 index 000000000..5f475862c --- /dev/null +++ b/src/tools/uav_viewer_py/resources/resources.qrc @@ -0,0 +1,7 @@ + + + ball.png + play.png + stop.png + + diff --git a/src/tools/uav_viewer_py/resources/stop.png b/src/tools/uav_viewer_py/resources/stop.png new file mode 100644 index 000000000..2ac1754eb Binary files /dev/null and b/src/tools/uav_viewer_py/resources/stop.png differ diff --git a/src/tools/uav_viewer_py/resources_rc.py b/src/tools/uav_viewer_py/resources_rc.py new file mode 100644 index 000000000..f801040de --- /dev/null +++ b/src/tools/uav_viewer_py/resources_rc.py @@ -0,0 +1,798 @@ +# -*- coding: utf-8 -*- + +# Resource object code +# +# Created by: The Resource Compiler for PyQt5 (Qt v5.5.1) +# +# WARNING! All changes made in this file will be lost! + +from PyQt5 import QtCore + +qt_resource_data = b"\ +\x00\x00\x12\xd1\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x01\x20\x05\xc9\x11\ +\x00\x00\x04\xc8\x69\x54\x58\x74\x58\x4d\x4c\x3a\x63\x6f\x6d\x2e\ +\x61\x64\x6f\x62\x65\x2e\x78\x6d\x70\x00\x00\x00\x00\x00\x3c\x3f\ +\x78\x70\x61\x63\x6b\x65\x74\x20\x62\x65\x67\x69\x6e\x3d\x22\xef\ +\xbb\xbf\x22\x20\x69\x64\x3d\x22\x57\x35\x4d\x30\x4d\x70\x43\x65\ +\x68\x69\x48\x7a\x72\x65\x53\x7a\x4e\x54\x63\x7a\x6b\x63\x39\x64\ +\x22\x3f\x3e\x0a\x3c\x78\x3a\x78\x6d\x70\x6d\x65\x74\x61\x20\x78\ +\x6d\x6c\x6e\x73\x3a\x78\x3d\x22\x61\x64\x6f\x62\x65\x3a\x6e\x73\ +\x3a\x6d\x65\x74\x61\x2f\x22\x20\x78\x3a\x78\x6d\x70\x74\x6b\x3d\ +\x22\x41\x64\x6f\x62\x65\x20\x58\x4d\x50\x20\x43\x6f\x72\x65\x20\ +\x34\x2e\x31\x2d\x63\x30\x33\x37\x20\x34\x36\x2e\x32\x38\x32\x36\ +\x39\x36\x2c\x20\x4d\x6f\x6e\x20\x41\x70\x72\x20\x30\x32\x20\x32\ +\x30\x30\x37\x20\x31\x38\x3a\x33\x36\x3a\x35\x36\x20\x20\x20\x20\ +\x20\x20\x20\x20\x22\x3e\x0a\x20\x3c\x72\x64\x66\x3a\x52\x44\x46\ +\x20\x78\x6d\x6c\x6e\x73\x3a\x72\x64\x66\x3d\x22\x68\x74\x74\x70\ +\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\ +\x39\x39\x2f\x30\x32\x2f\x32\x32\x2d\x72\x64\x66\x2d\x73\x79\x6e\ +\x74\x61\x78\x2d\x6e\x73\x23\x22\x3e\x0a\x20\x20\x3c\x72\x64\x66\ +\x3a\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x20\x72\x64\x66\ +\x3a\x61\x62\x6f\x75\x74\x3d\x22\x22\x0a\x20\x20\x20\x20\x78\x6d\ +\x6c\x6e\x73\x3a\x78\x61\x70\x52\x69\x67\x68\x74\x73\x3d\x22\x68\ +\x74\x74\x70\x3a\x2f\x2f\x6e\x73\x2e\x61\x64\x6f\x62\x65\x2e\x63\ +\x6f\x6d\x2f\x78\x61\x70\x2f\x31\x2e\x30\x2f\x72\x69\x67\x68\x74\ +\x73\x2f\x22\x0a\x20\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x61\ +\x70\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x6e\x73\x2e\x61\x64\x6f\ +\x62\x65\x2e\x63\x6f\x6d\x2f\x78\x61\x70\x2f\x31\x2e\x30\x2f\x22\ +\x0a\x20\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x64\x63\x3d\x22\x68\ +\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\x6c\x2e\x6f\x72\x67\x2f\x64\ +\x63\x2f\x65\x6c\x65\x6d\x65\x6e\x74\x73\x2f\x31\x2e\x31\x2f\x22\ +\x0a\x20\x20\x20\x78\x61\x70\x52\x69\x67\x68\x74\x73\x3a\x57\x65\ +\x62\x53\x74\x61\x74\x65\x6d\x65\x6e\x74\x3d\x22\x68\x74\x74\x70\ +\x3a\x2f\x2f\x62\x6c\x6f\x67\x2e\x61\x64\x64\x69\x63\x74\x65\x64\ +\x74\x6f\x63\x6f\x66\x66\x65\x65\x2e\x64\x65\x22\x0a\x20\x20\x20\ +\x78\x61\x70\x3a\x4d\x65\x74\x61\x64\x61\x74\x61\x44\x61\x74\x65\ +\x3d\x22\x32\x30\x30\x39\x2d\x30\x31\x2d\x32\x32\x54\x31\x30\x3a\ +\x30\x36\x3a\x31\x34\x2b\x30\x31\x3a\x30\x30\x22\x3e\x0a\x20\x20\ +\x20\x3c\x64\x63\x3a\x63\x72\x65\x61\x74\x6f\x72\x3e\x0a\x20\x20\ +\x20\x20\x3c\x72\x64\x66\x3a\x53\x65\x71\x3e\x0a\x20\x20\x20\x20\ +\x20\x3c\x72\x64\x66\x3a\x6c\x69\x3e\x4f\x6c\x69\x76\x65\x72\x20\ +\x54\x77\x61\x72\x64\x6f\x77\x73\x6b\x69\x3c\x2f\x72\x64\x66\x3a\ +\x6c\x69\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x72\x64\x66\x3a\x53\x65\ +\x71\x3e\x0a\x20\x20\x20\x3c\x2f\x64\x63\x3a\x63\x72\x65\x61\x74\ +\x6f\x72\x3e\x0a\x20\x20\x20\x3c\x64\x63\x3a\x64\x65\x73\x63\x72\ +\x69\x70\x74\x69\x6f\x6e\x3e\x0a\x20\x20\x20\x20\x3c\x72\x64\x66\ +\x3a\x41\x6c\x74\x3e\x0a\x20\x20\x20\x20\x20\x3c\x72\x64\x66\x3a\ +\x6c\x69\x20\x78\x6d\x6c\x3a\x6c\x61\x6e\x67\x3d\x22\x78\x2d\x64\ +\x65\x66\x61\x75\x6c\x74\x22\x3e\xef\xa3\xbf\x20\x4d\x61\x64\x65\ +\x20\x6f\x6e\x20\x61\x20\x4d\x61\x63\x21\x26\x23\x78\x41\x3b\x26\ +\x23\x78\x41\x3b\x65\x78\x63\x6c\x75\x73\x69\x76\x65\x20\x66\x6f\ +\x72\x20\x53\x6d\x61\x73\x68\x69\x6e\x67\x20\x4d\x61\x67\x61\x7a\ +\x69\x6e\x65\x3c\x2f\x72\x64\x66\x3a\x6c\x69\x3e\x0a\x20\x20\x20\ +\x20\x3c\x2f\x72\x64\x66\x3a\x41\x6c\x74\x3e\x0a\x20\x20\x20\x3c\ +\x2f\x64\x63\x3a\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\ +\x0a\x20\x20\x20\x3c\x64\x63\x3a\x73\x75\x62\x6a\x65\x63\x74\x3e\ +\x0a\x20\x20\x20\x20\x3c\x72\x64\x66\x3a\x42\x61\x67\x3e\x0a\x20\ +\x20\x20\x20\x20\x3c\x72\x64\x66\x3a\x6c\x69\x3e\x69\x63\x6f\x6e\ +\x73\x3c\x2f\x72\x64\x66\x3a\x6c\x69\x3e\x0a\x20\x20\x20\x20\x20\ +\x3c\x72\x64\x66\x3a\x6c\x69\x3e\x66\x6c\x61\x76\x6f\x75\x72\x3c\ +\x2f\x72\x64\x66\x3a\x6c\x69\x3e\x0a\x20\x20\x20\x20\x20\x3c\x72\ +\x64\x66\x3a\x6c\x69\x3e\x73\x6d\x61\x73\x68\x69\x6e\x67\x20\x6d\ +\x61\x67\x61\x7a\x69\x6e\x65\x3c\x2f\x72\x64\x66\x3a\x6c\x69\x3e\ +\x0a\x20\x20\x20\x20\x20\x3c\x72\x64\x66\x3a\x6c\x69\x3e\x61\x64\ +\x64\x69\x63\x74\x65\x64\x20\x74\x6f\x20\x63\x6f\x66\x66\x65\x65\ +\x3c\x2f\x72\x64\x66\x3a\x6c\x69\x3e\x0a\x20\x20\x20\x20\x3c\x2f\ +\x72\x64\x66\x3a\x42\x61\x67\x3e\x0a\x20\x20\x20\x3c\x2f\x64\x63\ +\x3a\x73\x75\x62\x6a\x65\x63\x74\x3e\x0a\x20\x20\x20\x3c\x64\x63\ +\x3a\x72\x69\x67\x68\x74\x73\x3e\x0a\x20\x20\x20\x20\x3c\x72\x64\ +\x66\x3a\x41\x6c\x74\x3e\x0a\x20\x20\x20\x20\x20\x3c\x72\x64\x66\ +\x3a\x6c\x69\x20\x78\x6d\x6c\x3a\x6c\x61\x6e\x67\x3d\x22\x78\x2d\ +\x64\x65\x66\x61\x75\x6c\x74\x22\x3e\xc2\xa9\x20\x32\x30\x30\x39\ +\x20\x62\x79\x20\x4f\x6c\x69\x76\x65\x72\x20\x54\x77\x61\x72\x64\ +\x6f\x77\x73\x6b\x69\x20\x3c\x2f\x72\x64\x66\x3a\x6c\x69\x3e\x0a\ +\x20\x20\x20\x20\x3c\x2f\x72\x64\x66\x3a\x41\x6c\x74\x3e\x0a\x20\ +\x20\x20\x3c\x2f\x64\x63\x3a\x72\x69\x67\x68\x74\x73\x3e\x0a\x20\ +\x20\x3c\x2f\x72\x64\x66\x3a\x44\x65\x73\x63\x72\x69\x70\x74\x69\ +\x6f\x6e\x3e\x0a\x20\x3c\x2f\x72\x64\x66\x3a\x52\x44\x46\x3e\x0a\ +\x3c\x2f\x78\x3a\x78\x6d\x70\x6d\x65\x74\x61\x3e\x0a\x3c\x3f\x78\ +\x70\x61\x63\x6b\x65\x74\x20\x65\x6e\x64\x3d\x22\x72\x22\x3f\x3e\ +\xee\x04\x51\xd2\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\ +\x77\x61\x72\x65\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\ +\x52\x65\x61\x64\x79\x71\xc9\x65\x3c\x00\x00\x0d\x9f\x49\x44\x41\ +\x54\x78\xda\x62\xfc\xff\xff\x3f\x03\x36\xc0\x02\x63\xdc\xf5\x72\ +\xff\xcf\xc4\xc2\xc2\xf0\xef\xcf\x1f\x06\xe5\x6d\x3b\x19\x19\x41\ +\x3a\x40\x82\xec\x82\x02\x0c\xcc\x1c\x1c\x0c\x7f\x7f\xfc\x60\xf8\ +\xf9\xfe\x03\x03\x13\x48\xf5\xaf\xd7\xaf\x19\xbe\xbc\x7f\xc7\x10\ +\x7e\xec\x24\xc3\x5f\x20\x0d\xe2\x83\x25\x40\xda\x59\xbf\xff\x60\ +\x58\xac\x28\xcb\xf0\x07\x48\x83\xf8\x8c\x30\xcb\xaf\x1a\xea\xc1\ +\xed\xd0\x3e\x7f\x89\x11\x20\x80\x18\xf1\xba\xea\xb6\x9b\xd3\x7f\ +\x66\x76\x0e\xb0\xc0\xee\xaf\x3f\x3f\xa5\xef\xdb\xcb\xcf\x14\x96\ +\x98\x39\x9f\x8d\x97\x87\x81\x43\x44\x18\x8c\x3d\x04\xb9\xf9\x40\ +\x0a\x18\x4f\x68\x6b\xfc\x11\x16\x16\x62\x4e\x7a\xfe\x0a\xac\x63\ +\x9e\xa4\x18\x83\xee\x95\x07\x07\x19\x39\x84\xa4\x94\x2e\xa8\x49\ +\xdd\x65\xe7\x03\x2b\x64\xf8\xf9\xe9\x13\x83\xfa\xf1\xd3\x8c\x4c\ +\xdf\xdf\x3e\xbd\x37\xf9\xf9\xdb\xc7\xdf\xde\xbe\x63\x00\x61\x83\ +\x5b\xcf\xe6\x83\x14\x00\x04\x10\x86\xab\x40\x76\x06\x3f\xbc\x19\ +\x6a\xc4\xc2\xc0\xbd\xf5\x17\xe3\x87\x97\x0e\x4e\x6e\xed\x0d\xd5\ +\xa7\x61\xf2\x70\x0d\x60\x17\xb3\xb1\x33\x30\xb3\xb3\x32\x30\xb2\ +\x00\x31\x13\x13\xc3\xff\x7f\xff\x18\xfe\xff\xf9\xcd\xf0\xf7\xe7\ +\x6f\x86\xd5\x5f\x7e\xbd\x2f\x3f\xb0\x57\x08\xac\x61\xb5\xa3\xf3\ +\x57\x63\x1e\x76\x2e\x16\x2e\x4e\x86\xbf\x5c\x5c\x0c\x15\xb7\xee\ +\x32\x30\x32\x03\x35\xfc\xfd\xc7\xd0\xaf\xa6\xcc\xf0\xe7\xdb\x37\ +\x20\xfe\xce\x90\xc3\x25\xb6\x09\x1c\x1e\x27\x1e\x3c\x78\xaf\x2d\ +\xcc\xc7\xc5\xca\xc9\xc1\xf0\x07\xa8\xe1\xd9\xcb\x97\x70\x1b\x7e\ +\xf1\x70\x32\xfc\x06\x6a\xf8\x0d\x0c\xf2\xfd\xf7\x2f\xae\x87\x3b\ +\xa9\x56\x49\xe5\x59\xa4\x20\x8f\x24\x33\x1b\x2b\x03\x28\xe8\x61\ +\x1a\x40\x51\xf0\xf7\xd7\x6f\x06\xe3\x07\xaf\xe7\x03\x03\x22\x89\ +\x01\xa4\x01\x86\x81\x00\x14\xec\x7a\x6c\xfc\xa2\x4b\xd9\x05\x25\ +\x6e\xb3\xf1\x0a\x75\x03\xf9\x6a\xc8\x6a\x00\x02\xd0\x4d\xfe\x2e\ +\x0d\x03\x51\x1c\x7f\xc9\xe5\x87\x41\xd4\x4a\x45\x05\x15\x51\x47\ +\x3b\x09\x2d\x82\x48\x29\x1d\x5c\xfc\x03\x9c\x5c\x6a\x27\x27\x9d\ +\x9d\xdc\x1c\xdc\x05\x37\xc7\xee\x6e\x12\x8b\x6b\x0a\x0e\xc5\xa9\ +\x6e\x22\xed\x24\x45\xa8\x92\xdc\x2f\xdf\xdd\x95\xa3\x06\x1a\x38\ +\x92\x7b\x3f\xf2\xde\xbd\xcf\xf7\xa6\xb2\x9b\xf6\x78\x79\x43\xf3\ +\xb0\xde\x3f\x0b\xe5\xd2\x2f\xaa\xe6\x82\x45\xef\xaf\xed\xc7\xdd\ +\x49\xbf\xad\xb0\x57\x3b\xee\xb6\xc2\xb4\xe4\x10\x02\xae\xab\x65\ +\x06\x42\x8d\x95\x73\xb8\xaf\x54\x6b\x37\xd7\x57\x6d\x5b\xe1\xa4\ +\x71\x7e\xd7\x9a\xc9\x4a\x24\x08\xc0\x45\x16\x2e\x26\xe9\x04\x0c\ +\x16\x59\x0a\xcd\xe4\xe5\x59\xfd\xdc\x56\xe8\x1d\xd5\xa5\xa7\xa0\ +\x21\x07\x12\x62\x02\x82\x33\x4a\x56\xd0\x52\xe0\xc8\x20\x1e\x65\ +\xdf\x8d\xf8\x69\x41\x57\x70\x5c\x02\x8e\xef\x81\xeb\xfb\x70\xd9\ +\x53\xd0\xcc\xd1\x24\x67\x70\xbb\xb3\x05\xc2\xa7\x50\x0d\xd9\xbc\ +\x6d\x29\x1d\x0c\x80\x23\x34\xa9\xa0\xe1\x45\x71\xc6\x15\x94\x2c\ +\xe8\x6c\x04\x99\x22\x8d\xe0\x6c\x82\x9e\xb1\x90\x1a\x14\xe0\x1b\ +\xb0\x77\xd3\x93\xb1\x69\xdf\x78\x38\x3a\x81\x0b\x21\x09\x63\x0e\ +\xa7\x14\x1e\xb6\x37\x75\x6b\x3a\x1e\xf7\x0c\xcf\x20\x91\x76\xf9\ +\xe3\x2b\xc1\x51\x9b\x6b\xba\xff\x39\x0c\x39\x1a\x95\x53\x69\x86\ +\x8e\x7e\xcc\xc2\x6f\x65\x53\x3e\x94\x45\xe5\x1f\x87\xa8\xb8\xb6\ +\x9a\xac\x2f\xf6\xf3\x1c\x86\x94\xd1\x83\xee\x5b\x60\xc9\xe5\xb4\ +\xb4\xe1\x45\x73\xa7\x61\x61\xa5\x13\x14\x96\x63\xdc\x97\x71\x15\ +\x27\x63\xfe\x04\xa0\xad\x6a\x42\x21\x08\xc3\xf0\xcc\xce\x36\xab\ +\x6d\x57\x14\x91\xa3\x28\x07\x07\x07\x6d\x8a\xa2\xdd\x83\x9f\x08\ +\x57\x29\xb9\x70\x91\xe4\xa0\xad\x55\x28\xe5\xe2\xe0\xe8\xe0\xe2\ +\x28\xe5\x82\xb8\x39\xe1\xe8\xa4\x36\x1c\x14\xed\x16\x89\x35\xbb\ +\x96\x9d\xf9\x66\x3d\xef\xfb\xed\x2c\xfb\x43\x39\xd8\x7a\xf7\xdd\ +\x6f\x67\xbe\xe7\x99\xef\x7d\x9f\xe7\x9d\x3f\x6b\xe9\xaf\x1f\xf7\ +\x4f\x17\xc6\xa7\x66\x37\x02\x57\x97\x13\xfd\x1e\xa5\x4a\x55\x71\ +\x24\x55\x65\x71\x50\x92\xcf\x94\xe5\x1f\x36\x4a\x3e\x9a\xd4\x6e\ +\xc6\x86\xfb\xda\x22\x0b\xf3\x6f\xc5\x38\x25\x27\x20\xcd\xee\xe8\ +\xe9\x56\x16\x0b\x6a\x45\xf5\x52\xdd\x44\x80\x4c\xe8\xaa\x83\x4d\ +\x5f\x34\x22\x6c\xa9\x69\xc4\xe9\xbb\x65\x44\xbb\x83\x81\xb5\xe5\ +\xc5\x68\x59\x82\xad\x60\x28\xd1\xa3\xbb\x2a\xb9\x11\x6e\x4d\x1a\ +\x9b\x42\x93\x64\x0a\x91\x49\x7c\xea\x90\xd4\x0c\x34\x44\x32\xb0\ +\x39\x04\xaf\x67\xfc\x0d\x07\xc7\xbb\xdb\x43\x05\x04\x93\x9d\xa1\ +\x78\xc4\xef\xaa\x27\x30\x4d\x27\x60\x18\x09\x72\x37\x41\x10\x8e\ +\x5e\xf3\x8c\x52\xb8\x54\x39\x06\x7a\x7a\x9a\x59\x2d\xcd\x12\xdc\ +\xb4\x40\x94\xc1\x74\xb1\x98\x64\xb3\xbd\x6b\x70\x7d\x75\xe9\xd0\ +\xe5\x3c\xfd\xb4\x30\x6a\xac\x54\x4a\xb1\x21\x7b\x91\x4a\x73\xb6\ +\xd3\xc8\x78\xc1\x24\x39\x3e\x94\xe4\x07\x45\x46\x66\x5a\xe3\xff\ +\x2c\x82\xef\xfb\xb6\x8f\x70\xf6\xf6\x8f\x22\x05\x4d\x7e\x4c\xbc\ +\x66\x7c\x1e\xdd\x9d\xa5\xd2\xc0\x09\x1a\x22\x8b\xf9\x67\x21\x1b\ +\xd8\xe0\x94\x28\xdf\xe5\x5c\x89\x84\x61\x28\xe4\x20\x1b\x73\x91\ +\x33\x42\xa0\x54\xf1\xfb\xa7\x5b\xc5\x71\x0e\xbf\x10\x1e\x8c\x33\ +\x3a\xb6\x6c\x98\x90\xb3\x85\x8f\x6e\xca\x3a\xe7\x6a\x4d\x06\xe7\ +\x9c\xfb\x8f\xae\xf3\x7d\xb4\xa6\x7d\xd8\x9f\x10\xc2\x24\x21\x96\ +\x34\x19\x6e\x3b\x87\xdb\x3a\xf2\x4d\xc6\x98\xa1\x9c\x77\x5f\x51\ +\x93\x9d\x89\x48\xcd\xb5\x85\x6c\x72\xd2\xb4\xac\x9e\xd8\x4b\x23\ +\xac\x7c\x57\x56\xa6\x20\x69\x5a\xa9\xf6\x9e\x0d\xf8\x2a\x6a\xf3\ +\x32\xd5\x7e\x91\xa9\xf8\x92\x29\x06\xca\x09\x80\x83\xbf\xfa\xa0\ +\x88\x2c\x1c\xa9\xf2\xce\x8d\xf8\x3c\x75\xe5\x8c\xf6\x2a\x6c\x2b\ +\x14\x7b\xb9\xc0\xa2\x17\xc0\xcf\xe5\x30\xfe\x7d\x54\x7c\x0a\x40\ +\x7c\xb5\x85\x44\x15\x84\xe1\x39\x97\x3d\x95\xe6\xda\x16\x3d\x58\ +\xf6\x12\x62\x17\x8a\x88\xb0\x20\xc2\x32\x08\xa4\xde\xba\x18\x41\ +\x20\xbd\xd4\x53\x2f\x11\x84\x10\x62\xa0\x20\x3d\x44\x10\x54\x04\ +\x5d\xe8\x46\xf8\x52\x52\xc4\x1a\xe5\x16\x84\x94\x41\xf8\x50\xb1\ +\x5a\x64\xa0\x68\x65\xa4\xdb\x6e\x7a\xf6\x5c\xe6\xf4\xff\x73\x39\ +\xbb\xb3\x9a\xe9\x83\xb4\x30\x7b\xfe\x73\x66\xe6\xff\x0f\x33\xdf\ +\x7c\xdf\x77\xe6\xbc\x80\x4e\xe6\xf8\x67\x4e\xd7\xd9\xd0\xd4\x52\ +\x15\x7f\xde\x75\xa3\x3e\xb0\x97\x6d\x88\x04\x45\xe5\x3a\xb1\x7e\ +\x52\xe2\x7d\xa1\x24\xfb\xd4\xd5\xd2\xa9\x8a\xca\x78\xdb\xf5\x4b\ +\x47\x66\xbd\x44\x2d\x67\xcf\x15\xdd\x6d\x8f\xf7\xdc\x2f\xf6\x2a\ +\x34\xf6\x33\x18\x7a\x18\x8a\x88\x44\x10\x5e\x7d\x12\xcf\x92\xb1\ +\x57\x95\x6b\x6f\xdf\xb9\x72\xe1\xf8\x8c\x0a\x9c\x6a\x6c\xde\xb1\ +\xf2\x65\xa2\x7d\x67\x84\x44\x25\xa3\x72\x78\x72\x04\xf1\x02\xfc\ +\x8f\x8b\x27\x3f\x98\x07\x9d\x05\xef\xde\x26\x1e\xad\x9f\xb6\x40\ +\x43\x53\xf3\xea\x55\x2f\x3a\xbb\xb7\x59\x46\x09\x62\x9f\x25\x17\ +\xe7\x80\x51\x85\x26\x65\x8d\x08\x26\x15\x8c\x2a\xe2\x3a\x67\xde\ +\xa4\x22\xca\x26\x2f\x4a\x24\xba\xc2\xe4\x78\x7a\xd1\x3c\x58\x68\ +\x20\x2c\x30\x12\x11\x76\x55\x62\xd6\x27\xe8\x1c\xe6\xb4\x59\xd9\ +\x75\x68\x6b\xa6\x2c\x50\x7b\xa0\xfe\xe1\xde\xf9\x24\x16\x26\x47\ +\x8a\x30\x91\x2a\x38\x6d\xeb\x2c\x69\x7e\xe3\x7d\x7c\x8c\x11\x16\ +\xd9\xd5\xdf\x7b\x68\xca\x02\xfb\x7f\x0c\x56\xa3\x34\x86\xcb\xc2\ +\x26\x9a\xcc\x02\x69\x82\x5d\x65\x72\x8c\x35\xd6\xcc\x9c\x28\x89\ +\x79\xdb\x2d\x2d\x8a\x4e\x5a\x81\xe9\xc9\xd3\x67\xf6\x1c\x63\x9b\ +\xca\x37\x94\xbd\x91\xce\xdf\xea\x44\xb2\x8f\xc5\xc4\x30\x94\x3d\ +\x40\x37\xd4\xba\xa6\x92\x44\xd0\x39\x80\x13\xd2\x4d\xce\x49\x98\ +\x63\xe1\xa7\xbe\x5a\xa5\xc0\x87\x8f\xfd\x47\xd9\x64\x84\x89\x64\ +\x4d\xb1\x54\x44\x26\x67\x6f\x28\x60\x4a\x39\x30\xd8\xb2\xb0\x02\ +\xb8\xd1\x42\x2f\x20\xde\x6d\x91\xa8\x52\x20\x99\x4c\x2e\xf5\x8b\ +\xa1\x2f\x62\x70\xa1\x71\xa0\xa1\xfd\x82\x96\x01\x85\x22\x0c\x45\ +\x58\x44\xcb\xf3\x70\x40\xd1\xa8\x80\x6e\x4e\x68\x64\x5c\xee\xf8\ +\x96\x52\x60\x78\x70\xc0\xf1\xca\x63\x6c\x3d\x03\x68\x52\xcd\x88\ +\x50\x33\x12\x8a\xbe\xa6\x98\x44\x2f\x9d\x21\xba\xe7\xaa\x8a\x06\ +\xe2\xa3\xbb\xae\x56\x48\x15\x43\x21\xc7\x43\x10\x08\xcf\x43\xe4\ +\x19\x91\x71\x40\xd4\xfb\xbc\x71\x01\x11\x73\x21\xfe\xee\xd1\x6c\ +\x21\x8a\x9e\x04\x62\xb6\x72\x4a\xa5\x45\x94\x57\xca\x9b\x7c\x46\ +\x51\x70\x94\x31\x3c\x59\x62\xc2\x19\x2d\x2c\x70\x33\xed\x07\x5e\ +\x4e\xcc\x03\x7e\x4a\xd1\x37\x33\x0f\x4d\xc5\x73\xae\xbb\xe1\xbd\ +\xf0\x41\xfc\x44\xf3\xb9\x98\xe3\xe2\x2f\xfb\xfd\x24\xaa\x00\xf5\ +\xea\x06\x3d\xae\xd2\x85\xd1\x32\x04\xc6\xe5\xbd\x5e\xb0\x07\x39\ +\x3d\xe6\xa6\xcb\x77\xb9\x11\xf0\x3c\x2f\xd8\x32\x38\x5a\x81\x9f\ +\x9f\x85\x74\xbd\x2f\x43\xe9\xe7\x12\x4a\x4d\x84\x2b\x0a\xb8\xc4\ +\x3c\x83\xa1\x24\xbd\xf0\x0b\x41\xe8\xb1\x10\x7b\xc9\x49\x90\xfc\ +\xb5\x4c\xae\x9c\x64\x74\x01\x35\x43\xa9\x5b\x72\x69\xa8\x70\x0b\ +\xbe\xe7\x32\xd7\xe6\x0b\x08\xfa\x21\x2c\x3d\xde\xe7\xf1\xb1\x38\ +\xe7\x5e\x6a\x62\x18\x52\x55\x4f\x4b\xd7\xb0\x54\x9d\x6f\x96\xc7\ +\x6a\x14\x36\xd5\xff\xc2\xa6\x79\xed\x71\xda\x1e\x69\x1c\xfd\xbd\ +\x15\x5e\xf4\xd3\x3f\x05\x07\x8a\x5c\xeb\x28\x2b\x3d\xbc\xd8\x34\ +\x22\x33\xd1\x83\xcb\x63\xe3\x03\x57\xd3\xf6\x66\x48\xfe\x75\xc6\ +\xa2\x0f\x45\x62\x70\xe9\x78\x56\x56\xba\x31\x6a\x80\x03\x9b\x42\ +\xd1\x1e\x64\xec\x6f\x2d\x63\xe3\xe7\x21\x71\xeb\xac\x5d\x05\x24\ +\x5b\x82\x9f\x43\xd0\x4a\xe1\x33\xbb\x8e\x18\xe6\x26\x60\xdb\x15\ +\x90\x3d\x15\x04\xb4\x97\x3a\x76\x87\x37\x91\xee\x81\x7e\xc4\xfc\ +\x08\xe4\xb1\xff\x8b\x6d\xf9\x23\x40\xb7\xd6\x1a\x1b\x45\x11\xc7\ +\xe7\x71\xd7\xbb\x6b\xbb\x57\xda\x42\xb5\x68\x63\x23\x31\x7c\x80\ +\xd8\x68\x50\x1b\x84\x44\x94\x48\xa8\x21\x84\x44\x4c\xfd\x00\xbe\ +\x3e\xf8\xfa\x60\x42\x02\x34\x94\x68\x31\x80\x05\xa3\x89\x1f\x54\ +\x62\x34\xf1\x89\x8d\x69\x02\x86\x40\x03\x51\x31\x01\x0d\x12\x40\ +\x4b\xa8\xda\x40\x4b\x51\x22\x5a\xa5\xf6\xee\xf6\xda\x7b\xec\xce\ +\x38\x33\x3b\x3b\x3b\xbb\x77\x57\x69\x2b\x90\xd8\x74\x6e\x6f\x6f\ +\xef\xf6\xfe\xbf\x99\xff\xeb\xf7\x9b\xbb\xea\x5f\x70\x5d\xdb\xa2\ +\xc9\xfc\xad\xdb\xd4\xb1\x72\xf8\xaf\x91\x25\x7f\x27\x53\x0d\xa3\ +\x89\x54\x7d\x2e\x9f\x8b\x26\x53\x66\x0d\xbf\x16\x37\x2a\x47\xca\ +\xc2\x65\x99\x19\x55\xc6\xa5\xea\xb8\xf1\x6b\xdd\xcc\x9a\xc3\xaf\ +\x6f\xef\xf8\xfc\xba\xad\xc0\x8b\x5b\x3b\x1b\xcf\xf4\x0f\x6e\xeb\ +\x3b\x3b\xb0\x70\x7d\x0c\xd4\xdc\x89\x69\x85\x81\x58\x6f\x06\xb5\ +\x1b\x03\x2d\x2c\xdd\xd0\x04\x44\x9d\x9a\x2c\x45\x9c\x24\x20\xfd\ +\xea\x18\x18\x99\x77\xdb\x9c\x6f\xe7\xcf\xbd\xb5\xfd\xe5\xcd\x6d\ +\x43\x57\x0d\xc0\xa6\x8e\x6d\xf3\x8f\x9e\xe8\x7d\xfb\xa1\xd4\xe5\ +\x79\x4b\xc3\x34\x1e\xc7\x10\x3b\xc1\x82\x64\x88\x43\x37\x7a\xf4\ +\x40\xf2\xe9\x0f\xda\x89\x16\xad\x3c\x1d\x10\x60\x52\x60\x1f\xca\ +\x81\xe4\xfe\xca\xda\xbe\x45\x0b\x9a\x9e\xdd\xde\xd1\x7e\xe6\x3f\ +\x01\xc0\xfb\xd4\x9e\xaf\x8f\xee\x5a\x87\x73\xb3\xef\x0d\x43\x43\ +\x19\x8c\xa0\x67\xb8\xf8\x77\xce\x5d\x00\x10\x01\x10\x5c\x02\x4a\ +\xfc\xe5\xd6\x29\xcb\x1a\x10\xe2\x1c\xbf\xc9\xd9\xa9\xd7\xec\xb2\ +\xdf\x96\xdf\xb7\xe8\x19\x57\x09\x9b\x34\x00\xde\xbd\x1f\x3a\x72\ +\xac\xa7\x35\x75\xb9\x69\x69\x19\xa8\x12\x86\x23\xc7\x60\x88\xb4\ +\x59\xe7\x47\xac\x71\x43\x61\xb9\x0b\xca\x05\x21\x8b\xbd\xd2\x4f\ +\x88\x32\x9c\x97\x1e\xa0\x97\x74\x42\x54\xe9\xff\x22\x4f\x12\x9f\ +\x56\xd4\xf6\x3e\xb8\xb8\x79\x79\x31\x8d\xa5\x24\x00\xce\x69\xf6\ +\x1c\xfc\xaa\xeb\x33\x83\x36\xc6\x98\xe5\x9c\x7a\xf0\x19\x57\x86\ +\xcb\xe7\x4a\x1a\x11\xc6\x23\xff\xaa\x04\xdc\xa9\xc0\x6d\x88\x24\ +\xc0\x9a\x5e\xe0\x4a\x71\x0a\x08\x7b\x3e\xc6\x10\x3e\x92\x04\x43\ +\xab\x96\xdd\xdf\xaa\x6b\xc4\x25\x01\xb4\xbd\xb4\x75\xf1\x9e\x83\ +\x87\x3f\xdc\x17\xa7\xb7\x08\xda\xa4\xd1\x1b\x1f\x0b\x29\xa8\xa3\ +\x50\x03\x03\xa5\xa0\xe9\xad\x00\x70\x1b\x36\xd5\x5c\x11\xcd\x50\ +\x22\xb5\x45\xe2\x67\x34\xf2\x3a\x21\x36\x5d\x91\x00\x17\x56\x2d\ +\x5b\xb2\xb6\x73\xcb\xe6\x23\x25\x01\x30\xb7\x09\x75\x1f\xf8\xb2\ +\xf7\xbd\xd0\xf8\x5c\x83\x05\xa9\x32\x5e\xb8\x0e\xe7\x0a\xee\x4a\ +\xb8\x6d\x3d\x02\x19\xf6\xf9\x8d\xc7\x8e\x03\xcd\xf1\x81\x93\x80\ +\x60\xc1\xca\x0a\x47\x52\x71\x40\xc0\xce\x85\xcd\x20\xc2\x01\x2b\ +\xa3\x6d\x39\xa8\xd3\xcc\x51\xa2\x84\xd3\x94\x6d\xdb\x4f\xe6\xa2\ +\xfd\x0f\xb7\x3c\xd0\xc4\xdc\xc9\x2a\x5a\x07\x7e\x1e\xfc\x65\xe7\ +\x5a\x90\x99\x2d\x8c\xe7\x6e\x23\xdd\x41\x18\x8f\x25\x10\x14\xf2\ +\x56\x41\x36\x7a\x78\xe6\x2c\x67\xe6\x11\x94\x62\x58\x69\x17\x02\ +\x52\x3b\xe1\x3e\xce\x55\x69\xd1\xcb\x15\xac\x98\x25\x98\x02\xe0\ +\x2d\x1f\x24\xe2\x3e\x06\xc2\x78\x0d\xc8\xd4\x7f\x3f\x78\xe1\x15\ +\xf6\xea\xfa\xa2\x00\x7e\xea\x3f\x7b\xd7\x13\x24\x17\xa3\xbc\xa9\ +\x47\x44\xb8\x04\x95\x2e\x82\x28\x76\x7c\x00\xe5\xd9\x51\xf2\x1c\ +\x6e\x0c\x3b\xe6\x59\xd3\x28\xf8\x0f\xe5\x00\xa8\xe2\x3f\x22\x2e\ +\x54\xec\x12\xb1\x2a\x44\xba\x8e\x70\x1f\x67\x3f\xc7\x69\x9b\x5d\ +\x59\x51\xb5\xd0\x44\x4a\x5b\x9e\x6b\xdd\x41\xad\xf2\xdd\xfd\xe7\ +\x9a\x4b\x56\xe2\xf3\x03\xe7\xb0\x51\x1b\x09\x59\x18\x6b\xfe\x0d\ +\x85\x71\xc8\xed\x1f\xb1\x27\x7b\xf1\x95\xe0\xef\x4d\x98\x69\x35\ +\xfb\x6e\x0c\xa8\xd9\x84\x7a\xf6\xd1\x62\x80\x01\xb2\x92\x29\x80\ +\xa9\x67\x34\xd1\x41\xf8\xdc\xca\x71\x23\xc3\xb6\x43\xe7\xff\x1c\ +\xc6\x25\x01\x8c\xa5\xcd\xd1\x71\x03\x91\x58\x88\x60\x1d\x00\x44\ +\xfc\xe6\x8e\xa4\xa6\x08\x87\x78\x8e\xc4\x97\xe6\x59\x87\x3d\x15\ +\x00\x94\x8b\x8c\xd4\x3f\xeb\x4a\x60\x2c\x02\x60\xcc\xb2\x09\xb7\ +\x71\x22\x0d\xea\x87\xbe\x9c\x6d\x52\x1f\x2d\xd3\x15\x1b\xe0\xa3\ +\x69\xc2\xad\x89\xc6\x09\xb5\x7c\xae\x5e\x0f\x1c\xa9\xc6\x21\xa9\ +\x8c\x85\xa2\xf7\x75\xeb\x04\xf5\x76\x11\x7e\xcc\xe6\x4d\x6e\xe3\ +\x44\x00\xba\xba\xd2\xd9\x3f\x94\x40\x40\x35\x62\x2a\xd2\x1a\xd1\ +\xb6\x4e\xa4\x9f\x12\x2f\x97\x03\x3d\x15\x96\x18\xc1\xf7\x91\x82\ +\xeb\x54\x66\x1f\xe2\xfb\x7e\x6e\xcf\xc7\xa6\xb0\xed\x93\x92\x2e\ +\xc4\x98\xc3\x69\xc6\x34\xde\xdd\x97\xce\x6e\x58\x51\x11\xa9\x63\ +\x7e\xa2\x65\x0d\x27\xab\x10\x96\x1a\x10\xf0\x58\x78\x8c\xb9\xd2\ +\xde\xd6\xd5\x22\x98\x39\x05\x05\xbe\x02\x87\xb4\x24\xe4\x19\x0d\ +\xe4\xc6\x9f\x79\xea\x94\x0a\x54\xd7\x5d\x08\xf1\x52\x27\xd5\x88\ +\x37\x67\x37\x27\xb3\xd6\x3b\xcc\xc6\xbe\x2b\xe1\x64\x3b\xda\x67\ +\xc4\x1e\x5b\x59\x11\xb9\x41\xc5\x02\x84\x01\x12\x18\x38\x9f\x42\ +\x21\xa3\x81\x42\x46\x03\xab\xeb\x5e\xdf\x9b\x12\xd4\xec\x03\x66\ +\xfc\xc6\xc9\x70\xbe\xe7\x9e\x32\x22\x6d\x4f\xc7\x63\x0d\x10\xa2\ +\xc2\x56\x02\x6a\x40\xa6\xd9\x4a\xf8\x66\x3c\xd0\x4a\xec\x4a\x08\ +\xc2\xda\xc9\x8c\x7f\x6b\xd2\xdd\x28\x03\x51\xc7\x0e\xef\x6f\xa9\ +\x2e\x5f\xd0\x52\x1e\x99\x55\xb2\x99\x43\x5e\x33\x07\xa5\x26\x3f\ +\x51\x33\xe7\x25\x05\xaa\x7c\x3d\xd8\xcc\xf5\x98\x59\x4e\xe3\x4f\ +\xb0\x0f\x3c\xce\x8c\x1f\x9e\x16\x1f\xe0\x3b\x14\xec\xf0\xe6\x86\ +\xaa\xd8\xed\xab\x2b\xa3\x37\x5e\x51\x3b\x0d\x8b\xb4\xd3\xf4\xdf\ +\xdb\xe9\x6e\x33\xf3\xfb\x8e\xd1\xb1\xd3\xec\x5d\xcf\x07\x35\x88\ +\x69\x33\x32\x06\x84\x6f\xca\xae\xe1\xb3\xf2\x42\x55\x6c\xce\xa3\ +\x95\x91\x7a\xec\xf4\x1a\x53\x26\x34\x84\x3d\xec\x4e\x65\x2e\xbd\ +\x91\x18\x1f\x60\x2f\x7d\xc4\x57\x9c\x19\x9e\xbf\x26\xa4\x9e\x01\ +\x6a\xe0\xfa\x30\x1b\x2d\x77\x47\x42\x37\xdf\x13\x0d\xc7\x1b\x43\ +\x28\x7a\x13\x46\xd1\x6a\x8c\xc3\x35\x18\x8a\x5d\xe8\x11\x42\xf3\ +\xa3\x16\xc9\x5f\xb4\xed\xcc\x90\x45\x32\xdf\x65\xf2\xc9\xe3\x59\ +\xeb\x22\xbb\x74\x80\x8d\x6e\x77\x73\xea\x9a\x70\x62\x36\xab\xfc\ +\xa7\x0d\x15\x6c\x94\x73\x0c\xf2\xa7\x0e\x11\x36\xca\xe4\x08\xc9\ +\x81\xb4\x3a\x43\xe4\xb0\xe4\xc8\xc9\xc1\x85\x4e\xae\xc7\xf0\x8d\ +\x75\x4e\x58\xd2\xa5\xf4\x99\xff\xad\xac\xf2\x0f\x8b\x79\x94\xf0\ +\x0c\x3c\x66\x86\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\ +\x00\x00\x07\x4d\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x19\x00\x00\x00\x1c\x08\x06\x00\x00\x00\x94\x24\x14\xd0\ +\x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\ +\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\ +\x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xdc\x02\x09\ +\x11\x34\x07\x96\x4a\xc5\x0d\x00\x00\x06\xcd\x49\x44\x41\x54\x48\ +\xc7\x9d\x56\xdd\x6b\x5c\xc7\x15\xff\x9d\x99\xbb\xbb\x77\x3f\x2c\ +\x69\xb5\xbb\xfa\x8e\xd5\xae\x8d\x9b\x90\x50\xd7\x34\x36\xa9\x0a\ +\xaa\x93\x42\x5a\x1c\xda\xa6\x26\x84\x42\x1b\x30\xfd\xc0\x2d\xce\ +\x83\xdf\xfa\x37\x34\xaf\x21\x50\x3f\xf4\xa1\x06\x63\x1b\x5a\x63\ +\x28\x7d\x29\xc6\x54\xea\x83\xeb\xa6\xd4\x72\xb2\x51\x2c\x59\x76\ +\x24\xaf\xfc\x6d\xaf\xb4\xba\xab\xfb\x35\x33\xe7\xf4\x61\x57\x4a\ +\xdc\xba\x24\xf4\xc0\x70\x99\xb9\xc3\xf9\xcd\x6f\xce\x99\xdf\x39\ +\xc0\x53\x2c\x0c\x43\xfc\x3f\xd6\xe9\x74\x9e\xba\xae\x9e\xb6\x28\ +\x22\x4f\xdd\x7c\xfb\xf6\x6d\x2f\x0c\xc3\x3c\x33\xfb\x49\x92\xd0\ +\x17\x05\x7f\x62\x63\x14\x45\x20\x22\xf8\xbe\x0f\x00\x68\x36\x9b\ +\xa8\xd5\x6a\x15\x00\x35\x00\x65\x00\x03\x44\xe4\x03\x60\x11\xe9\ +\x88\xc8\x63\xe7\xdc\x63\xe7\xdc\x7a\x7f\x7f\x7f\xd0\x3b\x08\xc6\ +\xc7\xc7\x21\x22\x20\xa2\x27\x41\xc2\x30\x44\xa1\x50\xf8\x2c\x75\ +\x4d\x44\x63\x5a\xeb\xd7\x88\x68\x9a\x88\x26\x00\xf4\x01\xc8\x32\ +\xb3\x10\x51\xc8\xcc\x2d\x11\xf9\x88\x99\xff\x0a\xe0\x42\xa9\x54\ +\x0a\xb7\x6e\x82\x88\x70\xe2\xc4\x09\x1c\x3d\x7a\x14\xde\x36\x25\ +\xfa\x94\x54\x92\x24\x35\x11\x79\x4d\x44\x7e\x42\x44\xbb\x94\x52\ +\x7d\x4a\x29\x5f\x44\x3c\x11\x21\xa5\x14\x44\xc4\x69\xad\x2d\x11\ +\xed\x15\x91\x97\x8d\x31\x6f\x76\x3a\x9d\xf7\x4a\xa5\xd2\xa5\x6d\ +\x06\x5b\xdf\x24\x49\x00\x00\xb9\x5c\x0e\x00\x90\xa6\xe9\x84\xb5\ +\xf6\xfb\x00\xde\x52\x4a\xbd\xa4\x94\x82\x52\x0a\x44\x0a\x22\x0c\ +\x11\xd9\x1e\x44\xb4\xed\xc8\x18\x93\x88\xc8\x59\xad\xf5\xef\x72\ +\xb9\xdc\xdf\x88\x68\x3b\xb0\xde\x96\xf3\x1e\xcd\x42\x14\x45\x6f\ +\x32\xf3\x4f\x89\xe8\xf9\x9e\x03\x11\x11\xea\x86\x41\x20\x22\x24\ +\x22\x60\xe6\xad\xd3\x8a\x52\x0a\x5a\xeb\x5c\x9a\xa6\x6f\x05\x41\ +\x30\x7a\xea\xd4\xa9\xb7\x01\xdc\x00\xe0\x00\x40\x7f\x06\xa0\x0f\ +\xc0\xab\x51\x14\xbd\x2d\x22\x5f\x55\x4a\xfd\x47\x82\x74\x1d\x77\ +\x01\xf1\x04\xa3\xde\x4d\x50\x14\x45\xb4\xb0\xb0\xd0\x7f\xe9\xd2\ +\xa5\x6a\xb5\x5a\x5d\x5c\x5c\x5c\x7c\x04\xe0\xd3\x98\xcc\xcc\xce\ +\x7e\xb9\x5a\xa9\xfe\x60\x72\x72\xe7\xae\x52\xa9\x08\x00\xd2\xe9\ +\x74\x48\x29\x45\x4a\x2b\x11\x66\x12\x01\x20\x80\x48\x17\x44\x29\ +\x25\xcc\x42\x41\xb0\x81\x46\xa3\x21\xf3\xf3\xf3\x34\x37\x37\x57\ +\x9d\x9b\x9b\x3b\xb4\xb8\xb8\x38\x0b\x60\x15\x40\xb0\xc5\x24\xef\ +\x69\xef\x9b\xcd\xd5\xd5\x9f\x75\x3a\x41\x35\x4d\x13\x05\x08\x32\ +\x99\x2c\xb4\xd6\x24\xec\xc8\x98\x14\xec\x2c\x8c\x49\x91\x24\x31\ +\xe2\x38\x46\x1c\xc7\xd4\x6e\xb7\xb1\xbc\xfc\x09\xce\x9f\x3f\x4f\ +\x2b\x2b\x2b\xa2\x94\x22\xcf\xf3\x76\x24\x49\x72\xf7\xce\x9d\x3b\ +\xcb\x00\xee\x69\x00\x28\x16\x0b\xe3\x1f\x7d\xd8\xf8\xf6\x3f\x2e\ +\x5f\xfe\xe1\xc5\x8b\x17\xd4\xc2\xc2\x02\x44\x84\x26\x27\x77\x92\ +\xd6\x1a\x71\x1c\x22\x89\x23\xa4\x69\x82\x4e\x27\x40\xbb\xbd\x8e\ +\x76\x7b\x1d\xf7\xef\xdd\xc7\xca\xf2\x32\xae\x7e\x30\x87\xd3\xa7\ +\xcf\x60\x6a\x6a\x0a\xc7\x8f\x1f\xa7\x7d\xfb\xf6\x21\x08\x02\xd7\ +\x6e\xb7\x6f\x3d\x78\xf0\xe0\xaa\x07\x00\x26\x35\xcf\x40\xa4\x0e\ +\x02\xe2\x24\xc4\xcc\xcc\xac\x34\x1a\xf3\x74\xf6\xec\x59\xbc\xf8\ +\xe2\xd7\xb1\x77\xef\x0b\x18\x1b\x1f\x85\x73\x0e\x26\xb5\xb0\xd6\ +\xc1\x39\x06\x11\x61\x63\xa3\x8d\xf5\xb5\x35\xf8\xbe\x8f\x52\xa9\ +\x84\x4a\xa5\x82\xa1\xa1\x21\x1c\x38\x70\xe0\x39\xcf\xf3\x76\x37\ +\x1a\x0d\xf2\x7a\x19\x32\xc2\x22\x63\xce\x39\x08\x0b\x92\x74\x03\ +\xeb\xed\x0d\xdc\xb9\xbb\x8a\xd2\x8e\x02\x86\x86\x07\xa1\x33\xd4\ +\x0d\x3c\x03\x10\x82\x63\x07\x02\x41\x84\x51\xad\x0e\xca\xc4\xc4\ +\x38\x5a\xad\x16\x5d\xb9\x72\x05\xe3\xe3\xe3\x00\xd0\x5f\x2e\x97\ +\x87\x00\x28\x4f\x44\xf0\xcc\xc4\xc4\x8e\x24\x89\x07\xa2\x28\x82\ +\xb5\x06\xce\x59\xca\xe5\x72\xf2\xa5\xc9\x49\x8c\x8e\x8c\x50\x26\ +\x93\x41\x10\x04\x20\x60\xfb\xcd\x58\xeb\x10\x6c\x04\xc8\xf9\x3e\ +\x06\xca\xfd\x54\xa9\x54\x70\xf3\xe6\x0d\x9c\x3b\x77\x4e\xea\xf5\ +\x3a\x5a\xad\x16\x85\x61\xe8\x1f\x39\x72\xa4\xcb\xe4\x95\x83\x07\ +\xbd\xcd\xcd\x8e\xb7\xb6\xd6\x42\x67\x33\x40\x14\x45\x50\x4a\x63\ +\x78\x68\x08\xec\x18\x8f\x1e\x3c\x84\xef\x67\x01\x08\xb4\xf6\xa0\ +\xb5\x07\xeb\x1c\x56\x96\x6f\x21\x8e\x63\x14\x0a\x05\xb4\x5a\x8f\ +\x11\xc7\x29\x6e\xdf\xbe\x83\x99\x99\x19\xec\xd9\xb3\x07\x95\x4a\ +\x05\x87\x0e\x1d\x22\xcf\xc4\xc0\xc8\xf0\x50\x6c\xcc\x40\x54\xab\ +\x55\x90\xc4\x11\x8c\xb1\x20\x22\xca\x17\xf2\x28\x15\x0b\x60\xc7\ +\x48\x93\x14\x2c\x02\xe1\x18\x4a\x69\x64\x32\x59\x98\x34\xc5\x6a\ +\xb3\x89\xb5\xf5\x0d\xc9\xfa\x05\x94\xcb\x83\xa4\x94\xa2\x66\xb3\ +\x89\x7a\xbd\x8e\x5c\x2e\x27\xf5\x7a\x5d\x54\x36\x4f\xc8\x66\x33\ +\xad\x42\x21\xff\x68\x70\xa0\x8c\xa1\xda\x30\xc6\xc6\xc6\x64\x6c\ +\x6c\x14\x83\x83\x65\xf8\x7e\x0e\x22\xdc\x0d\xb6\x75\x48\x53\x8b\ +\x38\x8a\x11\x45\x09\x9c\x75\xd8\x68\x07\x68\x36\x9b\x94\x26\x09\ +\x65\x32\x19\xf1\xfd\x3c\x7c\xdf\x87\xe7\x79\xf0\x3c\x2f\xa8\xd7\ +\xeb\xec\x01\x00\x33\xaf\x3a\xe7\x96\x99\x19\xdd\x61\x49\x20\xf0\ +\x3c\x0f\x80\x40\x84\xb1\xa5\x9f\x22\x04\xe7\x04\x41\xb0\x89\x8d\ +\x8d\x0e\x58\x04\xc5\x42\x01\xc5\x42\x11\xe1\x66\x88\xc4\x18\xf4\ +\xf5\xf5\xc1\x39\xb7\x12\x86\x61\xb3\x5c\x2e\x77\x41\x04\x74\xd7\ +\x32\xdf\x60\xe1\x8e\xb0\x2d\x49\x37\x85\x60\x4c\xda\x03\x71\x60\ +\xb6\x3d\x91\x24\x30\x0b\x2c\x3b\x14\x8a\x79\x4c\x4e\xee\xc4\xd8\ +\xd8\x28\x32\x7e\x11\xcc\x40\xa9\x27\xb6\xf9\x7c\x7e\xce\x39\xd7\ +\x20\xa2\x6e\x65\x7c\xf9\x95\x1f\x3f\x34\xce\xcd\x1b\x6b\x3e\x4e\ +\x8d\x49\x8d\xb1\x30\xa9\x91\x24\x89\xd1\x1b\x12\x6f\xbf\xf2\x08\ +\x71\x1c\xc3\xa4\x06\x4a\x29\x14\x8a\x45\xf4\x0f\x0c\x48\x2e\x9b\ +\x93\x6c\x36\x43\xbe\xef\xa3\x58\x2c\xc6\x5a\xeb\xf7\x89\xe8\xe3\ +\x6d\xed\x7a\xf5\xbb\x5f\x93\x5f\xfd\xf2\x17\xd7\x98\xf9\x2f\xd6\ +\x98\x71\x66\x37\x26\xec\xc8\x39\x27\x00\x43\xc0\x24\xe2\x20\x4c\ +\x10\x01\x98\x05\x5d\x5d\x24\x88\x88\x30\x40\x10\x0d\xd2\x1a\xda\ +\xa3\x24\x4d\xd3\x06\x33\xff\x73\x6a\x6a\xea\xd6\x13\x95\xf1\xca\ +\xbf\xee\xe3\xdd\x77\x7f\xbd\x33\x0c\x83\xdf\x3a\x6b\xbf\x63\xad\ +\x55\xe2\x5c\x57\xde\xc1\x24\xc2\x3d\xe7\xd2\x8b\x1b\x41\x91\x02\ +\x88\x44\x00\x12\x68\x64\xb3\x59\x64\xb2\x99\x65\xcf\xf3\xde\xd1\ +\x5a\x9f\x3b\x73\xe6\xcc\x7d\x00\xf0\xfe\xf8\x87\x77\xb0\x7f\xff\ +\x27\xd8\x39\x39\x0c\x00\xb7\xde\x78\xe3\xf5\xdf\x84\x61\xd4\x4e\ +\xd3\xf4\x47\xce\x18\x12\x74\xa5\x57\xd8\x81\x9d\x80\x99\x85\x45\ +\x00\x51\x44\x5d\x10\x02\x08\xa4\x35\xac\xb5\x0b\xbe\xf8\x67\xad\ +\xb5\x7f\xb6\xd6\x3e\x00\x80\x63\xc7\x8e\x41\x17\xf2\xe3\xb8\x78\ +\xd1\xe0\xea\xd5\xab\x00\x80\xf9\xf9\x6b\x2b\xc3\xc3\xc3\x2d\x6b\ +\x6d\x39\x4e\xa2\x6c\x9c\x24\x99\x24\x8a\x75\x1c\xc5\x2a\x8e\x13\ +\x44\x51\x4c\x71\x9c\x90\x31\x16\x69\x62\x60\x52\x9b\x1a\x6b\xdb\ +\x22\x58\xb2\x6c\xcf\x18\x63\x4e\x5f\xb8\x70\xe1\xe6\xd2\xd2\x12\ +\x0e\x1f\x3e\x8c\x93\x27\x4f\x7e\x7a\x5d\xdf\x9a\x9e\xc6\xcc\xec\ +\xec\x76\x95\x7a\xf6\xd9\x3d\x95\x6c\x26\xf3\xf3\x24\x8a\x0e\x1a\ +\x63\xbe\x22\xcc\x35\x11\x14\x9c\x63\x25\x22\xf0\xbc\xac\x23\xa8\ +\x35\x90\x5a\xd5\x9e\xfa\x00\x0a\xa7\x49\xd1\xe5\xeb\xd7\xaf\xaf\ +\x01\xc0\xf4\xf4\x34\x66\x7b\xfe\xfe\xab\x91\xf8\xd3\xf9\xf7\xf0\ +\xbd\xd7\x8f\xe1\xda\xb5\xc5\xc7\x2f\x3c\xff\xdc\xef\xd3\xd4\x5c\ +\xb4\xc6\x4c\x8a\xf0\x84\x73\xdc\xcf\x2c\x39\x40\x31\xbb\x34\x22\ +\xd2\x0f\x95\xd2\xcb\x20\xbd\x14\x47\xf1\xfd\xbb\xf7\xee\x6e\x7e\ +\x6e\xdf\xb5\x65\xdf\x78\x69\x3f\x2e\xfd\xfd\xfd\xed\x79\xce\xcb\ +\xe6\x8b\x05\x7f\x80\xd9\xe6\x01\x9d\x21\xd2\xc2\x4e\x12\x02\x75\ +\xd6\xc3\xf5\x35\x00\xbc\xb5\x77\xf7\xae\xdd\x20\x22\x5c\x5f\xba\ +\xfe\xf9\x5d\xdf\x48\xad\x86\x91\x5a\xed\x0b\x75\x88\xa3\xd5\x51\ +\x8c\x56\x47\xff\xe7\xff\x7f\x03\x97\x54\x18\xa6\xd8\x35\x20\x89\ +\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x14\x57\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x01\x20\x05\xc9\x11\ +\x00\x00\x04\xc8\x69\x54\x58\x74\x58\x4d\x4c\x3a\x63\x6f\x6d\x2e\ +\x61\x64\x6f\x62\x65\x2e\x78\x6d\x70\x00\x00\x00\x00\x00\x3c\x3f\ +\x78\x70\x61\x63\x6b\x65\x74\x20\x62\x65\x67\x69\x6e\x3d\x22\xef\ +\xbb\xbf\x22\x20\x69\x64\x3d\x22\x57\x35\x4d\x30\x4d\x70\x43\x65\ +\x68\x69\x48\x7a\x72\x65\x53\x7a\x4e\x54\x63\x7a\x6b\x63\x39\x64\ +\x22\x3f\x3e\x0a\x3c\x78\x3a\x78\x6d\x70\x6d\x65\x74\x61\x20\x78\ +\x6d\x6c\x6e\x73\x3a\x78\x3d\x22\x61\x64\x6f\x62\x65\x3a\x6e\x73\ +\x3a\x6d\x65\x74\x61\x2f\x22\x20\x78\x3a\x78\x6d\x70\x74\x6b\x3d\ +\x22\x41\x64\x6f\x62\x65\x20\x58\x4d\x50\x20\x43\x6f\x72\x65\x20\ +\x34\x2e\x31\x2d\x63\x30\x33\x37\x20\x34\x36\x2e\x32\x38\x32\x36\ +\x39\x36\x2c\x20\x4d\x6f\x6e\x20\x41\x70\x72\x20\x30\x32\x20\x32\ +\x30\x30\x37\x20\x31\x38\x3a\x33\x36\x3a\x35\x36\x20\x20\x20\x20\ +\x20\x20\x20\x20\x22\x3e\x0a\x20\x3c\x72\x64\x66\x3a\x52\x44\x46\ +\x20\x78\x6d\x6c\x6e\x73\x3a\x72\x64\x66\x3d\x22\x68\x74\x74\x70\ +\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\ +\x39\x39\x2f\x30\x32\x2f\x32\x32\x2d\x72\x64\x66\x2d\x73\x79\x6e\ +\x74\x61\x78\x2d\x6e\x73\x23\x22\x3e\x0a\x20\x20\x3c\x72\x64\x66\ +\x3a\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x20\x72\x64\x66\ +\x3a\x61\x62\x6f\x75\x74\x3d\x22\x22\x0a\x20\x20\x20\x20\x78\x6d\ +\x6c\x6e\x73\x3a\x78\x61\x70\x52\x69\x67\x68\x74\x73\x3d\x22\x68\ +\x74\x74\x70\x3a\x2f\x2f\x6e\x73\x2e\x61\x64\x6f\x62\x65\x2e\x63\ +\x6f\x6d\x2f\x78\x61\x70\x2f\x31\x2e\x30\x2f\x72\x69\x67\x68\x74\ +\x73\x2f\x22\x0a\x20\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x78\x61\ +\x70\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x6e\x73\x2e\x61\x64\x6f\ +\x62\x65\x2e\x63\x6f\x6d\x2f\x78\x61\x70\x2f\x31\x2e\x30\x2f\x22\ +\x0a\x20\x20\x20\x20\x78\x6d\x6c\x6e\x73\x3a\x64\x63\x3d\x22\x68\ +\x74\x74\x70\x3a\x2f\x2f\x70\x75\x72\x6c\x2e\x6f\x72\x67\x2f\x64\ +\x63\x2f\x65\x6c\x65\x6d\x65\x6e\x74\x73\x2f\x31\x2e\x31\x2f\x22\ +\x0a\x20\x20\x20\x78\x61\x70\x52\x69\x67\x68\x74\x73\x3a\x57\x65\ +\x62\x53\x74\x61\x74\x65\x6d\x65\x6e\x74\x3d\x22\x68\x74\x74\x70\ +\x3a\x2f\x2f\x62\x6c\x6f\x67\x2e\x61\x64\x64\x69\x63\x74\x65\x64\ +\x74\x6f\x63\x6f\x66\x66\x65\x65\x2e\x64\x65\x22\x0a\x20\x20\x20\ +\x78\x61\x70\x3a\x4d\x65\x74\x61\x64\x61\x74\x61\x44\x61\x74\x65\ +\x3d\x22\x32\x30\x30\x39\x2d\x30\x31\x2d\x32\x32\x54\x31\x30\x3a\ +\x30\x36\x3a\x31\x34\x2b\x30\x31\x3a\x30\x30\x22\x3e\x0a\x20\x20\ +\x20\x3c\x64\x63\x3a\x63\x72\x65\x61\x74\x6f\x72\x3e\x0a\x20\x20\ +\x20\x20\x3c\x72\x64\x66\x3a\x53\x65\x71\x3e\x0a\x20\x20\x20\x20\ +\x20\x3c\x72\x64\x66\x3a\x6c\x69\x3e\x4f\x6c\x69\x76\x65\x72\x20\ +\x54\x77\x61\x72\x64\x6f\x77\x73\x6b\x69\x3c\x2f\x72\x64\x66\x3a\ +\x6c\x69\x3e\x0a\x20\x20\x20\x20\x3c\x2f\x72\x64\x66\x3a\x53\x65\ +\x71\x3e\x0a\x20\x20\x20\x3c\x2f\x64\x63\x3a\x63\x72\x65\x61\x74\ +\x6f\x72\x3e\x0a\x20\x20\x20\x3c\x64\x63\x3a\x64\x65\x73\x63\x72\ +\x69\x70\x74\x69\x6f\x6e\x3e\x0a\x20\x20\x20\x20\x3c\x72\x64\x66\ +\x3a\x41\x6c\x74\x3e\x0a\x20\x20\x20\x20\x20\x3c\x72\x64\x66\x3a\ +\x6c\x69\x20\x78\x6d\x6c\x3a\x6c\x61\x6e\x67\x3d\x22\x78\x2d\x64\ +\x65\x66\x61\x75\x6c\x74\x22\x3e\xef\xa3\xbf\x20\x4d\x61\x64\x65\ +\x20\x6f\x6e\x20\x61\x20\x4d\x61\x63\x21\x26\x23\x78\x41\x3b\x26\ +\x23\x78\x41\x3b\x65\x78\x63\x6c\x75\x73\x69\x76\x65\x20\x66\x6f\ +\x72\x20\x53\x6d\x61\x73\x68\x69\x6e\x67\x20\x4d\x61\x67\x61\x7a\ +\x69\x6e\x65\x3c\x2f\x72\x64\x66\x3a\x6c\x69\x3e\x0a\x20\x20\x20\ +\x20\x3c\x2f\x72\x64\x66\x3a\x41\x6c\x74\x3e\x0a\x20\x20\x20\x3c\ +\x2f\x64\x63\x3a\x64\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e\ +\x0a\x20\x20\x20\x3c\x64\x63\x3a\x73\x75\x62\x6a\x65\x63\x74\x3e\ +\x0a\x20\x20\x20\x20\x3c\x72\x64\x66\x3a\x42\x61\x67\x3e\x0a\x20\ +\x20\x20\x20\x20\x3c\x72\x64\x66\x3a\x6c\x69\x3e\x69\x63\x6f\x6e\ +\x73\x3c\x2f\x72\x64\x66\x3a\x6c\x69\x3e\x0a\x20\x20\x20\x20\x20\ +\x3c\x72\x64\x66\x3a\x6c\x69\x3e\x66\x6c\x61\x76\x6f\x75\x72\x3c\ +\x2f\x72\x64\x66\x3a\x6c\x69\x3e\x0a\x20\x20\x20\x20\x20\x3c\x72\ +\x64\x66\x3a\x6c\x69\x3e\x73\x6d\x61\x73\x68\x69\x6e\x67\x20\x6d\ +\x61\x67\x61\x7a\x69\x6e\x65\x3c\x2f\x72\x64\x66\x3a\x6c\x69\x3e\ +\x0a\x20\x20\x20\x20\x20\x3c\x72\x64\x66\x3a\x6c\x69\x3e\x61\x64\ +\x64\x69\x63\x74\x65\x64\x20\x74\x6f\x20\x63\x6f\x66\x66\x65\x65\ +\x3c\x2f\x72\x64\x66\x3a\x6c\x69\x3e\x0a\x20\x20\x20\x20\x3c\x2f\ +\x72\x64\x66\x3a\x42\x61\x67\x3e\x0a\x20\x20\x20\x3c\x2f\x64\x63\ +\x3a\x73\x75\x62\x6a\x65\x63\x74\x3e\x0a\x20\x20\x20\x3c\x64\x63\ +\x3a\x72\x69\x67\x68\x74\x73\x3e\x0a\x20\x20\x20\x20\x3c\x72\x64\ +\x66\x3a\x41\x6c\x74\x3e\x0a\x20\x20\x20\x20\x20\x3c\x72\x64\x66\ +\x3a\x6c\x69\x20\x78\x6d\x6c\x3a\x6c\x61\x6e\x67\x3d\x22\x78\x2d\ +\x64\x65\x66\x61\x75\x6c\x74\x22\x3e\xc2\xa9\x20\x32\x30\x30\x39\ +\x20\x62\x79\x20\x4f\x6c\x69\x76\x65\x72\x20\x54\x77\x61\x72\x64\ +\x6f\x77\x73\x6b\x69\x20\x3c\x2f\x72\x64\x66\x3a\x6c\x69\x3e\x0a\ +\x20\x20\x20\x20\x3c\x2f\x72\x64\x66\x3a\x41\x6c\x74\x3e\x0a\x20\ +\x20\x20\x3c\x2f\x64\x63\x3a\x72\x69\x67\x68\x74\x73\x3e\x0a\x20\ +\x20\x3c\x2f\x72\x64\x66\x3a\x44\x65\x73\x63\x72\x69\x70\x74\x69\ +\x6f\x6e\x3e\x0a\x20\x3c\x2f\x72\x64\x66\x3a\x52\x44\x46\x3e\x0a\ +\x3c\x2f\x78\x3a\x78\x6d\x70\x6d\x65\x74\x61\x3e\x0a\x3c\x3f\x78\ +\x70\x61\x63\x6b\x65\x74\x20\x65\x6e\x64\x3d\x22\x72\x22\x3f\x3e\ +\xee\x04\x51\xd2\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\ +\x77\x61\x72\x65\x00\x41\x64\x6f\x62\x65\x20\x49\x6d\x61\x67\x65\ +\x52\x65\x61\x64\x79\x71\xc9\x65\x3c\x00\x00\x0f\x25\x49\x44\x41\ +\x54\x78\xda\x62\xfc\xff\xff\x3f\x03\x36\xc0\x02\x63\xd8\x75\xea\ +\xff\x67\x66\x67\x66\xf8\xfb\xf3\x2f\xc3\xa1\xf2\x8b\x8c\x8c\x20\ +\x1d\x20\x41\x5e\x49\x1e\x06\x0e\x1e\x36\x86\x1f\x5f\x7e\x31\x7c\ +\x7e\xfe\x05\xa2\xe3\xf5\xc7\x77\x0c\xbf\x45\x7e\x31\xbc\xee\xfa\ +\xc6\x20\x16\xc0\xcb\xf0\xfe\xd3\x47\x06\x26\x90\xc4\xdf\x9f\xff\ +\x18\x7e\x7e\xfc\xcd\x20\x9a\xca\xc5\xf0\x83\xed\x07\x98\xcf\x08\ +\xb3\x5c\xad\x58\x1a\x68\x07\x13\x58\xf0\x56\xef\x53\x46\x80\x00\ +\x62\xc4\xeb\x2a\xab\x56\x9d\xff\x6c\x5c\x6c\x60\x81\x2f\xb7\x58\ +\x3f\x9d\x99\x7e\x92\x9f\x25\x2c\x31\x73\x3e\xb7\x29\x27\x03\x0b\ +\x13\x0b\x03\x87\x30\x1b\x03\x2b\xfb\x37\x3e\xb0\x8e\x33\x9c\x1b\ +\x62\xf9\xbf\x72\x31\x7c\x58\xfd\x13\xe8\x12\x26\x06\xbe\x50\x56\ +\x06\x4e\x61\xe9\x03\x4c\xcf\x57\x32\xa9\xfd\xfe\xf6\x87\x41\x31\ +\x4b\x94\x41\x24\x99\x93\x01\xc4\xfe\xfe\xf6\xa9\x03\x13\x90\xb8\ +\xf7\x6a\xff\xef\xc7\xcf\x6e\xbe\x61\xf8\xf8\xe0\x1b\xc3\xdd\x49\ +\x7f\xe6\x83\x8c\x02\x08\x20\x0c\x57\x81\xec\x7c\xc0\x77\x26\x94\ +\x45\xec\x3b\xf7\x8f\xfb\xdc\x1f\xdc\x65\xfc\xdc\xda\x1b\xaa\x4f\ +\xc3\xe4\xe1\x1a\x40\x2e\x66\xe5\x60\x65\x60\xe3\x64\x61\x60\x66\ +\x63\x61\x60\x62\x66\x64\xf8\xf7\xf7\x3f\xc3\xdf\x5f\x7f\x18\x7e\ +\x7d\xff\xc3\xf0\xe5\x2a\xc7\xfb\xb3\xf3\x8e\x0b\x81\x35\x98\x16\ +\x98\x7c\xe5\x96\xff\xc7\xc5\xc1\xcb\xce\xc0\xc9\xcf\xc6\xf0\x64\ +\xd1\x7b\xb0\x21\xca\x59\xe2\x0c\x3f\x81\x61\xfd\xfd\xe3\x2f\x86\ +\x1f\x9f\x7f\x32\x70\x9d\xd0\xdb\x04\x0e\x8f\x47\x97\x9e\xbd\x17\ +\xe4\x64\xe6\x62\xff\xc9\xca\xc0\xf1\x97\x95\xe1\x35\x30\x32\x04\ +\x25\xf9\x18\x9e\x7d\x78\xce\xf0\xf3\xd3\x6f\x86\x1f\xef\x7f\x83\ +\x83\xfe\xe1\x9e\xdd\xeb\xe1\x4e\x92\x70\x97\x7a\xc6\x6f\xc0\x24\ +\xc9\xca\xc5\xcc\x00\x8a\x5e\xb8\x93\x80\xd1\xfc\xfb\xdb\x5f\x86\ +\x47\x73\xfe\xcf\x07\x06\x44\x12\x03\x48\x03\x0c\x03\x01\x07\x10\ +\xeb\xb1\xf1\x8b\x2e\x65\x17\x94\xb8\xcd\xc6\x2b\xd4\x0d\x8a\x3e\ +\x64\x35\x00\x01\x84\x33\xee\x70\x01\x16\x74\x01\xbd\x00\xdb\xe7\ +\x5c\x3a\x1f\x45\x18\xfe\x30\xfe\xfb\x79\x42\xe6\xce\xf9\x03\x5b\ +\xb5\x91\xe5\xe1\x36\x18\x39\xfa\x5c\xe6\x72\x7f\xa4\xc3\xcc\x02\ +\x74\x3f\x0b\x23\x58\xec\xdf\x1f\xa0\x1f\xfe\xfc\x65\xb0\xfe\x16\ +\xe6\xd8\xd9\x54\x73\x00\x24\x06\x4e\x80\x11\xc9\xd9\x33\xb8\x3c\ +\x1e\xeb\xb0\x71\x01\x43\x89\x97\x8d\x81\x93\x8f\x03\x8c\x41\x6c\ +\x90\xd8\x51\xee\xd5\xfb\x61\x36\x80\x35\x3c\x56\x3a\x98\xce\x0a\ +\x0c\x19\x50\x52\x63\xe7\x03\xc6\x85\x00\x1b\x18\x83\xd8\x20\x31\ +\x90\x9c\x49\xa6\xd9\x47\xb8\x06\x46\xa0\x33\x58\x58\x81\x98\x83\ +\x99\x81\x9d\x9b\x85\xe1\xc9\x82\xf7\x0c\x8f\xf6\xbc\x00\xb3\x41\ +\x62\x20\x39\x0e\x85\x9f\x7c\x70\x4f\xbf\x7a\xf5\x86\x81\xfd\x17\ +\xd0\x39\xff\xd9\x18\x38\x98\x58\x19\xde\xbc\xfc\xcc\xc0\xf8\x8a\ +\x91\xe1\xcd\xe9\x5b\x0c\x22\xf1\xc0\x7c\xf2\xfe\x17\xc3\xcf\x0f\ +\xbf\x11\x4e\x02\xf9\xfb\x3f\x30\x92\x40\x11\xf5\xef\x37\x10\xff\ +\xff\xc7\xe0\x37\xd1\x81\x41\x2a\x87\x0f\x2c\x06\x92\x83\x85\x3e\ +\x44\xc3\xef\x7f\xff\xff\xfe\xfa\xc7\xf0\xe7\xfb\x5f\x86\x5f\x9f\ +\xff\x30\x48\xa4\xf1\x30\x1c\xbf\x7c\x12\xcc\x06\x89\x81\xe4\x9e\ +\x2c\x64\x38\x0d\xd7\xf0\x74\x19\x13\xfb\x9f\x1f\xff\x18\x7e\x7f\ +\xf9\x03\x4e\x33\x3f\xde\x41\x30\x88\x0d\x12\x03\xc9\x01\x93\x85\ +\x19\x4a\x3c\x00\xb3\x93\x84\x4c\xdc\xff\xe7\x4c\xac\x4c\x28\xf1\ +\xf0\xe7\xcb\xbf\xdf\x77\xa7\x3d\x63\x83\xc7\x1c\x5a\x5a\x92\x65\ +\xe1\xe4\x8d\x63\x17\x10\x3f\xc3\x26\x20\xb6\x0f\xc8\x37\x05\x62\ +\x61\x64\x35\x00\x01\x68\xab\x96\xd0\x26\xa2\x28\x7a\xdf\x9b\x99\ +\x4c\xd2\x94\x50\xd1\x22\x28\xa8\x48\xe3\x2a\x82\x0a\x7e\x28\xb8\ +\xa9\x41\x05\x3f\xd9\x4b\xc5\x9d\x4b\x91\x22\x22\xd8\x45\x5d\x75\ +\xeb\xca\xbd\x0b\x29\xe2\x4a\x28\xe8\xce\x5d\xab\x0b\x89\x6e\xd4\ +\x85\x48\x6a\x25\x03\x16\x35\x18\x3a\x0d\xc9\xfb\x78\xcf\x7b\xd3\ +\x40\xd3\x28\x74\xe1\x83\xcb\xcc\x64\xe6\x9d\x9b\x7b\xee\x39\xf7\ +\xed\x58\x4b\x3b\x5d\xe1\xdf\x5e\x4c\xdf\xbc\xf5\xf0\x83\x7d\x73\ +\xa3\x70\x68\x7d\x8c\xa4\x24\x21\x85\x27\x28\x5b\x06\xd5\x18\xfe\ +\x73\xda\xd8\xd6\x8b\x7d\x9f\xaf\xd5\x2e\x1e\xbb\x7f\x77\x26\x1d\ +\xc4\xd9\x56\x01\x34\x5b\xa8\x36\x2a\x10\x4b\x10\x78\xbe\xe0\x3d\ +\x99\x25\x21\xd0\x67\x3d\xb8\x31\xc6\xb7\x1a\x9a\xd6\x3c\x3f\xbf\ +\xe6\xda\xd5\xf1\xda\xa9\xf9\xb9\xd9\x4f\x43\x13\x40\x8e\xf9\x83\ +\x9d\x12\x0c\x11\xe4\xa4\x53\x9c\xe4\x08\x22\x41\x02\xc9\x50\x82\ +\x90\x40\x67\x70\x68\xc9\x90\x86\x8e\x7a\x9a\x54\xcf\xcb\x01\xe6\ +\x19\x7d\x7b\x7c\xf1\xe5\xb3\xc7\x57\xfa\xb2\xc0\xaa\x5c\x3d\x9b\ +\xc4\x07\x3c\x78\xc8\xc3\x3a\x8a\x43\x8a\x46\x42\xca\x15\x23\x8a\ +\xf9\x1c\x48\x16\x5a\xf4\xf1\x49\x83\xcf\x84\x90\x8d\xc5\x7e\x29\ +\xe5\xdc\xef\x78\x8f\xef\xf0\x3d\xf6\x61\x7f\xfb\x44\xfd\xf2\x9d\ +\xd9\x07\x97\xb6\x54\x70\x74\x66\xa2\x17\x8d\x32\x31\x31\x12\x04\ +\x14\xe5\xbd\x97\xc2\x82\x7f\x5e\x79\xf4\x93\xa4\x08\x48\x08\x2f\ +\xb1\xb4\x9b\xd2\x9e\xa9\x22\x95\xca\x23\x4e\xcc\xaa\xc3\xa3\x8b\ +\x43\xf1\x08\xc3\x18\x6b\x3d\xdf\xbd\xfc\xe5\xfd\xeb\xc9\x7e\x93\ +\x7f\xff\x58\xef\xc6\x42\x86\x81\x62\x6a\x34\x83\x1a\x0e\xcb\xf7\ +\x84\x6b\x40\x69\x7b\x83\x29\x62\xaa\xb2\xa2\x2b\xe7\xcb\x94\x3f\ +\x29\x68\x25\x59\xf5\x09\x36\x8c\x4b\x82\xc0\x51\x95\x7c\x4b\x1b\ +\x5b\x54\xf4\x7d\x51\x2e\xed\xbf\x6e\xab\x42\x81\x53\xe6\x32\x00\ +\xef\xa8\x51\x38\x5f\x6a\xa3\xa9\x36\x7f\x8e\xea\x6b\xef\x5c\x63\ +\xd7\x74\x93\x74\xd3\x38\x30\xc7\x3d\xef\xc1\x3e\x67\x9e\xd4\xb2\ +\xf3\xc5\xf4\xb6\x26\xb3\xdb\x96\xd9\x6d\x67\xe0\x36\x34\x19\x21\ +\x71\x45\x93\xc3\xcd\x26\x0b\x37\x2d\x5c\x93\x55\xd6\xe4\x6e\x96\ +\x04\xf3\x20\x35\xaa\xb9\x20\x0e\xb3\x95\x57\x87\xca\x94\x93\x4c\ +\xec\x9a\xb4\x4b\xc5\xb2\x18\x77\x12\xcd\x64\x2a\x10\x03\x32\xed\ +\x4f\x24\xe5\x83\x07\xca\x2b\x06\x9e\xfa\xa7\x0f\x06\x92\xdd\x1b\ +\x3b\x6d\x6f\x17\x8f\xd0\x5e\x80\x67\xfd\xa5\xcd\x91\xa7\x3b\x56\ +\x25\x4f\x45\x9d\x1f\x2f\x30\xf0\xaf\x61\x18\xff\x7d\x54\xfc\x11\ +\x80\x18\x6b\x09\xa9\x2a\x8a\xa2\xfb\x9c\x7b\xdf\x55\x5f\xf8\x44\ +\x2c\xe8\x6b\x3f\x07\x1a\x36\x88\x4a\x28\x28\x6a\x12\x92\x43\x4b\ +\x0a\x82\x68\x50\xd0\x20\xa8\x51\x38\x09\x07\x0a\xd1\x20\xa4\x06\ +\x51\x42\x45\xbf\x41\x8d\xc4\x02\xfb\x47\xd1\x1f\xca\xfe\xcf\xfc\ +\x95\xff\x7a\xa2\xf9\xf4\x7d\xf5\xdd\xd3\xde\xe7\x9c\x7b\xbb\xef\ +\x29\x56\x83\x48\xd8\x5c\x3d\x67\x9f\xbd\xcf\x6f\xaf\xb5\x8e\xff\ +\x3c\x01\x87\x7f\xfc\x63\xce\xd4\x59\x5d\x53\xb7\xb6\xf9\xc1\x93\ +\xf3\xac\x68\x68\xbe\x35\x3b\xee\xe7\xb9\x29\xcb\x8e\xf3\x49\x3b\ +\x9c\x95\x88\x7f\xcd\x1e\x2b\xce\x2f\x6d\xbe\x7a\xee\xd4\x9e\xbf\ +\xde\xa2\xba\x63\xc7\xfd\x57\x1a\x9b\x5b\xf2\xca\xfb\x8b\x10\x83\ +\x18\xd3\xd7\x93\x7b\x90\x94\x4e\x19\x21\x09\x62\x5d\x39\x3f\x4a\ +\x58\xd9\xa5\xcb\x67\x4e\x1e\xf8\xa3\x04\x87\x8f\xd4\x6e\xba\xfb\ +\xbd\xa9\x31\xab\x30\x12\x60\x86\x21\x51\x54\xde\x7f\xcf\x2d\x92\ +\x43\x6c\x55\x0b\x84\xa8\x22\x95\x82\xd8\xed\x25\xef\x5f\xdd\xbf\ +\xbe\x72\xc6\x04\xd5\x35\xb5\xc5\x77\x42\x8d\x2f\xac\x85\x89\x5c\ +\x83\x20\x5a\xcb\x0c\xa6\x93\x38\x38\x24\x9c\x42\xb3\x6d\x5d\x03\ +\x08\x0f\x58\x0f\xb1\x5b\x85\x53\x92\xa4\x1d\x72\x73\xf7\x8d\x27\ +\x6e\x70\x82\x69\x0b\x71\x08\xcd\x87\x28\x69\x12\x5a\x66\x6b\x23\ +\xa4\xa5\x36\x4b\xf9\x48\x5f\x1c\x93\xb3\xa5\xbb\x94\x64\xcd\xb4\ +\x09\xca\xb7\xef\x6e\xf2\x2f\x1f\xcb\x37\xb8\x0e\x4e\xca\x04\x21\ +\xc2\xb4\x4c\x1d\xdc\xf8\x95\x80\x7e\xa7\x36\xea\x43\x1f\xc3\xe1\ +\x0d\x1c\xdb\x6e\xbd\xdc\x39\x6d\x82\xa1\x82\x4f\x1b\x89\x54\x98\ +\x66\x31\xc2\x1f\x12\xb7\x24\xe4\xfb\x9f\x86\x10\xbe\xd5\xac\xa5\ +\x65\x53\xbb\xea\x93\x3e\x3e\x05\x29\x34\x96\x08\x8b\x94\x74\x5a\ +\x02\x22\x07\x6b\x51\x34\xc0\x99\x72\x24\xaa\x94\x32\xcf\xa7\x58\ +\xcd\x1f\xce\x85\xd6\x86\x3e\x18\x0e\x86\xd5\xec\x69\xdb\x5c\xc6\ +\x53\xbe\x2e\xbd\x62\x8c\xe0\xf0\xfb\xf2\xb4\x04\x1f\xdb\xba\xf6\ +\xc9\xf3\xd3\xbc\x4b\xc0\x26\x79\xd8\x19\xc4\x0d\x98\x65\xf9\x21\ +\xfa\x4c\xc0\x9b\x13\x1d\x12\xfb\x1d\x7d\x23\x7d\xbc\x60\x88\x31\ +\x72\x96\xc5\x02\x69\x85\x16\x0c\x06\xe7\x04\x8a\xe2\xb8\xdc\xa4\ +\x24\x1a\x03\xcd\xc2\x2e\x13\x09\xc1\xc4\xe0\x91\xf1\x28\x24\x22\ +\x49\xc9\x68\x28\x2c\xa1\xed\xf4\x00\x84\xd9\x08\x94\xec\x5d\x0c\ +\x93\x49\xc5\x62\xf4\x36\x20\x26\x93\xcc\x66\x0a\x2b\x2d\xc1\x40\ +\x6f\x4f\x92\x47\x04\x18\x13\x0e\x9b\x71\x48\x10\x93\x69\x8b\x46\ +\x62\x90\x40\x9d\x47\xcb\x57\x7c\x00\x60\x60\x8c\xbe\xcb\x23\xe0\ +\xaf\xe0\x9a\xd1\x3c\xac\x16\xb3\x59\xe6\x21\xf7\x7b\x80\x58\x15\ +\x92\x63\x4e\x61\x51\xbb\xfa\xe0\xd6\x70\xd8\x51\x5f\x01\x81\x4a\ +\x9f\xeb\xe7\xf8\xc8\x27\x60\x04\xe7\x97\x81\x45\xb7\xd0\x63\xa7\ +\x94\xb5\x76\x26\x99\xd8\x5a\x06\xaa\x00\xe5\x87\x36\xc0\x17\x7f\ +\x07\x3c\xec\x7c\x24\xfb\x5c\xb9\x6b\x2b\xe8\x20\xbf\x58\x37\x8c\ +\x64\x26\xb8\x90\x4a\x40\x03\x37\x85\xe9\x0d\xae\xf8\x59\xfd\xbd\ +\x74\xdd\x02\x98\xbb\x35\x0f\xde\x0e\xb7\x80\x08\x83\xe2\xdf\x09\ +\xcd\x66\x9e\x24\x04\x21\xe1\x16\xf6\x21\x6d\x8b\x90\x8d\xec\xc1\ +\x6b\xfc\xb5\x54\x6b\x9a\xfe\x24\x89\x6b\x9e\x5d\x73\x70\x05\x44\ +\x57\x8e\x42\x57\x5f\xb7\x2b\x51\x26\x35\xd9\xdb\x0e\xe1\xeb\x71\ +\x98\x88\xd6\xba\x7f\x3a\xb8\xae\xb4\xe3\xa2\x93\x71\x61\x92\x23\ +\x7e\x21\xc5\x52\x72\x5b\x5b\x3b\xdb\x7e\x5d\x43\xf0\x6c\xe1\x04\ +\x4d\x24\xe5\xae\x84\xda\x7a\x2f\xb2\xe7\xf4\xb6\x9d\x52\xc9\xa4\ +\x02\xfa\xaf\xf2\x8b\xea\x59\xa1\x55\x42\x42\xc8\x2b\xa8\x6e\x46\ +\x86\xb9\x22\x4b\xa8\x95\xe0\x98\xf0\x07\x31\x40\xff\x2d\x98\x11\ +\xae\x91\xe8\xef\xa1\x3e\xda\xac\x14\x05\xd7\x10\xc0\xa4\x24\xf5\ +\xa2\xa9\x3c\x50\x57\x51\xd8\xf8\xca\x17\xa1\x91\xc7\x6c\x3d\x4e\ +\xb4\xfd\xb7\x84\x83\x49\xce\xce\xdb\x66\xef\x32\x66\x71\x9f\xac\ +\xea\x19\xf8\x80\x92\x8c\xbe\x12\x3d\x63\xef\x58\x19\x06\x1f\xfc\ +\x63\xd2\xc7\x24\xf9\xf8\xb9\x39\xaf\x4a\xac\x32\xb2\xf1\xac\xa4\ +\x6c\x74\x2a\x45\x25\x18\xff\x0c\xdf\x7e\x3c\x63\xf5\x18\xf8\xe8\ +\x5f\xab\x0a\xdc\x8e\x02\x7a\x0e\xa1\xe5\xe1\x33\xbb\x0a\x11\x6d\ +\x35\x72\xe7\x22\x9c\xfe\xa8\x10\x76\xab\x9d\x8c\xdf\x9c\x8c\x8d\ +\xb5\x60\x3f\xdd\xf9\x10\xc6\x89\xff\x17\xd9\xf2\x53\x80\x6e\xad\ +\x35\x36\x8a\x2a\x0a\x9f\x3b\xbb\xdb\xdd\xed\x76\xfb\xa4\x85\x96\ +\x16\x50\x20\x48\x78\x94\x20\x60\x43\x20\x3c\x4c\xe4\x61\x8c\x21\ +\x21\x46\x7f\xf8\xf8\xe9\xe3\x9f\x46\x25\x40\xb4\x1a\x40\xf0\x87\ +\xfe\xf2\xf1\xd3\x47\x4c\xf8\x81\x41\x63\x02\xc1\x44\x6a\x84\x28\ +\x51\x0c\xa2\x3c\x5a\xfb\x80\xb2\x55\x28\xec\x96\xb6\xb3\xdb\x2e\ +\x3b\x3b\x73\x3d\xe7\x3e\x66\x66\xcb\xb6\xd2\x20\x90\xb8\x9b\x9b\ +\xb9\x3b\x77\x67\xe7\x3b\xf7\x9e\x7b\xce\xf7\x9d\xd9\x3b\x7e\x83\ +\x7b\x4a\x8b\x26\xf3\x7a\x79\x7b\xeb\xe3\x57\x93\x03\xeb\xae\x0f\ +\x9b\x4d\x83\x43\x66\x7d\xce\xca\x45\x86\xcd\x74\x35\x8d\x95\xc7\ +\xcb\x06\x4a\x42\x25\xd9\xca\x8a\xf8\xe5\xaa\xf2\x78\xa2\x6e\x4a\ +\x75\xdb\x7b\x7b\x5a\xbf\xbe\x67\x2b\xf0\xc6\xae\xbd\xb3\xce\x74\ +\xf4\xec\x3e\xdb\xd9\xbd\x32\xbe\xc4\xac\x0e\x4d\xcd\xc6\x58\x89\ +\x13\x60\xfe\x1c\xc0\x8a\x5c\xc8\x5d\xd2\x86\x11\xcc\xb0\xad\xfe\ +\x48\xc6\x3c\x15\x1f\x58\x30\x77\xf6\x8f\x0b\xe7\xdd\xbf\xe3\xed\ +\x9d\xdb\x2e\xde\x31\x03\xb6\xb7\xee\x5e\x78\xfc\xe4\xe9\x8f\xcc\ +\xba\xc4\x82\x48\x63\xa6\xdc\x08\x63\x52\x65\x06\x14\x70\x4a\x26\ +\x35\x2e\xd3\xfd\x22\x06\xc8\x9c\xe2\x88\x8e\x9f\x7f\x42\x0e\xb5\ +\xc6\xa5\xd8\x70\xec\x6a\xd3\xd9\x55\xcb\x9a\x5f\xd8\xd3\xba\xe3\ +\xcc\x7f\x62\x00\xf1\xd4\xc3\xdf\x1f\xff\x38\xbc\x28\xd5\x10\x6a\ +\x18\x8d\x13\x85\xa4\x99\x16\xb9\x59\xf5\x05\x0b\x31\x24\x68\x11\ +\x0c\x55\xda\xf6\x82\xb5\xe3\xc5\x2f\x2e\x03\x25\xf8\x33\xa7\x88\ +\x6b\x18\x8d\x55\xd6\xcc\xf5\x85\xcd\x1b\x7f\xd4\xfc\xbd\x69\xed\ +\xaa\xe7\x75\x25\x6c\xd2\x06\x10\x7b\xff\xf6\xd8\x89\xc3\x99\x86\ +\xde\xe6\x92\x19\x99\x0a\xa6\x6b\x21\x02\xb0\xe1\x45\x6f\x11\x60\ +\x15\x2f\x56\xfa\x90\x81\x3e\x82\xa7\x17\xdd\x15\xe0\xbe\x32\x07\ +\x19\xe3\x78\xa9\x5c\x64\x5c\x32\x44\x8e\xdf\xe8\x8d\x0e\xc5\xfe\ +\x9a\x79\xfa\x91\xd5\x2d\x9b\x8a\xd5\x58\xc6\x35\x80\x34\xcd\xc1\ +\x23\x47\xf7\xd7\x6c\xbc\x36\x0b\x42\x8e\x21\x89\x3b\x73\x81\x0b\ +\x0e\x67\x28\x2e\x67\xc8\xd5\x10\x8c\x56\x67\x0b\x1d\xd4\x59\x11\ +\xf7\x51\x33\x2e\x13\xae\x9a\x75\x52\x18\x1a\xbc\x4b\x1d\xa8\xd4\ +\x82\x5f\xb4\xc0\x49\x1e\xaa\xbd\xb8\x65\xc3\xfa\x27\xfd\x35\xe2\ +\x71\x0d\xd8\xf6\xe6\xae\xd5\x07\x8f\xb4\x7d\x56\xf3\x68\xff\x4c\ +\xa1\x9b\x54\x91\xc8\x50\x35\x05\x23\x10\x50\x85\x23\xbc\x58\xf5\ +\x35\x13\x90\xf9\xd4\x70\x8d\x1a\x6b\x80\x06\x2b\x67\xbd\x90\x78\ +\x91\x3c\x72\x94\x21\x0e\xf6\xb9\xad\xfa\x24\x9d\xf2\x9c\x27\xbf\ +\xa9\xed\xdd\xb2\x61\xdd\x33\x7b\xdf\xda\x79\x6c\x5c\x03\xd0\x6d\ +\x82\x07\x0e\x7d\x77\x3a\xb2\x26\x31\xcf\x08\x43\xc0\x0f\x5e\x4b\ +\xa8\x80\x60\xd9\x52\x56\xb1\xa0\xb7\x1a\xa4\x6c\xfa\xbe\x4c\x41\ +\xea\x5a\x0a\x6a\x9b\x2b\x61\xfa\xca\xa9\x42\x37\x14\xec\x61\x87\ +\xbb\x3e\x4f\xc0\x6d\xff\xac\x2b\x09\x46\xb3\x6e\xe7\xb9\x27\xcb\ +\xb4\x11\x59\x66\x8f\xb4\x4d\xef\xd8\xba\xf9\xe1\x66\x74\xa7\x7c\ +\xd1\x3c\xd0\xde\x73\xe9\x5d\x63\x4e\xaa\x81\x22\x8c\x70\x11\xb9\ +\x4f\xc5\xcc\xbb\xe0\xb5\x26\x24\xe0\xe2\x73\xc0\x35\x2a\x5a\x12\ +\x85\xaa\xd2\x1a\x70\xba\x0c\x48\x74\x0d\xc0\x88\x95\xa1\xda\x26\ +\xcc\x5a\x53\x0f\xf1\x19\xa5\x0a\xb8\xf2\x79\xe4\x73\x2c\x40\x60\ +\x69\xa5\x6c\xe9\x5e\x74\x23\x34\x42\xf0\xe6\x3c\xb9\xab\x0d\x86\ +\xda\xf8\x0e\x62\x42\x6c\xf5\xed\x3d\xbd\xef\xe0\x99\x57\x8b\x1a\ +\x70\xbe\xa3\x73\x39\x7f\xd0\x8c\x5a\x48\x00\x59\x10\x55\x02\xa7\ +\x90\xc8\x85\x3b\x04\x18\xa9\xe0\x80\xe8\x1b\x88\xc4\xe0\x4c\x3c\ +\x1a\xe1\xe2\x4d\x9b\x1b\xd5\x81\x25\x67\x53\xdc\x11\x71\x45\x8d\ +\x98\x60\x1a\xfd\x5f\x99\x90\x70\x92\x90\xb1\x4d\xa8\x5b\x5a\x05\ +\xb5\x2b\xaa\xe5\xb3\x03\x7c\xd3\xd5\x36\xc8\xbd\xe0\x88\x12\xa3\ +\xaa\x5f\x3a\x52\x10\xeb\x3d\x61\x93\x7f\x55\x67\x4a\xcf\xff\xd2\ +\xd5\x32\x6e\x26\xbe\xd0\xdd\x15\x98\xb2\x78\x24\x68\xa4\xbd\xca\ +\x93\x76\x1f\xa9\xc4\x41\x68\x54\x23\xa4\xb8\x64\x9e\x79\xe2\x0c\ +\xcf\xa5\x87\x47\xc4\xa3\x12\x5a\x39\x4e\x91\x09\x54\x44\x52\xaf\ +\x10\x44\xe0\xfa\xf1\x51\x48\xfe\x90\x80\x91\x5c\x06\x58\x35\x87\ +\x69\xeb\xab\x20\x52\x17\x56\xac\x59\xe9\x00\xcb\x53\xf5\xba\xca\ +\xc5\x05\xcd\xe7\xc1\x6b\x88\x71\x5c\x03\x46\x32\xe9\xc1\xdc\xa8\ +\x43\x29\x35\x60\xa0\xb4\x62\x0e\x53\x33\x4d\xcd\x91\x47\x5c\x09\ +\xb1\x0a\xf4\x66\x7a\x4c\x46\x29\xcb\xb2\x70\x15\xf2\x22\x17\x30\ +\xfc\x9e\x0d\xbe\xca\x18\xf7\x0a\xea\x54\x5f\x5d\xfb\x54\x0b\xae\ +\x46\x25\xb4\xf7\xfd\x09\x03\x43\x83\x2e\x71\x2e\x7e\x94\xab\x90\ +\x1f\xe5\x0e\x61\x9c\x88\x0b\xfd\x96\x4b\xb1\x96\x28\xba\x32\x17\ +\x3b\x5c\x3d\x81\xe0\xba\x92\xcf\xd4\x46\x64\x5e\xec\xd6\x7d\x9b\ +\xc9\x1a\xb9\x8b\xd4\x4d\x01\xe2\xd5\xb4\xa8\x1e\x56\x3c\xb1\x08\ +\x06\xc3\xd7\xa1\xf3\x4a\x37\xf4\xe6\x7a\xe0\x42\xa7\x04\xe8\x6e\ +\x6e\x5f\x62\xd3\x52\xd0\x4d\x7e\x94\xac\x93\x90\x26\x8c\x13\x19\ +\xb0\x3f\xd3\x0e\x5b\xa2\x8d\xbc\x8a\xd0\x70\xda\x5f\x0e\x14\x02\ +\xd5\x09\x07\xc7\xa4\xfe\xd5\x80\xd5\xe6\x54\x59\x96\x2a\xd8\x4b\ +\x1e\x9b\x0f\xf7\xad\x6e\x84\xce\x54\x27\x24\xcd\x24\xfc\x94\x3a\ +\x21\xaf\xb5\x6f\x2e\x82\xf2\x02\x7d\xea\x19\x03\xfa\x37\x49\x20\ +\x9c\x83\x7e\xbc\xd3\x17\xff\xa6\x99\x5e\xa9\x6c\xe1\xaf\xc5\xe6\ +\x40\x1d\x1b\xb3\x0f\x58\xc0\xab\xcc\xd2\x1e\x60\x41\xdf\x79\xda\ +\x94\x27\x42\xb0\x78\xe3\x5c\xb0\x2a\x72\x90\x18\xe8\x83\x5c\xde\ +\x2a\x1e\x46\x1d\xf0\xc5\x7f\xcf\xc7\xb5\xd0\xd6\x06\xf9\x35\x71\ +\xba\x83\x93\xba\xd9\x87\xea\xe6\xfd\x5b\xd1\x64\xfb\x2a\x1f\xe2\ +\xcf\xc6\xe6\xc2\x54\xbf\x11\x32\x91\x29\xe0\x14\x5a\xfd\x95\x15\ +\x3f\xb5\x30\x3c\x4e\x54\x90\x89\xb9\xcf\x4d\xf4\x4a\xba\x86\x10\ +\x78\x90\x86\x50\xa8\x55\x89\xcc\x07\xfe\x53\x04\xff\xfa\x64\x34\ +\xdf\x8b\xf1\x85\x7c\x5b\xf9\x12\xde\xa4\x4b\x46\xfe\xd2\x91\x1f\ +\xb4\xe1\x1f\x67\x3e\x01\x7a\x93\x01\x63\xa9\x04\x17\x89\xeb\x66\ +\x63\xb8\x3b\x3e\x74\x0a\x48\xb0\xee\x45\xf0\x1f\x4e\x9a\x8d\xa2\ +\x11\x75\x78\xf8\xa4\x6a\x25\x5f\x56\x3a\x1b\x6a\xdd\xd9\x35\xc6\ +\xce\xb8\xd7\x2f\x60\xa4\xc5\xc8\x1c\xf7\xc8\x9c\xb7\x1a\x7e\x32\ +\x27\xfb\x99\x2e\x21\xe3\x4f\xe2\x55\xcf\x21\xf8\xab\xb7\xa5\x07\ +\xe8\x09\x05\x1e\x3e\xa8\x58\xce\x17\x97\x3d\x00\xd3\x34\x85\xd6\ +\x33\x3d\x31\x9d\xf6\x62\xd1\xc4\x74\x5a\x82\x4f\xb7\xc3\x95\xc1\ +\x9f\xd9\xef\x78\xe6\xa5\xb1\x35\x88\xdb\x56\x64\x68\x48\x08\x0f\ +\x4f\xd3\xac\x54\x2c\xe5\xb3\xcb\xe6\x43\x3d\x3d\xe5\x02\xe6\x73\ +\x19\xc6\x6e\x41\xd0\x70\xbf\x4b\x71\xf3\x1c\x5c\x1e\xfa\x95\x75\ +\xe3\xa7\xcf\x69\xc5\x11\xb8\x75\x57\x44\x3d\x1a\xd4\x84\x87\xad\ +\xd8\x36\x87\xa7\xf1\xc6\x48\x3d\x94\x07\x2b\x20\x12\x28\xc3\x16\ +\x85\x90\x11\x81\x90\x60\xd0\x59\xb0\x6c\x6a\x26\x64\xf3\x43\x90\ +\xcd\x5e\x81\xe1\x1b\x97\x59\x1f\x0e\x1d\xc2\x76\x40\x3f\x9c\xba\ +\x2b\x9a\x18\x5d\x84\xfe\xda\x80\x24\x07\x4a\xc9\x06\xf5\x57\x87\ +\x30\xb6\x12\xd5\x82\xaa\x19\xbe\xda\x99\xa3\x5a\x5e\xb5\x9c\x6a\ +\x54\xe8\xa4\x7a\xcc\x28\x11\x01\x6c\x99\xf1\xea\x33\xff\xdb\xb2\ +\xca\x3f\x4d\xc3\x2f\x8a\xfb\x02\xd0\xf0\x00\x00\x00\x00\x49\x45\ +\x4e\x44\xae\x42\x60\x82\ +" + +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\x63\x58\x07\ +\x00\x73\ +\x00\x74\x00\x6f\x00\x70\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x08\ +\x08\x2f\x5a\x47\ +\x00\x62\ +\x00\x61\x00\x6c\x00\x6c\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x08\ +\x02\x8c\x59\xa7\ +\x00\x70\ +\x00\x6c\x00\x61\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\ +" + +qt_resource_struct = b"\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x02\ +\x00\x00\x00\x3e\x00\x00\x00\x00\x00\x01\x00\x00\x1a\x26\ +\x00\x00\x00\x28\x00\x00\x00\x00\x00\x01\x00\x00\x12\xd5\ +\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ +" + +def qInitResources(): + QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) + +def qCleanupResources(): + QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) + +qInitResources() diff --git a/src/tools/uav_viewer_py/uav_viewer.py b/src/tools/uav_viewer_py/uav_viewer.py new file mode 100755 index 000000000..18bc9ff66 --- /dev/null +++ b/src/tools/uav_viewer_py/uav_viewer.py @@ -0,0 +1,61 @@ +#!/usr/bin/python3 +# +# Copyright (C) 1997-2016 JDE Developers Team +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see http://www.gnu.org/licenses/. +# Authors : +# Alberto Martin Florido +# Aitor Martinez Fernandez +# + +import sys +import easyiceconfig as EasyIce +from gui.threadGUI import ThreadGUI +from parallelIce.cameraClient import CameraClient +from parallelIce.navDataClient import NavDataClient +from parallelIce.cmdvel import CMDVel +from parallelIce.extra import Extra +from parallelIce.pose3dClient import Pose3DClient +from gui.GUI import MainWindow +from PyQt5.QtWidgets import QApplication + +import signal + +signal.signal(signal.SIGINT, signal.SIG_DFL) + +if __name__ == '__main__': + ic = EasyIce.initialize(sys.argv) + camera = CameraClient(ic, "UavViewer.Camera", True) + navdata = NavDataClient(ic, "UavViewer.Navdata", True) + pose = Pose3DClient(ic, "UavViewer.Pose3D", True) + cmdvel = CMDVel(ic, "UavViewer.CMDVel") + extra = Extra(ic, "UavViewer.Extra") + + + app = QApplication(sys.argv) + frame = MainWindow() + frame.setCamera(camera) + frame.setNavData(navdata) + frame.setPose3D(pose) + frame.setCMDVel(cmdvel) + frame.setExtra(extra) + frame.show() + + + + t2 = ThreadGUI(frame) + t2.daemon=True + t2.start() + + sys.exit(app.exec_()) diff --git a/src/tools/uav_viewer_py/uav_viewer_py.cfg b/src/tools/uav_viewer_py/uav_viewer_py.cfg new file mode 100644 index 000000000..f94437f21 --- /dev/null +++ b/src/tools/uav_viewer_py/uav_viewer_py.cfg @@ -0,0 +1,6 @@ +UavViewer.Camera.Proxy = ardrone_camera:default -h 0.0.0.0 -p 9999 +UavViewer.Pose3D.Proxy = ardrone_pose3d:default -h 0.0.0.0 -p 9998 +UavViewer.CMDVel.Proxy = ardrone_cmdvel:default -h 0.0.0.0 -p 9995 +UavViewer.Navdata.Proxy = ardrone_navdata:default -h 0.0.0.0 -p 9996 +UavViewer.Extra.Proxy = ardrone_extra:default -h 0.0.0.0 -p 9994 +