easing.qrc

<!DOCTYPE RCC><RCC version="1.0">
 <qresource>
     <file>images/qt-logo.png</file>
 </qresource>
 </RCC>

ui_form.py

# -*- coding: utf-8 -*-


from PySide6.QtCore import (QCoreApplication, QMetaObject, QObject, QPoint,
    QRect, QSize, QUrl, Qt)
from PySide6.QtGui import (QColor, QFont, QIcon, QPixmap)
from PySide6.QtWidgets import *

class Ui_Form(object):
    def setupUi(self, Form):
        if Form.objectName():
            Form.setObjectName(u"Form")
        Form.resize(545, 471)
        self.gridLayout = QGridLayout(Form)
        self.gridLayout.setObjectName(u"gridLayout")
        self.easingCurvePicker = QListWidget(Form)
        self.easingCurvePicker.setObjectName(u"easingCurvePicker")
        sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.easingCurvePicker.sizePolicy().hasHeightForWidth())
        self.easingCurvePicker.setSizePolicy(sizePolicy)
        self.easingCurvePicker.setMaximumSize(QSize(16777215, 120))
        self.easingCurvePicker.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.easingCurvePicker.setMovement(QListView.Static)
        self.easingCurvePicker.setProperty("isWrapping", False)
        self.easingCurvePicker.setViewMode(QListView.IconMode)
        self.easingCurvePicker.setSelectionRectVisible(False)

        self.gridLayout.addWidget(self.easingCurvePicker, 0, 0, 1, 2)

        self.verticalLayout = QVBoxLayout()
        self.verticalLayout.setObjectName(u"verticalLayout")
        self.groupBox_2 = QGroupBox(Form)
        self.groupBox_2.setObjectName(u"groupBox_2")
        self.verticalLayout_2 = QVBoxLayout(self.groupBox_2)
        self.verticalLayout_2.setObjectName(u"verticalLayout_2")
        self.lineRadio = QRadioButton(self.groupBox_2)
        self.buttonGroup = QButtonGroup(Form)
        self.buttonGroup.setObjectName(u"buttonGroup")
        self.buttonGroup.setExclusive(False)
        self.buttonGroup.addButton(self.lineRadio)
        self.lineRadio.setObjectName(u"lineRadio")
        self.lineRadio.setChecked(True)

        self.verticalLayout_2.addWidget(self.lineRadio)

        self.circleRadio = QRadioButton(self.groupBox_2)
        self.buttonGroup.addButton(self.circleRadio)
        self.circleRadio.setObjectName(u"circleRadio")

        self.verticalLayout_2.addWidget(self.circleRadio)


        self.verticalLayout.addWidget(self.groupBox_2)

        self.groupBox = QGroupBox(Form)
        self.groupBox.setObjectName(u"groupBox")
        sizePolicy1 = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Preferred)
        sizePolicy1.setHorizontalStretch(0)
        sizePolicy1.setVerticalStretch(0)
        sizePolicy1.setHeightForWidth(self.groupBox.sizePolicy().hasHeightForWidth())
        self.groupBox.setSizePolicy(sizePolicy1)
        self.formLayout = QFormLayout(self.groupBox)
        self.formLayout.setObjectName(u"formLayout")
        self.formLayout.setFieldGrowthPolicy(QFormLayout.AllNonFixedFieldsGrow)
        self.label = QLabel(self.groupBox)
        self.label.setObjectName(u"label")

        self.formLayout.setWidget(0, QFormLayout.LabelRole, self.label)

        self.periodSpinBox = QDoubleSpinBox(self.groupBox)
        self.periodSpinBox.setObjectName(u"periodSpinBox")
        self.periodSpinBox.setEnabled(False)
        self.periodSpinBox.setMinimum(-1.000000000000000)
        self.periodSpinBox.setSingleStep(0.100000000000000)
        self.periodSpinBox.setValue(-1.000000000000000)

        self.formLayout.setWidget(0, QFormLayout.FieldRole, self.periodSpinBox)

        self.label_2 = QLabel(self.groupBox)
        self.label_2.setObjectName(u"label_2")

        self.formLayout.setWidget(1, QFormLayout.LabelRole, self.label_2)

        self.amplitudeSpinBox = QDoubleSpinBox(self.groupBox)
        self.amplitudeSpinBox.setObjectName(u"amplitudeSpinBox")
        self.amplitudeSpinBox.setEnabled(False)
        self.amplitudeSpinBox.setMinimum(-1.000000000000000)
        self.amplitudeSpinBox.setSingleStep(0.100000000000000)
        self.amplitudeSpinBox.setValue(-1.000000000000000)

        self.formLayout.setWidget(1, QFormLayout.FieldRole, self.amplitudeSpinBox)

        self.label_3 = QLabel(self.groupBox)
        self.label_3.setObjectName(u"label_3")

        self.formLayout.setWidget(2, QFormLayout.LabelRole, self.label_3)

        self.overshootSpinBox = QDoubleSpinBox(self.groupBox)
        self.overshootSpinBox.setObjectName(u"overshootSpinBox")
        self.overshootSpinBox.setEnabled(False)
        self.overshootSpinBox.setMinimum(-1.000000000000000)
        self.overshootSpinBox.setSingleStep(0.100000000000000)
        self.overshootSpinBox.setValue(-1.000000000000000)

        self.formLayout.setWidget(2, QFormLayout.FieldRole, self.overshootSpinBox)


        self.verticalLayout.addWidget(self.groupBox)

        self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)

        self.verticalLayout.addItem(self.verticalSpacer)


        self.gridLayout.addLayout(self.verticalLayout, 1, 0, 1, 1)

        self.graphicsView = QGraphicsView(Form)
        self.graphicsView.setObjectName(u"graphicsView")
        sizePolicy2 = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        sizePolicy2.setHorizontalStretch(0)
        sizePolicy2.setVerticalStretch(0)
        sizePolicy2.setHeightForWidth(self.graphicsView.sizePolicy().hasHeightForWidth())
        self.graphicsView.setSizePolicy(sizePolicy2)

        self.gridLayout.addWidget(self.graphicsView, 1, 1, 1, 1)


        self.retranslateUi(Form)

        QMetaObject.connectSlotsByName(Form)
    # setupUi

    def retranslateUi(self, Form):
        Form.setWindowTitle(QCoreApplication.translate("Form", u"Easing curves", None))
        self.groupBox_2.setTitle(QCoreApplication.translate("Form", u"Path type", None))
        self.lineRadio.setText(QCoreApplication.translate("Form", u"Line", None))
        self.circleRadio.setText(QCoreApplication.translate("Form", u"Circle", None))
        self.groupBox.setTitle(QCoreApplication.translate("Form", u"Properties", None))
        self.label.setText(QCoreApplication.translate("Form", u"Period", None))
        self.label_2.setText(QCoreApplication.translate("Form", u"Amplitude", None))
        self.label_3.setText(QCoreApplication.translate("Form", u"Overshoot", None))
    # retranslateUi

easing.py

from PySide6 import QtCore, QtGui, QtWidgets

import easing_rc
from ui_form import Ui_Form


class Animation(QtCore.QPropertyAnimation):
    LinearPath, CirclePath = range(2)

    def __init__(self, target, prop):
        super(Animation, self).__init__(target, prop)
        self.setPathType(Animation.LinearPath)

    def setPathType(self, pathType):
        self.m_pathType = pathType
        self.m_path = QtGui.QPainterPath()

    def updateCurrentTime(self, currentTime):
        if self.m_pathType == Animation.CirclePath:
            if self.m_path.isEmpty():
                end = self.endValue()
                start = self.startValue()
                self.m_path.moveTo(start)
                self.m_path.addEllipse(QtCore.QRectF(start, end))

            dura = self.duration()
            if dura == 0:
                progress = 1.0
            else:
                progress = (((currentTime - 1) % dura) + 1) / float(dura)

            easedProgress = self.easingCurve().valueForProgress(progress)
            if easedProgress > 1.0:
                easedProgress -= 1.0
            elif easedProgress < 0:
                easedProgress += 1.0

            pt = self.m_path.pointAtPercent(easedProgress)
            self.updateCurrentValue(pt)
            self.valueChanged.emit(pt)
        else:
            super(Animation, self).updateCurrentTime(currentTime)

# PySide6 doesn't support deriving from more than one wrapped class so we use
# composition and delegate the property.
class Pixmap(QtCore.QObject):
    def __init__(self, pix):
        super(Pixmap, self).__init__()

        self.pixmap_item = QtWidgets.QGraphicsPixmapItem(pix)
        self.pixmap_item.setCacheMode(QtWidgets.QGraphicsItem.DeviceCoordinateCache)

    def set_pos(self, pos):
        self.pixmap_item.setPos(pos)

    def get_pos(self):
        return self.pixmap_item.pos()

    pos = QtCore.Property(QtCore.QPointF, get_pos, set_pos)


class Window(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)

        self.m_iconSize = QtCore.QSize(64, 64)
        self.m_scene = QtWidgets.QGraphicsScene()

        m_ui = Ui_Form()
        m_ui.setupUi(self)
        m_ui.easingCurvePicker.setIconSize(self.m_iconSize)
        m_ui.easingCurvePicker.setMinimumHeight(self.m_iconSize.height() + 50)
        m_ui.buttonGroup.setId(m_ui.lineRadio, 0)
        m_ui.buttonGroup.setId(m_ui.circleRadio, 1)

        dummy = QtCore.QEasingCurve()
        m_ui.periodSpinBox.setValue(dummy.period())
        m_ui.amplitudeSpinBox.setValue(dummy.amplitude())
        m_ui.overshootSpinBox.setValue(dummy.overshoot())

        m_ui.easingCurvePicker.currentRowChanged.connect(self.curveChanged)
        m_ui.buttonGroup.idClicked.connect(self.pathChanged)
        m_ui.periodSpinBox.valueChanged.connect(self.periodChanged)
        m_ui.amplitudeSpinBox.valueChanged.connect(self.amplitudeChanged)
        m_ui.overshootSpinBox.valueChanged.connect(self.overshootChanged)

        self.m_ui = m_ui
        self.createCurveIcons()

        pix = QtGui.QPixmap(':/images/qt-logo.png')
        self.m_item = Pixmap(pix)
        self.m_scene.addItem(self.m_item.pixmap_item)
        self.m_ui.graphicsView.setScene(self.m_scene)

        self.m_anim = Animation(self.m_item, b'pos')
        self.m_anim.setEasingCurve(QtCore.QEasingCurve.OutBounce)
        self.m_ui.easingCurvePicker.setCurrentRow(int(QtCore.QEasingCurve.OutBounce))

        self.startAnimation()

    def createCurveIcons(self):
        pix = QtGui.QPixmap(self.m_iconSize)
        painter = QtGui.QPainter()

        gradient = QtGui.QLinearGradient(0, 0, 0, self.m_iconSize.height())
        gradient.setColorAt(0.0, QtGui.QColor(240, 240, 240))
        gradient.setColorAt(1.0, QtGui.QColor(224, 224, 224))

        brush = QtGui.QBrush(gradient)

        # The original C++ code uses undocumented calls to get the names of the
        # different curve types.  We do the Python equivalant (but without
        # cheating)
        curve_types = [(n, c) for n, c in QtCore.QEasingCurve.__dict__.items()
                        if isinstance(c, QtCore.QEasingCurve.Type) \
                            and c != QtCore.QEasingCurve.Custom    \
                            and c != QtCore.QEasingCurve.NCurveTypes \
                            and c != QtCore.QEasingCurve.TCBSpline]
        curve_types.sort(key=lambda ct: ct[1])

        painter.begin(pix)

        for curve_name, curve_type in curve_types:
            painter.fillRect(QtCore.QRect(QtCore.QPoint(0, 0), self.m_iconSize), brush)
            curve = QtCore.QEasingCurve(curve_type)

            painter.setPen(QtGui.QColor(0, 0, 255, 64))
            xAxis = self.m_iconSize.height() / 1.5
            yAxis = self.m_iconSize.width() / 3.0
            painter.drawLine(0, xAxis, self.m_iconSize.width(),  xAxis)
            painter.drawLine(yAxis, 0, yAxis, self.m_iconSize.height())

            curveScale = self.m_iconSize.height() / 2.0

            painter.setPen(QtCore.Qt.NoPen)

            # Start point.
            painter.setBrush(QtCore.Qt.red)
            start = QtCore.QPoint(yAxis,
                    xAxis - curveScale * curve.valueForProgress(0))
            painter.drawRect(start.x() - 1, start.y() - 1, 3, 3)

            # End point.
            painter.setBrush(QtCore.Qt.blue)
            end = QtCore.QPoint(yAxis + curveScale,
                    xAxis - curveScale * curve.valueForProgress(1))
            painter.drawRect(end.x() - 1, end.y() - 1, 3, 3)

            curvePath = QtGui.QPainterPath()
            curvePath.moveTo(QtCore.QPointF(start))
            t = 0.0
            while t <= 1.0:
                to = QtCore.QPointF(yAxis + curveScale * t,
                        xAxis - curveScale * curve.valueForProgress(t))
                curvePath.lineTo(to)
                t += 1.0 / curveScale

            painter.setRenderHint(QtGui.QPainter.Antialiasing, True)
            painter.strokePath(curvePath, QtGui.QColor(32, 32, 32))
            painter.setRenderHint(QtGui.QPainter.Antialiasing, False)

            item = QtWidgets.QListWidgetItem()
            item.setIcon(QtGui.QIcon(pix))
            item.setText(curve_name)
            self.m_ui.easingCurvePicker.addItem(item)

        painter.end()

    def startAnimation(self):
        self.m_anim.setStartValue(QtCore.QPointF(0, 0))
        self.m_anim.setEndValue(QtCore.QPointF(100, 100))
        self.m_anim.setDuration(2000)
        self.m_anim.setLoopCount(-1)
        self.m_anim.start()

    def curveChanged(self, row):
        curveType = QtCore.QEasingCurve.Type(row)
        self.m_anim.setEasingCurve(curveType)
        self.m_anim.setCurrentTime(0)

        isElastic = (curveType >= QtCore.QEasingCurve.InElastic
                    and curveType <= QtCore.QEasingCurve.OutInElastic)
        isBounce = (curveType >= QtCore.QEasingCurve.InBounce
                    and curveType <= QtCore.QEasingCurve.OutInBounce)

        self.m_ui.periodSpinBox.setEnabled(isElastic)
        self.m_ui.amplitudeSpinBox.setEnabled(isElastic or isBounce)
        self.m_ui.overshootSpinBox.setEnabled(curveType >= QtCore.QEasingCurve.InBack
                                          and curveType <= QtCore.QEasingCurve.OutInBack)

    def pathChanged(self, index):
        self.m_anim.setPathType(index)

    def periodChanged(self, value):
        curve = self.m_anim.easingCurve()
        curve.setPeriod(value)
        self.m_anim.setEasingCurve(curve)

    def amplitudeChanged(self, value):
        curve = self.m_anim.easingCurve()
        curve.setAmplitude(value)
        self.m_anim.setEasingCurve(curve)

    def overshootChanged(self, value):
        curve = self.m_anim.easingCurve()
        curve.setOvershoot(value)
        self.m_anim.setEasingCurve(curve)


if __name__ == '__main__':

    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Window()
    w.resize(600, 600)
    w.show()
    sys.exit(app.exec_())

easing_rc.py

# Resource object code (Python 3)
# Created by: object code
# Created by: The Resource Compiler for Qt version 5.14.0
# WARNING! All changes made in this file will be lost!

from PySide6 import QtCore

qt_resource_data = b"\
\x00\x00\x14\x1d\
\x89\
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
\x00\x00.\x00\x00\x007\x08\x06\x00\x00\x00s`xd\
\x00\x00\x13\xe4IDATx\x9cb\xfc\xff\xff?\xc3\
\xdf\x7f\x7f\x99\x99\x99\x98\xff>x\xf1Xf\xe9\x9eU\
\x09\x87/\x9e\xb6y\xf7\xe9\xad\x98\xa4\xf2?~Q\xb9\
\xbf\xfc\xcc\x1c?\xf8\xfe\xfd\xff\xc7\xca\xc5\xc6\xf7F\x9c\
[\xf6\x96$\xaf\xd25)>\xa5\xcb\xd2\xbcJ\xd7\xc4\
xd\xef\x08p\x8a>ccf\xff\xc5\x80\x05\xfcg\
\xf8\xcf\xf4\xef\xff?&\x06\x86\xff\x0c\x8c\x0c\x8c\xff\x19\
\x19\x18\xff30Bi\x0a\x00\x00\x00\x00\xff\xffb\xfc\
\xfb\xf7/3\x13\x13\xd3\xdfY\x9b\x17\xa6T\xcfm\xed\
}\xf3\xe6\x0d\x1f\x17/\xdb\x7f{/aFYEN\
\x06\x86\x7f\x8c\x0c\x0c\xff\x99\x18\x18\x18\x18\x18\xfe\xfd\xff\
\xc7\xf0\xe7\xdfo\x86\x7f\xff\xff00002\xb00\
\xb12p\xb2\xf0|\xe3c\x17z&\xcc%u_\x9c\
G\xee\xa6\x04\x8f\xc2u\x09^\x85\x9b\xa2\x5cR\xf7\x05\
8\xc5\x9e\xb1\xb3p\xfc\xc0n\xf5\x7f\xc6\x7f\xff\xff1\
\xc39$z\x08\x00\x00\x00\xff\xffb\xfc\xff\xff?\xc3\
\xa4\xb5\xb3s\xf2\xbb\xf3&s\xf2\x09\xffcgc\xfb\
\xef\x1e,\xc4 !\xc3\xc6\xf8\xed\xeb?FF\x889\
\x8cp\x0b\x18\x99\xfe320\xfcg```\xf8\xff\
\xff?\xd3\xbf\xff\x7f\x19\xff\xfc\xff\x03\xf1\xd0\xbf?\x0c\
\xff\x19\xfe3\xb00\xb22\xb0\xb3p\xff\xe5g\x17~\
!\xcc%y_\x8cG\xee\xa6\x14\xaf\xe2u\x09\x1e\x85\
\xeb\xa2<2w\x859%\x9ep\xb0r}\xc5\xe7\xa1\
\xffpK\x19\xff1b\xf1\x10\x00\x00\x00\xff\xffl\x92\
\xbd\x0a\xc20\x14F\xbf/\x16\x7f\xd2\x06!\x83\xc6A\
\xc5]p\xec\xa8\xbb\xcf\xe2k\xbavp(\xa8\x83\xe0\
\xd6\xb1\x88 $\xf7:\x88[^\xe0\x1c\x0e\x1c6\xb7\
\xcbv\x7f:\x9e\x85\xea\xe2\x87\xb2\xabKS\x1f\xa6x\
\xbf\x04f\x90\x03gL\xa0\xfe\x0a\xa9\xc4\x7f\x8fd\xa2\
D$\x89H\x1a\xa1*0,0.\xac\xb8\x91\xef\xfc\
$<f\xe5\xf2\xbap\x9b6T\xebv^\xad\xee\xde\
\x86\xa7\x1d\xba\x9ey\x0fE\xc5(\x94\x04\xf0\x05\x00\x00\
\xff\xffb\x99\xbcvV\xee\xa7\xef_y\xf9\xb9\xf9\xfe\
2\xb2\xffeV\xd6\xe4b\xf8\xfd\xeb?\x03#\x13Q\
\x8ef````\xfc\xcf\xf0\x9f\xf1\xff\x7f\xf4\x18f\
\xfc\xcf\xca\xc4\xf6\x9f\x8d\x99\x1d\xc9C\x0c\x8c\xff\xfe\xff\
e\xfe\xf8\xe3\xb5\xc4\xbb\xef\xcf$n\xbc9e\x01\xf1\
\x103\x03;3\xe7\x7f\x1e6\xc1\xb7\x82\x9c\xe2\x0f\xc5\
ydo\x8b\xf3(\x5c\x97\xe4U\xb8.\xce#w[\
\x98K\xe2\x11\x0f\x9b\xc0;&F\xa6\xbf0\xd3\x01\x00\
\x00\x00\xff\xffbT\x894\xbe\xfb\xf4\xed\x0b%\x86\xff\
\xcc\xff\x85DX\x18\xbd\xc3E\x88v1\xb9\x00\x9a\x9e\
\xff1\xa2y\xe8\xef\x7fH\x0c\xfd\xf9\xf7\x9b\xe1\xff\xff\
\x7f\x0c\x8c\x8c\xcc\x0cl\xcc\x1c\x0c<\xac\xfc\x1f\x049\
\xc5\x1e\x89r\xcb\xde\x91\xe0Q\xb8&\xc9\xabp\x03\x00\
\x00\x00\xff\xff\xbc\xd1\xb1\x0d\x800\x10\x03@;\x05T\
T\xb4\x912\x0e\xa2e\xffE\xc8\xff\xdbT\x94\xb4\x8c\
p:n\xe7\xb8\x01/s\x1a}\xac8\xae\x1d\x11\x06\
?\xbe~\x00\x99\xa0^\x90\xadVN\x96\x02\xa9\x84\x5c\
 \x1b\x1e\x00\x00\x00\xff\xff\xb4\x92!\x12\x00 \x0c\xc3\
\xda[\x81\xff\x7f\x98\xa0&p\x18*s\x11\x11\x0d0\
\xdd\xd6\xfb=\xbe\x0ca\x81\x91\xae\x92r\xa8\x0c\x96\xbc\
\x9b\x1d\x00\x00\x00\xff\xff\x94\x94\xb1\x0d\x00 \x0c\xc3\xdc\
\x96\xffOv\x19\xd8\x10Bp@ly\xc9\xd8\x96\x7f\
\x22!3\xa8*l\xd1\x05\xc8\x08\xd6'4\xb6W\xc6\
\x93\xe7\x104\x01\x00\x00\xff\xff\x8c\x91\xc1\x0a\x80 \x10\
\x05g\xdd5\xa5\xfe\xff;\x83(A\xad\xadKg\xeb\
\xddg\x18x6\x02F\xc1jB\x9e\x8d\xbd\x1c\xac[\
!j$M\x09\x01\xaa7N\xefh0\xb2-\x04Q\
\xfc\xbe>\xac\xef\xed?\xf7\x00\x00\x00\xff\xff\x22\xd9\xe1\
\xff\xff10pp23|\xfb\xfa\x87\xe1\xf4\xc9\xc7\
\x0cR\x5c\xea\x0c^&>\x0c\xc6\xaa\x86\x0c\xa2\x02\x22\
\x0c\x8c\x8c\x0c\x0c_~}`x\xf6\xe9\x1e\xc3\xb5\xd7\
'\x19\xae\xbe:\xc1\xf0\xf5\xf7'\x06nV>\x9c\x8e\
gdd`\x80\x95JL\x8cL\x0c\xff\xff\xffg\xf8\
O\xc0\x13\x00\x00\x00\x00\xff\xff\x22\xc9\xe1\xff\xffC\x1c\
}\xe7\xc6\x17\x86\xa3\xfb\xde2T\x84T0\x14\x85g\
0\xb0\xb3\xb32\xfc\x87T\xe9p\xb5Zb\x16\x0c\xae\
*\xd1\x0c\xcf??`Xsu\x22\xc3\xe9';\x19\
\xb8\xd8\xf8\x180\x8bM\x06\x86_?\xff1\xb0\xb0\xb0\
002\xfde\xf8\xf6\xfb\x0b\x03\x0b\x13\x0b\x03+\x13\
;^\xc7\x03\x00\x00\x00\xff\xff\x22:;\xfe\xff\xc7\xc0\
\xc0\xce\xc1\xc4p\xe3\xf2W\x86\x9dk_0\xcc.\x9c\
\xceP\x19\x97\xcb\xc0\xc2\xca\xc4\xf0\xf7\xdf_\x86\xff\xff\
\xff\xc1+\x9b?\x7f\x7f3\xfc\xfe\x03)\xd2$y\xe5\
\x19r-\xfa\x19Bt\xf2\x19\xbe\xfd\xfa\xcc\xc0\x04-\
\x01\xfe\xffg``ecdx\xf5\xec\x0f\xc3\x92Y\
\x0f\x18<\xc4K\x18\xba\xbc62\xd4\xd8/f0\x94\
td\xf8\xf1\xe7\x1b\x5c-6\x00\x00\x00\x00\xff\xff\x8c\
\xd4!\x0e\xc2@\x10@\xd1?3\xbbu\x0d\x06\x01\x0e\
S\x82D5X$\xa6\x12\x8d \xe1\x04xn\xc4\x01\
\xb8\x0ci\x10\x08\x0cI1]\xb6\x83B\x92p\x82\xff\
\xd4\xff\x0b\xfe\x8d<\xee\x99\xcb\xf9\xcai\x7fd\xbbn\
\xe8SBE15D\x14\xd3\x80I X\xa4\x08\x05\
\x0e\x0c\xeed\xcf4\x8b\x03\x9b\xf9\x8e\xae\x7f\xa2b\xb8\
;\xaa\xc2\xad}\x11\xbd\xa4\xaeV\x8c\xe2\x94j\xbcd\
R\xcex\x0f\x09\xf8\xfd\xe4\x0f\x00\x00\x00\xff\xff\x22:\
\xc4\x19\x19\x99\x18\x0e\xee~\xce\xa0\xa9\xac\xcbP\x16\x95\
\xcb\xc0\xc0\xc0\xc0\xc0\xca\xc2\xc2\xc0\xc8\xc8\xc8\xf0\xff?\
$\x99\xdcx{\x92\xa1fC:\x83Oe\x04\xc3\xda\
C[\xa0!\xc6\x08\x0f\xb9\x10\xed<\x06EAm\x86\
\x9f\x7f\xbe10313\xfc\xff\xc7\xc8\xf0\xf4\xf1\x17\
\x06m%U\x06\x19Qi\xa8c\x19\x18\xfe\x13Q\x12\
\x01\x00\x00\x00\xff\xff\x84\xd4+\x0e\xc2@\x14F\xe1\xf3\
\xdf\xa6L\x05\xeb@\xa0P,\x02\x0dIu\x05\x0e\xc9\
\x1eX\x09\x8a-\x90`p$x\x12\x14b\x12\x02\x02\
\x0c\x8f\xb6w\xb0\x18\xc2\x0e\x8e\xf8r\xfe\x86\xa7\x04\x9d\
 \xe2\xe9M<\xde\x99M*B^\xd0\xb4\x0d\x92\xf0\
\xe4H\xe2p\xdd\xb3\xd8L\x89\xb6\xe5\xd6\xdd1\x9e\x97\
,\xd7+L\xc2\xdd\xf1\xd4\x92g\x81Q\xaf\xa2\xf6\x1a\
\x99x=\xc4\xe5\xfcd\xd8\x1f\x00|\xed4\xc3d\x98\
\x0c\xfd\xe0\xf2\x01\x00\x00\xff\xff\x22\x1c\xe2\xff!e\xf5\
\x8d+\x1f\x19\x04\x84\xc4\x19\xfc\xad=\x19\x18\x18\x18\x18\
\x98\xa1-0Xdn\xbe1\x8b\xe1\xdf\xff\xbf\x0c\xec\
\x0c\x02\x0c\xa6\xe6\x92\x0cr\x9a\x22\x0cU3\xda\x18\xbe\
\xff\x82\x84.#\xb4\x086\x94t`\x90\xe1Wf`\
b\xfd\xc5\xf0\xf2\xc5g\x86\xdf/\xdf3X\xe9\x98 \
,c``\xf8\xf5\xf7;\xc3\xd7\xdf\x9f\x18\xbe\xff\xf9\
\xca\xf0\xeb/\xf6V1\x00\x00\x00\xff\xff\x22\xe8p&\
f\x06\x86\x9f\xdf\x19\x18\xee\xdf\xfb\xc8`\xa9c\xc4 \
%,\x09\x0f\xe5\xff\x0c\xff\x19\x18\x19\x99\x18>\xfcx\
\xcd\xf0\xe0\xfdU\x06\x0e\x16.\x86?\xff~3\xfc\xfe\
\xf3\x87ASG\x90\xe1\xe1\xe3\xfb\x0c\x07.\x1c\x85\x84\
\xe6\xff\x7f\x0c\x7f\xff\xfde`g\xe1d\xe0\xfdd\xc4\
\xb0b\xfeC\x86d\xd3F\x86\xcd3v0\xb8\x988\
@\x03\x03R\xc8)\x08j3\x98\xc9\xb83h\x88\x98\
0H\xf2(`u\x17\x00\x00\x00\xff\xff\xc2[\x1c\xfe\
\xff\xcf\xc0\xc0\xc2\xc2\xc8\xf0\xfe\xdd_\x86\xef\xef\x7f0\
X\xe9\x9aB\x1c\xf1\xef\x1f\x03\x133\xa4\xbcedd\
dx\xf9\xe5!\xc3\x97_\x1f\x19\xd8Y\xb8 \xc9\xe2\
\xef\x7f\x06a16\x06\x06\xe6\x7f\x0c\xa7\xae\x9dc\xf0\
4s\x85\xe7\x03\x06\x06\x06\x06MQ3\x86w\x8f\xfa\
\x19T\xc5\xb4\x194\xe5\xd5\x18\xfe\xfe\xfb\x0bu8$\
\x16-e\xbd\x19,d<\x19\x18\x19\x99\x18\x9e\x7f\xbe\
\xcf\xd0\xb0/\x02\xc3m\x00\x00\x00\x00\xff\xff\xc2\x1f\xe2\
\xff\x19\x18\x98\x98\x19\x19\xde\xbf\xfd\xcd\xc0\xf0\x8f\x99A\
_E\x8b\x81\x81\x81\x81\x81\x11\xde\x02\x83D\xed\x9bo\
\xcf\x19\xfe\xfc\xfb\xcd\xc0\xc8\xc0\xc8\xc0\xc8\x08I\xab\x9c\
\xdcL\x0c\xcc\x5c,\x0c7\x1f\xdf\x83\xebad\x82\xe8\
\xd3S\xd1d\xe0\xe2\xe3g\xf8\xf3\xf7\x0fn\x8b\x09T\
@\x00\x00\x00\x00\xff\xff\x22\x98T\x18\x19\x19\x18>\xbc\
\xff\xc5\xc0\xc4\xce\xc9\xa0 !\x07\x11\x83\x86\x1c\xcc\xe8\
O?\xdeB\x9a\xa1P\xfe\xbf\x7f\x0c\x0c\xac\xac\x0c\x0c\
\xdc\xdc\xac\x0c\xcf\xdf\xbc\x84X\xc4\xc8\x04\xd7'%,\
\xc1\xa0\xa9&\xc5p\xf1\xfe%\x86\xa7\xaf\x9f\xc3C\x1a\
\x06\xfe\xfc\xfd\xcb\xf0\xfb\xcf?\x14\xbb\xd0\x01\x00\x00\x00\
\xff\xff\x22\x5cs\xfeg`\xf8\xfc\xe97\x03/\x177\
\x83(\xbf0\xd43\xd0N\x15T\xc9\xb7\xdf\x9fQ<\
\xc2\xc0\x00\xc9\x1b\x1c\x1c,\x0c\xef?\x7f\x82\xeb\xf9\x0f\
\x0dINvN\x86\x88(-\x86\xd4\xced\x06\x13i\
\x17\x86\xc3S72\xfc\xff\xff\x9f\xe1\x1f\xc3?\x06f\
Ff\x86\xed7\x172\xec\xba\xbd\x82A\x84[\x92\x01\
\xa9\xef\x80\x02\x00\x00\x00\x00\xff\xff|\x95M\x0a\x80 \
\x18D\x9f\xf9C\x88P\xf7\xbf['\x886-41\
\xfdZ\xb8\x11\x8a\xf6\x03\xf3\x86\x19\x98\x7fp\xd5w\x9e\
b!\xf8\x85\xe0\xc3\xa7,\xdf\x91\xf1,DzS\xce\
i\xe2\x95(\xb5`\xb5\x05\x81\x860)\x85\xb7+\xd6\
\x18\x8c\x1e\x11z\xf4\xd4N\xf6\xbc\x91\xe4\xa0\xb6\x8a\xd3\
\xf3\xcb\xf3\x01\x00\x00\xff\xff\x84\x97\xc1\x0a\x800\x0cC\
_\xb7\xae\x9b\xc5\xff\xffW\xad\x16\x0f\x9ed\x03\xef!\
y\x10\x08\xe4\x7f\xc7\x81\x88d\xb3AW[j\x22c\
:\x1e\x22\xa0Z8\xe2\xe4\xbac\x82\xf3\xb6\x93\x99|\
{zM\x8aT\x9a\x0c\xac:]}\x99\xf9\x00\x00\x00\
\xff\xff\x22\xaa\x1c\xff\xfb\xf7?\x03\x0b33\x03\x13\x13\
\x13\xb2\xf9p\x00i\xf5\xa1\xbb\x1c\x92\xb1\xff\xfe\xfb\x0b\
u *`eb\x83&\x1dli\x18\xd2:\xfc\xff\
\xff\x1f\xceZ\x14\x00\x00\x00\xff\xff\x22\xb2\xad\x02)\xf6\
\x18q\xf6\xe7\xb0\x97\x00\x8cP)l\xb2L\x8c\xc4\x0d\
!\xe0\x02\x00\x00\x00\x00\xff\xff\x22\xca\xe1LL\x8c\x0c\
\x7f\xff\xfdc\xf8\x87\xa5I\xca\xc0\xc0\x80\xbdZ\x86:\
\x98\x91\x11{\xb9@i\xcf\x08\x00\x00\x00\xff\xff\x22\xaa\
8da\x85\xa4\xd5\xdf\x7f~\xc3\x1d\x85\x0cX\x18Y\
\xb1\xb6\x9d\xff\xfd\xfd\xcf\xc0\xcc\xc4\xc4\xc0\x84e\x80\xe6\
\xf7\xbf\x9f\xd0\xa2\x8e\xbc\x918\x00\x00\x00\x00\xff\xff\x22\
\x1c\xe2\x8c\x0c\x0c\xec\xec,\x0c\xdf~|g\xf8\xf1\x0b\
{\xbb\x81\x95\x99\x1d\xc3\xfe\xff\x0c\x0c\x0c\x7f\xfe\xfec\
`eee`aFv8$\xfc\x7f\xfc\xf9\x06-\
\x22\xc9\x03\x00\x00\x00\x00\xff\xff\x22Xs2220\
psC\xfa\x96\x1f\xbf~\x82\x0a\xff\x87;\x8e\x81\x81\
\x81\x81\x93\x95\x9b\x012\xa8\x89p\xda\xff\x7f\x0c\x0c\xbf\
\x7f\xfde\xe0d\xe7\x80\x14\x85P\x09X>\xf9\xfa\xeb\
#$\x89\x91\xe9r\x00\x00\x00\x00\xff\xff\x22*\x8d\xf3\
\xf2\xb12|\xff\xf1\x8d\xe1\xe5\xfb\xd7\x10\x07\xffG8\
\x90\x81\x81\x81\x81\x87M\x80\x81\x81\x01)\xf4\x18!\x0e\
\xff\xf9\xf3/\x03\x1f\x17/D\x0e\xaa\x89\x91\x81\x91\xe1\
\xcf\xbf\xdf\x0c\x9f~\xbec`fd!\xd8\xb7\xc4\x05\
\x00\x00\x00\x00\xff\xff\xc2\xefp\xa8\x03\xf8\x05\xd9\x18\x18\
\xfe\xfcd\xb8\xf7\xec!\xd4\xe1\xa8\x96\x09p\x88\xa2t\
\xb3\x18\x19\x19\x18\xfe\xfc\x81T\x5cb\x82B\x0c\x0c\x0c\
\x90\x9e\x10\xcc\x8d\x9f~\xbe\x838\x9c\x89\x85\x81\xdc \
\x07\x00\x00\x00\xff\xff\x22\x18\xe2\x7f\xff\xfdg\xe0\x17d\
a``a`\xb8x\xe7*\x9a\xbf a.\xc2%\
\xc5\xc0\xc6\xc2\x09))\xa0\xed\xf7\x9f?\xfe3\xfc\xfc\
\xf6\x87A^B\x06\xeeYX\xe8\xbe\xfc\xf2\x88\xe1\xeb\
\xaf\x8f\x0c\xcc\x8c\xccd\xa7q\x00\x00\x00\x00\xff\xff\xc2\
\xebpFF\x06\x86\xbf\x7f\xfe3\xf0\xf011\xf0\x0a\
s2\x9c\xbcz\x8e\x81\x81\x81\x81\x81\x19^\x11A\x1c\
.\xca-\xc3 \xc0.\xc2\xf0\x17\xdaOdbf`\
\xf8\xfc\xe1\x0f\x03\xc3\xaf\xff\x0c\xba\xca\x9aP\xd3\x10-\
\xbe{\xef.3\xfc\xfe\xfb\x0b\x9a\xc6\x91\x9d\x8eHN\
L\x8cL\x0c\xac,,\x0c\xcc\xcc\xd8\xcb{\x00\x00\x00\
\x00\xff\xff\x22\x5c\xe5\xffc``eg`PP\xe2\
g8{\xe32\xc3\xa3W\x8f\xa1]6H\xfb\xfa\xdf\
\xff\x7f\x0c\x9c\xac<\x0cJB:\x0c\xbf\xfe\xfdd`\
d`b`bbdx\xfa\xe8;\x03+'/\x83\
\x8d\xae\x05\xc4\x22\xa4n\xd8\xb5W'\x18X\xa0\xc9\x04\
\xa5<\x87\xfa\x81\x87M\x90\xe1\xeb\xef\x8f\x0c/\xdf\xbd\
ax\xf7\xf1#\xd6\x16\x22\x00\x00\x00\xff\xff\x22\xaa8\
\xfc\xf7\xf7?\x83\x9a\x06/\xc3\xe7\x8fo\x186\x1f\xdb\
\xc9\xc0\xc0\xc0\x80Q\x8d\xdb+\x860\xfc\xfb\xfb\x97\x81\
\x99\xed\x1f\xc3\xcfoL\x0c\xa7\x8e>`\x08u\xf2f\
P\x93Qa\xf8\xf7\xef\x1f\x03##$$\x9f|\xba\
\xc3p\xfb\xedE\x06\x0eV.\x06V6&\x86\xcf\xdf\
\xbe000@jfXmj%\xef\xc5`-\x92\
\xc0\xa0\xfc'\x80!Uw\x02\x83(\x8f4$\x86\x90\
<\x00\x00\x00\x00\xff\xff\x22\xaa\x02\xfa\xfd\xeb?\x83\x84\
\x0c\x1b\x83\x84\x12\x1f\xc3\xf4\xf5\x8b\x18~\xfd\xf9\xc5\xc0\
\xc2\xcc\xcc\xf0\x9f\xe1?|\xe4I[\xcc\x82!L/\
\x9f\xe1\xd3\xa7\xef\x0c[\xd6=d\xb0\xd5sa\x98\x98\
\xd7\x0a5\x83\x91\xe1\x1f\x03\xc4\xa3\xfb\xef\xadb\xf8\xfa\
\xeb\x13\x03\x0b\x0b3\x83\x98\x18'\xc3\xc3\x17O\x19\x9e\
\xbf{\x01\x0dpH\x90\xf3\xb2\x093\x14\xb9\xb60\xb4\
%\xb418\xe9:3\xc0\x87\xe7\x90\x9a\x1c\x00\x00\x00\
\x00\xff\xff\x22\xae\xad\xc2\xc0\xc0\xf0\x9f\xf1\x1f\x83\xad\x93\
\x04\xc3\xd5[\x17\x19\xa6\xac\x9b\xcd\xc0\xc0\xc0\xc0\xf0\xfb\
\xcf\x1f\xb8\xc3\xfe\xff\xff\xcf\xe0\xa7\x91\xc1Pg\xb7\x86\
aM\xf9F\x86\xbd\x13\xd70\x88\xf0\x8b@\xc6V\x18\
\xfe203\xb20\xdc{w\x99\xe1\xd0\x83\xf5\x0c\xdc\
l|\x0c\xbf~\xfdfP\xd7\xe1g\xf8\xf8\xf1\x15\xc3\
\xca=\x9b \xf6\xfc\x83\xe5\x03\xb4!8,9\x18\x00\
\x00\x00\xff\xff\x22j\x08\x8e\x91\x91\x81\xe1\xf7\xcf\xff\x0c\
\x122,\x0c\xd6\xee2\x0c\x95S\xdb\x18L5\x8d\x18\
lu-\x19~\xff\xf9\xcd\xc0\xc4\xc4\xc4\xc0\xcc\xc4\xc4\
\xf0\xff\xff?\x06U)U\x06U)H)\x02I\xbf\
\xff\x19\x98\x19Y\x18>\xfd|\xc70\xe7l-\xc3\xdf\
\x7f\xbf\x19\xd8Y8\x19~\xff\xfe\xc7 $\xc6\xcc\xe0\
\x1a(\xcb\xd0\xb1\xaa\x9bA\x5cX\x94!\xc4\xde\x9f\x81\
\x99\x81\x91\xe1\xff\xff\x7f\x0c\x9f\x7f}`x\xf8\xe1:\
\xc3\xa9';\x19\xde|{\xc6\xc0\xca\xcc\x86\xd2R\x04\
\x00\x00\x00\xff\xffb\xe4\xf1\x90\xfb\xcf\xc8\xc8\xc0\xf0\xeb\
\xe7\x7f\x06YEv\x06\xb7@\xdc\x03\xfb\xff\xff30\
pp03\x9c:\xf2\x96\xe1\xe6\xf9\xbf\x0cKkf\
3xY:B\xcauh\x1a\xfe\xf7\xff\x1f\xc3\xff\xff\
\x90\x92\x076\x9e\xf8\xe4\xe3m\x86\xe9\xa7\xca\x18\x9e~\
\xba\xcb\xc0\xc9\xca\x03\x1f\xfc\xfc\xff\x9f\x81\x81\x9d\x9d\x89\
\xe1\xcb\x97_\x0c/_~eP\x93Qf\x10\x17\x12\
c\xf8\xf1\xe7\x1b\xc3\xfb\xef/\x19>\xfex\x03\xcf\xfc\
\xe8\x19\x14\x00\x00\x00\xff\xff\x22\xc9\xe10\xcb89Y\
\x18\x1e\xde\xff\xccp\xf1\xf4G\x06o\xfdP\x86d\xcf\
x\x06\x1d%M\x06Vho\x06\xe6\xe0o\xbf?3\
\xac\xbd:\x99\xe1\xf0\x83\x0d\x0c\x7f\xfe\xfd\x82\x8c\x02\xa0\
\x8d\xd8\xc2\x86\xacYX\x98\x18~\xfc\xfa\xc1\xf0\xfb\xcf\
\x1f\xc8\x8c\x03\x13+\xb4\xe4a\xc4:\xca\x0b\x00\x00\x00\
\xff\xff\x22y\x0e\x82\x91\x91\x81\xe1\xfb\xb7?\x0c2r\
\xdc\x0c~\xe1\xd2\x0cw\x1971\x18%X1\xb4.\
\xeec````\xf8\xfb\x17a\xc9\x9f\x7f\xbf\x18\x0e\
\xde_\xcb\xc0\xc0\xc0\xc0\xc0\xc5\xca\x8b\xd5\x01\x8cL\x90\
Q\x81\x9f?\xff203\xb01p\xb0r3\xb0\xb3\
p203B'\x0b\xb0\x0fM\xff\x07\x00\x00\x00\xff\
\xff\x22k\xf2\x84\x91\x89\x81\xe1\xd7\xaf\x7f\x0c?\xbe\xfd\
ePS\x15g\x10\x94\xe0e\xd8zl\x0f\x03\x03\x03\
\x03\x03\x1333<\xc9\xf0\xb1\x0b3\xb8\xa9\xc60|\
\xf8\xf1\x8a\xe1\xe3\xcf\xb7\xd04\x8f=*\x19\x19\x19P\
z=x\xdb0\xff\x19\xfe\x00\x00\x00\x00\xff\xff\x22k\
F\x02n\xd1?\x06\x86\xff\x8c\x7f\x18\xd45\x04\x19\xce\
\x1c\xbd\xcap\xe9\xde\x15\x06=%\x1d\xc8\x80\x11\xb4v\
\x0d\xd4\xcaf\x90\xe1Sex\xf1\xe9\x11\xc3\xb1'\x9b\
\x19>\xfcx\x85\xb3\xfdN\x84\xad\xff\xff\xfd\xff\xc3\xc8\
\xcf.\xfa\x0c\x00\x00\x00\xff\xff\xa2l\xba\x8a\x91\x81\xe1\
\xf7\xef\xff\x0c\xea\xba\xbc\x0c\x7f\xfe\x7fc\x98\xb1q!\
\x03\x03\x03\x03\xc3\x9f\xbf\x7f\xe0\x0d1\x16FV\x06+\
9\x1f\x86 \x9d,\x06^6\x01\x86\xbf\xff\xfe0\xe0\
\xcc@\x04\x00\x13#\xe3\xbf\xdf\x7f\x7f2\xa8\x0a\x1b\xed\
\x07\x00\x00\x00\xff\xff\xa2\xc8\xe1\x8c\x8c\x0c\x0c\x7f\x7f\xff\
g\xe0\x15`dpt\x97e\x98\xb9v1\xc3\xf6\x13\
{\x19\xd8X\xd9\xe0\x0e\xff\xcf\xf0\x9f\x88\xf9\x1f\xa2\xc0\
\xff\xff\x0c\xff\x99\x98\x99\xd8~;(\x06\xcf\x02\x00\x00\
\x00\xff\xff\xa2x\x82\x90\x91\x89\x81\xe1\xe7\x8f\x7f\x0c\xda\
\x86<\x0c\xf6>\xc2\x0ci\x932\x19fl\x9a\xcf\xf0\
\xe1\xf3g\x86\xff\xff\x11m\x94o\xbf?3\xfc\xf9\xff\
\x1b\xe7\xc8\x14\x0e\xd3\xff322\xfdcbd\xfe\xc3\
\xc2\xc4\xfa\xfb\xfd\xf7W\x8c\x0e\x0a\xa1S\xd4E\x8d\x8e\
\x03\x00\x00\x00\xff\xff\x22\xb98\xc4\x05`e\xfc\xb7\xef\
\xbf\x19\x9e<\xfd\xc0 ) \xc5\xa0()\xc7\xc0\xce\
\xc6\xce\xf0\xfd\xf7g\x86\x8f?\xdeAG\xbc0\xd36\
db\x16\xba\x82\x02\xba\xd8\xe0?\xc3?\xe6\x7f\xff \
\x0b\x1c\xfe\xfe\xfb\xfd\xef\xf7\xdf_L\xb6\xf2A+R\
M[bX\x98X\xfe\x02\x00\x00\x00\xff\xff\x22;s\
bX\xce\xc8\xc0\xf0\xe3\xfb_\x06\x16ff\x065\x15\
1\x86_\xbf\xbf1\xdc\xffx\x09>\xb5\x0d\x9df\xf9\
\x0fY\x09\xc1\x04o\xe3\xfeg\xf8\xc7\xfc\xf7\xdf_\xc6\
\xbf\xff~3\xfe\xfd\xf7\x87\xe1\xef\xbf\xbf\x0c\x8c\x0c\x90\
~,\x17+\xdf\x17qN\xb1\xc7\xa2\x5c2\xb7\xcdd\
\xdc\x97\x9a\xcbz\xac\x82\x0c\xb4\xffg\x04\x00\x00\x00\xff\
\xffb\x81\xacz\xf8O\x95\x09pH\xf3\xfa?\xc3\xcf\
\x1f\x7f\xfe32\xb2\xfc\xe7de\x83/\xd7\xf8\xf7\xff\
/\xf3\xdf\x7f\x7f\x18\x7f\xff\xfb\xcd\xf8\xe7\xdf\x1f\x86\x7f\
\xff k^\xd8 \x0e\xfc*\xc0!\xffX\x94[\xe6\
\xb6$\xaf\xc2uI^\xc5\xab\x92\xbc\x0a7E\xb8\xa4\
\x1e\xf0q\x08\xbdfbd\xfe\xc7\xc0\xc0\xc0\xf0\xff\xff\
?&\x06h\xac\x00\x00\x00\x00\xff\xffb\xf9\xf3\xe7\x0f\
\x03\x1b\x1b\xdb?\x06\x86\xdfL$%?\x88S\xff3\
22\xa0\x85\xe0\x7f\xe6\x7f\xff\xff0\xfe\xfe\xfb\x8b\xf1\
\xef\x9f\xdf\xf0\x10dafg\xe0f\xe5\xfb*\xc6!\
\xffX\x94[\xfa\x0e\xc4\x81JW%x\x14n\x8ar\
K\xddGv :\x80,\xc8\xf9\xcf\xc0\xc4\xc8\x0c\xcf\
\xe5\x00\x00\x00\x00\xff\xffb\x11\x13\x10~\xf2\xf4\xeds\
Yvf\xee\xbf\xff\xff30cw<\xe3\x7f\xa4\xc5\
.(i\x10\x11\x82\x103Ya\x0e\xe4\x16}\x22\xca\
-s[\x82W\xe1\xba\x14\xaf\xe25\x09\x1e\x85\x9b\x22\
\xdc\xd2\xf7\xf99\x84^\xe1r\xe0\xff\xff\xff\x98\xff\xc3\
c\x1f\xba\x18\x81\x91\xf1?\x13\x96![\x00\x00\x00\x00\
\xff\xffb\xd9\xd3\xbf\xc1.\xa4.n\xd3\xc5+\x97t\
Y\x98\xa5\xfeB\x06S\x99\xfe31\x22V\x01\xfd\xfd\
\xff\x87\xf1\xcf_\xc8\x0a\x86\xbf\xff\xa1!\xc8\xc4\xce\xc0\
\xcd\xc6\xf7]\x94C\x0e\x12\x82<\x8a\xd7$y\x15\xaf\
I\xf0\xca\xdf\x10\xe5\x96\xb9\xcf\xcf.\xf4\x8a\x89\x09\xb7\
\x03\xffA\x17\xcc@\x03\x05\xb2\x04\x84\x91\xe9/\xb1\x91\
\x0e\x00\x00\x00\xff\xffb\xfc\xff\xff?\xc3\xeb\x8fo\x84\
\xbdJ\xa27?\xfev\xd928F\xee\xdf\xd7o\xdf\
\x99\xfe3@\x062Y\x99\xd8\x18\xb8Xy?\x09p\
\x88=\x11\xe1\x96\xbe#\xc1\xa3pC\x92W\xe1\x9a8\
\x8f\xfcMQn\xa9\x07\xfc\xec\xc2x\x1d\x88-\x04\x89\
t\x1b^\x00\x00\x00\x00\xff\xffb\xfc\xf3\xf7\x0f33\
\x13\xf3\xdfW\xef\xde\xf3f\xcfN\xde.\xa1\xfdVO\
\x96O\xfd\xac\x04\xaf\xc2ui>\x95KR\xbc\x8a\xd7\
\xc4\xb8e\xef\x08p\x8a\xbedfb\xc6\xde\xe2\xf9\xff\
\x8f\xf9\x1f\xc3?h\xc3\x96\x11i\xa9\x13\xd9\x9dx\x82\
\x00\x00\x00\x00\xff\xff\x03\x00<\x1e\x17\xa6\x18\xe4\xa8\x9e\
\x00\x00\x00\x00IEND\xaeB`\x82\
"

qt_resource_name = b"\
\x00\x06\
\x07\x03}\xc3\
\x00i\
\x00m\x00a\x00g\x00e\x00s\
\x00\x0b\
\x05R\xbf'\
\x00q\
\x00t\x00-\x00l\x00o\x00g\x00o\x00.\x00p\x00n\x00g\
"

qt_resource_struct = 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\x01e\xaf\x16\xd2\x99\
"

def qInitResources():
    QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)

def qCleanupResources():
    QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)

qInitResources()

form.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Form</class>
 <widget class="QWidget" name="Form">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>545</width>
    <height>471</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Easing curves</string>
  </property>
  <layout class="QGridLayout" name="gridLayout">
   <item row="0" column="0" colspan="2">
    <widget class="QListWidget" name="easingCurvePicker">
     <property name="sizePolicy">
      <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
       <horstretch>0</horstretch>
       <verstretch>0</verstretch>
      </sizepolicy>
     </property>
     <property name="maximumSize">
      <size>
       <width>16777215</width>
       <height>120</height>
      </size>
     </property>
     <property name="verticalScrollBarPolicy">
      <enum>Qt::ScrollBarAlwaysOff</enum>
     </property>
     <property name="movement">
      <enum>QListView::Static</enum>
     </property>
     <property name="isWrapping" stdset="0">
      <bool>false</bool>
     </property>
     <property name="viewMode">
      <enum>QListView::IconMode</enum>
     </property>
     <property name="selectionRectVisible">
      <bool>false</bool>
     </property>
    </widget>
   </item>
   <item row="1" column="0">
    <layout class="QVBoxLayout" name="verticalLayout">
     <item>
      <widget class="QGroupBox" name="groupBox_2">
       <property name="title">
        <string>Path type</string>
       </property>
       <layout class="QVBoxLayout" name="verticalLayout_2">
        <item>
         <widget class="QRadioButton" name="lineRadio">
          <property name="text">
           <string>Line</string>
          </property>
          <property name="checked">
           <bool>true</bool>
          </property>
          <attribute name="buttonGroup">
           <string>buttonGroup</string>
          </attribute>
         </widget>
        </item>
        <item>
         <widget class="QRadioButton" name="circleRadio">
          <property name="text">
           <string>Circle</string>
          </property>
          <attribute name="buttonGroup">
           <string>buttonGroup</string>
          </attribute>
         </widget>
        </item>
       </layout>
      </widget>
     </item>
     <item>
      <widget class="QGroupBox" name="groupBox">
       <property name="sizePolicy">
        <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
         <horstretch>0</horstretch>
         <verstretch>0</verstretch>
        </sizepolicy>
       </property>
       <property name="title">
        <string>Properties</string>
       </property>
       <layout class="QFormLayout" name="formLayout">
        <property name="fieldGrowthPolicy">
         <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
        </property>
        <item row="0" column="0">
         <widget class="QLabel" name="label">
          <property name="text">
           <string>Period</string>
          </property>
         </widget>
        </item>
        <item row="0" column="1">
         <widget class="QDoubleSpinBox" name="periodSpinBox">
          <property name="enabled">
           <bool>false</bool>
          </property>
          <property name="minimum">
           <double>-1.000000000000000</double>
          </property>
          <property name="singleStep">
           <double>0.100000000000000</double>
          </property>
          <property name="value">
           <double>-1.000000000000000</double>
          </property>
         </widget>
        </item>
        <item row="1" column="0">
         <widget class="QLabel" name="label_2">
          <property name="text">
           <string>Amplitude</string>
          </property>
         </widget>
        </item>
        <item row="1" column="1">
         <widget class="QDoubleSpinBox" name="amplitudeSpinBox">
          <property name="enabled">
           <bool>false</bool>
          </property>
          <property name="minimum">
           <double>-1.000000000000000</double>
          </property>
          <property name="singleStep">
           <double>0.100000000000000</double>
          </property>
          <property name="value">
           <double>-1.000000000000000</double>
          </property>
         </widget>
        </item>
        <item row="2" column="0">
         <widget class="QLabel" name="label_3">
          <property name="text">
           <string>Overshoot</string>
          </property>
         </widget>
        </item>
        <item row="2" column="1">
         <widget class="QDoubleSpinBox" name="overshootSpinBox">
          <property name="enabled">
           <bool>false</bool>
          </property>
          <property name="minimum">
           <double>-1.000000000000000</double>
          </property>
          <property name="singleStep">
           <double>0.100000000000000</double>
          </property>
          <property name="value">
           <double>-1.000000000000000</double>
          </property>
         </widget>
        </item>
       </layout>
      </widget>
     </item>
     <item>
      <spacer name="verticalSpacer">
       <property name="orientation">
        <enum>Qt::Vertical</enum>
       </property>
       <property name="sizeHint" stdset="0">
        <size>
         <width>20</width>
         <height>40</height>
        </size>
       </property>
      </spacer>
     </item>
    </layout>
   </item>
   <item row="1" column="1">
    <widget class="QGraphicsView" name="graphicsView">
     <property name="sizePolicy">
      <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
       <horstretch>0</horstretch>
       <verstretch>0</verstretch>
      </sizepolicy>
     </property>
    </widget>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/>
 <buttongroups>
  <buttongroup name="buttonGroup">
   <property name="exclusive">
    <bool>false</bool>
   </property>
  </buttongroup>
 </buttongroups>
</ui>