diff --git a/PPOCRLabel/PPOCRLabel.py b/PPOCRLabel/PPOCRLabel.py
new file mode 100644
index 0000000000000000000000000000000000000000..79610250c70dd76b78d37b18edd50c2edcf9bbae
--- /dev/null
+++ b/PPOCRLabel/PPOCRLabel.py
@@ -0,0 +1,2053 @@
+# Copyright (c) <2015-Present> Tzutalin
+# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba,
+# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+# associated documentation files (the "Software"), to deal in the Software without restriction, including without
+# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+# The above copyright notice and this permission notice shall be included in all copies or substantial portions of
+# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
+# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# pyrcc5 -o libs/resources.py resources.qrc
+import argparse
+import ast
+import codecs
+import os.path
+import platform
+import subprocess
+import sys
+from functools import partial
+from collections import defaultdict
+import json
+
+
+__dir__ = os.path.dirname(os.path.abspath(__file__))
+sys.path.append(__dir__)
+sys.path.append(os.path.abspath(os.path.join(__dir__, '../..')))
+sys.path.append("..")
+
+from paddleocr import PaddleOCR
+
+try:
+ from PyQt5 import QtCore, QtGui, QtWidgets
+ from PyQt5.QtGui import *
+ from PyQt5.QtCore import *
+ from PyQt5.QtWidgets import *
+except ImportError:
+ # needed for py3+qt4
+ # Ref:
+ # http://pyqt.sourceforge.net/Docs/PyQt4/incompatible_apis.html
+ # http://stackoverflow.com/questions/21217399/pyqt4-qtcore-qvariant-object-instead-of-a-string
+ if sys.version_info.major >= 3:
+ import sip
+
+ sip.setapi('QVariant', 2)
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+
+from combobox import ComboBox
+from libs.constants import *
+from libs.utils import *
+from libs.settings import Settings
+from libs.shape import Shape, DEFAULT_LINE_COLOR, DEFAULT_FILL_COLOR
+from libs.stringBundle import StringBundle
+from libs.canvas import Canvas
+from libs.zoomWidget import ZoomWidget
+from libs.autoDialog import AutoDialog
+from libs.labelDialog import LabelDialog
+from libs.colorDialog import ColorDialog
+from libs.labelFile import LabelFile, LabelFileError, LabelFileFormat
+from libs.toolBar import ToolBar
+from libs.ustr import ustr
+from libs.hashableQListWidgetItem import HashableQListWidgetItem
+
+__appname__ = 'PPOCRLabel'
+
+
+class WindowMixin(object):
+
+ def menu(self, title, actions=None):
+ menu = self.menuBar().addMenu(title)
+ if actions:
+ addActions(menu, actions)
+ return menu
+
+ def toolbar(self, title, actions=None):
+ toolbar = ToolBar(title)
+ toolbar.setObjectName(u'%sToolBar' % title)
+ # toolbar.setOrientation(Qt.Vertical)
+ toolbar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
+ if actions:
+ addActions(toolbar, actions)
+ self.addToolBar(Qt.LeftToolBarArea, toolbar)
+ return toolbar
+
+
+class MainWindow(QMainWindow, WindowMixin):
+ FIT_WINDOW, FIT_WIDTH, MANUAL_ZOOM = list(range(3))
+
+ def __init__(self, defaultFilename=None, defaultPrefdefClassFile=None, defaultSaveDir=None, language="zh-CN"):
+ super(MainWindow, self).__init__()
+ self.setWindowTitle(__appname__)
+
+ # Load setting in the main thread
+ self.settings = Settings()
+ self.settings.load()
+ settings = self.settings
+
+ # Load string bundle for i18n
+ if language not in ['zh-CN', 'en']:
+ language = 'zh-CN'
+ self.stringBundle = StringBundle.getBundle(localeStr=language) # 'en'
+ getStr = lambda strId: self.stringBundle.getString(strId)
+
+ self.defaultSaveDir = defaultSaveDir
+ self.ocr = PaddleOCR(use_pdserving=False, use_angle_cls=True, det=True, cls=True, use_gpu=True, lang="ch")
+
+ if os.path.exists('./data/paddle.png'):
+ result = self.ocr.ocr('./data/paddle.png', cls=True, det=True)
+
+ # For loading all image under a directory
+ self.mImgList = []
+ self.mImgList5 = []
+ self.dirname = None
+ self.labelHist = []
+ self.lastOpenDir = None
+ self.result_dic = []
+
+ self.changeFileFolder = False
+ self.haveAutoReced = False
+ self.labelFile = None
+ self.currIndex = 0
+
+
+ # Whether we need to save or not.
+ self.dirty = False
+
+ self._noSelectionSlot = False
+ self._beginner = True
+ self.screencastViewer = self.getAvailableScreencastViewer()
+ self.screencast = "https://github.com/PaddlePaddle/PaddleOCR"
+
+ # Load predefined classes to the list
+ self.loadPredefinedClasses(defaultPrefdefClassFile)
+
+ # Main widgets and related state.
+ self.labelDialog = LabelDialog(parent=self, listItem=self.labelHist)
+ self.autoDialog = AutoDialog(parent=self)
+
+ self.itemsToShapes = {}
+ self.shapesToItems = {}
+ self.itemsToShapesbox = {}
+ self.shapesToItemsbox = {}
+ self.prevLabelText = getStr('tempLabel')
+ self.model = 'paddle'
+ self.PPreader = None
+ self.autoSaveNum = 10
+
+ ################# file list ###############
+ self.fileListWidget = QListWidget()
+ self.fileListWidget.itemClicked.connect(self.fileitemDoubleClicked)
+ self.fileListWidget.setIconSize(QSize(25, 25))
+ filelistLayout = QVBoxLayout()
+ filelistLayout.setContentsMargins(0, 0, 0, 0)
+ filelistLayout.addWidget(self.fileListWidget)
+
+ self.AutoRecognition = QToolButton()
+ self.AutoRecognition.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
+ self.AutoRecognition.setIcon(newIcon('Auto'))
+ # self.AutoRecognition.setIconSize(QSize(100,20))
+ self.AutoRecognition.setFixedSize(QSize(80,30))
+ # self.AutoRecognition.setStyleSheet('text-align:center;')#border:none;font-size : 12pt;
+ autoRecLayout = QHBoxLayout()
+ autoRecLayout.setContentsMargins(0, 0, 0, 0)
+ autoRecLayout.addWidget(self.AutoRecognition)
+ autoRecContainer = QWidget()
+ autoRecContainer.setLayout(autoRecLayout)
+ filelistLayout.addWidget(autoRecContainer)
+
+ fileListContainer = QWidget()
+ fileListContainer.setLayout(filelistLayout)
+ self.filedock = QDockWidget(getStr('fileList'), self)
+ self.filedock.setObjectName(getStr('files'))
+ self.filedock.setWidget(fileListContainer)
+ self.addDockWidget(Qt.LeftDockWidgetArea, self.filedock)
+
+ ######## Right area ##########
+ listLayout = QVBoxLayout()
+ listLayout.setContentsMargins(0, 0, 0, 0)
+
+ # Create a widget for edit and diffc button
+ self.diffcButton = QCheckBox(getStr('useDifficult'))
+ self.diffcButton.setChecked(False)
+ self.diffcButton.stateChanged.connect(self.btnstate)
+ self.editButton = QToolButton()
+ self.reRecogButton = QToolButton()
+ self.reRecogButton.setIcon(newIcon('reRec', 30))
+ self.reRecogButton.setFixedSize(QSize(80,30))
+ self.reRecogButton.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
+
+ self.newButton = QToolButton()
+ self.newButton.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
+ self.newButton.setFixedSize(QSize(80, 30))
+ self.SaveButton = QToolButton()
+ self.SaveButton.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
+ self.SaveButton.setFixedSize(QSize(60, 30))
+ self.DelButton = QToolButton()
+ self.DelButton.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
+ self.DelButton.setFixedSize(QSize(80, 30))
+
+
+ lefttoptoolbox = QHBoxLayout()
+ lefttoptoolbox.addWidget(self.newButton)
+ lefttoptoolbox.addWidget(self.reRecogButton)
+ lefttoptoolboxcontainer = QWidget()
+ lefttoptoolboxcontainer.setLayout(lefttoptoolbox)
+ listLayout.addWidget(lefttoptoolboxcontainer)
+
+
+ ################## label list ####################
+ # Create and add a widget for showing current label items
+ self.labelList = QListWidget()
+ labelListContainer = QWidget()
+ labelListContainer.setLayout(listLayout)
+ self.labelList.itemActivated.connect(self.labelSelectionChanged)
+ self.labelList.itemSelectionChanged.connect(self.labelSelectionChanged)
+ self.labelList.itemDoubleClicked.connect(self.editLabel)
+ # Connect to itemChanged to detect checkbox changes.
+ self.labelList.itemChanged.connect(self.labelItemChanged)
+ self.labelListDock = QDockWidget(getStr('recognitionResult'),self)
+ self.labelListDock.setWidget(self.labelList)
+ self.labelListDock.setFeatures(QDockWidget.NoDockWidgetFeatures)
+ listLayout.addWidget(self.labelListDock)
+
+ ################## detection box ####################
+ self.BoxList = QListWidget()
+
+ self.BoxList.itemActivated.connect(self.boxSelectionChanged)
+ self.BoxList.itemSelectionChanged.connect(self.boxSelectionChanged)
+ self.BoxList.itemDoubleClicked.connect(self.editBox)
+ # Connect to itemChanged to detect checkbox changes.
+ self.BoxList.itemChanged.connect(self.boxItemChanged)
+ self.BoxListDock = QDockWidget(getStr('detectionBoxposition'), self)
+ self.BoxListDock.setWidget(self.BoxList)
+ self.BoxListDock.setFeatures(QDockWidget.NoDockWidgetFeatures)
+ listLayout.addWidget(self.BoxListDock)
+
+ ############ lower right area ############
+ leftbtmtoolbox = QHBoxLayout()
+ leftbtmtoolbox.addWidget(self.SaveButton)
+ leftbtmtoolbox.addWidget(self.DelButton)
+ leftbtmtoolboxcontainer = QWidget()
+ leftbtmtoolboxcontainer.setLayout(leftbtmtoolbox)
+ listLayout.addWidget(leftbtmtoolboxcontainer)
+
+ self.dock = QDockWidget(getStr('boxLabelText'), self)
+ self.dock.setObjectName(getStr('labels'))
+ self.dock.setWidget(labelListContainer)
+
+
+ ########## zoom bar #########
+ self.imgsplider = QSlider(Qt.Horizontal)
+ self.imgsplider.valueChanged.connect(self.CanvasSizeChange)
+ self.imgsplider.setMinimum(-150)
+ self.imgsplider.setMaximum(150)
+ self.imgsplider.setSingleStep(1)
+ self.imgsplider.setTickPosition(QSlider.TicksBelow)
+ self.imgsplider.setTickInterval(1)
+ op = QGraphicsOpacityEffect()
+ op.setOpacity(0.2)
+ self.imgsplider.setGraphicsEffect(op)
+ # self.imgsplider.setAttribute(Qt.WA_TranslucentBackground)
+ self.imgsplider.setStyleSheet("background-color:transparent")
+ self.imgsliderDock = QDockWidget(getStr('ImageResize'), self)
+ self.imgsliderDock.setObjectName(getStr('IR'))
+ self.imgsliderDock.setWidget(self.imgsplider)
+ self.imgsliderDock.setFeatures(QDockWidget.DockWidgetFloatable)
+ # op = QGraphicsOpacityEffect()
+ # op.setOpacity(0.2)
+ # self.imgsliderDock.setGraphicsEffect(op)
+ self.imgsliderDock.setAttribute(Qt.WA_TranslucentBackground)
+ self.addDockWidget(Qt.RightDockWidgetArea, self.imgsliderDock)
+
+ self.zoomWidget = ZoomWidget()
+ self.colorDialog = ColorDialog(parent=self)
+ self.zoomWidgetValue = self.zoomWidget.value()
+
+ ########## thumbnail #########
+ hlayout = QHBoxLayout()
+ m = (0, 0, 0, 0)
+ hlayout.setSpacing(0)
+ hlayout.setContentsMargins(*m)
+ self.preButton = QToolButton()
+ # self.preButton.setFixedHeight(100)
+ # self.preButton.setText(getStr("prevImg"))
+ self.preButton.setIcon(newIcon("prev",40))
+ self.preButton.setIconSize(QSize(40, 100))
+ self.preButton.clicked.connect(self.openPrevImg)
+ # self.preButton.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
+ self.preButton.setStyleSheet('border: none;')
+ self.iconlist = QListWidget()
+ self.iconlist.setViewMode(QListView.IconMode)
+ self.iconlist.setFlow(QListView.TopToBottom)
+ self.iconlist.setSpacing(10)
+ self.iconlist.setIconSize(QSize(50, 50))
+ self.iconlist.setMovement(False)
+ self.iconlist.setResizeMode(QListView.Adjust)
+ # self.iconlist.itemDoubleClicked.connect(self.iconitemDoubleClicked)
+ self.iconlist.itemClicked.connect(self.iconitemDoubleClicked)
+ self.iconlist.setStyleSheet("background-color:transparent; border: none;")
+ self.iconlist.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
+ # self.iconlist.setStyleSheet('border: none;')
+ self.nextButton = QToolButton()
+ # self.nextButton.setFixedHeight(100)
+ # self.nextButton.setText(getStr("nextImg"))
+ self.nextButton.setIcon(newIcon("next", 40))
+ self.nextButton.setIconSize(QSize(40, 100))
+ self.nextButton.setStyleSheet('border: none;')
+ self.nextButton.clicked.connect(self.openNextImg)
+ # self.nextButton.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
+
+ hlayout.addWidget(self.preButton)
+ hlayout.addWidget(self.iconlist)
+ hlayout.addWidget(self.nextButton)
+
+ # self.setLayout(hlayout)
+
+ iconListContainer = QWidget()
+ iconListContainer.setLayout(hlayout)
+ iconListContainer.setFixedHeight(100)
+ # iconListContainer.setFixedWidth(530)
+ # op = QGraphicsOpacityEffect()
+ # op.setOpacity(0.5)
+ # iconListContainer.setGraphicsEffect(op)
+
+ ########### Canvas ###########
+ self.canvas = Canvas(parent=self)
+ self.canvas.zoomRequest.connect(self.zoomRequest)
+ self.canvas.setDrawingShapeToSquare(settings.get(SETTING_DRAW_SQUARE, False))
+
+ scroll = QScrollArea()
+ scroll.setWidget(self.canvas)
+ scroll.setWidgetResizable(True)
+ self.scrollBars = {
+ Qt.Vertical: scroll.verticalScrollBar(),
+ Qt.Horizontal: scroll.horizontalScrollBar()
+ }
+ self.scrollArea = scroll
+ self.canvas.scrollRequest.connect(self.scrollRequest)
+
+ self.canvas.newShape.connect(self.newShape)
+ self.canvas.shapeMoved.connect(self.updateBoxlist) # self.setDirty
+ self.canvas.selectionChanged.connect(self.shapeSelectionChanged)
+ self.canvas.drawingPolygon.connect(self.toggleDrawingSensitive)
+
+ centerLayout = QVBoxLayout()
+ centerLayout.setContentsMargins(0, 0, 0, 0)
+ centerLayout.addWidget(scroll)
+ #centerLayout.addWidget(self.icondock)
+ centerLayout.addWidget(iconListContainer,0,Qt.AlignCenter)
+ centercontainer = QWidget()
+ centercontainer.setLayout(centerLayout)
+
+ # self.scrolldock = QDockWidget('WorkSpace',self)
+ # self.scrolldock.setObjectName('WorkSpace')
+ # self.scrolldock.setWidget(centercontainer)
+ # self.scrolldock.setFeatures(QDockWidget.NoDockWidgetFeatures)
+ # orititle = self.scrolldock.titleBarWidget()
+ # tmpwidget = QWidget()
+ # self.scrolldock.setTitleBarWidget(tmpwidget)
+ # del orititle
+ self.setCentralWidget(centercontainer) #self.scrolldock
+ self.addDockWidget(Qt.RightDockWidgetArea, self.dock)
+
+
+ # self.filedock.setFeatures(QDockWidget.DockWidgetFloatable)
+ self.filedock.setFeatures(self.filedock.features() ^ QDockWidget.DockWidgetFloatable)
+
+ self.dockFeatures = QDockWidget.DockWidgetClosable | QDockWidget.DockWidgetFloatable
+ self.dock.setFeatures(self.dock.features() ^ self.dockFeatures)
+
+ self.filedock.setFeatures(QDockWidget.NoDockWidgetFeatures)
+
+ ###### Actions #######
+ action = partial(newAction, self)
+ quit = action(getStr('quit'), self.close,
+ 'Ctrl+Q', 'quit', getStr('quitApp'))
+
+ open = action(getStr('openFile'), self.openFile,
+ 'Ctrl+O', 'open', getStr('openFileDetail'))
+
+ opendir = action(getStr('openDir'), self.openDirDialog,
+ 'Ctrl+u', 'open', getStr('openDir'))
+
+ openNextImg = action(getStr('nextImg'), self.openNextImg,
+ 'd', 'next', getStr('nextImgDetail'))
+
+ openPrevImg = action(getStr('prevImg'), self.openPrevImg,
+ 'a', 'prev', getStr('prevImgDetail'))
+
+ verify = action(getStr('verifyImg'), self.verifyImg,
+ 'space', 'verify', getStr('verifyImgDetail'))
+
+ save = action(getStr('save'), self.saveFile,
+ 'Ctrl+S', 'save', getStr('saveDetail'), enabled=False)
+
+ alcm = action(getStr('choosemodel'), self.autolcm,
+ 'Ctrl+M', 'next', getStr('tipchoosemodel'))
+
+ deleteImg = action(getStr('deleteImg'), self.deleteImg, 'Ctrl+D', 'close', getStr('deleteImgDetail'),
+ enabled=True)
+
+ resetAll = action(getStr('resetAll'), self.resetAll, None, 'resetall', getStr('resetAllDetail'))
+
+ color1 = action(getStr('boxLineColor'), self.chooseColor1,
+ 'Ctrl+L', 'color_line', getStr('boxLineColorDetail'))
+
+ createMode = action(getStr('crtBox'), self.setCreateMode,
+ 'w', 'new', getStr('crtBoxDetail'), enabled=False)
+ editMode = action('&Edit\nRectBox', self.setEditMode,
+ 'Ctrl+J', 'edit', u'Move and edit Boxs', enabled=False)
+
+ create = action(getStr('crtBox'), self.createShape,
+ 'w', 'new', getStr('crtBoxDetail'), enabled=False)
+
+ delete = action(getStr('delBox'), self.deleteSelectedShape,
+ 'Delete', 'delete', getStr('delBoxDetail'), enabled=False)
+ copy = action(getStr('dupBox'), self.copySelectedShape,
+ 'Ctrl+D', 'copy', getStr('dupBoxDetail'),
+ enabled=False)
+
+ hideAll = action('&Hide\nRectBox', partial(self.togglePolygons, False),
+ 'Ctrl+H', 'hide', getStr('hideAllBoxDetail'),
+ enabled=False)
+ showAll = action('&Show\nRectBox', partial(self.togglePolygons, True),
+ 'Ctrl+A', 'hide', getStr('showAllBoxDetail'),
+ enabled=False)
+
+ help = action(getStr('tutorial'), self.showTutorialDialog, None, 'help', getStr('tutorialDetail'))
+ showInfo = action(getStr('info'), self.showInfoDialog, None, 'help', getStr('info'))
+ showSteps = action(getStr('steps'), self.showStepsDialog, None, 'help', getStr('steps'))
+
+ zoom = QWidgetAction(self)
+ zoom.setDefaultWidget(self.zoomWidget)
+ self.zoomWidget.setWhatsThis(
+ u"Zoom in or out of the image. Also accessible with"
+ " %s and %s from the canvas." % (fmtShortcut("Ctrl+[-+]"),
+ fmtShortcut("Ctrl+Wheel")))
+ self.zoomWidget.setEnabled(False)
+
+ zoomIn = action(getStr('zoomin'), partial(self.addZoom, 10),
+ 'Ctrl++', 'zoom-in', getStr('zoominDetail'), enabled=False)
+ zoomOut = action(getStr('zoomout'), partial(self.addZoom, -10),
+ 'Ctrl+-', 'zoom-out', getStr('zoomoutDetail'), enabled=False)
+ zoomOrg = action(getStr('originalsize'), partial(self.setZoom, 100),
+ 'Ctrl+=', 'zoom', getStr('originalsizeDetail'), enabled=False)
+ fitWindow = action(getStr('fitWin'), self.setFitWindow,
+ 'Ctrl+F', 'fit-window', getStr('fitWinDetail'),
+ checkable=True, enabled=False)
+ fitWidth = action(getStr('fitWidth'), self.setFitWidth,
+ 'Ctrl+Shift+F', 'fit-width', getStr('fitWidthDetail'),
+ checkable=True, enabled=False)
+ # Group zoom controls into a list for easier toggling.
+ zoomActions = (self.zoomWidget, zoomIn, zoomOut,
+ zoomOrg, fitWindow, fitWidth)
+ self.zoomMode = self.MANUAL_ZOOM
+ self.scalers = {
+ self.FIT_WINDOW: self.scaleFitWindow,
+ self.FIT_WIDTH: self.scaleFitWidth,
+ # Set to one to scale to 100% when loading files.
+ self.MANUAL_ZOOM: lambda: 1,
+ }
+
+ edit = action(getStr('editLabel'), self.editLabel,
+ 'Ctrl+E', 'edit', getStr('editLabelDetail'),
+ enabled=False)
+
+ ######## New actions #######
+ AutoRec = action(getStr('autoRecognition'), self.autoRecognition,
+ 'Ctrl+Shift+A', 'Auto', getStr('autoRecognition'), enabled=False)
+
+ reRec = action(getStr('reRecognition'), self.reRecognition,
+ 'Ctrl+Shift+R', 'reRec', getStr('reRecognition'), enabled=False)
+
+ createpoly = action(getStr('creatPolygon'), self.createPolygon,
+ 'p', 'new', 'Creat Polygon', enabled=True)
+
+ saveRec = action(getStr('saveRec'), self.saveRecResult,
+ '', 'saveRec', getStr('saveRec'), enabled=False)
+
+ self.editButton.setDefaultAction(edit)
+ self.newButton.setDefaultAction(create)
+ self.DelButton.setDefaultAction(deleteImg)
+ self.SaveButton.setDefaultAction(save)
+ self.AutoRecognition.setDefaultAction(AutoRec)
+ self.reRecogButton.setDefaultAction(reRec)
+ # self.preButton.setDefaultAction(openPrevImg)
+ # self.nextButton.setDefaultAction(openNextImg)
+
+ ############# Zoom layout ##############
+ zoomLayout = QHBoxLayout()
+ zoomLayout.addStretch()
+ self.zoominButton = QToolButton()
+ self.zoominButton.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
+ self.zoominButton.setDefaultAction(zoomIn)
+ self.zoomoutButton = QToolButton()
+ self.zoomoutButton.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
+ self.zoomoutButton.setDefaultAction(zoomOut)
+ self.zoomorgButton = QToolButton()
+ self.zoomorgButton.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
+ self.zoomorgButton.setDefaultAction(zoomOrg)
+ zoomLayout.addWidget(self.zoominButton)
+ zoomLayout.addWidget(self.zoomorgButton)
+ zoomLayout.addWidget(self.zoomoutButton)
+
+ zoomContainer = QWidget()
+ zoomContainer.setLayout(zoomLayout)
+ zoomContainer.setGeometry(0, 0, 30, 150)
+
+ shapeLineColor = action(getStr('shapeLineColor'), self.chshapeLineColor,
+ icon='color_line', tip=getStr('shapeLineColorDetail'),
+ enabled=False)
+ shapeFillColor = action(getStr('shapeFillColor'), self.chshapeFillColor,
+ icon='color', tip=getStr('shapeFillColorDetail'),
+ enabled=False)
+
+ # labels = self.dock.toggleViewAction()
+ # labels.setText(getStr('showHide'))
+ # labels.setShortcut('Ctrl+Shift+L')
+
+ # Label list context menu.
+ labelMenu = QMenu()
+ addActions(labelMenu, (edit, delete))
+
+ self.labelList.setContextMenuPolicy(Qt.CustomContextMenu)
+ self.labelList.customContextMenuRequested.connect(
+ self.popLabelListMenu)
+
+ # Draw squares/rectangles
+ self.drawSquaresOption = QAction(getStr('drawSquares'), self)
+ self.drawSquaresOption.setShortcut('Ctrl+Shift+R')
+ self.drawSquaresOption.setCheckable(True)
+ self.drawSquaresOption.setChecked(settings.get(SETTING_DRAW_SQUARE, False))
+ self.drawSquaresOption.triggered.connect(self.toogleDrawSquare)
+
+ # Store actions for further handling.
+ self.actions = struct(save=save, open=open, resetAll=resetAll, deleteImg=deleteImg,
+ lineColor=color1, create=create, delete=delete, edit=edit, copy=copy,
+ saveRec=saveRec,
+ createMode=createMode, editMode=editMode,
+ shapeLineColor=shapeLineColor, shapeFillColor=shapeFillColor,
+ zoom=zoom, zoomIn=zoomIn, zoomOut=zoomOut, zoomOrg=zoomOrg,
+ fitWindow=fitWindow, fitWidth=fitWidth,
+ zoomActions=zoomActions,
+ fileMenuActions=(
+ open, opendir, save, resetAll, quit),
+ beginner=(), advanced=(),
+ editMenu=(createpoly, edit, copy, delete,
+ None, color1, self.drawSquaresOption),
+ beginnerContext=(create, edit, copy, delete),
+ advancedContext=(createMode, editMode, edit, copy,
+ delete, shapeLineColor, shapeFillColor),
+ onLoadActive=(
+ create, createMode, editMode),
+ onShapesPresent=(hideAll, showAll))
+
+ # menus
+ self.menus = struct(
+ file=self.menu('&'+getStr('mfile')),
+ edit=self.menu('&'+getStr('medit')),
+ view=self.menu('&'+getStr('mview')),
+ autolabel=self.menu('&PaddleOCR'),
+ help=self.menu('&'+getStr('mhelp')),
+ recentFiles=QMenu('Open &Recent'),
+ labelList=labelMenu)
+
+
+ # Sync single class mode from PR#106
+ self.singleClassMode = QAction(getStr('singleClsMode'), self)
+ self.singleClassMode.setShortcut("Ctrl+Shift+S")
+ self.singleClassMode.setCheckable(True)
+ self.singleClassMode.setChecked(settings.get(SETTING_SINGLE_CLASS, False))
+ self.lastLabel = None
+ # Add option to enable/disable labels being displayed at the top of bounding boxes
+ self.displayLabelOption = QAction(getStr('displayLabel'), self)
+ self.displayLabelOption.setShortcut("Ctrl+Shift+P")
+ self.displayLabelOption.setCheckable(True)
+ self.displayLabelOption.setChecked(settings.get(SETTING_PAINT_LABEL, False))
+ self.displayLabelOption.triggered.connect(self.togglePaintLabelsOption)
+
+ addActions(self.menus.file,
+ (opendir, None, save, resetAll, deleteImg, quit))
+
+ addActions(self.menus.help, (showSteps, showInfo))
+ addActions(self.menus.view, (
+ self.displayLabelOption, # labels,
+ None,
+ hideAll, showAll, None,
+ zoomIn, zoomOut, zoomOrg, None,
+ fitWindow, fitWidth))
+
+ addActions(self.menus.autolabel, (saveRec, None, help)) # alcm,
+
+ self.menus.file.aboutToShow.connect(self.updateFileMenu)
+
+ # Custom context menu for the canvas widget:
+ addActions(self.canvas.menus[0], self.actions.beginnerContext)
+ addActions(self.canvas.menus[1], (
+ action('&Copy here', self.copyShape),
+ action('&Move here', self.moveShape)))
+
+ # self.tools = self.toolbar('Tools')
+
+ self.actions.beginner = (
+ open, opendir, openNextImg, openPrevImg, verify, save, None, create, copy, delete, None,
+ zoomIn, zoom, zoomOut, fitWindow, fitWidth)
+
+ self.actions.advanced = (
+ open, opendir, openNextImg, openPrevImg, save, None,
+ createMode, editMode, None,
+ hideAll, showAll)
+
+ self.statusBar().showMessage('%s started.' % __appname__)
+ self.statusBar().show()
+
+ # Application state.
+ self.image = QImage()
+ self.filePath = ustr(defaultFilename)
+ self.lastOpenDir = None
+ self.recentFiles = []
+ self.maxRecent = 7
+ self.lineColor = None
+ self.fillColor = None
+ self.zoom_level = 100
+ self.fit_window = False
+ # Add Chris
+ self.difficult = False
+
+ ## Fix the compatible issue for qt4 and qt5. Convert the QStringList to python list
+ if settings.get(SETTING_RECENT_FILES):
+ if have_qstring():
+ recentFileQStringList = settings.get(SETTING_RECENT_FILES)
+ self.recentFiles = [ustr(i) for i in recentFileQStringList]
+ else:
+ self.recentFiles = recentFileQStringList = settings.get(SETTING_RECENT_FILES)
+
+ size = settings.get(SETTING_WIN_SIZE, QSize(1200, 800))
+
+ position = QPoint(0, 0)
+ saved_position = settings.get(SETTING_WIN_POSE, position)
+ # Fix the multiple monitors issue
+ for i in range(QApplication.desktop().screenCount()):
+ if QApplication.desktop().availableGeometry(i).contains(saved_position):
+ position = saved_position
+ break
+ self.resize(size)
+ self.move(position)
+ saveDir = ustr(settings.get(SETTING_SAVE_DIR, None))
+ self.lastOpenDir = ustr(settings.get(SETTING_LAST_OPEN_DIR, None))
+
+ self.restoreState(settings.get(SETTING_WIN_STATE, QByteArray()))
+ Shape.line_color = self.lineColor = QColor(settings.get(SETTING_LINE_COLOR, DEFAULT_LINE_COLOR))
+ Shape.fill_color = self.fillColor = QColor(settings.get(SETTING_FILL_COLOR, DEFAULT_FILL_COLOR))
+ self.canvas.setDrawingColor(self.lineColor)
+ # Add chris
+ Shape.difficult = self.difficult
+
+
+ # ADD:
+ # Populate the File menu dynamically.
+ self.updateFileMenu()
+
+ # Since loading the file may take some time, make sure it runs in the background.
+ if self.filePath and os.path.isdir(self.filePath):
+ self.queueEvent(partial(self.importDirImages, self.filePath or ""))
+ elif self.filePath:
+ self.queueEvent(partial(self.loadFile, self.filePath or ""))
+
+ # Callbacks:
+ self.zoomWidget.valueChanged.connect(self.paintCanvas)
+
+ self.populateModeActions()
+
+ # Display cursor coordinates at the right of status bar
+ self.labelCoordinates = QLabel('')
+ self.statusBar().addPermanentWidget(self.labelCoordinates)
+
+ # Open Dir if deafult file
+ if self.filePath and os.path.isdir(self.filePath):
+ self.openDirDialog(dirpath=self.filePath, silent=True)
+
+ def keyReleaseEvent(self, event):
+ if event.key() == Qt.Key_Control:
+ self.canvas.setDrawingShapeToSquare(False)
+
+ def keyPressEvent(self, event):
+ if event.key() == Qt.Key_Control:
+ # Draw rectangle if Ctrl is pressed
+ self.canvas.setDrawingShapeToSquare(True)
+
+
+ def noShapes(self):
+ return not self.itemsToShapes
+
+
+ def populateModeActions(self):
+ self.canvas.menus[0].clear()
+ addActions(self.canvas.menus[0], self.actions.beginnerContext)
+ self.menus.edit.clear()
+ actions = (self.actions.create,) # if self.beginner() else (self.actions.createMode, self.actions.editMode)
+ addActions(self.menus.edit, actions + self.actions.editMenu)
+
+
+ def setDirty(self):
+ self.dirty = True
+ self.actions.save.setEnabled(True)
+
+ def setClean(self):
+ self.dirty = False
+ self.actions.save.setEnabled(False)
+ self.actions.create.setEnabled(True)
+
+ def toggleActions(self, value=True):
+ """Enable/Disable widgets which depend on an opened image."""
+ for z in self.actions.zoomActions:
+ z.setEnabled(value)
+ for action in self.actions.onLoadActive:
+ action.setEnabled(value)
+
+ def queueEvent(self, function):
+ QTimer.singleShot(0, function)
+
+ def status(self, message, delay=5000):
+ self.statusBar().showMessage(message, delay)
+
+ def resetState(self):
+ self.itemsToShapes.clear()
+ self.shapesToItems.clear()
+ self.itemsToShapesbox.clear() # ADD
+ self.shapesToItemsbox.clear()
+ self.labelList.clear()
+ self.BoxList.clear()
+ self.filePath = None
+ self.imageData = None
+ self.labelFile = None
+ self.canvas.resetState()
+ self.labelCoordinates.clear()
+ # self.comboBox.cb.clear()
+ self.result_dic = []
+
+ def currentItem(self):
+ items = self.labelList.selectedItems()
+ if items:
+ return items[0]
+ return None
+
+ def currentBox(self):
+ items = self.BoxList.selectedItems()
+ if items:
+ return items[0]
+ return None
+
+ def addRecentFile(self, filePath):
+ if filePath in self.recentFiles:
+ self.recentFiles.remove(filePath)
+ elif len(self.recentFiles) >= self.maxRecent:
+ self.recentFiles.pop()
+ self.recentFiles.insert(0, filePath)
+
+ def beginner(self):
+ return self._beginner
+
+ def advanced(self):
+ return not self.beginner()
+
+ def getAvailableScreencastViewer(self):
+ osName = platform.system()
+
+ if osName == 'Windows':
+ return ['C:\\Program Files\\Internet Explorer\\iexplore.exe']
+ elif osName == 'Linux':
+ return ['xdg-open']
+ elif osName == 'Darwin':
+ return ['open']
+
+ ## Callbacks ##
+ def showTutorialDialog(self):
+ subprocess.Popen(self.screencastViewer + [self.screencast])
+
+ def showInfoDialog(self):
+ from libs.__init__ import __version__
+ msg = u'Name:{0} \nApp Version:{1} \n{2} '.format(__appname__, __version__, sys.version_info)
+ QMessageBox.information(self, u'Information', msg)
+
+ def showStepsDialog(self):
+ msg = steps()
+ QMessageBox.information(self, u'Information', msg)
+
+ def createShape(self):
+ assert self.beginner()
+ self.canvas.setEditing(False)
+ self.actions.create.setEnabled(False)
+ self.canvas.fourpoint = False
+
+ def createPolygon(self):
+ assert self.beginner()
+ self.canvas.setEditing(False)
+ self.canvas.fourpoint = True
+ self.actions.create.setEnabled(False)
+
+ def toggleDrawingSensitive(self, drawing=True):
+ """In the middle of drawing, toggling between modes should be disabled."""
+ self.actions.editMode.setEnabled(not drawing)
+ if not drawing and self.beginner():
+ # Cancel creation.
+ print('Cancel creation.')
+ self.canvas.setEditing(True)
+ self.canvas.restoreCursor()
+ self.actions.create.setEnabled(True)
+
+ def toggleDrawMode(self, edit=True):
+ self.canvas.setEditing(edit)
+ self.actions.createMode.setEnabled(edit)
+ self.actions.editMode.setEnabled(not edit)
+
+ def setCreateMode(self):
+ assert self.advanced()
+ self.toggleDrawMode(False)
+
+ def setEditMode(self):
+ assert self.advanced()
+ self.toggleDrawMode(True)
+ self.labelSelectionChanged()
+
+ def updateFileMenu(self):
+ currFilePath = self.filePath
+
+ def exists(filename):
+ return os.path.exists(filename)
+
+ menu = self.menus.recentFiles
+ menu.clear()
+ files = [f for f in self.recentFiles if f !=
+ currFilePath and exists(f)]
+ for i, f in enumerate(files):
+ icon = newIcon('labels')
+ action = QAction(
+ icon, '&%d %s' % (i + 1, QFileInfo(f).fileName()), self)
+ action.triggered.connect(partial(self.loadRecent, f))
+ menu.addAction(action)
+
+ def popLabelListMenu(self, point):
+ self.menus.labelList.exec_(self.labelList.mapToGlobal(point))
+
+ def editLabel(self):
+ if not self.canvas.editing():
+ return
+ item = self.currentItem()
+ if not item:
+ return
+ text = self.labelDialog.popUp(item.text())
+ if text is not None:
+ item.setText(text)
+ # item.setBackground(generateColorByText(text))
+ self.setDirty()
+ self.updateComboBox()
+
+ ######## detection box related functions #######
+
+ def boxItemChanged(self, item):
+ shape = self.itemsToShapesbox[item]
+
+ box = ast.literal_eval(item.text())
+ # print('shape in labelItemChanged is',shape.points)
+ if box != [(p.x(), p.y()) for p in shape.points]:
+ # shape.points = box
+ shape.points = [QPointF(p[0], p[1]) for p in box]
+
+ # QPointF(x,y)
+ # shape.line_color = generateColorByText(shape.label)
+ self.setDirty()
+ else: # User probably changed item visibility
+ self.canvas.setShapeVisible(shape, item.checkState() == Qt.Checked)
+
+ def editBox(self): # ADD
+ if not self.canvas.editing():
+ return
+ item = self.currentBox()
+ if not item:
+ return
+ text = self.labelDialog.popUp(item.text())
+
+ imageSize = str(self.image.size())
+ width, height = self.image.width(), self.image.height()
+ if text:
+ try:
+ text_list = eval(text)
+ except:
+ msg_box = QMessageBox(QMessageBox.Warning, 'Warning', 'Please enter the correct format')
+ msg_box.exec_()
+ return
+ if len(text_list) < 4:
+ msg_box = QMessageBox(QMessageBox.Warning, 'Warning', 'Please enter the coordinates of 4 points')
+ msg_box.exec_()
+ return
+ for box in text_list:
+ if box[0] > width or box[0] < 0 or box[1] > height or box[1] < 0:
+ msg_box = QMessageBox(QMessageBox.Warning, 'Warning', 'Out of picture size')
+ msg_box.exec_()
+ return
+
+ item.setText(text)
+ # item.setBackground(generateColorByText(text))
+ self.setDirty()
+ self.updateComboBox()
+
+ def updateBoxlist(self):
+ shape = self.canvas.selectedShape
+ item = self.shapesToItemsbox[shape] # listitem
+ text = [(int(p.x()), int(p.y())) for p in shape.points]
+ item.setText(str(text))
+ self.setDirty()
+
+ def indexTo5Files(self, currIndex):
+ if currIndex < 2:
+ return self.mImgList[:5]
+ elif currIndex > len(self.mImgList)-3:
+ return self.mImgList[-5:]
+ else:
+ return self.mImgList[currIndex - 2 : currIndex + 3]
+
+
+ # Tzutalin 20160906 : Add file list and dock to move faster
+ def fileitemDoubleClicked(self, item=None):
+ self.currIndex = self.mImgList.index(ustr(os.path.join(os.path.abspath(self.dirname), item.text())))
+ filename = self.mImgList[self.currIndex]
+ if filename:
+ self.mImgList5 = self.indexTo5Files(self.currIndex)
+ # self.additems5(None)
+ self.loadFile(filename)
+
+ def iconitemDoubleClicked(self, item=None):
+ self.currIndex = self.mImgList.index(ustr(os.path.join(item.toolTip())))
+ filename = self.mImgList[self.currIndex]
+ if filename:
+ self.mImgList5 = self.indexTo5Files(self.currIndex)
+ # self.additems5(None)
+ self.loadFile(filename)
+
+ def CanvasSizeChange(self):
+ if len(self.mImgList) > 0:
+ self.zoomWidget.setValue(self.zoomWidgetValue + self.imgsplider.value())
+
+ # Add chris
+ def btnstate(self, item=None):
+ """ Function to handle difficult examples
+ Update on each object """
+ if not self.canvas.editing():
+ return
+
+ item = self.currentItem()
+ if not item: # If not selected Item, take the first one
+ item = self.labelList.item(self.labelList.count() - 1)
+
+ difficult = self.diffcButton.isChecked()
+
+ try:
+ shape = self.itemsToShapes[item]
+ except:
+ pass
+ # Checked and Update
+ try:
+ if difficult != shape.difficult:
+ shape.difficult = difficult
+ self.setDirty()
+ else: # User probably changed item visibility
+ self.canvas.setShapeVisible(shape, item.checkState() == Qt.Checked)
+ except:
+ pass
+
+ # React to canvas signals.
+ def shapeSelectionChanged(self, selected=False):
+ if self._noSelectionSlot:
+ self._noSelectionSlot = False
+ else:
+ shape = self.canvas.selectedShape
+ if shape:
+ self.shapesToItems[shape].setSelected(True)
+ self.shapesToItemsbox[shape].setSelected(True) # ADD
+ else:
+ self.labelList.clearSelection()
+ self.actions.delete.setEnabled(selected)
+ self.actions.copy.setEnabled(selected)
+ self.actions.edit.setEnabled(selected)
+ self.actions.shapeLineColor.setEnabled(selected)
+ self.actions.shapeFillColor.setEnabled(selected)
+
+ def addLabel(self, shape):
+ shape.paintLabel = self.displayLabelOption.isChecked()
+ item = HashableQListWidgetItem(shape.label)
+ item.setFlags(item.flags() | Qt.ItemIsUserCheckable)
+ item.setCheckState(Qt.Checked)
+ # item.setBackground(generateColorByText(shape.label))
+ self.itemsToShapes[item] = shape
+ self.shapesToItems[shape] = item
+ self.labelList.addItem(item)
+ # print('item in add label is ',[(p.x(), p.y()) for p in shape.points], shape.label)
+
+ # ADD for box
+ item = HashableQListWidgetItem(str([(int(p.x()), int(p.y())) for p in shape.points]))
+ # item = QListWidgetItem(str([(p.x(), p.y()) for p in shape.points]))
+ item.setFlags(item.flags() | Qt.ItemIsUserCheckable)
+ item.setCheckState(Qt.Checked)
+ # item.setBackground(generateColorByText(shape.label))
+ self.itemsToShapesbox[item] = shape
+ self.shapesToItemsbox[shape] = item
+ self.BoxList.addItem(item)
+ for action in self.actions.onShapesPresent:
+ action.setEnabled(True)
+ self.updateComboBox()
+
+ def remLabel(self, shape):
+ if shape is None:
+ # print('rm empty label')
+ return
+ item = self.shapesToItems[shape]
+ self.labelList.takeItem(self.labelList.row(item))
+ del self.shapesToItems[shape]
+ del self.itemsToShapes[item]
+ self.updateComboBox()
+
+ # ADD:
+ item = self.shapesToItemsbox[shape]
+ self.BoxList.takeItem(self.BoxList.row(item))
+ del self.shapesToItemsbox[shape]
+ del self.itemsToShapesbox[item]
+ self.updateComboBox()
+
+ def loadLabels(self, shapes):
+ s = []
+ for label, points, line_color, fill_color, difficult in shapes:
+ shape = Shape(label=label)
+ for x, y in points:
+
+ # Ensure the labels are within the bounds of the image. If not, fix them.
+ x, y, snapped = self.canvas.snapPointToCanvas(x, y)
+ if snapped:
+ self.setDirty()
+
+ shape.addPoint(QPointF(x, y))
+ shape.difficult = difficult
+ shape.close()
+ s.append(shape)
+
+ # if line_color:
+ # shape.line_color = QColor(*line_color)
+ # else:
+ # shape.line_color = generateColorByText(label)
+ #
+ # if fill_color:
+ # shape.fill_color = QColor(*fill_color)
+ # else:
+ # shape.fill_color = generateColorByText(label)
+
+ self.addLabel(shape)
+ self.updateComboBox()
+ self.canvas.loadShapes(s)
+
+ def updateComboBox(self):
+ # Get the unique labels and add them to the Combobox.
+ itemsTextList = [str(self.labelList.item(i).text()) for i in range(self.labelList.count())]
+
+ uniqueTextList = list(set(itemsTextList))
+ # Add a null row for showing all the labels
+ uniqueTextList.append("")
+ uniqueTextList.sort()
+
+ # self.comboBox.update_items(uniqueTextList)
+
+ def saveLabels(self, annotationFilePath, mode='Auto'):
+ annotationFilePath = ustr(annotationFilePath)
+ if self.labelFile is None:
+ self.labelFile = LabelFile()
+ self.labelFile.verified = self.canvas.verified
+
+ def format_shape(s):
+ # print('s in saveLabels is ',s)
+ return dict(label=s.label, # str
+ line_color=s.line_color.getRgb(),
+ fill_color=s.fill_color.getRgb(),
+ points=[(p.x(), p.y()) for p in s.points], # QPonitF
+ # add chris
+ difficult=s.difficult) # bool
+
+ shapes = [] if mode == 'Auto' else \
+ [format_shape(shape) for shape in self.canvas.shapes]
+ # Can add differrent annotation formats here
+
+ if self.model == 'paddle':
+ for box in self.result_dic:
+ trans_dic = {"label": box[1][0], "points": box[0], 'difficult': False}
+ if trans_dic["label"] is "" and mode == 'Auto':
+ continue
+ shapes.append(trans_dic)
+
+ try:
+ trans_dic = []
+ for box in shapes:
+ trans_dic.append({"transcription": box['label'], "points": box['points'], 'difficult': False})
+ self.PPlabel[annotationFilePath] = trans_dic
+
+ if mode == 'Auto':
+ self.Cachelabel[annotationFilePath] = trans_dic
+
+ # else:
+ # self.labelFile.save(annotationFilePath, shapes, self.filePath, self.imageData,
+ # self.lineColor.getRgb(), self.fillColor.getRgb())
+ # print('Image:{0} -> Annotation:{1}'.format(self.filePath, annotationFilePath))
+ return True
+ except LabelFileError as e:
+ self.errorMessage(u'Error saving label data', u'%s' % e)
+ return False
+
+ def copySelectedShape(self):
+ self.addLabel(self.canvas.copySelectedShape())
+ # fix copy and delete
+ self.shapeSelectionChanged(True)
+
+
+ def labelSelectionChanged(self):
+ item = self.currentItem()
+ if item and self.canvas.editing():
+ self._noSelectionSlot = True
+ self.canvas.selectShape(self.itemsToShapes[item])
+ shape = self.itemsToShapes[item]
+ # Add Chris
+ self.diffcButton.setChecked(shape.difficult)
+
+ def boxSelectionChanged(self):
+ item = self.currentBox()
+ if item and self.canvas.editing():
+ self._noSelectionSlot = True
+ self.canvas.selectShape(self.itemsToShapesbox[item])
+ shape = self.itemsToShapesbox[item]
+ # Add Chris
+ self.diffcButton.setChecked(shape.difficult)
+
+ def labelItemChanged(self, item):
+ shape = self.itemsToShapes[item]
+ label = item.text()
+ if label != shape.label:
+ shape.label = item.text()
+ # shape.line_color = generateColorByText(shape.label)
+ self.setDirty()
+ else: # User probably changed item visibility
+ self.canvas.setShapeVisible(shape, item.checkState() == Qt.Checked)
+
+ # Callback functions:
+ def newShape(self):
+ """Pop-up and give focus to the label editor.
+
+ position MUST be in global coordinates.
+ """
+ if len(self.labelHist) > 0:
+ self.labelDialog = LabelDialog(
+ parent=self, listItem=self.labelHist)
+
+ # Sync single class mode from PR#106
+ if self.singleClassMode.isChecked() and self.lastLabel:
+ text = self.lastLabel
+ else:
+ text = self.labelDialog.popUp(text=self.prevLabelText)
+ self.lastLabel = text
+
+ # Add Chris
+ self.diffcButton.setChecked(False)
+ if text is not None:
+ self.prevLabelText = self.stringBundle.getString('tempLabel')
+ # generate_color = generateColorByText(text)
+ shape = self.canvas.setLastLabel(text, None, None)#generate_color, generate_color
+ self.addLabel(shape)
+ if self.beginner(): # Switch to edit mode.
+ self.canvas.setEditing(True)
+ self.actions.create.setEnabled(True)
+ else:
+ self.actions.editMode.setEnabled(True)
+ self.setDirty()
+
+ else:
+ # self.canvas.undoLastLine()
+ self.canvas.resetAllLines()
+
+ def scrollRequest(self, delta, orientation):
+ units = - delta / (8 * 15)
+ bar = self.scrollBars[orientation]
+ bar.setValue(bar.value() + bar.singleStep() * units)
+
+ def setZoom(self, value):
+ self.actions.fitWidth.setChecked(False)
+ self.actions.fitWindow.setChecked(False)
+ self.zoomMode = self.MANUAL_ZOOM
+ self.zoomWidget.setValue(value)
+
+ def addZoom(self, increment=10):
+ self.setZoom(self.zoomWidget.value() + increment)
+
+ def zoomRequest(self, delta):
+ # get the current scrollbar positions
+ # calculate the percentages ~ coordinates
+ h_bar = self.scrollBars[Qt.Horizontal]
+ v_bar = self.scrollBars[Qt.Vertical]
+
+ # get the current maximum, to know the difference after zooming
+ h_bar_max = h_bar.maximum()
+ v_bar_max = v_bar.maximum()
+
+ # get the cursor position and canvas size
+ # calculate the desired movement from 0 to 1
+ # where 0 = move left
+ # 1 = move right
+ # up and down analogous
+ cursor = QCursor()
+ pos = cursor.pos()
+ relative_pos = QWidget.mapFromGlobal(self, pos)
+
+ cursor_x = relative_pos.x()
+ cursor_y = relative_pos.y()
+
+ w = self.scrollArea.width()
+ h = self.scrollArea.height()
+
+ # the scaling from 0 to 1 has some padding
+ # you don't have to hit the very leftmost pixel for a maximum-left movement
+ margin = 0.1
+ move_x = (cursor_x - margin * w) / (w - 2 * margin * w)
+ move_y = (cursor_y - margin * h) / (h - 2 * margin * h)
+
+ # clamp the values from 0 to 1
+ move_x = min(max(move_x, 0), 1)
+ move_y = min(max(move_y, 0), 1)
+
+ # zoom in
+ units = delta / (8 * 15)
+ scale = 10
+ self.addZoom(scale * units)
+
+ # get the difference in scrollbar values
+ # this is how far we can move
+ d_h_bar_max = h_bar.maximum() - h_bar_max
+ d_v_bar_max = v_bar.maximum() - v_bar_max
+
+ # get the new scrollbar values
+ new_h_bar_value = h_bar.value() + move_x * d_h_bar_max
+ new_v_bar_value = v_bar.value() + move_y * d_v_bar_max
+
+ h_bar.setValue(new_h_bar_value)
+ v_bar.setValue(new_v_bar_value)
+
+ def setFitWindow(self, value=True):
+ if value:
+ self.actions.fitWidth.setChecked(False)
+ self.zoomMode = self.FIT_WINDOW if value else self.MANUAL_ZOOM
+ self.adjustScale()
+
+ def setFitWidth(self, value=True):
+ if value:
+ self.actions.fitWindow.setChecked(False)
+ self.zoomMode = self.FIT_WIDTH if value else self.MANUAL_ZOOM
+ self.adjustScale()
+
+ def togglePolygons(self, value):
+ for item, shape in self.itemsToShapes.items():
+ item.setCheckState(Qt.Checked if value else Qt.Unchecked)
+
+ def loadFile(self, filePath=None):
+ """Load the specified file, or the last opened file if None."""
+ self.resetState()
+ self.canvas.setEnabled(False)
+ if filePath is None:
+ filePath = self.settings.get(SETTING_FILENAME)
+
+ # Make sure that filePath is a regular python string, rather than QString
+ filePath = ustr(filePath)
+ # Fix bug: An index error after select a directory when open a new file.
+ unicodeFilePath = ustr(filePath)
+ # unicodeFilePath = os.path.abspath(unicodeFilePath)
+ # Tzutalin 20160906 : Add file list and dock to move faster
+ # Highlight the file item
+ if unicodeFilePath and self.fileListWidget.count() > 0:
+ if unicodeFilePath in self.mImgList:
+ index = self.mImgList.index(unicodeFilePath)
+ fileWidgetItem = self.fileListWidget.item(index)
+ print('unicodeFilePath is', unicodeFilePath)
+ fileWidgetItem.setSelected(True)
+ ###
+ self.iconlist.clear()
+ self.additems5(None)
+ for i in range(5):
+ item_tooltip = self.iconlist.item(i).toolTip()
+ # print(i,"---",item_tooltip)
+ if item_tooltip == ustr(filePath):
+ titem = self.iconlist.item(i)
+ titem.setSelected(True)
+ self.iconlist.scrollToItem(titem)
+ break
+ else:
+ self.fileListWidget.clear()
+ self.mImgList.clear()
+ self.iconlist.clear()
+
+ # if unicodeFilePath and self.iconList.count() > 0:
+ # if unicodeFilePath in self.mImgList:
+
+ if unicodeFilePath and os.path.exists(unicodeFilePath):
+ if LabelFile.isLabelFile(unicodeFilePath):
+ try:
+ self.labelFile = LabelFile(unicodeFilePath)
+ except LabelFileError as e:
+ self.errorMessage(u'Error opening file',
+ (u"
%s
"
+ u"
Make sure %s is a valid label file.")
+ % (e, unicodeFilePath))
+ self.status("Error reading %s" % unicodeFilePath)
+ return False
+ self.imageData = self.labelFile.imageData
+ self.lineColor = QColor(*self.labelFile.lineColor)
+ self.fillColor = QColor(*self.labelFile.fillColor)
+ self.canvas.verified = self.labelFile.verified
+ else:
+ # Load image:
+ # read data first and store for saving into label file.
+ self.imageData = read(unicodeFilePath, None)
+ self.labelFile = None
+ self.canvas.verified = False
+
+ image = QImage.fromData(self.imageData)
+ if image.isNull():
+ self.errorMessage(u'Error opening file',
+ u"
Make sure %s is a valid image file." % unicodeFilePath)
+ self.status("Error reading %s" % unicodeFilePath)
+ return False
+ self.status("Loaded %s" % os.path.basename(unicodeFilePath))
+ self.image = image
+ self.filePath = unicodeFilePath
+ self.canvas.loadPixmap(QPixmap.fromImage(image))
+ if self.labelFile:
+ self.loadLabels(self.labelFile.shapes)
+ if self.validFilestate(filePath) is True:
+ self.setClean()
+ else:
+ self.dirty = False
+ self.actions.save.setEnabled(True)
+
+ self.canvas.setEnabled(True)
+ self.adjustScale(initial=True)
+ self.paintCanvas()
+ self.addRecentFile(self.filePath)
+ self.toggleActions(True)
+ self.showBoundingBoxFromPPlabel(filePath)
+
+ self.setWindowTitle(__appname__ + ' ' + filePath)
+
+ # Default : select last item if there is at least one item
+ if self.labelList.count():
+ self.labelList.setCurrentItem(self.labelList.item(self.labelList.count() - 1))
+ self.labelList.item(self.labelList.count() - 1).setSelected(True)
+
+ self.canvas.setFocus(True)
+ return True
+ return False
+
+
+ def showBoundingBoxFromPPlabel(self, filePath):
+ imgidx = self.getImglabelidx(filePath)
+ if imgidx not in self.PPlabel.keys():
+ return
+ shapes = []
+ for box in self.PPlabel[imgidx]:
+ shapes.append((box['transcription'], box['points'], None, None, box['difficult']))
+
+ print(shapes)
+ self.loadLabels(shapes)
+ self.canvas.verified = False
+
+
+ def validFilestate(self, filePath):
+ if filePath not in self.fileStatedict.keys():
+ return None
+ elif self.fileStatedict[filePath] == 1:
+ return True
+ else:
+ return False
+
+ def resizeEvent(self, event):
+ if self.canvas and not self.image.isNull() \
+ and self.zoomMode != self.MANUAL_ZOOM:
+ self.adjustScale()
+ super(MainWindow, self).resizeEvent(event)
+
+ def paintCanvas(self):
+ assert not self.image.isNull(), "cannot paint null image"
+ self.canvas.scale = 0.01 * self.zoomWidget.value()
+ self.canvas.adjustSize()
+ self.canvas.update()
+
+ def adjustScale(self, initial=False):
+ value = self.scalers[self.FIT_WINDOW if initial else self.zoomMode]()
+ self.zoomWidget.setValue(int(100 * value))
+
+ def scaleFitWindow(self):
+ """Figure out the size of the pixmap in order to fit the main widget."""
+ e = 2.0 # So that no scrollbars are generated.
+ w1 = self.centralWidget().width() - e
+ h1 = self.centralWidget().height() - e -110
+ a1 = w1 / h1
+ # Calculate a new scale value based on the pixmap's aspect ratio.
+ w2 = self.canvas.pixmap.width() - 0.0
+ h2 = self.canvas.pixmap.height() - 0.0
+ a2 = w2 / h2
+ return w1 / w2 if a2 >= a1 else h1 / h2
+
+ def scaleFitWidth(self):
+ # The epsilon does not seem to work too well here.
+ w = self.centralWidget().width() - 2.0
+ return w / self.canvas.pixmap.width()
+
+ def closeEvent(self, event):
+ if not self.mayContinue():
+ event.ignore()
+ else:
+ settings = self.settings
+ # If it loads images from dir, don't load it at the begining
+ if self.dirname is None:
+ settings[SETTING_FILENAME] = self.filePath if self.filePath else ''
+ else:
+ settings[SETTING_FILENAME] = ''
+
+ settings[SETTING_WIN_SIZE] = self.size()
+ settings[SETTING_WIN_POSE] = self.pos()
+ settings[SETTING_WIN_STATE] = self.saveState()
+ settings[SETTING_LINE_COLOR] = self.lineColor
+ settings[SETTING_FILL_COLOR] = self.fillColor
+ settings[SETTING_RECENT_FILES] = self.recentFiles
+ settings[SETTING_ADVANCE_MODE] = not self._beginner
+ if self.defaultSaveDir and os.path.exists(self.defaultSaveDir):
+ settings[SETTING_SAVE_DIR] = ustr(self.defaultSaveDir)
+ else:
+ settings[SETTING_SAVE_DIR] = ''
+
+ if self.lastOpenDir and os.path.exists(self.lastOpenDir):
+ settings[SETTING_LAST_OPEN_DIR] = self.lastOpenDir
+ else:
+ settings[SETTING_LAST_OPEN_DIR] = ''
+
+ settings[SETTING_SINGLE_CLASS] = self.singleClassMode.isChecked()
+ settings[SETTING_PAINT_LABEL] = self.displayLabelOption.isChecked()
+ settings[SETTING_DRAW_SQUARE] = self.drawSquaresOption.isChecked()
+ settings.save()
+ try:
+ self.saveFilestate()
+ self.savePPlabel()
+ except:
+ pass
+
+ def loadRecent(self, filename):
+ if self.mayContinue():
+ self.loadFile(filename)
+
+ def scanAllImages(self, folderPath):
+ extensions = ['.%s' % fmt.data().decode("ascii").lower() for fmt in QImageReader.supportedImageFormats()]
+ images = []
+
+ for file in os.listdir(folderPath):
+ if file.lower().endswith(tuple(extensions)):
+ relativePath = os.path.join(folderPath, file)
+ path = ustr(os.path.abspath(relativePath))
+ images.append(path)
+ natural_sort(images, key=lambda x: x.lower())
+ return images
+
+
+
+ def openDirDialog(self, _value=False, dirpath=None, silent=False):
+ if not self.mayContinue():
+ return
+
+ defaultOpenDirPath = dirpath if dirpath else '.'
+ if self.lastOpenDir and os.path.exists(self.lastOpenDir):
+ defaultOpenDirPath = self.lastOpenDir
+ else:
+ defaultOpenDirPath = os.path.dirname(self.filePath) if self.filePath else '.'
+ if silent != True:
+ targetDirPath = ustr(QFileDialog.getExistingDirectory(self,
+ '%s - Open Directory' % __appname__,
+ defaultOpenDirPath,
+ QFileDialog.ShowDirsOnly | QFileDialog.DontResolveSymlinks))
+ else:
+ targetDirPath = ustr(defaultOpenDirPath)
+ self.lastOpenDir = targetDirPath
+ self.importDirImages(targetDirPath)
+
+ def importDirImages(self, dirpath, isDelete = False):
+ if not self.mayContinue() or not dirpath:
+ return
+ if self.defaultSaveDir and self.defaultSaveDir != dirpath:
+ self.saveFilestate()
+ self.savePPlabel()
+
+ if not isDelete:
+ self.loadFilestate(dirpath)
+ self.PPlabelpath = dirpath+ '/Label.txt'
+ self.PPlabel = self.loadLabelFile(self.PPlabelpath)
+ self.Cachelabelpath = dirpath + '/Cache.cach'
+ self.Cachelabel = self.loadLabelFile(self.Cachelabelpath)
+ if self.Cachelabel:
+ self.PPlabel = dict(self.Cachelabel, **self.PPlabel)
+ self.lastOpenDir = dirpath
+ self.dirname = dirpath
+
+
+ self.defaultSaveDir = dirpath
+ self.statusBar().showMessage('%s started. Annotation will be saved to %s' %
+ (__appname__, self.defaultSaveDir))
+ self.statusBar().show()
+
+ self.filePath = None
+ self.fileListWidget.clear()
+ self.mImgList = self.scanAllImages(dirpath)
+ self.mImgList5 = self.mImgList[:5]
+ self.openNextImg()
+ doneicon = newIcon('done')
+ closeicon = newIcon('close')
+ for imgPath in self.mImgList:
+ filename = os.path.basename(imgPath)
+ if self.validFilestate(imgPath) is True:
+ item = QListWidgetItem(doneicon, filename)
+ else:
+ item = QListWidgetItem(closeicon, filename)
+ self.fileListWidget.addItem(item)
+
+ print('dirPath in importDirImages is', dirpath)
+ self.iconlist.clear()
+ self.additems5(dirpath)
+ self.changeFileFolder = True
+ self.haveAutoReced = False
+ self.AutoRecognition.setEnabled(True)
+ self.reRecogButton.setEnabled(True)
+
+ def verifyImg(self, _value=False):
+ # Proceding next image without dialog if having any label
+ if self.filePath is not None:
+ try:
+ self.labelFile.toggleVerify()
+ except AttributeError:
+ # If the labelling file does not exist yet, create if and
+ # re-save it with the verified attribute.
+ self.saveFile()
+ if self.labelFile != None:
+ self.labelFile.toggleVerify()
+ else:
+ return
+
+ self.canvas.verified = self.labelFile.verified
+ self.paintCanvas()
+ self.saveFile()
+
+ def openPrevImg(self, _value=False):
+ if len(self.mImgList) <= 0:
+ return
+
+ if self.filePath is None:
+ return
+
+ currIndex = self.mImgList.index(self.filePath)
+ self.mImgList5 = self.mImgList[:5]
+ if currIndex - 1 >= 0:
+ filename = self.mImgList[currIndex - 1]
+ self.mImgList5 = self.indexTo5Files(currIndex - 1)
+ if filename:
+ self.loadFile(filename)
+
+ def openNextImg(self, _value=False):
+ if not self.mayContinue():
+ return
+
+ if len(self.mImgList) <= 0:
+ return
+
+ filename = None
+ if self.filePath is None:
+ filename = self.mImgList[0]
+ self.mImgList5 = self.mImgList[:5]
+ else:
+ currIndex = self.mImgList.index(self.filePath)
+ if currIndex + 1 < len(self.mImgList):
+ filename = self.mImgList[currIndex + 1]
+ self.mImgList5 = self.indexTo5Files(currIndex + 1)
+ else:
+ self.mImgList5 = self.indexTo5Files(currIndex)
+ if filename:
+ print('file name in openNext is ',filename)
+ self.loadFile(filename)
+
+ def openFile(self, _value=False):
+ if not self.mayContinue():
+ return
+ path = os.path.dirname(ustr(self.filePath)) if self.filePath else '.'
+ formats = ['*.%s' % fmt.data().decode("ascii").lower() for fmt in QImageReader.supportedImageFormats()]
+ filters = "Image & Label files (%s)" % ' '.join(formats + ['*%s' % LabelFile.suffix])
+ filename = QFileDialog.getOpenFileName(self, '%s - Choose Image or Label file' % __appname__, path, filters)
+ if filename:
+ if isinstance(filename, (tuple, list)):
+ filename = filename[0]
+ self.loadFile(filename)
+ # print('filename in openfile is ', self.filePath)
+ self.filePath = None
+ self.fileListWidget.clear()
+ self.iconlist.clear()
+ self.mImgList = [filename]
+ self.openNextImg()
+ if self.validFilestate(filename) is True:
+ item = QListWidgetItem(newIcon('done'), filename)
+ self.setClean()
+ elif self.validFilestate(filename) is None:
+ item = QListWidgetItem(newIcon('close'), filename)
+ else:
+ item = QListWidgetItem(newIcon('close'), filename)
+ self.setDirty()
+ self.fileListWidget.addItem(filename)
+ self.additems5(None)
+ print('opened image is', filename)
+
+ def updateFileListIcon(self, filename):
+ pass
+
+ def saveFile(self, _value=False, mode='Manual'):
+ if self.defaultSaveDir is not None and len(ustr(self.defaultSaveDir)):
+ if self.filePath:
+ imgidx = self.getImglabelidx(self.filePath)
+ self._saveFile(imgidx, mode=mode)
+
+ else:
+ imgFileDir = os.path.dirname(self.filePath)
+ imgFileName = os.path.basename(self.filePath)
+ savedFileName = os.path.splitext(imgFileName)[0]
+ savedPath = os.path.join(imgFileDir, savedFileName)
+ self._saveFile(savedPath if self.labelFile
+ else self.saveFileDialog(removeExt=False), mode=mode)
+
+ def saveFileAs(self, _value=False):
+ assert not self.image.isNull(), "cannot save empty image"
+ self._saveFile(self.saveFileDialog())
+
+ def saveFileDialog(self, removeExt=True):
+ caption = '%s - Choose File' % __appname__
+ filters = 'File (*%s)' % LabelFile.suffix
+ openDialogPath = self.currentPath()
+ dlg = QFileDialog(self, caption, openDialogPath, filters)
+ dlg.setDefaultSuffix(LabelFile.suffix[1:])
+ dlg.setAcceptMode(QFileDialog.AcceptSave)
+ filenameWithoutExtension = os.path.splitext(self.filePath)[0]
+ dlg.selectFile(filenameWithoutExtension)
+ dlg.setOption(QFileDialog.DontUseNativeDialog, False)
+ if dlg.exec_():
+ fullFilePath = ustr(dlg.selectedFiles()[0])
+ if removeExt:
+ return os.path.splitext(fullFilePath)[0] # Return file path without the extension.
+ else:
+ return fullFilePath
+ return ''
+
+ def _saveFile(self, annotationFilePath, mode='Manual'):
+ if mode == 'Manual':
+ if annotationFilePath and self.saveLabels(annotationFilePath, mode=mode):
+ self.setClean()
+ self.statusBar().showMessage('Saved to %s' % annotationFilePath)
+ self.statusBar().show()
+ currIndex = self.mImgList.index(self.filePath)
+ item = self.fileListWidget.item(currIndex)
+ item.setIcon(newIcon('done'))
+
+ self.fileStatedict[self.filePath] = 1
+ if len(self.fileStatedict)%self.autoSaveNum ==0:
+ self.saveFilestate()
+ self.savePPlabel(mode='Auto')
+
+ self.fileListWidget.insertItem(int(currIndex), item)
+ self.openNextImg()
+ self.actions.saveRec.setEnabled(True)
+
+ elif mode == 'Auto':
+ if annotationFilePath and self.saveLabels(annotationFilePath, mode=mode):
+
+ self.setClean()
+ self.statusBar().showMessage('Saved to %s' % annotationFilePath)
+ self.statusBar().show()
+
+ def closeFile(self, _value=False):
+ if not self.mayContinue():
+ return
+ self.resetState()
+ self.setClean()
+ self.toggleActions(False)
+ self.canvas.setEnabled(False)
+ self.actions.saveAs.setEnabled(False)
+
+ def deleteImg(self):
+ deletePath = self.filePath
+ if deletePath is not None:
+ deleteInfo = self.deleteImgDialog()
+ if deleteInfo == QMessageBox.Yes:
+ if platform.system() == 'Windows':
+ from win32com.shell import shell, shellcon
+ shell.SHFileOperation((0, shellcon.FO_DELETE, deletePath, None,
+ shellcon.FOF_SILENT | shellcon.FOF_ALLOWUNDO | shellcon.FOF_NOCONFIRMATION,
+ None, None))
+ # linux
+ elif platform.system() == 'Linux':
+ cmd = 'trash ' + deletePath
+ os.system(cmd)
+ # macOS
+ elif platform.system() == 'Darwin':
+ import subprocess
+ absPath = os.path.abspath(deletePath).replace('\\', '\\\\').replace('"', '\\"')
+ cmd = ['osascript', '-e',
+ 'tell app "Finder" to move {the POSIX file "' + absPath + '"} to trash']
+ print(cmd)
+ subprocess.call(cmd, stdout=open(os.devnull, 'w'))
+
+ if self.filePath in self.fileStatedict.keys():
+ self.fileStatedict.pop(self.filePath)
+ imgidx = self.getImglabelidx(self.filePath)
+ if imgidx in self.PPlabel.keys():
+ self.PPlabel.pop(imgidx)
+ self.openNextImg()
+ self.importDirImages(self.lastOpenDir, isDelete=True)
+
+ def deleteImgDialog(self):
+ yes, cancel = QMessageBox.Yes, QMessageBox.Cancel
+ msg = u'The image will be deleted to the recycle bin'
+ return QMessageBox.warning(self, u'Attention', msg, yes | cancel)
+
+ def resetAll(self):
+ self.settings.reset()
+ self.close()
+ proc = QProcess()
+ proc.startDetached(os.path.abspath(__file__))
+
+ def mayContinue(self): #
+ if not self.dirty:
+ return True
+ else:
+ discardChanges = self.discardChangesDialog()
+ if discardChanges == QMessageBox.No:
+ return True
+ elif discardChanges == QMessageBox.Yes:
+ self.saveFile()
+ return True
+ else:
+ return False
+
+ def discardChangesDialog(self):
+ yes, no, cancel = QMessageBox.Yes, QMessageBox.No, QMessageBox.Cancel
+ msg = u'You have unsaved changes, would you like to save them and proceed?\nClick "No" to undo all changes.'
+ return QMessageBox.warning(self, u'Attention', msg, yes | no | cancel)
+
+ def errorMessage(self, title, message):
+ return QMessageBox.critical(self, title,
+ '
%s
%s' % (title, message))
+
+ def currentPath(self):
+ return os.path.dirname(self.filePath) if self.filePath else '.'
+
+ def chooseColor1(self):
+ color = self.colorDialog.getColor(self.lineColor, u'Choose line color',
+ default=DEFAULT_LINE_COLOR)
+ if color:
+ self.lineColor = color
+ Shape.line_color = color
+ self.canvas.setDrawingColor(color)
+ self.canvas.update()
+ self.setDirty()
+
+ def deleteSelectedShape(self):
+ self.remLabel(self.canvas.deleteSelected())
+ self.setDirty()
+ if self.noShapes():
+ for action in self.actions.onShapesPresent:
+ action.setEnabled(False)
+
+ def chshapeLineColor(self):
+ color = self.colorDialog.getColor(self.lineColor, u'Choose line color',
+ default=DEFAULT_LINE_COLOR)
+ if color:
+ self.canvas.selectedShape.line_color = color
+ self.canvas.update()
+ self.setDirty()
+
+ def chshapeFillColor(self):
+ color = self.colorDialog.getColor(self.fillColor, u'Choose fill color',
+ default=DEFAULT_FILL_COLOR)
+ if color:
+ self.canvas.selectedShape.fill_color = color
+ self.canvas.update()
+ self.setDirty()
+
+ def copyShape(self):
+ self.canvas.endMove(copy=True)
+ self.addLabel(self.canvas.selectedShape)
+ self.setDirty()
+
+ def moveShape(self):
+ self.canvas.endMove(copy=False)
+ self.setDirty()
+
+ def loadPredefinedClasses(self, predefClassesFile):
+ if os.path.exists(predefClassesFile) is True:
+ with codecs.open(predefClassesFile, 'r', 'utf8') as f:
+ for line in f:
+ line = line.strip()
+ if self.labelHist is None:
+ self.labelHist = [line]
+ else:
+ self.labelHist.append(line)
+
+
+ def togglePaintLabelsOption(self):
+ for shape in self.canvas.shapes:
+ shape.paintLabel = self.displayLabelOption.isChecked()
+
+ def toogleDrawSquare(self):
+ self.canvas.setDrawingShapeToSquare(self.drawSquaresOption.isChecked())
+
+ def additems(self, dirpath):
+ for file in self.mImgList:
+ pix = QPixmap(file)
+ _, filename = os.path.split(file)
+ filename, _ = os.path.splitext(filename)
+ item = QListWidgetItem(QIcon(pix.scaled(100, 100, Qt.IgnoreAspectRatio, Qt.FastTransformation)),
+ filename[:10])
+ item.setToolTip(file)
+ self.iconlist.addItem(item)
+
+ def additems5(self, dirpath):
+ for file in self.mImgList5:
+ pix = QPixmap(file)
+ _, filename = os.path.split(file)
+ filename, _ = os.path.splitext(filename)
+ pfilename = filename[:10]
+ if len(pfilename) < 10:
+ lentoken = 12 - len(pfilename)
+ prelen = lentoken // 2
+ bfilename = prelen * " " + pfilename + (lentoken - prelen) * " "
+ # item = QListWidgetItem(QIcon(pix.scaled(100, 100, Qt.KeepAspectRatio, Qt.SmoothTransformation)),filename[:10])
+ item = QListWidgetItem(QIcon(pix.scaled(100, 100, Qt.IgnoreAspectRatio, Qt.FastTransformation)),pfilename)
+ # item.setForeground(QBrush(Qt.white))
+ item.setToolTip(file)
+ self.iconlist.addItem(item)
+ owidth = 0
+ for index in range(len(self.mImgList5)):
+ item = self.iconlist.item(index)
+ itemwidget = self.iconlist.visualItemRect(item)
+ owidth += itemwidget.width()
+ self.iconlist.setMinimumWidth(owidth + 50)
+
+ def getImglabelidx(self, filePath):
+ if platform.system()=='Windows':
+ spliter = '\\'
+ else:
+ spliter = '/'
+ filepathsplit = filePath.split(spliter)[-2:]
+ return filepathsplit[0] + '/' + filepathsplit[1]
+
+ def autoRecognition(self):
+ assert self.mImgList is not None
+ print('Using model from ', self.model)
+
+ uncheckedList = [i for i in self.mImgList if i not in self.fileStatedict.keys()]
+ self.autoDialog = AutoDialog(parent=self, ocr=self.ocr, mImgList=uncheckedList, lenbar=len(uncheckedList))
+ self.autoDialog.popUp()
+ self.currIndex=len(self.mImgList)
+ self.loadFile(self.filePath) # ADD
+ self.haveAutoReced = True
+ self.AutoRecognition.setEnabled(False)
+ self.setDirty()
+ self.saveCacheLabel()
+
+
+ def reRecognition(self):
+ img = cv2.imread(self.filePath)
+ # org_box = [dic['points'] for dic in self.PPlabel[self.getImglabelidx(self.filePath)]]
+ if self.canvas.shapes:
+ self.result_dic = []
+ rec_flag = 0
+ for shape in self.canvas.shapes:
+ box = [[int(p.x()), int(p.y())] for p in shape.points]
+ assert len(box) == 4
+ img_crop = get_rotate_crop_image(img, np.array(box, np.float32))
+ if img_crop is None:
+ msg = 'Can not recognise the detection box in ' + self.filePath + '. Please change manually'
+ QMessageBox.information(self, "Information", msg)
+ return
+ result = self.ocr.ocr(img_crop, cls=True, det=False)
+ if result[0][0] is not '':
+ result.insert(0, box)
+ print('result in reRec is ', result)
+ self.result_dic.append(result)
+ if result[1][0] == shape.label:
+ print('label no change')
+ else:
+ rec_flag += 1
+
+ if len(self.result_dic) > 0 and rec_flag > 0:
+ self.saveFile(mode='Auto')
+ self.loadFile(self.filePath)
+ self.setDirty()
+ elif len(self.result_dic) == len(self.canvas.shapes) and rec_flag == 0:
+ QMessageBox.information(self, "Information", "The recognition result remains unchanged!")
+ else:
+ print('Can not recgonise in ', self.filePath)
+ else:
+ QMessageBox.information(self, "Information", "Draw a box!")
+
+
+ def autolcm(self):
+ print('autolabelchoosemodel')
+
+ def loadFilestate(self, saveDir):
+ self.fileStatepath = saveDir + '/fileState.txt'
+ self.fileStatedict = {}
+ if not os.path.exists(self.fileStatepath):
+ f = open(self.fileStatepath, 'w', encoding='utf-8')
+ else:
+ with open(self.fileStatepath, 'r', encoding='utf-8') as f:
+ states = f.readlines()
+ for each in states:
+ file, state = each.split('\t')
+ self.fileStatedict[file] = 1
+
+
+ def saveFilestate(self):
+ with open(self.fileStatepath, 'w', encoding='utf-8') as f:
+ for key in self.fileStatedict:
+ f.write(key + '\t')
+ f.write(str(self.fileStatedict[key]) + '\n')
+
+
+ def loadLabelFile(self, labelpath):
+ labeldict = {}
+ if not os.path.exists(labelpath):
+ f = open(labelpath, 'w', encoding='utf-8')
+
+ else:
+ with open(labelpath, 'r', encoding='utf-8') as f:
+ data = f.readlines()
+ for each in data:
+ file, label = each.split('\t')
+ if label:
+ label = label.replace('false', 'False')
+ labeldict[file] = eval(label)
+ else:
+ labeldict[file] = []
+ return labeldict
+
+
+ def savePPlabel(self,mode='Manual'):
+ savedfile = [self.getImglabelidx(i) for i in self.fileStatedict.keys()]
+ with open(self.PPlabelpath, 'w', encoding='utf-8') as f:
+ for key in self.PPlabel:
+ if key in savedfile:
+ f.write(key + '\t')
+ f.write(json.dumps(self.PPlabel[key], ensure_ascii=False) + '\n')
+
+ if mode=='Manual':
+ msg = 'Images that have been checked are saved in '+ self.PPlabelpath
+ QMessageBox.information(self, "Information", msg)
+
+ def saveCacheLabel(self):
+ with open(self.Cachelabelpath, 'w', encoding='utf-8') as f:
+ for key in self.Cachelabel:
+ f.write(key + '\t')
+ f.write(json.dumps(self.Cachelabel[key], ensure_ascii=False) + '\n')
+
+ def saveRecResult(self):
+ if None in [self.PPlabelpath, self.PPlabel, self.fileStatedict]:
+ QMessageBox.information(self, "Information", "Save file first")
+ return
+
+ rec_gt_dir = os.path.dirname(self.PPlabelpath) + '/rec_gt.txt'
+ crop_img_dir = os.path.dirname(self.PPlabelpath) + '/crop_img/'
+ if not os.path.exists(crop_img_dir):
+ os.mkdir(crop_img_dir)
+
+ with open(rec_gt_dir, 'w', encoding='utf-8') as f:
+ for key in self.fileStatedict:
+ idx = self.getImglabelidx(key)
+ for i, label in enumerate(self.PPlabel[idx]):
+ img = cv2.imread(key)
+ img_crop = get_rotate_crop_image(img, np.array(label['points'], np.float32))
+ img_name = os.path.splitext(os.path.basename(idx))[0] + '_crop_'+str(i)+'.jpg'
+ cv2.imwrite(crop_img_dir+img_name, img_crop)
+ f.write('crop_img/'+ img_name + '\t')
+ f.write(label['transcription'] + '\n')
+
+ QMessageBox.information(self, "Information", "Cropped images has been saved in "+str(crop_img_dir))
+
+def inverted(color):
+ return QColor(*[255 - v for v in color.getRgb()])
+
+
+def read(filename, default=None):
+ try:
+ with open(filename, 'rb') as f:
+ return f.read()
+ except:
+ return default
+
+
+def get_main_app(argv=[]):
+ """
+ Standard boilerplate Qt application code.
+ Do everything but app.exec_() -- so that we can test the application in one thread
+ """
+ app = QApplication(argv)
+ app.setApplicationName(__appname__)
+ app.setWindowIcon(newIcon("app"))
+ # Tzutalin 201705+: Accept extra agruments to change predefined class file
+ argparser = argparse.ArgumentParser()
+ argparser.add_argument("image_dir", nargs="?")
+ argparser.add_argument("language", default='zh-CN',nargs="?")
+ argparser.add_argument("predefined_classes_file",
+ default=os.path.join(os.path.dirname(__file__), "data", "predefined_classes.txt"),
+ nargs="?")
+ argparser.add_argument("save_dir", nargs="?")
+ args = argparser.parse_args(argv[1:])
+ # Usage : labelImg.py image predefClassFile saveDir
+ win = MainWindow(args.image_dir,
+ args.predefined_classes_file,
+ args.save_dir,
+ args.language)
+ win.show()
+ return app, win
+
+
+def main():
+ '''construct main app and run it'''
+ app, _win = get_main_app(sys.argv)
+ return app.exec_()
+
+
+if __name__ == '__main__':
+
+ resource_file = './libs/resources.py'
+ if not os.path.exists(resource_file):
+ output = os.system('pyrcc5 -o libs/resources.py resources.qrc')
+ assert output is 0, "operate the cmd have some problems ,please check whether there is a in the lib " \
+ "directory resources.py "
+ import libs.resources
+ sys.exit(main())
diff --git a/PPOCRLabel/README.md b/PPOCRLabel/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..93fd64ffe1d0923d3e754e3964fa7c62509d0df0
--- /dev/null
+++ b/PPOCRLabel/README.md
@@ -0,0 +1,80 @@
+# PPOCRLabel
+
+PPOCRLabel是一款适用于OCR领域的半自动化图形标注工具,使用python3和pyqt5编写,支持矩形框标注和四点标注模式,导出格式可直接用于PPOCR检测和识别模型的训练。
+
+
+
+## 安装
+
+### 1. 安装PaddleOCR
+参考[PaddleOCR安装文档](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_ch/installation.md)准备好PaddleOCR
+
+### 2. 安装PPOCRLabel
+#### Windows + Anaconda
+
+下载安装[Anaconda](https://www.anaconda.com/download/#download) (Python 3+)
+
+```
+conda install pyqt=5
+cd ./PPOCRLabel # 将目录切换到PPOCRLabel文件夹下
+pyrcc5 -o libs/resources.py resources.qrc
+python PPOCRLabel.py
+```
+
+#### Ubuntu Linux
+
+```
+sudo apt-get install pyqt5-dev-tools
+sudo apt-get install trash-cli
+cd ./PPOCRLabel # 将目录切换到PPOCRLabel文件夹下
+sudo pip3 install -r requirements/requirements-linux-python3.txt
+make qt5py3
+python3 PPOCRLabel.py
+```
+
+#### macOS
+```
+pip3 install pyqt5
+pip3 uninstall opencv-python # 由于mac版本的opencv与pyqt有冲突,需先手动卸载opencv
+pip3 install opencv-contrib-python-headless # 安装headless版本的open-cv
+cd ./PPOCRLabel # 将目录切换到PPOCRLabel文件夹下
+make qt5py3
+python3 PPOCRLabel.py
+```
+
+## 使用
+
+### 操作步骤
+
+1. 安装与运行:使用上述命令安装与运行程序。
+2. 打开文件夹:在菜单栏点击 “文件” - "打开目录" 选择待标记图片的文件夹[1].
+3. 自动标注:点击 ”自动标注“,使用PPOCR超轻量模型对图片文件名前图片状态[2]为 “X” 的图片进行自动标注。
+4. 手动标注:点击 “矩形标注”(推荐直接在英文模式下点击键盘中的 “W”),用户可对当前图片中模型未检出的部分进行手动绘制标记框。点击键盘P,则使用四点标注模式(或点击“编辑” - “四点标注”),用户依次点击4个点后,双击左键表示标注完成。
+5. 标记框绘制完成后,用户点击 “确认”,检测框会先被预分配一个 “待识别” 标签。
+6. 重新识别:将图片中的所有检测画绘制/调整完成后,点击 “重新识别”,PPOCR模型会对当前图片中的**所有检测框**重新识别[3]。
+7. 内容更改:双击识别结果,对不准确的识别结果进行手动更改。
+8. 保存:点击 “保存”,图片状态切换为 “√”,跳转至下一张。
+9. 删除:点击 “删除图像”,图片将会被删除至回收站。
+10. 标注结果:关闭应用程序或切换文件路径后,手动保存过的标签将会被存放在所打开图片文件夹下的*Label.txt*中。在菜单栏点击 “PaddleOCR” - "保存识别结果"后,会将此类图片的识别训练数据保存在*crop_img*文件夹下,识别标签保存在*rec_gt.txt*中[4]。
+
+### 注意
+
+[1] PPOCRLabel以文件夹为基本标记单位,打开待标记的图片文件夹后,不会在窗口栏中显示图片,而是在点击 "选择文件夹" 之后直接将文件夹下的图片导入到程序中。
+
+[2] 图片状态表示本张图片用户是否手动保存过,未手动保存过即为 “X”,手动保存过为 “√”。点击 “自动标注”按钮后,PPOCRLabel不会对状态为 “√” 的图片重新标注。
+
+[3] 点击“重新识别”后,模型会对图片中的识别结果进行覆盖。因此如果在此之前手动更改过识别结果,有可能在重新识别后产生变动。
+
+[4] PPOCRLabel产生的文件包括一下几种,请勿手动更改其中内容,否则会引起程序出现异常。
+
+| 文件名 | 说明 |
+| :-----------: | :----------------------------------------------------------: |
+| Label.txt | 检测标签,可直接用于PPOCR检测模型训练。用户每保存10张检测结果后,程序会进行自动写入。当用户关闭应用程序或切换文件路径后同样会进行写入。 |
+| fileState.txt | 图片状态标记文件,保存当前文件夹下已经被用户手动确认过的图片名称。 |
+| Cache.cach | 缓存文件,保存模型自动识别的结果。 |
+| rec_gt.txt | 识别标签。可直接用于PPOCR识别模型训练。需用户手动点击菜单栏“PaddleOCR” - "保存识别结果"后产生。 |
+| crop_img | 识别数据。按照检测框切割后的图片。与rec_gt.txt同时产生。 |
+
+### 参考资料
+
+1.[Tzutalin. LabelImg. Git code (2015)](https://github.com/tzutalin/labelImg)
diff --git a/PPOCRLabel/__init__.py b/PPOCRLabel/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/PPOCRLabel/build-tools/.gitignore b/PPOCRLabel/build-tools/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..e05bf6bf57739a813c00bad0c045b224ff37705f
--- /dev/null
+++ b/PPOCRLabel/build-tools/.gitignore
@@ -0,0 +1,12 @@
+*.spec
+build
+dist
+pyinstaller
+python-2.*
+pywin32*
+virtual-wine
+venv_wine
+PyQt4-*
+lxml-*
+windows_v*
+linux_v*
diff --git a/PPOCRLabel/build-tools/README.md b/PPOCRLabel/build-tools/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..8e4cc5dae4af9a75416cd3595de480f72a7bb305
--- /dev/null
+++ b/PPOCRLabel/build-tools/README.md
@@ -0,0 +1,35 @@
+### Deploy to PyPI
+
+```
+cd [ROOT]
+sh build-tools/build-for-pypi.sh
+```
+
+### Build for Ubuntu
+
+```
+cd build-tools
+sh run-in-container.sh
+sh envsetup.sh
+sh build-ubuntu-binary.sh
+```
+
+### Build for Windows
+
+```
+cd build-tools
+sh run-in-container.sh
+sh envsetup.sh
+sh build-windows-binary.sh
+```
+
+### Build for macOS High Sierra
+```
+cd build-tools
+./build-for-macos.sh
+```
+
+Note: If there are some problems, try to
+```
+sudo rm -rf virtual-wne venv_wine
+```
diff --git a/PPOCRLabel/build-tools/build-for-macos.sh b/PPOCRLabel/build-tools/build-for-macos.sh
new file mode 100644
index 0000000000000000000000000000000000000000..dfe926b72a0df1f939301a18be641a2a5adcbad8
--- /dev/null
+++ b/PPOCRLabel/build-tools/build-for-macos.sh
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+brew install python@2
+pip install --upgrade virtualenv
+
+# clone labelimg source
+rm -rf /tmp/labelImgSetup
+mkdir /tmp/labelImgSetup
+cd /tmp/labelImgSetup
+curl https://codeload.github.com/tzutalin/labelImg/zip/master --output labelImg.zip
+unzip labelImg.zip
+rm labelImg.zip
+
+# setup python3 space
+virtualenv --system-site-packages -p python3 /tmp/labelImgSetup/labelImg-py3
+source /tmp/labelImgSetup/labelImg-py3/bin/activate
+cd labelImg-master
+
+# build labelImg app
+pip install py2app
+pip install PyQt5 lxml
+make qt5py3
+rm -rf build dist
+python setup.py py2app -A
+mv "/tmp/labelImgSetup/labelImg-master/dist/labelImg.app" /Applications
+# deactivate python3
+deactivate
+cd ../
+rm -rf /tmp/labelImgSetup
+echo 'DONE'
diff --git a/PPOCRLabel/build-tools/build-for-pypi.sh b/PPOCRLabel/build-tools/build-for-pypi.sh
new file mode 100644
index 0000000000000000000000000000000000000000..d5ad5c7c4b638e68114a477a6342a718ffb878a8
--- /dev/null
+++ b/PPOCRLabel/build-tools/build-for-pypi.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+# Packaging and Release
+docker run --workdir=$(pwd)/ --volume="/home/$USER:/home/$USER" tzutalin/py2qt4 /bin/sh -c 'make qt4py2; make test;sudo python setup.py sdist;sudo python setup.py install'
+
+while true; do
+ read -p "Do you wish to deploy this to PyPI(twine upload dist/* or pip install dist/*)?" yn
+ case $yn in
+ [Yy]* ) docker run -it --rm --workdir=$(pwd)/ --volume="/home/$USER:/home/$USER" tzutalin/py2qt4; break;;
+ [Nn]* ) exit;;
+ * ) echo "Please answer yes or no.";;
+ esac
+done
+# python setup.py register
+# python setup.py sdist upload
+# Net pypi: twine upload dist/*
+
+# Test before upladoing: pip install dist/labelImg.tar.gz
diff --git a/PPOCRLabel/build-tools/build-ubuntu-binary.sh b/PPOCRLabel/build-tools/build-ubuntu-binary.sh
new file mode 100644
index 0000000000000000000000000000000000000000..dbe530287bfe9afe730f00252e414e3728e0b746
--- /dev/null
+++ b/PPOCRLabel/build-tools/build-ubuntu-binary.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+### Ubuntu use pyinstall v3.0
+THIS_SCRIPT_PATH=`readlink -f $0`
+THIS_SCRIPT_DIR=`dirname ${THIS_SCRIPT_PATH}`
+cd pyinstaller
+git checkout v3.2
+cd ${THIS_SCRIPT_DIR}
+
+rm -r build
+rm -r dist
+rm labelImg.spec
+python pyinstaller/pyinstaller.py --hidden-import=xml \
+ --hidden-import=xml.etree \
+ --hidden-import=xml.etree.ElementTree \
+ --hidden-import=lxml.etree \
+ -D -F -n labelImg -c "../labelImg.py" -p ../libs -p ../
+
+FOLDER=$(git describe --abbrev=0 --tags)
+FOLDER="linux_"$FOLDER
+rm -rf "$FOLDER"
+mkdir "$FOLDER"
+cp dist/labelImg $FOLDER
+cp -rf ../data $FOLDER/data
+zip "$FOLDER.zip" -r $FOLDER
diff --git a/PPOCRLabel/build-tools/build-windows-binary.sh b/PPOCRLabel/build-tools/build-windows-binary.sh
new file mode 100644
index 0000000000000000000000000000000000000000..566e88f9db0865da793486c78cc234b85b16c484
--- /dev/null
+++ b/PPOCRLabel/build-tools/build-windows-binary.sh
@@ -0,0 +1,32 @@
+#!/bin/bash
+### Window requires pyinstall v2.1
+wine msiexec -i python-2.7.8.msi
+wine pywin32-218.win32-py2.7.exe
+wine PyQt4-4.11.4-gpl-Py2.7-Qt4.8.7-x32.exe
+wine lxml-3.7.3.win32-py2.7.exe
+
+THIS_SCRIPT_PATH=`readlink -f $0`
+THIS_SCRIPT_DIR=`dirname ${THIS_SCRIPT_PATH}`
+cd pyinstaller
+git checkout v2.1
+cd ${THIS_SCRIPT_DIR}
+echo ${THIS_SCRIPT_DIR}
+
+#. venv_wine/bin/activate
+rm -r build
+rm -r dist
+rm labelImg.spec
+
+wine c:/Python27/python.exe pyinstaller/pyinstaller.py --hidden-import=xml \
+ --hidden-import=xml.etree \
+ --hidden-import=xml.etree.ElementTree \
+ --hidden-import=lxml.etree \
+ -D -F -n labelImg -c "../labelImg.py" -p ../libs -p ../
+
+FOLDER=$(git describe --abbrev=0 --tags)
+FOLDER="windows_"$FOLDER
+rm -rf "$FOLDER"
+mkdir "$FOLDER"
+cp dist/labelImg.exe $FOLDER
+cp -rf ../data $FOLDER/data
+zip "$FOLDER.zip" -r $FOLDER
diff --git a/PPOCRLabel/build-tools/envsetup.sh b/PPOCRLabel/build-tools/envsetup.sh
new file mode 100644
index 0000000000000000000000000000000000000000..242b0c569f5738caad415f34a7f16a620157f6ee
--- /dev/null
+++ b/PPOCRLabel/build-tools/envsetup.sh
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+THIS_SCRIPT_PATH=`readlink -f $0`
+THIS_SCRIPT_DIR=`dirname ${THIS_SCRIPT_PATH}`
+#OS Ubuntu 14.04
+### Common packages for linux/windows
+if [ ! -e "pyinstaller" ]; then
+ git clone https://github.com/pyinstaller/pyinstaller
+ cd pyinstaller
+ git checkout v2.1 -b v2.1
+ cd ${THIS_SCRIPT_DIR}
+fi
+
+echo "Going to clone and download packages for building windows"
+#Pacakges
+#> pyinstaller (2.1)
+#> wine (1.6.2)
+#> virtual-wine (0.1)
+#> python-2.7.8.msi
+#> pywin32-218.win32-py2.7.exe
+
+## tool to install on Ubuntu
+#$ sudo apt-get install wine
+
+### Clone a repo to create virtual wine env
+if [ ! -e "virtual-wine" ]; then
+ git clone https://github.com/htgoebel/virtual-wine.git
+fi
+
+apt-get install scons
+### Create virtual env
+rm -rf venv_wine
+./virtual-wine/vwine-setup venv_wine
+#### Active virutal env
+. venv_wine/bin/activate
+
+### Use wine to install packages to virtual env
+if [ ! -e "python-2.7.8.msi" ]; then
+ wget "https://www.python.org/ftp/python/2.7.8/python-2.7.8.msi"
+fi
+
+if [ ! -e "pywin32-218.win32-py2.7.exe" ]; then
+ wget "http://nchc.dl.sourceforge.net/project/pywin32/pywin32/Build%20218/pywin32-218.win32-py2.7.exe"
+fi
+
+if [ ! -e "PyQt4-4.11.4-gpl-Py2.7-Qt4.8.7-x32.exe" ]; then
+ wget "http://nchc.dl.sourceforge.net/project/pyqt/PyQt4/PyQt-4.11.4/PyQt4-4.11.4-gpl-Py2.7-Qt4.8.7-x32.exe"
+fi
+
+if [ ! -e "lxml-3.7.3.win32-py2.7.exe" ]; then
+ wget "https://pypi.python.org/packages/a3/f6/a28c5cf63873f6c55a3eb7857b736379229b85ba918261d2e88cf886905e/lxml-3.7.3.win32-py2.7.exe#md5=a0f746355876aca4ca5371cb0f1d13ce"
+fi
+
diff --git a/PPOCRLabel/build-tools/run-in-container.sh b/PPOCRLabel/build-tools/run-in-container.sh
new file mode 100644
index 0000000000000000000000000000000000000000..980699d67753a291616c576d723dc4ff898a1e41
--- /dev/null
+++ b/PPOCRLabel/build-tools/run-in-container.sh
@@ -0,0 +1,13 @@
+#!/bin/sh
+docker run -it \
+ --user $(id -u) \
+ -e DISPLAY=unix$DISPLAY \
+ --workdir=$(pwd) \
+ --volume="/home/$USER:/home/$USER" \
+ --volume="/etc/group:/etc/group:ro" \
+ --volume="/etc/passwd:/etc/passwd:ro" \
+ --volume="/etc/shadow:/etc/shadow:ro" \
+ --volume="/etc/sudoers.d:/etc/sudoers.d:ro" \
+ -v /tmp/.X11-unix:/tmp/.X11-unix \
+ tzutalin/py2qt4
+
diff --git a/PPOCRLabel/combobox.py b/PPOCRLabel/combobox.py
new file mode 100644
index 0000000000000000000000000000000000000000..8526b45392902e564364be27948517377217bbeb
--- /dev/null
+++ b/PPOCRLabel/combobox.py
@@ -0,0 +1,46 @@
+# Copyright (c) <2015-Present> Tzutalin
+# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba,
+# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+# associated documentation files (the "Software"), to deal in the Software without restriction, including without
+# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+# The above copyright notice and this permission notice shall be included in all copies or substantial portions of
+# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
+# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+import sys
+try:
+ from PyQt5.QtWidgets import QWidget, QHBoxLayout, QComboBox
+except ImportError:
+ # needed for py3+qt4
+ # Ref:
+ # http://pyqt.sourceforge.net/Docs/PyQt4/incompatible_apis.html
+ # http://stackoverflow.com/questions/21217399/pyqt4-qtcore-qvariant-object-instead-of-a-string
+ if sys.version_info.major >= 3:
+ import sip
+ sip.setapi('QVariant', 2)
+ from PyQt4.QtGui import QWidget, QHBoxLayout, QComboBox
+
+
+class ComboBox(QWidget):
+ def __init__(self, parent=None, items=[]):
+ super(ComboBox, self).__init__(parent)
+
+ layout = QHBoxLayout()
+ self.cb = QComboBox()
+ self.items = items
+ self.cb.addItems(self.items)
+
+ self.cb.currentIndexChanged.connect(parent.comboSelectionChanged)
+
+ layout.addWidget(self.cb)
+ self.setLayout(layout)
+
+ def update_items(self, items):
+ self.items = items
+
+ self.cb.clear()
+ self.cb.addItems(self.items)
diff --git a/PPOCRLabel/data/gif/steps.gif b/PPOCRLabel/data/gif/steps.gif
new file mode 100644
index 0000000000000000000000000000000000000000..6ea998500b4ce5c2f3c3861ce5c9a71c99ae83cb
Binary files /dev/null and b/PPOCRLabel/data/gif/steps.gif differ
diff --git a/PPOCRLabel/data/paddle.png b/PPOCRLabel/data/paddle.png
new file mode 100644
index 0000000000000000000000000000000000000000..b1099c73b54c4a8510fc55f4409b053c8884694c
Binary files /dev/null and b/PPOCRLabel/data/paddle.png differ
diff --git a/PPOCRLabel/data/predefined_classes.txt b/PPOCRLabel/data/predefined_classes.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/PPOCRLabel/libs/__init__.py b/PPOCRLabel/libs/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..0df0cc8460debf585efa11043004ef8838a1da3f
--- /dev/null
+++ b/PPOCRLabel/libs/__init__.py
@@ -0,0 +1,2 @@
+__version_info__ = ('1', '0', '0')
+__version__ = '.'.join(__version_info__)
diff --git a/PPOCRLabel/libs/autoDialog.py b/PPOCRLabel/libs/autoDialog.py
new file mode 100644
index 0000000000000000000000000000000000000000..e1b8e7947e67a7c5a4f2cae02134fdb6f7b067ae
--- /dev/null
+++ b/PPOCRLabel/libs/autoDialog.py
@@ -0,0 +1,150 @@
+try:
+ from PyQt5.QtGui import *
+ from PyQt5.QtCore import *
+ from PyQt5.QtWidgets import *
+except ImportError:
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+
+import json
+
+from libs.utils import newIcon
+
+BB = QDialogButtonBox
+
+
+class Worker(QThread):
+ progressBarValue = pyqtSignal(int)
+ listValue = pyqtSignal(str)
+ endsignal = pyqtSignal(int, str)
+ handle = 0
+
+ def __init__(self, ocr, mImgList, mainThread, model):
+ super(Worker, self).__init__()
+ self.ocr = ocr
+ self.mImgList = mImgList
+ self.mainThread = mainThread
+ self.model = model
+
+ def run(self):
+ try:
+ findex = 0
+ for Imgpath in self.mImgList:
+ if self.handle == 0:
+ self.listValue.emit(Imgpath)
+ if self.model == 'paddle':
+ self.result_dic = self.ocr.ocr(Imgpath, cls=True, det=True)
+
+ # 结果保存
+ if self.result_dic is None or len(self.result_dic) == 0:
+ print('Can not recognise file is : ', Imgpath)
+ pass
+ else:
+ for res in self.result_dic:
+ chars = res[1][0]
+ cond = res[1][1]
+ posi = res[0]
+ self.listValue.emit("文字:" + chars + " 置信度:" + str(cond) + " 坐标:" + json.dumps(posi))
+ self.mainThread.result_dic = self.result_dic
+ self.mainThread.filePath = Imgpath
+ # 保存
+ self.mainThread.saveFile(mode='Auto')
+ findex += 1
+ self.progressBarValue.emit(findex)
+ else:
+ break
+ self.endsignal.emit(0, "readAll")
+ self.exec()
+ except Exception as e:
+ print(e)
+ raise
+
+
+class AutoDialog(QDialog):
+
+ def __init__(self, text="Enter object label", parent=None, ocr=None, mImgList=None, lenbar=0):
+ super(AutoDialog, self).__init__(parent)
+ self.setFixedWidth(1000)
+ self.parent = parent
+ self.ocr = ocr
+ self.mImgList = mImgList
+ self.pb = QProgressBar()
+ self.pb.setRange(0, lenbar)
+ self.pb.setValue(0)
+
+ layout = QVBoxLayout()
+ layout.addWidget(self.pb)
+ self.model = 'paddle'
+ self.listWidget = QListWidget(self)
+ layout.addWidget(self.listWidget)
+
+ self.buttonBox = bb = BB(BB.Ok | BB.Cancel, Qt.Horizontal, self)
+ bb.button(BB.Ok).setIcon(newIcon('done'))
+ bb.button(BB.Cancel).setIcon(newIcon('undo'))
+ bb.accepted.connect(self.validate)
+ bb.rejected.connect(self.reject)
+ layout.addWidget(bb)
+ bb.button(BB.Ok).setEnabled(False)
+
+ self.setLayout(layout)
+ self.setWindowTitle("自动标注中")
+ self.setWindowModality(Qt.ApplicationModal)
+
+ # self.setWindowFlags(Qt.WindowCloseButtonHint)
+
+ self.thread_1 = Worker(self.ocr, self.mImgList, self.parent, 'paddle')
+ self.thread_1.progressBarValue.connect(self.handleProgressBarSingal)
+ self.thread_1.listValue.connect(self.handleListWidgetSingal)
+ self.thread_1.endsignal.connect(self.handleEndsignalSignal)
+
+ def handleProgressBarSingal(self, i):
+ self.pb.setValue(i)
+
+ def handleListWidgetSingal(self, i):
+ self.listWidget.addItem(i)
+ titem = self.listWidget.item(self.listWidget.count() - 1)
+ self.listWidget.scrollToItem(titem)
+
+ def handleEndsignalSignal(self, i, str):
+ if i == 0 and str == "readAll":
+ self.buttonBox.button(BB.Ok).setEnabled(True)
+ self.buttonBox.button(BB.Cancel).setEnabled(False)
+
+ def reject(self):
+ print("reject")
+ self.thread_1.handle = -1
+ self.thread_1.quit()
+ # del self.thread_1
+ # if self.thread_1.isRunning():
+ # self.thread_1.terminate()
+ # self.thread_1.quit()
+ # super(AutoDialog,self).reject()
+ while not self.thread_1.isFinished():
+ pass
+ self.accept()
+
+ def validate(self):
+ self.accept()
+
+ def postProcess(self):
+ try:
+ self.edit.setText(self.edit.text().trimmed())
+ # print(self.edit.text())
+ except AttributeError:
+ # PyQt5: AttributeError: 'str' object has no attribute 'trimmed'
+ self.edit.setText(self.edit.text())
+ print(self.edit.text())
+
+ def popUp(self):
+ self.thread_1.start()
+ return 1 if self.exec_() else None
+
+ def closeEvent(self, event):
+ print("???")
+ # if self.thread_1.isRunning():
+ # self.thread_1.quit()
+ #
+ # # self._thread.terminate()
+ # # del self.thread_1
+ # super(AutoDialog, self).closeEvent(event)
+ self.reject()
diff --git a/PPOCRLabel/libs/canvas.py b/PPOCRLabel/libs/canvas.py
new file mode 100644
index 0000000000000000000000000000000000000000..bb166baca6c900dcb04cf305e8bb8b658a70ab08
--- /dev/null
+++ b/PPOCRLabel/libs/canvas.py
@@ -0,0 +1,798 @@
+# Copyright (c) <2015-Present> Tzutalin
+# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba,
+# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+# associated documentation files (the "Software"), to deal in the Software without restriction, including without
+# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+# The above copyright notice and this permission notice shall be included in all copies or substantial portions of
+# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
+# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+try:
+ from PyQt5.QtGui import *
+ from PyQt5.QtCore import *
+ from PyQt5.QtWidgets import *
+except ImportError:
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+
+#from PyQt4.QtOpenGL import *
+
+from libs.shape import Shape
+from libs.utils import distance
+
+CURSOR_DEFAULT = Qt.ArrowCursor
+CURSOR_POINT = Qt.PointingHandCursor
+CURSOR_DRAW = Qt.CrossCursor
+CURSOR_MOVE = Qt.ClosedHandCursor
+CURSOR_GRAB = Qt.OpenHandCursor
+
+# class Canvas(QGLWidget):
+
+
+class Canvas(QWidget):
+ zoomRequest = pyqtSignal(int)
+ scrollRequest = pyqtSignal(int, int)
+ newShape = pyqtSignal()
+ selectionChanged = pyqtSignal(bool)
+ shapeMoved = pyqtSignal()
+ drawingPolygon = pyqtSignal(bool)
+
+ CREATE, EDIT = list(range(2))
+ _fill_drawing = False # draw shadows
+
+ epsilon = 11.0
+
+ def __init__(self, *args, **kwargs):
+ super(Canvas, self).__init__(*args, **kwargs)
+ # Initialise local state.
+ self.mode = self.EDIT
+ self.shapes = []
+ self.current = None
+ self.selectedShape = None # save the selected shape here
+ self.selectedShapeCopy = None
+ self.drawingLineColor = QColor(0, 0, 255)
+ self.drawingRectColor = QColor(0, 0, 255)
+ self.line = Shape(line_color=self.drawingLineColor)
+ self.prevPoint = QPointF()
+ self.offsets = QPointF(), QPointF()
+ self.scale = 1.0
+ self.pixmap = QPixmap()
+ self.visible = {}
+ self._hideBackround = False
+ self.hideBackround = False
+ self.hShape = None
+ self.hVertex = None
+ self._painter = QPainter()
+ self._cursor = CURSOR_DEFAULT
+ # Menus:
+ self.menus = (QMenu(), QMenu())
+ # Set widget options.
+ self.setMouseTracking(True)
+ self.setFocusPolicy(Qt.WheelFocus)
+ self.verified = False
+ self.drawSquare = False
+ self.fourpoint = True # ADD
+ self.pointnum = 0
+
+ #initialisation for panning
+ self.pan_initial_pos = QPoint()
+
+ def setDrawingColor(self, qColor):
+ self.drawingLineColor = qColor
+ self.drawingRectColor = qColor
+
+ def enterEvent(self, ev):
+ self.overrideCursor(self._cursor)
+
+ def leaveEvent(self, ev):
+ self.restoreCursor()
+
+ def focusOutEvent(self, ev):
+ self.restoreCursor()
+
+ def isVisible(self, shape):
+ return self.visible.get(shape, True)
+
+ def drawing(self):
+ return self.mode == self.CREATE
+
+ def editing(self):
+ return self.mode == self.EDIT
+
+ def setEditing(self, value=True):
+ self.mode = self.EDIT if value else self.CREATE
+ if not value: # Create
+ self.unHighlight()
+ self.deSelectShape()
+ self.prevPoint = QPointF()
+ self.repaint()
+
+ def unHighlight(self):
+ if self.hShape:
+ self.hShape.highlightClear()
+ self.hVertex = self.hShape = None
+
+ def selectedVertex(self):
+ return self.hVertex is not None
+
+
+ def mouseMoveEvent(self, ev):
+ """Update line with last point and current coordinates."""
+ pos = self.transformPos(ev.pos())
+
+ # Update coordinates in status bar if image is opened
+ window = self.parent().window()
+ if window.filePath is not None:
+ self.parent().window().labelCoordinates.setText(
+ 'X: %d; Y: %d' % (pos.x(), pos.y()))
+
+ # Polygon drawing.
+ if self.drawing():
+ self.overrideCursor(CURSOR_DRAW) # ?
+ if self.current:
+ # Display annotation width and height while drawing
+ currentWidth = abs(self.current[0].x() - pos.x())
+ currentHeight = abs(self.current[0].y() - pos.y())
+ self.parent().window().labelCoordinates.setText(
+ 'Width: %d, Height: %d / X: %d; Y: %d' % (currentWidth, currentHeight, pos.x(), pos.y()))
+
+ color = self.drawingLineColor
+ if self.outOfPixmap(pos):
+ # Don't allow the user to draw outside the pixmap.
+ # Clip the coordinates to 0 or max,
+ # if they are outside the range [0, max]
+ size = self.pixmap.size()
+ clipped_x = min(max(0, pos.x()), size.width())
+ clipped_y = min(max(0, pos.y()), size.height())
+ pos = QPointF(clipped_x, clipped_y)
+ elif len(self.current) > 1 and self.closeEnough(pos, self.current[0]) and not self.fourpoint:
+ # Attract line to starting point and colorise to alert the
+ # user:
+ pos = self.current[0]
+ color = self.current.line_color
+ self.overrideCursor(CURSOR_POINT)
+ self.current.highlightVertex(0, Shape.NEAR_VERTEX)
+ elif ( # ADD
+ len(self.current) > 1
+ and self.fourpoint
+ and self.closeEnough(pos, self.current[0])
+ ):
+ # Attract line to starting point and
+ # colorise to alert the user.
+ pos = self.current[0]
+ self.overrideCursor(CURSOR_POINT)
+ self.current.highlightVertex(0, Shape.NEAR_VERTEX)
+
+
+ if self.drawSquare:
+ initPos = self.current[0]
+ minX = initPos.x()
+ minY = initPos.y()
+ min_size = min(abs(pos.x() - minX), abs(pos.y() - minY))
+ directionX = -1 if pos.x() - minX < 0 else 1
+ directionY = -1 if pos.y() - minY < 0 else 1
+ self.line[1] = QPointF(minX + directionX * min_size, minY + directionY * min_size)
+
+ elif self.fourpoint:
+ # self.line[self.pointnum] = pos # OLD
+
+ self.line[0] = self.current[-1]
+ self.line[1] = pos
+
+ else:
+ self.line[1] = pos # pos is the mouse's current position
+
+ self.line.line_color = color
+ self.prevPoint = QPointF() # ?
+ self.current.highlightClear()
+ else:
+ self.prevPoint = pos
+ self.repaint()
+ return
+
+ # Polygon copy moving.
+ if Qt.RightButton & ev.buttons():
+ if self.selectedShapeCopy and self.prevPoint:
+ self.overrideCursor(CURSOR_MOVE)
+ self.boundedMoveShape(self.selectedShapeCopy, pos)
+ self.repaint()
+ elif self.selectedShape:
+ self.selectedShapeCopy = self.selectedShape.copy()
+ self.repaint()
+ return
+
+ # Polygon/Vertex moving.
+ if Qt.LeftButton & ev.buttons():
+ if self.selectedVertex():
+ self.boundedMoveVertex(pos)
+ self.shapeMoved.emit()
+ self.repaint()
+ elif self.selectedShape and self.prevPoint:
+ self.overrideCursor(CURSOR_MOVE)
+ self.boundedMoveShape(self.selectedShape, pos)
+ self.shapeMoved.emit()
+ self.repaint()
+ else:
+ #pan
+ delta_x = pos.x() - self.pan_initial_pos.x()
+ delta_y = pos.y() - self.pan_initial_pos.y()
+ self.scrollRequest.emit(delta_x, Qt.Horizontal)
+ self.scrollRequest.emit(delta_y, Qt.Vertical)
+ self.update()
+ return
+
+ # Just hovering over the canvas, 2 posibilities:
+ # - Highlight shapes
+ # - Highlight vertex
+ # Update shape/vertex fill and tooltip value accordingly.
+ self.setToolTip("Image")
+ for shape in reversed([s for s in self.shapes if self.isVisible(s)]):
+ # Look for a nearby vertex to highlight. If that fails,
+ # check if we happen to be inside a shape.
+ index = shape.nearestVertex(pos, self.epsilon)
+ if index is not None:
+ if self.selectedVertex():
+ self.hShape.highlightClear()
+ self.hVertex, self.hShape = index, shape
+ shape.highlightVertex(index, shape.MOVE_VERTEX)
+ self.overrideCursor(CURSOR_POINT)
+ self.setToolTip("Click & drag to move point")
+ self.setStatusTip(self.toolTip())
+ self.update()
+ break
+ elif shape.containsPoint(pos):
+ if self.selectedVertex():
+ self.hShape.highlightClear()
+ self.hVertex, self.hShape = None, shape
+ self.setToolTip(
+ "Click & drag to move shape '%s'" % shape.label)
+ self.setStatusTip(self.toolTip())
+ self.overrideCursor(CURSOR_GRAB)
+ self.update()
+ break
+ else: # Nothing found, clear highlights, reset state.
+ if self.hShape:
+ self.hShape.highlightClear()
+ self.update()
+ self.hVertex, self.hShape = None, None
+ self.overrideCursor(CURSOR_DEFAULT)
+
+ def mousePressEvent(self, ev):
+ pos = self.transformPos(ev.pos())
+
+ if ev.button() == Qt.LeftButton:
+ if self.drawing():
+ # self.handleDrawing(pos) # OLD
+
+
+ if self.current and self.fourpoint: # ADD IF
+ # Add point to existing shape.
+ print('Adding points in mousePressEvent is ', self.line[1])
+ self.current.addPoint(self.line[1])
+ self.line[0] = self.current[-1]
+ if self.current.isClosed():
+ # print('1111')
+ self.finalise()
+ elif not self.outOfPixmap(pos):
+ # Create new shape.
+ self.current = Shape()# self.current = Shape(shape_type=self.createMode)
+ self.current.addPoint(pos)
+ # if self.createMode == "point":
+ # self.finalise()
+ # else:
+ # if self.createMode == "circle":
+ # self.current.shape_type = "circle"
+ self.line.points = [pos, pos]
+ self.setHiding()
+ self.drawingPolygon.emit(True)
+ self.update()
+
+
+ else:
+ selection = self.selectShapePoint(pos)
+ self.prevPoint = pos
+
+ if selection is None:
+ #pan
+ QApplication.setOverrideCursor(QCursor(Qt.OpenHandCursor))
+ self.pan_initial_pos = pos
+
+ elif ev.button() == Qt.RightButton and self.editing():
+ self.selectShapePoint(pos)
+ self.prevPoint = pos
+ self.update()
+
+ def mouseReleaseEvent(self, ev):
+ if ev.button() == Qt.RightButton:
+ menu = self.menus[bool(self.selectedShapeCopy)]
+ self.restoreCursor()
+ if not menu.exec_(self.mapToGlobal(ev.pos()))\
+ and self.selectedShapeCopy:
+ # Cancel the move by deleting the shadow copy.
+ self.selectedShapeCopy = None
+ self.repaint()
+ elif ev.button() == Qt.LeftButton and self.selectedShape: # OLD
+ if self.selectedVertex():
+ self.overrideCursor(CURSOR_POINT)
+ else:
+ self.overrideCursor(CURSOR_GRAB)
+
+
+ elif ev.button() == Qt.LeftButton and not self.fourpoint:
+ pos = self.transformPos(ev.pos())
+ if self.drawing():
+ self.handleDrawing(pos)
+ else:
+ #pan
+ QApplication.restoreOverrideCursor() # ?
+
+
+ def endMove(self, copy=False):
+ assert self.selectedShape and self.selectedShapeCopy
+ shape = self.selectedShapeCopy
+ #del shape.fill_color
+ #del shape.line_color
+ if copy:
+ self.shapes.append(shape)
+ self.selectedShape.selected = False
+ self.selectedShape = shape
+ self.repaint()
+ else:
+ self.selectedShape.points = [p for p in shape.points]
+ self.selectedShapeCopy = None
+
+ def hideBackroundShapes(self, value):
+ self.hideBackround = value
+ if self.selectedShape:
+ # Only hide other shapes if there is a current selection.
+ # Otherwise the user will not be able to select a shape.
+ self.setHiding(True)
+ self.repaint()
+
+ def handleDrawing(self, pos):
+ if self.current and self.current.reachMaxPoints() is False:
+ if self.fourpoint:
+ targetPos = self.line[self.pointnum]
+ self.current.addPoint(targetPos)
+ print('current points in handleDrawing is ', self.line[self.pointnum])
+ self.update()
+ if self.pointnum == 3:
+ self.finalise()
+
+ else: # 按住送掉后跳到这里
+ initPos = self.current[0]
+ print('initPos', self.current[0])
+ minX = initPos.x()
+ minY = initPos.y()
+ targetPos = self.line[1]
+ maxX = targetPos.x()
+ maxY = targetPos.y()
+ self.current.addPoint(QPointF(maxX, minY))
+ self.current.addPoint(targetPos)
+ self.current.addPoint(QPointF(minX, maxY))
+ self.finalise()
+
+ elif not self.outOfPixmap(pos):
+ print('release')
+ self.current = Shape()
+ self.current.addPoint(pos)
+ self.line.points = [pos, pos]
+ self.setHiding()
+ self.drawingPolygon.emit(True)
+ self.update()
+
+ def setHiding(self, enable=True):
+ self._hideBackround = self.hideBackround if enable else False
+
+ def canCloseShape(self):
+ return self.drawing() and self.current and len(self.current) > 2
+
+ def mouseDoubleClickEvent(self, ev):
+ # We need at least 4 points here, since the mousePress handler
+ # adds an extra one before this handler is called.
+ if self.canCloseShape() and len(self.current) > 3:
+ if not self.fourpoint:
+ self.current.popPoint()
+ self.finalise()
+
+ def selectShape(self, shape):
+ self.deSelectShape()
+ shape.selected = True
+ self.selectedShape = shape
+ self.setHiding()
+ self.selectionChanged.emit(True)
+ self.update()
+
+ def selectShapePoint(self, point):
+ """Select the first shape created which contains this point."""
+ self.deSelectShape()
+ if self.selectedVertex(): # A vertex is marked for selection.
+ index, shape = self.hVertex, self.hShape
+ shape.highlightVertex(index, shape.MOVE_VERTEX)
+ self.selectShape(shape)
+ return self.hVertex
+ for shape in reversed(self.shapes):
+ if self.isVisible(shape) and shape.containsPoint(point):
+ self.selectShape(shape)
+ self.calculateOffsets(shape, point)
+ return self.selectedShape
+ return None
+
+ def calculateOffsets(self, shape, point):
+ rect = shape.boundingRect()
+ x1 = rect.x() - point.x()
+ y1 = rect.y() - point.y()
+ x2 = (rect.x() + rect.width()) - point.x()
+ y2 = (rect.y() + rect.height()) - point.y()
+ self.offsets = QPointF(x1, y1), QPointF(x2, y2)
+
+ def snapPointToCanvas(self, x, y):
+ """
+ Moves a point x,y to within the boundaries of the canvas.
+ :return: (x,y,snapped) where snapped is True if x or y were changed, False if not.
+ """
+ if x < 0 or x > self.pixmap.width() or y < 0 or y > self.pixmap.height():
+ x = max(x, 0)
+ y = max(y, 0)
+ x = min(x, self.pixmap.width())
+ y = min(y, self.pixmap.height())
+ return x, y, True
+
+ return x, y, False
+
+ def boundedMoveVertex(self, pos):
+ index, shape = self.hVertex, self.hShape
+ point = shape[index]
+ if self.outOfPixmap(pos):
+ size = self.pixmap.size()
+ clipped_x = min(max(0, pos.x()), size.width())
+ clipped_y = min(max(0, pos.y()), size.height())
+ pos = QPointF(clipped_x, clipped_y)
+
+ if self.drawSquare:
+ opposite_point_index = (index + 2) % 4
+ opposite_point = shape[opposite_point_index]
+
+ min_size = min(abs(pos.x() - opposite_point.x()), abs(pos.y() - opposite_point.y()))
+ directionX = -1 if pos.x() - opposite_point.x() < 0 else 1
+ directionY = -1 if pos.y() - opposite_point.y() < 0 else 1
+ shiftPos = QPointF(opposite_point.x() + directionX * min_size - point.x(),
+ opposite_point.y() + directionY * min_size - point.y())
+ else:
+ shiftPos = pos - point
+
+ shape.moveVertexBy(index, shiftPos)
+
+ lindex = (index + 1) % 4
+ rindex = (index + 3) % 4
+ lshift = None
+ rshift = None
+ if index % 2 == 0:
+ rshift = QPointF(shiftPos.x(), 0)
+ lshift = QPointF(0, shiftPos.y())
+ else:
+ lshift = QPointF(shiftPos.x(), 0)
+ rshift = QPointF(0, shiftPos.y())
+ shape.moveVertexBy(rindex, rshift)
+ shape.moveVertexBy(lindex, lshift)
+
+ def boundedMoveShape(self, shape, pos):
+ if self.outOfPixmap(pos):
+ return False # No need to move
+ o1 = pos + self.offsets[0]
+ if self.outOfPixmap(o1):
+ pos -= QPointF(min(0, o1.x()), min(0, o1.y()))
+ o2 = pos + self.offsets[1]
+ if self.outOfPixmap(o2):
+ pos += QPointF(min(0, self.pixmap.width() - o2.x()),
+ min(0, self.pixmap.height() - o2.y()))
+ # The next line tracks the new position of the cursor
+ # relative to the shape, but also results in making it
+ # a bit "shaky" when nearing the border and allows it to
+ # go outside of the shape's area for some reason. XXX
+ #self.calculateOffsets(self.selectedShape, pos)
+ dp = pos - self.prevPoint
+ if dp:
+ shape.moveBy(dp)
+ self.prevPoint = pos
+ return True
+ return False
+
+ def deSelectShape(self):
+ if self.selectedShape:
+ self.selectedShape.selected = False
+ self.selectedShape = None
+ self.setHiding(False)
+ self.selectionChanged.emit(False)
+ self.update()
+
+ def deleteSelected(self):
+ if self.selectedShape:
+ shape = self.selectedShape
+ self.shapes.remove(self.selectedShape)
+ self.selectedShape = None
+ self.update()
+ return shape
+
+ def copySelectedShape(self):
+ if self.selectedShape:
+ shape = self.selectedShape.copy()
+ self.deSelectShape()
+ self.shapes.append(shape)
+ shape.selected = True
+ self.selectedShape = shape
+ self.boundedShiftShape(shape)
+ return shape
+
+ def boundedShiftShape(self, shape):
+ # Try to move in one direction, and if it fails in another.
+ # Give up if both fail.
+ point = shape[0]
+ offset = QPointF(2.0, 2.0)
+ self.calculateOffsets(shape, point)
+ self.prevPoint = point
+ if not self.boundedMoveShape(shape, point - offset):
+ self.boundedMoveShape(shape, point + offset)
+
+ def paintEvent(self, event):
+ if not self.pixmap:
+ return super(Canvas, self).paintEvent(event)
+
+ p = self._painter
+ p.begin(self)
+ p.setRenderHint(QPainter.Antialiasing)
+ p.setRenderHint(QPainter.HighQualityAntialiasing)
+ p.setRenderHint(QPainter.SmoothPixmapTransform)
+
+ p.scale(self.scale, self.scale)
+ p.translate(self.offsetToCenter())
+
+ p.drawPixmap(0, 0, self.pixmap)
+ Shape.scale = self.scale
+ for shape in self.shapes:
+ if (shape.selected or not self._hideBackround) and self.isVisible(shape):
+ shape.fill = shape.selected or shape == self.hShape
+ shape.paint(p)
+ if self.current:
+ self.current.paint(p)
+ self.line.paint(p)
+ if self.selectedShapeCopy:
+ self.selectedShapeCopy.paint(p)
+
+ # Paint rect
+ if self.current is not None and len(self.line) == 2 and not self.fourpoint:
+ # print('Drawing rect')
+ leftTop = self.line[0]
+ rightBottom = self.line[1]
+ rectWidth = rightBottom.x() - leftTop.x()
+ rectHeight = rightBottom.y() - leftTop.y()
+ p.setPen(self.drawingRectColor)
+ brush = QBrush(Qt.BDiagPattern)
+ p.setBrush(brush)
+ p.drawRect(leftTop.x(), leftTop.y(), rectWidth, rectHeight)
+
+
+ # ADD:
+ if (
+ self.fillDrawing()
+ and self.fourpoint
+ and self.current is not None
+ and len(self.current.points) >= 2
+ ):
+ print('paint event')
+ drawing_shape = self.current.copy()
+ drawing_shape.addPoint(self.line[1])
+ drawing_shape.fill = True
+ drawing_shape.paint(p)
+
+ if self.drawing() and not self.prevPoint.isNull() and not self.outOfPixmap(self.prevPoint):
+ p.setPen(QColor(0, 0, 0))
+ p.drawLine(self.prevPoint.x(), 0, self.prevPoint.x(), self.pixmap.height())
+ p.drawLine(0, self.prevPoint.y(), self.pixmap.width(), self.prevPoint.y())
+
+ self.setAutoFillBackground(True)
+ if self.verified:
+ pal = self.palette()
+ pal.setColor(self.backgroundRole(), QColor(184, 239, 38, 128))
+ self.setPalette(pal)
+ else:
+ pal = self.palette()
+ pal.setColor(self.backgroundRole(), QColor(232, 232, 232, 255))
+ self.setPalette(pal)
+
+ p.end()
+
+ def fillDrawing(self):
+ return self._fill_drawing
+
+ def transformPos(self, point):
+ """Convert from widget-logical coordinates to painter-logical coordinates."""
+ return point / self.scale - self.offsetToCenter()
+
+ def offsetToCenter(self):
+ s = self.scale
+ area = super(Canvas, self).size()
+ w, h = self.pixmap.width() * s, self.pixmap.height() * s
+ aw, ah = area.width(), area.height()
+ x = (aw - w) / (2 * s) if aw > w else 0
+ y = (ah - h) / (2 * s) if ah > h else 0
+ return QPointF(x, y)
+
+ def outOfPixmap(self, p):
+ w, h = self.pixmap.width(), self.pixmap.height()
+ return not (0 <= p.x() <= w and 0 <= p.y() <= h)
+
+ def finalise(self):
+ assert self.current
+ if self.current.points[0] == self.current.points[-1]:
+ # print('finalse')
+ self.current = None
+ self.drawingPolygon.emit(False)
+ self.update()
+ return
+
+ self.current.close()
+ self.shapes.append(self.current)
+ self.current = None
+ self.setHiding(False)
+ self.newShape.emit()
+ self.update()
+
+ def closeEnough(self, p1, p2):
+ #d = distance(p1 - p2)
+ #m = (p1-p2).manhattanLength()
+ # print "d %.2f, m %d, %.2f" % (d, m, d - m)
+ return distance(p1 - p2) < self.epsilon
+
+ # These two, along with a call to adjustSize are required for the
+ # scroll area.
+ def sizeHint(self):
+ return self.minimumSizeHint()
+
+ def minimumSizeHint(self):
+ if self.pixmap:
+ return self.scale * self.pixmap.size()
+ return super(Canvas, self).minimumSizeHint()
+
+ def wheelEvent(self, ev):
+ qt_version = 4 if hasattr(ev, "delta") else 5
+ if qt_version == 4:
+ if ev.orientation() == Qt.Vertical:
+ v_delta = ev.delta()
+ h_delta = 0
+ else:
+ h_delta = ev.delta()
+ v_delta = 0
+ else:
+ delta = ev.angleDelta()
+ h_delta = delta.x()
+ v_delta = delta.y()
+
+ mods = ev.modifiers()
+ if Qt.ControlModifier == int(mods) and v_delta:
+ self.zoomRequest.emit(v_delta)
+ else:
+ v_delta and self.scrollRequest.emit(v_delta, Qt.Vertical)
+ h_delta and self.scrollRequest.emit(h_delta, Qt.Horizontal)
+ ev.accept()
+
+ def keyPressEvent(self, ev):
+ key = ev.key()
+ if key == Qt.Key_Escape and self.current:
+ print('ESC press')
+ self.current = None
+ self.drawingPolygon.emit(False)
+ self.update()
+ elif key == Qt.Key_Return and self.canCloseShape():
+ self.finalise()
+ elif key == Qt.Key_Left and self.selectedShape:
+ self.moveOnePixel('Left')
+ elif key == Qt.Key_Right and self.selectedShape:
+ self.moveOnePixel('Right')
+ elif key == Qt.Key_Up and self.selectedShape:
+ self.moveOnePixel('Up')
+ elif key == Qt.Key_Down and self.selectedShape:
+ self.moveOnePixel('Down')
+
+ def moveOnePixel(self, direction):
+ # print(self.selectedShape.points)
+ if direction == 'Left' and not self.moveOutOfBound(QPointF(-1.0, 0)):
+ # print("move Left one pixel")
+ self.selectedShape.points[0] += QPointF(-1.0, 0)
+ self.selectedShape.points[1] += QPointF(-1.0, 0)
+ self.selectedShape.points[2] += QPointF(-1.0, 0)
+ self.selectedShape.points[3] += QPointF(-1.0, 0)
+ elif direction == 'Right' and not self.moveOutOfBound(QPointF(1.0, 0)):
+ # print("move Right one pixel")
+ self.selectedShape.points[0] += QPointF(1.0, 0)
+ self.selectedShape.points[1] += QPointF(1.0, 0)
+ self.selectedShape.points[2] += QPointF(1.0, 0)
+ self.selectedShape.points[3] += QPointF(1.0, 0)
+ elif direction == 'Up' and not self.moveOutOfBound(QPointF(0, -1.0)):
+ # print("move Up one pixel")
+ self.selectedShape.points[0] += QPointF(0, -1.0)
+ self.selectedShape.points[1] += QPointF(0, -1.0)
+ self.selectedShape.points[2] += QPointF(0, -1.0)
+ self.selectedShape.points[3] += QPointF(0, -1.0)
+ elif direction == 'Down' and not self.moveOutOfBound(QPointF(0, 1.0)):
+ # print("move Down one pixel")
+ self.selectedShape.points[0] += QPointF(0, 1.0)
+ self.selectedShape.points[1] += QPointF(0, 1.0)
+ self.selectedShape.points[2] += QPointF(0, 1.0)
+ self.selectedShape.points[3] += QPointF(0, 1.0)
+ self.shapeMoved.emit()
+ self.repaint()
+
+ def moveOutOfBound(self, step):
+ points = [p1+p2 for p1, p2 in zip(self.selectedShape.points, [step]*4)]
+ return True in map(self.outOfPixmap, points)
+
+ def setLastLabel(self, text, line_color = None, fill_color = None):
+ assert text
+ self.shapes[-1].label = text
+ if line_color:
+ self.shapes[-1].line_color = line_color
+
+ if fill_color:
+ self.shapes[-1].fill_color = fill_color
+
+ return self.shapes[-1]
+
+ def undoLastLine(self):
+ assert self.shapes
+ self.current = self.shapes.pop()
+ self.current.setOpen()
+ self.line.points = [self.current[-1], self.current[0]]
+ self.drawingPolygon.emit(True)
+
+ def resetAllLines(self):
+ assert self.shapes
+ self.current = self.shapes.pop()
+ self.current.setOpen()
+ self.line.points = [self.current[-1], self.current[0]]
+ self.drawingPolygon.emit(True)
+ self.current = None
+ self.drawingPolygon.emit(False)
+ self.update()
+
+ def loadPixmap(self, pixmap):
+ self.pixmap = pixmap
+ self.shapes = []
+ self.repaint() # 这函数在哪
+
+ def loadShapes(self, shapes):
+ self.shapes = list(shapes)
+ self.current = None
+ self.repaint()
+
+ def setShapeVisible(self, shape, value):
+ self.visible[shape] = value
+ self.repaint()
+
+ def currentCursor(self):
+ cursor = QApplication.overrideCursor()
+ if cursor is not None:
+ cursor = cursor.shape()
+ return cursor
+
+ def overrideCursor(self, cursor):
+ self._cursor = cursor
+ if self.currentCursor() is None:
+ QApplication.setOverrideCursor(cursor)
+ else:
+ QApplication.changeOverrideCursor(cursor)
+
+ def restoreCursor(self):
+ QApplication.restoreOverrideCursor()
+
+ def resetState(self):
+ self.restoreCursor()
+ self.pixmap = None
+ self.update()
+
+ def setDrawingShapeToSquare(self, status):
+ self.drawSquare = status
diff --git a/PPOCRLabel/libs/colorDialog.py b/PPOCRLabel/libs/colorDialog.py
new file mode 100644
index 0000000000000000000000000000000000000000..c70ff76549318ed9e05cc50a5a41483ad986cc83
--- /dev/null
+++ b/PPOCRLabel/libs/colorDialog.py
@@ -0,0 +1,49 @@
+# Copyright (c) <2015-Present> Tzutalin
+# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba,
+# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+# associated documentation files (the "Software"), to deal in the Software without restriction, including without
+# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+# The above copyright notice and this permission notice shall be included in all copies or substantial portions of
+# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
+# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+try:
+ from PyQt5.QtGui import *
+ from PyQt5.QtCore import *
+ from PyQt5.QtWidgets import QColorDialog, QDialogButtonBox
+except ImportError:
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+
+BB = QDialogButtonBox
+
+
+class ColorDialog(QColorDialog):
+
+ def __init__(self, parent=None):
+ super(ColorDialog, self).__init__(parent)
+ self.setOption(QColorDialog.ShowAlphaChannel)
+ # The Mac native dialog does not support our restore button.
+ self.setOption(QColorDialog.DontUseNativeDialog)
+ # Add a restore defaults button.
+ # The default is set at invocation time, so that it
+ # works across dialogs for different elements.
+ self.default = None
+ self.bb = self.layout().itemAt(1).widget()
+ self.bb.addButton(BB.RestoreDefaults)
+ self.bb.clicked.connect(self.checkRestore)
+
+ def getColor(self, value=None, title=None, default=None):
+ self.default = default
+ if title:
+ self.setWindowTitle(title)
+ if value:
+ self.setCurrentColor(value)
+ return self.currentColor() if self.exec_() else None
+
+ def checkRestore(self, button):
+ if self.bb.buttonRole(button) & BB.ResetRole and self.default:
+ self.setCurrentColor(self.default)
diff --git a/PPOCRLabel/libs/constants.py b/PPOCRLabel/libs/constants.py
new file mode 100644
index 0000000000000000000000000000000000000000..58c8222ec52dcdbff7ddda04911f6703a2bdedc7
--- /dev/null
+++ b/PPOCRLabel/libs/constants.py
@@ -0,0 +1,31 @@
+# Copyright (c) <2015-Present> Tzutalin
+# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba,
+# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+# associated documentation files (the "Software"), to deal in the Software without restriction, including without
+# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+# The above copyright notice and this permission notice shall be included in all copies or substantial portions of
+# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
+# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+SETTING_FILENAME = 'filename'
+SETTING_RECENT_FILES = 'recentFiles'
+SETTING_WIN_SIZE = 'window/size'
+SETTING_WIN_POSE = 'window/position'
+SETTING_WIN_GEOMETRY = 'window/geometry'
+SETTING_LINE_COLOR = 'line/color'
+SETTING_FILL_COLOR = 'fill/color'
+SETTING_ADVANCE_MODE = 'advanced'
+SETTING_WIN_STATE = 'window/state'
+SETTING_SAVE_DIR = 'savedir'
+SETTING_PAINT_LABEL = 'paintlabel'
+SETTING_LAST_OPEN_DIR = 'lastOpenDir'
+SETTING_AUTO_SAVE = 'autosave'
+SETTING_SINGLE_CLASS = 'singleclass'
+FORMAT_PASCALVOC='PascalVOC'
+FORMAT_YOLO='YOLO'
+SETTING_DRAW_SQUARE = 'draw/square'
+SETTING_LABEL_FILE_FORMAT= 'labelFileFormat'
+DEFAULT_ENCODING = 'utf-8'
diff --git a/PPOCRLabel/libs/create_ml_io.py b/PPOCRLabel/libs/create_ml_io.py
new file mode 100644
index 0000000000000000000000000000000000000000..a2123b265b8f0f5000de43949ecf77169a574325
--- /dev/null
+++ b/PPOCRLabel/libs/create_ml_io.py
@@ -0,0 +1,143 @@
+# Copyright (c) <2015-Present> Tzutalin
+# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba,
+# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+# associated documentation files (the "Software"), to deal in the Software without restriction, including without
+# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+# The above copyright notice and this permission notice shall be included in all copies or substantial portions of
+# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
+# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+#!/usr/bin/env python
+# -*- coding: utf8 -*-
+import json
+from pathlib import Path
+
+from libs.constants import DEFAULT_ENCODING
+import os
+
+JSON_EXT = '.json'
+ENCODE_METHOD = DEFAULT_ENCODING
+
+
+class CreateMLWriter:
+ def __init__(self, foldername, filename, imgsize, shapes, outputfile, databasesrc='Unknown', localimgpath=None):
+ self.foldername = foldername
+ self.filename = filename
+ self.databasesrc = databasesrc
+ self.imgsize = imgsize
+ self.boxlist = []
+ self.localimgpath = localimgpath
+ self.verified = False
+ self.shapes = shapes
+ self.outputfile = outputfile
+
+ def write(self):
+ if os.path.isfile(self.outputfile):
+ with open(self.outputfile, "r") as file:
+ input_data = file.read()
+ outputdict = json.loads(input_data)
+ else:
+ outputdict = []
+
+ outputimagedict = {
+ "image": self.filename,
+ "annotations": []
+ }
+
+ for shape in self.shapes:
+ points = shape["points"]
+
+ x1 = points[0][0]
+ y1 = points[0][1]
+ x2 = points[1][0]
+ y2 = points[2][1]
+
+ height, width, x, y = self.calculate_coordinates(x1, x2, y1, y2)
+
+ shapedict = {
+ "label": shape["label"],
+ "coordinates": {
+ "x": x,
+ "y": y,
+ "width": width,
+ "height": height
+ }
+ }
+ outputimagedict["annotations"].append(shapedict)
+
+ # check if image already in output
+ exists = False
+ for i in range(0, len(outputdict)):
+ if outputdict[i]["image"] == outputimagedict["image"]:
+ exists = True
+ outputdict[i] = outputimagedict
+ break
+
+ if not exists:
+ outputdict.append(outputimagedict)
+
+ Path(self.outputfile).write_text(json.dumps(outputdict), ENCODE_METHOD)
+
+ def calculate_coordinates(self, x1, x2, y1, y2):
+ if x1 < x2:
+ xmin = x1
+ xmax = x2
+ else:
+ xmin = x2
+ xmax = x1
+ if y1 < y2:
+ ymin = y1
+ ymax = y2
+ else:
+ ymin = y2
+ ymax = y1
+ width = xmax - xmin
+ if width < 0:
+ width = width * -1
+ height = ymax - ymin
+ # x and y from center of rect
+ x = xmin + width / 2
+ y = ymin + height / 2
+ return height, width, x, y
+
+
+class CreateMLReader:
+ def __init__(self, jsonpath, filepath):
+ self.jsonpath = jsonpath
+ self.shapes = []
+ self.verified = False
+ self.filename = filepath.split("/")[-1:][0]
+ try:
+ self.parse_json()
+ except ValueError:
+ print("JSON decoding failed")
+
+ def parse_json(self):
+ with open(self.jsonpath, "r") as file:
+ inputdata = file.read()
+
+ outputdict = json.loads(inputdata)
+ self.verified = True
+
+ if len(self.shapes) > 0:
+ self.shapes = []
+ for image in outputdict:
+ if image["image"] == self.filename:
+ for shape in image["annotations"]:
+ self.add_shape(shape["label"], shape["coordinates"])
+
+ def add_shape(self, label, bndbox):
+ xmin = bndbox["x"] - (bndbox["width"] / 2)
+ ymin = bndbox["y"] - (bndbox["height"] / 2)
+
+ xmax = bndbox["x"] + (bndbox["width"] / 2)
+ ymax = bndbox["y"] + (bndbox["height"] / 2)
+
+ points = [(xmin, ymin), (xmax, ymin), (xmax, ymax), (xmin, ymax)]
+ self.shapes.append((label, points, None, None, True))
+
+ def get_shapes(self):
+ return self.shapes
diff --git a/PPOCRLabel/libs/hashableQListWidgetItem.py b/PPOCRLabel/libs/hashableQListWidgetItem.py
new file mode 100644
index 0000000000000000000000000000000000000000..95c496ff56048f85acc798a79db43cd0d52546b7
--- /dev/null
+++ b/PPOCRLabel/libs/hashableQListWidgetItem.py
@@ -0,0 +1,40 @@
+# Copyright (c) <2015-Present> Tzutalin
+# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba,
+# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+# associated documentation files (the "Software"), to deal in the Software without restriction, including without
+# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+# The above copyright notice and this permission notice shall be included in all copies or substantial portions of
+# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
+# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+import sys
+try:
+ from PyQt5.QtGui import *
+ from PyQt5.QtCore import *
+ from PyQt5.QtWidgets import *
+except ImportError:
+ # needed for py3+qt4
+ # Ref:
+ # http://pyqt.sourceforge.net/Docs/PyQt4/incompatible_apis.html
+ # http://stackoverflow.com/questions/21217399/pyqt4-qtcore-qvariant-object-instead-of-a-string
+ if sys.version_info.major >= 3:
+ import sip
+ sip.setapi('QVariant', 2)
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+
+# PyQt5: TypeError: unhashable type: 'QListWidgetItem'
+
+
+class HashableQListWidgetItem(QListWidgetItem):
+
+ def __init__(self, *args):
+ super(HashableQListWidgetItem, self).__init__(*args)
+
+ def __hash__(self):
+ return hash(id(self))
diff --git a/PPOCRLabel/libs/labelDialog.py b/PPOCRLabel/libs/labelDialog.py
new file mode 100644
index 0000000000000000000000000000000000000000..57071d77b5de0ed70a437734913fe1330edc5162
--- /dev/null
+++ b/PPOCRLabel/libs/labelDialog.py
@@ -0,0 +1,107 @@
+# Copyright (c) <2015-Present> Tzutalin
+# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba,
+# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+# associated documentation files (the "Software"), to deal in the Software without restriction, including without
+# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+# The above copyright notice and this permission notice shall be included in all copies or substantial portions of
+# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
+# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+try:
+ from PyQt5.QtGui import *
+ from PyQt5.QtCore import *
+ from PyQt5.QtWidgets import *
+except ImportError:
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+
+from libs.utils import newIcon, labelValidator
+
+BB = QDialogButtonBox
+
+
+class LabelDialog(QDialog):
+
+ def __init__(self, text="Enter object label", parent=None, listItem=None):
+ super(LabelDialog, self).__init__(parent)
+
+ self.edit = QLineEdit() # OLD
+ # self.edit = QTextEdit()
+ self.edit.setText(text)
+ # self.edit.setValidator(labelValidator()) # 验证有效性
+ self.edit.editingFinished.connect(self.postProcess)
+
+ model = QStringListModel()
+ model.setStringList(listItem)
+ completer = QCompleter()
+ completer.setModel(model)
+ self.edit.setCompleter(completer)
+
+ layout = QVBoxLayout()
+ layout.addWidget(self.edit)
+ self.buttonBox = bb = BB(BB.Ok | BB.Cancel, Qt.Horizontal, self)
+ bb.button(BB.Ok).setIcon(newIcon('done'))
+ bb.button(BB.Cancel).setIcon(newIcon('undo'))
+ bb.accepted.connect(self.validate)
+ bb.rejected.connect(self.reject)
+ layout.addWidget(bb)
+
+ # if listItem is not None and len(listItem) > 0:
+ # self.listWidget = QListWidget(self)
+ # for item in listItem:
+ # self.listWidget.addItem(item)
+ # self.listWidget.itemClicked.connect(self.listItemClick)
+ # self.listWidget.itemDoubleClicked.connect(self.listItemDoubleClick)
+ # layout.addWidget(self.listWidget)
+
+ self.setLayout(layout)
+
+ def validate(self):
+ try:
+ if self.edit.text().trimmed():
+ self.accept()
+ except AttributeError:
+ # PyQt5: AttributeError: 'str' object has no attribute 'trimmed'
+ if self.edit.text().strip():
+ self.accept()
+
+ def postProcess(self):
+ try:
+ self.edit.setText(self.edit.text().trimmed())
+ # print(self.edit.text())
+ except AttributeError:
+ # PyQt5: AttributeError: 'str' object has no attribute 'trimmed'
+ self.edit.setText(self.edit.text())
+ print(self.edit.text())
+
+ def popUp(self, text='', move=True):
+ self.edit.setText(text)
+ self.edit.setSelection(0, len(text))
+ self.edit.setFocus(Qt.PopupFocusReason)
+ if move:
+ cursor_pos = QCursor.pos()
+ parent_bottomRight = self.parentWidget().geometry()
+ max_x = parent_bottomRight.x() + parent_bottomRight.width() - self.sizeHint().width()
+ max_y = parent_bottomRight.y() + parent_bottomRight.height() - self.sizeHint().height()
+ max_global = self.parentWidget().mapToGlobal(QPoint(max_x, max_y))
+ if cursor_pos.x() > max_global.x():
+ cursor_pos.setX(max_global.x())
+ if cursor_pos.y() > max_global.y():
+ cursor_pos.setY(max_global.y())
+ self.move(cursor_pos)
+ return self.edit.text() if self.exec_() else None
+
+ def listItemClick(self, tQListWidgetItem):
+ try:
+ text = tQListWidgetItem.text().trimmed()
+ except AttributeError:
+ # PyQt5: AttributeError: 'str' object has no attribute 'trimmed'
+ text = tQListWidgetItem.text().strip()
+ self.edit.setText(text)
+
+ def listItemDoubleClick(self, tQListWidgetItem):
+ self.listItemClick(tQListWidgetItem)
+ self.validate()
diff --git a/PPOCRLabel/libs/labelFile.py b/PPOCRLabel/libs/labelFile.py
new file mode 100644
index 0000000000000000000000000000000000000000..ebcca26698ba6ca38152b37c653aff842c11ff97
--- /dev/null
+++ b/PPOCRLabel/libs/labelFile.py
@@ -0,0 +1,152 @@
+# Copyright (c) 2016 Tzutalin
+# Create by TzuTaLin
+
+try:
+ from PyQt5.QtGui import QImage
+except ImportError:
+ from PyQt4.QtGui import QImage
+
+from base64 import b64encode, b64decode
+from libs.pascal_voc_io import PascalVocWriter
+from libs.yolo_io import YOLOWriter
+from libs.pascal_voc_io import XML_EXT
+from enum import Enum
+import os.path
+import sys
+
+
+class LabelFileFormat(Enum):
+ PASCAL_VOC= 1
+ YOLO = 2
+
+
+class LabelFileError(Exception):
+ pass
+
+
+class LabelFile(object):
+ # It might be changed as window creates. By default, using XML ext
+ # suffix = '.lif'
+ suffix = XML_EXT
+
+ def __init__(self, filename=None):
+ self.shapes = ()
+ self.imagePath = None
+ self.imageData = None
+ self.verified = False
+
+ def savePascalVocFormat(self, filename, shapes, imagePath, imageData,
+ lineColor=None, fillColor=None, databaseSrc=None):
+ imgFolderPath = os.path.dirname(imagePath)
+ imgFolderName = os.path.split(imgFolderPath)[-1]
+ imgFileName = os.path.basename(imagePath)
+ #imgFileNameWithoutExt = os.path.splitext(imgFileName)[0]
+ # Read from file path because self.imageData might be empty if saving to
+ # Pascal format
+ image = QImage()
+ image.load(imagePath)
+ imageShape = [image.height(), image.width(),
+ 1 if image.isGrayscale() else 3]
+ writer = PascalVocWriter(imgFolderName, imgFileName,
+ imageShape, localImgPath=imagePath)
+ writer.verified = self.verified
+
+ for shape in shapes:
+ points = shape['points']
+ label = shape['label']
+ # Add Chris
+ difficult = int(shape['difficult'])
+ bndbox = LabelFile.convertPoints2BndBox(points)
+ writer.addBndBox(bndbox[0], bndbox[1], bndbox[2], bndbox[3], label, difficult)
+
+ writer.save(targetFile=filename)
+ return
+
+ def saveYoloFormat(self, filename, shapes, imagePath, imageData, classList,
+ lineColor=None, fillColor=None, databaseSrc=None):
+ imgFolderPath = os.path.dirname(imagePath)
+ imgFolderName = os.path.split(imgFolderPath)[-1]
+ imgFileName = os.path.basename(imagePath)
+ #imgFileNameWithoutExt = os.path.splitext(imgFileName)[0]
+ # Read from file path because self.imageData might be empty if saving to
+ # Pascal format
+ image = QImage()
+ image.load(imagePath)
+ imageShape = [image.height(), image.width(),
+ 1 if image.isGrayscale() else 3]
+ writer = YOLOWriter(imgFolderName, imgFileName,
+ imageShape, localImgPath=imagePath)
+ writer.verified = self.verified
+
+ for shape in shapes:
+ points = shape['points']
+ label = shape['label']
+ # Add Chris
+ difficult = int(shape['difficult'])
+ bndbox = LabelFile.convertPoints2BndBox(points)
+ writer.addBndBox(bndbox[0], bndbox[1], bndbox[2], bndbox[3], label, difficult)
+
+ writer.save(targetFile=filename, classList=classList)
+ return
+
+ def toggleVerify(self):
+ self.verified = not self.verified
+
+ ''' ttf is disable
+ def load(self, filename):
+ import json
+ with open(filename, 'rb') as f:
+ data = json.load(f)
+ imagePath = data['imagePath']
+ imageData = b64decode(data['imageData'])
+ lineColor = data['lineColor']
+ fillColor = data['fillColor']
+ shapes = ((s['label'], s['points'], s['line_color'], s['fill_color'])\
+ for s in data['shapes'])
+ # Only replace data after everything is loaded.
+ self.shapes = shapes
+ self.imagePath = imagePath
+ self.imageData = imageData
+ self.lineColor = lineColor
+ self.fillColor = fillColor
+
+ def save(self, filename, shapes, imagePath, imageData, lineColor=None, fillColor=None):
+ import json
+ with open(filename, 'wb') as f:
+ json.dump(dict(
+ shapes=shapes,
+ lineColor=lineColor, fillColor=fillColor,
+ imagePath=imagePath,
+ imageData=b64encode(imageData)),
+ f, ensure_ascii=True, indent=2)
+ '''
+
+ @staticmethod
+ def isLabelFile(filename):
+ fileSuffix = os.path.splitext(filename)[1].lower()
+ return fileSuffix == LabelFile.suffix
+
+ @staticmethod
+ def convertPoints2BndBox(points):
+ xmin = float('inf')
+ ymin = float('inf')
+ xmax = float('-inf')
+ ymax = float('-inf')
+ for p in points:
+ x = p[0]
+ y = p[1]
+ xmin = min(x, xmin)
+ ymin = min(y, ymin)
+ xmax = max(x, xmax)
+ ymax = max(y, ymax)
+
+ # Martin Kersner, 2015/11/12
+ # 0-valued coordinates of BB caused an error while
+ # training faster-rcnn object detector.
+ if xmin < 1:
+ xmin = 1
+
+ if ymin < 1:
+ ymin = 1
+
+ return (int(xmin), int(ymin), int(xmax), int(ymax))
diff --git a/PPOCRLabel/libs/pascal_voc_io.py b/PPOCRLabel/libs/pascal_voc_io.py
new file mode 100644
index 0000000000000000000000000000000000000000..6c58239764de56644d033a6d175740495e0fb917
--- /dev/null
+++ b/PPOCRLabel/libs/pascal_voc_io.py
@@ -0,0 +1,183 @@
+# Copyright (c) <2015-Present> Tzutalin
+# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba,
+# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+# associated documentation files (the "Software"), to deal in the Software without restriction, including without
+# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+# The above copyright notice and this permission notice shall be included in all copies or substantial portions of
+# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
+# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+#!/usr/bin/env python
+# -*- coding: utf8 -*-
+import sys
+from xml.etree import ElementTree
+from xml.etree.ElementTree import Element, SubElement
+from lxml import etree
+import codecs
+from libs.constants import DEFAULT_ENCODING
+from libs.ustr import ustr
+
+
+XML_EXT = '.xml'
+ENCODE_METHOD = DEFAULT_ENCODING
+
+class PascalVocWriter:
+
+ def __init__(self, foldername, filename, imgSize,databaseSrc='Unknown', localImgPath=None):
+ self.foldername = foldername
+ self.filename = filename
+ self.databaseSrc = databaseSrc
+ self.imgSize = imgSize
+ self.boxlist = []
+ self.localImgPath = localImgPath
+ self.verified = False
+
+ def prettify(self, elem):
+ """
+ Return a pretty-printed XML string for the Element.
+ """
+ rough_string = ElementTree.tostring(elem, 'utf8')
+ root = etree.fromstring(rough_string)
+ return etree.tostring(root, pretty_print=True, encoding=ENCODE_METHOD).replace(" ".encode(), "\t".encode())
+ # minidom does not support UTF-8
+ '''reparsed = minidom.parseString(rough_string)
+ return reparsed.toprettyxml(indent="\t", encoding=ENCODE_METHOD)'''
+
+ def genXML(self):
+ """
+ Return XML root
+ """
+ # Check conditions
+ if self.filename is None or \
+ self.foldername is None or \
+ self.imgSize is None:
+ return None
+
+ top = Element('annotation')
+ if self.verified:
+ top.set('verified', 'yes')
+
+ folder = SubElement(top, 'folder')
+ folder.text = self.foldername
+
+ filename = SubElement(top, 'filename')
+ filename.text = self.filename
+
+ if self.localImgPath is not None:
+ localImgPath = SubElement(top, 'path')
+ localImgPath.text = self.localImgPath
+
+ source = SubElement(top, 'source')
+ database = SubElement(source, 'database')
+ database.text = self.databaseSrc
+
+ size_part = SubElement(top, 'size')
+ width = SubElement(size_part, 'width')
+ height = SubElement(size_part, 'height')
+ depth = SubElement(size_part, 'depth')
+ width.text = str(self.imgSize[1])
+ height.text = str(self.imgSize[0])
+ if len(self.imgSize) == 3:
+ depth.text = str(self.imgSize[2])
+ else:
+ depth.text = '1'
+
+ segmented = SubElement(top, 'segmented')
+ segmented.text = '0'
+ return top
+
+ def addBndBox(self, xmin, ymin, xmax, ymax, name, difficult):
+ bndbox = {'xmin': xmin, 'ymin': ymin, 'xmax': xmax, 'ymax': ymax}
+ bndbox['name'] = name
+ bndbox['difficult'] = difficult
+ self.boxlist.append(bndbox)
+
+ def appendObjects(self, top):
+ for each_object in self.boxlist:
+ object_item = SubElement(top, 'object')
+ name = SubElement(object_item, 'name')
+ name.text = ustr(each_object['name'])
+ pose = SubElement(object_item, 'pose')
+ pose.text = "Unspecified"
+ truncated = SubElement(object_item, 'truncated')
+ if int(float(each_object['ymax'])) == int(float(self.imgSize[0])) or (int(float(each_object['ymin']))== 1):
+ truncated.text = "1" # max == height or min
+ elif (int(float(each_object['xmax']))==int(float(self.imgSize[1]))) or (int(float(each_object['xmin']))== 1):
+ truncated.text = "1" # max == width or min
+ else:
+ truncated.text = "0"
+ difficult = SubElement(object_item, 'difficult')
+ difficult.text = str( bool(each_object['difficult']) & 1 )
+ bndbox = SubElement(object_item, 'bndbox')
+ xmin = SubElement(bndbox, 'xmin')
+ xmin.text = str(each_object['xmin'])
+ ymin = SubElement(bndbox, 'ymin')
+ ymin.text = str(each_object['ymin'])
+ xmax = SubElement(bndbox, 'xmax')
+ xmax.text = str(each_object['xmax'])
+ ymax = SubElement(bndbox, 'ymax')
+ ymax.text = str(each_object['ymax'])
+
+ def save(self, targetFile=None):
+ root = self.genXML()
+ self.appendObjects(root)
+ out_file = None
+ if targetFile is None:
+ out_file = codecs.open(
+ self.filename + XML_EXT, 'w', encoding=ENCODE_METHOD)
+ else:
+ out_file = codecs.open(targetFile, 'w', encoding=ENCODE_METHOD)
+
+ prettifyResult = self.prettify(root)
+ out_file.write(prettifyResult.decode('utf8'))
+ out_file.close()
+
+
+class PascalVocReader:
+
+ def __init__(self, filepath):
+ # shapes type:
+ # [labbel, [(x1,y1), (x2,y2), (x3,y3), (x4,y4)], color, color, difficult]
+ self.shapes = []
+ self.filepath = filepath
+ self.verified = False
+ try:
+ self.parseXML()
+ except:
+ pass
+
+ def getShapes(self):
+ return self.shapes
+
+ def addShape(self, label, bndbox, difficult):
+ xmin = int(float(bndbox.find('xmin').text))
+ ymin = int(float(bndbox.find('ymin').text))
+ xmax = int(float(bndbox.find('xmax').text))
+ ymax = int(float(bndbox.find('ymax').text))
+ points = [(xmin, ymin), (xmax, ymin), (xmax, ymax), (xmin, ymax)]
+ self.shapes.append((label, points, None, None, difficult))
+
+ def parseXML(self):
+ assert self.filepath.endswith(XML_EXT), "Unsupport file format"
+ parser = etree.XMLParser(encoding=ENCODE_METHOD)
+ xmltree = ElementTree.parse(self.filepath, parser=parser).getroot()
+ filename = xmltree.find('filename').text
+ try:
+ verified = xmltree.attrib['verified']
+ if verified == 'yes':
+ self.verified = True
+ except KeyError:
+ self.verified = False
+
+ for object_iter in xmltree.findall('object'):
+ bndbox = object_iter.find("bndbox")
+ label = object_iter.find('name').text
+ # Add chris
+ difficult = False
+ if object_iter.find('difficult') is not None:
+ difficult = bool(int(object_iter.find('difficult').text))
+ self.addShape(label, bndbox, difficult)
+ return True
diff --git a/PPOCRLabel/libs/resources.py b/PPOCRLabel/libs/resources.py
new file mode 100644
index 0000000000000000000000000000000000000000..4c710897f67bab45518eead381c186adf0be2601
--- /dev/null
+++ b/PPOCRLabel/libs/resources.py
@@ -0,0 +1,8515 @@
+# -*- coding: utf-8 -*-
+
+# Resource object code
+#
+# Created by: The Resource Compiler for PyQt5 (Qt v5.15.1)
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore
+
+qt_resource_data = b"\
+\x00\x00\x02\x86\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\
+\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\x12\x00\x00\
+\x0b\x12\x01\xd2\xdd\x7e\xfc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\
+\xd2\x02\x01\x0b\x00\x03\xc4\x02\x9d\xda\x00\x00\x02\x03\x49\x44\
+\x41\x54\x78\xda\xbd\x95\xbf\xab\xda\x50\x14\xc7\x3f\x79\x7d\x2d\
+\x0a\xa5\x94\x82\x98\x74\x2b\x05\x41\xfa\x63\x08\x8a\xbc\xff\xc1\
+\xff\xc1\x31\x05\x41\xb2\xb9\x14\xb4\x0e\xdd\x8a\x6e\x25\x20\xd4\
+\xd1\xcd\x41\xe7\x2e\x19\x44\x04\x47\xfd\x0b\x1e\xa8\x9b\xa0\x49\
+\x90\x36\xb7\x4b\xae\xcd\x8b\xfa\x12\x2d\xf4\xc0\x81\x5c\xc8\x3d\
+\x9f\x73\xee\xf7\xdc\x73\xe1\x3f\xd9\x17\x40\x5c\xe8\x9f\x81\xa7\
+\x80\x92\x04\x20\x46\xa3\x91\xf0\x3c\x2f\xd6\x1d\xc7\x11\xb6\x6d\
+\x4b\xc8\xab\x00\x72\xd6\x24\x5d\x78\x9e\xc7\x66\xb3\x49\x5c\x72\
+\x36\x9b\x05\x78\x0b\xac\x81\x5d\x00\x3c\xb2\xdb\xf0\x62\x30\x18\
+\xb0\x5e\xaf\x01\x48\xa5\x52\x54\x2a\x15\xa6\xd3\x29\xb3\xd9\x0c\
+\xc3\x30\xb0\x2c\x0b\x5d\xd7\x29\x16\x8b\x72\x4b\x2a\x88\xa1\x9c\
+\x03\x5c\x54\x81\x10\x7f\x63\xa8\xaa\x0a\xf0\x11\xb8\x07\x36\x80\
+\x7f\x6a\xcb\x03\x40\xb5\x5a\xc5\x75\x5d\xda\xed\x36\xad\x56\x8b\
+\x6c\x36\x8b\xae\xeb\x14\x0a\x05\x19\xf0\x12\x33\x80\x1f\x84\x00\
+\x62\xb5\x5a\x9d\x74\x40\x0c\x87\x43\x91\xd4\xe6\xf3\xf9\xa1\x09\
+\xce\x6a\x20\xcf\x5c\x1e\x4b\xb9\x5c\x4e\x9c\x7a\x3e\x9f\x97\x9f\
+\x2f\x63\x35\x10\x42\xa0\xaa\x2a\x42\x08\xfa\xfd\x3e\xcb\xe5\x12\
+\x80\x74\x3a\x8d\x61\x18\x8c\xc7\x63\x26\x93\x09\xa6\x69\xd2\xe9\
+\x74\x28\x95\x4a\xdc\xdd\xdd\xa1\x28\x0a\xc0\xbb\x93\x1a\x00\x07\
+\x1d\x32\x99\x0c\xcd\x66\xf3\x81\xc0\x49\x2c\x00\x7c\x88\xad\xc0\
+\xf7\x7d\x34\x4d\x43\x08\x41\xad\x56\xc3\x71\x1c\xba\xdd\x2e\xf5\
+\x7a\x1d\x4d\xd3\x0e\x19\x87\x2b\x39\x0b\xe8\xf5\x7a\x27\x35\x68\
+\x34\x1a\xd7\x56\xf0\xfe\x00\xd8\xed\x76\x6c\xb7\xdb\xc4\x1a\xc8\
+\x33\x07\x0e\x55\x58\x96\x85\xeb\xba\x98\xa6\x79\x0c\xb0\x6d\x9b\
+\x5c\x2e\xf7\x28\xe0\x5f\x2a\xf8\x04\x7c\x8f\xbb\xc5\x52\x03\x20\
+\x56\x87\x28\xe0\x16\x78\x0e\xbc\x00\x9e\x05\x23\x44\xfa\x6b\xe0\
+\xe7\xb5\x5d\x24\x2f\xda\x6f\x60\x0b\xec\x81\x9b\xd0\x8c\x52\x80\
+\x95\xdc\x74\x89\x06\xd1\x59\x14\x1d\x7e\xe1\xb5\x02\xfc\xba\x56\
+\x83\x9b\xe8\x51\x47\xdc\x97\x53\x72\xb1\x58\x24\x0e\x1e\xfa\xd7\
+\x4f\x94\x0c\xf0\xf5\x8a\x27\xf5\x1b\xf0\x46\x49\x98\xd4\x63\x4d\
+\xa0\x44\xdf\x96\xc0\xf7\xc0\x26\x29\x40\x01\x9e\x04\xc1\xa3\x4d\
+\x70\x2a\x86\x08\x1a\x67\xaf\x5c\xf8\x88\xc4\x35\xc5\x91\x9e\x7f\
+\x00\xb7\xae\x9e\x43\x7d\xb2\x82\x67\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x07\xe2\
+\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\x00\x57\x02\xf9\x87\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\
+\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\x07\x74\x49\x44\x41\x54\x78\xda\xd5\
+\x59\x69\x4c\x54\x57\x18\x35\x21\xe2\x8a\xfc\x20\x10\x11\xca\xa8\
+\xd8\x61\x70\x60\x06\x4a\x91\xaa\x58\x94\x68\x54\xa4\x2e\x35\x26\
+\x60\x63\xa8\x68\x30\x06\xe2\xb8\x47\x62\x0d\xee\x8a\x8e\xe2\x86\
+\xbb\x8e\xbb\xb8\xa2\xe3\x2e\x28\x6e\xe3\x8a\x8e\xbb\xb8\x27\x28\
+\x7f\xc4\xa4\x09\x86\x5f\xfe\x38\xbd\xe7\xbe\xe2\x65\x22\x10\x41\
+\x68\x99\x97\x7c\x2c\x61\xde\x7b\xe7\x7c\xdf\xf9\xce\xfd\xee\xa5\
+\x05\x80\x16\x8d\x75\xf5\x8a\x8a\xf2\x16\x61\x13\x51\x24\x22\xa5\
+\x45\x13\x5f\x00\xe4\x97\xc6\x02\x6f\xee\x63\x36\xbf\x1d\xd3\xa6\
+\x0d\x2c\x9e\x9e\x18\xa0\xd7\xe3\x07\x7f\x7f\x9d\x3b\x10\x20\x78\
+\x0b\x01\x67\xb4\x6d\x0b\xc7\xd0\xa1\xb0\xf7\xe8\x81\xe1\xfe\xfe\
+\xe8\xa6\xd3\xa5\x35\x5f\x02\x4a\x32\xf9\x04\x9b\xd9\xa1\x03\x4a\
+\x4f\x9e\x04\x4e\x9f\x76\x03\x02\x4a\x32\xce\x3f\xda\xb7\x47\x6e\
+\x74\x34\x2a\x5f\xbf\x06\x00\xf7\x20\xc0\x06\x8d\x37\x18\xfe\xfe\
+\x53\x68\xbd\x30\x3d\x1d\xa8\xa8\x00\x3e\x7f\xd6\x42\x54\xa1\x99\
+\x12\x50\x2e\xf3\x5b\x60\x20\x2c\xad\x5a\xa1\x74\xff\x7e\xe0\xd3\
+\x27\xd7\x38\x76\xac\x59\x12\x20\x78\x1d\x25\x93\xe4\xed\x0d\xab\
+\x68\xd8\xca\x9b\x37\x81\x8f\x1f\x81\xf2\x72\x15\x1f\x3e\x00\x87\
+\x0f\x7f\x21\x10\xd1\xbd\xfb\x26\xde\xf7\x7f\x13\x20\xf8\x61\x94\
+\x0c\x2d\xd2\x9e\x9c\x0c\xbc\x79\x03\x94\x95\x01\xef\xdf\x6b\xf1\
+\xee\x9d\x16\xa5\xa5\x40\x5e\x9e\x24\x40\x79\xfd\xee\xe7\x87\x04\
+\x9d\x0e\x24\x2e\x9e\x91\x45\x32\xff\x35\x01\x82\xcf\x21\x88\x8c\
+\x76\xed\x50\xb2\x6a\x95\x06\x9e\x0d\xcb\x78\xf5\x4a\x8b\x97\x2f\
+\x81\x17\x2f\xb4\x78\xfe\x1c\x28\x29\x41\x69\x7e\x3e\x1c\x8b\x16\
+\xc1\x36\x68\x10\x2c\x5e\x5e\x60\xe5\x06\x06\x07\x83\xae\x25\x22\
+\xae\x89\x09\x28\xc9\x8c\xf2\xf1\xc1\xfc\xa0\x20\x94\x9f\x38\x21\
+\x81\xe1\xd9\x33\xe0\xe9\x53\x2d\x9e\x3c\x01\x1e\x3f\x06\x1e\x3d\
+\x02\x1e\x3e\xd4\xe2\xc1\x03\xe0\xfe\x7d\xc0\xe9\x04\xee\xdd\xd3\
+\xe2\xee\x5d\x38\x17\x2e\x84\xd5\x68\x64\x65\x64\x55\xd8\x4b\x7c\
+\x47\x93\x10\x60\x86\xe2\xc2\xc2\xa4\x64\xf2\x12\x12\x80\x5b\xb7\
+\x6a\x04\x47\x60\x28\x2e\x06\xee\xdc\x01\x6e\xdf\xd6\x3e\xc7\xde\
+\xb8\x71\x03\xb8\x7e\x5d\x0b\x87\x03\xb8\x76\x0d\xb8\x7a\x15\xb8\
+\x72\x45\x56\xd1\xda\xb5\x2b\x68\xbf\x94\x25\x1d\xad\x51\x09\x50\
+\xab\x2c\x75\x86\x78\x81\x73\xce\x9c\xda\x40\xd6\x08\x0e\x97\x2f\
+\x03\x97\x2e\x01\x45\x45\xc0\xc5\x8b\xc0\x85\x0b\x40\x61\x21\x70\
+\xfe\xbc\x16\x67\xcf\x02\x67\xce\xc8\xb5\xc2\x39\x71\x22\x2c\x2d\
+\x5b\x82\x8e\xc6\x6a\x7c\x1f\x01\x65\x91\x45\x6c\x3c\x4a\xa6\x74\
+\xeb\xd6\x9a\x80\xd6\x0c\xb2\xa0\x40\x03\x78\xee\x9c\x02\x79\xea\
+\x94\x5c\x13\x40\xe9\xd9\xed\xd2\x5e\x21\xfa\x02\x47\x8f\x02\x47\
+\x8e\x00\x87\x0e\xa1\x72\xdd\x3a\x58\x85\x5b\x51\xa6\x94\x2b\x31\
+\x34\x88\x00\xb5\x18\x6b\x36\x4b\xc9\xd8\xfa\xf4\x41\xe5\xf1\xe3\
+\x35\x81\x65\x36\x6b\x07\x4a\x90\xbc\x8f\x40\x35\x90\xd2\x52\x71\
+\xf0\x20\x70\xe0\x80\x74\x27\xec\xdb\x07\xec\xdd\x0b\xec\xde\x0d\
+\xec\xda\x05\xec\xdc\x09\x6c\xde\x0c\x9b\xe8\x0d\xbe\x5b\x91\xa8\
+\x3f\x01\x0b\x5d\xa2\xd0\x62\xd1\x40\xec\xd9\x43\x70\x5a\x66\x5d\
+\xc1\x32\xa3\x0a\xac\x96\x51\x02\x65\x46\xab\x03\xe5\x33\x14\xd0\
+\x1d\x3b\x80\xed\xdb\x81\x6d\xdb\x80\x2d\x5b\x24\x68\x6c\xdc\x08\
+\x6c\xd8\x00\xac\x5f\x0f\xe4\xe4\xc0\x11\x1b\xeb\x42\xa2\xbe\x04\
+\xe2\xe8\x0c\x16\xa1\xfb\x92\x4d\x9b\x98\x79\xbe\x80\x2f\xd4\xc0\
+\xa9\xcc\xba\x66\x95\x2b\xb1\x06\x56\x65\xd4\x66\xd3\xee\xa3\x04\
+\xab\x03\xcd\xcd\x05\xd6\xae\x05\xd6\xac\x01\x68\xc7\x2b\x57\x02\
+\x2b\x56\x00\xcb\x97\x03\xd9\xd9\x80\x70\xa9\x3c\xa3\x51\x36\x77\
+\x4c\x64\xe4\x29\x81\xcf\xa3\xbe\x3d\x90\xd2\xcf\x60\xa8\x90\xf3\
+\xcd\xd4\xa9\xd4\xbf\x06\xc8\x6a\xd5\x5e\x46\x62\xfc\x5d\x49\x40\
+\x65\x56\x03\xcb\xcf\xb8\x82\x5d\xbd\x5a\x81\xe5\x73\x96\x2d\x03\
+\x96\x2e\x05\x16\x2f\x06\xc4\x1a\x81\x05\x0b\x80\x79\xf3\x80\xac\
+\x2c\x80\x86\x21\xde\x6b\xeb\xd4\x09\xec\xc3\x68\xb3\x39\xbb\xde\
+\x2e\x24\x96\xfe\x9e\xbd\xc3\xc3\x9f\xc8\x09\x33\x2e\x0e\x95\xd4\
+\x3e\x25\x43\x00\x4b\x96\xf0\xa5\xcc\x14\x7f\x66\xf6\x08\x4e\x03\
+\x29\x9a\x51\x65\x56\x81\x65\x66\xf9\x59\xde\xf3\x15\xd8\xd9\xb3\
+\x81\x19\x33\x80\x49\x93\x80\x71\xe3\x00\xae\xf0\x62\x2f\x51\x19\
+\x1f\x8f\xf9\xe2\xfd\x74\x42\x81\x27\xb1\xde\x36\x1a\xda\xad\x9b\
+\x1f\x4b\x28\x67\x7c\x11\xa5\xcc\x38\x1b\x9a\x20\x49\x60\xfe\x7c\
+\x60\xee\x5c\x05\x62\xd6\x2c\x60\xe6\x4c\x60\xda\x34\xfe\xac\x81\
+\x62\x05\x27\x4f\xd6\xc0\x65\x64\x00\xc2\x32\x31\x61\x02\x30\x7e\
+\x3c\x90\x9a\xaa\x81\x1d\x35\x0a\x18\x39\x12\x18\x3e\x5c\x02\xc7\
+\x90\x21\xc0\xe0\xc1\xc0\xc0\x81\x28\x8d\x89\xc1\x38\x0f\x0f\xf4\
+\x36\x99\xca\x04\xa4\x36\x0d\x59\x89\x3d\xa2\x4d\xa6\x4c\xee\xb2\
+\xf8\x20\x07\xb3\x56\x5c\xcc\x06\xad\x9b\xc0\x94\x29\xb5\x83\x4e\
+\x49\x01\xc6\x8c\x01\x46\x8f\x06\x92\x92\xea\x24\x80\xfe\xfd\x61\
+\xef\xd2\x45\xda\x6b\x54\x78\x78\x4e\x83\x67\xa1\x70\x83\x21\x96\
+\x59\xa0\xa4\x6c\x89\x89\x94\x14\x5d\x89\xd2\xa8\x8b\x00\x6d\x95\
+\x84\x55\xd0\x04\xd8\x27\xd4\xfe\xd8\xb1\xdf\x44\xa0\x52\xd8\x79\
+\x66\xeb\xd6\x60\x5f\x76\xf4\xf5\xd5\x37\x80\x80\x92\xd4\x2f\x91\
+\x91\x0e\xb9\xc0\xe9\xf5\x94\x14\x47\x05\xda\x5f\xad\x04\x4a\x84\
+\x8c\xec\x69\x69\x55\x41\x67\x23\x79\x45\x88\xee\xc5\xcf\xd7\x41\
+\x00\xfd\xfa\xc1\x11\x12\x22\x5d\x29\xd2\x68\xcc\xa5\x2a\xbe\x67\
+\x3f\xe0\x41\x57\x90\x23\x86\xb7\xb7\xab\xa4\x58\x09\x57\x02\x1c\
+\xa7\x59\x7e\x39\x26\xb0\x97\xb8\xc6\x08\x77\x63\x02\xe8\x70\x8a\
+\x0c\x17\x3b\xca\xac\x16\x02\x10\x46\x92\xd9\xaa\x95\xaa\xc2\xf7\
+\xee\xc8\x7e\x0a\x0b\x1b\x1c\x67\x34\x56\xc8\x21\x8f\x8d\x48\x10\
+\x85\x85\x94\xc6\x57\x04\x08\xdc\x64\x30\x58\xb9\x2b\xe3\x77\xd1\
+\x53\x45\x04\x22\x2a\xc9\xbe\xa2\x24\x15\x11\x1a\x44\x2d\x04\x1c\
+\x82\x34\x93\x61\x0e\x0d\xcd\x66\x22\xbf\x7b\x4f\x2c\x00\xf9\xc7\
+\x44\x44\xdc\xe4\x43\x99\xd1\x72\xbb\x9d\x20\xb8\x0e\x28\x02\x5f\
+\x6f\x29\xdb\x8b\xf0\x11\xa1\x0b\x0b\x09\xf9\xab\xa7\xd1\x58\xcc\
+\xbf\xb3\x9a\xac\x08\xef\x97\x76\x3d\x62\xc4\x57\x04\x2a\x7b\xf6\
+\x84\x45\x39\x92\x4f\x63\x9d\x4a\x78\xf4\x30\x9b\x37\x71\xf5\x26\
+\x08\x27\x7d\x9f\x20\x38\x6a\x4c\x9f\xfe\x2d\x7b\x62\xef\xf0\x90\
+\x90\xb4\x5f\xbb\x77\x2f\x73\x59\x73\x0a\x0a\xe8\x56\x2e\x04\x20\
+\x9a\xd9\xa6\xed\xec\xd0\x35\x28\x68\x58\xa3\x9e\x0b\x09\x8b\x4b\
+\xa6\x2c\x28\x29\x36\x2b\x49\x70\x7a\xb5\x8b\x5d\x98\x22\x50\x77\
+\x35\x45\x6f\x1d\x66\xaf\xb0\x9a\x24\x21\xd7\x9c\xc4\x44\x17\x02\
+\x4e\x83\x41\xf6\x91\x90\xf0\x5e\x71\x9b\x67\xa3\x9e\xcc\x09\x49\
+\x84\x72\xf5\xa6\xa4\xac\x51\x51\x04\x41\x32\xb5\x11\xa8\x75\xcd\
+\x11\x19\x56\x24\x28\xcb\x84\x84\x2f\x04\xd0\xab\x57\x75\x19\xf9\
+\x35\xc5\xd9\xa8\x67\x8f\x88\x88\x3c\x66\x92\x03\x21\x89\x10\x90\
+\x2e\x20\x20\xf9\x5b\x1f\x20\xac\x3a\xd5\x85\x04\x67\x2a\x45\x00\
+\x36\x5f\x5f\xf9\xcc\x80\x8e\x1d\xe3\x1b\x99\x80\xba\x7e\x36\x99\
+\x26\x52\x52\x72\x97\x15\x1e\x5e\x42\x95\xd5\xf7\x8c\x95\x95\x63\
+\x4f\x48\x39\xa6\xa7\x7f\x21\xe0\x10\x16\xce\x2a\x1b\xf5\xfa\x2c\
+\x56\xad\x49\x08\xf0\xe2\x89\xf4\x8f\x9d\x3b\xa7\xfe\x0b\x5e\xd7\
+\x80\x53\x3f\x5b\x52\x95\x3b\xb1\x1f\x06\x0c\x90\x04\xca\x23\x22\
+\xb8\x5f\xe0\x68\x61\xa7\x09\x34\x11\x01\xa5\x6b\x0e\x61\x0d\x3d\
+\x30\xe6\x31\x3d\xdd\x8d\x16\xcd\xa9\x97\x04\x10\x13\xc3\x3e\xa8\
+\xaa\x6c\xa0\x0b\x81\x66\x76\x55\x6d\xb0\x94\x94\x84\x2b\x91\x80\
+\xd5\xcb\x8b\xff\x77\x20\x60\x7d\xf3\x25\xa0\x48\xe4\x53\x32\x9c\
+\xa3\xb8\x41\x22\x01\x7b\x40\x00\xd8\x5f\x34\x07\x77\x20\xa0\x63\
+\xb6\xe9\x68\xf2\xc8\xa6\x6f\x5f\x38\xc4\x88\xcd\x26\x37\x04\x07\
+\x4f\xa5\xf3\x35\x63\x02\xaa\xa1\x59\x05\x4e\xc0\x9c\x7a\x4b\x0c\
+\x06\x4e\xa7\xf2\xd0\x98\xe3\x89\x3b\x10\x30\xb3\x17\x38\xf8\xf1\
+\x50\xa1\xdc\x64\xaa\x4e\xc0\xaf\x79\x13\x50\x24\x9c\x9c\x5e\xe5\
+\xe2\x26\x46\x94\x34\x01\x59\xcc\x61\xc5\xe2\x4f\xfe\xee\x42\x20\
+\x85\x0b\x18\xf7\x20\xdc\x77\x54\x23\x10\xe8\x2e\x04\xbc\xb9\x91\
+\xa2\xa5\xf2\x0c\x2a\xd3\xd3\xb3\x8a\x80\xde\x0d\x08\x28\x4b\xad\
+\x92\x11\xd7\x02\x8e\xe1\xee\x46\xc0\x42\x19\x71\xdf\x41\x5b\xa5\
+\xbd\xba\x1b\x01\x1d\xdd\x88\xdb\x58\xb7\x24\xc0\xab\xaf\xd1\xf8\
+\x96\xa3\x76\x35\x02\x61\x6e\x45\x80\x7d\xc0\x93\x0d\xee\x37\x38\
+\xb2\x73\xda\x75\x37\x02\x66\xfe\xdb\x2b\x3e\x34\x54\xee\x09\xdc\
+\xab\x02\xea\x6a\x43\xe0\x22\xcc\x22\x7c\x88\xfd\x1f\xf9\x92\x41\
+\x48\x3f\x71\x1a\xd8\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x03\x12\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x3c\x00\x00\x00\x3c\x08\x06\x00\x00\x00\x3a\xfc\xd9\x72\
+\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\
+\xe2\x03\x02\x04\x32\x2f\x3b\x59\x63\x86\x00\x00\x00\x19\x74\x45\
+\x58\x74\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\
+\x64\x20\x77\x69\x74\x68\x20\x47\x49\x4d\x50\x57\x81\x0e\x17\x00\
+\x00\x02\x7a\x49\x44\x41\x54\x68\xde\xed\xd8\x4b\xa8\x8d\x6b\x1c\
+\xc7\xf1\xcf\xc6\xce\xe6\xd8\x25\xb9\x0d\x44\x88\x72\xa2\x30\xc1\
+\x84\x5c\x42\x71\x9c\x11\x29\x45\x06\x88\x94\x5c\x06\xe4\x32\x31\
+\x33\x32\xa0\x64\xe2\x96\x08\x21\x85\x93\xd2\x49\x92\x94\x5b\x29\
+\xb9\x76\x8a\x48\x31\x71\x89\xe3\xb2\x2d\x93\x47\xbd\xad\xde\x77\
+\xaf\xb5\x77\x6b\x6f\x7b\x6f\xff\x6f\xad\xc9\xfb\xfe\xff\xbf\xe7\
+\xf9\x3d\x97\xff\xf3\xac\x97\x20\x08\x82\x20\x08\x82\x20\x08\x82\
+\x20\x08\x82\xa0\x6d\x18\x8b\x26\x94\xb0\xfc\x77\x30\xfc\x4f\x32\
+\x7b\x17\xdd\xbb\xba\xd9\x39\xc9\x6c\x09\xb3\xba\xba\xd9\xee\xb8\
+\x97\xcc\x9e\xef\xcc\x46\x86\x60\x0b\xea\x2a\xc4\xad\x48\x66\x9b\
+\xf0\x67\xe6\xf9\x06\x8c\xec\xe8\x26\xbb\x61\x36\x4e\xe3\x1b\xee\
+\x54\x88\x6f\xc4\xab\x64\x78\x5f\x99\xce\x87\xa4\x71\x18\x63\x3a\
+\x9a\xd1\xfe\xd8\x84\x27\x99\xbd\x58\xc2\xa1\x0a\x79\x3b\x53\xdc\
+\x7b\x0c\xca\x3c\x1f\x55\xa6\xf3\x1d\x27\x30\xfe\x57\x9a\xac\xc3\
+\x94\x34\x03\xff\x97\x75\xb0\x84\xd7\xf8\xbb\xc2\x92\xff\x98\x62\
+\xb7\x96\xbd\x1b\x8a\x2b\x39\x9a\x25\x9c\xc3\xa4\xf6\x34\xda\x88\
+\x55\xe9\xf8\xc8\xeb\xd0\x4d\x2c\x43\x43\x05\x9d\x43\x29\xfe\x39\
+\x7a\x17\x0c\xe8\x4c\x5c\x2b\x68\xe7\x12\xa6\xb6\xa5\xd1\x71\xd8\
+\x8b\x77\x39\x8d\x7f\xc1\x51\x4c\xae\xa2\x48\xc1\xc4\xb4\x4c\x4b\
+\x58\x5a\xc5\x4a\x9a\x83\x1b\x05\xc6\xaf\xa6\xba\x51\x57\x4b\xb3\
+\x97\x0a\x1a\x7b\x89\x1d\x18\xdc\xc2\xad\xf0\x6f\xca\xbf\x9d\x0a\
+\x54\xb5\x79\xf3\x70\xab\xa0\x2f\x67\x6a\x65\x76\x40\x8e\xf8\x63\
+\x2c\x46\x7d\x2b\xf4\x16\x64\x74\xa6\xb7\xb2\x76\xac\xcb\xe9\xd3\
+\xa9\x5a\x19\x9e\x95\x23\xfe\x1d\xc7\x5a\x71\x5c\xd4\xe3\x41\xa6\
+\xf8\xb4\xd4\xe8\x4c\x9c\xcd\xdc\xb9\xb3\xbf\xed\xb5\x32\xfc\x07\
+\x36\xa6\xe5\x5b\xde\x48\x13\x8e\xa4\x63\xa4\x1a\xd6\xa6\xbc\x6f\
+\x2d\x18\xac\x46\xac\xc1\xfd\x82\xa5\x7c\x1b\x2b\xd1\xa7\xd6\x45\
+\xab\x01\xab\xf1\x5f\x81\xf1\x03\x18\xd1\x4c\x7e\x5f\xbc\x49\xf1\
+\x7b\xab\x68\x6f\x34\x76\xe3\x6d\x4e\x7b\x9f\x70\x30\x1d\x4f\x75\
+\xda\x98\xfa\x74\xec\x3c\xc8\xe9\xc8\x57\xec\xc7\xb0\x9c\xbc\x5d\
+\x29\xe6\x1d\x06\x36\xa3\x3f\x17\x17\x0b\x66\xf3\x21\xd6\xa3\xdf\
+\xaf\xba\xf4\x2f\x2a\x38\x8f\xaf\x96\xc5\x0e\xc7\xe7\xf4\x6e\x73\
+\x33\x9a\x3d\xd3\xa0\x95\x0f\xe2\x49\xcc\x68\x8f\xd9\xac\xb6\x98\
+\xcc\xc7\xf5\x4c\x27\xf7\x94\xc5\x1c\x4f\xcf\x9f\xa1\x57\x33\x5a\
+\x13\x32\x1a\xcf\xb0\xad\x85\x47\x5e\xbb\x1b\x9f\x81\xcb\xe9\x1f\
+\xd0\x4f\x26\x67\x4c\x2c\xa9\xa0\xb1\x14\x17\xf0\x57\x67\xfb\x08\
+\xd0\x23\x33\x08\xd7\x32\x57\xce\x6e\x55\xe6\x75\x5a\x16\x66\x66\
+\x77\x5a\x57\xff\x92\xd1\x13\x4f\x6b\x7d\xed\xeb\xc8\x6c\xcc\x54\
+\xd9\xd1\x1d\x71\xbf\xd5\x9a\x17\xe9\xa2\xf2\x02\x8f\x04\x41\x10\
+\x04\x41\x10\x04\x41\x10\x04\x41\x10\x04\x6d\xc8\x0f\xf0\x6b\xdf\
+\x7c\xd8\x29\x0f\xa9\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x04\x4e\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\
+\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\x12\x00\x00\
+\x0b\x12\x01\xd2\xdd\x7e\xfc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\
+\xd2\x01\x07\x0b\x01\x15\x4b\x06\x3c\xc6\x00\x00\x03\xcb\x49\x44\
+\x41\x54\x78\xda\xb5\x96\xcf\x4b\x1c\x49\x14\xc7\x3f\x5d\xd3\x3d\
+\x62\xa2\xf8\x63\x8c\x60\x12\x33\x92\xbb\xae\x88\x17\x5b\x50\xc1\
+\x40\x18\x08\xe3\x06\x57\x84\xe0\x68\xbc\xcd\x25\x07\x73\x8a\xf9\
+\x07\x3c\xe9\x7f\x21\xa8\x43\x2e\xc1\x04\x8c\x27\x41\x4d\x34\xd9\
+\x55\x83\x10\x44\x44\x57\x34\x1e\x46\x3c\x98\x66\x7a\xba\xbb\xaa\
+\x7b\x0f\x71\x1a\x25\x8e\x2e\x8b\x5b\xf0\xa0\xba\xaa\x78\x9f\xf7\
+\xbe\xf5\xba\xaa\xe0\x7f\x6e\x5a\xb1\x89\x44\x22\x91\xcc\x66\xb3\
+\x7d\x8e\xe3\x98\x52\xca\x07\x4a\x29\x80\x7d\x60\xb9\xa2\xa2\x22\
+\xf3\xf9\xf3\xe7\xb7\xff\x09\x90\x4a\xa5\x5a\x36\x36\x36\x26\x84\
+\x10\x9d\xdd\xdd\xdd\x34\x35\x35\x11\x8b\xc5\xf0\x7d\x9f\x6c\x36\
+\xcb\xea\xea\x2a\x73\x73\x73\x48\x29\x17\xee\xdd\xbb\xf7\x72\x65\
+\x65\xe5\xaf\x7f\x0d\xe8\xea\xea\x4a\x1e\x1d\x1d\xbd\x31\x4d\x53\
+\xef\xed\xed\xa5\xb6\xb6\x16\xc3\x30\xd0\x34\x0d\xdf\xf7\xf1\x3c\
+\x8f\x7c\x3e\xcf\xf7\xef\xdf\x99\x9c\x9c\xe4\xe3\xc7\x8f\xb2\xb2\
+\xb2\xb2\x77\x67\x67\xa7\x68\x36\x91\x42\xa7\xa7\xa7\xa7\x65\x7b\
+\x7b\x7b\xfe\xe9\xd3\xa7\xfa\xd0\xd0\x10\x35\x35\x35\x94\x97\x97\
+\x53\x5d\x5d\x4d\x4d\x4d\x0d\x77\xee\xdc\x21\x16\x8b\x51\x56\x56\
+\x46\x59\x59\x19\x8d\x8d\x8d\xd8\xb6\x2d\xd6\xd7\xd7\xfb\xee\xdf\
+\xbf\xff\xee\xe4\xe4\xe4\xe8\x32\x80\x5e\xe8\x7c\xfd\xfa\x75\xc2\
+\x34\x4d\xbd\xbf\xbf\x9f\xd7\xaf\x5f\x63\x18\x06\x86\x61\x20\x84\
+\x60\x7a\x7a\x9a\x20\x08\xe8\xef\xef\x27\x08\x02\x82\x20\xc0\xf3\
+\x3c\x5e\xbd\x7a\xc5\xe1\xe1\xa1\xfe\xe5\xcb\x97\x09\xa0\xeb\x32\
+\x80\x00\x68\x6e\x6e\x4e\xfa\xbe\xdf\x39\x38\x38\xc8\xad\x5b\xb7\
+\x88\x46\xa3\x94\x94\x94\x20\x84\x40\xd3\x34\x84\x10\x61\x5f\xd3\
+\x7e\xaa\x1a\x89\x44\x78\xf8\xf0\x21\xe9\x74\x9a\x20\x08\x3a\xab\
+\xab\xab\x93\x45\x01\xd9\x6c\xb6\x2f\x99\x4c\x52\x57\x57\xc7\xed\
+\xdb\xb7\xd1\xf5\x9f\x89\x65\x32\x19\x32\x99\x4c\xe8\x78\x66\x66\
+\x86\xa9\xa9\xa9\xf0\x5b\x08\x41\x73\x73\x33\x89\x44\x02\xdb\xb6\
+\xfb\x8a\x02\x1c\xc7\x31\xdb\xdb\xdb\x89\x46\xa3\x94\x97\x97\x87\
+\x51\x06\x41\x70\x61\x71\x41\x9e\x0b\x55\xa2\x69\x3c\x7a\xf4\x08\
+\xa5\x94\x59\xb4\x8a\xaa\xaa\xaa\xbc\xd9\xd9\x59\xfd\xee\xdd\xbb\
+\x54\x56\x56\x12\x8d\x46\x89\x44\x22\x44\x22\x11\x84\x10\xa1\x73\
+\xdf\xf7\x51\x4a\xe1\x79\x5e\x58\x51\xb9\x5c\x8e\x83\x83\x03\x1e\
+\x3f\x7e\x2c\x5d\xd7\x35\x2e\xdd\x64\xa5\x14\x9a\xa6\xa1\xeb\x3a\
+\x4a\x29\xce\x7e\xaa\x5f\xb2\x28\xcc\x9d\x07\x49\x29\xf1\x3c\xef\
+\x97\xcc\x2e\x48\xa4\x94\xda\xdf\xdd\xdd\x0d\x6b\x7d\x60\x60\x80\
+\x67\xcf\x9e\x21\xa5\x0c\xed\xbc\xb3\x54\x2a\xc5\xf0\xf0\x30\x9e\
+\xe7\xe1\xba\x2e\x5b\x5b\x5b\x28\xa5\xf6\x8b\x02\x82\x20\x58\xfe\
+\xf0\xe1\x03\xf9\x7c\x1e\xd7\x75\xc3\x28\x5d\xd7\xc5\x71\x9c\xd0\
+\x5c\xd7\xc5\x75\xdd\x30\x83\xc2\xf8\xdc\xdc\x1c\xbe\xef\x2f\x17\
+\x05\x08\x21\x32\x99\x4c\x86\xed\xed\x6d\x6c\xdb\x0e\xa5\x48\xa5\
+\x52\x0c\x0c\x0c\x60\xdb\x36\x8e\xe3\x90\x4a\xa5\x78\xfe\xfc\x39\
+\x52\x4a\x94\x52\xd8\xb6\xcd\xb7\x6f\xdf\x78\xff\xfe\x3d\x40\xa6\
+\x28\xc0\xb2\xac\x0d\x29\xe5\xc2\xd8\xd8\x18\x96\x65\x5d\xd0\x57\
+\x29\x85\x65\x59\xe1\x78\xc1\xa4\x94\x9c\x9e\x9e\x32\x3e\x3e\x8e\
+\xef\xfb\x0b\xc0\xdb\x2b\xcf\x22\xc3\x30\x5a\x80\x95\x27\x4f\x9e\
+\xe8\x23\x23\x23\x18\x86\x81\xae\xeb\x61\xcd\xfb\xbe\x1f\x6e\xb4\
+\xeb\xba\xe4\x72\x39\xc6\xc7\xc7\x99\x9f\x9f\x97\xc0\xef\xc0\xbb\
+\x2b\xcf\x22\xdf\xf7\xa3\x9a\xa6\x2d\x6c\x6d\x6d\xf5\xad\xad\xad\
+\x89\xfa\xfa\x7a\x4a\x4b\x4b\x71\x5d\x37\x94\xc8\x71\x1c\x2c\xcb\
+\x62\x73\x73\x93\xb1\xb1\x31\x3e\x7d\xfa\x24\x81\x1c\xf0\x07\x70\
+\x02\xfc\x79\xdd\x71\x1d\x07\x62\x9a\xa6\x4d\x08\x21\x3a\x3b\x3a\
+\x3a\x68\x6b\x6b\xa3\xa1\xa1\x01\x80\x9d\x9d\x1d\x96\x96\x96\x58\
+\x5c\x5c\x04\x58\x00\x5e\x02\x6f\x80\xaa\xb3\x60\x8f\x81\x17\xc0\
+\xec\x75\x17\x4e\x1c\xf8\x0d\xe8\x03\x4c\xe0\xc1\xd9\xf8\x3e\xb0\
+\x7c\xb6\xa1\xc7\xc0\x21\x40\x43\x43\xc3\x26\xa0\xed\xed\xed\x09\
+\xc0\x03\x12\x67\xeb\xae\x6d\xf1\x2b\xec\xfc\x9a\xe3\x74\x3a\xed\
+\xb5\xb6\xb6\xda\xc0\xe9\x99\x6c\xf1\x9b\xbc\x7a\xe3\xc0\x8f\xd1\
+\xd1\x51\x65\x9a\xa6\x04\x7e\x00\xd6\x4d\x42\x0a\x59\xe5\xd3\xe9\
+\xb4\x17\x8f\xc7\xbd\x9b\x06\x9c\x87\x1c\x01\x0a\xe8\x04\xe2\xda\
+\x0d\xbf\x52\xce\x47\xfc\x37\xc0\x3f\x72\x9e\x0b\x66\xc1\xc5\x97\
+\x96\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\xb5\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\
+\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\
+\x01\x00\x9a\x9c\x18\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\
+\x8e\x7c\xfb\x51\x93\x00\x00\x00\x20\x63\x48\x52\x4d\x00\x00\x7a\
+\x25\x00\x00\x80\x83\x00\x00\xf9\xff\x00\x00\x80\xe9\x00\x00\x75\
+\x30\x00\x00\xea\x60\x00\x00\x3a\x98\x00\x00\x17\x6f\x92\x5f\xc5\
+\x46\x00\x00\x05\x2b\x49\x44\x41\x54\x78\xda\x62\xf8\xff\xff\x3f\
+\x03\x2d\x30\x40\x00\x96\xc4\x20\x05\x80\x18\x84\x81\x01\xad\x2c\
+\x78\x2e\xd5\x47\x2c\x1e\xbc\x95\xfe\xc2\xff\xff\x65\xdb\xb2\x03\
+\x09\x64\x72\xcb\xdd\x61\x66\xe8\xbd\x23\x33\x31\xe7\xc4\xa1\xaa\
+\xf0\x23\xcc\xfc\xaa\xea\x22\xa2\xd8\xfb\x39\x32\x22\xee\x39\xc6\
+\xc0\xf6\x68\xad\x41\x44\x6e\x3e\x01\x84\x62\xb0\x88\x88\x08\x83\
+\x81\x81\x01\x83\x91\x91\x11\x48\x3d\x9f\xb5\xb5\x75\x47\x67\x67\
+\xe7\xcb\x0d\x1b\x36\xfc\x3f\x70\xe0\xc0\xff\x43\x87\x0e\xfd\x5f\
+\xb3\x66\xcd\x7f\xa0\xd8\xff\x98\x98\x98\x67\xf2\xf2\xf2\x25\x20\
+\x85\xc2\xc2\xc2\x0c\x4c\x4c\x4c\x28\x06\x03\x04\x10\xdc\x60\x90\
+\xad\x42\x42\x42\x0c\x1a\x1a\x1a\x0c\x40\x0d\xd1\xdb\xb6\x6d\xfb\
+\xff\xfb\xf7\xef\xff\xd8\xc0\xfb\xf7\xef\xff\xef\xde\xbd\xfb\x7f\
+\x73\x73\xf3\xff\xc8\xc8\xc8\xff\x9c\x9c\x9c\x66\x20\x0b\x80\xbe\
+\x82\x1b\x0c\x10\x40\x60\x83\xc1\xc1\x20\x26\xc6\x00\xf4\x2a\x88\
+\x1d\x7c\xea\xd4\xa9\xff\xb8\xc0\xaf\x5f\xbf\xfe\x7f\xfb\xf6\xed\
+\xff\x9b\x37\x6f\xfe\xaf\x5c\xb9\xf2\x7f\x4d\x4d\xcd\xff\xb0\xb0\
+\xb0\xff\x40\x73\x79\x41\xae\x86\x19\x0c\x10\x40\x70\x83\x05\x05\
+\x05\x41\x96\x2a\xce\x99\x33\xe7\xff\x9f\x3f\x7f\x70\x1a\x0c\x33\
+\xf4\xd5\xab\x57\xff\x2f\x5c\xb8\xf0\xbf\xad\xad\xed\x7f\x49\x49\
+\xc9\x7f\x19\x19\x99\x4e\x58\x84\x30\x32\x32\x32\x00\x04\x10\xd8\
+\x60\x11\x60\x10\x70\x00\x6d\x89\x8d\x8b\x3b\x7a\xfb\xce\x9d\xff\
+\xf8\xc0\xe7\x2f\x5f\xfe\xbf\x78\xf1\xe2\xff\xd3\xa7\x4f\xff\x1f\
+\x3f\x7e\xfc\xff\xa4\x49\x93\xc0\x61\xee\xe3\xe3\xf3\x0d\x68\xa6\
+\x00\xcc\x60\x80\x00\x02\x1b\x2c\x0c\x72\x2d\x23\xa3\xec\xcc\x25\
+\x4b\xfe\xff\x05\x0a\xfc\xc1\x63\xf0\xc7\x9f\x3f\xff\x3f\x7b\xfe\
+\xfc\xff\xdd\xbb\x77\xff\xcf\x9a\x35\xeb\xff\xbc\x79\xf3\xfe\x4f\
+\x9f\x3e\xfd\x7f\x5e\x5e\xde\x7f\x31\x31\xb1\x6a\x98\xab\x01\x02\
+\x08\x92\xe6\x80\x40\xcd\xca\xaa\xfc\xc4\xb5\x6b\xff\x3f\x00\x23\
+\xe5\x4c\x61\xe1\xff\xf3\xd9\xd9\xff\xaf\xe6\xe6\xfe\xbf\x03\xd4\
+\x70\x0f\x88\xef\x26\x25\xfd\x3f\xe6\xef\xff\xff\xdc\x9e\x3d\xff\
+\x5f\x00\x23\x6f\xe9\xd2\xa5\xff\x67\xcc\x98\xf1\x7f\xc1\x82\x05\
+\xff\x67\xcf\x9e\xfd\xbf\xae\xae\xee\xbf\xa5\xa5\xe5\x35\x98\xb9\
+\x00\x01\x04\x37\x38\x3b\x21\xe1\xe6\x2b\x1b\x9b\xff\x1f\x95\x94\
+\xfe\xbf\x96\x93\xfb\xff\x16\x88\x5f\x88\x89\xfd\xbf\xc2\xc0\xf0\
+\x7f\x13\x10\xf7\x03\x71\x85\xac\xec\xff\xc5\xcb\x97\xff\x5f\xb6\
+\x7a\x35\xd8\xa5\x0b\x81\x86\x82\xe2\x04\xe4\xf2\xd6\xd6\xd6\xff\
+\xe1\xe1\xe1\x20\xc3\x64\x40\x91\x08\x10\x40\x10\x83\xb9\xb9\x59\
+\x4f\x02\x0d\x3a\xc3\xc4\xf4\xff\x84\xa0\xe0\xff\xeb\xca\xca\xff\
+\x8f\x00\x0d\x59\xa6\xa0\xf0\xbf\xc7\xd8\xf8\x7f\x63\x5c\xdc\xff\
+\xce\x89\x13\xff\xcf\x06\xa6\xe7\xc5\xab\x56\xfd\x5f\x01\x4c\x0d\
+\xcb\x81\x16\xcc\x9f\x3f\x1f\xec\xea\xa9\x53\xa7\xfe\xef\xea\xea\
+\xfa\x9f\x0b\xf4\x21\x2f\x2f\x6f\x06\x28\xf9\x02\x04\x10\xd8\x60\
+\x71\x06\x06\x8d\x7b\xbc\xbc\xff\x73\x81\x36\xe6\x66\x64\xfc\xcf\
+\x0c\x09\xf9\x9f\x01\x0c\x8a\xd2\xf6\xf6\xff\x5d\xc0\x70\x9f\xb7\
+\x75\xeb\xff\x95\x5b\xb6\xfc\x5f\xbf\x69\xd3\xff\xf5\x40\xc3\x57\
+\xac\x58\xf1\x7f\xf1\xe2\xc5\xe0\x20\x98\x32\x65\xca\xff\x09\x13\
+\x26\x80\x23\xb0\xb2\xb2\xf2\xbf\x8a\x8a\xca\x4a\x50\x08\x00\x04\
+\x10\xd8\x60\x59\x06\x06\xed\xf3\xdc\xdc\xff\x73\x81\x12\xb3\x81\
+\x19\x63\xf9\xce\x9d\xff\x37\x00\xc3\x7a\x1d\x90\xbd\x6e\xe3\xc6\
+\xff\x1b\x81\x06\xae\x5b\xbf\x1e\x9c\xeb\x40\x2e\x5d\x02\xb4\x0c\
+\xe4\x5a\x50\xa4\x81\x0c\xed\xee\xee\xfe\xdf\x0e\x74\x44\x6d\x6d\
+\xed\x7f\x60\x71\x70\x15\x64\x2e\x40\x00\x81\x0d\x66\x03\x66\x9a\
+\xbd\xc0\x30\x14\xe3\xe3\x9b\x27\xac\xa4\xd4\xea\xed\xeb\xfb\xb0\
+\xa7\xa7\xe7\xff\xda\xb5\x6b\xff\x83\xb2\x33\x28\x23\x2c\x5b\xb6\
+\x0c\x6c\xe0\xc2\x85\x0b\xc1\xe1\x0a\x32\x74\x22\x30\x78\x40\x86\
+\x82\xc2\xb7\xa1\xa1\x01\x6c\xb0\xaf\xaf\xef\x2f\x50\x71\x00\x10\
+\x40\x60\x83\xb9\x81\xac\x76\x06\x86\x63\xf6\x0c\x0c\x1d\xca\x90\
+\x72\x02\x04\x02\xec\xec\xec\xae\x80\x32\x00\x28\x05\x2c\x5a\xb4\
+\xe8\xff\xdc\xb9\x73\xc1\x11\x05\x0a\x53\x98\x4b\x41\xf2\xf5\xf5\
+\xf5\xff\xab\xab\xab\xff\x57\x55\x55\xfd\x0f\x08\x08\x00\x45\xa0\
+\x24\x40\x00\x81\x0d\x36\x07\xb2\x8c\x81\x06\x05\x30\x30\x6c\x86\
+\x99\xca\x0b\xc9\x89\x0c\xc2\x22\x22\x4d\xb9\xc0\xe4\x36\x79\xf2\
+\x64\xb0\x2b\x61\x86\x82\x22\x0b\xe6\x52\x98\xa1\x15\x15\x15\xff\
+\x6d\x6c\x6c\x1e\x00\xb5\x71\x02\x04\x10\x3c\xb9\x21\x03\x61\x20\
+\x36\x80\xb2\x15\x95\x95\x41\x45\xa2\x7b\x54\x54\x14\x38\x82\xfa\
+\xfb\xfb\xe1\xde\x07\xb9\x14\x54\x56\x80\x0c\x2d\x2b\x2b\xfb\x9f\
+\x04\x4c\xeb\xc0\xf2\xa6\x16\xa4\x0f\x20\x80\xc0\x06\xfb\x00\x19\
+\x7e\x0c\x0c\xbe\xbd\x40\x17\x27\x32\x30\x4c\x04\x72\x45\x34\xa0\
+\x06\x6b\x6a\x6b\x33\x08\x08\x80\x73\xaa\xaa\xb7\xb7\xf7\x27\x90\
+\xeb\x1a\x1b\x1b\xe1\x86\x82\x5c\x59\x54\x54\xf4\x3f\x28\x28\xe8\
+\x3f\x3f\x3f\x7f\x1f\x50\x1d\x3b\x48\x31\x40\x00\x81\x0d\xb6\x64\
+\x60\x70\xff\x9f\x93\xf3\x1f\xa8\xf2\xff\x7f\x5d\xdd\xff\xa7\x80\
+\x11\x09\x4c\x29\xbe\x30\x1f\x88\x03\x0b\x29\x0e\x0e\x70\xd9\xce\
+\x20\x2b\x2b\x3b\x21\x30\x30\xf0\x7f\x5a\x5a\xda\xff\xac\xac\xac\
+\xff\xa9\xa9\xa9\xff\x4d\x4d\x4d\x9f\x00\xa5\xfc\x91\x7d\x0d\x10\
+\x40\x60\x83\xe7\x30\x30\xf4\x01\xa3\xf4\x3f\x30\xba\xff\x03\x53\
+\xfc\x7f\x60\x0c\xfc\xcf\x67\x60\x78\x88\xac\x8e\x8f\x8f\x0f\x25\
+\xb4\x80\x65\x70\x34\xb0\xfc\x6e\x66\x67\x67\xcf\x06\xf2\xe5\xd1\
+\x83\x13\x20\x80\xc0\x06\xcb\x31\x30\xd8\xce\x05\xba\xf2\x88\xb0\
+\xf0\xff\x43\xc0\x5c\xd7\x28\x24\xf4\x93\x87\x81\x21\x1d\x59\x1d\
+\x28\x38\xc0\xa5\x16\x14\x80\x2a\x05\x69\x69\x69\x58\x30\x61\x00\
+\x80\x00\x02\x1b\x6c\x80\xe0\x6a\x03\xb1\x1e\x3c\x9c\xd0\x0c\x06\
+\x97\x01\x50\x00\xaa\xc6\x80\xc1\x02\xb6\x00\x1b\x00\x08\x30\x00\
+\x69\x36\x5f\x67\xcd\x5c\xcb\xcb\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x08\x58\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\
+\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\x07\xea\x49\x44\x41\x54\x78\xda\xed\
+\x57\x6b\x6c\x14\xd7\x15\x3e\xf7\xce\xec\x7a\xd7\x76\x36\x7e\xcb\
+\x4e\x00\x97\x85\x04\x27\x04\x28\xe0\xda\x78\xcd\x8a\x26\x31\x76\
+\x6c\x13\x27\x8e\xb0\x1b\xa2\x18\xc5\xb4\x34\x22\x52\x15\x4a\xca\
+\x8f\xa8\xf4\x47\x9b\x56\xaa\xd2\x87\xaa\x3a\xa1\x52\x10\xa2\x55\
+\xdd\x28\x8a\xa5\x22\x12\x22\xa7\x34\xb1\x1d\xdb\x3c\x6d\x8c\xa1\
+\xf1\x0f\xc0\x8f\xf8\x0d\xc6\x6b\xf0\xae\x3d\xbb\x3b\x3b\x8f\x7e\
+\x33\xf6\x76\x65\x66\x41\xfc\xcb\x9f\x5e\xe9\x6a\x76\x66\xee\x9c\
+\xef\x3b\xdf\x39\xe7\x9e\xbb\x4c\xd7\x75\xfa\x36\x07\xa7\x6f\x79\
+\x88\xd1\x1f\xbf\xcc\xcd\x25\x55\x51\x88\x18\x23\xa8\x92\xc8\x38\
+\x3f\xe4\x4a\x49\x79\x31\x18\x08\x9c\x51\x65\xf9\x67\x58\x78\x87\
+\x43\x2d\xae\x69\x26\x6b\x86\xdf\xc2\xe2\x6f\xba\x5b\x45\xdc\xc3\
+\x46\x12\x63\xec\x37\xc9\xc9\xc9\x2f\x48\x81\x40\x1b\xbe\x3b\x20\
+\x32\x76\xdb\xfc\x1e\xf3\x47\x73\x73\x51\x02\x4b\x87\xa6\x69\x5c\
+\x13\x84\xdf\x7d\x7f\xed\xda\x37\xf2\x67\x67\xe9\x9a\xcb\xf5\xc4\
+\xbf\xc6\xc6\xb2\x35\x59\xde\x0d\xb0\x19\x7a\x80\xa1\xe9\x7a\x02\
+\x28\x35\x14\xaf\x5b\x57\x9f\xb7\x6c\x19\x0d\x4a\xd2\x6b\xa7\x5b\
+\x5b\x5d\x6a\x24\xb2\x9b\x0b\xc2\xfc\x3d\x43\xa0\xa9\x2a\x8f\x30\
+\xf6\x7b\xef\x86\x0d\x6f\x94\x80\xa1\x0b\xaa\xe4\x87\x42\x54\x9a\
+\x99\x59\xc9\x44\xf1\x98\xaa\xeb\xae\x07\x00\xb7\xa9\x9a\xd6\x50\
+\xe8\x76\xd7\x6f\xca\xc9\xa1\xa4\xf5\xeb\x69\xa3\xdb\x4d\x9e\xed\
+\xdb\x5f\xc2\xf3\x0f\x40\xc2\x01\x95\x2d\x04\x4c\xc9\x34\x51\x7c\
+\x6f\x5b\x51\xd1\x4f\xb7\xdf\xbe\x4d\x7a\x59\x19\x89\x1f\x7d\x44\
+\xda\x81\x03\xf4\x5d\x9f\x8f\x9e\x4b\x4d\xad\x12\x6d\xb6\x26\x8d\
+\x28\xe7\x3e\xe0\x2e\x78\x7e\xd4\x93\x9b\xbb\x77\x63\x7a\x3a\xe9\
+\xd5\xd5\x64\x3b\x78\x90\xb4\x92\x12\xda\xb8\x72\x25\x6d\xdd\xb9\
+\xf3\x15\xe2\xfc\x43\x4d\x51\xb2\x2c\x04\x60\xf8\xe7\xdb\xbc\xde\
+\x7d\x15\xf0\x5c\x7c\xfa\x69\x12\xf6\xef\x27\x1a\x1b\x23\x7b\x55\
+\x15\xb1\x43\x87\x68\xed\xcc\x0c\x95\x3b\x1c\xa5\x82\x28\x1e\x85\
+\x12\x29\x77\x83\xc3\x01\x51\x67\xac\x61\x6b\x56\x56\xdd\x06\xa7\
+\x93\x58\x6d\x2d\x25\x94\x96\x12\x8d\x8f\x93\x50\x58\x48\xac\xb8\
+\x98\x36\xe5\xe5\x51\x71\x5d\x5d\x35\x13\x84\xdf\x5a\x08\x3c\x94\
+\x99\x59\xe3\x31\xa4\xe1\x78\xf4\xe6\x9b\x44\x13\x13\x44\x7e\xbf\
+\x69\xc0\x51\x51\x41\xec\xed\xb7\x69\x15\xee\x9f\x15\x84\x72\xc4\
+\xb1\x11\xde\xa6\x51\x8c\xbc\x43\x65\xec\xf0\x16\x97\x6b\xf7\x13\
+\xa2\x48\x6c\xd7\x2e\x4a\x34\xc0\x6f\xde\x24\x0a\x04\xcc\x2b\xcb\
+\xcf\x27\x4a\x4b\xa3\x75\x20\x91\x91\x97\x57\x66\x21\x10\x9a\x99\
+\x69\xef\x33\xc0\x51\x09\xfa\xb1\x63\x64\xc6\x29\x18\x5c\x30\x00\
+\x25\x9c\x30\xc8\x41\xc2\x1d\x0e\xd3\x33\x8a\x52\x29\x72\xde\xa8\
+\xc1\x24\xa6\x91\x70\x87\x0b\x45\x71\x6f\x1e\xc0\xa9\xae\x8e\x92\
+\x10\x3e\xba\x75\x6b\xe1\x5b\x49\x22\x52\x55\xd2\xbb\xba\x4c\x87\
+\x86\xe0\x90\x7f\x68\xa8\xdb\x52\x86\x5a\x28\x74\xf0\xf3\x8e\x8e\
+\x2c\xf2\x78\x76\x14\x7e\xfc\x31\x29\x00\x17\x77\xec\x20\x9a\x5f\
+\x4c\x5a\x18\x4a\x42\x68\x28\x12\x21\xf7\x3b\xef\x90\x9d\xa8\xbc\
+\x35\x21\xe1\x84\xa2\xeb\x92\x57\xd3\x4a\x57\xa3\xb4\x6c\x00\x77\
+\x81\xa8\x09\x8e\x7b\x73\x38\x1c\xa4\x5e\xbe\x4c\xbc\xb7\x97\xfa\
+\x61\xa3\xbd\xb1\xf1\x82\x2a\x49\xfb\xa3\xb8\xff\xdb\x09\x7f\xf5\
+\xe8\xa3\xa4\x45\x22\xe9\xdc\x6e\xff\x5b\x45\x41\x41\x65\x7e\x7f\
+\x3f\x29\x95\x95\x24\x96\x97\x9b\x24\x60\x70\x41\x95\xe4\x64\xf2\
+\xb7\xb6\x52\xf0\xdd\x77\x69\x14\x9e\xc9\x82\x40\x6e\x82\x0c\xfb\
+\xf6\x51\xea\xf3\xcf\x2f\xac\x85\x4d\x73\x6d\x42\x02\x29\x43\x43\
+\xc4\x2f\x5d\xa2\x61\x54\x53\x6b\x53\xd3\x05\x45\x92\x6a\xc4\x84\
+\x84\x91\x3d\x58\x67\x29\x43\xce\xb9\x8f\x42\xa1\x57\xff\xdd\xdd\
+\xdd\x7c\x65\xc5\x0a\x62\x27\x4e\x90\xfc\xe9\xa7\xa6\x31\x53\x4a\
+\x24\xa8\x11\x4f\x57\x51\x11\x39\x90\xa4\xd9\x00\x5a\x01\xa5\x6c\
+\xf5\xf5\x94\x8a\x4c\xa7\xe9\x69\x73\x4d\x54\xf6\x48\x5f\x1f\xe9\
+\x9d\x9d\x34\x8a\x50\x7c\x75\xfc\x78\x8f\x32\x3f\x5f\x2b\xda\xed\
+\x23\x06\xc1\xb8\x0a\xe0\xa3\x05\x46\x8a\x92\x63\x73\x3a\xff\x5a\
+\xf2\xf8\xe3\xa5\x4f\x21\x19\x19\x64\xb5\x7b\x3c\x04\x72\x31\xef\
+\x12\x13\xe9\x4e\x7b\x3b\xc1\x28\x65\x20\xe6\xd1\x77\x98\xa6\xe7\
+\xf2\xe8\x28\xa9\xdd\xdd\x34\x81\x9c\xea\x68\x6b\xbb\x24\x07\x02\
+\x3f\x80\xe7\xd7\xa3\xe0\x7b\x24\xe9\xde\x04\x04\x3c\xd3\x15\xc5\
+\xc5\x6d\xb6\xbf\x97\xb8\xdd\x55\x4f\x4d\x4e\x92\x0e\x0f\x9d\x20\
+\x01\xef\x62\x24\xec\x76\x43\xb6\x18\xf8\x62\xcc\xc3\x23\x23\xa4\
+\xf4\xf4\xd0\xa4\x2c\x53\xfb\xd9\xb3\xe7\x91\x4f\xb5\x00\x5f\xe2\
+\x39\x08\x2c\x4d\x42\x3d\x76\x35\xa7\xc0\xb9\x1f\xdb\x6f\x7d\xdb\
+\xe0\xe0\x3f\xec\xcb\x97\x3f\xe7\x6e\x6e\x26\x09\x06\x13\x37\x6f\
+\x36\x01\xa3\x89\x89\x11\x03\x07\xa1\xd0\xd5\xab\x24\x23\xe3\xa7\
+\x91\x33\x1d\xbd\xbd\x5d\x6a\x38\xbc\x2b\x2a\xfb\x7d\x9b\x51\x32\
+\xa4\x8a\x2e\x62\xb8\x32\xc2\x10\x84\x19\x34\xa2\x5d\x5f\x0e\x0f\
+\x7f\xa2\x64\x66\x7a\xbf\x73\xea\x14\x31\xa8\xe4\xc4\xf6\x4a\xb2\
+\x1c\x03\x66\xcc\x58\x4b\xe1\xc1\x41\x92\xce\x9d\xa3\x69\xd8\x3a\
+\xd3\xdf\x7f\x45\x09\x85\x5e\xc0\xc6\x35\xf9\x40\xdd\x50\x84\x41\
+\xdd\x00\x66\x6c\xc1\x29\x5c\x99\x71\x45\x99\x29\x91\x88\x24\xdb\
+\x6c\xa4\xa3\x04\x6f\xb7\xb4\x98\x57\x8e\x1c\x40\x7f\x30\xc0\xcd\
+\x7b\x10\xa5\x59\x78\x6f\x83\x2a\x6a\x52\x12\x45\x64\x39\xcc\x34\
+\xcd\xcf\xf1\xdc\xec\x80\xb0\x6d\x76\x51\x4c\x81\xc8\x9a\x84\x7f\
+\x4a\x4d\x5d\x42\x00\x3f\x16\xba\x1a\xe7\x7f\xf1\xae\x5a\x55\xff\
+\xe4\xd4\x14\xf9\x86\x87\x29\x62\xe4\x28\xa6\x8e\x44\x43\xef\x30\
+\x89\x72\x63\x72\x4e\x22\xb6\x60\x01\x33\xed\x91\x47\xc8\x70\xfb\
+\x74\x57\xd7\x67\x0c\x1d\x10\x34\x67\xee\x26\x50\x8b\xfb\xa5\x65\
+\x68\x6d\xcb\x36\x6c\x32\x0d\x85\x6b\xd6\xd4\xaf\x43\x5b\xf6\x03\
+\x5c\x37\x0c\x44\xdf\x63\x47\x94\x51\x01\x11\x94\x9d\x06\x05\x18\
+\x08\x80\x85\x79\xf5\xa3\x79\x2d\xc3\x7e\x51\x54\x5c\x5c\x89\xfb\
+\x63\xda\x7d\xba\x28\xbf\x07\xb8\x0b\x9e\x1f\x2d\xde\xb4\x69\xef\
+\x66\xd4\xb0\xff\xda\xb5\x25\xe0\x2c\x36\xcd\xd8\x33\x4c\x28\x16\
+\x7b\x07\x12\x81\x1b\x37\x68\x25\x54\x2d\x2a\x2b\xab\x12\xec\x76\
+\xb3\x8b\x3e\x10\x01\x5d\xd3\x44\x8d\xf3\x06\x6f\x51\x51\x5d\x21\
+\xf6\x6e\xe9\xeb\xaf\x01\x1e\x1b\x51\x10\x15\x33\x05\x33\x1d\x53\
+\xb3\xda\x35\x49\xcc\xa1\x87\xb8\xd1\x96\x3d\xd5\xd5\xa5\x28\xe9\
+\xa3\x1a\x3e\xb9\x2f\x01\x80\x3b\x20\xfb\x61\x8f\xd7\xbb\x3b\x1f\
+\xed\x57\xba\x78\x31\xea\x79\x6c\x44\xc1\x11\xff\x08\x6a\x7e\x1e\
+\xa5\x97\x0e\x05\x20\xf3\x92\x75\xa6\x22\x58\x33\x8f\xd0\xe5\x42\
+\x89\x82\x9a\x9a\x72\x24\x6d\x23\xec\xa5\xc5\x25\x80\x04\x4c\xc6\
+\x51\xec\xfd\x2d\xa5\xa5\x7b\xb7\x20\xe6\x41\x94\x93\x1a\x2f\x3c\
+\x06\x38\x80\x65\xc4\xf8\x0c\xe7\xff\x39\x4d\x74\x61\x16\xde\xa6\
+\xe3\x59\x3c\x25\x08\xe4\xa4\x81\x01\x5a\x9d\x9d\x4d\xf9\x75\x75\
+\x95\xe8\x35\x06\x89\x6c\x0b\x01\x48\xf6\xeb\xe2\xb2\xb2\x3d\x5e\
+\x80\x2b\xed\xed\xa6\x31\x16\x07\xfc\x61\x00\xcf\xc1\xa3\x8e\x48\
+\xa4\x2b\xac\xeb\x15\x78\xb6\xfd\x6c\x30\x78\xf2\x16\x14\x48\x45\
+\x69\xaa\x66\x17\xb4\x2a\x11\xbe\x7e\x9d\xd6\xe0\x88\xf7\xbd\xd7\
+\x5f\x2f\xe7\x4e\xe7\x1f\x2d\x04\x92\xb2\xb2\x76\xac\x77\x21\x59\
+\xbf\xf8\x22\xae\xe7\xba\x01\x8e\xf7\x81\xcc\x4c\xea\xf4\xfb\x2f\
+\xc8\xaa\xba\x53\x24\x1a\x83\x01\x3f\xd4\x7b\xad\xcb\xe7\xfb\xec\
+\x96\xaa\x52\x2a\xd6\x20\x94\x96\xbc\xd1\xa1\x84\x8a\xe6\xb4\x0a\
+\x07\x92\x94\xd5\xab\xb7\x59\x08\x04\xa7\xa6\xbe\xbc\x66\xb4\x48\
+\xaf\x37\xae\xe7\x0f\x21\x99\x02\x38\xe1\x76\xfa\x7c\x3d\xb2\xa2\
+\xd4\x8a\x8c\x8d\xc4\x9c\x64\x3e\x54\xce\xab\x17\xc7\xc6\x9a\x7d\
+\x8a\x42\x0f\xe3\xe4\xa3\xdf\xad\x04\x9e\x0b\x8f\x3d\x46\x23\xd8\
+\x2d\x67\x87\x86\xba\x2c\x04\xb8\xaa\xfe\xa2\xb3\xb9\xf9\x78\x0f\
+\x36\x11\x7b\x41\x41\xec\x85\x01\x8e\xf8\xf9\x96\x2f\xa7\xb6\xf1\
+\xf1\x4b\xe1\x70\xf8\x65\x1b\xe7\xc3\x96\x6c\xe6\xfc\x8e\xaa\x28\
+\x3f\x3c\x7f\xf5\xea\xa9\x1b\x92\x44\x2e\x10\x26\x90\x40\x72\x99\
+\x87\x98\x04\x9c\x8c\xbf\x41\x78\xcf\x1f\x39\x72\x46\x99\x9b\x7b\
+\xcb\x42\x00\xb5\x3c\xc5\x64\xf9\x95\xce\x93\x27\x3f\xbc\x0c\x12\
+\x4e\x34\x1d\xe3\x65\x32\xbc\xbe\x81\x8f\xbf\x1a\x18\x38\x1f\x0e\
+\x06\x5f\x14\x39\xbf\x1e\x83\xb5\x90\x98\x04\x89\x9a\xee\x2b\x57\
+\x3e\x19\x87\x9a\x06\x71\x06\x12\x49\x38\x11\x8f\xa0\xa4\xcf\x1d\
+\x39\xd2\xa2\xfa\xfd\x2f\x09\x44\x03\x71\xcb\x50\xb0\xd9\x42\xa2\
+\xae\xff\xf8\x5c\x4b\xcb\x3f\xfb\x32\x32\xc8\xb1\x75\x2b\x4d\x20\
+\x71\xda\xfb\xfa\xba\x14\xa3\xab\x09\xc2\x88\x25\x37\x18\x33\xe3\
+\x1d\x9d\x9c\x31\x3f\xc2\x51\xdf\xdb\xdd\xfd\xf9\x04\x40\x9d\x90\
+\x7d\x1c\xbb\xe5\xc5\xa6\xa6\xd3\x68\x60\x75\x00\xbf\x49\xf1\x7a\
+\xc1\xfb\x88\x5b\xb4\x69\x20\x5e\xa9\x30\xf4\x87\x8c\x9c\x9c\x67\
+\x66\xa7\xa7\x7b\x71\x8c\xfa\x09\x17\x84\x51\x8a\x33\x9c\x0b\x5d\
+\x31\xd6\x41\x17\xaf\xb0\x92\xc1\x45\xf1\xcf\x29\x39\x39\xc5\xfe\
+\xa9\xa9\x6e\x38\xf0\x16\xbc\xfd\x26\xfa\x5d\xcd\x22\xee\xff\xff\
+\x1d\xff\x17\xef\xd2\xfe\x9f\xb7\x3d\x84\x48\x00\x00\x00\x00\x49\
+\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x0c\x27\
+\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\x00\x57\x02\xf9\x87\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\
+\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\x0b\xb9\x49\x44\x41\x54\x78\xda\xed\
+\x9a\x69\x6c\x55\x75\x1a\xc6\xdf\xee\xfb\x42\xb9\x2d\x16\x68\xb1\
+\x55\xa9\xa5\x55\x06\x64\x71\xc0\x01\x15\x41\x59\x15\x70\x45\x27\
+\x63\x70\xe2\x18\xcd\x64\xf8\x30\x93\x99\x2f\x66\x26\x99\x0f\x33\
+\xc9\x4c\x32\x93\xcc\x17\x27\x31\x66\x12\x0c\x6a\x94\x2d\x58\xf6\
+\x22\x4b\x51\xd9\x97\x0e\xa5\x28\xfb\xda\xd2\x52\x0a\x5d\x6e\xdb\
+\xbb\x74\x7e\xcf\x7f\xee\xb9\xb9\x69\x30\xd3\x6b\xd0\xc4\x0c\x37\
+\x79\x73\xee\x39\xf7\x9c\xff\xff\x79\xde\xf7\x79\x97\x53\x48\xe8\
+\xef\xef\xb7\x1f\xf2\x27\x11\xbb\x43\xe0\x0e\x81\xff\x67\x02\xc9\
+\xb7\xba\x38\x67\xce\x9c\x41\x2f\x40\x11\xf0\x6c\x08\x36\x2e\x1c\
+\x0e\x57\x61\x95\x7c\x2f\x0f\x87\x43\x39\xe1\x70\xbf\x0a\x85\x1f\
+\x3b\x8b\x1d\x8f\xd8\x01\xee\x69\xc2\x2c\x14\x0a\xe9\x59\x77\xf4\
+\xce\xbd\xef\x03\x0b\xcc\xe9\xd3\xa7\x07\x41\x20\xfe\xcf\x78\x68\
+\x3c\x17\x0a\x05\x97\x04\x02\x81\xd2\x84\x84\x44\x36\x4e\xb0\x84\
+\x84\x04\x4b\x4e\x4e\x37\x7d\xfa\xfa\x7a\x8d\xdf\x1d\xb0\x60\xb0\
+\xcf\x12\x13\x13\x5b\xb9\x6f\x15\x3f\x7d\xc4\x7d\x3b\x00\x1a\xba\
+\x0d\x11\x88\xfb\x33\x81\x8d\xdf\x06\xdc\x93\xa1\x50\x38\x2d\x3b\
+\x3b\xdf\xaa\xab\xab\xec\xee\xbb\xcb\xb0\x51\x36\x74\x68\x81\xa5\
+\xa4\xa4\x38\x4f\xf6\xf6\xf6\xd9\xb5\x6b\xd7\xec\xec\xd9\x73\x78\
+\xf1\x94\x9d\x3c\xd9\xe0\x6b\x6e\xbe\xf4\x7a\x28\x14\x78\x3d\x39\
+\x39\xa5\x8e\xb5\xfe\x84\xad\xff\xbe\x08\xc8\xad\xbf\x0b\x06\x03\
+\xbf\x0a\x85\xfa\xf3\x4b\x4a\x2a\x6c\xca\x94\xa9\x36\x69\xd2\x44\
+\x80\x97\x58\x76\x76\x06\x1e\x4e\x20\x0a\x61\xbc\x2d\x39\x84\x3d\
+\x23\x12\x41\xeb\xec\xf4\xdb\x85\x0b\x97\xed\xf0\xe1\x43\xf6\xc5\
+\x17\x75\xd6\xd8\x78\xf8\x91\xde\x5e\xff\x5a\x88\xfc\x8b\x75\xdf\
+\xc6\x9a\xe2\x01\x23\x7d\xc6\x93\x03\x23\xb9\xff\x9d\x40\xa0\x6f\
+\x6e\x6e\xae\xcf\x66\xcc\x98\x6b\x0b\x16\xcc\xb1\x92\x12\x9f\xe9\
+\x83\xde\x23\xa0\x43\x3a\x0e\xf8\x1e\x56\x34\x94\x35\x10\x94\xcc\
+\x12\xad\xb5\xb5\xdd\x3e\xfb\x6c\xbb\xd5\xd4\xac\x84\xd4\x49\x4b\
+\x4a\x4a\xae\xe7\x86\x9f\x05\x83\xc1\x43\x83\xc8\x81\xb8\x09\xdc\
+\xc3\xbd\xab\x91\xcc\x03\x15\x15\xe3\x6d\xe9\xd2\xa5\x36\x61\xc2\
+\x18\xef\xb7\x48\x02\x3a\xaf\x7f\x23\x89\x40\xc0\xfb\x2e\x70\x61\
+\x01\x96\x01\xec\xbc\x7d\xf4\xd1\x0a\xab\xab\xdb\x28\x82\x4d\xc0\
+\xfa\x29\xeb\x6d\xbd\x9d\x49\x5c\xcc\x86\x6b\xd8\xb8\x7a\xf2\xe4\
+\x19\xf6\xe6\x9b\xbf\xb0\x91\x23\x7d\xb1\xbf\x0b\xe0\xff\x20\xe0\
+\x11\xf4\xaa\x8c\x29\xa1\xf9\xde\x63\x23\x46\x0c\xb3\xd7\x5e\x7b\
+\xdd\x72\x73\xf3\x6c\xe3\xc6\x95\x77\x05\x02\x3d\x1f\x90\xe4\x4f\
+\xb1\xec\x81\xdb\xd1\x07\xb2\xf0\xc4\x7b\x7d\x7d\x81\xea\x89\x13\
+\xa7\xd9\xb2\x65\xbf\x8c\x82\xe7\x1a\xe1\xaf\xb5\x86\x86\xaf\x5d\
+\xc2\x12\xfa\x6f\x00\xef\x59\xd0\x9d\x03\xce\x9a\x9b\x5b\x6c\xd7\
+\xae\x2f\xec\xea\xd5\x56\xbb\x79\xb3\xcb\xd2\xd2\x92\xed\xc5\x17\
+\x97\xd8\xac\x59\x8b\x24\x45\x1f\xf7\x7d\x48\x14\x4a\x30\xf3\xec\
+\xdb\x12\xf8\x0d\x9a\x7f\x4a\xb2\x79\xeb\xad\x37\xac\xa8\x28\xd7\
+\x5d\xf4\xfb\x7b\xec\xdd\x77\x57\x38\x60\xb5\xb5\x75\xb6\x7b\xf7\
+\x7e\x91\x18\x00\x58\x16\x8e\x78\x5f\xe4\x1c\x78\x97\xc4\x87\x0e\
+\x1d\xb1\xd1\xa3\x4b\x6d\xef\xde\x7d\x76\xe5\x4a\x33\x24\xba\xdd\
+\xb3\x4f\x3f\xbd\xd0\xa6\x4d\x9b\x63\x94\xe4\x7b\x89\xfa\x5f\x06\
+\x10\x88\x5b\x42\xe3\x58\x68\x59\x6e\xee\x50\x69\x9e\x50\xfb\xa2\
+\xe0\x57\xac\x58\x6b\xe5\xe5\xa3\x48\xe4\x29\xd6\xd4\xd4\x6a\x9f\
+\x7c\xe2\xaa\xa0\x55\x55\x55\x58\x4f\x4f\xdf\xc0\x08\xe8\xe8\x92\
+\xf7\xe2\xc5\x26\xc0\x1f\xb5\x85\x0b\x67\xda\x7d\xf7\xdd\x6d\xc3\
+\x86\xf9\xec\xd3\x4f\xb7\xb3\xd6\x3d\x96\x9f\x9f\x67\x59\x59\x99\
+\x36\x7f\xfe\x22\x3b\x75\xea\x38\xd6\xf0\x3c\xd5\x69\x2d\x0a\xf8\
+\xe0\x5b\x49\x88\x07\xff\x88\xe5\x51\x6d\x48\xd8\xca\x28\xf8\xe5\
+\xcb\x57\x21\xa3\x62\x7b\xfc\xf1\x1f\xe3\xbd\x26\x36\x4d\xb3\x57\
+\x5e\x59\x68\x9f\x7f\xbe\x8f\xf2\xd8\x40\x03\x4b\x1e\x08\xde\x79\
+\xfe\xd2\xa5\x26\x3b\x70\xe0\x20\x52\x99\x6b\xa5\xa5\xc5\x9c\x5f\
+\xb6\xfb\xef\x2f\xa7\x92\xcd\xa0\x9c\x36\xd2\x2b\xda\xad\xbd\xbd\
+\xc3\x7c\x3e\x9f\xcd\x9e\xbd\xd8\x32\x32\xb2\x12\x90\xdd\x1f\xc0\
+\x90\x89\x0d\x9a\x80\x80\xcb\xc6\xaa\x49\x95\x96\xde\x67\xcf\x3c\
+\x33\x2f\xfa\xdb\xce\x9d\x7b\x1d\xf8\x99\x33\xa7\xa2\xe3\xab\xce\
+\xab\x5d\x5d\xdd\x54\x13\x23\x11\x5f\xb0\xfa\xfa\xe3\x80\xac\xe7\
+\x3c\x29\x1a\x05\x33\x07\x1e\x72\xf5\xf6\xd2\x4b\x0b\xac\xb0\xb0\
+\xc0\xae\x5f\x6f\x17\x51\xe5\x00\x24\xca\xb8\x3e\x4f\x4d\x8e\x3e\
+\xd1\x85\x9c\x3a\x6c\xec\xd8\x71\x34\xc6\x09\x06\x86\xd1\xc8\x67\
+\x0e\x16\x2f\x81\xf0\x12\x1e\x4a\x1e\x3f\x7e\x32\xd2\x19\x1a\xfd\
+\x6d\xd4\xa8\x11\xc8\xe0\x0a\xb2\x69\xb1\x9c\x9c\x6c\x5d\x72\x60\
+\xbb\xbb\xfd\x00\x4a\xb4\xe7\x9e\x9b\x0d\x90\xb3\x24\xf6\x57\xf2\
+\xba\xb3\xcb\x97\x9b\xed\xe8\xd1\x63\xb6\x68\xd1\x4c\x2b\x2e\xf6\
+\x01\xf0\xa6\x9e\x71\xe3\x46\x66\x66\x06\x51\xed\x85\xf4\x31\xd6\
+\xcb\x73\xf9\x72\xe3\x46\x87\x2b\xaf\x0f\x3e\x38\xd1\x52\x53\xd3\
+\x95\x3f\x6f\x80\x25\x29\x1e\x02\x79\x84\x6e\x49\x5e\x9e\x8f\xea\
+\x90\x8f\x4c\xda\x74\x99\xc4\x0a\x92\x78\xe5\x2c\x3c\xc6\xd6\xac\
+\xa9\x65\x61\xa3\xf3\x3a\x12\xf2\xa6\x22\x81\x9c\xd2\xed\xe5\x97\
+\x17\xd8\x89\x13\x27\x19\x19\xce\x38\xa2\x47\x8e\xd4\x8b\x18\x0d\
+\xaf\x18\x89\xdc\xd0\xbd\x02\xcf\xda\xa9\x3c\x9f\x63\x6b\xd7\xd6\
+\xda\xb9\x73\xcd\x44\xa6\x48\x95\x8a\xd1\x23\x80\x9c\xda\x34\x4b\
+\x21\xb5\x7b\x94\xd0\x8f\x69\x48\x8c\x87\xc0\x43\x2c\x34\xb2\xb4\
+\x74\x34\x67\x29\x94\xbb\x83\x9a\x67\x54\xde\x00\xe9\x27\xbc\x63\
+\x6c\xdc\xb8\x2a\x7b\xff\xfd\x35\x5c\x33\x3c\x17\x25\x11\x8d\xc4\
+\xab\xaf\x2e\xa6\xda\x5c\xc2\xb3\x87\xed\x85\x17\xe6\x92\xac\x05\
+\x78\xd6\x79\xde\xf4\x49\x4f\x4f\xe3\xb9\x5c\xd6\x58\x0b\xc9\x76\
+\x22\x3b\x4a\x40\x23\xbd\x22\x48\x4e\x34\x10\x19\x3f\x72\x2d\x17\
+\xd9\x44\x08\x4c\x89\x83\x40\xb8\x3a\x31\x31\xc9\x86\x0c\x29\x34\
+\x24\x2e\xc9\x50\x26\x0f\x45\xbb\xad\x3c\x5d\x51\x51\x0e\x89\x07\
+\xec\xe3\x8f\x37\x00\xba\x17\x4f\x66\x79\x72\xa2\x0a\xf5\x12\xfa\
+\x24\x24\x33\x8b\x68\xcc\xb7\xbb\xee\x1a\x2a\x6d\x7b\xb2\x01\x7c\
+\x3a\x25\x37\x8d\xca\xb5\x89\x5c\xe8\x46\x56\xc5\xf2\x3a\xc0\x5d\
+\x83\x23\xb7\x2e\x42\xea\x34\x7b\x05\xa8\x4c\x3e\x1c\xa2\xa1\x30\
+\x54\x3d\x68\x02\x80\xac\x44\x83\xc8\x21\x57\xfa\x13\x25\xea\xf5\
+\x51\xe9\x54\x00\xf4\x3b\xa0\x7b\x28\x83\x9a\x3c\x4b\x25\x01\xbc\
+\x17\x76\x7a\xd6\x47\x89\xad\x6a\x25\x39\x15\x14\xe4\x5a\x47\x47\
+\xa7\xbb\xc6\x47\xb2\xa1\xba\x64\xda\xba\x75\xdb\x88\x50\x0b\xe4\
+\x8a\x35\xe4\x45\xde\x0b\x12\x90\x4e\x93\x9d\x3f\x7f\x1c\x32\x22\
+\xd4\xa7\x4a\x04\xd9\x54\xed\x59\x16\x4f\x04\xca\xfe\xab\xd1\x0c\
+\x11\x70\x9e\xe7\x94\x59\x65\xbf\xed\xdb\x77\x94\x3b\x34\x6d\x3a\
+\x39\x29\x27\xd0\x69\x09\x7d\xe1\x53\x36\xec\x57\x1d\xd7\xef\xf2\
+\xb6\x24\x21\xe9\x79\x9e\x67\xbd\x34\x07\xfe\xc3\x0f\x6b\x48\xec\
+\x36\x8a\xc3\x70\xdd\x13\x05\xdf\xd2\x72\xc9\xce\x9c\xa9\x97\x84\
+\x34\x5d\x89\x84\x88\xf3\x5c\xa6\xee\x29\x1c\x34\x01\x00\xe7\x78\
+\x15\x44\xe0\x79\xdf\xf0\xae\x33\x02\x1f\x20\x27\xf6\x20\x89\x6e\
+\xcf\xd3\x10\x18\x8e\x86\x4b\x24\x09\xbc\xed\x07\x64\x9a\x00\x0b\
+\xb8\x4c\xf7\x29\x3f\xdc\x7a\x2b\x57\x6e\xc6\xcb\x9d\x74\xf4\x22\
+\x15\x05\xe5\x95\x00\x23\xd3\x53\x54\xaf\x7a\xae\xf5\x6a\x2b\x01\
+\x96\x6c\x3c\x59\xca\xa9\x19\x83\xee\xc4\xfd\xb8\x23\xa6\x9c\xea\
+\xe8\x45\x41\x46\x55\x69\x50\x5d\x57\x35\xa2\x72\x38\xc7\x00\x3a\
+\x5d\xb3\x3e\x00\xd4\x71\xe5\xf1\x20\xe6\x96\xf1\x40\x08\x2c\x89\
+\xdc\x29\x32\x00\xd4\x9a\xc6\xf9\x75\xc0\x9f\xb4\xb6\xb6\x26\x6f\
+\x40\x96\xc3\xb4\xaf\xf7\x5a\xe9\xed\x9f\x30\x68\x02\x6c\xe4\x27\
+\xb4\x92\x0f\x60\x52\xe5\x89\x98\xc5\x0c\x00\x49\x84\xbb\xd5\xb6\
+\x6d\xdb\x89\xf7\x47\xa0\x73\x1f\x0d\xa9\xcd\x9e\x7d\x76\x16\x9a\
+\x2e\x50\x92\x0b\xb0\xee\x8f\x8d\xaa\xf4\xaf\xa4\x46\x6e\x35\x94\
+\xe6\xcb\x10\xbe\xc6\x73\x17\x20\xdd\x27\xb2\x1e\x50\x6f\xaf\x68\
+\x24\xf4\x3b\xa7\xbd\x71\x8c\x12\xfd\xe7\xd0\x1f\xd5\xa4\x5b\x1e\
+\x89\x89\x84\x16\xf7\x66\xf9\x44\x47\xec\xf8\xf1\xaf\xd1\xed\x79\
+\xc6\x81\xc7\xd4\xa4\x54\x81\x3c\xcd\x93\x7c\xc9\x58\x8a\x24\x24\
+\xd3\xf4\x0a\x89\x14\x48\xcc\xe3\x95\x33\x87\x3c\xb8\xa0\x4e\xab\
+\xa8\x0e\x00\xaf\x63\x3f\xd7\x93\x24\x2f\x0a\x46\x97\x40\xb5\xc6\
+\xd3\x07\x1a\x61\x8d\x9e\xdb\xbd\x6e\xea\x85\x35\x72\x74\xba\x55\
+\x65\xa0\x39\x8d\x62\xb6\x99\x67\xc3\x87\x17\x0a\xbc\x80\x0a\xbc\
+\x80\x2b\x31\x25\x15\x40\x2b\x27\xa2\x89\x4d\x19\x4d\x75\xbd\xe1\
+\x91\x47\x1e\x25\x9a\x19\xba\x26\x67\xc4\x38\x29\x24\xc7\x49\x8a\
+\x80\xef\x24\xcf\xba\x85\xea\x7c\x1c\x49\xdc\x7f\x0c\xcf\xa0\xcb\
+\x66\x6d\xec\x25\x33\xe6\xbd\xe3\x3a\xf0\x34\xa7\xe1\xb6\x64\xc9\
+\x3c\x9a\x4d\x11\xe0\x7b\x62\xc1\x3b\x9d\x6f\xd8\x50\xc7\x9b\xd6\
+\x46\x2a\x51\xd0\x23\x11\x89\x44\x1f\x4d\x2c\x83\xf9\x67\xbe\x4d\
+\x9e\xfc\x13\xee\xcf\x54\xc5\xf1\x0a\x86\xf6\xe1\x5a\x3a\x84\x53\
+\xc0\x70\x55\x51\x92\x84\x1a\xe2\x89\xc0\x7e\x36\x6b\x3f\x77\xee\
+\x2b\xc9\x88\x4d\x93\xb5\x80\xb7\x81\x12\x95\x12\x38\x12\xf0\xf3\
+\xd5\x61\xe5\x79\x81\x8b\x01\x9f\xc2\xa8\xb1\x9d\xc1\x6f\x27\xbd\
+\x63\x0f\x65\x73\x03\x20\x42\x78\x3e\x96\x84\x22\x91\xcc\x14\x3b\
+\xdf\xa6\x4f\x7f\x82\xe7\xb2\x54\x81\x3c\xfd\x73\x9e\x21\x47\x52\
+\x2c\xce\x46\xca\xaa\xed\x89\x87\x40\x33\x5e\x5f\xd9\xd2\x72\x85\
+\x24\xbb\xe8\x00\x71\x2e\xcf\x3b\x59\x94\x95\x95\xdb\xe2\xc5\x4f\
+\x0a\xbc\x80\x78\xa5\x92\xee\x9b\xe2\x36\x5d\xbf\x7e\x27\x3d\x63\
+\x17\x9e\xef\x60\xf3\x6e\x48\x7c\xa9\x12\x4b\xd2\xf6\x28\x91\x75\
+\xaf\x37\xad\xd2\xfc\xd2\xb4\x16\x6f\x62\x73\x89\x4a\x81\x22\xc1\
+\x5e\x29\xac\x95\x49\x97\x6e\xa1\xb4\x36\x8a\xb4\x5e\xf2\x0f\xc6\
+\xd1\x89\x9d\xce\x97\xe3\x91\xfe\x33\x67\x1a\x05\x5e\xad\x5f\xde\
+\xd1\x11\x8f\x4d\x96\xe6\xe5\x99\xa8\x6c\x24\x19\x91\xdb\xb2\x65\
+\x0f\x6f\x68\x9f\xa1\xdd\x76\x6f\x0b\x48\x76\x40\x68\x07\x1d\x7b\
+\x1b\x7a\x0e\x8a\xa8\x17\x09\x91\x00\x78\x26\xf3\xff\xa3\xac\x59\
+\xce\xb9\x22\x95\xc3\x7a\xa9\x14\x87\x13\x54\xb4\x4e\xdd\xfb\x4f\
+\x16\xea\x89\xa7\x91\xc9\xea\x48\xa2\xbd\xa7\x4e\x1d\x63\x2e\x39\
+\xcf\xa6\x19\xd2\x25\x72\xe9\xb0\xad\x5b\x77\x33\x06\x5c\x15\x68\
+\x40\x38\xf0\x0e\x50\x4d\xcd\x6e\x4a\xeb\x36\xc0\x5f\xe7\x3c\xda\
+\x47\x94\x90\x44\xe3\x26\x92\xaa\x55\x24\x58\x23\xe0\x3d\xa3\x23\
+\xbd\xa0\x1b\xc9\x6d\xc1\xdb\xff\x56\xd7\xa5\xa7\x0c\x21\x5a\x37\
+\x18\xe8\x8e\x08\x4e\x33\xeb\x7c\x8c\x59\xbc\x04\x42\x6c\xfc\x7b\
+\xbf\xbf\xab\x6f\xff\xfe\x1d\xaa\xc5\x2c\x9e\xa5\x47\xf0\xcc\x57\
+\x6c\xb8\x95\x06\xd4\x62\x90\x74\x1d\x75\xd3\xa6\x2f\x01\xb8\xdd\
+\xd5\x76\xb3\x68\x4d\xf7\x1a\xa1\xc0\xe2\xcd\xeb\xdc\xb3\xd5\x56\
+\xad\xaa\x55\xd3\x93\x8c\x04\x9e\xee\xbc\x91\xa8\xad\x23\x3a\x9d\
+\x44\xa3\x50\x4e\x61\x64\xd9\xc5\xe8\xad\xb5\xec\xaf\x3c\xdf\x16\
+\x0f\x81\xd8\x3f\xb0\x6e\x62\xa8\x5b\xae\x36\xdf\xd0\x70\x40\xb9\
+\x80\x77\x72\x05\x46\xef\xab\xb6\x7a\xf5\x16\xa2\x23\x50\x87\x90\
+\xce\x56\xca\x6e\xab\x7e\x8b\x05\xcf\x3a\x72\x86\xac\x5f\x92\x11\
+\x41\x22\x58\xe3\x2a\x54\x6b\x6b\x87\x1c\xc1\xf9\x3a\xae\x5f\xb7\
+\xbc\xbc\xe1\xc8\x27\x9b\x48\x9c\xa0\xbf\x1c\x16\x94\x3a\xec\xef\
+\x71\xff\x65\xae\xaa\x2a\xfa\xee\x20\x40\xc3\x20\xb3\x8d\xfb\xc6\
+\x4c\x9d\x3a\x9b\x09\xf4\x41\x24\x72\x53\x40\x94\xd4\xe8\xb6\x0c\
+\x4f\xb5\x6a\x14\xb8\x45\x37\xbd\xd5\xd1\x75\x56\xc0\x16\x32\x3f\
+\x8d\xe6\xc5\xe7\x20\x91\xe9\x10\x78\x06\xc1\x7c\xa2\x7a\xda\x36\
+\x6f\x5e\x85\xcc\xfc\x1d\x6c\x3f\x0d\x3b\x1c\x53\x5c\x06\x47\xa0\
+\xb2\xb2\x72\xe0\xa5\xb1\x54\x87\xcd\x24\x70\xd1\xc3\x0f\xcf\xb4\
+\xf2\xf2\x4a\x12\xd3\x0f\x89\x76\x91\x51\x69\xd5\x52\x58\x2c\x78\
+\x67\x03\xc8\x78\xe6\xfe\x4a\xad\xef\xaa\x36\xbc\x4b\x14\xca\xf3\
+\xae\x64\xee\xd8\xb1\x1e\x59\xb5\x05\x58\xec\x79\x6c\x0d\x66\xb7\
+\x83\x80\x36\x9b\x81\xe7\x56\xe0\xe5\xa2\x49\x93\x1e\x67\x8c\x1e\
+\xab\xde\x20\x02\x68\xf7\x06\x5e\xed\x11\xb0\x58\xf9\xdc\xf2\x28\
+\x69\x9a\xb9\x31\x01\xd0\xb9\x48\x32\x5f\xd2\x52\xc5\x01\xfc\x06\
+\xf5\x1d\xcd\x3c\xcb\xb0\x77\x30\xbb\x9d\x04\xb4\xf9\x44\x4a\xe7\
+\x72\x8e\x15\xa5\xa5\xf7\xda\x43\x0f\x4d\xe7\xad\xcd\xa7\x06\xc4\
+\xc6\x5d\x54\x9a\x6e\xac\x33\xd2\x55\x43\xb1\xe0\x23\x9b\xab\xea\
+\xa4\xab\xf3\xca\xf3\xca\x29\x8d\x2b\xf4\x89\x3a\x69\x5e\xf7\xaa\
+\xf6\x2e\xc5\x56\x63\xf6\x5d\x10\x90\x95\x62\x7f\xa6\xbd\xbf\xc4\
+\x1b\x1b\x39\x51\x2d\x2d\xeb\xf5\x53\x39\x20\x32\xb2\x58\x12\x98\
+\xa9\x97\xa8\xa3\x6b\x3c\x10\x10\x35\x29\x79\x5d\xa5\x92\xef\xae\
+\xda\x6c\xc7\x7e\xed\xfd\x3d\xf4\xbb\x24\xe0\x35\xba\x57\x18\xc2\
+\x7e\x0b\xd0\x6a\xde\xdc\x18\x2d\xca\x98\x89\xca\x78\x87\x1d\x8a\
+\x2c\xb2\x25\x0b\x6f\xd3\xc8\x33\x41\x25\x2b\xc9\xde\x42\xa2\x9e\
+\x35\x35\x48\x35\x29\x3e\x17\xb0\x7f\x60\x7f\xc3\x82\x98\x7d\x5f\
+\x04\x74\xcc\xe2\xfa\x5c\x8e\x3f\x27\x3f\xa6\x13\x81\x54\x3c\xac\
+\x77\x58\xf4\x9d\x19\x7d\x27\x80\xa8\x46\xe2\x88\xcc\x7a\xd4\x6d\
+\x43\x1a\x0f\x58\xf6\x3d\xec\x13\xee\x69\xf1\xf6\xf9\xbe\x09\xe8\
+\xba\x67\x3f\xc2\x1e\xe6\x5a\x15\xc7\x32\x8e\x45\x7a\x0d\x8c\xfc\
+\x23\x5f\x1f\x4b\x5c\xd5\x7b\x06\x8f\x35\x6a\x30\x8b\xfc\x43\x5f\
+\xaf\x07\xec\xdb\x12\xb8\xf3\x5f\x0d\xee\x10\xb8\x43\xe0\x07\xfe\
+\xf9\x0f\x4e\x33\x44\x96\xd0\x41\x78\x46\x00\x00\x00\x00\x49\x45\
+\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x0a\xfb\
+\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\x00\x57\x02\xf9\x87\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\
+\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\x0a\x8d\x49\x44\x41\x54\x78\xda\xed\
+\x9a\x5d\x88\x5d\x57\x15\xc7\x7f\x6b\xef\x73\xee\xbd\x93\x3b\x33\
+\x99\xc9\x57\x9b\x8f\x36\x4d\x93\xd2\x54\x6d\x5a\x8a\x6d\xb5\x05\
+\x5b\x29\x05\x5f\x0c\x54\x2a\x88\x2f\x16\x41\x6c\xc5\x22\x14\xd1\
+\x17\x1f\x7d\xb1\x42\xc5\x52\xf0\x31\x42\x5f\xaa\xd0\xaa\xd5\x46\
+\xb0\x54\x90\x52\xa5\x82\x6d\xac\xd4\xa4\x24\x4d\xd3\x4c\xcd\xe4\
+\xab\x99\x4e\x3a\xf7\xfb\x9c\xbd\xbc\x73\xcf\x3e\xb3\xe6\xce\x4c\
+\x26\x93\x20\x82\xe0\x86\x35\x7b\xdf\x7d\xf6\x39\x67\xfd\xd7\xfa\
+\xff\xd7\xde\x07\x26\x51\x55\xfe\x97\x5b\x02\xfc\xef\x03\x10\x79\
+\x8a\xb5\xb5\xfc\xa1\xc4\xcb\x63\xd5\x6a\xba\x03\xc8\x89\x2d\x68\
+\x61\x00\x22\x50\x49\x33\xfe\x33\x99\x4d\xc9\x73\x59\xfc\x2c\xdf\
+\x69\x77\x8f\x06\xe5\x19\xf0\x2f\xab\x3e\x71\x25\x19\xc8\x1f\xdf\
+\x7d\xcb\xe6\xa7\x1f\xf8\xfa\xbd\x8c\x6c\xdb\x04\x79\x00\x20\x00\
+\x93\x23\x30\x5e\x53\xb2\xe0\x09\xb3\x67\xd8\x5b\x3f\xc7\xf8\xfa\
+\x3a\x21\x5c\x1d\x08\x11\x41\xb3\x2e\x7f\x39\x1a\x98\x9d\xd8\xcb\
+\xba\x11\x45\x15\xbc\x17\x4e\xbf\x33\x7d\xcb\x6f\x7f\xf6\xda\xfe\
+\xe9\xa9\xd9\x87\x81\xe7\xd7\x08\x20\x4c\x8e\x8f\xd5\xbe\xbf\xff\
+\x07\x5f\xe4\xaf\xcd\x8d\xcc\x4e\x83\x77\x20\x02\x59\x80\xfb\x6f\
+\x84\x5d\x9b\x61\xb6\x05\xa2\x4d\x76\xef\xf2\x6c\xd9\xb2\x91\x3c\
+\x0f\x57\x0d\xc0\xd3\xe6\xc5\xd7\xcf\xf1\xf7\xc6\x04\xbb\x6e\x76\
+\x68\x0e\x12\x60\xd3\x67\x36\xf0\x8d\x1b\x37\xf0\xe4\x23\xbf\xfc\
+\xce\x95\x00\xd8\xba\xf3\xe6\x8d\x1b\x3f\x4c\x27\xf9\x60\x1a\xd6\
+\xa5\x10\x04\x5c\x04\xd0\x6a\x06\x2e\xce\xf6\xad\xe5\x48\xfb\xe3\
+\xe3\xc7\xa7\x39\x75\x6a\x06\xd5\xb5\x3b\xbc\xb8\xa9\x2a\xd5\xa4\
+\x47\xb3\x51\xa1\xa7\x4a\xde\xa5\x00\x20\x30\x7d\x1a\xee\xb8\x61\
+\x33\xdb\x77\xad\xdf\x7d\x25\x22\x76\xce\x3b\x51\x15\xd2\x04\x12\
+\x0f\x02\x88\x14\x96\xe7\xd0\x6a\x43\xb3\x6f\xa3\x99\x50\xab\xa5\
+\x7d\xab\xac\x49\x07\xaa\x90\xb8\x1c\xe7\x14\x80\x4e\xcf\x01\x8e\
+\x4a\x02\x3e\xf5\x88\x53\x9c\x03\x55\x7b\x67\xde\x13\x5c\xbf\x5d\
+\x02\x80\xae\xf8\x1a\x45\x0b\x87\x89\x4d\xcc\xba\x19\xcc\x35\xa1\
+\xd1\xb7\x8a\x08\xa3\xa3\x23\xd4\xeb\x97\xd7\x80\x77\x42\xb3\xd9\
+\xe2\xd5\x37\xdb\x9c\x9d\xad\xe2\x7d\xe0\xbe\xdb\x33\xb6\x5d\x33\
+\x89\xa7\x4b\x92\xe4\x08\x45\xa6\x03\x0c\x80\x10\x83\xa6\xfd\xb6\
+\x04\x40\xb8\x1e\xc2\x23\x95\x24\xdd\x87\x10\xcc\xf5\x3e\xe0\x2c\
+\x9d\x9c\x3a\xfe\x51\xda\x78\xfa\x20\x1f\xce\x05\x44\x73\x44\x0c\
+\xee\xc5\x54\x79\xd3\x05\x7a\xb9\x50\x91\x36\x7f\x5e\xdf\x23\x49\
+\xfc\xaa\x14\xf2\x3e\xe9\x9b\xa3\xd7\x47\x7f\xe8\x58\xc2\xe9\x8f\
+\x2a\x90\x2b\x9d\xaf\x55\x78\xf4\x9b\x5b\x48\x05\xbc\xef\x40\xa4\
+\x2a\xae\xe8\x15\x08\x5a\xf4\x18\x80\xb0\xaf\x3e\x9a\xbe\xf4\xa5\
+\x6f\xdd\xb3\x63\xfd\x9e\x6d\xe4\x99\xc2\x00\x25\xd4\x52\xd8\x54\
+\x87\x2c\x53\x5a\xb3\x0d\x76\x57\xa6\xd8\xbb\x7b\x23\xbd\xdc\xbc\
+\x53\x04\x0b\xb6\x90\x05\x59\x95\x3e\x89\x87\x43\x6f\x9f\xe7\xad\
+\xb9\xeb\x19\xdf\x38\xc2\xcd\x5e\x49\x12\x08\x9d\x0e\xbf\x3f\xf0\
+\x37\xce\x9d\x3e\xc4\x8f\x7f\x74\x7b\x7f\xae\x87\x8b\xdc\x77\x62\
+\x94\x55\x2d\x0c\x03\xa0\xdf\xdb\xff\xd8\xbd\x3b\xf2\x7b\x3e\xcd\
+\xab\xef\x81\x8f\x68\x73\x85\x1b\x46\xe1\xd6\x3d\xd0\xed\xc1\xdc\
+\xc5\x16\x7b\xea\x19\xfb\x6e\xbd\x9e\x5e\x16\xb8\xda\x56\x4d\x85\
+\x33\x33\xf0\xdc\xeb\x5b\xb9\xed\xb6\x71\x5a\xf1\x51\xa3\x75\xf8\
+\xea\x0f\xb7\xf2\xec\x77\x5f\xe0\xf0\xe1\x8f\x18\xa9\xd5\x91\x66\
+\x41\x9d\x10\x0c\xc0\xfc\x38\x2c\x06\x30\x3e\x56\xbd\x77\xc7\xdd\
+\x37\xf1\xe2\x3b\x40\x66\x25\x52\x81\x46\xaa\xcc\x5c\xc8\xe9\x76\
+\x85\x4e\x2b\x70\x6a\x76\x86\x6e\xa3\x49\x50\xae\xba\xa5\x89\x72\
+\xe6\x4c\x9b\x76\x03\xda\x2d\x90\xe8\xdc\xb9\x26\x4c\xec\x1c\x63\
+\xef\x5d\x3b\x78\xf7\xe8\x2c\xd5\xea\xfa\x02\x00\x0c\x51\x29\x2c\
+\xcd\x80\x38\xf1\x01\x47\xea\x20\xf8\x32\x03\x86\xb2\xdd\x86\x4e\
+\x57\xe9\x76\x20\xa9\x27\x54\xab\x09\x6b\x29\xf1\x0a\x78\x09\xa4\
+\x3e\x80\x40\x2f\x73\x04\x75\x03\x00\xe9\xa0\xc2\x14\xef\x02\x70\
+\xa5\x83\x01\x10\x8f\x13\x87\x4f\x04\x11\x5d\x46\xa1\x65\x00\x50\
+\x14\x8d\x0f\xb0\x85\xb8\xe8\x45\xb3\xad\x74\x3a\xd0\x6b\x07\xaa\
+\x1b\x52\xc6\xc6\x46\xc9\x83\x5e\x7e\x37\x0d\x3d\x0e\x1d\x99\xe1\
+\xd8\xe9\x75\x84\x1c\xf6\x6c\x6d\x72\xc7\x27\x26\xa9\x54\x52\xaa\
+\xb5\x1c\x89\x95\xad\x34\xca\x4a\xa3\x90\x24\x0e\xef\xbd\x55\x21\
+\x03\xb1\x1c\x80\x52\x4c\x98\xe3\x51\xf1\xf3\x16\x94\x76\x7b\xde\
+\xa0\xd7\x81\x4a\x9a\x32\x32\x92\x92\xe5\x97\x07\x90\x48\xce\x3f\
+\x4e\x8c\xf2\xcc\xef\x76\x41\x57\x79\x74\xff\x09\xee\xbf\xcb\x23\
+\x2e\x25\x4d\x93\x62\xc7\xb5\xa0\x45\x3f\x0a\x07\x7d\xe2\x48\xbc\
+\x8b\xd1\x37\x0a\x89\xb3\x35\x43\x65\x34\xa8\x21\x74\x0e\x9c\x3d\
+\x90\x56\x4b\x69\x77\x20\xeb\xea\xfc\x83\x63\xfa\x2f\x0f\x20\x75\
+\x09\xe2\x7a\xd0\x53\x00\x92\xf2\x5e\xef\x49\x13\xb7\xe0\x38\x62\
+\xef\x93\xe8\x4b\xe2\xdc\xe0\x5d\xc2\x30\x33\x5c\x14\xb1\x95\xd1\
+\xe8\x64\x1e\x86\x1f\x26\x18\xda\x66\x04\x90\x77\x75\x50\xdf\x2b\
+\x15\x8f\x64\x6b\x01\xe0\x71\x25\x27\xa4\x88\xea\xfc\xbd\x38\x4f\
+\x92\xfa\x21\xe7\x1c\x31\xe3\x14\xbe\x78\x97\x91\x38\xf3\x43\x82\
+\xe9\x64\x45\x0a\xe5\xc1\x68\x23\x25\x17\xc5\x32\xd0\x6a\x43\x18\
+\x54\x28\x5f\x6c\x52\xac\x01\x80\xf7\xf8\x52\xa5\x30\x18\x27\x49\
+\x01\x20\xf2\xdb\xa2\x8b\x05\x50\x81\x67\x9e\x0f\xf4\xb6\xd4\xd8\
+\x70\x8b\xd1\xcc\x00\xac\x40\x21\x8d\x4e\x6b\x18\xf4\xc6\xb7\x8c\
+\xbe\xf3\x05\x00\x72\xe6\x1d\x18\xd0\x00\x59\x1b\x00\xa7\x0e\xda\
+\x02\x30\x18\xa7\x15\x0f\x32\x4f\x21\x8f\x08\x98\xd9\x79\x47\x83\
+\x32\x53\xdf\xc0\xbe\xfb\x36\x30\x31\xaa\xe4\x19\xb8\xa5\x14\xd2\
+\xa5\x14\xca\x41\x18\x46\x2a\x51\xc4\x65\x06\xc8\x75\xc0\xe3\x6a\
+\x65\x6d\x1a\x70\x24\x6c\xbf\x36\xe7\xee\x3b\x2f\x02\x0c\xc6\xce\
+\x25\x83\x00\xf4\x6d\x58\xa0\x50\xfc\x89\x74\xde\xbc\x05\xb6\x6e\
+\x87\x6e\x53\x08\x6a\x41\x9d\xef\x43\x0e\xba\x5c\xc4\x31\x12\x6e\
+\x58\xcc\xaa\x45\x06\x9a\x2d\x10\x55\x7c\x92\x0c\xa2\xa8\xb2\x96\
+\x93\x66\x95\x87\x1f\x9c\xe0\xcb\x0f\x6a\xcc\xf2\x04\xe2\xab\x24\
+\xa9\x2b\x34\x20\x82\x49\x04\xc4\xce\x3a\x5c\x3b\x02\xbb\xc6\xa0\
+\x9b\x2a\x4e\x84\x56\x06\x17\xda\xf1\x08\xaf\x10\x96\x6b\xc0\x28\
+\x24\x60\x7c\x0b\x46\x21\xa7\x8a\x73\xd2\x37\xd7\x37\x65\x2d\x6d\
+\x62\x62\xdc\x0e\x7e\x0a\x21\x68\xf1\x6c\xef\x10\x86\xb3\x4e\xe4\
+\x77\x96\xc3\x67\xb7\x35\xf8\xca\xde\x39\x5a\xad\x0c\x27\x8e\x57\
+\xde\xaf\x73\xa1\xe5\x57\x16\x31\x6a\x22\x66\xa1\x8c\xda\x79\xa8\
+\xd9\x54\x1a\x7d\x4b\x45\x19\xa9\x40\xad\x92\x91\x88\x72\xb5\x2d\
+\xa9\xc0\x68\x75\x21\xea\x66\xa5\x2f\x0a\x1b\xc7\xab\x6c\x1a\x5f\
+\x47\x3e\xd2\xa5\xd1\x68\x01\x0a\x97\xd4\x40\x34\x27\xa0\x4b\x28\
+\x04\xd0\xcd\x21\x0b\xd0\x0b\x9e\x9f\xfe\x2a\xe1\x9a\xc9\x16\x59\
+\x86\xf1\x1d\xac\xc9\x2a\xba\xc0\x4e\xa3\xc7\xa7\x52\xf0\xbe\x3f\
+\x1e\xde\x44\x89\x0e\xce\x53\x15\x5c\xbf\xaf\x92\x85\x26\x79\x50\
+\x9c\xc3\xaa\x10\x4b\x34\x60\xa7\x3d\x33\x02\xd4\xd6\x7b\x6e\xfc\
+\xdc\xd8\x42\xb4\x0e\x77\x26\xf8\x67\x0b\xa3\x99\x23\x8a\x31\xce\
+\x11\xc7\x8b\x37\x45\xb0\x35\xb1\xb6\x27\x37\xc1\x9d\x63\x10\xb2\
+\xe1\xe3\x32\x91\xdf\xd6\x74\x40\x3b\x0d\xf6\x3e\x5d\xb6\x0f\x0c\
+\x53\xc8\x8e\x16\xe5\x8b\x53\x59\x40\x3f\x5e\x03\x6f\xce\x61\xe5\
+\x6d\xc9\x98\xe5\xd7\xc5\x0d\x5f\x93\xf8\x1e\x5b\x63\x7a\x04\xb0\
+\xe0\x86\xb8\xd1\x1a\xad\x55\x57\xc8\x80\xf3\xd0\x53\xd8\x35\x09\
+\x37\x6c\xb0\x07\x89\x58\x2f\x0c\x8f\x05\xe3\x86\xb3\x75\x36\x1f\
+\x3b\x9b\xb3\xdf\x10\x41\x00\xe7\xdb\x16\xf9\x10\xec\x3d\x1a\x01\
+\xa8\xea\x50\x06\xc2\xb2\x0c\xa8\x3d\x74\x53\x5d\x79\x60\xf3\x71\
+\x5c\x68\xa3\x08\x22\xf3\xe6\x70\xae\x18\x23\x71\x0e\x87\xb8\x72\
+\x2c\x88\x2b\x7b\x17\x29\xe4\x90\xb8\xd6\x95\xf7\x39\x37\x18\x4b\
+\xb4\x4a\x22\x1c\x39\x5f\xe3\x95\xa9\x0a\x4e\xac\xa4\x23\xc3\x5f\
+\xe4\x41\x2f\x71\x9c\x36\x94\x46\x83\x2c\x57\x7c\xf6\x31\x9b\x27\
+\xc6\x49\x6b\x63\x20\x1a\x69\x23\x0b\x20\xc4\x81\x17\x89\x7b\x87\
+\xe0\x88\x34\x2b\x1d\xf6\xa5\x0f\xe6\x2c\x10\x03\x00\x12\xe7\x43\
+\xaf\xc5\xbb\x17\x72\x3b\x4a\x5b\x74\x97\x01\x70\x52\xd0\x57\xc3\
+\xca\x1b\x59\x04\x60\x9a\xa8\x8d\x4e\x52\xed\x9b\x86\xf8\x95\xe6\
+\x30\xfe\x4a\x61\x5e\x2e\x39\xbf\xa6\xd6\xee\x76\xe8\xe5\x8a\x60\
+\x1a\x08\xcb\x34\xa0\xf3\x66\x7b\xd3\x6a\x14\x32\x00\x3a\x40\x8e\
+\xda\x37\xa8\x0f\xa0\xb2\x04\xec\x7c\xaf\xe5\xbc\x39\xaf\x26\xf2\
+\x55\x9b\x6a\x18\x38\x07\x31\xfb\x40\xae\xcb\x44\x5c\xe8\xc2\x19\
+\x00\x65\xb9\x88\x63\x14\x4d\x38\xe5\xe7\x9c\x94\xa0\x88\x62\x0d\
+\x10\x5c\x1c\x97\x11\x73\x10\xa7\x08\xd8\xbc\xc4\xac\x5c\xa2\x59\
+\xd5\x11\x03\x6b\x1c\x8f\xbf\x8d\x42\xab\x1c\xa7\x15\x2a\x2e\x02\
+\x08\x45\x06\x04\x4c\xf5\x21\xf6\xab\x80\x10\x57\x02\xb0\xf9\xbc\
+\xa4\x9f\xac\x9e\x81\x32\x78\x30\xbc\xd3\x6a\x28\x35\xa0\x45\x76\
+\xdd\x0a\x3b\x31\x6a\x1b\x99\xf1\x50\xb1\xf2\x17\x91\x63\x99\x50\
+\xc0\x1b\x88\x62\x6d\x19\x71\xac\xd9\x7c\x19\xe1\xe5\xfc\xce\x83\
+\x5a\x06\x22\x5d\x75\x71\xf4\x43\xb0\x2f\xc6\x15\x35\x80\xf1\xd7\
+\x89\xdd\x04\x5a\x7e\x29\x19\x2d\xb0\x4c\x88\x65\xa2\x88\xf6\xe0\
+\xb7\x1d\x49\x82\x1a\x20\x29\x69\xe2\x96\x55\x98\xb8\xdf\x58\xb6\
+\x8d\x22\x71\x1c\xd4\x02\xec\x20\xac\xbc\x91\x99\xf8\x54\x25\x46\
+\x45\x71\xce\xf4\x11\xb0\xc3\xd4\x72\x4d\xd8\x1a\x00\x62\xc4\x88\
+\xeb\x3c\x10\xb0\x79\x6b\x45\x06\x9c\x60\xeb\x43\xd1\xdb\x29\x21\
+\xd2\xcc\x18\x82\x22\x2b\x7f\x13\x7b\x57\x44\xc5\x28\x54\x18\x98\
+\x80\x9c\x5b\x19\x84\x2e\xd6\x80\x09\x9b\x82\x19\x96\x09\x35\x4d\
+\xc4\xe8\x2a\x56\x7a\x87\x0f\x6b\x8a\xed\x03\x89\x40\xea\xb1\x33\
+\xc8\x4a\x1b\x19\x02\xaa\xa6\x01\x43\x6d\xe5\x33\xb0\x32\x08\x82\
+\xed\x09\x6a\xc2\x2e\x9d\x37\x0a\x9a\xb0\x23\x85\x14\x00\x11\x63\
+\x43\x45\x7a\x40\xe8\xf7\x6d\xea\xd5\xc0\xba\xaa\x52\x19\x81\x86\
+\xc2\xb1\x23\x17\x60\xf6\xe2\xc9\x21\x0a\xe5\x5a\x02\xb0\xb4\x21\
+\x3a\x9c\x81\xc5\x20\x74\x15\x61\x0b\x50\x8a\x39\x98\xf8\x70\xa0\
+\x45\x07\xa1\xe4\xb3\x92\xc7\x8d\xcc\x3b\xdb\xbd\x9f\xfd\xd3\x0c\
+\x6f\x25\xa7\xe8\x75\x32\x54\x2b\x9c\x68\xf5\x68\x4b\x8b\xf7\x8e\
+\xcd\x72\xf8\xb9\x57\x20\x6f\x1d\xc0\x28\x64\xd1\x22\x8a\x68\x25\
+\x0a\xc1\x62\x2d\x2c\xd7\x84\x62\xd1\x46\x6d\xed\xe2\x52\xeb\x2c\
+\x23\xb1\x44\x86\x72\x1f\x30\x90\x22\x1c\x3c\xf0\xc6\xf9\x83\x07\
+\x8e\x34\x58\xc0\xa4\x80\x7a\xb4\xf7\x1e\x64\x3f\x81\xe4\x05\x2c\
+\x03\x42\xae\xca\xfb\x53\x27\x98\x6b\x34\xd8\xb7\x73\x37\x20\xe5\
+\x3e\x60\x14\x92\xe8\x98\x46\xd1\xea\xca\x9a\xf0\x80\x9a\x26\x50\
+\x93\x04\xaa\x20\xc5\xfd\xa6\x01\xb5\x0c\xb0\x50\x61\x3a\x8f\x03\
+\xcf\x01\x75\x30\x51\x83\x74\xc0\x67\x30\x5c\x85\x24\x04\xe8\x4c\
+\xbf\x4d\x6b\xe6\x2c\xf9\xd6\xed\x28\x0e\x19\x3a\xfa\x46\x87\x17\
+\x8f\x31\x70\x5c\x42\x13\x16\x71\x0c\x8d\xd8\xfd\x01\x25\x37\xed\
+\x40\x3c\xef\x83\xeb\xc4\x99\x06\xab\xb4\x84\xc8\x21\x15\xf8\xd4\
+\x9d\x5f\x20\x64\x39\x89\x3a\xf2\x3c\x47\x5c\xac\x4a\x56\x9f\x11\
+\xb5\x7d\x01\x35\xea\x40\x14\xac\x62\x6b\x25\xf6\x98\xb0\x8b\xdf\
+\x96\x11\x82\x12\x72\x8d\xef\xb2\x7d\x68\x2d\xcd\x00\x64\xdd\xa3\
+\x1f\xbe\x7b\xf6\xba\x7c\xdf\x1e\xd6\xe1\x09\xad\x9c\x5a\x1a\xa8\
+\x4a\x17\x2f\x19\xce\xe5\x84\xc8\x03\x2d\xab\x94\x13\x94\x62\x8c\
+\x9a\x73\xaa\x71\xde\x36\x2e\x3b\x76\x0f\x7e\x47\x93\xc2\xba\x69\
+\x4e\x25\x55\xaa\x15\x48\xab\x70\xf2\x78\x60\xee\xe4\xd9\x1c\xdc\
+\xf4\xda\x01\x10\x9e\xfa\xe0\xd7\x7f\xfc\xfc\xab\x49\x2a\xd7\x7e\
+\xf2\x3a\x5c\x1e\x68\x9e\xdd\xc9\xc1\x13\x6d\x90\x93\x58\x93\x28\
+\x36\xc1\xbe\xae\x5c\xbc\x24\x46\x37\x71\x71\x2c\xf1\x52\x79\x5d\
+\x6c\xce\x95\xeb\x6b\xfc\xab\x51\xe5\x22\x4a\x73\xae\xcd\x1b\xbf\
+\x78\x8d\xec\xe4\xfb\x2f\x43\xfa\xfa\x15\x00\xf0\x2f\x85\x8b\xb3\
+\x0f\x4d\xfd\xfc\x85\x6f\x4f\xd5\xc7\x77\x23\xe8\xeb\x9a\x98\x6a\
+\x57\x6d\x0a\x5c\xcd\x12\xc5\x82\xa2\xe0\xd4\xd1\xe9\x34\xe8\x7e\
+\xfc\x07\x48\x9e\x04\x74\xcd\x00\x54\x9f\x00\xf8\xcd\xbc\xfd\xff\
+\xbf\x55\xfe\xcb\xed\xdf\x99\xd5\xe1\x33\x6b\x2f\x52\xdc\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\xf0\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x14\x00\x00\x00\x14\x08\x03\x00\x00\x00\xba\x57\xed\x3f\
+\x00\x00\x03\x00\x50\x4c\x54\x45\x09\x16\x28\x09\x16\x28\x09\x14\
+\x25\x09\x15\x27\x09\x14\x25\x08\x13\x23\x07\x11\x20\x07\x0f\x1c\
+\x06\x0d\x18\x04\x0a\x13\x03\x07\x0d\x02\x04\x07\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x01\x01\x01\x02\x02\x02\x03\x03\x03\x06\x06\x06\x0a\x0a\x0a\
+\x10\x10\x10\x17\x17\x17\x21\x21\x21\x28\x28\x28\x2c\x2c\x2c\x2d\
+\x2d\x2d\x2e\x2e\x2e\x2f\x2f\x2f\x30\x30\x30\x31\x31\x31\x32\x32\
+\x32\x33\x33\x33\x34\x34\x34\x35\x35\x35\x36\x36\x36\x37\x37\x37\
+\x38\x38\x38\x39\x39\x39\x3a\x3a\x3a\x3b\x3b\x3b\x3c\x3c\x3c\x3d\
+\x3d\x3d\x3e\x3e\x3e\x3f\x3f\x3f\x40\x40\x40\x41\x41\x41\x42\x42\
+\x42\x43\x43\x43\x44\x44\x44\x45\x45\x45\x46\x46\x46\x47\x47\x47\
+\x48\x48\x48\x49\x49\x49\x4a\x4a\x4a\x4b\x4b\x4b\x4c\x4c\x4c\x4d\
+\x4d\x4d\x4e\x4e\x4e\x4f\x4f\x4f\x50\x50\x50\x51\x51\x51\x52\x52\
+\x52\x53\x53\x53\x54\x54\x54\x55\x55\x55\x56\x56\x56\x57\x57\x57\
+\x58\x58\x58\x59\x59\x59\x5a\x5a\x5a\x5b\x5b\x5b\x5c\x5c\x5c\x5d\
+\x5d\x5d\x5e\x5e\x5e\x5f\x5f\x5f\x60\x60\x60\x61\x61\x61\x62\x62\
+\x62\x63\x63\x63\x64\x64\x64\x65\x65\x65\x66\x66\x66\x67\x67\x67\
+\x68\x68\x68\x69\x69\x69\x6a\x6a\x6a\x6b\x6b\x6b\x6c\x6c\x6c\x6d\
+\x6d\x6d\x6e\x6e\x6e\x6f\x6f\x6f\x70\x70\x70\x71\x71\x71\x72\x72\
+\x72\x73\x73\x73\x75\x75\x75\x77\x77\x77\x79\x79\x78\x7a\x7b\x7a\
+\x7c\x7d\x7c\x7f\x7f\x7e\x81\x82\x7f\x84\x85\x81\x84\x85\x82\x85\
+\x86\x83\x86\x87\x83\x86\x88\x84\x87\x88\x84\x87\x89\x84\x87\x89\
+\x85\x87\x89\x85\x88\x89\x85\x83\x86\x85\x7f\x84\x85\x7c\x82\x85\
+\x7a\x81\x85\x76\x81\x8b\x76\x82\x8e\x77\x84\x90\x79\x85\x90\x7d\
+\x87\x8e\x83\x89\x8c\x85\x8b\x8c\x89\x8c\x8c\x8a\x8d\x8b\x8c\x8d\
+\x8a\x8e\x8f\x8d\x90\x91\x8f\x92\x92\x91\x94\x94\x93\x95\x95\x95\
+\x97\x97\x97\x99\x99\x99\x9a\x9a\x9a\x9b\x9b\x9b\x9c\x9c\x9c\x9d\
+\x9d\x9d\x9e\x9e\x9e\x9f\x9f\x9f\xa0\xa0\xa0\xa1\xa1\xa1\xa2\xa2\
+\xa2\xa3\xa3\xa3\xa4\xa4\xa4\xa5\xa5\xa5\xa7\xa7\xa6\xa8\xa8\xa8\
+\xa9\xaa\xa9\xaa\xab\xaa\xab\xac\xab\xac\xad\xac\xad\xad\xad\xae\
+\xae\xad\xae\xaf\xae\xaf\xb0\xaf\xb0\xb0\xaf\xb1\xb1\xb0\xb1\xb2\
+\xb1\xb2\xb3\xb2\xb3\xb4\xb3\xb4\xb5\xb4\xb6\xb6\xb6\xb7\xb7\xb7\
+\xb8\xb8\xb8\xb9\xb9\xb9\xba\xba\xba\xbb\xbb\xbb\xbc\xbc\xbc\xbd\
+\xbe\xbd\xbe\xbf\xbe\xbf\xc0\xbf\xc0\xc0\xc0\xc1\xc1\xc1\xc2\xc2\
+\xc1\xc3\xc3\xc2\xc4\xc4\xc3\xc6\xc6\xc6\xc9\xc9\xc9\xcd\xcd\xcd\
+\xcf\xcf\xcf\xd1\xd1\xd1\xd3\xd3\xd3\xd5\xd5\xd4\xd6\xd6\xd5\xd8\
+\xd8\xd8\xda\xda\xda\xdc\xdc\xdc\xde\xde\xdd\xdf\xdf\xdf\xe0\xe0\
+\xe0\xe2\xe2\xe2\xe3\xe3\xe3\xe5\xe5\xe4\xe6\xe6\xe6\xe8\xe8\xe7\
+\xe9\xe9\xe9\xeb\xeb\xea\xeb\xeb\xeb\xec\xec\xec\xec\xec\xec\xee\
+\xee\xed\xef\xef\xef\xf1\xf1\xf1\xef\xef\xef\xef\xef\xee\xef\xef\
+\xee\xef\xef\xef\xf0\xf0\xf0\xf0\xf0\xf0\xf1\xf1\xf1\xf2\xf2\xf2\
+\xf3\xf3\xf3\xf4\xf4\xf4\xf5\xf5\xf5\xf6\xf6\xf6\xf7\xf7\xf6\xf7\
+\xf7\xf7\xf8\xf8\xf8\xf9\xf9\xf9\xfa\xfa\xfa\xfb\xfb\xfb\xfc\xfc\
+\xfb\xfc\xfc\xfc\xfd\xfd\xfd\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\
+\xfe\xfe\xfe\xfe\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\
+\xff\xff\xff\xff\xff\xff\xff\xff\x7e\xee\x29\x02\x00\x00\x01\x00\
+\x74\x52\x4e\x53\xd1\xd2\xd3\xc8\xb9\xa9\x93\x78\x5d\x43\x2c\x17\
+\x03\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x06\x0a\x10\x17\x21\x28\
+\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\
+\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\
+\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\
+\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\
+\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x71\x6f\x6e\x6d\x6d\x68\x68\x62\
+\x6f\x7c\x8a\x95\x9e\xa6\xae\xb6\xbf\xcd\xd2\xd7\xdb\xe1\xe7\xea\
+\xeb\xeb\xe8\xe6\xdc\xd1\xbe\xac\xa1\x9c\x96\x97\x98\x99\x9a\x9b\
+\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa2\xa2\xa1\xa1\xa1\xa3\xa2\xa2\
+\xa2\xa3\xa3\xa4\xa5\xa6\xa8\xaa\xad\xb0\xb3\xb7\xb8\xb9\xba\xbb\
+\xc0\xc5\xc8\xcb\xcd\xce\xcf\xce\xce\xcf\xd3\xd6\xdc\xe0\xe4\xe8\
+\xea\xee\xf1\xf3\xf5\xf6\xf7\xf8\xf9\xfa\xfa\xfb\xfb\xfb\xfc\xfc\
+\xfc\xfd\xfd\xfd\xfd\xfa\xf6\xf3\xef\xeb\xe7\xe0\xd8\xd0\xc8\xbf\
+\xb6\xae\xa5\x9c\x92\x88\x7d\x72\x68\x66\x64\x63\x62\x5b\x55\x51\
+\x4d\x4a\x46\x48\xa6\xfd\x00\x6d\x00\x00\x00\x9f\x49\x44\x41\x54\
+\x18\xd3\xb5\xd0\x31\x0e\x82\x40\x10\x85\x61\xe0\x12\x1e\x76\x54\
+\x54\xa0\xd9\x1d\xf3\xe2\x11\xd4\xc4\xd6\x58\xd3\x10\x0b\x3b\x02\
+\xd1\x42\xa9\xc6\x53\x50\x8e\xee\x02\x31\x9a\xd8\xf2\x17\x53\x7c\
+\xc9\x6e\x26\x13\x4c\xfe\x14\x8c\x87\x34\xf4\x85\x44\xb3\x0c\x40\
+\x1a\x0f\xea\x91\xa6\x40\xc1\xc6\xf0\x1e\x2b\xea\xd1\x3d\xc2\xae\
+\x62\x91\xd0\xf2\x15\xa9\xd7\x80\x28\xc6\xf6\x26\x46\x24\xb2\xa6\
+\xa9\xb1\xa4\x0e\x53\x3c\x45\x4c\x18\x39\x7c\x48\x83\x39\xf9\x3f\
+\x4f\x09\x44\xd8\xba\x58\x4a\xe0\xa0\x1e\x35\xcf\x50\x56\x58\x73\
+\x71\x3f\x63\x91\xab\xf6\x2b\xe9\x71\x83\xae\xe4\xe2\xe8\xb3\xbc\
+\xaa\xb6\xed\xcb\x4d\x1d\xf9\x4a\xbf\xbd\x01\x0c\x0e\x70\x72\x00\
+\x75\x19\xc2\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x0b\xe1\
+\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\x00\x57\x02\xf9\x87\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\
+\x00\x00\x00\x20\x63\x48\x52\x4d\x00\x00\x7a\x26\x00\x00\x80\x84\
+\x00\x00\xfa\x00\x00\x00\x80\xe8\x00\x00\x75\x30\x00\x00\xea\x60\
+\x00\x00\x3a\x98\x00\x00\x17\x70\x9c\xba\x51\x3c\x00\x00\x00\x06\
+\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\x00\
+\x00\x07\x74\x49\x4d\x45\x07\xe1\x0a\x1f\x04\x05\x06\xc0\x1b\xc4\
+\x43\x00\x00\x0a\xe5\x49\x44\x41\x54\x68\xde\xcd\x5a\x6b\x90\x54\
+\xc5\x15\xfe\x4e\xdf\x3b\x77\x66\x76\x96\x9d\x65\x67\x71\x51\x79\
+\x49\x10\xe5\x21\x28\x02\x0a\x18\x5c\x65\x92\xd2\x98\x94\x86\x94\
+\x92\x68\x48\x7e\x04\x1f\x10\x30\xbb\x1b\x2b\x65\xa5\x7c\x96\x29\
+\xab\xcc\x43\x17\xe5\x51\x25\x8f\xca\x8f\x18\x63\x02\x3e\x10\x9f\
+\x59\x17\x6a\x85\x22\x20\x2a\x06\x70\x05\x04\x91\xa7\x60\xf6\x31\
+\x3b\xbb\x3b\x33\xf7\xde\xee\x93\x1f\x73\x67\xf6\xce\x9d\x3b\x0b\
+\x05\x04\x73\xfe\xf4\xd6\xdc\x73\xba\x4f\x9f\xaf\xcf\xe9\xaf\xbb\
+\x97\xe2\xf1\x5a\x81\x42\x21\x00\xec\xb4\x0a\x80\xf0\x69\xd9\xa5\
+\xf7\x4d\xda\xb2\x70\x19\x0b\xa7\x75\xff\xad\x39\xdf\x4b\xb5\xe2\
+\x9b\xb6\x75\x4f\xc0\xdd\x96\x8a\x0c\xbb\x22\xe2\xfe\xfd\x9b\xb2\
+\x65\x3d\x07\x45\x89\x4e\x70\x1a\x9d\xf4\x27\x67\x6c\x9b\x4a\xa5\
+\x78\xf3\xe6\xad\x2a\xa7\x3b\x71\xe2\x38\x15\x8b\xc5\x34\x21\x84\
+\xbb\x4f\xd2\x5d\xf0\xfd\x5f\x38\xcf\xcc\xf8\xe2\x8b\xfd\x32\x1e\
+\xbf\x79\xc0\xd4\xa9\xd3\x26\x03\x18\x0a\xd0\x7f\x6c\xdb\xda\xd3\
+\xd9\xd9\x79\x70\xc7\x8e\xed\x5c\x53\x33\x38\xe7\xb3\x22\x27\x89\
+\xc5\xb9\x72\xe0\x6c\x6c\x2d\xcb\x42\x4f\x4f\xb7\x9a\x31\xe3\xfa\
+\x09\x9a\xa6\x3f\x08\xe0\x16\x00\x11\x00\x16\x80\xa3\xcc\xfc\x9a\
+\x94\xf2\xd9\x0d\x1b\xde\x39\x54\x53\x73\x21\x01\x60\x8a\xc7\x6b\
+\x35\x9f\x4e\xf3\x0e\x30\x33\x1d\x3b\x76\x4c\xb6\xb6\xee\xf3\x3a\
+\xe6\x75\xa8\xd4\xb7\xfe\x5a\xcc\x9c\x39\x5d\x33\x0c\x83\x3a\x3b\
+\x3b\x78\xe2\xc4\xab\xf5\x8a\x8a\xe8\x1c\x22\x7a\x14\xc0\xc8\x12\
+\xf3\x7c\xb5\xbb\x3b\xf9\xf3\x5d\xbb\x76\xf4\x94\x95\x45\x58\x77\
+\xa2\xa3\xf9\x39\x9f\x48\x74\x62\xd4\xa8\xcb\x30\x76\xec\x15\x97\
+\xdc\x74\xd3\xf7\xc7\x02\x18\x0e\x40\x47\x71\x89\x23\x00\x20\x02\
+\x98\x01\x22\x02\x33\x83\x88\x98\x99\x05\x11\x14\xb3\x6f\x59\x24\
+\x66\xfe\xf0\xbd\xf7\xde\xde\x34\x73\xe6\xac\x01\x86\x61\xfc\x86\
+\x88\xee\x77\xa2\xee\x27\x12\x40\x92\x59\x29\x91\xad\x3f\x94\x73\
+\xc6\x13\x1d\xe6\xcf\x3e\x6b\xe5\xd9\xb3\x7f\x7c\xb1\xa6\x69\xbf\
+\x24\xa2\x1f\x01\x18\x06\xc0\x38\xc5\xd2\x01\x51\xae\x25\x4f\xeb\
+\xab\xbe\x49\x29\xf9\x4e\x6d\xed\x77\x06\xe9\xba\xfe\x14\x11\xdd\
+\xe5\x09\xa6\x5b\x0e\x33\xf3\xe2\x4c\x26\xfd\xe7\x9d\x3b\x77\xa4\
+\xca\xcb\x07\x10\x00\xe5\x46\x20\x3f\x89\x4f\x3f\xdd\xc5\x77\xdc\
+\x31\x77\x82\x10\x62\x09\x80\x19\xa7\x72\xfa\x0c\x65\xab\x94\xf2\
+\x1e\x80\x12\x81\x80\xbe\x0c\xc0\x6d\xf0\xcf\x0f\x06\xf0\x9e\x52\
+\xf2\x91\x3d\x7b\x5a\xb7\xf5\xf4\x24\xe1\x38\x0f\x38\xd1\x2f\x40\
+\xe0\xc8\x91\x2f\x71\xfb\xed\x77\x0d\x15\x42\x2c\xfd\x1f\x3a\xdf\
+\xaa\x94\x5c\x08\xa0\x4d\xd3\xb4\x25\x00\x7e\x58\xc2\xf9\x0c\x80\
+\xe5\xa6\x69\xfe\xac\xb1\x71\xf1\xbf\x4c\x33\x43\x86\x11\x2c\xc8\
+\xb9\x02\x04\x94\x52\x34\x7a\xf4\x58\x08\xa1\x2d\x02\x30\xdd\x27\
+\x12\x49\xa7\x53\xaf\x9c\x6e\xd2\x0a\x00\x1d\x4a\xa9\x07\x6c\x5b\
+\xee\x35\x0c\xe3\x39\xc7\x79\x3f\x49\x32\xf3\x93\xdd\xdd\xc9\xe7\
+\x5e\x7f\xfd\xe5\x94\x53\x6c\xdc\xbe\xe4\x97\x50\x0e\x01\xd1\xdc\
+\xdc\x62\xdf\x7f\xff\xa2\x4b\x89\x68\xb6\xa7\xb3\x2e\x00\xcb\x95\
+\x92\xaf\x33\xa3\x2b\x9b\x98\xa4\x7c\x5a\x72\x12\x97\xb2\x6b\xbf\
+\xaf\x98\x65\xff\x20\x30\xab\x94\x69\x5a\x47\xc3\xe1\xf0\x23\x00\
+\xee\x2a\xe1\x7c\x82\x99\x7f\xdb\xdd\xdd\xbd\xaa\xab\x2b\xa1\xc6\
+\x8e\x1d\x2f\x7c\x9c\xcf\x23\xc0\x0e\x02\x0a\x00\x6b\x9a\x3e\x01\
+\xc0\x50\x4f\x87\xcf\x1d\x3a\xf4\xe5\xe3\x6b\xd6\xac\xb5\x2e\xb8\
+\xa0\x52\x58\x96\xc5\x81\x80\x4e\xa6\x69\xb1\x61\x04\xc8\x34\x6d\
+\x36\x0c\x9d\x6c\x5b\xb2\xa6\x69\xa4\x94\xca\xcf\x80\x99\x21\x84\
+\x20\x29\x25\x4b\x69\x53\x22\x91\x56\xf5\xf5\xf5\xf3\x88\x68\x11\
+\xfc\x13\xb6\x8b\x99\x1f\x4c\x24\x3a\x57\x47\xa3\x95\x73\x22\x91\
+\x48\xc7\x4b\x2f\xfd\x63\x7d\x3c\x5e\xab\xa3\x18\x4d\x99\xdb\x89\
+\x15\xb2\x25\x0d\x0d\x0d\x0d\x97\x20\x5b\x2a\x73\xd2\xae\x94\x7c\
+\x75\xcd\x9a\xb5\x96\xab\x13\xe1\x99\xb8\x70\xfd\x5e\x52\x9a\x9a\
+\x36\xda\x75\x75\x75\xd3\x88\xe8\x61\x00\x65\x3e\x2a\x69\x66\x7e\
+\xa2\xab\x2b\xb1\x3a\x1a\xad\xbc\x93\x88\x9e\x21\xa2\x46\x00\x6f\
+\xa0\xc4\xe6\x58\x90\xc0\x4e\xd4\x02\x9e\x4e\x53\xcc\x9c\x88\xc5\
+\x22\x02\x67\xb1\x3b\x1f\x3c\xb8\x5f\x2d\x58\x30\x7f\x90\x10\xe2\
+\x51\x64\x4b\xb2\x57\x14\x33\x2f\x4d\xa5\x7a\x97\x54\x54\x44\x6f\
+\x25\xa2\xdf\x03\xa8\x64\xe6\xb2\x12\xe3\x0a\xb8\xe8\x34\x3b\x08\
+\xf8\x46\x91\x99\x45\x5b\x5b\xcf\x19\x3b\xaf\x94\xe2\x9a\x9a\x0b\
+\x45\x28\x14\x9e\x07\x20\x5e\x42\x6d\x5d\x26\x93\x79\x32\x14\x0a\
+\x5f\x43\x44\x7f\x00\x30\x08\x00\x88\xc8\x8b\x70\x6e\xdc\x3c\x02\
+\x40\x7e\x27\x25\x38\x1f\x0a\x84\x88\xb8\xa6\x26\x7a\xc6\xbc\xa8\
+\xb9\xb9\x85\xa7\x4c\x99\x7e\x15\x80\x05\xf0\x5f\xf7\xbb\xa5\x94\
+\x0f\x29\xa5\x58\x08\xf1\x38\xb2\x3b\x7e\x3e\x78\x28\xde\xf5\xf3\
+\xc1\x74\x23\x80\x2c\x00\xbe\x08\xd0\x89\x13\x09\x06\x20\x52\xa9\
+\x5e\xb5\x77\xef\x67\xdc\xd4\xb4\xd1\x6e\x6a\xda\xa8\x7a\x7a\xba\
+\x15\xb3\x42\x09\xe1\x4c\x26\x4d\xf7\xde\x7b\x4f\x58\x08\x51\x0f\
+\x60\x88\x8f\x4e\x92\x99\x7f\xd7\xd8\xd8\xb8\x5b\xd7\xf5\x0a\x78\
+\x0a\x08\x11\x95\x3c\x0b\xe4\x10\xc8\xd3\xe9\xd2\x08\x08\x35\x78\
+\x70\x25\x25\x93\x49\x79\xe9\xa5\x63\x82\xb3\x67\xcf\x99\x50\x57\
+\x57\x77\x5b\x5d\x5d\xdd\x77\x27\x4f\x9e\x36\x3c\x14\x2a\x63\xdb\
+\xb6\xbc\x47\x44\x06\x20\x5a\x5a\xb6\xd8\x65\x65\x65\x37\x03\xb8\
+\xb5\xc4\x24\xff\xd2\xd9\xd9\xf1\x4a\x24\x22\x84\xe3\x6c\x41\x3f\
+\x4e\x50\x4b\x1d\x82\x58\x78\x0d\x88\x8a\x97\x84\x52\x4a\x7c\xf5\
+\x55\xa7\x1a\x33\x66\x7c\xb8\xaa\x2a\xf6\x98\x10\x5a\x93\x10\xe2\
+\xef\x42\x88\xd7\x02\x81\xc0\x9b\xa3\x47\x8f\xb9\x73\xe0\xc0\x18\
+\x99\xa6\x99\x3f\xab\x02\xa0\xe3\xc7\x8f\xc8\xf9\xf3\xe7\x57\x13\
+\x89\x05\xf0\xaf\x3a\xbb\xa4\x94\x4f\xaf\x5f\xbf\xd6\x1a\x30\x20\
+\x0a\x66\x2e\x3a\x9b\x38\x41\x75\x17\x90\x82\xcf\xc2\xfd\x23\x33\
+\x67\xb7\x1c\x8f\xe4\x4e\x41\x91\x48\x79\x19\x80\x1b\x01\xc4\x90\
+\xad\x56\x41\x00\x97\x13\xd1\x33\x23\x46\x7c\xeb\x8e\x4c\x26\x03\
+\x29\x65\x1e\xe2\xdd\xbb\x3f\xe7\x70\x38\xfc\x3d\xf8\x53\x12\x93\
+\x99\x9f\x5e\xbc\x78\xf1\xfe\x09\x13\x26\x51\x45\x45\x05\x09\x71\
+\x4a\x04\xbc\x92\x4f\x90\xdc\x6c\x89\x8a\x69\x23\x29\xa5\x08\x00\
+\x3e\xfa\x68\x6b\x07\x33\x2f\x06\xd0\xe1\xd1\x89\x11\xd1\x1f\xa6\
+\x4f\x9f\x19\x6f\x69\x79\x9f\x99\x99\x13\x89\x0e\x2c\x5c\xb8\x30\
+\x46\x44\x77\xc3\x9f\xc5\x36\xa5\xd3\xa9\x57\x26\x4d\x1a\x2f\x88\
+\x88\xbe\xfe\xfa\x24\x3b\xe3\xf8\x21\xe0\x77\x8b\x91\x47\x20\xbf\
+\x8c\x38\x2b\xc5\xb3\x14\xc4\x55\x55\x65\x14\x08\x18\x7c\xe8\xd0\
+\xc1\xbf\x31\xf3\xc3\x00\xba\x3d\x7a\x17\x11\xd1\x1f\x17\x2d\xaa\
+\x1b\xbb\x7d\xfb\x16\xde\xb6\x6d\x87\x0c\x04\x02\xb7\x00\xb8\xc6\
+\x67\xe0\xa4\x52\x6a\xf9\xb2\x65\xcb\x3b\xab\xaa\xaa\x09\x00\xd7\
+\xd4\x5c\x48\x0e\xd2\x7e\x08\xe4\x26\x51\xf0\xc9\x8d\x40\x7e\x23\
+\xf3\x43\x80\x99\xa9\xbd\xbd\x97\x0d\xc3\xa0\xe3\xc7\x8f\xa8\xf6\
+\xf6\xb6\x95\xcc\xfc\x0c\x00\xdb\xa3\x3b\x5e\x08\xf1\xc4\xdc\xb9\
+\x77\x47\xef\xbb\xef\xde\x4a\x22\xfa\x29\x8a\x37\x46\x00\x78\xa7\
+\xb7\xb7\xa7\x79\xe6\xcc\x69\x79\x7a\x70\xf4\xe8\x21\xd5\x0f\x02\
+\x7e\x92\x4f\x8e\x7c\x82\x94\x42\x80\x88\x38\x12\x11\x04\x00\x65\
+\x65\x11\xfa\xe4\x93\xed\xb6\x69\x66\xfe\x04\x60\xad\x4f\xc7\x3f\
+\x08\x04\x8c\x79\x65\x65\x91\xeb\x50\xcc\x68\x81\x2c\xd7\x79\xfe\
+\xf9\xe7\x57\xa4\x82\xc1\x50\x3e\x5f\x86\x0c\x19\x26\x4a\x20\xe0\
+\xb7\x74\x72\x08\x90\x1f\x02\x45\x37\x66\xcc\x40\x2a\xd5\x57\x5d\
+\xab\xab\x2f\xa0\xa5\x4b\x97\x25\x95\x52\x8f\x01\xd8\xed\xd1\xd7\
+\x88\xe8\x57\x44\xf4\x18\xfc\x2b\x4f\x73\x32\xd9\xb5\x65\xda\xb4\
+\xc9\xb9\x02\xc2\x00\xc4\xe1\xc3\x25\x11\xe8\xf7\xc2\xc1\x8d\x80\
+\x70\x10\x10\x7e\xca\xca\xb3\x3b\xc4\xe3\xb5\xd4\xd8\xd8\xb8\x87\
+\x99\x9f\x02\x90\xf2\xd8\x5c\x0c\xe0\x6a\x9f\x81\x33\xcc\xea\xaf\
+\x2b\x56\xac\xec\x8e\x44\xca\x0b\xe8\xc1\x90\x21\xc3\x04\x91\xf0\
+\x8b\x76\x6e\xe4\x82\x12\xed\x46\x20\xdf\x89\x83\x80\x77\x23\x23\
+\x00\x5c\x5e\x5e\xc0\x00\x18\x00\x4d\x99\x72\x25\x75\x75\x25\x5e\
+\x45\x96\x2d\x9e\x8e\x7c\x68\x59\x76\xf3\xd4\xa9\x57\xb9\x59\xac\
+\x02\x40\x27\x4e\x1c\x63\x67\x1f\xf0\x4c\xa2\xe0\xfa\xd3\xcb\xc7\
+\x38\x07\x63\x8e\x4e\x97\x44\xa0\xbb\x5b\x16\x45\x20\x1a\xad\xd4\
+\x56\xae\x5c\x95\x54\x4a\x2d\x03\xd0\x7e\x1a\x13\x58\xb3\x64\xc9\
+\x92\xf6\x68\xb4\x12\xf0\xd0\x83\x41\x83\x06\xe7\x96\xaf\x27\x6b\
+\x49\x79\xc7\xc5\x29\xe8\xb4\x1f\xb1\xe1\x58\x2c\xe2\x7b\x57\x59\
+\x5b\x7b\x9d\x9e\x4c\x76\x6d\x01\xf0\xf6\x29\x9c\x3f\x6c\xdb\xf6\
+\xbb\xce\xdf\x45\xdc\x26\x91\xe8\x60\xa0\x18\x01\x27\xa0\x67\x47\
+\xa7\x01\xa6\x52\x74\x3a\x10\x08\xf0\xaa\x55\xab\x33\xcc\xfc\x02\
+\x80\xde\x7e\x26\xb0\xb1\xad\xed\xeb\x7d\x37\xdc\xf0\xed\xdc\xf2\
+\x29\xe0\x36\xe5\xe5\x03\xdc\x51\xee\x8b\xff\xf9\xa0\xd3\x93\x26\
+\x8d\x17\x99\x4c\x7a\x2b\x80\x8f\x4b\x38\x6f\x32\xf3\xba\x17\x5e\
+\x78\xd1\xd2\x34\xcd\xef\x56\x0f\xa6\x69\x02\x3e\x3b\xee\x39\xa7\
+\xd3\x7e\xd1\xab\xaa\xaa\xa6\x65\xcb\x96\xb7\x33\xf3\xbb\xf0\x97\
+\xfd\x96\x65\x6e\x1b\x38\x30\x4c\x80\xff\x39\x22\x7b\x9b\xd7\x17\
+\x4c\x77\xf0\x70\xae\xe8\x34\x4e\x71\x90\x51\x4a\xad\x03\x70\xa0\
+\xd8\x7f\xde\xf0\xf9\xe7\x7b\x8f\x4e\x9a\x34\xa5\x14\xab\x84\xae\
+\xeb\x38\x57\x74\xba\x08\x01\x87\x4e\xfb\x42\x9f\x93\x59\xb3\xae\
+\xd7\x5a\x5b\x77\xee\x54\x4a\xdd\x03\xe0\x4d\x00\xc7\x01\xb4\x01\
+\xf8\xa7\x52\xbc\x7c\xf7\xee\x1d\xec\xd4\x79\x5f\x6e\x90\x4a\xf5\
+\x9e\x33\x3a\x6d\x7a\x94\x0c\x4d\xd3\x82\xfd\x39\x9f\x1b\x48\x4a\
+\x49\xef\xbf\xdf\xbc\x21\x99\x4c\xfc\x44\x4a\x79\xa3\x6d\xdb\xf1\
+\x74\x3a\x3d\xa7\xa5\xa5\xb9\xf5\xb2\xcb\xc6\xf5\xf7\x0e\x81\xde\
+\xde\x1e\xe8\xba\x66\xc0\xc3\x5c\x99\xd9\xe2\xec\x91\xcf\x97\x4e\
+\x17\xdc\x4e\x13\x11\xea\xeb\xeb\x8f\xa2\x2f\x69\x80\x2c\x55\x8e\
+\x03\xd8\xb9\x6f\xdf\x1e\x94\x97\x0f\xe0\x40\x40\x27\x29\x15\x13\
+\x01\x44\x82\xa4\xb4\x39\x10\x08\x50\x3a\x9d\xe1\x70\x38\x44\xcd\
+\xcd\x4d\xc9\xfd\xfb\xbf\xdc\x53\x51\x11\xe6\xea\xea\x98\x08\x06\
+\x83\x68\x6b\x53\x64\x9a\xa6\xf2\xb3\xed\xed\xed\x45\x22\x61\xaa\
+\x86\x86\x86\x1b\x01\x0c\xf6\x38\x79\x94\x88\x10\x8f\xd7\xfa\xc6\
+\xcd\x7b\x3b\x4d\x52\xca\x7f\xeb\xba\xfe\x15\x80\x8b\x1c\x25\x41\
+\x44\x0f\xd4\xd7\xd7\xa7\xa5\xb4\xdf\x92\x52\xa5\x89\x72\x65\x17\
+\xce\x15\xba\x22\x22\xc1\xcc\x8a\x84\x10\x2c\xa5\x22\x4d\x13\xac\
+\x54\xdf\xef\x59\xbd\x6c\xae\x7a\x6d\x35\x4d\x37\x1a\x1a\x1a\xe2\
+\x44\xf4\x10\x0a\xef\xa4\xda\x94\x52\x1f\x95\x8a\x3e\x9c\x07\x8e\
+\xdc\xab\x20\xdb\xb6\x4d\xc3\x87\x5f\xa2\xc5\x62\x83\x96\x02\xf8\
+\x85\xc7\xc0\x74\xd6\x75\x0f\x7c\xaa\x01\xfc\x0f\x1c\xbe\x51\xf3\
+\xb1\x09\x21\xcb\x9f\x82\x1e\xdd\x17\x13\x89\xce\x79\xfb\xf6\xb5\
+\x9a\x86\x11\xf4\xeb\xab\xe0\x6e\x94\x74\x5d\xe7\xf5\xeb\x5f\xb6\
+\xe6\xce\xbd\xfb\x59\x21\xc4\x0c\x00\x97\xbb\x94\x0d\xb8\xae\x3b\
+\xce\x83\x1c\x50\x4a\x35\xae\x5a\xb5\xda\x7b\xb1\xeb\x46\x80\xb4\
+\x91\x23\x47\xc0\x35\x09\x31\x78\xf0\x45\xf8\xe0\x83\x2d\x27\x47\
+\x8f\x1e\xb3\x97\x88\xae\x45\xf6\xfc\x7b\xbe\xe5\x20\x33\xd7\xbf\
+\xf5\xd6\xba\x8d\x57\x5e\x39\x41\xf3\x39\xd4\xe4\x11\xd4\x46\x8e\
+\x1c\xe1\x7e\x3c\x56\x44\x44\x15\x15\x51\xb4\xb6\xee\x3c\x30\x7c\
+\xf8\xc8\x4d\x44\x14\x45\x16\xde\xf0\x79\x70\x3c\x01\xe0\x0d\xa5\
+\xd4\xaf\x37\x6f\x6e\xd9\x50\x5d\x1d\x13\x42\x14\xef\xab\x70\x2d\
+\xc3\xdc\x2b\x65\x11\x3f\x61\x66\x3e\x79\xf2\x04\x5f\x7b\xed\x75\
+\xe1\x48\x24\x72\x05\x91\xb8\x86\x88\x86\x02\x1c\x02\xf2\x57\xea\
+\x9c\xcf\xcc\xc2\x96\x00\x56\x7d\x07\x26\x16\x2e\x1b\x3f\x5b\x93\
+\x08\x47\x94\x52\x1f\xf4\xf4\xf4\x7c\xbc\x62\xc5\xca\xde\x59\xb3\
+\xae\xef\x37\xf2\x4e\xc0\x25\xb9\xd6\x97\x6f\x9d\xb7\x6d\x9b\x37\
+\x6e\xdc\xa4\x00\xf0\xa8\x51\xc3\x84\x65\x59\x1c\x0e\x87\x45\x3a\
+\x9d\x56\xa1\x50\x48\xa4\xd3\x69\x15\x0c\x06\x85\x65\x59\x2a\x10\
+\x08\x90\x94\x12\x44\x04\x22\x82\x52\x0a\x9a\xa6\xc1\xb2\x2c\x18\
+\x86\x81\x74\x3a\xc3\xa1\x50\xb0\xc0\x36\x14\x0a\x89\x03\x07\x0e\
+\x2b\xd3\xb4\x30\x6e\xdc\x68\x0c\x1c\x38\x50\x84\x42\xe1\x52\x55\
+\xc7\xcb\xc7\xe0\x7e\x27\x3e\x17\xef\xbf\x7e\x7d\x94\x7a\xa9\x39\
+\xdb\x77\x67\x01\x40\x0a\x1f\x05\x3f\xe3\xfe\x3a\x39\x53\xe7\xc5\
+\x59\x8e\x5b\x70\xa0\x01\xfa\x48\x5c\xee\xff\x13\x72\x2d\x7b\xbe\
+\x01\xd9\xf7\x5a\x77\xfb\x8d\xd9\xfe\x17\x5a\x62\x2e\xda\x22\x1b\
+\xb0\x80\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\x74\x65\x3a\x63\
+\x72\x65\x61\x74\x65\x00\x32\x30\x31\x37\x2d\x31\x30\x2d\x33\x31\
+\x54\x31\x32\x3a\x30\x35\x3a\x30\x31\x2b\x30\x38\x3a\x30\x30\xff\
+\x8c\x2c\xfe\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\x74\x65\x3a\
+\x6d\x6f\x64\x69\x66\x79\x00\x32\x30\x31\x37\x2d\x31\x30\x2d\x33\
+\x31\x54\x31\x32\x3a\x30\x35\x3a\x30\x31\x2b\x30\x38\x3a\x30\x30\
+\x8e\xd1\x94\x42\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\
+\x00\x00\x1e\xc4\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\xca\x00\x00\x00\xc8\x08\x06\x00\x00\x00\xa9\xad\x7e\xa3\
+\x00\x00\x1e\x8b\x49\x44\x41\x54\x78\x5e\xed\x5d\x09\x98\x24\x45\
+\x95\x7e\x2f\xbb\xe7\x00\x04\x39\x46\xf0\xc0\x15\xd6\x71\xec\xae\
+\x78\x59\xc3\xd8\xa2\xce\x02\xae\x80\x8a\x22\x2a\x2a\x88\xe2\x2a\
+\x20\xae\xb8\x82\x3a\xb2\x1c\xab\xc0\x2a\x82\x17\x28\x78\xc1\xee\
+\xb2\x2b\x03\xa2\x78\x20\xa8\xdc\x28\x2a\x2e\x22\x2a\x0c\x34\x95\
+\x2f\xaa\x67\x70\x64\xd9\x15\x16\xd0\x05\xc1\xf1\x98\x69\xbb\xf2\
+\xed\x17\x6d\xf5\x7c\x3d\xd3\x47\x65\x64\x66\x64\x66\x55\x45\x7c\
+\x5f\x7f\xa3\xf4\x7b\xff\x7b\xf1\xbf\xfa\xbb\xf2\x88\x78\x81\x50\
+\xd1\x51\xaf\xd7\x77\x17\x91\x95\x71\x1c\xbf\x14\x11\x9f\x07\x00\
+\xbb\xb5\x7f\x7e\x05\x00\x0d\x44\xfc\x85\x88\xdc\xc0\xcc\xb7\x54\
+\x74\x0a\x3e\xad\x59\x18\xd8\xaa\xae\x2b\x44\xe4\x29\x88\x68\x7e\
+\x9e\x10\x91\x35\x88\x38\x26\x22\x37\x33\xf3\xf7\xaa\x44\x20\x56\
+\x29\x19\x93\xcb\xb2\x65\xcb\x96\x2c\x5a\xb4\xe8\x64\x11\x39\x25\
+\x61\x6e\x46\x28\x97\x31\xf3\xc5\x09\xed\xbd\x59\x09\x0c\xd8\xd6\
+\x55\x44\xee\x46\xc4\xef\x30\xf3\x99\x25\xa4\x3b\x23\x64\xa5\x84\
+\xa2\x94\x7a\x33\x22\x7e\x08\x00\x9e\x6b\x4b\x8e\x88\x7c\x07\x00\
+\xce\xd5\x5a\xdf\x66\xeb\xeb\xed\xdd\x32\x10\x86\xe1\xe1\x22\x72\
+\x56\x9a\xba\x02\x80\xf9\x43\x78\x66\xd9\x57\x0e\x95\x11\x0a\x11\
+\xbd\x07\x00\x3e\x97\xb5\x64\x88\xf8\xc6\x28\x8a\xae\xc8\x8a\xe3\
+\xfd\xf3\x61\xa0\x2d\x92\x6f\xe4\x80\x76\x10\x33\x7f\x37\x07\x9c\
+\x54\x10\x95\x10\x0a\x11\x99\x6f\x91\x0f\xa7\x9a\xc1\x2c\x4e\x5e\
+\x2c\x79\x31\x99\x0d\x87\x88\x5e\x0f\x00\x57\x66\x43\xd9\xec\xfd\
+\x88\x88\xbc\x5a\x6b\x7d\x47\x4e\x78\x56\x30\xa5\x0b\x85\x88\x5e\
+\x02\x00\x3f\xb4\xca\xba\xb3\xf1\xff\x05\x41\xb0\x6f\xa3\xd1\x58\
+\xd7\xd9\xd4\x5b\xb8\x60\x80\x88\x86\x01\xe0\x06\x00\x78\x56\x8e\
+\xf8\xa3\x83\x83\x83\xfb\x8f\x8e\x8e\x3e\x9e\x23\x66\x22\xa8\x2a\
+\x08\xc5\x88\xc4\x88\x25\xef\x71\x31\x33\x1f\x9b\x37\xa8\xc7\x4b\
+\xc6\x00\x11\xdd\x08\x00\x07\x25\xb3\x4e\x6e\x85\x88\x9f\x89\xa2\
+\xe8\xfd\xc9\x3d\xf2\xb1\x2c\x55\x28\x61\x18\xbe\x53\x44\xfe\x2d\
+\x9f\xa9\xcc\x44\x41\xc4\x57\x45\x51\x74\xbd\x2b\x7c\x8f\x3b\x3b\
+\x03\x39\xde\x97\xcc\x1a\x00\x11\x0f\x8e\xa2\xc8\x7c\x5b\x15\x36\
+\x4a\x15\x0a\x11\xdd\x09\x00\x23\xae\x66\x2b\x22\x97\x68\xad\x8f\
+\x71\x85\xef\x71\x67\x67\x80\x88\xcc\xcd\xfb\xe1\x0e\xf9\xf9\x3c\
+\x33\xbf\xd7\x21\xfe\x0c\xe8\x52\x84\x52\xaf\xd7\xf7\x8c\xe3\xf8\
+\x90\x3c\x9e\x72\x75\x20\xeb\x0f\xcc\xfc\xa4\x22\x09\xed\xf7\x58\
+\x44\xf4\x4c\x00\xf8\x1f\xc7\x3c\xac\x1f\x18\x18\x78\xc9\x3d\xf7\
+\xdc\xf3\xa0\xe3\x38\x9b\xe1\x0b\x13\x4a\xad\x56\x7b\x6a\x10\x04\
+\xaf\x02\x00\x23\x10\xf3\xef\x82\x82\x26\x59\xea\x63\xc5\x82\xe6\
+\x58\x99\x30\x4a\xa9\x37\x21\xe2\x57\x0b\x48\xe8\x62\x11\xf9\x7e\
+\x10\x04\x37\x44\x51\xf4\x5b\xd7\xf1\x9c\x0a\x65\xe9\xd2\xa5\x3b\
+\x2c\x5a\xb4\xe8\x10\x23\x10\x11\x31\x02\xd9\xc1\xf5\x84\x66\xc1\
+\x7f\x1b\x33\x5f\x56\x42\xdc\xbe\x0c\xa9\x94\xfa\x3c\x22\x9e\x50\
+\xe0\xe4\x1b\x6d\xc1\x5c\x1f\x45\xd1\xcd\xae\xe2\xe6\x2e\x94\x91\
+\x91\x91\x05\xe3\xe3\xe3\x53\xc2\x30\xdf\x1c\x4f\x75\x95\x7c\x42\
+\xdc\x93\x99\xf9\x53\x09\x6d\xbd\x59\x46\x06\x88\xe8\x26\x00\x78\
+\x79\x46\x98\x54\xee\x22\x72\x2b\x00\x5c\x0b\x00\x57\x69\xad\xd7\
+\xa7\x02\x99\xc3\x29\x37\xa1\x84\x61\x38\x22\x22\x47\xb5\x2f\xad\
+\xf6\xcc\x33\xc9\x8c\x58\xa7\x30\xf3\xb9\x19\x31\xbc\x7b\x42\x06\
+\x88\xe8\x4b\x00\xf0\xd6\x84\xe6\xae\xcc\xfe\x04\x00\x57\x9b\x4b\
+\xc0\x28\x8a\xcc\xd2\xa6\xcc\x23\xb3\x50\x8c\x40\xe2\x38\x7e\x27\
+\x22\xbe\x33\x73\x36\x0e\x00\xe2\x38\x3e\xa6\xd9\x6c\x5e\xe2\x00\
+\xda\x43\xce\xc2\x00\x11\x99\x3f\x4a\x27\x55\x88\x1c\xf3\x9e\x6e\
+\x75\xd6\xcb\xef\xd4\x42\x19\x1a\x1a\xda\x63\x60\x60\xe0\x03\x55\
+\x15\xc8\x54\xa1\xfc\xbb\x94\x62\x3f\xb2\xae\xdf\x8d\x65\x98\xcd\
+\x9d\x22\x72\xba\xd6\xda\x5c\x1a\x5a\x8f\x54\x42\xa9\xd5\x6a\x47\
+\x9b\x55\xbe\x88\xb8\x87\x75\xc4\x82\x1d\x82\x20\x78\x66\xa3\xd1\
+\x78\xa0\xe0\xb0\x7d\x1b\x4e\x29\xb5\x0f\x22\xfe\xb8\xc2\x04\x7c\
+\x90\x99\x3f\x6e\x9b\x9f\x95\x50\xda\xdf\x22\x46\x20\x47\xdb\x06\
+\x2a\xc9\x7e\x0d\x33\x3f\xbf\xa4\xd8\x7d\x19\xd6\xec\x3b\x59\xb8\
+\x70\xe1\x6f\xaa\x3c\x79\x44\xfc\x26\x00\x9c\x1a\x45\xd1\x7d\x49\
+\xf3\x4c\x2c\x14\xb3\x78\xd1\x2c\x37\x41\xc4\x65\x49\xc1\xcb\xb6\
+\x13\x91\xf3\xb5\xd6\x27\x96\x9d\x47\xbf\xc5\x0f\xc3\xf0\x93\x16\
+\x1b\xef\x4a\xa1\x47\x44\xee\x45\xc4\xe3\x92\xee\x73\x49\x24\x94\
+\xf6\x0a\xdf\xeb\x00\x60\xdb\x52\x66\x95\x22\xa8\x88\xdc\xdf\x6a\
+\xb5\xf6\x5f\xbb\x76\xed\xfd\x29\xdc\xbd\x4b\x06\x06\xda\xdf\x2a\
+\xe6\xf2\xcb\x7a\x03\x5e\x86\xb0\x69\x5c\xff\x68\x5e\x7e\x27\x11\
+\x4b\x47\xa1\x38\x5a\x06\x9f\x66\x52\x56\x3e\xfe\x69\x97\x15\x5d\
+\xb9\x1b\x9b\xfb\xd8\x20\x08\x56\xe7\x0e\xec\x06\x70\xff\x4e\x62\
+\x99\x57\x28\xed\x35\x59\x89\xaf\xe3\xdc\xcc\x21\x15\xea\xa7\x98\
+\xf9\xe4\x54\x9e\xde\x29\x37\x06\x94\x52\xab\xbb\xe5\x7e\x56\x44\
+\x76\xd1\x5a\x3f\x36\xd7\xe4\xe7\x14\x4a\xfb\xeb\xd3\x5c\xb6\x6c\
+\x97\x1b\x73\xb3\x03\x99\x4b\xba\xcb\x44\xe4\x23\x79\xdc\xff\xf8\
+\x15\xc3\x8e\xab\x65\x09\x4f\x44\x57\x03\xc0\xab\x2d\xdd\xca\x30\
+\x9f\xf7\xc1\xcf\xac\x42\x59\xba\x74\xe9\xa2\xc5\x8b\x17\x5f\x05\
+\x00\x07\x3b\xca\xf8\x2e\x11\xb9\x2c\x8e\xe3\xaf\x8f\x8d\x8d\x3d\
+\x34\x15\x23\xeb\xf2\xec\xb2\x36\xf5\x38\xe2\xa8\x67\x60\xc3\x30\
+\x3c\x4e\x44\xfe\x35\xc3\x84\x4e\x0a\x82\xe0\xb2\x56\xab\x75\x24\
+\x22\x1e\x09\x00\x7b\x67\xc0\x9a\xcf\xf5\xc3\x73\x75\x7d\x99\x55\
+\x28\x44\xf4\x45\x00\x78\x7b\xce\xc9\x18\x41\x5c\x6e\xd6\xe1\x30\
+\xf3\x4f\xe6\xc2\x36\xfb\xe7\xcd\x4b\x4c\x11\x79\xba\x45\xfc\x3b\
+\x11\xf1\xa3\x51\x14\x7d\xdb\xc2\xc7\x9b\x16\xc8\x00\x11\x99\x45\
+\xb1\x66\xf5\x86\xcd\xb7\xcb\x35\x00\xf0\x89\xad\x3f\x2f\x4a\xa9\
+\xe5\x88\x78\xa8\x88\x18\xe1\xe4\xfa\x14\x16\x11\xff\x2e\x8a\xa2\
+\xaf\x6c\x4d\xcd\x0c\xa1\xd4\xeb\xf5\xd7\xc4\x71\x9c\xcb\xfa\x98\
+\x76\xb0\xab\x10\xf1\xca\x0d\x1b\x36\x5c\x75\xff\xfd\xf7\x6f\x4c\
+\x52\x9b\xe1\xe1\xe1\xa7\x0d\x0c\x0c\x18\xb1\x1c\x88\x88\xfb\xcd\
+\xe3\x73\x93\x88\x7c\x49\x6b\x6d\x04\xe8\x47\x17\x30\xd0\x16\x8c\
+\xd9\xd4\x75\x00\x00\xec\x3e\x4b\xca\x66\x8f\xc9\x5d\x00\x70\x11\
+\x33\x9b\x05\x8e\xf3\x8e\x30\x0c\xcd\x55\xcf\xa1\x71\x1c\xbf\x0e\
+\x11\x97\x74\xb2\x4f\xf0\x7b\x8e\xe3\x78\x65\xb3\xd9\xfc\xfd\x74\
+\xdb\x19\x42\x21\x22\xf3\x58\x6f\x9f\x04\x80\xf3\x9a\x20\xe2\xa5\
+\x71\x1c\x5f\x90\xb5\x6b\xc6\x5e\x7b\xed\xb5\xe3\xc4\xc4\xc4\xde\
+\xa6\x9b\x60\x1c\xc7\xbb\x22\xe2\x02\x44\xd4\x7f\xfe\xf3\x9f\x9b\
+\xfe\xd1\x6f\xd6\x2a\x95\xeb\x5f\xab\xd5\xf6\x0a\x82\x60\xc7\xa9\
+\x2c\xe2\x38\x5e\xdb\x6c\x36\x1f\x4e\x93\x95\xe9\x40\x19\xc7\xf1\
+\x2a\x00\x30\x3f\x03\x69\x30\xa6\x7c\x44\xe4\x0c\xad\xf5\xd9\x73\
+\x0a\x45\x29\x75\x0a\x22\x7e\x32\x4b\x10\xd3\x9e\x46\x44\x8c\x40\
+\xf2\xee\xac\x92\x31\x2d\xef\xde\x0f\x0c\x28\xa5\xcc\xfd\xcb\xaa\
+\xf6\xbd\x4c\xda\x29\x3f\xda\x6a\xb5\x56\x8e\x8d\x8d\xfd\x62\x0a\
+\x60\xf3\x37\x4a\xad\x56\x7b\x52\x10\x04\x9c\xb1\xbd\xcc\x11\xcc\
+\x9c\x47\xb3\xb3\xb4\x13\xf4\x7e\x9e\x81\x49\x06\x88\xe8\x08\x00\
+\xf8\x5a\x06\x3a\x2e\x64\xe6\xe3\x67\x08\x85\x88\x4c\x6b\x9f\xff\
+\xc8\x00\x7c\xac\xef\xff\x9b\x81\x3d\xef\x9a\x3b\x03\x61\x18\x9e\
+\x20\x22\x9f\x4f\x09\xfc\xfb\x38\x8e\x55\xb3\xd9\x9c\xdc\xff\xbf\
+\xf9\x1b\x85\x88\x4c\xf7\xf0\x97\xa6\x04\x5d\xc5\xcc\x9f\x4d\xe9\
+\xeb\xdd\x3c\x03\xce\x18\x50\x4a\x99\xf7\x73\x67\xa4\x09\x20\x22\
+\x27\x6a\xad\xcf\xdf\x2c\x94\x30\x0c\x5f\x2c\x22\x3f\x4a\x09\x36\
+\xe3\xc6\x27\x0d\x8e\xf7\xf1\x0c\xb8\x62\x20\x0c\xc3\x8b\x44\xe4\
+\xef\x53\xe0\xdf\xc6\xcc\xfb\x6e\x16\x8a\x52\xea\x3c\x44\x4c\xd3\
+\x7d\xef\xa7\xcc\xbc\x32\x45\x02\xde\xc5\x33\x50\x28\x03\x61\x18\
+\x9a\x97\xdc\x2b\x6c\x83\x8a\xc8\x01\xe6\xc1\xd4\xe4\xa5\x17\x11\
+\x99\x17\x80\x69\x3e\xf0\x6f\x65\xe6\x2f\xdb\x06\xf7\xf6\x9e\x81\
+\xa2\x19\xc8\x70\xbf\xf2\x59\x66\x5e\x85\xa6\xa5\xd0\xe2\xc5\x8b\
+\x9f\x48\x91\xb8\x39\x15\xe9\x65\x29\xfc\xbc\x8b\x67\xa0\x70\x06\
+\xea\xf5\xfa\x76\xad\x56\xeb\xae\x14\x6f\xf2\x1b\xcc\xbc\x1c\x95\
+\x52\x07\x21\xa2\x69\xa8\x6c\x35\x10\xf1\x75\x7e\xc9\x88\x15\x65\
+\xde\xb8\x64\x06\xc2\x30\x3c\x55\x44\x3e\x61\x9b\x06\x22\x0e\x63\
+\xca\xb3\x49\x7e\xc9\xcc\x4b\x6d\x03\x7a\x7b\xcf\x40\x99\x0c\xd4\
+\xeb\xf5\x5d\xe3\x38\x36\xcb\x63\x9e\x61\x93\x87\x88\x9c\x60\x84\
+\x92\x66\x01\xe4\xb7\x98\xd9\x1c\x12\xe3\x87\x67\xa0\xab\x18\x50\
+\x4a\x5d\x81\x88\x87\x59\x26\xfd\x2d\x23\x94\x34\xef\x4f\xe6\x5c\
+\x8e\x6c\x99\x80\x37\xf7\x0c\x14\xca\x00\x11\x9d\x03\x00\xb6\x9b\
+\xfa\xee\x30\xf7\x28\xeb\x6c\x6f\x70\x44\xe4\x15\x69\xfb\x23\x15\
+\xca\x8a\x0f\xe6\x19\xd8\x8a\x01\x22\xfa\x07\x00\xb8\xd0\x92\x98\
+\x75\xe6\x1b\xc5\xb4\x9f\x5c\x6c\xe3\xb8\x71\xe3\xc6\x27\xaf\x5f\
+\xbf\xfe\x77\x36\x3e\xde\xd6\x33\x50\x05\x06\xea\xf5\xfa\x81\x71\
+\x1c\xdb\x36\xf3\x7e\xc8\x08\x45\x6c\x27\xc0\xcc\x1d\x9b\x52\xd8\
+\x62\xf6\xba\x3d\x11\x99\x63\xa0\xcd\xf2\x6f\xf3\x33\x38\xf5\x2f\
+\x22\x0e\x88\xc8\xd4\xff\x9f\xfc\xdd\x56\xff\x6d\xf2\x77\x5b\xfd\
+\xb7\xd3\xd3\x34\x71\xeb\x75\x8e\x93\xcc\x2f\xe5\xf9\x2d\x7f\xf0\
+\x42\x49\xc2\x6e\x46\x9b\x94\x7f\xc5\xe6\x8b\xba\x81\x99\xcb\x38\
+\x42\x23\x23\x13\xd5\x70\x4f\xf3\xe5\xe0\x85\x52\x40\xed\x5c\x1c\
+\xfc\x29\x22\x47\x6b\xad\x2f\x2d\x20\xfd\x9e\x0b\xe1\x85\x52\xc1\
+\x92\xb6\xb7\x35\xff\xaf\x83\xd4\xd6\x31\xf3\x90\x03\xdc\x9e\x87\
+\xf4\x42\xa9\x60\x89\x33\x2c\x38\xed\x38\x1b\x44\x7c\x99\xcb\x53\
+\xa6\x3a\x26\xd0\xa5\x06\x5e\x28\x15\x2c\x5c\x9a\xa2\x24\x9d\x06\
+\x22\xfe\x20\x8a\xa2\x03\x93\xda\x7b\xbb\xbf\x30\x90\xa6\x26\xfe\
+\x1e\xc5\xe1\xa7\x47\x29\xf5\x0e\x44\xfc\x77\x87\x21\x40\x44\x94\
+\xd6\xba\xe9\x32\x46\xaf\x61\x7b\xa1\x54\xac\xa2\x69\x5e\xe6\xa6\
+\x98\xc2\x97\x99\xb9\xec\xa3\xe0\x52\xa4\x5d\x9e\x8b\x17\x4a\x79\
+\xdc\xcf\x88\x4c\x44\x7f\x03\x00\xb7\x15\x91\xd2\xe0\xe0\xe0\x4e\
+\xa3\xa3\xa3\x8f\x17\x11\xab\x17\x62\x78\xa1\x54\xa8\x8a\x44\xf4\
+\x2d\xd3\x98\xad\x88\x94\x10\xf1\x9c\x28\x8a\x4e\x2d\x22\x56\x2f\
+\xc4\xf0\x42\xa9\x48\x15\xdb\x4d\xfb\x7e\x5b\x64\x3a\x7e\xb5\x44\
+\x72\xb6\xbd\x50\x92\x73\xe5\xd4\x92\x88\x3e\x0a\x00\x1f\x74\x1a\
+\x64\x26\xf8\xfb\x98\xf9\x73\x05\xc7\xec\xca\x70\x5e\x28\x15\x29\
+\x5b\x9a\x85\xa6\x39\xa4\xfe\x30\x33\x3f\x2d\x07\x9c\x9e\x87\xf0\
+\x42\xa9\x40\x89\xc3\x30\x7c\x8b\x88\x94\xd2\x70\x23\x08\x82\xc3\
+\x1b\x8d\x86\x39\xc8\xd3\x8f\x79\x18\xf0\x42\xa9\xc0\xc7\x83\x88\
+\x46\x01\x60\x79\x49\xa9\xdc\xc5\xcc\x23\x25\xc5\xee\x9a\xb0\x5e\
+\x28\x25\x97\xaa\x56\xab\xad\x08\x82\xc0\xec\xc9\x2e\x73\xec\x33\
+\xdf\xf9\x33\x65\x26\x56\x95\xd8\x5e\x28\x25\x57\x22\x0c\xc3\xcb\
+\x45\xe4\xcd\x25\xa7\x71\x2d\x33\xdb\x1c\xd6\x53\x72\xba\xc5\x87\
+\xf7\x42\x29\x9e\xf3\xcd\x11\xdb\xc7\xf9\x25\x3a\x28\xc9\x75\x9a\
+\x83\x83\x83\x7b\x8e\x8e\x8e\xfa\x63\xc3\xe7\x20\xda\x0b\xc5\xf5\
+\x27\x70\x1e\x7c\xa5\xd4\xe9\x88\x78\x56\x89\x29\x4c\x0f\xfd\x6f\
+\xcc\xfc\xae\x8a\xe4\x52\xb9\x34\xbc\x50\x4a\x2c\x09\x11\x3d\x0a\
+\x00\x3b\x97\x98\xc2\x16\xa1\x1f\x7f\xfc\xf1\x6d\x1f\x78\xe0\x01\
+\xd3\x0f\xc1\x8f\xad\x18\xf0\x42\x29\xe9\x23\x41\x44\xa6\xc7\xd9\
+\x95\x25\x85\x9f\x35\x2c\x22\x7e\x28\x8a\xa2\x8f\x54\x29\xa7\xaa\
+\xe4\xe2\x85\x52\x52\x25\x88\xe8\x76\x00\x78\x51\x49\xe1\xe7\x0a\
+\xbb\x91\x99\xb7\xa9\x58\x4e\x95\x48\xc7\x0b\xa5\x84\x32\x84\x61\
+\x38\x24\x22\x63\x25\x84\xee\x18\xd2\x9c\x09\xa2\xb5\xce\x72\x8a\
+\x5a\xc7\x18\xdd\x68\xe0\x85\x52\x42\xd5\x52\xb6\xa4\x2d\x2a\xd3\
+\xfb\x98\xf9\xd9\x45\x05\xeb\x96\x38\x5e\x28\x25\x54\x2a\x0d\xe9\
+\x45\xa6\x89\x88\xaf\x8a\xa2\xe8\xfa\x22\x63\x56\x3d\x56\x9a\x9a\
+\xf9\xad\xc0\x19\xaa\x4a\x44\xff\x08\x00\x9f\xca\x00\xe1\xdc\x15\
+\x11\x6f\x8d\xa2\xe8\xc5\xce\x03\x75\x51\x00\x2f\x94\x82\x8b\x45\
+\x44\xbf\x02\x80\xdd\x0b\x0e\x6b\x1d\x2e\x8e\xe3\x15\xcd\x66\xd3\
+\xac\x41\xf3\xc3\x37\x97\x28\xf6\x33\x10\x86\xe1\x2b\x45\xa4\x5b\
+\x2e\x69\xbe\xce\xcc\x6f\x2a\x96\xa1\xea\x46\xf3\xdf\x28\x05\xd6\
+\x86\x88\x7e\x00\x00\xfb\x17\x18\x32\x53\xa8\x56\xab\xf5\xf4\xb1\
+\xb1\xb1\x87\x32\x81\xf4\x88\xb3\x17\x4a\x41\x85\x1c\x1e\x1e\x7e\
+\xd6\xc0\xc0\x40\x57\xad\xa5\x12\x91\xf3\xb5\xd6\x27\x16\x44\x51\
+\xa5\xc3\x78\xa1\x14\x54\x9e\x30\x0c\xbf\x20\x22\xc7\x17\x14\x2e\
+\xb7\x30\xcc\x6c\xba\xe5\xc7\xb9\x01\x76\x29\x90\x17\x4a\x41\x85\
+\x23\x22\xf3\x61\xcb\xfd\xe8\x0b\x44\xfc\x66\x1c\xc7\xe3\x88\x78\
+\xa4\xa3\xa9\x9c\xcc\xcc\x95\x7e\x4a\xe7\x68\xde\x5b\xc0\x7a\xa1\
+\x14\xc0\xb2\x52\xea\xdd\x88\x78\x81\xa3\x50\x2f\x47\xc4\x71\x11\
+\x31\x67\xa9\xb8\x18\x8f\x31\xf3\x2e\x2e\x80\xbb\x09\xd3\x0b\xa5\
+\x80\x6a\x11\xd1\xbd\x00\xf0\x1c\x07\xa1\x46\x99\x79\x85\xc1\x55\
+\x4a\xdd\x8c\x88\x4e\x7a\x0a\x8b\xc8\x91\x5a\xeb\xaf\x3a\xc8\xbf\
+\x6b\x20\xbd\x50\x1c\x97\x8a\x88\x5e\x02\x00\x3f\x74\x14\xe6\xdd\
+\xcc\xfc\x2f\x06\x9b\x88\xde\x08\x00\x5f\x77\x14\x27\x62\xe6\xba\
+\x23\xec\xae\x80\xf5\x42\x71\x5c\x26\x22\xba\x0e\x00\x0e\x76\x10\
+\xe6\xf7\xcc\xbc\x23\x00\xb4\xa6\xb0\x89\x28\x32\x9a\x71\x10\xcb\
+\x34\xf6\x3e\x40\x6b\xed\x4a\xf0\x2e\x52\xce\x15\xd3\x0b\x25\x57\
+\x3a\xb7\x04\xab\xd7\xeb\xbb\xc6\x71\xfc\x88\x8b\x10\x22\x72\x9e\
+\xd6\xda\x2c\x87\xd9\x3c\x88\xe8\x3d\x00\xe0\xaa\xa1\xdd\x4d\xcc\
+\xfc\x0a\x17\x73\xe9\x06\x4c\x2f\x14\x87\x55\x22\xa2\x73\x01\xe0\
+\x24\x17\x21\x82\x20\x18\x6a\x34\x1a\xeb\xa6\x63\x8f\x8c\x8c\x2c\
+\xd8\xb4\x69\xd3\x83\x00\xf0\x14\x17\x31\x01\xa0\xc6\xcc\x95\xdc\
+\x1e\xe0\x68\xbe\xd3\xff\x08\x59\x1f\xf0\xeb\x17\x45\x26\xac\x0a\
+\x11\xfd\x1e\x00\xb6\x4b\x68\x9e\xd8\x0c\x11\xaf\x8e\xa2\xe8\xb5\
+\xb3\x39\x10\xd1\xd9\x00\x70\x5a\x62\x30\x3b\xc3\xd5\xcc\xfc\x76\
+\x3b\x97\xde\xb0\xf6\xdf\x28\x8e\xea\x18\x86\xe1\x31\x22\x72\xb1\
+\x23\xf8\x43\x98\xd9\xdc\xfb\xcc\x18\x29\x8f\x7a\x4e\x9c\xa6\x88\
+\xec\xa2\xb5\x7e\x2c\xb1\x43\x8f\x18\x7a\xa1\x38\x2a\xa4\xc3\xee\
+\x8f\x4d\x66\x56\xf3\xa5\x4d\x44\xe6\xc4\xae\x77\xb8\x98\x1a\x22\
+\x9e\x1d\x45\xd1\x19\x2e\xb0\xab\x8c\xe9\x85\xe2\xa0\x3a\xf5\x7a\
+\xfd\x45\x71\x1c\x9b\x3d\xf1\x2e\xc6\x2a\x66\xfe\x6c\x07\xa1\x3c\
+\x1f\x00\xee\x70\x11\x1c\x11\x5b\x51\x14\x0d\xba\xc0\xae\x32\xa6\
+\x17\x8a\x83\xea\x84\x61\x78\x85\x88\x1c\xe6\x00\x7a\x7c\xfb\xed\
+\xb7\xdf\xf1\xf6\xdb\x6f\xef\xd8\x52\x88\x88\xae\x06\x00\x57\xdd\
+\x1f\x37\xbf\xbf\x71\x30\xc7\x4a\x42\x7a\xa1\xe4\x5c\x96\xa5\x4b\
+\x97\xee\xb0\x78\xf1\xe2\x27\x72\x86\x9d\x84\x13\x91\x2f\x68\xad\
+\xcd\x23\xe0\x8e\x83\x88\x0e\x01\x80\x6b\x3a\x1a\xa6\x33\xf8\x15\
+\x33\xff\x55\x3a\xd7\xee\xf4\xf2\x42\xc9\xb9\x6e\x4a\xa9\xb3\x10\
+\xf1\xf4\x9c\x61\x27\xe1\x10\xb1\x1e\x45\x91\x79\xa9\x98\x68\x10\
+\xd1\xcf\x00\xe0\x05\x89\x8c\xed\x8d\x5e\xcf\xcc\xe6\x28\xbd\xbe\
+\x18\x5e\x28\x39\x97\x59\x29\xf5\x1b\x44\x5c\x92\x33\xac\x11\xc9\
+\x8d\x51\x14\xbd\xd2\x06\x97\x88\x8e\x05\x00\x27\xad\x87\x44\xe4\
+\x67\x5a\xeb\xaa\xf5\x25\xb3\xa1\xc7\xca\xd6\x0b\xc5\x8a\xae\xf9\
+\x8d\x95\x52\x6f\x46\xc4\xcb\x73\x84\x9c\x0e\xf5\x06\x66\xbe\xca\
+\x16\x9b\x88\xcc\x66\xb1\x67\xd9\xfa\x25\xb1\x47\xc4\xbf\x89\xa2\
+\xc8\xd5\x43\x8b\x24\x29\x14\x66\xe3\x85\x92\x23\xd5\x44\xf4\x13\
+\x00\x58\x99\x23\xe4\x14\xd4\x7a\x66\x4e\xb5\xfa\x98\x88\xcc\xb9\
+\x90\xe6\x7c\x48\x17\xe3\x2a\x66\x7e\x83\x0b\xe0\xaa\x61\x7a\xa1\
+\xe4\x54\x11\xa5\xd4\x72\x44\x74\xd2\xb5\x44\x44\x4e\xd5\x5a\x9f\
+\x93\x26\xd5\xf6\xc3\x05\xb3\xde\x6c\x71\x1a\xff\x4e\x3e\x88\xf8\
+\xec\x28\x8a\xee\xeb\x64\xd7\xed\xbf\xf7\x42\xc9\xa9\x82\x44\x74\
+\x29\x00\xbc\x2d\x27\xb8\xe9\x30\x32\x38\x38\xb8\xf3\xe8\xe8\xe8\
+\xe3\x69\xb1\x89\xc8\xbc\x77\x79\x6f\x5a\xff\xf9\xfc\x6c\x9e\xc4\
+\xb9\x88\x5f\x14\xa6\x17\x4a\x0e\x4c\xb7\x17\x23\x8e\xe7\x00\x35\
+\x03\x42\x44\x2e\xd2\x5a\x1f\x97\x05\x7b\xf9\xf2\xe5\xcb\x5a\xad\
+\xd6\x16\x0b\x28\xb3\xe0\x6d\xed\xbb\x68\xd1\xa2\xed\xd6\xac\x59\
+\xf3\xc7\x3c\x31\xab\x86\xe5\x85\x92\x43\x45\x1c\xdf\x07\xec\xcd\
+\xcc\x77\x66\x4d\x93\x88\xcc\xa6\x2e\xb3\xb9\xcb\xc5\xf8\x20\x33\
+\x7f\xdc\x05\x70\x55\x30\xbd\x50\x72\xa8\x04\x11\xfd\x37\x00\xe4\
+\xfe\x02\x0e\x11\x7f\x10\x45\x51\x2e\xdb\x7b\xc3\x30\x7c\xb1\x88\
+\xfc\x28\x87\xe9\xce\x06\xb1\x81\x99\x77\x70\x84\x5d\x09\x58\x2f\
+\x94\x8c\x65\x08\xc3\xf0\x50\x11\x71\xf2\xe2\xcd\x1c\x82\xaa\xb5\
+\xfe\x5a\xc6\x14\x37\xbb\x13\x91\x69\x40\xf1\xb7\x79\xe1\x4d\xc7\
+\x41\xc4\xb7\x47\x51\xb4\xda\x05\x76\x15\x30\xbd\x50\x32\x56\xc1\
+\x61\x53\x87\xff\x66\xe6\x3d\x32\xa6\xb7\x85\xbb\xe3\x7d\xf5\xeb\
+\x98\x79\x28\xcf\x7c\xab\x84\xe5\x85\x92\xa1\x1a\x43\x43\x43\xcb\
+\x06\x07\x07\x9d\xdc\x24\x8b\xc8\x19\x5a\x6b\xb3\x09\x2b\xd7\x41\
+\x44\x66\x87\xa2\x93\x0f\x34\x22\x1e\x1c\x45\xd1\x0d\xb9\x26\x5c\
+\x11\x30\x2f\x94\x0c\x85\x20\xa2\x7f\x05\x80\x4c\x4f\xa4\xe6\x0a\
+\x1f\x04\xc1\x6e\x8d\x46\xe3\xd7\x19\xd2\x9b\xd5\x95\x88\xcc\x63\
+\xe2\x79\x97\xe9\xa7\x8d\x99\xe7\x3d\x55\xda\x1c\x5c\xf9\x79\xa1\
+\x64\x60\x96\x88\x26\x00\xc0\xb4\x1c\xcd\x75\x88\xc8\x25\x5a\xeb\
+\x63\x72\x05\x9d\x06\x46\x44\x66\x87\xe2\x4e\x2e\xf0\x83\x20\x18\
+\x69\x34\x1a\x77\xb9\xc0\x2e\x13\xd3\x0b\x25\x25\xfb\x4a\xa9\xf7\
+\x23\xe2\x79\x29\xdd\x3b\xb9\xed\xc3\xcc\x66\x39\x8c\x93\x41\x44\
+\x66\x49\x8b\x59\xda\xe2\x62\x7c\x99\x99\xdf\xea\x02\xb8\x4c\x4c\
+\x2f\x94\x94\xec\x3b\xbc\xd6\xff\x31\x33\xef\x97\x32\xad\x44\x6e\
+\xb5\x5a\xed\xa9\x41\x10\x38\x3b\xce\x61\x60\x60\x60\xf7\x7b\xee\
+\xb9\xc7\x74\x83\xe9\x99\xe1\x85\x92\xa2\x94\x4a\xa9\x83\xcc\xb2\
+\xf7\x14\xae\x1d\x5d\x44\xe4\x28\xad\xf5\x97\x3a\x1a\x66\x34\x70\
+\x79\xe0\x2a\x22\x9e\x13\x45\xd1\xa9\x19\x53\xac\x94\xbb\x17\x4a\
+\x8a\x72\x38\xdc\x66\xfb\x10\x33\x3f\x3d\x45\x4a\xd6\x2e\xb5\x5a\
+\x6d\xaf\x20\x08\xee\xb6\x76\x4c\xe8\xc0\xcc\x66\x5f\xfd\xe6\x2e\
+\x96\x09\xdd\x2a\x6b\xe6\x85\x62\x59\x1a\x97\xed\x80\x44\xe4\x23\
+\x5a\xeb\x0f\x59\xa6\x94\xda\xdc\x61\xbb\x57\xb3\x6d\xf9\x44\xad\
+\xf5\xf9\xa9\x93\xab\x98\xa3\x17\x8a\x65\x41\x94\x52\xe7\x21\xe2\
+\xfb\x2d\xdd\x12\x99\x07\x41\xf0\xcc\x46\xa3\xf1\x40\x22\xe3\x1c\
+\x8c\x5c\x5e\x42\x02\xc0\xc3\xcc\xfc\xb4\x1c\xd2\xac\x04\x84\x17\
+\x8a\x65\x19\x88\xe8\x77\x00\xb0\xbd\xa5\x5b\x47\x73\x11\xb9\x5c\
+\x6b\xfd\x96\x8e\x86\x39\x1b\x10\xd1\x1a\x00\x78\x5e\xce\xb0\x93\
+\x70\x22\xf2\x16\xad\xb5\xab\x1d\x9f\x2e\x52\x9e\x13\xd3\x0b\xc5\
+\x82\x6e\x22\x7a\x17\x00\x4c\x1e\xb3\xe0\x60\xec\xcf\xcc\xae\x0e\
+\x03\x9a\x33\x5d\xa5\xd4\x51\x88\x78\x89\x83\xf9\x18\xc8\xbb\x98\
+\x79\xc4\x11\x76\xa1\xb0\x5e\x28\x16\x74\xbb\xfa\xeb\x8b\x88\x3f\
+\x8b\xa2\xa8\xb4\x46\x0d\x44\x64\x2e\xf7\x9e\x61\x41\x45\x62\x53\
+\x11\x39\x50\x6b\x6d\x4e\x43\xee\xea\xe1\x85\x92\xb0\x7c\x8e\x97\
+\xa9\xbf\x83\x99\xbf\x98\x30\x95\xdc\xcd\xc2\x30\x3c\x55\x44\x3e\
+\x91\x3b\xf0\x5f\x00\xaf\x65\x66\x57\x8d\xf8\x1c\xa5\x3c\x13\xd6\
+\x0b\x25\x21\xd5\x0e\x37\x3e\x3d\xca\xcc\xb9\xb7\x37\x4a\x38\xad\
+\x49\xb3\x91\x91\x91\x6d\x37\x6d\xda\x64\xee\xbd\x72\x5f\x8e\x63\
+\xf0\xe3\x38\xa6\x66\xb3\xa9\x6d\x72\xaa\x9a\xad\x17\x4a\x82\x8a\
+\x2c\x5b\xb6\x6c\xc9\xc2\x85\x0b\x7f\x93\xc0\xd4\xda\xc4\xfc\x25\
+\xd7\x5a\x7f\xc0\xda\x31\x67\x87\x30\x0c\xcf\x17\x91\x55\x39\xc3\
+\x4e\xc2\xe5\xb1\x9d\xd9\x45\x5e\x36\x98\x5e\x28\x09\xd8\x72\x7c\
+\xe6\xc8\xfe\x09\x52\x28\xca\xc4\xd9\xd1\x73\x13\x13\x13\x4b\xd6\
+\xae\x5d\xfb\x68\x51\x13\xc9\x3b\x8e\x17\x4a\x02\x46\x89\xe8\x61\
+\x00\xd8\x2d\x81\xa9\x37\x99\x83\x81\xa2\x5f\xa6\xe6\x5d\x08\x2f\
+\x94\x0e\x8c\x3a\x7e\x7c\x9a\x77\x3d\xab\x8c\xb7\x91\x99\xb7\xa9\
+\x72\x82\xf3\xe5\xe6\x85\xd2\xa1\x72\x44\x74\x2b\x00\xec\xdb\xad\
+\x05\xae\x52\xde\x22\x72\xbc\xd6\xfa\xc2\x2a\xe5\x94\x34\x17\x2f\
+\x94\x79\x98\x52\x4a\xed\x8d\x88\x3f\x4f\x4a\xa6\xb7\xeb\xc8\xc0\
+\x7d\xcc\xfc\xec\x8e\x56\x15\x34\xf0\x42\x99\x5f\x28\xab\x11\xf1\
+\xe8\x0a\xd6\xad\x9b\x53\x4a\xd5\x6c\xbc\xec\x09\x7b\xa1\xcc\x51\
+\x81\x7a\xbd\xbe\x5d\x1c\xc7\xe6\x54\x5f\x3f\x72\x64\x00\x11\x6f\
+\x8d\xa2\xe8\xc5\x39\x42\x16\x02\xe5\x85\x32\x07\xcd\x8e\xbb\x3f\
+\x16\x52\xdc\xaa\x06\x11\x91\x7d\xb5\xd6\xb7\x55\x35\xbf\xd9\xf2\
+\xf2\x42\x99\x5b\x28\xa6\x43\xfb\x9e\xdd\x54\xcc\x2e\xca\xf5\x1b\
+\xcc\x7c\x44\x17\xe5\x0b\x5e\x28\xb3\x54\xcb\x71\xa3\xb8\x6e\xfa\
+\x7c\xb8\xcc\x75\x29\x33\xff\xd2\x65\x80\x3c\xb1\xbd\x50\x66\x17\
+\xca\x77\x01\xe0\x65\x79\x12\xed\xb1\x66\x30\xf0\x39\x66\x7e\x5f\
+\xb7\xf0\xe2\x85\xb2\x55\xa5\xea\xf5\x3a\xc5\x71\x9c\xf8\x40\xd1\
+\x6e\x29\x74\x15\xf3\x8c\xe3\x78\xfb\x66\xb3\xd9\x15\x0f\x4c\xbc\
+\x50\xb6\xfa\x04\x11\xd1\x05\x00\xf0\xee\x2a\x7e\xb0\x7a\x30\xa7\
+\xd3\x98\xf9\x63\xdd\x30\x2f\x2f\x94\x2d\xab\x14\x10\xd1\x9f\x00\
+\x60\x61\x37\x14\xaf\x07\x72\x7c\x8c\x99\x77\xe9\x86\x79\x78\xa1\
+\x4c\xab\x92\x52\x6a\x15\x22\xf6\x4c\xe7\x90\x6e\xf8\x00\x02\xc0\
+\xb1\xcc\x7c\x71\xd5\x73\xf5\x42\x99\x56\xa1\x30\x0c\x59\x44\x54\
+\xd5\x8b\xd6\x63\xf9\x45\xcc\x5c\xaf\xfa\x9c\xbc\x50\xda\x15\x22\
+\xa2\x43\x00\xe0\x9a\xaa\x17\xac\x47\xf3\x3b\x84\x99\xaf\xab\xf2\
+\xdc\xbc\x50\xda\xd5\x51\x4a\x7d\x1b\x11\x5f\x5b\xe5\x62\xf5\x70\
+\x6e\xdf\x65\xe6\x83\xaa\x3c\x3f\x2f\x14\x00\xf3\xd6\xd5\xac\x68\
+\x5d\x5f\xe5\x42\xf5\x41\x6e\xb9\x1c\xea\xea\x8a\x27\x2f\x94\xbf\
+\x08\xe5\x5c\x00\x38\xc9\x15\xc9\x1e\x37\x11\x03\x5f\x62\xe6\xa3\
+\x12\x59\x96\x60\xe4\x85\xf2\x17\xa1\xfc\x16\x00\x76\x2c\x81\x7f\
+\x1f\x72\x1a\x03\x45\xb7\x94\xb5\x21\xbf\xef\x85\x12\x86\xe1\x71\
+\x22\x62\x8e\x98\x73\x31\x0a\xef\xfc\xe8\x62\x12\x5b\x61\xfe\xb5\
+\x8b\xa3\xc2\xdb\x31\xce\x65\xe6\x53\x0a\x98\x83\x75\x88\xbe\x17\
+\x0a\x11\xdd\x01\x00\xcf\xb7\x66\xae\xb3\xc3\x38\x33\x2f\xea\x6c\
+\xd6\x5d\x16\x2e\xdb\xca\x22\x62\x6b\xe1\xc2\x85\xdb\xac\x59\xb3\
+\xe6\xcf\x55\x63\xa5\xaf\x85\xa2\x94\x3a\x00\x11\xbf\xef\xa8\x28\
+\x1f\x63\xe6\xd3\x1c\x61\x97\x0a\x4b\x44\xe6\xdc\x93\xc0\x51\x12\
+\x27\x31\xf3\xa7\x1d\x61\xa7\x86\xed\x6b\xa1\x84\x61\x78\xb9\x88\
+\xbc\x39\x35\x7b\xf3\x38\x22\xe2\xce\x51\x14\x99\x7b\x9f\x9e\x1b\
+\x8e\xfb\x9c\xfd\x8a\x99\xff\xaa\x6a\xa4\xf5\xad\x50\x96\x2f\x5f\
+\xfe\x8c\x56\xab\xe5\xea\x2c\x92\xeb\x98\xd9\xbc\xc0\xec\xc9\x51\
+\xab\xd5\x9e\x14\x04\xc1\x06\x57\x93\x43\xc4\xbf\x8b\xa2\xe8\x2b\
+\xae\xf0\xd3\xe0\xf6\xad\x50\x94\x52\x67\x22\xe2\x3f\xa7\x21\x2d\
+\x81\x4f\x29\x47\x38\x24\xc8\x2b\x37\x93\x30\x0c\x2f\x31\xe7\x4d\
+\xe6\x06\xb8\x25\xd0\xcf\x99\xf9\x85\x8e\xb0\x53\xc1\xf6\xad\x50\
+\xc2\x30\x7c\x50\x44\x5c\x9c\x97\x58\xc9\x4b\x87\x54\x9f\x8e\x79\
+\x9c\xc2\x30\x1c\x12\x91\xb1\xbc\x71\xa7\xf0\x10\xf1\x65\x51\x14\
+\xdd\xec\x0a\xdf\x16\xb7\x2f\x85\x42\x44\xe6\x1c\x74\x57\x27\xef\
+\xbe\x8f\x99\x3f\x67\x5b\x88\x6e\xb4\x57\x4a\xdd\x8c\x88\x07\x3a\
+\xca\xfd\x1a\x66\x7e\x8d\x23\x6c\x6b\xd8\x7e\x15\xca\x8f\x00\xc0\
+\x49\xcb\x1c\x66\x46\xeb\x2a\x74\xa9\x43\x18\x86\x2f\x15\x91\xef\
+\xb9\x4a\x3f\x08\x82\xb0\xd1\x68\xb0\x2b\x7c\x1b\xdc\xbe\x13\x4a\
+\xbd\x5e\x7f\x51\x1c\xc7\xb7\xdb\x90\x64\x61\xfb\x45\x66\x7e\x87\
+\x85\x7d\xd7\x9b\x12\xd1\x5a\x00\x78\xae\x8b\x89\x20\xe2\xbf\x47\
+\x51\xf4\x4e\x17\xd8\xb6\x98\x7d\x27\x14\x22\xfa\x0f\xb3\x59\xc8\
+\x96\xa8\x84\xf6\x35\x66\x76\x76\xdd\x9e\x30\x87\x42\xcd\xc2\x30\
+\x3c\x5a\x44\x56\xbb\x0a\xba\x60\xc1\x82\x5d\xef\xbe\xfb\x6e\x27\
+\x67\xd3\xd8\xe4\xdc\x57\x42\x51\x4a\xed\x8c\x88\xae\xce\xe8\xb8\
+\x93\x99\xf7\xb6\x21\xbf\x57\x6c\x89\xc8\x34\x88\xd8\xce\xc5\x7c\
+\x10\xf1\xec\x28\x8a\xce\x70\x81\x6d\x83\xd9\x57\x42\x09\xc3\xf0\
+\x9f\x44\xe4\xe3\x36\x04\x59\xd8\xbe\x89\x99\xbf\x6e\x61\xdf\x33\
+\xa6\x4a\xa9\xd3\x11\xf1\x2c\x47\x13\xda\xc0\xcc\x3b\x38\xc2\x4e\
+\x0c\xdb\x57\x42\x21\x22\xb3\xe7\xc4\x45\x37\xf5\x9e\x5c\xd7\x95\
+\xf4\x53\x74\xf8\xe1\x87\x0f\x8c\x8d\x8d\x4d\x24\xb5\xb7\xb5\x13\
+\x91\x13\xb4\xd6\xa6\x3b\x4e\x69\xa3\x6f\x84\xa2\x94\x7a\x03\x22\
+\x7e\xd3\x11\xd3\x3d\xbb\xae\x2b\x29\x5f\x44\x64\x56\x60\x1f\x97\
+\xd4\xde\xc6\x4e\x44\xee\xd5\x5a\x3b\x79\x60\x90\x34\x8f\xbe\x11\
+\x4a\x18\x86\x37\x88\xc8\x2b\x92\x12\x63\x63\xd7\xcb\xeb\xba\x92\
+\xf2\x30\x34\x34\xb4\xc7\xe0\xe0\xe0\x7f\x25\xb5\xb7\xb5\x13\x91\
+\xc3\xb5\xd6\xae\xfe\xd0\x75\x4c\xa7\x2f\x84\x42\x44\xa6\xcb\xc7\
+\x3d\x1d\xd9\x48\x67\xd0\xd3\xeb\xba\x6c\x28\x21\xa2\x6b\x01\xe0\
+\x55\x36\x3e\x49\x6d\x45\xe4\x56\xad\xb5\x93\x77\x5f\x49\x72\xe8\
+\x17\xa1\x98\x37\xe5\xef\x49\x42\x48\x0a\x9b\x9e\x5f\xd7\x95\x94\
+\x93\x5a\xad\xb6\x6f\x10\x04\xe6\x28\x3f\x27\x23\x8e\xe3\xfd\x9a\
+\xcd\xe6\x8f\x9d\x80\x77\x00\xed\x79\xa1\xec\xbe\xfb\xee\xdb\xec\
+\xb4\xd3\x4e\x8f\x8a\x88\x8b\x83\x36\xfb\x62\x5d\x97\xcd\x07\x93\
+\x88\x46\x01\x60\xb9\x8d\x8f\x85\xed\x15\xcc\xfc\x46\x0b\xfb\xdc\
+\x4c\x7b\x5e\x28\x44\xf4\x5e\x00\xf8\x6c\x6e\x8c\x6d\x09\xd4\x37\
+\xeb\xba\x92\xf2\xa7\x94\x7a\x13\x22\x7e\x35\xa9\xbd\xad\x5d\xab\
+\xd5\x5a\x36\x36\x36\xf6\x0b\x5b\xbf\xac\xf6\xfd\x20\x94\x06\x00\
+\x84\x59\x89\x9a\xcd\xbf\x9f\xd6\x75\xd9\xf0\x47\x44\xff\x07\x00\
+\x4e\x7a\x0a\x8b\xc8\x17\xb4\xd6\xae\x2e\xa3\xe7\x9c\x66\x4f\x0b\
+\x25\x0c\xc3\x57\x8a\xc8\xf5\x36\x45\xb6\xb0\xed\xbb\x75\x5d\x49\
+\xb9\x21\x22\xd3\xfa\xc9\xb4\x80\x72\x32\x36\x6e\xdc\xf8\xe4\xf5\
+\xeb\xd7\xff\xce\x09\xf8\x1c\xa0\x3d\x2d\x14\x22\xba\x12\x00\x5e\
+\xef\x88\xd0\xbe\x5b\xd7\x65\xc3\x63\x9a\x0f\x96\x05\xfe\xe9\xcc\
+\xfc\x51\x0b\xfb\xcc\xa6\x69\xe6\x83\x69\x9c\x8a\xbe\x4c\x19\x1e\
+\x1e\x7e\xce\xc0\xc0\xc0\xbd\x99\x19\x9a\x1d\xa0\x6f\xd7\x75\x25\
+\xe5\x93\x88\x3e\x03\x00\xae\x4e\xd4\xfa\x35\x33\xef\x96\x34\x97\
+\x3c\xec\xd2\x7c\xe6\xbb\x42\x28\x61\x18\x7e\x52\x44\x4e\x06\x00\
+\xd3\x31\xc4\xea\xc7\xb4\xcd\x11\x91\xd6\xd4\xbf\x00\x10\x4f\xc3\
+\x30\xff\xfb\xc2\x7e\x5d\xd7\x95\xf4\x43\x47\x44\xe6\x83\xfc\xb5\
+\xa4\xf6\xb6\x76\x22\xf2\x15\xad\xb5\x59\x09\x5e\xc8\xe8\x59\xa1\
+\x14\xc2\x9e\x0f\xd2\x37\x0c\x78\xa1\xf4\x4d\xa9\xfd\x44\xb3\x30\
+\xe0\x85\x92\x85\x3d\xef\xdb\x17\x0c\xac\x5c\xb9\x72\x9b\x0d\x1b\
+\x36\xfc\xd1\x72\xb2\x13\x5d\x71\x8f\x62\x39\x29\x6f\xee\x19\x98\
+\x93\x01\xa5\xd4\x72\x44\x34\x2b\x0e\x6c\xc6\x63\x46\x28\x0f\x03\
+\x80\xd5\x53\x07\x44\x1c\x8e\xa2\xc8\xec\xaf\xf6\xc3\x33\xd0\x55\
+\x0c\x28\xa5\x0e\x43\xc4\x2b\x6c\x92\x16\x91\xfb\x8d\x50\x7e\x0e\
+\x00\x56\xdb\x5e\x4d\xb3\x34\xad\xb5\xab\x16\x41\x36\x73\xf0\xb6\
+\x9e\x01\x2b\x06\x88\xe8\x03\x00\x60\x7b\xcc\x77\xc3\x08\xc5\xec\
+\x0b\x78\x83\x4d\x34\x11\xb9\x40\x6b\x7d\x82\x8d\x8f\xb7\xf5\x0c\
+\x54\x81\x01\xa5\xd4\x6a\x44\x3c\xda\x32\x97\x1f\x63\x18\x86\xe7\
+\x89\xc8\xfb\x2d\x1d\x2b\xd7\x26\xd3\x32\x7f\x6f\xde\xa7\x0c\xa4\
+\x39\x1a\x44\x44\x3e\x81\x69\x57\x88\x8a\xc8\x0b\xb4\xd6\xe6\x3c\
+\x12\x3f\x3c\x03\x5d\xc1\x80\x52\xea\x28\x44\xbc\xc4\x36\x59\x11\
+\x39\x00\x87\x86\x86\x76\x19\x1c\x1c\x34\x2b\x44\xad\x06\x22\x5e\
+\x1a\x45\x91\xed\x57\x98\x55\x0c\x6f\xec\x19\xc8\x93\x01\x22\x4a\
+\xd3\x55\xf4\x89\x38\x8e\x77\x9d\x6c\x19\x9a\x76\x0f\xba\x51\x9a\
+\xd6\xfa\x87\x79\x4e\xc6\x63\x79\x06\x5c\x30\x50\xaf\xd7\x0f\x8b\
+\xe3\xd8\xea\x69\x57\x3b\x8f\x2b\x99\xf9\xb0\x49\xa1\x28\xa5\x4e\
+\x41\xc4\x4f\xa6\x48\x70\x12\x24\x85\x9f\x77\xf1\x0c\x14\xca\x80\
+\x52\xea\x7a\x44\x7c\xa5\x6d\x50\x11\x39\x5e\x6b\x7d\xe1\xa4\x50\
+\x88\xc8\x9c\x7b\x98\xea\x7e\xa3\xec\x8e\x1a\xb6\x13\xf7\xf6\xfd\
+\xc7\x00\x11\x99\x05\xb5\xe7\xa4\x98\xf9\x43\x13\x13\x13\xe1\xda\
+\xb5\x6b\x1f\xdd\xdc\xad\x9d\x88\xbe\x01\x00\x87\xa7\x00\xfb\x93\
+\x88\xbc\x5e\x6b\x7d\x63\x0a\x5f\xef\xe2\x19\x70\xca\x40\x96\x7e\
+\xca\x88\xf8\x99\x28\x8a\x26\x9f\x08\x6f\x16\x4a\xbd\x5e\x7f\x4d\
+\x1c\xc7\xdf\x49\x93\xb5\x88\x98\x87\x01\x87\x6a\xad\x6f\x4b\xe3\
+\xef\x7d\x3c\x03\x2e\x18\x50\x4a\x1d\x14\x04\xc1\x75\x22\x32\x90\
+\x06\x3f\x08\x82\x95\x8d\x46\xe3\xa7\x5b\x08\xa5\x7d\x09\x66\xda\
+\xc7\xec\x93\x06\xd4\xbc\xe6\x0f\x82\xe0\x35\x51\x14\x45\x69\xfc\
+\xbd\x8f\x67\x20\x4f\x06\xda\x6b\xba\x6e\xb2\x5d\x9e\x35\x2d\x87\
+\x2d\x0e\x3f\xda\xe2\xa0\x1c\x22\x7a\x3b\x00\x7c\x31\x43\xc2\x0f\
+\x9a\x8d\x50\x8b\x16\x2d\xba\x60\xcd\x9a\x35\x4f\x64\xc0\xd9\xc2\
+\xb5\xbd\x71\x68\x37\x11\x59\xb4\x78\xf1\xe2\x7b\xf3\xc4\xce\x2b\
+\x47\x8f\x63\xc7\xc0\xd2\xa5\x4b\x77\xd8\x76\xdb\x6d\x77\x89\xe3\
+\x78\xaa\x71\xc5\x23\x71\x1c\x3f\xd2\x6c\x36\xc7\xed\x90\x66\x58\
+\x0f\x10\xd1\x2a\x00\x30\x3f\xbb\xa7\xc5\x32\x9d\x48\xb5\xd6\x46\
+\x68\x93\x63\xc6\x89\x52\x4a\xa9\x6f\x23\xe2\x6b\xd3\x06\x68\xfb\
+\xad\x6b\xef\x1c\x34\xcd\x98\xcd\x8e\x44\xab\x61\xfe\x1a\x04\x41\
+\x70\x80\x88\xec\x0f\x00\xaf\xde\xda\x79\x72\x91\x1a\x62\x13\x00\
+\xd6\x07\x41\x70\x75\xa3\xd1\x70\x75\xbe\xbc\x55\xde\xde\xb8\x33\
+\x03\x44\x64\x4e\x58\x36\x07\x0a\xcd\xa8\x6b\xdb\xdb\x1c\x0c\x75\
+\x93\x88\xfc\x74\xfa\x07\xb5\x33\xf2\xe4\x6b\x8e\x23\x45\xc4\x08\
+\xc4\x6a\xed\xe2\xd6\xd8\xa6\x45\x53\x14\x45\x47\x4e\xff\xef\xb3\
+\x09\x65\x1f\x44\xcc\xab\x83\xdf\x5d\x22\x72\x2d\x22\xde\xc4\xcc\
+\x3f\x49\x32\x59\x22\x7a\x17\x00\x9c\x6d\xd9\x22\xe7\xd3\x22\xf2\
+\x31\xad\xf5\x63\x49\x62\x78\x9b\xe2\x19\x50\x4a\x99\x4b\xfa\x93\
+\x2d\xff\x08\x5f\x03\x00\x17\x31\xb3\x69\xef\x3a\xeb\x58\xb6\x6c\
+\xd9\x92\x05\x0b\x16\x1c\x61\xda\xbf\xa6\x79\xfc\x3b\x1b\xa8\x88\
+\xec\xbb\xf5\xfd\xf6\xac\x67\x14\xb6\xf7\xa8\x9f\x92\x27\x9d\x22\
+\x72\x37\x22\xde\x18\x04\xc1\xa5\x8d\x46\xc3\x7c\xe3\xcc\x18\x59\
+\x8e\x71\x46\x44\x0d\x00\x1f\xaf\xda\x99\xe6\x79\x72\xd8\xad\x58\
+\x39\x7c\x9e\x3e\xcc\xcc\x67\x4e\x9f\x7f\x7b\xe9\xd5\xa4\x40\x00\
+\x60\x41\x5e\xdc\xcc\x75\x84\xde\xac\x42\x19\x19\x19\xd9\x76\xd3\
+\xa6\x4d\xe6\x8d\xfb\x0b\xf2\x4a\x60\x2b\x1c\x46\xc4\x6f\x8c\x8f\
+\x8f\x7f\x66\xdd\xba\x75\x1b\xcc\xef\x32\x3c\x9e\xde\x02\x5a\x44\
+\x4e\xd4\x5a\x9f\xef\x28\x6f\x0f\x6b\xc9\x40\x5e\x75\x05\x80\x0f\
+\xb7\x5a\xad\x4b\x06\x06\x06\xcc\x89\x5d\x46\x20\x4f\xb2\x4c\x25\
+\x89\xf9\xda\xf1\xf1\xf1\xfd\xee\xbd\xf7\xde\x19\x4b\xba\xe6\x3c\
+\xf5\xb6\x56\xab\xad\x08\x82\xe0\xae\x24\xe8\x59\x6c\x44\x44\xb7\
+\xef\x37\xd2\xbc\xc3\x99\x2b\xf4\x11\xcc\x6c\xde\x0b\xf9\x51\x22\
+\x03\x39\x8a\xa4\x90\x59\xcc\x76\xc9\x35\x15\x78\xde\xe3\xa1\xd3\
+\xae\x2c\x2e\x64\x56\xf3\x07\xf9\x03\x22\x1e\x1c\x45\xd1\x7f\x56\
+\x20\x97\xbe\x4c\x21\xc3\xb2\xa8\xb2\xf8\x3a\x96\x99\x2f\x9e\x2b\
+\x78\xc7\x73\xd4\x89\xe8\x43\xe6\x6b\xaf\xac\xec\x33\xc4\x5d\x37\
+\x38\x38\xf8\xa2\xd1\xd1\xd1\xc7\x33\x60\x78\xd7\x14\x0c\xd4\xeb\
+\xf5\xe7\xc6\x71\x6c\x1e\x08\x2d\x49\xe1\x5e\x86\xcb\x69\xcc\x3c\
+\xef\xae\xc7\x8e\x42\x69\xdf\x3f\xbc\xdc\x3c\xb2\x2b\x63\x06\x59\
+\x62\x8a\xc8\x6b\xb5\xd6\x57\x67\xc1\xf0\xbe\xf6\x0c\x10\x91\xcb\
+\x33\x6c\xec\x13\x9a\xc7\x03\x11\x8f\x8b\xa2\xe8\xa2\x4e\xa0\x89\
+\x84\x62\x40\xc2\x30\x5c\x29\x22\x97\x02\xc0\x73\x3a\x81\x56\xe8\
+\xf7\x9f\x66\x66\xd3\x64\xda\x8f\x02\x19\x20\x22\x73\x94\xc3\xd2\
+\x02\x43\xa6\x0d\x75\x12\x33\x7f\x3a\x89\x73\x62\xa1\x18\xb0\xe1\
+\xe1\x61\x1a\x18\x18\x30\x47\x2b\x1f\x9a\x04\xbc\x02\x36\x77\x30\
+\xb3\xab\x27\x77\x15\x98\x5e\xf5\x52\x70\x7c\x74\x60\x9e\x13\x9e\
+\xf1\xc8\x79\x3e\x70\x2b\xa1\x4c\x01\x29\xa5\x56\x21\xa2\xb9\x77\
+\xd9\x31\xcf\xcc\x5d\x60\x0d\x0e\x0e\xee\xe4\xef\x53\x5c\x30\x3b\
+\x3b\x66\xad\x56\x3b\x3a\x08\x82\xd5\xc5\x45\xb4\x8e\x74\x0b\x00\
+\x9c\xc9\xcc\xe6\xdf\xc4\x23\x95\x50\x0c\x7a\xad\x56\xdb\x2b\x08\
+\x02\x23\x96\x4a\x7f\xbb\x94\x79\x56\x60\xe2\x2a\xf4\x90\x21\x11\
+\x99\x7d\x1f\x66\xff\x47\x15\x87\xd5\xb7\xc8\xf4\x09\xa4\x16\xca\
+\xb4\x6f\x17\xd3\x50\xec\x78\x00\x78\x49\x15\x99\x31\x67\x10\x32\
+\xb3\x39\xa9\xcb\x8f\x02\x18\x20\xa2\xeb\x00\xe0\xe0\x02\x42\x25\
+\x0d\x61\x0e\x29\xba\x24\x8e\xe3\xd5\xcd\x66\xd3\xb6\x43\xe4\xe6\
+\x18\x99\x85\x32\x85\x14\x86\xe1\x31\x00\x70\x9c\x88\xbc\x30\xe9\
+\x0c\x8a\xb0\x9b\x98\x98\xd8\x73\xed\xda\xb5\xf7\x17\x11\xcb\xc7\
+\x98\x5c\x61\x71\x15\x00\xbc\xae\x02\x5c\xac\x47\x44\x73\x54\xc5\
+\xea\x28\x8a\xee\xcb\x9a\x4f\x6e\x42\x99\x26\x98\x95\xe6\x2f\x8a\
+\x88\x98\xbf\x2a\xcf\xcb\x9a\x60\x56\x7f\x11\xd9\xc5\x2f\x96\xcc\
+\xca\x62\x72\x7f\x22\xfa\x17\x00\x30\x0b\x5b\xcb\x18\xff\x03\x00\
+\xe6\x1b\xed\xfa\x25\x4b\x96\xdc\x78\xcb\x2d\xb7\x4c\xe4\x95\x44\
+\xee\x42\x99\x9e\x58\xbd\x5e\xdf\xaf\xd5\x6a\x99\x55\x9d\x46\x34\
+\x4e\x0e\x29\xed\x44\xc4\xf0\xf0\xf0\xe0\x15\x57\x5c\x61\xbd\xd4\
+\xbf\x13\xae\xff\xfd\xec\x0c\x94\xf0\x82\xda\xf4\xce\x36\xe2\xf8\
+\xde\xc4\xc4\xc4\xcd\x66\x7f\xbb\x8b\xda\x38\x15\xca\xf4\x84\x95\
+\x52\x07\xb4\x05\x63\x44\x33\xec\x62\x32\x5b\x63\x8a\xc8\x77\xb4\
+\xd6\x95\x7e\xd8\x50\x04\x0f\x45\xc6\x50\x4a\x2d\x45\x44\xd7\x47\
+\x62\xff\x16\x00\x6e\x46\xc4\xef\x8b\xc8\xcd\xcc\xfc\x4b\xd7\x73\
+\x2c\x4c\x28\x5b\x89\xe6\xa0\xb6\x68\xcc\xb9\xf1\x2e\xc7\xab\xe7\
+\xdb\xcb\xe0\x32\x70\x3f\x63\xa7\x6d\x0d\x64\xc1\x59\xe1\x2f\x92\
+\x4b\x11\xca\xb4\xfb\x99\xb3\x44\xe4\x74\x0b\x82\x6c\x4c\xef\x63\
+\xe6\x67\xdb\x38\x78\xdb\x7c\x18\xc8\x61\x4b\x79\xa7\x44\xf6\xb7\
+\x7d\x0f\xd2\x09\xb0\xd3\xef\x4b\x15\x8a\x49\x8e\x88\xee\x01\x80\
+\x7a\xa7\x44\x53\xfc\xfe\x63\xcc\x7c\x5a\x0a\x3f\xef\x92\x03\x03\
+\x39\x6d\x29\x9f\x2d\x93\x6f\x33\x73\xe1\x4f\xd5\xaa\x20\x94\x67\
+\x02\x80\x79\x5a\x91\xdb\x30\xbb\x1d\xe3\x38\x7e\xa3\xd6\xda\xec\
+\xab\xf7\xa3\x04\x06\xcc\xd6\xdf\x1c\xb7\x94\x4f\xcd\xe0\xf1\x20\
+\x08\x9e\xdb\x68\x34\x7e\x5d\xf4\x94\x4a\x17\x8a\x99\x70\x18\x86\
+\x27\x88\xc8\xe7\xf3\x98\xbc\x17\x49\x1e\x2c\xe6\x83\x41\x44\x66\
+\x41\xea\xb9\xf9\xa0\x4d\xa2\xec\xcd\xcc\x77\xe6\x88\x97\x18\xaa\
+\x12\x42\x31\xd9\xd6\x6a\xb5\x17\x06\x41\x30\xd9\x6c\x2c\xed\xf0\
+\x22\x49\xcb\x9c\x3b\xbf\x9c\x1e\x17\x6f\x14\x91\x91\x32\xaf\x10\
+\x2a\x23\x14\x53\x2a\xa5\xd4\xce\x88\x68\xf6\x32\xbc\xc5\xb6\x74\
+\xe6\x51\x30\x00\x7c\xb0\x4c\x32\x6d\x73\xee\x17\x7b\xf3\x47\xd0\
+\xbc\x25\x47\xc4\x3d\x52\xcc\x79\x8d\x88\xbc\xad\xec\xba\x56\x4a\
+\x28\x53\x24\xb6\xff\x0a\x99\xbe\x4f\x23\x09\x88\xfd\x8a\x59\xad\
+\xea\x7b\x7b\x25\x60\xaa\x44\x93\xf6\x1f\x41\xb3\x45\xc3\xf4\x46\
+\x78\x4a\x82\x54\xd6\x20\xe2\x45\x49\x36\x55\x25\xc0\xca\x6c\x52\
+\x49\xa1\x4c\xcd\xaa\x56\xab\xbd\x20\x08\x02\xf3\xc2\xd0\x3c\xe5\
+\x78\x06\x00\x3c\x28\x22\x0f\x22\xa2\xe9\x48\xf9\xa0\xe9\x95\xdc\
+\x6c\x36\x7f\x96\x99\x05\x0f\x50\x18\x03\x2b\x56\xac\x78\xca\xf8\
+\xf8\xb8\x11\xcb\xde\x88\xa8\xcc\x55\x37\x00\x98\xee\x90\xe6\x0d\
+\xfb\x23\x00\x60\x96\xbf\xff\xa8\xe8\xc7\xbf\x9d\x08\xf8\x7f\xee\
+\x74\x9e\xef\xc9\x63\x4f\x81\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x08\x96\
+\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\x00\x57\x02\xf9\x87\
+\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\
+\xa7\x93\x00\x00\x08\x4b\x49\x44\x41\x54\x68\x81\xed\x99\x59\x6c\
+\x5c\xd5\x1d\x87\xbf\xbb\xcc\xea\x59\x3c\xbb\x97\xc4\x4b\xbc\x11\
+\x27\x26\x09\x01\x15\x2a\x14\xd4\x96\x50\xa9\x0b\x11\x09\xa8\x55\
+\x91\x20\x2f\x54\x95\xda\xbe\x54\x7d\xaa\x5a\x35\x20\x2a\xf1\x90\
+\x87\x2a\x40\xa1\x2a\x05\x4a\x68\x1a\x22\x91\x92\x86\xe0\x42\xd2\
+\x34\x24\x61\xb1\xe3\x38\xb6\x63\x3b\xc1\x8e\x67\xbc\x3b\x33\xe3\
+\x75\x3c\xcb\x9d\x99\xbb\xf4\xc1\xa4\x35\x59\x88\x1d\x4c\xcd\x83\
+\x3f\xe9\x3c\xcd\x3d\x67\xbe\xdf\x3d\x77\xce\xcc\xff\x3f\xb0\xc2\
+\x0a\x2b\xac\xb0\xc2\x17\x40\x58\x6e\x81\x9b\xb2\x0b\x91\x20\x15\
+\x38\x88\xf2\x18\xa9\xab\x5f\x16\x97\xc3\x69\xc1\xbc\x48\x0d\x21\
+\x3e\x10\x4c\x42\x1f\x09\x22\x3c\xce\xba\xab\x2f\x91\x96\xc3\xeb\
+\xa6\x18\x08\x04\xf9\x19\x08\x07\x03\x45\xc1\xca\xfa\xda\x3a\xd2\
+\x8a\x52\xa0\x8c\x2a\xe5\xb4\x70\x04\xc8\x5e\xb9\x54\x5e\x46\xcd\
+\xeb\xf3\xbc\x6d\xb5\xf0\xac\xfa\x8a\xc5\x6a\xfa\x56\x79\xd5\x2a\
+\xbe\x53\xbd\x86\x98\xa2\x70\x49\x17\x11\xf2\x92\xd5\x40\x0b\x01\
+\x33\x57\x2e\xff\x4a\x05\x90\xf6\x58\x1f\x13\x54\xfd\x59\x7f\x49\
+\xd0\xb5\xb1\xae\x8c\x9d\x95\x95\x1c\x8b\x46\x79\xbf\x3b\xcc\xec\
+\xe5\x64\xc6\x38\x66\x9c\x02\x94\xf9\x73\xbe\x12\x01\x6c\x7b\x6c\
+\xab\x54\x55\x7c\xc5\x24\x99\xee\x5f\x5d\x5b\xc4\xb6\xba\x4a\xb6\
+\x95\x96\xb2\x6f\x70\x90\xf7\x3a\xc3\x44\x7b\xc7\x33\xfa\x5f\xb5\
+\x17\xe9\xd7\x4f\x00\xa3\xf3\xe7\x2e\x7b\x00\xeb\x6e\xf7\x8f\xf5\
+\x1c\xbb\x7d\xa5\x2e\xe7\xda\xba\x12\x76\x56\x95\x53\xe3\x32\x73\
+\x70\x70\x84\x77\x3a\xc3\x44\x7b\x26\xb2\xfa\x81\xfc\xcb\x7a\xbb\
+\x7a\x18\xf8\x08\x50\xe7\xcf\x5f\xb6\x00\xce\xdd\x4e\xbf\xaa\x99\
+\xfe\x28\x49\xd2\xf6\xe2\x3a\x1f\x5b\xd7\xae\xe6\xc1\x32\x1b\x79\
+\x71\x98\xc6\x51\x0f\x6f\x75\x86\xb9\xdc\x3d\xa1\xaa\x87\x73\xaf\
+\x69\x2d\xf9\x43\xc0\x87\x40\xee\xea\x75\x96\x25\x80\xfd\x99\xd0\
+\x36\x2d\xaf\xbf\xe4\x0a\xd8\xfc\x55\xeb\x82\x3c\x5a\x53\x46\xd0\
+\xdb\xc7\x34\x59\x7a\x46\x6b\x38\xd0\xd6\xc7\x58\xc7\xa4\xaa\x1e\
+\xc9\xbe\xa6\x9d\x56\xfe\x0e\x9c\x66\xde\xc9\x33\x9f\xeb\x07\xd8\
+\x55\x61\xb5\xca\xd9\x90\xf2\xeb\xb1\x81\x25\x35\xdf\x55\x62\x77\
+\x48\xfa\x6e\x51\x10\x7f\x52\xb4\xd6\x2f\xdc\x53\x5b\xc4\xf6\x4a\
+\x3b\x31\xf3\x09\x14\xdc\x0c\x8c\xae\x67\x5f\x7b\x3f\xa3\x1d\x93\
+\x46\xfe\xb4\xf2\x56\xfe\x74\xfa\x2d\xe0\x24\x90\xb9\xd1\x92\xd7\
+\x7c\x13\x17\x3e\x5d\x5c\xae\x6b\xe2\x49\x41\x14\xca\xf4\xa4\xfe\
+\xb1\x31\xaa\x6d\x4b\xee\x8d\xc6\xbe\xa8\xbb\xf3\xa9\xd2\x7b\x04\
+\x43\xd8\x6b\x2d\x34\x57\x95\x37\x78\xf9\xc1\x6d\xa5\x54\x06\xe2\
+\x8c\xc9\x2d\x14\xe8\x41\x62\x97\x37\xf1\xfa\xf9\x61\x86\x5a\xc7\
+\xc9\x36\x25\x0f\x67\x0e\x4d\xfd\x05\x38\xc6\xbc\x23\xf3\x7a\x5c\
+\xb3\x03\x86\x6a\x7e\xc2\x19\xb4\x96\x15\xd7\xbb\x18\x39\x3f\x73\
+\x77\x4a\x4d\x35\x59\xb7\xb8\xbf\xa9\x9c\x9c\x89\xdc\x92\xf9\x9e\
+\x6a\x8b\x7b\x32\xf7\xa4\x80\xf0\x4b\xef\x1a\xa7\xd4\x50\xef\xe5\
+\xe1\x2a\x0f\x82\xf3\x13\xe2\xe2\x28\x36\xdd\x47\x32\xbe\x99\xbf\
+\x75\x8e\x30\x72\x76\x9a\x5c\xab\xf2\x5e\xe6\xd0\xd4\x3e\xe0\xf8\
+\xcd\xe4\xaf\x1b\x40\xcc\x4a\x26\x51\x17\x59\xef\x75\xe1\xdd\x6c\
+\xa5\x4b\x8b\x57\x24\x75\xf9\x38\xb0\xe8\x10\x85\xbf\xa9\xdc\x20\
+\x44\xf5\xd7\xcd\x2e\xeb\xfa\xe2\xf5\x6e\xb6\xd6\xf8\xb9\xbb\x4c\
+\x27\x65\xb9\x40\x96\x04\x66\xdd\x4d\x26\xb6\x91\x57\xce\x8f\x31\
+\x7c\x66\x86\x5c\x47\xe6\xfd\xf4\x9b\xf1\xd7\x80\x7f\x01\x53\x0b\
+\x79\x8f\x6b\x7e\x4a\x38\xbe\x5e\x38\x94\x4f\xf3\x53\xd5\x2b\x0b\
+\x8f\xd7\x17\x33\x61\x17\x99\x49\xa9\x85\x86\xcd\xb4\xc3\x70\xcb\
+\x87\xb5\xbe\xf4\xe4\x4d\x57\xdd\xb5\xce\xec\xbb\xd7\xf3\x3b\x11\
+\xf1\x55\x4f\x95\xa3\xe8\xf6\x3b\x03\xec\x6c\x08\xb1\xa6\x78\x96\
+\xac\x39\x8a\x86\x82\xa0\x59\x98\x8d\x35\xf0\x6a\x7b\x9c\xa1\xe6\
+\x69\xb2\x9d\xc9\x53\xc9\x03\x63\x7f\x66\xee\xb1\x59\xf0\x23\x7b\
+\x4d\x80\xf4\x07\xd3\x13\xf6\x3b\xfc\x5b\x74\x49\xaa\xf4\x15\x59\
+\xf8\xf6\x6a\x3f\x63\x26\x83\x44\x52\x77\x21\xcb\x3b\x64\x93\xf0\
+\x76\x6e\x30\x3d\x71\xa3\x05\x03\xbf\x5a\xb7\xd1\x96\xd3\xdf\xb5\
+\x14\x98\x1e\x2a\xd9\xe4\x11\xbf\xbb\x21\xc8\x83\x35\x2e\xac\xee\
+\x69\x54\x29\x85\x4e\x0e\x43\x17\x48\xc6\x6b\x78\xbd\x7d\x9a\xe1\
+\x33\x09\xb2\x17\x53\xcd\x89\xfd\xc3\x7f\x02\xde\x03\x2e\x2f\x54\
+\xfe\xba\x01\x00\x0a\xee\x0a\x0c\x6a\x0a\x3b\x33\x1e\x91\xfb\xcb\
+\xaa\xd9\xe8\xf7\x32\x20\x27\x99\x4d\xea\x2e\xdd\x6e\x79\x44\x74\
+\xca\x8d\xb9\x48\x32\xfe\x99\x49\x8f\x3c\x22\x05\xbf\x27\xfe\x56\
+\x34\x84\xbd\xee\x32\x5b\x51\xcd\xe6\x42\x7e\xb8\xce\x47\xc3\x6a\
+\x13\xa2\x2d\x8d\x26\x28\xe8\x64\xd1\x75\x9d\xd9\x68\x25\xfb\xce\
+\x27\x19\x6a\x4e\x90\xb9\x98\x6e\x9d\xd9\xd7\xff\x02\x73\x77\x7e\
+\x64\x31\xf2\x37\x0c\x90\x6e\x1e\xef\xb7\x6f\x0c\xee\xd0\x4c\x52\
+\xc8\xe1\xcb\x70\x5f\xc9\x03\xac\x72\xa6\x19\x92\x52\x24\x53\x38\
+\x0c\x93\x69\x87\xe8\x92\xfe\x1b\xc2\xff\x8b\x0d\xb5\x4e\xf7\xc4\
+\x11\x93\x55\x7e\x34\xb0\xc1\x29\x6e\xd9\x58\xc8\xf6\xb5\x5e\x8a\
+\xfd\x32\x82\x9c\x43\x63\x4e\x5e\xd3\x35\x66\x62\x25\xbc\xd1\x91\
+\x66\xe0\xa3\x24\xe9\x4b\xe9\xce\xa9\xfd\xfd\x7f\xc0\x30\x8e\x02\
+\x83\x8b\x95\xbf\x61\x00\x80\x82\x0d\xa1\x84\x96\x93\xb6\xe7\xfc\
+\x02\xf5\x01\x99\x3a\xcf\xd7\x08\x16\x4c\x31\x24\x65\x48\xa5\x05\
+\x07\xa2\xf5\x61\xc1\x69\x69\xf4\x3d\x54\xfd\x23\x49\x10\xdf\x74\
+\xac\xb2\x94\x97\xdf\xe1\x60\x5b\x83\x9b\x7b\xd7\xf8\x71\x3a\x44\
+\x34\x21\x8b\x86\x82\x46\x16\x55\xcf\x33\x19\xf5\x71\xa0\x5d\xa1\
+\xbf\x49\x41\x89\x64\x7a\xa6\x0e\xf4\x3e\x67\xe4\xf5\x63\xc0\xad\
+\x9d\x70\x9f\x17\x20\x55\x75\x5f\xb7\x53\x9a\x7a\x22\x6f\x11\x9d\
+\x85\x81\x24\xb5\xde\x0a\x8a\xec\xab\xf0\x17\x4c\x33\x2c\x2a\x64\
+\x52\x82\x43\xb4\xda\x76\x9a\xac\xf2\xf7\x3d\xeb\xac\xf2\x9d\x9b\
+\xec\x6c\xaf\xf7\x71\x5b\x89\x0f\xd9\xac\xa3\x31\x4f\xde\xc8\x31\
+\x11\x73\x71\xb0\x3d\xcf\x60\x53\x0e\x65\x40\x19\x1e\x3f\xd8\xfb\
+\xbc\x9e\x56\x8f\x01\x3d\xb7\x2a\xff\xb9\x01\xe8\xee\x36\x9c\xeb\
+\x8b\x44\x43\x95\xb6\xaa\x7e\x81\xea\x80\x80\xcb\xea\xc2\x6f\xf7\
+\xe3\xb3\x27\x18\x11\x73\x64\x55\xd1\x14\x6c\xb0\xf0\xc0\xed\x76\
+\xb6\xd6\x95\x12\xf2\x38\xd0\xc5\xdc\x55\xf2\x59\x62\x51\x3b\x87\
+\xda\x35\x06\x5a\x54\xd2\x61\x65\x64\xfc\xcd\x0b\xbf\xd7\x66\xb3\
+\x8d\xc0\x05\xc0\xf8\x72\x02\x00\xee\x6f\x54\x9c\x23\x21\xfc\x5c\
+\xb1\x89\x96\x50\x28\x45\xb9\x27\x00\xa2\x86\xb7\xc0\x85\xcb\x96\
+\x44\x76\xeb\xdc\x5f\xe7\x60\x73\x45\x09\x76\xab\x34\x4f\xfc\x53\
+\x79\x14\xe2\x71\x99\x77\x3a\x04\x22\x4d\x2a\xa9\x4b\xd9\xcb\xf1\
+\x43\x5d\x7b\xd4\x84\xf2\x4f\xa0\xfb\x8b\xca\xdf\x34\x40\xe2\xe3\
+\x61\xd5\x75\xdb\xaa\x10\xba\xe9\x6e\xd5\xab\xb3\x26\x20\x61\xb3\
+\xc8\x20\x68\xf8\x9d\x4e\x6a\x43\x05\x94\x7a\x5c\x88\x92\x3a\xf7\
+\x21\x9d\x27\xae\x91\x25\x1a\x13\x38\xd2\x2a\x13\x3e\xa3\x93\xee\
+\x55\xc7\xe3\xef\x74\x3e\x9b\x9f\x4a\x1f\x05\x3a\x96\x42\x1e\x16\
+\x50\xd4\xeb\x92\xfd\x69\x35\x2e\x64\x23\xfd\x70\x21\x3a\x4c\x8e\
+\x14\x79\x52\x18\x42\x1a\xb3\x59\x43\x15\x32\xa8\xa4\xc9\x93\x46\
+\x25\x83\x4a\x06\x8d\x2c\xc3\x51\x9d\xc6\x73\x12\x91\x56\x83\x4c\
+\x8f\x3e\x1d\x7f\xb7\xeb\x85\xdc\x44\xf2\x28\x70\x0e\xd0\x97\x42\
+\x1e\x16\x50\xd4\xcf\xb6\x47\x32\x85\x75\x65\xf5\x82\x61\x6a\xd0\
+\xbd\x79\x2a\x82\x60\x31\x1b\xe8\x7c\xf6\x59\xff\xdf\x50\x18\x89\
+\xea\x1c\x6f\x33\x13\x39\x2b\xa2\x5c\xd0\x67\xa3\xc7\xcf\xbf\xa8\
+\x5c\x9e\x6a\x04\xce\x00\xda\x52\xc9\xc3\x02\xdb\x2a\x82\x6c\x7b\
+\x52\x1d\x95\x8c\xc8\x80\x44\x5f\x2c\x4e\xfe\xd3\x5d\x98\x1b\x57\
+\xee\xfe\xdc\x18\x89\xab\xfc\xbb\xcd\x42\xf8\xac\x89\x4c\x97\x94\
+\x89\x9f\xea\x7a\x29\x33\x3a\xd1\x08\x34\x71\x55\x35\xb5\x14\x2c\
+\xa8\xad\x32\xdd\x71\x69\xc2\x53\x5b\xbd\x45\x10\xe5\x4a\xbd\x30\
+\x4f\x59\x71\x1e\xd9\x94\x9f\xb7\x0b\x73\x63\x6c\x5c\xe7\x44\xab\
+\x83\x70\xab\x05\xa5\x4b\xcc\xc6\x3e\x3a\xff\xd2\x6c\xff\xd8\x95\
+\x6a\x2a\xbf\xd4\xf2\xb0\x88\xc6\x96\xa0\x0a\x4f\x69\x03\x26\x06\
+\x86\x4d\xf4\x47\x53\x9f\xd9\x05\x95\x34\x23\xe3\x79\x4e\xb5\x16\
+\x10\x3e\x67\x25\xd7\x61\xca\xc5\x9a\xbb\x5e\x4e\x44\x86\xdf\x66\
+\xae\x8e\xbd\xa6\x14\x5c\x2a\x16\xdc\xd8\x9a\xbc\x78\x69\xc0\x57\
+\x55\xb7\x03\x59\x0a\x19\x85\x39\xca\x4a\x52\x88\x72\x16\x8d\x1c\
+\xd1\x49\xf8\xb0\xc5\xc3\xa5\x36\x27\xf9\x76\x8b\x1a\x3d\xd7\xb9\
+\x77\xba\x37\xfc\x0f\xe0\x04\x57\xb5\x41\x96\x9a\x45\xb5\x16\x05\
+\x95\x67\xb4\x88\x95\xa1\x21\x1b\x03\x51\x8d\x3c\x29\xa2\x53\x2a\
+\x1f\x9e\x75\xd1\xd7\xee\x24\xdf\x6a\xd7\xc7\x3b\x3e\x79\x63\xf2\
+\x93\xde\x2b\xf2\x37\x2c\x05\x97\x8a\x45\x05\xb8\xb8\x79\xd3\x7e\
+\x63\x96\xc1\x74\xd8\x4e\x4f\xd8\x4a\x74\x4a\xa3\xe9\xac\x8f\x70\
+\x9b\x17\xad\xa5\xc0\x98\xbc\xd0\x73\x30\xd6\xdd\x79\x90\x39\xf9\
+\x6b\x1a\xb1\x5f\x06\x8b\xeb\x8d\x9e\x38\x61\x04\xca\xd7\xca\x62\
+\xd6\xfa\x40\xce\xaf\x33\x99\x30\x13\x69\x0b\xa1\x35\x3b\x99\xe8\
+\x0d\xbf\x3d\xda\xd1\xf2\x06\x73\xd5\xd4\xf4\x97\x62\x7b\x1d\x16\
+\xdd\x9d\x0e\xe6\x1c\xcf\x19\x53\xf2\x54\xb2\xcf\xc5\x40\x47\x08\
+\xbd\xd9\xcd\x4c\xdf\xd0\xd1\x91\xf6\x8f\xf7\xb3\x88\x52\x70\xa9\
+\x58\x74\x77\xba\xbf\xbf\x4d\xf5\x97\x54\xe7\xa4\x89\xc2\xad\x44\
+\xec\x24\x86\x86\x4f\x46\xce\x1d\xdf\xcb\x9c\x7c\x74\xe9\x15\x3f\
+\x9f\x5b\xfe\x83\xc3\x13\x28\xbb\x37\x97\xcf\xde\x95\x9a\x8e\x0e\
+\x30\x77\x54\x8e\x2d\x9d\xd6\x0a\x2b\xac\xb0\xc2\x0a\xff\x27\xfe\
+\x03\x72\x48\xe3\xb0\x1d\x11\x42\x9d\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x0a\x88\
+\x6f\
+\x70\x65\x6e\x46\x69\x6c\x65\x3d\x4f\x70\x65\x6e\x0d\x0a\x6f\x70\
+\x65\x6e\x46\x69\x6c\x65\x44\x65\x74\x61\x69\x6c\x3d\x4f\x70\x65\
+\x6e\x20\x69\x6d\x61\x67\x65\x20\x6f\x72\x20\x6c\x61\x62\x65\x6c\
+\x20\x66\x69\x6c\x65\x0d\x0a\x71\x75\x69\x74\x3d\x51\x75\x69\x74\
+\x0d\x0a\x71\x75\x69\x74\x41\x70\x70\x3d\x51\x75\x69\x74\x20\x61\
+\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x0d\x0a\x6f\x70\x65\x6e\
+\x44\x69\x72\x3d\x4f\x70\x65\x6e\x20\x44\x69\x72\x0d\x0a\x63\x6f\
+\x70\x79\x50\x72\x65\x76\x42\x6f\x75\x6e\x64\x69\x6e\x67\x3d\x43\
+\x6f\x70\x79\x20\x70\x72\x65\x76\x69\x6f\x75\x73\x20\x42\x6f\x75\
+\x6e\x64\x69\x6e\x67\x20\x42\x6f\x78\x65\x73\x20\x69\x6e\x20\x74\
+\x68\x65\x20\x63\x75\x72\x72\x65\x6e\x74\x20\x69\x6d\x61\x67\x65\
+\x20\x0d\x0a\x63\x68\x61\x6e\x67\x65\x53\x61\x76\x65\x64\x41\x6e\
+\x6e\x6f\x74\x61\x74\x69\x6f\x6e\x44\x69\x72\x3d\x43\x68\x61\x6e\
+\x67\x65\x20\x64\x65\x66\x61\x75\x6c\x74\x20\x73\x61\x76\x65\x64\
+\x20\x41\x6e\x6e\x6f\x74\x61\x74\x69\x6f\x6e\x20\x64\x69\x72\x0d\
+\x0a\x6f\x70\x65\x6e\x41\x6e\x6e\x6f\x74\x61\x74\x69\x6f\x6e\x3d\
+\x4f\x70\x65\x6e\x20\x41\x6e\x6e\x6f\x74\x61\x74\x69\x6f\x6e\x0d\
+\x0a\x6f\x70\x65\x6e\x41\x6e\x6e\x6f\x74\x61\x74\x69\x6f\x6e\x44\
+\x65\x74\x61\x69\x6c\x3d\x4f\x70\x65\x6e\x20\x61\x6e\x20\x61\x6e\
+\x6e\x6f\x74\x61\x74\x69\x6f\x6e\x20\x66\x69\x6c\x65\x0d\x0a\x63\
+\x68\x61\x6e\x67\x65\x53\x61\x76\x65\x44\x69\x72\x3d\x43\x68\x61\
+\x6e\x67\x65\x20\x53\x61\x76\x65\x20\x44\x69\x72\x0d\x0a\x6e\x65\
+\x78\x74\x49\x6d\x67\x3d\x4e\x65\x78\x74\x20\x49\x6d\x61\x67\x65\
+\x0d\x0a\x6e\x65\x78\x74\x49\x6d\x67\x44\x65\x74\x61\x69\x6c\x3d\
+\x4f\x70\x65\x6e\x20\x74\x68\x65\x20\x6e\x65\x78\x74\x20\x49\x6d\
+\x61\x67\x65\x0d\x0a\x70\x72\x65\x76\x49\x6d\x67\x3d\x50\x72\x65\
+\x76\x20\x49\x6d\x61\x67\x65\x0d\x0a\x70\x72\x65\x76\x49\x6d\x67\
+\x44\x65\x74\x61\x69\x6c\x3d\x4f\x70\x65\x6e\x20\x74\x68\x65\x20\
+\x70\x72\x65\x76\x69\x6f\x75\x73\x20\x49\x6d\x61\x67\x65\x0d\x0a\
+\x76\x65\x72\x69\x66\x79\x49\x6d\x67\x3d\x56\x65\x72\x69\x66\x79\
+\x20\x49\x6d\x61\x67\x65\x0d\x0a\x76\x65\x72\x69\x66\x79\x49\x6d\
+\x67\x44\x65\x74\x61\x69\x6c\x3d\x56\x65\x72\x69\x66\x79\x20\x49\
+\x6d\x61\x67\x65\x0d\x0a\x73\x61\x76\x65\x3d\x53\x61\x76\x65\x0d\
+\x0a\x73\x61\x76\x65\x44\x65\x74\x61\x69\x6c\x3d\x53\x61\x76\x65\
+\x20\x74\x68\x65\x20\x6c\x61\x62\x65\x6c\x73\x20\x74\x6f\x20\x61\
+\x20\x66\x69\x6c\x65\x0d\x0a\x63\x68\x61\x6e\x67\x65\x53\x61\x76\
+\x65\x46\x6f\x72\x6d\x61\x74\x3d\x43\x68\x61\x6e\x67\x65\x20\x73\
+\x61\x76\x65\x20\x66\x6f\x72\x6d\x61\x74\x0d\x0a\x73\x61\x76\x65\
+\x41\x73\x3d\x53\x61\x76\x65\x20\x41\x73\x0d\x0a\x73\x61\x76\x65\
+\x41\x73\x44\x65\x74\x61\x69\x6c\x3d\x53\x61\x76\x65\x20\x74\x68\
+\x65\x20\x6c\x61\x62\x65\x6c\x73\x20\x74\x6f\x20\x61\x20\x64\x69\
+\x66\x66\x65\x72\x65\x6e\x74\x20\x66\x69\x6c\x65\x0d\x0a\x63\x6c\
+\x6f\x73\x65\x43\x75\x72\x3d\x43\x6c\x6f\x73\x65\x0d\x0a\x63\x6c\
+\x6f\x73\x65\x43\x75\x72\x44\x65\x74\x61\x69\x6c\x3d\x43\x6c\x6f\
+\x73\x65\x20\x74\x68\x65\x20\x63\x75\x72\x72\x65\x6e\x74\x20\x66\
+\x69\x6c\x65\x0d\x0a\x64\x65\x6c\x65\x74\x65\x49\x6d\x67\x3d\x44\
+\x65\x6c\x65\x74\x65\x20\x63\x75\x72\x72\x65\x6e\x74\x20\x69\x6d\
+\x61\x67\x65\x0d\x0a\x64\x65\x6c\x65\x74\x65\x49\x6d\x67\x44\x65\
+\x74\x61\x69\x6c\x3d\x44\x65\x6c\x65\x74\x65\x20\x74\x68\x65\x20\
+\x63\x75\x72\x72\x65\x6e\x74\x20\x69\x6d\x61\x67\x65\x0d\x0a\x72\
+\x65\x73\x65\x74\x41\x6c\x6c\x3d\x52\x65\x73\x65\x74\x20\x49\x6e\
+\x74\x65\x72\x66\x61\x63\x65\x20\x61\x6e\x64\x20\x53\x61\x76\x65\
+\x20\x44\x69\x72\x0d\x0a\x72\x65\x73\x65\x74\x41\x6c\x6c\x44\x65\
+\x74\x61\x69\x6c\x3d\x52\x65\x73\x65\x74\x20\x41\x6c\x6c\x0d\x0a\
+\x62\x6f\x78\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\x72\x3d\x42\x6f\x78\
+\x20\x4c\x69\x6e\x65\x20\x43\x6f\x6c\x6f\x72\x0d\x0a\x62\x6f\x78\
+\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\x72\x44\x65\x74\x61\x69\x6c\x3d\
+\x43\x68\x6f\x6f\x73\x65\x20\x42\x6f\x78\x20\x6c\x69\x6e\x65\x20\
+\x63\x6f\x6c\x6f\x72\x0d\x0a\x63\x72\x74\x42\x6f\x78\x3d\x43\x72\
+\x65\x61\x74\x65\x20\x52\x65\x63\x74\x42\x6f\x78\x0d\x0a\x63\x72\
+\x74\x42\x6f\x78\x44\x65\x74\x61\x69\x6c\x3d\x44\x72\x61\x77\x20\
+\x61\x20\x6e\x65\x77\x20\x62\x6f\x78\x0d\x0a\x64\x65\x6c\x42\x6f\
+\x78\x3d\x44\x65\x6c\x65\x74\x65\x20\x52\x65\x63\x74\x42\x6f\x78\
+\x0d\x0a\x64\x65\x6c\x42\x6f\x78\x44\x65\x74\x61\x69\x6c\x3d\x52\
+\x65\x6d\x6f\x76\x65\x20\x74\x68\x65\x20\x62\x6f\x78\x0d\x0a\x64\
+\x75\x70\x42\x6f\x78\x3d\x44\x75\x70\x6c\x69\x63\x61\x74\x65\x20\
+\x52\x65\x63\x74\x42\x6f\x78\x0d\x0a\x64\x75\x70\x42\x6f\x78\x44\
+\x65\x74\x61\x69\x6c\x3d\x43\x72\x65\x61\x74\x65\x20\x61\x20\x64\
+\x75\x70\x6c\x69\x63\x61\x74\x65\x20\x6f\x66\x20\x74\x68\x65\x20\
+\x73\x65\x6c\x65\x63\x74\x65\x64\x20\x62\x6f\x78\x0d\x0a\x74\x75\
+\x74\x6f\x72\x69\x61\x6c\x3d\x50\x61\x64\x64\x6c\x65\x4f\x43\x52\
+\x20\x75\x72\x6c\x0d\x0a\x74\x75\x74\x6f\x72\x69\x61\x6c\x44\x65\
+\x74\x61\x69\x6c\x3d\x53\x68\x6f\x77\x20\x64\x65\x6d\x6f\x0d\x0a\
+\x69\x6e\x66\x6f\x3d\x49\x6e\x66\x6f\x72\x6d\x61\x74\x69\x6f\x6e\
+\x0d\x0a\x7a\x6f\x6f\x6d\x69\x6e\x3d\x5a\x6f\x6f\x6d\x20\x49\x6e\
+\x0d\x0a\x7a\x6f\x6f\x6d\x69\x6e\x44\x65\x74\x61\x69\x6c\x3d\x49\
+\x6e\x63\x72\x65\x61\x73\x65\x20\x7a\x6f\x6f\x6d\x20\x6c\x65\x76\
+\x65\x6c\x0d\x0a\x7a\x6f\x6f\x6d\x6f\x75\x74\x3d\x5a\x6f\x6f\x6d\
+\x20\x4f\x75\x74\x0d\x0a\x7a\x6f\x6f\x6d\x6f\x75\x74\x44\x65\x74\
+\x61\x69\x6c\x3d\x44\x65\x63\x72\x65\x61\x73\x65\x20\x7a\x6f\x6f\
+\x6d\x20\x6c\x65\x76\x65\x6c\x0d\x0a\x6f\x72\x69\x67\x69\x6e\x61\
+\x6c\x73\x69\x7a\x65\x3d\x4f\x72\x69\x67\x69\x6e\x61\x6c\x20\x73\
+\x69\x7a\x65\x0d\x0a\x6f\x72\x69\x67\x69\x6e\x61\x6c\x73\x69\x7a\
+\x65\x44\x65\x74\x61\x69\x6c\x3d\x5a\x6f\x6f\x6d\x20\x74\x6f\x20\
+\x6f\x72\x69\x67\x69\x6e\x61\x6c\x20\x73\x69\x7a\x65\x0d\x0a\x66\
+\x69\x74\x57\x69\x6e\x3d\x46\x69\x74\x20\x57\x69\x6e\x64\x6f\x77\
+\x0d\x0a\x66\x69\x74\x57\x69\x6e\x44\x65\x74\x61\x69\x6c\x3d\x5a\
+\x6f\x6f\x6d\x20\x66\x6f\x6c\x6c\x6f\x77\x73\x20\x77\x69\x6e\x64\
+\x6f\x77\x20\x73\x69\x7a\x65\x0d\x0a\x66\x69\x74\x57\x69\x64\x74\
+\x68\x3d\x46\x69\x74\x20\x57\x69\x64\x74\x68\x0d\x0a\x66\x69\x74\
+\x57\x69\x64\x74\x68\x44\x65\x74\x61\x69\x6c\x3d\x5a\x6f\x6f\x6d\
+\x20\x66\x6f\x6c\x6c\x6f\x77\x73\x20\x77\x69\x6e\x64\x6f\x77\x20\
+\x77\x69\x64\x74\x68\x0d\x0a\x65\x64\x69\x74\x4c\x61\x62\x65\x6c\
+\x3d\x45\x64\x69\x74\x20\x4c\x61\x62\x65\x6c\x0d\x0a\x65\x64\x69\
+\x74\x4c\x61\x62\x65\x6c\x44\x65\x74\x61\x69\x6c\x3d\x4d\x6f\x64\
+\x69\x66\x79\x20\x74\x68\x65\x20\x6c\x61\x62\x65\x6c\x20\x6f\x66\
+\x20\x74\x68\x65\x20\x73\x65\x6c\x65\x63\x74\x65\x64\x20\x42\x6f\
+\x78\x0d\x0a\x73\x68\x61\x70\x65\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\
+\x72\x3d\x53\x68\x61\x70\x65\x20\x4c\x69\x6e\x65\x20\x43\x6f\x6c\
+\x6f\x72\x0d\x0a\x73\x68\x61\x70\x65\x4c\x69\x6e\x65\x43\x6f\x6c\
+\x6f\x72\x44\x65\x74\x61\x69\x6c\x3d\x43\x68\x61\x6e\x67\x65\x20\
+\x74\x68\x65\x20\x6c\x69\x6e\x65\x20\x63\x6f\x6c\x6f\x72\x20\x66\
+\x6f\x72\x20\x74\x68\x69\x73\x20\x73\x70\x65\x63\x69\x66\x69\x63\
+\x20\x73\x68\x61\x70\x65\x0d\x0a\x73\x68\x61\x70\x65\x46\x69\x6c\
+\x6c\x43\x6f\x6c\x6f\x72\x3d\x53\x68\x61\x70\x65\x20\x46\x69\x6c\
+\x6c\x20\x43\x6f\x6c\x6f\x72\x0d\x0a\x73\x68\x61\x70\x65\x46\x69\
+\x6c\x6c\x43\x6f\x6c\x6f\x72\x44\x65\x74\x61\x69\x6c\x3d\x43\x68\
+\x61\x6e\x67\x65\x20\x74\x68\x65\x20\x66\x69\x6c\x6c\x20\x63\x6f\
+\x6c\x6f\x72\x20\x66\x6f\x72\x20\x74\x68\x69\x73\x20\x73\x70\x65\
+\x63\x69\x66\x69\x63\x20\x73\x68\x61\x70\x65\x0d\x0a\x73\x68\x6f\
+\x77\x48\x69\x64\x65\x3d\x53\x68\x6f\x77\x2f\x48\x69\x64\x65\x20\
+\x4c\x61\x62\x65\x6c\x20\x50\x61\x6e\x65\x6c\x0d\x0a\x75\x73\x65\
+\x44\x65\x66\x61\x75\x6c\x74\x4c\x61\x62\x65\x6c\x3d\x55\x73\x65\
+\x20\x64\x65\x66\x61\x75\x6c\x74\x20\x6c\x61\x62\x65\x6c\x0d\x0a\
+\x75\x73\x65\x44\x69\x66\x66\x69\x63\x75\x6c\x74\x3d\x44\x69\x66\
+\x66\x69\x63\x75\x6c\x74\x0d\x0a\x62\x6f\x78\x4c\x61\x62\x65\x6c\
+\x54\x65\x78\x74\x3d\x42\x6f\x78\x20\x4c\x61\x62\x65\x6c\x73\x0d\
+\x0a\x6c\x61\x62\x65\x6c\x73\x3d\x4c\x61\x62\x65\x6c\x73\x0d\x0a\
+\x61\x75\x74\x6f\x53\x61\x76\x65\x4d\x6f\x64\x65\x3d\x41\x75\x74\
+\x6f\x20\x53\x61\x76\x65\x20\x6d\x6f\x64\x65\x0d\x0a\x73\x69\x6e\
+\x67\x6c\x65\x43\x6c\x73\x4d\x6f\x64\x65\x3d\x53\x69\x6e\x67\x6c\
+\x65\x20\x43\x6c\x61\x73\x73\x20\x4d\x6f\x64\x65\x0d\x0a\x64\x69\
+\x73\x70\x6c\x61\x79\x4c\x61\x62\x65\x6c\x3d\x44\x69\x73\x70\x6c\
+\x61\x79\x20\x4c\x61\x62\x65\x6c\x73\x0d\x0a\x66\x69\x6c\x65\x4c\
+\x69\x73\x74\x3d\x46\x69\x6c\x65\x20\x4c\x69\x73\x74\x0d\x0a\x66\
+\x69\x6c\x65\x73\x3d\x46\x69\x6c\x65\x73\x0d\x0a\x61\x64\x76\x61\
+\x6e\x63\x65\x64\x4d\x6f\x64\x65\x3d\x41\x64\x76\x61\x6e\x63\x65\
+\x64\x20\x4d\x6f\x64\x65\x0d\x0a\x61\x64\x76\x61\x6e\x63\x65\x64\
+\x4d\x6f\x64\x65\x44\x65\x74\x61\x69\x6c\x3d\x53\x77\x74\x69\x63\
+\x68\x20\x74\x6f\x20\x61\x64\x76\x61\x6e\x63\x65\x64\x20\x6d\x6f\
+\x64\x65\x0d\x0a\x73\x68\x6f\x77\x41\x6c\x6c\x42\x6f\x78\x44\x65\
+\x74\x61\x69\x6c\x3d\x53\x68\x6f\x77\x20\x61\x6c\x6c\x20\x62\x6f\
+\x75\x6e\x64\x69\x6e\x67\x20\x62\x6f\x78\x65\x73\x0d\x0a\x68\x69\
+\x64\x65\x41\x6c\x6c\x42\x6f\x78\x44\x65\x74\x61\x69\x6c\x3d\x48\
+\x69\x64\x65\x20\x61\x6c\x6c\x20\x62\x6f\x75\x6e\x64\x69\x6e\x67\
+\x20\x62\x6f\x78\x65\x73\x0d\x0a\x61\x6e\x6e\x6f\x50\x61\x6e\x65\
+\x6c\x3d\x61\x6e\x6e\x6f\x20\x50\x61\x6e\x65\x6c\x0d\x0a\x61\x6e\
+\x6e\x6f\x3d\x61\x6e\x6e\x6f\x0d\x0a\x61\x64\x64\x4e\x65\x77\x42\
+\x62\x6f\x78\x3d\x6e\x65\x77\x20\x62\x62\x6f\x78\x0d\x0a\x72\x65\
+\x4c\x61\x62\x65\x6c\x3d\x72\x65\x4c\x61\x62\x65\x6c\x0d\x0a\x63\
+\x68\x6f\x6f\x73\x65\x6d\x6f\x64\x65\x6c\x3d\x43\x68\x6f\x6f\x73\
+\x65\x20\x4f\x43\x52\x20\x6d\x6f\x64\x65\x6c\x0d\x0a\x74\x69\x70\
+\x63\x68\x6f\x6f\x73\x65\x6d\x6f\x64\x65\x6c\x3d\x43\x68\x6f\x6f\
+\x73\x65\x20\x4f\x43\x52\x20\x6d\x6f\x64\x65\x6c\x20\x66\x72\x6f\
+\x6d\x20\x64\x69\x72\x0d\x0a\x49\x6d\x61\x67\x65\x52\x65\x73\x69\
+\x7a\x65\x3d\x49\x6d\x61\x67\x65\x20\x52\x65\x73\x69\x7a\x65\x0d\
+\x0a\x49\x52\x3d\x49\x6d\x61\x67\x65\x20\x52\x65\x73\x69\x7a\x65\
+\x0d\x0a\x61\x75\x74\x6f\x52\x65\x63\x6f\x67\x6e\x69\x74\x69\x6f\
+\x6e\x3d\x41\x75\x74\x6f\x20\x52\x65\x63\x6f\x67\x6e\x69\x74\x69\
+\x6f\x6e\x0d\x0a\x72\x65\x52\x65\x63\x6f\x67\x6e\x69\x74\x69\x6f\
+\x6e\x3d\x52\x65\x2d\x72\x65\x63\x6f\x67\x6e\x69\x74\x69\x6f\x6e\
+\x0d\x0a\x6d\x66\x69\x6c\x65\x3d\x66\x69\x6c\x65\x0d\x0a\x6d\x65\
+\x64\x69\x74\x3d\x65\x69\x64\x74\x0d\x0a\x6d\x76\x69\x65\x77\x3d\
+\x76\x69\x65\x77\x0d\x0a\x6d\x68\x65\x6c\x70\x3d\x68\x65\x6c\x70\
+\x0d\x0a\x69\x63\x6f\x6e\x4c\x69\x73\x74\x3d\x49\x63\x6f\x6e\x20\
+\x4c\x69\x73\x74\x0d\x0a\x64\x65\x74\x65\x63\x74\x69\x6f\x6e\x42\
+\x6f\x78\x70\x6f\x73\x69\x74\x69\x6f\x6e\x3d\x44\x65\x74\x65\x63\
+\x74\x69\x6f\x6e\x20\x62\x6f\x78\x20\x70\x6f\x73\x69\x74\x69\x6f\
+\x6e\x0d\x0a\x72\x65\x63\x6f\x67\x6e\x69\x74\x69\x6f\x6e\x52\x65\
+\x73\x75\x6c\x74\x3d\x52\x65\x63\x6f\x67\x6e\x69\x74\x69\x6f\x6e\
+\x20\x72\x65\x73\x75\x6c\x74\x0d\x0a\x63\x72\x65\x61\x74\x50\x6f\
+\x6c\x79\x67\x6f\x6e\x3d\x43\x72\x65\x61\x74\x65\x20\x51\x75\x61\
+\x64\x72\x69\x6c\x61\x74\x65\x72\x61\x6c\x0d\x0a\x64\x72\x61\x77\
+\x53\x71\x75\x61\x72\x65\x73\x3d\x44\x72\x61\x77\x20\x53\x71\x75\
+\x61\x72\x65\x73\x0d\x0a\x73\x61\x76\x65\x52\x65\x63\x3d\x53\x61\
+\x76\x65\x20\x52\x65\x63\x6f\x67\x6e\x69\x74\x69\x6f\x6e\x20\x52\
+\x65\x73\x75\x6c\x74\x0d\x0a\x74\x65\x6d\x70\x4c\x61\x62\x65\x6c\
+\x3d\x54\x45\x4d\x50\x4f\x52\x41\x52\x59\x0d\x0a\x73\x65\x74\x70\
+\x73\x3d\x53\x74\x65\x70\x73\
+\x00\x00\x06\x33\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\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\x10\x00\x00\
+\x0b\x10\x01\xad\x23\xbd\x75\x00\x00\x00\x07\x74\x49\x4d\x45\x07\
+\xd3\x09\x09\x14\x30\x03\x75\x06\x85\x3f\x00\x00\x05\xc0\x49\x44\
+\x41\x54\x78\xda\xc5\x97\x4d\x6c\x1b\xd7\x11\xc7\x7f\xbb\x5c\x7e\
+\x73\xad\x95\xe4\xc8\x72\x9c\x2a\x52\x80\x26\x46\x9a\xda\x54\x84\
+\xd4\x69\x9b\x16\x16\x20\x07\x69\x51\x24\x05\x9a\x22\x40\x0e\x59\
+\x03\x86\x7b\xe8\xc5\xe8\xb9\x28\x24\xf4\xd2\xab\xdd\x1e\x7b\xf1\
+\xa2\x97\xa2\x48\x51\xb4\x75\x5a\xc4\x68\x2b\xa1\x89\x03\x3b\x85\
+\x62\x26\x76\x52\x35\x82\x2d\xda\xaa\xf5\x41\x52\x21\x25\x92\xbb\
+\xfc\x58\xbe\xd7\xc3\x92\x14\x29\x92\x26\x9b\x4b\x1e\x30\xc4\xf2\
+\xbd\x99\xf7\xff\xef\xbc\xd9\x99\x79\x8a\x94\x92\x2f\x72\x68\x00\
+\xa6\x69\x0e\x6c\xb0\xfa\x98\x35\x09\x4c\x4a\xc9\xe9\xc6\x9c\x90\
+\x20\x04\x4b\x02\x92\xcf\x6c\x99\xc9\x41\xf7\xb2\x2c\xcb\x23\xd0\
+\x6f\xdc\x99\xb0\x0c\xe0\x2c\x60\x22\x88\xb7\x3a\xad\x0e\x8e\x80\
+\x79\x80\xdb\xe3\x56\x42\x48\x2c\x29\xb8\x7c\x32\x6d\xe6\x06\xf2\
+\x40\x1f\xf0\x05\xe0\x02\x60\xa8\x0a\x44\xc3\x10\xf4\xc3\x89\x47\
+\xf3\x44\xc3\x41\x00\xa4\x28\xf3\xde\x5d\x1d\xbb\x04\xc5\x32\xf1\
+\x72\x95\x38\x30\x7f\xf3\xb0\x75\x69\x3a\x63\x2e\x7c\x2e\x02\x6b\
+\x8f\x5b\x86\x90\x2c\x02\x71\x4d\x85\x58\x18\xbe\x7b\xb2\x4a\x7c\
+\x4a\x65\xfa\x09\x1f\xa0\xb7\x68\x07\xf8\x09\xb0\x9e\x11\x7c\xb8\
+\x26\x78\xe7\xd6\x2e\xd7\xd6\x46\x0d\xe1\x32\xbf\x3c\x6a\xbd\x02\
+\xcc\xce\xec\x74\xf7\x86\xd6\x03\x3c\x5e\x07\x37\xf4\x10\xcc\x3e\
+\x5d\xe1\xfb\xa7\x34\x46\x74\x3f\x00\x99\x3d\xc1\xda\x86\x4d\xc5\
+\x15\x08\xa9\x34\xed\x9e\x7d\x52\x67\xf6\x84\xca\xec\x89\x51\xde\
+\xfe\xc0\xe5\x8f\x37\x4a\x7c\xb2\x15\x8b\x0b\xc1\xda\x0d\xc3\x9a\
+\x3d\x95\x33\x13\x7d\x09\xb4\xbc\xb9\xf1\xc4\x61\x87\x1f\x7c\xdd\
+\x4f\x7c\x2a\x00\xc0\xc6\x8e\xcb\xd6\x8e\x03\xc0\x8b\x33\x7a\x07\
+\xf1\xab\xcb\x79\x00\x9e\x9a\xd0\x79\xe1\x69\x8d\x2f\x3f\x1a\xe1\
+\xcd\xa5\x6d\xfe\x74\xfb\x88\x01\x2c\x5e\x1f\xb2\xa6\x9e\xdf\x6d\
+\xf7\x44\x07\x81\x06\xb8\x11\x85\x73\x73\x41\x8e\x0c\xab\x38\x55\
+\x48\x65\x2b\x14\x8b\x0e\xdf\xf9\xda\x50\xcf\xf3\x6c\x90\xba\xba\
+\x9c\x67\xe2\xa8\xce\xa1\xa8\xca\xeb\x67\xc6\xa8\xc9\x14\x57\x6e\
+\x8f\x19\xc0\x22\x30\xdd\x6a\xa3\x76\x09\xb8\xb8\x1e\x82\xd7\x9e\
+\x77\x89\x86\x54\x0a\x0e\x64\xf3\xa2\x2f\xf8\x41\x22\xf7\x37\xf3\
+\x14\x1c\x70\x6b\x0a\x67\x9e\x3b\xcc\xf1\x71\x1b\x21\x89\xbf\x77\
+\xc8\x5a\xe8\x4a\xa0\xfe\xa9\x5d\x50\x15\x78\x6e\xaa\xc2\xe4\xb8\
+\x86\x53\x05\xa7\x0a\x77\x1e\x14\x3b\xc0\x37\xb3\x70\x6d\x05\xde\
+\x59\x81\xeb\xab\x90\x2f\xb5\x93\xf8\xd6\x57\xf5\xa6\x7d\x34\xac\
+\xf2\xf2\xa9\x00\x7e\x1f\x08\xc9\x85\x77\x75\xcb\xe8\xe6\x81\xb3\
+\x80\x71\x28\x02\x27\xa6\x34\xf2\x0e\x4d\x19\x1f\x6e\x73\x14\x4e\
+\x05\x6e\x26\x61\xb7\xbe\xfe\x59\x01\xfe\x9e\xa8\x50\x2c\xb9\x4d\
+\x9d\x70\x00\xca\x95\xfd\x3d\x8e\x8e\x68\x3c\xfb\xa5\x3c\x80\x21\
+\x24\x67\xbb\x11\x30\x55\x05\xa6\x27\xaa\x80\x8a\x5d\xa2\x29\x41\
+\x7f\x3b\x81\x8f\xd7\x69\x5b\xb7\x4b\x9e\x07\xd6\xb7\x9d\x36\x3d\
+\xbf\xe6\xad\xad\x6d\xd5\xf8\xd7\xaa\x8b\x1e\x0b\xa0\xa9\x20\x04\
+\x66\x5b\x10\xae\x3e\x66\x4d\x22\x88\x87\x43\x30\x14\x53\x29\x96\
+\xdb\xdd\x69\x87\x02\xcd\xe7\xb2\x0b\x9f\x6e\x42\xd5\x6d\xd7\xd9\
+\xdd\x49\x73\xfc\xf4\xb1\xb6\xb9\x7f\x7c\x58\x25\x99\x56\xb0\x5d\
+\xad\x09\x37\x12\x83\x8d\x2c\xf1\xa5\x88\x35\x09\x24\x1b\x2b\x93\
+\x52\x7a\x6e\x0b\xf8\x3a\x09\xdc\x49\xf9\xf8\xcb\x4d\x18\x89\xc1\
+\xea\x46\xe7\x79\xbb\xf6\x36\xaf\x7c\xd3\x68\x9b\xfb\xf7\x7f\x05\
+\x9f\x6c\xfa\x3b\x02\x34\x16\x06\xb2\x20\x25\xfb\x04\x1a\x85\x25\
+\xa4\xd5\x28\xd7\x7c\x94\x6b\x9d\x91\xfd\xf1\x7a\x8f\x54\x5a\xd9\
+\xe6\x47\xdf\x1b\x25\x1a\xda\xff\xa2\xed\xb2\xe4\xd7\x57\xab\x40\
+\xb0\x43\x3f\xe8\x07\x29\x41\x78\x98\x4b\x5a\x6b\x51\x31\x22\x35\
+\x8a\x65\xdf\xc0\x95\x31\x50\xbe\xc7\x8f\x5f\x3d\xd6\x01\xfe\x8b\
+\xdf\x57\x58\xcf\x05\xbb\xda\x84\x03\x1e\x96\xd7\x06\x28\x5e\x0c\
+\x88\x7a\x75\x13\x42\xa1\xe0\x0c\x06\x2e\x4b\x29\x7e\xfe\x46\x77\
+\xf0\x95\xad\xe0\xc3\x6d\x5b\xca\xa9\x47\x40\x78\x7f\xb2\xb6\x86\
+\xcf\xdf\x1f\x5c\x41\xf2\xd2\x71\xd1\x06\x9e\xde\x93\xfc\xea\x4a\
+\x95\x4f\xb7\x83\xa8\x4a\x6f\xdb\x83\xf1\xd5\xd8\x61\x49\xc0\x7c\
+\x55\x28\x94\xab\x0f\x67\xee\xd5\x7e\x85\xa7\x26\x22\x6d\x6b\xbf\
+\x7c\xab\xc6\xdd\x4c\x00\xad\xcf\x09\x96\xab\x80\x14\x00\x4b\xe0\
+\xab\x7b\x00\x92\x8d\x04\xe3\xd6\xc0\xa7\xca\x16\x50\xa5\x79\x44\
+\xa0\x34\x7f\x15\xf6\x75\xee\x67\x24\x6b\x69\x0d\x65\x80\xa3\xcb\
+\x15\x00\xcf\x36\xd9\x4c\x44\xcf\x6c\x99\x49\x21\x49\xec\xd9\xa0\
+\x2a\x1e\x68\x43\xc0\x9b\x3b\x28\x99\xc2\xfe\xab\x2e\xdf\x55\xba\
+\xea\x74\x93\xd4\x1e\x00\x89\xb9\xca\xb9\x64\x5b\x35\x94\x02\xab\
+\x2c\x88\xdb\x25\x17\x23\xd6\xbf\x53\xfb\xdd\xfb\x31\x36\xf2\x50\
+\x2c\x79\x35\x21\x30\x40\x73\xb7\x99\x75\x71\xbd\x04\x66\x75\x2b\
+\xc7\x97\x81\xf9\xf5\x1d\xd5\x38\x32\xdc\x7f\x33\xbb\xf0\x19\x46\
+\xc0\x4f\x48\xba\x8c\x0f\xe9\x64\xed\xfe\x0c\xfe\xb3\xa1\x00\x32\
+\x57\xc7\x6a\xaf\x05\x27\xd3\x66\x4e\x48\x2e\x15\x2b\x2a\xd9\xdd\
+\x02\xe1\x00\x3d\xc5\x27\xf2\xfc\xec\x87\x7e\x5e\x9c\xd1\x79\xf9\
+\x1b\xc3\xfc\xf4\x55\x0d\x23\xca\x43\x6d\xb6\x32\x79\x9c\xb2\x04\
+\xc4\xa5\xb9\xca\xb9\x5c\xd7\x7e\xa0\xde\x40\x26\x3e\x7a\x10\xa3\
+\x54\xcc\xe2\xd7\xe8\x2e\x8a\xcb\xe3\x47\xf5\xb6\xe4\x32\x39\x46\
+\x4f\xfd\xbd\xdc\x0e\xd7\xef\x84\x01\x91\x98\xab\x9c\x5f\xe8\xd9\
+\x90\xd4\xc7\xac\x10\xe4\xfe\xb6\x32\x4c\xa5\x90\x26\xe8\xa7\x43\
+\xc2\x91\x30\x4e\xe5\xc0\x91\x94\xe8\xaa\x6b\xef\xa5\x78\xeb\xd6\
+\x10\x20\x72\xc0\xec\x41\xb0\x0e\x02\x33\x3b\x66\x4e\x48\x66\xa5\
+\x24\x77\xe5\xf6\x23\x64\x52\xa9\x0e\x77\xea\xb1\x10\xbf\xbd\xe6\
+\x55\xc5\x7b\x69\xf8\xc3\xfb\x50\x72\x3b\xdd\xbe\xb9\xb9\xc9\x9b\
+\xcb\x23\x4d\xf0\xb9\xca\xf9\xdc\x40\x5d\xf1\xa9\x9c\x99\xb8\x3e\
+\x64\x4d\x09\xc9\xe2\xdb\x2b\x63\xf1\xc3\xf7\x6d\xce\x7c\xa5\xc0\
+\xe8\xe8\x58\x53\x67\xcf\x86\xbf\x7e\xb0\x6f\xd3\x92\x14\xc9\xa4\
+\x1e\xf0\xe7\x8f\x86\x48\x17\x1e\x01\x44\xa2\x17\xf8\x43\xef\x05\
+\xf5\xee\x75\xfa\x5d\xdd\x5a\x48\x15\x23\x17\x7e\x73\x23\x62\x1c\
+\xd3\xf3\xcc\x4c\xec\x32\x36\x1c\x24\x14\x0c\x11\x8d\x79\x71\x50\
+\x2c\xe6\x71\x1c\x87\xad\x4c\x89\x1b\xf7\x0c\x36\xf6\x8e\x00\xe4\
+\xbc\x80\x3b\xff\xf9\x2e\x26\x8d\xf1\x42\xde\x5c\xf8\x67\xcc\xba\
+\x08\x9c\x5d\xdf\xd5\xcd\xf5\x5b\x7a\xbc\x5e\x4e\x5b\x0a\x4b\x0c\
+\x64\xa4\x91\xe1\x12\xde\x77\x2e\x2e\xf7\x7a\xeb\xff\x8b\x00\xc0\
+\xb7\x0b\x66\x0e\xb8\x08\x5c\x5c\x0c\x7b\x97\x53\xe0\x74\xb3\xaa\
+\x35\x73\x3b\xc9\x46\x86\x1b\x74\x28\x5f\xf4\xf5\xfc\x7f\x92\x93\
+\xb2\xba\x6d\x79\x43\x86\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x02\xa3\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x3c\x00\x00\x00\x3c\x08\x06\x00\x00\x00\x3a\xfc\xd9\x72\
+\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\
+\xe2\x03\x02\x04\x34\x31\x97\x0c\xf9\x63\x00\x00\x00\x19\x74\x45\
+\x58\x74\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\
+\x64\x20\x77\x69\x74\x68\x20\x47\x49\x4d\x50\x57\x81\x0e\x17\x00\
+\x00\x02\x0b\x49\x44\x41\x54\x68\xde\xed\x98\xcd\x4b\x94\x51\x14\
+\xc6\x7f\x16\x96\x7d\x2c\xa2\x55\x1b\x3f\x90\xc0\x45\x60\x21\x6e\
+\x5b\x04\x15\x45\x14\x06\x23\xae\x5a\xbb\x90\x72\x21\x6d\x4a\xa5\
+\x76\x41\x7f\x41\xae\xda\x88\x91\xd2\x22\x17\x66\x10\xa2\x92\x50\
+\x18\x45\x05\x81\x04\xd9\x2a\x22\xa5\x60\x48\xc4\x84\x69\x73\x16\
+\x0f\x2f\x33\x13\xfa\x5e\x21\xc6\xe7\x07\x97\xfb\xce\x73\xce\x7d\
+\xee\xdc\x97\x73\xef\x65\x06\x8c\x31\xc6\x18\x63\x8c\x31\xc6\x18\
+\x63\x8c\x49\x4e\x0f\x50\x8a\x76\x26\xb5\xf9\x9e\xff\x70\xc1\xed\
+\xf2\xfc\x61\x37\x2d\xf8\x1b\xb0\xb2\x9b\x16\xfc\x7e\x27\xcc\xb7\
+\xb2\xe0\x59\xd9\x5b\xa7\x32\xb1\xe3\xc0\x9f\x88\x7d\x02\xf6\x49\
+\xac\x1e\xb8\x01\xbc\x04\x7e\x46\x9b\x03\x7a\xcb\xcc\x7f\x04\x68\
+\xaa\x50\xce\x5b\xf1\x49\xc2\x7d\x59\x70\x4f\x26\xf6\x48\x62\x67\
+\x45\xef\x00\xde\x4a\x2c\xdb\x9e\x03\x7b\x25\xff\xb4\xc4\xae\xe5\
+\xf0\x49\x42\xb7\x4c\x30\x2c\x7a\xa7\xe8\xe3\xa2\x9f\x00\xd6\x24\
+\x36\x0d\xdc\x01\x1e\x02\x9b\xa2\xdf\x94\x31\x7d\xa2\x9f\xcc\xe1\
+\x93\x84\x66\x31\x1f\x0d\xad\x0e\x78\x11\xda\x9a\x94\xe3\x81\x28\
+\xc9\x12\xb0\x01\x5c\xce\x78\x15\xc4\xeb\xb5\xe8\x0f\x42\xdb\x04\
+\xf6\xe7\xf0\x49\x42\x1d\xf0\x3d\xcc\x17\x43\xbb\x20\x13\xde\x92\
+\xdc\xeb\xa2\xdf\xae\xe0\xb5\x1a\xf1\xdf\xa2\x2f\x84\xf6\x31\xa7\
+\x4f\x32\x26\xc3\xbc\x18\x7b\xe6\x5d\x7c\xfe\x0c\x34\x48\xde\x94\
+\x7c\xd1\xd6\x32\x3e\xf5\x52\xa6\x5f\xe5\x00\x2d\x86\x36\x96\xc3\
+\x27\xe9\xb5\xf4\x2a\xfa\xc3\xc0\x80\xec\xb3\x7e\x60\x5d\xf2\x8e\
+\xc9\x73\xb1\x8c\xcf\x95\x28\x57\x80\x67\xd1\xb7\x84\xaf\x5e\x49\
+\xdb\xf1\x49\xca\x79\x79\xe3\x1b\xd1\x3f\x2d\x93\x37\x56\xa5\x14\
+\x3b\x81\x1f\x11\x5b\x05\x1a\x43\xef\x92\x31\x97\x72\xf8\x24\xe5\
+\x68\xe6\x3a\x58\xaf\x50\x6a\x85\x4c\xde\x13\x60\x08\x78\x2c\xf7\
+\x75\x09\xb8\x28\x63\x86\x45\x6f\xca\xe1\x93\x9c\x25\x99\xe8\x6e\
+\x95\xbc\x91\x2a\xf7\xe6\x97\x38\xf0\x94\x89\x88\xfd\x8a\xc3\x68\
+\xbb\x3e\x49\x69\x00\x96\x63\xb2\x65\xe0\xe0\x3f\x4e\xf5\x02\x30\
+\x13\x25\x57\x04\xde\x00\x83\xc0\xa1\x2a\x2f\x72\x3e\xa7\x4f\x52\
+\x06\xe5\xed\x5e\xad\xf5\xdf\xa9\xcd\x72\x05\x4c\x67\xca\xae\x26\
+\x99\x90\xd3\xb9\xad\xd6\x17\x7b\x4e\x4a\xf9\x9e\xff\x94\x31\xc6\
+\x18\x63\x8c\x31\xc6\x18\x63\x8c\x31\xc6\x98\x54\xfc\x05\x94\x34\
+\xe4\xeb\x87\xd7\x3b\x14\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x04\xa3\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xd6\xd8\xd4\x4f\x58\x32\
+\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\x04\x35\x49\x44\x41\x54\x58\xc3\xe5\
+\x97\xcd\x8f\x54\x45\x14\xc5\x7f\xb7\xea\xd6\x7b\xaf\xdb\x6e\xc7\
+\xf9\x40\x9d\x89\x46\x4d\x34\x99\x44\x8d\x1a\x48\x98\xc4\x8c\x1f\
+\x1b\xfe\x02\x4c\x5c\xf1\x07\x18\x16\x2e\x4d\x5c\x6b\x58\xc3\x8e\
+\xc4\x8d\x1b\x17\xce\x82\x68\x74\x41\x5c\x18\x0d\xe2\xc4\xc6\x00\
+\x3d\x60\x50\x51\x19\x60\x02\xa2\x0e\x0c\x83\xd3\xfd\x5e\xf7\x94\
+\x8b\xaa\xee\xf9\x60\xe6\x0d\x84\x51\x16\x56\x52\xa9\xce\x7b\xb7\
+\xeb\x9e\x3a\xf7\xd4\xa9\x7a\xea\xbd\xe7\x7e\x36\xe5\x3e\xb7\x3e\
+\x80\x5d\xbb\x76\xbd\x03\xec\xfd\x8f\xf2\x4e\x35\x1a\x8d\x03\xeb\
+\x19\xd8\xbb\xef\xbd\xa3\x3b\x1f\x1f\x76\x00\x9c\x3c\x3a\xcf\xcc\
+\x97\x37\x58\x9c\xef\xdc\x53\xa6\xda\xa0\xf2\xdc\x6b\x03\xbc\xb8\
+\x67\x10\x80\x8b\x7f\x16\x7c\xf8\xee\x1e\x80\xdb\x00\x70\xfc\xec\
+\x1c\xdf\x3f\x30\x04\x78\x2e\xfd\xb8\xc0\xfe\xb7\xce\x6f\xcb\x72\
+\x0f\x1d\x79\x9a\x0b\x23\x96\xd3\x9f\x1f\x64\xfc\xd5\x7d\x9b\x6b\
+\x40\x45\xb0\x16\x40\x78\x70\x2c\x23\xcb\xb2\x6d\x01\x30\x30\x96\
+\x61\x8d\x50\x1b\x7c\x14\x23\x25\x22\x14\x2b\xd8\x18\x91\xd5\x95\
+\x73\xe7\xce\x83\x2a\xb8\x04\xd2\x14\xb2\x0c\xd2\x2c\x8c\x49\x0a\
+\x49\x12\xde\x77\x3a\x90\xe7\x90\xb7\xa1\xd5\x82\x76\x2b\x8e\x6d\
+\x28\x72\xb2\xfa\x38\xd6\x0a\xe3\xaf\xbc\x49\x6b\xf1\xfa\xe6\x00\
+\xac\x15\xac\x15\x04\xb0\x46\xd8\xbd\x7b\xe7\x16\x6b\xeb\x86\xae\
+\x80\x5a\xa8\x56\x81\xea\x6d\x51\x8d\xaf\x04\xb5\x82\xf7\xa0\xa6\
+\x84\x01\x67\x05\x35\x82\x08\xa8\x0a\x95\x2c\xc3\x23\x20\x1e\x08\
+\xc0\xf0\x1e\x2f\x02\xde\x23\x12\x26\x15\x7c\x88\x23\xc4\x21\x1e\
+\x3c\x21\x5e\x40\x4d\x58\x18\x40\xd7\x4a\x89\x06\xac\xa0\xda\x63\
+\x00\x9a\x33\xbf\x05\x8a\x53\x07\x69\x02\x95\x04\xb2\x34\xf6\x04\
+\x12\x07\x4e\xa1\xe8\x40\x5e\x40\x2b\x8f\xbd\x05\x4b\x39\xb4\x73\
+\xc8\x0b\x54\x87\x71\x3d\x00\x2a\xe5\x25\x70\x31\x40\xd5\x30\x39\
+\xf9\xd2\xd6\x0a\xf3\x3e\xd0\xaf\x16\xaa\x1b\x8b\xf6\xd8\x27\x61\
+\x61\xbd\x1c\x25\x25\x20\x00\xf0\x81\x8d\x34\x4d\xa3\x3a\xc3\xb3\
+\x98\x11\x89\x6c\x07\xda\x63\x09\x56\x98\x5f\x29\x46\xfc\x61\xcd\
+\x72\x7f\x61\x1d\x2d\xd1\x80\x3a\x09\x54\x49\x18\x4f\x34\x2f\xe0\
+\x9d\x85\xc4\x21\x89\xc3\x67\x09\x92\x69\xd8\x11\x89\xe2\x13\x87\
+\x58\x8b\xef\x76\x91\xbc\x80\xbc\x03\xed\x02\xdf\x6a\x23\xed\x02\
+\xf2\x02\x9f\x77\x50\x1d\x45\xd5\x20\x78\x3a\xeb\x54\x78\x9b\x06\
+\x9c\x33\x78\x0f\x03\x8f\x24\xbc\xfe\xf2\xf3\x77\x68\xe8\x36\x68\
+\xa4\xbe\xf1\xeb\xc6\xfc\xdf\xb1\x04\x52\x5e\x82\x44\x4d\x5f\x84\
+\x8f\x0d\xa5\x38\xe7\xb6\xc5\x88\x9e\x18\x4b\xb9\x76\xb3\x03\x08\
+\x9d\x52\x11\xaa\x90\xb8\x50\xef\x5a\xc5\x30\x7d\xb1\xcb\x40\xc5\
+\xb0\x0e\xf4\x26\xad\x57\xf9\x55\x2e\xe1\xe1\xc6\xd2\x32\xf5\xcc\
+\x70\x7d\xc9\x84\x2d\xe9\x4a\x19\x10\x9c\x1a\xc0\x73\xe5\x66\x97\
+\x2b\x37\xbb\xac\x51\x57\x3f\xd7\xaa\x64\x7e\xc5\x27\xa2\x29\xac\
+\x05\x15\xc3\x9c\x0b\xb5\x77\xa6\x6c\x17\xa8\xc1\xa9\x20\xc8\x1a\
+\x35\xaf\x9b\x35\x1a\x8f\x59\x31\x9e\xfe\x7b\xe9\xef\x14\x00\xf1\
+\x82\xef\x9b\x58\x30\x2b\x57\x56\x02\x55\x21\xd1\x90\xfc\xe7\x53\
+\xdf\xf2\xeb\x99\x13\x2c\x2d\xde\xb8\xa7\xfa\x57\x6a\x03\x3c\xf5\
+\xec\x4e\x9e\x79\x61\x02\x0f\xa8\x33\x5b\x31\x10\x03\x7c\x87\xf7\
+\xf7\xbf\xc1\xc2\xc2\x02\xb7\x6e\xdd\xa2\x28\x0a\x44\x04\x6b\x2d\
+\xd6\x5a\x54\x15\x55\xc5\x39\x87\xaa\x62\xad\xc5\x98\xf0\xdf\xe5\
+\xe5\x65\xf2\x3c\xef\xf7\x23\xcd\xf9\xb8\xf2\x2d\x18\x70\x56\x50\
+\x17\x18\xdc\x31\x3a\xb6\x72\x4f\x38\x7e\x9c\xe9\xe9\x69\x8c\x31\
+\x78\xef\x99\x98\x98\x60\x72\x72\xf2\x8e\x59\xd8\x31\x3a\xd6\xdf\
+\x86\xae\xd4\x09\x55\x70\x36\xac\xa2\x56\xaf\xf7\x6b\x39\x33\x33\
+\xc3\xd0\xd0\x10\xd6\x5a\xbc\xf7\x34\x9b\xcd\xbb\x02\x50\xab\xd7\
+\x70\xd1\x88\xb4\xd4\x88\x14\x9c\x0b\x27\x5c\xa0\x2a\x00\xa8\x56\
+\xab\x64\x59\xd6\xa7\xb8\x37\xde\x69\x73\x1a\xa9\x17\x41\x4b\xad\
+\x38\x1e\xc7\xbd\x23\xb4\xd7\x8c\x31\x88\x44\xdf\x8f\x3a\xb8\xab\
+\x9b\xaf\x35\xa8\x0d\xf3\xf6\x18\x2e\x3d\x8e\x83\x29\x6d\xe3\xd5\
+\xdb\x12\xa9\xf7\xe5\x56\x6c\xad\xf4\x91\x0e\x8e\x0c\xc3\xf2\xef\
+\xdb\x02\xe0\xa1\x91\x61\xd4\xc2\xb5\x2b\x97\x59\x9c\xbf\xbe\x05\
+\x03\x36\xf8\xc0\x60\xad\x02\x0b\xdb\xc3\xc0\x50\xad\xc2\xec\xc5\
+\x4b\x9c\xfd\xee\x1b\xce\x9f\x9c\x9e\x03\xa6\x36\x04\x60\x24\x5e\
+\x4a\x05\x12\x0b\xed\x91\x27\xa9\x3d\x0c\x6f\x1f\x38\xc8\x66\xc7\
+\x81\x27\x3a\xf1\x2a\xe7\x35\x1e\x32\x81\x14\x28\xba\x70\xf9\xea\
+\x55\xce\x34\x8e\xd1\xfc\xfa\x8b\xb9\xd9\x1f\x4e\x1d\x02\x0e\x6f\
+\x08\xe0\xb3\x8f\x3e\xe0\xa7\xd3\x27\x57\x99\xe9\xda\xa3\x86\x55\
+\xe6\xbb\x1e\x04\x1b\x3c\x5f\x1d\x6f\x7c\x77\xee\x8f\xd9\x5f\x0e\
+\x01\x87\x1b\x8d\xc6\x5f\x1b\x01\x98\x9a\xfe\xf4\xe3\x7f\xf5\x73\
+\x6c\x7d\xf2\x35\x00\xe2\xb7\xda\x81\xff\xdd\xd7\xf1\x3f\x4d\xf0\
+\x4b\xb9\xe8\x46\x89\xaf\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x04\x73\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\
+\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\x12\x00\x00\
+\x0b\x12\x01\xd2\xdd\x7e\xfc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\
+\xd2\x01\x07\x0b\x02\x2b\xa1\x4a\x72\xae\x00\x00\x03\xf0\x49\x44\
+\x41\x54\x78\xda\xb5\x96\xcf\x6b\x54\x57\x14\xc7\x3f\xf7\xcd\xf8\
+\x06\x99\x49\x4c\x33\x89\x20\x1a\x5f\x68\xb2\xe8\x46\x1b\x45\x17\
+\x3e\xc1\x04\x0c\xc2\xb8\x98\x89\xa4\x83\x9b\x8a\x90\x46\xc8\xa6\
+\x05\xdd\xf9\x17\xb8\x10\x04\xff\x02\xdb\x85\x14\x19\x14\x0c\xad\
+\x30\x76\x15\xd0\xfc\x92\x56\x0d\x41\xc9\x2f\x92\x86\xc4\x41\x26\
+\x04\x9a\xc4\x79\xbf\xee\x8f\x2e\x9a\x0c\x49\xeb\xc4\x52\xd2\x03\
+\x17\x2e\xf7\x1c\xce\xe7\x9e\xef\x7d\xf7\xdc\x07\xff\xb3\x89\x5a\
+\x8e\x4c\x26\x93\x2d\x97\xcb\xf9\x20\x08\x5c\x29\xe5\x51\xa5\x14\
+\xc0\x22\x30\x7c\xe0\xc0\x81\xc2\x8b\x17\x2f\x06\xff\x13\xe0\xca\
+\x95\x2b\x27\x5f\xbf\x7e\x7d\xc7\xb2\xac\xce\xf3\xe7\xcf\x73\xfc\
+\xf8\x71\xd2\xe9\x34\x5a\x6b\xca\xe5\x32\xe3\xe3\xe3\x14\x8b\x45\
+\xa4\x94\x43\x87\x0f\x1f\xbe\x31\x36\x36\xf6\xdb\xbf\x06\x74\x75\
+\x75\x65\x4b\xa5\xd2\x43\xd7\x75\xe3\xbd\xbd\xbd\x1c\x3c\x78\x90\
+\x7d\xfb\xf6\x21\x84\x40\x6b\x4d\x14\x45\xf8\xbe\xcf\xbb\x77\xef\
+\xb8\x7f\xff\x3e\x23\x23\x23\xb2\xa1\xa1\xa1\x77\x6e\x6e\xae\x66\
+\x35\xb1\xad\x49\x2e\x97\x3b\x39\x33\x33\xf3\xcb\xa5\x4b\x97\xe2\
+\x57\xaf\x5e\xa5\xa9\xa9\x89\xba\xba\x3a\x1a\x1b\x1b\x69\x6a\x6a\
+\xa2\xb9\xb9\x99\x74\x3a\x4d\x2a\x95\x22\x95\x4a\x71\xec\xd8\x31\
+\x3c\xcf\xb3\x5e\xbd\x7a\x95\x3f\x72\xe4\xc8\xcf\xab\xab\xab\xa5\
+\x5d\x01\x61\x18\xfe\xe8\xba\xee\xe7\xfd\xfd\xfd\xa4\x52\x29\x1a\
+\x1a\x1a\x68\x6e\x6e\x26\x95\x4a\x91\x48\x24\x88\xc5\x62\xc4\x62\
+\x31\x12\x89\x04\x75\x75\x75\x24\x93\x49\xda\xda\xda\x98\x9e\x9e\
+\xb6\x66\x67\x67\xbf\x08\x82\xe0\xfb\x9a\x3a\x75\x74\x74\x64\x1d\
+\xc7\x31\xc5\x62\xd1\xbc\x79\xf3\xc6\x94\x4a\x25\x73\xf1\xe2\x45\
+\x13\x45\x91\x51\x4a\x19\xa5\x94\x91\x52\x9a\x28\x8a\x8c\xef\xfb\
+\x66\x6d\x6d\xcd\x5c\xb8\x70\xc1\x2c\x2d\x2d\x99\x42\xa1\x60\xea\
+\xeb\xeb\x4d\x63\x63\x63\xf6\x63\xb9\x2d\x80\x72\xb9\x9c\xcf\x66\
+\xb3\x1c\x3a\x74\x88\x64\x32\x49\x5f\x5f\xdf\x5f\x4e\xcb\x42\x08\
+\x41\x36\x9b\x25\x97\xcb\x21\x84\x40\x08\xc1\xe5\xcb\x97\xab\xfe\
+\x8e\x8e\x0e\x32\x99\x0c\x9e\xe7\xe5\x6b\x02\x82\x20\x70\xcf\x9e\
+\x3d\x8b\x6d\xdb\x5c\xbb\x76\xad\xea\x34\xc6\xec\x08\x36\xc6\xd0\
+\xd3\xd3\xb3\x63\x5d\x08\x41\x77\x77\x37\x4a\x29\xb7\x26\x40\x29\
+\x75\xb4\xa5\xa5\x85\x44\x22\xc1\x83\x07\x0f\xaa\xc9\xb6\xc6\xe0\
+\xe0\x20\x8f\x1f\x3f\xc6\x18\xc3\xa3\x47\x8f\x76\x00\x8d\x31\xb4\
+\xb7\xb7\x03\x1c\xfd\x18\x20\xbe\x09\x40\x08\x41\x3c\x1e\x47\x29\
+\x85\x31\x06\x21\x44\x75\xbe\x65\x4a\xa9\xea\x9a\x31\x86\x28\x8a\
+\x90\x52\x12\x45\xd1\x3f\xaa\xfd\x7b\x05\x8b\xf3\xf3\xf3\xd5\x6f\
+\x5d\x6b\x8d\xd6\x1a\x29\x25\x52\x4a\x72\xb9\x1c\xb9\x5c\x6e\x47\
+\xb2\xad\xd8\x30\x0c\x99\x9a\x9a\x42\x29\xb5\x58\x13\x60\x8c\x19\
+\x7e\xfa\xf4\x29\xbe\xef\x13\x86\x21\x5a\x6b\x8c\x31\x84\x61\x48\
+\x10\x04\x68\xad\x51\x4a\x11\x86\x21\x61\x18\xa2\x94\x42\x6b\x4d\
+\x10\x04\x04\x41\x40\xb1\x58\x44\x6b\x3d\x5c\x53\x22\xcb\xb2\x0a\
+\x85\x42\xe1\xeb\x7c\x3e\x4f\x7b\x7b\x7b\x55\x06\xcf\xf3\x10\x42\
+\x70\xef\xde\x3d\x84\x10\x54\x2a\x15\xa4\x94\x3b\xfc\x6f\xdf\xbe\
+\xe5\xc9\x93\x27\x00\x85\xdd\x5a\x85\x63\xdb\xf6\x0f\xa7\x4f\x9f\
+\xee\xbc\x7b\xf7\x2e\xb6\x6d\x63\x59\x16\xb6\x6d\x23\x84\xd8\x71\
+\x26\x4a\xa9\x6a\xcb\xf8\xf0\xe1\x03\xd7\xaf\x5f\x67\x62\x62\x62\
+\x08\xe8\xda\xed\x26\xff\x61\x59\xd6\xc4\xf2\xf2\xf2\x37\xef\xdf\
+\xbf\xb7\x4e\x9c\x38\x51\xd5\x3b\x08\x02\xc2\x30\xc4\xf3\x3c\xc2\
+\x30\xc4\xf7\x7d\x2a\x95\x0a\xeb\xeb\xeb\xdc\xbe\x7d\x9b\x91\x91\
+\x11\x09\x7c\x07\xcc\xec\xda\x2a\xb4\xd6\xb6\x10\x62\x68\x6a\x6a\
+\x2a\xff\xf2\xe5\x4b\xab\xa5\xa5\x85\xfd\xfb\xf7\x57\x93\x6f\xe9\
+\xbd\xb1\xb1\xc1\xe4\xe4\x24\xb7\x6e\xdd\x62\x74\x74\x54\x02\x15\
+\xe0\x2b\x60\x15\xf8\xf5\x53\xed\xda\x01\xd2\x42\x88\x3b\x96\x65\
+\x75\x9e\x3b\x77\x8e\x33\x67\xce\xd0\xda\xda\x0a\xc0\xdc\xdc\x1c\
+\xcf\x9f\x3f\xe7\xd9\xb3\x67\x00\x43\xc0\x0d\xe0\x21\xf0\xd9\xe6\
+\x66\x57\x80\x6f\x81\x9f\x3e\xf5\xe0\x38\xc0\x97\x40\x1e\x70\xb7\
+\x5d\xa2\x45\x60\x78\xf3\x40\x57\x80\x65\x80\xd6\xd6\xd6\x49\x40\
+\x2c\x2c\x2c\x58\x40\x04\x64\x36\xe3\x3e\x69\xce\x2e\x63\x7b\xcc\
+\xca\xc0\xc0\x40\x74\xea\xd4\x29\x0f\x58\xdb\x94\xcd\xd9\xcb\xa7\
+\xd7\x01\xd6\x6f\xde\xbc\xa9\x5c\xd7\x95\xc0\x3a\xb0\xb1\x97\x90\
+\xad\xaa\xfc\x81\x81\x81\xc8\x71\x9c\x68\xaf\x01\xdb\x21\x25\x40\
+\x01\x9d\x80\x23\xf6\xf8\x2f\x65\xfb\x8e\x7f\x07\xf8\x13\x7f\x10\
+\x23\x23\x63\x99\xf1\x1a\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\
+\x60\x82\
+\x00\x00\x04\x4f\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\
+\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\
+\xd7\x09\x08\x0c\x24\x01\x84\xbe\xe4\xfd\x00\x00\x00\x0f\x74\x45\
+\x58\x74\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x69\x64\x20\x6c\x6f\x67\
+\x6f\x86\xc6\x77\xb9\x00\x00\x03\xc1\x49\x44\x41\x54\x38\xcb\xad\
+\x95\x4b\x68\x5c\x55\x18\xc7\x7f\xe7\xcc\xcd\x4c\x26\x89\xd5\x98\
+\x92\x96\x36\x4e\xd3\x18\xd1\xb6\x98\xfa\x98\x26\xa8\xf8\xc0\x42\
+\xa5\x49\x4b\x7d\x60\x75\xa3\x28\x2a\xa5\x10\x1f\x50\x95\x6e\x14\
+\xba\x91\x2e\x04\x17\x8a\xee\x7c\xe0\x83\x2a\x42\xab\xd0\x04\x52\
+\x92\x58\x8a\x8b\xf4\x11\xfb\x48\x66\x48\x86\x56\xdb\x8a\x64\xd3\
+\x36\x36\x93\xcc\xbd\x33\x77\xce\xdf\xc5\xcc\x24\x69\x1a\x5c\x68\
+\xff\xf0\x71\xee\xe2\xf0\x3f\xbf\xef\x3b\xdf\x77\x2e\x80\xfa\xfa\
+\x7b\x74\x23\x56\xe6\xab\xaf\xbf\x47\x37\x42\x65\xf3\x59\x19\x40\
+\x92\x18\x4d\x9f\x7e\x45\xc2\x97\x54\x90\x08\x24\x85\xc2\x15\x91\
+\x9c\x04\xc6\x60\x9d\xa3\x0a\xc9\x93\x51\x54\x52\x14\x88\x4b\x8a\
+\x6d\xb8\xaf\xe3\x63\x63\x4c\xc5\x0f\x00\xaf\xaf\xbf\x07\x4a\xee\
+\x01\x98\x40\x92\x2f\x91\x07\x15\x40\x61\xf0\xe7\x87\x5b\x9c\xff\
+\xfb\xb3\xb8\x20\x81\xad\xbd\x60\xe2\x77\xfe\xec\x2d\xdf\x31\x08\
+\x08\xc9\x48\x32\xe5\xcc\xd9\xb4\xb1\xf3\x7a\xe2\x33\xa3\x27\xb7\
+\x83\xc9\x39\xa7\x1c\x28\x90\x94\x0f\xce\xef\xd9\x12\x8f\x4e\xbc\
+\xd7\xbc\xfe\x25\x30\x11\x9c\x73\x9c\x3f\xf3\x3d\x33\xe1\xea\x8f\
+\xbc\xe5\x3b\x7e\x41\x8a\x3b\x29\xde\x91\x7c\xe0\x8b\x85\xc4\xb6\
+\x42\x0c\x26\x00\x05\x40\x20\xf0\x81\x5c\x71\x26\xf5\x5c\xcb\x3d\
+\x2f\xf0\x6b\xda\x27\x12\x0e\x11\x71\xc3\xac\x5a\xfb\x18\xca\xa5\
+\xb7\xc9\x29\x28\x65\x46\xa1\x42\x3c\x5f\xde\xa6\x8d\x9d\x48\x42\
+\x28\x3c\xf7\xf2\xab\x7d\x2e\xe7\xe3\xfc\x00\xe5\x03\x5c\xbe\xc0\
+\xc5\xe2\x1e\x7a\x5f\xdb\x45\xd3\x2d\xb5\xb4\x34\x66\x91\x35\x50\
+\x9c\x4e\x08\x42\x20\x94\x08\x81\x6b\xca\xb0\xb0\xc6\xa1\xc2\x22\
+\x0f\x25\x12\x98\x20\xc0\x06\x79\x4c\x21\xcf\x13\x4b\x37\x53\x18\
+\x8f\xf0\xc6\x27\x2b\x38\xf8\xc1\x34\x84\x79\x30\xf6\x0f\x4a\xc6\
+\x45\x49\x6e\xb1\x1a\xcf\x12\x1b\x21\x24\x70\x8e\x8b\x99\x0c\xe4\
+\x72\xa4\xee\x78\x90\xab\x26\x46\xc3\xd2\x95\x5c\xbe\xf4\x17\x83\
+\xa3\xb7\xd1\x14\x7c\x06\xd1\xc4\x3e\x24\x01\x32\xa6\x64\xbc\x90\
+\xd8\xce\x11\x97\x3a\xfc\xea\xe4\x64\xf9\x0e\x0c\x87\xe2\x09\x1a\
+\x9a\x56\x11\x4c\x4f\x51\xbf\x6c\x25\xdf\x1e\x48\x4d\x4f\xfb\xf5\
+\xef\x47\x56\xec\x3e\x50\xe2\x50\xd9\xff\xfa\x1a\xdb\xca\x49\x0e\
+\x45\x8c\xb1\xc8\x18\x96\x2c\x6d\x60\x6c\xfd\xe3\x9c\xae\x6f\x26\
+\xea\x19\xac\x42\x22\x11\xc3\xd9\xcb\xcd\xb1\x6f\x32\x6f\xe6\x05\
+\x11\x49\x16\x64\xe4\xb0\xff\x4a\x0c\x78\x78\x11\x46\xb2\x59\x4e\
+\x4d\x4d\x71\x30\xb6\x9c\x65\x89\x26\x94\x9f\x21\x56\x65\x71\xc1\
+\x0c\xb7\x36\x36\x7a\x63\x99\x8b\xef\x20\x3c\xc0\x13\x78\x47\x8f\
+\x9f\x48\x2c\x46\x3c\xdb\xc7\xbf\x9d\x3a\xf1\x24\xe0\x3b\xe7\x66\
+\x06\xcf\x5c\x59\x7d\xf0\xf0\xf8\xe7\xf1\x25\xf5\x91\xca\x9c\x1a\
+\x03\x9e\x35\xf8\x53\x57\xc2\xae\x47\x5a\xbb\xdb\x5b\xeb\x2e\x08\
+\xd5\xec\xec\xde\xf5\xe3\xfe\x1f\xf6\x71\x7b\x4b\xcb\xe2\x7d\x2c\
+\xb9\x98\x93\x62\x82\xea\x73\x13\xfe\xd3\xd1\x2a\x1b\xc9\x4f\x4f\
+\x12\x4c\x5d\x99\x8b\xec\x24\x9e\x67\xbd\xb3\x13\xfe\x56\x49\x31\
+\xa0\x0a\xe0\xa9\xed\xcf\xf3\xf5\x77\x5f\x2d\x4e\x7c\xe2\xe4\xb1\
+\x17\x4b\x23\xed\x7c\xa4\x40\xa8\xd4\xa3\xc2\x49\x32\x42\x16\xc9\
+\x93\xa8\x12\x8a\x22\x55\x03\xd5\x3b\x5f\x7f\xfb\xcb\xa1\x23\x87\
+\xe9\x78\xf8\x51\x9c\x73\xeb\x46\x86\x8f\x8f\x01\xc5\xf9\x93\x17\
+\x2b\x6f\x8e\x03\x35\x88\x1a\x50\xad\x50\x9d\xa4\x1a\xa0\x12\x71\
+\x20\x2e\xa8\xa6\x14\xa4\xd3\x69\x86\x8e\x1c\xc6\x5a\x3b\xda\xba\
+\x66\xed\xbd\x15\xea\xff\xf5\x5c\xb6\x25\xdb\x25\x49\xe3\xe3\x63\
+\xca\x66\xb3\x6a\x4b\xb6\xab\x2d\xd9\xbe\xc6\xf6\xf5\xf7\x60\x8c\
+\xe1\xd0\x40\xef\x7f\x5a\x2b\xaa\xab\xbb\x89\x4c\x66\x8c\xde\x9f\
+\xf6\x03\xa4\x0c\x50\x0f\xdc\x5c\x8e\x5a\xe6\x52\x8c\x02\x16\x70\
+\xb3\x13\x33\xa7\x22\x10\x00\xf9\xb6\x64\x7b\xff\xa9\x63\x43\x00\
+\x0c\x0c\x0c\xf0\xd6\xbb\xbb\x33\xc6\x98\x6d\x1e\x70\x15\xc8\x01\
+\x97\x00\xaf\x7c\xd3\xd1\xf2\xb7\x2d\xff\x72\xae\xfd\xed\x94\x0e\
+\x2b\x56\x5e\xb6\xf5\x1b\x3a\x78\x66\x6b\x17\xdd\xdd\xdd\x7f\xdf\
+\x7f\xf7\xba\xf4\xf0\x48\x6a\xaf\x57\xde\x50\xa4\xf4\x54\x32\x8f\
+\xce\x56\xee\xa0\xd2\x3d\x0b\x8c\x2b\xd9\x70\xfa\xf8\x51\x0b\x1c\
+\x48\x26\x93\x5b\x3a\x3b\x3b\xef\x1a\x1e\x49\x35\x18\x6e\x90\xda\
+\x92\xed\x5d\xc0\xa7\x65\xc0\xbd\xff\x00\x7c\x02\xcd\x92\x88\x3c\
+\x0a\x8c\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x07\x7b\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\
+\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\
+\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\
+\x67\x9b\xee\x3c\x1a\x00\x00\x07\x0d\x49\x44\x41\x54\x58\x85\xc5\
+\x97\x49\x6c\x1c\x65\x16\xc7\x7f\xef\xab\xea\xcd\x6e\xdb\xe9\xb6\
+\xe3\x71\x1c\xdb\x31\x31\x6d\x07\x05\xc5\x09\x4b\x34\xc9\x44\x80\
+\x66\xc4\xa2\x44\x42\x39\x70\xe4\x80\x10\x20\x84\x10\x52\x0e\x13\
+\x0e\x20\x61\x09\x44\x16\x89\x1c\xb8\xc0\x81\x2b\x42\x82\x03\x17\
+\x92\x81\x64\x32\x08\x65\x63\x11\x0e\x26\x13\x5b\x4a\x3c\xce\x82\
+\xdb\x59\xec\x76\xa7\xbb\xdd\x5d\xd5\xdd\xb5\xcc\xa1\xaa\xab\x17\
+\x5b\x73\x8b\xe6\x93\x4a\x5f\x2d\xaf\xde\xff\x5f\xff\xf7\xbe\xf7\
+\xbd\x12\xd7\x75\x39\x28\xb2\x17\x98\x00\xc6\x81\x30\xf7\x77\x54\
+\x80\x29\x60\xe2\xa8\xeb\x9e\x90\xbf\xc3\xde\xae\x58\xec\xf8\xdf\
+\x1e\x7a\x88\x1d\x43\x43\x44\x74\xfd\xbe\xa2\x97\x2d\x8b\x8b\x37\
+\x6f\x72\x7a\x66\x86\x9c\x61\xec\xd3\x81\x89\xbf\x6e\xd9\xc2\xf8\
+\xc6\x8d\x5c\x99\x9f\x67\x3e\x93\xa1\x6a\x59\x6b\xbe\x2c\x22\x68\
+\x22\x28\xa5\xd0\xfc\x43\x29\x85\x26\x12\x9c\x2b\xa5\x50\xbe\x4d\
+\xeb\xac\x2b\x45\x22\x1e\xe7\xd1\xa1\x21\x5c\xd7\xe5\xeb\x8b\x17\
+\x27\x74\x60\x7c\x7c\x70\x90\xab\xe9\x34\xf9\xe1\x61\x52\xaf\xbe\
+\x8a\x16\x89\xac\x85\x8e\x00\x4a\x04\x44\x50\xfe\x3d\x25\x82\xf8\
+\xcf\xa4\xe5\x9c\xc6\xfb\x00\xd5\x2a\xa5\x33\x67\xc8\xcd\xce\x32\
+\x3e\x38\xc8\xd7\x17\x2f\x8e\xeb\x40\x38\xac\x69\xa4\x33\x19\x52\
+\xaf\xbd\x86\x1e\x8f\xaf\xc6\x6e\x70\x12\xea\xea\x22\xdc\xdd\x4d\
+\x28\x91\x40\xeb\xea\xc2\xb2\x6d\xcc\x4c\x06\x29\x14\xd0\x56\x56\
+\x70\x56\x56\x02\xb5\xa4\x75\x0e\x85\x88\x3f\xf1\x04\xf9\xcb\x97\
+\x59\xe7\xe1\x84\x75\x00\xd7\x75\xa9\xda\x36\xae\x6d\x63\xf9\x0e\
+\x5a\xc1\xe3\x23\x23\x24\x77\xed\x42\x8f\xc5\x56\x11\xec\xec\xef\
+\xaf\xc7\xb8\x58\xe4\xc6\xe9\xd3\x24\x0b\x05\x10\x09\xd4\x0b\x66\
+\xc7\x01\x11\x5c\xd7\x05\x20\x20\x00\x60\x15\x8b\x88\xa6\x35\xc7\
+\x3c\x16\xa3\xf7\xa9\xa7\xe8\x18\x1d\x5d\x33\x2f\x5a\x47\xa4\xbd\
+\x9d\xd1\xe7\x9f\xe7\xc6\xe4\x24\x32\x39\x49\xbb\x52\x75\x70\x11\
+\xc4\x71\x50\xad\x04\x1c\xff\xc2\x2e\x16\xc1\x27\x20\x40\x7c\x78\
+\x98\xfe\xfd\xfb\x09\x35\x84\xc5\xb1\x6d\x96\xe6\xe7\xb9\x33\x37\
+\xc7\xdd\xb9\x39\xda\x22\x11\x12\x43\x43\x74\x0f\x0f\xd3\x3d\x30\
+\x80\xf2\x01\x37\x3d\xf2\x08\xc5\xcd\x9b\xb9\xf6\xd5\x57\xf4\x57\
+\x2a\x01\x01\xd7\x71\x50\x4a\x05\x98\x1e\x01\xc7\x01\xa0\x9a\xcf\
+\x23\xa1\x10\x4a\x04\x3d\x1e\x5f\x05\x7e\xed\xb7\xdf\xf8\xd7\xa7\
+\x9f\xb2\x29\x14\x62\x7d\x3c\xce\x48\x2c\x86\x52\x0a\xb9\x71\x83\
+\xdc\xf7\xdf\x73\x2b\x12\xa1\x6f\xff\x7e\x7a\xb7\x6c\x01\xa0\x7d\
+\xdd\x3a\x1e\x78\xe1\x05\xa6\x3e\xfa\x88\x2d\x89\x84\xa7\x80\xeb\
+\xa2\x44\x02\x4c\x05\x60\xfb\x17\xb7\x4e\x9e\xa4\xba\xbc\x8c\x5d\
+\x2a\xd1\xbf\x6f\x5f\x00\x5e\x35\x4d\xfe\xf1\xf1\xc7\x9c\x3b\x72\
+\x84\x3f\xb7\xb7\xf3\x40\x7b\x3b\x1d\x80\x6b\x9a\xb8\x86\x81\x6b\
+\x18\x44\x2c\x8b\x64\xa9\x84\xf5\xc5\x17\x5c\xff\xf2\x4b\xaa\xe5\
+\xb2\x47\x22\x91\x60\xfd\x73\xcf\x91\xcb\x66\xc1\x34\x11\xd3\x44\
+\x44\x02\x4c\xd5\x14\x82\x5c\x8e\xa5\x1f\x7e\xa0\x63\x64\x84\x75\
+\xdb\xb7\x07\x5f\x7e\xea\x93\x4f\xa8\x5e\xb8\xc0\x63\x3d\x3d\x84\
+\x2c\xcb\x03\x35\x4d\x22\x03\x03\x44\x06\x07\x71\x0d\xc3\x73\xee\
+\xcf\x91\xc9\x49\xf2\xdf\x7c\x13\xbc\x9f\xda\xb3\x87\x74\x77\x37\
+\xf8\x64\x95\x48\x80\x19\x28\xa0\xc0\x93\xb3\x5a\x65\xe8\xc5\x17\
+\xeb\xb2\xff\xfa\x2b\x37\x4f\x9c\x60\x24\x16\xf3\x80\x4b\x25\x1c\
+\xc3\x20\xf9\xec\xb3\xf4\xbf\xf1\x06\x7d\xaf\xbf\x4e\x61\xd7\x2e\
+\x8c\x5c\x0e\xd7\x34\xa1\x54\x02\xc3\xc0\x3a\x73\x86\xc2\xcc\x4c\
+\xe0\xe7\xd1\x97\x5f\xe6\xf2\xfc\xbc\xa7\x40\x83\xea\xaa\x96\x03\
+\xb5\x8a\xd6\x91\x4a\x11\x4e\x26\x83\x84\x3b\xfe\xc1\x07\xec\xe8\
+\xec\xf4\xd8\x97\x4a\x01\x89\xf8\xce\x9d\x81\xf3\x4d\x4f\x3e\xc9\
+\xd5\x3b\x77\xa0\x54\xf2\x48\x18\x06\x18\x06\xe5\xcf\x3f\xc7\xb5\
+\x6d\x00\x62\x5d\x5d\x64\xc3\x61\x9c\x4c\x06\x59\x95\x03\xae\x1b\
+\x94\xd3\x75\xdb\xb6\x05\x8e\xef\x5e\xb9\x42\x78\x66\x86\x68\x0b\
+\x38\xa6\x89\x34\x54\xcb\x70\x2c\x46\xae\x50\x80\x1a\xb8\x69\x82\
+\x69\xe2\xcc\xcf\x53\x4d\xa7\x03\xbb\xe8\x86\x0d\x54\xd3\x69\x94\
+\x08\x76\x63\x08\x1c\xc7\x09\x6a\x79\x57\x03\x81\xf4\xd4\x14\x5d\
+\x8e\x43\x35\x9d\xc6\x5a\x5a\xf2\xe4\xad\x81\x34\x0e\xd7\x85\x4a\
+\x05\xca\x65\xa4\x5c\x0e\x08\x88\x69\xe2\xcc\xcd\x05\x66\xbd\xa9\
+\x14\xf7\x2c\x6b\x0d\x05\x6a\x21\x50\x8a\x8e\x87\x1f\x0e\x5e\x58\
+\xf8\xfd\x77\x92\xa1\x90\xb7\xb6\x0d\x03\x7b\x79\x19\xf7\xde\x3d\
+\xdc\x62\xd1\x03\x6d\x1c\x95\x4a\xf0\xf5\x52\x2a\x41\x3e\x8f\x9b\
+\xcd\x62\x5d\xba\x14\x98\xfc\x69\xeb\x56\x32\xd5\x2a\x4a\xa9\x20\
+\x07\x74\x00\xdb\xb6\xd1\x94\x42\x6a\x55\xcb\x1f\x22\x42\x5c\xd7\
+\x83\xdd\x4c\x03\xc4\xb6\xbd\xaf\x6c\x19\x52\x2e\x23\x86\x51\xdf\
+\x90\xfc\x8d\xaa\xc5\x21\x2b\xb6\xed\x2d\x43\x3f\x37\x14\x80\xe5\
+\x87\x40\x53\x0a\x63\x7a\x3a\xb0\xdf\x38\x3e\x4e\xb1\x41\x9d\xc6\
+\xed\xb6\x75\x28\x1f\x50\x35\x80\x8b\x08\xa1\xb1\xb1\xc0\x66\xf1\
+\xf2\x65\x12\xe1\x30\x4a\x04\xab\x29\x04\xb6\x8d\xf8\xab\xa0\xd8\
+\x40\xa0\x7f\xdb\x36\x0a\xb5\xfc\x68\xd9\xdb\x57\x29\xb0\x06\xb8\
+\x12\x41\x4f\xa5\xea\x04\xa6\xa7\x59\x1f\x89\xac\x56\xc0\x76\x9c\
+\xa0\xd1\x30\x1a\xd6\xee\xfa\x54\x0a\xab\xaf\x6f\xcd\x06\xa3\x55\
+\x83\x46\xd0\xda\xa1\xf5\xf5\xa1\x86\x86\x02\x9b\xcc\xcc\x4c\x9d\
+\x40\x6b\x12\x8a\x2f\x6f\xe5\xfa\x75\x2a\xd9\xac\xf7\x50\xd3\x78\
+\xfc\xfd\xf7\x29\xf8\x3b\x58\x23\x89\x46\xa2\x77\x2e\x5d\x22\xa2\
+\x69\xcd\x21\x50\x8a\xb6\x03\x07\x82\xdd\xd5\xc8\x66\x51\xe9\x34\
+\xba\x52\xab\x0b\x91\x65\xdb\x75\xe7\x22\xa4\x8f\x1e\x0d\x9c\x0f\
+\xef\xde\x8d\xb1\x6f\x5f\xd0\xfd\xd4\xec\x4a\x9f\x7d\xc6\xad\x1f\
+\x7f\xe4\xe6\xf9\xf3\x9c\x3f\x76\x8c\x91\xb6\xb6\x26\xf0\xf0\xde\
+\xbd\xe8\xe3\xe3\x81\x9f\x73\x87\x0e\x31\x16\x8f\x7b\xca\x89\x60\
+\xf9\x21\xd0\x6b\x0a\xa8\x5a\x5f\x27\x42\xe9\xf4\x69\x16\x4f\x9d\
+\x62\xfd\xd3\x4f\x03\xb0\xfb\xed\xb7\xf9\xb7\xae\x93\x38\x79\x32\
+\x20\x61\xcf\xce\x22\xef\xbc\x43\xbe\x5a\x65\x4f\x28\x44\x5b\x34\
+\xda\x04\x1e\x79\xe5\x95\x00\x7c\xf6\xdb\x6f\x29\x9f\x3d\xcb\x58\
+\x6f\x6f\xd0\xa6\xad\x0a\x41\x6b\xa2\xe5\x8e\x1d\xc3\xcc\x64\x00\
+\x08\xc5\x62\xec\x78\xf7\x5d\xc2\x87\x0f\x53\xee\xe9\xa9\xc7\x59\
+\x29\xfa\xa2\x51\xda\x74\xdd\x6b\x5e\x36\x6c\xa0\xfd\xc3\x0f\x89\
+\xbd\xf9\x26\x2a\x1a\x05\xa0\xb4\xb8\xc8\xcf\x47\x8e\xf0\x97\x64\
+\xd2\x03\x6f\x21\xa0\xd7\x42\x10\x0d\x87\x9b\x62\xec\xe6\x72\xdc\
+\x7d\xef\x3d\x7a\x26\x26\x68\xeb\xe9\x01\xa0\x7f\xf7\x6e\x9c\x9d\
+\x3b\x29\x5e\xbb\x46\xe5\xca\x15\xe4\xea\x55\x22\x9a\x86\x36\x3a\
+\x8a\x4a\xa5\x08\x6d\xda\xd4\xd4\x51\x95\x16\x17\xf9\xe7\xc1\x83\
+\x6c\xd7\x34\xda\x43\xa1\x00\xdc\x6d\x0d\x41\x53\x0e\x34\xcc\xf6\
+\xd4\x14\x0b\x2f\xbd\x44\xe4\xad\xb7\x18\x7c\xe6\x19\x4f\x32\x5d\
+\xa7\x23\x95\x82\x86\xe5\xb5\xd6\xf8\xcf\x77\xdf\x31\x79\xf4\x28\
+\x8f\xe9\x3a\x03\x1d\x1d\xf5\xce\xd8\x6f\x4a\x56\x13\x80\xb5\x7b\
+\xf9\x95\x15\xd4\xe1\xc3\xcc\x9e\x3d\xcb\xc6\x03\x07\x88\x25\x12\
+\xff\x13\xd8\xc8\x66\x39\x77\xe8\x10\xea\xc2\x05\xf6\x26\x12\x84\
+\x35\xad\x19\xdc\xb7\x6b\x26\xe0\x38\xb8\xb0\xe6\x7a\xd7\x94\x42\
+\x44\xe8\x38\x7f\x9e\xc5\x73\xe7\xb8\xdd\xdb\x8b\x1a\x1d\x25\x36\
+\x36\x46\xf7\xd6\xad\x80\x57\xe1\x32\xd3\xd3\x54\x66\x67\x89\x2e\
+\x2c\x30\x12\x8b\x31\xd0\xdd\xdd\x14\xf3\xc6\x7f\x84\xaa\x6d\x07\
+\x95\x50\x07\x2a\xa6\x65\x85\x8b\xa6\x49\xb4\xb3\x73\x4d\xf0\x5a\
+\xd2\xb5\x29\xc5\x83\xcb\xcb\xc8\x4f\x3f\xa1\x7e\xf9\x05\xd3\x71\
+\xc8\x59\x16\x09\x4d\x63\x73\x38\xec\xad\xf1\x64\xb2\x0e\xb8\x06\
+\xb8\x88\x90\x5e\x5a\xc2\xf4\xfe\xbe\x2a\x3a\x30\x75\xbb\x50\x78\
+\x5c\xc3\xeb\x84\x93\x9d\x9d\x28\xd7\x45\xfc\xd6\xb9\x26\x59\x6d\
+\xef\x73\xfc\xbf\x22\xc7\x75\x89\x2a\x45\x9b\x5f\xd9\xc4\xbf\x27\
+\xae\x5b\x07\xac\x9d\xfb\xfe\x6c\xdb\x66\x7e\x71\x91\xab\x0b\x0b\
+\xdc\x2e\x14\x00\xa6\x74\x60\xe2\x66\x3e\x7f\xdc\x05\xca\xb6\xcd\
+\x82\x5f\x05\xef\xd7\xb0\x5d\x97\xc5\x52\x89\x3f\xf2\x79\x80\x09\
+\xf9\x7f\xff\x9e\xff\x17\xc5\xd6\x3d\x9a\xb0\xf3\x6b\xe8\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x02\xfd\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\
+\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\
+\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0d\xd7\x00\x00\x0d\xd7\
+\x01\x42\x28\x9b\x78\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\
+\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\
+\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x02\x7a\x49\x44\
+\x41\x54\x38\x8d\xd5\x95\x4b\x48\x55\x41\x1c\xc6\x7f\x73\x3c\x5e\
+\x6e\x47\xc3\x67\x56\x54\x84\x49\x50\x9b\x5a\x48\xad\xdc\x44\x48\
+\x19\x29\x2d\xad\x36\xb9\x68\x55\xd1\x26\x6a\x11\x81\x1b\x17\x9a\
+\xe8\xa2\x27\x44\xed\x6a\x13\x14\x14\x24\x5a\xbb\x5c\xb9\x90\x6a\
+\x51\x1a\x59\x54\xa2\x5d\xef\xfb\xde\x73\xee\xe3\xdc\x73\xe6\xdf\
+\x42\xf2\x51\x72\xcd\x2e\x2e\xfa\x60\x60\x1e\xdf\x7c\xf3\xcd\x7f\
+\x66\xfe\xa3\x44\x84\xf5\x80\xb1\x2e\xaa\x80\xf9\xab\xd2\xd4\xd6\
+\xdb\x82\xa9\x86\xb5\xd6\xd6\xb2\x95\x0d\x23\x83\x27\x47\xa6\x86\
+\xae\x8c\xae\x45\x58\x89\x08\x4d\x6d\xbd\x2d\xc1\x8a\xf2\xa1\xcb\
+\x67\x8f\x55\x6e\xdf\x5a\xb3\x8c\x30\x3d\x1b\xa7\xef\xde\x0b\x3b\
+\xe7\x14\xda\xd6\x22\x3e\x2f\xdc\xde\xe7\x5c\x3b\xdf\x6e\x05\x2d\
+\x8b\xd9\x58\x76\x19\x61\x6b\xed\x06\x72\x99\x0c\x83\xf7\x87\xdd\
+\x94\x93\x0b\x14\x13\x33\x94\xf2\xcc\xf2\xb2\x9e\xc9\xa7\x97\xba\
+\x4d\x00\xad\xb5\x55\x51\x61\xf1\xfe\x5b\xe2\x0f\x72\xca\xc9\xd3\
+\x50\x1d\xe4\xea\x85\x13\x01\xa5\x54\x51\x97\xb9\xbc\x6b\x76\x0f\
+\x3e\xb9\x0a\x74\x2f\xc4\x38\x96\xca\xa0\x67\x46\xf1\x92\xdf\xd1\
+\x5a\x10\xd1\x68\x3d\x5f\x92\x5a\x33\xa9\x35\xbe\xbf\xd8\xa7\xb5\
+\xbf\xac\x6d\xd5\xed\x64\xff\xa1\x53\x68\x11\x13\x96\x1c\x5e\x38\
+\x9e\xc5\x0e\x7d\xa2\xbf\x6f\x80\xd5\x9c\xfd\x0e\xad\x7d\x4e\x9e\
+\xee\x24\x1c\x5f\x0c\xe3\x82\xf0\x5c\xcc\x26\x67\x67\x50\x4a\xe1\
+\xba\x2e\x22\xc2\xfc\x1d\x17\xbe\xfd\x48\x70\xe5\xc6\x4b\xde\x4c\
+\xcc\x14\x91\x6f\x66\xec\xd1\x08\x86\x61\xd0\xd4\xde\xd7\xb5\x20\
+\x3c\x1b\xb5\x09\x38\x36\x00\xbf\x0c\x8b\xc0\xc3\xa1\xb7\xdc\x7a\
+\x3c\x46\x47\x6b\x33\x5d\x9d\x87\x59\x6d\x2f\xe1\x58\x9a\x9e\x9b\
+\xcf\xee\xa8\x5d\xc7\x7b\xbb\x80\x07\x5a\xeb\x15\x89\xfb\xf6\xee\
+\xa0\xa3\xf5\x00\x62\x98\x84\x53\x79\x74\x91\x97\x1a\x30\x0d\xaa\
+\x83\x8a\xeb\x77\x9f\x87\x4c\xe0\xf6\xb9\xae\xa3\x6c\xae\xaf\x5a\
+\x91\xec\x7a\x9a\x70\x2a\x4f\xd6\xcd\xae\x38\xbe\x14\xe5\x40\x24\
+\xe1\x60\x18\xc6\xb4\x69\x9a\x65\xb3\x6e\xc1\x6f\xfc\x32\x67\x93\
+\x2f\xac\xec\xfa\x6f\x21\x62\x10\x89\xdb\x88\xc8\x67\x13\x98\x08\
+\x45\xd2\x8d\xb5\x0d\x75\x78\x7e\x69\x09\x49\x6b\x88\xc6\xd3\x14\
+\x0a\xde\x84\x59\x28\x78\xe3\xa1\x48\xa2\xad\x66\x53\x2d\x9e\x5f\
+\x9a\x63\x5f\x6b\x22\xd1\x14\x22\xf2\xd5\x10\x91\x0f\xa1\x70\xd2\
+\xd5\xa2\xd0\x42\x49\xc5\x17\x88\x27\xec\x3c\xf0\xdd\x00\x26\xa3\
+\xd1\x44\x01\x4a\xcf\xcb\x22\x42\x32\x9d\x26\xfe\x71\x64\xa3\x09\
+\x4c\xda\x76\x36\xe8\x38\x59\xaa\x2a\xad\x55\x27\x17\x43\xda\xce\
+\x90\xcd\xba\xe5\xce\xf4\x78\x40\x89\x08\x5b\x0e\x9e\xe9\xb7\x1a\
+\xf6\x5c\x14\x59\x7c\x89\xff\x02\xa5\xc4\x4b\x4e\xbd\x7e\x15\x9b\
+\x18\x1a\x50\x22\x82\x52\xaa\x1e\xd8\x0d\x44\x4b\xb2\x0c\xdb\x00\
+\x05\xbc\x53\xff\xdd\x9f\xf7\x13\x77\x5b\x6b\x82\x49\x2e\xb3\xc2\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x05\x55\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\
+\x00\x00\x00\x06\x62\x4b\x47\x44\x00\x00\x00\x00\x00\x00\xf9\x43\
+\xbb\x7f\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x12\x00\x00\
+\x0b\x12\x01\xd2\xdd\x7e\xfc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\
+\xd3\x01\x09\x0a\x09\x03\x5d\x4a\xcd\x3e\x00\x00\x04\xd2\x49\x44\
+\x41\x54\x78\xda\xbd\x94\x6f\x48\x95\x57\x1c\xc7\x3f\xcf\xf3\xdc\
+\xeb\x9d\xde\xeb\xbc\x7a\xef\x75\xa0\xd9\x35\xbd\xb0\x69\xea\xa2\
+\x49\x84\x5b\x28\x1a\x43\x73\x68\x21\xad\x26\xfd\x31\x26\x24\x1b\
+\xad\x16\xc4\x10\xc6\x20\x88\xb9\x37\x0e\xdf\xd5\x5e\x8c\xc5\x20\
+\x46\x6b\x25\x73\xf6\x42\x25\xb6\x4c\x2c\xff\x34\x72\x7a\x85\xea\
+\x8a\x9a\x7f\xe1\xfa\x87\xf2\xa6\xf7\xde\xe7\x79\xce\xb3\x17\x99\
+\x69\xf3\x4a\xbd\xd9\x0f\x0e\xe7\x70\x7e\xf0\xfb\x9c\xef\x39\xbf\
+\xf3\x95\x88\x10\x25\x25\x25\x65\x7e\xbf\x7f\x7f\x28\x14\xca\xd3\
+\x34\x6d\xb3\xae\xeb\x00\x8f\x80\xce\xb8\xb8\xb8\x2b\x3d\x3d\x3d\
+\x4d\xbc\x42\x48\x2f\x6f\x1c\x3e\x7c\x78\x7b\x5f\x5f\xdf\xf7\xb2\
+\x2c\xe7\x17\x15\x15\x91\x93\x93\x83\xc3\xe1\x40\x08\x81\xdf\xef\
+\xa7\xbb\xbb\x9b\x96\x96\x16\x34\x4d\xbb\x99\x9c\x9c\x7c\xba\xab\
+\xab\xeb\xef\x57\x06\x14\x14\x14\x94\x4d\x4d\x4d\x5d\xcd\xcb\xcb\
+\x33\x55\x54\x54\x90\x98\x98\x88\xd9\x6c\x46\x92\x24\x84\x10\xa8\
+\xaa\x4a\x30\x18\x64\x72\x72\x92\x4b\x97\x2e\x71\xfb\xf6\x6d\xcd\
+\x6e\xb7\x57\x0c\x0d\x0d\x45\x54\xa3\x3c\x5f\x94\x97\x97\x6f\x7f\
+\xf8\xf0\x61\xdb\xbe\x7d\xfb\x4c\x47\x8f\x1e\xc5\xe9\x74\x12\x1b\
+\x1b\x4b\x42\x42\x02\x4e\xa7\x13\x97\xcb\x85\xc3\xe1\xc0\x66\xb3\
+\x61\xb3\xd9\xc8\xce\xce\x66\x69\x69\x49\xbe\x77\xef\xde\xfe\x4d\
+\x9b\x36\x5d\x9f\x9b\x9b\x9b\xda\x10\x10\x0e\x87\x7f\xc9\xcb\xcb\
+\x4b\xab\xae\xae\xc6\x66\xb3\x61\xb7\xdb\x71\xb9\x5c\xd8\x6c\x36\
+\x2c\x16\x0b\x8a\xa2\xa0\x28\x0a\x16\x8b\x85\xd8\xd8\x58\xac\x56\
+\x2b\xe9\xe9\xe9\x3c\x78\xf0\x40\xf6\xf9\x7c\xef\x84\x42\xa1\x8b\
+\xeb\x01\x64\x80\x6d\xdb\xb6\x95\x09\x21\xf2\x8f\x1c\x39\x42\x4c\
+\x4c\x0c\x76\xbb\x1d\xa7\xd3\x49\x54\x54\x14\x8a\xa2\x20\xcb\x32\
+\xb2\x2c\xaf\x40\x64\x59\xc6\x6a\xb5\x92\x96\x96\x46\x4d\x4d\x0d\
+\x86\x61\xe4\x27\x24\x24\x94\x45\x54\x60\x18\xc6\xd7\x85\x85\x85\
+\x39\x19\x19\x19\x68\x9a\x86\x10\x82\xc7\x8f\x1f\xa3\x28\x0a\x31\
+\x31\x31\x48\xd2\x8b\xa7\x32\x0c\x03\x00\x21\x04\xba\xae\xe3\x70\
+\x38\x18\x1b\x1b\xc3\xeb\xf5\xea\x9a\xa6\x35\xae\xa7\xa0\x22\x1c\
+\x0e\x1f\x2a\x2d\x2d\xc5\xe3\xf1\x90\x9d\x9d\x4d\x7a\x7a\x3a\x6d\
+\xdd\xf7\x39\x74\xa6\x81\x89\x89\x89\x95\xa2\x86\x61\xb0\xf7\xb3\
+\x73\xfc\x78\xa5\xf5\x45\x97\x48\x12\xbb\x77\xef\x46\xd7\xf5\xbc\
+\x48\x57\xf4\x9b\xa2\x28\xa4\xa4\xa4\x60\xb1\x58\xb8\x3f\x3c\xc1\
+\x07\x9f\x7c\xc5\xc5\x6b\x37\x78\x3b\x2d\x19\xa7\xd3\x89\xcf\xe7\
+\x43\x08\x81\x61\x18\xec\xc9\xcf\xe5\xa7\x6b\x37\x28\xaa\xfa\x86\
+\xfb\xc3\xcf\xe0\x1e\x8f\x07\x60\x73\xa4\x36\x35\xe2\xe3\xe3\x69\
+\x6e\x6e\xe6\xfc\xd5\x0e\xbc\xbe\x31\x5e\x27\x72\x33\xb7\xb0\xbf\
+\x30\x9b\xd2\xd2\x52\x4d\x55\x55\xf3\xcb\x79\x13\x40\x52\x52\x12\
+\xc3\xc3\xc3\x9c\xfb\xe2\x00\x23\x93\x33\x7c\xf9\xdd\xb3\x86\xf8\
+\xa8\x20\x97\xda\x9a\x8f\x51\x55\x95\x40\x20\x80\xdf\xef\xe7\xcf\
+\xbb\x3e\x7e\xfe\xfd\x2f\x00\xbe\x3d\x79\x80\x24\xe7\x9b\xb4\xb7\
+\xb7\xa3\xeb\xfa\xa3\x88\x5d\xb4\x63\xc7\x0e\x5a\x5b\x5b\x09\x06\
+\x83\xa4\x26\x39\x69\x3e\x5f\xcb\x89\xca\x62\x7a\xfa\x7d\x84\x42\
+\x21\x34\x4d\x43\x96\x65\xec\x76\x3b\xbf\xdf\xe8\xe6\xc3\xf7\xdf\
+\xe5\xd7\xfa\x93\xa4\xbc\x15\x4f\x28\x14\xa2\xa5\xa5\x05\x21\x44\
+\x67\xc4\x2b\x6a\x6a\x6a\xe2\xe0\xc1\x83\x5c\xbe\x7c\x19\x8f\xc7\
+\x83\xc9\xa4\x10\x0e\xab\xcc\xcf\xcf\xaf\x74\x90\x24\x49\x68\x9a\
+\x86\xae\xeb\x58\xad\x56\xa2\xa3\xa3\x09\x06\x83\x0c\x0e\x0e\x72\
+\xec\xd8\x31\x84\x10\xe5\x40\xd3\xba\x0a\xb2\xb2\xb6\x92\x9b\x9b\
+\x4b\x5d\x5d\x1d\x81\xc0\x02\x8b\x8b\x8b\xe8\xba\x4e\x42\x7c\x3c\
+\x76\xbb\x1d\x9b\xcd\x46\x74\x74\x34\x26\x93\x09\x45\x91\x99\x9e\
+\x9e\x66\x61\x61\x81\x27\x4f\x9e\x50\x5f\x5f\x8f\x10\xe2\xe6\x7a\
+\xc5\x57\x14\xa8\xaa\xca\xad\x5b\xb7\xd8\xb3\x67\x0f\xc5\xc5\xc5\
+\x9c\x3a\x75\x0a\xb3\xd9\x8c\xa2\xc8\x18\xc6\xb3\xd3\xeb\xba\x8e\
+\xa6\x69\x84\x42\x41\x66\x66\x66\x89\x8b\x8b\xa3\xa1\xa1\x81\xb6\
+\xb6\x36\x0d\xd8\x0b\x5c\xdf\x10\xd0\xdf\xdf\x8f\x77\x60\x80\x4f\
+\xab\xab\xc9\xcc\xcc\xe4\xf8\xf1\xe3\xa4\xa5\x6d\x41\x96\x65\x84\
+\x30\x10\x42\x20\x84\xe0\xe9\xd3\x00\x7d\x7d\xff\xd0\xd8\xd8\xc8\
+\xe0\xe0\xa0\x06\x2c\x2e\xd7\x39\x03\xfc\x10\x01\x10\x66\x6e\x6e\
+\x8e\x91\x91\x51\xe6\xe7\xe7\x39\x7b\xf6\x2c\xdd\xdd\xdd\xec\xda\
+\xb5\x8b\x9d\x3b\x77\xe2\x76\xbb\x01\x18\x1a\xf2\xd1\xd1\xd1\xc1\
+\x9d\x3b\x5d\x00\x37\x81\xd3\xc0\x55\x20\x7e\xd9\x15\x66\x80\x13\
+\x40\xf3\x5a\x40\x38\xcc\xec\xec\x2c\x48\x60\x08\x83\xb1\xf1\x31\
+\xbc\xde\x41\xfe\x68\x6a\xa2\xa7\xb7\x97\xc9\xc9\x49\x00\x5c\x2e\
+\x17\xd3\xd3\xd3\x00\xe5\xcb\xc5\x26\x00\x52\x53\x53\x07\x00\x69\
+\x64\x64\x44\x06\x54\xa0\x04\xe8\x5c\x01\xe8\xba\x8e\xdf\xef\x47\
+\x08\xb1\x46\xde\xf8\xf8\xf8\x1a\x0f\x1a\x1a\x1a\xa2\xb2\xb2\x12\
+\x20\x15\x18\x5d\x4e\xb9\x81\xbb\x35\x35\x35\x71\xbd\xbd\xbd\x5a\
+\x6f\x6f\xaf\xba\xfc\xbf\x32\x80\x51\xd3\xea\x02\x92\x24\xad\xf8\
+\x0e\x40\x72\x72\xf2\x1a\x83\x0b\x04\x02\xcf\x53\xa3\xab\xce\x31\
+\x0a\xbc\x77\xe1\xc2\x85\x81\xda\xda\xda\x98\xa8\xa8\x28\x73\x67\
+\x67\xe7\x12\xe0\x05\xb6\xca\xab\x01\xcf\xfd\x66\xf5\xfa\xe5\xbd\
+\x0d\x22\xab\xae\xae\x4e\xcd\xc9\xc9\x31\xdc\x6e\xf7\x1b\x6b\xde\
+\xa0\xbd\xbd\x1d\x55\x55\xff\x63\xc9\xab\xd5\x00\x4c\x4c\x4c\x50\
+\x55\x55\xe5\x05\xb2\xd6\x01\xb8\x97\xe7\x3b\x40\x22\x50\x08\x8c\
+\x00\x7c\x0e\x18\xaf\x31\xaa\x37\x50\xe1\x5e\x35\xfe\x9f\xf8\x17\
+\xc1\x08\x40\x3b\x9d\x7d\xa8\x8b\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x08\x19\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x20\x00\x00\x00\x20\x08\x06\x00\x00\x00\x73\x7a\x7a\xf4\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xd6\xd8\xd4\x4f\x58\x32\
+\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\x07\xab\x49\x44\x41\x54\x58\xc3\xad\
+\x57\x5b\x50\x93\x67\x1a\xf6\xca\xce\xec\xcc\xf6\x62\x2f\xbc\xd9\
+\xe9\xce\xec\x6e\xbd\xda\xd9\x9b\xb5\xce\xba\x3b\x7b\xb0\xad\xcc\
+\x7a\xb1\xce\xce\x3a\xb3\x76\x54\x70\x75\xdb\xe2\x81\xd6\xb6\x54\
+\x04\xbb\xa5\x20\x6d\xc1\x82\x06\x08\x07\x51\x42\x80\x80\x80\x02\
+\x21\x81\x10\x92\x40\x48\x10\x73\x24\x21\x67\x72\x80\x04\x42\x20\
+\x9c\x09\x47\xb5\x54\x78\xf6\xfb\x7e\x13\x16\x30\x58\x8b\x7d\x67\
+\x9e\xf9\x2f\x92\xfc\xcf\xfb\x3e\xcf\xfb\xbe\xdf\x97\x5d\x00\x76\
+\xfd\x98\x20\xf1\x0b\x82\x14\x02\x03\xc1\x75\x82\x03\xcf\xfd\xfe\
+\x8f\x48\xbc\x9b\x20\xe1\x57\xaf\xef\xb5\x2a\x8c\xd6\x65\xdb\x02\
+\x60\x19\x1e\x5b\x09\x27\xf1\x33\xfa\x19\x81\x22\xfc\xdc\x3e\x76\
+\x48\x7e\x8a\xa0\xb9\xb6\x59\x1c\x32\xcf\xad\x42\x39\xfe\x1d\x44\
+\xf6\x51\xd8\xc7\xe6\xe8\x87\x86\x3d\x7b\xf6\x58\x53\x52\xae\x2c\
+\xca\x3a\x3a\x10\x4e\xe2\xe5\x49\xc3\xc4\x31\x04\xb7\x3e\x49\xf9\
+\x2c\x60\x9b\x5d\x59\x53\x4d\x03\x4d\xb6\x11\x34\xeb\xfb\x20\x31\
+\x79\x60\x19\x9d\xc5\xbb\xef\xbe\x3f\xc5\xab\xbe\x83\xf1\x89\x29\
+\x4c\x4f\xcf\xae\x92\xef\xd7\xbc\x74\x02\x11\x9f\x0f\xbe\x1d\xe3\
+\xb2\x04\x43\x4f\xb4\x33\x40\x8b\x7b\x06\xcd\x3d\x2e\x34\xeb\xec\
+\xa8\x57\xf6\x20\x87\x53\x85\x32\x5e\x35\x43\xbc\xb0\xf4\x90\x81\
+\xc1\x60\x5c\x26\xbf\x4b\x7c\xe1\x04\x48\x1c\x24\x38\x41\xfd\xdd\
+\xea\x73\x27\xf1\xb9\x27\x04\x48\x87\x97\xc1\xd7\xbb\x20\x22\x55\
+\x37\xdc\x37\xa2\xb8\x4e\x88\x2c\x56\x3e\xcc\x56\xdb\x3a\x71\x04\
+\x2c\x16\x6b\x2c\xfc\xce\xe7\x27\x10\x91\x36\x93\x95\x3f\x46\x7d\
+\xa5\xfe\x12\xc4\x6f\xf4\x59\x31\xb6\x02\x7e\xef\x20\x5a\x7b\x9c\
+\xe0\x3f\x30\xa1\x4c\x28\x43\x46\x0e\x1b\xb2\x0e\xf9\x26\xd2\xf9\
+\xc5\x65\xcc\x2d\x2c\x21\x34\xbf\x88\xbd\x7b\xf7\x5a\xc9\x3b\x7e\
+\xba\x6d\x02\x24\x7e\x43\x90\x46\x3d\x35\x13\x69\x75\xb3\x80\xd2\
+\x3f\x0f\xcb\xc4\xe2\x9a\x50\xa1\x5a\xb4\x6c\xf1\x59\xa0\xb6\xa0\
+\xa6\x5d\x8d\x2f\xb2\x73\x71\xb7\x9e\xff\x0c\x31\x25\x9d\x09\xcd\
+\x63\x62\x6a\x06\x83\x43\x81\x27\xe4\xdd\xbc\x2d\xd3\xb0\x3b\x92\
+\x03\x33\x26\xd4\x53\xb5\xd3\xfb\x58\x4f\x88\xc5\x03\x21\x88\x2c\
+\x43\x50\xba\x46\xd0\xed\x09\x42\xe5\x9b\x42\x9b\x73\xfc\xa9\xcf\
+\x5a\x1b\xee\x2a\x74\xc8\xbc\xc9\x45\x09\xa7\x6c\x93\xcf\x9b\x88\
+\x27\xa7\x11\x18\x1d\xc3\x80\x6f\x08\xa2\xd6\xd6\x25\xc2\x51\xdb\
+\x28\x12\x87\xc6\x1f\xaf\x82\x2f\x62\x94\x4d\x89\x24\x90\x22\xea\
+\x52\x2d\x9a\x42\xab\xe8\x18\x79\x04\xa1\xc5\xcf\x10\x53\x74\xf6\
+\x0d\xa3\xd3\xe1\x87\xd4\x3c\x80\x16\xbd\x03\x0d\x5d\x06\x14\xd5\
+\x0a\x90\x91\x95\x0d\x2f\x79\xf1\xc6\xaa\xa9\xd4\xb3\x73\x0b\x4c\
+\xc5\x94\xd8\xdd\xef\x85\xc9\x62\x05\xb7\xbc\x12\xa5\xe5\x95\x4b\
+\x13\xf3\xcb\xab\x23\x0f\x01\x37\xd9\x11\xe6\xd9\x15\x84\x97\x15\
+\x13\x06\xcb\x3c\xd0\x68\xf2\xa3\xdd\xee\x5f\x27\x96\x3b\x86\x20\
+\xb3\x78\xd7\x7d\xe6\x08\xa4\xf8\x3c\x33\x1b\x2a\x8d\x36\xaa\xdc\
+\x53\x33\x21\x8c\x8e\x8d\x33\x15\xd3\x26\xe4\x37\x09\xf1\xc1\xc5\
+\x8f\x51\x73\xaf\x01\xbe\x65\x60\xfc\x11\xa0\x23\x13\x23\xf2\xce\
+\xa1\xbe\x5d\xb9\xb8\x51\x01\x83\x81\x74\x74\x4d\xa7\x1e\x0a\x67\
+\x80\xa9\xb8\xdd\xea\x83\xd8\xe8\x42\x93\xca\xcc\xf8\x7c\xe5\xcb\
+\x2c\x88\xda\x24\x51\x89\xa7\x67\xe7\x18\x1b\x86\x86\x47\x60\x77\
+\x38\x49\x82\x3a\x24\x7c\xf8\x21\xae\xb3\x0b\xe1\x99\x5c\x80\x6f\
+\x09\xd0\x90\xde\xe1\x0f\x2c\x81\xab\x1f\xc4\x7d\xef\x04\xdd\x07\
+\x1d\x61\xeb\xff\x9f\xc0\x1d\xb9\x16\x1d\xf6\x21\x48\xcc\xfd\x4f\
+\x7d\xee\xd4\x22\x9d\x55\x84\xaa\x9a\xba\x4d\x3e\x47\xe4\x8e\xf8\
+\x3c\x3c\x12\x84\xd3\xdd\x0f\xbd\xc1\x88\xc2\xe2\x62\x9c\x7e\x2f\
+\x1e\x3d\x03\x01\xf4\x2f\x02\x83\x84\xbc\xc5\xff\x2d\xee\x3a\x43\
+\x28\x51\x91\xf7\xf6\x05\xf1\x4e\xdc\xbf\x7d\x84\x33\x69\xe3\x20\
+\x18\xf4\x33\xab\xe0\xc9\x54\x68\x35\x38\xd1\xd8\xdd\x0b\x9e\x58\
+\x89\xac\x5c\xf6\x33\x3e\x47\xaa\x9e\x9c\x9e\x65\xe4\xee\xf7\x0e\
+\xa2\xd7\x6c\x41\x43\x03\x1f\x27\x62\xe3\x20\xe9\xd6\xc0\x45\xcf\
+\x01\x52\x90\x24\xb8\x86\xb2\x9e\x00\x6e\xb4\xdb\x50\xd1\x1b\x44\
+\x85\xce\x8b\x4a\x7e\x0b\x6d\xbe\x9b\x5b\x27\xd1\xa0\x99\xf8\x16\
+\x65\x22\x05\xee\x29\xf4\x28\x13\xc8\x90\x78\x35\x0b\x1a\xad\x3e\
+\xaa\xdc\x63\x13\x93\xf0\x0d\x0d\xc3\x66\xef\x83\xb4\x5d\x8e\xc4\
+\x4b\x97\x90\xc3\xca\xc3\xd4\x63\xc0\x4e\x7a\x49\x31\x4e\xfa\x89\
+\x94\x7f\x5b\x3b\x84\x7c\x85\x13\x25\x6a\x1f\x4a\xd5\x03\xe8\xf2\
+\x30\xa3\x28\x22\xf8\xf9\x33\x09\x74\x8f\x2e\xa1\xa8\xbe\x15\xa5\
+\x7c\x09\xb2\x4a\x2a\xf0\xcf\xe3\x71\x51\xe5\xf6\x07\x46\xd1\xe7\
+\xf2\x40\xab\x37\x20\xfd\x6a\x06\x92\xbf\x48\x83\xcd\x37\x02\x27\
+\xa9\xda\x40\x1a\x4c\xe0\x7b\x88\x52\x9d\x1f\x45\xdd\xfd\x0c\x71\
+\x41\x97\x1b\xc5\xdd\x1e\x88\x9c\x41\xfc\xf9\xcd\xb7\x5d\x84\xeb\
+\x6c\xb4\x43\xd0\x28\xf7\x4e\x23\xa7\xfc\x1e\xb2\x4b\xab\xf1\x51\
+\xea\x57\x48\xfe\x6f\xea\xfa\x58\x51\xb9\x47\x82\xe3\xf0\x0c\xf8\
+\x60\x34\x99\x51\xc9\xab\xc2\xfb\x67\xcf\x41\xfe\x40\x03\x3f\xe9\
+\x6e\xb2\x8d\x19\xb9\x6f\x69\x06\x19\xd2\x9b\x2a\x2f\x72\xe5\x0e\
+\xe4\x75\xf6\xa1\xf0\xbe\x1b\x1c\x95\x1b\xf9\x9c\xca\x29\xc2\x53\
+\xb8\xdd\x29\xdc\x2b\x76\x04\x90\x51\xc8\xc5\x95\x6b\x79\x38\x11\
+\x9f\x80\x9b\xb7\x6e\x33\x63\x15\x91\xdb\x6a\x73\x40\x22\x6d\xc7\
+\x85\x84\x0f\x50\x74\xbb\x0c\xf3\x2b\x80\x9f\x34\x58\xf7\x24\x20\
+\x1c\x7c\x84\x4a\xd3\x18\x38\xfa\x61\x86\x9c\x56\xfd\x55\xb3\x1e\
+\xac\x0e\x3b\xb8\x3a\x1f\xd9\x21\x1e\x7a\x2f\xe0\x13\xbc\xba\x5d\
+\x02\x26\xbe\xc1\x83\x94\x6f\xd8\x38\x9f\x9c\x8a\x03\x7f\x3d\x04\
+\x63\xaf\x99\xe9\x6e\x2a\xb7\x46\xd7\x83\xa4\xcb\xc9\x48\xff\x3a\
+\x8b\x8c\xd5\x3c\x53\xb5\x71\xf6\xa9\xdc\x35\xf6\x69\x5c\x97\x59\
+\x19\xd9\xbf\x6e\x21\xa7\xa0\xd4\x82\x74\xbe\x1a\x57\x9b\x34\x60\
+\xc9\xcc\x10\xbb\x82\xf8\xe5\xaf\x5f\xa7\x67\xc0\x3b\xe1\x75\x1f\
+\x35\xcc\x35\xdd\x66\x7c\x94\x96\x85\xb8\x73\x17\xf1\x97\x43\x31\
+\x4c\xd5\x74\x99\xf0\xaa\xaa\x71\xfa\xf4\x19\x68\xcc\x0e\x8c\x92\
+\x2d\x36\x14\x1e\xab\x5a\xc7\x0c\x78\xe6\x71\x70\x0d\x23\x4c\xa3\
+\x65\x8a\x0c\x8c\xec\xb4\xfa\x9c\xb6\x5e\x94\x74\x39\xd0\x66\xf7\
+\xaf\x1e\x3d\x11\x4b\x47\x2e\x6f\xc3\x79\x13\x35\x2c\x5c\x99\x1a\
+\xf1\x97\x3e\xc7\xd1\xd8\x33\xf8\x38\x31\x09\x86\x5e\x13\x1a\x9b\
+\x04\xf8\xdd\x1b\xfb\x51\x4f\xd4\xf1\x90\x99\xee\x9a\x00\xaa\xad\
+\x93\x60\x2b\x5d\x0c\x39\xf5\xbc\xf0\xbe\x67\xbd\xea\xcc\x16\x3d\
+\x4a\x55\x1e\x08\x6d\x01\x94\xd4\xf1\x43\xe1\x65\x53\x40\xf0\xca\
+\xf7\x25\x60\x2b\x6e\x6a\xc7\xa9\x84\x44\xc4\x1c\x39\x8a\xdc\x7c\
+\x36\x5a\x5a\xc5\x38\x14\x13\x83\x2f\x39\x35\xc8\x14\x6a\x98\xe6\
+\xa2\xd5\xd2\x27\xf5\x9a\x7a\x4c\x13\xa1\x49\x64\xb7\x99\x90\xdb\
+\x6e\x46\xb9\xda\x8d\x06\xa5\x76\x39\x2c\x39\x3d\xf9\x4e\x13\xec\
+\xd9\x72\xd4\x47\x0d\x3b\xab\x46\x88\x63\xff\x39\x8f\xdf\xee\xfb\
+\x3d\x1a\xf9\x02\x9c\xbf\x90\x80\x93\xf1\x17\x70\xa3\xad\x07\x19\
+\xc4\x4f\x4a\x14\xe9\x6e\xba\x58\xa8\xef\x2c\xfa\x94\x98\x50\x28\
+\xb7\x40\xe9\x0e\x3c\xf9\x57\xec\x29\x2a\x77\x2d\xc1\x67\x04\xfb\
+\xb6\xb9\xe4\x44\x8d\xbe\xcc\xb2\x5a\xfc\xe3\xe4\x19\x1c\x3c\xf4\
+\x37\xb0\x72\xf3\xb0\xef\xc0\x1f\x50\x20\xd1\x21\x89\x27\x65\x2a\
+\xa6\x4b\x85\x3e\xbf\x21\xd5\x46\xe4\x2e\x90\x5b\x21\xb0\x0c\xae\
+\xe5\xdc\xe2\xd2\x11\x13\x13\xe4\x87\x6f\x3c\xaf\x3c\xe7\x96\x15\
+\x35\x9c\x69\x45\xe5\xf8\xfb\xb1\x58\x1c\x3f\x19\x87\x37\xf6\xef\
+\xc7\x8d\x3a\x11\x92\xab\xa4\x0c\x21\xed\x70\xea\x35\x55\x21\x8b\
+\x34\x5b\xc9\x03\x37\x2a\x34\x6e\xd4\x49\x3a\x17\xc3\x72\x73\x08\
+\x8e\x6d\x95\xfb\x87\x24\xe0\x4a\x65\x73\x70\xe4\xf8\x29\x1c\x3e\
+\x7c\x98\x8c\x63\x2e\x32\x05\x2a\x5c\x22\xd5\xd3\x5d\x7e\x4d\xdc\
+\x0b\x36\xe9\x74\x76\xa7\x1d\x77\x8c\xe4\x88\xb6\xf9\x9e\x84\xb7\
+\x1a\x95\xfb\x22\xbd\x49\xfd\x80\x0b\x6d\xf4\x04\x32\x4a\x78\x4c\
+\x0f\x9c\x4b\x49\xc3\xb5\xa6\x2e\x7c\xc2\x6d\x65\x36\x59\xf1\x83\
+\x01\x5c\x97\x9a\xc1\x51\x7b\x20\xf3\x04\xd7\xce\x25\x26\x05\x36\
+\xc8\xfd\xc7\x9d\xc8\x1d\xd5\x82\xdc\x1a\x01\xce\x5e\x4e\x45\x81\
+\x58\x85\x78\xf6\x5d\x5c\xa9\x55\x90\xaa\xfb\xc0\x96\xdb\x50\xad\
+\x75\xe3\xae\x54\x41\x2f\x10\xca\x0d\x72\xbf\xba\xd3\x6a\xa3\x05\
+\xb7\xa2\x51\xf8\x1d\xaf\x43\x8d\x4f\xb9\x2d\x88\xcb\xe6\xe1\x9a\
+\x48\x8f\xaa\x1e\x2f\x9a\x35\xe6\xc7\x7f\x7a\xf3\x2d\x57\x78\xac\
+\xa8\xdc\xaf\xbd\xac\xdc\xd1\xe2\x08\xdd\x05\x5c\x75\x1f\xde\xcb\
+\xaf\x45\xb9\x76\x00\x32\x67\x60\xf5\xc2\xa7\x97\xa9\xdc\xf7\x08\
+\xd2\xa9\xdc\x3b\xf8\x03\xf3\xc2\xf1\x13\x82\xca\x1c\xee\x9d\x50\
+\x0b\x39\x94\xb8\x0d\xc2\xc8\x16\xa3\x17\x87\xc3\x2f\x22\xf7\x0e\
+\xff\xda\x6d\x8a\xdd\x61\x99\xd5\x1b\xb6\xd8\x6b\xbb\x5e\x32\xbe\
+\x2f\x89\xff\x01\x66\xb9\x5f\xfc\x11\x80\x3d\xcf\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x0e\x35\
+\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\x00\x57\x02\xf9\x87\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\
+\x00\x00\x00\x20\x63\x48\x52\x4d\x00\x00\x7a\x26\x00\x00\x80\x84\
+\x00\x00\xfa\x00\x00\x00\x80\xe8\x00\x00\x75\x30\x00\x00\xea\x60\
+\x00\x00\x3a\x98\x00\x00\x17\x70\x9c\xba\x51\x3c\x00\x00\x00\x06\
+\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\x00\
+\x00\x07\x74\x49\x4d\x45\x07\xe1\x0a\x0d\x0f\x2b\x18\xc7\x56\x80\
+\xf9\x00\x00\x0d\x39\x49\x44\x41\x54\x68\xde\xc5\x5a\x7b\x78\x54\
+\xd5\xb5\xff\xad\xbd\xcf\xcc\x99\xcc\xe4\x01\x12\x20\x0f\x0a\x21\
+\x10\x5a\x79\xa3\x20\x05\x4b\x79\x84\x14\x10\x3e\xe4\xa5\x55\xf4\
+\x16\xea\x15\x42\x91\x54\x7c\xf5\xbb\xe5\xbb\xdc\xeb\x47\x51\x1e\
+\x1f\xca\x45\x81\xe2\xb5\x80\x82\xa0\x48\xa1\x48\x23\x85\x0b\x0a\
+\x52\xaa\x28\x04\x81\x12\x08\x31\x10\x9e\x81\xbc\x33\x79\xcd\x9c\
+\x39\xe7\xec\x75\xff\x98\x09\x86\x90\x4c\x48\xe4\xfb\xba\xfe\x59\
+\xf3\x9d\xb3\x67\xad\xdf\x7a\xec\xbd\xd7\xda\xfb\xd0\xe8\xd1\x23\
+\x04\x6e\x27\x02\xc0\x21\xae\x00\x88\x46\x38\x03\xa0\x03\x07\x0e\
+\xd9\x42\x88\x87\x99\xf9\x1d\x66\xee\x45\x44\x60\x66\x84\xe1\xd5\
+\x00\xde\x88\x8f\x8f\x5b\x32\x74\xe8\x43\x66\x45\x85\xb7\x55\x7a\
+\x43\x1c\x00\x58\xd4\xfb\xb3\x08\xf1\xfa\xbf\x65\xe8\xfd\x1d\xdc\
+\xe1\x70\xa0\x57\xaf\xfb\x75\x66\x9e\x0d\xa0\x17\x11\x05\x05\x85\
+\xe7\x91\x00\xd2\x8b\x8a\x8a\x7f\x32\x7d\xfa\x63\xad\xd2\x1b\xe2\
+\x75\xe3\x44\x7d\x03\xea\xf3\xa6\x3c\xc3\x75\x1e\x89\x8c\xf4\xd0\
+\x95\x2b\x57\x3d\x44\xb8\x1f\x2d\xa3\x58\x80\xbb\x4f\x99\xf2\xb4\
+\x6a\x8d\xde\x86\xcf\xeb\x0c\xe0\x30\x0a\x1b\x15\xf2\xe4\x93\xd3\
+\x6c\xd3\xb4\xee\x63\x46\x87\x16\x1a\xa0\x29\xc5\x9d\x99\xb9\xb9\
+\x71\xcd\x82\x07\x40\xf5\xc3\xd7\x22\x21\x93\x27\x4f\x83\x65\x59\
+\xb1\x00\xda\xb6\xd0\x00\x00\xe8\xb2\x6a\xd5\x32\x11\xe6\x7d\x73\
+\xe0\x6f\x45\xa8\x6e\x62\xdc\x46\x9d\x3b\x77\xe2\xf4\xf4\x7f\xb7\
+\x9e\x7f\xfe\x37\x2a\x25\xa5\x9b\x6a\x4c\x08\x91\x8b\x99\xb9\x13\
+\x00\x77\x4b\xd1\x33\x73\x97\x35\x6b\xde\x75\x3a\x1c\xda\x1d\xef\
+\x22\x22\x5c\x9c\x9a\x3a\x82\xd7\xaf\x7f\xc7\x4a\x4b\x1b\xc5\xba\
+\xee\x6c\x38\x81\xeb\x13\xd1\xe8\xd1\x23\x64\xdd\x0b\x66\x46\xd7\
+\xae\x5d\xf8\x83\x0f\x3e\x8e\xb3\x2c\xf3\x61\x66\x54\x46\x46\x7a\
+\xb2\x7e\xf9\xcb\xa9\x25\x1d\x3b\xb6\xa7\xac\xac\x93\x64\x18\x06\
+\x0d\x1a\xf4\x80\x5a\xba\x74\xa5\x12\x42\xfc\x8e\x99\x97\xb5\x22\
+\x02\x59\x1e\x8f\x67\x5c\x55\x55\x55\xf1\x98\x31\xa9\x9a\x52\x8a\
+\x3b\x76\xec\x80\x19\x33\x9e\x52\xb3\x66\xcd\x73\x15\x14\xdc\xe8\
+\xa1\x14\xf7\x21\xa2\x8b\xbd\x7b\xdf\x7f\x3c\x31\x31\xde\x36\x8c\
+\x40\x63\x59\xa2\x68\xf4\xe8\x11\xb7\x66\x7d\x4a\x4a\x37\xde\xb0\
+\xe1\x83\x0e\xa6\x69\x6e\x64\xe6\x5f\x00\xf0\x03\x38\x29\x04\xed\
+\x12\x42\x66\x26\x25\x75\xbe\x90\x9b\x9b\x67\x78\x3c\x9e\x04\xbf\
+\xdf\x3f\x9d\x99\x9f\x03\x90\xd4\x0a\x03\x0c\x22\xfc\x45\x4a\x6d\
+\x75\xa7\x4e\x89\x5f\x4f\x98\x30\x46\x6d\xd8\xb0\xb9\x9d\x61\x18\
+\x3f\xb7\x6d\x35\x15\xc0\x48\x00\x1d\x01\x94\x08\x41\xcf\x9d\x39\
+\xf3\xf5\x9f\x33\x32\x5e\x91\x8d\xc8\xe1\xba\x08\x40\x08\x41\xb1\
+\xb1\xed\xd4\x47\x1f\xed\xf8\x3d\x33\xff\xa1\x41\xb8\x18\x40\x01\
+\x11\xf6\x11\xd1\x09\xa5\xf8\x09\x00\x43\x43\xa1\xfd\x21\x54\x48\
+\x44\x1b\x00\xd4\x00\x3c\x91\x19\xfd\x00\xe8\xb7\xe7\x08\x8e\x3b\
+\x1c\xce\xc9\x19\x19\xb3\x0b\x4e\x9e\xfc\x67\x7d\x7d\x5c\x67\x00\
+\x01\x90\xfb\xf7\x1f\xb4\x75\xdd\xd9\xcf\x34\xad\x4f\x00\x74\x0e\
+\xa3\xb4\x2e\x27\xef\x15\xd5\xcd\xc1\x26\x17\x12\x22\xfa\xaf\x89\
+\x13\xc7\x2d\xf1\xf9\x7c\x64\xdb\xea\x36\x2c\x02\x80\xf0\x78\xdc\
+\x9c\x92\xd2\x4d\x37\x4d\xeb\xb9\x66\xc0\xe3\x1e\x83\xaf\x03\x4e\
+\xe1\xde\x33\xf3\xb3\x9f\x7e\xba\xaf\xcf\x6f\x7f\x3b\xc7\x6e\x60\
+\x38\x09\x66\xe6\x5d\xbb\x3e\x52\xf9\xf9\x97\x86\x03\x98\x76\x8f\
+\xc1\xdd\x2b\xea\x62\xdb\x6a\xde\xac\x59\xcf\x3b\x5d\x2e\xfd\x16\
+\x78\x00\x2c\xfa\xf5\xeb\x03\x8f\x27\x2e\x86\x19\xf3\x01\xb4\xf9\
+\x57\x23\x6d\x8a\x98\x79\x5a\x51\x51\xf1\xa8\xcc\xcc\x7d\x16\xea\
+\x2d\xab\xf2\xab\xaf\xbe\x61\xa5\xd4\xaf\x98\x79\x1e\xbe\xaf\x35\
+\x7e\x08\x59\x00\xbc\x00\xca\x01\xf8\x42\x9e\x72\xdc\x03\xb9\x2e\
+\x66\x8e\x6d\xdb\xb6\xcd\x9e\x61\xc3\x86\xf8\xca\xcb\x2b\x24\x00\
+\xa5\x69\x9a\x96\x62\xdb\xf6\xdc\x7b\xa0\xe4\x26\x11\x7d\x4a\x44\
+\x9f\x09\x21\xbe\x13\x82\xaa\x98\xa1\x29\xa5\x12\x94\x52\x83\x00\
+\x7e\x94\x19\x03\x7e\xa0\x9e\x51\x5e\x6f\xe5\xb4\x3e\x7d\x7a\xfd\
+\xe9\xe2\xc5\x4b\x8a\x99\x89\x88\x68\x39\x80\x97\xd0\xfa\xc9\x69\
+\x02\xf8\xc4\xe1\xd0\x96\xf7\xed\xdb\xfb\xe4\xb1\x63\x27\xcc\x25\
+\x4b\x5e\x25\x22\xa2\xc8\x48\x0f\x12\x12\xe2\x39\x27\x27\x97\x5e\
+\x7b\x6d\x45\xac\x61\x18\x4f\x29\xa5\x5e\x02\x90\xd8\x5a\x0b\x88\
+\x70\x42\xd7\xf5\xf1\x4f\x3e\x39\xad\xf8\xca\x95\x6b\x4c\x44\xb4\
+\x07\xc0\xb8\x56\xca\x0b\x10\xd1\xaa\xa8\xa8\xc8\xd7\xd7\xac\x79\
+\xc3\xbb\x65\xcb\x36\x69\x9a\x56\x63\xe3\xb8\x63\xc7\x0e\xa8\xac\
+\xac\xe2\xbf\xfd\x6d\x7f\xaa\x6d\xdb\x6b\x00\xa4\xb4\x52\x67\xa1\
+\xd3\xe9\x1c\xed\xf7\xfb\xb3\xd3\xd2\x46\x0a\x41\x84\x9d\x00\x2a\
+\x5a\x29\x6c\x53\x4c\x4c\xf4\x1f\x1e\x7f\x7c\x72\xe5\x7b\xef\x6d\
+\x69\x12\x3c\x00\x2a\x2c\x2c\x82\x61\x18\xc2\x34\xcd\xfd\x52\xca\
+\x97\x00\x94\xb4\x2e\x02\xf4\x45\x44\x84\xeb\xca\xd4\xa9\x13\x25\
+\x00\x16\x51\x51\xd1\x9b\x84\xa0\x0c\x00\x97\x5b\x28\x2b\xdb\xe9\
+\x74\x2c\xdb\xbd\xfb\xa3\xea\xfc\xfc\xcb\x4d\xa5\xdf\x6d\x55\xa5\
+\x52\x8a\x1f\x79\x24\x4d\xeb\xd9\xf3\xc7\x7b\x88\xe8\x4f\x2d\xd4\
+\x67\x10\xd1\xbb\x4e\xa7\xe3\xc5\x69\xd3\x1e\xad\xa9\xac\xac\x0a\
+\xee\x03\x63\xc7\xa6\x5a\xf3\xe6\xa5\x6f\x95\x52\x4e\x07\x70\xa4\
+\x05\x9e\x78\xdf\xef\x37\x2e\x2c\x5a\xb4\xac\xa9\x95\xab\xd1\x92\
+\xd8\x34\x2d\x4e\x4f\xff\x35\x4b\x29\x37\xb5\xc0\x69\x25\x42\x88\
+\x05\x51\x51\x91\x2f\x64\x64\xa4\xdf\xc8\xcf\xbf\x5c\xb7\xf9\xb1\
+\x28\x2d\x2d\xc3\xb9\x73\xe7\xc5\xda\xb5\x6f\x7c\xa5\xeb\xfa\xd3\
+\x44\xd8\x08\x20\xd0\x8c\xc0\x22\x21\xc4\xfe\x9c\x9c\xe3\x68\xa2\
+\x31\x09\x5b\xcf\x67\x66\xee\xa3\xe4\xe4\xa4\x0b\x44\x77\xe5\xb0\
+\x6c\x29\xe5\x33\xbd\x7a\xfd\x64\x55\x6a\xea\x70\xff\x89\x13\xa7\
+\x45\x5d\x9b\x0a\x80\x64\x72\x72\x92\x60\x66\xca\xce\xce\x11\x93\
+\x26\x8d\xf7\x9e\x3a\x75\xe6\x70\x20\x60\x0e\x45\xf8\x2a\xf3\x6c\
+\x54\x54\xe4\x9a\x82\x82\x9b\x81\xda\xda\xda\x86\x65\x40\xb3\xcd\
+\x88\x52\x8a\x8e\x1d\x3b\x61\x12\x89\x2e\x00\xc6\x84\xd1\xe3\x93\
+\x52\xce\xb1\x2c\xeb\xaf\x03\x06\xf4\x93\x3e\x9f\xbf\x1e\xf6\xa0\
+\xae\x3a\x05\x41\x53\xb3\x73\x44\x44\x84\xcb\x4f\x44\x66\x38\x97\
+\x10\xa1\x30\x3a\x3a\xda\xe7\xf5\x56\xb6\xc8\xf3\x77\xca\xa1\xeb\
+\x00\xec\x30\xaa\x98\x99\xab\x99\x99\x2c\xab\xd1\x05\x82\x34\xd4\
+\xdf\x96\xa5\x60\x87\xc3\x41\xcc\x1c\xae\xb8\x02\x33\x20\xa5\xe0\
+\x06\xe3\x5a\x04\x3e\x44\x06\xbe\xaf\x6e\x6b\x01\x54\x85\x9e\x69\
+\x00\xa2\x00\x94\x4a\x29\xcb\x9a\x68\xd9\xb9\x7e\x04\x08\x00\xf7\
+\xe9\xd3\x8b\xcb\xcb\x2b\x1c\x44\xa4\x21\x3c\xb5\xab\xa8\xf0\x46\
+\xc4\xc4\x44\x73\x3d\x61\x2d\x02\x3f\x77\xee\xb3\xc2\xe5\x72\x1d\
+\x23\xa2\x45\x42\x88\xf9\x52\x8a\x47\x74\xdd\x39\xca\xe9\x74\x0e\
+\xd7\x75\x7d\xa4\x94\xf2\x17\x0e\x87\x63\x6a\xb7\x6e\x49\xe7\xc6\
+\x8e\x4d\x6b\x6c\xa1\x20\x84\x94\x09\x21\x04\xaf\x5a\xb5\x5c\xad\
+\x58\xf1\x76\xa2\xdf\x6f\xbc\xc9\xcc\x43\x9b\x31\xa0\x6b\x4d\x4d\
+\x6d\xc2\x84\x09\x63\xb9\x95\x9e\x47\x6e\x6e\x9e\xf8\xd9\xcf\x7e\
+\x7a\x53\x29\xb5\x78\xc1\x82\x97\xdf\x4a\x4c\x4c\x38\x2e\x84\x28\
+\x15\x42\x10\x11\x6a\xdb\xb6\x8d\x39\x37\x73\xe6\xd3\x27\xcf\x9e\
+\x3d\x6f\x4a\x29\x1b\x0b\x41\xb0\x37\x7f\xf1\xc5\xe7\xa8\x7d\xfb\
+\xf6\xb4\x70\xe1\xe2\xc1\x4a\xa9\x65\xcc\x3c\x0c\xcd\x13\x0b\x21\
+\xe6\xdb\xb6\xfd\xd6\xe8\xd1\x23\xb4\x96\x82\x17\x42\xa0\x77\xef\
+\x9e\xf6\x96\x2d\x1f\x7b\x4a\x4b\x4b\x07\x28\xc5\x8f\x30\xf3\x20\
+\x22\x74\x62\x46\x04\x82\x05\x61\x11\x11\x9d\x24\xa2\x3d\x1e\x8f\
+\xfb\xef\x19\x19\xe9\x95\x59\x59\xdf\x92\x65\xd9\x24\x84\xe0\xf8\
+\xf8\x38\xd8\xb6\xcd\x14\x1b\xdb\x4e\x2f\x2b\x2b\x7f\x2c\xd4\x46\
+\x26\xdd\x05\xf8\x3a\xca\x72\xbb\x23\x26\x67\x66\x7e\x7c\xed\xb5\
+\xd7\x56\x68\x77\x0b\xde\xe9\x74\xc2\xe7\xf3\xa9\x23\x47\x8e\x0e\
+\xb2\x2c\xeb\x05\x04\xcb\x98\x68\x04\x27\x73\x25\x82\x73\xc1\x01\
+\x20\x06\xc1\xf6\xd2\x4f\x84\xcf\x85\x90\x4b\x1f\x7d\x74\xc2\x97\
+\x4a\x59\xb8\x76\xad\x40\x9e\x39\x73\xae\xad\xae\x3b\xab\xa5\xcf\
+\xe7\xff\x35\x80\x95\x00\xe2\x5a\x00\x1e\x00\xe2\x2d\xcb\xc2\x91\
+\x23\x47\x0f\x0f\x1e\x3c\xd0\x2c\x2d\x2d\x93\xcd\x81\x77\xb9\x74\
+\x9c\x3b\x97\x4b\xa7\x4f\x67\xff\x9b\x6d\xdb\xeb\x10\xec\xab\x8b\
+\x89\x68\xb3\x10\x62\xb9\xa6\x69\x2b\x35\x4d\xfe\xaf\x94\x72\x33\
+\x80\x3d\x00\xae\x02\xe8\x04\xe0\xa7\xcc\x3c\x26\x27\x27\xb7\x78\
+\xc6\x8c\xe9\xa7\xb6\x6e\xdd\x3e\xc0\xb2\xcc\x0f\xfd\x7e\x23\x5e\
+\x12\xd1\x22\x00\x7d\x5b\x08\x1e\x21\xa0\xfd\x2b\x2a\xbc\x81\xcb\
+\x97\xaf\x9e\x78\xec\xb1\x49\xc6\xd5\xab\xd7\x45\x53\x27\x6e\x52\
+\x4a\x94\x97\x57\xf0\xd9\xb3\xe7\x9f\x51\x4a\xbd\x19\xf2\xf0\x16\
+\xa7\xd3\x91\xf1\xe0\x83\x03\x36\x5d\xb9\x72\xf5\xac\x65\xd5\x14\
+\x0d\x1e\x3c\xb0\xe2\xf1\xc7\xa7\x94\xcc\x99\xf3\xec\x45\xaf\xd7\
+\x7b\xe8\xd2\xa5\x2b\x7b\x99\xd9\x03\x60\x08\x80\x51\x9f\x7f\xfe\
+\x45\x3e\x80\xfb\x98\x39\x03\x80\x4d\x44\xb4\x0c\xc0\xcb\x68\x7d\
+\x39\xed\x27\xc2\x26\x87\xc3\xb9\x72\xfc\xf8\xb1\xb9\x3b\x76\xec\
+\xe2\xf9\xf3\xe7\x12\x33\xa3\xb4\xb4\x8c\x8a\x8b\x4b\xa0\x94\xa2\
+\xfd\xfb\x0f\x5a\x0e\x87\x63\x8c\x6d\xdb\x9b\x01\x44\x13\xd1\x92\
+\xb6\x6d\xdb\xbc\xf9\xfa\xeb\xff\x5d\xbd\x73\xe7\x6e\x69\xdb\x77\
+\x6e\x07\x44\xc4\x4f\x3c\x31\x95\xe7\xcf\xff\x0f\x77\x4d\x4d\xed\
+\x7f\x32\xf3\xcb\x00\x2e\x11\x61\x17\x33\x5e\x00\xf0\x77\xd2\x34\
+\xd9\xdd\xb6\xd5\x76\x00\xfd\x5b\x69\x00\x42\xa9\x73\x81\x88\x76\
+\x09\x41\x07\xa4\x94\xf9\x52\x4a\x1f\x80\x40\xdf\xbe\xbd\xcb\x86\
+\x0c\x19\x64\xaf\x5f\xbf\x39\xb6\xaa\xaa\x7a\x3b\x80\x9f\x13\xe1\
+\xad\xb8\xb8\xb8\xdf\x4f\x9a\x34\xde\x9f\x9b\x9b\xd7\x9c\xe3\xb8\
+\x53\xa7\x04\x6c\xdf\xfe\x89\xc7\xe7\xf3\xad\x65\xe6\xa7\x00\x94\
+\x01\xb8\x0f\xc0\x17\x14\x0a\xef\x2c\xa5\xd4\x6a\x00\xce\x1f\x60\
+\x44\x1d\xf9\x42\x0a\xfc\x44\x28\x91\x52\x9b\x6d\x9a\xe6\x69\x21\
+\xc4\x4c\x66\x5e\x0f\xe0\x94\xcb\xa5\x4f\xda\xbd\x7b\xdb\xd5\x65\
+\xcb\x56\x86\x6d\x61\x85\x10\xfc\xa3\x1f\x25\x22\x39\x39\x59\x2d\
+\x58\xf0\x2a\x3b\x1c\x5a\x2f\xdb\x56\x7f\x05\xd0\x35\x34\xe4\x0b\
+\xb1\x7d\xfb\xfb\xe4\x72\xe9\x7f\x26\xc2\xc1\x7b\x00\x1e\x00\x22\
+\x10\xec\xb8\xba\x31\xa3\x27\x80\x98\xae\x5d\xbb\x38\x01\x4c\x09\
+\x62\xa2\x8d\x3e\x9f\xff\xca\xdd\x80\xaf\xa8\xf0\xca\xad\x5b\xb7\
+\x77\x58\xbc\x78\x59\x37\x97\x4b\xef\xea\x70\x38\xfc\x00\x0e\xdf\
+\x36\xee\x9d\x77\x36\x8a\xea\xea\x9a\x0a\x22\xf1\x3f\x08\x36\xe3\
+\xf7\x92\xae\x69\x9a\xfc\xee\xc6\x8d\xc2\x24\x66\x7e\x00\xc0\x0d\
+\x21\xc4\x67\xeb\xd7\xaf\x6e\x36\x6d\xe6\xcf\x9f\xcb\x27\x4e\x9c\
+\xea\x6f\x18\xc6\x5e\xbf\xdf\x38\x14\x08\x98\x87\xfd\x7e\xe3\x20\
+\x80\x89\xf5\xc7\x09\x00\x3c\x71\xe2\x38\x11\x1f\xdf\xf1\x10\x11\
+\x7d\x7c\x8f\x0d\x28\x88\x8f\x8f\xf3\x9a\xa6\xd9\x09\x40\x7b\x00\
+\xf9\xd1\xd1\xd1\x05\x7b\xf7\x1e\x08\x57\x6b\x31\x00\x1a\x37\x6e\
+\xaa\x12\x82\x88\xf9\xb6\x2b\x25\x00\xa8\x06\x70\x05\xc1\xc9\x7c\
+\x44\x00\x20\x9f\xcf\x4f\x3b\x76\x7c\x60\x08\x21\xd6\xa0\xf9\x26\
+\x43\xe1\x2e\x89\x88\xbc\x73\xe6\x3c\x63\x10\x21\x16\x80\x93\x88\
+\x0a\xdb\xb4\x89\xf1\x55\x55\x55\x37\x7b\x1f\x31\x66\xcc\x28\xad\
+\x47\x8f\x94\x2c\xb7\xdb\x3d\xd6\xe9\x74\x0c\x77\xb9\xf4\xe1\x4e\
+\xa7\x73\x84\xae\xeb\x23\x74\xdd\x39\x52\xd7\xf5\x11\x11\x11\xee\
+\x25\x75\x3b\xa8\x5c\xb8\x70\xb1\x48\x4f\x9f\x79\xe6\x8f\x7f\xdc\
+\xf0\x6e\xd3\x87\xbb\xb4\x17\xc0\x09\x66\x9e\x8e\xe0\xba\x1c\x36\
+\x15\x98\x19\xdf\x7d\x77\x81\x98\x83\x46\x33\x33\x49\xd9\x64\xea\
+\x37\x68\x3f\x59\xc5\xc7\x77\xa4\xd4\xd4\xe1\x37\x1d\x0e\x0d\xba\
+\xee\x42\x20\x10\x80\x10\x02\x42\x10\xaa\xab\x6b\x70\xf3\x66\x21\
+\x6e\x95\xd3\x4a\x29\x4a\x48\x88\x57\x6e\x77\xc4\xc6\x9a\x9a\xda\
+\xe1\x00\x46\x03\xf0\x13\xd1\xb7\x00\x76\x39\x1c\xda\x9e\x1e\x3d\
+\xba\xe7\x9e\x3e\x9d\x6d\xba\xdd\x11\xbb\x0c\x23\xf0\x34\x33\xff\
+\x06\x61\xca\x0f\x22\x8a\xd9\xb7\xef\x33\x8d\x88\x2a\x10\xec\xf2\
+\xda\x17\x15\x15\xbb\xfa\xf6\xed\x55\x5d\x51\xe1\x6d\xb6\x14\x67\
+\x66\xce\xce\x3e\x17\xae\xdf\xe6\xfa\xf7\x03\x0c\x40\xa4\xa4\x74\
+\xb7\xdf\x7f\x7f\x4b\x27\xc3\x30\x86\x10\x09\xaf\xcb\xa5\x1f\x9b\
+\x3d\xfb\x99\xf2\xb2\xb2\x52\x14\x16\x16\x0b\xd3\x34\x11\x19\xe9\
+\xe1\x5d\xbb\x3e\xb5\xef\xe2\x82\xe3\x9c\xc7\xe3\x1e\x65\x9a\x66\
+\x64\x20\x60\x1e\x02\x20\x35\x4d\x4b\xfd\xf0\xc3\xf5\x39\xeb\xd6\
+\x6d\x10\xe1\xc0\xa3\x99\xb2\x24\x44\x4a\x26\x27\x27\xd5\xc5\x94\
+\x00\x70\x59\x59\x99\x4c\x4b\x4b\xf5\x1e\x3d\x7a\x2c\xdb\xb6\x6b\
+\x2f\xb4\x6b\x77\x9f\x91\x9f\x7f\x89\x2a\x2b\xab\x84\x52\xc1\xf4\
+\x0f\x04\x4c\xba\x78\xf1\x92\x92\x52\xc4\x31\xf3\x94\x30\xa9\xe4\
+\xb2\x6d\x7b\x5f\x97\x2e\x9d\xcf\x96\x97\x57\x0c\x03\xf0\x20\xc0\
+\xb9\xdb\xb6\xed\x3c\x9a\x9c\x9c\xd4\xf0\xde\xb7\xa5\xe0\x6f\x5d\
+\xf2\xa9\x86\x42\x72\x72\xce\x8b\xb4\xb4\x91\xe2\xcb\x2f\xbf\x96\
+\x25\x25\xa5\x8d\x1e\x7f\x33\x2b\x02\xe8\x3a\x80\x9a\x30\x4a\xa2\
+\x98\x79\x54\x5e\xde\x45\x43\x08\xb1\x13\x80\x52\x8a\x67\xb8\xdd\
+\x11\x9d\x17\x2e\xfc\x9d\x8d\xef\xbb\xc1\x56\x81\x47\x68\x19\x6d\
+\x95\x90\x6d\xdb\xde\x83\xc3\xa1\x15\xa3\x99\x43\x31\x66\x9e\xe4\
+\x72\xe9\x89\x6e\xb7\x3b\x13\xc1\x4d\xe8\x01\xbf\xdf\xff\xd2\x8c\
+\x19\x73\x22\xfa\xf7\xef\x63\x33\x73\xab\xc1\x23\x74\x2a\x51\x37\
+\x07\x5a\x24\x24\x3f\xff\xb2\xb8\x70\xe1\x92\xb2\x2c\x73\x0a\xc2\
+\x9f\x75\x76\x50\x4a\x15\x19\x86\xb1\x5f\xd3\xb4\x02\x66\x1e\x03\
+\xe0\xe1\xca\xca\x2a\x75\xfe\x7c\x5e\xd6\xd2\xa5\xaf\xfa\x8f\x1f\
+\xff\x56\x70\xb0\x8c\x6d\x09\x78\x81\xd0\x1c\x68\x98\x8b\x77\x25\
+\xc4\xb6\x2d\x96\x52\xda\x45\x45\xc5\x43\x01\xf4\x0b\x33\x9e\x00\
+\x74\xd7\x75\xfd\xff\xd6\xad\x5b\xf9\x4d\x66\xe6\x3e\x2f\x33\x8f\
+\x04\x90\xea\xf3\xf9\x3a\xef\xd8\xf1\xc9\x05\xb7\xdb\x53\xf4\x8f\
+\x7f\x1c\x55\x97\x2f\xe7\x71\x5c\x5c\x1c\x4a\x4a\x4a\x60\xdb\xf6\
+\x5d\x1d\xd7\xd4\x6f\x07\x5b\xe4\x01\xd3\xb4\xc4\xea\xd5\xcb\x03\
+\x69\x69\x93\xde\x36\x4d\x2b\x1e\xc1\xc3\xda\x3b\x6e\xd2\x11\xfc\
+\x4c\xe2\x06\x33\xdb\x9a\xa6\x51\x62\x62\xc2\xc6\xeb\xd7\x0b\x0c\
+\xa5\xd4\x22\x00\xbf\x0a\x04\xcc\x91\xa7\x4e\xfd\x33\x53\xd3\xb4\
+\x03\x52\x8a\x8b\x42\x08\x6f\x54\x54\x54\xd1\x43\x0f\x3d\x68\x18\
+\x86\x11\x0e\xbc\x00\x60\x53\xe8\x6b\x15\x42\xd3\x11\xe0\x46\x80\
+\xdd\x12\x12\x1b\xdb\xce\xde\xb7\xef\xb3\xe8\xda\x5a\x5f\x5b\x22\
+\xa2\xe0\x57\x29\xa1\x3f\x32\x98\x88\x84\x10\x54\x35\x70\xe0\x80\
+\x72\x5d\xd7\x95\x94\x92\xbc\xde\x4a\x95\x95\xf5\xed\x40\xd3\xb4\
+\xe6\x23\xd8\x52\xb6\xc1\xf7\x17\x23\x3e\x22\x7a\x3b\x3d\x7d\xe6\
+\x8a\xbc\xbc\xfc\xfa\xa9\xd5\x10\xbc\x02\x82\xe7\x2f\xf5\x3f\x71\
+\xa9\xcf\xeb\xff\xb1\xe1\x18\xbb\x8e\x97\x94\x94\xd2\xa4\x49\x13\
+\xbc\x7d\xfa\xf4\xf4\xba\xdd\x6e\xd4\xd6\xd6\xc2\xe9\x74\xc2\x34\
+\x2d\x08\x21\xe0\x70\x68\x38\x78\xf0\x30\x55\x56\x56\xc1\xb6\x6d\
+\xb2\x2c\x4b\x45\x46\x7a\x68\xed\xda\x37\xbf\x79\xe5\x95\x85\xb3\
+\xbc\xde\xca\x21\xcc\x3c\x15\xc0\x30\x00\x49\x00\xb7\x63\x46\x4c\
+\xff\xfe\x7d\x39\x2f\x2f\x5f\x35\xa5\xb7\xee\xf9\xff\x03\x78\x8c\
+\x5f\x99\x77\x2f\x9e\x77\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\
+\x74\x65\x3a\x63\x72\x65\x61\x74\x65\x00\x32\x30\x31\x37\x2d\x31\
+\x30\x2d\x31\x33\x54\x32\x33\x3a\x34\x33\x3a\x30\x33\x2b\x30\x38\
+\x3a\x30\x30\x27\xbf\x77\xe8\x00\x00\x00\x25\x74\x45\x58\x74\x64\
+\x61\x74\x65\x3a\x6d\x6f\x64\x69\x66\x79\x00\x32\x30\x31\x37\x2d\
+\x31\x30\x2d\x31\x33\x54\x32\x33\x3a\x34\x32\x3a\x35\x30\x2b\x30\
+\x38\x3a\x30\x30\xc0\x28\xb0\x93\x00\x00\x00\x00\x49\x45\x4e\x44\
+\xae\x42\x60\x82\
+\x00\x00\x1e\xc4\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\xca\x00\x00\x00\xc8\x08\x06\x00\x00\x00\xa9\xad\x7e\xa3\
+\x00\x00\x1e\x8b\x49\x44\x41\x54\x78\x5e\xed\x5d\x09\x98\x24\x45\
+\x95\x7e\x2f\xbb\xe7\x00\x04\x39\x46\xf0\xc0\x15\xd6\x71\xec\xae\
+\x78\x59\xc3\xd8\xa2\xce\x02\xae\x80\x8a\x22\x2a\x2a\x88\xe2\x2a\
+\x20\xae\xb8\x82\x3a\xb2\x1c\xab\xc0\x2a\x82\x17\x28\x78\xc1\xee\
+\xb2\x2b\x03\xa2\x78\x20\xa8\xdc\x28\x2a\x2e\x22\x2a\x0c\x34\x95\
+\x2f\xaa\x67\x70\x64\xd9\x15\x16\xd0\x05\xc1\xf1\x98\x69\xbb\xf2\
+\xed\x17\x6d\xf5\x7c\x3d\xd3\x47\x65\x64\x66\x64\x66\x55\x45\x7c\
+\x5f\x7f\xa3\xf4\x7b\xff\x7b\xf1\xbf\xfa\xbb\xf2\x88\x78\x81\x50\
+\xd1\x51\xaf\xd7\x77\x17\x91\x95\x71\x1c\xbf\x14\x11\x9f\x07\x00\
+\xbb\xb5\x7f\x7e\x05\x00\x0d\x44\xfc\x85\x88\xdc\xc0\xcc\xb7\x54\
+\x74\x0a\x3e\xad\x59\x18\xd8\xaa\xae\x2b\x44\xe4\x29\x88\x68\x7e\
+\x9e\x10\x91\x35\x88\x38\x26\x22\x37\x33\xf3\xf7\xaa\x44\x20\x56\
+\x29\x19\x93\xcb\xb2\x65\xcb\x96\x2c\x5a\xb4\xe8\x64\x11\x39\x25\
+\x61\x6e\x46\x28\x97\x31\xf3\xc5\x09\xed\xbd\x59\x09\x0c\xd8\xd6\
+\x55\x44\xee\x46\xc4\xef\x30\xf3\x99\x25\xa4\x3b\x23\x64\xa5\x84\
+\xa2\x94\x7a\x33\x22\x7e\x08\x00\x9e\x6b\x4b\x8e\x88\x7c\x07\x00\
+\xce\xd5\x5a\xdf\x66\xeb\xeb\xed\xdd\x32\x10\x86\xe1\xe1\x22\x72\
+\x56\x9a\xba\x02\x80\xf9\x43\x78\x66\xd9\x57\x0e\x95\x11\x0a\x11\
+\xbd\x07\x00\x3e\x97\xb5\x64\x88\xf8\xc6\x28\x8a\xae\xc8\x8a\xe3\
+\xfd\xf3\x61\xa0\x2d\x92\x6f\xe4\x80\x76\x10\x33\x7f\x37\x07\x9c\
+\x54\x10\x95\x10\x0a\x11\x99\x6f\x91\x0f\xa7\x9a\xc1\x2c\x4e\x5e\
+\x2c\x79\x31\x99\x0d\x87\x88\x5e\x0f\x00\x57\x66\x43\xd9\xec\xfd\
+\x88\x88\xbc\x5a\x6b\x7d\x47\x4e\x78\x56\x30\xa5\x0b\x85\x88\x5e\
+\x02\x00\x3f\xb4\xca\xba\xb3\xf1\xff\x05\x41\xb0\x6f\xa3\xd1\x58\
+\xd7\xd9\xd4\x5b\xb8\x60\x80\x88\x86\x01\xe0\x06\x00\x78\x56\x8e\
+\xf8\xa3\x83\x83\x83\xfb\x8f\x8e\x8e\x3e\x9e\x23\x66\x22\xa8\x2a\
+\x08\xc5\x88\xc4\x88\x25\xef\x71\x31\x33\x1f\x9b\x37\xa8\xc7\x4b\
+\xc6\x00\x11\xdd\x08\x00\x07\x25\xb3\x4e\x6e\x85\x88\x9f\x89\xa2\
+\xe8\xfd\xc9\x3d\xf2\xb1\x2c\x55\x28\x61\x18\xbe\x53\x44\xfe\x2d\
+\x9f\xa9\xcc\x44\x41\xc4\x57\x45\x51\x74\xbd\x2b\x7c\x8f\x3b\x3b\
+\x03\x39\xde\x97\xcc\x1a\x00\x11\x0f\x8e\xa2\xc8\x7c\x5b\x15\x36\
+\x4a\x15\x0a\x11\xdd\x09\x00\x23\xae\x66\x2b\x22\x97\x68\xad\x8f\
+\x71\x85\xef\x71\x67\x67\x80\x88\xcc\xcd\xfb\xe1\x0e\xf9\xf9\x3c\
+\x33\xbf\xd7\x21\xfe\x0c\xe8\x52\x84\x52\xaf\xd7\xf7\x8c\xe3\xf8\
+\x90\x3c\x9e\x72\x75\x20\xeb\x0f\xcc\xfc\xa4\x22\x09\xed\xf7\x58\
+\x44\xf4\x4c\x00\xf8\x1f\xc7\x3c\xac\x1f\x18\x18\x78\xc9\x3d\xf7\
+\xdc\xf3\xa0\xe3\x38\x9b\xe1\x0b\x13\x4a\xad\x56\x7b\x6a\x10\x04\
+\xaf\x02\x00\x23\x10\xf3\xef\x82\x82\x26\x59\xea\x63\xc5\x82\xe6\
+\x58\x99\x30\x4a\xa9\x37\x21\xe2\x57\x0b\x48\xe8\x62\x11\xf9\x7e\
+\x10\x04\x37\x44\x51\xf4\x5b\xd7\xf1\x9c\x0a\x65\xe9\xd2\xa5\x3b\
+\x2c\x5a\xb4\xe8\x10\x23\x10\x11\x31\x02\xd9\xc1\xf5\x84\x66\xc1\
+\x7f\x1b\x33\x5f\x56\x42\xdc\xbe\x0c\xa9\x94\xfa\x3c\x22\x9e\x50\
+\xe0\xe4\x1b\x6d\xc1\x5c\x1f\x45\xd1\xcd\xae\xe2\xe6\x2e\x94\x91\
+\x91\x91\x05\xe3\xe3\xe3\x53\xc2\x30\xdf\x1c\x4f\x75\x95\x7c\x42\
+\xdc\x93\x99\xf9\x53\x09\x6d\xbd\x59\x46\x06\x88\xe8\x26\x00\x78\
+\x79\x46\x98\x54\xee\x22\x72\x2b\x00\x5c\x0b\x00\x57\x69\xad\xd7\
+\xa7\x02\x99\xc3\x29\x37\xa1\x84\x61\x38\x22\x22\x47\xb5\x2f\xad\
+\xf6\xcc\x33\xc9\x8c\x58\xa7\x30\xf3\xb9\x19\x31\xbc\x7b\x42\x06\
+\x88\xe8\x4b\x00\xf0\xd6\x84\xe6\xae\xcc\xfe\x04\x00\x57\x9b\x4b\
+\xc0\x28\x8a\xcc\xd2\xa6\xcc\x23\xb3\x50\x8c\x40\xe2\x38\x7e\x27\
+\x22\xbe\x33\x73\x36\x0e\x00\xe2\x38\x3e\xa6\xd9\x6c\x5e\xe2\x00\
+\xda\x43\xce\xc2\x00\x11\x99\x3f\x4a\x27\x55\x88\x1c\xf3\x9e\x6e\
+\x75\xd6\xcb\xef\xd4\x42\x19\x1a\x1a\xda\x63\x60\x60\xe0\x03\x55\
+\x15\xc8\x54\xa1\xfc\xbb\x94\x62\x3f\xb2\xae\xdf\x8d\x65\x98\xcd\
+\x9d\x22\x72\xba\xd6\xda\x5c\x1a\x5a\x8f\x54\x42\xa9\xd5\x6a\x47\
+\x9b\x55\xbe\x88\xb8\x87\x75\xc4\x82\x1d\x82\x20\x78\x66\xa3\xd1\
+\x78\xa0\xe0\xb0\x7d\x1b\x4e\x29\xb5\x0f\x22\xfe\xb8\xc2\x04\x7c\
+\x90\x99\x3f\x6e\x9b\x9f\x95\x50\xda\xdf\x22\x46\x20\x47\xdb\x06\
+\x2a\xc9\x7e\x0d\x33\x3f\xbf\xa4\xd8\x7d\x19\xd6\xec\x3b\x59\xb8\
+\x70\xe1\x6f\xaa\x3c\x79\x44\xfc\x26\x00\x9c\x1a\x45\xd1\x7d\x49\
+\xf3\x4c\x2c\x14\xb3\x78\xd1\x2c\x37\x41\xc4\x65\x49\xc1\xcb\xb6\
+\x13\x91\xf3\xb5\xd6\x27\x96\x9d\x47\xbf\xc5\x0f\xc3\xf0\x93\x16\
+\x1b\xef\x4a\xa1\x47\x44\xee\x45\xc4\xe3\x92\xee\x73\x49\x24\x94\
+\xf6\x0a\xdf\xeb\x00\x60\xdb\x52\x66\x95\x22\xa8\x88\xdc\xdf\x6a\
+\xb5\xf6\x5f\xbb\x76\xed\xfd\x29\xdc\xbd\x4b\x06\x06\xda\xdf\x2a\
+\xe6\xf2\xcb\x7a\x03\x5e\x86\xb0\x69\x5c\xff\x68\x5e\x7e\x27\x11\
+\x4b\x47\xa1\x38\x5a\x06\x9f\x66\x52\x56\x3e\xfe\x69\x97\x15\x5d\
+\xb9\x1b\x9b\xfb\xd8\x20\x08\x56\xe7\x0e\xec\x06\x70\xff\x4e\x62\
+\x99\x57\x28\xed\x35\x59\x89\xaf\xe3\xdc\xcc\x21\x15\xea\xa7\x98\
+\xf9\xe4\x54\x9e\xde\x29\x37\x06\x94\x52\xab\xbb\xe5\x7e\x56\x44\
+\x76\xd1\x5a\x3f\x36\xd7\xe4\xe7\x14\x4a\xfb\xeb\xd3\x5c\xb6\x6c\
+\x97\x1b\x73\xb3\x03\x99\x4b\xba\xcb\x44\xe4\x23\x79\xdc\xff\xf8\
+\x15\xc3\x8e\xab\x65\x09\x4f\x44\x57\x03\xc0\xab\x2d\xdd\xca\x30\
+\x9f\xf7\xc1\xcf\xac\x42\x59\xba\x74\xe9\xa2\xc5\x8b\x17\x5f\x05\
+\x00\x07\x3b\xca\xf8\x2e\x11\xb9\x2c\x8e\xe3\xaf\x8f\x8d\x8d\x3d\
+\x34\x15\x23\xeb\xf2\xec\xb2\x36\xf5\x38\xe2\xa8\x67\x60\xc3\x30\
+\x3c\x4e\x44\xfe\x35\xc3\x84\x4e\x0a\x82\xe0\xb2\x56\xab\x75\x24\
+\x22\x1e\x09\x00\x7b\x67\xc0\x9a\xcf\xf5\xc3\x73\x75\x7d\x99\x55\
+\x28\x44\xf4\x45\x00\x78\x7b\xce\xc9\x18\x41\x5c\x6e\xd6\xe1\x30\
+\xf3\x4f\xe6\xc2\x36\xfb\xe7\xcd\x4b\x4c\x11\x79\xba\x45\xfc\x3b\
+\x11\xf1\xa3\x51\x14\x7d\xdb\xc2\xc7\x9b\x16\xc8\x00\x11\x99\x45\
+\xb1\x66\xf5\x86\xcd\xb7\xcb\x35\x00\xf0\x89\xad\x3f\x2f\x4a\xa9\
+\xe5\x88\x78\xa8\x88\x18\xe1\xe4\xfa\x14\x16\x11\xff\x2e\x8a\xa2\
+\xaf\x6c\x4d\xcd\x0c\xa1\xd4\xeb\xf5\xd7\xc4\x71\x9c\xcb\xfa\x98\
+\x76\xb0\xab\x10\xf1\xca\x0d\x1b\x36\x5c\x75\xff\xfd\xf7\x6f\x4c\
+\x52\x9b\xe1\xe1\xe1\xa7\x0d\x0c\x0c\x18\xb1\x1c\x88\x88\xfb\xcd\
+\xe3\x73\x93\x88\x7c\x49\x6b\x6d\x04\xe8\x47\x17\x30\xd0\x16\x8c\
+\xd9\xd4\x75\x00\x00\xec\x3e\x4b\xca\x66\x8f\xc9\x5d\x00\x70\x11\
+\x33\x9b\x05\x8e\xf3\x8e\x30\x0c\xcd\x55\xcf\xa1\x71\x1c\xbf\x0e\
+\x11\x97\x74\xb2\x4f\xf0\x7b\x8e\xe3\x78\x65\xb3\xd9\xfc\xfd\x74\
+\xdb\x19\x42\x21\x22\xf3\x58\x6f\x9f\x04\x80\xf3\x9a\x20\xe2\xa5\
+\x71\x1c\x5f\x90\xb5\x6b\xc6\x5e\x7b\xed\xb5\xe3\xc4\xc4\xc4\xde\
+\xa6\x9b\x60\x1c\xc7\xbb\x22\xe2\x02\x44\xd4\x7f\xfe\xf3\x9f\x9b\
+\xfe\xd1\x6f\xd6\x2a\x95\xeb\x5f\xab\xd5\xf6\x0a\x82\x60\xc7\xa9\
+\x2c\xe2\x38\x5e\xdb\x6c\x36\x1f\x4e\x93\x95\xe9\x40\x19\xc7\xf1\
+\x2a\x00\x30\x3f\x03\x69\x30\xa6\x7c\x44\xe4\x0c\xad\xf5\xd9\x73\
+\x0a\x45\x29\x75\x0a\x22\x7e\x32\x4b\x10\xd3\x9e\x46\x44\x8c\x40\
+\xf2\xee\xac\x92\x31\x2d\xef\xde\x0f\x0c\x28\xa5\xcc\xfd\xcb\xaa\
+\xf6\xbd\x4c\xda\x29\x3f\xda\x6a\xb5\x56\x8e\x8d\x8d\xfd\x62\x0a\
+\x60\xf3\x37\x4a\xad\x56\x7b\x52\x10\x04\x9c\xb1\xbd\xcc\x11\xcc\
+\x9c\x47\xb3\xb3\xb4\x13\xf4\x7e\x9e\x81\x49\x06\x88\xe8\x08\x00\
+\xf8\x5a\x06\x3a\x2e\x64\xe6\xe3\x67\x08\x85\x88\x4c\x6b\x9f\xff\
+\xc8\x00\x7c\xac\xef\xff\x9b\x81\x3d\xef\x9a\x3b\x03\x61\x18\x9e\
+\x20\x22\x9f\x4f\x09\xfc\xfb\x38\x8e\x55\xb3\xd9\x9c\xdc\xff\xbf\
+\xf9\x1b\x85\x88\x4c\xf7\xf0\x97\xa6\x04\x5d\xc5\xcc\x9f\x4d\xe9\
+\xeb\xdd\x3c\x03\xce\x18\x50\x4a\x99\xf7\x73\x67\xa4\x09\x20\x22\
+\x27\x6a\xad\xcf\xdf\x2c\x94\x30\x0c\x5f\x2c\x22\x3f\x4a\x09\x36\
+\xe3\xc6\x27\x0d\x8e\xf7\xf1\x0c\xb8\x62\x20\x0c\xc3\x8b\x44\xe4\
+\xef\x53\xe0\xdf\xc6\xcc\xfb\x6e\x16\x8a\x52\xea\x3c\x44\x4c\xd3\
+\x7d\xef\xa7\xcc\xbc\x32\x45\x02\xde\xc5\x33\x50\x28\x03\x61\x18\
+\x9a\x97\xdc\x2b\x6c\x83\x8a\xc8\x01\xe6\xc1\xd4\xe4\xa5\x17\x11\
+\x99\x17\x80\x69\x3e\xf0\x6f\x65\xe6\x2f\xdb\x06\xf7\xf6\x9e\x81\
+\xa2\x19\xc8\x70\xbf\xf2\x59\x66\x5e\x85\xa6\xa5\xd0\xe2\xc5\x8b\
+\x9f\x48\x91\xb8\x39\x15\xe9\x65\x29\xfc\xbc\x8b\x67\xa0\x70\x06\
+\xea\xf5\xfa\x76\xad\x56\xeb\xae\x14\x6f\xf2\x1b\xcc\xbc\x1c\x95\
+\x52\x07\x21\xa2\x69\xa8\x6c\x35\x10\xf1\x75\x7e\xc9\x88\x15\x65\
+\xde\xb8\x64\x06\xc2\x30\x3c\x55\x44\x3e\x61\x9b\x06\x22\x0e\x63\
+\xca\xb3\x49\x7e\xc9\xcc\x4b\x6d\x03\x7a\x7b\xcf\x40\x99\x0c\xd4\
+\xeb\xf5\x5d\xe3\x38\x36\xcb\x63\x9e\x61\x93\x87\x88\x9c\x60\x84\
+\x92\x66\x01\xe4\xb7\x98\xd9\x1c\x12\xe3\x87\x67\xa0\xab\x18\x50\
+\x4a\x5d\x81\x88\x87\x59\x26\xfd\x2d\x23\x94\x34\xef\x4f\xe6\x5c\
+\x8e\x6c\x99\x80\x37\xf7\x0c\x14\xca\x00\x11\x9d\x03\x00\xb6\x9b\
+\xfa\xee\x30\xf7\x28\xeb\x6c\x6f\x70\x44\xe4\x15\x69\xfb\x23\x15\
+\xca\x8a\x0f\xe6\x19\xd8\x8a\x01\x22\xfa\x07\x00\xb8\xd0\x92\x98\
+\x75\xe6\x1b\xc5\xb4\x9f\x5c\x6c\xe3\xb8\x71\xe3\xc6\x27\xaf\x5f\
+\xbf\xfe\x77\x36\x3e\xde\xd6\x33\x50\x05\x06\xea\xf5\xfa\x81\x71\
+\x1c\xdb\x36\xf3\x7e\xc8\x08\x45\x6c\x27\xc0\xcc\x1d\x9b\x52\xd8\
+\x62\xf6\xba\x3d\x11\x99\x63\xa0\xcd\xf2\x6f\xf3\x33\x38\xf5\x2f\
+\x22\x0e\x88\xc8\xd4\xff\x9f\xfc\xdd\x56\xff\x6d\xf2\x77\x5b\xfd\
+\xb7\xd3\xd3\x34\x71\xeb\x75\x8e\x93\xcc\x2f\xe5\xf9\x2d\x7f\xf0\
+\x42\x49\xc2\x6e\x46\x9b\x94\x7f\xc5\xe6\x8b\xba\x81\x99\xcb\x38\
+\x42\x23\x23\x13\xd5\x70\x4f\xf3\xe5\xe0\x85\x52\x40\xed\x5c\x1c\
+\xfc\x29\x22\x47\x6b\xad\x2f\x2d\x20\xfd\x9e\x0b\xe1\x85\x52\xc1\
+\x92\xb6\xb7\x35\xff\xaf\x83\xd4\xd6\x31\xf3\x90\x03\xdc\x9e\x87\
+\xf4\x42\xa9\x60\x89\x33\x2c\x38\xed\x38\x1b\x44\x7c\x99\xcb\x53\
+\xa6\x3a\x26\xd0\xa5\x06\x5e\x28\x15\x2c\x5c\x9a\xa2\x24\x9d\x06\
+\x22\xfe\x20\x8a\xa2\x03\x93\xda\x7b\xbb\xbf\x30\x90\xa6\x26\xfe\
+\x1e\xc5\xe1\xa7\x47\x29\xf5\x0e\x44\xfc\x77\x87\x21\x40\x44\x94\
+\xd6\xba\xe9\x32\x46\xaf\x61\x7b\xa1\x54\xac\xa2\x69\x5e\xe6\xa6\
+\x98\xc2\x97\x99\xb9\xec\xa3\xe0\x52\xa4\x5d\x9e\x8b\x17\x4a\x79\
+\xdc\xcf\x88\x4c\x44\x7f\x03\x00\xb7\x15\x91\xd2\xe0\xe0\xe0\x4e\
+\xa3\xa3\xa3\x8f\x17\x11\xab\x17\x62\x78\xa1\x54\xa8\x8a\x44\xf4\
+\x2d\xd3\x98\xad\x88\x94\x10\xf1\x9c\x28\x8a\x4e\x2d\x22\x56\x2f\
+\xc4\xf0\x42\xa9\x48\x15\xdb\x4d\xfb\x7e\x5b\x64\x3a\x7e\xb5\x44\
+\x72\xb6\xbd\x50\x92\x73\xe5\xd4\x92\x88\x3e\x0a\x00\x1f\x74\x1a\
+\x64\x26\xf8\xfb\x98\xf9\x73\x05\xc7\xec\xca\x70\x5e\x28\x15\x29\
+\x5b\x9a\x85\xa6\x39\xa4\xfe\x30\x33\x3f\x2d\x07\x9c\x9e\x87\xf0\
+\x42\xa9\x40\x89\xc3\x30\x7c\x8b\x88\x94\xd2\x70\x23\x08\x82\xc3\
+\x1b\x8d\x86\x39\xc8\xd3\x8f\x79\x18\xf0\x42\xa9\xc0\xc7\x83\x88\
+\x46\x01\x60\x79\x49\xa9\xdc\xc5\xcc\x23\x25\xc5\xee\x9a\xb0\x5e\
+\x28\x25\x97\xaa\x56\xab\xad\x08\x82\xc0\xec\xc9\x2e\x73\xec\x33\
+\xdf\xf9\x33\x65\x26\x56\x95\xd8\x5e\x28\x25\x57\x22\x0c\xc3\xcb\
+\x45\xe4\xcd\x25\xa7\x71\x2d\x33\xdb\x1c\xd6\x53\x72\xba\xc5\x87\
+\xf7\x42\x29\x9e\xf3\xcd\x11\xdb\xc7\xf9\x25\x3a\x28\xc9\x75\x9a\
+\x83\x83\x83\x7b\x8e\x8e\x8e\xfa\x63\xc3\xe7\x20\xda\x0b\xc5\xf5\
+\x27\x70\x1e\x7c\xa5\xd4\xe9\x88\x78\x56\x89\x29\x4c\x0f\xfd\x6f\
+\xcc\xfc\xae\x8a\xe4\x52\xb9\x34\xbc\x50\x4a\x2c\x09\x11\x3d\x0a\
+\x00\x3b\x97\x98\xc2\x16\xa1\x1f\x7f\xfc\xf1\x6d\x1f\x78\xe0\x01\
+\xd3\x0f\xc1\x8f\xad\x18\xf0\x42\x29\xe9\x23\x41\x44\xa6\xc7\xd9\
+\x95\x25\x85\x9f\x35\x2c\x22\x7e\x28\x8a\xa2\x8f\x54\x29\xa7\xaa\
+\xe4\xe2\x85\x52\x52\x25\x88\xe8\x76\x00\x78\x51\x49\xe1\xe7\x0a\
+\xbb\x91\x99\xb7\xa9\x58\x4e\x95\x48\xc7\x0b\xa5\x84\x32\x84\x61\
+\x38\x24\x22\x63\x25\x84\xee\x18\xd2\x9c\x09\xa2\xb5\xce\x72\x8a\
+\x5a\xc7\x18\xdd\x68\xe0\x85\x52\x42\xd5\x52\xb6\xa4\x2d\x2a\xd3\
+\xfb\x98\xf9\xd9\x45\x05\xeb\x96\x38\x5e\x28\x25\x54\x2a\x0d\xe9\
+\x45\xa6\x89\x88\xaf\x8a\xa2\xe8\xfa\x22\x63\x56\x3d\x56\x9a\x9a\
+\xf9\xad\xc0\x19\xaa\x4a\x44\xff\x08\x00\x9f\xca\x00\xe1\xdc\x15\
+\x11\x6f\x8d\xa2\xe8\xc5\xce\x03\x75\x51\x00\x2f\x94\x82\x8b\x45\
+\x44\xbf\x02\x80\xdd\x0b\x0e\x6b\x1d\x2e\x8e\xe3\x15\xcd\x66\xd3\
+\xac\x41\xf3\xc3\x37\x97\x28\xf6\x33\x10\x86\xe1\x2b\x45\xa4\x5b\
+\x2e\x69\xbe\xce\xcc\x6f\x2a\x96\xa1\xea\x46\xf3\xdf\x28\x05\xd6\
+\x86\x88\x7e\x00\x00\xfb\x17\x18\x32\x53\xa8\x56\xab\xf5\xf4\xb1\
+\xb1\xb1\x87\x32\x81\xf4\x88\xb3\x17\x4a\x41\x85\x1c\x1e\x1e\x7e\
+\xd6\xc0\xc0\x40\x57\xad\xa5\x12\x91\xf3\xb5\xd6\x27\x16\x44\x51\
+\xa5\xc3\x78\xa1\x14\x54\x9e\x30\x0c\xbf\x20\x22\xc7\x17\x14\x2e\
+\xb7\x30\xcc\x6c\xba\xe5\xc7\xb9\x01\x76\x29\x90\x17\x4a\x41\x85\
+\x23\x22\xf3\x61\xcb\xfd\xe8\x0b\x44\xfc\x66\x1c\xc7\xe3\x88\x78\
+\xa4\xa3\xa9\x9c\xcc\xcc\x95\x7e\x4a\xe7\x68\xde\x5b\xc0\x7a\xa1\
+\x14\xc0\xb2\x52\xea\xdd\x88\x78\x81\xa3\x50\x2f\x47\xc4\x71\x11\
+\x31\x67\xa9\xb8\x18\x8f\x31\xf3\x2e\x2e\x80\xbb\x09\xd3\x0b\xa5\
+\x80\x6a\x11\xd1\xbd\x00\xf0\x1c\x07\xa1\x46\x99\x79\x85\xc1\x55\
+\x4a\xdd\x8c\x88\x4e\x7a\x0a\x8b\xc8\x91\x5a\xeb\xaf\x3a\xc8\xbf\
+\x6b\x20\xbd\x50\x1c\x97\x8a\x88\x5e\x02\x00\x3f\x74\x14\xe6\xdd\
+\xcc\xfc\x2f\x06\x9b\x88\xde\x08\x00\x5f\x77\x14\x27\x62\xe6\xba\
+\x23\xec\xae\x80\xf5\x42\x71\x5c\x26\x22\xba\x0e\x00\x0e\x76\x10\
+\xe6\xf7\xcc\xbc\x23\x00\xb4\xa6\xb0\x89\x28\x32\x9a\x71\x10\xcb\
+\x34\xf6\x3e\x40\x6b\xed\x4a\xf0\x2e\x52\xce\x15\xd3\x0b\x25\x57\
+\x3a\xb7\x04\xab\xd7\xeb\xbb\xc6\x71\xfc\x88\x8b\x10\x22\x72\x9e\
+\xd6\xda\x2c\x87\xd9\x3c\x88\xe8\x3d\x00\xe0\xaa\xa1\xdd\x4d\xcc\
+\xfc\x0a\x17\x73\xe9\x06\x4c\x2f\x14\x87\x55\x22\xa2\x73\x01\xe0\
+\x24\x17\x21\x82\x20\x18\x6a\x34\x1a\xeb\xa6\x63\x8f\x8c\x8c\x2c\
+\xd8\xb4\x69\xd3\x83\x00\xf0\x14\x17\x31\x01\xa0\xc6\xcc\x95\xdc\
+\x1e\xe0\x68\xbe\xd3\xff\x08\x59\x1f\xf0\xeb\x17\x45\x26\xac\x0a\
+\x11\xfd\x1e\x00\xb6\x4b\x68\x9e\xd8\x0c\x11\xaf\x8e\xa2\xe8\xb5\
+\xb3\x39\x10\xd1\xd9\x00\x70\x5a\x62\x30\x3b\xc3\xd5\xcc\xfc\x76\
+\x3b\x97\xde\xb0\xf6\xdf\x28\x8e\xea\x18\x86\xe1\x31\x22\x72\xb1\
+\x23\xf8\x43\x98\xd9\xdc\xfb\xcc\x18\x29\x8f\x7a\x4e\x9c\xa6\x88\
+\xec\xa2\xb5\x7e\x2c\xb1\x43\x8f\x18\x7a\xa1\x38\x2a\xa4\xc3\xee\
+\x8f\x4d\x66\x56\xf3\xa5\x4d\x44\xe6\xc4\xae\x77\xb8\x98\x1a\x22\
+\x9e\x1d\x45\xd1\x19\x2e\xb0\xab\x8c\xe9\x85\xe2\xa0\x3a\xf5\x7a\
+\xfd\x45\x71\x1c\x9b\x3d\xf1\x2e\xc6\x2a\x66\xfe\x6c\x07\xa1\x3c\
+\x1f\x00\xee\x70\x11\x1c\x11\x5b\x51\x14\x0d\xba\xc0\xae\x32\xa6\
+\x17\x8a\x83\xea\x84\x61\x78\x85\x88\x1c\xe6\x00\x7a\x7c\xfb\xed\
+\xb7\xdf\xf1\xf6\xdb\x6f\xef\xd8\x52\x88\x88\xae\x06\x00\x57\xdd\
+\x1f\x37\xbf\xbf\x71\x30\xc7\x4a\x42\x7a\xa1\xe4\x5c\x96\xa5\x4b\
+\x97\xee\xb0\x78\xf1\xe2\x27\x72\x86\x9d\x84\x13\x91\x2f\x68\xad\
+\xcd\x23\xe0\x8e\x83\x88\x0e\x01\x80\x6b\x3a\x1a\xa6\x33\xf8\x15\
+\x33\xff\x55\x3a\xd7\xee\xf4\xf2\x42\xc9\xb9\x6e\x4a\xa9\xb3\x10\
+\xf1\xf4\x9c\x61\x27\xe1\x10\xb1\x1e\x45\x91\x79\xa9\x98\x68\x10\
+\xd1\xcf\x00\xe0\x05\x89\x8c\xed\x8d\x5e\xcf\xcc\xe6\x28\xbd\xbe\
+\x18\x5e\x28\x39\x97\x59\x29\xf5\x1b\x44\x5c\x92\x33\xac\x11\xc9\
+\x8d\x51\x14\xbd\xd2\x06\x97\x88\x8e\x05\x00\x27\xad\x87\x44\xe4\
+\x67\x5a\xeb\xaa\xf5\x25\xb3\xa1\xc7\xca\xd6\x0b\xc5\x8a\xae\xf9\
+\x8d\x95\x52\x6f\x46\xc4\xcb\x73\x84\x9c\x0e\xf5\x06\x66\xbe\xca\
+\x16\x9b\x88\xcc\x66\xb1\x67\xd9\xfa\x25\xb1\x47\xc4\xbf\x89\xa2\
+\xc8\xd5\x43\x8b\x24\x29\x14\x66\xe3\x85\x92\x23\xd5\x44\xf4\x13\
+\x00\x58\x99\x23\xe4\x14\xd4\x7a\x66\x4e\xb5\xfa\x98\x88\xcc\xb9\
+\x90\xe6\x7c\x48\x17\xe3\x2a\x66\x7e\x83\x0b\xe0\xaa\x61\x7a\xa1\
+\xe4\x54\x11\xa5\xd4\x72\x44\x74\xd2\xb5\x44\x44\x4e\xd5\x5a\x9f\
+\x93\x26\xd5\xf6\xc3\x05\xb3\xde\x6c\x71\x1a\xff\x4e\x3e\x88\xf8\
+\xec\x28\x8a\xee\xeb\x64\xd7\xed\xbf\xf7\x42\xc9\xa9\x82\x44\x74\
+\x29\x00\xbc\x2d\x27\xb8\xe9\x30\x32\x38\x38\xb8\xf3\xe8\xe8\xe8\
+\xe3\x69\xb1\x89\xc8\xbc\x77\x79\x6f\x5a\xff\xf9\xfc\x6c\x9e\xc4\
+\xb9\x88\x5f\x14\xa6\x17\x4a\x0e\x4c\xb7\x17\x23\x8e\xe7\x00\x35\
+\x03\x42\x44\x2e\xd2\x5a\x1f\x97\x05\x7b\xf9\xf2\xe5\xcb\x5a\xad\
+\xd6\x16\x0b\x28\xb3\xe0\x6d\xed\xbb\x68\xd1\xa2\xed\xd6\xac\x59\
+\xf3\xc7\x3c\x31\xab\x86\xe5\x85\x92\x43\x45\x1c\xdf\x07\xec\xcd\
+\xcc\x77\x66\x4d\x93\x88\xcc\xa6\x2e\xb3\xb9\xcb\xc5\xf8\x20\x33\
+\x7f\xdc\x05\x70\x55\x30\xbd\x50\x72\xa8\x04\x11\xfd\x37\x00\xe4\
+\xfe\x02\x0e\x11\x7f\x10\x45\x51\x2e\xdb\x7b\xc3\x30\x7c\xb1\x88\
+\xfc\x28\x87\xe9\xce\x06\xb1\x81\x99\x77\x70\x84\x5d\x09\x58\x2f\
+\x94\x8c\x65\x08\xc3\xf0\x50\x11\x71\xf2\xe2\xcd\x1c\x82\xaa\xb5\
+\xfe\x5a\xc6\x14\x37\xbb\x13\x91\x69\x40\xf1\xb7\x79\xe1\x4d\xc7\
+\x41\xc4\xb7\x47\x51\xb4\xda\x05\x76\x15\x30\xbd\x50\x32\x56\xc1\
+\x61\x53\x87\xff\x66\xe6\x3d\x32\xa6\xb7\x85\xbb\xe3\x7d\xf5\xeb\
+\x98\x79\x28\xcf\x7c\xab\x84\xe5\x85\x92\xa1\x1a\x43\x43\x43\xcb\
+\x06\x07\x07\x9d\xdc\x24\x8b\xc8\x19\x5a\x6b\xb3\x09\x2b\xd7\x41\
+\x44\x66\x87\xa2\x93\x0f\x34\x22\x1e\x1c\x45\xd1\x0d\xb9\x26\x5c\
+\x11\x30\x2f\x94\x0c\x85\x20\xa2\x7f\x05\x80\x4c\x4f\xa4\xe6\x0a\
+\x1f\x04\xc1\x6e\x8d\x46\xe3\xd7\x19\xd2\x9b\xd5\x95\x88\xcc\x63\
+\xe2\x79\x97\xe9\xa7\x8d\x99\xe7\x3d\x55\xda\x1c\x5c\xf9\x79\xa1\
+\x64\x60\x96\x88\x26\x00\xc0\xb4\x1c\xcd\x75\x88\xc8\x25\x5a\xeb\
+\x63\x72\x05\x9d\x06\x46\x44\x66\x87\xe2\x4e\x2e\xf0\x83\x20\x18\
+\x69\x34\x1a\x77\xb9\xc0\x2e\x13\xd3\x0b\x25\x25\xfb\x4a\xa9\xf7\
+\x23\xe2\x79\x29\xdd\x3b\xb9\xed\xc3\xcc\x66\x39\x8c\x93\x41\x44\
+\x66\x49\x8b\x59\xda\xe2\x62\x7c\x99\x99\xdf\xea\x02\xb8\x4c\x4c\
+\x2f\x94\x94\xec\x3b\xbc\xd6\xff\x31\x33\xef\x97\x32\xad\x44\x6e\
+\xb5\x5a\xed\xa9\x41\x10\x38\x3b\xce\x61\x60\x60\x60\xf7\x7b\xee\
+\xb9\xc7\x74\x83\xe9\x99\xe1\x85\x92\xa2\x94\x4a\xa9\x83\xcc\xb2\
+\xf7\x14\xae\x1d\x5d\x44\xe4\x28\xad\xf5\x97\x3a\x1a\x66\x34\x70\
+\x79\xe0\x2a\x22\x9e\x13\x45\xd1\xa9\x19\x53\xac\x94\xbb\x17\x4a\
+\x8a\x72\x38\xdc\x66\xfb\x10\x33\x3f\x3d\x45\x4a\xd6\x2e\xb5\x5a\
+\x6d\xaf\x20\x08\xee\xb6\x76\x4c\xe8\xc0\xcc\x66\x5f\xfd\xe6\x2e\
+\x96\x09\xdd\x2a\x6b\xe6\x85\x62\x59\x1a\x97\xed\x80\x44\xe4\x23\
+\x5a\xeb\x0f\x59\xa6\x94\xda\xdc\x61\xbb\x57\xb3\x6d\xf9\x44\xad\
+\xf5\xf9\xa9\x93\xab\x98\xa3\x17\x8a\x65\x41\x94\x52\xe7\x21\xe2\
+\xfb\x2d\xdd\x12\x99\x07\x41\xf0\xcc\x46\xa3\xf1\x40\x22\xe3\x1c\
+\x8c\x5c\x5e\x42\x02\xc0\xc3\xcc\xfc\xb4\x1c\xd2\xac\x04\x84\x17\
+\x8a\x65\x19\x88\xe8\x77\x00\xb0\xbd\xa5\x5b\x47\x73\x11\xb9\x5c\
+\x6b\xfd\x96\x8e\x86\x39\x1b\x10\xd1\x1a\x00\x78\x5e\xce\xb0\x93\
+\x70\x22\xf2\x16\xad\xb5\xab\x1d\x9f\x2e\x52\x9e\x13\xd3\x0b\xc5\
+\x82\x6e\x22\x7a\x17\x00\x4c\x1e\xb3\xe0\x60\xec\xcf\xcc\xae\x0e\
+\x03\x9a\x33\x5d\xa5\xd4\x51\x88\x78\x89\x83\xf9\x18\xc8\xbb\x98\
+\x79\xc4\x11\x76\xa1\xb0\x5e\x28\x16\x74\xbb\xfa\xeb\x8b\x88\x3f\
+\x8b\xa2\xa8\xb4\x46\x0d\x44\x64\x2e\xf7\x9e\x61\x41\x45\x62\x53\
+\x11\x39\x50\x6b\x6d\x4e\x43\xee\xea\xe1\x85\x92\xb0\x7c\x8e\x97\
+\xa9\xbf\x83\x99\xbf\x98\x30\x95\xdc\xcd\xc2\x30\x3c\x55\x44\x3e\
+\x91\x3b\xf0\x5f\x00\xaf\x65\x66\x57\x8d\xf8\x1c\xa5\x3c\x13\xd6\
+\x0b\x25\x21\xd5\x0e\x37\x3e\x3d\xca\xcc\xb9\xb7\x37\x4a\x38\xad\
+\x49\xb3\x91\x91\x91\x6d\x37\x6d\xda\x64\xee\xbd\x72\x5f\x8e\x63\
+\xf0\xe3\x38\xa6\x66\xb3\xa9\x6d\x72\xaa\x9a\xad\x17\x4a\x82\x8a\
+\x2c\x5b\xb6\x6c\xc9\xc2\x85\x0b\x7f\x93\xc0\xd4\xda\xc4\xfc\x25\
+\xd7\x5a\x7f\xc0\xda\x31\x67\x87\x30\x0c\xcf\x17\x91\x55\x39\xc3\
+\x4e\xc2\xe5\xb1\x9d\xd9\x45\x5e\x36\x98\x5e\x28\x09\xd8\x72\x7c\
+\xe6\xc8\xfe\x09\x52\x28\xca\xc4\xd9\xd1\x73\x13\x13\x13\x4b\xd6\
+\xae\x5d\xfb\x68\x51\x13\xc9\x3b\x8e\x17\x4a\x02\x46\x89\xe8\x61\
+\x00\xd8\x2d\x81\xa9\x37\x99\x83\x81\xa2\x5f\xa6\xe6\x5d\x08\x2f\
+\x94\x0e\x8c\x3a\x7e\x7c\x9a\x77\x3d\xab\x8c\xb7\x91\x99\xb7\xa9\
+\x72\x82\xf3\xe5\xe6\x85\xd2\xa1\x72\x44\x74\x2b\x00\xec\xdb\xad\
+\x05\xae\x52\xde\x22\x72\xbc\xd6\xfa\xc2\x2a\xe5\x94\x34\x17\x2f\
+\x94\x79\x98\x52\x4a\xed\x8d\x88\x3f\x4f\x4a\xa6\xb7\xeb\xc8\xc0\
+\x7d\xcc\xfc\xec\x8e\x56\x15\x34\xf0\x42\x99\x5f\x28\xab\x11\xf1\
+\xe8\x0a\xd6\xad\x9b\x53\x4a\xd5\x6c\xbc\xec\x09\x7b\xa1\xcc\x51\
+\x81\x7a\xbd\xbe\x5d\x1c\xc7\xe6\x54\x5f\x3f\x72\x64\x00\x11\x6f\
+\x8d\xa2\xe8\xc5\x39\x42\x16\x02\xe5\x85\x32\x07\xcd\x8e\xbb\x3f\
+\x16\x52\xdc\xaa\x06\x11\x91\x7d\xb5\xd6\xb7\x55\x35\xbf\xd9\xf2\
+\xf2\x42\x99\x5b\x28\xa6\x43\xfb\x9e\xdd\x54\xcc\x2e\xca\xf5\x1b\
+\xcc\x7c\x44\x17\xe5\x0b\x5e\x28\xb3\x54\xcb\x71\xa3\xb8\x6e\xfa\
+\x7c\xb8\xcc\x75\x29\x33\xff\xd2\x65\x80\x3c\xb1\xbd\x50\x66\x17\
+\xca\x77\x01\xe0\x65\x79\x12\xed\xb1\x66\x30\xf0\x39\x66\x7e\x5f\
+\xb7\xf0\xe2\x85\xb2\x55\xa5\xea\xf5\x3a\xc5\x71\x9c\xf8\x40\xd1\
+\x6e\x29\x74\x15\xf3\x8c\xe3\x78\xfb\x66\xb3\xd9\x15\x0f\x4c\xbc\
+\x50\xb6\xfa\x04\x11\xd1\x05\x00\xf0\xee\x2a\x7e\xb0\x7a\x30\xa7\
+\xd3\x98\xf9\x63\xdd\x30\x2f\x2f\x94\x2d\xab\x14\x10\xd1\x9f\x00\
+\x60\x61\x37\x14\xaf\x07\x72\x7c\x8c\x99\x77\xe9\x86\x79\x78\xa1\
+\x4c\xab\x92\x52\x6a\x15\x22\xf6\x4c\xe7\x90\x6e\xf8\x00\x02\xc0\
+\xb1\xcc\x7c\x71\xd5\x73\xf5\x42\x99\x56\xa1\x30\x0c\x59\x44\x54\
+\xd5\x8b\xd6\x63\xf9\x45\xcc\x5c\xaf\xfa\x9c\xbc\x50\xda\x15\x22\
+\xa2\x43\x00\xe0\x9a\xaa\x17\xac\x47\xf3\x3b\x84\x99\xaf\xab\xf2\
+\xdc\xbc\x50\xda\xd5\x51\x4a\x7d\x1b\x11\x5f\x5b\xe5\x62\xf5\x70\
+\x6e\xdf\x65\xe6\x83\xaa\x3c\x3f\x2f\x14\x00\xf3\xd6\xd5\xac\x68\
+\x5d\x5f\xe5\x42\xf5\x41\x6e\xb9\x1c\xea\xea\x8a\x27\x2f\x94\xbf\
+\x08\xe5\x5c\x00\x38\xc9\x15\xc9\x1e\x37\x11\x03\x5f\x62\xe6\xa3\
+\x12\x59\x96\x60\xe4\x85\xf2\x17\xa1\xfc\x16\x00\x76\x2c\x81\x7f\
+\x1f\x72\x1a\x03\x45\xb7\x94\xb5\x21\xbf\xef\x85\x12\x86\xe1\x71\
+\x22\x62\x8e\x98\x73\x31\x0a\xef\xfc\xe8\x62\x12\x5b\x61\xfe\xb5\
+\x8b\xa3\xc2\xdb\x31\xce\x65\xe6\x53\x0a\x98\x83\x75\x88\xbe\x17\
+\x0a\x11\xdd\x01\x00\xcf\xb7\x66\xae\xb3\xc3\x38\x33\x2f\xea\x6c\
+\xd6\x5d\x16\x2e\xdb\xca\x22\x62\x6b\xe1\xc2\x85\xdb\xac\x59\xb3\
+\xe6\xcf\x55\x63\xa5\xaf\x85\xa2\x94\x3a\x00\x11\xbf\xef\xa8\x28\
+\x1f\x63\xe6\xd3\x1c\x61\x97\x0a\x4b\x44\xe6\xdc\x93\xc0\x51\x12\
+\x27\x31\xf3\xa7\x1d\x61\xa7\x86\xed\x6b\xa1\x84\x61\x78\xb9\x88\
+\xbc\x39\x35\x7b\xf3\x38\x22\xe2\xce\x51\x14\x99\x7b\x9f\x9e\x1b\
+\x8e\xfb\x9c\xfd\x8a\x99\xff\xaa\x6a\xa4\xf5\xad\x50\x96\x2f\x5f\
+\xfe\x8c\x56\xab\xe5\xea\x2c\x92\xeb\x98\xd9\xbc\xc0\xec\xc9\x51\
+\xab\xd5\x9e\x14\x04\xc1\x06\x57\x93\x43\xc4\xbf\x8b\xa2\xe8\x2b\
+\xae\xf0\xd3\xe0\xf6\xad\x50\x94\x52\x67\x22\xe2\x3f\xa7\x21\x2d\
+\x81\x4f\x29\x47\x38\x24\xc8\x2b\x37\x93\x30\x0c\x2f\x31\xe7\x4d\
+\xe6\x06\xb8\x25\xd0\xcf\x99\xf9\x85\x8e\xb0\x53\xc1\xf6\xad\x50\
+\xc2\x30\x7c\x50\x44\x5c\x9c\x97\x58\xc9\x4b\x87\x54\x9f\x8e\x79\
+\x9c\xc2\x30\x1c\x12\x91\xb1\xbc\x71\xa7\xf0\x10\xf1\x65\x51\x14\
+\xdd\xec\x0a\xdf\x16\xb7\x2f\x85\x42\x44\xe6\x1c\x74\x57\x27\xef\
+\xbe\x8f\x99\x3f\x67\x5b\x88\x6e\xb4\x57\x4a\xdd\x8c\x88\x07\x3a\
+\xca\xfd\x1a\x66\x7e\x8d\x23\x6c\x6b\xd8\x7e\x15\xca\x8f\x00\xc0\
+\x49\xcb\x1c\x66\x46\xeb\x2a\x74\xa9\x43\x18\x86\x2f\x15\x91\xef\
+\xb9\x4a\x3f\x08\x82\xb0\xd1\x68\xb0\x2b\x7c\x1b\xdc\xbe\x13\x4a\
+\xbd\x5e\x7f\x51\x1c\xc7\xb7\xdb\x90\x64\x61\xfb\x45\x66\x7e\x87\
+\x85\x7d\xd7\x9b\x12\xd1\x5a\x00\x78\xae\x8b\x89\x20\xe2\xbf\x47\
+\x51\xf4\x4e\x17\xd8\xb6\x98\x7d\x27\x14\x22\xfa\x0f\xb3\x59\xc8\
+\x96\xa8\x84\xf6\x35\x66\x76\x76\xdd\x9e\x30\x87\x42\xcd\xc2\x30\
+\x3c\x5a\x44\x56\xbb\x0a\xba\x60\xc1\x82\x5d\xef\xbe\xfb\x6e\x27\
+\x67\xd3\xd8\xe4\xdc\x57\x42\x51\x4a\xed\x8c\x88\xae\xce\xe8\xb8\
+\x93\x99\xf7\xb6\x21\xbf\x57\x6c\x89\xc8\x34\x88\xd8\xce\xc5\x7c\
+\x10\xf1\xec\x28\x8a\xce\x70\x81\x6d\x83\xd9\x57\x42\x09\xc3\xf0\
+\x9f\x44\xe4\xe3\x36\x04\x59\xd8\xbe\x89\x99\xbf\x6e\x61\xdf\x33\
+\xa6\x4a\xa9\xd3\x11\xf1\x2c\x47\x13\xda\xc0\xcc\x3b\x38\xc2\x4e\
+\x0c\xdb\x57\x42\x21\x22\xb3\xe7\xc4\x45\x37\xf5\x9e\x5c\xd7\x95\
+\xf4\x53\x74\xf8\xe1\x87\x0f\x8c\x8d\x8d\x4d\x24\xb5\xb7\xb5\x13\
+\x91\x13\xb4\xd6\xa6\x3b\x4e\x69\xa3\x6f\x84\xa2\x94\x7a\x03\x22\
+\x7e\xd3\x11\xd3\x3d\xbb\xae\x2b\x29\x5f\x44\x64\x56\x60\x1f\x97\
+\xd4\xde\xc6\x4e\x44\xee\xd5\x5a\x3b\x79\x60\x90\x34\x8f\xbe\x11\
+\x4a\x18\x86\x37\x88\xc8\x2b\x92\x12\x63\x63\xd7\xcb\xeb\xba\x92\
+\xf2\x30\x34\x34\xb4\xc7\xe0\xe0\xe0\x7f\x25\xb5\xb7\xb5\x13\x91\
+\xc3\xb5\xd6\xae\xfe\xd0\x75\x4c\xa7\x2f\x84\x42\x44\xa6\xcb\xc7\
+\x3d\x1d\xd9\x48\x67\xd0\xd3\xeb\xba\x6c\x28\x21\xa2\x6b\x01\xe0\
+\x55\x36\x3e\x49\x6d\x45\xe4\x56\xad\xb5\x93\x77\x5f\x49\x72\xe8\
+\x17\xa1\x98\x37\xe5\xef\x49\x42\x48\x0a\x9b\x9e\x5f\xd7\x95\x94\
+\x93\x5a\xad\xb6\x6f\x10\x04\xe6\x28\x3f\x27\x23\x8e\xe3\xfd\x9a\
+\xcd\xe6\x8f\x9d\x80\x77\x00\xed\x79\xa1\xec\xbe\xfb\xee\xdb\xec\
+\xb4\xd3\x4e\x8f\x8a\x88\x8b\x83\x36\xfb\x62\x5d\x97\xcd\x07\x93\
+\x88\x46\x01\x60\xb9\x8d\x8f\x85\xed\x15\xcc\xfc\x46\x0b\xfb\xdc\
+\x4c\x7b\x5e\x28\x44\xf4\x5e\x00\xf8\x6c\x6e\x8c\x6d\x09\xd4\x37\
+\xeb\xba\x92\xf2\xa7\x94\x7a\x13\x22\x7e\x35\xa9\xbd\xad\x5d\xab\
+\xd5\x5a\x36\x36\x36\xf6\x0b\x5b\xbf\xac\xf6\xfd\x20\x94\x06\x00\
+\x84\x59\x89\x9a\xcd\xbf\x9f\xd6\x75\xd9\xf0\x47\x44\xff\x07\x00\
+\x4e\x7a\x0a\x8b\xc8\x17\xb4\xd6\xae\x2e\xa3\xe7\x9c\x66\x4f\x0b\
+\x25\x0c\xc3\x57\x8a\xc8\xf5\x36\x45\xb6\xb0\xed\xbb\x75\x5d\x49\
+\xb9\x21\x22\xd3\xfa\xc9\xb4\x80\x72\x32\x36\x6e\xdc\xf8\xe4\xf5\
+\xeb\xd7\xff\xce\x09\xf8\x1c\xa0\x3d\x2d\x14\x22\xba\x12\x00\x5e\
+\xef\x88\xd0\xbe\x5b\xd7\x65\xc3\x63\x9a\x0f\x96\x05\xfe\xe9\xcc\
+\xfc\x51\x0b\xfb\xcc\xa6\x69\xe6\x83\x69\x9c\x8a\xbe\x4c\x19\x1e\
+\x1e\x7e\xce\xc0\xc0\xc0\xbd\x99\x19\x9a\x1d\xa0\x6f\xd7\x75\x25\
+\xe5\x93\x88\x3e\x03\x00\xae\x4e\xd4\xfa\x35\x33\xef\x96\x34\x97\
+\x3c\xec\xd2\x7c\xe6\xbb\x42\x28\x61\x18\x7e\x52\x44\x4e\x06\x00\
+\xd3\x31\xc4\xea\xc7\xb4\xcd\x11\x91\xd6\xd4\xbf\x00\x10\x4f\xc3\
+\x30\xff\xfb\xc2\x7e\x5d\xd7\x95\xf4\x43\x47\x44\xe6\x83\xfc\xb5\
+\xa4\xf6\xb6\x76\x22\xf2\x15\xad\xb5\x59\x09\x5e\xc8\xe8\x59\xa1\
+\x14\xc2\x9e\x0f\xd2\x37\x0c\x78\xa1\xf4\x4d\xa9\xfd\x44\xb3\x30\
+\xe0\x85\x92\x85\x3d\xef\xdb\x17\x0c\xac\x5c\xb9\x72\x9b\x0d\x1b\
+\x36\xfc\xd1\x72\xb2\x13\x5d\x71\x8f\x62\x39\x29\x6f\xee\x19\x98\
+\x93\x01\xa5\xd4\x72\x44\x34\x2b\x0e\x6c\xc6\x63\x46\x28\x0f\x03\
+\x80\xd5\x53\x07\x44\x1c\x8e\xa2\xc8\xec\xaf\xf6\xc3\x33\xd0\x55\
+\x0c\x28\xa5\x0e\x43\xc4\x2b\x6c\x92\x16\x91\xfb\x8d\x50\x7e\x0e\
+\x00\x56\xdb\x5e\x4d\xb3\x34\xad\xb5\xab\x16\x41\x36\x73\xf0\xb6\
+\x9e\x01\x2b\x06\x88\xe8\x03\x00\x60\x7b\xcc\x77\xc3\x08\xc5\xec\
+\x0b\x78\x83\x4d\x34\x11\xb9\x40\x6b\x7d\x82\x8d\x8f\xb7\xf5\x0c\
+\x54\x81\x01\xa5\xd4\x6a\x44\x3c\xda\x32\x97\x1f\x63\x18\x86\xe7\
+\x89\xc8\xfb\x2d\x1d\x2b\xd7\x26\xd3\x32\x7f\x6f\xde\xa7\x0c\xa4\
+\x39\x1a\x44\x44\x3e\x81\x69\x57\x88\x8a\xc8\x0b\xb4\xd6\xe6\x3c\
+\x12\x3f\x3c\x03\x5d\xc1\x80\x52\xea\x28\x44\xbc\xc4\x36\x59\x11\
+\x39\x00\x87\x86\x86\x76\x19\x1c\x1c\x34\x2b\x44\xad\x06\x22\x5e\
+\x1a\x45\x91\xed\x57\x98\x55\x0c\x6f\xec\x19\xc8\x93\x01\x22\x4a\
+\xd3\x55\xf4\x89\x38\x8e\x77\x9d\x6c\x19\x9a\x76\x0f\xba\x51\x9a\
+\xd6\xfa\x87\x79\x4e\xc6\x63\x79\x06\x5c\x30\x50\xaf\xd7\x0f\x8b\
+\xe3\xd8\xea\x69\x57\x3b\x8f\x2b\x99\xf9\xb0\x49\xa1\x28\xa5\x4e\
+\x41\xc4\x4f\xa6\x48\x70\x12\x24\x85\x9f\x77\xf1\x0c\x14\xca\x80\
+\x52\xea\x7a\x44\x7c\xa5\x6d\x50\x11\x39\x5e\x6b\x7d\xe1\xa4\x50\
+\x88\xc8\x9c\x7b\x98\xea\x7e\xa3\xec\x8e\x1a\xb6\x13\xf7\xf6\xfd\
+\xc7\x00\x11\x99\x05\xb5\xe7\xa4\x98\xf9\x43\x13\x13\x13\xe1\xda\
+\xb5\x6b\x1f\xdd\xdc\xad\x9d\x88\xbe\x01\x00\x87\xa7\x00\xfb\x93\
+\x88\xbc\x5e\x6b\x7d\x63\x0a\x5f\xef\xe2\x19\x70\xca\x40\x96\x7e\
+\xca\x88\xf8\x99\x28\x8a\x26\x9f\x08\x6f\x16\x4a\xbd\x5e\x7f\x4d\
+\x1c\xc7\xdf\x49\x93\xb5\x88\x98\x87\x01\x87\x6a\xad\x6f\x4b\xe3\
+\xef\x7d\x3c\x03\x2e\x18\x50\x4a\x1d\x14\x04\xc1\x75\x22\x32\x90\
+\x06\x3f\x08\x82\x95\x8d\x46\xe3\xa7\x5b\x08\xa5\x7d\x09\x66\xda\
+\xc7\xec\x93\x06\xd4\xbc\xe6\x0f\x82\xe0\x35\x51\x14\x45\x69\xfc\
+\xbd\x8f\x67\x20\x4f\x06\xda\x6b\xba\x6e\xb2\x5d\x9e\x35\x2d\x87\
+\x2d\x0e\x3f\xda\xe2\xa0\x1c\x22\x7a\x3b\x00\x7c\x31\x43\xc2\x0f\
+\x9a\x8d\x50\x8b\x16\x2d\xba\x60\xcd\x9a\x35\x4f\x64\xc0\xd9\xc2\
+\xb5\xbd\x71\x68\x37\x11\x59\xb4\x78\xf1\xe2\x7b\xf3\xc4\xce\x2b\
+\x47\x8f\x63\xc7\xc0\xd2\xa5\x4b\x77\xd8\x76\xdb\x6d\x77\x89\xe3\
+\x78\xaa\x71\xc5\x23\x71\x1c\x3f\xd2\x6c\x36\xc7\xed\x90\x66\x58\
+\x0f\x10\xd1\x2a\x00\x30\x3f\xbb\xa7\xc5\x32\x9d\x48\xb5\xd6\x46\
+\x68\x93\x63\xc6\x89\x52\x4a\xa9\x6f\x23\xe2\x6b\xd3\x06\x68\xfb\
+\xad\x6b\xef\x1c\x34\xcd\x98\xcd\x8e\x44\xab\x61\xfe\x1a\x04\x41\
+\x70\x80\x88\xec\x0f\x00\xaf\xde\xda\x79\x72\x91\x1a\x62\x13\x00\
+\xd6\x07\x41\x70\x75\xa3\xd1\x70\x75\xbe\xbc\x55\xde\xde\xb8\x33\
+\x03\x44\x64\x4e\x58\x36\x07\x0a\xcd\xa8\x6b\xdb\xdb\x1c\x0c\x75\
+\x93\x88\xfc\x74\xfa\x07\xb5\x33\xf2\xe4\x6b\x8e\x23\x45\xc4\x08\
+\xc4\x6a\xed\xe2\xd6\xd8\xa6\x45\x53\x14\x45\x47\x4e\xff\xef\xb3\
+\x09\x65\x1f\x44\xcc\xab\x83\xdf\x5d\x22\x72\x2d\x22\xde\xc4\xcc\
+\x3f\x49\x32\x59\x22\x7a\x17\x00\x9c\x6d\xd9\x22\xe7\xd3\x22\xf2\
+\x31\xad\xf5\x63\x49\x62\x78\x9b\xe2\x19\x50\x4a\x99\x4b\xfa\x93\
+\x2d\xff\x08\x5f\x03\x00\x17\x31\xb3\x69\xef\x3a\xeb\x58\xb6\x6c\
+\xd9\x92\x05\x0b\x16\x1c\x61\xda\xbf\xa6\x79\xfc\x3b\x1b\xa8\x88\
+\xec\xbb\xf5\xfd\xf6\xac\x67\x14\xb6\xf7\xa8\x9f\x92\x27\x9d\x22\
+\x72\x37\x22\xde\x18\x04\xc1\xa5\x8d\x46\xc3\x7c\xe3\xcc\x18\x59\
+\x8e\x71\x46\x44\x0d\x00\x1f\xaf\xda\x99\xe6\x79\x72\xd8\xad\x58\
+\x39\x7c\x9e\x3e\xcc\xcc\x67\x4e\x9f\x7f\x7b\xe9\xd5\xa4\x40\x00\
+\x60\x41\x5e\xdc\xcc\x75\x84\xde\xac\x42\x19\x19\x19\xd9\x76\xd3\
+\xa6\x4d\xe6\x8d\xfb\x0b\xf2\x4a\x60\x2b\x1c\x46\xc4\x6f\x8c\x8f\
+\x8f\x7f\x66\xdd\xba\x75\x1b\xcc\xef\x32\x3c\x9e\xde\x02\x5a\x44\
+\x4e\xd4\x5a\x9f\xef\x28\x6f\x0f\x6b\xc9\x40\x5e\x75\x05\x80\x0f\
+\xb7\x5a\xad\x4b\x06\x06\x06\xcc\x89\x5d\x46\x20\x4f\xb2\x4c\x25\
+\x89\xf9\xda\xf1\xf1\xf1\xfd\xee\xbd\xf7\xde\x19\x4b\xba\xe6\x3c\
+\xf5\xb6\x56\xab\xad\x08\x82\xe0\xae\x24\xe8\x59\x6c\x44\x44\xb7\
+\xef\x37\xd2\xbc\xc3\x99\x2b\xf4\x11\xcc\x6c\xde\x0b\xf9\x51\x22\
+\x03\x39\x8a\xa4\x90\x59\xcc\x76\xc9\x35\x15\x78\xde\xe3\xa1\xd3\
+\xae\x2c\x2e\x64\x56\xf3\x07\xf9\x03\x22\x1e\x1c\x45\xd1\x7f\x56\
+\x20\x97\xbe\x4c\x21\xc3\xb2\xa8\xb2\xf8\x3a\x96\x99\x2f\x9e\x2b\
+\x78\xc7\x73\xd4\x89\xe8\x43\xe6\x6b\xaf\xac\xec\x33\xc4\x5d\x37\
+\x38\x38\xf8\xa2\xd1\xd1\xd1\xc7\x33\x60\x78\xd7\x14\x0c\xd4\xeb\
+\xf5\xe7\xc6\x71\x6c\x1e\x08\x2d\x49\xe1\x5e\x86\xcb\x69\xcc\x3c\
+\xef\xae\xc7\x8e\x42\x69\xdf\x3f\xbc\xdc\x3c\xb2\x2b\x63\x06\x59\
+\x62\x8a\xc8\x6b\xb5\xd6\x57\x67\xc1\xf0\xbe\xf6\x0c\x10\x91\xcb\
+\x33\x6c\xec\x13\x9a\xc7\x03\x11\x8f\x8b\xa2\xe8\xa2\x4e\xa0\x89\
+\x84\x62\x40\xc2\x30\x5c\x29\x22\x97\x02\xc0\x73\x3a\x81\x56\xe8\
+\xf7\x9f\x66\x66\xd3\x64\xda\x8f\x02\x19\x20\x22\x73\x94\xc3\xd2\
+\x02\x43\xa6\x0d\x75\x12\x33\x7f\x3a\x89\x73\x62\xa1\x18\xb0\xe1\
+\xe1\x61\x1a\x18\x18\x30\x47\x2b\x1f\x9a\x04\xbc\x02\x36\x77\x30\
+\xb3\xab\x27\x77\x15\x98\x5e\xf5\x52\x70\x7c\x74\x60\x9e\x13\x9e\
+\xf1\xc8\x79\x3e\x70\x2b\xa1\x4c\x01\x29\xa5\x56\x21\xa2\xb9\x77\
+\xd9\x31\xcf\xcc\x5d\x60\x0d\x0e\x0e\xee\xe4\xef\x53\x5c\x30\x3b\
+\x3b\x66\xad\x56\x3b\x3a\x08\x82\xd5\xc5\x45\xb4\x8e\x74\x0b\x00\
+\x9c\xc9\xcc\xe6\xdf\xc4\x23\x95\x50\x0c\x7a\xad\x56\xdb\x2b\x08\
+\x02\x23\x96\x4a\x7f\xbb\x94\x79\x56\x60\xe2\x2a\xf4\x90\x21\x11\
+\x99\x7d\x1f\x66\xff\x47\x15\x87\xd5\xb7\xc8\xf4\x09\xa4\x16\xca\
+\xb4\x6f\x17\xd3\x50\xec\x78\x00\x78\x49\x15\x99\x31\x67\x10\x32\
+\xb3\x39\xa9\xcb\x8f\x02\x18\x20\xa2\xeb\x00\xe0\xe0\x02\x42\x25\
+\x0d\x61\x0e\x29\xba\x24\x8e\xe3\xd5\xcd\x66\xd3\xb6\x43\xe4\xe6\
+\x18\x99\x85\x32\x85\x14\x86\xe1\x31\x00\x70\x9c\x88\xbc\x30\xe9\
+\x0c\x8a\xb0\x9b\x98\x98\xd8\x73\xed\xda\xb5\xf7\x17\x11\xcb\xc7\
+\x98\x5c\x61\x71\x15\x00\xbc\xae\x02\x5c\xac\x47\x44\x73\x54\xc5\
+\xea\x28\x8a\xee\xcb\x9a\x4f\x6e\x42\x99\x26\x98\x95\xe6\x2f\x8a\
+\x88\x98\xbf\x2a\xcf\xcb\x9a\x60\x56\x7f\x11\xd9\xc5\x2f\x96\xcc\
+\xca\x62\x72\x7f\x22\xfa\x17\x00\x30\x0b\x5b\xcb\x18\xff\x03\x00\
+\xe6\x1b\xed\xfa\x25\x4b\x96\xdc\x78\xcb\x2d\xb7\x4c\xe4\x95\x44\
+\xee\x42\x99\x9e\x58\xbd\x5e\xdf\xaf\xd5\x6a\x99\x55\x9d\x46\x34\
+\x4e\x0e\x29\xed\x44\xc4\xf0\xf0\xf0\xe0\x15\x57\x5c\x61\xbd\xd4\
+\xbf\x13\xae\xff\xfd\xec\x0c\x94\xf0\x82\xda\xf4\xce\x36\xe2\xf8\
+\xde\xc4\xc4\xc4\xcd\x66\x7f\xbb\x8b\xda\x38\x15\xca\xf4\x84\x95\
+\x52\x07\xb4\x05\x63\x44\x33\xec\x62\x32\x5b\x63\x8a\xc8\x77\xb4\
+\xd6\x95\x7e\xd8\x50\x04\x0f\x45\xc6\x50\x4a\x2d\x45\x44\xd7\x47\
+\x62\xff\x16\x00\x6e\x46\xc4\xef\x8b\xc8\xcd\xcc\xfc\x4b\xd7\x73\
+\x2c\x4c\x28\x5b\x89\xe6\xa0\xb6\x68\xcc\xb9\xf1\x2e\xc7\xab\xe7\
+\xdb\xcb\xe0\x32\x70\x3f\x63\xa7\x6d\x0d\x64\xc1\x59\xe1\x2f\x92\
+\x4b\x11\xca\xb4\xfb\x99\xb3\x44\xe4\x74\x0b\x82\x6c\x4c\xef\x63\
+\xe6\x67\xdb\x38\x78\xdb\x7c\x18\xc8\x61\x4b\x79\xa7\x44\xf6\xb7\
+\x7d\x0f\xd2\x09\xb0\xd3\xef\x4b\x15\x8a\x49\x8e\x88\xee\x01\x80\
+\x7a\xa7\x44\x53\xfc\xfe\x63\xcc\x7c\x5a\x0a\x3f\xef\x92\x03\x03\
+\x39\x6d\x29\x9f\x2d\x93\x6f\x33\x73\xe1\x4f\xd5\xaa\x20\x94\x67\
+\x02\x80\x79\x5a\x91\xdb\x30\xbb\x1d\xe3\x38\x7e\xa3\xd6\xda\xec\
+\xab\xf7\xa3\x04\x06\xcc\xd6\xdf\x1c\xb7\x94\x4f\xcd\xe0\xf1\x20\
+\x08\x9e\xdb\x68\x34\x7e\x5d\xf4\x94\x4a\x17\x8a\x99\x70\x18\x86\
+\x27\x88\xc8\xe7\xf3\x98\xbc\x17\x49\x1e\x2c\xe6\x83\x41\x44\x66\
+\x41\xea\xb9\xf9\xa0\x4d\xa2\xec\xcd\xcc\x77\xe6\x88\x97\x18\xaa\
+\x12\x42\x31\xd9\xd6\x6a\xb5\x17\x06\x41\x30\xd9\x6c\x2c\xed\xf0\
+\x22\x49\xcb\x9c\x3b\xbf\x9c\x1e\x17\x6f\x14\x91\x91\x32\xaf\x10\
+\x2a\x23\x14\x53\x2a\xa5\xd4\xce\x88\x68\xf6\x32\xbc\xc5\xb6\x74\
+\xe6\x51\x30\x00\x7c\xb0\x4c\x32\x6d\x73\xee\x17\x7b\xf3\x47\xd0\
+\xbc\x25\x47\xc4\x3d\x52\xcc\x79\x8d\x88\xbc\xad\xec\xba\x56\x4a\
+\x28\x53\x24\xb6\xff\x0a\x99\xbe\x4f\x23\x09\x88\xfd\x8a\x59\xad\
+\xea\x7b\x7b\x25\x60\xaa\x44\x93\xf6\x1f\x41\xb3\x45\xc3\xf4\x46\
+\x78\x4a\x82\x54\xd6\x20\xe2\x45\x49\x36\x55\x25\xc0\xca\x6c\x52\
+\x49\xa1\x4c\xcd\xaa\x56\xab\xbd\x20\x08\x02\xf3\xc2\xd0\x3c\xe5\
+\x78\x06\x00\x3c\x28\x22\x0f\x22\xa2\xe9\x48\xf9\xa0\xe9\x95\xdc\
+\x6c\x36\x7f\x96\x99\x05\x0f\x50\x18\x03\x2b\x56\xac\x78\xca\xf8\
+\xf8\xb8\x11\xcb\xde\x88\xa8\xcc\x55\x37\x00\x98\xee\x90\xe6\x0d\
+\xfb\x23\x00\x60\x96\xbf\xff\xa8\xe8\xc7\xbf\x9d\x08\xf8\x7f\xee\
+\x74\x9e\xef\xc9\x63\x4f\x81\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+\x00\x00\x09\x40\
+\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\x00\x57\x02\xf9\x87\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xaf\xc8\x37\x05\x8a\xe9\
+\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\x08\xd2\x49\x44\x41\x54\x78\xda\xed\
+\x99\x79\x70\x95\xd5\x19\x87\x9f\xf3\x6d\x77\xc9\xbe\x6f\x04\xb3\
+\x10\x43\x88\x44\xc4\x20\x8a\x20\xc5\x36\x18\x0a\x62\x15\xaa\x23\
+\xa8\x6d\xc5\x76\xb4\x5a\xa7\xa3\x4e\x3b\xb6\xce\xb4\x9d\xb1\x8e\
+\xfd\xc3\xa9\x8e\xb5\x55\x2b\x6e\x80\x20\x19\xb1\x08\x26\xb2\x88\
+\xa0\x20\xa2\x48\x58\x22\xa1\x2c\x22\x89\x82\x59\x09\x49\xee\xfe\
+\x7d\xdf\xe9\x31\x89\x93\xb1\xf8\x67\xb9\x89\x53\xde\x99\xdf\xdc\
+\x33\x73\xef\x9d\x79\x7e\xef\xf7\x9e\xf9\xde\xf3\x1e\x43\x4a\xc9\
+\x77\x39\x0c\xe0\xbc\x81\xf3\x06\xfe\x57\x06\xc4\xcd\x29\x7c\x6b\
+\x48\x94\x84\x92\x0e\xae\x18\x5c\xbb\xda\x80\x86\xd7\x02\xa4\x36\
+\x28\x47\xfc\xd7\xef\x07\xbf\x1f\x5a\x9f\xfd\xdf\xe1\xc8\x43\xf2\
+\x07\xe0\x72\x04\xcb\x60\x40\xed\x67\xe1\xec\xde\x3d\x2a\x9f\xc0\
+\x58\x5c\xb1\x1c\x87\x19\xe8\x12\x6c\xed\x62\x0c\xf7\x0e\x04\x3f\
+\x07\xb6\x8f\xf6\x12\xaa\xc4\x16\xaf\x5b\x1e\xb7\x6c\xec\xf5\xdd\
+\xb4\xf9\x63\x84\xf7\xfb\x88\x1d\x48\x1d\x8f\x64\x23\x9a\xbc\x17\
+\x78\x6e\xb4\x1a\x98\x4a\x4c\x5b\xa5\x99\x6e\xd1\xec\x25\x9f\xa3\
+\x55\x47\x38\xdd\xe6\xc5\x28\xe9\x20\x58\x14\x20\xd2\x90\xa7\x9c\
+\x68\x7f\x43\x97\x67\x80\xba\xd1\x66\x60\x0e\x51\xf1\x8c\x37\x25\
+\x56\x38\xfb\x17\xad\x8c\x9f\xd2\xcb\xc9\x3e\x3f\x09\xc2\x43\x58\
+\x97\xf8\x2e\xe9\x07\xb3\x95\x48\x7d\x81\x87\x90\xf1\x0c\xba\x6c\
+\x06\x9a\x46\x89\x01\x39\x9f\x88\xbe\x32\x31\x3b\xe2\x9f\x73\x57\
+\x2b\x45\x13\xfb\x09\x07\x0d\xd2\x4d\x9b\x7c\xbf\xe4\x84\xeb\xc3\
+\x13\x05\xaa\x02\xc8\x40\x1b\xd1\xfa\x31\x69\xe8\xf2\x69\xe0\x1a\
+\x20\x30\xd2\x06\x16\x13\xd5\x96\x26\xe7\x85\x3d\x73\xee\x6a\x61\
+\x6c\x45\x88\x88\x82\x97\x52\x43\x13\x50\x99\xd0\x47\x77\x2c\x91\
+\x5e\x69\x62\xc5\xfc\xb8\xea\x49\x38\xc7\x7b\x70\x9a\x53\xaf\xc4\
+\x74\x6f\x04\x5e\x18\x21\x03\x02\xe0\x37\x84\xb5\x87\xb3\x4a\x02\
+\xe6\xbc\x7b\x5a\x49\xcf\x8b\x0e\xc1\x0b\x40\xe0\x48\x48\xd4\xa3\
+\xcc\xcf\x29\xa1\xbe\xa3\x93\xce\x40\x17\x96\x6e\xe1\x4c\xeb\x21\
+\x70\x2c\x09\x5c\x6d\xf1\x08\x1a\xe0\x41\x82\xfa\x23\xf9\x13\xfa\
+\x98\x7b\x67\x2b\xc9\x99\x36\xb1\xb0\xf1\xb5\x31\x24\x2e\xae\x94\
+\x94\x25\x5e\x4d\x55\x4a\x0d\x53\xd2\x74\x1e\x3f\xb6\x82\x23\x7d\
+\x2d\x58\xf9\x31\x42\xc9\x36\x6e\xb7\x35\x69\x24\xf6\x80\x8e\xe4\
+\x51\xa2\xe2\x81\xe2\xcb\x7a\xa8\xb9\xf5\x24\x49\xe9\x0a\x3e\x32\
+\x0c\xaf\xd0\xd1\x30\xa9\x48\xbe\x9a\xf2\xa4\xef\x91\xee\x29\xe3\
+\x82\x84\x14\xee\x2e\x6e\xa3\xae\x73\x05\xcd\x07\x34\xce\x84\x74\
+\x10\xf4\xc5\xdb\x80\x89\x94\x4b\x89\xea\xb7\x96\x28\xf8\x79\x4b\
+\xbe\xc0\xb4\x24\xb1\xa8\x01\x00\x08\x5c\xe9\x20\x30\xa8\x4c\xa9\
+\x65\x5c\xe2\x55\xe4\x7a\xcb\xd1\x30\xf8\xa4\x77\x1b\x27\xec\xf5\
+\xf8\x5a\x22\x74\x2c\xcb\xc1\x0d\xea\x41\x0c\xf9\x60\x1c\x0d\xc8\
+\x64\xa4\x78\x8a\xa8\x76\xcb\xb8\xe9\x5d\xd4\x2c\xfe\x12\xc3\x00\
+\x3b\xa6\x33\x0c\x6f\x23\xb0\xa8\x4a\x9d\x4f\x49\xe2\x15\x64\x7b\
+\xc6\x21\xd0\x39\x12\xd8\xce\xde\x40\x1d\x7b\x1a\xdb\x79\xfb\xe9\
+\x7c\xfa\xdb\x8d\x5e\x3c\xf2\x36\x60\x6d\x9c\x0c\x88\x4c\x5c\x56\
+\x61\x8b\xef\x57\xd6\xb6\x33\xf5\x87\x5d\x58\x06\x38\x8e\x40\x22\
+\x00\x0d\x47\x3a\x58\x22\x91\x8b\x53\xaf\x67\x6c\xc2\x64\x72\x3d\
+\x15\x38\xd2\xa6\xb9\x7f\x33\xfb\x82\x75\xec\xda\xde\xcf\xd6\x67\
+\xc7\x10\x0d\x68\x2d\x0a\x7e\x11\xb0\x23\x3e\x2f\x32\x41\x2e\x0e\
+\x6b\x71\xc5\x65\xe5\xb3\x3b\x98\x54\xdb\x8d\xa9\x03\x2e\x80\x18\
+\xca\x7c\x0c\x4b\x4b\x64\xd2\x57\xf0\xfe\x29\xaa\x6c\x2a\xb0\xdd\
+\x10\xff\xee\xdf\xc6\xde\xd0\x4a\xde\xdf\x12\xe3\xdd\xa5\x05\xd8\
+\x11\xed\x04\x96\x5c\x08\xec\x8e\x53\x2b\x21\x27\xe2\x68\xcf\x0b\
+\x5d\x56\x97\x5f\xd3\xce\x45\x33\xce\xa0\x4b\x94\x86\xe1\x1d\x05\
+\xef\xd7\x33\x54\xe6\x6f\xa0\xd0\x7f\xe9\x40\xd9\x44\x9c\x3e\x95\
+\xf9\x4d\xec\xeb\xff\x17\xef\xd5\x3b\xec\xaa\xcb\xc5\xb6\x69\x54\
+\xf0\x8b\x91\x34\xc7\xab\x99\xab\xc6\x16\xab\x84\xe1\x96\x8e\x9f\
+\xdb\x41\xe9\xe4\x00\xba\x0b\xa6\x01\x86\x0e\x20\x88\x49\x87\x24\
+\x23\x9b\xc9\xa9\x37\x92\xef\x9b\xa8\xe0\x2f\x24\xe0\x9c\xe6\x60\
+\x5f\x03\x7b\x7b\xd7\xf2\xee\x3a\x9d\x0f\x57\x67\x83\xc6\x76\x0c\
+\x95\x79\x57\xb4\xc5\xe7\x40\x23\x98\x8a\xea\x28\x75\xaf\x93\x57\
+\x5c\xd3\x45\xfe\xc4\x20\x9a\x0d\xba\x05\xa6\x0e\x02\xb0\xa5\x4b\
+\xb2\x99\xc3\xe4\x94\x85\x83\xf0\xde\x72\x7a\x63\x1d\x34\x07\x36\
+\xd0\x78\x66\x0d\xef\xbc\xe6\xa5\xf1\x8d\x2c\x30\xe5\x66\x04\xb7\
+\x7c\x0d\x1f\x0f\x03\x0b\x14\xfc\x73\x7a\x82\x9d\x7a\x41\x6d\x27\
+\x39\x25\x11\x74\x07\xcc\x21\x78\x53\x80\x23\x21\xdd\x1a\xc3\x25\
+\xa9\x37\x91\xe7\xad\x24\x53\x95\x4d\x77\xb4\x85\xa6\xc0\x3a\xf6\
+\x76\x35\xf0\xd6\x4b\x29\x1c\xd9\x91\x0a\x96\xb3\x12\x21\x96\x28\
+\xf8\x50\xbc\x8e\x94\x8b\x15\xfc\x3f\xf4\x64\x3b\x29\xbf\xa6\x93\
+\xd4\xc2\x18\x9a\x03\x86\x05\xa6\x06\x96\x92\x03\xaa\x54\x8a\x54\
+\xcd\xff\x98\x3c\xcf\x04\x32\x3c\xc5\x74\x45\x4f\x28\xf8\xd7\x69\
+\x6c\xdf\xc4\x86\x97\x53\x38\xba\x33\x19\x2c\xf7\x59\xa4\xb8\x07\
+\x49\x2c\x5e\x67\xe2\xbb\x88\x89\x27\x8c\xac\x88\x99\x31\xfd\x34\
+\x49\xb9\x36\x86\x03\x96\xa5\xa4\x83\xa1\xa4\x09\x28\xf0\x8d\xa7\
+\x32\x65\xbe\xca\xfc\x45\xa4\x99\x85\xb4\x47\x8e\x29\xf8\x35\x7c\
+\xd4\xba\x8d\x4d\xcb\x53\x39\xf1\x71\x32\x78\xdd\x47\x90\xe2\x8f\
+\x4a\xb1\x38\x1c\xea\x05\x4a\xbf\xc7\xe6\x61\x2d\x27\x42\xd2\x95\
+\x3d\xf8\x33\x9c\x01\x78\xd3\x1c\x2a\x1b\x0d\x34\xa5\xc2\x84\xf1\
+\x4c\x4a\x5d\x48\xb6\xa7\x82\x54\xab\x90\xb6\x70\x33\xfb\x02\xaf\
+\xb2\xbb\x65\x07\x6f\xfe\x33\x87\xf6\xc3\x7e\x07\xbf\xf3\x10\x52\
+\x3c\xaa\x14\xaf\xa9\x84\xfc\x33\x8e\xfc\x1d\x39\x51\xbc\x57\x9c\
+\xc1\x93\xec\x62\xb8\xc3\x65\x63\x28\x21\xa0\x34\xb1\x8a\x4b\xd3\
+\xae\x57\xf5\x5e\x46\x8a\x91\xcf\xa9\x70\x13\xfb\x83\xab\xd8\x75\
+\xec\x43\xde\x7a\x31\x9b\x8e\x63\x5e\x1b\x9f\x7b\x1f\x52\x3c\x19\
+\xaf\xb1\x8a\x07\xf8\x3b\xb6\xb8\x9d\xc2\x10\xfa\xc5\xfd\x58\x3e\
+\x89\x29\x87\xb2\xae\x0f\xc2\x6b\x02\x26\xa6\x4d\xa3\x3a\x7d\xf6\
+\xc0\x0b\xca\xaf\x67\xf2\x79\x68\x0f\xfb\x82\xaf\xb0\xa3\xa9\x89\
+\x8d\x2f\x67\xd3\x7b\xca\x13\xc4\xeb\x2e\x42\x6a\x6b\x91\x10\x0f\
+\x03\xd6\x40\x53\xe6\x68\x8b\x29\x0a\xc1\x84\x00\xa6\x22\xb7\x00\
+\x4b\x53\x1a\x82\xd7\x05\x54\x29\xf8\xc9\x69\xb5\xe4\xf9\x2a\x48\
+\x30\x32\x68\x0d\xee\x61\x7f\x68\x39\xdb\x0f\x34\xd1\xf0\x7c\x1e\
+\xc1\xd3\x66\x97\x82\xbf\x15\x57\x34\xc4\x67\xb0\x25\xc8\xc2\xe5\
+\x79\x60\x1e\xa5\x41\x28\x0f\x22\x04\x98\x62\x38\xf3\xba\x18\x2c\
+\x9f\xea\xac\x59\x4c\xc9\xac\xa1\xc0\x3f\x1e\x9f\x9e\xc0\x67\xc1\
+\x9d\x2a\xf3\xcb\x78\x67\xe7\x71\xde\x59\x9d\x4b\xa8\x57\x3f\x8e\
+\x47\xde\x8e\x23\xb6\xc6\x6b\x32\x67\x02\x2f\x83\xa8\xa5\x2c\x08\
+\xe3\x22\xe0\x80\xc1\x37\x37\xab\xa9\x0b\x66\xe4\xcc\xe1\xd2\x8c\
+\x99\x14\xfa\xcb\xf1\xea\x7e\x8e\x07\xb7\xd3\xd8\xbf\x9c\x2d\x3b\
+\x5a\xd9\xba\x3a\x07\x3b\xac\x1f\xc5\x94\xf3\x91\xa2\xf9\xdc\x8c\
+\x16\x85\xcb\x59\x21\xc4\x4c\x6c\x6a\xc9\x0d\x43\xc9\x20\x3c\xf2\
+\x9b\xf0\x3e\xc3\x54\xf0\x3f\x60\x92\x82\x1f\xa3\x32\xef\xd1\x7d\
+\x0a\x7e\x1b\x8d\xbd\x2b\xd8\xfc\xde\xe7\x6c\x7d\x2d\x07\x69\x8b\
+\xbd\x58\xf2\x26\x5c\x71\xf8\xdc\xcd\x46\x35\xc9\x59\x21\xb9\x03\
+\x03\xac\x62\x97\xa8\x00\xdc\xc1\x72\xb1\xf4\x41\x78\xbf\x61\x31\
+\xbb\xe0\x3a\x95\xf9\xcb\x29\x4e\xac\x44\x10\xe5\x70\xa0\x81\x7d\
+\x7d\xcb\x78\xb3\xbe\x8f\x8f\x36\x64\x83\x60\x23\x86\xfc\xa9\x82\
+\x3f\x75\x6e\x87\xbb\xe2\x2c\x03\x13\x88\x45\xe7\xce\x2a\xbd\x88\
+\x84\x42\xc9\xfa\xce\xbd\xa0\x0d\x35\x66\x02\x12\x15\xfc\xbc\xb1\
+\x0b\x54\xe6\x2f\xa3\x28\xa9\x62\xa0\x45\xfe\x34\xb4\x99\x03\x7d\
+\xcb\x59\xbf\x2e\x40\xe3\xd6\x74\xd0\xe5\x06\x04\x5f\x65\xfe\x0c\
+\x40\x7c\x0d\x48\xf9\x80\x61\xea\x89\xbf\xbe\x7c\x36\x49\xf9\x89\
+\xbc\x7d\xfa\x20\x21\x37\x0a\x40\xa6\x37\x85\x1f\x15\x5d\xcb\xa4\
+\x74\x05\x9f\x58\x46\xcc\x0d\x71\x28\x50\xcf\xfe\xae\xd7\xd8\xf4\
+\x56\x3f\x4d\xef\x0f\xc0\xbf\x08\xe2\x57\x48\xfa\x61\x38\xe2\x55\
+\x42\x05\x44\x22\x0b\x66\x5e\x38\x99\x59\x65\x55\xf8\xbd\xe9\xdc\
+\x3e\x76\x1e\x4f\x1d\x5d\xc3\x98\xb4\x2c\x16\x14\x5f\xc7\xa4\xcc\
+\x4b\x28\x4d\x1e\x4f\xc8\xe9\xe6\x60\x7f\x3d\xbb\x3b\x57\xb2\xe5\
+\x0d\xf8\x74\x4f\x2a\x58\xee\x13\x20\xee\xc3\xfd\xb6\x8d\x05\xe7\
+\x7e\x13\x4b\x16\xa1\x91\xbc\xa8\x6a\x3a\x1e\x6f\x32\x61\xcd\xe0\
+\xa1\x8a\x3b\x39\x10\x38\x81\xe1\xf5\x52\x9d\xa5\x6a\x3e\xa9\x94\
+\xde\x58\x3b\xfb\xfb\xd6\xb3\xeb\xcb\x3a\xd5\xcb\x0b\xbe\x68\x4e\
+\x00\x9f\xfb\x18\x52\x3c\xa0\xe0\xf9\x46\xc4\xb1\x84\xf2\xb0\xed\
+\xfb\xa7\x97\x4d\xe4\xda\xca\x69\x84\x85\x01\x86\x45\x96\x37\x83\
+\x35\x33\x97\x72\xdb\xce\xfb\x79\xe5\xe8\x5a\x6e\x2e\x9b\xcb\x91\
+\xd0\x46\x76\x1c\x5f\xcf\x07\x0d\x3a\xdd\x2d\x7e\xf0\xca\x7b\x71\
+\x87\x5b\x83\x91\x32\x70\x03\x8e\xcc\xb9\x2a\x77\x0a\x59\x69\xb9\
+\xf4\xc5\x24\x9a\x95\x40\x4c\x37\xc8\xf0\xa4\xf3\x66\xcd\x4b\x3c\
+\x79\x68\x29\x7f\xd9\xf5\x24\x9d\x27\x0f\xd3\x79\xc8\x20\xd0\xe6\
+\x75\xb1\xdc\x25\x48\xed\x45\x80\x91\x34\x60\xa8\xcf\x9f\xe0\xf8\
+\x79\xfa\x95\x83\xcc\x28\x3e\x46\xed\xf4\xa9\x80\x1f\x2c\x1f\x5d\
+\x3d\xed\xbc\x7f\x74\x0f\x2d\xcd\x1d\x9c\xfa\x38\xc0\xc9\x2f\x0d\
+\x94\xbb\x56\x3c\xee\x6f\x91\x62\x25\x12\x46\xda\xc0\x42\x34\x77\
+\x0a\x3d\x39\x74\x77\x84\xf9\xe5\x5f\xeb\x78\x35\xb3\x00\x33\x05\
+\xd6\x36\x6e\x62\xc5\x07\xeb\x38\x72\xf2\x18\xc4\x6c\x1b\xd3\xf7\
+\x31\x1e\xbd\x1e\x29\x5f\x40\x8a\x56\x00\x18\x59\x03\x3a\x9a\xbc\
+\x9b\xde\x24\xe8\xcc\x80\x94\x18\xc7\xc3\x9f\x30\xeb\xf1\x9f\xe1\
+\xf8\x7b\x09\xf7\xf6\xc7\x10\xda\x61\x0c\x6b\xb3\xd2\x6a\xa4\xf8\
+\x50\xc9\x1e\xce\xfa\xc8\x1b\xa8\x06\xa6\xe1\xe8\x50\xf4\x19\x24\
+\xf7\x82\x61\x3b\x01\xc7\x3d\x40\x58\x5b\x85\xc7\xb3\x19\x29\x9a\
+\x94\x22\x48\x40\x8e\xbe\x6b\xd6\xb9\x48\x34\xd2\x7a\x24\x82\x43\
+\x38\xda\x4a\x5c\xb1\x19\x61\xee\x41\x43\x41\x8f\xfe\x7b\xe2\x04\
+\xe0\x4f\x48\xb6\x28\xf0\xdd\x48\x82\xdf\xa9\x7b\x62\xf9\x8c\xbc\
+\xff\xfc\x4d\xfd\x79\x03\xff\x67\x06\xfe\x03\x1b\x85\x94\x1a\x1f\
+\xbe\x73\xb2\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x01\x4f\
+\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\x04\x00\x00\x00\xfd\x0b\x31\x0c\
+\x00\x00\x01\x16\x49\x44\x41\x54\x78\x01\xed\x96\x4b\x4a\x03\x41\
+\x14\x45\xcf\x20\x66\x1a\x14\x5d\x81\x26\xad\x7b\x08\x82\x38\xd0\
+\x6d\x88\xe0\x46\x14\x07\xe2\x36\x32\x51\x83\x9a\x55\x28\x22\xb8\
+\x03\x23\x22\x0e\x84\x56\xb4\x03\x7e\xba\x53\x4a\xf3\x28\x32\x10\
+\x2c\x0b\xee\x24\xd4\x39\xe3\xcb\x85\xa2\xea\xbd\x22\x31\x85\x24\
+\x12\x1d\x4e\xc8\x29\xa9\xbc\xe3\x09\xdd\x2f\x8e\x18\xb0\x4c\x20\
+\x19\xcf\xb8\x08\x5f\x58\x21\x88\x33\x5c\xa4\x37\x34\x09\xe0\x15\
+\x17\xed\x21\x01\x38\xf3\x3f\xf4\x2c\x33\x66\x5d\x53\xd0\x62\x68\
+\xa9\x07\xe6\x14\x05\xb0\x4a\x65\xb9\xbe\xa6\x00\xf6\x7d\x72\x5b\
+\x53\x30\xc3\x95\x25\x0b\x96\x14\x05\xd0\xa1\xb0\xec\x25\x0d\x45\
+\x01\xec\xf8\xf4\x9e\xa6\x00\xff\x4c\x2b\xba\x9a\x82\x79\x1e\x2d\
+\x3f\xa4\xa5\x28\x80\x0d\x3f\x10\x7b\x9a\x82\x4d\x6d\xc1\x82\x3f\
+\xa2\x5b\xcd\x11\x9d\x5b\xba\xa4\xab\xbd\xa6\xbb\x9a\x87\x36\xb2\
+\xec\x05\x0d\xe5\xa8\x78\x63\x51\x3b\xec\xb6\xb4\xe3\xfa\x58\xb3\
+\x70\xee\x2c\x75\xcf\xac\x72\x65\x56\xac\xf1\x27\x05\x2e\xda\x03\
+\x02\x18\xe0\x22\xbd\xa6\x49\x00\x19\x39\x2e\xc2\x9c\x8c\x40\xda\
+\x1c\xf1\xc4\x7b\xed\x47\xed\x67\xed\xd7\x8f\x65\xed\xc4\x87\xd2\
+\x6e\xfe\x29\x6d\x12\x89\xc4\x54\xf3\x0d\x0a\x7f\x93\xd6\xf9\xe7\
+\x0c\x36\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x04\x32\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\
+\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\x12\x00\x00\
+\x0b\x12\x01\xd2\xdd\x7e\xfc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\
+\xd2\x01\x07\x0b\x05\x06\xab\xd4\xb8\x1c\x00\x00\x03\xaf\x49\x44\
+\x41\x54\x78\xda\xb5\x96\xcd\x4b\x63\x57\x14\xc0\x7f\xf7\x46\x13\
+\x34\x89\x93\x9a\x28\x88\x1f\x09\x8e\x8b\x6e\x9c\xea\xe0\xc6\x27\
+\xe8\x80\x6e\x82\x10\x19\xac\x4b\x75\xd1\x59\x64\xd3\x2e\x66\xe7\
+\x6a\x96\xb3\x18\x98\xbf\xa1\x9b\xa1\x8b\x30\x2e\x4a\x2b\x68\x57\
+\x82\xdf\xd2\x8e\x16\x41\x34\x7e\x4c\x05\xbf\x88\x08\xad\x21\xef\
+\xf3\xbe\xd7\x8d\x79\x38\x1d\xa3\xa5\xd8\x0b\x07\x0e\xe7\x1d\xce\
+\xef\x9e\x73\x38\xe7\x3e\xf8\x9f\x8f\xa8\xf4\x21\x9d\x4e\x67\x0a\
+\x85\xc2\x98\x69\x9a\x9a\xe3\x38\x6d\x4a\x29\x80\x23\x60\xe9\xd1\
+\xa3\x47\xb9\xf5\xf5\xf5\x1f\xff\x13\x60\x7c\x7c\xfc\xe9\xe6\xe6\
+\xe6\x5b\x29\xe5\xc0\xe0\xe0\x20\x4f\x9e\x3c\x21\x1e\x8f\xe3\xba\
+\x2e\x85\x42\x81\xb5\xb5\x35\x66\x67\x67\x71\x1c\x67\xbe\xb9\xb9\
+\xf9\xe5\xea\xea\xea\x6f\xff\x1a\xf0\xec\xd9\xb3\xcc\xe9\xe9\xe9\
+\x7b\x4d\xd3\xaa\x46\x47\x47\x69\x6c\x6c\xa4\xba\xba\x1a\x21\x04\
+\xae\xeb\x62\xdb\x36\x86\x61\x70\x72\x72\xc2\xbb\x77\xef\x58\x5e\
+\x5e\x76\x62\xb1\xd8\xe8\xfe\xfe\x7e\xc5\x6c\x02\x65\x65\x64\x64\
+\xe4\x69\x3e\x9f\xff\xe5\xf9\xf3\xe7\x55\x93\x93\x93\x24\x12\x09\
+\xa2\xd1\x28\xf5\xf5\xf5\x24\x12\x09\x1a\x1a\x1a\x88\xc7\xe3\x44\
+\x22\x11\x22\x91\x08\x9d\x9d\x9d\xe8\xba\x2e\x37\x36\x36\xc6\x5a\
+\x5a\x5a\x7e\xbe\xbc\xbc\x3c\xbd\x13\x60\x59\xd6\x0f\x9a\xa6\xb5\
+\xbf\x78\xf1\x82\x48\x24\x42\x2c\x16\xa3\xa1\xa1\x81\x48\x24\x42\
+\x28\x14\x22\x10\x08\x10\x08\x04\x08\x85\x42\x44\xa3\x51\xc2\xe1\
+\x30\x8f\x1f\x3f\x66\x77\x77\x57\xee\xed\xed\x7d\x69\x9a\xe6\xf7\
+\xb7\x01\x24\x40\x57\x57\x57\xc6\x75\xdd\x81\x89\x89\x09\x6a\x6b\
+\x6b\x89\xc5\x62\x24\x12\x09\x82\xc1\x20\x81\x40\x00\x29\x25\x52\
+\x4a\x1f\x22\xa5\x24\x1c\x0e\xd3\xde\xde\x4e\x36\x9b\xc5\xf3\xbc\
+\x81\xfa\xfa\xfa\x4c\x45\x40\xa1\x50\x18\xcb\x64\x32\x34\x35\x35\
+\x11\x0e\x87\xa9\xab\xab\x43\x08\x81\x94\x12\x21\xc4\x67\x72\x13\
+\xda\xd5\xd5\x45\x3a\x9d\x46\xd7\xf5\xb1\x8a\x00\xd3\x34\xb5\xbe\
+\xbe\x3e\x82\xc1\x20\xd1\x68\x14\x21\x04\x9e\xe7\xe1\x79\xde\x27\
+\xce\x65\xdb\x4d\xbb\x10\x82\xa1\xa1\x21\x94\x52\xda\x6d\x80\x2a\
+\x00\xa5\x54\x5b\x6b\x6b\x2b\xa1\x50\xc8\x0f\x3e\x3c\x3c\xec\x07\
+\xb8\x0d\x90\xcb\xe5\x7c\xbd\xa3\xa3\x03\xa0\xed\x2e\x00\x42\x08\
+\xaa\xaa\xaa\x50\x4a\xa1\x94\xc2\xf3\x3c\x1f\x76\x1b\x40\x29\x85\
+\x6d\xdb\x38\x8e\x83\x6d\xdb\x9f\x65\xfb\x4f\xc0\xd1\xe1\xe1\x61\
+\x7b\x73\x73\x33\xb6\x6d\x23\x84\x60\x7a\x7a\xda\xaf\x75\x39\xb8\
+\xeb\xba\x38\x8e\x83\x52\x0a\xc3\x30\xb0\x6d\x1b\xcb\xb2\xd8\xd9\
+\xd9\x41\x29\x75\x54\xb1\x07\x9e\xe7\x2d\xcd\xcd\xcd\x61\x18\x06\
+\x96\x65\x61\x9a\x26\x96\x65\xf9\x7a\x59\xca\x36\xc3\x30\xd0\x75\
+\xdd\xb7\xcf\xce\xce\xe2\xba\xee\x52\x45\x80\x94\x32\x97\xcb\xe5\
+\xc8\xe7\xf3\xe8\xba\x4e\xa9\x54\x42\xd7\xf5\x4f\xc4\x34\x4d\x4a\
+\xa5\x92\x2f\xa6\x69\xa2\xeb\x3a\xdb\xdb\xdb\xcc\xcc\xcc\x00\xe4\
+\x2a\x0e\x9a\x65\x59\x86\x10\xa2\xfb\xe0\xe0\x20\x35\x38\x38\x88\
+\xeb\xba\x58\x96\xe5\xaf\x07\xcb\xb2\xb0\x6d\xdb\xcf\xa2\x0c\x2b\
+\x16\x8b\xbc\x7a\xf5\x8a\xb3\xb3\xb3\x79\x60\xea\xae\x49\xfe\x53\
+\x4a\xf9\xfb\xf1\xf1\xf1\x37\xe7\xe7\xe7\xb2\xbb\xbb\xdb\x6f\x5e\
+\x39\xa8\xae\xeb\x7e\x79\x4a\xa5\x12\x57\x57\x57\xbc\x79\xf3\x86\
+\xe5\xe5\x65\x07\xf8\x0e\xc8\xdf\xb9\x2a\x5c\xd7\x0d\x0a\x21\xe6\
+\x77\x76\x76\xc6\x3e\x7c\xf8\x20\x5b\x5b\x5b\xa9\xa9\xa9\xf1\x83\
+\x97\xeb\x5d\x2c\x16\xd9\xda\xda\xe2\xf5\xeb\xd7\xac\xac\xac\x38\
+\x40\x09\xf8\x1a\xb8\x04\x7e\xbd\x6f\x5d\x27\x81\xb8\x10\xe2\xad\
+\x94\x72\xa0\xbf\xbf\x9f\xde\xde\x5e\x52\xa9\x14\x00\xfb\xfb\xfb\
+\x2c\x2e\x2e\xb2\xb0\xb0\x00\x30\x0f\xbc\x04\xde\x03\x5f\x5c\x5f\
+\xf6\x02\xf8\x16\xf8\xe9\xbe\x07\x27\x09\x7c\x05\x8c\x01\xda\x8d\
+\x21\x3a\x02\x96\xae\x1b\x7a\x01\x1c\x03\xa4\x52\xa9\x2d\x40\x7c\
+\xfc\xf8\x51\x02\x36\x90\xbe\xf6\xbb\xf7\x24\xef\x90\x9b\x3e\x17\
+\xd9\x6c\xd6\xee\xe9\xe9\xd1\x81\xbf\xae\xcb\x96\x7c\xc8\xa7\x37\
+\x09\x5c\x4d\x4d\x4d\x29\x4d\xd3\x1c\xe0\x0a\x28\x3e\x24\xa4\x9c\
+\x95\x91\xcd\x66\xed\x64\x32\x69\x3f\x34\xe0\x26\xe4\x14\x50\xc0\
+\x00\x90\x14\x0f\xfc\x97\x72\xf3\xc6\x7f\x00\xfc\x0d\x91\xe4\x07\
+\x58\x63\x81\xe3\x00\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\
+\x82\
+\x00\x00\x07\x66\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\xc8\x00\x00\x00\xc8\x08\x06\x00\x00\x00\xad\x58\xae\x9e\
+\x00\x00\x07\x2d\x49\x44\x41\x54\x78\x5e\xed\xdd\x41\x6e\x1c\x47\
+\x10\x44\xd1\xf1\x7d\xfa\x0e\xb2\x4e\x26\xe9\x64\xa6\xef\xd0\xf7\
+\xb1\x41\x40\xf0\x4e\x46\xf5\x00\x91\x08\x28\x1f\xd7\x39\x31\x59\
+\x3f\xea\xa3\x36\x04\xf9\xc7\xcb\x0f\x02\x08\xfc\x92\xc0\x1f\xd8\
+\x20\x80\xc0\xaf\x09\x10\xc4\xed\x40\xe0\x7f\x08\x10\xc4\xf5\x40\
+\x80\x20\xee\x00\x02\xef\x11\xf0\x82\xbc\xc7\xcd\xa7\x96\x10\x20\
+\xc8\x92\xa2\x1d\xf3\x3d\x02\x04\x79\x8f\x9b\x4f\x2d\x21\x40\x90\
+\x25\x45\x3b\xe6\x7b\x04\x08\xf2\x1e\x37\x9f\x5a\x42\x80\x20\x4b\
+\x8a\x76\xcc\xf7\x08\x10\xe4\x3d\x6e\x3e\xb5\x84\xc0\x63\x41\xae\
+\xeb\xfa\xd6\xc8\xe6\xbe\xef\x1f\x8d\x7b\x6d\xdc\xe9\xba\xae\x3f\
+\x5f\xaf\xd7\x97\xc2\xb3\xff\x7d\xdf\xf7\xc7\x93\xbd\xde\x11\xe4\
+\xaf\xd7\xeb\xf5\x09\xa0\xe9\xe7\xe3\xbe\xef\xaf\x4d\x0b\x6d\xde\
+\xe5\xa7\x20\x9f\xf7\xa4\xed\xe7\x2b\x41\xda\x2a\x59\xb8\x0f\x41\
+\xbc\x20\x0b\xaf\xfd\xf9\x91\x09\x42\x90\xf3\xdb\xb2\x70\x92\x20\
+\x04\x59\x78\xed\xcf\x8f\x4c\x10\x82\x9c\xdf\x96\x85\x93\x04\x21\
+\xc8\xc2\x6b\x7f\x7e\x64\x82\x10\xe4\xfc\xb6\x2c\x9c\x24\x08\x41\
+\x16\x5e\xfb\xf3\x23\x13\x84\x20\xe7\xb7\x65\xe1\x24\x41\x08\xb2\
+\xf0\xda\x9f\x1f\x99\x20\x04\x39\xbf\x2d\x0b\x27\x09\xf2\x4c\x10\
+\xbf\x27\xb5\x50\x92\xf4\x91\xdf\x94\xb0\xf2\x77\xb1\x08\x92\xbe\
+\x2d\x0b\xf3\x09\xb2\xb0\x74\x47\x3e\x27\x40\x90\x73\x56\x26\x17\
+\x12\x20\xc8\xc2\xd2\x1d\xf9\x9c\x00\x41\xce\x59\x99\x5c\x48\x80\
+\x20\x0b\x4b\x77\xe4\x73\x02\x04\x39\x67\x65\x72\x21\x01\x82\x2c\
+\x2c\xdd\x91\xcf\x09\x10\xe4\x9c\x95\xc9\x85\x04\x08\xb2\xb0\x74\
+\x47\x3e\x27\x40\x90\x73\x56\x26\x17\x12\x20\xc8\xc2\xd2\x1d\xf9\
+\x9c\x00\x41\xce\x59\x99\x5c\x48\x80\x20\x0b\x4b\x77\xe4\x73\x02\
+\x04\x39\x67\x65\x72\x21\x01\x82\x2c\x2c\xdd\x91\xcf\x09\x10\xe4\
+\x9c\x95\xc9\x85\x04\x08\xb2\xb0\x74\x47\x3e\x27\x40\x90\x73\x56\
+\x26\x17\x12\x20\xc8\xc2\xd2\x1d\xf9\x9c\x00\x41\xce\x59\x99\x5c\
+\x48\x80\x20\x0b\x4b\x77\xe4\x73\x02\x04\x39\x67\x65\x72\x21\x01\
+\x82\x2c\x2c\xdd\x91\xcf\x09\xd4\x0a\x72\x7e\x84\xd9\xc9\xeb\xba\
+\xfe\x99\xfd\x46\xdf\xf6\x7f\x04\xee\xfb\x7e\xfc\x0f\x62\x1b\x89\
+\xfe\x16\x87\xf8\x04\x4b\x90\xae\xeb\x45\x90\xae\x3e\x08\x52\xd6\
+\x07\x41\xca\x0a\xf1\x82\x74\x15\x42\x90\xae\x3e\xbc\x20\x65\x7d\
+\x10\xa4\xac\x10\x2f\x48\x57\x21\x04\xe9\xea\xc3\x0b\x52\xd6\x07\
+\x41\xca\x0a\xf1\x82\x74\x15\x42\x90\xae\x3e\xbc\x20\x65\x7d\x10\
+\xa4\xac\x10\x2f\x48\x57\x21\x04\xe9\xea\xc3\x0b\x52\xd6\x07\x41\
+\xca\x0a\xf1\x82\x74\x15\x42\x90\xae\x3e\xbc\x20\x65\x7d\x10\xa4\
+\xac\x10\x2f\x48\x57\x21\x04\xe9\xea\xc3\x0b\x52\xd6\x07\x41\xca\
+\x0a\xf1\x82\x74\x15\x42\x90\xae\x3e\xbc\x20\x65\x7d\x10\xa4\xac\
+\x10\x2f\x48\x57\x21\x04\xe9\xea\xc3\x0b\x52\xd6\x07\x41\xca\x0a\
+\xf1\x82\x74\x15\x42\x90\xae\x3e\xbc\x20\x65\x7d\x10\xa4\xac\x10\
+\x2f\x48\x57\x21\x04\xe9\xea\xc3\x0b\x52\xd6\x07\x41\xca\x0a\xf1\
+\x82\x74\x15\x42\x90\xae\x3e\xbc\x20\x65\x7d\x10\xa4\xac\x90\xc6\
+\x75\xae\xeb\xfa\xf6\x7a\xbd\xbe\x87\x77\xfb\x7e\xdf\xf7\x8f\xf0\
+\x77\xac\x8d\xff\x6d\xfe\x70\x5c\x63\x83\x04\x69\x6c\xe5\xd9\x4e\
+\x04\x79\xc6\xeb\xd1\x34\x41\x1e\xe1\xaa\x1c\x26\x48\xb0\x16\x82\
+\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\x04\x09\x82\
+\x26\x48\x10\xee\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\x14\x4d\x90\
+\x20\x68\x82\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\
+\x04\x09\x82\x26\x48\x10\xee\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\
+\x14\x4d\x90\x20\x68\x82\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\
+\xb8\x43\xd1\x04\x09\x82\x26\x48\x10\xee\x50\x34\x41\x82\xa0\x09\
+\x12\x84\x3b\x14\x4d\x90\x20\x68\x82\x04\xe1\x0e\x45\x13\x24\x08\
+\x9a\x20\x41\xb8\x43\xd1\x04\x09\x82\x26\x48\x10\xee\x50\x34\x41\
+\x82\xa0\x09\x12\x84\x3b\x14\x4d\x90\x20\x68\x82\x04\xe1\x0e\x45\
+\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\x04\x09\x82\x26\x48\x10\xee\
+\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\x14\x4d\x90\x20\x68\x82\x04\
+\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\x04\x09\x82\x26\
+\x48\x10\xee\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\x14\x4d\x90\x20\
+\x68\x82\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\x04\
+\x09\x82\x26\x48\x10\xee\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\x14\
+\x4d\x90\x20\x68\x82\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\
+\x43\xd1\x04\x09\x82\x26\x48\x10\xee\x50\x34\x41\x82\xa0\x09\x12\
+\x84\x3b\x14\x4d\x90\x20\x68\x82\x04\xe1\x0e\x45\x13\x24\x08\x9a\
+\x20\x41\xb8\x43\xd1\x04\x09\x82\x26\x48\x10\xee\x50\x34\x41\x82\
+\xa0\x09\x12\x84\x3b\x14\x4d\x90\x20\x68\x82\x04\xe1\x0e\x45\x13\
+\x24\x08\x9a\x20\x41\xb8\x43\xd1\x04\x09\x82\x26\x48\x10\xee\x50\
+\x34\x41\x82\xa0\x09\x12\x84\x3b\x14\x4d\x90\x20\x68\x82\x04\xe1\
+\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\x04\x09\x82\x26\x48\
+\x10\xee\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\x14\x4d\x90\x20\x68\
+\x82\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\x04\x09\
+\x82\x26\x48\x10\xee\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\x14\x4d\
+\x90\x20\x68\x82\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\
+\xd1\x04\x09\x82\x26\x48\x10\xee\x50\x34\x41\x82\xa0\x09\x12\x84\
+\x3b\x14\x4d\x90\x20\x68\x82\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\
+\x41\xb8\x43\xd1\x04\x09\x82\x26\x48\x10\xee\x50\x34\x41\x82\xa0\
+\x09\x12\x84\x3b\x14\x4d\x90\x20\x68\x82\x04\xe1\x0e\x45\x13\x24\
+\x08\x9a\x20\x41\xb8\x43\xd1\x04\x09\x82\x26\x48\x10\xee\x50\x34\
+\x41\x82\xa0\x09\x12\x84\x3b\x14\x4d\x90\x20\x68\x82\x04\xe1\x0e\
+\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\x04\x09\x82\x26\x48\x10\
+\xee\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\x14\x4d\x90\x20\x68\x82\
+\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\x04\x09\x82\
+\x26\x48\x10\xee\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\x14\x4d\x90\
+\x20\x68\x82\x04\xe1\x0e\x45\x13\x24\x08\x9a\x20\x41\xb8\x43\xd1\
+\x04\x09\x82\x26\x48\x10\xee\x50\x34\x41\x82\xa0\x09\x12\x84\x3b\
+\x14\xfd\x58\x90\xeb\xba\xfe\x7a\xbd\x5e\x7f\x3e\xd8\xef\xe3\xbe\
+\xef\xaf\x0f\xe6\x7f\x9b\x51\x82\xe4\xaa\xbc\xae\xeb\xf3\x0e\x7e\
+\xde\xc5\x27\x3f\x5f\xef\xfb\xfe\x78\xf2\x01\x82\x3c\xa1\xf5\x70\
+\x96\x20\x0f\x81\x3d\x18\x27\xc8\x03\x58\xad\xa3\x04\xc9\x35\x43\
+\x90\x1c\xdb\xb1\x64\x82\xe4\x50\x13\x24\xc7\x76\x2c\x99\x20\x39\
+\xd4\x04\xc9\xb1\x1d\x4b\x26\x48\x0e\x35\x41\x72\x6c\xc7\x92\x09\
+\x92\x43\x4d\x90\x1c\xdb\xb1\x64\x82\xe4\x50\x13\x24\xc7\x76\x2c\
+\x99\x20\x39\xd4\x04\xc9\xb1\x1d\x4b\x26\x48\x0e\x35\x41\x72\x6c\
+\xc7\x92\x09\x92\x43\x4d\x90\x1c\xdb\xb1\x64\x82\xe4\x50\x13\x24\
+\xc7\x76\x2c\xf9\xa7\x20\xf1\xef\xbb\xef\xfb\x47\xfc\x4b\xca\xbe\
+\x80\x20\x65\x85\x58\xa7\x8b\x00\x41\xba\xfa\xb0\x4d\x19\x01\x82\
+\x94\x15\x62\x9d\x2e\x02\x04\xe9\xea\xc3\x36\x65\x04\x08\x52\x56\
+\x88\x75\xba\x08\x10\xa4\xab\x0f\xdb\x94\x11\x20\x48\x59\x21\xd6\
+\xe9\x22\x40\x90\xae\x3e\x6c\x53\x46\x80\x20\x65\x85\x58\xa7\x8b\
+\x00\x41\xba\xfa\xb0\x4d\x19\x01\x82\x94\x15\x62\x9d\x2e\x02\x04\
+\xe9\xea\xc3\x36\x65\x04\x7e\x27\x41\x26\xd0\xae\xfd\xe3\x74\x13\
+\x70\x9f\x7e\xc7\x9b\x97\xf7\xe9\xd7\xbc\x33\x5f\xf9\x87\xe3\xde\
+\x39\xc8\xd3\xcf\x10\xe4\x29\xb1\xe0\x3c\x41\x9e\xfd\xe9\xd1\x60\
+\x15\xff\x45\x13\x64\x82\xf2\xe1\x77\x10\x84\x20\x87\x57\x65\xe7\
+\x18\x41\x08\xb2\xf3\xe6\x1f\x9e\x9a\x20\x04\x39\xbc\x2a\x3b\xc7\
+\x08\x42\x90\x9d\x37\xff\xf0\xd4\x04\x21\xc8\xe1\x55\xd9\x39\x46\
+\x10\x82\xec\xbc\xf9\x87\xa7\x26\x08\x41\x0e\xaf\xca\xce\x31\x82\
+\x10\x64\xe7\xcd\x3f\x3c\x35\x41\x08\x72\x78\x55\x76\x8e\x6d\x17\
+\xe4\x5b\x63\xed\x1b\xff\x78\x5a\x63\x0f\x9f\x3b\xfd\x14\xe4\x4b\
+\xe1\x7e\x7f\xc7\xff\x89\x67\xe1\xa1\xad\x84\x40\x8c\xc0\xe3\xff\
+\x72\x1b\xdb\x44\x30\x02\x85\x04\x08\x52\x58\x8a\x95\x7a\x08\x10\
+\xa4\xa7\x0b\x9b\x14\x12\x20\x48\x61\x29\x56\xea\x21\x40\x90\x9e\
+\x2e\x6c\x52\x48\x80\x20\x85\xa5\x58\xa9\x87\x00\x41\x7a\xba\xb0\
+\x49\x21\x01\x82\x14\x96\x62\xa5\x1e\x02\x04\xe9\xe9\xc2\x26\x85\
+\x04\x08\x52\x58\x8a\x95\x7a\x08\x10\xa4\xa7\x0b\x9b\x14\x12\xf8\
+\x17\xc5\x5a\x12\x14\xba\xe4\x5b\x22\x00\x00\x00\x00\x49\x45\x4e\
+\x44\xae\x42\x60\x82\
+\x00\x00\x0a\x31\
+\x73\
+\x61\x76\x65\x41\x73\x44\x65\x74\x61\x69\x6c\x3d\xe5\xb0\x87\xe6\
+\xa0\x87\xe7\xad\xbe\xe4\xbf\x9d\xe5\xad\x98\xe5\x88\xb0\xe5\x85\
+\xb6\xe4\xbb\x96\xe6\x96\x87\xe4\xbb\xb6\x0d\x0a\x63\x68\x61\x6e\
+\x67\x65\x53\x61\x76\x65\x44\x69\x72\x3d\xe6\x94\xb9\xe5\x8f\x98\
+\xe5\xad\x98\xe6\x94\xbe\xe7\x9b\xae\xe5\xbd\x95\x0d\x0a\x6f\x70\
+\x65\x6e\x46\x69\x6c\x65\x3d\xe6\x89\x93\xe5\xbc\x80\xe6\x96\x87\
+\xe4\xbb\xb6\x0d\x0a\x73\x68\x61\x70\x65\x4c\x69\x6e\x65\x43\x6f\
+\x6c\x6f\x72\x44\x65\x74\x61\x69\x6c\x3d\xe6\x9b\xb4\xe6\x94\xb9\
+\xe7\xba\xbf\xe6\x9d\xa1\xe9\xa2\x9c\xe8\x89\xb2\x0d\x0a\x72\x65\
+\x73\x65\x74\x41\x6c\x6c\x3d\xe9\x87\x8d\xe7\xbd\xae\xe7\x95\x8c\
+\xe9\x9d\xa2\xe4\xb8\x8e\xe4\xbf\x9d\xe5\xad\x98\xe5\x9c\xb0\xe5\
+\x9d\x80\x0d\x0a\x63\x72\x74\x42\x6f\x78\x3d\xe7\x9f\xa9\xe5\xbd\
+\xa2\xe6\xa0\x87\xe6\xb3\xa8\x0d\x0a\x63\x72\x74\x42\x6f\x78\x44\
+\x65\x74\x61\x69\x6c\x3d\xe5\x88\x9b\xe5\xbb\xba\xe4\xb8\x80\xe4\
+\xb8\xaa\xe6\x96\xb0\xe7\x9a\x84\xe5\x8c\xba\xe5\x9d\x97\x0d\x0a\
+\x64\x75\x70\x42\x6f\x78\x44\x65\x74\x61\x69\x6c\x3d\xe5\xa4\x8d\
+\xe5\x88\xb6\xe5\x8c\xba\xe5\x9d\x97\x0d\x0a\x76\x65\x72\x69\x66\
+\x79\x49\x6d\x67\x3d\xe9\xaa\x8c\xe8\xaf\x81\xe5\x9b\xbe\xe5\x83\
+\x8f\x0d\x0a\x7a\x6f\x6f\x6d\x69\x6e\x44\x65\x74\x61\x69\x6c\x3d\
+\xe6\x94\xbe\xe5\xa4\xa7\x0d\x0a\x76\x65\x72\x69\x66\x79\x49\x6d\
+\x67\x44\x65\x74\x61\x69\x6c\x3d\xe9\xaa\x8c\xe8\xaf\x81\xe5\x9b\
+\xbe\xe5\x83\x8f\x0d\x0a\x73\x61\x76\x65\x44\x65\x74\x61\x69\x6c\
+\x3d\xe4\xbf\x9d\xe5\xad\x98\xe6\xa0\x87\xe7\xad\xbe\xe6\x96\x87\
+\xe4\xbb\xb6\x0d\x0a\x6f\x70\x65\x6e\x46\x69\x6c\x65\x44\x65\x74\
+\x61\x69\x6c\x3d\xe6\x89\x93\xe5\xbc\x80\xe5\x9b\xbe\xe5\x83\x8f\
+\xe6\x96\x87\xe4\xbb\xb6\x0d\x0a\x66\x69\x74\x57\x69\x64\x74\x68\
+\x44\x65\x74\x61\x69\x6c\x3d\xe8\xb0\x83\xe6\x95\xb4\xe5\xae\xbd\
+\xe5\xba\xa6\xe9\x80\x82\xe5\xba\x94\xe5\x88\xb0\xe7\xaa\x97\xe5\
+\x8f\xa3\xe5\xae\xbd\xe5\xba\xa6\x0d\x0a\x74\x75\x74\x6f\x72\x69\
+\x61\x6c\x3d\x50\x61\x64\x64\x6c\x65\x4f\x43\x52\xe5\x9c\xb0\xe5\
+\x9d\x80\x0d\x0a\x65\x64\x69\x74\x4c\x61\x62\x65\x6c\x3d\xe7\xbc\
+\x96\xe8\xbe\x91\xe6\xa0\x87\xe7\xad\xbe\x0d\x0a\x6f\x70\x65\x6e\
+\x41\x6e\x6e\x6f\x74\x61\x74\x69\x6f\x6e\x44\x65\x74\x61\x69\x6c\
+\x3d\xe6\x89\x93\xe5\xbc\x80\xe6\xa0\x87\xe7\xad\xbe\xe6\x96\x87\
+\xe4\xbb\xb6\x0d\x0a\x71\x75\x69\x74\x3d\xe9\x80\x80\xe5\x87\xba\
+\x0d\x0a\x73\x68\x61\x70\x65\x46\x69\x6c\x6c\x43\x6f\x6c\x6f\x72\
+\x44\x65\x74\x61\x69\x6c\x3d\xe6\x9b\xb4\xe6\x94\xb9\xe5\xa1\xab\
+\xe5\x85\x85\xe9\xa2\x9c\xe8\x89\xb2\x0d\x0a\x63\x6c\x6f\x73\x65\
+\x43\x75\x72\x44\x65\x74\x61\x69\x6c\x3d\xe5\x85\xb3\xe9\x97\xad\
+\xe5\xbd\x93\xe5\x89\x8d\xe6\x96\x87\xe4\xbb\xb6\x0d\x0a\x63\x6c\
+\x6f\x73\x65\x43\x75\x72\x3d\xe5\x85\xb3\xe9\x97\xad\xe6\x96\x87\
+\xe4\xbb\xb6\x0d\x0a\x64\x65\x6c\x65\x74\x65\x49\x6d\x67\x3d\xe5\
+\x88\xa0\xe9\x99\xa4\xe5\x9b\xbe\xe5\x83\x8f\x0d\x0a\x64\x65\x6c\
+\x65\x74\x65\x49\x6d\x67\x44\x65\x74\x61\x69\x6c\x3d\xe5\x88\xa0\
+\xe9\x99\xa4\xe5\xbd\x93\xe5\x89\x8d\xe5\x9b\xbe\xe5\x83\x8f\x0d\
+\x0a\x66\x69\x74\x57\x69\x6e\x3d\xe8\xb0\x83\xe6\x95\xb4\xe5\x88\
+\xb0\xe7\xaa\x97\xe5\x8f\xa3\xe5\xa4\xa7\xe5\xb0\x8f\x0d\x0a\x64\
+\x65\x6c\x42\x6f\x78\x3d\xe5\x88\xa0\xe9\x99\xa4\xe9\x80\x89\xe6\
+\x8b\xa9\xe7\x9a\x84\xe5\x8c\xba\xe5\x9d\x97\x0d\x0a\x62\x6f\x78\
+\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\x72\x44\x65\x74\x61\x69\x6c\x3d\
+\xe9\x80\x89\xe6\x8b\xa9\xe7\xba\xbf\xe6\xa1\x86\xe9\xa2\x9c\xe8\
+\x89\xb2\x0d\x0a\x6f\x72\x69\x67\x69\x6e\x61\x6c\x73\x69\x7a\x65\
+\x3d\xe5\x8e\x9f\xe5\xa7\x8b\xe5\xa4\xa7\xe5\xb0\x8f\x0d\x0a\x72\
+\x65\x73\x65\x74\x41\x6c\x6c\x44\x65\x74\x61\x69\x6c\x3d\xe9\x87\
+\x8d\xe7\xbd\xae\xe6\x89\x80\xe6\x9c\x89\xe8\xae\xbe\xe5\xae\x9a\
+\x0d\x0a\x7a\x6f\x6f\x6d\x6f\x75\x74\x44\x65\x74\x61\x69\x6c\x3d\
+\xe6\x94\xbe\xe5\xa4\xa7\xe7\x94\xbb\xe9\x9d\xa2\x0d\x0a\x73\x61\
+\x76\x65\x3d\xe4\xbf\x9d\xe5\xad\x98\x0d\x0a\x73\x61\x76\x65\x41\
+\x73\x3d\xe5\x8f\xa6\xe5\xad\x98\xe4\xb8\xba\x0d\x0a\x66\x69\x74\
+\x57\x69\x6e\x44\x65\x74\x61\x69\x6c\x3d\xe7\xbc\xa9\xe6\x94\xbe\
+\xe5\x88\xb0\xe5\xbd\x93\xe5\x89\x8d\xe7\xaa\x97\xe5\x8f\xa3\xe5\
+\xa4\xa7\xe5\xb0\x8f\x0d\x0a\x6f\x70\x65\x6e\x44\x69\x72\x3d\xe6\
+\x89\x93\xe5\xbc\x80\xe7\x9b\xae\xe5\xbd\x95\x0d\x0a\x63\x6f\x70\
+\x79\x50\x72\x65\x76\x42\x6f\x75\x6e\x64\x69\x6e\x67\x3d\xe5\xa4\
+\x8d\xe5\x88\xb6\xe5\xbd\x93\xe5\x89\x8d\xe5\x9b\xbe\xe5\x83\x8f\
+\xe4\xb8\xad\xe7\x9a\x84\xe4\xb8\x8a\xe4\xb8\x80\xe4\xb8\xaa\xe8\
+\xbe\xb9\xe7\x95\x8c\xe6\xa1\x86\x0d\x0a\x73\x68\x6f\x77\x48\x69\
+\x64\x65\x3d\xe6\x98\xbe\xe7\xa4\xba\x2f\xe9\x9a\x90\xe8\x97\x8f\
+\xe6\xa0\x87\xe7\xad\xbe\x0d\x0a\x63\x68\x61\x6e\x67\x65\x53\x61\
+\x76\x65\x46\x6f\x72\x6d\x61\x74\x3d\xe6\x9b\xb4\xe6\x94\xb9\xe5\
+\xad\x98\xe5\x82\xa8\xe6\xa0\xbc\xe5\xbc\x8f\x0d\x0a\x73\x68\x61\
+\x70\x65\x46\x69\x6c\x6c\x43\x6f\x6c\x6f\x72\x3d\xe5\xa1\xab\xe5\
+\x85\x85\xe9\xa2\x9c\xe8\x89\xb2\x0d\x0a\x71\x75\x69\x74\x41\x70\
+\x70\x3d\xe9\x80\x80\xe5\x87\xba\xe7\xa8\x8b\xe5\xba\x8f\x0d\x0a\
+\x64\x75\x70\x42\x6f\x78\x3d\xe5\xa4\x8d\xe5\x88\xb6\xe5\x8c\xba\
+\xe5\x9d\x97\x0d\x0a\x64\x65\x6c\x42\x6f\x78\x44\x65\x74\x61\x69\
+\x6c\x3d\xe5\x88\xa0\xe9\x99\xa4\xe5\x8c\xba\xe5\x9d\x97\x0d\x0a\
+\x7a\x6f\x6f\x6d\x69\x6e\x3d\xe6\x94\xbe\xe5\xa4\xa7\xe7\x94\xbb\
+\xe9\x9d\xa2\x0d\x0a\x69\x6e\x66\x6f\x3d\xe4\xbf\xa1\xe6\x81\xaf\
+\x0d\x0a\x6f\x70\x65\x6e\x41\x6e\x6e\x6f\x74\x61\x74\x69\x6f\x6e\
+\x3d\xe5\xbc\x80\xe5\x90\xaf\xe6\xa0\x87\xe7\xad\xbe\x0d\x0a\x70\
+\x72\x65\x76\x49\x6d\x67\x44\x65\x74\x61\x69\x6c\x3d\xe4\xb8\x8a\
+\xe4\xb8\x80\xe4\xb8\xaa\xe5\x9b\xbe\xe5\x83\x8f\x0d\x0a\x66\x69\
+\x74\x57\x69\x64\x74\x68\x3d\xe7\xbc\xa9\xe6\x94\xbe\xe5\x88\xb0\
+\xe8\xb7\x9f\xe5\xbd\x93\xe5\x89\x8d\xe7\x94\xbb\xe9\x9d\xa2\xe4\
+\xb8\x80\xe6\xa0\xb7\xe5\xae\xbd\x0d\x0a\x7a\x6f\x6f\x6d\x6f\x75\
+\x74\x3d\xe7\xbc\xa9\xe5\xb0\x8f\xe7\x94\xbb\xe9\x9d\xa2\x0d\x0a\
+\x63\x68\x61\x6e\x67\x65\x53\x61\x76\x65\x64\x41\x6e\x6e\x6f\x74\
+\x61\x74\x69\x6f\x6e\x44\x69\x72\x3d\xe6\x9b\xb4\xe6\x94\xb9\xe4\
+\xbf\x9d\xe5\xad\x98\xe6\xa0\x87\xe7\xad\xbe\xe6\x96\x87\xe4\xbb\
+\xb6\xe7\x9a\x84\xe9\xa2\x84\xe8\xae\xbe\xe7\x9b\xae\xe5\xbd\x95\
+\x0d\x0a\x6e\x65\x78\x74\x49\x6d\x67\x44\x65\x74\x61\x69\x6c\x3d\
+\xe4\xb8\x8b\xe4\xb8\x80\xe4\xb8\xaa\xe5\x9b\xbe\xe5\x83\x8f\x0d\
+\x0a\x6f\x72\x69\x67\x69\x6e\x61\x6c\x73\x69\x7a\x65\x44\x65\x74\
+\x61\x69\x6c\x3d\xe6\x94\xbe\xe5\xa4\xa7\xe5\x88\xb0\xe5\x8e\x9f\
+\xe5\xa7\x8b\xe5\xa4\xa7\xe5\xb0\x8f\x0d\x0a\x70\x72\x65\x76\x49\
+\x6d\x67\x3d\xe4\xb8\x8a\xe4\xb8\x80\xe5\xbc\xa0\x0d\x0a\x74\x75\
+\x74\x6f\x72\x69\x61\x6c\x44\x65\x74\x61\x69\x6c\x3d\xe6\x98\xbe\
+\xe7\xa4\xba\xe7\xa4\xba\xe8\x8c\x83\xe5\x86\x85\xe5\xae\xb9\x0d\
+\x0a\x73\x68\x61\x70\x65\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\x72\x3d\
+\xe5\xbd\xa2\xe7\x8a\xb6\xe7\xba\xbf\xe6\x9d\xa1\xe9\xa2\x9c\xe8\
+\x89\xb2\x0d\x0a\x62\x6f\x78\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\x72\
+\x3d\xe5\x8c\xba\xe5\x9d\x97\xe7\xba\xbf\xe6\x9d\xa1\xe9\xa2\x9c\
+\xe8\x89\xb2\x0d\x0a\x65\x64\x69\x74\x4c\x61\x62\x65\x6c\x44\x65\
+\x74\x61\x69\x6c\x3d\xe4\xbf\xae\xe6\x94\xb9\xe5\xbd\x93\xe5\x89\
+\x8d\xe6\x89\x80\xe9\x80\x89\xe7\x9a\x84\xe5\x8c\xba\xe5\x9d\x97\
+\xe9\xa2\x9c\xe8\x89\xb2\x0d\x0a\x6e\x65\x78\x74\x49\x6d\x67\x3d\
+\xe4\xb8\x8b\xe4\xb8\x80\xe5\xbc\xa0\x0d\x0a\x75\x73\x65\x44\x65\
+\x66\x61\x75\x6c\x74\x4c\x61\x62\x65\x6c\x3d\xe4\xbd\xbf\xe7\x94\
+\xa8\xe9\xa2\x84\xe8\xae\xbe\xe6\xa0\x87\xe7\xad\xbe\x0d\x0a\x75\
+\x73\x65\x44\x69\x66\x66\x69\x63\x75\x6c\x74\x3d\xe6\x9c\x89\xe9\
+\x9a\xbe\xe5\xba\xa6\xe7\x9a\x84\x0d\x0a\x62\x6f\x78\x4c\x61\x62\
+\x65\x6c\x54\x65\x78\x74\x3d\xe5\x8c\xba\xe5\x9d\x97\xe7\x9a\x84\
+\xe6\xa0\x87\xe7\xad\xbe\x0d\x0a\x6c\x61\x62\x65\x6c\x73\x3d\xe6\
+\xa0\x87\xe7\xad\xbe\x0d\x0a\x61\x75\x74\x6f\x53\x61\x76\x65\x4d\
+\x6f\x64\x65\x3d\xe8\x87\xaa\xe5\x8a\xa8\xe4\xbf\x9d\xe5\xad\x98\
+\xe6\xa8\xa1\xe5\xbc\x8f\x0d\x0a\x73\x69\x6e\x67\x6c\x65\x43\x6c\
+\x73\x4d\x6f\x64\x65\x3d\xe5\x8d\x95\xe4\xb8\x80\xe7\xb1\xbb\xe5\
+\x88\xab\xe6\xa8\xa1\xe5\xbc\x8f\x0d\x0a\x64\x69\x73\x70\x6c\x61\
+\x79\x4c\x61\x62\x65\x6c\x3d\xe6\x98\xbe\xe7\xa4\xba\xe7\xb1\xbb\
+\xe5\x88\xab\x0d\x0a\x66\x69\x6c\x65\x4c\x69\x73\x74\x3d\xe6\x96\
+\x87\xe4\xbb\xb6\xe5\x88\x97\xe8\xa1\xa8\x0d\x0a\x66\x69\x6c\x65\
+\x73\x3d\xe6\x96\x87\xe4\xbb\xb6\x0d\x0a\x61\x64\x76\x61\x6e\x63\
+\x65\x64\x4d\x6f\x64\x65\x3d\xe4\xb8\x93\xe5\xae\xb6\xe6\xa8\xa1\
+\xe5\xbc\x8f\x0d\x0a\x61\x64\x76\x61\x6e\x63\x65\x64\x4d\x6f\x64\
+\x65\x44\x65\x74\x61\x69\x6c\x3d\xe5\x88\x87\xe6\x8d\xa2\xe5\x88\
+\xb0\xe4\xb8\x93\xe5\xae\xb6\xe6\xa8\xa1\xe5\xbc\x8f\x0d\x0a\x73\
+\x68\x6f\x77\x41\x6c\x6c\x42\x6f\x78\x44\x65\x74\x61\x69\x6c\x3d\
+\xe6\x98\xbe\xe7\xa4\xba\xe6\x89\x80\xe6\x9c\x89\xe5\x8c\xba\xe5\
+\x9d\x97\x0d\x0a\x68\x69\x64\x65\x41\x6c\x6c\x42\x6f\x78\x44\x65\
+\x74\x61\x69\x6c\x3d\xe9\x9a\x90\xe8\x97\x8f\xe6\x89\x80\xe6\x9c\
+\x89\xe5\x8c\xba\xe5\x9d\x97\x0d\x0a\x61\x6e\x6e\x6f\x50\x61\x6e\
+\x65\x6c\x3d\xe6\xa0\x87\xe6\xb3\xa8\xe9\x9d\xa2\xe6\x9d\xbf\x0d\
+\x0a\x61\x6e\x6e\x6f\x3d\xe6\xa0\x87\xe6\xb3\xa8\x0d\x0a\x61\x64\
+\x64\x4e\x65\x77\x42\x62\x6f\x78\x3d\xe6\x96\xb0\xe6\xa1\x86\x0d\
+\x0a\x72\x65\x4c\x61\x62\x65\x6c\x3d\xe9\x87\x8d\xe6\xa0\x87\xe6\
+\xb3\xa8\x0d\x0a\x63\x68\x6f\x6f\x73\x65\x6d\x6f\x64\x65\x6c\x3d\
+\xe9\x80\x89\xe6\x8b\xa9\xe6\xa8\xa1\xe5\x9e\x8b\x0d\x0a\x74\x69\
+\x70\x63\x68\x6f\x6f\x73\x65\x6d\x6f\x64\x65\x6c\x3d\xe9\x80\x89\
+\xe6\x8b\xa9\x4f\x43\x52\xe6\xa8\xa1\xe5\x9e\x8b\x0d\x0a\x49\x6d\
+\x61\x67\x65\x52\x65\x73\x69\x7a\x65\x3d\xe5\x9b\xbe\xe7\x89\x87\
+\xe7\xbc\xa9\xe6\x94\xbe\x0d\x0a\x49\x52\x3d\xe5\x9b\xbe\xe7\x89\
+\x87\xe7\xbc\xa9\xe6\x94\xbe\x0d\x0a\x61\x75\x74\x6f\x52\x65\x63\
+\x6f\x67\x6e\x69\x74\x69\x6f\x6e\x3d\xe8\x87\xaa\xe5\x8a\xa8\xe6\
+\xa0\x87\xe6\xb3\xa8\x0d\x0a\x72\x65\x52\x65\x63\x6f\x67\x6e\x69\
+\x74\x69\x6f\x6e\x3d\xe9\x87\x8d\xe6\x96\xb0\xe8\xaf\x86\xe5\x88\
+\xab\x0d\x0a\x6d\x66\x69\x6c\x65\x3d\xe6\x96\x87\xe4\xbb\xb6\x0d\
+\x0a\x6d\x65\x64\x69\x74\x3d\xe7\xbc\x96\xe8\xbe\x91\x0d\x0a\x6d\
+\x76\x69\x65\x77\x3d\xe8\xa7\x86\xe5\x9b\xbe\x0d\x0a\x6d\x68\x65\
+\x6c\x70\x3d\xe5\xb8\xae\xe5\x8a\xa9\x0d\x0a\x69\x63\x6f\x6e\x4c\
+\x69\x73\x74\x3d\xe7\xbc\xa9\xe7\x95\xa5\xe5\x9b\xbe\x0d\x0a\x64\
+\x65\x74\x65\x63\x74\x69\x6f\x6e\x42\x6f\x78\x70\x6f\x73\x69\x74\
+\x69\x6f\x6e\x3d\xe6\xa3\x80\xe6\xb5\x8b\xe6\xa1\x86\xe4\xbd\x8d\
+\xe7\xbd\xae\x0d\x0a\x72\x65\x63\x6f\x67\x6e\x69\x74\x69\x6f\x6e\
+\x52\x65\x73\x75\x6c\x74\x3d\xe8\xaf\x86\xe5\x88\xab\xe7\xbb\x93\
+\xe6\x9e\x9c\x0d\x0a\x63\x72\x65\x61\x74\x50\x6f\x6c\x79\x67\x6f\
+\x6e\x3d\xe5\x9b\x9b\xe7\x82\xb9\xe6\xa0\x87\xe6\xb3\xa8\x0d\x0a\
+\x64\x72\x61\x77\x53\x71\x75\x61\x72\x65\x73\x3d\xe6\xad\xa3\xe6\
+\x96\xb9\xe5\xbd\xa2\xe6\xa0\x87\xe6\xb3\xa8\x0d\x0a\x73\x61\x76\
+\x65\x52\x65\x63\x3d\xe4\xbf\x9d\xe5\xad\x98\xe8\xaf\x86\xe5\x88\
+\xab\xe7\xbb\x93\xe6\x9e\x9c\x0d\x0a\x74\x65\x6d\x70\x4c\x61\x62\
+\x65\x6c\x3d\xe5\xbe\x85\xe8\xaf\x86\xe5\x88\xab\x0d\x0a\x73\x74\
+\x65\x70\x73\x3d\xe6\x93\x8d\xe4\xbd\x9c\xe6\xad\xa5\xe9\xaa\xa4\
+\
+\x00\x00\x04\x4b\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\
+\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\x12\x00\x00\
+\x0b\x12\x01\xd2\xdd\x7e\xfc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\
+\xd2\x01\x07\x0b\x04\x27\xfe\xa6\x99\x03\x00\x00\x03\xc8\x49\x44\
+\x41\x54\x78\xda\xb5\x96\xc1\x4b\x1c\x67\x14\xc0\x7f\xdf\xb7\x3a\
+\x8b\xee\xae\x6e\xdd\x55\x10\xa3\x2b\x9a\x43\x2f\x5a\x0d\x7a\x70\
+\x84\x28\xe8\x65\x23\xae\x04\xeb\x51\x3d\xd4\xc3\x5e\x52\x30\x37\
+\xff\x02\x0f\x42\xc0\xff\xa0\x3d\x84\x1e\x96\x88\x94\x56\xd0\x9e\
+\x84\x44\xa3\xd2\x9a\x88\x20\xba\x4a\x52\xc1\x48\x58\x11\x5a\x75\
+\x67\x66\x67\xbe\x99\x5e\xdc\xa9\x6d\xa3\x96\x62\x3f\x78\xf0\x78\
+\xf3\x78\xbf\xef\xbd\xc7\x7b\xdf\xc0\xff\x7c\xc4\x75\x1f\x92\xc9\
+\x64\x2a\x97\xcb\x8d\x58\x96\xa5\x3b\x8e\xd3\xa0\x94\x02\x38\x04\
+\x56\x2a\x2b\x2b\x33\x1b\x1b\x1b\xdf\xff\x27\xc0\xe8\xe8\xe8\x83\
+\xb7\x6f\xdf\x3e\x93\x52\xf6\xf4\xf5\xf5\xd1\xda\xda\x4a\x2c\x16\
+\xc3\x75\x5d\x72\xb9\x1c\xeb\xeb\xeb\x2c\x2e\x2e\xe2\x38\xce\x72\
+\x5d\x5d\xdd\xd3\xb5\xb5\xb5\x5f\xfe\x35\xa0\xb7\xb7\x37\x75\x7c\
+\x7c\xfc\x42\xd7\xf5\x92\xe1\xe1\x61\x6a\x6a\x6a\x28\x2d\x2d\x45\
+\x08\x81\xeb\xba\xd8\xb6\x8d\x69\x9a\x7c\xf8\xf0\x81\xe7\xcf\x9f\
+\xb3\xba\xba\xea\x44\xa3\xd1\xe1\x83\x83\x83\x6b\xb3\x09\x14\x95\
+\xa1\xa1\xa1\x07\xd9\x6c\xf6\xa7\xc7\x8f\x1f\x97\x8c\x8f\x8f\x13\
+\x8f\xc7\x89\x44\x22\x54\x55\x55\x11\x8f\xc7\xa9\xae\xae\x26\x16\
+\x8b\x11\x0e\x87\x09\x87\xc3\xb4\xb4\xb4\x60\x18\x86\x7c\xf3\xe6\
+\xcd\xc8\xbd\x7b\xf7\x7e\x3c\x3d\x3d\x3d\xbe\x11\x50\x28\x14\xbe\
+\xd3\x75\xbd\x69\x62\x62\x82\x70\x38\x4c\x34\x1a\xa5\xba\xba\x9a\
+\x70\x38\x4c\x30\x18\x24\x10\x08\x10\x08\x04\x08\x06\x83\x44\x22\
+\x11\x42\xa1\x10\xcd\xcd\xcd\xec\xed\xed\xc9\xfd\xfd\xfd\xcf\x2d\
+\xcb\xfa\xe6\x53\x00\x09\xd0\xd6\xd6\x96\x72\x5d\xb7\x67\x6c\x6c\
+\x8c\xf2\xf2\x72\xa2\xd1\x28\xf1\x78\x1c\x4d\xd3\x08\x04\x02\x3c\
+\x7a\xf4\x88\x81\x81\x01\x1f\x22\xa5\x24\x14\x0a\xd1\xd4\xd4\x44\
+\x3a\x9d\xc6\xf3\xbc\x9e\xaa\xaa\xaa\xd4\xb5\x80\x5c\x2e\x37\x92\
+\x4a\xa5\xa8\xad\xad\x25\x14\x0a\x51\x51\x51\x81\x10\x02\x29\x25\
+\x42\xfc\xd9\x26\x21\x04\x42\x08\x1f\x22\xa5\xa4\xad\xad\x8d\x64\
+\x32\x89\x61\x18\x23\xd7\x02\x2c\xcb\xd2\xbb\xbb\xbb\xd1\x34\x8d\
+\x48\x24\x82\x10\x02\xcf\xf3\xf0\x3c\xef\x2f\xce\x45\xdb\x55\xbb\
+\x10\x82\xfe\xfe\x7e\x94\x52\xfa\xa7\x00\x25\x00\x4a\xa9\x86\xfa\
+\xfa\x7a\x82\xc1\xa0\x1f\x7c\x60\x60\xc0\x0f\x70\x65\x36\x7c\x40\
+\x26\x93\xf1\xf5\xfb\xf7\xef\x03\x34\xdc\x04\x40\x08\x41\x49\x49\
+\x09\x4a\x29\x94\x52\x78\x9e\xe7\xc3\x3e\x95\x81\x52\x0a\xdb\xb6\
+\x71\x1c\x07\xdb\xb6\xff\x91\xed\xdf\x01\x87\xef\xde\xbd\x6b\xaa\
+\xab\xab\xc3\xb6\x6d\x84\x10\xcc\xcd\xcd\xf9\xb5\x1e\x1c\x1c\x04\
+\x60\x7e\x7e\x1e\xc7\x71\x50\x4a\x61\x9a\x26\xb6\x6d\x53\x28\x14\
+\xd8\xdd\xdd\x45\x29\x75\x78\x6d\x0f\x3c\xcf\x5b\x59\x5a\x5a\xc2\
+\x34\x4d\x0a\x85\x02\x96\x65\x51\x28\x14\x7c\xdd\x75\x5d\x5c\xd7\
+\xf5\x6d\xa6\x69\x62\x18\x06\x96\x65\x61\x59\x16\x8b\x8b\x8b\xb8\
+\xae\xbb\x72\x2d\x40\x4a\x99\xc9\x64\x32\x64\xb3\x59\x0c\xc3\x20\
+\x9f\xcf\x63\x18\x86\x2f\x45\x40\x3e\x9f\xf7\xc5\xb2\x2c\x0c\xc3\
+\x60\x67\x67\x87\x85\x85\x05\x80\xcc\x4d\xab\x22\xa1\x69\xda\xb7\
+\x9d\x9d\x9d\x3d\xb3\xb3\xb3\x68\x9a\x86\x94\x12\x4d\xd3\xfc\x3e\
+\x08\x21\xfc\xfe\x14\x57\xc6\xc5\xc5\x05\x93\x93\x93\x6c\x6d\x6d\
+\x2d\x03\xbd\x37\x4d\xf2\x6f\x52\xca\xad\xa3\xa3\xa3\xaf\x3e\x7e\
+\xfc\x28\xdb\xdb\xdb\xfd\xe6\x15\xcb\x65\x18\x86\x5f\x9e\x7c\x3e\
+\xcf\xd9\xd9\x19\x33\x33\x33\xac\xae\xae\x3a\xc0\xd7\x40\xf6\xc6\
+\x55\xe1\xba\xae\x26\x84\x58\xde\xdd\xdd\x1d\xd9\xdc\xdc\x94\xf5\
+\xf5\xf5\x94\x95\x95\xf9\xc1\x8b\xf5\x3e\x3f\x3f\x67\x7b\x7b\x9b\
+\xe9\xe9\x69\x5e\xbf\x7e\xed\x00\x79\xe0\x4b\xe0\x14\xf8\xf9\xb6\
+\x75\x9d\x00\x62\x42\x88\x67\x52\xca\x9e\x87\x0f\x1f\xd2\xd5\xd5\
+\x45\x63\x63\x23\x00\x07\x07\x07\xbc\x7a\xf5\x8a\x97\x2f\x5f\x02\
+\x2c\x03\x4f\x81\x17\xc0\x67\x97\x97\x3d\x01\x9e\x00\x3f\xdc\xf6\
+\xe0\x24\x80\x2f\x80\x11\x40\xbf\x32\x44\x87\xc0\xca\x65\x43\x4f\
+\x80\x23\x80\xc6\xc6\xc6\x6d\x40\xbc\x7f\xff\x5e\x02\x36\x90\xbc\
+\xf4\xbb\xf5\x24\x6e\x90\xab\x3e\x27\xe9\x74\xda\xee\xe8\xe8\x30\
+\x80\xdf\x2f\xcb\x96\xb8\xcb\xa7\x37\x01\x9c\x4d\x4d\x4d\x29\x5d\
+\xd7\x1d\xe0\x0c\x38\xbf\x4b\x48\x31\x2b\x33\x9d\x4e\xdb\x89\x44\
+\xc2\xbe\x6b\xc0\x55\xc8\x31\xa0\x80\x1e\x20\x21\xee\xf8\x2f\xe5\
+\xea\x8d\x7f\x05\xf8\x03\xd8\xcb\xf0\xd4\x8e\x80\x5e\x37\x00\x00\
+\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x76\x50\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x01\x2a\x00\x00\x01\x08\x08\x06\x00\x00\x00\xe8\x5e\xb9\x12\
+\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\xd0\xcb\x00\x00\
+\xd0\xcb\x01\x9f\x0e\xc0\x23\x00\x00\x00\x09\x76\x70\x41\x67\x00\
+\x00\x01\x2a\x00\x00\x01\x08\x00\xdc\x89\x70\xd2\x00\x00\x74\x99\
+\x49\x44\x41\x54\x78\xda\xed\xbd\x67\x98\x5d\xd7\x79\x1e\xfa\xae\
+\x73\xce\xcc\x99\x72\xa6\x62\x66\x30\x00\x06\x04\x2b\xc0\xde\x04\
+\x52\x50\xa5\x2c\x51\x85\x12\x65\x39\xb2\x64\xcb\x45\x91\xcb\x75\
+\x42\xdf\x9b\x9b\xe7\x96\x27\xbe\x6e\x71\xb9\x56\x6c\xc5\x92\x15\
+\xeb\xda\x4a\x64\x3b\x91\xe4\xc4\x91\x13\x3b\x11\x25\xf6\x02\x12\
+\x20\x08\x90\x60\x01\x09\x90\x00\x89\x4e\xf4\x36\xfd\xcc\xcc\xe9\
+\x7b\xaf\xfb\x63\xb7\x55\xf7\x5e\xfb\x94\x29\xc4\xfe\xf0\x0c\xce\
+\xde\xab\xaf\x5d\xde\xfd\x7e\xdf\x5a\xdf\x5a\x04\x89\x5c\xf6\x32\
+\xba\xe5\x01\xef\xf0\x23\x00\xfe\x0f\x00\xb7\x00\x28\x02\xf8\x01\
+\x80\xff\x02\xe0\x34\x00\x5c\xd8\xfd\x9d\xa5\x6e\x6a\x22\x97\xa9\
+\xa4\x97\xba\x01\x89\x2c\xad\x30\x20\xb5\x05\xc0\xb7\x01\xdc\x03\
+\x60\x00\xc0\x08\x80\x0f\x03\xb8\x19\xc0\x7e\x00\x17\x73\x63\x9b\
+\x31\x7f\xe6\xd5\xa5\x6e\x72\x22\x97\xa1\xa4\x96\xba\x01\x89\x2c\
+\x0b\x69\x03\xf0\xcf\x01\xdc\xaa\x08\xff\x14\x80\xef\x03\xf8\x38\
+\x00\xc2\x00\x5b\x22\x89\x2c\x9a\x24\x40\x95\x08\x00\xf4\x01\xb8\
+\x3d\x24\xfe\x76\x00\x7f\x03\xe0\x17\x01\xb4\x25\x60\x95\xc8\x62\
+\x4b\x02\x54\x89\x00\x40\xb7\xfb\x17\x26\x1b\x00\x7c\x0b\xc0\xff\
+\x05\xa0\x27\x01\xab\x44\x16\x53\x12\xa0\x4a\x24\x8e\x0c\x00\xf8\
+\x7d\x00\xff\x06\xc0\x48\x02\x56\x89\x2c\x96\x24\x40\x95\x48\x5c\
+\xe9\x04\xf0\xeb\x00\xfe\x03\x80\xeb\x46\xb7\x3c\x80\x04\xb0\x12\
+\x69\xb5\x24\x40\x95\x48\x3d\x92\x01\xf0\x79\x00\xdf\x83\x33\x5a\
+\x98\x80\x55\x22\x2d\x95\x04\xa8\x12\x69\x44\x3e\x00\x07\xac\x3e\
+\x07\x20\x95\x80\x55\x22\xad\x92\x04\xa8\x12\x69\x54\xae\x07\xf0\
+\x1d\x00\xff\x0c\x40\x47\x02\x56\x89\xb4\x42\x12\xa0\x4a\xa4\x19\
+\x32\x0a\xe0\x4f\x01\xfc\x0e\x80\xfe\x04\xac\x12\x69\xb6\x24\x40\
+\x95\x48\xa4\xa4\x52\x69\xd0\xe8\x64\x3d\x00\x7e\x03\xc0\x37\x01\
+\x8c\x25\x46\xf6\x44\x9a\x29\x09\x50\x25\x12\x2a\x94\x52\xac\x1d\
+\x1b\xc3\x5d\x77\xde\x8c\x74\x3a\x0d\x4a\x43\x21\xab\x1d\xc0\x57\
+\xe0\x4c\x0e\xbd\x05\x48\x8c\xec\x89\x34\x47\x12\xa0\x4a\x24\x54\
+\x28\x05\x7a\x7b\xba\xf1\x4b\x5f\xfc\x38\x3e\xff\xe9\x0f\xa2\xb3\
+\xb3\x23\x0a\xac\x52\x08\xdc\x6e\x3e\x8a\xc4\xed\x26\x91\x26\x48\
+\x02\x54\x89\x44\x0a\xa5\x14\xb9\xee\x2c\xbe\xf4\x93\x1f\xc2\x57\
+\xbe\xf8\x71\xf4\xf7\xf5\xc0\xb6\x23\x95\xc1\x3b\x01\xfc\x47\x00\
+\x5f\x02\x90\x49\xc0\x2a\x91\x46\x24\x01\xaa\x44\x8c\x84\x52\x8a\
+\xf6\x4c\x06\xf7\x7d\xe4\x4e\xfc\xfa\x57\x3e\x8b\x75\x6b\x86\x4d\
+\xc0\xea\x2a\x00\x7f\x01\x67\xe9\x98\xee\x04\xac\x12\xa9\x57\x12\
+\xa0\x4a\xc4\x58\x28\x00\x42\x08\xde\x77\xe7\x26\xfc\xcb\x5f\xfd\
+\x1c\x6e\xd8\xb8\x21\x4a\x0d\x04\x80\x55\x00\xfe\x10\xc0\x57\x01\
+\x0c\x25\x60\x95\x48\x3d\x92\x00\x55\x22\xb1\x85\x52\x8a\x9b\xae\
+\x1b\xc3\xbf\xfc\x95\xcf\x61\xcb\x7b\x6e\x02\x40\xa2\x00\xab\x0b\
+\xc0\xbf\x80\xb3\xde\xd5\x35\xc9\x88\x60\x22\x71\x25\x01\xaa\x44\
+\xc2\x85\xb8\xbf\x94\xfd\xa1\xb0\x6d\x8a\xf5\xa3\x83\x78\xe0\xcb\
+\x9f\xc6\x27\x7f\xe2\x2e\xb4\xb5\xb5\x45\x81\x55\x06\xc0\xcf\x00\
+\xf8\x2e\x80\xbb\x80\x64\x44\x30\x11\x73\x49\x80\x2a\x11\x23\xa1\
+\x00\xa8\xfb\xbf\x07\x5a\x36\xa5\x18\xec\xeb\xc6\x2f\x7d\xf1\x63\
+\xf8\xe2\x67\xef\x41\x77\x77\x27\xec\x68\x55\xf0\xc3\x70\x46\x04\
+\x3f\x83\xc4\xed\x26\x11\x43\x49\x80\x2a\x11\x73\xa1\x01\x48\x79\
+\x62\x53\x8a\xce\x8e\x76\x7c\xfe\xbe\xf7\xe1\x57\xbe\x74\x1f\x86\
+\x06\xfb\x4d\x8c\xec\x37\x02\xf8\x6b\x00\xbf\x02\x20\x9b\x80\x55\
+\x22\x51\x92\x00\x55\x22\x91\x42\x23\xc2\x29\xa5\x68\x4b\xa7\xf0\
+\xb1\xf7\xdf\x82\xff\xf5\x2b\x9f\xc5\x86\xf5\xa3\x26\xcc\x6a\x2d\
+\x80\x3f\x03\xf0\x9b\x00\xfa\x12\xb0\x4a\x24\x4c\x92\xcd\x1d\x2e\
+\x73\xc9\x8d\x6d\x06\x80\x7e\x00\xff\x14\xce\x08\x1d\x27\x14\xc0\
+\xf0\xc8\x30\x3e\xf0\x9e\x4d\xe8\xca\x66\xfc\x30\xa8\x12\x02\x58\
+\xb7\x7a\x10\xd7\x5e\xb5\x0e\x17\x2e\xcd\xe0\xe2\xf8\x34\x08\x41\
+\x98\x64\x01\xbc\x0f\xc0\x6a\x00\x7b\x72\x63\x9b\xe7\x92\x0d\x24\
+\x12\x51\x49\xc2\xa8\x12\x31\x12\xc7\x3a\x45\x64\x90\x72\xcd\x56\
+\xde\xa1\x4d\x29\x36\x5e\xb9\x06\xff\xdb\x2f\x7d\x16\x1f\xda\x72\
+\x2b\x48\x2a\x15\x65\x64\xcf\x02\xf8\x55\x38\xaa\xe0\x8d\x40\x62\
+\x64\x4f\x44\x96\x04\xa8\x12\x31\x10\xaa\xa6\x51\x54\x79\x08\x9b\
+\xda\x18\x1d\xee\xc3\xaf\xfd\xfc\x27\x71\xff\xbd\x5b\x90\xcd\xb6\
+\x9b\xb8\xdd\x7c\x06\x8e\x91\xfd\xc3\x40\x02\x56\x89\xf0\x92\x00\
+\x55\x22\x86\x22\xa0\x12\x95\x0e\xb9\x74\x94\x52\xf4\xe6\x3a\xf1\
+\xf3\x3f\x75\x0f\x7e\xee\x9f\x7c\x0c\xbd\x3d\x39\x13\x23\xfb\x5d\
+\x70\xa6\x2f\xfc\x0c\x12\xb7\x9b\x44\x18\x49\x80\x2a\x11\x73\x89\
+\x04\x28\x3e\xc4\xb6\x29\xb2\xed\x19\xdc\xff\xd1\xcd\xf8\x5f\x7e\
+\xe1\xd3\x18\x5d\xbd\xca\x04\xac\xae\x81\x33\x31\xf4\x5f\x00\xe8\
+\x4a\xc0\x2a\x11\x20\x31\xa6\x5f\xf6\x12\xcf\x98\xde\xa6\xd0\x00\
+\x15\x21\x42\x10\x21\x04\x57\xac\x1d\xc6\x95\x63\xa3\x38\x7d\x7e\
+\x02\x53\xd3\x79\x90\x70\x2b\x7b\x17\x1c\x15\x30\x07\xc7\xc8\x5e\
+\x4c\x8c\xec\x97\xb7\x24\x8c\x2a\x91\x68\xa1\xe1\x0c\xaa\x5a\xb3\
+\x61\x59\x9e\xca\x27\xe7\x75\xfe\x28\x6e\xd9\x74\x05\xfe\xc5\x2f\
+\xfd\x24\xee\xbc\x75\x93\x49\xad\x5d\x70\x9c\x99\xff\x12\xc0\x95\
+\x40\x62\xb7\xba\x9c\x25\x01\xaa\x44\x62\x08\x85\x08\x59\x04\xc0\
+\xec\x42\x05\x27\x2f\xe6\x51\xae\x58\x20\x62\x72\xe6\xd0\xa6\x14\
+\x1b\xd6\x0d\xe3\x81\x2f\x7f\x06\x1f\xfd\xe0\x9d\x26\x0b\xf1\x65\
+\xe0\x2c\x13\xf3\x5d\x38\xcb\xc6\x24\x60\x75\x99\x4a\x02\x54\x89\
+\x44\x0a\xe5\xff\x93\xe2\x28\xa5\x98\x98\x2d\xe1\xf8\xf9\x59\x2c\
+\x94\xaa\x4c\x26\xe9\x10\x36\xa5\x58\x35\x90\xc3\x57\xbe\x78\x2f\
+\x7e\xea\xbe\x0f\xa2\x2b\x7a\x21\x3e\x02\xe0\x27\xe0\x8c\x08\x7e\
+\x0a\xc9\x42\x7c\x97\xa5\x24\x40\x95\x48\x6c\xa1\x34\xf8\x63\x42\
+\x31\x3b\x5f\xc6\xb1\xb3\x33\x98\x9d\x2f\xbb\x21\xcc\xec\x75\xff\
+\x98\x82\x52\x8a\xee\xce\x2c\x7e\xfa\xbe\xf7\xe3\x17\xbf\xf0\x09\
+\x0c\xf4\xf7\x9a\xcc\x64\xbf\x05\xce\x12\xc7\xbf\x04\xa0\x3d\x01\
+\xab\xcb\x4b\x12\x63\xfa\x65\x2e\x46\xc6\xf4\xe1\x61\xbc\xff\x3d\
+\x9b\xd0\x99\xcd\xc8\x86\x72\x00\x85\x52\x0d\xd3\x73\x0e\x38\x55\
+\x2c\x1b\xf9\x42\x05\xe9\x34\x41\x57\xb6\x0d\x84\x04\x00\xc5\x15\
+\x0a\x20\x9d\x4a\xe1\xaa\x2b\x46\xb1\x76\x74\x18\x27\xcf\x5c\x44\
+\x7e\x6e\x21\xca\xc8\xde\x0b\xe0\x23\x6e\xb5\xaf\xe7\xc6\x36\x57\
+\x12\x23\xfb\xe5\x21\x09\xa3\x4a\xc4\x4c\x28\x00\x10\x45\x18\xcf\
+\x9a\x00\xa0\x5c\xb1\x70\xf2\x42\x1e\xe7\x26\xe7\x61\xd9\x36\x74\
+\x7a\xa0\xb3\x10\x1f\x70\xd7\x6d\xd7\xe2\xd7\xbf\xf2\x93\xb8\x61\
+\xe3\x55\x88\x26\x56\xe8\x03\xf0\xbb\x70\xb6\xe7\x1a\x05\x12\xbb\
+\xd5\xe5\x20\x09\x50\x25\x62\x2e\x14\x92\x3d\x9d\x03\x29\x26\xbc\
+\x66\x51\x9c\x19\x9f\xc3\xa9\x8b\x79\x54\x6b\xb6\x03\x71\x9a\x39\
+\x58\x94\x52\x5c\x7f\xf5\x5a\xfc\xfa\x3f\xbd\x1f\x5b\x36\xdf\x84\
+\x54\x8a\x44\x01\x56\x16\xc0\xaf\xc1\xd9\xf8\x74\x13\x90\x80\xd5\
+\xbb\x5d\x12\xa0\x4a\xc4\x48\x68\xd8\xf4\x4e\x66\x99\x2a\xca\x20\
+\x19\xa5\x14\x17\xa7\x0b\x38\x7e\x6e\x16\x85\x72\xcd\x4f\xaa\x12\
+\xdb\xa6\x58\x3b\x32\x80\x5f\xfd\xb9\x4f\xe1\x13\x1f\x79\x2f\xda\
+\xdb\x23\x17\xe2\x4b\xc3\xd9\x4a\xfe\xfb\x70\xb6\x96\x4f\xc0\xea\
+\x5d\x2c\x09\x50\x25\x62\x2c\xf2\xe4\x84\x00\x9c\xa8\x10\xc3\x1a\
+\xdc\xa7\xe6\x4a\x38\x76\x76\x06\xf9\x42\x45\x5b\xb0\x37\x7d\xa1\
+\xbf\xa7\x0b\x3f\xf7\xb9\x7b\xf0\x85\xcf\xde\x83\x9e\x5c\xb7\xc9\
+\x9a\xec\x5b\x00\x7c\x0f\xc0\xe7\x01\xa4\x13\xb0\x7a\x77\x4a\x02\
+\x54\x89\xc4\x12\x5e\xfb\x53\xcf\x4a\xa7\x0a\x93\x54\xbe\x50\xc5\
+\xb1\xb3\x33\x98\xca\x17\xa5\xc2\x78\x35\xd0\x46\x67\x47\x1b\x3e\
+\xfb\xb1\xbb\xf0\x95\x9f\xfd\x24\x86\x87\x06\x4d\xc0\xea\x3a\x00\
+\xff\x01\xc0\xaf\x03\xe8\x48\xc0\xea\xdd\x27\xc9\xa8\xdf\x65\x2e\
+\x26\xa3\x7e\x43\xc3\xc3\x78\xdf\x1d\x9b\xd0\xd9\x91\x81\xa8\xbc\
+\x11\x00\x0b\xee\xa8\x9f\x0a\xa0\xbc\x03\x02\x8a\xaa\x65\x23\xbf\
+\x50\x01\x21\x04\xdd\x1d\x6d\x20\x84\x5d\x36\x86\x2f\x37\x95\x72\
+\xdc\x6e\xc6\xd6\x8e\xe0\xcc\xf9\x49\x4c\xcf\x44\xba\xdd\x74\x03\
+\xb8\x07\x40\x27\x80\xd7\x72\x63\x9b\x4b\xc9\x88\xe0\xbb\x47\x12\
+\x46\x95\x48\xb4\x88\x96\x72\xf1\x54\x30\x92\xf3\xc9\x79\xee\x55\
+\xa9\xd9\x38\x75\x31\x8f\x53\x97\xe6\x50\xb5\x6c\xbe\x00\xef\x8c\
+\x61\x65\xb7\xdd\x70\x25\x1e\xf8\xf2\xfd\xb8\xed\xe6\xeb\x4c\x5a\
+\xda\x0d\xe0\xff\x06\xf0\x2d\x00\x57\x00\x89\xdd\xea\xdd\x22\x09\
+\x50\x25\x62\x2e\x94\x28\xf1\xca\xff\x65\xfc\xfa\x44\xd3\x3a\x9b\
+\xcf\xb2\x29\xce\x4f\xcc\xe3\x9d\xf3\x33\x28\x57\x6a\xdc\xa4\x07\
+\x51\xcb\xa3\x94\xe2\xaa\xf5\x23\xf8\xb5\x9f\xff\x34\x3e\xfc\xbe\
+\xdb\x4d\xdc\x6e\xda\x00\xfc\x22\x80\xff\x04\xe0\x36\x20\x01\xab\
+\x77\x83\x24\x40\x95\x88\x91\x88\x33\xcc\x25\x42\xa5\x00\x27\x2f\
+\xc8\xdb\x13\x22\x50\x07\x9d\x11\xc1\xf1\x99\x22\x8e\x9e\x9d\xc1\
+\x5c\xb1\x0a\xbf\x08\x55\xdd\x94\x62\x64\x55\x2f\xbe\xfc\x85\x8f\
+\xe1\xfe\x8f\xbf\x1f\x9d\x66\x6e\x37\xf7\x02\xf8\x5b\xf7\x37\x71\
+\xbb\x59\xe1\x92\x00\x55\x22\xc6\x42\x43\x63\x64\xf6\x24\xad\xb8\
+\xe0\xea\x74\x6c\xf8\xcc\x7c\x19\x47\xce\x4c\x63\x6a\xae\x14\x5a\
+\xba\x4d\x29\x7a\xba\x3b\xf1\xf9\xfb\x3e\x80\x2f\xfd\xd4\xc7\xd0\
+\xdf\xdf\x6b\x62\x64\xbf\x0d\x0e\xb3\xfa\x45\x00\x6d\x09\x58\xad\
+\x5c\x49\x80\x2a\x11\x33\x89\xd8\x8a\x46\xcb\x9e\xbc\x48\x4a\xa5\
+\x70\x0f\x67\x16\x8a\x35\x1c\x3b\x3b\x8b\x8b\xd3\x05\x0e\x7c\xc4\
+\xb9\x5a\xd4\xa6\xc8\xb6\xa7\xf1\xf1\x0f\xdd\x86\x5f\xfe\xd2\x7d\
+\x58\xbb\x66\xd8\x04\xac\xae\x80\x63\xb3\xfa\xbf\x01\xe4\x12\xb0\
+\x5a\x99\x92\x00\x55\x22\xf5\x09\x3b\x3b\x9d\x2a\x36\x7e\x60\x26\
+\x52\xa9\x00\x8a\xc5\x17\x42\x80\x72\xb5\x86\x77\xce\xcf\xe2\xcc\
+\xf8\x3c\x2c\x71\x15\x50\x06\xad\x28\xa5\x48\x11\x82\xbb\x6f\xbb\
+\x0e\xbf\xf6\x8b\xf7\x63\xd3\x75\x1b\x4c\x5a\x3b\x00\xe0\xf7\x01\
+\xfc\x09\x80\x91\x04\xac\x56\x9e\x24\xd3\x13\x2e\x73\x31\x9d\x9e\
+\xb0\xe5\xce\x8d\xe8\xca\xb6\xc9\xfb\x3c\x10\x60\xa1\x54\xc5\xf4\
+\x5c\x89\x43\x1f\xe5\x5e\x10\x3a\x1b\x94\x5b\xa8\x4d\x29\xe6\x0a\
+\x15\x54\x6b\x36\xba\x3b\xdb\x90\x49\xa7\xa4\xe5\x65\xd8\x22\x86\
+\x07\x7b\x71\xdd\xd5\xeb\x31\x93\x2f\xe0\xc2\xa5\x49\xd8\x36\x0d\
+\xdb\x9e\x2b\x03\xe0\x3d\x00\xae\x85\xe3\xd0\x3c\x95\x4c\x5f\x58\
+\x39\x92\x30\xaa\x44\xcc\x84\x7a\x33\xd0\xb5\x91\xea\x99\xeb\xca\
+\x25\x61\xbc\x5c\xd4\x07\x29\x2f\xda\xa6\x14\x17\xa6\x16\x70\xf4\
+\xec\x8c\xbb\xb6\x95\x1e\xfc\xa8\x4d\x31\xb6\x7a\x10\xbf\xf4\x33\
+\x1f\xc7\xc7\x3e\xb4\x19\xd9\xac\x91\xdb\xcd\xe7\xe1\xcc\x64\xdf\
+\x02\x24\x23\x82\x2b\x45\x12\xa0\x4a\x24\x52\xd4\x5e\x7e\xe2\x28\
+\x9f\xda\x7d\x46\x2e\xcb\xfd\xe7\x1a\xb3\xa4\x5d\xe2\x3d\xb7\x9b\
+\x7c\x11\x87\x4f\x4f\x63\x76\xa1\xac\x58\x06\x19\x3e\xd3\xa2\xd4\
+\xc6\x40\x5f\x37\x7e\xf6\x27\x3f\x8c\xcf\xdd\xf7\x21\xe4\x72\x5d\
+\x26\x76\xab\x0f\xc0\x01\xab\xcf\x01\x48\x25\x60\xb5\xfc\x25\x01\
+\xaa\x44\x0c\x44\xc5\x95\xf8\xa8\x30\x70\x72\x92\x05\xec\x49\x3d\
+\x22\x08\x9f\xb5\x79\x31\x73\x85\x0a\x0e\x9f\x9e\xc1\xc4\x4c\x51\
+\x72\x80\x66\x57\xb9\xa2\x94\xa2\xab\xb3\x1d\x9f\xf9\xe8\x5d\xf8\
+\x85\x9f\xfe\x04\x86\x87\x06\x4c\xc0\xea\x7a\x38\xab\x2f\xfc\x73\
+\x00\xd9\x04\xac\x96\xb7\x24\x40\x95\x48\xb4\x78\xac\x87\x3a\x06\
+\x20\x16\x94\x02\x58\x21\x8a\x6c\x34\x16\x40\x89\xac\x0c\x00\x8a\
+\x95\x1a\x8e\x9e\x9d\xc1\xb9\xf1\x79\x66\xab\x2d\x95\x81\x9e\xa2\
+\x3d\x93\xc2\x87\xef\xbe\x11\xbf\xfc\xa5\x4f\xe3\xca\x2b\xd6\x9a\
+\x80\xd5\x28\x9c\x75\xad\xfe\x35\x80\xfe\x04\xac\x96\xaf\x24\x40\
+\x95\x48\xa8\xf8\xf0\xe3\x81\x8c\xf6\xdd\x0f\x54\x40\x09\x9c\x62\
+\x02\x14\x37\x22\x08\x67\x97\x9b\x13\x17\xf2\x38\x71\x61\x16\xd5\
+\x9a\x05\x7d\x0b\x9c\x11\xc4\xdb\x6f\xbc\x12\xbf\xfa\xf3\x9f\xc6\
+\xad\x37\x5d\x87\x50\xef\x40\x47\x72\x00\xfe\x15\x80\x7f\x07\x60\
+\x2c\x01\xab\xe5\x29\xc9\xa8\xdf\x65\x2e\x51\xa3\x7e\x00\xb0\x6a\
+\x68\x08\xef\xbb\x63\x23\xba\x3a\xda\xa4\x38\xe2\x8e\xfa\x4d\xcd\
+\x15\x75\x0b\x79\x2a\x03\xa5\xf5\xad\x54\x5a\x25\xa3\xef\x79\x23\
+\x82\xa5\xaa\x85\x5c\x67\x3b\xda\xd2\xa9\x90\xf4\xc0\x60\x7f\x0e\
+\xd7\x5e\x3d\x86\x85\x62\x05\xe7\x2e\x4e\xc0\xb2\xec\x30\xa7\xe6\
+\x34\x80\x5b\x01\xdc\x0c\x60\x5f\x6e\x6c\xf3\xa5\x64\x44\x70\x79\
+\x49\xc2\xa8\x12\x69\x5c\x04\xb5\x4e\xc5\x9c\x58\xf6\x14\xc6\xa0\
+\xd8\x70\xd1\xa1\x99\x02\xb8\x34\x5d\xc4\xa1\x53\xd3\xc8\x17\xaa\
+\x8a\xf4\xec\x39\xc5\xe8\x50\x1f\x7e\xfe\xf3\x1f\xc5\xa7\x3e\xba\
+\xc5\x64\xb7\x9b\x14\x80\x4f\xc2\x59\x88\xef\xa3\x48\xdc\x6e\x96\
+\x95\x24\x40\x95\x88\x91\xc8\x8b\xe5\xa9\xfd\xfe\xc4\x04\x61\xe0\
+\x24\x83\x8b\xf7\x27\xb8\xe4\x30\xf1\x00\x30\xb3\x50\xc2\xa1\xd3\
+\x53\x98\xcc\x97\xc2\x0d\xf8\x94\xa2\x37\xd7\x81\x9f\xfa\xe4\xfb\
+\xf0\xd3\x9f\xfd\x09\x53\xb7\x9b\x3b\xe1\xb8\xdd\xfc\x1c\x80\x4c\
+\x02\x56\xcb\x43\x12\xa0\x4a\xc4\x48\xb4\xe3\x7e\x0c\xdd\xf1\x40\
+\x26\x0e\x38\xb1\x71\x92\xcf\xa0\x14\xef\x08\x01\xb0\x50\xac\xe2\
+\xf0\xe9\x69\x9c\x9f\x5c\x50\x82\x8f\xdf\x02\x9b\xa2\x23\x9b\xc1\
+\xbd\x1f\xb8\x0d\x5f\xfe\xc2\x27\x4c\xdd\x6e\xae\x04\xf0\x17\x70\
+\x76\x6a\xee\x4e\xc0\x6a\xe9\x25\x01\xaa\x44\xcc\x85\x52\x35\x8d\
+\xa2\x1e\x24\xc9\x76\xa7\x70\xc6\x13\x0f\xa0\xfc\x74\x6e\x58\xb9\
+\x6a\xe1\xd8\xb9\x19\x9c\xbc\x38\x87\x9a\xbf\xb6\x55\x30\xd3\x9d\
+\x75\xf1\x49\xa7\x09\xee\xbe\xfd\x3a\xfc\xf2\x97\xee\xc3\xa6\x6b\
+\x8d\xdc\x6e\x06\x01\xfc\x21\x80\xaf\x02\x18\x4e\xc0\x6a\x69\x25\
+\x31\xa6\x5f\xe6\x62\x62\x4c\x1f\x1c\x1a\xc2\x96\xdb\x37\xa2\x4b\
+\xb5\xc2\x27\x01\xe6\x8b\x55\x4c\xb9\x6a\x58\x94\xb0\x06\x72\x40\
+\xc1\xd0\xa0\x02\x36\x2a\x85\xfb\x18\x69\x03\xf9\x85\x32\x2a\x55\
+\x1b\x3d\x5d\x6d\xc8\xa4\x89\xba\x50\x57\x86\x57\xf5\xe1\xaa\x2b\
+\xd7\x21\x3f\x57\xc0\x85\x4b\x53\xb0\xed\x50\x23\x7b\x1b\x80\xcd\
+\x00\xae\x86\xb3\x6a\xe8\x74\x62\x64\x5f\x1a\x49\x18\x55\x22\x86\
+\xc2\xf3\x1d\x89\x54\x85\xe5\x14\x6c\x4f\x61\xec\x49\xc7\xa0\xbc\
+\x70\x6e\xbe\xa7\x1b\x66\x53\x8a\xf3\x53\xf3\x38\x74\x6a\x1a\xf3\
+\xc5\xaa\x5c\x3f\xdb\x4e\x4a\x71\xc5\x9a\x55\xf8\x85\x9f\xbe\x17\
+\x3f\xf1\xc1\xf7\x20\x9b\x6d\x8f\x52\x05\x33\x00\xbe\x08\x67\x26\
+\xfb\xdd\x40\xe2\x76\xb3\x14\x92\x00\x55\x22\x46\xe2\xbc\xec\x44\
+\x37\x3f\xdd\x49\xc3\xae\xa6\x10\x02\x4e\x66\xea\x5d\x34\x40\x01\
+\xbc\x9a\x37\x99\x2f\xe1\xed\x93\xd3\x98\x76\xb7\x94\x07\x34\x8c\
+\xcd\xa6\x18\xea\xcf\xe1\x0b\x9f\xf9\x10\x3e\xfb\xc9\x0f\x9a\xee\
+\x76\xf3\x21\x38\x60\x75\x3f\x12\xb7\x9b\x45\x97\x04\xa8\x12\x69\
+\x4c\xc4\x91\x3a\x0e\x98\xc2\xc1\x29\x8a\x3d\x01\xe1\x00\xc5\x3a\
+\x34\x7b\x51\x73\x85\x0a\x0e\x9d\x9a\xc2\xc5\xe9\x02\xc4\xd5\x62\
+\x78\xbb\x15\x45\x77\x57\x3b\x3e\xf5\x91\xf7\xe0\x67\xff\xc9\xc7\
+\x4c\xdd\x6e\x6e\x04\xf0\x57\x00\x7e\x15\x89\xdb\xcd\xa2\x4a\x02\
+\x54\x89\x98\x89\x37\x2d\x9d\x33\xa6\xf3\x8a\x9f\x76\xba\x02\xa2\
+\xc0\xa9\x4e\x80\xa2\x72\x3d\x84\x00\xc5\x72\x0d\x87\x4f\x4f\xe3\
+\xf4\xa5\xb9\x60\x6d\x2b\x45\xd9\x94\x52\x64\xdb\xd2\xf8\xc0\xe6\
+\x1b\xf0\xe5\x2f\x7e\xca\xd4\xed\x66\x2d\x80\x6f\x00\xf8\x2d\x00\
+\x7d\x09\x58\x2d\x8e\x24\x40\x95\x08\x10\x6e\x62\xe2\x9c\x80\xc5\
+\x99\x51\xf2\xd6\xa3\x6e\x2a\x5a\x3f\x38\x51\x05\xda\x45\x01\x94\
+\x53\x27\xf5\x81\xa6\x6a\xd9\x78\xe7\xfc\x2c\x8e\x9f\x9d\x41\xa5\
+\x6a\xfb\xae\x34\x3c\xa4\x3a\xff\xa7\x53\x04\xb7\xdd\xb0\x01\x5f\
+\xf9\xd9\x4f\xe1\x96\x1b\xaf\x75\xb6\xf1\x0a\xbf\x22\xbd\x00\x7e\
+\x13\x0e\x60\xad\x4d\xc0\xaa\xf5\x92\x59\xea\x06\x78\xe2\xde\xec\
+\x34\x9c\xd5\x18\xc7\x00\x64\x15\xc9\x0c\xc6\x95\xa4\xf4\xa4\x09\
+\x65\x34\x2a\xf5\x94\xd1\x68\xbd\xa6\xf9\x29\x1c\x96\x90\xd5\xa6\
+\xf0\x37\x9f\xa1\xda\x42\xf5\xd3\x10\xf8\xb9\x54\xa1\x29\xc4\x09\
+\xa0\xe0\xd9\x90\xbe\x6e\x2a\x97\x47\x1d\x23\xfb\x99\xf1\x79\x94\
+\xab\x36\xae\x5e\xdb\x87\xae\x6c\x46\x55\x89\x2f\x57\x5f\xb1\x1a\
+\x5f\xfe\xc2\x27\xf0\xd0\x53\xbb\xf0\xd2\x9e\x03\xa8\x56\x6b\x61\
+\x23\x82\x59\x00\xbf\x02\x60\x0d\x80\xff\x67\x74\xcb\x03\x07\x00\
+\xe0\xc2\xee\xef\x18\x5e\xf6\x44\xe2\xc8\xb2\x00\x2a\x17\xa4\x06\
+\x01\xfc\xef\x00\x3e\x03\x60\x03\x5a\xcb\xf6\x9a\x01\x3e\xad\x96\
+\xc5\x6c\x63\x1a\xce\x14\x85\x88\x96\x10\x75\xb3\x54\x3a\x9a\x17\
+\x15\x13\x9c\x9c\xa0\x06\x00\x4a\xc8\x40\x01\x5c\x9a\x29\xa0\x5c\
+\xad\xe1\x9a\x75\xfd\xe8\xeb\x6e\xe7\x22\x79\xb2\x47\x31\x3a\xdc\
+\x87\x9f\xf9\xec\x47\xd0\xd7\x9b\xc3\xb6\x9d\x7b\x50\x28\x94\xc2\
+\xc0\x2a\x05\xe7\x79\x1d\x81\xe3\xd8\xbc\x63\x74\xcb\x03\x34\x01\
+\xab\xe6\xcb\x92\x03\x95\x0b\x52\x59\x38\x8b\xef\xff\x2b\x38\x73\
+\x57\x12\x59\x69\x12\x32\xb1\xd3\x8d\xd6\x9c\x78\x41\xf2\x24\xa9\
+\x46\x00\x8a\x0f\xa7\x98\x99\x2b\xe3\xed\x93\x93\xb8\x66\x6d\x3f\
+\x86\xfb\x3a\xb5\xe5\x53\x4a\xd1\xdf\xdb\x85\xfb\x3f\xbe\x05\xfd\
+\x7d\x3d\x78\xec\xe9\x17\x4c\x76\x69\xbe\x0b\x8e\xdb\xcd\xef\x00\
+\xf8\x9f\xa3\x5b\x1e\xa8\x25\x60\xd5\x5c\x59\xf2\x09\x9f\xee\x84\
+\xc3\x3b\x01\x7c\x13\x40\xcf\x52\xb7\x27\x11\x59\x06\x87\x86\xb0\
+\xe5\x8e\xeb\x9c\x35\xd3\x21\x03\xd2\x7c\xb1\x8a\xc9\x7c\xb0\xdd\
+\x55\x84\x06\xc8\x04\x99\x83\x93\x53\x6f\x7c\x80\xf2\xcf\x09\x50\
+\xa9\xda\x98\x99\x2f\x23\x95\x22\xe8\xee\x6a\xd3\x82\x0f\x05\xd0\
+\x9e\x49\x63\xfd\xba\x11\x0c\xad\x1a\xc0\xb9\x0b\x93\xc8\xcf\x2d\
+\x44\x81\xd5\x20\x80\x8f\x00\xa8\x00\x78\x23\x37\xb6\xb9\x9a\x4c\
+\x0c\x6d\x9e\x2c\x17\xa0\xfa\x30\x9c\xbd\xd7\x0c\x96\x0f\x4a\x64\
+\xb1\x65\xd5\xf0\x30\xee\xbe\xed\x3a\x74\x75\xb4\x49\x20\x45\x08\
+\x30\x5f\x70\x80\x2a\x4c\x9d\x0b\xa2\x14\xd3\xcb\xd1\x42\x80\x62\
+\x22\x09\x80\x9a\x4d\x31\x33\x5f\x86\x4d\x29\x7a\xbb\xda\x91\x4e\
+\x11\xb9\x0c\x37\x63\x3a\x05\xac\x59\x3d\x88\x75\x6b\x47\x30\x31\
+\x39\x8b\xc9\xe9\xd9\xa8\x4b\xd5\x05\xe0\x83\x70\x3e\xb8\xaf\xe5\
+\xc6\x36\x17\x12\xb0\x6a\x8e\x2c\x17\xa0\xba\x1b\xc0\x4f\x22\x01\
+\xaa\xe5\x27\x24\x85\xd5\x6b\xc7\x70\xd7\x2d\x57\x69\xd7\xa3\x9a\
+\x2f\x56\x31\x31\x5b\x32\x66\x4d\xc2\xa1\x52\xb4\xe0\xa4\xc8\x1c\
+\x05\x50\x7c\x98\xb3\xb6\xd5\xec\x42\x19\xe5\x8a\x85\x9e\xae\x2c\
+\xda\x32\x29\x01\xfc\x82\xd4\x84\x00\x43\x83\xbd\xd8\x70\xc5\x5a\
+\xcc\x2d\x14\x71\x31\xda\xed\xa6\x1d\x8e\x2a\xb8\x01\x0e\x58\xcd\
+\x24\x6e\x37\x8d\xcb\x72\x01\xaa\x3b\x90\x00\xd5\xf2\x13\x4a\x91\
+\xcd\xf5\x61\x74\xfd\x95\xb8\x63\xd3\x1a\x2d\x50\xcd\x15\x2b\x98\
+\xcc\x17\xe5\x31\xc1\x18\xc0\xe4\x54\xa7\x30\xc6\x87\x14\x10\x0a\
+\x50\x6e\x00\x15\x52\xb3\x76\xff\xf9\x62\x15\x0b\xa5\x2a\xba\x3b\
+\xda\x90\x6d\x4b\x4b\x20\xc5\x96\xd7\xd7\xd3\x85\xab\x37\xac\x45\
+\xcd\xb6\x71\xfe\xc2\x04\x6a\x35\x2b\x6a\x21\xbe\x9b\xe1\xec\xd4\
+\x7c\x00\xc0\xb9\x04\xac\x1a\x93\x15\x01\x54\xa2\x1b\x45\xf2\xd7\
+\xcc\x3f\xaa\x08\x23\x20\xe9\x34\xda\xba\x7a\xd1\x3b\xba\x01\x7d\
+\xfd\x7d\xb8\xfd\xda\x61\x74\x77\x64\x14\x13\x14\x88\x92\x51\x19\
+\xcf\x8d\x88\x09\x4e\x7c\x7c\x4c\x80\x12\x12\x53\x00\xc5\x52\x0d\
+\xb3\x0b\x65\x74\xb6\x67\xd0\x99\xcd\x40\x91\xcc\xaf\xaa\xbb\x33\
+\x8b\xab\xae\x58\x8b\xf6\x6c\x3b\xce\x9e\x1f\x47\xb9\x5c\x09\x03\
+\x2b\x02\xe0\x2a\x00\xef\x07\x70\x02\xc0\xb1\x04\xac\xea\x97\x25\
+\x1f\xf5\x8b\x92\x6c\xb6\x1d\x37\xdc\xb0\x09\xab\x06\x7b\x23\x52\
+\x12\xf7\x7f\xaa\x1c\x7d\xe2\x9e\x27\xca\x65\x79\x17\x4b\x34\x72\
+\xa8\x82\x09\x21\xc8\x64\x3b\xd1\xd6\xd1\x0d\x92\x4a\xa3\xa7\xab\
+\x1d\xed\x6d\x69\x7f\x8b\x2b\x3e\x31\xe5\x3e\x24\x91\x2d\xd2\x0c\
+\x0d\x46\x8f\x0a\xfa\x05\xe8\xeb\x8a\x01\x50\xec\x41\x7e\xa1\x82\
+\xb7\x4e\x4e\xe2\xea\xb5\xfd\x18\x1d\xec\x96\x36\x31\x0d\x7c\x18\
+\x29\x7a\xba\xb3\xb8\xf7\x43\x77\xa2\xaf\x37\x87\x47\x9e\xda\x85\
+\x4b\xe3\x53\x51\x46\xf6\x9b\x01\xfc\x35\x9c\x9d\x9a\xff\x6e\x74\
+\xcb\x03\x95\x64\x44\x30\xbe\x2c\x6b\xa0\x72\xb6\x41\xea\xc0\x47\
+\xdf\x7f\x2b\x36\x5d\xb3\x16\x80\x06\x5b\x88\xf3\x5f\x14\xee\xa8\
+\x9e\x27\xa2\x3b\x23\xe6\x38\x46\xd4\x85\x29\xcb\x35\x48\x62\x5e\
+\x5f\x4c\x51\x82\x92\x2e\x9d\x00\x28\xa9\x14\x31\x9f\x7e\xc0\x86\
+\xd7\x09\x4c\x72\x1a\x3d\x7b\xe2\xc3\xf5\x00\x15\xf4\xcd\x3b\x76\
+\x0e\x1c\xb7\x1b\x0b\x87\x4e\x4d\xa3\x54\xb1\x70\xc5\xea\x1e\xa4\
+\x35\xfd\xa5\x14\xe8\x68\xcf\x60\xcb\x9d\xd7\xa3\x27\xd7\x85\x87\
+\x9e\x78\x1e\xef\x9c\x3c\x17\x05\x56\x63\x70\x46\xb5\xd7\x01\xf8\
+\xd6\xe8\x96\x07\xf2\x09\x58\xc5\x93\x65\x0d\x54\x80\xf3\x10\xa5\
+\x52\x04\x29\x12\x4c\x36\x54\x83\x15\x45\xc0\xaa\xc2\xcb\x93\xc2\
+\xfc\x23\x86\x6a\x11\x44\x96\x25\xe7\xd7\x65\xe0\x29\xdc\x52\x82\
+\x95\x79\x05\x71\x6b\xa0\x91\x7e\x72\x4d\x03\x27\x26\x30\x16\x40\
+\xb9\x07\xba\x8d\x25\x6a\x96\x8d\x77\xce\xcd\xa2\x5c\xa9\xe1\xaa\
+\x35\x7d\xc8\xb6\xa7\x35\x9b\xa8\x02\xe9\x74\x0a\xb7\x5c\xbf\x01\
+\xb9\xee\x4e\x3c\xfc\xe4\x4e\xec\x7f\xfb\x78\xd4\x96\xf2\x7d\x00\
+\x7e\x1b\x0e\x58\xfd\xc1\xe8\x96\x07\x2e\x00\xc9\x4c\x76\x53\x59\
+\xf6\x36\xaa\xae\xce\x0e\xdc\x7e\xeb\x26\x0c\x0d\xe4\xa4\xbc\x44\
+\x1b\xd0\x0c\x76\xc5\x84\xc4\x00\x2d\xa1\x19\x26\xa9\x4c\x93\xd5\
+\x2d\xcd\x00\x35\x2d\x04\xb9\xc6\xf4\x89\xd9\x52\x78\x7a\xe3\xc9\
+\xa0\xd4\xa8\x8c\x7a\x00\xca\xf9\x61\x72\x2a\xda\x64\x53\x8a\xfc\
+\x42\x05\x85\x72\xcd\x57\x79\xd5\x4d\xa0\x20\x00\x06\xfa\xba\x71\
+\xe5\x15\x6b\x51\xae\x54\x71\x21\x7a\xb7\x9b\x0c\x9c\x67\x7d\x13\
+\x80\xbd\x00\x26\x12\xbb\x95\x99\xac\x08\xa0\xba\xe3\xd6\x4d\x18\
+\xea\x77\xe7\x82\x0a\x29\xc2\x54\x41\x6d\x3c\x9b\x74\xc9\x01\x4b\
+\x4e\x14\x99\x7c\x19\xd9\xd6\xbc\xe9\x09\x93\xb3\x66\xf3\xa8\x94\
+\xd1\x61\xcc\x89\x89\x50\x41\x58\xb3\x00\x4a\x64\x83\x0b\xa5\x2a\
+\xf2\x0b\x15\x74\x77\xb4\xa1\xa3\x3d\xc3\x14\x25\x1b\xe4\x72\x5d\
+\x1d\xb8\x6a\xc3\x3a\xa4\x52\x69\x9c\xbb\x30\x8e\x4a\xb8\x8f\x60\
+\x0a\x0e\x50\xdd\x05\xe0\x10\x80\xd3\x09\x58\x45\xcb\xca\x58\x3d\
+\x81\x6a\x8e\x11\x8c\x54\xc9\xe9\xbd\x31\xad\x88\xa2\xa9\xfc\xe0\
+\xca\x65\xba\x21\xfc\x8f\x51\xb3\xa9\x5b\x47\x74\x26\x76\x1c\x8e\
+\x1f\x85\x0b\x49\xaa\xfe\x6b\xb5\x28\xea\x0c\xeb\xa3\xd4\x3c\x66\
+\x59\x05\x4a\xa9\xfe\x1e\x7a\xc9\xc0\x82\x04\x0d\xbd\xae\x41\x1d\
+\xde\xbd\x0a\x5c\xa9\xf5\x9b\x4b\x50\x39\x3f\x80\x99\xf9\x32\x0e\
+\x1c\x9f\xc0\xc5\xe9\x42\x50\xab\xa2\xb1\x14\x40\x5f\x4f\x27\x3e\
+\xf9\xd1\xbb\xf1\xb9\xfb\xee\xc1\xe0\x80\xd1\x6e\x37\xef\x85\xe3\
+\x76\xf3\xd3\x00\xd2\xc9\x0a\x0c\xe1\xb2\x32\x18\xd5\x2d\x9b\xb0\
+\x6a\xa0\x27\x44\xd5\x0b\x63\x56\xce\x81\x91\xad\xa9\x85\xec\x4a\
+\xd1\xa4\x7a\x72\x35\x46\xa6\xe2\x9b\x9d\xa2\x8b\x24\x04\xf3\xae\
+\xea\xa7\x06\x55\x6a\x56\xa4\x76\x80\x52\xc1\xb6\x22\xd8\x93\x73\
+\x18\xce\xa0\x9c\xf0\x68\x35\xb3\x62\x59\x98\xce\x97\x90\x4a\x11\
+\xf4\x74\xb6\x73\x4c\x49\xcc\xd3\x96\x49\x63\xdd\x9a\x61\xac\x5a\
+\x35\x80\x8b\x97\xa6\x4c\xdc\x6e\x56\x01\xf8\x09\x00\x45\x00\xfb\
+\x13\xb7\x1b\xbd\x2c\x7b\x63\x3a\x2b\xd2\xac\x02\xea\xd8\x14\x2c\
+\x66\x29\xc7\x30\x30\xab\xd7\x76\xc5\x15\xa3\xb0\x9c\x13\x21\xbc\
+\x6e\xf0\x32\xce\x4c\x62\x84\xb6\x56\x08\x21\xb0\x6c\xd7\x90\x6e\
+\x0a\x4a\x8a\x04\x71\xc1\x89\x0b\x52\xa8\x77\x80\x19\x40\xe9\xea\
+\xf1\x5a\x40\xe0\xec\x76\x73\xe4\xf4\x34\x4a\x65\xc7\xc8\xde\xd6\
+\x96\x92\xcb\x76\xcf\xdb\x33\x69\xdc\x71\xf3\xb5\xe8\xc9\x75\xe1\
+\x91\x27\x77\xe2\xd0\xd1\x53\x51\x57\x61\x18\xc0\x1f\xc3\x19\x19\
+\xfc\xb7\xa3\x5b\x1e\x98\x4a\x0c\xec\xb2\xac\x28\xa0\xf2\x24\x18\
+\xdf\x03\xce\x4f\x2e\xe0\xec\xc4\x3c\x08\x91\x79\x87\x9e\x21\xc9\
+\xa8\x42\x54\xe9\x88\x1c\xa3\x08\xe2\xcb\x8c\x62\x5a\x44\x0f\x33\
+\xe1\xac\x50\x5b\x9c\x61\x64\x7c\x18\x73\x72\x44\xd3\xaa\x72\xd5\
+\xf2\x55\x38\xad\xd0\xb0\x53\x0d\xb3\xa1\x11\xc5\xb4\x0c\xa0\xdc\
+\x52\x99\x04\x96\x4d\x71\xf2\x42\x1e\xa5\x8a\x85\x6b\xc7\xfa\xd1\
+\xd5\x91\x11\x17\x38\xf5\x0f\xd3\x29\x82\x8d\x57\xad\xc3\xcf\xfc\
+\xd4\xbd\x78\x7c\xeb\x8b\x78\xfd\xcd\x43\x51\x33\xd9\x73\x00\xfe\
+\x4f\x38\xeb\x82\xfd\xee\xe8\x96\x07\x4e\x02\xc9\x88\x20\x2b\x2b\
+\x0c\xa8\x02\x4e\xe5\x1d\x15\x4a\x35\x4c\xcd\x16\x7d\x54\x62\x1f\
+\x05\xd5\x83\x41\x54\x0c\x2b\xcc\x40\x4f\xf4\x8a\x97\x16\x08\xa3\
+\x8c\xf9\x26\x03\x02\x50\x03\x60\x1c\x69\x05\xc3\xd2\x81\x91\x72\
+\x42\xad\x36\x4f\x34\x60\x44\xc5\xab\x60\xb1\x15\x00\xc5\x8a\x4d\
+\x81\xf3\x93\xf3\x28\x57\x6b\xd8\xb8\x7e\x10\x7d\xdd\xed\xca\x2d\
+\xbc\x9c\xeb\x41\xb1\x7e\xcd\x20\x3e\x7f\xff\x3d\xe8\xed\xe9\xc6\
+\xae\x97\xf7\xa1\x54\xaa\x44\x6d\xcd\xf5\x0b\x00\x46\x01\xfc\x06\
+\x80\xd7\x47\xb7\x3c\x90\x80\x95\x2b\x2b\xc3\x98\x2e\x59\x30\x19\
+\x55\x8f\x38\xff\x11\x30\xf8\x40\xbc\x17\x27\x98\xd0\x47\x08\xff\
+\x32\x39\xe7\x94\xc3\x01\xe2\x97\xc7\x94\x23\xb4\x43\x55\x16\x5b\
+\x07\xab\x97\x4a\x84\xc6\xcb\xcb\x57\x21\xa5\x01\x5b\x16\xa1\xee\
+\x1c\x31\xa1\xbe\xb0\x3f\x22\xf7\xa3\x59\x7f\xaa\xf6\xfb\x97\x5a\
+\x30\x7e\xab\x86\x06\x24\x97\x1d\xcd\x40\x00\x6f\x7c\xf7\xca\x8e\
+\xbb\x03\x33\xd5\x1a\xca\x65\xdb\xb8\xdb\x3e\xcd\x24\x4f\x6f\xa3\
+\x54\x0a\x60\x72\xb6\x84\x37\x8f\x8d\x63\x7c\xa6\xa8\x78\x22\xf9\
+\x8e\x0c\x0d\xe4\xf0\xe9\x7b\xdf\x87\x4f\xdf\xfb\x01\xf4\xf6\x44\
+\xee\x76\x43\x00\xdc\x0b\x67\xb7\x9b\x4f\x00\x20\x89\x91\xdd\x91\
+\x95\x6d\x4c\x07\x30\x35\x57\xc6\xd4\x9c\x33\x87\x47\xa5\xe9\xb0\
+\xac\x44\xc9\x80\x04\xe3\x93\xce\xd8\x2d\xa9\x86\x21\x46\x52\x35\
+\xd3\x52\x1b\xb1\xe2\xcc\xa1\x8a\x6b\x99\x6a\x36\xa3\xa2\x31\x63\
+\x69\xcc\x42\x4c\x99\x13\x60\xce\x9e\xf4\xe5\xf2\x01\x3a\x80\xe2\
+\xd2\x30\x19\xcb\x55\x1b\x53\x73\x25\x64\xd2\x69\xe4\xfc\xb5\xad\
+\xd4\x2a\x68\xb6\x3d\x83\xb1\x75\x23\xe8\xef\xeb\xc5\xf9\x8b\x13\
+\x98\x5f\x28\x46\x19\xd9\x47\xe1\xac\x6d\x35\x05\xe0\xed\xdc\xd8\
+\x66\xeb\x72\x37\xb2\xaf\x1c\xa0\x72\xe7\x51\x89\xf7\x77\x2a\x5f\
+\xc2\x54\x3e\x58\x2e\x56\x65\x4c\x37\xb2\x5d\xd5\x09\x58\x4e\xde\
+\x78\xa0\xe5\x94\x53\x07\x70\x69\x12\x98\x01\x52\xbd\xb0\x15\x6f\
+\xbe\x43\x1c\x70\xd2\xa9\x7c\x71\xc1\xc9\x89\x33\x30\xe4\xd3\x06\
+\x00\x4a\x2c\x94\x00\x55\x8b\x62\x7a\xce\xd9\x21\xba\xb7\xbb\x8d\
+\x5b\xdb\x4a\x2c\x37\x93\x4e\x61\x74\x64\x15\x56\x8f\x0c\x61\x62\
+\x72\x1a\x33\xb3\xf3\x51\x97\xb2\x0f\xc0\x3d\x6e\xad\xfb\x72\x63\
+\x9b\x2b\x97\x33\x58\xad\x1c\xa0\x1a\xe0\x17\xff\xf4\x00\x60\x2a\
+\x5f\xc2\xa4\xc7\xa8\x88\x08\x49\xfc\x49\x33\x01\x4b\x15\x14\xf1\
+\x95\x34\x03\x2d\x45\xc1\xc6\x10\xd3\x24\x0a\x45\x22\x63\xf5\x7f\
+\x84\x57\x08\x95\x05\xca\x00\xa5\x86\xa6\xa8\xa9\x48\x91\xec\x89\
+\x09\x68\x16\x40\x09\x58\x05\xcb\xb6\x31\x33\x57\x46\xa5\x66\xa3\
+\x37\x97\x45\x26\xad\x1f\x11\x4c\xa7\x08\x86\x06\xfb\x30\xb6\x6e\
+\x35\xf2\x73\x0b\x18\x9f\x98\x01\xa5\x08\x73\xbb\xe9\x04\xf0\x01\
+\x38\xab\x87\xee\xc9\x8d\x6d\x5e\xb8\x5c\x27\x87\xae\x58\xa0\x02\
+\x9c\x1b\x3c\x95\x2f\x61\x6a\xae\xe4\x67\x14\xc1\xa2\x59\x80\xc5\
+\x1d\x35\xc8\xb2\xe4\x3a\x14\x71\x06\x95\x34\x05\x97\x04\x1b\x9d\
+\x0c\x36\x5a\x8b\x9a\xd1\xbc\xa9\xd0\xb4\x7e\xfd\x44\xea\x6f\xdd\
+\xaa\x9d\x10\x68\x02\x50\x41\x78\x08\x83\x12\x4e\x45\xdb\x57\x7e\
+\xa1\x82\x85\x62\x0d\xbd\x5d\xed\xc8\xb6\xa7\x95\x99\x28\x9c\xe7\
+\xa2\xbf\x37\x87\x2b\xd6\xaf\x45\xb5\x5a\xc5\x85\x4b\x93\xb0\xac\
+\xd0\x11\xc1\x0c\x80\xf7\x00\xb8\x0e\xc0\xeb\x00\x26\x2f\x47\xb0\
+\x5a\x39\x40\xa5\x71\xa1\x99\x9a\xf3\x54\x3f\x3e\x5c\xcb\xae\x98\
+\x00\x13\xc0\xe2\xc3\xe3\xb3\x2c\xb1\x2d\x61\x12\x95\x8c\xd4\x81\
+\x56\x66\xaa\xa4\x1a\x88\x78\x31\x54\x01\x4d\xd1\x53\xc9\x52\xf4\
+\xed\x30\x55\xed\xf8\x38\x13\x70\x62\xd2\x69\x0a\xd7\x01\x94\x58\
+\xce\x42\xa9\x8a\xd9\xf9\x32\xba\x3a\xda\x9c\xb5\xad\xa8\xb2\x38\
+\x10\x02\xe4\xba\xb2\xd8\x30\xb6\x16\x99\x74\x1a\xe7\x2f\x4e\xa0\
+\x52\xa9\x46\xb9\xdd\xdc\x00\x07\xb0\x0e\xe2\x32\x74\xbb\x59\x79\
+\x40\xe5\x89\x52\xf5\x93\xcb\x6f\x25\x60\x71\x47\x31\x30\xa4\x59\
+\xc0\xc5\xd7\x15\x4a\xcf\x22\xdb\x64\x9e\xc0\x4b\xc4\xfc\x51\x35\
+\xfb\xa2\x11\x6d\x52\x72\x23\xaa\x06\x21\xe2\x0f\xb7\x46\x19\xc7\
+\x83\xb3\x56\x03\x94\x58\x07\x05\x45\xb1\xe2\xcc\x64\xcf\xb6\x65\
+\x90\xeb\x6a\xd7\x5c\x01\x27\x53\x47\xb6\x0d\xeb\xd6\xad\x46\x4f\
+\x77\x37\xce\x5f\x98\x40\xa1\x58\x8a\x7a\x36\xd6\xc3\x59\x93\xfd\
+\x0c\x80\x23\xb9\xb1\xcd\xf4\x72\x01\xab\x15\x03\x54\x83\x9e\x31\
+\x9d\x8d\x24\xc0\x64\xbe\x84\xa9\xb9\xa2\xff\xa2\x46\x81\x15\xd0\
+\x38\x60\xf1\x71\x0a\x23\x7e\x4c\xe2\x63\x0a\x5c\x72\xdd\x11\xe9\
+\xf4\xb3\x4b\xe3\xd9\xa1\x88\x08\x48\x42\x21\x52\x61\xe1\x43\x7b\
+\x91\x03\xf4\x3a\x9b\x16\x55\xb7\x5c\x9c\xc7\xde\x4c\x80\x72\xf2\
+\x85\xcf\xd9\x62\xf7\x21\x24\x00\x2a\x96\x8d\xa9\x7c\x11\x29\x42\
+\xd0\xdb\x9d\x75\x97\x28\x52\xb7\xb1\x3d\x93\xc6\x9a\xd1\x21\x0c\
+\x0d\xf5\xe3\xd2\xf8\x14\x66\xa3\xdd\x6e\x86\xe0\xb8\xdd\x2c\x00\
+\x78\x33\x37\xb6\xb9\x76\x39\x80\xd5\x8a\x01\x2a\x91\x51\x79\x09\
+\xa7\xe6\x8a\xce\x56\x4d\x84\x67\x15\x8b\x0f\x58\x4c\xfa\xd0\x4a\
+\x42\x83\x95\xed\x34\x15\x6e\x9e\x58\x0c\x8b\x7c\xd0\x6a\x8d\xfa\
+\xc7\x02\x92\x3f\x69\x4a\x2f\x46\x40\x44\xd4\x91\xd4\x07\x44\x55\
+\x59\x54\x5b\xa4\x9f\xa2\xde\x51\x3c\xc4\x07\x28\x27\x8f\x1a\x79\
+\x2d\x8b\x62\x6a\xae\x84\x9a\x45\xd1\x9b\x6b\x47\x26\x1d\x3e\x22\
+\x38\xbc\x6a\x00\x6b\xd6\x8c\x60\x66\x26\x8f\xa9\xa9\x59\x44\x48\
+\x0e\xce\x88\x60\x07\x9c\x0d\x24\x4a\xef\x76\xb0\x5a\xb1\x40\x05\
+\x37\x31\x67\x4c\xf7\x81\xa6\xd9\x80\x15\x9c\xc5\x05\x2d\xa9\x9c\
+\xba\x18\x8e\xba\xdd\xea\xfa\x65\x14\x88\xb6\x7d\xc5\x15\x51\xbd\
+\x13\x98\x57\x84\x11\x3e\x96\xaf\x8d\x10\x2c\xaa\x7d\xb2\x7d\x8b\
+\x89\xa6\x7c\x8e\xa6\x03\x94\x90\x99\x2d\x9f\xba\xe5\xcc\x2e\x94\
+\x51\x2c\x57\xd1\xeb\xed\x76\xa3\x99\x79\x9f\x4a\x11\x0c\xf4\xe5\
+\xb0\x7e\x6c\x0d\x8a\xc5\x32\x2e\x8e\x1b\xed\x76\xb3\x05\xce\x42\
+\x7c\x7b\x72\x63\x9b\xf3\xef\x66\xbb\xd5\x0a\x03\x2a\x2a\x25\x11\
+\x47\xfd\x00\x48\xec\x0a\xa8\x13\xb0\x98\x40\x15\xec\xb4\x0a\xb4\
+\x4c\xa2\x89\xa6\x01\x44\xca\x48\x22\xe2\x43\x6a\x20\xba\x3f\x98\
+\xd9\xdf\x4d\x27\x81\x42\x66\x26\x7a\xee\x44\xb4\x69\x24\x10\x20\
+\xf2\x44\xcd\xb0\xb6\x34\x03\xa0\x82\x9f\x20\xc1\x5c\xa1\x8a\x7c\
+\xa1\x82\x9e\xae\x76\x74\xb6\x67\x84\xf2\xd8\xde\x11\xf4\xe4\x3a\
+\x71\xc5\xfa\x51\x80\x02\x17\x2e\x4e\xa2\x5a\x0b\x5d\xdb\x2a\x0d\
+\x67\xa7\x9b\x9b\x00\xbc\x01\xe0\xe2\xbb\x15\xac\x56\x84\x0b\x8d\
+\x4c\xff\x05\x87\x05\xaa\xf8\xd2\x52\xb5\xab\x05\x97\xcc\x5b\x0f\
+\x89\x59\xb8\x4d\x74\xd6\xd1\xb9\x5a\x78\xee\x16\x61\xf6\x90\xe0\
+\x4f\xe3\x42\x22\xba\x8f\x28\xbe\xf4\xca\x68\x02\x0d\xf2\x42\xb0\
+\xee\xcb\xea\x1f\x55\x1a\xb1\x35\x0c\x88\x46\xfd\x51\x4d\x27\xd4\
+\x9d\xa1\x42\x30\x9f\x92\x67\x64\xdc\x87\x86\x8a\x39\xa0\xe8\x04\
+\x05\xeb\x6a\xe4\x97\x29\x7c\xb2\xc4\xd6\x89\xcf\x80\x78\xff\x82\
+\x7c\x34\x00\x53\x11\xa4\x94\xcf\x48\x50\x0e\xe0\xd8\x52\xf7\x1e\
+\x1d\xc7\xc5\xe9\x42\x68\xb7\x08\x80\x55\xfd\x3d\xf8\xc4\x4f\xbc\
+\x17\xf7\xdd\xfb\x3e\xf4\xf5\xe6\x4c\xdc\x6e\x3e\x09\xe0\xfb\x00\
+\x3e\x0a\xbc\x3b\xdd\x6e\x56\x04\xa3\xba\xfd\x96\x4d\x18\xec\x53\
+\xcd\x4c\x27\xc1\xcc\x74\x40\xc1\x7e\xd8\x30\x33\x75\xa8\x3e\x96\
+\x15\x9c\x99\x98\x97\xe4\x34\x66\xaa\x28\x53\x8b\xa6\x1d\x81\x0a\
+\xa6\x6d\x06\x31\x24\x54\xd1\xbd\x30\xfe\xd3\xd8\xc0\xf9\x20\x95\
+\x71\x9a\x49\x28\xb1\x1f\x01\x87\x59\xdb\x96\xa8\x82\xf9\x9d\x66\
+\xd3\x1b\x8c\xe2\x71\x6d\xd1\xa9\x8b\xdc\x47\x32\xdc\xa0\x5f\xae\
+\x5a\x98\xcc\x17\x91\x4e\xa7\xd0\xd3\xed\xae\x6d\xa5\x99\x67\x91\
+\x6d\xcf\x60\xcd\xe8\x08\x06\x06\x7a\x71\xf1\xd2\xa4\x89\xdb\xcd\
+\x1a\x00\x1f\x01\x30\x0e\xe0\x60\x6e\x6c\xb3\xfd\x6e\x62\x56\x2b\
+\x06\xa8\x24\x63\xba\x9b\x72\x32\x5f\xc2\x64\xbe\x08\x0e\x8a\x5a\
+\x00\x58\x52\x79\x61\x75\x19\xaa\x87\xe1\xed\x60\x20\x49\x65\x17\
+\x17\x3b\xab\x0e\x82\xce\x55\x27\xb4\x4f\x7e\x8c\xa1\xcd\x29\x4c\
+\xa8\x7a\x92\x82\xf4\x7e\x12\xf8\x8c\x88\x68\xd3\x32\xf5\x87\xcf\
+\x20\x65\xce\x34\xc6\x2d\xb9\x99\x42\x9d\xf5\x01\x94\x58\x16\x15\
+\x02\xab\x16\xc5\x54\xde\x71\xbb\xe9\xeb\xce\xf2\x6e\x37\x42\x39\
+\x6d\x99\x14\x56\x0f\x0f\x62\xf5\xc8\x10\xa6\xa6\x66\x31\x3d\x3b\
+\x17\x75\xb5\xfb\xe1\x80\x55\x0d\x8e\xdb\xcd\xbb\x66\x21\xbe\x15\
+\x04\x54\x39\x65\xfe\xa9\xb9\x62\xc0\xa8\xc4\x51\x37\x25\x88\x40\
+\x09\x5a\xe1\xf6\xa6\xc5\x05\x2d\x36\xbd\x0a\x68\x88\x22\x40\xdd\
+\x47\xd3\x41\x03\xc7\x28\x4e\xea\x01\x22\x00\x3a\xd4\xf0\x99\x94\
+\xa2\x58\x65\x0d\x94\x35\xd0\xeb\x8b\xa7\xde\x3c\x00\x29\x8d\x8c\
+\x10\x94\xb9\x46\x3a\xc3\xbb\x6e\xaa\x81\xb2\x09\x1a\x3b\x94\x5c\
+\x0e\x1f\xe8\x9d\x13\x00\xb6\x4d\x31\x3d\x57\x46\xa9\x6a\xa1\x2f\
+\x97\x45\x26\x93\x82\xce\xbf\x31\x4d\x08\x06\x07\x7a\x31\xb6\x76\
+\x14\xf3\xf3\x05\x8c\x4f\x4e\xc3\xb6\x43\x9f\xa5\x4e\x38\x73\xad\
+\x06\xe0\x18\xd9\x0b\xef\x06\xbb\xd5\xca\x07\xaa\xbc\x6a\x66\x7a\
+\xfd\x80\x05\x34\x81\x65\x09\x11\x61\x70\x11\x5e\x97\x00\x49\x4c\
+\x87\x88\xa2\x53\x41\xaf\x09\x10\xa3\xad\x04\x4a\x5c\x33\x10\xc2\
+\x95\x40\x25\x54\x52\x03\x0e\x35\x2d\x5e\x4a\xeb\x32\x2e\xe5\x8c\
+\x50\x80\xe1\x4f\x7c\xd5\x94\x68\x08\x55\x10\xde\x2c\x80\xf2\x63\
+\x55\x1b\x56\x30\x65\x50\x38\x6e\x37\x73\xc5\x0a\x7a\xbb\xda\xd1\
+\xd1\x9e\x56\x14\xe2\x8e\x08\x12\x82\xde\x9e\x6e\xac\x5f\x3f\x0a\
+\xab\x56\xc3\xc5\x4b\x93\xa8\x85\xbb\xdd\xb4\x01\xd8\x0c\xe0\x1a\
+\x00\xaf\x01\x98\x5e\xe9\x60\xb5\x22\x8c\xe9\x80\xd2\x3c\xcb\xc7\
+\x29\x2c\xe0\x7e\x1e\xc9\xd8\xc9\x17\xaa\x5b\xe3\x48\xaa\x47\x61\
+\x78\xd5\x9a\x8f\x99\x40\x7e\x8d\x26\x3e\x07\x6f\x74\x07\xd7\x06\
+\xc9\xf0\xcc\x74\x88\x8a\x4f\x3d\x53\x3e\x65\x2b\x15\x9a\x24\x89\
+\x67\x60\x27\x2a\x73\xb8\x0c\x3e\x94\xfb\xd3\x9a\xce\xf9\x0a\x84\
+\xca\xd5\x6c\x4a\x1c\x6a\x70\xd3\x52\xbe\x2c\x0a\xc2\xd9\xa7\xf8\
+\xeb\xe2\x75\x28\xb8\xdf\x8a\x42\xdc\xfc\x7c\x22\xc9\xd7\x50\xfb\
+\xec\xe8\x9f\x93\x20\x0f\x55\x3e\x0f\x62\x18\xa5\x14\x17\xa7\x0b\
+\xd8\x7b\x74\x1c\x13\xcc\xda\x56\xaa\xb4\x29\x02\x8c\x0c\xf6\xe1\
+\x53\xf7\xbe\x1f\xf7\xde\x73\x37\x72\xdd\x9d\x51\x46\xf6\x34\x80\
+\x2f\xc0\x59\xdb\xea\x6e\x00\x58\xc9\x46\xf6\x15\x03\x54\x9e\x48\
+\x37\x9b\x3d\x96\x00\xa6\x3e\xc0\x12\x77\x2d\x31\x05\x2d\xb6\x7d\
+\xaa\x41\xa9\x50\xe0\x22\xe2\xe6\x95\x54\x7a\xc1\x04\x92\xc5\xab\
+\x56\x6c\xba\xb0\x70\xf6\x44\x19\x20\xb3\xa1\x68\x30\x12\x53\x29\
+\x3a\x1b\x52\x0e\x37\xf2\xc7\xd4\x4d\x01\xcd\x64\x78\x22\x00\x91\
+\x57\x8e\x77\x2d\xc1\xa8\xc3\x54\x36\xe6\xbb\x05\x53\x2e\x2f\xfc\
+\x4c\xf2\xb3\xc2\xb7\x3c\x0c\xa0\x3c\x90\x12\x23\x45\x80\xf2\x9e\
+\x1b\x02\x60\x66\xae\x8c\xbd\x47\xc7\x71\x76\x7c\x5e\xf5\x7d\xe1\
+\xee\x7f\x5f\xae\x0b\x1f\xfe\xc0\x9d\xb8\xff\x93\x1f\xc2\xd0\x60\
+\x9f\xc9\x6e\x37\x1f\x82\x33\x22\xf8\x59\x00\xa9\x95\x0a\x56\x2b\
+\x46\xf5\x1b\xec\xcf\x39\x77\x50\x48\x31\x35\xeb\x1a\xd3\x15\x23\
+\x5d\xa1\x06\x6a\xe6\x20\xdc\xde\xa4\x50\xa1\x22\x54\x24\x1d\x25\
+\xd7\xd5\x43\x84\x42\x09\xf3\x1f\x51\xa6\x97\x51\x48\x5e\x62\x39\
+\xac\x73\xea\x81\x86\x88\x5e\xb9\xbf\x54\x93\xc9\x33\x72\xeb\x8d\
+\xef\x24\xaa\x78\x55\xa3\x42\x46\x03\xc3\xfa\x40\x19\x14\x23\xa2\
+\xf1\x5d\x37\x10\xc1\x82\x0c\x91\xeb\x53\xaa\x78\x4c\x84\x4e\xcd\
+\x0b\x92\x29\x8c\xf8\x6e\x5d\x95\x9a\x8d\xc9\xd9\xa2\x03\x46\xdd\
+\x59\xa4\x15\xcf\x50\xe0\x76\x93\xc2\xea\x91\x55\x18\x1e\x1a\xc0\
+\xf8\xc4\x14\x66\xf3\x91\x6e\x37\xc3\x70\x8c\xec\x79\x38\xbb\xdd\
+\xac\xb8\x85\xf8\x56\x16\x50\xb1\xc2\x8c\xfa\x05\xc6\x74\xc4\x02\
+\x2c\xee\x28\xc2\x8e\xe5\x1c\x36\x0f\xb4\xf8\xbc\xf2\xda\xed\x5a\
+\xdf\x45\xa2\x68\x07\xd7\x76\x12\x0b\x84\xf4\x20\xad\xb3\x35\x45\
+\x18\xdb\x15\x18\xe5\x60\x97\xe2\xc5\x93\x0e\x82\x13\x95\xad\xc9\
+\x07\x68\xaa\x06\x85\x40\x3d\x55\xd5\x23\xe8\x8b\xde\x01\x65\x6a\
+\xd4\xdc\xfc\x46\x01\xca\x49\xaa\x01\x29\xa6\x2d\x96\x4d\x31\x99\
+\x2f\xa1\x5a\xb3\xd1\xef\x1a\xd9\xf9\xaa\x82\x32\x32\xe9\x14\x56\
+\x0d\xf6\x61\xed\xe8\x08\x66\xf3\xf3\x98\x9c\x9e\x45\x84\xf4\xc0\
+\x01\xab\x36\x00\xaf\xe7\xc6\x36\x97\x57\x92\xdd\x6a\x65\x00\xd5\
+\xcd\x9b\x30\xd8\xa7\x36\xa6\x3b\xd3\x13\x82\xed\xc4\x59\xc0\x82\
+\xa2\xc0\xe6\xb0\x2c\x75\x0a\xb3\x39\x54\x61\xf5\x11\x65\xfd\xe1\
+\x9b\x54\xe8\x0c\xee\x41\xa8\xce\x50\x2e\x19\xf9\xe5\x85\xdf\xeb\
+\x10\xaa\x3c\x0c\xbf\x28\xe2\x09\x89\x28\x8a\x1d\xa1\x84\x30\xa2\
+\xa7\xa8\x97\x79\xc9\x25\xe3\x39\x82\x6b\x4f\x59\x1f\x43\x05\x52\
+\x86\x02\x94\x1b\x60\x0c\x50\x7e\x7a\x3e\xde\xb6\x1d\x55\xb0\x50\
+\xaa\xa1\x2f\x97\x45\x7b\x26\x2d\x81\x94\x27\xe9\x14\x41\x5f\x6f\
+\x0e\x63\xeb\x46\x51\x2e\x57\x70\x69\x7c\x1a\x56\xb8\xdb\x4d\x16\
+\xc0\xfb\xe0\x2c\x75\xbc\x07\xc0\xdc\x4a\x01\xab\x15\x63\xa3\x0a\
+\x6c\x05\xca\x08\xf9\x94\xb1\x17\xd4\x65\xc7\x0a\xb3\x65\x29\x0c\
+\xf0\x6c\xd9\x26\x4b\xe6\xca\xef\x92\x6c\xcc\x75\x44\x66\x08\xce\
+\x8b\x29\x1b\x6f\x28\x07\x5e\x81\xa1\x46\x3d\x1b\xdd\x35\x96\x13\
+\xef\x4f\x7f\xd5\xcd\x11\x27\x30\xc0\xfb\x65\x2b\x40\x8f\x2b\x51\
+\x51\x7c\x60\x2f\x22\x5a\x10\xf2\xaf\xa2\x50\x98\x38\x75\x41\xb2\
+\x43\x71\xba\x1d\x61\x8b\x54\x7e\x80\xf8\xba\xd5\xcf\x54\x94\x1d\
+\x4a\xea\x2a\x63\x13\x55\x5d\x14\x0a\xe0\xec\xc4\x3c\x5e\x3b\x7c\
+\x09\x53\xf9\x92\xf2\xfa\x7b\xc9\x53\x29\x82\xd1\xe1\x41\x7c\xfa\
+\x13\x1f\xc4\x3d\x1f\xb8\x03\x9d\x1d\xd9\x28\xbb\x55\x3b\x80\x5f\
+\x06\xf0\xd7\x70\x5c\x6f\x56\x84\x91\x7d\xc5\x00\x95\x27\x2a\x80\
+\x70\x23\x9a\x04\x58\x71\x41\x8b\x35\xc1\xcb\x23\x42\x72\x3d\xc4\
+\x3f\xa7\x6e\x3a\x0e\x25\xfc\x8a\x78\x66\x41\xb9\xb7\x49\x67\x03\
+\xd3\x4c\x09\xa0\xd2\x21\xb8\x82\xb9\xed\xd5\xd9\x2b\xa0\x99\x66\
+\xa0\xb8\x8e\x5a\x6f\x1a\xbf\xd1\xc1\x9f\x34\x37\x8c\xeb\xbe\x68\
+\x8c\x57\x3f\x05\x7e\x84\x00\xd0\x44\xe6\x89\x6e\x31\x2a\xaa\x2a\
+\xd4\x1d\x24\x96\xeb\x01\x00\x42\xd4\xcf\x00\x93\xca\x14\xa0\xc4\
+\x51\x5b\xbe\x0c\xe7\x77\x72\xb6\x88\xd7\x8f\x5c\xc2\x85\xa9\x05\
+\xa9\x3c\xf6\x24\x45\x80\xc1\xbe\x1c\x3e\xfa\xa1\xbb\x70\xdf\xbd\
+\xef\x43\x7f\xb4\xdb\x4d\x0a\xc0\xa7\xe1\x18\xd9\xef\x01\x96\xbf\
+\xdb\xcd\x8a\x03\x2a\x4f\x38\x78\xa0\xf2\xc3\x10\xa4\x33\x03\xac\
+\x30\x96\x65\x0a\x5a\xec\x43\x28\x01\x17\x00\xbd\x65\x5b\xe0\x8b\
+\x04\xf2\x39\x37\x1a\x15\x80\x2a\x5b\x01\x5f\x6f\x3c\x26\xc4\x19\
+\x94\xa8\xa3\x06\x89\x20\xa4\xc4\x21\x12\xf1\xa7\xb9\x67\xf2\x0d\
+\xe2\x3a\xaf\x8e\x82\xd7\x3c\xc1\x48\x2f\xaa\x88\x0c\x53\xf2\xda\
+\x28\x0e\xfa\xf9\xf7\x58\x7c\x18\x98\x26\x48\x93\x45\x19\x7a\x26\
+\x3e\x07\xcd\x02\x28\xca\x64\x20\x04\x98\x2b\x54\xb0\xf7\xe8\x38\
+\x4e\x9c\xcf\xc3\x56\x8d\x28\x32\x57\x2d\xd7\xdd\x81\xf7\x6e\xbe\
+\x05\x9f\xfb\xf4\x3d\x58\x33\xb2\xca\x64\x44\x70\x33\x80\xef\x02\
+\xf8\x19\x00\x99\xe5\x0c\x56\x2b\xc3\x46\xa5\x32\xa6\xbb\xe2\xb9\
+\xd0\x68\x7d\xf4\x42\x87\xe8\x4d\xed\x58\x7c\x2a\x9d\xb1\x5a\x3f\
+\xaa\xc7\xe4\xf5\xdf\x2f\xde\xe5\xc7\x37\x84\xab\x6c\x49\xda\x55\
+\x12\x74\xbb\x2b\x2b\x98\x8b\xe2\xc2\x68\x67\xa2\x1b\x80\x8e\x56\
+\x42\x8c\x45\x11\x97\x95\x53\x77\x41\xd5\xed\x17\x27\x7b\x52\xd5\
+\x19\x4b\x9e\x54\x2a\x16\x93\x88\x1f\xcb\xe4\x8d\xf1\x4e\x7e\x55\
+\xab\x83\xfb\x14\x65\x83\x72\x7e\xe4\x46\xcb\xb6\x2c\x45\x6f\xdc\
+\xd3\x9a\x45\x31\x91\x2f\xc1\xb2\xa9\x63\x64\x4f\xc9\xba\xbc\x77\
+\xda\x96\x49\x63\x68\x68\x00\xa3\xab\x57\x61\x7a\x66\x16\xd3\x33\
+\x91\x6e\x37\x03\x70\x8c\xec\x15\x00\x6f\xe4\xc6\x36\x57\x97\xa3\
+\xdd\x6a\x65\x01\x15\x6f\x4c\x00\xe0\x00\xd5\x04\x6b\x4c\x37\xd8\
+\xdc\x41\x3a\xd5\x6d\xb5\x85\x06\x41\x2b\x06\x20\x49\xed\x66\x46\
+\xde\xd4\x23\x82\x44\x0d\x92\xaa\xa5\x97\x25\xb0\x51\x4f\x7b\xf0\
+\xff\x54\x1f\x62\x53\xa0\x52\x18\xc6\x95\x33\xd6\x69\x38\xfa\x51\
+\x42\x35\xe1\x80\x6e\xf9\x16\x2a\x18\xb4\x02\x36\xc5\x1b\xde\xd9\
+\xc2\x7c\xd6\xa4\xb1\x26\x70\xc8\x48\x82\x84\xba\x75\xa5\xd8\x03\
+\xaa\x41\x13\x15\x89\x63\x43\x55\xae\x38\x36\x75\xf6\x11\x2c\x55\
+\x2c\xf4\x77\x67\xd1\xde\x96\x52\x34\xdb\x39\x4b\x13\x82\xfe\xbe\
+\x5e\xac\x5b\xbb\x1a\x85\x42\xd1\x71\xbb\xa1\xa1\xb7\xb0\x0b\xce\
+\x7c\xab\x5e\x38\x46\xf6\xe2\x72\x03\xab\x15\xa3\xfa\x51\x2a\xdb\
+\x8e\x00\xd5\x97\x29\x64\xe9\x96\x28\xb5\x30\xa6\x6a\x28\xda\xb4\
+\x58\x1b\x8d\xa4\xea\x09\xea\x04\xc7\x1e\x94\x43\xea\xc2\x68\x13\
+\xc3\x04\x74\xd7\xc1\xb7\xb1\x30\xaa\xab\x7c\x11\xc0\xb4\x9b\x6d\
+\xb0\x42\xa7\x8d\x02\x27\xaa\xf9\x33\xc9\xe4\xed\x00\x4d\xd4\xb6\
+\x33\xad\x29\xce\xed\xa8\xd2\xe6\x04\x28\x47\x2e\x79\xa6\x06\x29\
+\x3c\xd0\xe8\x44\xfb\x27\x4f\x7d\x94\x9a\x14\x61\xee\xa7\x4a\xc5\
+\xe3\xc2\xf5\x6a\x1e\x1f\xc6\xb6\x2f\xc8\x6c\xdb\x14\xa7\x2e\xe6\
+\xf1\xfa\xd1\x4b\x98\x99\xaf\x28\x2e\x4c\xf0\x93\x49\x13\xac\x1b\
+\x1d\xc2\xfd\x9f\xfa\x30\xde\x7f\xd7\x2d\xc8\xb6\x65\xa2\x54\xc1\
+\x2e\x00\xff\x12\xc0\x5f\x02\xb8\x2a\xea\x2e\x2e\xb6\xac\x18\x46\
+\x35\xa0\x98\x9e\x40\xe0\x6c\xaf\x3d\x31\x5b\x12\x09\x06\x9f\xce\
+\x50\x2d\xe4\xe3\x34\xac\x49\x8e\x96\x4a\x10\xb7\x8e\x77\x43\xb9\
+\xc2\x88\xc4\xaa\x54\x2c\x8b\x89\x13\x1a\x22\x4e\x67\x60\x23\x08\
+\x9f\x42\xd1\x39\xef\x44\x63\xe0\xae\x47\x58\xb2\x24\x45\xea\x5f\
+\x10\x35\x33\x61\x19\x97\x00\x38\x9a\xa9\x0c\xe2\x77\x44\x26\x2a\
+\xee\x6b\xcf\x12\x28\x69\xb5\x06\xc2\xa8\x8b\x41\xf9\xbc\xb6\x28\
+\x74\x90\xb2\x75\xd6\xc7\xa0\xc4\xeb\xc0\x59\x36\x15\x65\xcc\x17\
+\xab\x98\x9a\x2b\xa1\xbb\xb3\x0d\xdd\x1d\x19\x29\x81\xaf\x78\x10\
+\x82\xae\x8e\x2c\xc6\xd6\x8d\x22\x9b\x6d\xc3\x85\x0b\x13\x28\x47\
+\xef\x76\x73\x13\x80\xdb\xe1\x4c\x0c\x3d\xbf\x5c\x98\xd5\x8a\x61\
+\x54\x2a\x61\xbe\x45\xd2\x17\x8b\x4b\xa7\xf3\xcf\x53\xb0\x80\x20\
+\x2e\xa0\x52\x2a\xb2\xa0\x1f\xd5\x33\xd1\x9b\x78\x83\xac\x17\x24\
+\xda\x94\xd9\xd7\x88\x0a\x2f\xa8\xef\xf3\x26\x96\xcc\x3a\xee\x89\
+\xed\xf6\x3b\x12\x03\x94\xa2\x8c\xe5\x2c\x96\x78\x64\x29\xa2\x10\
+\x76\x0a\x83\xae\x4a\x48\xfd\xd5\x74\x86\x8a\x60\xc3\xdf\x2d\xa9\
+\xab\xdc\x4d\x14\xd8\x10\x5c\x90\x64\xf1\x9f\x6d\x8c\x12\x87\x02\
+\xbb\x18\x61\x23\xa8\xfa\x99\x11\x43\xd9\xe7\x87\x7b\x9e\x35\xcf\
+\xb4\x97\x76\x66\xae\x84\xd7\x0e\x5f\xc4\xe9\x8b\x73\xa0\xb6\xba\
+\x7b\x80\xf3\xb1\xeb\xcd\x75\xe2\x03\xef\xbd\x1d\xf7\x7f\xf2\x43\
+\x18\x5e\x15\xe9\x76\x43\xe0\xd8\xac\xbe\x0f\xe0\x3e\x2c\x13\xb7\
+\x9b\x15\xc1\xa8\x6e\xbb\x25\x6c\xc2\x67\xd1\xb7\x51\xc9\xac\x45\
+\x2f\x71\x6c\x59\x72\xbc\xce\x08\xcf\x8c\x44\xb1\x6c\x88\x6b\x0f\
+\xe1\xdb\xc7\xda\xb1\xc4\x76\x0b\xf5\x10\xbe\x60\x08\xc5\xf1\x61\
+\x1a\xda\x18\x3e\x9f\x53\x6f\xab\x0b\x93\x48\x6d\x4f\x55\x4b\xd8\
+\x46\xa5\x1a\xd6\xc1\xe3\x45\x70\xb1\x28\x0b\x94\x22\x00\x72\x2a\
+\xb3\xca\x48\xa9\xe8\x2d\xf3\x01\x91\x8d\xdc\x94\x07\x3f\xc2\xe6\
+\x51\xb0\x3b\xae\xab\x6a\x3b\x54\x10\xc3\xd3\x27\x35\x13\x73\x62\
+\x08\x01\xaa\x35\x1b\xe3\xb3\x45\x10\x00\x7d\xb9\x2c\x52\x29\xf5\
+\x9d\x23\xc4\x31\xb2\x0f\x0f\xaf\xc2\xc8\xf0\x20\x26\x27\xa7\x31\
+\x93\x9f\x8f\x72\xbb\x19\x81\x03\x58\xd3\x00\x0e\x2c\xb5\xdb\xcd\
+\x8a\x00\x2a\x4f\xf5\x53\x5d\xd6\xc9\xd9\x22\x26\x67\xf9\x65\x5e\
+\xf4\x4b\xa0\xc8\x12\xb9\x74\x4b\x1c\xd0\x62\x8e\x7d\x63\x38\x11\
+\x81\x86\x69\xa1\x46\xb5\x13\x31\x46\x0b\xc0\x44\x63\x14\x87\x01\
+\xe4\xf8\xed\x90\x55\x2c\x4d\x52\x50\xd6\xfc\xc3\xfc\x11\x4d\x38\
+\x2f\xdc\xab\x18\x59\x17\x7b\x40\xc3\x52\x53\xdd\x82\x89\x7a\x1b\
+\x96\x00\x3b\xca\xe3\xa0\x48\xb1\xdd\x44\x62\x65\xbc\x4a\xca\x8e\
+\x08\xf2\x7d\xe7\xc3\xa4\x18\x03\x80\x72\x5b\xc9\x84\x59\xb6\x33\
+\x22\x58\xa9\xda\xe8\xef\xe9\x40\x5b\x46\x56\x92\xbc\xf4\x99\x74\
+\x0a\x03\x03\x7d\x58\x3b\x3a\x8c\xb9\xf9\x79\x4c\x4e\xe5\x23\xee\
+\x06\x7a\xe1\x80\x55\x0a\xc0\xde\xdc\xd8\xe6\xf2\x52\x81\xd5\x8a\
+\x02\x2a\x9f\x65\x33\xa9\x26\x67\x9d\xed\xb2\x74\x1f\xc7\x46\x58\
+\x96\x94\x5e\x03\x5a\x84\x47\x49\x88\x7e\x7a\xec\xfe\x7a\x84\xff\
+\x4f\x00\x28\xa2\x68\xa7\xa0\x8a\x08\x75\x28\xd3\x33\x94\x4a\xab\
+\x5c\x85\xc6\x0b\xc9\x98\x3a\xa2\xa7\xe6\xe8\x0b\x93\x76\xac\x11\
+\x2a\xd7\x13\xa9\xc0\xf8\x45\xe5\x62\x79\xa6\x44\x04\xc0\xe1\x5e\
+\x7e\x2a\xa1\x80\x4f\x88\x98\x1b\xc1\x32\x34\xdd\xa8\x20\x7f\xca\
+\x77\x24\x36\x40\x29\x9a\x26\xe7\xa1\x52\x98\xcf\xfa\x6c\x60\x7a\
+\xae\x8c\xf9\x52\x15\xfd\xb9\xac\xbf\xa5\xbc\xaa\xce\x54\x0a\xe8\
+\xe9\xe9\xc6\xd8\xba\x35\xa8\x55\xca\xb8\x38\x3e\x0d\xcb\x0a\x75\
+\xbb\xe9\x00\xf0\x7e\x38\x8e\xcd\x7b\x72\x63\x9b\xe7\x97\x02\xac\
+\x56\x16\x50\x29\x86\xa4\x26\xf2\x45\xdf\x98\x0e\x70\x1f\x36\x4e\
+\xe2\xb0\x2c\xc0\x1c\xb4\x08\x0b\x24\x02\x5b\x52\xa9\x70\x22\xf3\
+\xe2\x1a\x2c\xb1\x2f\x05\x70\xb1\xea\x25\xd7\x8e\x90\x1e\x91\x90\
+\xbe\x9a\x32\x30\x36\x7d\x5c\xdd\x10\xb2\xb1\x9b\x2f\x4c\xa1\x92\
+\xa9\xf1\x41\x28\x94\x86\x06\xc9\x4f\x8b\x44\xaf\x14\x40\xc4\xe8\
+\x92\xc2\xbd\x51\x5c\x36\xbf\x14\x25\xca\x4a\xcc\x4a\x0d\x50\x62\
+\x5b\xa3\x00\xca\x0f\xf5\xf3\x3a\x07\xf9\x42\x05\x33\xf3\x65\xf4\
+\x74\x65\xd1\xc5\xec\x76\x23\xd6\x99\x22\x04\x5d\x9d\x1d\x18\x5b\
+\x37\x8a\x4c\x8a\xe0\xc2\xa5\x49\x54\xab\xa1\xbb\xdd\x64\xe0\xbc\
+\xa3\xd7\xc3\x71\x68\x9e\x58\x6c\x23\xfb\x0a\x03\x2a\x59\x26\x67\
+\x1d\xa7\x64\xa2\x7b\x90\x1a\x64\x59\x00\x42\x27\x5c\x7a\xc7\x7e\
+\x12\x46\x1d\x93\x56\xe9\x64\x99\x14\x91\xc3\xd8\x70\xa6\x95\x21\
+\x2a\x21\x7f\x22\xab\x81\x44\x45\x5c\x18\x7c\x90\x75\xb5\x3a\x30\
+\x48\x2c\x94\x0b\xa5\xda\xa4\xd4\x08\x8c\x58\xab\x8f\xcc\xa6\xc2\
+\xec\x4e\x1e\x73\x63\xea\x60\x75\x34\x0e\x3c\xf8\x8b\xc4\xaa\x6e\
+\xbe\x5b\x11\x05\x6c\x4a\x51\xb3\x6c\x54\x2d\x1b\x55\x8b\xa2\x56\
+\x73\x8e\xfd\xb0\x9a\x0d\xcb\x72\x56\x41\xb0\xd9\xc1\x16\x78\x7f\
+\x04\x84\x1d\x69\x14\x40\x2a\x4a\xcd\xe3\x9a\xad\x18\x65\x24\x00\
+\x16\x4a\x35\x4c\xce\x16\xd1\x99\x75\xb6\x94\xd7\x5d\x61\x02\x20\
+\xdb\xde\x8e\x35\x6b\x56\xa3\xa7\xbb\x03\x17\x2e\x4e\xa0\x58\xaa\
+\x44\x8d\x08\x6e\x82\xb3\x08\xdf\x21\x00\xa7\x16\x13\xac\x32\x8d\
+\x17\xb1\x48\x42\xf5\x11\xce\x8a\x96\x3c\x00\xf8\x43\xb4\xf2\x67\
+\xd5\xbf\xc1\x84\x1d\xf5\x09\x01\x2d\x76\x94\x84\x10\x45\x42\xd7\
+\x6c\x41\xfc\xd2\x1d\x90\xa1\xfe\x6b\xc4\xbe\x08\xd4\xb7\x93\x10\
+\x78\xf9\xfc\xd6\xfa\xe1\x7e\x58\x08\x02\x53\x45\xb4\xd8\x11\x2a\
+\x66\x13\x6d\x2c\x62\xf3\x42\x45\xa4\xa3\xc2\x38\x3d\x55\xe7\x50\
+\xde\x3a\xde\x02\xae\x88\x17\xec\x42\x80\x73\x33\xb5\xc8\xe7\xde\
+\x57\x91\xa1\x70\xf7\x9f\x79\xf1\x7d\x30\x72\x46\x84\x6b\x2e\xf0\
+\x58\x96\x8d\x9a\x6d\xa3\x5a\xa3\xa8\xd6\x6c\xd4\x2c\xcb\x01\x1e\
+\xef\xcf\x9f\xa7\xc7\x02\x0c\xaf\xbe\x11\xe2\x3d\x01\x81\xfd\x8e\
+\x10\x82\x4c\x2a\x85\x4c\x9a\x20\x9d\x4e\x21\x93\x22\x48\xa5\x53\
+\x48\xa7\x08\xd2\x29\x82\x14\x21\x0c\x48\xe8\xd5\x3c\x91\x45\x71\
+\x97\xcc\xc5\xfe\xb9\x42\x15\xaf\x1d\xb9\x84\x1b\x2a\x35\x5c\x39\
+\xda\xcb\x1b\xd9\x99\xeb\x43\x08\xd0\xdd\x95\xc5\x7b\xee\xb8\x09\
+\xb9\x5c\x37\x9e\xde\xbe\x1b\xe7\x2e\x4c\x46\x19\xd9\xef\x86\xe3\
+\x76\xf3\x5b\x00\x1e\x1c\xdd\xf2\x80\x75\x61\xf7\x77\xd0\x6a\x59\
+\x31\x40\x25\xbf\x70\x4c\x38\x85\x8f\x48\x54\x03\x58\x00\x03\x5a\
+\x02\x60\x39\x71\xe6\xa0\x45\x88\xe3\x07\x47\x98\x3a\x89\xf8\xde\
+\x11\x84\x34\x9a\x06\x0f\x43\x30\xe9\x85\x3b\xf7\x6c\x26\x6c\x9b\
+\xfd\x6e\x12\xf9\xc1\x63\xc1\x4f\x7f\xc1\xf4\x7a\x6f\xe4\xa4\x0a\
+\xd1\x40\x15\x42\x83\x8c\xcc\x58\x2c\x3d\x14\x55\x1d\x45\x01\xd4\
+\xbf\x31\x92\xf2\xc4\x37\xd1\x4f\x22\xb3\x0d\x9b\x3a\x93\x26\xab\
+\x35\x1b\x95\x9a\x8d\x4a\xcd\x42\xb9\x6a\xa1\x52\xb5\x1c\x36\xe4\
+\x03\x92\xad\x1c\xf5\x13\xfd\x02\x95\xec\xc6\x6f\xbe\xcd\x4d\x3b\
+\x10\xa9\x91\x07\x5e\x29\x42\x90\x4a\x11\x64\xd2\x29\xb4\x67\x52\
+\x68\xcb\xa4\x90\x49\x07\x7f\x84\xf0\xcf\x96\x0e\xa0\xc4\xce\x96\
+\x2a\x35\xbc\x79\x7c\x02\x85\x72\x0d\x1b\xd7\x0f\x20\xeb\xee\xd2\
+\xac\xba\x66\x1d\xd9\x36\xdc\x70\xfd\xd5\xe8\xee\xea\xc4\xd3\xdb\
+\x76\xe3\xe8\x89\xb3\x51\x77\xef\x5a\x00\xff\x1e\xc0\x5a\x00\x7f\
+\x33\xba\xe5\x81\x62\xab\xc1\x6a\xc5\xaa\x7e\x5e\xc2\x09\xc5\xa8\
+\x9f\x98\x4a\xb7\x57\x27\x7f\xc0\xc6\xc9\x2f\x34\x6f\xae\x60\xcb\
+\x8d\x32\x9c\xab\x5d\x68\xb4\x69\xc4\x3a\xa4\x36\x46\xfb\x03\x72\
+\xda\x8f\xaa\xdf\x3a\xf0\x62\x42\x54\x4c\xc8\x54\x2d\x34\x35\x63\
+\x51\x63\xb0\xa3\xfa\x42\x59\x77\x1a\xf1\xfa\xb9\xc0\x54\xae\xda\
+\x98\x2f\x56\x31\xb3\x50\xc1\x64\xbe\x88\xe9\xb9\x32\x66\x17\x2a\
+\x98\x2f\x54\x51\xac\x58\xa8\xd6\x2c\x58\x16\x33\xd7\x8e\x38\xa3\
+\xa1\xbe\xad\xd1\x3d\xe7\xc6\x00\x58\xb5\xda\x4f\x03\x3f\x8d\x77\
+\x9f\x02\x15\x5f\x6e\xbc\xa7\x4e\x5a\x2e\x78\x96\x2a\x16\x0a\xa5\
+\x1a\x16\x4a\x35\x2c\x94\xaa\x98\x2f\x56\x51\xac\xd4\x50\xa9\x3a\
+\x20\xea\x56\xcb\x95\xa5\xdb\xf9\xc6\x01\x66\x8a\xa9\x7c\x11\xc5\
+\x92\xe5\x8c\x08\xb6\xe9\xa7\x4d\xa6\x52\x29\xf4\xf6\xe6\x30\xb6\
+\x76\x35\x8a\xc5\x12\xc6\x27\x66\x60\xdb\x14\x21\xe4\xaa\x1b\xc0\
+\x87\xdd\xdf\xd7\x72\x63\x9b\x8b\xad\x54\x03\x57\x16\x50\x51\x39\
+\xc5\xe4\xac\x6b\x4c\x67\x44\xbb\x38\x5e\x18\x60\x49\x27\x5e\x90\
+\xc2\xc6\xc4\x1a\xbd\x19\x55\x90\x7d\xb8\xfd\x1f\x09\x84\x84\x99\
+\xeb\x42\x79\x41\x59\x5c\xcb\xd5\x64\x48\xb9\x7c\xb1\x1a\x68\xe5\
+\x5e\x11\x80\x44\xc3\x89\x64\x79\x52\x6d\xf1\x1e\x92\xd7\x4c\x68\
+\x68\x46\x7f\xb4\x50\xf9\x52\x12\x30\x57\x1e\x96\x4d\x51\xa9\xd8\
+\x98\x2f\xd5\x30\xbb\x50\x71\x56\x80\x9d\x2b\x61\x76\xa1\x82\x62\
+\xa5\x86\x5a\xcd\xb1\x1f\x79\xe0\xe7\xe7\x16\x07\x2e\x3c\xb0\xe1\
+\xee\x89\x68\x0f\x14\xee\x1d\x67\x9f\x64\xee\x5e\x08\x58\xe9\x84\
+\x07\xb0\x1a\x0a\xa5\x2a\x16\x4a\x35\x14\x4a\x01\x70\x39\xac\x9e\
+\x04\x20\x49\x15\x6c\x93\x02\x33\x0b\x0e\x30\xf7\x76\x67\xa5\x2d\
+\xe5\xd9\xb4\x29\x42\xd0\xd5\xd5\x89\xf5\xeb\x46\x01\xd8\xb8\x78\
+\x69\x0a\xb5\x5a\xe8\x6e\x37\xed\x70\x54\xc1\x2b\xe0\x8c\x08\xce\
+\xb6\xca\x6e\xb5\xb2\x80\x4a\x14\xe2\x30\xaa\x89\x59\x61\x03\x52\
+\x2f\xba\x5e\x96\x25\x9d\x78\x5f\x52\x1e\x94\xf8\x72\x88\xc4\xaa\
+\x42\x1f\x72\xc5\x4a\x9f\x22\xc0\x28\x5f\x06\x37\x6f\x98\x13\x33\
+\xd7\x05\x8e\x3a\x06\xf1\x91\x4b\x28\xab\x6e\x46\x0c\x09\x53\xff\
+\x64\x26\xc5\xb4\x8d\x86\xe4\xe5\xb6\x7c\xf7\x58\x9f\xf3\x32\xcf\
+\x17\x1d\x60\x9a\xca\x97\x30\x3d\x5f\x42\x7e\xa1\x8c\x42\xb9\x86\
+\xaa\x65\xbb\xc0\x04\x7e\xfc\xc0\x05\x37\x7e\xfa\x85\x02\xac\x48\
+\x93\xc0\xca\x0f\xab\xff\xaa\x7a\xc6\xfc\x72\xd5\x42\xa1\x54\x45\
+\xa1\x54\x45\xb1\x5c\x43\xb5\x66\x39\xec\xc7\xef\x4f\x60\x46\xf0\
+\xf8\xe6\x7c\xb1\x8a\xa9\x7c\x09\xdd\x1d\x6d\xc8\x75\xb6\xfb\x65\
+\x8a\x13\x6c\x53\x04\xe8\xe8\xc8\x62\xdd\x9a\x51\x74\x64\xdb\x70\
+\xe1\xe2\x64\x94\xdb\x4d\x1a\xc0\x2d\x00\x6e\x05\xf0\x26\x80\x0b\
+\xad\x00\xab\x15\x02\x54\x1b\x31\xd0\xd7\xad\xcc\xef\x01\x95\x34\
+\x7a\x26\xa4\x6b\x14\xb4\x38\x60\x62\xbf\xb6\x8a\x87\x97\x7d\xe0\
+\xb5\xf1\x42\x25\x44\x78\x21\x58\x96\xc0\x03\x95\xae\xcd\x72\xb8\
+\x8a\x79\x49\xb9\x0c\x00\x2b\xae\x18\x4d\xea\x0c\x6b\x10\xc3\xd4\
+\x54\x98\x66\x53\x8a\x4a\xcd\xc6\x5c\xb1\x8a\xe9\xb9\x32\x26\xf3\
+\x25\xcc\x16\x9c\xe5\x7b\x59\x60\x0a\xae\xb7\x0b\x10\xe2\x28\xad\
+\x70\x1f\xfd\x33\xa2\x07\x9f\xba\xc1\x4a\xc5\xc2\x1b\x14\x4a\x1d\
+\x06\x59\xae\x5a\x28\x96\x6b\x28\x94\x6b\x28\x55\x2c\x58\xb6\xcd\
+\xb0\xad\xe0\x9a\x17\xcb\x16\xc6\x67\x8b\x68\x6f\x4b\xa1\xb7\x3b\
+\xeb\x34\x4e\x65\xcf\x23\x40\x5b\x5b\x06\xa3\xab\x87\x31\xd0\x9f\
+\xc3\xa5\x4b\x93\x58\x28\x94\xc2\xda\x4d\x00\x5c\x0d\x67\x99\xe3\
+\x77\x00\x1c\x6f\x36\x58\xad\x18\xa0\xea\x67\x18\x15\x9b\xc8\x07\
+\x2a\x29\x92\x48\x69\x81\x70\xc0\xd2\xc5\xfb\xeb\x9c\x2b\xbf\xbc\
+\xa2\x13\xb2\x02\x70\x88\xa2\x2c\x26\x8d\x12\x90\x8c\x19\x17\x53\
+\x17\x91\x7b\x1d\x17\xa0\xd5\x42\xb8\x3f\x76\x36\xbb\x7a\xd3\x51\
+\xf9\x8f\xaa\x8a\x53\x88\xe8\x87\xe6\x33\x27\x9b\xa2\x52\xb5\x30\
+\x57\xa8\x60\x6a\xae\x8c\xa9\xb9\x12\xf2\x0b\x15\xf7\xc5\x64\xed\
+\x37\x41\x4e\x99\x31\xc9\x80\x25\x81\x95\xf0\xb1\x09\xf0\x8c\x59\
+\x2c\xc6\x10\xac\x84\xab\x2d\x80\x95\xe9\xb5\x37\x17\x8f\x71\x95\
+\x2a\x16\x8a\x95\x1a\x8a\x95\x1a\xaa\x35\x17\xb4\x52\x8e\xd1\xbe\
+\x6a\xd9\x18\x9f\x29\x82\x52\x60\x20\xd7\xc1\x6d\x29\x0f\xf0\x63\
+\x3b\x99\x74\x1a\x43\xab\x06\xb1\x7a\x78\x00\x53\xd3\xb3\x98\xcd\
+\x2f\x44\x35\x61\x35\x9c\x15\x43\xa7\x00\xbc\x95\x1b\xdb\x6c\x37\
+\x0b\xac\x56\x06\x50\xdd\xbc\x11\xfd\xbd\xde\x84\x4f\xfe\x01\x18\
+\x9f\x2d\x3a\x9b\x37\x8a\x24\x45\x3e\x30\x04\xad\x20\x65\xf0\x4c\
+\xb3\x2f\xb6\x38\xa1\x93\x79\x00\x35\x0f\x70\x30\xc7\x8a\xc9\x2f\
+\xd4\x4f\x84\x38\xf6\x40\x3d\x17\x4a\x06\x32\x81\xaf\xf1\xbd\x11\
+\x56\xc5\x94\xb2\x71\x21\xe2\x9f\xea\xea\x78\x62\x36\x55\x9d\x18\
+\x24\xa7\xac\xd1\xdc\x65\x4e\xe5\xaa\x8d\x7c\xa1\x8a\xc9\xb9\x12\
+\xa6\xe6\xca\x98\x2b\x54\x51\xae\x3a\xaa\x0e\x7b\x8f\x44\x3f\x4b\
+\x25\x60\x49\xd7\x83\x61\x57\x5e\x3a\xa6\xb1\xaa\x81\x11\xf6\x9a\
+\x45\x81\x15\x6f\xbf\xe4\x0e\x00\xa1\x4d\xcd\x16\x8f\x6d\x55\xaa\
+\x0e\x68\x95\x3c\xd0\x82\xf3\x31\x98\xca\x97\x50\xae\x5a\x18\xe8\
+\xc9\xfa\x6e\x37\xe2\xe0\x2b\x01\x90\x4e\xa7\xd0\xd7\xdf\x8b\xb1\
+\x35\x23\x98\x9f\x5f\xc0\xc4\xd4\xac\xca\x54\xcc\x4a\x1f\x80\x8f\
+\xb8\xc7\x7b\x73\x63\x9b\x2b\xcd\x00\xab\x95\x03\x54\x92\x8d\xca\
+\x49\x3a\x31\xc3\xaa\x7e\x62\xac\x78\x12\x0f\xb4\x88\xea\xcb\xab\
+\x79\x88\x45\xd6\xa5\x65\x52\xdc\x0b\xc4\x37\x44\xb6\x6d\xe9\x58\
+\x95\x82\x81\x89\x2f\x15\x53\x46\xa8\xaa\x41\x94\x87\x4d\x97\xa8\
+\xc9\xe8\x5e\xff\x29\x75\xf6\xb8\x73\x98\x93\x0b\x4e\xc5\x0a\x2a\
+\x55\x1b\xb6\xb7\x52\x02\x6b\x40\xe6\xbb\xca\x15\xce\xcf\xb7\xd5\
+\xb0\x2b\x36\xaf\xc8\xae\x20\xdf\xe7\x66\x80\x95\xee\x19\x69\xa5\
+\xd8\xb6\xa3\x2e\x97\x2a\x8e\x7a\x58\xa9\xda\x98\x9e\x2b\x61\xa1\
+\x54\xc5\x40\xae\x03\xd9\x2c\x03\x05\xc2\xc7\x24\x95\x22\xe8\xce\
+\x75\x63\xfd\xba\x51\x58\xb5\x2a\x2e\x8d\x4f\x99\xba\xdd\x0c\xc1\
+\x31\xb2\x2f\x34\x0a\x56\x2b\x0b\xa8\x14\x93\x37\x27\x66\x8b\x18\
+\x9f\x09\x1f\xf5\xab\x1b\xb4\x38\xba\x2f\xa8\x7f\x1a\x67\x64\xff\
+\xe1\xd5\x01\x8e\xee\xe1\xd6\x00\x1b\x5f\x84\x08\x9c\x5e\x31\x32\
+\x42\x11\x39\x73\x38\x10\x91\x88\x78\x43\x15\x4f\xf7\xc7\xfd\x13\
+\xd6\x5e\xb1\x29\x50\xb5\x6c\xcc\x15\x5d\xb5\x2e\x5f\xc2\x5c\xb1\
+\xea\x82\x13\xfc\x6b\x23\x31\x4b\x0f\xb0\x04\xc0\x61\x01\x2b\x60\
+\x4c\x08\xda\x21\x5e\xe7\x30\x55\x10\xc1\xfd\xe4\xef\x37\x09\xbf\
+\x9f\x1a\xb0\x12\x6e\x49\xd4\x5d\x69\x89\xd8\xcc\x68\xe2\xf8\x4c\
+\x11\xe3\x33\x05\xf4\x76\x67\xd1\xc3\x18\xd9\x3d\x61\x47\x04\x3b\
+\x3a\xb2\x58\xb7\x76\x14\x6d\x6d\x29\x5c\xb8\x34\x89\x4a\xb8\xdb\
+\x4d\x1b\x80\x3b\x01\x6c\x84\xe3\x76\x33\xd9\x88\xdd\x6a\xc5\x00\
+\x55\x9f\xcb\xa8\xc4\x04\xe3\x1a\x63\x3a\xa0\x61\x49\xd2\x01\x7f\
+\xc2\xaa\x02\x60\x8e\xb9\x07\x57\x63\xb3\xe2\x1e\x52\x0e\x84\xfc\
+\x60\x1e\x54\x84\x34\xa6\xee\x33\xa2\x1a\x21\xbd\xbc\x11\x9d\xe6\
+\x4e\x15\xec\x86\x5f\x51\x41\x43\x7f\x62\x09\x3f\x4d\xd1\xeb\x67\
+\xcd\xb2\x31\x5f\xae\x61\xda\x05\xa7\xbc\xa7\xd6\x51\x41\xad\xe3\
+\x2e\x98\x5a\x15\x16\x19\x96\x52\x6d\xd7\xb1\x5d\xa6\x51\xe1\x60\
+\xa5\x4f\xa3\x03\x2b\xf1\x8e\x36\x7b\x24\xb0\x51\xb1\x29\xc5\xcc\
+\x7c\x19\x67\xc6\xe7\x91\x6d\x4b\xa3\xb7\xdb\x5d\x2e\x46\xe5\x36\
+\x46\x80\xf6\xb6\x36\xac\x1d\x1d\x41\x6f\xae\x13\x17\x2e\x4d\xa2\
+\x58\x2a\x47\xb9\xdd\x5c\x0f\x67\x13\x89\xb7\x01\x9c\xae\x17\xac\
+\x56\x0c\x50\xf5\x6b\x56\xf8\x9c\x98\x29\x62\x7c\xb6\xe8\x5f\xc8\
+\x20\x46\x48\x1b\x07\xb4\x14\x0f\x5e\xf8\x7c\x29\x06\xa8\x22\xd9\
+\x13\xa4\x87\x99\x65\x5e\xe2\xcb\xc6\x81\xa8\x08\x64\xe2\x8b\x20\
+\x19\x70\xd9\x8c\x7a\x56\xe5\xcd\x23\x62\xac\x34\xf1\x45\xc2\x33\
+\x9e\xfe\x7a\x51\x96\x45\x51\x28\xd7\x30\x33\x5f\xc1\xe4\x5c\x19\
+\xb3\x0b\x65\x1e\x9c\x54\x6d\x90\xd8\x14\x03\x58\xc2\x05\x23\xda\
+\x6b\xa8\x60\x57\xd2\xdc\xa9\x28\xb0\x0a\x4f\x13\x65\x9f\x94\xc0\
+\x8a\x63\x5d\xf5\x5d\xf6\x66\x08\x21\x04\xa5\x8a\x85\x73\x93\xf3\
+\xa0\x00\x7a\xbb\xdb\x99\x38\xa6\x6d\x8e\xf7\x17\xd2\xde\xda\x56\
+\x43\xfd\x18\x9f\x9c\x46\x7e\xae\x10\x05\xb6\xeb\x01\x7c\x10\xc0\
+\x59\x00\x87\x73\x63\x9b\x69\x5c\xb0\x5a\xd1\x40\x05\x28\x46\xfd\
+\x20\xde\xf4\xb8\xa0\xa5\x7a\xa0\x21\x3d\x88\xba\x38\x15\x98\x98\
+\x01\x58\xf4\x86\x0f\xfe\xcb\xc5\x37\x81\xeb\x23\x11\xca\x54\xd1\
+\x2e\xe9\xf2\xe8\xe2\x22\x42\xc3\xc5\x29\x98\x82\xc0\xb2\x1d\x70\
+\x72\x26\x60\x3a\x93\x0f\x8b\xe5\x5a\x30\x5a\xa7\x68\x4f\x60\x87\
+\xe2\x1b\xa7\x62\x59\x3a\xc0\x62\x4e\x95\x13\x30\xbd\xbb\xc4\x6a\
+\x66\xec\xf5\x65\x8d\xec\xe1\x60\x15\x71\x5f\xd9\xf6\x73\x57\x94\
+\xff\x7a\x2d\x2d\x58\x01\xd5\x1a\xc5\xc5\xe9\x02\xaa\x35\x1b\x03\
+\xb9\x0e\x10\x42\x50\xb3\x1c\xdb\x20\x61\xae\x83\x33\x22\x98\x42\
+\x7f\x7f\x3f\xd6\x8e\x0e\x21\x9f\x9f\xc3\xd4\x74\xe4\xda\x56\x43\
+\x00\x3e\x02\xa0\x00\x67\x99\xe3\x5a\x1c\xb0\x5a\x11\x40\x75\x5b\
+\x08\x50\x8d\xcf\x16\x31\xee\x8e\xfa\x29\xd9\x42\x0c\xd0\xf2\x1e\
+\x42\xee\xa1\x53\x3c\xc4\x2a\x56\xe5\xbf\x30\x4c\xa1\x51\x6a\x81\
+\x8a\x49\x89\xac\xd0\xd4\x6e\xc5\xd6\x27\x9d\xab\xd2\xa9\x2f\x87\
+\x00\x70\x44\x9d\x28\x4c\xdc\xe4\x96\x4d\x51\xaa\x58\xc8\x2f\x94\
+\xfd\x99\xe1\x05\x17\x9c\xa8\xd7\x78\xe6\xcf\x63\x42\x52\x8d\x1e\
+\x68\x41\x03\x5a\x4c\x7b\x45\x95\x50\x65\xbf\x52\x83\x9b\xde\x3e\
+\xa8\x1b\x3c\xe1\xef\x71\xc4\xfd\xe6\xa6\xac\xc8\x0c\x7b\x29\xed\
+\x55\xdc\xa5\x26\x8e\x2a\x38\x3e\x53\xc0\x7c\xa9\x8a\xa1\xbe\x0e\
+\xb4\xb7\xa5\xdd\x15\x21\x6c\x58\x9c\x4a\xee\x38\x53\xe7\x72\x39\
+\xac\x5f\x37\x82\x72\xb9\x8c\x4b\x13\xd3\xb0\xc3\xb7\x94\xcf\xc1\
+\xd9\xed\xa6\x13\x8e\xdb\x4d\xc9\x14\xac\x56\x0e\x50\xf5\xea\x18\
+\x55\x01\x13\x33\x45\x89\xed\xc4\x05\x2d\x22\x3e\x60\x9a\x49\x7e\
+\xde\xcc\x5f\x29\x4e\xc3\x8c\x58\x1f\x30\x08\xf1\xec\x43\x1e\x9c\
+\x43\xdb\x17\xd5\x03\x2d\xf6\x49\x04\x2b\x3f\x34\x82\x45\x8a\xc0\
+\x44\xb4\x89\x85\x30\x06\x59\x3c\x70\x9a\x75\xe7\x3a\xcd\xb8\xb3\
+\xc3\x6b\x2e\x38\x71\xd8\x24\x67\xd7\x02\x17\x5b\x97\x96\x65\x31\
+\x27\x2a\xc0\x12\xab\x90\x3f\x04\x21\x46\xf6\x18\x60\x25\x3e\x2f\
+\x7c\x98\xd0\x1e\xb6\x1d\x8a\xb6\x2e\xa5\x4c\xbb\x73\xd5\xfa\x73\
+\x1d\xe8\xee\x6c\xf3\x97\xac\xf1\x96\xb1\xf1\x9c\xf3\x53\x29\x82\
+\xce\xae\x4e\x8c\xad\x5d\x8d\x14\xa1\xb8\x10\xed\x76\x93\x05\xf0\
+\x5e\x00\xfd\x00\x76\x98\x4e\x5f\x58\x31\x40\xd5\xd7\xab\x5e\xe1\
+\x93\x65\x54\x80\xfc\x92\x03\x9a\x77\x4c\x7c\xc1\x09\xfb\x2b\x80\
+\x0f\x09\x4a\x56\xdb\x17\xf8\xaf\xa4\xf6\x2b\xab\x7b\xc8\xd9\x34\
+\x4c\x39\x12\xf3\x82\xfc\x20\x2b\x87\xe4\xb9\x9e\x6b\x54\x0a\xaf\
+\x33\x2a\xe3\xbb\x26\xb9\x4a\x2c\x9b\xa2\x5c\xb1\x90\x77\x77\x46\
+\xf1\xd4\xba\x9a\x45\xdd\xb9\x38\xfc\xbf\x00\x71\xc0\xfd\x89\xe0\
+\xe5\x77\x46\x35\x15\x21\x04\xb0\xd8\x0b\xa8\xfc\x60\x48\xd7\x2d\
+\x04\xac\xd8\xfb\xa4\x05\x2b\x3e\x6d\xd8\x07\x8c\x57\xfd\x08\xdf\
+\x0e\xae\xad\x06\x37\x64\x11\x64\xae\x50\xc5\xa5\xe9\x02\x72\x9d\
+\xed\xe8\xeb\xce\xfa\xe1\xd4\x75\xf6\x0e\x66\xc0\x03\x1d\xd9\x2c\
+\xd6\xad\x1d\x41\x77\x67\x16\xe7\x2f\x4d\xa0\x5c\x8e\x74\xbb\xb9\
+\x09\xc0\x49\x38\x73\xad\x22\x0d\xec\x2b\x68\x17\x1a\x7e\x59\x57\
+\x9d\xe7\x7d\xb0\xcd\x7b\xb0\x62\x59\xb0\x70\x19\xa4\x32\xbc\x65\
+\x3c\x82\xa5\x6a\x29\x82\x10\x61\xbd\x25\xc2\xa4\xf3\x51\x13\x10\
+\x27\x9e\xb0\xa3\xef\xdc\xf6\x4c\x90\x8f\x83\x32\xe4\xb5\xb7\x21\
+\xe6\x55\xdc\x78\x71\xe1\x38\x67\x67\x1d\x5e\x81\x52\xaf\x07\x05\
+\x10\x4a\x41\xb8\xad\x78\xa8\x32\x35\x8b\x85\x36\xdc\xa9\x04\xa5\
+\x2a\xc6\xf3\x25\x9c\x9b\x5a\xc0\xb9\xe9\x82\xb3\x39\xa6\x67\x14\
+\xf7\x40\x42\x41\x9b\x82\xd3\x70\xf0\x52\x81\x96\x8a\x65\x89\x80\
+\x15\xaa\x0e\x6a\x55\x41\x11\xac\x34\x1f\x15\x25\x58\xc9\x69\x39\
+\x40\x54\x80\x95\xe2\xd0\x6f\x2b\x1b\xb2\xd4\x42\x88\xc3\xac\x76\
+\xed\x3f\x87\x43\xa7\xa7\xfd\x49\xb6\x9e\x50\xea\x8c\xdc\x96\xdd\
+\x15\x28\xda\xda\xdb\x71\xe7\x1d\x37\xe3\xfe\x4f\x7e\x10\xab\x87\
+\xfa\xa3\xa6\x02\x77\x01\xf8\x1c\x9c\xd5\x17\x22\x65\xc5\xac\x47\
+\x05\xc8\x4b\x2c\x51\xf5\x7b\xc5\xa4\x0f\x16\x04\xf2\x1e\x1f\x16\
+\x44\x38\xa5\x8b\x7a\x3f\xcc\x83\xe6\xae\xc7\x47\xbc\x38\xca\xaa\
+\x56\xc4\x5f\x1f\x8a\x7a\x0f\x9d\x9f\x9e\x79\x0a\x29\x40\xbd\x87\
+\x97\x06\x79\x79\x61\x91\xcd\x3d\x27\x6c\xfa\xa0\x8d\xd2\x62\x79\
+\x14\xa0\xec\x42\x6d\x70\x1b\x25\x94\xaf\x9c\x4d\x1c\xf5\x62\xb8\
+\x6d\xb0\x28\x45\xb5\xea\xb8\x66\x94\x2a\x35\x94\xab\x16\x6a\x16\
+\x65\x46\xea\x74\x25\x78\x9d\x80\x7f\xed\xf9\x10\x37\x15\x37\x1b\
+\xd4\xbb\x04\x54\x8a\xf7\x6d\x5b\x80\x0b\xb0\xec\xe5\xf2\xae\x4f\
+\xb0\x2a\x82\xbf\xe6\x39\x71\xe0\x3c\x58\xc5\x85\xf8\xae\x3a\x84\
+\xb0\x6b\x98\x51\xdf\xf5\x8d\x80\x38\xbb\x35\xbb\x33\xb4\xa9\x93\
+\xd0\x4d\x2f\xc6\x07\xc7\x5e\xa1\x84\x52\x66\x6d\x2c\xb7\x8d\xd4\
+\x7b\xbe\x18\x3b\x9d\xb7\xda\x1d\xa3\x2d\x78\x7e\x7a\x11\xdb\x5a\
+\x2d\x8a\x10\x02\x2c\x94\xaa\x38\x37\x31\x8f\x2b\x47\x7b\x91\x4d\
+\xa9\x95\x30\xcb\xa6\x80\x4d\x91\x4a\xa5\x30\xb6\x6e\x0d\x46\x86\
+\x07\x70\x71\x62\x26\x8a\x1e\x76\xc0\x50\xab\x5b\x51\x40\xc5\x2f\
+\x49\x1b\x3c\xd4\xe2\xfd\x54\x5d\x1b\x1d\x68\x11\x22\xae\xb6\xc9\
+\xe4\xe1\xbe\x8e\xc1\x67\x33\x58\xc0\x4e\x88\x13\xda\x25\x28\x77\
+\x6e\x98\x1b\xef\x52\x66\x6f\x1b\x72\xaf\xcd\x1e\x10\x49\xa0\x8c\
+\x60\xf7\x60\x1f\x96\x54\x6c\x4e\x6c\x51\xc8\x64\x4f\xaa\xd9\xc1\
+\x85\x82\x75\xbf\x70\xc0\xa9\x52\x63\x96\x16\x71\x13\x9a\xd9\x53\
+\x82\x8e\x11\x02\xff\xc5\xe7\xee\xa7\x50\x0c\x61\xa8\x25\x0b\x5a\
+\xf5\x02\x16\x07\x44\x0c\x58\x79\x8b\xdf\xf9\xd7\x9e\xba\x20\xe2\
+\xb7\x33\x0a\xac\x20\xa5\x0d\xf0\x2a\x28\x8b\x50\x12\xb4\xc7\xfb\
+\x70\x79\x75\xbb\xb0\x15\x00\x26\x03\xd0\x24\x7c\xcd\xae\x56\x0b\
+\x85\xb3\x3d\xfc\x35\xeb\xfa\x71\xe7\xc6\x11\x64\xdb\xc2\x31\x85\
+\x10\x82\xa9\xa9\x69\x6c\x7b\xfe\x65\xbc\x7d\xf8\x94\xc9\xf3\x71\
+\x1c\x40\xd1\xa4\x2d\x2b\x06\xa8\x54\xeb\x49\x47\xa5\xd5\x5d\x27\
+\xca\x3c\x4a\x5c\x62\x17\x81\x7c\x20\x70\xd1\xc4\x61\x02\xde\x0b\
+\x41\xdc\x97\xd9\xfb\x36\xc2\xff\x42\x06\x31\x0c\xab\x22\x54\x00\
+\x2c\xa6\x6e\xaf\x44\x56\x05\x11\xd3\x48\x7d\x61\x80\x90\x61\x5f\
+\x32\x63\xe2\xf5\x46\xca\xe4\x27\x8a\x24\xb6\xed\x38\xb4\x56\xaa\
+\x36\x4a\x55\x07\x9c\x58\xd6\xe4\x49\xca\x04\x9b\x54\xe2\xd5\x45\
+\xe4\xc0\x80\x3c\xc9\xc0\xe5\xf5\xd1\x04\xb0\x58\x62\xe6\x83\x03\
+\x02\x80\xf4\xd7\x2c\xa7\x41\x5e\x07\xc8\x78\x76\x65\x0e\x56\xea\
+\xb4\x1e\xcb\x06\x55\x80\x15\xdb\x75\x8a\x00\xbc\xfc\x20\xc2\x00\
+\xaa\x8a\x7f\x2e\x8e\x50\x0a\xb4\xb7\xa5\x70\xd3\x95\x43\xb8\xf9\
+\xea\x55\xc8\xb6\xa5\x43\x41\x93\x10\xe0\xdc\xb9\xf3\xd8\xba\xfd\
+\x25\xbc\x73\xea\xbc\x49\x15\x07\x01\x7c\x07\x40\xd5\x64\x75\xd0\
+\x25\x07\xaa\x54\xa6\x03\x76\xad\x64\x96\x58\xa5\xbf\x50\x6f\xcd\
+\x74\x70\xc8\xc4\x52\x7d\x20\x0c\xb4\x18\x8c\x52\xb0\x25\x0a\x1a\
+\xb8\x7c\xb0\x0f\x17\xdb\x1e\xb6\x5d\x5c\x5e\xe6\x21\xf4\xbf\xda\
+\x72\x3d\x5e\x18\x9b\x07\x0c\xd3\x93\x54\x52\xb6\x97\x92\x16\x29\
+\x30\x3a\x4e\xd5\xf5\xe2\x9c\x25\x77\x6b\x2e\x6b\x2a\x57\x6d\x67\
+\x39\x5e\xcb\x86\x6d\x0b\xb3\xc8\x75\xf7\xc2\xd8\x9e\x42\xb9\x1f\
+\x25\xb3\x13\xd4\x5b\x16\xac\xfd\x4b\xcf\xb2\x2c\x0d\x60\x79\x1f\
+\x17\x2d\xbb\x62\x55\x41\x4e\x53\x23\x4a\xb0\xf2\xef\x8d\x08\x56\
+\xcc\xa5\x8e\x06\x2b\xe6\x56\x51\x96\x75\x45\xa8\x80\xec\xb3\xb9\
+\xc8\x58\x45\x29\xd0\xd5\x91\xc1\x1d\xd7\x8d\x60\xe3\xd8\x00\xd2\
+\x29\x12\xbe\x1a\x2b\xa5\x38\x7a\xec\x04\xb6\x6e\x7f\x09\x17\xc7\
+\xa7\x4d\x98\xd4\x21\x00\xbf\x01\x67\xfd\x2a\x23\x59\x72\xa0\xea\
+\x18\xde\x88\xc2\xb9\x7d\x46\xb3\xdd\x02\x16\x01\x9e\x30\xf8\x80\
+\xc1\xda\x43\xc2\x41\xcb\x67\x2b\xac\x21\x94\x05\x19\x1f\x3c\xd8\
+\x17\x9f\x30\xf5\x32\x46\x52\xd6\x66\x25\x74\xc3\x09\xe3\x0d\x63\
+\xbc\xea\x16\xe4\x0d\x8a\x12\xd4\x45\x9f\x9d\x89\x65\x53\xc5\x1a\
+\xea\x2c\x22\x10\x7f\x27\x15\xdb\xa6\xa8\x5a\xce\x5a\xe1\xd5\x9a\
+\x03\x4c\x1e\x63\xa2\xc2\x75\x90\x49\x8f\xa4\x00\xc7\x10\xc2\xfd\
+\x30\x77\x48\x09\x5e\x32\x68\x09\x2c\x8b\x53\xdd\x35\x80\x25\xaa\
+\x83\xac\xea\x05\x57\xc5\x72\x59\x72\xb8\xdd\x4a\x63\x93\x62\xed\
+\x47\x02\x73\x0a\x46\x44\xa8\xcf\xc0\x38\xb6\xe7\xb7\x29\x42\x05\
+\xf4\x91\x74\x71\x59\x15\xa5\x40\x7f\x4f\x16\x77\x6d\x1a\xc5\x15\
+\xab\x7b\x84\x7b\x26\xdc\x59\x42\x50\xab\xd5\xf0\xe6\xfe\x83\xd8\
+\xbe\x73\x0f\x66\xe7\x16\x4c\x40\xea\x05\x00\xff\xca\xfd\x85\xe9\
+\x5a\xeb\x4b\x0d\x54\xa4\x73\x78\x23\x2d\x9c\xdb\x67\x9c\x81\xd5\
+\x12\x88\x18\x06\xe6\xa1\x0f\x01\x2d\x2f\x8f\x7f\x4c\x19\xd0\xe1\
+\x0c\xcf\x24\x30\x90\xb3\x15\xb1\x5f\x79\xef\xab\xca\x15\x2c\x1b\
+\x9c\x82\x32\x18\xb0\xa3\x0c\x88\x29\x41\x92\xef\x35\x6f\xcc\x87\
+\x74\x4c\x5d\xf6\x60\x51\x0a\xcb\x72\x1c\x4f\xbd\x8d\x0c\x6a\x96\
+\xed\xcf\x7f\x11\x41\x57\x9e\x00\xaf\xb7\x6b\xc9\x77\xd0\xe4\x66\
+\xa9\x92\x07\x2a\xab\x9f\x98\xaa\x40\x8b\x67\x59\x22\x60\x29\x55\
+\x42\x51\x1d\x74\x3f\x4c\x2c\x10\xb1\xaa\x60\x14\x58\x81\xb0\xf5\
+\x51\x2e\x6d\x60\xa7\x62\xd5\x3c\x91\x4d\x05\xc6\x75\x95\x0a\xe8\
+\x0f\xc8\x68\x54\xc0\xc5\x34\xac\x8f\xae\xea\xc6\xdd\xd7\x8f\x62\
+\xa4\xbf\x33\x14\x1e\x09\x21\x28\x97\x4a\x78\xe9\x95\x7d\x78\xf1\
+\xd5\x37\xa3\xb6\xda\x02\x00\x0b\xc0\x43\x00\x7e\x13\xc0\x61\xc0\
+\x1c\xa4\x80\xa5\x03\x2a\xbf\x47\xeb\x3f\xfe\x31\x4c\xee\xfb\xc7\
+\xba\x0a\xa1\x8a\x13\xe5\xa8\x9e\x08\x5a\x4a\x20\x10\x2d\xba\x2e\
+\x63\x61\xd9\x0d\xf1\x9f\x59\xef\xfb\xe7\x26\x0d\x10\x8c\xb3\x59\
+\x11\xc6\x66\xc5\xc4\x39\x35\xb2\xb6\x2e\xf0\xf5\xb3\xba\x27\x43\
+\xfc\xfc\xf7\x96\x06\xfb\xc6\x59\xae\x6d\xc9\xdb\x5b\xae\x66\x39\
+\xe7\xc1\x9e\x74\xec\xb5\x20\xbe\x8a\x24\x3d\x52\x51\xe0\x44\x94\
+\x87\xda\x90\xa0\x1f\x8a\x7b\xc5\x04\xa8\x81\x8b\x07\x2d\xce\xbe\
+\xe6\x52\x68\x51\x25\x14\x01\x8b\x65\x57\xac\x8a\xa7\x52\x05\xa3\
+\xc0\x8a\x53\xed\x18\x55\x4c\x05\x56\x9c\x29\x3d\xcc\xb8\xce\xa8\
+\x80\x9c\x7d\x60\x89\x54\x40\x42\x80\x0d\xa3\x7d\xd8\xbc\x69\x35\
+\xfa\xba\xdb\x23\xec\x51\x04\x73\x73\x73\x78\x6e\xe7\x2b\xd8\xbb\
+\xff\x48\xd4\x04\x4f\xc0\x31\x98\x7f\x17\xc0\x1f\x01\xb8\x58\xcf\
+\x8e\x35\x4b\x01\x54\x6c\x8f\xc8\xa3\x5f\x00\x5d\xf7\x0d\x76\x3c\
+\x5f\x16\xdb\xa6\x28\x96\x6b\xce\x0b\x46\x00\x6f\x89\x55\xc7\x17\
+\xc9\x79\x31\x53\xfe\x8c\x64\xf5\xec\xec\xa0\xf2\xe0\x9b\xc5\xa9\
+\x55\x94\xfa\x54\x9c\x63\x49\xec\xd6\x56\xf2\xb8\x60\x60\x39\x52\
+\xda\xcf\x00\x0d\x2a\x48\xaa\x9f\xaf\x96\x00\x80\x0d\xd8\xee\xcb\
+\x6a\x83\xfa\xb3\x81\x2d\x9b\xa2\x66\xdb\xb0\x2d\xef\xd8\xdb\x63\
+\x8e\xdb\xf8\x4b\x66\x5d\x2c\x7b\x92\xee\x84\x66\xc2\xa7\x94\x3e\
+\xbe\xd2\x17\x9a\x9b\x50\xe5\x87\xc6\x87\xfe\x80\xee\xf2\xcc\xd9\
+\x6b\xb3\x16\xb0\x02\x10\x02\xc0\x4c\x0d\x61\xd8\x95\x38\x0a\x67\
+\x0a\x56\xde\xf5\xe5\xf6\x07\x24\x7e\x1b\xfd\x27\x2b\xca\x5e\xc5\
+\xde\x76\xc1\x5e\xb5\xd8\x2a\x20\x05\x90\x49\x11\x5c\x7f\xc5\x20\
+\x6e\xbb\x76\x18\x9d\xd9\x4c\x24\x48\x8d\x8f\x4f\x60\xeb\xf6\xdd\
+\x38\x72\xec\xb4\x6c\xda\x90\x65\x1a\xc0\xd7\x01\xfc\x25\x80\xb9\
+\x7a\xb7\xd5\x5a\x6c\xa0\x22\xe2\x6f\x9a\x10\xac\x7e\xef\x3f\x0b\
+\x7d\x0d\x6c\xea\x18\x7d\xfd\x87\x87\xf9\x6f\x7a\xae\x84\xf1\x99\
+\x82\xb3\x89\x63\x8a\x20\x45\x52\xee\xaf\xb3\x86\x0e\x71\x37\x77\
+\x4c\x11\x67\x01\xb0\x54\x2a\x05\x42\x68\x00\x6c\xbe\xf9\x87\x80\
+\x53\xfa\x3c\xf5\x40\x7c\xe1\x85\xee\xb0\x54\xdd\x4b\x41\xd9\x97\
+\x86\x39\x0e\x58\x18\x05\xe0\x6d\x68\x09\x7f\x63\x4b\xdb\xa6\xb0\
+\xa8\xd3\x5f\xea\x87\x79\xa9\x85\xa1\x75\xee\x3a\x30\x70\x63\x04\
+\x50\x1a\xf6\x14\xda\x57\x3e\x28\x2e\x6c\xc9\xa0\x24\xce\x36\xe7\
+\xf7\xc9\x0b\x30\x9c\xe1\xa0\x9c\x2d\xca\x2d\x43\x02\x2c\x86\x5d\
+\xb1\xe4\x84\x65\x57\xf5\x82\x15\x33\x1a\xe7\xab\x65\x08\x1f\x09\
+\x54\xda\xab\x34\x2a\x20\x37\x38\xa3\x08\x6a\x36\xab\xa2\x14\xe8\
+\x68\x4f\xe3\xd6\x6b\x86\x71\xc3\x86\x41\xb4\xa5\x53\x91\xe5\x9f\
+\x3c\x79\x1a\x4f\x6f\xdf\x8d\x33\xe7\xc6\x4d\xec\x51\xa7\x00\xfc\
+\x6b\x00\x7f\x0f\xc3\xd1\x3d\x9d\x2c\x16\x50\x11\xc5\x31\xf3\x1b\
+\xef\xea\x53\xe6\x3f\x67\xbe\x8f\x0d\x85\xa9\xc7\x29\x9c\x61\x0d\
+\x9e\x9f\x9e\xb7\xe9\xa3\xf3\xeb\x31\xb4\x80\xa5\x11\x38\xc0\x06\
+\x17\xe0\xd8\x38\xf6\xf1\x51\x33\xb7\x80\x1a\x79\xe0\xe2\xb5\x97\
+\x05\x1b\x9d\xda\x2a\xae\xc2\xc0\xdb\x92\x04\x08\x61\x19\x51\xbd\
+\x00\x15\x06\x4e\xc4\x04\x90\xa2\x52\x50\x39\x15\x61\x63\x20\x03\
+\x97\x12\xb4\x3c\x96\xa5\x00\x2c\x96\xf1\xf8\x6c\x8a\x70\xc6\xf6\
+\x48\xb0\x82\x08\x46\xf5\x81\x15\xd7\x1e\x95\xbd\x2a\x44\x05\x64\
+\x4d\x06\x94\x9d\xa8\xd5\x02\x56\x45\x29\x45\x4f\x57\x3b\xde\xb3\
+\x69\x35\xae\x5e\xd3\xe7\xcf\x27\x54\xde\x61\x42\x60\x5b\x16\xde\
+\x3e\x74\x14\xcf\xee\x78\x05\x93\xd3\x79\x13\x90\xda\x07\xc7\x68\
+\xbe\x15\x00\x6d\x74\x83\xd2\xc5\x00\xaa\x08\x90\x82\x6e\xec\xbd\
+\xe1\xca\x00\xef\x0b\xc4\x18\x90\x29\x05\x25\x14\x96\xad\x59\x25\
+\x41\x62\x2b\x8c\xff\x9f\xe0\x84\xaa\x4c\xc3\xa8\x71\x7e\xd9\x60\
+\x00\x93\x65\x25\x0a\x7f\x40\x33\x07\x58\x26\x0d\x77\xee\x17\xc4\
+\x5f\x0b\x95\x8a\x47\x98\xf4\xc2\xc5\x0b\xb5\x41\xc5\x66\x55\x44\
+\x09\xca\x01\x07\x0d\x0a\x0a\x3e\x40\xcc\x2c\x33\x06\x95\xb4\x80\
+\x65\xc0\xae\xb4\x60\x85\x30\x30\x52\x81\x15\xcb\x6c\x02\x10\x91\
+\x55\x3f\x8d\xbd\x2a\x4c\x05\x64\x28\x93\x8e\x4d\x35\x83\x55\x51\
+\x0a\x0c\xf5\x75\xe1\xee\x1b\x46\xb1\x66\x55\xb8\x07\x0b\x21\x04\
+\xd5\x6a\x05\x7b\x5e\xdf\x8f\x9d\x2f\xee\xc5\x7c\xf8\x6e\x34\xde\
+\x1d\x7c\x06\x0e\x48\xed\x05\xe2\x19\xcd\x75\xd2\x6a\xa0\x12\x41\
+\x2a\x0c\xb4\x5a\xdb\x10\x22\xfc\xba\xff\x71\x2f\xbe\x94\x86\x05\
+\x1d\x01\xd8\xfc\x74\x8a\x34\x6c\x1c\x73\x1c\x06\x52\x2a\xb0\x0b\
+\xa2\xc2\x41\xaa\x19\x00\xa5\x04\x27\x2d\x70\xc5\xbc\xf6\xca\x13\
+\xc2\x00\x93\x73\xc0\xf6\xcf\x8b\x0b\xfa\xc9\xba\xb7\xb8\xf9\x5d\
+\x3d\x3b\x00\x35\x28\xd9\x15\x3b\x77\xca\x49\xe7\xaa\xf9\xbe\x0d\
+\xdb\x1c\xac\x7c\x55\xce\x27\x50\x8c\x0a\x17\x62\xaf\x32\x55\x01\
+\x7d\x20\x52\x4d\x7f\x67\xea\x6f\x44\xd6\x8f\xe4\x70\xd7\xf5\xa3\
+\x18\xec\xed\x88\xb4\x47\x15\x0a\x05\xec\x7a\xf1\x35\xbc\xb2\xf7\
+\x6d\x54\xc2\xf7\xf7\x03\x80\x0a\x80\xff\x0e\xe0\x77\xe1\xa8\x7d\
+\x4d\x01\x29\xa0\xb5\x40\xa5\x03\x29\xa2\x49\xd3\x62\x11\xaa\xe5\
+\x11\xc5\x7f\xf8\x83\x46\x6a\x00\x88\x47\x10\xbe\x28\xae\xaa\x56\
+\x81\x94\x5e\xd5\x13\xd5\xbc\x50\x80\xd2\x81\x53\x50\x65\xe4\xe5\
+\x54\xaa\x8b\x9c\xd0\xe0\x7f\xdd\x54\x05\x1f\x98\x78\x84\xf2\xe2\
+\x24\x96\x25\x02\x16\x09\x6c\x81\xfe\x3b\x2d\xb0\x2b\xb5\x2a\xe8\
+\x5e\x33\x4a\x65\xb0\x82\xde\x66\xa5\x9c\x63\xc5\x61\x0a\x51\xda\
+\xab\x54\x2a\xa0\xd7\x68\xad\x0a\x08\xd6\xaa\xd9\xd8\x74\x05\x8a\
+\xc0\x1d\xe6\x3d\x1b\x47\xfc\xa5\x5b\xb4\xb7\x97\x10\x4c\x4f\x4f\
+\x63\xdb\x8e\x97\x71\xe0\xd0\x3b\xb0\x2c\x1a\x05\x52\xf3\x00\xbe\
+\x0d\x6a\xff\x29\x08\x99\xba\xb0\xfb\xaf\x62\xb5\x2f\x4a\x5a\x05\
+\x54\x24\xe2\x57\x08\xa3\x26\xaf\x46\xfd\x8d\xe1\x98\x92\x0c\x3a\
+\x22\xbb\x92\x3c\xde\x15\x2d\x96\xc1\x89\x30\xc9\xf4\x2f\x7c\xd3\
+\x41\x4a\x61\xb7\x92\x96\x3f\x01\x9f\x89\x6f\x96\x02\xe4\x94\xd7\
+\xaf\x9e\x5b\x24\x33\x41\x4f\x82\x81\x06\xf1\x3a\xba\x20\x12\x0b\
+\xb0\x22\xd8\x15\x61\xd2\x71\x06\x74\x70\xaa\x20\x6b\x1b\x52\x1a\
+\xd8\xc1\xaa\x61\x3c\xcb\x09\xb3\x57\xe9\x54\x40\x42\x35\xdc\x48\
+\xd2\xfb\xd0\x10\x89\x0a\xdc\x61\x56\xe1\xe6\xab\x87\x0c\xdd\x61\
+\x2e\x60\xeb\xf6\xdd\xbe\x3b\x4c\xc4\xc7\xeb\x12\x40\xbf\x6a\xd7\
+\xca\xff\xf1\xbe\x1f\x7c\xaf\xf8\xb7\x1b\x9b\xff\x3a\xb7\x02\xa8\
+\x62\x82\xd4\x62\xb0\x2a\xa2\x3e\xe5\x7e\x89\x36\xab\xa4\xf2\x71\
+\x11\x50\xa8\x7c\xe0\xde\x3c\xd1\xc6\xc5\xd6\x59\x0f\x48\xe9\x55\
+\x3d\xfd\x9a\x4b\xb1\x00\x4a\x04\xbb\x88\x4b\xab\x4b\xa9\x63\x52\
+\x62\x7f\x01\x70\x0c\x81\xed\x73\x00\x12\x54\x01\x58\x2c\x08\x41\
+\xcd\xae\x58\xb0\x02\x22\xed\x56\x32\x98\x31\x60\xc5\xda\x90\x24\
+\x15\x31\x40\x1e\x25\xce\x08\x2a\x20\xd8\x7a\x5b\xc8\xaa\x44\x77\
+\x98\x54\x84\x3b\x0c\x40\x71\xf4\xe8\x09\x3c\x6d\xee\x0e\x73\x04\
+\xd4\xfe\xed\x4a\xfe\xfc\x8f\xa6\xde\x7e\xd8\xfa\xdb\x8d\xdf\xf7\
+\xbf\x15\x66\x0f\x90\x99\x34\x1b\xa8\xe2\x82\x54\xcb\xc5\x88\x4d\
+\x71\x20\xa0\x56\xf9\x04\x14\x51\xb2\x2a\xd9\xb9\x98\x05\x22\xb1\
+\x4d\xe6\x20\xa5\xb3\x47\x89\xaa\x26\xcf\xaa\xf8\x36\x73\xfd\x50\
+\x81\x4b\x04\x38\x85\x3f\xaf\xaa\x48\xde\xe6\xc4\xc7\x40\x7a\x8c\
+\xd9\xb9\x6a\x2a\x1f\x4d\x7f\x95\x09\x0e\xb0\xa2\xd9\x55\xa0\x0a\
+\xea\xed\x56\x1c\x58\x79\xa0\xa1\x01\xab\x30\xe3\xba\xd2\x5e\xa5\
+\x51\x01\x63\xb3\xa9\x3a\x58\x95\xca\x1d\x46\x7f\x7f\x09\xac\x5a\
+\x0d\x6f\xc4\x73\x87\x79\x89\x5a\xd5\xdf\x98\x7a\xeb\x47\x3b\xab\
+\x0b\x93\xec\xdd\x6e\x02\x0f\xe4\xa5\x99\x40\x55\x0f\x48\x11\xf7\
+\x8a\xb6\x10\xb4\x4c\xd8\x14\x00\x12\x5e\x04\xcf\x66\x14\x2a\x1f\
+\x0b\x52\x02\x10\xb1\xe9\x44\xc0\x64\x0b\xab\x0f\xa4\x1a\x03\x28\
+\x9d\x5a\x27\x3f\xa3\xe1\xb7\x48\x8c\xa5\x21\xe9\x89\x4f\x81\xbc\
+\xb4\x60\x1e\xe9\xe0\xba\xa9\x58\x96\x6f\x1f\xf2\xce\x01\x85\x8a\
+\xc7\xd8\x8a\xc0\x02\x11\x24\x00\xe2\xc1\x0a\xfe\x2b\xc6\x82\x15\
+\xc7\xe0\x20\xb2\x19\xb6\x52\x16\xb4\x22\x54\xc0\x10\xc3\xba\xcf\
+\x9e\x1a\x60\x55\x14\xc0\xe8\xaa\x2e\xdc\x7d\xfd\x1a\x0c\xf7\x77\
+\x86\xdf\x3b\x42\x50\x2e\x97\xf0\xd2\xcb\x71\xdc\x61\xe8\xa3\x76\
+\xb5\xfc\x5b\x97\xf6\x7c\xff\x20\x9c\x05\x38\x29\x53\x75\x93\x94\
+\xd6\x40\x9a\x05\x54\xf5\x83\x54\x0b\x99\x55\x2c\x36\xe5\x1d\x89\
+\x6c\x4a\x62\x1a\x1a\x95\x4f\xa8\x93\x6f\x87\x9a\xbd\x49\x6d\x69\
+\x22\x48\xf1\xed\x90\x7d\xbe\x55\x00\x15\x06\x4e\x3a\x76\xa4\xbd\
+\xf6\x21\x71\xe2\x77\x89\x05\x2e\x9e\x4d\xb9\xdf\x31\xc6\x9e\xe5\
+\x78\xc1\x04\x3a\x20\xaf\xe2\x81\x5b\xe5\xc0\x53\x05\xd9\x69\x0c\
+\x2a\xb6\x04\x56\xe5\xf2\xd5\x3c\x06\x38\x3c\x8d\x8f\x61\x42\xa2\
+\x71\x9d\x9d\xb9\x6e\xa4\x02\x72\xaf\x30\x0f\x76\x7e\x11\xcc\x6f\
+\x9c\xd7\x9e\x10\xe0\xca\x98\xee\x30\x3b\x76\xbe\x82\xd7\xf7\x1f\
+\x41\xad\x66\x47\x81\x54\x09\xd4\xfe\x5b\xab\x3c\xf7\xd5\xf1\xbd\
+\x7f\x7f\x1e\xc1\x2a\xc1\x4d\xe4\x82\xb2\x34\x03\xa8\x96\x25\x48\
+\x29\x8b\x8f\x6a\x85\x09\xab\x52\x65\x93\xde\x62\xdd\xdc\x2b\x3e\
+\xa3\x08\x8c\x7c\xba\xb8\x20\x65\xc6\xa2\xa2\x01\x8a\x68\xc2\xe3\
+\x5c\xef\xf0\xe7\x92\x2b\x97\xfa\xfc\xc8\x8d\x93\x47\x0a\xbd\xeb\
+\x24\x7a\x26\x38\x80\xc5\xb0\x2b\x6f\x3a\x43\x84\x2a\x48\xdc\x37\
+\x3f\x50\xc1\x04\xb0\xe2\xa6\x37\xf0\x6c\x46\xa5\xb3\x99\xa8\x80\
+\x5e\xe5\x1c\x4b\x52\x18\xd6\xb9\xbc\xcc\x3b\xae\x67\x55\x01\xb8\
+\x53\x0a\x64\xd2\xf1\xdd\x61\x9e\x79\x6e\x37\x0e\x1f\x3b\xad\x70\
+\x86\x97\x64\x96\xda\xd6\x37\x2b\xf9\x73\x7f\x39\x7d\xf0\xd1\x3c\
+\x02\x90\x12\x1b\xdc\x74\xb0\x6a\x14\xa8\x9a\x01\x52\xa4\x09\x80\
+\x2b\x37\x8c\x08\xbf\x7e\x65\x21\x6c\xca\x0b\x57\xcd\x99\xf2\x52\
+\x29\xa9\x53\x88\xca\xc7\x25\x51\xdb\xa5\x78\xd5\x8f\x69\x4d\x23\
+\x20\xa5\x9c\x9e\xa0\x03\x28\x33\x70\x12\x0d\xe0\x61\x29\x75\x42\
+\x59\x04\x12\xdb\xcc\x80\x96\x8a\x65\xf9\x0c\x8b\x9d\x46\x40\x18\
+\x76\x65\xaa\x0a\xb2\xd4\x46\xc0\x1e\x4e\x1d\xf3\x03\xc0\x31\x30\
+\xb5\xea\x45\x82\x36\x88\x2a\xa0\x5f\x2e\x04\x03\x15\xfb\xfe\xd6\
+\xcb\xaa\x5c\xd0\xa5\x2d\x77\x87\x39\x43\xad\xea\x1f\xce\x9f\x79\
+\xf5\xef\x17\xce\xef\xab\x82\x07\x29\x45\x47\x9a\x0b\x56\x8d\x00\
+\x55\x93\x40\x4a\xca\xd3\x24\xd1\xa9\x6b\x51\x2d\x50\x34\x9f\x08\
+\x65\xb0\xd9\x04\x40\xe4\x5a\xa0\xb1\x4b\x49\xc6\x73\x4e\x1d\x34\
+\x07\x29\x79\x52\xa9\x22\x3d\xd3\x0e\x70\xf9\xd8\xda\xd5\x77\xc0\
+\x1c\x98\x62\xdc\x15\xa1\x32\xce\xc6\xc2\x54\x17\xa8\x87\x2c\x00\
+\x05\xfd\x61\x47\xf7\x40\x78\xdb\x95\x4e\x15\x14\xc1\x8a\x57\x03\
+\x35\xeb\x9e\x83\x61\x39\xcc\xab\xe6\xbf\x7d\x8a\xf9\x55\x41\x67\
+\x7c\x3d\x91\xb3\x97\x89\xe0\x55\x1f\xab\xe2\xd9\x54\x4f\x57\x9b\
+\xb9\x3b\x8c\x6d\xe1\xed\x43\xc7\xf0\xec\x73\x2f\x1b\xba\xc3\xd0\
+\xfd\x76\xb5\xf4\xdb\xd3\x07\x1f\x79\xba\xba\x30\xe9\x35\xdd\xbb\
+\x23\x2a\x20\x6a\x3a\x58\xd5\x0b\x54\x44\x73\xbe\x2c\x40\x4a\x66\
+\x51\xaa\x5f\x93\xf9\x54\x9a\x86\x2a\x0c\xe8\x7e\x49\x3e\x70\x29\
+\x98\x9b\x92\x41\x35\x08\x52\x1c\x96\x10\x89\xe8\x71\xe3\x96\x46\
+\x00\x45\x22\x58\x95\x78\x60\x28\x94\xfb\x61\xda\xa4\x06\xad\xc0\
+\xa0\xce\x33\xac\x60\xba\x02\x71\xcf\x99\x11\x38\x88\xac\x29\x50\
+\xb1\xe2\x80\x15\x3b\x12\xe8\xd1\x22\xde\x5e\xc5\xd3\x30\x11\x38\
+\xd4\x6c\x8a\x0d\x8c\xcf\xaa\xb4\xc6\x2e\x0a\x0c\xf5\x75\xe2\xae\
+\xeb\xe3\xb8\xc3\x1c\xc0\xce\xdd\x7b\x31\xbf\x50\x8c\x76\x87\xa1\
+\xf4\x39\xab\x3c\xf7\x5b\xe3\x7b\x7f\xf0\xba\x5b\x73\x18\x48\x85\
+\x81\x15\x84\xf0\x58\x52\x0f\x50\x11\xcd\xb1\x2a\x8d\x0e\x8c\x5a\
+\xc8\xa4\x98\x62\x25\xc4\x89\x40\x30\x13\x36\xa5\x98\xa5\x2e\x4f\
+\x37\xd0\xf7\x54\x65\x3c\xe7\x92\x36\x09\xa4\x22\x59\x94\x70\xe5\
+\x75\x0f\x2c\x0f\x66\x0d\xdc\x2e\xbf\xff\x3c\x62\x71\x4f\xb0\xaf\
+\xda\x05\x31\x12\x60\x79\x36\x2c\x0d\xbb\xf2\xd7\x1b\x03\x8d\x01\
+\x56\xec\xdb\xc5\x83\x95\xff\x56\xb1\x60\x05\xd1\xf0\xce\x20\x28\
+\x07\x36\xc2\x44\x50\x08\xbf\x22\x9b\x0a\x61\x55\xe2\x08\xa0\x27\
+\x63\x23\x39\x6c\xbe\x7e\x14\x83\x3d\xd9\x66\xbb\xc3\x54\x41\xed\
+\xff\x59\x5d\x18\xff\x83\xc9\xfd\x0f\x9e\x84\xb3\x5b\x0c\x3b\xb2\
+\xc7\xde\x59\x13\xd6\xa4\x02\x31\x63\x69\xa5\xea\x17\xc6\xb2\xf8\
+\xe3\xe6\x9b\xa8\x22\x90\xd1\x90\x4d\x85\xb0\x2a\x42\x34\x15\x31\
+\x91\x61\x2a\x9f\x72\x84\x8f\x05\x84\x38\x20\x25\x4d\xf4\x0c\x61\
+\x51\x06\x00\x15\x05\x4e\x44\x7b\x22\x08\x55\x9d\xf2\x68\xce\x02\
+\x17\xa3\x75\x39\x31\x22\x60\xb1\x36\x2c\x6e\xc6\xb8\xf3\x86\xb3\
+\x3b\xe4\x44\xae\x7b\xce\x82\x0b\x33\x45\x80\x41\x25\x69\xb9\x60\
+\xd5\xab\x18\xb0\xa9\x90\x51\x40\x8d\x61\x5d\xfd\xde\xca\xac\x4a\
+\xf5\x9b\x4a\x11\x5c\xb3\xb6\x1f\x77\x5c\x37\x82\xee\xce\x68\xa3\
+\xf9\xf4\xf4\x0c\xb6\xed\x78\x09\x07\x0e\xbd\x03\xdb\x8e\x74\x87\
+\x29\x50\xbb\xf6\x57\xe5\xe9\x13\x7f\x36\x73\x64\xeb\x14\xe4\x91\
+\x3d\xdd\xb1\xe9\x6f\x6c\x89\x0b\x54\x26\x60\xa4\x0b\x0f\x49\xdb\
+\xbc\x79\x54\x3c\x80\xe8\x8c\xdf\x61\x5d\x53\x1c\x2b\xcb\x20\xdc\
+\xff\x3a\x95\x4f\xd5\x73\xa1\x89\x5c\x7d\xbc\xfb\x0e\x9a\x06\x52\
+\x42\x35\x6a\x80\xd2\x80\x93\x39\xa1\x62\xb5\x02\x39\xbd\x7f\xca\
+\xb1\xa9\xe0\xa2\xb0\x8e\xc2\x6c\x7f\x7d\xc0\x72\xfb\xcd\x2e\xb3\
+\x02\xee\x5c\x50\x05\xc3\xd6\x3d\x87\xc8\xa6\x84\x49\x99\xc2\x85\
+\x89\x5e\xdb\x9c\xbf\x8e\x9c\x0a\xc8\xe2\x13\xe2\xb3\x2a\x9f\xc1\
+\xc1\x59\xbf\xac\x2d\x93\xc6\x8d\x57\x0e\xe2\xa6\x2b\x9d\xdd\x61\
+\xec\x10\x94\x22\x84\xe0\xfc\xf9\x0b\x78\x7a\xdb\x6e\xd3\xdd\x61\
+\xc6\xa9\x55\xfe\xd3\xf9\x33\xaf\x7d\x7f\xe1\xfc\xbe\x02\xe4\x91\
+\x3d\xef\xa6\xc5\x55\xf5\x1a\x02\xad\x38\x40\x15\x07\x8c\x10\x91\
+\x96\xfb\xa5\x30\x78\x07\xea\x6e\xa6\x10\xc3\xb1\x25\x22\x9c\x33\
+\xbf\x61\x8d\x26\xea\x5f\x55\x33\xb8\x51\x3e\xbf\x0d\x21\x76\xa9\
+\x7a\x41\x8a\x04\x75\x70\xe9\xa5\xf6\x19\xce\xa9\x52\x5e\x4a\x0e\
+\x7e\x63\xdd\x03\xca\x1e\xb1\x80\x2d\x82\x56\x28\x60\xa9\xd8\x15\
+\x05\x4f\x8e\x62\x6c\xd2\x00\x7e\x8a\x80\xb4\xbd\x55\xc4\x64\x50\
+\x1f\x40\x42\x46\x01\x83\x9b\xc3\x1b\xd6\x8d\x58\x95\xe2\x1a\x76\
+\x75\x64\x70\xfb\xb5\xc3\xb8\x76\x5d\xbf\xef\x0e\xc3\x12\x41\x3e\
+\x9b\xe7\x0e\xb3\xdb\xd0\x1d\x86\x1e\xb3\xab\xc5\x3f\x98\x3e\xf4\
+\xe4\xc3\xd5\xf9\x8b\x16\xd4\x23\x7b\xa6\x80\x13\x07\xc4\x22\xc5\
+\x14\xa8\x1a\x06\x23\xc5\x2f\x9b\xaf\x29\x38\xa5\x37\x41\x99\x34\
+\x5f\x88\x97\x50\x2b\x84\x71\xf9\x49\x58\x60\x08\x57\xf9\xb8\xdc\
+\x3e\x48\x71\x94\x47\x60\x32\x06\x4c\x8b\x6b\xb2\x0c\x52\x6a\xbb\
+\x15\xcb\xe6\x54\x97\x88\x68\xc2\xe3\x49\xc0\xa6\x82\x42\x9c\x97\
+\x8b\xe1\x55\x34\x0a\xb0\x88\x7b\xce\xb2\x2b\xaf\x9f\x75\xee\x28\
+\xc3\xb2\x16\x15\x78\x68\xe6\x57\xe9\x5e\x51\x3f\xca\x84\x4d\x79\
+\xbf\x3a\x56\xc5\x00\x26\x6c\xa0\x3f\x97\xc5\x7b\x36\x8e\x60\xfd\
+\x48\xf4\xee\x30\x56\xad\x86\x37\x0e\xb8\xee\x30\x79\x03\x77\x18\
+\x6a\xbf\x5a\x2b\xe5\x7f\x67\xe2\x8d\x7f\x78\x11\xd4\x66\x6f\x59\
+\x18\x08\x99\xfe\xea\xf2\x23\x24\x0d\x27\xcd\x56\xfd\xc2\xc0\x48\
+\x0c\x6f\x1e\x89\x12\x8b\x0c\xa1\x46\x6a\x36\x45\xc2\xb2\xf0\xbf\
+\x1a\x36\xa5\xec\x8c\x90\x99\x3b\x15\x18\x10\x07\x2f\x1c\x20\x09\
+\x6c\x8c\x6d\xaf\x5f\xbf\x08\x4a\x24\x94\x45\x11\xfe\x3f\x05\x7b\
+\x8a\x06\xa7\x38\x37\x8f\x6a\x32\x3a\xe0\x44\x82\x34\xde\x66\xad\
+\x61\x80\xe5\x5e\x0f\xd1\xdf\x0e\x0c\xb3\x71\xc2\xa3\x76\x94\x61\
+\x47\xd3\x88\x6c\x5c\xf7\x49\x10\xf3\x1e\xa9\x54\x40\x18\x18\xd6\
+\xfd\xbe\xc4\x61\x55\xbc\xac\x1e\xec\xc2\x5d\x9b\x56\x63\xa8\x5f\
+\xbd\x86\x94\xdf\x95\x14\x41\xb9\x54\xc6\x4b\xaf\xec\xc5\x8b\xaf\
+\x18\xb9\xc3\xd8\xd4\xb6\x9e\xac\x2e\x5c\xfa\xbd\xa9\x03\x3f\x3e\
+\xc4\xdc\xa1\x56\xa9\x7a\x51\x20\xa6\x14\x13\xa0\x32\x01\x1d\xd3\
+\xbc\xaa\x32\x48\x2b\xac\xe9\x22\x9b\x32\x55\x5a\x82\x64\xf1\xd8\
+\x54\xa8\x01\xdd\x2f\x92\x57\xf9\xe0\x57\xc3\xb3\x25\x22\xc6\xb1\
+\x4d\x88\x09\x52\x61\x2c\x4a\x0b\x50\x8a\xcb\xc4\xf1\xae\x98\x9f\
+\x98\x80\x4d\xf9\xff\x05\x77\xdc\xeb\xaa\x0b\x36\xa1\x80\x25\xec\
+\x28\x53\x0f\x58\x05\xa3\x81\xec\x48\x9a\xde\xb8\x2e\x39\x11\x87\
+\xbc\x6e\x52\x54\x1c\x56\xe5\xb7\x03\xbe\x11\xdf\x73\x6a\xde\xb0\
+\xba\x17\x77\x5e\x37\x82\xde\xee\x76\xd9\xb7\x8f\x01\x3b\xdf\x1d\
+\xe6\xf9\x57\xf1\xfa\xfe\xc3\x26\xee\x30\x65\x6a\x57\x7f\x50\x9e\
+\x7a\xe7\x6b\x33\x47\x9f\x65\xdd\x61\x1a\x65\x49\x61\x8f\x42\x5d\
+\x2a\x60\x23\x36\x2a\x31\xbc\xde\xdf\xa6\x88\xe8\xd7\x67\x52\xbb\
+\xf7\xba\xaa\x41\x2d\x3e\x9b\x12\xde\xf9\xd0\xde\x72\xcd\xe4\x18\
+\x14\x0b\x52\x7c\x10\xd7\xd6\x98\x20\x15\xce\xa2\xd4\x00\xe5\xa7\
+\x6c\x90\x55\xf1\xa0\xc4\xd4\x2f\x6c\x14\x1a\x84\x6b\x00\x8b\xb8\
+\xe0\xc2\x00\x91\xa7\x0a\xb2\x76\xab\x38\x60\x85\x10\xe3\xba\x18\
+\x61\xbc\x63\x4c\x3d\xac\x4a\x34\xca\x53\x20\x93\x4a\xe1\xba\xf5\
+\xfd\xb8\xf5\xaa\x21\x74\x64\xd3\x01\x18\xb3\x00\xcb\xdc\x6b\x67\
+\x77\x98\x97\x70\xf8\xd8\x29\x13\x77\x98\xbc\x5d\x2b\xff\xc5\xc2\
+\xb9\xd7\xbf\xb3\x70\x6e\xef\x1c\xf8\xe9\x07\xaa\x5b\x1d\x87\x25\
+\x35\x13\xdc\x00\x44\x03\x95\x29\xc8\xc4\x0d\x47\x44\x78\x3c\xd1\
+\xd0\x00\xbe\x72\xc5\x2a\x9d\x26\x3d\x8c\xc1\xa6\xbc\x76\x28\x0d\
+\xe8\x60\xd5\x4b\x7d\x39\x62\x9b\x39\x30\xe1\x22\x63\x80\x54\x0c\
+\x80\x92\x00\x53\xd1\xf3\xf0\x40\x45\x32\xe1\x51\x0c\x80\x8b\x30\
+\xf1\x94\x03\x34\xd5\xf6\x57\xfe\xe8\x1c\xd1\xa8\x82\x7e\x3a\x3d\
+\x58\xc9\xf8\xa3\xb7\x57\x89\x1b\x82\xb2\x2a\xa0\x34\x11\x14\x02\
+\x88\x71\xd3\x15\xe2\xb0\x2a\x02\x1b\x14\xd9\xf6\x34\x6e\xbe\x6a\
+\x15\x36\xad\xef\x47\x5b\x3a\x05\x3b\x84\x7f\x10\x02\x9c\x3c\x79\
+\x06\x4f\x6f\xdb\x8d\xd3\xe7\x2e\x19\xd8\xa3\xe8\x39\xbb\x5a\xf8\
+\x93\x99\x63\xcf\xfe\x43\x65\xf6\x6c\x05\xc1\xea\x07\x61\x00\x13\
+\x05\x36\x3a\x96\x14\x15\x1e\x05\x66\x00\x9a\xe7\xeb\x17\x37\x9c\
+\x18\xa4\x8d\xdd\x08\xb9\xf0\x38\x45\xf3\x4d\xaa\x97\x4d\x71\x60\
+\x18\x06\x76\x24\x48\x23\xb3\xaa\x20\xc0\x07\x39\x0e\x4c\x1a\x07\
+\x29\xd1\x3d\x46\xc5\x9e\x94\x0c\x51\xb8\xa6\x51\x57\x98\x72\x89\
+\x5c\xa8\xa1\xaa\x78\xe2\xb3\x2c\x8e\x61\x29\xd9\x95\x7b\x6d\x54\
+\xaa\x60\x04\x58\x39\x20\x44\x02\x9b\x94\x5b\x33\x15\x98\x8e\x97\
+\x4e\xa7\x02\x4a\x6f\x55\xe8\xeb\xa6\x79\xdf\x15\xe8\x45\x6d\xa0\
+\xa7\xb3\x0d\xb7\x5f\x3b\x82\x2b\x47\x7b\x7c\xf7\x21\xbe\x58\x17\
+\x16\x09\x60\xdb\x36\xde\x3a\x78\x0c\xcf\x6c\x7f\xc9\xcc\x1d\x86\
+\xda\x6f\xd7\x4a\xb3\xbf\x3f\xf5\xd6\x43\xcf\xd8\xd5\x22\x05\xbf\
+\x44\x8b\x49\x8f\xea\x65\x49\xc6\xec\x49\x25\x61\x40\x55\x2f\x9b\
+\x8a\xcf\xbe\x68\xe4\xf3\x6e\x26\xe2\x1b\xcf\xfc\x72\x6c\xc6\x3f\
+\x0f\x99\x1a\xa0\xbd\x1c\xc2\xb1\xe8\x4e\x43\xd4\xb9\x94\xf5\x70\
+\xc9\x05\x00\x63\x6b\x51\x80\x50\x14\x48\x11\xfe\xbf\xf0\x39\x55\
+\x7c\x02\x45\xbd\x42\x7b\x74\x97\x45\x14\xaa\x86\xb5\x60\xe0\x8f\
+\x2a\x40\x4b\x06\x2c\xe2\x66\x52\x2e\x23\x0c\x05\x73\x32\x01\x2b\
+\x8e\x5a\x09\x6f\x5f\x4c\xd5\x2d\x36\xab\x52\xb2\x2b\x27\x70\x55\
+\x5f\x07\xde\xb3\x71\x04\xa3\x03\x5d\xee\x35\x51\xbf\xdb\x29\x42\
+\x50\xa9\x56\xb0\xe7\xb5\xfd\xd8\xf1\xc2\x5e\xcc\x17\xa2\xdd\x61\
+\x28\xb5\x76\x55\xe7\x2e\xfd\xde\xd4\x5b\x3f\xde\xeb\x56\x2b\x3e\
+\xd4\x51\xcc\xa6\x5e\x96\xd4\x30\xab\x6a\xc6\xcc\xf4\x26\xa4\xaf\
+\xdf\x98\x6e\x46\xdd\x62\x32\x2b\x81\x09\x99\xb1\xa9\x88\xe9\x08\
+\x22\x3a\x84\xaa\x7c\x0c\x6e\x70\xc6\x73\xa1\x62\x03\x90\x8a\x64\
+\x51\x5a\x80\x52\x5c\x39\xc5\x65\x0c\xc5\x29\x55\x24\x07\x5e\xc1\
+\xd6\x57\x40\xc0\xb4\x7c\x10\x62\x55\x42\x1f\x10\x9c\x84\xa2\x2a\
+\x68\x0a\x56\x3e\x30\x91\x08\x7b\x95\x97\x34\x84\x4d\x35\x87\x55\
+\x05\x87\xeb\x86\x72\xb8\x73\xe3\x08\x06\x7a\xb2\x4e\x1f\x58\xeb\
+\x3d\x47\xc4\x08\x0a\x0b\x0b\x78\xfe\x85\x3d\x78\xf9\x75\x23\x77\
+\x98\x1a\xb5\x6b\x0f\x95\xa6\xde\xf9\xea\xec\xd1\x67\x4e\x22\xb0\
+\x47\xe9\x46\xf0\x4c\x01\x24\x2e\x4b\xaa\x9b\x55\xe9\x80\xaa\xd9\
+\x6c\x2a\xaa\x9c\x06\x45\x7e\xd1\xe3\xcc\x44\x8f\x32\xa2\xeb\xf2\
+\x85\x5b\xd3\x35\xe5\x85\xb1\x2a\x45\x80\x04\x52\x7e\x79\xf5\x83\
+\x94\x9f\x52\xc6\x3d\xae\x4e\xa9\xbb\xaa\x40\xa3\x2b\xec\x09\x95\
+\xc0\x8b\x1f\xed\x73\xd2\xc8\xfb\xf5\x69\x96\x11\x46\xc4\x68\x9f\
+\xff\x5a\xb0\x3e\x77\x8c\x73\x8b\xc4\x6c\x64\x15\x30\xb8\x7a\x8a\
+\x89\xa0\x9c\x6a\xa8\x5b\x9d\x53\x33\x02\xe8\x15\x4f\x9d\xfb\x78\
+\xf5\xda\x5e\xdc\x7e\xcd\x30\xba\x3a\xf4\xee\x30\xde\x87\x65\x7a\
+\x7a\x06\xcf\x6c\xdf\x8d\xfd\x07\x8f\xc3\x8a\x76\x87\x29\xda\xb5\
+\xf2\x77\x0b\x17\xde\xf8\xd6\xfc\x99\x3d\xac\x3b\x0c\x98\xe6\x89\
+\xc7\xd0\xa4\x61\xcf\xeb\xfd\x35\x2d\x87\x93\x66\xad\x9e\xd0\x48\
+\x9a\xe6\x80\x96\x4e\x77\xe3\x00\x81\x28\x81\x02\xca\x5f\xa2\x2c\
+\x57\x9a\xd5\x2d\x55\x17\xce\xa6\x64\x9e\x12\xa4\xe1\xa7\x29\x88\
+\xc6\x73\xb6\xc8\x38\x20\x25\x02\x56\xd0\x2e\x13\x80\x92\xda\xab\
+\xb9\x5b\x62\xb0\xf2\x5d\xa3\x6c\x1d\xa2\x2d\xca\x0b\x95\x99\x8d\
+\xc7\xae\xd8\x89\x9e\x9e\x2a\x18\x35\x35\x41\x98\x75\x20\xcf\x20\
+\x67\xa6\x01\xa8\xd6\x8f\x62\x67\xad\x1b\x91\x01\xe9\xb5\xe3\x01\
+\x8f\xc5\x05\x0a\x8a\xb6\x4c\x0a\xd7\x5f\x31\x80\x1b\x37\x0c\xa2\
+\x3d\xc3\xae\x21\x25\x63\x08\x21\xc0\xd9\x73\x17\xf0\xd4\xb3\x2f\
+\xe2\xf8\xc9\x73\x61\xb7\xc3\xbb\xc6\x93\x76\xa5\xf0\xe7\xf9\x13\
+\x3b\xff\x73\x69\xea\x1d\xd1\x1d\xc6\x14\x40\x54\x0d\x8a\xea\x7d\
+\xa3\x69\x24\xc9\x68\x0a\x52\x9d\xc7\x65\x53\x71\xd3\xd5\x2d\x3a\
+\xf0\x50\x28\x2f\x11\xdd\x25\x11\x8d\x65\x38\x85\x66\xa4\x2f\xb4\
+\xd3\xcc\x89\x88\xab\x32\x23\x94\x5b\xa5\x74\x75\x69\x36\x48\xa9\
+\x00\x2a\x1a\xa7\x42\xaf\x2a\x1b\xe8\x3f\xa1\x22\x68\x71\x80\xa5\
+\xde\x0d\x99\x80\xf0\xb6\xab\x28\xb0\x82\x30\x7d\x80\x35\x47\x6b\
+\xed\x55\x01\x50\x82\x8d\x65\x40\xcb\x8c\x55\x29\xde\x74\xaf\x9d\
+\x04\xa0\x36\x45\x57\x36\x83\x5b\xae\x5a\x85\x6b\xd6\xf6\x23\x95\
+\x52\x6b\x8b\x81\x8a\x4b\x71\xe4\xe8\x09\x3c\xf9\xec\x6e\x5c\xb8\
+\x34\x65\x62\x34\x3f\x51\x2b\xe5\xff\x78\xe6\xd0\xe3\x8f\xd4\x4a\
+\xb3\x9e\x3b\x4c\x5c\xf6\x24\x86\x37\x9b\x2d\x19\x83\xa2\x89\x31\
+\xdd\x34\x7c\xc9\xc5\x5c\x35\xd1\xcf\x44\x6f\xb8\xbb\x51\x6c\x8a\
+\x73\x22\x56\xb3\x36\x0e\x30\x25\xe3\x39\x53\xb4\x62\xba\xb9\x1e\
+\xa4\x88\x54\x9d\x29\x40\xc9\x57\x80\xc4\x7f\x0a\x5c\x7b\x13\x5b\
+\x9f\x0c\x5a\x3c\x60\xe9\xd9\x95\x21\x58\x31\x4c\xc8\xb7\x49\x69\
+\xed\x55\x3a\x36\xa5\x67\x44\x5a\x62\x20\x00\x9e\xe4\x03\x48\x29\
+\xfa\x72\x59\xdc\x71\xed\x30\xc6\x86\x72\x5e\xcf\xd5\x45\xb9\xee\
+\x30\xfb\xde\x7c\x1b\xcf\xec\x78\xc5\xc8\x1d\x86\x52\xeb\xf5\xea\
+\xfc\xf8\x1f\x4e\xbd\xf5\xe3\xdd\xc1\x5e\x5e\x0d\x4d\x21\x68\xb6\
+\xc4\x05\x4a\x09\xa8\xe2\x82\x53\xbd\xec\x2b\xaa\x5c\xf3\xee\xb2\
+\x4f\xbe\x82\x9e\x04\x18\x40\xb8\x73\xb9\x15\x3a\x95\x8d\x05\x06\
+\xef\x97\x67\x38\xea\x79\x53\x2a\x36\xc5\xa3\x0d\xd7\x36\x3f\x56\
+\xad\xf2\x01\xea\xba\xb8\x76\x30\xf5\xa8\x40\x4a\xc9\xa2\x4c\x01\
+\x4a\x64\x62\xf5\xdc\x2b\x30\x2b\x4f\x8a\x9b\x85\xba\x07\x2c\x60\
+\xa9\xd8\x95\x31\x58\xf9\x23\x6f\x8c\xea\x07\xde\xb8\xce\xad\xed\
+\xa4\x71\x6b\x51\x83\x97\xf8\x1b\xe4\x15\xb7\x68\x57\xc9\xc8\x40\
+\x27\xee\xbc\x6e\x04\x43\xbd\x11\xee\x30\x24\x85\x72\xa9\x88\x17\
+\x5e\xda\x8b\x5d\x2f\xbd\x81\x62\xa9\x6c\xe0\x0e\x53\x7b\xa6\x3c\
+\x7d\xf2\x8f\x66\x8e\x3c\x7d\x08\xfa\xa9\x07\x6c\x35\xf5\x86\x37\
+\xcc\x92\xe2\x84\x9b\x1a\xd3\x4d\xc3\xd1\x60\x78\xc3\x52\xbf\xda\
+\x17\xa5\x9b\x1a\x34\x39\x92\x4d\x85\x30\x38\x45\x84\x6e\x61\x3e\
+\x36\x5d\x3d\x20\xc5\xba\xe8\xb0\xf5\xc8\x00\x25\xe4\x8d\x79\x39\
+\x7c\xa1\x8a\x6c\xc4\x05\x2d\x2d\x60\xa9\xd9\x55\x24\x58\x41\x8e\
+\x97\x8d\xeb\x60\xd8\x14\xaf\x02\x8a\x9b\x2f\x84\xdb\x99\xf8\x7e\
+\xc9\x6f\x25\xcb\xe0\x9c\xb2\xd7\xaf\xee\xc1\xed\xd7\x0c\xa1\xa7\
+\xab\x8d\x61\x7d\x6c\x83\x82\x76\xcd\xe5\xe7\xb0\x6d\xc7\x4b\x78\
+\xed\x8d\x43\xa8\xd6\xac\x28\x90\xaa\xd8\xb5\xf2\x3f\x14\x2e\x1d\
+\xf8\xb3\xf9\x53\x2f\x9f\x47\x30\xb2\xd7\xa8\xfa\xd5\x54\xc0\xa9\
+\xa3\x3e\x00\xad\xdd\x29\x39\x4e\x78\x63\x1f\x6a\xa3\x6a\x82\xf8\
+\x70\x40\x52\x97\x65\x34\x25\x41\x51\xa6\x9a\xc1\x05\x85\x29\x67\
+\xaf\x43\xad\xf2\x41\x8c\x63\x6b\x92\xb1\x51\x01\x52\xe2\xb2\x30\
+\xdc\x01\x07\x50\x52\xbd\x0a\x00\x35\x16\x37\xb9\xcf\x34\x18\x86\
+\x13\x00\x56\xc0\xb7\xb8\x35\xcf\x3d\x03\xba\x29\x58\xa9\x96\x66\
+\x41\xc0\x9e\xb8\x69\x09\xaa\x76\xea\x54\x41\xef\x97\x63\x53\x0a\
+\x30\xd3\xbc\x6e\x99\xb4\xb3\xd0\xdd\xcd\x57\xad\x42\x47\x7b\x5a\
+\xf2\xd9\xe3\x30\x94\x10\x5c\xba\x34\x8e\xa7\x9e\x7d\x11\x07\x8f\
+\x9c\xf4\xc1\x56\x2f\x74\xce\xae\x14\xff\x6a\xee\xd4\xee\xbf\x29\
+\x4e\x1c\x66\x77\x87\x69\xb5\xc4\x56\xe1\xea\x15\x16\xa8\x9a\xa5\
+\xf6\x89\xe7\xa6\xe1\xf1\x2f\x91\xea\x54\xa9\xfe\x29\xd4\x3e\x11\
+\x49\x04\x36\x24\xf9\x0e\x82\x8f\xd7\xa2\x9d\x48\x7b\x18\x40\x88\
+\xcc\xa2\xbd\x22\x9a\x85\xf9\xc4\xb6\x72\xa0\x63\x0e\x52\xa1\x0c\
+\x4a\xa1\x6a\x46\xdd\x0b\x5f\xa8\x98\x2c\xb8\x76\x2c\x68\x11\x3f\
+\x8c\xf8\x0c\x8b\xdd\x82\x9d\x55\x05\xa3\xc0\x4a\xf2\xcb\xe3\xec\
+\x55\x41\x73\x55\xeb\x48\x79\xe1\x4a\xc3\x7a\x08\xab\x92\x01\x2d\
+\x60\x77\x36\x05\xb2\x6d\x69\xdc\xb0\x61\x00\x1b\xc7\xfa\x91\x49\
+\x85\xed\x0e\xe3\x94\x70\xe2\xe4\x29\x3c\xb1\xf5\x05\x9c\x3a\x6b\
+\xe4\x0e\x73\xc1\x2a\xe7\xbf\x31\x73\x74\xeb\xff\xa8\xce\x8f\x8b\
+\xbb\xc3\xe8\x9a\xb8\xd8\xe1\xba\x73\xe3\xf0\x38\xc6\xf4\xb8\x6a\
+\xdf\xe2\x0a\x31\x0a\xd2\xc6\xd6\x83\x9e\xa1\x6c\x4a\xf3\xc2\xeb\
+\x67\xb2\xeb\xd8\x14\xcb\x6e\x88\x54\x1e\xd7\x06\x6d\xd1\x0a\x75\
+\x50\x97\x86\x29\x9f\x68\x2e\xaa\xf1\x35\x62\x12\x52\xe1\xc0\xb7\
+\x46\x11\x1e\xb0\xa8\xef\xff\x27\xb2\x2b\x33\xb0\xf2\xc1\x86\xa1\
+\x55\xd2\x0e\xc7\xaa\xd7\x42\x78\xd5\x74\xfa\x92\x88\x5f\x60\xeb\
+\x12\x58\x15\x05\x90\xeb\x6c\xc3\xad\x57\x0f\x61\xc3\xea\x1e\x1e\
+\xeb\x44\x10\x05\x40\x2d\x1b\x6f\xbd\x7d\x04\x4f\x6d\xdb\x8d\x89\
+\xa9\x59\x03\xa3\xb9\x7d\xa8\xb6\x30\xfe\x6f\xa6\xde\x7e\x74\x1b\
+\xb5\x2a\x36\xe4\x9e\x35\xaa\xa6\x45\x85\xc7\x79\x12\x1a\x9a\x02\
+\x61\x32\x3d\xa1\x19\xd2\x52\x30\x23\x82\xa1\x97\x3f\x53\x37\xa3\
+\x2e\xb5\x4f\x54\xb9\x42\x7b\x45\xd4\x65\xe9\x52\x19\x20\x25\x4f\
+\xe6\x84\x25\x63\x38\x90\x22\x32\x00\x29\x59\x97\x90\xc6\x2f\x4a\
+\xa6\xab\x6a\x58\x57\x74\x46\x3b\x10\x46\xb9\xac\x81\xba\xc7\x00\
+\x16\x0d\x4a\x56\xed\xc3\x17\x05\x56\x81\x41\x5b\x20\x41\x0c\x42\
+\x48\x2a\xa0\x60\x58\x37\x67\x55\xe0\xeb\x82\xfc\xe6\x0d\xf6\x64\
+\x71\xfb\xb5\xc3\x58\x3d\xd0\x85\xb0\xf7\x9c\x10\x82\x4a\xb9\x82\
+\x57\xf6\xbc\x89\xed\xbb\xf6\x18\xed\x0e\x43\xed\xda\xee\xca\xec\
+\x99\xaf\x4e\x1f\x7a\x62\x9f\x5b\x2d\xfb\x04\x2d\x25\x08\x35\x43\
+\xa4\x32\x9b\x6d\xa3\x32\x65\x5b\x42\x78\xa3\xd7\x29\xa2\x3a\x22\
+\xbc\xcf\x11\x3a\x98\x56\xed\x8b\xea\xa5\xce\x77\x50\x51\x2f\xef\
+\xce\xa2\xb0\x75\x09\x6c\x4a\x5c\xd7\x8a\xad\x97\x67\x72\x2c\xeb\
+\x8a\x9e\x9d\x2e\x6b\xaa\x44\x38\x17\x3a\x29\x82\x5c\xd4\xb5\x71\
+\x25\xd8\x86\xdd\x3f\x83\x1f\x44\x83\xb6\xc9\x3b\xca\x98\x83\x95\
+\xcf\x9d\x08\xe4\x39\x4d\x3e\x68\x41\xcb\xa6\x4c\x57\x3a\xe0\x32\
+\x49\xc7\x8e\xac\x59\xd5\x8d\xdb\xaf\x19\x42\x7f\x2e\x2b\x62\x9b\
+\x30\xb7\x8a\xa0\xb0\x50\xc0\x73\x3b\x5f\xc1\x4b\x7b\x0e\xa0\x6c\
+\xe2\x0e\x63\x55\x1e\x2b\x5e\x3a\xf4\x6f\xf3\x27\x77\x9d\x84\xbc\
+\xf2\x81\xae\xaa\xb8\xe1\x71\x59\x8f\x31\x3b\xaa\x47\x3c\xa0\x32\
+\x04\x14\x6d\x78\x9d\x00\xd5\x18\xd3\x22\xba\x00\x11\x10\x22\x4a\
+\x89\xa3\xf6\x11\x29\x0f\x89\xc8\x6b\x06\xa4\x91\x0d\x10\xd2\xa8\
+\x54\x3e\x6e\x0a\x01\x11\x6b\x0e\x63\x5d\x66\x00\xd5\xc8\xcd\x62\
+\x01\x93\x05\x2d\xd5\x7e\x7d\x61\x5b\x5b\x85\x82\x15\xaf\xf1\x49\
+\x01\x6a\x67\x61\xce\xa9\x06\xf2\xb0\xa0\x50\x8e\x77\xa8\xf8\x05\
+\x05\x48\x8a\xe0\xaa\xd5\x3d\xb8\xf9\xaa\x55\xe8\x56\xb9\xc3\x30\
+\x55\x10\x42\x30\x35\x39\x8d\xa7\xb7\xbd\x88\x37\xde\x3a\x06\xcb\
+\x32\x70\x87\xa9\x16\xff\x6e\xfe\xcc\x2b\x7f\x59\xb8\xf8\x96\xe8\
+\x0e\x13\x76\xe9\x5b\xa1\xfe\xd5\x9b\xae\xae\x7a\xa3\xa6\x27\x44\
+\x85\x37\x43\xa5\x8b\x5f\x86\x41\x0e\x62\x10\x5b\x8f\xda\xa7\x67\
+\x63\xec\xaf\x02\x30\x88\x2e\x8b\x01\x9b\x12\x54\x4e\xb5\xca\x47\
+\x84\xea\x59\x80\x31\x07\x29\xd1\x1e\xa6\x7b\x6f\x0c\xb6\x00\xf7\
+\xc5\x9b\x86\xc0\x95\xec\xb3\x29\x57\xd9\x12\xd8\x55\x6c\xb0\x62\
+\xe6\x43\xf1\xf6\xaa\x08\x36\xc5\x36\x8a\x9a\xa4\xd5\x30\x29\x0a\
+\xb4\xa5\x53\xd8\x38\xd6\x8f\x4d\xeb\xfb\xd1\xde\x96\x12\xe6\x6f\
+\x89\xd7\x0f\x38\x7b\xe6\x3c\x1e\xdf\xba\x0b\xc7\x4e\x9c\x0b\xbd\
+\xd6\x4e\xf9\x74\xca\xaa\xcc\x7d\x7b\xf6\xf8\x8e\xff\x5a\x99\x3d\
+\xa3\xdb\x1d\x66\x39\x4b\x43\x80\x55\xcf\xe6\x0e\xcb\x52\xc4\x97\
+\x3f\xac\x0b\x44\x99\x51\x50\x6d\x74\x6a\x9f\xb6\x64\x81\x99\xe9\
+\xe8\x5e\x38\x6a\xc5\xe9\xa4\x54\x1f\x0b\x52\x41\x98\xd0\x6f\x1d\
+\x48\x89\x2c\x4a\xc1\xa0\xe2\x80\x93\xd4\x6c\x26\xaf\xbf\xe2\xa6\
+\xfb\x9f\xc7\xb0\x4c\xf6\xe1\xd3\x82\x15\x37\xfa\x17\xe8\x6e\x66\
+\x4b\xb0\xc8\xac\x4a\x4a\x0f\xdd\x14\x05\xc0\x06\xd0\x91\xcd\xe0\
+\xa6\x0d\x83\xb8\x7a\x4d\xaf\xbb\x3b\x8c\xa8\xef\xb1\xef\x1f\xc5\
+\xa1\xc3\xef\xe0\x89\xad\x2f\xe0\xfc\xc5\x49\x13\x77\x98\x53\xd5\
+\xc2\xd4\xd7\x67\x0e\x3d\xf1\x98\x55\x99\xaf\x29\x9e\x96\x46\x59\
+\xcb\x52\x8a\x51\x9b\x4c\x67\xa6\x37\xda\x90\xd6\xf5\x52\x60\x00\
+\xaa\xda\xe5\x17\x19\x3a\x34\x31\xd0\xbe\x34\x2b\x85\x46\x74\xbd\
+\xa9\x6c\xca\x3b\x12\x41\x96\x4d\xc3\x02\x0d\x09\xc0\x22\x1c\xa4\
+\x14\x00\x45\xf4\xbd\x34\xc1\x2d\xe5\xcc\x6b\x37\xa3\x04\x58\x8a\
+\xdd\x62\x9c\x70\xc5\x82\x77\xec\xcb\x2f\xaa\x61\x60\x9e\x7e\x49\
+\x75\x23\xd0\xce\x0f\xe0\xd0\x48\xfc\x95\xf4\x4a\xbf\x7f\xbd\xdd\
+\x6d\xb8\xed\xaa\x21\xac\x1d\x8a\xde\x52\xbd\x56\xab\x61\xef\xbe\
+\xb7\xf0\xf4\xf6\x97\x31\x33\x3b\x1f\x3d\xb2\x67\x5b\x6f\x54\xf2\
+\xe7\xfe\x78\xfa\xd0\xe3\xbb\x0d\x76\x87\xd1\xf5\x28\x2a\xbc\x51\
+\x60\x6b\x05\x00\x72\x65\x36\xd3\x98\x6e\x0a\x48\x4d\x01\x2e\x1d\
+\x61\x61\x7f\x4d\x26\x26\x9a\x10\x9a\xe8\xba\x64\xb6\x14\x0a\x8e\
+\x71\x58\x94\xb2\x4e\xbd\xca\xc7\xe3\x2f\x0b\x3c\xf1\x41\x2a\xce\
+\x26\xa5\xda\x66\x13\x80\x7d\x86\x39\xa2\x21\x02\x16\xcb\xae\x4c\
+\x56\xe7\x64\x18\x53\xd0\xa6\x10\x15\x10\x3c\x56\xe9\x58\x95\x38\
+\x02\xa8\x64\x55\x6e\x8d\xc3\xfd\x9d\xb8\xed\x9a\x55\x18\xea\xed\
+\xe0\x96\x0b\x96\x90\x80\x10\x94\x4a\x45\xec\x7a\xf1\x35\x3c\xff\
+\xe2\x3e\x33\x77\x18\xab\xfa\x5c\x69\xf2\xe8\x9f\xcc\x1e\x7f\xee\
+\x30\x73\xc1\xc3\x00\x61\xb1\x00\x67\xd1\x01\xac\x15\x33\xd3\x17\
+\x51\xfc\xb9\xcc\x8c\xef\x25\xfb\x35\xf5\x3e\xb3\xd0\x1a\x42\xb9\
+\xb9\x33\xfe\x03\xcc\xff\xaa\x9e\x50\x3e\x0d\x75\x1f\x7a\x75\x1e\
+\xee\x2b\xaf\x68\x03\x57\xbc\xb6\x1d\x44\x1d\xce\x76\x93\x92\xc0\
+\x47\x4e\x8c\x0b\x9a\x1e\xa4\x73\xcf\x29\x03\x62\x94\xb9\x8a\xec\
+\xeb\xef\x1d\x50\x16\x18\xd9\x3b\xa1\x7a\xe7\xd8\xb9\x46\x7e\xba\
+\x80\x89\x04\x61\x84\x63\x57\xbe\x6a\x17\x01\x56\x4c\xb3\xd4\x2a\
+\xa0\x7f\x63\xd9\x04\xdc\x13\x12\xe7\x51\xf3\xcb\xf0\x40\x6e\x6c\
+\x55\x37\x6e\xb9\x7a\x95\xeb\x0e\x43\x15\xe9\x83\xb6\xcf\xce\xe6\
+\xf1\xcc\xf6\xdd\xd8\xb3\xf7\xa0\x99\x3b\x4c\xb5\xf4\xe0\xc2\xf9\
+\xbd\x7f\xbe\x70\x6e\xaf\xb7\x3b\x4c\x2b\x54\xb6\xa5\x64\x4c\xb1\
+\xa4\x1e\xa0\x5a\x54\xe6\x14\x55\x6a\x57\x36\x83\xc1\xde\x4e\x10\
+\xd1\xc9\xd7\x7d\x11\x59\x23\x38\x7b\xae\x9d\x54\xe9\x96\xa3\x5f\
+\xb2\x58\x15\xae\x8b\x07\x5f\x17\x5b\x8f\x4a\xbd\x0b\x53\xfb\x14\
+\x75\x48\x69\xb8\x7e\xe8\xc2\x88\x74\xac\x5a\xdb\x8a\xbb\xe4\xa1\
+\xcc\x0a\xa8\x59\x14\xc5\xb2\x05\xc9\x29\x45\x60\x68\xdc\xc7\xc4\
+\x65\x5a\xdc\x8e\x32\x08\xd4\x3c\x4f\x15\x54\xae\x76\x00\x06\x90\
+\x3c\x50\x03\xe5\x3e\x3c\x51\xab\x72\x06\xec\x4a\x60\x55\xe2\x6c\
+\x75\x51\x53\xa4\x40\x3a\x45\x70\xf5\x9a\x5e\xdc\x78\xc5\x00\xb2\
+\x8c\x3b\x0c\xff\x36\x3b\x6d\x02\x21\xb8\x78\x71\x1c\x4f\x6c\xdd\
+\x85\xb7\x0f\x9d\x80\xad\xb9\x9e\x4c\x05\x73\x56\x79\xfe\x7b\x73\
+\x27\x5f\xfc\x4f\xa5\xa9\xe3\x8b\xe9\x0e\xd3\x0c\x69\x19\xf0\xad\
+\x70\x46\x05\x5c\xbd\xb6\x1f\xeb\x47\x7a\x24\x10\x00\xa0\x7e\x41\
+\xdd\x08\x9d\x1a\x14\xe4\x53\xa8\x54\x41\x06\x46\xeb\xe3\x1f\x3a\
+\x0e\x88\x98\x32\xfd\x10\x22\xa6\x25\xe1\xe5\x33\x85\xb2\x2a\x1a\
+\xd7\x53\xa1\x7f\x92\xfa\x07\x1e\x58\x38\x75\x4f\x0a\x03\x84\xd2\
+\x35\x71\x41\x1f\x26\xf2\x65\xec\x3f\x39\x03\xcb\xe2\xe3\xa8\x70\
+\xe4\xb7\x81\x61\x5a\x22\xc3\x52\x6e\x6f\xc5\x4e\xca\xe4\x96\x7d\
+\x11\x96\x12\x16\x27\x6c\xfa\x7d\x50\x4f\x33\x30\x7f\x55\x9c\x7a\
+\x6c\x00\xed\x6d\x69\x6c\x5a\xdf\x8f\xeb\xd6\xf6\x21\x93\x26\xae\
+\xba\xa7\x2f\xec\x9d\x77\x4e\xe1\xb1\xa7\x76\xe2\xe4\x99\x8b\xc1\
+\xc7\x54\x27\xd4\xbe\x58\x2b\xce\x7c\x6b\xe6\xe8\xd6\x07\x6b\x85\
+\xa9\x32\x5a\xc7\xa4\xa2\x3b\xbc\xcc\x8c\xee\x2b\x1e\xa8\xda\x32\
+\x29\x64\xdb\x9c\x8f\x0e\xfb\x52\x07\xe7\xce\x7f\xe2\x4b\x1e\xbc\
+\xc7\x8a\x35\x99\x04\x84\x89\x05\x3e\x5e\x06\xca\x03\x25\xa8\x0e\
+\xd4\x54\xf5\x08\xcc\x8c\x0d\x15\x9e\xf4\xb0\x32\xe2\x80\x94\x10\
+\xa2\xbe\x56\x0a\x21\x84\xa0\x3d\x53\x73\xea\x10\xdb\xc6\x1e\xf9\
+\xe0\x44\x83\xa2\xfd\xa9\x05\x40\xf8\xf6\x56\x6a\xb0\xe2\x30\x08\
+\x02\x16\x45\xb2\x2a\xc5\x08\x20\x82\x79\x59\x62\x06\x6a\x03\xb9\
+\x8e\x0c\x6e\xba\x72\x10\xeb\x87\x73\x81\xda\x0d\xe6\x8d\x66\xee\
+\xb3\x65\x59\x38\xf0\xd6\x61\x3c\xbe\xf5\x05\x4c\x4c\x1a\xb8\xc3\
+\xd8\xd6\x91\xea\xfc\xc5\x3f\x9d\x3e\xf8\xf8\x36\x6a\x57\x03\x0d\
+\x3c\x11\x00\x2b\x14\xa8\xc4\x3b\xa8\xf2\x15\x65\x3e\xb2\x7c\x46\
+\xe9\x3c\xfc\x99\x90\xa8\x7f\x48\x1d\x52\x9d\xe2\xcb\xc4\x54\x15\
+\x7e\xee\xbe\xbc\x9e\x1d\x2d\xac\xf9\x21\xdd\x61\x08\x8c\x90\x47\
+\x82\x24\x21\x1d\xd1\xe6\x97\xc5\xe7\x46\x8c\x55\x4b\x91\x87\x01\
+\x48\x1a\x4c\x98\x0a\xda\x8c\x30\x9b\x14\x78\x1b\x22\xd8\xfd\xf7\
+\xfc\x40\xe1\xe2\xd7\xc1\xaa\x24\xe0\x23\xfe\x4c\xf9\x81\x9e\x2c\
+\x6e\xbd\x7a\x15\x46\xfa\x3a\x41\x43\xae\x08\x21\x04\x95\x4a\x05\
+\x2f\xbf\xb2\x0f\xcf\xee\x78\x15\x73\xd1\xee\x30\xa0\x56\xf5\xe5\
+\xf2\xcc\xc9\xaf\xcd\x1c\xd9\xba\xcf\x6d\xc5\x52\x33\x9a\x65\xc5\
+\xa6\x80\xfa\x80\xca\x14\xed\x5b\xfc\x55\x20\x75\x97\xae\x7c\x4d\
+\x89\x32\x32\x24\x9f\x41\x1d\x22\xbb\x21\xaa\x44\x92\x96\x26\x9d\
+\x87\x37\x40\x47\x63\x64\x3a\xa4\x9a\x1b\x16\xc9\xc0\xc2\x6a\x24\
+\x0e\xc3\xf3\xd9\x94\xc8\x66\x3d\xa1\xfc\xab\x4d\x5c\xc0\xf0\x18\
+\x16\xb7\xe0\x9d\xe1\xf6\x56\x9a\xd3\xba\x59\x55\x18\x36\x8c\x0e\
+\x76\xe2\x96\xab\x56\xa1\x3f\xd7\x0e\x6a\xeb\x52\x3a\xd7\x62\x61\
+\xbe\x80\x6d\x3b\x5e\xc6\x8b\xaf\xbc\x69\xe4\x0e\x63\xd7\xca\x4f\
+\x15\x2e\x1e\xf8\xb3\xf9\xd3\x2f\x9f\xc0\xd2\xa9\x7a\xcd\x12\xd3\
+\xb6\xc7\xee\xe3\xca\x62\x54\x91\x48\x11\x03\x4a\x48\x58\xb0\x61\
+\x39\x4a\x35\x33\x4e\xd5\xe6\xed\x25\x2a\x78\x95\xb5\x37\x7d\xc9\
+\x8a\xaa\xe2\x82\x14\x89\x4a\x10\x72\x9d\xfc\x5c\xc2\x7e\x7d\xe2\
+\xdc\x29\x2d\x58\x79\xf6\x2a\x76\x0a\x81\x6e\x7b\xf4\x30\x56\xa5\
+\xea\x94\x62\x84\xd5\x69\x13\xc1\x86\xd5\x39\xdc\x74\xc5\x00\x3a\
+\x3d\x77\x18\x05\x55\xf7\xae\xcb\xe4\xe4\x14\x9e\xdc\xfa\x02\xf6\
+\x1d\x38\x02\xcb\xb2\xa3\x8c\xe6\x45\xbb\x52\xf8\x6f\x73\xa7\x5f\
+\xfe\x4e\x71\xfc\xd0\x24\x96\xc6\x68\xde\x32\x60\x69\xb6\x34\x13\
+\xa8\x5a\xc8\xb4\x48\x64\x0c\x11\x5f\xda\x10\xbb\x92\x59\xc9\x8a\
+\x17\x99\x98\xe4\x23\x06\x21\xfa\x6c\x44\x09\x18\x3a\x36\x26\xc0\
+\xaa\x50\x06\xcb\x12\x45\x00\x26\x91\xc0\x25\x56\x15\xde\x0b\x42\
+\x02\xc3\x38\x27\x94\xfb\x01\xb7\x7e\x94\x57\x6c\xc4\x26\x0d\x5c\
+\x43\x42\x56\x3c\xe0\xe6\x3b\x29\x58\x95\x7a\xf2\xa6\x5a\xda\x32\
+\x29\x5c\xb3\xa6\x17\x1b\xc7\xfa\xd1\x9e\x21\x72\x5b\x84\x6b\x7e\
+\xe6\xcc\x39\x3c\xfa\xe4\xf3\x38\xfa\xce\x59\xff\x7a\x68\x85\xd2\
+\x99\x5a\x79\xf6\x3b\xf9\x63\xcf\xfd\x7d\x65\xee\xbc\xe7\x0e\x13\
+\x06\x06\x8d\x02\x4a\xb3\x01\x69\xd1\x01\x4e\x04\xaa\x56\xa8\x6b\
+\x0d\x97\x49\x6d\x0b\xd4\xb6\x61\x0b\xe3\x39\xec\x97\x9a\x30\xff\
+\x29\x5f\x5c\x8d\x01\x5c\x4a\xab\x53\x5f\xa4\xf5\x9a\xf8\xf3\x70\
+\x1f\x39\xa2\x01\x52\x22\x9c\x33\xed\xd7\xb4\x57\x9b\x5f\xec\x2f\
+\xd7\x27\xb9\x47\x52\xfb\xa4\x0e\x03\xa9\x54\x0a\xa9\x54\xd8\x87\
+\x9e\xb0\xb9\xa1\xbc\xcd\x84\x99\x49\xe5\x4f\x63\x72\x73\x18\x6e\
+\xd2\xc0\xab\x80\x4c\x55\xda\x79\x07\x6a\x26\xa5\xce\xc2\xab\x7f\
+\x94\x52\x74\xb4\xa7\x71\xc3\xfa\x7e\x6c\x18\xed\x41\x9a\x10\x79\
+\x8e\x14\x23\x94\x52\x1c\x3a\x74\x1c\x8f\x3d\xb5\x13\xe7\x0c\xdc\
+\x61\x28\xb5\x4f\xd7\x16\xc6\xff\xdd\xf4\xe1\x27\x1f\xb7\x2b\x05\
+\x4b\xb8\x68\xf5\x02\x40\x5c\x80\x5a\xb6\x80\xa4\x2b\x73\x59\xab\
+\x7e\x84\x10\x14\x0a\x45\xec\xd8\xf5\x2a\x3a\xb2\xed\xbe\x0a\xe0\
+\xc6\x46\x64\x56\x1e\xea\x13\x45\xc5\x9a\x42\x6d\xd4\x10\x74\x54\
+\x76\x6d\x60\x8c\xb6\xc6\x69\xaf\x9b\x58\x7c\x5b\x08\x21\xc8\x76\
+\x64\x31\xb2\x6e\x0c\xab\xd7\xae\xc5\xba\x55\xdd\xe8\xeb\x6a\x63\
+\x4c\xe7\x7c\xd3\x04\x13\x15\x87\x28\xc1\x21\x95\x01\x2b\x02\xac\
+\x82\xa9\x0d\x31\x66\x91\xeb\x08\x93\xa8\x22\x4a\x46\x75\x8a\xde\
+\xae\x36\xdc\x7c\xe5\x20\xd6\x0c\x76\xf1\xdd\x90\x8a\x72\xdc\x61\
+\x5e\x7b\xfd\x00\x9e\x7c\x76\xb7\xa1\x3b\x4c\x6d\x7f\x65\xf6\xcc\
+\x9f\xce\x1c\x7e\x6a\x37\x0d\xdc\x61\x28\xcc\x01\xa5\x55\xcc\x6a\
+\xc9\x55\xbb\x28\xf1\x80\x4a\x64\x3d\x51\xe7\x51\xe1\xa6\x12\x76\
+\x93\x00\x00\xa5\x72\x15\xfb\xde\x3a\xb6\xc8\x97\x72\xd9\xdf\xb7\
+\x45\x93\x8e\xce\xfd\xb8\xf1\x8e\x3b\xf0\x93\x9f\x78\x2f\xfa\xba\
+\xdb\xfd\x7d\xf6\x24\x12\x15\x62\x24\xf3\xc0\xc9\x07\xad\xa8\xa5\
+\x84\x19\xb0\x52\xba\xe6\x85\xb2\x29\x26\x91\x62\xf9\x17\x65\x52\
+\x57\x86\xfa\x3a\x71\xf3\x95\x03\x58\xd5\x93\xd5\x8e\xf4\x02\x00\
+\x49\x11\x14\x0b\x45\x3c\xff\xc2\x1e\xec\x78\xe1\x75\x14\x8a\x26\
+\xee\x30\x95\x9d\xc5\xf1\xc3\x5f\xcf\x9f\xd8\x79\x88\xb9\x3a\x8b\
+\xc5\x78\x9a\x21\x8d\xd6\x55\x2f\x18\x53\x20\x9a\x51\xd5\x0b\x58\
+\x4d\x05\xb6\x14\x21\x8d\xc1\x61\x6c\x59\xd4\xca\x96\xb5\x94\x4b\
+\x45\x1c\x3f\xf8\x36\xca\x1f\xbc\x15\xa9\xa1\x1c\x6c\xcd\xf3\x46\
+\xa0\x63\x92\xf2\x8e\xc8\xa1\x4b\x09\x33\xc6\x6c\xbf\x64\xcd\xda\
+\xe6\x6a\x56\xa5\x02\x23\xfd\x88\x9e\xd7\xf6\xb5\xab\xba\x70\xd3\
+\x95\x03\xc8\x75\x2a\xdc\x61\x98\x71\x47\xb8\xee\x30\x4f\x3f\xfb\
+\x22\x5e\x79\xed\x2d\x43\x77\x98\xe2\x43\xf3\x67\x5f\xfb\x8b\xc2\
+\x85\x37\xcf\x63\xf9\x3f\x5c\xcd\x56\x2b\x9b\xc2\x16\xeb\x55\xfd\
+\x9a\x0d\x58\x16\x12\x59\x96\x42\x08\x41\xa9\xb0\x80\xf9\xfc\x2c\
+\x40\x46\xa0\xb2\x2a\x13\xef\x43\xa2\xd1\x5b\x89\xab\x56\x05\x2a\
+\x1e\x03\x56\xf0\xe6\x7e\x89\x60\xa5\x61\x53\x41\xb1\x1a\x56\x25\
+\xab\x77\xbc\x31\x9d\x8d\x77\xdc\x61\xae\x5c\xdd\x83\xeb\xd7\xf7\
+\x21\xdb\x96\x0e\xd9\x78\xc1\xe9\xe7\xf9\x0b\x97\xf0\xd8\x53\x3b\
+\xf1\xd6\xc1\x77\x4c\xdc\x61\xe6\xad\xf2\xdc\x7f\xce\x9f\xd8\xf5\
+\xbd\xf2\xf4\xc9\x59\xa8\x8d\xe6\x54\xf8\xd5\x85\x9b\xa6\x6b\x34\
+\x3c\x4a\x9a\x0d\x50\x46\xa2\x02\xaa\x45\x37\xa8\xdb\xb5\xca\xe9\
+\x54\x5b\xd7\x02\x80\x9e\x26\xd7\x9b\x48\x13\x84\xda\x14\x95\x72\
+\x49\x0a\x67\xb1\x49\x87\x53\x01\x9b\x22\x2e\x40\x05\x13\x3d\xfd\
+\xd1\x3e\x04\xcc\x4a\x9c\xbd\xab\xf5\xc1\x83\x68\x08\x8f\x16\x16\
+\xd3\x6c\x0a\xb4\x67\xd2\xb8\x6e\x5d\x2f\xae\x59\xd3\x8b\x4c\x8a\
+\x70\xab\x1f\xa8\x48\xd8\xb1\xe3\x27\xf1\xf0\x13\xcf\xe3\xe4\xe9\
+\x0b\x26\xee\x30\x97\xaa\x85\xa9\x6f\xcf\x1e\x7d\xe6\xc1\x5a\x71\
+\xda\x73\x87\x91\x2e\x8d\xee\x92\x99\xdc\x96\x25\x0a\xaf\x37\x5d\
+\x1c\x91\xca\x8c\xc3\xa8\xe2\xaa\x73\xa6\x80\x47\xaa\x73\x17\x0e\
+\x65\x3a\x7a\xdf\x06\x49\xdd\xdd\x82\x4e\x27\xd2\x64\xe1\xc7\x33\
+\x18\x4b\xba\x72\xd0\xcf\x9b\xd6\x09\xdf\x60\xce\xa9\x83\xdc\xf6\
+\x56\x22\x31\x0a\x57\xd9\xf8\x36\xa9\xd5\x3f\xbe\xd5\x41\x5b\xba\
+\x3b\x32\xb8\x71\x7d\x3f\xd6\x0d\x75\x07\xab\x8b\xaa\xca\x75\xdd\
+\x61\xde\xdc\x7f\x08\x8f\x3d\xb5\x0b\xe3\x93\x33\x26\xee\x30\xc7\
+\x2a\x73\xe7\xfe\x6c\xe6\xf0\x53\xdb\xa9\x55\xf5\x76\x87\xf1\x2f\
+\x83\x2a\x8b\xe6\xbc\xa5\x2c\x25\x86\x2c\xb9\x11\x3f\x15\x92\xa9\
+\x59\xd4\x31\x2a\x3f\x99\x3d\xbe\x7d\xdc\x2a\xcf\x7d\x0d\xd4\xde\
+\x6f\xda\xf0\x44\x96\x46\xfc\x01\x48\x6f\x3a\x3a\x09\xec\x53\xaa\
+\x3f\x6f\xea\x3a\x11\xf2\xf2\x36\x78\x06\xe4\x88\x3c\xd9\x41\xb7\
+\xaa\x84\xd6\xa0\x2f\xac\x98\x21\x4e\x43\xeb\xef\xce\xe2\xce\x6b\
+\x87\x7c\x9f\x3d\x08\xd9\xfd\x73\x42\x50\xad\x54\xb0\xeb\x85\x3d\
+\xf8\xe1\xc3\xdb\xcc\x40\xca\xaa\xbe\x5a\x9a\x3c\xfa\xdb\xd3\x6f\
+\x3f\xf6\x2c\xb5\xaa\x61\x1f\x71\xf6\x17\x9a\x73\x44\xa4\x33\x55\
+\x17\xe3\xe6\xab\xb7\xde\x66\xb5\x5b\xca\xdf\x8a\xe9\x09\xf5\x30\
+\x2c\x3a\xbe\xf7\xef\x9f\x1d\xbc\xf1\x73\x17\x32\x5d\x83\xf7\x11\
+\x92\x5a\x0f\x42\xda\x22\x76\x6a\x54\xf5\x8d\x2f\xdf\x77\x6a\xe3\
+\xd4\x03\x45\x1b\xa8\x26\x9c\x49\xef\x17\x40\xc3\xd3\x29\x06\xc5\
+\x15\xd5\x11\xa9\x55\xda\xfa\x69\xd8\x9b\x21\xb4\x2d\x32\x9f\xae\
+\x0e\x90\x54\xa6\x2f\x95\xe9\xbc\x1b\x84\x64\xc3\x2a\xa3\x61\x2f\
+\x2a\x91\x8a\x0d\xa8\x04\x71\x95\x35\x7f\xda\x80\xbc\xee\xb9\xaf\
+\xc6\x69\x67\x9a\x2b\xda\x13\xa9\xfe\xf1\x0c\x6e\x75\x5f\x27\x6e\
+\xda\x30\x80\xbe\x6e\xf7\xf1\xa2\xea\x3c\x8e\x3b\xcc\x02\x9e\xd9\
+\xfe\x12\x76\xbd\xf4\x86\xa1\x3b\x4c\x69\x6b\xe1\xc2\xfe\x7f\x37\
+\x7f\xe6\xd5\x93\x90\x59\x54\xbd\xbf\xd0\x9c\xc7\x91\xc5\x56\xfb\
+\x9a\xce\xf0\x74\x40\x25\x9a\x29\xc5\x70\x5d\xfa\x46\xc2\xc9\xd4\
+\x5b\x3f\x3e\x00\xe0\x40\xba\xa3\xbf\x3d\x95\x6e\x4b\x79\x00\x42\
+\x29\x65\xbe\x99\xec\xf8\x33\x3c\xfd\x80\x0f\x77\xdf\x04\x7e\xbc\
+\x89\x7a\x2f\xb5\x58\x96\x62\x80\x9d\xad\x8f\x9d\x08\x14\xe4\xa1\
+\x7c\x1e\x22\xe5\xe3\xf2\x44\xa4\x45\x54\x5a\xa6\x6e\x1a\x9a\x3e\
+\x46\x79\x41\xdf\xa9\x5d\xb3\x73\x63\x77\xdd\xd0\xb5\xe6\x96\x1b\
+\x09\xd2\x5a\xa0\x52\xd9\x6d\x7c\xf6\xa4\xb0\xd9\x48\x9b\x8b\x0a\
+\x53\x06\x4c\x96\x12\xe6\xab\x8c\x1e\xbd\xe3\x6c\x5e\x8c\xa4\x08\
+\xc1\xd8\x50\x37\x6e\x58\xdf\x8f\xce\x2c\x6b\x34\x67\x52\xbb\x87\
+\x29\x42\x30\x31\x39\x85\xc7\x9f\xda\x89\xd7\xdf\x3c\x6c\xe2\x0e\
+\x53\xb2\x2a\x0b\xff\x30\x7f\xea\xe5\xbf\x2a\x4e\x1c\x9e\x84\x1e\
+\xa4\xa4\x8c\x88\x96\xb8\x46\xf6\xb8\xac\xc5\xb4\x9e\xa8\x36\x37\
+\x6b\x74\x50\x99\xde\x74\x66\xba\x0e\xb0\x9a\x15\xee\x49\x0a\x00\
+\xb1\x4a\x33\x96\xe5\x8c\x04\x6a\xc9\x7d\x93\x7f\xbd\x63\x93\x97\
+\xbc\xde\xb2\x4d\xea\x88\x53\x8e\x2e\x2e\x4e\xbc\x77\x6c\x83\xda\
+\x35\x68\x85\x06\xaa\x1e\x33\xe0\x2f\x89\x10\x48\xbc\x6f\x03\xf1\
+\xbf\x1c\x12\x58\x49\x4b\x09\x6b\x76\x1d\x96\x57\x37\x15\x76\x3d\
+\x96\x90\x2d\x58\x43\x2a\x93\x4e\xe1\xea\xd1\x1e\x5c\xbb\xa6\x17\
+\xed\x19\x12\xb1\x64\x30\x70\xfa\xf4\x59\x3c\xf4\xf8\x0e\x1c\x39\
+\x7e\xc6\x0d\x0b\x01\x29\x4a\x67\x6a\xa5\x99\xff\x98\x3f\xfe\xdc\
+\x0f\x2a\x73\x17\x54\xee\x30\xaa\xe3\x7a\xc1\x07\x9a\x7c\x61\x12\
+\x95\x77\xb1\xd5\xb8\xba\xea\x0b\x53\xfd\x5a\x31\xfa\x17\x56\xbe\
+\xf8\xb8\x49\x8c\x4b\xf8\x85\x26\xbe\x1e\x69\x65\x3f\xc3\xfa\xad\
+\x03\xf0\xb0\xeb\xa4\xcb\x17\x96\x2e\xea\x18\xfa\x71\xbb\x90\x8b\
+\x45\xf8\x6c\x32\xa3\x72\xc3\x19\xc0\x92\xb7\xb7\x0a\x5a\xa3\x77\
+\xbf\x8b\x56\xff\x54\x54\x8f\xda\x40\x47\x7b\x1a\x9b\xd6\xf5\xe2\
+\x8a\x91\x1c\x52\x06\xee\x30\x07\x0f\x1e\xc7\x43\x4f\xec\xc0\xb9\
+\x0b\x13\x26\xee\x30\x67\xaa\xf3\x97\xfe\xbf\x99\xc3\x4f\x3e\x6e\
+\x57\x8b\x35\xf0\x20\xd5\x2c\x26\x14\x56\x46\x54\xd9\x51\xf9\x10\
+\x33\xfd\x92\x19\xed\x4d\xa6\x27\xd4\xcb\x9a\xa2\x7e\x75\xe5\xc7\
+\xad\x37\xaa\x1c\x84\x94\x11\xd5\xb6\x46\xca\x08\x03\xa4\xa8\x38\
+\x56\x54\x71\x61\x61\xaa\xbc\xba\xf8\xa0\x4f\xc4\xec\x21\x24\x9a\
+\x03\xce\xc0\xed\x63\x90\x73\x10\x68\x78\x24\x00\x2b\x6e\xf3\x05\
+\x9e\x55\x85\x6d\xa6\xa0\xeb\x86\x14\x4a\x29\x7a\xba\xda\x70\xe3\
+\xfa\x7e\xac\x1e\xe8\x0c\xef\x93\xeb\x0e\xf3\xea\x9e\xfd\x78\x7c\
+\xeb\x8b\x98\x9e\x9d\x33\x71\x87\x39\x50\x9e\x39\xf5\x8d\xd9\x23\
+\xcf\xbc\x44\xa9\x25\x36\xb3\x11\x30\x42\x0b\xca\x88\x2a\xdb\x34\
+\x7d\xdc\xb6\xd5\x0b\x80\x52\x3b\x5a\x39\x3d\xa1\x9e\x32\x9b\x05\
+\x82\x26\xc0\xa0\x6b\x4b\x23\xc0\xd3\x2c\xb0\x8a\x93\x1e\x9a\xf8\
+\x30\x11\xdf\x6b\x6a\x90\x87\xd5\xaa\x98\x90\xe0\x97\xf0\xa7\x60\
+\xf7\xeb\xa3\x61\x30\xaa\xfd\x55\xab\x7f\xe1\x6d\x74\x60\x6e\x55\
+\x6f\x07\x6e\xbc\xa2\x1f\x03\xb9\x76\x80\x65\x6a\x42\x3b\x3c\x77\
+\x98\xe7\x76\xbe\x8a\x6d\x3b\xf7\x98\xba\xc3\xec\x2a\x8e\x1f\xfa\
+\xb3\xfc\x89\x5d\x07\xe1\x9a\x2b\x60\xfe\xd2\x86\xa9\x82\xf5\xa8\
+\x7c\x71\xeb\x6d\x16\x98\xc4\x91\x46\x54\x57\x00\xe6\x2e\x34\xcb\
+\x85\x55\x21\x46\x1a\xd3\x3a\xeb\x01\xa0\x7a\xfb\xda\x08\x58\xb1\
+\x62\xc2\xae\xa0\x48\x03\x7d\x3a\x02\x68\x1f\x1c\x79\x45\x0a\x2f\
+\xcc\xff\x23\xaa\x5c\xf0\x8d\xe6\xc1\x08\x1f\xe1\x54\x40\x9d\x1b\
+\x8c\xa6\x34\xe7\x48\x67\xa7\x72\x65\xcd\x60\x17\x6e\x5c\xdf\x8f\
+\xee\xce\x8c\x52\xd5\x0b\x70\xd0\x71\x87\x79\xe2\xe9\x5d\x78\x69\
+\xcf\x01\x43\x77\x98\xc2\x23\x8e\x3b\xcc\x7e\x6f\x77\x18\xf6\xba\
+\xb5\x0a\xa4\xea\x55\xf9\x10\x11\x6e\x92\x66\xb1\xd8\x54\x68\x1b\
+\xa3\x46\xfd\x1a\x0d\x8f\x93\xb7\x11\x96\x04\x98\xbf\xfc\x30\x28\
+\xcb\xa4\x7d\xf5\xb4\x5d\x97\x07\x11\x61\x26\xf1\x3a\x31\x49\x63\
+\xc4\xa8\x78\x43\xb5\x10\x0e\x7e\x29\x1b\x6f\x09\xdf\x00\xac\x22\
+\x4b\xe7\x0a\x14\xd5\xbf\x28\xa1\x70\xdc\x61\xae\x18\xe9\xc6\x75\
+\x6b\x7b\x5d\x77\x18\xaa\x2c\x1b\xa0\xbe\x3b\xcc\xc3\x8f\xef\xc0\
+\x81\x83\xc7\x61\x53\x44\x8d\xec\x2d\x58\xa5\xb9\xff\x92\x3f\xb1\
+\xeb\x7b\xe5\x19\xdf\x1d\xc6\xab\x3a\xce\x6f\x54\x9c\xaa\x6b\x61\
+\x69\x9b\x01\x6c\xcd\x60\x76\x51\xed\x6f\x28\xdc\x44\xf5\x6b\x15\
+\x7b\x32\x01\x87\xa8\xb6\x98\xd6\xa9\x2a\xb7\x55\x4c\x28\xea\xfd\
+\xaa\xc7\x0e\x05\xc3\x78\x20\x1c\xe8\x00\x75\xbb\xcc\x80\x4a\xd7\
+\x1b\xc8\x8c\xca\xb1\x47\x01\xa0\xaa\x25\x58\x58\x5b\x15\x94\x7b\
+\x2c\x4a\x2a\x5a\x58\x03\xa9\xe3\x0e\x73\xed\x9a\x1e\x5c\xb9\x3a\
+\x87\x4c\x8a\x48\xcb\xc4\x88\x6d\x3e\x7a\xec\x24\x7e\xfc\xd8\x76\
+\x9c\x38\x65\xe4\x0e\x33\x5e\x2d\x4c\xfd\xfb\xd9\xa3\x5b\x1f\xac\
+\x15\x67\xc4\xdd\x61\xe2\x02\x51\xb3\x59\x96\xe2\x6a\xc4\x2e\x4b\
+\x95\xdf\xa4\xec\x46\xeb\x34\x62\x53\x40\x7d\xa3\x7e\x8b\xc1\x9e\
+\x74\xe9\x11\x23\x6d\x33\xd5\x37\x2c\x51\x1c\x2b\x26\x4c\xca\x94\
+\x80\x88\x75\xd0\xe8\x5b\x1a\x64\x95\xd5\x40\xf7\x94\x65\x54\x3e\
+\x9b\xe2\xed\x4c\x61\x4d\x56\x26\x09\x5d\xe7\xc5\xf9\xbf\x2b\x9b\
+\xc6\xa6\xb1\x3e\xac\x5d\xd5\x15\xfe\x85\x70\xdd\x61\xf6\xbd\x71\
+\x10\x0f\x3f\xf9\x3c\xc6\x27\x66\x0c\xdd\x61\xce\x7f\x73\xe6\xf0\
+\x93\xac\x3b\xcc\x72\x01\xa9\x66\x00\x43\xa3\xe0\x03\x4d\xbe\xd0\
+\xcb\x1a\x37\xaf\xa9\x31\xbd\x95\xec\x29\x6e\x1d\xba\x7c\x30\x48\
+\xb3\x5c\xc1\x4a\x25\x51\x4c\x2a\xea\x18\x9a\x38\x5d\x6d\xf1\x18\
+\x15\x73\x95\x1d\x37\x3f\xfe\xb2\x07\xcb\x05\xb3\x1d\x90\x6d\x52\
+\x72\xa1\x1a\x3b\x95\x1b\x28\xa2\x44\x7f\x77\x3b\x6e\x58\xdf\x87\
+\xa1\xde\x0e\x00\x14\x3a\x6d\x2f\x05\x82\x72\xa5\x82\x5d\x2f\xbe\
+\x8e\xa7\xb6\xbd\x84\xb9\xf9\x82\x89\x3b\xcc\x9e\xd2\xd4\xf1\xaf\
+\xcf\x1e\xdb\xb6\x0f\x81\x39\x6e\xb9\x82\x94\xd4\x7c\xcd\x31\x0c\
+\xca\x32\x66\x3a\x21\x69\x1b\x65\x76\x9c\xc4\x59\x8f\xca\x14\x04\
+\x74\xe1\x71\x01\xa8\x91\x32\x9a\xa9\xbe\x35\x5a\x0e\x10\x0e\x14\
+\x71\xf2\xc6\xb5\x4f\x99\xa6\x33\x66\x54\x44\x79\x4e\xfc\xd7\xd8\
+\xd5\xf6\xe0\xd8\xac\xa8\xbf\x84\x0b\x54\x93\x33\xeb\x11\x26\xef\
+\x48\x5f\x07\x6e\x58\xdf\x87\xde\xce\xb6\xd0\xe2\x08\x21\x98\x9f\
+\x5b\xc0\xd3\xdb\x5e\xc4\xf3\x2f\xee\x33\x71\x87\xb1\x5c\x77\x98\
+\x6f\xba\xee\x30\xa6\xaa\x5e\x54\x7c\x2b\x41\xaa\x95\x80\xd1\x2a\
+\xd5\xce\x04\x4c\x01\xc4\xb3\x51\x89\xe7\x71\x18\x4e\xbd\x20\x16\
+\x27\x6d\xab\x18\x91\x4e\xef\x08\x8b\xd3\xa5\x47\x9d\x79\xa3\x8e\
+\xa1\x89\x83\xa2\x3c\x40\xfd\x40\xd5\x09\x1d\x44\x3a\x12\xb5\x35\
+\x03\xad\xcf\x58\xbc\xd9\xe9\x63\x43\xdd\xd8\xb8\xae\x17\x9d\xed\
+\xd1\x6b\x48\x4d\x4c\x4c\xe1\x91\x27\x9e\xc7\x6b\x6f\x1c\x82\x65\
+\x51\x13\x77\x98\x7f\x9c\x3f\xf5\xf2\x77\x18\x77\x18\xf1\xfa\x34\
+\x02\x1e\x4b\xc9\xc8\x9a\xa9\x56\x9a\xf4\x11\x06\x69\xc3\xd2\xfb\
+\x12\xd7\x29\xb9\x51\x96\xd4\x28\x8b\x69\x46\x7b\x5a\xc5\x96\xea\
+\x61\x57\xcd\xb4\x4f\xa9\xe2\xa2\xa0\x20\xa8\x4f\xb9\x85\x8c\xb9\
+\xc8\xab\xae\x9b\xe6\x33\x4f\x4d\x01\x64\xd2\x04\x57\xae\xce\xe1\
+\xea\xd1\x1c\xda\xd3\x29\x7e\x0d\x29\xb1\x6c\x02\x9c\x3a\x75\x16\
+\x3f\x7a\xf4\x39\x1c\x3e\x76\xda\x0f\xd3\x57\x40\x67\x6b\xa5\x99\
+\xbf\x99\x3d\xfe\xdc\x0f\xaa\x8e\x3b\x8c\xc2\x96\xa7\xec\x64\x33\
+\xd8\xcf\x62\x81\x94\xea\xb2\xc6\x2d\xcb\xa4\xbc\xa6\xa8\x7c\x9e\
+\xc4\xb5\x51\x99\xa4\x69\x44\xd5\xd3\x95\x15\x16\xbe\x94\x60\xa5\
+\x4b\x0f\xa8\xdf\xc1\x7a\xec\x53\xaa\xfc\xaa\x34\x71\x41\x4a\xbc\
+\xde\x0d\x01\x15\x10\x80\x40\xa8\xed\x3c\x4e\x79\x4c\x19\x94\x02\
+\x1d\x6d\x69\x5c\xb7\xb6\x07\x63\x43\xdd\x48\x91\xa8\xf2\x29\x0e\
+\xbc\x75\x14\x3f\x7e\xf4\x39\x9c\x35\x70\x87\x01\xb5\xcf\x56\xe7\
+\xc7\xbf\x35\x7d\xf8\xc9\xc7\xec\x6a\xa1\x26\x56\xaf\xb8\x5e\x40\
+\xf4\x0b\xbc\x1c\x41\xaa\x5e\x35\xcd\xa4\xff\xf5\x80\x91\xd1\x63\
+\x52\xcf\xcc\xf4\xa5\x66\x3e\xcb\x09\xac\x00\x73\x40\xd2\xa5\x0b\
+\xbb\x59\x51\xf1\x62\x7d\x61\xe7\x61\xe5\x34\x0c\x52\x00\x6f\xc8\
+\x6e\x42\x81\x5c\x19\xb9\xce\x0c\xae\x1f\xeb\xc3\x48\x7f\x87\x1b\
+\xa1\xae\x81\x10\x82\x5a\xb5\x86\x97\x5f\x7d\x13\x8f\x3e\xbd\x0b\
+\xd3\x33\x46\xee\x30\x6f\x55\x66\xcf\x7c\x7d\xe6\xf0\xd3\x2f\x52\
+\x6a\xb1\xd5\xc7\x55\x73\xe2\x02\x98\x69\x9e\x56\x81\xd4\x72\x61\
+\x6a\x91\xd2\xe8\x9a\xe9\x4b\xc5\x7c\x5a\x51\x3e\x2b\xa6\xea\x55\
+\x23\xea\x9e\x58\x66\xd4\x8d\x6b\xa6\xf1\x5c\x52\x69\x88\xef\x3a\
+\x5c\x9f\xd0\x90\xe6\xd3\xc8\x7c\xe1\x32\x98\x6b\xc7\xf5\xeb\xfb\
+\xd0\xdf\xdd\x1e\x9a\xc7\xd9\x5e\xad\x84\x6d\x3b\x5e\xc6\xb3\x3b\
+\x5e\x35\x75\x87\x79\xc1\xdd\x1d\xe6\x20\xf4\xf7\xa1\x11\xe0\x31\
+\x0d\x33\x4d\x1f\x96\x77\x29\x41\xaa\x1e\xf6\x69\x2c\xf5\xda\xa8\
+\xd8\xe3\x46\xc0\x04\x11\x65\xc5\xa9\x27\x2a\xad\x4a\xea\x55\xed\
+\xea\x61\x57\xba\xe3\x30\x75\x4e\xd7\x66\x20\xbc\x4e\xc4\x28\xcf\
+\x89\x37\xb4\x51\xc9\x94\x99\xca\x47\x2e\xe3\x51\xc4\x40\x93\x55\
+\xdb\xf8\xd5\x03\x9d\xd8\xb4\xae\x07\xdd\xd9\x4c\xf8\x45\x21\x04\
+\x33\x33\xb3\x78\xec\xc9\x9d\xd8\xfd\xea\x01\x54\x6b\xb5\x28\x90\
+\xaa\xda\xd5\xe2\x23\x0b\xe7\xf6\x7e\x6b\xe1\xfc\xbe\x73\x08\xdf\
+\x78\x81\x3d\xae\x07\xa0\xa2\xd2\xd6\x0b\x6a\xcd\x66\x5f\x51\x71\
+\x8d\x96\xaf\xbb\x1e\x91\x52\x0f\xa3\x6a\x44\xd5\x33\x29\xab\x55\
+\x60\x15\x55\x0e\x0c\xf3\xb1\x12\xc5\xae\x54\x69\x9b\x09\x46\xf5\
+\x1b\xcf\xe5\xfb\x40\x11\xf3\xe1\x09\x0a\xa2\x42\x6e\xca\xd7\xa2\
+\xf8\x0d\x5b\x93\x93\xc2\x59\xbc\x6e\xfd\x70\x97\xb3\x86\x54\x1b\
+\xb3\xa5\xba\x22\x1b\x21\x04\xe7\xcf\x5f\xc4\x8f\x1e\xdd\x8e\xfd\
+\x6f\x1f\xf7\xfd\x00\x43\x5a\xbd\x60\x95\xe7\xff\x73\xfe\xc4\xae\
+\xef\x96\xa7\x4f\xcc\x2a\xae\x9b\xc9\x8b\xd5\x8c\x17\x3a\x2a\xbe\
+\x95\x71\xf5\x96\x23\x5d\xcc\x88\xeb\x80\x18\x65\x69\xa5\x59\xdb\
+\x65\xb5\x5a\xd5\x33\x2d\x0f\x4d\xac\x83\x95\x7a\x47\xea\xa2\xca\
+\x84\xa2\x5c\x28\xd2\x35\x4b\xe5\xd3\xe5\x8b\x2f\x4c\xcf\xa9\x0b\
+\x3c\x1c\xf8\xf8\x58\xc5\x2a\x85\x51\x3b\xc6\x38\x76\xae\xb6\x74\
+\x0a\x57\x8f\x76\x63\xc3\x48\x0e\xe9\x14\xbf\x86\x94\x74\x11\x09\
+\x70\xe4\xc8\x09\x3c\xf8\xc8\x36\xbc\x73\xea\xbc\x89\xd1\x7c\xbc\
+\x56\x9c\xfe\xf6\xcc\x91\xad\xff\xd3\xdd\x1d\x46\x75\xff\xe2\x00\
+\x94\xee\x38\x0e\xb0\xb5\x02\xc0\x96\x82\x91\xc5\xb9\x0e\xb1\xa4\
+\x91\x35\xd3\x1b\x55\xc5\x9a\x05\x56\xac\x98\xa8\x7d\x26\x20\x07\
+\xc3\x36\x88\xe5\xc2\xb0\x4c\x28\xf2\x46\xa5\x37\x55\xe3\xe2\xa6\
+\x75\xd3\x99\x4e\x4f\x70\xd6\x38\x20\x62\xe9\x0a\x3e\x46\xd9\x34\
+\x54\x5f\x9e\x7f\x44\x1d\x77\x98\xeb\xd6\xf6\x62\xcd\x40\xa7\x33\
+\x8a\xa8\x9c\x24\x45\x7d\x77\x98\xbd\xfb\x0e\xe2\xc7\x8f\xed\xc0\
+\xa5\x89\x69\x83\x85\xee\xac\xe3\xd5\xb9\x8b\xdf\x98\x3e\xfc\xe4\
+\xb3\xb4\x56\x16\xdd\x61\xd0\xe2\xe3\x46\x40\x28\x2c\x5d\xa3\x69\
+\x1a\x2d\xb3\xde\x76\xc4\x92\x46\x37\x77\x58\x0e\x60\x15\x55\x07\
+\x10\x1f\xc0\x60\x90\x0e\x30\x07\xbb\x7a\x8e\xc3\x24\x2e\x10\x45\
+\x95\x4d\x89\x89\x8d\x4a\x20\x4c\x22\xa5\xe6\x2e\x84\xc4\x82\xa8\
+\x0f\x5c\xde\xca\x0a\xc1\x39\x40\x29\x45\x6f\x77\x1b\xae\x5f\xd7\
+\x87\xc1\x9e\xf6\xf0\x8e\x10\x82\x4a\xb9\x82\xe7\x5f\x78\x0d\x4f\
+\x3c\xb3\xdb\xcc\x1d\xc6\xae\xee\x29\x4f\x9f\xfc\xb7\x33\x47\xb6\
+\xbe\x2e\x5c\x3f\x13\xf6\xd4\xac\xe3\xe5\xa6\x06\xd6\x5b\xd6\xa2\
+\x82\x14\xd0\xdc\x5d\x68\x96\x2b\x58\xc5\x89\x63\x25\x0e\x20\x85\
+\xe5\x81\x41\x3e\x55\x1a\xc0\xec\xe6\xea\x54\x97\x28\x95\x4e\xf7\
+\xb2\x2a\x44\x54\xd9\x9c\xe2\xfd\x4a\x7c\xc4\x91\x55\x3b\x8e\x55\
+\x85\xc8\x70\x6f\x07\x36\x8d\xf5\xa2\xa7\xa3\x0d\x61\x66\x78\x42\
+\x08\xe6\xe7\xe7\xf1\xe4\xd6\x17\xb0\xe3\xc5\xbd\x28\x97\x4d\xdc\
+\x61\xca\x5b\x8b\x97\xde\xfa\xc6\xdc\xa9\x97\xde\x41\xf8\x9a\xe6\
+\xaa\x30\x13\x15\xa6\x59\x6c\xaa\x9e\x3c\x2b\x01\xa4\x1a\x96\x66\
+\x00\x55\xa3\x60\xd1\x88\x8a\xb6\x98\xf6\xa7\x7a\x0c\xe7\x51\xc7\
+\xaa\xbc\x50\x94\x65\x92\x2e\x2c\x7d\x14\x53\x33\x57\xfd\x38\x74\
+\x22\x3e\xca\x51\xaa\xb8\x20\x0c\x4a\xa9\xd9\x14\x05\x08\xb0\x6e\
+\xb0\x0b\xd7\xad\xe9\x41\x67\x7b\x3a\x62\xa6\x39\xc1\xf8\xf8\x14\
+\x1e\x7a\xec\x39\xec\xd9\x77\xd0\xc0\x1d\x06\x65\xbb\x5a\xf8\xef\
+\x73\xa7\x5f\xf9\xf7\xc5\x4b\x6f\x8f\x23\x00\x29\x53\x70\x52\x5d\
+\xf7\x7a\x01\x4a\x17\xde\x0c\xa0\x89\x9b\x37\x2e\x03\x6a\x14\xa4\
+\x1a\x06\xac\x66\x31\xaa\x66\x80\x15\x50\x1f\x80\xc5\x8d\xd3\xd5\
+\x03\x44\xb7\x0b\x21\x65\xc3\xb0\x4e\x95\x2c\x85\xca\xc7\xf7\xdb\
+\x60\xf5\x04\x2a\xe5\x14\x9e\x49\xca\x56\x44\xa5\x3c\x94\x49\x40\
+\x29\x45\x26\x45\xb0\x61\x24\x87\xab\x56\x77\xa3\x2d\x9d\x92\xcd\
+\x51\x4c\x00\x21\x04\x27\x4e\x9e\xc5\x83\x0f\x3f\x8b\x43\x47\xcd\
+\xdc\x61\xac\x72\xfe\xaf\x67\x8f\x3f\xf7\x5f\x2a\xf9\x73\x0b\x9a\
+\xeb\xd0\x28\x38\xe9\xe2\xea\x05\xa8\xa8\xb4\xad\x64\x4a\xad\x8e\
+\x6b\x48\x5a\xa1\xfa\xb1\xc7\xad\x52\xd1\xe2\x02\x4c\x3d\xec\x4a\
+\x15\xd6\x2c\xc0\x42\x48\x99\x88\xa8\x23\xaa\x2e\x13\x11\xf3\x1a\
+\x33\x2a\x81\x50\x05\xe1\xd4\x19\xf5\x93\x1a\xe5\x63\x58\x50\xbc\
+\x4d\x29\x3a\xda\x52\xb8\x66\x4d\x0f\xd6\xad\xea\x72\x76\x87\xf1\
+\x93\xaa\xd4\x3e\x8a\xfd\x07\x8e\xe0\x87\x0f\x6f\xc3\xd9\xf3\x86\
+\xee\x30\x85\xc9\x6f\xce\x1c\x7e\xea\x11\xab\x3c\xe7\xb9\xc3\xc8\
+\xc5\x86\x83\x4e\x9c\xb4\x8b\x05\x50\x51\xf1\xcb\x15\xc0\x1a\x96\
+\x66\xef\x94\xbc\x9c\xc0\x4a\x97\x1e\x30\x07\x33\x56\x74\xf1\x71\
+\x00\x0b\x9a\x32\xe3\xc6\xe9\xd2\x9b\xd4\xa9\x92\x58\x79\xfc\x8e\
+\x2b\x1e\x4d\x0a\x55\x58\xc0\xa4\x6c\x0a\xe4\x3a\x32\xd8\xb8\xae\
+\x17\x23\x7d\x1d\xa1\x2d\xf0\x76\x87\x79\xe9\x95\x37\xf0\xf0\x13\
+\x3b\x0d\xdd\x61\xac\xb7\x2a\x73\xe7\xbe\x36\x73\xe8\x89\x5d\xd4\
+\xb6\x54\xa5\x47\xbd\x48\x8d\xaa\x7d\xec\x79\x9c\x34\x71\xe2\x1b\
+\x01\xb8\x15\x07\x52\x40\xeb\xb6\x74\x07\x9a\x3f\x0d\xa1\x51\x36\
+\x24\x86\xd5\x3b\xdd\x40\x15\xaf\xab\x4b\x0c\xaf\xd7\x5e\x55\xaf\
+\xca\x67\x9a\x27\x82\x51\x11\xa8\xf6\x3f\x67\x9f\x4e\x0a\xf8\xce\
+\xc8\x41\x3c\xe5\x12\x52\x00\x83\xb9\x36\x6c\x5a\xd7\x8b\xbe\xee\
+\x76\x45\x59\x94\xad\x11\x85\x62\x09\xcf\x6e\x7f\x09\x5b\x9f\x7b\
+\x15\x85\x62\x29\x0a\xa4\x28\xb5\xaa\x3b\x4b\x53\xc7\xbe\x36\x7b\
+\x6c\xfb\xdb\x21\xfd\x8f\x0b\x4e\x61\xf1\x71\x8f\xc5\xcb\x16\x96\
+\xbe\x55\x2c\xaa\x91\xf2\x4c\xe2\x9a\x0a\x50\x9e\xb4\x02\xa8\xd8\
+\x8e\xc4\xb1\x47\xb1\xd2\x6c\x5b\x13\x62\x96\x17\x37\x1e\x9a\x34\
+\xad\x98\x7a\xd0\x4c\x95\x0f\xfe\xb9\xf1\xf4\x04\x41\xe7\xf3\xe3\
+\x1c\xb8\xa2\x52\xfa\xa0\xb2\xd5\x7d\x1d\xd8\xa8\x72\x87\xa1\x6c\
+\x2a\xf8\xee\x30\x8f\x3c\xf1\x3c\x5e\x7c\x79\xbf\x99\x3b\x4c\xad\
+\xf4\x50\xe1\xc2\x9b\xdf\x9c\x3f\xb3\xe7\x2c\xc2\x37\x02\x85\x22\
+\xbc\x5e\x70\xaa\x27\x5d\xb3\x00\x2a\x4e\x7c\x2b\x58\x57\x54\xfa\
+\xa6\x4a\x2b\x81\xca\x6b\xb8\x29\x10\x35\x6b\x94\x0f\x88\x0f\x70\
+\xf5\xc6\xc3\xa0\x0e\xd5\x31\x60\x76\x53\x4d\xd2\x36\x02\x5c\x88\
+\x93\x97\xb2\xff\x09\xc0\xa1\x66\x54\x8e\xa4\x08\xb0\x7e\x55\x17\
+\xae\x5e\xd3\x83\x6c\x26\x25\x81\x14\x7b\x4e\x08\xc1\xb9\x73\x17\
+\xf1\xe0\x23\xdb\xf0\xe6\x5b\xc7\x4c\xdc\x61\x0a\x76\xa5\xf0\xfd\
+\xb9\x53\xbb\xff\xaa\x38\x71\x64\x16\xfa\x7b\xd3\x08\xb3\x6a\x25\
+\xcb\x6a\x36\x18\xd5\x93\x67\xd9\xa9\x7a\xa2\xb4\x1a\xa8\xbc\x0e\
+\xb4\xda\x58\xce\x8a\xe9\xd4\x82\xa8\x3c\xaa\xf8\x7a\x8e\xc3\xa4\
+\x9e\xa9\x07\x51\x69\xeb\x01\x2e\x77\xc2\x67\x34\xab\xf2\x3b\x48\
+\x83\xae\xea\x5c\x5c\x28\xa5\x68\xcf\xa4\x70\xd5\xea\x1c\xae\x18\
+\xee\x76\x76\x87\x11\x0a\x63\x55\x3e\x02\xe0\xf0\x91\x77\xf0\xc3\
+\x87\x9e\xc5\xf1\x93\x26\xee\x30\x74\xc2\x2a\xcf\x7e\x6b\xe6\xc8\
+\x33\xff\x50\x5d\x18\x67\xdd\x61\x54\xfd\x8f\x0b\x5e\xad\x66\x59\
+\x51\x60\xa2\x0a\xaf\xa7\xac\xc5\x04\xb0\x96\xc9\x62\x00\x95\xd7\
+\x91\xc5\x06\x24\x28\xf2\x46\x01\x12\x9b\x07\x86\x65\x21\x22\x0d\
+\x0c\xf2\x84\xd5\x09\x4d\xde\x66\x82\x9c\x11\x48\x09\x19\xdc\x42\
+\x3d\xfd\x8e\x82\x9b\x8d\x4e\x81\x4e\xc1\x1d\x46\x07\x52\x81\x3b\
+\xcc\xdb\x78\xf0\x91\xe7\x0c\xdd\x61\xec\xe3\xb5\x85\x89\xaf\x4d\
+\x1f\x7a\xfc\x69\xbb\x5a\x8c\xf3\xf2\x34\x0b\x9c\x4c\xcb\x6a\x24\
+\x8d\x69\x7c\x54\x58\x54\x99\xcd\x00\xb0\x96\xca\x62\x01\x15\xdb\
+\x21\x53\xfb\x13\x14\xe9\x21\xe4\xad\x57\x75\x63\xcb\x06\xe2\x83\
+\x47\x3d\xaa\x9c\x0a\x68\xea\x05\x2d\xd3\x3a\xe2\xe4\xa9\xeb\x81\
+\xa3\xc2\x9f\x27\x3d\x5d\x6d\xb8\x7e\xac\x17\xab\x7a\xb2\xca\x4c\
+\x2c\x48\x39\xee\x30\x7b\xf0\xf8\xd6\x17\x91\x9f\x33\x71\x87\xb1\
+\xf6\x54\x66\xcf\x7c\x75\xfa\xd0\xe3\x7b\xc0\xb3\x28\x55\xf3\xa2\
+\xc2\x5a\x01\x4e\xa6\xe9\x9a\x09\x50\x8d\xc6\xc7\x05\xbf\x45\x01\
+\x28\x4f\x16\x13\xa8\xd8\x8e\xb6\xca\xfe\x14\x77\x6a\x01\x1b\xaf\
+\x0a\x37\x8d\x17\xeb\xd1\xb5\x13\x9a\xb8\x28\x80\xa9\x07\x80\xe2\
+\xb4\x3d\xc2\x98\x4e\xc3\xa1\xcc\x9d\x96\xee\xd9\xa8\x86\x7a\xb3\
+\xd8\x34\xd6\x2b\xef\x0e\x43\xd9\x1f\xea\xba\xc3\x2c\xe0\xc9\xa7\
+\x77\x61\xfb\x0b\xaf\x1b\xb9\xc3\x50\xab\xf2\x74\x71\xe2\xe8\x9f\
+\xe4\xdf\xd9\x71\x1c\xc1\x6e\xc5\xba\xfe\xd5\x1b\x56\x2f\x38\x85\
+\xc5\x99\xe4\x89\x03\x50\xf5\xe4\x5b\x51\x2c\x8a\x95\xa5\x00\x2a\
+\xaf\xa3\xad\x56\xf7\x4c\xe3\x4d\xc2\x4d\xe2\xc3\xda\x6e\x1a\xa7\
+\xeb\x77\x58\x5d\xf5\x4a\x2c\xd6\xe6\xe0\x14\xe5\x0d\xe6\xc2\x84\
+\x4f\x02\x8a\x75\xab\xba\x70\xdd\x5a\x77\x77\x18\xf0\x35\x70\xf6\
+\x28\x77\x77\x98\x1f\x3f\xba\x1d\xaf\xee\x35\x74\x87\xa9\x95\xfe\
+\xdb\xc2\xb9\xbd\x7f\xbe\x70\x6e\x2f\xeb\x0e\x23\xd4\x22\x35\x1b\
+\x06\xe1\x8d\x82\x57\x3d\xec\x49\x15\x57\x2f\x40\x99\xd4\xd9\x6c\
+\x35\x70\x51\x65\xa9\x80\x8a\xed\xf0\x62\xa9\x7b\xcd\x04\x2c\xd3\
+\x34\xba\x7a\x75\x71\x26\xea\x70\x23\x13\x4c\x75\x62\x60\xa3\x0a\
+\x9e\x59\x6f\xfe\x39\x3b\xe1\x33\xed\xb9\xc3\xb8\xbb\xc3\xc8\xeb\
+\xa7\x07\x01\x84\x10\x9c\x3c\x79\x16\x3f\x7c\xe8\x59\x1c\x3c\x7a\
+\xca\x0d\x0b\xad\x7b\xd6\xaa\x2c\xfc\x87\xfc\x3b\x3b\xbf\x57\x9e\
+\x3e\x61\xe2\x0e\x03\x83\xb8\x46\xc1\x6a\x31\x55\xc0\xb0\xf0\xc5\
+\x56\x03\x97\x44\x96\x12\xa8\xd8\x0b\xd0\x4a\x75\x4f\x77\x6c\x62\
+\x67\xaa\x07\xb0\xe2\xb0\x27\xc4\x28\x37\xae\xc4\xc9\x6f\x1b\x2d\
+\xf3\xe2\x0b\x03\x3d\x94\xa0\x2d\x93\xc2\xc6\x75\x7d\x58\x33\xd8\
+\x89\x34\x21\x8c\x63\xb1\xfa\xdd\xdf\x7f\xe0\x08\x7e\xf8\xd0\x36\
+\x9c\x39\x3f\x6e\x32\xb2\x77\xb6\x56\x9a\xfd\xfa\xcc\xe1\x27\x7f\
+\x54\x2b\x4e\xd7\x0c\xfa\xd4\x88\x0a\x28\x86\xb7\x42\x25\x8c\x9b\
+\x46\x97\x27\x0e\x00\xa9\xc2\x97\x3d\x8b\x62\x65\x39\x00\x15\xd0\
+\x5a\x75\xcf\x74\xa4\x0f\xa8\x5f\xb5\x43\x44\xb8\x2a\xae\x1e\x3b\
+\x95\xaa\x6d\x71\xd5\x40\x4d\x39\x26\x40\x45\x15\x21\x14\xbd\x5d\
+\x6d\xe8\xeb\x6e\xf3\xcf\x95\x95\xb2\xee\x30\x8f\xef\xc4\xd4\x4c\
+\xde\x64\x64\xef\xad\xda\xc2\xf8\x1f\x4d\xbd\xf5\xf0\x0e\x6a\xd7\
+\xd8\xb6\xab\x1b\xd3\x9c\xf0\xa5\xb4\x57\x35\x0b\xdc\x5a\xa1\x06\
+\x2e\xa9\x2c\x17\xa0\xf2\xc4\x14\x90\x4c\x80\x2d\x2c\x1e\x0d\xa4\
+\x89\x33\x47\xaa\x11\x95\xcf\x44\x9a\x61\xab\x72\xfa\x19\xc5\x6c\
+\x00\x77\xf2\x39\x95\xf4\xb4\xa8\xac\x84\x10\x14\x5d\x77\x98\xa7\
+\xb7\xbf\x62\xe6\x0e\x63\xd7\x9e\xaf\xcc\x9e\xf9\xa3\xe9\x43\x4f\
+\xec\x47\x60\x34\x37\x79\x89\x56\xb2\x0a\x28\x9e\x2f\x26\x40\x45\
+\xd5\xb7\xa4\xb2\xdc\x80\x0a\x68\xcc\xfe\xd4\xac\x99\xe4\x26\x69\
+\xe2\xce\x91\x8a\xcb\x7a\x16\x43\xe5\x03\x93\xd6\x28\xbd\xa3\xee\
+\x05\xab\x24\x44\xa1\x14\x21\xc0\xcc\x4c\x1e\x8f\x3e\xf1\x3c\x5e\
+\x78\xf9\x4d\x13\x77\x98\x1a\xb5\x2a\x3f\x2a\x8e\x1f\xfe\x5a\xfe\
+\xc4\xce\x33\x50\xef\x0e\x63\xd2\xbf\x46\x54\xc0\x56\xb1\xaa\xb0\
+\xb4\xad\x3c\x5e\x51\x6a\x9e\x4a\x96\x23\x50\x79\x62\x62\x7f\x6a\
+\xc5\x4c\xf2\x7a\x66\x9b\x37\x73\x94\xaf\xd1\x89\x9d\x3a\x09\x2b\
+\xc7\x33\xa6\x1b\xd7\x11\x98\xa1\x18\x23\xb9\x10\x97\x22\x04\xe7\
+\xce\x5d\xc2\x8f\x1e\xd9\x8e\x37\xde\x3a\x0a\x9b\x46\xb9\xc3\x60\
+\xc1\xae\x95\xbe\x3b\x7f\x66\xcf\xb7\x0b\x17\xde\x9c\x86\x1e\xa4\
+\x94\x4d\x31\x08\x8f\xc3\xb6\x16\x43\x05\x0c\x8b\x6b\x36\x40\xa9\
+\xc2\x4d\xd8\xe4\xb2\x90\xe5\x0c\x54\x80\x9a\xbd\xc4\x1d\xbd\x6b\
+\x16\x18\xe9\xca\x6d\x24\xae\x11\x95\x0f\x75\xe6\x55\x89\x91\xea\
+\x17\x5d\x08\x2f\x87\x8f\x9e\xc0\x0f\x1f\xda\x86\xe3\x27\xcf\x81\
+\x10\x82\xf0\x1a\xe8\x84\x55\x59\xf8\x66\xfe\xf8\x8e\xff\x5a\x9e\
+\x39\x55\x82\x5a\xdd\x33\xa9\x36\x2a\x5c\x17\xb7\x58\x2a\x60\x58\
+\x5c\xb3\x40\xac\x5e\x35\x71\xd9\xca\x72\x07\x2a\x4f\x4c\x41\x65\
+\x31\x5c\x5f\xe2\xa8\x7f\xcb\x5d\xe5\xf3\x84\x92\x08\x63\xba\x69\
+\xa1\x84\x00\x96\x65\x63\xdf\x1b\x07\xf1\xa3\x47\x9f\xc3\xc5\xf1\
+\x68\x77\x18\x50\xfb\x78\xad\x34\xfb\xd5\xe9\x83\x8f\x3e\x6e\x95\
+\xe7\xc5\xdd\x61\xea\x05\xaa\xb0\xf8\xc5\x50\x01\xa3\xce\xe3\x02\
+\x54\x23\x69\x56\x2c\x40\x79\xb2\x52\x80\xca\x93\x66\x03\x96\x2a\
+\x0d\x42\xf2\x34\x92\x6e\x39\x4f\xec\x8c\x5e\xe6\x85\xc2\x77\xe7\
+\xd3\xe1\x0e\x21\x04\x95\x4a\x05\x3b\x5f\x78\x1d\x8f\x6f\x7d\xc1\
+\xcc\x1d\x86\xda\xaf\xd6\x16\xc6\xff\x60\xf2\xc0\x8f\x5e\x02\xa5\
+\x04\xf1\x40\x4a\x68\xa1\x71\xb8\x69\xda\x46\x59\x55\x58\xfc\x62\
+\x80\xd8\x8a\x07\x28\x4f\x56\x1a\x50\x79\xd2\x28\x60\x85\xa5\x69\
+\x96\xf1\x1c\x11\xf1\xd4\x20\x2c\x6e\xb9\xf5\x48\xe0\xeb\x17\xa9\
+\xfd\x39\xd5\x8a\x6b\x9b\x13\x00\x24\x45\x30\x3f\x5f\xc0\x53\xcf\
+\xbc\x80\xed\xbb\x5e\x47\xb9\x5c\x89\x02\x29\x9b\xda\xb5\x27\x2b\
+\xb3\x67\xfe\xdf\xe9\x43\x4f\x1c\x41\xb4\xaa\xb7\x18\x2a\x60\x3d\
+\x4c\x2b\x6e\x7c\xa3\x00\xd5\x48\x9a\x15\x07\x50\x9e\xac\x54\xa0\
+\xf2\xa4\x5e\xc0\xaa\x67\x1e\x54\x58\xba\x46\x1d\x8c\xeb\x05\x2e\
+\xd3\xf2\xa3\x84\x82\xa4\xa8\x3e\x52\x77\xe6\x56\x4d\x08\x26\x26\
+\xa6\xf1\xf0\xe3\xcf\xe1\x95\xd7\xdf\x86\x65\xd9\x91\xee\x30\xd4\
+\xaa\xfe\xd7\xc2\xa5\x83\xdf\x98\x3b\xb9\xeb\x22\x1a\x33\x9a\x37\
+\x12\xdf\x2c\x15\x50\x0c\x6b\xa5\x0a\x18\x96\xee\x5d\x07\x50\x9e\
+\xac\x74\xa0\xf2\x24\x8e\x61\xbc\x51\x1b\x55\x54\x79\xcd\x70\x30\
+\x5e\x4c\x5f\x3e\x0a\x80\xd6\x67\x4a\x77\xfc\xf3\x4e\x9d\x3a\x8b\
+\x07\x1f\xd9\x86\x83\x47\x3c\x77\x98\xd0\xd2\x66\xed\x5a\xe9\x2f\
+\x17\xce\xec\xf9\xeb\x85\x0b\x6f\xce\xa1\x39\x20\x65\x92\x76\x31\
+\x55\xc0\xa8\xf3\x7a\xd2\x36\x6a\x68\x5f\xd1\xf2\x6e\x01\x2a\x4f\
+\xe2\x8e\xf0\xb1\x79\x74\x12\x97\x3d\xc5\xb5\x53\x99\xb4\xc1\xa4\
+\xec\xb8\xc2\xcf\xf2\x26\xd1\xc6\x74\xd5\x76\x56\x07\xde\x3e\x86\
+\x07\x1f\xd9\x86\x33\xe7\xcc\xdc\x61\xec\x6a\xe1\x8f\x67\x8e\x3e\
+\xf3\x3f\x2a\xf9\x73\xd5\x3a\xfb\xd4\x6c\x15\xb0\x59\x00\xb6\x9c\
+\x58\xd6\xbb\x06\xa0\x3c\x79\xb7\x01\x95\x27\xcd\x9c\x6e\x10\x96\
+\xae\x51\x95\xaf\xd1\x3c\xcd\x9b\x99\x6e\xba\x5d\x16\x0d\xdc\x61\
+\x5e\xdd\xb3\x1f\x0f\x3f\xb9\x13\x93\xd3\x79\xa4\xa2\x47\xf6\x0e\
+\xd4\x4a\xf9\xdf\x9f\xdc\xff\xc3\x67\xa9\x55\xa9\xf7\xfa\x98\xa4\
+\x6f\x74\x5a\x42\x58\xdc\x4a\x51\x01\xdf\x75\xf2\x6e\x05\x2a\x4f\
+\x9a\x39\xdd\xa0\x19\xbe\x7a\xf5\x3c\x48\xf5\xf8\xf8\x99\xd4\x45\
+\xb9\xb2\x0d\x9d\x92\x09\x21\x28\x95\x4a\xd8\xbe\xe3\x15\x6c\x7d\
+\xee\x15\x2c\x14\x4a\x51\x20\x45\x41\xed\x1d\xd5\x85\x89\xdf\x9b\
+\xdc\xff\xc3\x7d\x6e\x9d\x81\x01\x3f\x9e\x98\xa6\x8f\x0b\x56\xba\
+\xf0\x56\xab\x80\xe2\x79\x02\x50\x1a\x79\xb7\x03\x95\x27\x71\xa7\
+\x05\x44\xa5\x6b\xc6\xc4\xcd\x46\xe7\x4c\x35\x92\x57\x71\x5d\x22\
+\x66\xa6\x53\xea\xbb\xc3\x3c\xfe\xd4\x2e\xbc\xf0\xca\x9b\xa8\x56\
+\xa3\x77\x87\xa1\xb6\xf5\xa0\xe3\xb3\xf7\xf8\x49\x00\x69\xa6\xde\
+\x46\x5f\xae\x7a\xc0\x28\x2c\xbe\x59\x86\xf5\x46\xa7\x34\x24\xe0\
+\xa4\x90\xcb\x05\xa8\x58\x69\x06\x7b\x0a\x13\x15\x03\xaa\x67\xdd\
+\xa9\x7a\xa4\x7e\x75\x2a\x14\x70\x08\x08\x21\x38\x7f\x61\x1c\x3f\
+\x7a\x78\x9b\xe3\x0e\x63\x47\xbb\xc3\x50\xab\xfa\x37\xc5\x89\xc3\
+\x7f\x9e\x7f\xe7\xf9\x49\x38\x20\xd5\x08\xb8\xd4\x93\xbe\x15\x76\
+\x29\x55\x58\x33\x55\xc0\xb8\x79\x2f\x0b\xb9\x1c\x81\xca\x93\x7a\
+\x0d\xe4\x8b\x35\xca\xd7\xec\x39\x53\xa1\xbe\x7e\x61\xeb\x51\x11\
+\x00\xc7\xde\x39\x8d\xed\xcf\xbf\x8a\xa3\xef\x9c\x71\xdc\x61\xc2\
+\x4d\x52\xe3\xb4\x56\xfe\xfa\xfc\xd9\x3d\xdf\x5f\x38\xff\x46\x11\
+\xcd\x1f\xd9\x33\xcd\xd7\x8c\xb9\x55\xaa\xb0\xa5\x54\x01\x2f\x4b\
+\xb9\x9c\x81\x8a\x95\x66\x81\x96\x89\x2c\x99\x9b\x0c\x78\xb5\x4f\
+\x88\xd3\x03\x55\xcd\xb2\xb0\x6b\xf7\x3e\x54\xa2\x55\x3d\x00\xf4\
+\x98\x5d\x2d\xfe\xc1\xf4\xc1\xc7\x1f\xaa\x2e\x8c\x8b\xee\x30\x71\
+\xda\xda\x8c\x74\xef\x16\x15\xf0\xb2\x97\x04\xa8\x64\x79\xb7\xaa\
+\x7c\x61\xf5\x50\x42\x52\xd0\xe1\x18\xa5\x14\xd5\x9a\x65\x32\xfd\
+\xe0\x15\xab\x32\xff\x3b\x13\x6f\xfc\xe3\x0b\xd4\xaa\x34\x0a\xaa\
+\xcd\x4c\xbb\x52\x55\xc0\x44\x5c\x49\x80\x2a\x5c\x96\xd3\x28\x5f\
+\xbd\x62\xe6\xeb\x17\x73\x5f\x3f\x41\x2c\x50\xfb\x89\x5a\x71\xfa\
+\x5f\x4f\xbc\xf1\x8f\x07\x61\xa6\xea\x85\x49\xb3\xc1\xad\x19\x2a\
+\x60\xab\x98\x56\x02\x4e\x06\x92\x00\x95\xb9\xbc\x1b\x55\xbe\x20\
+\x0d\xa9\xbb\x6d\x25\x4a\xad\xbf\xab\xe6\xcf\xff\xf1\xd4\xdb\x8f\
+\x9c\x47\xe3\x20\xa5\x6a\x7f\xa3\x69\x9a\xa1\x02\xd6\x33\x09\xd4\
+\xb4\xec\x44\x22\x24\x01\xaa\xfa\x24\x6a\x76\xf9\x62\x39\x18\x37\
+\x8b\x7d\x85\xfa\xfa\x85\xc8\x2c\xb5\x6b\x7f\x5e\x9e\x3e\xf9\xed\
+\x99\x23\x4f\xe7\xb1\x34\x20\xd5\x8c\x74\xcd\x9a\x9d\x5e\x4f\x79\
+\x89\x18\x48\x02\x54\x8d\x8b\x89\xcd\xa9\xd1\xb9\x5b\x26\xac\x48\
+\x55\x96\xae\x8d\x8a\xf2\x63\xab\x7e\x67\xa8\x55\xfd\xa3\xf9\xb3\
+\xaf\xfd\x60\xe1\xdc\xeb\xf5\xba\xc3\x44\xc9\x62\xa8\x80\xcd\x48\
+\x9f\x00\x53\x8b\x25\x01\xaa\xe6\x4b\xb3\x41\x2a\x62\x09\xe1\xb0\
+\x91\x3c\x23\x70\x23\x70\xa6\x27\xc4\xe9\xe2\x9b\xb4\x56\xf9\x9d\
+\xa9\x83\x8f\x3e\x55\x9d\xbf\xe4\xd5\xd3\xea\x17\xb3\x51\x15\xb0\
+\x5e\xf5\xb0\x5e\x15\x30\x91\x26\x4a\x02\x54\xad\x97\x56\xcd\x8f\
+\x6a\xa6\xd1\x9d\x02\xc4\x32\x28\x8b\x02\x74\xbb\x5d\x2d\xfd\xe6\
+\xa5\x3d\x7f\xfb\x1a\xcc\x97\x0b\x6e\x86\x34\xc3\x56\x15\x96\xa6\
+\x59\xe1\x89\xb4\x40\x12\xa0\x5a\x7c\xd1\xb1\xa6\x66\x3e\xf8\x71\
+\x40\x8c\x02\x80\x6d\x95\xcf\xa7\xda\x3a\x2f\x01\x58\xa3\x49\x57\
+\x05\xa5\xff\xc3\xaa\x2e\xfc\xde\xf8\x6b\x7f\x77\x1c\xd1\x33\xcd\
+\x5b\x7d\xcd\xea\x4d\xdf\xac\x49\xa0\x89\x2c\xa2\xa4\x1b\x2f\x22\
+\x91\x16\x49\xe3\xbb\x2d\xc4\x28\x3f\xdd\xd6\x5d\x6c\xef\x19\xbd\
+\x1e\x84\xdc\xad\x48\xbb\x00\x4a\xbf\x6d\x55\x16\x7e\x77\xfc\xf5\
+\xbf\x3b\x87\x80\x49\x2d\x85\x2c\x95\x0a\x98\xc8\x12\x4a\x02\x54\
+\x2b\x4f\x5a\x02\x60\x95\xfc\x59\xab\x7b\xed\x6d\x47\x49\x2a\xbd\
+\x1e\xc0\x35\x70\x9e\x0d\x1b\xc0\x09\x50\xfb\xdf\xd4\xca\x73\xdf\
+\x9c\xd8\xfb\x83\x59\xa8\x41\x2a\x7a\xfa\x43\xf3\xa4\xd5\x2a\x60\
+\x22\xcb\x50\x5a\xfd\xd5\x4e\x64\x71\xa5\xd1\x91\x41\xba\xfa\xae\
+\x5f\x5d\x4d\x52\x99\xcf\x80\x60\x03\x80\x12\xb5\xed\x47\xcb\xd3\
+\x27\xde\x9a\x39\xf2\xb4\x55\x47\xf9\xcd\x96\x56\xb9\xe2\x24\xb2\
+\xcc\x65\xa9\x1f\xbc\x44\x16\x5f\x74\xab\x8c\x7a\x12\x36\xf2\xb8\
+\x94\xd2\xe8\x84\xdb\x44\x56\xb0\x2c\x87\x07\x30\x91\x95\x21\xad\
+\x7a\x56\x12\xc0\x49\x24\x52\xfe\x7f\x90\xbe\xf8\xd8\xd4\xeb\x70\
+\x25\x00\x00\x00\x14\x74\x45\x58\x74\x41\x75\x74\x68\x6f\x72\x00\
+\x4a\x61\x6b\x75\x62\x20\x53\x74\x65\x69\x6e\x65\x72\xe6\xfb\xf7\
+\x2f\x00\x00\x00\x49\x74\x45\x58\x74\x43\x6f\x70\x79\x72\x69\x67\
+\x68\x74\x00\x50\x75\x62\x6c\x69\x63\x20\x44\x6f\x6d\x61\x69\x6e\
+\x20\x68\x74\x74\x70\x3a\x2f\x2f\x63\x72\x65\x61\x74\x69\x76\x65\
+\x63\x6f\x6d\x6d\x6f\x6e\x73\x2e\x6f\x72\x67\x2f\x6c\x69\x63\x65\
+\x6e\x73\x65\x73\x2f\x70\x75\x62\x6c\x69\x63\x64\x6f\x6d\x61\x69\
+\x6e\x2f\x59\xc3\xfe\xca\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\
+\x74\x65\x3a\x63\x72\x65\x61\x74\x65\x00\x32\x30\x31\x30\x2d\x30\
+\x36\x2d\x32\x30\x54\x32\x33\x3a\x32\x34\x3a\x32\x35\x2d\x30\x34\
+\x3a\x30\x30\x77\x9c\x29\x53\x00\x00\x00\x25\x74\x45\x58\x74\x64\
+\x61\x74\x65\x3a\x6d\x6f\x64\x69\x66\x79\x00\x32\x30\x31\x30\x2d\
+\x30\x36\x2d\x32\x30\x54\x32\x33\x3a\x32\x34\x3a\x32\x35\x2d\x30\
+\x34\x3a\x30\x30\x06\xc1\x91\xef\x00\x00\x00\x19\x74\x45\x58\x74\
+\x53\x6f\x66\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\
+\x73\x63\x61\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x00\
+\x21\x74\x45\x58\x74\x53\x6f\x75\x72\x63\x65\x00\x68\x74\x74\x70\
+\x3a\x2f\x2f\x6a\x69\x6d\x6d\x61\x63\x2e\x6d\x75\x73\x69\x63\x68\
+\x61\x6c\x6c\x2e\x63\x7a\x69\x66\xe3\x5e\x00\x00\x00\x0d\x74\x45\
+\x58\x74\x54\x69\x74\x6c\x65\x00\x47\x6f\x20\x44\x6f\x77\x6e\xf3\
+\xfd\x14\x79\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x09\x4d\
+\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\x00\x57\x02\xf9\x87\
+\x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\
+\xa7\x93\x00\x00\x09\x02\x49\x44\x41\x54\x68\x81\xed\x9a\x7b\x54\
+\x93\xf7\x19\xc7\x3f\x6f\x02\x04\x84\x70\xf1\x08\x82\x17\x44\x10\
+\xc1\x8a\xab\xb4\x38\xb1\xd5\xf5\x88\x99\x52\x56\x95\x7a\xc6\x2c\
+\x9d\xb5\x30\xd6\x33\xa7\xa7\xdd\xe9\x6d\x2d\x3b\x6e\x6d\x57\xb7\
+\xb5\xb5\xad\xae\xb6\xdb\xa9\xb6\xd4\x56\x5d\xab\x5d\x77\x4a\x71\
+\x30\x10\x5b\x6a\x5b\xea\x44\x04\x05\xa3\xf5\x16\xa1\x48\x02\x28\
+\x97\x24\xe4\x9e\xbc\xfb\x83\x06\xd3\x98\x40\x02\xa8\xff\xec\x39\
+\x27\xe7\x79\x79\xf3\xfb\x3d\xf9\x7c\x7f\xcf\xf3\xbb\xbc\x09\xf0\
+\x7f\xbb\xb9\x26\x78\xba\xa9\x50\x28\x12\x81\x6d\x52\xa9\xf4\x4e\
+\x41\x10\x22\x6e\x30\x93\xbb\xd9\xec\x76\xfb\x29\x51\x14\x37\x55\
+\x57\x57\xef\x1b\xb6\xb5\x42\xa1\x88\xc8\xcb\xcb\xeb\xac\xab\xab\
+\x13\x4d\x26\x93\x38\x52\x73\x38\x1c\x63\xf2\x32\x1a\x8d\x62\x5d\
+\x5d\x9d\x98\x97\x97\x27\x2e\x5c\xb8\xf0\x01\x77\xde\x00\xf7\x1b\
+\xfd\xfd\xfd\x6b\x36\x6c\xd8\x10\x9d\x91\x91\x81\x28\x8a\x38\x1c\
+\x0e\x00\x44\x51\xfc\x9e\xf7\x74\x6f\x24\xde\x97\x78\xb3\x67\xcf\
+\x26\x3f\x3f\x9f\x2d\x5b\xb6\x3c\x01\xfc\x03\xb0\x3b\xfb\x48\xdc\
+\x05\x88\xa2\x78\x4b\x42\x42\xc2\xf7\x82\x7b\x83\x77\x58\xad\xf4\
+\x2a\x95\x58\xf5\xfa\xeb\x06\x2f\x8a\x22\x16\x8b\x85\xe9\xd3\xa7\
+\x23\x08\xc2\x14\x20\xdc\x95\xd7\x93\x00\xe9\x50\x01\x9d\xd7\xa7\
+\xb7\x6f\xe7\xc3\x19\x33\xa8\x5c\xba\x98\x0a\x85\x82\x2b\x97\x2e\
+\x5d\x17\x78\x37\x36\x80\x60\xd7\x7b\xd7\x94\xd0\x50\x81\x01\x1c\
+\x76\x3b\x5f\xad\x5b\x87\x55\xd5\xc8\xfd\x7f\x9e\x87\xc4\x78\x86\
+\xb6\xb4\x55\x1c\x2e\x28\x20\x63\xe7\x4e\xa2\xe3\xe2\xc6\x14\xde\
+\x53\x5b\x57\xbb\x26\x03\xce\x9a\xf7\x26\xa8\xae\xb8\x98\x10\x73\
+\x2b\x4b\x57\x9a\x90\x98\xcf\x72\x79\xee\x1a\xda\x02\x57\xb0\xf8\
+\xd5\x1f\xd1\xf8\xd8\x63\xf4\xf6\xf4\x8c\x39\xbc\xd3\xbb\xb3\x79\
+\x15\xe0\x4d\x7d\xf7\x89\x13\xa8\x76\x95\x90\xb9\x48\x0f\x61\x12\
+\xfa\xa6\xcc\x42\x1f\xbb\x86\x84\xf8\xf1\x84\x4b\x0e\x90\xf5\xdb\
+\x78\xea\x37\x6e\x44\xef\x65\x4e\x8c\x76\x01\xf0\x49\x80\xfb\x07\
+\xb8\x5e\xb7\x56\x56\x92\x56\xa0\xa0\x3f\xc4\x41\x73\xf4\x22\xbe\
+\x74\x6c\xa0\x5d\x7d\x85\x28\xe1\x6b\xa4\x53\x1e\x22\x2c\xa4\x9a\
+\xdb\x73\x64\x1c\xdb\xbc\x19\xa3\xd1\x38\xa6\xf0\xde\xcc\xd3\x24\
+\xf6\xfa\x61\x53\x72\x73\xf9\x66\x7f\x23\xff\x11\x57\x52\xdf\x97\
+\x4b\x88\xb4\x83\x59\x92\x42\x64\xda\xd7\x41\x10\x61\xf2\x23\xc4\
+\x25\x1f\x62\xf2\xf8\x16\x1a\x76\xec\xc0\x62\xb1\x8c\x19\xbc\xcf\
+\x19\x70\x6d\xe4\x1e\x64\x7c\x52\x12\xb7\xfe\x6d\x07\x92\xb7\x3f\
+\x64\x55\xda\x46\xb2\x26\xdd\x4f\x94\xec\x04\xf4\x1f\x82\xde\x8f\
+\x40\x12\x0c\xb1\x45\xcc\x59\x7e\x86\x30\xf5\x67\x34\xec\xd9\x83\
+\xd5\x6a\x1d\x13\x78\x77\xb6\x61\x05\x78\x0b\x92\xb0\x60\x01\xd3\
+\x1f\x7f\x96\x23\x2f\x06\x22\x4a\x62\x41\xca\xc0\xab\xbf\x0a\xb4\
+\xa5\x10\x18\x0d\x13\x56\xb3\x60\xbd\x16\x73\xd5\x4e\x4e\x94\x96\
+\x62\xb7\xdb\x47\x0d\xef\x7e\xed\x55\xc0\x50\x1b\x98\xd3\xa7\x64\
+\x67\x33\x4e\x51\xc8\xb1\x0f\xe7\xe3\x10\xc6\x0f\x08\x90\x88\xd0\
+\x5f\x06\xba\x2a\x08\x8a\x87\xf0\x65\xe4\xbc\x22\xa7\x6b\xc7\xcb\
+\x28\x6b\x6a\x7c\x8a\x3b\xdc\xea\x65\xb7\x0f\x6e\xc0\xde\x05\x0c\
+\x97\x01\xa7\xbf\x75\xcd\x1a\x74\xf2\x3b\xb8\xd8\x90\x8b\x28\x91\
+\x0f\x88\x10\xec\xa0\xdb\x0b\x86\x1a\x18\x37\x0b\x42\x6f\x27\x6f\
+\xd7\x74\x2e\x3c\x53\xcc\xd9\xfa\xfa\x11\xc3\xbb\x0e\xee\xb0\x02\
+\xfc\x09\x9a\xb1\x7e\x3d\xe7\x1a\x23\x38\x7f\x64\x05\xa2\x24\xe2\
+\xbb\x4c\x58\x41\xbb\x1b\x8c\x5f\x42\xd8\x7c\x08\x9e\xca\x9a\x4f\
+\x32\x38\xf1\xf0\xc3\xb4\x7e\xf3\xcd\xa8\xe0\xfd\xda\xc8\x7c\x09\
+\x2e\x08\x02\x99\xcf\x3e\xcb\xa9\xcf\x03\xd1\xb4\xfc\x1c\xd1\x18\
+\x04\x36\x40\x30\x41\xdf\x7b\x60\xaa\x87\xb0\xc5\x08\x52\x28\xd8\
+\x7f\x17\x8d\x8f\x3e\x8a\xa6\xad\x6d\xc4\x22\x7c\x9a\xc4\xfe\xd6\
+\xaa\x44\x22\x61\xc1\x4b\x2f\x51\xfb\x7a\x0b\x5a\xd3\x3a\xd0\x49\
+\x41\x07\x98\x74\xd0\xf3\x16\x58\x9a\x20\x62\x05\xd2\x40\x35\xab\
+\xdf\xce\xa0\xa1\xb8\x98\xcb\x5d\x5d\x7e\x8b\x18\xd1\x32\xea\x6b\
+\xf0\x20\x99\x8c\x3b\xdf\x7c\x93\xf2\xe2\x46\x8c\x21\xeb\x07\x04\
+\x68\x81\xde\x6e\x50\x97\x80\xf1\x0c\x44\xe4\x23\x1b\xa7\xe4\xee\
+\xdf\x25\xd3\xf0\xdc\x73\x68\xb5\x5a\xbf\x44\xb8\x5f\xfb\x24\xc0\
+\xd7\x91\x01\x18\x27\x97\x73\xc7\xf6\xed\xec\x2b\xa8\xc1\x1a\xfe\
+\xcb\xab\x22\xba\xdb\xa1\xad\x04\xfa\x5b\x21\xbc\x88\xa8\xb8\x7a\
+\xee\xfc\x59\x14\x0d\xaf\xbd\x86\xc1\x60\xf0\x4b\x84\x5f\xcb\xa8\
+\x3f\xf0\xce\xbf\x23\x63\x63\x59\x50\x52\xc2\xae\xb5\x87\xb0\x44\
+\xe4\x5f\x15\xd1\xa9\x82\x96\x12\x30\x74\x80\xfc\x21\xa6\xa4\xd6\
+\x33\x73\x5a\x0f\x8d\x25\x25\x98\xcd\x66\x9f\xe1\xfd\x3a\x0b\xf9\
+\x0b\xef\xf4\x31\x33\x66\x90\xbe\xe5\xaf\x7c\xb0\xa1\x0e\x7b\x48\
+\xd6\x80\x08\x1d\xa0\x39\x0d\xaa\x3d\x60\xd4\x43\xc4\x43\xa4\x2d\
+\xb9\x80\xd0\xfc\x29\xcd\x07\x0f\x62\xb1\x58\x7c\x16\x31\xac\x00\
+\xe7\x69\x74\x24\xf0\x4e\x9f\x30\x7f\x3e\x33\x7f\xff\x17\xca\xb6\
+\x6a\xb1\xc9\x32\xaf\x66\xa2\xed\x28\xa8\xf6\x82\x55\x80\x88\x7c\
+\x32\x73\x17\xd2\x59\x56\x46\x5b\x5b\x9b\x4f\xf0\x7e\x6d\x64\x23\
+\x85\x77\xfa\x99\x59\x59\x44\xe6\x16\xf2\xd9\x47\x21\x38\x82\x52\
+\xae\x8a\x38\x7f\x08\x2e\x7c\x0c\xd6\x60\x82\xa6\xdf\x4e\x47\x4d\
+\x0d\xad\x2a\x95\x5f\xc7\x8d\x21\x05\x8c\x66\xe4\xdd\xfd\x9c\xd5\
+\xab\xb1\xcf\x5d\xc6\xd1\xa6\x74\xec\x21\xf1\x60\x06\xf4\x22\xf4\
+\x3b\xb0\x7d\xeb\x20\x78\xce\x5c\xa2\x6f\x49\xc6\x72\xfa\x34\x7d\
+\x7d\x7d\xc3\x42\xfb\x55\x42\xa3\x85\x77\xfa\x8c\xa2\x22\xd4\x8e\
+\xc9\x5c\xd0\xe5\xc0\xd4\x1c\xc4\x99\x4f\xa3\x0f\xcd\xc1\x38\x73\
+\x16\x0e\xbb\x85\x5b\xf2\x96\x63\x6d\x6a\x42\xa3\xd1\x8c\xed\x3e\
+\x30\x16\xf0\x4e\x9f\xf9\xe4\x93\x34\x36\xdb\x78\xf1\xfe\x83\xec\
+\xd9\x5c\x41\xbb\x4e\x8b\xcd\x70\x19\x9b\xb1\x9b\xbe\x94\x44\xba\
+\x8e\xd5\xa3\x51\xab\xbd\x0e\x9e\x3b\x9b\xab\x5d\xf3\x50\x3f\xd6\
+\xf0\x00\x82\x20\xb0\xe8\xf9\xe7\x09\x5b\xb6\x8c\xcb\xe5\xe5\x7c\
+\x5c\xb8\x99\x98\xb4\x78\xc8\xfd\x31\x8f\xfc\xab\x96\x5f\xa4\x26\
+\x31\xf1\xdc\x39\x74\xb7\xdd\x46\x78\x78\xb8\xd7\xf2\xf1\x54\x42\
+\xd7\x08\x70\xcd\xc0\x58\xc0\xbb\x8a\xb8\x6d\xd1\x22\xf4\xe9\xe9\
+\x9c\xbb\xf7\x5e\x3a\x2b\x2b\x51\x6f\xd9\x4b\x7e\xca\x54\x34\x61\
+\x21\xd8\x95\x4a\x3a\x3a\x3a\x90\xcb\xe5\x1e\xfb\xbb\x5f\x7b\x15\
+\xe0\x49\xe9\x68\xe1\x5d\x7d\x68\x68\x28\x3f\xc8\xc8\xc0\x94\x96\
+\xc6\xc5\x95\x2b\x99\x54\x51\x41\x47\x69\x29\x97\xcd\x66\x64\x2b\
+\x56\x90\x98\x98\x88\x20\x08\xd7\xf4\xf3\x36\x07\x9c\x02\x96\x00\
+\x49\x00\x3a\x9d\x6e\x56\x69\x69\x29\xf5\xf5\xf5\x1e\xf7\x03\x6f\
+\xa3\xe1\x6f\xbb\x79\xf3\xe6\x91\x32\x7b\x36\xf1\x89\x89\xa8\x72\
+\x72\xb8\x74\xe4\x08\x66\xbd\x1e\xbd\x5e\x8f\x5c\x2e\xf7\x2f\x03\
+\xf1\xf1\xf1\xc5\x45\x45\x45\x77\xc5\xc4\xc4\x88\x0e\x87\x43\x2a\
+\x95\x4a\x07\x47\xc1\x5b\xc7\xd1\x58\x6d\x6d\x2d\x36\x9b\x8d\xe4\
+\xe4\x64\x82\x83\x83\x49\x4d\x4d\x25\x29\x29\x89\xde\xde\x5e\x82\
+\x83\x83\xbd\x66\xd0\xd3\x46\x16\x00\x20\x08\x82\x90\x9f\x9f\x1f\
+\x90\x9c\x9c\x3c\xf8\x46\xc7\xc9\x46\x9a\x5b\xd5\x04\x8d\x8f\x25\
+\x29\xfd\x56\x26\x05\x0d\x79\xea\xf0\xcb\x02\x03\x03\xd1\x68\x34\
+\xdf\x83\x0b\x08\x08\x60\xc2\x84\x09\x43\x96\x9f\x5f\x67\x21\x73\
+\xe7\xbf\x51\xe4\xe4\x50\x7a\xbe\x13\xb9\xf4\xbb\x9a\xb4\xf7\x71\
+\xf8\x9c\x76\xb0\xcd\xc5\xa3\x27\xe9\xeb\xfd\x96\x4f\x2b\x3f\xe5\
+\x4c\xef\xc0\x79\xc6\x66\xd0\xf0\x79\x79\x19\x15\x07\x6a\x38\xda\
+\xd8\x44\xf3\x89\xa3\x54\x57\x7e\x81\x5a\x6f\x1b\x88\xdb\xd3\xca\
+\xa9\xe3\x8d\x28\x95\x4a\xaa\x3f\x3f\xeb\x15\xd6\x93\xf7\x64\x5e\
+\x05\xc8\x42\x1b\x91\x04\x44\xf2\xc7\xfb\x96\x0e\x0a\xd8\xff\xf0\
+\x3d\xfc\x64\xf9\x07\x83\x6d\xfa\x9a\x7e\xcd\xf8\xe8\x39\x68\x8e\
+\x3c\xc1\xdc\xe4\xd5\x00\x34\xec\xfe\x29\x59\x2b\xee\xe3\x6c\xc3\
+\xd7\x3c\x7d\x77\x36\xbd\xb5\xbf\x61\xd9\xf2\x5c\x8e\x2b\x3b\xd1\
+\xb5\x6c\x67\x72\x6c\x2a\x5a\x6c\x5c\xfc\xba\x8c\x5f\xad\xff\x83\
+\x5f\x0b\x80\x5f\x19\x50\xbd\xab\x24\x74\x62\x21\xe3\x24\x03\xf0\
+\xbd\xa7\xdf\xa0\xe8\x58\x02\x01\x5d\xef\x0f\xb6\x31\x1f\xef\x41\
+\x1a\x18\xc3\x3f\xf7\x99\x79\x6a\xdb\x0b\x00\xd8\x9b\x7a\x70\xd8\
+\x0d\x6c\xdc\x76\x85\x2a\xd5\x45\x02\x9a\x7b\x09\x9d\x58\x48\xf6\
+\x0f\x27\x61\xed\x57\xa3\xb7\x99\xf8\xef\x29\x2d\x77\x3d\xb0\x8e\
+\xea\x8a\xad\x3e\xc3\x83\x8f\x8f\x94\x4e\xab\xa9\xb8\x44\x74\xe6\
+\xf2\x81\x8e\xb6\x4e\xa2\x67\x9d\xa5\xf3\xf0\x2e\x9e\x8a\x38\x4e\
+\x8b\x79\x60\x32\x7d\xb9\xbf\x8d\xa9\x39\x6f\x32\xb9\xbb\x95\xd2\
+\xd3\x03\x0f\x27\x5f\x94\xb7\x33\x6e\xc2\x2a\x9e\x2a\x2e\xa4\xba\
+\xa2\x8c\x67\xde\x50\x12\xb3\xe0\x1e\x40\x64\xfb\xbe\xf9\xa8\xbe\
+\xda\x4d\x5b\xcd\xfb\xbc\x57\x67\x62\xda\x94\x68\xbf\xca\xc7\xa7\
+\x7d\x00\xe0\xe8\x2b\x8f\xf2\x6a\x9b\x1e\x71\xc2\x56\x0a\x0a\x76\
+\xf2\xee\xbb\xef\x41\xd2\x3b\x98\xba\x3f\xa1\xbc\xdb\xc8\xe1\xb7\
+\xce\xb0\x25\xa9\x9c\x17\x5a\x75\x48\xa7\xbe\xc6\x91\x99\x4b\xf8\
+\xd3\xba\x14\x2e\x55\xbe\xcc\x4b\xdf\xea\x08\x9b\x67\xe5\xb3\x9d\
+\xcb\xd8\x58\x77\x09\x80\xb8\x2b\x6f\xb1\x76\xf9\xe3\xec\xda\x7f\
+\x0c\x75\xdf\x23\x84\x4f\x4d\x25\x33\x2d\xd2\x6f\x78\x4f\x19\x10\
+\x00\xa6\x4d\x9b\x76\xf0\xc0\x81\x03\x59\xae\xab\xd0\xf5\xb4\x92\
+\x92\x12\xda\xdb\xdb\x59\xbb\x76\xad\x4f\x22\x64\x32\x19\x2a\x95\
+\x8a\xec\xec\xec\x6e\x83\xc1\x90\x06\xa8\x9d\xb1\x06\x33\x50\x5b\
+\x5b\x4b\x4b\x4b\xcb\x0d\x11\xa0\x54\x2a\x89\x8c\xf4\x3d\x03\xce\
+\x0d\xd5\x6b\x09\x19\x0c\x86\xdd\x9b\x36\x6d\x6a\x01\x30\x99\x4c\
+\x77\x28\x14\x8a\x94\xa8\xa8\xa8\x21\xeb\xcf\xdb\xd2\xe6\x6b\xbb\
+\xb4\xb4\x34\x9f\xe1\x9d\xe6\x75\x23\xeb\xea\xea\x7a\xa7\xab\xab\
+\xeb\x1d\x00\xa9\x54\xfa\xf7\x07\x1f\x7c\x30\x25\x3d\x3d\x7d\xf0\
+\x9b\xe5\xb1\x3c\x0b\x8d\xd4\x3b\x1c\x0e\x9f\xbf\xd8\x3a\x7f\xf2\
+\xe4\x49\x02\x03\x03\x6f\x3a\xb4\xd3\x87\x85\x85\xd1\xd4\xd4\x04\
+\xd0\x81\xcb\x4f\xac\xde\x6c\x62\x5c\x5c\x5c\x67\x55\x55\x95\x68\
+\xb5\x5a\xc5\x9b\x6d\x56\xab\x55\xac\xac\xac\x14\x63\x62\x62\x1c\
+\x12\x89\xe4\x79\x20\xcc\x15\xd6\xe3\xbf\x1a\x00\x39\xc0\x8b\xc0\
+\x34\xbc\x2c\xb5\x37\xd8\xae\x00\xfb\x81\x6d\x80\xd2\xf5\x0d\x6f\
+\x02\x00\x22\x81\x14\x40\x76\xfd\xb8\x7c\x36\x3d\xd0\xce\x40\x09\
+\x8d\xed\xd1\xf8\x66\xdb\xff\x00\x0b\x62\x0d\xcf\xef\xd6\x72\x27\
+\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x77\xc9\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x01\x2a\x00\x00\x01\x08\x08\x06\x00\x00\x00\xe8\x5e\xb9\x12\
+\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\
+\x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\
+\x20\x63\x48\x52\x4d\x00\x00\x7a\x26\x00\x00\x80\x84\x00\x00\xfa\
+\x00\x00\x00\x80\xe8\x00\x00\x75\x30\x00\x00\xea\x60\x00\x00\x3a\
+\x98\x00\x00\x17\x70\x9c\xba\x51\x3c\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\xd0\xcb\x00\x00\xd0\xcb\x01\x9f\x0e\xc0\x23\
+\x00\x00\x75\xde\x49\x44\x41\x54\x78\xda\xed\xbd\x67\xb4\x24\xd7\
+\x75\xdf\xfb\x3f\xd5\xf1\xe6\x1c\x26\x03\x18\x60\x30\x18\x0c\x66\
+\x10\x07\x83\x9c\x01\x82\x14\x49\x91\x22\x29\x3d\x2a\xd9\xb2\x6c\
+\x53\x92\x6d\xc9\xb2\xad\x67\x39\x2b\x58\x8e\x1f\xfc\xd6\xfb\x60\
+\xd9\x7e\x5e\x96\xc3\xf2\x32\x2d\x4a\xcc\x49\x94\x45\x52\x24\x45\
+\x10\x04\x88\x8c\xc1\x00\x83\xc9\x37\xe7\x7b\xfb\x76\xee\x3a\xef\
+\x43\xa5\x93\xab\xaa\xc3\x0d\x83\xda\xc0\x9d\xee\x3a\x67\x9f\x50\
+\xe9\xd7\xfb\xec\x93\x08\x12\x49\x64\x9b\x64\xf2\xf4\xa7\xbc\xaf\
+\x07\x00\xfc\x2c\x80\x4f\x02\xe8\x02\xf0\x1a\x80\x7f\x07\xe0\x5b\
+\x00\x30\xfb\xdc\xef\x6f\x77\x55\x13\xd9\x66\x21\xdb\x5d\x81\x44\
+\xde\x9b\xc2\x40\xea\x24\x80\x7f\x09\xe0\x09\x00\x19\x46\xe5\x55\
+\x00\x7f\x1d\xc0\x73\x40\x02\xab\xf7\xba\x58\xdb\x5d\x81\x44\xde\
+\x7b\xe2\x42\x8a\x00\x78\x0a\xc0\x1f\x00\x78\x1f\x78\x48\x01\xc0\
+\x09\x38\xa0\xca\xc4\xc9\x3b\x91\x6b\x53\x12\x50\x25\xb2\xa5\xe2\
+\x42\x2a\x03\xe0\x67\x00\xfc\x27\x00\xb7\x1b\xd4\x6f\x07\x30\xb0\
+\xdd\x75\x4e\x64\xfb\x25\x01\x55\x22\x5b\x26\x2e\xa4\xfa\x00\xfc\
+\x3a\x80\xff\x07\xc0\xa1\x90\x24\x3d\xee\x5f\x22\xef\x71\x49\x6f\
+\x77\x05\x12\x79\x6f\x88\x0b\xa9\x71\x00\xff\x08\xc0\x2f\xc2\x71\
+\x9a\x27\x92\x48\x24\x49\x40\x95\x48\x47\x85\x71\x9a\xdf\x04\xc7\
+\x69\xfe\x21\x24\xcf\x5d\x22\x31\x25\x79\x60\x12\xe9\x98\x30\x90\
+\x3a\x0d\xe0\xdf\x02\x78\x60\xbb\xeb\x94\xc8\xee\x94\xc4\x47\x95\
+\x48\x47\xc4\x85\x94\x05\xe0\xc3\x00\xfe\x0b\x12\x48\x25\xd2\x82\
+\x24\xa0\x4a\xa4\xed\xe2\x42\x2a\x0f\xe0\xaf\x01\xf8\x7d\x00\x47\
+\xb7\xbb\x4e\x89\xec\x6e\x49\x9a\x7e\x89\xb4\x55\x5c\x48\x0d\x02\
+\xf8\x3b\x00\x7e\x15\x4e\x2f\x5f\x22\x89\xb4\x24\x09\xa8\x12\x69\
+\x8b\x30\xfe\xa8\xfd\x00\x7e\x1b\xc0\x4f\x03\xc8\x9a\xd2\x50\x00\
+\x29\x2b\x05\xdb\x6e\x6c\x77\xf5\x13\xd9\xe1\x92\x34\xfd\x12\x69\
+\x59\x18\x48\xdd\x06\x67\x10\xe7\xcf\xc3\x00\x29\x4a\x29\x52\xa9\
+\x14\xee\xb9\xf3\x38\xf6\xee\xdf\x0f\x4a\xe9\x76\x9f\x42\x22\x3b\
+\x5c\x12\x50\x25\xd2\x92\x30\xd3\x61\x1e\x47\x30\x1d\x46\xfb\x5c\
+\x51\x4a\xd1\xd5\x95\xc7\x47\xdf\xff\x20\xfe\xd2\xc7\x9f\x42\x7f\
+\x5f\x0f\x12\x4e\x25\x12\x26\x49\xd3\x2f\x91\xa6\xc5\x85\x54\x1a\
+\xc0\xc7\x01\xfc\x73\x00\xd7\x9b\xf4\x6d\x9b\x62\x68\xb0\x0f\x3f\
+\xf5\xe1\x47\xf1\xf4\xc3\xb7\x63\xa3\x54\x4f\xac\xa9\x44\x22\x49\
+\x02\xaa\x44\x9a\x12\x17\x52\x3d\x00\x7e\x09\xc0\xdf\x07\x30\x62\
+\xd2\xb7\x6d\x8a\x7d\x7b\xc6\xf0\xf3\x9f\x78\x0a\xa7\x6f\xbf\x09\
+\x29\xcb\x02\xa5\xb5\xed\x3e\x8d\x44\x76\x89\x24\xa0\x4a\x24\xb6\
+\xb8\x90\x1a\x05\xf0\x0f\xe1\x0c\x41\xe8\x36\xe9\x53\x4a\x71\xcb\
+\x91\x43\xf8\x4b\x9f\x78\x0a\xc7\x6e\x3a\x00\x50\x8a\xc4\x8e\x4a\
+\x24\x8e\x24\xa0\x4a\x24\xb2\x30\x4e\xf3\xc3\x00\x7e\x0f\xc0\x47\
+\x61\x78\x86\x28\xa5\x20\xc4\xc2\xe9\xbb\x8e\xe1\xe7\x3e\xf6\x04\
+\x0e\xec\x19\x86\x4d\x69\xb2\x08\x5a\x22\xb1\x25\x01\x55\x22\x91\
+\x84\x81\xd4\x3d\x70\xa6\xc3\x3c\x6c\xd2\xa7\x94\x22\x93\xc9\xe0\
+\x89\x87\xee\xc4\x4f\x7d\xe8\x61\x8c\x0c\xf4\xc0\xb6\x29\x40\x00\
+\x0a\xe2\xc0\xca\x33\xab\x12\x72\x25\x12\x22\x09\xa8\x12\x09\x15\
+\x66\x3a\xcc\xb3\x00\xfe\x35\x80\x63\x26\x7d\x9b\x52\xf4\xf6\x74\
+\xe1\xc3\xcf\x3c\x80\x0f\x3d\x75\x0a\xdd\xf9\x2c\x6c\xcf\x69\x4e\
+\x01\x10\xa7\xe9\x97\x34\xff\x12\x89\x2a\x09\xa8\x12\x31\x8a\x0b\
+\xa9\x1c\x9c\x35\xcd\x7f\x0b\xc0\x5e\x93\xbe\x6d\x53\x8c\x8e\x0c\
+\xe2\x93\x1f\x79\x1c\x8f\x9c\xbe\x15\x99\x74\x4a\x6e\xee\x51\xff\
+\x9f\x44\x12\x89\x24\x09\xa8\x12\xd1\x8a\x0b\xa9\x01\x00\xbf\x06\
+\x67\xb1\xbb\x7e\x93\xbe\x4d\x29\x0e\x1d\x98\xc4\xcf\x7f\xfc\x29\
+\xdc\x75\xfc\x06\x10\x02\x7f\xf8\x01\x85\xba\x85\x97\xe0\x2a\x91\
+\x28\x92\x80\x2a\x11\x49\x18\x7f\xd4\x5e\x00\xff\x0c\xc0\xcf\xc1\
+\xb1\xaa\xb4\x42\x29\x70\xe2\x96\xc3\xf8\xb9\x8f\x3f\x89\x23\xd7\
+\xed\x01\xa5\xd4\x19\xc8\xc9\xd0\x29\x71\x49\x25\xd2\xac\x24\xa0\
+\x4a\x84\x13\x06\x52\xc7\xe0\xf8\xa3\x9e\x45\xc8\x48\x73\x2b\x95\
+\xc2\x83\xf7\x1c\xc7\x4f\x7f\xe4\x31\xec\x19\x1b\xf4\xfd\x51\x3a\
+\x87\xb9\x17\x9b\x58\x53\x89\x44\x95\x04\x54\x89\xf8\xc2\x40\xea\
+\x61\x38\x3d\x7b\xf7\x98\xf4\x29\xa5\xc8\xe5\xb2\x78\xe6\xd1\x7b\
+\xf0\xb1\x0f\x3c\x80\xfe\xde\x2e\xd8\xd4\x86\x47\x25\xce\xa0\x52\
+\xb5\xfd\x12\x5f\x55\x22\x11\x25\x01\x55\x22\x00\xb8\xe9\x30\x1f\
+\x85\x33\x46\xea\xb0\x49\xdf\xb6\x29\x06\xfa\x7b\xf1\xd1\x0f\x3c\
+\x84\xf7\x3d\x72\x07\xf2\xb9\x0c\x33\x1d\x26\xa0\x12\x67\x50\x49\
+\xd6\x55\x02\xa9\x44\xa2\x49\x02\xaa\x44\x3c\x48\x75\xc3\x19\x65\
+\xfe\x0f\xe1\x8c\x3a\xd7\x8a\x6d\x53\x4c\x4e\x8c\xe0\xa7\x3f\xfa\
+\x04\xee\xbf\xf3\x66\xa4\x52\x04\xb6\x4d\x41\xe4\xae\x3d\x18\x81\
+\x95\x48\x22\x11\x25\x01\xd5\x7b\x58\x98\xa6\xde\x30\x80\xdf\x04\
+\xf0\xcb\x88\x30\x1d\xe6\xc6\x1b\xf6\xe3\xe7\x3f\xf6\x14\x8e\xdf\
+\x7c\x10\x00\xf5\x57\x3f\xf0\x3e\x23\x03\x2b\x91\x44\x22\x4a\x02\
+\xaa\xf7\xa8\x30\x90\xba\x0e\x4e\x53\xef\xe3\x88\xf0\x3c\xdc\x79\
+\xe2\x66\xfc\xec\x4f\x3c\x81\xeb\xf6\x8d\xf1\x2b\x1f\xb0\xce\x72\
+\xea\xc0\xaa\xd1\xa0\xb0\x29\x45\x26\x6d\x41\x05\xac\xc4\x45\x95\
+\x48\x54\x49\x40\xf5\x1e\x14\x06\x52\x77\xc2\x71\x9a\x3f\x0a\x83\
+\x91\x43\x29\x45\x3a\x9d\xc6\x23\xf7\x9d\xc4\x4f\x7e\xe8\x11\x8c\
+\x0e\xf5\xf1\x3d\x7b\x00\xe7\x2c\x27\x00\x2a\xd5\x06\xa6\x16\x0b\
+\xe8\xef\xc9\x61\x6c\x20\xcf\xf0\x28\x21\x53\x22\xf1\x25\x01\xd5\
+\x7b\x4c\x98\x85\xee\x9e\x81\x33\xfc\xe0\x36\x93\x3e\xa5\x14\xdd\
+\x5d\x79\xbc\xff\xc9\xd3\xf8\xd0\x53\xf7\xa2\xa7\x3b\xc7\x8d\x34\
+\x57\xf5\xec\x6d\x96\x6b\xb8\x3c\xbf\x81\x8d\x62\x0d\x7d\xdd\x59\
+\x0d\x9a\xa8\xf7\x7f\x22\x89\x84\x4a\x02\xaa\xf7\x90\xb8\x90\xca\
+\xc2\x59\xcf\xfc\xb7\xe1\xac\x6f\xae\x15\x9b\x52\x0c\x0f\xf6\xe3\
+\xe3\x1f\x7c\x14\x8f\xdd\x77\x1c\xd9\x4c\x9a\x19\x69\xee\xe0\x89\
+\x80\x6f\xd4\xad\x15\x2a\xb8\x3c\xb7\x8e\x62\xa5\x0e\xcb\x0a\x8c\
+\x34\xae\x95\x98\x38\xa8\x12\x89\x29\x09\xa8\xde\x03\xc2\x34\xf5\
+\xfa\xe0\xec\x0c\xf3\x77\xe1\x4c\x8d\xd1\x0a\xa5\x14\x07\xf6\x8e\
+\xe3\xa7\x3f\xfa\x24\xee\xba\xed\x30\x2c\x66\x3a\x0c\xdb\x75\xe7\
+\xad\x84\x40\x29\xb0\xb0\x5e\xc4\xd5\x85\x02\xaa\xb5\x86\x1f\xa6\
+\x9a\x7d\xcc\xce\x4f\x4e\x24\x91\x28\x92\x80\xea\x1a\x17\x06\x52\
+\x93\x00\xfe\x29\x80\xbf\x8c\x08\xd3\x61\x6e\x39\x72\x3d\x7e\xe6\
+\x27\x9e\xc0\xcd\x37\xec\x75\xa6\xc3\x40\x37\x78\x93\xa2\x61\x53\
+\xcc\x2e\x17\x31\xb3\x54\x40\xbd\xe1\x0c\x53\xf0\x54\xa8\x32\x0d\
+\xe0\xae\xf7\x92\x48\x22\x91\x24\x01\xd5\x35\x2c\x0c\xa4\x6e\x06\
+\xf0\xaf\x00\xfc\x18\x80\x94\x4e\x9f\x52\x20\x95\x22\xb8\xe7\x8e\
+\x63\xf8\xe4\x8f\x3f\x86\x7d\x13\x43\xc1\xf2\x2c\x90\xc7\x42\x11\
+\x02\x54\xeb\x36\xa6\x16\x36\x30\xbf\x5a\x02\x37\xde\x13\x00\x25\
+\x7c\xba\x04\x4c\x89\x34\x2b\x09\xa8\xae\x51\x61\x20\xf5\x00\x9c\
+\x9e\xbd\xd3\x26\x7d\x4a\x29\xb2\xd9\x2c\x9e\x78\xe8\x2e\x7c\xf4\
+\xfd\x0f\x60\xa8\xaf\xdb\x5f\xe8\x4e\xd2\x85\x13\x5c\xac\xd4\x71\
+\x79\x6e\x03\xab\x85\xb2\x14\x0f\x10\x10\xa6\xd9\xa7\x1a\x3f\x95\
+\x2c\x48\x9c\x48\x54\x49\x40\x75\x0d\x8a\x0b\xa9\x14\x80\x0f\x03\
+\xf8\x97\x00\x6e\x32\xe9\x53\x4a\xd1\xd7\xdb\x83\x0f\x3e\x73\x3f\
+\xde\xf7\xc8\x5d\xe8\x62\x16\xba\x23\x9a\xf5\x59\xd6\x8b\x55\x5c\
+\x9e\x5b\xc7\x46\xa9\xc6\x45\x13\xa6\x49\x48\xdd\x7f\x59\x1c\x25\
+\x68\x4a\xa4\x19\x49\x40\x75\x8d\x89\x0b\xa9\x3c\x80\x5f\x04\xf0\
+\x8f\x01\x8c\x9b\xf4\x29\xa5\x18\x1b\x1d\xc6\x4f\x7e\xf8\x51\x3c\
+\x70\xd7\x51\xa4\xd3\x29\x50\x71\x62\xb1\x60\x0e\x2d\xaf\x97\x70\
+\x79\x6e\x03\xa5\x6a\x83\xf3\x47\x39\xf9\xb9\xaa\x02\xdc\x04\x2f\
+\x57\x32\x32\x3d\x91\x58\x92\x80\xea\x1a\x11\xa6\xa9\x37\x04\xe0\
+\x37\x00\xfc\x4d\x38\xdb\x59\x69\x85\x52\x8a\xeb\x0f\xed\xc3\x27\
+\x3f\xf2\x38\x4e\x1c\x3d\xc4\x2d\x74\xc7\x36\xd6\x3c\xc4\xd8\x36\
+\xc5\xdc\x4a\x11\x53\x0b\x1b\xa8\x35\x6c\xd7\x57\xe5\x02\x8d\x19\
+\xec\xe9\xe4\xcd\xe4\x22\xe5\xe9\x76\x06\x26\xe3\xa8\x12\x89\x28\
+\x09\xa8\xae\x01\x61\x20\x75\x10\xc0\xef\x02\xf8\x29\x00\x99\xb0\
+\x74\x27\x8f\xdf\x84\x4f\xfe\xf8\xe3\xb8\xfe\xc0\x78\xb0\xd0\x1d\
+\x54\x73\xf5\x08\x6a\x0d\x1b\x53\x8b\x05\xcc\x2d\x6f\xa2\x61\xb3\
+\x3d\x7b\xbc\xe7\x9c\x32\x69\xb9\x09\xc8\xca\x95\x13\x12\x52\x25\
+\x12\x4d\x12\x50\xed\x72\x61\x20\x75\x12\x8e\xd3\xfc\x09\x44\x98\
+\x0e\xf3\xc0\xa9\xdb\xf0\xf1\x1f\x7b\x18\xe3\x23\xfd\xd2\x6e\xc5\
+\xde\x5c\x3d\xb8\x19\x95\xab\x75\x5c\x9e\x5f\xc7\xd2\x5a\x59\xea\
+\xc1\x0b\x2c\x29\xd6\x84\xe2\xa1\xc5\xe5\xee\x1f\x24\x8d\xbf\x44\
+\xa2\x4b\x02\xaa\x5d\x2c\xcc\x74\x98\x27\xe0\x40\xea\xa4\x49\x9f\
+\x52\x8a\xae\xae\x3c\x9e\x79\xf4\x14\x7e\xec\xa9\x53\xe8\xef\xe9\
+\xd2\x6e\xa9\xee\xc1\x6a\xa3\x54\xc3\xa5\xd9\x75\xac\x6d\x56\x02\
+\xb4\x10\xc2\x01\xcb\x1f\x2f\xa5\x80\x96\xdc\xe8\xf3\x74\x12\x63\
+\x2a\x91\xe8\x92\x80\x6a\x97\x8a\x0b\xa9\x0c\x9c\x66\xde\xef\xc2\
+\x69\xf6\x69\x85\x52\x8a\xc1\xc1\x7e\x7c\xe4\xd9\x87\xf0\xd8\x7d\
+\x27\x90\xcb\xa5\xe5\x89\xc5\x82\x2c\x6f\x94\x71\x69\x76\x1d\xc5\
+\x72\xdd\x6f\xea\x01\x00\x11\xda\x88\x41\xb8\x5b\x16\x07\x2c\xed\
+\x4c\xbf\x44\x12\x89\x2c\x09\xa8\x76\xa1\xb8\x90\xea\x05\xf0\x37\
+\xe0\x38\xce\x87\x4c\xfa\x94\x52\xec\xdd\x33\x86\x9f\xfc\xf0\xe3\
+\xb8\xe7\xc4\x61\xa4\x2c\x0b\xd4\x0e\xa6\xc3\x88\xee\x23\x4a\x29\
+\xe6\x57\x4b\xb8\x32\xbf\x81\x8a\xd7\xb3\xc7\x34\x07\xc3\x80\xc5\
+\x59\x59\x5c\x84\x58\xb1\xed\xbe\x92\x89\xec\x16\x49\x40\xb5\xcb\
+\xc4\x85\xd4\x38\x9c\xa1\x07\xbf\x08\x67\x28\x82\x51\x6e\xbe\xe9\
+\x10\x7e\xea\xc7\x1f\xc7\xd1\x1b\xf6\x81\x80\x32\xcd\x3d\x61\x6c\
+\x01\x80\x86\x4d\x31\xbd\x58\xc0\xd4\x62\x01\x0d\xdb\x06\x61\x3c\
+\xeb\xa2\xb3\x5d\x02\x16\x13\xe9\x6f\xe0\xa0\x75\xa6\x27\x92\x48\
+\x74\x49\x40\xb5\x4b\x84\x71\x9a\xdf\x04\x67\x10\xe7\x87\x11\x3a\
+\x1d\xc6\xc2\x5d\x27\x8f\xe2\x13\x1f\x7a\x04\xfb\x27\x87\xfd\x39\
+\x7b\x80\xb0\xde\x26\x25\x20\x04\xa8\xd4\x1a\xb8\x32\xbf\x81\xf9\
+\x95\xa2\xbf\x94\x0b\x25\xfe\x06\xec\x5c\xde\x80\x0c\x2c\x40\x84\
+\x56\x10\x2f\x5a\x5b\x62\xba\x44\x12\x31\x49\x02\xaa\x5d\x20\x0c\
+\xa4\x4e\xc3\x71\x9a\x3f\x60\xd2\xf7\x76\x87\x79\xe4\xbe\x3b\xf0\
+\xe3\xef\xbb\x0f\xc3\x03\xbd\x4e\x53\x4f\xd8\xb2\x8a\xb1\x95\xb0\
+\x59\xae\xe3\xe2\xec\x3a\x56\x36\xca\xbc\x0e\x75\x60\x05\x40\x0b\
+\x2c\x40\x07\x2d\x31\x84\xd5\x49\x86\x26\x24\x12\x5d\x12\x50\xed\
+\x70\x71\x21\x65\x01\xf8\x20\x1c\x4b\xea\xa8\x49\x9f\x52\x8a\xde\
+\xde\x6e\xbc\xff\xc9\xfb\xf0\xcc\xc3\x77\xa2\xbb\x2b\xeb\x8e\x34\
+\x87\xe3\xe5\x56\x6c\x08\xba\xbe\x59\xc1\x85\x99\x75\x14\x4a\x55\
+\xf8\x38\x62\xc1\xe3\xfb\x9c\x28\xd3\xb3\x17\x05\x5a\x34\x80\x92\
+\x24\x44\x1b\x93\x48\x22\xa2\x24\xa0\xda\xc1\xe2\x42\x2a\x07\xe0\
+\x17\x00\xfc\x13\x38\x4b\xb5\x68\xc5\x99\x0e\x33\x84\x8f\x7e\xe0\
+\x11\xdc\x7f\xd7\x51\x64\x33\x29\xdf\x1f\xe5\x63\x81\x19\x42\x4e\
+\x01\x2c\xad\x96\x70\x71\x76\x1d\xe5\x6a\xdd\x05\x8c\x3b\xd9\x45\
+\x18\x6a\x2e\xf7\xec\xa9\xad\x2c\xa7\x1e\xec\x01\x34\x34\xa2\xa6\
+\xc8\x44\x12\xe1\x24\x01\xd5\x0e\x15\x17\x52\x83\x70\x16\xb9\xfb\
+\x55\x38\xbd\x7c\x5a\xa1\x94\xe2\xba\x83\x7b\xf1\x89\x0f\x3d\x86\
+\x93\xb7\x1c\xe2\x17\xba\x83\x3c\x21\xc6\xb6\x29\x66\x96\x36\x71\
+\x65\x3e\x98\x0e\xc3\xf7\xec\x79\x93\x92\xa3\x01\xcb\x51\x11\xa1\
+\x15\x0c\x50\x90\x2c\x2e\x4a\x92\xcd\x1d\x12\x89\x2c\x09\xa8\x76\
+\xa0\xb8\x90\xda\x0f\xe0\x77\x00\x7c\x12\xce\xf2\xc1\x5a\x21\x00\
+\x6e\xbb\xf5\x26\x7c\xfc\x83\x8f\xe0\xf0\xc1\x09\x84\x2d\xa0\x52\
+\xab\x37\x70\x65\x61\x03\x33\x4b\x45\x69\x3f\x3e\xd9\x51\x6e\x06\
+\x16\xe7\x1c\x27\x9c\x87\x4a\xbb\x69\x3b\x15\x56\xd5\x4b\x3a\x02\
+\x13\x09\x93\x04\x54\x3b\x48\x18\xa7\xf9\x6d\x00\xfe\x0d\x80\xa7\
+\xe0\xf8\xa7\x94\x42\x29\x45\x26\x93\xc6\xe9\xbb\x8e\xe3\x23\xef\
+\x7f\x10\x93\xa3\x03\x9c\x15\x25\xae\x60\x40\x00\x94\xaa\x0d\x5c\
+\x9c\x5d\xc3\xe2\x6a\x29\x58\x85\xd3\x85\x50\x2c\x60\x79\x19\x42\
+\x0d\x2d\x80\x72\xf3\xfe\x12\x49\xa4\x15\x49\x40\xb5\x43\x84\x99\
+\x0e\xf3\x18\x1c\x48\xdd\x69\xd2\xf7\x76\x87\x79\xe2\xe1\xbb\xf1\
+\xfe\x27\x4e\x61\xa0\xb7\xcb\x38\x67\x0f\x00\xd6\x8b\x35\x9c\x9f\
+\x5e\x73\xa6\xc3\x30\x90\xf1\x2c\x1f\xea\x0e\x53\x10\xf3\x00\x64\
+\x60\x01\x21\xd0\x02\xb8\x85\xf3\x12\x49\xa4\x15\x49\x40\xb5\x03\
+\xc4\x85\x54\x1a\xc0\x27\x00\xfc\x73\x38\x9b\x82\x6a\xc5\x9b\x0e\
+\xf3\xc1\xa7\x1f\xc0\xa3\xa7\x8f\x23\x9f\xcf\x18\xe7\xec\x01\xce\
+\x74\x98\x0b\x33\x6b\xd8\x2c\xd7\x9c\x46\x99\x6a\xa4\xb9\xbf\xeb\
+\xb1\xde\xc2\x62\xc3\xa3\x40\x4b\xe5\x32\x4f\xc6\x51\x25\x12\x57\
+\x12\x50\x6d\xb3\xb8\x90\xea\x01\xf0\x4b\x70\xb6\x55\x1f\x36\xe9\
+\x7b\xd3\x61\x7e\xe2\x03\x8f\xe0\xee\xdb\x6e\x44\x3a\x4d\xb8\x31\
+\x52\xf2\xb0\x01\x67\xe3\x85\x4b\x73\xeb\xce\xee\x30\xc6\xe6\x9d\
+\x97\x47\x60\x61\xb1\xf1\x62\x3a\x3e\x2d\x13\x48\x85\x9a\x88\xbb\
+\xd0\xa8\x83\x13\x49\x44\x2b\x09\xa8\xb6\x51\x5c\x48\x8d\x01\xf8\
+\x07\x00\xfe\x1a\x80\xee\xb0\x34\x37\xdf\x78\x08\x1f\xfb\xe0\x23\
+\x38\x7a\x78\x5f\xb0\x25\x15\xc0\x0c\x32\x0f\x46\x92\xd7\x1b\x36\
+\xae\x2e\x14\x70\x75\x61\xc3\x59\x43\x0a\x5e\x73\x50\x18\x9f\xde\
+\x24\xb0\xd8\xb4\x72\x3c\x75\xf6\xfe\xd3\xee\x8d\x95\x60\x2a\x91\
+\xe8\x92\x80\x6a\x1b\x84\x71\x9a\x1f\x06\xf0\x2f\x00\x7c\x04\x86\
+\x7b\x41\x29\x45\x2a\x95\xc2\x9d\x27\x6e\xc6\x47\x3e\xf0\x10\x0e\
+\xee\x19\xd1\x36\xf5\xbc\xe1\xe4\x95\x5a\x03\x17\x67\x36\x30\xb7\
+\xb2\xe9\xf7\xb2\x05\xce\x73\x47\x35\x2a\xb0\xbc\xed\x46\x75\xcd\
+\xc2\xa0\x9e\xfc\x71\xd0\xb1\xa7\x19\xf0\x99\x0c\x4e\x4f\x24\xa2\
+\x24\xa0\xda\x62\x61\x20\x75\x0a\xce\x74\x98\x87\x4c\xfa\xde\x74\
+\x98\x87\x4e\xdf\x8e\x1f\x7b\xea\x34\x46\x87\x7a\x99\xdd\x8a\x1d\
+\x11\x99\x51\x28\x39\x4e\xf3\x65\x77\x3a\x0c\x61\x96\x48\x60\x47\
+\x19\x84\x01\xcb\x89\x83\x50\x16\x65\x74\xf4\xd0\x62\xd3\x50\xa8\
+\xea\x9a\x78\xda\x13\x89\x2e\x09\xa8\xb6\x50\x98\xe9\x30\xef\x87\
+\xb3\xcf\xde\x31\x93\xbe\xb7\x3b\xcc\x33\x8f\xdf\x8b\x27\x1f\xbc\
+\x03\xbd\xdd\x39\x69\xce\x1e\xc0\xcf\xdb\x5b\x29\x54\xf0\xee\xd4\
+\x1a\x0a\xa5\x2a\x37\xbe\x89\x08\xdd\x72\x2a\x60\x01\xec\x98\xaa\
+\x30\x2b\x4b\x0d\x2d\x4f\x57\xec\x71\x64\xeb\xca\xa7\x4e\x24\x91\
+\x70\x49\x40\xb5\x45\xc2\x4c\x87\xf9\x39\x00\xff\x0c\xc0\x5e\x93\
+\xbe\x37\x1d\xe6\xc3\xcf\x3e\x84\xd3\x77\xdc\x8c\x5c\x36\x1d\x34\
+\xf7\x14\xa6\x94\x4d\x81\x85\xd5\x22\x2e\xcc\xac\xa1\x54\x69\x08\
+\x0b\xdd\x29\xa6\xbc\x28\x80\xe5\x94\xeb\x1e\xc7\xb0\xb2\xbc\x23\
+\x69\x63\x07\xca\x6c\xeb\x9e\x48\x22\x2d\x48\x02\xaa\x2d\x10\x17\
+\x52\x03\x00\xfe\xb6\xfb\xd7\x6f\xd2\xf7\xa6\xc3\x7c\xf4\x03\x8f\
+\xe0\xb6\xa3\x07\x91\xb6\x88\x0b\x29\xb7\xa9\xe5\x2b\x3a\x07\x0d\
+\x9b\x62\x6a\xa1\x80\xcb\x73\xeb\xa8\x37\xf8\x35\xa4\x3c\x35\x7f\
+\x62\x71\x4c\x60\x99\xac\x2c\x40\x18\xc2\x20\x9c\x07\xbf\x94\x8c\
+\xb8\x41\x60\xe2\xa0\x4a\x24\xba\x24\xa0\xea\xb0\xb8\x90\xda\x0b\
+\xe0\xb7\x00\xfc\x2c\x1c\xab\x4a\x29\x94\x02\x96\x45\x70\xfc\x96\
+\xc3\xf8\xe8\x07\x1e\xc6\x0d\x07\xc6\x39\xcb\x28\x70\x4d\x3b\x98\
+\x21\x00\x2a\x35\x1b\x97\x66\xd7\x30\xbd\xb4\x19\xac\x21\xe5\x4d\
+\x44\x6e\x06\x58\x00\x33\xd4\x21\xa8\x97\x17\x6b\x82\x96\x53\x26\
+\x5f\x9e\xf3\xc7\xaf\xa2\x10\xe0\x36\x12\xac\x12\x9c\x25\x92\x80\
+\xaa\x53\xc2\x38\xcd\x6f\x85\xe3\x8f\x7a\x16\x11\xa6\xc3\xdc\x7b\
+\xd7\xad\xf8\xd0\xd3\x0f\x60\x62\x6c\x80\xdf\xf8\x4e\xb1\x85\xd5\
+\x66\xa5\x8e\xf3\xd3\x6b\x58\x58\x2d\x06\x31\x84\x05\x4c\x04\x60\
+\xa9\x96\x6e\xd1\x58\x59\x4e\x9e\x41\x2e\x7c\xb6\x6a\x70\x29\xcf\
+\xd5\xfd\x57\x70\x6d\xa9\x24\x07\xe0\x38\x80\xe1\xc9\xd3\x9f\x8a\
+\x3a\x21\xa7\xd5\x89\x3b\xcd\xa4\x6f\xc7\x64\xa1\xb8\x79\x88\xfa\
+\xb4\x0d\x79\x00\x40\x05\xc0\x55\x00\x2b\x00\x1a\xb3\xcf\xfd\x7e\
+\x1b\x4e\xad\x75\x49\x40\xd5\x01\x61\xa6\xc3\x3c\x0c\x67\x3a\xcc\
+\x3d\x26\x7d\x4a\x29\xba\xbb\xf3\x78\xec\xc1\xbb\xf0\xcc\x23\x77\
+\x63\xb0\xbf\x5b\xee\xd9\x13\x1e\xc3\xd5\xcd\x0a\xde\x9d\x5a\xc5\
+\xda\x66\x15\x00\xdf\x1c\x94\x9b\x71\x06\x60\x79\x79\x23\x9e\x95\
+\xe5\xe4\x1b\x7c\x27\x44\x43\x28\x2d\xb8\x48\x48\x3c\x00\x60\x1f\
+\x80\xff\x06\xa0\xd1\xca\xfd\x88\x29\xbb\x61\x86\x62\x27\xeb\x68\
+\x03\xb8\x04\xe0\xcb\x00\xfe\xdf\xc9\xd3\x9f\x5a\xde\x09\xb0\x4a\
+\x40\xd5\x66\x61\xa6\xc3\xfc\x04\x9c\xe9\x30\x87\x4d\xfa\x94\x52\
+\x0c\x0d\xf6\xe3\xfd\x4f\xdd\x8f\x07\x4f\xdd\x8a\x9e\x7c\x56\x39\
+\x46\xca\x5b\x6d\x13\x00\x16\xd6\x4a\x78\x77\x7a\x15\xc5\x92\xbb\
+\x86\x14\x21\xfc\xcf\xa9\xd6\xef\x14\x0f\x58\x4e\x5a\x3d\xb4\xf8\
+\xbc\xe5\x73\x6b\xc3\xdb\x94\x02\x30\xd2\x7a\x36\x89\xc4\x94\x71\
+\x00\xb7\xc3\x59\xb5\xe3\xb7\x27\x4f\x7f\xaa\xb2\xdd\xb0\x4a\x40\
+\xd5\x46\x71\x21\xd5\x0d\xe0\xaf\xc3\x19\x6d\x3e\x6a\xd2\xa7\x94\
+\x62\xdf\x9e\x71\x7c\xf8\xd9\x87\x70\xc7\xf1\xc3\xc8\xa6\x2d\xdf\
+\xcf\xa4\x92\x06\xa5\x98\x59\xdc\xc4\xc5\xd9\x75\x54\x6a\x41\xcf\
+\x9e\xb7\x4e\x39\x25\x0a\x67\x3b\xe2\x03\x4b\xb7\x74\x0b\x51\x58\
+\x41\xaa\x15\x12\xd8\xb9\x7c\xde\x5a\x54\xf2\x7a\x54\x52\x56\x89\
+\xec\x2c\xc9\xc0\x99\x2d\xf1\x39\x00\x3f\xdc\xee\xca\x24\xa0\x6a\
+\x93\xb8\x90\x1a\x05\xf0\xf7\x01\x7c\x0a\xce\xfc\x3d\xa3\xdc\x7c\
+\xe3\x21\xfc\xf8\xfb\x1f\xc2\xcd\x37\xec\x73\x17\xba\x73\xc2\x85\
+\x15\x83\x41\x00\xd4\x1a\x36\x2e\xcd\xad\xe3\xea\x7c\xc1\x9f\x0e\
+\xe3\x99\x51\x81\x45\xd4\x1e\x60\x31\x49\x40\x38\x28\x99\xa1\x15\
+\xe8\x31\xe5\xa8\xe2\xbd\x7a\x53\x75\xd9\x89\xec\x18\x19\x86\xd3\
+\x22\x48\x40\xb5\xdb\x85\x71\x9a\x5f\x0f\xa7\xa9\xf7\x31\x38\xbf\
+\x46\x4a\xf1\xa6\xc3\xdc\x71\xe2\x66\x7c\xe8\x99\x07\x70\x60\xcf\
+\xb0\x30\x5a\x1b\xce\xea\x97\x6e\xa0\x45\x80\x52\xa5\x81\xf3\xd3\
+\xab\x98\x75\xa7\xc3\x38\x06\x89\x0b\x23\xc6\xd9\x1e\x17\x58\x5e\
+\x1c\xbf\x86\x95\xc6\xca\x72\x0f\x02\x6b\x89\x0a\x4d\x40\x79\x9c\
+\x42\x14\x6b\x29\x9d\xcd\x03\xc4\x8a\xa8\x9d\xc8\x36\x48\xe8\xfc\
+\xd3\xad\x90\x04\x54\x2d\x08\x03\xa9\xbb\x01\xfc\x6b\x00\x8f\xc2\
+\xe0\x9a\xa1\x94\x22\x9f\xcb\xe2\x81\xd3\x27\xf1\xbe\xc7\x4e\x61\
+\x74\xa8\x0f\xec\xba\x03\x1c\xb0\xdc\xb5\xa1\xd6\x37\xab\x38\x37\
+\xb5\x8a\xe5\x75\x66\x77\x18\xc2\x8c\x0a\x67\x81\xa5\xd9\x6f\x4f\
+\x07\x2c\x2f\x2f\x36\xce\x04\x2d\x21\xa9\x11\x5c\x5e\x9e\x34\x04\
+\x40\xb9\xde\x01\xe4\x7a\xfa\x51\x2d\xac\xea\xe7\xe2\x24\xf2\x9e\
+\x97\x04\x54\x4d\x0a\xd3\xb3\xf7\x3e\x38\x90\x3a\x6e\xd2\xa7\x94\
+\xa2\xbf\xaf\x07\x4f\x3d\x7a\x0a\x8f\xdc\x77\x12\x7d\x3d\x79\x50\
+\x4a\xa5\x71\x47\x2c\xac\x96\xd6\xca\x78\x67\x6a\x15\x85\x62\x0d\
+\x20\xd0\xf4\xec\x31\xc0\xf2\x58\x11\x15\x58\x8c\x92\x7a\xfc\x94\
+\x19\x5a\x6c\x19\xde\x01\x51\xc4\x39\xa3\x2c\x78\x60\x79\x96\x1c\
+\x49\x67\xd1\x37\x71\x08\xeb\x14\xa8\x95\x0b\xb0\x1b\x0d\xa8\xad\
+\xab\x04\x62\xed\x16\xef\x8a\xee\x86\xdf\x87\x04\x54\x4d\x88\x0b\
+\xa9\x2c\x80\x9f\x81\x33\x90\x73\xbf\x49\x9f\x52\x8a\xf1\xb1\x61\
+\xfc\xd8\xd3\x0f\xe0\x9e\x93\x47\x90\xcf\x05\xd3\x61\xc4\x39\x71\
+\x9e\xf3\x79\x76\x79\x13\xe7\xa7\x57\x51\xaa\x34\x60\xb9\x5e\x73\
+\x95\xef\x27\x0e\xb0\xe0\x0d\x08\x05\xfc\x42\x95\xd0\x52\xf6\xea\
+\x09\xa0\x89\x00\xae\x60\x1e\xa1\x3c\xb0\x93\x82\x22\x9b\x49\xe1\
+\xd6\xeb\x46\x70\x70\xbc\x0f\xd4\xbe\x1e\xb5\xf2\x26\xea\x95\x92\
+\xb2\xd7\x53\xfb\x2e\x91\x48\x5a\xd7\x86\x28\xc6\xd4\x29\x7b\x5b\
+\x09\x37\xa1\xc9\x98\xe5\xd2\xf2\x3a\xce\x9c\x39\x8b\x4a\xa5\xba\
+\xdd\x67\x67\x94\x04\x54\x31\xc5\x85\x54\x3f\x9c\x9d\x61\xfe\x0e\
+\x9c\xa9\x31\x5a\xa1\x94\xe2\xfa\x43\x7b\xf1\xa1\xf7\x3d\x84\x5b\
+\x8f\x1c\x44\x26\x65\x49\x0f\x17\x3b\xf1\xb7\x61\x53\x5c\x9e\xdb\
+\xc0\xa5\x59\x6f\x3a\x4c\x60\x8d\x78\xab\x68\x52\x02\x83\xa3\x5c\
+\x01\x2c\x27\x82\x55\x97\xac\x2c\x46\x85\x6f\x1a\x72\x11\xf1\xc0\
+\x65\x7a\x45\x28\x05\x7a\xbb\x32\x78\xea\xee\x43\x10\x32\x52\xe2\
+\xa6\x9d\x36\x56\x2c\x6f\x58\xa4\xe1\x61\x66\xa5\xa8\xe5\x51\x49\
+\x99\x2a\xbe\x31\xb1\x34\x42\x7e\x9a\xd1\xff\x5e\xd0\xd9\x77\xa7\
+\x71\xe9\xe2\x25\x94\xcb\x95\x1d\xdd\xb1\x91\x80\x2a\xa2\x30\xfe\
+\xa8\x49\x38\x93\x8a\x7f\x1e\x40\x5e\xa7\xef\x4d\x87\xb9\xed\xd8\
+\x61\x7c\xf0\x99\x07\x71\xfd\x81\x71\x10\xa2\x5f\x31\x80\x10\xa0\
+\x52\x6d\xe0\xc2\xcc\x1a\xa6\x17\x9d\xe9\x30\x5e\x3e\xaa\x0d\x16\
+\xa4\x51\xe3\x26\x60\x81\x77\xba\x33\xea\xbe\x95\xe5\xa4\x55\x40\
+\x8b\x53\x56\x5b\x5b\x4e\x36\x0a\x2b\x28\xe4\xb9\x27\x00\x52\xd6\
+\xd6\xbe\x1c\xb1\x86\x6f\x6b\x94\x83\x60\x1a\x29\x6d\x14\x50\x89\
+\xcd\xfe\xb0\x6a\xe8\x56\xa7\x60\x53\x13\x0f\x52\xda\xd5\x36\x08\
+\x2c\x8b\x24\x4d\xbf\x6b\x45\x18\x48\x1d\x85\x33\x1d\xe6\x03\x70\
+\x06\x23\x2a\x85\x52\x8a\x6c\x26\x8d\x53\x77\xdd\x8a\x67\x9f\x38\
+\x8d\xc9\x51\xcf\xe8\xa2\x01\x38\x18\x7d\x42\x80\xcd\x52\x0d\xef\
+\x5c\x5d\xf5\xa7\xc3\xb0\xbf\x6e\xaa\x0d\x16\x58\xeb\x8a\xcb\x2f\
+\x2a\xb0\x98\x44\xa2\x95\xe5\xa4\x8f\x00\x2d\x29\x52\x1e\xb9\xee\
+\xcd\xf3\xd3\x02\xba\x0d\xf7\xa7\x2d\xfd\x85\x34\x6a\x54\xb8\x62\
+\x2c\x0b\x4a\xfd\x45\x9b\x4f\x64\x2b\x4a\x91\x81\x6a\x18\xf1\x6e\
+\xe9\x6b\x4d\x40\x15\x22\x8c\xd3\xfc\x41\x38\xd3\x61\xee\x35\xe9\
+\x53\x4a\xd1\xd3\x9d\xc7\xa3\x0f\xdc\x85\xc7\x1f\xba\x13\x83\x7d\
+\x5d\x4c\x24\x7c\x52\x30\x2b\x44\x61\x65\xa3\x82\xb7\xaf\xac\x38\
+\xbb\xc3\x30\xf9\x00\x7a\x60\xa9\x9a\x83\x5e\x45\xfd\xb2\xa0\x02\
+\x56\xa0\xa5\xb5\xb2\xdc\xc2\x54\x96\x16\x57\x86\x94\x48\x3f\xdd\
+\x46\x7b\xbd\x5a\xbb\x3d\xcd\x49\xa4\x97\x3d\x46\x0d\x77\x0c\xa0\
+\xdc\x6f\xd4\x14\x1f\xfd\xb4\x76\x92\x24\xa0\x32\x88\x0b\xa9\x14\
+\x9c\xa5\x82\x7f\x0f\xc0\x4d\x26\x7d\x4a\x29\x86\x87\xfa\xf1\xbe\
+\xc7\xef\xc3\xe9\xbb\x8f\xa1\x3b\x9f\x91\x2d\x6f\x66\x24\x25\x05\
+\x30\xbf\x52\xc2\xb9\x2b\x2b\xd8\xac\xd4\xf9\x35\xa4\x98\x3c\xa5\
+\xb1\x4d\xcd\x00\x8b\x09\x14\xad\x2c\x95\x2f\x8b\xad\x2a\x84\xd1\
+\xf2\x46\x70\x89\x65\x52\xe6\x4f\x9b\xa0\xcd\x12\xf3\x25\xa4\xcd\
+\x64\xd0\xc4\xc8\xfa\x4e\x00\x2a\x48\x17\xd5\x8a\x12\x02\x77\x09\
+\xb0\x12\x50\x69\x84\x99\x0e\xf3\x57\x00\xfc\x63\x38\x9b\x30\x68\
+\x85\x52\x8a\xfd\x7b\xc7\xf1\x81\xa7\x1f\xc0\xc9\x63\x37\x20\x9b\
+\x09\x5a\x86\x8a\xce\x1a\xd8\x0d\x8a\xab\x8b\x05\x5c\x98\x5e\x43\
+\xa5\xde\x08\x96\x0b\x26\x72\x1a\xed\x94\x17\x13\xb0\x98\x02\xf5\
+\x03\x3e\xd9\xbe\x21\x05\xb4\x98\xc4\x3a\x6b\x2b\x28\x4b\xa6\x0f\
+\xdf\x78\x14\xdb\x8c\x0a\x89\x0b\xb0\x16\x5e\xb2\xd8\x56\x93\xa0\
+\x1a\xb7\xe8\xed\x80\x54\xc8\x49\xef\x16\x46\x01\x48\x40\xa5\x14\
+\x17\x52\xc3\x00\xfe\x6f\x00\xbf\x0c\xa0\x37\x2c\xcd\xd1\x9b\x0e\
+\xe1\xc7\x9e\x79\x10\x37\x5e\xb7\x17\x69\x8b\x28\xe9\x44\xe1\xbc\
+\xcf\xb5\x9a\x8d\x0b\x33\x6b\xb8\x32\xef\xee\x0e\xe3\x8e\x37\xa0\
+\x20\xca\xe6\x58\xe8\x1c\x3d\x05\xb0\x80\x70\x2b\x8b\x8d\x53\x42\
+\x0b\x6a\x9f\x96\x90\x85\x5f\x09\xd5\xba\x23\x0d\x9b\xa2\xde\xb0\
+\xf5\x9b\x51\x74\x50\x68\x13\x31\x2a\x95\xa6\xa1\xe4\x1e\x28\xfb\
+\xee\x42\xd8\x12\xcb\x17\xa5\xc8\x88\x3d\x4c\x59\xc4\x19\xe2\xd2\
+\xe4\xf9\xec\x04\x49\x40\xc5\x08\xe3\x34\x3f\x04\xe0\x77\x01\xfc\
+\x24\x42\xa6\xc3\xa4\xd3\x29\xdc\x71\xdb\xcd\x78\xf6\xc9\xfb\xb0\
+\x7f\x72\x24\x98\x28\xec\x2b\x05\x07\x84\x00\xc5\x72\x1d\xe7\xae\
+\xae\x62\x6e\x79\x93\x1b\x10\xe9\xc4\x33\xce\x76\x06\x58\xaa\xe6\
+\xa0\xa3\xaf\x07\x96\x53\xb4\xba\x59\xc8\xe6\x15\x0e\x2d\x46\x9b\
+\x2a\x8c\x9e\x10\x78\x5d\x5d\xd8\xe0\xd6\xcb\xd2\x4b\xb3\x6b\xa8\
+\x47\x23\x4a\x68\xde\x5a\xbf\x8e\xa6\x61\x18\x36\x6c\x81\xf9\xa2\
+\xf2\x0f\x29\x73\x55\x84\xab\x0d\x30\xb5\x13\x9c\x0a\xca\xde\x98\
+\xbc\x7d\xa3\xbd\xd8\x37\xda\x1b\xed\x3a\xec\x50\x49\x40\xe5\x0a\
+\x03\xa9\x3b\xe0\x8c\x34\x7f\x02\x61\xd3\x61\xf2\x59\x3c\x70\xea\
+\x24\x9e\x7c\xe4\x6e\x8c\x0e\xf5\x42\xec\xb8\x66\x61\x40\x08\xb0\
+\x56\xa8\xe2\xed\x2b\xcb\xee\x74\x18\xdd\xf6\xe9\x94\x1b\xb0\xd7\
+\x4e\x60\x39\xa0\x89\x0b\x2d\x1e\x21\x94\x4f\x61\x84\x17\x05\xb0\
+\x51\xac\x61\x03\x35\x68\x54\xda\x2a\x4d\xbd\x84\x26\xa0\xe8\xf2\
+\x35\x3a\xab\xa9\x06\x44\x2a\x2b\x89\x41\xa1\x89\xb7\x54\x86\xa6\
+\xca\xe2\x62\xad\x56\xd6\xbf\x38\xd4\x9b\xd7\x34\x34\x77\xc1\xb8\
+\x04\x57\x12\x50\x81\xeb\xd9\x7b\x0a\x0e\xa4\x4e\x9a\xf4\xbd\xe9\
+\x30\x4f\x3e\x72\x0a\x0f\x9c\xba\x0d\xfd\xbd\xec\xea\xc2\xdc\x28\
+\x16\xff\x51\x58\x58\x2d\xe1\xec\xe5\x65\x14\x4a\xde\x74\x18\x6a\
+\xdc\x89\x98\x30\xbd\x83\x40\x6b\xc0\x62\xcb\x68\x0a\x5a\x5c\x04\
+\x5b\x2b\x56\x55\x0d\x2f\xe5\xab\xd0\xa1\xf7\x43\x55\x77\x51\xa4\
+\x28\x6e\x45\x08\xb9\xd9\xa6\xac\x2e\x81\x64\xe9\x70\xf3\x1a\x09\
+\x7b\x6f\x98\x64\xdc\x88\x72\xa1\x5c\xf1\x1e\x08\x9d\x20\xfc\x8e\
+\x3f\x62\x5e\x8e\xa6\xb8\xa1\x07\xe0\x74\x7c\x88\x1b\xc3\xf2\xdf\
+\x77\x87\x8d\xf5\x9e\x07\x15\x33\x1d\xe6\xff\x02\xf0\x3b\x00\x0e\
+\x98\xf4\x29\xa5\x98\x18\x1b\xc6\xb3\x4f\xde\x8f\x3b\x4f\xdc\x84\
+\x7c\x36\xad\x7c\x78\x3c\x9b\xca\xa6\x14\xd3\x8b\x9b\x38\x37\xb5\
+\x82\xb2\xbb\x3b\x0c\x28\xf8\x89\xc5\x0a\x60\x89\xbb\xc1\xc4\x01\
+\x96\x93\xce\x6c\x65\x39\x79\x46\x84\x96\x77\x3a\xec\xa1\xa2\xab\
+\x8f\x28\xd5\x35\x23\x26\xd1\x7e\x5e\xd1\x98\xb1\x71\xba\xec\xa9\
+\xe6\x40\x65\x87\x99\xfc\x4b\xa2\xaf\x4e\x57\x07\xd1\x36\x52\x5b\
+\x50\x8a\x5a\x08\x3f\x30\x01\x8a\x9a\xea\xdb\xdc\x31\xf2\x9e\x06\
+\x95\x0b\xa9\x3e\x00\x7f\x03\xc0\xdf\x03\x30\x14\x96\xe6\x86\x43\
+\x7b\xf1\x81\xa7\x1f\xc4\xd1\x1b\x0f\x20\x93\xe6\x97\x40\x67\x47\
+\x0b\x13\x00\xb5\x46\x03\x97\x66\x37\x70\x71\x76\x1d\x35\x77\x3a\
+\x4c\xa0\x0c\x79\x8c\x53\x5c\x60\x29\x7a\xe4\x9a\xb1\xb2\x9c\x3c\
+\x14\xd0\x62\x33\x84\x01\x5c\x86\x7a\x44\x77\x69\x77\x6e\x42\x4c\
+\x68\x17\x7d\x58\x74\x08\x98\x80\x78\x70\x52\x16\xdf\x24\xa0\xfc\
+\x7f\x75\xce\x74\x71\xd5\xc2\x08\xf5\xdd\x89\xf2\x9e\x04\x15\xe3\
+\x8f\x9a\x80\x33\xf4\xe0\xaf\x20\xc2\x74\x98\xe3\xb7\xdc\x80\xf7\
+\x3f\x79\x3f\x0e\xed\x1b\x77\xa6\x7e\xa8\x7a\xf6\x5c\x58\x95\x6b\
+\x0d\x9c\xbb\xba\x8a\xa9\x85\x82\xb3\x6a\x27\xe1\x27\x5d\x18\x27\
+\x16\x47\x05\x16\xeb\x1f\x52\x0c\x6b\x70\xd2\x85\x5b\x59\x41\xbc\
+\x97\x07\xdb\x73\xe8\xe6\xa6\x3e\x5d\xe5\x41\x34\xe4\x68\xdd\xc6\
+\xed\xfb\xa5\x8f\x98\x51\x98\x65\xd5\x0c\x9c\x9c\xf8\x08\x83\x20\
+\x5a\x05\x94\x90\x31\xd7\xb0\xa3\x72\xcd\x77\x1b\xa0\x3c\x79\xcf\
+\x81\x8a\x81\xd4\x11\x00\xff\x12\xc0\x87\x10\x36\x1d\x26\x9b\xc1\
+\xa9\x3b\x8f\xe1\xa9\x47\xef\xc5\xc4\xc8\x40\x68\xcf\x5e\xa1\x58\
+\xc3\xd9\x2b\x2b\xfc\xee\x30\x82\x85\x23\xa5\x87\x1a\x58\x6a\x87\
+\xbb\xb9\x49\xc8\x64\xc9\x06\x85\xaf\x35\x45\x79\x38\xfa\x63\xe7\
+\x15\x73\xc5\x7c\x1d\x85\xe9\x41\xbd\x0b\x21\x48\xc8\x30\x51\x21\
+\x56\xff\x32\x36\x2b\x51\x2c\x2b\xd3\xa4\x92\x48\xe3\x9a\x9a\xb2\
+\x9e\x82\xa3\x76\x00\x4a\x5b\x8f\x5d\x0a\x29\xe0\x3d\x06\x2a\x06\
+\x52\xf7\xc3\x99\x0e\x73\xbf\x49\x9f\x52\x8a\xde\x9e\x2e\x3c\x72\
+\xff\x9d\x78\xf8\xbe\xdb\x31\xd8\xdf\xc5\xc7\xbb\x9f\xbe\x75\x44\
+\x80\xa5\xb5\x32\xce\x5e\x5e\xf6\x77\x87\x01\xd4\x4e\x54\x76\x82\
+\xb2\x09\x58\xec\x76\xe9\x2a\x0b\x8b\x77\xa2\x9a\xad\x2c\xb6\x2c\
+\xfd\x32\xc4\x72\xa3\x4d\x37\x96\x4a\x2b\xac\xb9\xa8\xb8\x5e\xba\
+\xf2\x78\x5d\x12\x9a\x32\x3c\x6f\xb3\x42\xd8\x4c\xb7\xa8\x2f\x76\
+\x24\x38\x31\x81\x51\xac\x27\x3e\xdc\x0c\x6d\xd1\x8a\x12\x23\x29\
+\x14\x65\xec\x32\x68\xbd\x67\x40\xc5\x4c\x87\xf9\x20\x1c\x4b\xea\
+\x66\x93\x3e\xa5\x14\x23\x43\x03\x78\xfa\xb1\x7b\x71\xf7\x1d\x47\
+\xd1\xdb\x95\xf5\x62\xa0\x7a\xb9\x28\x80\xd9\xc5\x4d\xbc\x7d\x65\
+\xd9\x9f\x0e\xe3\xfb\x7a\x28\x14\x96\x51\x3c\x60\x39\x69\xf4\xbd\
+\x84\x4e\x38\x6f\x65\xe9\xa0\xe5\xa4\xd7\x2c\xa7\xe2\x0d\xdc\x0c\
+\xfe\x09\xea\xa7\xf7\x8b\xf3\xf9\x89\x2f\x01\xd1\xa7\xd2\xbe\x31\
+\x4d\xfa\x90\x64\xbd\xe8\x6f\x64\x2b\x60\xd2\x56\x23\xa6\xf5\xc4\
+\x87\xb7\x00\x28\x37\x1f\xc9\x7f\xb5\xcb\x00\xe5\xc9\x7b\x02\x54\
+\x2e\xa4\xf2\x00\x7e\x01\xc0\x3f\x81\xe3\x9b\xd2\x0a\xa5\x14\x07\
+\xf6\x8e\xe3\xd9\xa7\xee\xc7\xad\x37\x5f\x8f\x5c\x26\x25\xf4\x9a\
+\x05\x68\x21\xf0\xd6\x90\x5a\xc7\xbb\xd3\xab\xa8\xd6\x6d\xdf\xa0\
+\x60\xf7\xc9\x53\xf7\x0c\x82\x9b\xcb\xd7\x6e\x60\x39\x59\x28\x80\
+\xa4\x1b\xb1\x2e\x1d\x68\xf2\x57\xea\x69\xcc\x2e\xa5\x61\x24\x14\
+\x1c\xa3\xfb\x4d\x19\xe3\xf5\xa4\x46\x7c\x0b\xe3\x36\x81\x4c\xa3\
+\xea\xc3\x9a\x93\x51\xad\x27\x3e\x2e\x3a\xa0\x74\xf5\x8b\xd2\x23\
+\xb8\x9b\xe4\x9a\x07\x95\x0b\xa9\x41\x38\xbd\x7a\x7f\x0b\x21\xd3\
+\x61\x08\x80\x9b\x6f\x3a\x84\x67\x9f\x7a\x00\x87\x0f\xee\x41\x3a\
+\x25\x3b\xa0\xfd\x9e\x3d\x42\x51\xa9\xd9\x78\x77\x6a\x0d\x97\xe7\
+\xd6\x61\xdb\x54\xf9\x62\x52\x42\x39\xeb\xca\x49\xcb\xe6\x29\xfb\
+\xaf\xbc\xba\xf0\xf9\x78\xe1\xe1\xc0\x22\x2a\x08\x89\x15\x53\x0e\
+\x4e\x25\xd2\x2e\x38\xdc\xc5\x31\x48\x90\x6b\xc8\x1b\x11\xba\x00\
+\x12\x7f\x11\x8d\x2f\x15\xdb\x8b\xe9\x34\x96\xb9\xeb\xd0\x8c\xc4\
+\x06\x93\x10\xa1\xea\x16\xd8\x7a\x40\x39\x57\x4e\x5c\x61\x75\xb7\
+\x01\xca\x93\x6b\x16\x54\x8c\x3f\xea\x00\x9c\xf1\x51\x9f\x44\xc4\
+\xe9\x30\x4f\x3f\x7e\x1a\x7b\xc7\x87\x60\x59\xc2\xc6\x9e\xbe\x2e\
+\xdc\x35\xa4\xea\x38\x7b\x65\x19\xb3\xcb\x45\xf7\xa1\x71\xe6\xea\
+\xa9\xe6\xd6\x89\xbb\x10\xb7\x17\x58\x6e\xce\x0a\xd3\x88\xf3\x33\
+\x89\xf3\x07\x95\xad\x58\x65\xdf\x9e\x21\x4a\xdd\x0c\x16\x47\x4f\
+\xf2\x43\x1b\xda\xf8\xba\x10\x31\x3b\xad\x99\x26\xd7\x33\x42\x3d\
+\xe2\x81\x89\x3f\x8a\x03\x27\xee\x5b\x1b\x00\xc5\x25\xdc\xe5\x90\
+\x02\xae\x51\x50\x31\x90\x3a\x01\x67\xa4\xf9\xd3\x08\x99\x0e\xd3\
+\x95\xcf\xe1\xfe\x53\x27\xf0\xe8\x83\x77\x62\x64\xb0\x4f\x32\x8c\
+\xd8\x63\x02\x60\xb5\x50\xc1\x99\x4b\xce\x74\x18\xc2\x90\x84\x9d\
+\x58\xac\x5e\xe3\xbc\x8d\xc0\x72\x03\x9d\xa6\x18\x5f\x4b\xd5\x5a\
+\xec\xc1\xa1\x06\x2e\x4c\x5d\xbd\x5d\x65\x88\x46\x57\x3d\x4e\x4a\
+\x33\xf1\x8f\x88\x2f\x89\xe6\x56\x48\x0e\x15\x68\xf5\x8c\xee\x6b\
+\xaa\xc9\x85\x9a\xad\xb3\x38\x0e\xf9\xd6\xe0\x14\xa4\x31\xf5\x6a\
+\x36\xd3\x93\x47\x35\x27\xaf\xbe\x5e\xc9\x14\x9a\x6d\x13\x66\x3a\
+\xcc\x63\x00\xfe\x2d\x9c\xb9\x7b\x5a\xa1\x94\x62\xa0\xbf\x17\x4f\
+\x3c\x7c\x37\xee\xbd\xeb\x38\xfa\x7a\xf2\xb2\x53\x58\x18\x8e\x30\
+\xb7\x52\xc4\x19\x77\x3a\x0c\x81\x08\x05\x79\x62\xb1\x7a\x8d\xf3\
+\xe8\xc0\x72\xc2\x89\x12\x09\xec\xc8\x25\xee\xd1\x23\x12\xde\x04\
+\x53\x4a\x3e\x31\x0e\x4a\xa6\x41\x9c\x94\x49\x66\x1a\xbe\x2e\x05\
+\x47\xee\x32\xd4\x65\x10\x58\x6b\x52\x71\x4c\xa0\xce\xa8\xf2\xa7\
+\x05\xc4\xef\x25\x6c\x06\x4c\xb2\x4e\x7b\xac\x27\x55\xb9\x2a\x40\
+\x79\xbd\x7d\xba\xba\xab\xca\xdb\xa9\x72\x4d\x81\xca\x85\x54\x06\
+\xc0\x27\xe0\x6c\x06\x7a\xc8\xa4\x4f\x29\xc5\xe4\xf8\x30\x9e\x79\
+\xe2\x3e\x9c\x38\x76\x23\xba\x72\x69\x28\x7f\x69\xdc\xa0\x06\xa5\
+\xb8\x3a\xbf\x81\x77\xae\xae\xa0\x5c\x6d\x18\x96\x0b\xe6\x7b\xdf\
+\x74\xcd\x41\x20\x1a\xb0\xbc\xba\x3a\xe1\x7c\x46\xe2\x48\xf5\x80\
+\x45\x82\xaf\x49\x80\xad\xaa\x27\xcf\x5f\x6d\x41\x31\xba\x53\x89\
+\x0f\x15\xe0\x42\xa5\xb5\x57\xc3\x6f\x51\x6a\x99\x48\x24\x0a\xf0\
+\x87\x04\x61\x74\x30\x5a\x6b\x68\x3f\x9c\x54\x41\xb1\x00\x25\x64\
+\xa0\x2f\xa7\x75\xff\xdd\x76\xc9\x35\x03\x2a\x17\x52\x3d\x70\xd6\
+\x8f\xfa\xfb\x70\xd6\x93\x32\xca\xe1\xeb\xf6\xe1\x7d\x4f\xde\x8f\
+\x23\x37\xec\xe7\xa6\xc3\x70\x2f\x2c\xdc\xe9\x30\x75\x1b\xe7\x67\
+\xd6\x70\x61\x66\xcd\x99\x0e\x03\x38\x4d\x09\x61\xdb\x29\xd1\xba\
+\x72\xfe\x0d\xc6\x37\xb5\x0a\x2c\x1f\x37\x8c\xf3\x49\x1e\x0f\x6e\
+\xf2\x2f\x11\x55\x6e\x42\x4a\x2a\x99\x4b\x4a\xf7\x14\x65\xf5\xa3\
+\xc2\x2a\x4c\x8f\x46\x0b\x15\x78\x43\xc3\xf1\xc2\xf4\x0e\x9a\xf2\
+\x8f\x0f\x25\x59\xaf\x39\x38\x39\xf9\xb4\x0f\x50\xd4\xd5\x63\x71\
+\xbd\xdb\x00\xe5\xc9\xae\x07\x15\xe3\x8f\x1a\x03\xf0\x8f\x00\xfc\
+\x55\x00\x5d\x3a\x7d\x4a\x81\x54\x8a\xe0\xf8\xd1\xc3\x78\xe6\xf1\
+\xfb\xb0\x7f\xef\xa8\xb3\xd0\x9d\x4a\x17\xce\xd0\x81\x52\xa5\x8e\
+\xb3\x57\x56\x30\xb5\x50\xe0\x36\x0d\xa5\x80\x72\x73\x4f\x19\x32\
+\x01\xb0\x94\xfe\xab\x40\x45\x09\x2c\xc2\x9a\x45\x8c\x3a\x61\xac\
+\x2a\xde\x39\xae\x6a\x73\xc2\xe5\x9b\x30\x60\x41\x20\x95\x9c\x17\
+\x97\x5c\x3a\xa0\x5c\x4a\x9d\xc4\xb1\xb8\x84\x73\x84\xfa\xa5\x94\
+\x0f\x65\x0a\xf1\xd6\x57\x98\x25\x45\x63\xbf\xc4\x9d\x86\x93\x58\
+\x46\xe8\x75\x90\xa2\x03\x6f\xba\xba\x88\xdd\x43\xad\x5d\x0d\x2a\
+\x06\x52\x87\xe1\x0c\xe2\xfc\x08\x42\xa6\xc3\xe4\xdc\xe9\x30\x8f\
+\x3d\x7c\x0f\xc6\x86\x07\xe0\x4d\xd9\x53\xb9\x74\x9c\x2d\xd5\x1d\
+\xa7\xf9\xc2\x6a\x29\x08\x17\x5c\x3c\x4e\x58\x00\x2c\xd6\xba\xf2\
+\xf2\x71\x43\x02\x5b\x2d\x06\xb0\x28\x98\xe6\x15\xdb\x7b\x47\xdd\
+\x70\xde\x61\x15\xe8\x4b\xdd\x95\xac\xe3\x3d\x48\x10\xd5\xad\x2a\
+\x3a\xdc\x45\x72\x49\x2e\x21\x6d\x0e\xd1\x84\xc4\x7e\x8f\x34\xc3\
+\x1a\x7c\x46\x49\x13\x73\x98\x6f\x4e\xaf\x69\x54\x8b\x46\x6b\x83\
+\x85\xb9\xe9\xb8\x3c\x9b\xb7\x9e\xb8\x43\x2d\xa0\xe0\x99\x55\xbb\
+\x5e\x76\x2d\xa8\x18\x48\x9d\x82\xe3\x34\x7f\xc8\xa4\xcf\x4e\x87\
+\xb9\xff\xde\x13\x18\xe8\xed\x96\x7a\xc5\x00\xbe\xf3\x6c\x71\xb5\
+\x84\x37\x2f\x2d\x63\xb5\xe0\xec\x0e\x23\xf5\xc2\xb1\xd0\xf0\xc3\
+\xd4\xcd\x41\x20\xdc\xe1\xce\xa6\x71\xbe\x73\xa6\x9b\x0b\x46\xc1\
+\x23\xe4\x56\x82\x87\x6d\x90\xce\x33\x26\xbc\x96\x1c\x6f\xaf\xc9\
+\xe7\xc1\xbe\xe0\x44\x31\xa0\x4a\xf2\x9d\xab\x47\x7f\x72\xd7\x44\
+\x95\x5a\x39\x0e\x54\x4c\x41\xf4\x99\xa9\xb9\x41\x61\xe0\x09\xf7\
+\xc2\xab\xf4\xd8\xb0\x4e\x80\xc9\xc9\x37\x9a\xf5\x24\xd6\x57\x99\
+\xb7\x09\x50\x50\x39\xd2\xc3\xeb\xb7\x53\x65\x57\x82\xca\x85\x94\
+\x05\x67\x7f\xbd\x7f\x05\xe0\x16\x93\x3e\xa5\x14\xa3\xc3\x03\x78\
+\xf2\xd1\x7b\x71\xc7\x89\x9b\xd1\x93\xcf\x9a\x37\x6f\xa4\xc0\xf4\
+\x62\x01\x6f\x5d\x5e\x46\xb1\x5c\x0f\xde\x7b\xd5\xc4\x62\xc1\x12\
+\xd3\x35\x07\x9d\xf4\xae\x2a\xe7\x70\x77\x34\xb8\x1e\x42\xf7\xe5\
+\x67\x39\xe0\xe4\x2b\xd0\xcc\x77\x90\x53\xc1\x82\xa2\x92\x55\xe5\
+\xd7\x55\xdc\x89\x58\xf2\x9b\x9b\xfd\x52\x94\x4f\x1a\x5c\x30\xad\
+\x49\x16\x15\x62\x3a\x5d\xca\x47\x31\x87\x54\x91\x94\x50\x75\x38\
+\x15\x2a\x4e\xa4\x30\xa1\xd9\x48\x82\x9e\xb4\x28\x60\x32\x45\x35\
+\x05\x27\x45\x86\x71\x00\xa5\xab\xd7\x6e\x03\x94\x27\xbb\x0e\x54\
+\x2e\xa4\x72\x70\x76\x2a\xfe\x67\x00\xf6\x98\xf4\x29\xa5\x38\xb0\
+\x6f\x1c\xef\x7b\xe2\x7e\x1c\xbd\xe9\x10\x72\xee\xee\x30\xaa\xf9\
+\x77\x04\x40\xdd\xa6\xb8\x38\xbb\x86\x73\x57\xdd\xe9\x30\x42\x6f\
+\x99\x97\x27\xc0\x0f\x19\x08\x6b\x0e\x02\x08\xb1\xb0\x18\x00\x52\
+\x17\x3e\x84\x08\xb5\x83\x44\x0d\xce\xca\x13\xcf\x89\xa8\xbe\x32\
+\x16\x93\x44\x29\x65\x02\xa5\x48\xb6\x51\x78\xbb\x0f\xbc\x62\xf4\
+\x81\x99\x86\x77\x57\x88\x50\x34\xed\x14\xd4\x52\x77\xe5\x13\x1f\
+\x56\x94\xd3\x57\x5b\x35\xa6\xba\x84\x0d\x24\x55\xae\x90\x10\xa5\
+\x9c\x26\x00\x45\xa9\x02\xb6\x5e\xe4\xee\x19\x46\xb5\x7b\x40\xc5\
+\x34\xf5\x06\x00\xfc\x3a\x80\xbf\x0d\x67\xd1\x3b\xad\x10\x02\x1c\
+\xbd\xe9\x3a\x3c\xf3\xf8\x7d\x38\x74\x60\x02\x99\x94\xd7\xb3\xe7\
+\xf5\x80\x10\x66\x3a\x8c\xb3\xa5\xfa\xdb\x57\x57\x70\xc9\x9b\x0e\
+\x03\x80\x9d\x17\x27\xb9\x7c\x54\xf3\xf4\x9a\x06\x96\x4c\x4d\xdf\
+\x2e\x0a\xcc\x21\xa9\xb9\x25\x41\x14\x42\x93\x51\xaa\x0b\x94\x56\
+\x95\xa3\xce\x38\xc4\x99\x25\x3c\xa9\x9a\x91\x3e\x15\xe3\x3d\xef\
+\x24\xe4\x98\xc6\x82\x82\x2a\x77\xca\xba\xe0\x49\xc4\xc4\x3e\xe8\
+\x78\x2a\x7a\x79\xc9\x23\xe0\x85\xe4\xad\xc0\x49\x71\x82\x7a\x38\
+\x29\x8e\x54\x69\xa9\x06\x67\xbb\xd4\xa4\xda\x15\xa0\x62\x20\xb5\
+\x0f\xc0\x6f\x01\xf8\x59\x38\xcb\x07\x2b\x85\x52\x8a\x4c\x3a\x8d\
+\x3b\x4e\x1c\xc1\x13\x8f\x9c\xc2\xe4\xd8\x90\xb3\xd0\x9d\xac\xe9\
+\xc3\xaa\x50\xaa\xe1\xcc\xc5\x65\xcc\x2c\x15\x84\x1e\x35\xd7\x7a\
+\x72\xc7\x25\x01\x7a\xeb\xca\xd1\x77\x75\x34\xfe\x2b\x40\x06\x96\
+\x0f\x1d\xc6\x22\xf2\xea\x25\xba\x87\x03\xe7\x3a\xdb\x56\xe4\x94\
+\xf8\xe6\x1e\xd3\x63\xa8\x6a\xc2\x11\xe9\xc0\xe4\x94\x92\x2e\xb4\
+\x41\xb7\xd9\x9f\x6b\x22\x18\x5b\xd4\xcf\x4d\xd7\x71\x25\x5a\x51\
+\xaa\xc3\xe0\xc7\x49\x75\x1a\x3a\x32\xf2\x20\x61\xeb\x10\x69\xfa\
+\x8d\xa6\xc2\x22\x84\x94\xd5\x6e\xb6\x79\x47\xf9\xab\x61\x2a\x6b\
+\x37\x39\xda\x77\x3c\xa8\x18\x48\xdd\x0a\x67\x3a\xcc\xfb\xe0\xf8\
+\xa7\x94\xe2\x4d\x87\x79\xe0\xde\x13\x78\xf0\xbe\x3b\x30\xd4\xdf\
+\x0b\xcb\x52\xfb\x5b\xdc\x14\x58\x5e\xaf\xe0\x8d\x8b\x4b\xfc\x74\
+\x18\xc9\xf7\x44\xf5\xfb\xe4\x21\xba\xff\x0a\x08\x80\x05\xa2\xb6\
+\x8a\x58\xa8\xf8\x71\x94\x7f\x81\xfd\x43\xb1\x69\xea\x0f\x41\x60\
+\x22\x9d\x42\xa1\x1a\x7a\x10\xc0\x4c\x53\x17\x95\x55\x26\x5d\x41\
+\x12\x8b\x6f\x62\x6a\x5d\x2a\xca\x82\x53\x04\x87\x77\x44\x38\x65\
+\x3f\x86\x8a\xf7\xd1\x43\xbb\xe0\x8b\x62\x31\x28\xbe\xb3\x54\xc0\
+\x63\x14\x48\x69\x97\x6e\x89\xd1\xb4\xe3\xbf\x36\x07\x28\x4e\x41\
+\x6b\xcd\xed\x9e\xb6\xdf\x8e\x06\x15\x33\x1d\xe6\x61\x38\x3d\x7b\
+\x77\x9b\xf4\x29\xa5\x18\xec\xef\xc5\xe3\x0f\xdf\x8d\xbb\x6f\x3f\
+\x86\x5e\x6f\x3a\x8c\xf8\x62\x32\x69\x66\x97\x37\xf1\xe6\xc5\x65\
+\x6c\x14\xab\x8e\xcf\x89\xc2\xf7\x4b\x01\x62\x53\x2e\xb0\xae\x80\
+\x70\x60\xa9\xf2\xf0\xeb\x40\x34\xf6\x8d\x4b\x38\x76\x98\x83\xae\
+\xb5\xe4\x8d\xcb\x92\x7d\x6d\x7c\xb3\xcd\xec\x1e\x87\x40\x55\xa1\
+\xf9\x68\xc8\x5b\xca\x43\x7f\x68\x18\x0f\xaa\x19\x52\x10\xd5\x69\
+\xad\xd4\x23\x1a\xf4\xb8\xe5\x79\xbe\xa8\x50\xaf\xbb\x73\x01\xe5\
+\x15\x19\x02\x80\x85\x82\x49\x53\xc7\x38\x70\x52\x56\x4b\x88\xd0\
+\x18\x90\xe6\x7a\xed\x22\xd9\xb1\xa0\x72\x21\x95\x06\xf0\x13\x00\
+\x7e\x0f\xc0\x0d\x26\x7d\x4a\x29\xf6\x8c\x8f\xe0\xe9\xc7\x4f\xe3\
+\xd8\xd1\x1b\xd0\x95\xcb\x68\xba\xd2\x03\x27\xe3\xe5\xd9\x0d\xbc\
+\x75\x65\x19\x95\x6a\x83\xef\x89\x63\x96\x4f\x69\x27\xb0\x02\x67\
+\x37\x09\xac\x22\x16\x3a\x6c\x26\x4c\x3b\x50\xdc\x3e\x8b\x1b\x36\
+\x25\x5a\x3a\xc2\xd4\x99\xa0\x09\x6a\xa8\x2b\xc4\x30\xa2\x8d\xe4\
+\xd6\x53\x8f\xe1\x7c\xa7\x91\x02\x49\xd4\x94\x5a\x3d\x1d\xc4\x44\
+\x8b\x86\xb7\xc6\x98\xd4\x44\x7d\x2c\x8b\x00\xb0\xd0\xa6\x67\x18\
+\x9c\x14\x47\xc6\x3c\xcc\x80\xa2\x8c\x1a\x05\xdd\xb5\x80\xf2\x64\
+\xc7\x81\x8a\x69\xea\x75\x03\xf8\xeb\x00\xfe\x01\x80\xd1\xb0\x74\
+\x37\x5e\xbf\x0f\x4f\x3f\x7e\x1f\x6e\xb8\x6e\x1f\xb2\x69\xb7\x67\
+\x0f\x72\x33\x86\x10\xa0\x5a\xb7\x71\x6e\x6a\x15\xe7\xa7\xd7\x50\
+\x77\xa7\xc3\x28\xa7\xbe\x30\xce\x76\xb5\xef\x29\x1e\xb0\x94\x4e\
+\x73\xf7\x8d\xe1\x46\xbb\x0b\xcd\x30\x65\x0f\x1b\xd3\x7d\x4e\x98\
+\xf4\xe2\xba\xc1\x12\x84\xa8\xc6\x15\x25\x54\x5e\x6c\x4e\x8a\xc2\
+\x7b\xe4\x20\xbc\xf9\x08\x05\x97\x51\x87\xaa\x95\xb8\x57\x53\x01\
+\x39\xf1\x25\x96\x0a\xd3\xac\x9e\x20\x85\x6a\x3a\xfb\xd8\xa6\xa3\
+\x34\x62\x3c\xac\x03\x20\x22\x9c\x54\xd5\x57\x9d\x57\x18\xa0\x4c\
+\xf9\xef\x46\xd9\x51\xa0\x62\x20\x35\x02\x07\x50\x9f\x82\x03\x2c\
+\xa5\x50\x00\x29\x8b\xe0\xb6\x5b\x0e\xe3\xc9\x47\xef\xc5\xde\x89\
+\x51\x77\xa1\xbb\xe0\xf5\x64\x5f\x54\x6f\x4b\xf5\x33\x97\x97\x71\
+\x75\x61\xc3\x5f\x43\xca\x7b\x29\x95\xc3\x06\x84\xc5\xe9\xd4\xbe\
+\xa7\x70\x60\x01\xbc\x65\xc4\xef\xa2\x20\x4d\x6c\x61\x0a\x0b\x9a\
+\x78\xbc\x29\xe5\x7c\x91\xfc\x54\xbe\x8f\x9d\x5f\x1a\x98\x12\xca\
+\xe8\xca\x65\x99\x96\x75\xe1\x20\xa4\x18\x8d\x20\xa5\x88\xe3\xfa\
+\xd0\x30\x45\x15\xcf\xf6\xe8\x99\x06\x83\xba\x43\xcc\x15\x51\x8a\
+\x26\xa1\x60\x5a\x49\xcd\x41\x71\xa3\x50\xca\x94\xcf\xf8\xbf\xe4\
+\xa1\x0d\x68\x09\x4e\x9c\x56\x84\xe6\x9d\xe4\x5f\xd3\xa5\x61\x03\
+\x77\x8f\x8b\x6a\x67\x81\xca\x95\xeb\xe1\x34\xf5\x3e\x66\xaa\x1f\
+\x3b\x1d\xe6\x91\x07\xef\xc6\xc8\x60\x5f\xd0\xb3\xc7\xbd\xb5\xc1\
+\xdd\x58\x2d\x54\xf1\xc6\xc5\x45\xcc\xaf\x38\xbb\xc3\x38\x2f\xae\
+\xdc\xa4\x52\x0e\xcc\x0c\x69\x0e\x3a\x9a\x32\xb0\x48\x90\x91\x50\
+\x7f\xf0\x8e\x7b\x86\x44\xbe\x33\x9c\x30\x10\x65\xcf\x24\xf0\x80\
+\x0b\x67\x48\xd4\x0f\x9f\xe0\xd3\x62\xc3\xe4\xa4\x6c\x3d\xe4\xeb\
+\x20\x65\xaa\xbc\x39\x9a\x70\xd3\x8b\xc1\x75\xa9\xc9\x19\x85\xf9\
+\x60\xc4\xd7\x92\x2a\xf2\x13\x90\x23\x81\x45\xed\x3c\x67\x20\x26\
+\xea\x09\xb0\x62\x2d\xab\x30\x30\x01\xd1\xe0\x64\x3a\x77\x1d\x9c\
+\xf4\x79\xea\xcb\xd8\xe9\xb2\x23\x40\xc5\x58\x52\x77\xc1\x71\x9a\
+\x3f\x02\xc3\x63\x4d\x29\x45\x5f\x4f\x17\x1e\x7e\xe0\x4e\xdc\x7b\
+\xd7\x6d\xe8\xef\xed\xe2\x01\x02\x48\x34\x99\x5f\x2d\xe1\xf5\x0b\
+\x4b\x58\x2b\x54\x34\xd6\x11\xd7\x57\xe6\x96\xa3\x6e\x0e\x02\x31\
+\x80\x25\x52\xc6\x83\x8c\xae\xa9\xc7\xfa\xb1\xc0\x20\x83\xb1\x84\
+\xd8\x5d\x96\x59\x73\x4a\xe0\x1d\x53\xac\xdc\x25\x27\x01\xce\x7b\
+\xc7\x14\xac\x53\x0d\x8e\xe5\x5f\x68\xa1\xcf\x52\x67\xed\x98\xde\
+\x0b\xad\x1f\x48\xa3\xa8\xf4\x1d\x31\xf6\x12\x95\x82\xc5\x51\x52\
+\x72\x9e\x54\x15\xcc\x9b\x2d\xb2\xaf\x4b\x70\xaa\xfb\x46\x58\x13\
+\x70\x62\x14\x4c\x96\x50\x1c\x40\x51\xea\x7d\xd9\xdd\x8d\xc0\x6d\
+\x07\x15\x33\x1d\xe6\x19\x38\xc3\x0f\x8e\x9b\xf4\x29\xa5\x18\x1b\
+\x19\xc0\x93\x8f\xdc\x8b\xdb\x6e\xbd\x09\xdd\x8a\xe9\x30\x1c\x17\
+\x6c\xe0\xea\xc2\x06\xde\xbc\xb4\xe4\x4e\x87\x21\xdc\x8b\xc7\xfb\
+\x9e\x02\xeb\x0a\xd0\x37\x07\x9d\x7a\x68\xfc\x57\x6e\x42\xde\x0f\
+\xa4\x68\xda\xb1\x4e\x6e\xb6\x55\xc5\x36\xcd\x3c\x87\x3b\x00\x71\
+\x78\x02\xe7\xef\xe6\xac\x21\xf8\x95\x08\x8a\x67\x9b\x4a\x01\x61\
+\xa9\xd8\xd4\xd3\x18\x64\xec\x35\xe1\x4e\x4b\x21\xfc\x8f\x44\x88\
+\xb2\x78\x3d\x22\xe9\xa9\x87\x0c\x04\x07\xea\x1e\x3f\xea\x11\x9e\
+\x49\x15\x64\x45\xfc\xa6\xaf\xe4\x6c\xa7\x22\xaf\x44\x42\xaa\x88\
+\xc9\xd4\x4f\x73\x5e\xad\xc2\xc9\x49\x16\xc5\x82\xa2\x1e\xa7\x76\
+\xb5\x6c\x2b\xa8\x5c\x48\x65\x01\xfc\x0c\x80\xdf\x86\x33\xa0\x53\
+\x2b\x94\x52\x1c\xda\x3f\x81\xa7\x1f\xbf\x0f\x37\xde\x70\x10\xb9\
+\x4c\xca\xb8\x0c\x52\xbd\x61\xe3\xfc\xf4\x1a\xde\xbe\xba\x82\x5a\
+\xdd\x66\x9a\x30\xf2\xae\x30\xa2\x75\xe5\x84\x85\xac\x84\xa0\xf0\
+\x5f\x01\x81\x2f\xc5\xb7\x6e\x24\xa8\xf0\x26\x96\x07\x3d\xd1\x22\
+\x0a\x44\x26\x08\x07\x3e\xce\x8a\x12\x56\x66\x20\xbc\xe5\xc4\xf2\
+\x91\xaf\xb5\x93\x40\x67\x55\x81\xe9\x14\x30\xde\x23\xc5\x41\x5c\
+\x57\x88\xa1\xd1\xa3\x1d\x45\x10\x58\x9d\x72\x32\x39\x8c\xf7\x3d\
+\x51\x21\x8c\x7d\xd1\xd9\xe6\x60\x10\xce\xa3\x90\x32\xf0\x64\xf7\
+\x61\xd4\xee\x94\x4c\x8d\x67\x18\xc9\xf7\x64\x4c\xc6\x58\x7b\x06\
+\x04\x86\xc4\xec\x2c\xd9\x36\x50\xb9\x90\xea\x07\xf0\xab\x00\xfe\
+\x0e\x9c\xa9\x31\x5a\x21\x84\xe0\x96\x23\x87\xf0\xd4\xa3\xa7\xb1\
+\x7f\x5f\x30\x1d\x46\x39\x67\x8f\x00\xe5\x6a\x03\x6f\x5d\x5a\xc6\
+\x45\x77\x3a\x0c\x6f\x1d\x31\x7e\x18\x06\x40\xb2\x65\xa4\x6e\x0e\
+\x7a\xfa\xaa\xe6\x20\xd7\xb3\xe7\xc3\x47\xb4\x86\xc4\x5e\x3d\x91\
+\x4e\xcc\xa4\x62\xf0\xf6\x18\x85\x02\x16\xa2\x73\x9d\xad\x82\x96\
+\x3c\x4c\x75\x04\x47\xb9\x09\x2c\xc1\x42\x35\x52\xe1\xaa\x16\xa6\
+\x21\x9f\xc0\xfa\xd2\xbf\x2c\x8a\x1e\x3f\x6a\xd2\x55\x37\x0b\x7d\
+\x63\x8a\x05\x11\xa7\x13\xe1\x75\x0d\xfc\xe5\x90\x66\x3e\x07\x05\
+\x48\xb9\xb5\x03\x4e\x4e\xf2\x10\xeb\x89\x39\x90\x3a\x0b\xa2\x58\
+\x75\x3b\x5c\xb6\x05\x54\x2e\xa4\xf6\x00\xf8\xa7\x00\xfe\x12\x9c\
+\x49\xc6\x4a\xa1\x94\x22\x93\x49\xe3\xae\x13\x47\xf0\xc8\x43\xa7\
+\x30\x36\x32\x80\x94\xb0\x3b\x0c\x0b\x0f\x42\x80\x8d\x62\x15\xaf\
+\x5f\x58\xc2\xcc\xe2\xa6\x1b\x01\x49\x9f\x08\x8e\xa5\x38\xcd\x41\
+\xb1\x4c\xd6\x96\x92\xc1\xc9\xbf\x6c\xaa\xe6\x1f\x6b\x7d\x05\x4c\
+\x0b\xc6\x43\x11\xa9\x82\xbc\xcf\x8a\x7d\xeb\x45\x90\x51\x76\xe8\
+\x02\x5b\xac\x0b\x4c\xa9\x3e\x80\xba\xd7\x92\x37\xc3\xe4\x73\x61\
+\x2f\x83\xfa\x90\x93\x60\x38\x05\xc3\x8c\xd0\x37\x87\x6f\xba\xc9\
+\x65\x11\x09\x3e\xfc\x21\xef\xf0\xf6\x83\x55\x90\x11\xfc\x51\x1c\
+\x66\xa8\x98\xaf\xe0\xa7\x62\x14\x1c\x3e\xd2\xb6\xc2\x49\x3e\x2f\
+\xb9\xa9\x6b\xba\x01\x94\x7f\xf4\x77\x85\x6c\x29\xa8\x18\xa7\xf9\
+\x51\x38\xfe\xa8\xf7\x23\x64\xa1\xbb\xee\xae\x1c\x1e\x38\x75\x02\
+\xf7\xdd\x7b\x3b\x06\xfa\x7a\x60\xf9\x93\x67\x64\x6b\x07\x14\x58\
+\x5c\x2f\xe3\xb5\xf3\x0b\x58\x5a\x2f\x07\xbd\xf9\x8a\x89\xc5\xf2\
+\x66\x9d\xd1\x9b\x83\x6c\x99\x3e\x3f\xd4\x04\xe2\xac\x37\x55\x8b\
+\x4e\x32\x63\x14\xbe\x28\xe5\xd0\x05\xc8\x73\xf7\xb4\x9d\x00\xfe\
+\x39\x28\x7a\x1f\x15\x55\x51\x54\x52\xb6\x20\xa0\x81\x55\x98\x68\
+\x9b\x6e\x2a\x09\x1f\xa9\xae\x07\x9c\xec\x3b\xf2\x61\xc6\x9a\xd7\
+\xec\xc9\xb3\x56\x0f\x6b\x25\xb1\xd6\x94\xd8\x14\x64\x8b\x61\x7c\
+\x5e\xfc\x70\x05\xd1\xf9\xa5\x3f\xa5\xc8\x7b\x0a\xea\x00\x25\x14\
+\xe3\xad\x49\x45\x95\x17\x72\xf7\x90\x6a\xcb\x40\xc5\x40\xea\x21\
+\x38\x3d\x7b\xa7\x4c\xfa\x94\x52\x0c\x0d\xf4\xe2\xf1\x87\xee\xc6\
+\xc9\x13\xb7\xa0\xa7\x2b\x07\x4b\xf3\x13\xee\xc1\x63\x7a\xb1\x80\
+\xd7\x2f\x2c\x62\xa3\x54\xe3\x74\x4d\x13\x8b\xa3\x34\x07\x3d\xab\
+\xc5\x5f\xa3\x08\x80\x4d\xf9\x87\x8f\xba\x75\x66\x97\xd5\x60\x9b\
+\x82\xc4\xcd\x90\x10\x67\xec\x57\xca\x22\xee\x20\x50\x0f\x43\x84\
+\xd1\x87\x5f\x49\xb5\x2f\xca\xed\xa5\xe3\x9c\xf6\xfa\x26\x98\xd6\
+\xaa\xf2\x5f\x23\xf5\x03\xcb\x5d\x5d\xa2\xce\x5c\xfd\xe3\xac\xeb\
+\xf6\x83\x16\x38\xea\xb2\xc5\x73\x92\x5f\x76\xe6\x72\x48\xf4\xe3\
+\x21\x26\x13\x42\xb6\x4a\x54\x40\x11\xfd\x51\x41\x18\xaf\x23\x94\
+\x4f\x83\x4f\xd6\x07\x16\x17\x4e\xea\x7a\xea\xad\x27\xbd\xe5\xb6\
+\x9b\x1a\x7a\xb2\x6c\x09\xa8\x5c\x48\xa5\xe0\x2c\x15\xfc\x2f\x00\
+\xdc\x68\xd2\xa7\x94\x62\xef\xe4\x08\x9e\x7a\xf4\x34\x6e\xbe\xe9\
+\x3a\xe4\xdc\xe9\x30\xbc\x85\x13\xe8\xdb\xb6\x8d\x8b\xb3\xeb\x38\
+\x73\x29\x98\x0e\xa3\xf2\x5d\x99\x26\x16\xab\x9a\x83\xb6\x4d\x61\
+\x53\x8a\x86\xed\xfc\xd9\x0d\x1b\x75\x9b\xa2\xd1\xb0\x51\x6f\x50\
+\xd4\x6d\xdb\x85\x53\xf0\x8c\x52\xcf\x39\xce\x64\xee\x35\xc5\x08\
+\x3c\x78\x11\x58\x84\xc0\xb2\x9c\xbf\x94\x45\x90\x4e\xa5\x90\x49\
+\x5b\xc8\xa4\x09\xd2\x96\x85\x54\xca\x42\x3a\x6d\x39\x03\x58\x09\
+\x11\x9a\x73\x94\xf7\x85\x05\x06\x9c\xd0\x5b\x68\xf8\xc5\x64\xd2\
+\xf3\x4d\x5d\xdd\x4d\xd1\x3b\xb0\xb4\x76\x9a\xca\x84\x54\x99\x05\
+\xba\xea\x41\x7c\xc7\x64\x00\xf2\x3e\x72\xb9\xe9\x17\x30\x84\xc9\
+\x51\xd9\x71\x17\x60\x8a\x6a\xca\xa0\x8c\x6e\x90\xce\xbb\x23\x72\
+\x0a\xbd\xc5\x15\x1f\x4e\x7c\x29\xaa\x38\x21\x8a\x83\xda\xee\x77\
+\x52\x75\x1c\x54\x2e\xa4\xba\xe0\x6c\xba\xf0\x8f\xe0\x6c\xc2\x60\
+\x94\x9b\xae\xdf\x8f\xa7\x1e\x3b\x8d\x83\x07\xf7\xf8\xd3\x61\x3c\
+\x61\x5f\x2a\x42\x80\x4a\xdd\xc6\xdb\x57\x56\xf0\xee\xd4\xaa\x33\
+\x1d\x46\xbb\x85\x95\x97\x3e\xb0\xae\xbc\xf7\xc6\x01\x0d\x45\xbd\
+\x61\xfb\x7f\xb5\xba\x8d\x6a\xdd\xf9\xee\x01\xcb\x83\x12\x27\x8c\
+\x9f\x27\xb0\x9e\x28\xd3\xa2\x23\x3e\x5d\x89\xaf\x44\x85\x7a\x11\
+\x10\x52\xf3\x75\x2c\xcb\xf2\x01\x96\x49\x5b\xc8\x66\x52\xc8\x65\
+\x52\xc8\xa6\x53\xc8\xa6\x2d\x64\xd2\x4e\x3c\x6f\x61\x32\x6f\x83\
+\xc2\x77\x2e\xfb\xc7\x08\xeb\xd7\x57\x28\xea\x2d\x34\x28\x92\x70\
+\x97\x44\x17\x21\x06\x08\xc0\x30\xfa\xc9\x25\x25\x73\x62\xaa\xb2\
+\x72\xbc\x74\x54\x6e\x52\x52\xc9\x4a\x0a\x74\xb9\x12\xc3\x06\x42\
+\x89\xf5\x50\xf8\xb0\xa2\x0e\xcc\x74\xbe\xc6\xb3\x9e\xa8\x7c\x62\
+\x6a\x3d\xec\x2e\xe9\x28\xa8\x5c\x48\x0d\x03\xf8\xbf\x01\xfc\x0a\
+\x9c\xed\xac\x94\x42\x29\x90\x4e\x59\xb8\xed\xd8\x61\x3c\xfe\xf0\
+\x29\x8c\x8f\x0f\x23\x9d\xb2\xf4\x99\x13\x60\xb3\x5c\xc7\x1b\x17\
+\x96\x70\x65\x61\x3d\x18\x2a\x14\xba\x85\x15\x1c\x2b\xa9\xe1\x80\
+\xa8\x5a\x6b\xa0\x5a\x6f\xa0\x56\x77\x80\xd4\xb0\x69\xa4\xb5\x86\
+\x00\xc6\x52\xe2\x80\x83\xa0\x6c\xb6\x1e\x5c\x13\xd0\xd7\x16\x5c\
+\x54\x2e\x3c\x29\x45\xa3\x41\xd1\x68\x00\xd5\x7a\x03\x9b\xe5\xba\
+\x0b\xb0\x00\x5e\x5d\xb9\x0c\xba\xb2\x29\xe4\xb3\x69\x64\x5d\x70\
+\x11\x61\x20\x29\xdf\x6c\x13\xbb\xe4\x64\x5f\x85\xce\xa0\xd2\x6f\
+\xdd\x25\xdd\x92\x58\xa2\x5b\xce\xca\xf8\x1a\xab\x78\x22\x24\x36\
+\x70\x83\xb9\x2a\xa2\x55\xe4\x1c\x50\x71\x19\x18\x22\x36\xd9\x98\
+\xa6\x20\x55\xe8\xb8\xbe\x2d\x1e\x30\xaa\x6e\x48\xa1\x7e\xed\x84\
+\x93\xe9\x9a\x87\x6a\xec\x4c\xe9\x08\xa8\x18\x7f\xd4\x21\x38\x1b\
+\x81\x7e\x02\xce\xc6\xa0\x4a\xa1\x94\x22\x9f\xcb\xe2\xde\xbb\x8e\
+\xe1\x81\xd3\x77\x62\x70\x20\x98\x0e\xa3\x7a\x79\x08\x80\x95\x8d\
+\x0a\x5e\x3b\xef\x4c\x87\x61\xfd\x14\x7e\x0f\x19\x00\x6f\x0a\x8a\
+\x6d\xd3\xc0\x4a\xaa\x35\x50\xa9\x35\x50\x6f\xd8\x68\xd8\x76\xd3\
+\xb3\x08\x3a\x05\x29\xd6\x15\x24\x0e\xc6\x74\xac\x3e\xa0\xde\x68\
+\xa0\x54\x6d\x80\xc0\x81\x7b\x36\x93\x42\x57\x2e\x8d\x7c\x36\x8d\
+\x7c\x26\x85\x4c\xc6\x72\x7c\x60\xba\xa6\xa1\x1f\x26\x0f\x8c\x50\
+\x9b\x43\xe1\x08\x32\x6a\xa8\x08\x47\xf9\xf1\xec\x86\x06\x0a\x73\
+\x01\x94\x0d\x3e\xb9\xba\xba\xb7\x3a\xca\x02\x79\xda\xb3\x0b\xc0\
+\x46\x29\x41\xf8\x83\xa3\x5a\x1e\xc6\x2b\xce\x85\x5d\x44\x38\xe9\
+\x6a\xa8\x03\x94\xc6\x55\x26\xe7\xbd\x7b\x7c\xe9\xed\x07\x15\x03\
+\xa9\x3b\x00\xfc\x1b\x00\x8f\x9b\x2e\x09\xa5\x14\xfd\xbd\xdd\x78\
+\xf8\xfe\x3b\x70\xf7\x1d\xc7\xd1\xd3\x93\x77\x9b\x34\x14\xba\x65\
+\x80\x67\x97\x37\xf1\xda\xf9\x45\x67\x77\x18\xcf\xe1\xcc\xbc\x8c\
+\x9e\x45\x52\xad\x3b\x50\xaa\x54\x3d\x30\xb5\xe7\xf7\x84\x08\x16\
+\x5b\xcb\x90\x12\xf3\x63\x21\x45\x18\x90\x71\xc7\x8e\xd4\x6d\x8a\
+\x7a\xa5\x8e\x62\xa5\x0e\x8b\xb8\xe0\x4a\x07\xe0\xea\xca\x39\xbe\
+\x2f\x2b\x68\xa0\x82\x2f\x4c\xbc\x1f\x7c\x9d\xc4\x38\x4d\x94\xc6\
+\xa9\x2e\x24\x34\x5d\x53\x21\x1f\xad\x12\x65\xb5\xf9\x14\x54\xcc\
+\x4d\x1a\xef\x44\x24\xa7\x3b\xdb\xbb\x27\x32\x4b\xb9\x2a\x82\xe4\
+\xb0\x97\x4d\x38\x7e\x9a\x8d\x94\x01\x53\x1f\x85\x2b\xa1\x49\x38\
+\xa9\x2e\x33\x75\xeb\x17\xc3\xe0\xda\xb1\xd2\x56\x50\x31\x0b\xdd\
+\x3d\x0d\x67\xf8\xc1\x09\x93\x3e\xa5\x14\xe3\x23\x83\x78\xe2\xd1\
+\x53\x38\x76\xf4\x46\xe4\x73\x19\xb5\xdf\xc5\xed\xad\xa3\x94\xe2\
+\xf2\xdc\x3a\xde\xb8\xe0\x4c\x87\xb1\x98\x5f\xff\x86\x0d\xd4\xea\
+\x4e\x33\xae\x5c\x75\x9a\x72\xad\x58\x4c\x3a\x21\x2a\x08\xb5\x0b\
+\x52\xac\xbe\x7b\xac\xb4\xb6\xdc\x74\x2a\x4b\xa8\xde\xa0\xa8\x37\
+\x5c\x70\x59\x40\x26\xe5\x40\xab\x3b\x9f\x41\x77\x2e\xed\xfb\xb7\
+\xc4\xab\xac\x83\x93\x74\xfe\x21\xf1\xcd\xfe\x50\x87\xdd\x26\xfd\
+\x7d\x54\x5b\x37\xe2\x02\x77\x7c\x41\x8a\x70\x25\xdc\xe4\x35\xd4\
+\xfd\xa6\x1f\x03\x4d\xb1\xb9\xc8\x9f\x4f\x90\x07\xc7\x33\x65\xef\
+\x61\x7b\xe0\xc4\x1d\x79\xa6\xaa\xb6\x3b\x70\x77\xd0\xab\x6d\xa0\
+\x72\x21\x95\x01\xf0\x49\x00\xbf\x03\xe0\x40\x58\x9a\xeb\x0e\x4c\
+\xe2\xa9\x47\xef\xc5\xf5\xd7\x1d\x40\xc6\x9d\x0e\xa3\xfa\x65\x26\
+\x70\xb6\x54\x7f\xe7\xea\x0a\x37\x1d\xa6\x6e\x53\xbf\x29\xe7\x35\
+\xe7\xec\x36\x59\x4d\x2a\xe1\x81\xe4\xfc\x43\x14\x0a\x61\x90\x22\
+\x8c\xbe\xce\x8a\x0a\x3e\x0c\x69\x82\x68\xee\x8a\xb1\xe3\x42\xab\
+\x75\x1b\xd5\x7a\x15\xeb\xc5\x2a\x32\x69\x0b\xf9\x6c\x1a\x3d\xf9\
+\x34\xba\x73\x69\x64\xd3\x29\x1e\x5a\xcc\xc8\x6d\xe5\x54\x19\xa2\
+\x7a\xbd\xb5\x7d\x7e\x62\x52\x43\x7c\x04\x8b\x8b\x18\x5e\x58\x89\
+\x55\x41\x67\x86\x1e\x02\x9a\xd5\x0e\x04\x63\x88\x28\xf5\x84\x02\
+\xa9\x08\x1c\x39\x9e\xb2\x3f\xba\x6e\xfd\x3c\x58\xd1\x50\x00\xc5\
+\x01\x94\xc1\x99\x15\xf9\x6a\xef\x3c\x69\x0b\xa8\x5c\x48\xf5\x01\
+\xf8\x9b\x00\xfe\x1e\x80\x41\x9d\x2e\x05\x60\x11\x82\x63\x47\x0e\
+\xe1\x89\x47\xee\xc5\xe4\xe4\x58\xb0\x3b\x0c\xf3\x73\xec\x7d\x25\
+\x04\x28\x55\x6a\x78\xf3\xe2\x32\x2e\xce\xac\xa1\xe6\x3a\xc1\x2b\
+\xd5\xba\x0f\xa7\xad\x58\xad\x42\x9c\x1a\x23\x41\xa8\x8d\x90\x62\
+\xc1\xc3\x8f\xab\x12\x36\x0e\x15\x9c\xe4\xe2\x88\x78\x91\x35\xb5\
+\xba\x8d\x5a\xbd\x8a\x42\xa9\x86\x74\xca\x42\x3e\x9b\x42\x8f\x6b\
+\x69\x65\x33\xbc\xa5\xa5\x5c\x21\x4b\x70\x5b\x11\x29\xd0\x78\x05\
+\x63\xc6\xf1\x84\xa1\x3a\x7d\xc5\xd8\x24\xaa\xa0\x94\xae\x81\x18\
+\xb8\x9b\x14\xe7\xc1\x36\xcd\x18\xf6\x68\x8d\x35\x36\x4c\x60\x17\
+\x91\x4b\x0e\x8e\x88\xd7\xf3\xac\xba\xd0\xdc\xa9\xea\xae\x10\x44\
+\x40\x51\x26\x0d\xd5\xe9\x53\xb2\x6b\xa8\xd5\x32\xa8\x5c\x48\x4d\
+\x00\xf8\x27\x00\xfe\x32\x9c\xa1\x08\x4a\xa1\x94\x22\x9b\x49\xe3\
+\xae\x93\x37\xe3\xe1\x07\xee\xc6\xd0\xd0\x80\xbc\x3b\x0c\xdb\x76\
+\x20\xc0\x5a\xa1\x8a\x97\xcf\xcd\xe3\xd2\xec\x3a\xca\x55\xa7\x69\
+\xb7\x55\x70\xf2\x84\x5b\x76\x65\xab\x20\x25\x34\xf5\x38\x0b\xc7\
+\xe8\xb7\x52\x00\xce\xaf\x56\x10\x58\x6f\xd8\x28\x94\x6c\x6c\x96\
+\x05\x68\xe5\x33\x4e\x2f\xa2\xc6\xa2\xd2\xdd\xaa\x30\x69\x66\x29\
+\x5c\xdd\x48\x04\xc5\xcd\xd1\x38\xca\x85\x84\x8c\x7f\x4b\xf6\x3f\
+\x05\x24\xf2\xb8\xa5\x36\x6a\xf8\x79\xa3\x54\xf2\x5c\xcb\xa4\x60\
+\xf9\xc3\x2f\x0b\x43\x85\x72\x9a\x68\xda\x09\x81\xba\x16\x1e\x35\
+\x6b\xec\x78\x69\x1a\x54\x8c\xd3\xfc\x08\x9c\xdd\x8a\x3f\x88\x90\
+\xe9\x30\x3d\xdd\x79\x3c\x70\xef\x09\x9c\xba\xeb\x04\xfa\x7a\xbb\
+\xfd\x5f\x70\xe9\x81\x77\xaf\xe5\xd4\x62\x01\x3f\x78\x63\x06\xd3\
+\x4b\x9b\x1d\xf1\x37\x45\x17\x95\x75\xe3\x7e\xc4\x82\x94\xa1\x67\
+\x4f\xab\x13\xd5\x8a\xd2\x00\x4a\x01\x1c\x3e\x0b\x82\x7a\x83\xa2\
+\x50\xaa\x63\xb3\x5c\x47\x3a\x55\x41\x57\xce\x6b\x1e\x66\x90\x4e\
+\x59\x81\x2f\x90\xf2\x3e\xb6\xf6\x08\x6d\x3a\x3a\x00\x80\xe9\x35\
+\x64\x9a\x56\x9c\x95\x43\x64\x67\x36\x21\x01\x78\x7c\x27\xbb\x93\
+\xab\xb4\x24\x8c\x7f\xc8\x98\x5a\x6e\x1a\x31\x9e\x70\x43\x17\xc4\
+\x3b\xa1\xf3\x5f\xe9\x2e\x41\x38\x9c\x38\x76\xfa\xf0\x54\x34\x09\
+\xdb\x7a\x1f\x3b\x2b\x4d\x81\x8a\x81\xd4\xfd\x70\xa6\xc3\xdc\x67\
+\xd2\xa7\x94\x62\x78\xb0\x0f\x8f\x3f\x74\x37\x6e\xbb\xf5\x66\xe4\
+\xf3\x59\x66\xce\x9e\xab\xc3\xe8\xd6\xea\x36\xde\x9d\x5a\xc5\x0f\
+\xce\xcc\xb8\x0b\xdd\x6d\xdf\x15\x35\xf7\xf0\xf1\x56\x4e\x3c\x48\
+\x45\x70\x9a\x9b\x20\x45\xd4\x75\xe2\xab\x43\x14\x61\xe2\xd9\x70\
+\x87\xa8\x37\x6c\x6c\x14\x9d\xe6\x61\xc6\x83\x56\x57\x06\xdd\xd9\
+\x94\x33\xae\x8d\x50\xc5\xb3\xde\xca\xfd\x51\xf9\xb8\xa8\x3a\x5a\
+\x7a\xd7\xa8\x32\x37\xb1\x67\x8f\x57\xd7\x0d\x5d\x90\x72\x50\x0b\
+\xeb\xb7\xf2\xd3\x09\xc0\x51\x4c\xaf\x0a\xaa\xc4\xc0\x90\xfa\xf6\
+\x99\x3a\x1f\xd5\x79\x1a\x5c\x50\xca\xa5\x6f\x84\xd3\xd6\x5f\xb9\
+\x9d\x2d\xb1\x41\xc5\x2c\x74\xf7\x61\x38\xd3\x61\x6e\x36\xe9\x53\
+\x4a\xb1\x6f\xcf\x28\x9e\x7a\xf4\x5e\x1c\xbe\xe1\x10\xb2\x99\xb4\
+\xf3\x0b\x4d\x01\x7f\xa2\x2f\x85\x33\x4d\xa5\x61\xa3\x52\x6b\xe0\
+\xcc\xa5\x65\xbc\x72\x6e\x1e\xa5\x4a\x63\x9b\x21\xe5\x7e\x32\xff\
+\x10\x01\x42\x81\x5e\x07\x21\x45\x78\x28\x9a\xac\x28\x25\xa0\x04\
+\x7d\xfe\x9c\x84\x73\x66\x02\x6b\x0d\x1b\xb5\x62\x15\x1b\xa5\x2a\
+\xb2\xe9\x14\xba\x5d\x4b\x2b\x9f\x4d\x23\x95\x22\x0c\xa4\x14\x3f\
+\xd3\x0a\x67\x76\xe4\xeb\xce\xf9\xa0\xe4\x66\x63\x50\xa2\xc1\x17\
+\xe5\xf6\xcc\x48\x0b\xe8\x79\xa9\x45\x07\x3c\x11\xc7\x35\x09\xff\
+\xba\xff\x50\x0d\xc7\x38\x18\x68\x74\x18\xa3\x2c\x68\x46\x08\x3e\
+\x36\x0a\x05\xaa\x62\xc1\x89\xa9\x37\x35\xb3\x79\x37\x49\x2c\x50\
+\x31\xd3\x61\x7e\x01\xc0\x3f\x86\xe3\x9b\xd2\x0a\x01\x70\xe4\xf0\
+\x01\x3c\xf1\xe8\xbd\xd8\xb7\x77\x12\x99\xb4\xbb\x86\x94\xfb\x8f\
+\x6d\x3b\xf3\xe5\x1a\x0d\xe7\x21\x29\x57\xea\x78\xf5\xfc\x02\xce\
+\x5c\x5a\x66\x16\xba\xdb\x1e\xd1\x3a\xcf\x01\x48\x51\xa1\x3e\xa9\
+\x70\x00\x71\xb0\x21\x44\x5d\x0f\xf0\xd0\x09\x6b\xe6\x49\x40\xe3\
+\xb3\x62\xee\x93\xbe\x39\x47\x00\x80\xc2\x19\xc1\x5f\x6b\xb8\xbd\
+\x87\x29\x74\xbb\x3d\x87\xf9\x6c\xda\x1d\x5c\x2a\x48\xac\xb7\xc2\
+\xd0\x0f\xa8\x00\x9e\xec\x3b\x12\x94\x38\x9f\x0c\x11\x03\xe0\x58\
+\x35\x62\x4e\x2a\x77\x37\xd1\xea\xb0\x68\xe4\x7d\x5a\x7c\x3c\xe5\
+\x76\xad\x11\x46\xb4\x8b\x5d\x8c\x5c\x42\xfd\x65\x34\xc1\x49\x17\
+\xbf\x9b\x21\x05\xc4\x00\x95\x0b\xa9\x21\x38\xbd\x7a\x7f\x03\x4e\
+\x2f\x9f\x52\x28\xa5\x48\xa7\x53\x38\x79\xeb\x8d\x78\xf4\xc1\xbb\
+\x31\x32\x32\xec\xee\x0e\xe3\xc4\x35\xdc\x91\xe2\xb6\x4d\xfd\xe9\
+\x2d\x1b\xc5\x2a\x5e\x38\x3b\x87\x0b\x33\x6b\x9a\x35\xba\xb7\x5a\
+\x78\x80\x70\x2f\x39\xe7\x97\x8a\xe3\x38\x6f\x1e\x52\x46\x2b\x2a\
+\xa4\x89\xa7\x02\x94\x7e\x83\x51\xf6\x40\xbe\x09\x36\x85\x3f\x1c\
+\x64\x7d\xb3\x8a\x6c\xda\x42\xb7\x3b\x4e\x2b\x97\x49\x39\x9d\x23\
+\x21\xad\x27\xdd\xb5\x0e\xc4\x64\x8e\x88\xe1\x0a\x38\x39\xee\x27\
+\x1e\x3b\x82\xc5\xc4\x0f\x77\x80\x34\xee\x2a\x68\x9d\x89\x4e\x76\
+\xbe\x59\xa7\xb4\x28\x29\x9f\x47\xa0\x25\x3b\xf7\x83\x2c\xe4\x61\
+\x0a\x26\xbf\x95\xa8\xa1\x83\x13\xa5\xe6\x5b\xb1\x5b\x00\x16\x09\
+\x54\x2e\xa4\x7a\x01\xfc\x2e\x80\x5f\x84\xb3\x7c\xb0\xfa\xc4\xdd\
+\xe9\x30\xa7\xef\xbe\x15\xf7\x9d\xba\x1d\xfd\xfd\xbd\xb0\x08\xf1\
+\xa7\xb1\x34\x6c\xca\x8d\x75\x22\x04\x58\x58\x2d\xe1\x87\x6f\xcd\
+\x62\x66\x69\x73\xbb\xaf\x87\x5b\x27\xd9\x2f\xa5\x77\x9e\x33\xe9\
+\xe4\xae\xba\xe8\x90\x32\xf8\xa3\xa2\x5a\x51\x91\x01\xa5\x83\x93\
+\xce\xf1\xae\x09\xb0\x29\x45\xb9\xd6\x40\xb9\xd6\xc0\x6a\x31\x68\
+\x1e\x76\xe7\xd2\x3c\xb4\x3c\xa1\x8a\xbc\x94\xbe\x13\xa1\x54\xe3\
+\x9a\xe2\x8a\x71\x48\x54\x61\xf7\xa8\xbb\xf0\x82\x23\x9d\xb3\xdc\
+\xbb\x2e\x8c\xc3\x5c\xde\x32\x4b\xdc\x8c\x94\x8d\x57\xcf\xfb\xd3\
+\x2d\x17\x43\x79\x7a\x69\xfd\x4e\xf2\x39\x09\xb1\x9c\x63\x4c\x83\
+\xa3\xdd\x42\x29\x44\x00\x15\xe3\x38\xff\x38\x9c\xd5\x38\x8d\x90\
+\xea\xef\xeb\xc6\xa3\xf7\xdf\x89\xdb\x4f\xde\x82\xae\x7c\x1e\x94\
+\x52\x54\x0d\xa3\xc4\x2f\xcf\x6d\xe0\x87\x6f\xcd\x62\x65\xa3\xb2\
+\x03\xac\x28\xe1\x5d\x55\xf9\xa5\xc0\x03\xc1\xfb\xae\x1a\x71\xae\
+\x6e\xfa\xb5\x07\x52\xa2\x2f\x2a\xb4\xf7\x4f\x07\x28\x95\x35\xa6\
+\x3c\x10\xf2\x17\x42\xa9\xed\x2c\xff\x5c\xa9\x36\xb0\xe6\x59\x5a\
+\x79\xc7\x09\x9f\xf5\xa0\x25\x0a\x8d\xf6\xae\x50\xbf\x8e\x54\x03\
+\x3b\xa1\xe9\xc7\x39\x83\x98\x70\x26\x11\x55\x76\xad\x89\xd3\x68\
+\x82\xf2\x54\x3d\x8c\xbe\x0f\x4c\x61\xfa\x70\xf9\x28\x5a\x78\x62\
+\xad\x44\x1f\x97\x0e\xac\xe1\xbb\xd8\x78\x1f\x41\x3d\xb4\xbd\x82\
+\x3b\xe0\x7d\x8b\x2a\x51\x9b\x7e\x3d\x70\x9c\xe7\xc6\xcd\x40\x27\
+\x46\x9d\xe9\x30\x47\x6e\xbc\x01\xa9\x74\x0a\xb5\x7a\x43\x3b\xbf\
+\xce\xb6\x29\xde\x99\x5a\xc5\x4b\xef\xcc\x63\xb3\x54\xdb\x11\x90\
+\x72\x84\x7d\xd1\xd5\x7e\x29\x25\xa4\xb8\x28\xd3\x38\x29\x03\xa4\
+\x0c\x4e\x73\x6d\xf3\x50\xa8\x9c\x68\x45\x89\x80\x52\x59\x4f\x7a\
+\x38\xa9\xa1\xa4\xd6\x0d\x0e\x39\x4b\xcb\x22\xc8\xba\x23\xe2\xf3\
+\xd9\x14\xf2\x99\x14\x52\xcc\x90\x07\xa2\x84\x95\xe0\x3c\x37\xf9\
+\x6b\xc4\x1a\x98\x1c\xe8\x9c\x2a\xe1\x1d\xd9\x3e\xf0\x58\x47\xbb\
+\xd4\x86\x94\xe1\xc2\x24\x13\xbf\xfb\x5a\x7e\x18\x03\x31\xe9\xc4\
+\xa9\x04\x43\xef\xdf\xb8\x70\xd2\x89\xc9\x3a\xdb\xe9\x12\x15\x54\
+\x29\x00\xf9\xb0\xab\x30\x3e\x36\x84\xfd\xfb\xf6\x80\x58\x16\xea\
+\x75\xdb\xa8\x5e\x6b\xd8\x98\x5e\x2c\x60\xb3\xbc\x73\x20\x25\xaf\
+\x88\x00\xb5\x5f\x4a\x70\x9e\x7b\x11\x92\x85\xd2\x2c\xa4\x08\x8f\
+\x08\xb3\x0f\x4b\x5d\x9f\x58\x80\x12\xe0\x64\x6a\xee\x79\x87\x54\
+\x0a\x56\x3b\x91\xa8\x4d\x51\xae\x3a\xf3\x2f\x2d\x42\x90\x4e\x11\
+\xe4\x32\x29\x1f\x5c\x19\x6f\x70\x29\x97\x5c\x2c\x50\x4d\x2a\x45\
+\x5f\x9f\xc4\x16\xc7\xe2\xe1\xf3\xa3\x3c\x9d\xf8\x2c\x24\xd2\x68\
+\x8e\x15\x3e\x2c\x2f\xbd\x34\xe5\xc6\x3f\x0c\xd2\x52\xee\x3b\x04\
+\x18\xb2\x65\xa8\x1c\xf8\x88\x0c\x27\x4f\x57\xb5\xa2\xc2\x0e\x79\
+\xed\x22\x49\x54\x50\x95\x00\x9c\x37\x29\x10\x42\x70\xe6\xed\xcb\
+\x20\xd6\x77\xf1\xd8\x43\xa7\x30\x34\x34\x64\x5c\xd7\x29\x97\x49\
+\xe1\xd4\x2d\x93\x48\xa7\x2c\xbc\x3b\xb5\x8a\x06\xa5\xdb\x7a\xe1\
+\x88\xe2\xed\x54\x37\xf9\x42\x86\x21\xf8\x7a\x2a\xf0\xc4\x83\x54\
+\x78\x53\x4f\x01\xb2\xa6\x00\xa5\x9e\xe0\x2c\x1f\x0a\xe5\x4b\xb4\
+\x52\xdf\x41\xb6\x01\x56\xab\x53\x54\xeb\x75\x14\xca\x75\xa4\x18\
+\x6b\xab\x8b\x69\x22\x72\x68\xf0\x7d\x40\x80\x48\xaa\xa0\x85\x27\
+\x38\xbc\xa5\x0a\x08\x0e\x77\xc5\xf6\xeb\x2c\xbb\x74\x4e\x76\x16\
+\x70\x4a\xbf\x93\x5c\x33\x88\x30\x14\xfd\x61\x3e\x84\x04\xef\x3e\
+\xd7\x6a\xf4\x06\xa2\x36\x61\x39\xf9\x6b\xa6\xcb\x67\x8a\xdd\x84\
+\xaa\x54\x98\x42\xe1\xea\x0b\xe8\xdd\x7f\xb7\x0d\xe0\x0a\x80\xc7\
+\x00\x8c\xea\x2f\x10\xc5\xfc\xc2\x0a\xe6\x17\x96\x30\x36\x32\x80\
+\xfe\xfe\x5e\x63\xde\xb9\x4c\x0a\x93\x23\x3d\x20\x84\x60\x79\xbd\
+\x84\x46\x83\x6e\x9b\x75\xc5\x5b\x53\x6c\xb3\xce\x0f\x54\xc4\x09\
+\x90\x22\x26\x48\x91\xe6\x21\xc5\x2c\xa6\x4e\x84\x7a\x84\x42\x4a\
+\x4c\x2b\x7c\x21\xcc\xf9\x78\x7f\xc1\x57\x37\xd6\xcb\x43\xd4\xe1\
+\x83\xa2\xfd\x05\xd5\x01\xa5\xce\x6a\x0f\xe5\xaa\xb3\x38\xe0\x66\
+\xb9\xe6\xfa\x33\xa9\x7f\xde\xc4\x22\xcc\xe6\x19\xce\x17\xee\x27\
+\x8d\xb3\x8e\x04\xcb\xc9\x0b\xf7\x96\x0b\xe2\xaf\x8c\xf3\x2f\x65\
+\x43\x64\x57\x3e\x21\x62\x2a\x11\x96\x94\x23\x31\xef\x54\x17\x86\
+\x2a\x28\x06\x30\x04\xee\x35\x21\x8e\xf2\xe1\x6c\x7a\x9d\xe8\xec\
+\x82\xb1\xc1\x2e\x8c\x0d\xaa\x66\xb6\x11\xac\x6d\x6c\xe2\x95\xd7\
+\xdf\x46\xa9\xa4\x1c\x58\x4d\x01\x7c\x11\xc0\x4b\x85\xab\x2f\x60\
+\x3b\xc5\x8a\xa1\xfb\x1a\x80\xdf\x00\x70\x36\x4c\xf1\xfc\xa5\x69\
+\x7c\xfe\x2b\xdf\xc2\x3b\xe7\x2e\x98\x77\xd5\xa0\x40\x2e\x9d\xc2\
+\xed\x37\x8e\xe1\x9e\xa3\x93\xe8\xce\xa7\xb7\x65\x9a\x0c\x37\x04\
+\xc1\x0f\xe4\x23\xc5\x26\x9f\xdc\xc3\x17\x11\x52\x6c\x39\x42\x73\
+\x50\x0b\x29\x36\x9d\x00\x4b\xef\x88\x5d\xdd\x93\x78\xe9\x34\x80\
+\x22\x90\x01\xc5\xc2\x09\x3e\x9c\xc4\x38\x05\x0e\x44\x02\x69\xff\
+\xf8\x84\x62\x7e\xb6\xdb\xe9\xb2\x5e\xac\x62\x61\xad\x84\x99\xe5\
+\x22\x66\x97\x8b\x58\x5c\x2b\x63\xbd\x58\x45\xa5\xd6\x70\x3a\x64\
+\x5c\x4c\x71\xc3\x2b\x3c\xf0\xf9\x17\x55\x65\x12\x8a\x2f\xa1\x0b\
+\x3c\x31\xad\xda\x37\xae\x63\x87\xdf\xa9\xa6\xed\x54\x64\xd2\x13\
+\x45\x98\xe4\x53\x63\xac\x2e\xee\x53\x23\xde\x64\x66\x76\xc2\xb4\
+\xff\x47\xdd\xd5\xa8\x5a\x1c\x58\x65\xa5\xf3\xd1\x95\x3b\x24\xa1\
+\x16\x15\xe0\x5b\x55\x00\xf0\x36\x80\x1f\x01\xb8\x05\x86\x65\x5c\
+\x08\x21\x28\x6c\x96\x70\xf9\xca\x0c\xba\x72\x19\x8c\x8d\x8d\x20\
+\x95\xd2\x17\x45\x08\xc1\xe8\x40\x17\x06\x7a\x72\x58\xde\x28\xa3\
+\x5c\x69\x6c\xa9\x65\x25\x59\x53\xaa\x66\x9d\xa9\xc9\xa7\x1a\x86\
+\xa0\xb2\xb4\x98\xb2\x44\x48\xf9\xb9\xea\x20\xe5\x9b\x4f\xac\x85\
+\xc1\x03\x33\x00\x92\x19\x50\xe0\xc2\xd8\x7a\xaa\xe1\x14\x54\x02\
+\x3e\x78\x88\xf7\xc7\xe4\x6a\xfe\x23\x3e\x50\x89\x02\x62\x62\x79\
+\x36\x75\x96\xf1\xa9\x54\x1b\x28\x55\xea\xd8\x2c\x39\x6b\x6c\x55\
+\x6a\x36\x6a\x0d\x1b\x36\xe5\x37\x99\xf7\xad\x1d\xa5\xc7\x5d\x61\
+\x8b\xf8\x96\x0c\xe1\xe3\x88\xda\xfa\x0a\x80\x26\xfe\x40\x11\x65\
+\xde\x01\x34\xfd\x62\x84\xbc\x88\x54\x06\x15\x00\xc7\x5d\x7b\xca\
+\x9c\xa5\xd6\x57\xa7\x8e\x1c\x1d\xec\xc2\xd8\x60\x37\xa7\x4c\xdd\
+\xe7\x2b\xd4\xa2\xa2\xf4\x4b\x5d\x93\xb7\xbe\xb4\xf2\xd6\x97\xb1\
+\x9d\x12\x09\x54\x00\x07\xab\x2b\x00\xbe\x0b\x60\x3f\x9c\x09\xc9\
+\x4a\xab\x8c\x10\x82\x72\xa5\x8a\xcb\x57\x67\x00\xbb\x81\xc9\x89\
+\x51\xa4\x33\x19\x63\x19\x83\xbd\x39\x8c\x0e\x74\x63\xad\x58\xc5\
+\x66\xa9\xb6\x25\x17\x20\xac\xc9\xa7\xb2\x62\x44\x48\x31\x2a\xfa\
+\xe6\x20\x53\x16\xf7\x3d\x8a\x25\xa5\x6b\xea\x09\x56\x94\x0f\x11\
+\xa6\x3e\x6c\x13\x0f\x4c\x98\xca\x7a\x92\xe0\x24\x82\x89\x01\x92\
+\xfa\x62\x1a\xfe\x8c\xaa\x02\xbc\xd8\x38\x12\x58\x08\x8d\x06\x45\
+\xa5\xd6\x40\xb9\x52\x77\x9b\x8a\x75\x94\x2a\xce\x88\x79\x6f\x45\
+\x0d\xaa\xba\x9e\x02\x5b\x54\xe3\xac\xfc\x28\x8d\xe3\x8a\x0f\x67\
+\x60\x26\x99\x3d\xbc\x09\xe4\xef\xa2\x2d\xe6\x2b\x0d\x59\x90\x1b\
+\x9f\x94\x49\x2f\xd6\xd6\x08\x27\xf0\x46\xdb\xd8\x60\x17\xc6\x06\
+\xba\xe5\x41\x1a\x51\x40\x05\x7c\xb1\xff\x86\x87\x5f\x5a\x78\xf1\
+\xbf\x6d\xa1\xe9\x20\x4b\xac\x29\x34\xb3\xcf\xfd\x3e\x00\x60\xf2\
+\xf4\xa7\xde\x06\xf0\x4b\x00\xa6\xe1\x4c\xa7\x51\x2e\xed\x42\x08\
+\x41\xa9\x5c\xc5\x9f\x3f\xf7\x32\xd6\x0b\x9b\x78\xe4\xc1\x7b\xd0\
+\xd7\xd7\x67\xdc\x85\x63\x7c\xa8\x0b\x0f\x9d\xd8\x87\x17\xce\xce\
+\xe1\xd2\xec\x5a\x47\x9b\x82\x51\x9a\x7c\x46\x48\xb1\xff\xb2\x4d\
+\x3e\xf8\x01\x1a\x48\x71\x2a\x88\x0a\x29\x95\x15\x15\x94\xcf\xd7\
+\x85\xd1\xe4\xce\x8b\xf0\x05\x6b\xce\x9f\x98\x61\xa4\x3d\xd4\xa5\
+\xe2\xcd\x03\x5d\x33\x89\xb5\x4a\xd9\xae\x7a\xfe\x1c\x02\xab\xa2\
+\xde\x70\xac\xab\x52\xd5\x83\x9a\x73\x1d\xd3\x29\x67\x9b\xb1\x4c\
+\xca\x72\xbf\xbb\x6b\xc8\x13\xc0\x22\xae\x9e\xe7\x64\x26\x42\x3d\
+\x0c\xc3\x06\x64\x0f\x13\x13\x4b\xe0\x3f\xd7\xa2\xe3\x5a\xe5\x65\
+\x12\xd7\xae\xa2\xde\x1a\xd0\x21\x43\x08\x82\xf9\x7b\x21\x83\x3a\
+\x4c\x56\x57\x4c\x39\xf0\xd4\x13\x78\xe3\x3f\x72\xb7\x68\xcb\x1d\
+\x34\x4d\xad\x9e\x30\xfb\xdc\xef\x63\xf2\xf4\xa7\xe6\x00\xfc\x26\
+\x80\x29\x38\xd3\x6a\x86\x54\xba\x84\x10\x34\x1a\x36\x7e\xf4\xca\
+\x59\x6c\x14\x8a\x78\xf2\xd1\xd3\x18\x1b\x1b\xd5\xc3\x8a\x02\x03\
+\x3d\x59\xdc\x7f\xeb\x1e\xf4\xe4\xd2\x78\xeb\xf2\x32\xea\x76\xa7\
+\x7a\x04\x05\x18\xb1\x20\x00\x03\x11\x46\x55\x4c\x2e\x41\x8a\x85\
+\x53\x70\x11\xc0\x7f\x15\xf2\x6f\x12\x52\x12\xa0\x44\x3d\xf1\x14\
+\x8d\x80\x22\x72\x98\x10\xa0\xd1\x88\x7e\x9d\x95\xe5\x0a\x2f\x33\
+\x15\x74\x08\xd3\xe3\xc7\xfa\xad\xbd\x6b\xe3\x9a\x24\x9e\x4f\x06\
+\xb6\xb3\xf9\x05\x6b\x9b\x78\xcd\xcd\xb4\xbb\x8b\x8f\x95\x72\xf7\
+\x4e\x74\x8f\x53\x29\xe2\xac\x29\xcf\xdd\x4f\x68\x76\x4b\x16\x68\
+\xe2\x1d\x2a\x9b\x9c\xac\x0a\x55\x46\x12\x30\x80\x63\xc6\x32\x70\
+\x30\x12\xfc\x58\xea\x35\x41\xc1\xe8\xc2\xdf\xda\xcd\xa6\x14\xf5\
+\x46\xb0\xbb\x92\xb7\x35\x9c\x07\xbc\xf0\x15\x71\x29\xf9\xf2\xc7\
+\x80\x14\x8f\x51\x25\x52\x3b\x29\x4d\xaf\x47\xe5\xc2\x6a\x03\xce\
+\x32\x2f\x53\x70\x96\x1f\x3e\x68\xb8\x7e\x38\x7b\xee\x32\x36\x8b\
+\x25\x3c\xf5\xe8\x69\x1c\x3c\xb8\x5f\x7f\x69\x28\xd0\x95\x4d\xe3\
+\xae\x9b\x27\xd0\x9d\xcf\xe0\xd5\x77\x17\x50\xae\xb6\xd7\x6f\x25\
+\x5a\x53\x6a\xab\x4a\x48\x23\x34\xf9\x88\x98\x40\xd9\xec\x90\xf7\
+\xfd\x63\xbf\xb7\x1f\x52\x62\x1a\xae\x62\x7a\x7d\xc5\xf9\x6b\xc1\
+\xa4\x83\x5d\x04\x91\x7f\xf5\xc5\x73\xa0\x1a\x68\x11\xae\x87\x4c\
+\x0b\x2c\xef\x54\xfd\xe6\x99\xbb\xfd\x99\xed\xec\xe0\xe3\x24\xf7\
+\x7a\x15\x83\x46\xb1\x65\x39\x2b\xcf\x12\xcb\xd9\x1c\x36\x45\xe0\
+\xee\x9d\x48\xfc\x3d\x14\x9d\xf5\xd3\xfc\xda\x20\x58\x03\x55\x7e\
+\x7f\xd9\x71\x53\x54\x88\x83\x10\xc7\x8e\xa3\x0a\x9c\xf3\x1e\x4c\
+\x78\xb8\xd8\xde\xa7\xed\xed\x37\xe9\x86\xb9\x7b\x4f\xda\xd4\xdb\
+\x38\x37\xd8\xfe\x6d\x65\xa3\xc7\x75\xa5\xf0\xc3\x32\x08\x21\xb0\
+\x23\x6c\x84\x9a\x12\x67\xc6\x07\x03\x53\xb6\x0c\x56\x2d\xad\xf0\
+\xe9\xc2\xaa\x06\xe0\xbf\x03\x98\x81\xb3\xeb\xcc\x49\x9d\x3e\x21\
+\x04\x57\xa7\x17\xf0\x85\xaf\x7e\x1b\x8f\x3f\x7c\x0f\x6e\xb9\xf9\
+\x46\x58\xa9\x94\xd2\xba\xa2\x70\x4c\xf8\xe3\xd7\x8f\xa0\x3b\x9f\
+\xc6\x8b\x67\xe7\xb0\x51\xac\xb6\x71\xd9\x17\xde\x9a\xf2\x0f\x43\
+\x7a\xf9\xa4\x97\x97\x88\x59\x70\xed\xbd\xd6\x20\xc5\x15\x63\x80\
+\x54\x44\x2b\xca\x08\x28\x13\x9c\x54\x4d\x64\xdd\xf5\xd4\x8a\xdc\
+\xf5\x2f\x35\x07\xa9\x50\x2f\x01\x5a\x01\x9c\xdc\x6f\x21\xc0\x72\
+\xb2\x20\xfe\xd8\xa9\x60\x23\x6c\xaf\xf9\xe8\xf5\x8a\x39\x8e\x7b\
+\x37\x4b\xb7\x38\xaa\xdc\x95\x9b\xbd\x9f\xec\x33\xc1\x1e\x4b\x23\
+\x38\xdd\xc3\x00\x61\x2e\xa4\x18\x0b\xc7\x76\xcc\x20\xd8\x34\x80\
+\x6b\x00\x28\x0a\xdb\x76\x80\xe4\x6d\x86\x0b\xc6\x2a\xe2\xc7\x78\
+\x05\x25\x78\xe7\x13\x67\xaf\x4a\xcd\x7d\x63\x7f\xba\xa9\xf0\xa9\
+\x38\xd9\xf6\x4b\xcb\x4b\x11\xbb\xb0\xa2\x00\xbe\x01\x67\x2e\xe0\
+\xbf\x01\xf0\x04\x34\x4f\x2e\x21\x04\x4b\x2b\xeb\xf8\xea\x37\xbe\
+\x87\x8d\xc2\x26\xee\xba\xe3\x38\x32\x99\xac\xf6\x42\x12\x42\x70\
+\x78\xef\x20\xba\x73\x19\x3c\x7f\x66\x16\x8b\x6b\xa5\x96\x2d\x2b\
+\xdf\x9a\x32\x5a\x55\x31\x9b\x7c\x4c\x84\xdc\xf4\x0b\x8e\xc4\xb2\
+\xbd\x73\xe4\xeb\x16\x36\x44\x41\x84\x94\xd9\x8a\x8a\x06\x28\x19\
+\x4e\xea\xcb\x2c\x53\x2b\xda\xed\x20\x0a\x6b\x2a\x38\x60\xeb\x1f\
+\xc0\x49\x01\x2d\x09\x58\x41\x93\xd0\x7f\xa5\x28\xb3\xb4\x1d\xf1\
+\x5a\x97\xee\x6e\x31\x08\xdc\x50\xc4\x9b\x46\xe3\xdd\x47\x0a\x04\
+\x83\x43\xfd\xb6\x9e\x72\xd9\x61\xe7\xab\xcd\x81\x2d\x68\xb2\x31\
+\x63\xa6\x14\xcd\xb9\x60\x98\x83\x46\x87\x2d\x8b\x0a\x79\x33\x50\
+\xd2\xbe\x33\x91\xee\x47\x44\xa1\x46\x48\x6d\x59\x53\x30\xce\x38\
+\x2a\xad\x78\x4e\x76\x00\x2f\x03\xf8\x2b\x00\xfe\x07\x80\xaa\x4e\
+\x9f\x10\x82\x42\xb1\x8c\x3f\xfb\xce\x8b\xf8\xd6\x9f\x3f\x8f\x62\
+\xb1\x18\x6a\x29\xed\x1d\xed\xc1\xc3\x27\xf7\xe1\xc0\xb8\x79\x10\
+\x69\x34\x91\xe1\xe2\x56\x8c\xfd\x60\x34\xa2\x36\xf9\x34\x7e\x29\
+\x88\xf9\xb2\x60\x8a\x06\x29\xef\x57\x5b\xea\xd5\x33\x40\x8a\x80\
+\xaf\x0f\x01\xef\x5c\x0f\x9a\x3e\x84\x0f\xe3\x20\x45\xfc\x08\xcf\
+\x59\x2d\x0e\xf4\x8c\x73\xd5\xfd\x3f\xa6\x2c\xe6\x0b\xaf\xc7\x9f\
+\x80\xf3\x1f\x13\x46\xfc\x7b\x23\x9c\xaf\x7f\x9d\x14\x4d\x67\xe1\
+\x7e\x99\x57\xb5\x10\x7e\x78\x0c\xf7\xca\xab\x5b\x70\x3a\x41\x2f\
+\x2d\x1f\x27\x7c\x67\x74\xbc\x53\xe1\x9e\x15\xc9\x62\x57\xff\xd8\
+\x75\x58\x88\xe2\x53\xbc\xfd\x1d\xad\x4d\xe4\xe1\x09\x61\x52\xb8\
+\xfa\x82\x3b\x84\xe1\xae\x35\x50\xfa\x6d\x10\x92\x02\x70\x3b\x34\
+\xab\x2d\x78\x4e\xf6\xe9\xd9\x05\xac\xaf\xad\x63\x72\x62\x04\x5d\
+\x5d\x5d\xc6\x32\xba\xf3\x69\xec\x19\xee\x41\xa5\x66\x63\x75\xa3\
+\x02\xbb\x89\xab\xa3\x1f\x8e\xa0\x80\x11\x6b\xce\x43\xd4\x91\x9b\
+\x83\x26\xbf\x94\x6a\xac\x54\xa8\x4f\x8a\xb3\x9c\x08\x1f\xef\x43\
+\x06\x7e\x1d\xc4\x97\xd6\x4b\x4c\x88\x1a\x50\x1c\x68\x45\x38\xf9\
+\xc3\x12\xc4\x38\xf1\x82\xb2\xd0\x21\x86\x3f\xfd\xcd\xe2\xe1\xc5\
+\xbf\x03\x32\xc7\x42\x80\xc5\xa6\x16\xaf\x29\x7b\xde\x1d\x80\x95\
+\xca\x8a\x65\xeb\x21\x02\x53\xf9\xac\x31\x67\x2e\xfd\xe8\xb1\x0f\
+\x07\xc4\xef\x7a\xd9\x33\xd2\x83\x3d\x23\x3d\xf2\x75\x27\x04\xa5\
+\x52\x19\xaf\xbd\xf9\x8e\x71\x1c\xd5\xe6\xd4\x8f\x5e\x42\x60\xd4\
+\xb0\x77\x52\x4c\xd0\x31\x58\xb5\xc5\xa2\x62\x65\xf6\xb9\xff\x80\
+\x67\xfe\xfb\x7f\x58\xb6\xeb\xe5\xdf\x02\xe8\x3f\x00\x30\xaf\xd3\
+\x25\xc4\x71\xfc\xbd\x76\xe6\x3c\xbe\xf8\xd5\x6f\x63\x7a\x7a\xd6\
+\xf8\x2b\x41\x29\xd0\xd3\x95\xc1\xbd\xc7\x26\x71\xe2\xf0\x28\xb2\
+\x69\xab\xf5\xe1\x0b\x44\xf3\xa9\x52\x13\x21\xc5\xc6\x1a\x20\xc5\
+\xea\xa9\x86\x44\x44\x83\x14\xff\x9c\x2a\x27\x30\x6b\xac\x28\x3f\
+\x3a\x22\xa0\x14\x03\xc9\x99\x68\x01\x40\x91\x6d\x2b\x7e\xc0\x27\
+\x07\x30\x51\x93\x01\x9f\x64\x69\x85\x01\x4b\x1a\x5b\xc6\xdf\x13\
+\xd5\xf5\x12\xef\x5b\x1c\x58\xf1\xf7\x50\x78\x2e\x84\xce\x0e\x22\
+\x1d\xb0\xd7\x86\x29\x57\x65\x45\x89\x10\xdb\x32\xab\x8a\xea\xc0\
+\xa4\xb3\xae\x3a\x52\xa3\xb6\x83\x0a\x00\xf9\xaf\x47\x08\x99\x7f\
+\xe1\x0f\xca\xd5\xb5\xe9\x7f\x0f\x6a\xff\x0a\x80\x77\xc2\x12\x39\
+\xd3\x6e\xbe\x89\x73\xe7\x2e\xc0\xd4\xdc\xa5\x14\xc8\xa6\x53\xb8\
+\xfd\xc6\xf1\xd8\xd3\x6e\x94\xd6\x14\x14\x0f\x81\x7b\xa0\x1a\xd8\
+\x09\x46\x93\x7f\x90\xf8\x4f\xf6\xa9\x54\x35\xe9\xa0\xaa\x8b\xe6\
+\x17\x97\xcf\x8e\xf8\xf5\xd2\xbf\x74\x0a\x2b\x4a\xac\x37\x17\xc6\
+\x34\xeb\x14\xd7\x8c\x87\x92\xee\xe2\xb2\x80\xe1\xff\xcc\x8f\x2e\
+\x0f\x2e\x51\x37\x80\x53\x04\x60\xb1\xf7\x53\xea\x11\xe5\x9b\x82\
+\xcd\xc2\x4a\xf7\x2c\x71\x97\x97\x03\x25\x4f\x4d\xee\x99\x63\x80\
+\xa4\xbf\xa8\xe0\xf2\x56\xfe\x7a\x74\x5e\xa2\xc0\xca\x58\xcb\x56\
+\xa5\xdd\xa0\xe2\x28\xbb\x7c\xe6\x8b\xf6\xd2\xeb\x7f\xf4\xc7\xb4\
+\x51\xfb\x45\x00\x3f\x30\x26\x24\x04\x73\x0b\x2b\xf8\xe2\xd7\xbe\
+\x83\x97\x5f\x79\x13\x76\xc3\xbc\xb1\x83\x65\x11\x1c\x3d\x38\x8c\
+\x07\x8e\xef\xc3\x60\x5f\xae\x39\xcb\x2a\xe6\x65\x96\xad\x2a\xe7\
+\x0b\xdb\xe4\x0b\x74\x09\x17\x44\x0c\x0f\xb9\x04\x29\x01\x8e\x3c\
+\xa4\xc0\xbf\x17\x44\xf5\xb2\x69\xac\x28\x11\x50\x4c\xd3\x8e\xbf\
+\x17\x01\xa0\x54\x17\x41\x09\x24\xee\x2a\xf1\x7f\x04\xd0\x43\x4c\
+\xca\x5e\x0d\x2d\x1d\xb0\x58\xb2\x88\xd6\x95\xd2\x77\x25\xc0\x8a\
+\x6f\xbe\x7b\xd7\x8f\x39\x57\xc3\x8f\x0d\x7f\xdb\x79\xdf\xa5\xb2\
+\xa3\x46\x02\x1e\xff\x83\xa4\xfc\x81\x34\xfd\xa0\x6e\x99\x55\x25\
+\x9f\xb2\x21\xac\x23\xb0\x6a\x27\xa8\x54\x15\x25\xb5\xcd\x25\x6b\
+\xee\x87\xff\xf9\xbb\x76\xad\xfc\x0b\x00\xfd\x02\x80\x86\x36\x03\
+\xe2\x0c\xe9\xff\x93\x6f\x3e\x87\xef\x7d\xff\x45\x54\x2a\xe5\x50\
+\x27\xfb\xc1\x89\x3e\x3c\x7c\x62\x3f\x26\x47\xba\x8d\xdd\x0e\xb1\
+\xac\x29\x08\x0f\x0b\x91\xf5\xfd\x53\x64\x9e\x56\x89\x57\xc2\x03\
+\xc9\xd5\x83\x0d\x17\x20\x25\x45\x69\x81\xa6\xb2\x1a\xc4\xaa\x89\
+\x80\x72\x53\x1b\xac\x27\x91\x10\x32\x90\x88\xf6\x4f\x0c\x41\x98\
+\xbe\x01\x5c\x01\xb4\xc0\xe7\xc4\x00\x4b\x6b\x5d\x71\x20\x0a\x03\
+\xbe\x19\x56\xfc\x57\xcd\x0f\x93\x04\x32\xfe\xd9\x60\xb3\x12\x7f\
+\xf0\xb4\x12\x19\x01\x1d\x24\x55\x30\x87\xc7\x54\x8b\x8e\xc3\xaa\
+\x5d\xa0\x0a\xab\xa8\x35\xff\xe2\x1f\x9c\x6d\x94\xd7\x7f\x05\xd4\
+\xfe\xff\x00\x94\xb5\x19\x11\x82\x52\xb9\x86\x3f\x7f\xee\x65\xfc\
+\xe9\x9f\xfd\x05\x36\x36\x36\x42\x61\xe5\x4c\xbb\xd9\x8f\xeb\xf7\
+\x0c\x44\xff\x75\x61\x6a\xa8\x7c\x70\xf4\x4f\x2a\xff\x0c\x2a\xd5\
+\x75\xbf\x7c\xb2\x25\x40\x84\x97\x25\x08\x23\x91\x5e\x2c\xbf\xee\
+\x4a\x4b\x40\x78\x01\x19\x2b\x8a\x0f\x92\xad\x27\x13\x98\x74\xd6\
+\x11\x21\x92\xaa\x51\x57\xce\x5b\x07\x2d\x03\xb0\xd8\x5c\x58\xeb\
+\x8a\xbb\x5e\x41\x64\x33\xb0\x52\xf9\x03\x03\x06\xc9\x0f\x9c\xda\
+\x9a\x92\x7e\x79\xe4\x72\x23\x38\xd6\xb7\xc9\xaa\xda\x76\x58\xb5\
+\xa3\xd7\x2f\xea\x49\x90\xe2\xec\xeb\x85\x4c\xdf\xe4\x77\x53\xd9\
+\xde\x2a\x21\xd6\x9d\xd0\xac\x1a\x4a\x88\x33\x46\x64\x66\x7e\x09\
+\xcb\xcb\x2b\x98\x18\x1b\x46\x4f\x4f\x0f\x4c\x92\xcf\xa6\xb0\x67\
+\xb8\x07\xb6\x4d\xb1\xbc\x5e\x86\x6d\x43\xb8\x89\x44\x02\x40\x58\
+\x4f\x9f\xf6\xe1\x61\xc8\xc6\xe9\x80\x81\x91\x00\x27\x39\x4e\xd7\
+\xb3\xc8\x97\xc9\xeb\xe9\x5e\x28\xe6\x45\x12\xea\xc9\xe9\x09\x56\
+\x94\xe4\x77\xe2\x20\x21\x58\x49\x1a\xab\x47\xff\x48\x44\x50\x94\
+\xac\x29\x35\xb4\xd8\x04\x12\xb0\x78\x93\x4a\xb2\xae\xe2\xc0\x0a\
+\xca\x6b\xcb\xdf\x7b\xe5\x8f\x95\xca\x5f\xe5\xd7\x57\x4a\x26\xd4\
+\xc1\x70\x09\xa3\x7c\x4a\x09\x64\x69\xad\xd7\xcf\xfe\xf2\xe6\xf4\
+\x4b\x62\xaf\x9f\xae\x26\x1d\x83\x55\xab\xa0\x8a\x4b\x5a\x52\x5e\
+\x7c\xa7\x0a\xbb\xf1\x83\x6c\xdf\xe4\x0c\xb1\x52\x77\x02\xe8\x37\
+\x15\xb0\xb8\xb4\x86\x99\xd9\x79\x8c\x0c\xf5\x63\x60\xc0\xa8\x8a\
+\x4c\xca\xc2\xc4\x70\x0f\x32\xe9\x14\x96\xd6\x4b\xa8\xbb\x0b\xf1\
+\x69\x97\x71\x21\x1a\x58\xf8\x0f\x74\x04\x90\x41\x9f\xbf\xd2\x9a\
+\x52\xfd\x9a\x0b\x3d\x7c\x92\x65\x14\xe1\x57\x9f\xfd\xb5\xf7\x00\
+\x10\x44\x08\x0d\x56\xc1\x82\x52\x59\x38\x2c\x9c\x54\x2f\x45\xd8\
+\x50\x04\xd6\xcf\xa5\xfc\x53\x3c\xbb\x3a\x68\xe9\x80\xc5\xb2\x23\
+\x00\x16\x0f\x81\x38\xb0\xe2\xae\x9f\xe2\xe9\x35\x39\xd7\xd9\x73\
+\x10\x9f\x01\x21\x52\xed\x7e\x50\xfd\xe8\x45\xb2\xaa\xc4\x1f\x64\
+\x59\x5a\x03\x55\xe3\xcb\x9b\xd3\x2f\xbd\xcc\xdc\x10\x18\x3e\x11\
+\x51\x27\xb6\xb4\xd2\xf4\x6b\xb6\xd2\x64\x73\xe6\x95\xfa\xf2\x9b\
+\x9f\xfb\x1f\x76\xad\xf4\xcb\x00\x7d\xdd\x58\x08\x09\xa6\xdd\xbc\
+\xf9\xd6\x3b\xa0\xd4\xd6\x36\x05\xd9\x69\x37\xa7\x6f\xdd\x83\xbe\
+\xee\x0c\x93\x8f\x58\x11\x55\x35\x85\x87\x80\x08\x9f\xaa\x93\xd4\
+\x98\xf4\x4a\x48\x29\xae\x9e\xaa\x87\xcf\x0b\x88\x07\x29\xe2\x57\
+\x94\x08\x75\xe0\x99\x25\x5b\x50\xcc\xad\xd1\xc2\x29\x6c\x48\x41\
+\x6c\x11\x41\x26\x14\xa8\x84\x27\x11\x2f\x91\x00\x5c\xff\x1a\x32\
+\xbe\x2b\x5f\x4f\xd4\x89\x0a\x2b\x8d\x73\x5d\x73\x8f\xc5\x73\xe0\
+\x3e\xa5\xfb\xaf\x22\x22\xf3\x3d\x92\x55\xa5\x7e\x8e\xdb\x28\x51\
+\x6d\xbb\x8e\xc2\xaa\x59\x50\x11\xcd\x71\xd4\xca\x92\xda\xe6\x12\
+\xe6\x5f\xfc\xaf\x7f\xd2\x28\x6f\xfc\x55\x50\xfa\x2d\x18\xc6\x24\
+\xb0\xd3\x6e\x9e\x7f\xe1\x55\xd4\x6a\xe6\x39\x7f\xde\xb4\x9b\x87\
+\x4e\xec\xc7\xe8\x40\x17\xbf\x56\x90\xa2\x36\x44\x38\xd6\x9e\x8a\
+\x44\x2d\x22\x67\x17\xe1\xe1\x54\xf9\xa5\xc4\x97\x27\x3e\xa4\x20\
+\xeb\x70\x3f\xe6\x3c\x0c\xc2\x20\xe0\xa7\xd1\xf4\xfe\xf9\xf6\x0e\
+\x89\xf9\x27\x5e\x13\xf6\x3c\x4c\xce\x7c\x43\x5d\x95\xd6\x15\x6b\
+\xfd\x48\xd7\x5d\xbe\xde\x46\x58\xa9\x9c\xeb\x0a\x90\x99\x9a\x80\
+\xca\xfb\x2c\x7e\x2a\x7f\x18\x75\x56\x95\xe6\xb3\x23\xac\x6a\x0b\
+\xac\xa0\x39\x8e\x24\xcd\x80\x2a\x0a\xc2\xc3\x48\xea\x3d\x3e\xa9\
+\x85\x97\xff\xe7\xcb\xb5\xcd\xf9\x4f\x81\xda\x9f\x06\xa0\x5d\x2d\
+\xcf\x5b\x35\xf4\xcf\xbe\xf3\x42\xac\x69\x37\x0f\x9d\xdc\x8f\xfd\
+\xc2\xb4\x1b\xf1\xe6\x2b\xc3\x89\xe9\xe1\x11\x3e\x4d\xbf\x8e\x21\
+\xe6\xbe\x94\x1f\x0b\x1e\xc8\x65\x87\x43\x8a\xc8\x3a\x8a\x66\x9e\
+\x1e\x50\x6a\x38\x89\x60\xd2\x7a\xcf\xc3\xfe\xdc\x74\xe2\x74\x1c\
+\xfe\x5e\x43\xae\x03\x57\x4f\xf6\x9a\x06\xd7\x53\xbb\xcb\x34\xf3\
+\x4f\x3c\x58\xf1\x95\x12\xe1\xa1\x7a\xba\xc5\x67\x82\xfb\x51\x12\
+\xca\x6d\xcd\xaa\x8a\x92\x47\x5b\x25\x0c\x3c\x61\x56\x53\x14\x6e\
+\x68\xa5\x19\x1f\x55\x5c\xba\xea\x28\xeb\x7f\x2f\xcd\xbf\xb5\x96\
+\xee\x1e\xfa\x4e\x2a\xdf\x9f\x26\xc4\x3a\x09\x40\xb9\x14\x28\x21\
+\x04\xb6\x6d\x63\xca\x9f\x76\x33\x6a\x9e\x76\x43\x9c\x69\x37\x93\
+\xc3\xbd\xa8\xd6\x6d\xac\x16\x2a\x7e\x3e\xce\xa7\xa3\x24\x37\xd1\
+\x14\xbf\xa6\x44\x13\x1e\x29\xbf\xe0\x1f\x75\x9c\xde\x79\x0e\x95\
+\x1e\x5b\x1f\xf0\x16\x07\xfb\xe2\xb3\x8e\x75\xb6\x7e\x5e\x68\xd4\
+\x9e\x35\x35\x98\x14\x18\x22\x86\x3f\xe1\xa6\x73\x8f\x81\x11\x5a\
+\x6a\x7f\x9a\x0e\xb4\xea\xe5\x9b\xe3\xc1\x8a\xbb\xbe\xc2\x8f\x84\
+\x74\xed\xc1\xe7\xa9\x34\x69\x88\x94\x5c\xfe\x34\xfe\x30\x0a\x65\
+\x09\xe9\xa1\x39\xf6\xa4\x25\x1f\x95\xdd\xf8\x8a\xeb\xa3\xb2\x84\
+\x22\x4c\xd6\x53\x14\x16\xc4\x92\xb8\xa0\x8a\x0a\xa3\x30\x48\x89\
+\x9f\xa4\xbc\x7c\xbe\x04\xbb\xf1\x5c\xb6\x6f\x7c\x95\x58\xe9\x3b\
+\xe0\x6c\x7a\xaa\x14\x4a\x81\xf9\x45\x67\xb7\x9b\xf1\xd1\x41\xf4\
+\xf5\xf5\x19\x6b\x9b\xcb\xa4\x30\x39\xdc\x03\xcb\x22\x58\x5e\xaf\
+\xa0\x61\x53\x67\x03\xcc\x30\x08\x49\x0f\xab\xc1\x39\x2e\x84\x1b\
+\x75\x84\xb2\xfc\xaa\x2a\xca\xe3\x1f\x5c\xc5\x8b\xc2\x90\x4b\x7e\
+\x61\x19\x90\xb1\x16\x06\x47\x8c\xf0\xb1\x4a\x12\x98\x44\x66\x49\
+\x04\x92\x91\xa4\x30\xaa\x04\x2d\x19\x5a\x5c\x72\x15\xb0\x98\x9b\
+\xac\x85\x95\xe2\x1a\x87\xc1\x4a\x35\x56\x4e\x7a\xa0\x15\x01\xda\
+\x1f\x2e\xf1\x81\x64\x2b\x4c\x84\xf0\x38\x86\x87\xd8\xd4\x14\x80\
+\xe8\x49\x6b\xa0\xaa\x7f\x75\x73\xfa\xe5\x97\x35\x15\x0b\x0b\x53\
+\x85\x37\x05\xad\x38\x4d\xbf\xb0\x0a\x98\x0a\x8f\x42\x5a\x6b\x73\
+\xe6\x95\xf2\xf2\x99\xaf\xfc\x27\xbb\x56\xfc\x75\x80\xbe\x1b\x56\
+\xa1\xf3\x97\xa6\xf1\xb9\x2f\x6b\xa6\xdd\x30\xcf\x01\xa5\x40\x36\
+\x93\xc2\xc9\xc3\x63\xb8\xe7\xe8\x84\x33\xed\x26\xd2\x69\xca\x0f\
+\xac\xf3\x35\xfc\x21\x33\x0e\x30\x15\xce\xbe\x33\x90\x82\xac\x03\
+\x48\x7a\x66\x40\xf1\x70\xe2\xc9\xe2\x5a\x34\xca\xff\xa2\xc5\xaa\
+\xc0\xc5\xe5\xad\x70\xdc\x73\x3e\x2c\x85\x75\xc5\xe9\x85\x58\x4e\
+\x66\x58\x41\x73\x2f\x14\xbd\x6f\x86\x57\x4f\xf2\x59\x9a\xac\x2a\
+\x5d\xf9\xd2\x0f\x69\xd8\x5b\xde\xb4\xe1\x22\x89\x62\xa5\xe8\xa8\
+\xc0\x89\x03\xb1\x50\x89\x0a\xaa\x76\xc1\x28\x2c\x3d\xa9\x15\xe6\
+\xec\xf9\x1f\xfd\x8f\xcf\xd7\x4b\x6b\xbf\x0c\x6a\x1b\x37\x13\xf3\
+\xa7\xdd\x7c\xfd\xcf\xf1\xf2\xab\xe1\xd3\x6e\x52\x16\xc1\xcd\x07\
+\x86\x70\xff\xad\x7b\x30\xd8\x9b\xf3\x57\xd5\x51\x3e\x04\x8a\x87\
+\x42\xfb\xa9\x79\x08\x4d\x57\xc7\xb7\xd0\xfc\x03\xd3\xaf\x78\x2b\
+\x90\x62\x5e\x62\x12\xe4\x27\x5a\x1d\x4a\x40\x71\x70\x12\x70\xa3\
+\xb3\xaa\x22\xfc\x05\x60\x62\xc1\xc5\xc4\x71\x57\x43\x3d\x76\x4a\
+\x0b\x63\xe9\x3c\x99\xeb\xad\x6a\xe6\x29\xe2\xbd\x4c\xb5\x50\x88\
+\xd0\x04\xe4\x9f\x43\xcd\xf7\xa6\xfd\x4c\xdc\xd5\xe1\x42\xc4\x67\
+\xb2\x0d\xc2\xdf\x0e\xa1\x98\x88\x9f\xfa\x13\x88\x08\xab\xb8\xce\
+\xf4\x66\x2b\x18\xcf\x54\xa4\x36\x59\x7c\xe5\x7f\x7d\xbf\x5a\x98\
+\xfb\x25\x6a\x37\xbe\x0a\x40\xbb\x3f\x3c\x21\x04\x6b\xeb\x9b\xf8\
+\x93\x3f\x7b\x0e\xdf\x7b\xee\x45\x54\x2a\x15\x10\x8b\x28\x33\xf6\
+\xe4\xe0\x44\x1f\x1e\xba\x6d\x1f\x26\x86\xbb\x23\x9c\xaa\xfb\x3d\
+\x86\x35\x65\x74\xa0\x43\xf1\x52\x40\x78\x29\xb8\x67\x96\x7d\x29\
+\xc4\xa2\xa2\x40\x0a\x46\x4b\xc3\x08\x28\x01\x4c\x1c\x70\x84\x33\
+\x8f\xfa\xa7\x4a\x28\x41\x8b\x0b\xe7\xcf\x95\xbb\x6a\x9a\xe6\xad\
+\x7f\x0e\xc2\x35\x92\x60\xe5\x69\xeb\x78\x21\x02\x41\xf1\xa3\x65\
+\x7a\x25\xb5\x3f\x64\xb1\xac\x2a\x9d\x7b\xc2\x94\x48\x53\xa1\xd6\
+\x25\x8e\x95\xd4\x2c\xc4\x94\x12\x05\x54\x51\xa0\x13\x35\x6d\x9c\
+\x93\xb1\x96\xdf\xf8\xfc\xd9\xca\xf2\xbb\xbf\x46\xed\xda\x7f\x05\
+\x50\xd1\x16\x42\xdc\x69\x37\xdf\x57\x4d\xbb\x21\xca\x5a\x8c\x0d\
+\x75\xe1\xc1\xdb\xf6\xe2\xba\xc9\x7e\xce\x11\x1a\xd9\x8a\x0a\x92\
+\xf0\x9f\xaa\x13\xd7\x24\x56\xc2\x49\xf5\xab\xee\x27\x61\x5f\x96\
+\x26\x21\xc5\xe6\x17\x0a\x28\x2f\x82\x3f\x15\xe2\x69\x78\x7e\xa3\
+\x18\x7f\xda\x6d\xb7\x04\x68\xa9\xac\x2c\xef\x20\xdc\xba\x12\xcf\
+\x5d\x03\x2b\xc6\xf2\x62\xad\x30\xfe\xde\x08\x2f\xbf\x08\x10\x31\
+\x0d\x7b\x5f\x5a\xb2\xaa\xc2\x44\x3f\x00\xb4\xbd\xe2\xaf\x9b\x1a\
+\xc7\x4a\x42\x88\x0e\x89\x9b\x36\x8a\x33\x3d\x2e\x21\x9b\xfd\x54\
+\x85\x59\xe5\xe5\x0b\x05\x50\xfa\x17\x99\x9e\xb1\x2a\xb1\xd2\xb7\
+\x03\xc8\x29\x2b\x49\xbc\x69\x37\x8b\x58\x5e\x5e\xc5\xe4\x38\x33\
+\xed\x46\x04\x8f\xfb\x70\xe4\xb3\x29\x4c\x0e\xf5\xa0\x41\x29\x56\
+\x37\x2a\xa0\x34\x78\x59\x83\x5f\x2f\xc5\xc3\x49\x98\x87\xc3\x7b\
+\xb1\x7d\x60\x69\xc2\x35\xf9\xe8\x75\x98\x47\x51\xac\x47\x04\x48\
+\xb1\x56\x85\xb2\xeb\x9e\xb1\x2c\x24\x40\x09\x26\x90\x7f\x28\x76\
+\xe3\x41\x88\x0f\xf9\xe3\x13\xc8\xe0\x62\xe3\x95\xc0\x62\x14\xd4\
+\xd6\x15\x7f\x0d\x98\x5b\x2d\x5c\x67\x39\x9e\xb7\x52\x44\x58\x89\
+\xe5\x6b\x9e\x56\x62\x88\x22\x9a\x4f\x6d\x56\x02\xfc\xcc\xca\xdc\
+\x49\xb0\x65\x50\xda\x9a\x33\x9d\xf2\xce\xf4\x76\xbc\xe3\xaa\x2b\
+\x18\x2a\x61\xa0\x8a\x0a\x97\xb8\xe1\x62\xbc\xa9\x0c\xab\xb6\x31\
+\x5b\xad\x6d\x2e\xbc\x90\x1b\xd8\x3f\x47\xac\xcc\xed\x20\x44\xd3\
+\xcd\xe7\xc8\xe2\xd2\x2a\x66\x66\x17\x30\x32\xd4\x8f\xc1\xc1\x7e\
+\x3e\x53\xee\x8e\x03\xd9\xb4\x85\x89\xa1\x6e\x64\xd2\x29\x2c\x6f\
+\x94\x51\xb7\x29\xac\x90\x1e\x3d\x7d\x38\xfb\x80\xcb\x26\xbb\x59\
+\x87\x39\x66\xf4\x64\x48\x69\xf4\xd8\x7a\x31\xa7\x68\x1c\x0c\xc9\
+\xea\x89\x2f\x83\x7f\x83\x18\x38\x09\x37\x8e\xb0\x79\x44\xf8\xd3\
+\xc2\xcb\xad\x98\xbf\x34\x2f\x13\xce\x01\x8b\x63\xa4\x07\x3a\xa6\
+\xbe\x11\x60\x15\x5c\x17\xee\xe4\x83\xeb\xc6\xdc\x1b\xfe\x4a\x04\
+\xd7\x89\xfb\xc1\x60\xc3\xd9\x7c\x45\x42\x09\xf9\xf0\x17\x3a\x94\
+\x5a\x7c\xf9\x50\x95\xaf\x12\x67\x9d\xfa\x36\x81\x4a\xd7\xfa\xd2\
+\x55\x21\x6a\x78\x18\xcc\x00\xb4\xbe\x7a\x42\x5c\x52\xc6\x3d\x29\
+\xbf\x9e\xd5\xb5\xa9\xda\xe2\x6b\x9f\xf9\x9f\xf5\xf2\xea\xaf\x81\
+\xda\x67\x8c\x95\x22\x04\x57\xa6\xe7\xf1\xf9\xaf\x7c\x0b\x6f\x9c\
+\xf1\xa6\xdd\xc8\x55\x23\x08\xa6\xdd\x1c\x3b\x34\x8c\x53\x47\x27\
+\xd1\xd7\x95\x71\xd6\xb6\xd2\xfd\x24\x4a\xd5\x54\x54\x59\x73\x36\
+\xc2\x0f\x9f\x16\x52\x7a\x67\x2d\xaf\x17\x75\x29\xe3\xa0\x4c\x1f\
+\x3d\x92\x15\x25\x59\x50\x82\xe5\xa4\x06\x13\x61\xf2\x34\xff\x17\
+\x50\x86\xc9\x57\x80\x97\x7f\x22\xa2\x95\xc5\x01\x8b\xb9\x66\xee\
+\x41\x1c\x58\xa9\xc6\x95\x05\x6a\xfc\xf9\xf2\xf7\x88\xfb\xa5\x80\
+\x90\x89\xf2\x5e\x35\x67\x55\x85\x3c\x5b\x5a\x31\x97\xdd\xa2\x98\
+\x0c\x0a\x93\x6e\x94\xf0\x48\x62\x02\x55\x54\xf2\xc5\x35\xfb\xa2\
+\x5c\x43\xa5\x25\x66\xd7\x4a\x58\x7c\xe5\xd3\x7f\x5a\xdd\x98\xfb\
+\x15\x4a\x1b\xdf\x45\x84\x69\x37\x5f\xf9\xfa\x77\xf1\xc3\x1f\xbe\
+\x82\x5a\xad\xe6\x5b\x4a\xca\x0b\x41\x08\x6e\xd8\xd3\x8f\xfb\x8f\
+\xef\xc5\xc8\x40\x5e\xda\xba\x29\xf4\x61\xe3\x9c\xb4\xba\xe1\x08\
+\xc2\x5b\x20\x9d\x2e\x78\x10\x41\xfe\xd2\x14\xa4\x02\x53\x4a\xb6\
+\xa2\x74\x80\xf2\x8e\xd9\x34\x1c\x44\x08\x1f\x2f\x26\x08\xb5\xa6\
+\x58\x78\xf1\x3a\x4c\x65\xf8\x87\x44\x61\x5d\xf9\x67\xc2\x5d\xe6\
+\x10\x58\x71\x64\x13\xee\xaf\x02\x48\xea\x1f\x16\xc3\x83\xdc\x8c\
+\x55\xa5\x4b\x2e\xfe\x90\x31\xd0\xe4\x1e\x23\xa2\x29\xbb\x55\xa1\
+\xca\x0a\xb7\x9b\x01\xa1\x4c\x68\xc7\xa4\xe4\x56\xf5\xe3\x9c\x24\
+\x01\x90\x5a\x7e\xf3\xf3\xaf\x94\x97\xce\xff\x2d\x6a\xd7\x3f\x0b\
+\xa0\xae\x2d\x90\x10\x14\x8a\x25\xfc\xe9\x9f\xbf\x80\x6f\x7e\xfb\
+\x07\xf2\xb4\x1b\x91\x04\xc4\x31\x93\x1f\x38\xbe\x17\xfb\x46\x7b\
+\x15\x7a\xaa\xea\x84\x9c\x8d\xe9\xa4\x4c\x0f\x3d\x13\xe1\xc3\x4f\
+\x91\x77\x24\x48\x09\x2f\x1c\x67\x45\x81\x01\x87\x00\x28\xd6\x72\
+\x92\x1c\xe0\x91\x60\xa4\xca\x4b\xa5\xcf\x43\x4b\xb4\xb0\xf4\x9b\
+\x53\x80\x01\x14\xe1\xaf\xa3\xe6\x1a\x88\xd7\x88\x04\x0a\x6a\x0b\
+\xc7\x04\x19\xc5\x0f\x50\x58\xd3\x4c\xf7\x43\xa7\xff\x11\x0b\x93\
+\xb0\xe6\x5f\xab\xcc\x32\x2e\x9d\xdb\x2e\x06\x84\x8a\xce\x47\x15\
+\x15\x1a\x51\x21\x13\x35\x1f\x51\x47\x1b\x5e\x59\xbe\xb0\x46\x08\
+\xf9\x5e\xba\x7b\x34\x4d\xac\xf4\x6d\x30\x4c\xbb\x69\xd8\x36\xa6\
+\x66\x16\xb0\xb6\xb6\x81\x3d\x93\xce\xb4\x1b\xfe\x79\xe0\xcd\xff\
+\xae\x5c\x1a\x93\xc3\x3d\xa8\xd6\x1b\x58\x2d\x54\x9d\x7d\xe2\x48\
+\xf0\xc0\x13\xcd\xc3\x6e\xfe\xe5\xd3\x8f\x76\xd7\xea\x40\x6d\x05\
+\xa8\x26\xbf\xaa\xf5\x84\x78\x15\xd4\xbc\x48\x16\x10\x24\x48\x20\
+\xf5\xfe\x71\x90\xd1\x0c\xe4\x54\xda\x4f\xb2\xa6\x16\x5a\x3a\x60\
+\x41\x00\x16\x73\x12\x51\x61\xc5\x3d\x50\x82\x15\xcc\x5c\x10\xf5\
+\xa1\xe1\x87\x45\x7a\x03\x75\x84\x52\x6b\x1b\x5e\x94\x90\x1f\x46\
+\x2e\x13\x22\xe5\x41\x41\x5a\xf7\x51\xcd\xbc\xf2\xb2\xb1\x8a\xf1\
+\x3e\xc3\x4f\x59\x21\xcd\x82\x2a\xca\x27\x69\x73\x7e\x52\xfe\xd5\
+\xf5\x99\x52\xa3\xbc\xf6\x7c\xb6\x6f\xcf\x3a\x49\x65\x4e\x02\x44\
+\x39\x30\x8a\xc0\xe9\xfd\x98\x5b\x58\xc1\xfc\xfc\x12\xc6\x47\x87\
+\xd0\xdf\xdf\xcb\x65\xc9\xfd\xb2\x02\xc8\x66\x2c\x4c\x0e\xf7\x80\
+\x10\x82\x95\x8d\x0a\x1a\x94\x46\x70\xa6\x0b\xe1\xa1\xa0\x62\xe3\
+\x45\x38\xf1\xdd\xdc\xe2\xcb\xa7\xec\xcd\x8a\xe0\x9f\xe1\x9b\x7a\
+\x04\xe2\xc3\xcd\xc2\x8c\x83\x89\xff\x55\x1e\xef\xc4\x01\x47\xf8\
+\x53\x73\x4b\x84\x97\xba\x1c\x1d\x40\x65\x58\x69\xc0\xaf\xb9\x26\
+\x2a\x66\x88\x96\xa9\xd6\x27\xc5\xa1\x83\x2b\x48\xa8\x93\x54\x84\
+\x50\x0f\xe6\xa4\x14\x79\x88\x9f\x32\x28\xf9\x67\x47\x2e\xd0\x89\
+\x6c\x4b\xaf\xdf\xcc\x2b\xaf\xa0\xb9\xa1\x4c\xcd\xea\x48\xa2\x2a\
+\x3c\x8c\x7c\xba\xf0\x66\xf5\x74\x15\x8f\x12\x6e\x95\x97\x2f\x94\
+\x97\xdf\xfc\xc2\x7f\xae\x97\xd6\x7e\x13\xd4\xbe\x18\x76\xc2\xef\
+\x5e\x9c\xc2\x67\xbf\xf4\x67\x78\x87\x99\x76\xa3\xba\xd9\x14\x40\
+\x26\x6d\xe1\xb6\xeb\x47\x71\xe7\x4d\x63\xe8\xce\xa5\x9d\x9d\x69\
+\xb9\x07\xdb\x74\x92\x61\x90\x02\xf7\x8c\xea\x7e\xd1\xd9\xc7\x5e\
+\x7e\x90\x04\x28\xfa\x7a\x41\x7e\xea\xb1\x42\xf0\x7b\x03\x65\x08\
+\xf0\xe0\xd0\xc1\x89\x71\x2d\x71\x7f\xaa\x9b\xa5\xd4\x13\x0e\x74\
+\xc0\x92\xac\x1b\xf6\x7a\x72\xd1\xd1\x60\x65\xba\x6e\x62\x39\x4a\
+\x9e\x88\xf0\x50\xe8\x4b\xf7\x41\xf1\x43\xc2\xdd\x57\xe5\xa7\xea\
+\x77\x5e\x27\x24\xa4\x0e\x6d\x93\x76\xbd\xf3\x88\x18\xee\x4b\x14\
+\x67\x7a\xd4\xf0\x76\x5f\x84\xc8\xe1\xf5\xf2\x9a\xbd\xf8\xea\xa7\
+\xbf\x50\x2d\xcc\xff\x1a\xa5\x8d\x97\x8c\x85\x10\x82\xd9\xf9\x65\
+\x7c\xee\x2b\xdf\xc6\x4b\x2f\x47\x9b\x76\x73\x64\xff\x10\xee\xbd\
+\x65\x12\x03\xde\xb4\x1b\x0e\x0a\x3a\xc0\x84\x5d\x3a\xf6\x05\x31\
+\x0c\x34\x25\x4a\x75\xf0\x96\x01\xfb\x32\x04\xca\x3a\x48\x99\xac\
+\x28\x11\x50\x3a\x38\x05\xe5\xc6\xfc\x63\x5e\x43\x09\x5a\xd0\x83\
+\x92\xb5\xae\x82\x6b\xc6\x5a\x31\xc1\x17\x11\x70\xec\x7d\x22\xd2\
+\x75\x64\xe2\xd8\xab\xa2\xf8\xc1\x60\xaf\x5f\x98\x55\x15\x4f\x88\
+\x31\x94\xaf\x4a\x38\xb4\x9a\xaa\xc2\xd6\x4a\x6c\xb6\x58\x2d\x66\
+\xd0\xac\xf5\xd5\xae\xf2\x02\xa1\x94\x2c\xbf\xf1\xb9\xef\x57\x96\
+\x2f\xfe\x2a\xb5\xeb\xdf\x40\x84\x69\x37\x5f\xfd\xd3\xef\xe3\x3b\
+\x7f\xf1\x82\xbb\xdb\x8d\x65\x2c\xe0\xc0\x58\x2f\xee\xbf\x75\x0f\
+\xc6\x87\xcc\xbb\x39\x3b\x79\xf0\x0f\xaf\xf8\x8b\xac\x83\x92\x7f\
+\x24\x51\x2a\xf8\xcd\x54\xfb\x5a\xd8\x7c\x62\x40\x4a\x61\x45\x29\
+\x01\xc5\xd6\x91\x1d\xa8\xa9\xb1\xaa\x8c\x7f\xc4\xb3\xe6\x08\x57\
+\x97\x28\xc0\x62\x41\x14\xd4\xd7\x0c\x2b\xbe\xef\x84\xbf\x86\xe2\
+\x65\x57\x5d\x5f\xd1\x32\x16\xef\x93\xde\x74\x10\xee\x97\x08\x45\
+\xae\x3c\x36\x61\xc8\x0f\x1f\x11\xce\x5d\x61\xe9\xf1\x37\x98\xbd\
+\xae\x2d\xc9\xb6\xbe\xeb\x29\x4d\xe4\x6e\xfd\xb4\xca\xcb\xe7\x17\
+\x49\x2a\xfd\x5c\xba\x6b\xb8\x8f\x58\xe9\xa3\xd0\xf8\xe1\x08\x21\
+\xa8\xd5\xeb\xb8\x32\x35\x87\xe2\x66\x11\x7b\x27\xc7\x90\xcb\xe7\
+\x84\x4b\xc4\x3b\x9e\x7b\xf2\x69\x8c\x0f\x76\xa3\x54\x6d\x60\x63\
+\xb3\x0a\xef\x01\xd4\xf9\x37\xb8\x5f\x5f\x2e\xdc\x10\x0f\xfd\xc3\
+\xad\x7a\x01\x4d\x3b\x2a\x87\x42\xca\x00\x03\x15\xa0\xa4\x01\x99\
+\xec\x53\x13\xf5\x4f\x4c\xc2\x8d\xc5\x52\x03\x8b\xaf\x96\x78\x4e\
+\x31\x60\xc5\x96\x2f\x5e\x63\xb1\x72\x82\xbe\x14\xcc\x31\x44\xf1\
+\xe3\x12\x09\x0c\x44\x9d\xb7\x32\x79\x58\x86\xfa\xe6\xdf\x64\x7b\
+\x7d\x54\xad\x1a\x17\x71\x01\x07\xa0\x33\xa0\x22\x9a\xfc\x74\xe1\
+\xed\xfe\x24\xd5\xb5\xa9\x82\x5d\x2d\xfe\x20\xdb\x3b\x51\x27\xa9\
+\xf4\x6d\x00\xd1\x4c\xbb\x21\xb0\x29\xc5\xf4\xec\x22\x96\x96\x57\
+\xb0\x67\x7c\x18\xbd\xbd\xc1\x0d\x65\x5f\x00\x47\x1f\xc8\x67\xd3\
+\x98\x18\xea\x46\xc3\xa6\x58\xdb\x64\xa6\xdd\x28\x7f\x35\x03\xf0\
+\x28\xe1\x24\xe8\xf0\x2f\x55\xb8\x0e\x3f\xe2\x9d\xa9\x71\x5c\x48\
+\xf9\x47\x82\xc5\x02\xc2\x01\x8a\xbb\x7b\x04\x60\xd7\x3b\x8f\xfc\
+\x9f\x68\x86\x79\x5f\x89\x77\x9e\x32\xb0\x88\xaa\xae\x2a\x28\xfb\
+\xdf\x85\xa7\x02\xf2\xb5\xe4\x9f\x03\xe1\x3a\x8b\x69\x54\x20\x62\
+\xca\xd0\x3f\x8c\xba\xfc\x54\x59\xa9\xdf\x73\x75\xde\xe1\xd0\x62\
+\x65\xcf\x48\x0f\x26\x9b\x07\xd5\xd7\x5c\x50\x91\xd0\x82\xc2\xc3\
+\x9b\x16\x16\x54\x71\x01\x23\x86\x37\x0b\x17\x5d\xfa\x56\xc2\x49\
+\xbd\xb8\x54\xad\x6e\x4c\xbf\x98\xeb\xdf\xb7\x60\xa5\x72\x27\x40\
+\x08\xbf\x1e\xb1\x20\x0b\x4b\xab\x98\x9e\x99\xc7\xe8\x48\x3f\x06\
+\x07\x07\xc0\xfd\xc6\x0a\x30\xc8\xa4\x2c\x8c\x0f\x75\x21\x9d\xb2\
+\xb0\xb2\x51\x41\xbd\xe1\x4e\xbb\x69\xd5\x9a\x32\x59\x4c\x2a\xb8\
+\x68\xe3\x88\xd0\x82\xd0\x43\x8a\xb3\x52\xb8\x97\x9c\x1f\x44\xc9\
+\xc1\x89\xb5\x74\x58\x09\xb1\xa2\x02\x35\x26\x0f\xd1\xd2\x22\xfe\
+\x3f\x3c\xb0\x24\x58\xc9\xe7\xc5\xc3\x8a\xbd\x36\xcc\xb5\x56\x5c\
+\x37\xa5\x70\xf7\x5c\x0f\x0c\xb6\x7e\xfc\x49\x68\x13\x09\x84\x62\
+\xef\xb5\x2a\xbd\x9a\x84\xaa\x1f\x24\xf1\x93\x00\xfe\x14\x9a\xc9\
+\x91\x1e\xe9\x54\x9b\x00\x55\x5c\x6b\x28\xec\x38\x72\x78\x1c\x67\
+\x7a\xd4\xca\xc4\x95\xa6\x2b\x1f\x56\xdf\x5a\x61\xa1\xb6\xf8\xda\
+\x1f\x7d\xba\xb6\x39\xff\x1b\x94\xda\x67\x8d\x95\x20\x04\x97\xa7\
+\xe6\xf1\xc7\x5f\xfc\x26\xde\x78\xe3\x6d\x50\xdb\xe6\x7f\xf5\x99\
+\x87\xd1\x9b\x76\x73\xcb\xc1\x61\xdc\x75\x64\x1c\xbd\x5d\x19\x6e\
+\xff\x08\x26\x01\xf7\x10\x1b\x9e\x3b\xfe\x04\x74\x57\x9a\x09\x33\
+\x39\x80\xb9\xe4\x21\x90\x92\xac\x28\xcf\x07\xc5\x96\xe7\x5b\x35\
+\x84\xaf\x07\xf1\xd5\xcd\xfe\x2a\x41\x8f\xcf\x46\xb0\xb4\x98\x34\
+\xea\xba\x0b\x50\x25\xea\x6b\xcb\xc1\x4a\xf9\x84\x08\x90\x8f\x70\
+\x5d\xd5\xf7\x56\xa3\xc2\x9c\x9f\xee\x56\xea\x44\x7f\xfb\x49\x68\
+\x9a\x88\xea\x5b\x2d\x2d\xb3\x24\xca\xf0\x84\x4e\x54\xb4\x5d\xe9\
+\xc3\xc2\x09\x6d\x54\xb1\xf4\xfa\x67\xff\xac\xba\x7a\xf9\xd7\xa9\
+\x5d\xff\x3e\x42\xa6\xdd\x2c\x2e\xaf\xe1\x0b\x5f\xfb\x73\x3c\xf7\
+\xfc\xcb\xa8\x55\x6b\xc6\x1e\x41\x42\x80\xeb\x26\xfb\x71\xef\x2d\
+\x93\x18\xee\xcb\xc9\x85\xb3\x9f\x44\x91\x98\x8d\x64\xde\x26\xe9\
+\x21\x97\xac\x24\xf9\xd7\x5b\x39\xb0\x39\x06\xa4\x3c\x7d\x8e\x23\
+\x22\xa0\x14\x50\xd2\xe2\x49\x3f\x88\x8a\x83\x97\x04\x2d\x01\x58\
+\xb2\xf3\x5f\xb4\x9c\x44\x1d\xd1\x12\x26\xdc\xf9\x2a\x8d\x1a\xed\
+\xd3\xc3\x1f\x8a\xd1\xf2\x91\x21\x53\xf1\x47\x44\xd1\x0b\xa9\x4b\
+\xaf\x7e\xab\xd5\xbf\x62\xb2\xf1\xd6\x71\x5a\x6d\x09\x2f\xda\xb5\
+\xa5\xbb\xae\x80\xc8\xd6\x4f\x8b\xe9\xc3\xf2\xb5\x56\xce\x7e\xed\
+\x95\xd2\xdc\x99\xbf\x4b\x1b\xd5\x2f\x22\x6c\xda\xcd\x66\x09\xdf\
+\xf8\xd6\x0f\xf0\x7f\xbe\xf5\x7d\x14\x37\xe5\xdd\x6e\xc4\x42\x26\
+\x87\xbb\x71\xfa\xd8\xa4\xd2\x61\xa9\x7b\x90\xc3\x5a\x05\x44\x77\
+\x45\x98\x30\xb9\x85\xc1\xbe\xe4\xcd\x41\xca\x8f\x22\x0a\x40\x71\
+\x15\x70\x2d\x2f\xd1\xaa\x62\x41\xa6\x08\x67\xcc\x25\xbf\x4e\x2a\
+\x60\xf1\xd6\x15\x61\xce\xc8\xab\xba\x1a\x56\xe2\xb9\xc8\x56\x6a\
+\xf4\x1f\x02\xd1\xaa\x12\x9b\x59\xc4\xf8\x19\x89\x72\x41\x4d\xa4\
+\xfb\x2e\xdd\x5c\x6d\xb9\x6a\x89\x08\xd0\x50\x91\x7e\xd7\xe3\xbe\
+\x7b\x6d\x11\xcf\x47\xa5\x3a\x2b\x12\x23\x5c\xfb\xde\xed\xa0\x4f\
+\x52\x59\xbb\xb2\x46\x1b\x95\xe7\x32\xbd\xe3\x59\x92\xca\x1c\x83\
+\x61\xda\x4d\xbd\x61\xe3\xea\xcc\x3c\xd6\xd6\xd6\xb1\x77\x72\x14\
+\xdd\xdd\x5d\x4c\x3c\x7f\x3f\x08\x01\xba\x72\x4e\x8f\x60\xad\x6e\
+\x63\xad\x58\xf5\xf5\x62\xf9\xac\x54\x4d\x10\xa2\x09\x67\x2a\x22\
+\xbf\x68\x7c\x59\xb1\x21\xc5\x22\x89\x4d\x23\xc2\x09\xf1\x45\x62\
+\x95\x06\x58\x92\x75\x45\x42\xea\xc9\x9d\x1f\x73\x93\x18\x3d\x19\
+\x5a\x21\x15\x35\xea\x84\x83\x40\x02\x22\x77\x14\x7e\x9d\xd8\x34\
+\x66\x5d\x22\xd7\x97\x49\x32\x39\xdc\x4a\xaf\x5f\xed\x6b\x9a\x91\
+\xe9\xcd\x02\xab\x29\xe3\x43\x07\x2a\x12\x31\x7c\x37\x7d\x12\x00\
+\xa4\xb6\xb9\x50\xaa\x15\x97\x5e\xc8\xf6\x4f\x16\xac\x54\xf6\x36\
+\x10\xa2\x1c\x18\x45\x88\x33\xfd\x60\x76\x7e\x19\x73\xf3\x8b\x98\
+\x18\x1d\x42\xff\x40\x9f\x1f\x17\x5c\x94\xe0\x21\xc9\x66\x2c\x8c\
+\x0f\x76\xc3\x22\x04\xab\x85\x0a\x6c\x9b\x22\x18\x01\x1e\x06\xac\
+\x20\x9c\x1d\xd1\x1c\x19\x60\x42\x3e\xfe\xc9\x93\x26\x21\x45\xd8\
+\xf3\x24\xfe\xb1\xf4\x34\xf9\x63\xaa\xa2\xfd\x71\x49\xc1\x58\x5a\
+\x22\xb0\x14\xd7\x97\xe8\xea\x2b\xd6\x93\x4d\x1b\x24\xe4\xaf\xa7\
+\x5f\xfd\x68\x56\x95\xf2\xc1\x12\xad\x1b\x08\x07\x21\x9f\xcd\x34\
+\xff\x4c\xd0\xd2\xc5\x70\xa0\x62\xaf\x6d\x74\x50\xbd\x6a\x2c\x38\
+\x9a\xb4\x04\xac\x66\x36\x77\xd8\x29\xd2\x34\xd1\xab\x6b\x57\x4b\
+\xcb\x6f\x7c\xe1\x0f\x6a\xc5\xa5\x7f\x0a\x6a\x5f\x0e\x2b\xe8\xdc\
+\x85\x29\x7c\xe6\x0b\xff\x07\x67\xdf\x3e\x0f\xde\x14\xe6\xdf\x5c\
+\x6f\xb7\x9b\x5b\xaf\x1b\xc6\xc9\xc3\xa3\xc8\xe7\xd2\xf0\x97\xb6\
+\x52\x3c\xd4\xe2\xaf\xa6\xf8\x30\x6a\x21\x25\xe8\xab\xba\xcf\x5b\
+\x81\x14\x67\x45\x89\xbd\x7f\x6e\x3d\x82\xa1\x09\x31\x6f\x9a\x0e\
+\x5a\x9c\x85\x25\x5b\x57\x5a\x58\x31\xf1\xd2\x39\x2a\xae\x75\x24\
+\x6b\x4a\xa7\x2b\x9b\x6d\x92\xbe\xfe\x9e\x86\x17\x66\x1e\xfc\xa9\
+\x2a\x91\xa8\xf3\x89\x71\x8a\x3b\x40\x22\x55\x33\xaa\x39\xd7\xf1\
+\x8a\x18\xf4\x5a\x35\x1d\x55\x7a\xa4\x51\x2d\x34\x96\x5e\xff\xe3\
+\x2f\x56\xd6\xa6\x7e\x83\xda\x8d\x57\x8d\x09\x08\xc1\xcc\xdc\x12\
+\x3e\xfb\xa5\x6f\xe2\x47\x2f\xbd\x8e\x46\xc8\xb4\x1b\xcb\x22\xb8\
+\x71\xdf\x00\xee\x39\x32\x8e\xfe\x1e\x77\x21\x3e\xb1\x9a\x66\x6a\
+\x85\x34\x4b\xd4\x79\xe8\x7e\xed\xfd\x50\x0d\xa4\x58\x7f\x14\x6b\
+\x45\xe9\x00\xa5\xab\x52\xd8\x9f\xea\xba\x4a\xeb\x5f\x05\xff\x70\
+\xf5\xd7\xc2\x4a\x79\x29\x08\x5f\x31\x3f\x4e\x03\xfa\x56\xac\x2a\
+\xf1\xbe\xea\x6e\x99\x26\x2f\xb5\xae\x26\x94\x08\x5f\xa5\x7b\xac\
+\xce\xa9\xf3\xfe\xf4\xce\x73\xa3\x9d\xce\xf4\x56\x81\xd4\x6e\xbd\
+\xb0\xf4\x04\xd4\x26\x2b\x6f\x7d\xf9\xb9\xf2\xe2\xdb\x7f\x97\x36\
+\x6a\xdf\x44\xc8\xb4\x9b\xd5\xb5\x02\xbe\xf4\xf5\xef\xe1\xdb\xdf\
+\x79\x1e\xe5\x72\x39\xd4\xc9\xbe\x7f\xac\x07\xf7\x1e\x9d\xc0\xd8\
+\x60\x97\xa4\xa3\xfb\xe5\x95\x1e\x68\x4d\x33\x41\xfd\x63\xcf\xdb\
+\x19\x60\xf3\x34\x40\x8a\x09\x06\x6b\x45\xb1\xe7\xae\xb2\x80\x82\
+\x3f\xcf\xfc\x31\xff\xb1\xdb\xb8\x8b\xd7\x4d\x5e\x8d\x94\xb9\x1a\
+\x3a\x58\x71\xf1\x2c\x90\x00\xfe\xbd\x0e\xf9\x71\x88\x22\x3a\xab\
+\x4a\x09\x0d\xd9\xc2\xd5\x95\x19\x05\x58\xd1\x8c\x3f\xc3\x8f\x5e\
+\x13\xa7\x1b\xf1\x6a\xb4\x4b\x2f\x54\x44\x1f\x55\x2b\x9f\xaa\xb7\
+\x44\x15\xae\x3b\x0e\x0b\xef\xd4\xa7\x55\x59\xb9\xb4\x08\xd0\xe7\
+\x33\xdd\xa3\xfd\x24\x95\x3e\x82\x90\x69\x37\x97\xaf\xce\x62\x73\
+\xb3\x88\x7d\x7b\xc6\x90\xcf\xe7\x99\x78\xe1\x34\x08\xd0\x93\xcf\
+\x60\x6c\xa0\x0b\xe5\x4a\x03\x1b\xa5\x9a\xd3\x14\x24\xc1\x83\x65\
+\x06\x92\x79\xb4\xbb\xf4\xeb\xef\xbf\x2c\x86\x26\x5f\x28\xa4\x64\
+\x2b\x8a\xbf\x06\xec\x79\x06\xb7\x89\x30\x71\x26\x2b\x8a\x7a\x69\
+\x08\x1b\xc6\x3f\x36\x54\xd2\x67\xf4\x28\x11\xe2\x9d\x7f\x28\x13\
+\xc0\xe9\x31\x71\x9e\x65\x1b\x7c\x12\x4d\x38\x5f\x2f\x2e\x1f\xf6\
+\x93\xd1\xd3\xe6\xe1\x7e\x61\xc3\xf5\xba\xf2\xa7\xb6\x6c\x49\x9f\
+\x3a\x9f\x5c\x9c\x13\x30\x39\xd2\x83\x3d\xc3\xf2\x78\xe7\x98\xce\
+\xf4\xce\xdb\x65\x06\x49\x37\x91\x66\xcb\x69\xba\x05\x62\x6d\x4e\
+\xbf\x3c\xdb\x28\xaf\xff\x5e\xdf\xa1\xfb\xe6\x52\xb9\xde\xbf\x0c\
+\xa8\x37\x90\x20\x84\xa0\xd6\xb0\xf1\xfc\x8b\x6f\x62\xa3\x50\xc4\
+\xfb\x9e\x7c\x00\x13\x13\x63\xe0\x17\x5a\x0f\xbe\x51\x4a\xd1\xd7\
+\x9d\xc1\x5d\x47\xc6\xd0\x75\x39\x8d\xf3\x33\xeb\xb0\x6d\xca\xf3\
+\x2c\x2a\xa4\x84\xbc\x8d\x4d\xbd\x10\x48\xc9\xe5\xcb\x56\x14\x7f\
+\xde\x42\x22\x20\xb4\x49\x41\x40\xd0\x9d\x4f\x21\x9d\x62\x60\xa3\
+\x18\xc5\x46\x15\x81\x6c\x58\x00\x84\x80\x3a\xdc\x77\xea\x87\xa8\
+\xc3\xd8\xfc\x68\x90\x96\xba\x8a\xa2\x0e\xf7\xe2\x2b\xc2\xbd\xef\
+\xd4\xff\xce\xe6\x6d\x28\x83\xd2\x90\x78\x27\x9c\x06\x85\x19\xea\
+\x22\x9e\xaf\x3a\x6f\x4a\x29\xba\x73\xc2\x6b\x4e\x82\x74\x6d\x96\
+\xa8\x39\xc7\xae\x41\x33\xa0\xea\xb4\x6c\x17\xe0\xac\xf2\xf2\xf9\
+\x8d\x7a\x79\xf5\xdf\x0f\xde\xf8\xe4\x6c\xba\x6b\xf0\x57\x41\xac\
+\x09\x5d\x05\x29\x80\x37\xde\xba\x80\x42\xa1\x88\xf7\x3f\xfd\x20\
+\xae\xbf\xee\x80\xf6\x74\x28\x75\xb6\xe6\x3a\x71\xfd\x08\xba\x72\
+\x69\x9c\xbd\xb2\x8a\x6a\xdd\x86\x79\xbd\x06\xc3\x95\x11\x9b\x17\
+\x82\x31\xca\xe1\x92\xb5\xda\xb8\x60\x35\x14\x9d\x30\xd1\xd2\x0a\
+\xca\x50\xfb\x44\x78\x90\x7a\x92\x4a\x11\x1c\xd9\xd7\x8f\xd1\xfe\
+\x9c\x12\x50\x00\xb8\x97\x4d\x7c\x76\xa9\x14\x44\xa5\x30\x2a\xa6\
+\xa5\x7c\x12\x0e\x08\x42\xc6\x94\xc9\x84\x4a\x65\x52\xe9\x98\xf2\
+\x19\xb3\x39\x30\x65\xf0\x16\x54\x50\x04\x35\xe6\xcf\x60\x39\x48\
+\xab\x04\x34\x9f\xb9\x0c\x6c\xbe\x0e\x14\x14\x99\x74\x94\x5d\xf1\
+\x76\xb6\xec\x44\x50\x6d\xa7\x90\x7a\x71\xb9\xba\xf4\xfa\x67\xff\
+\xf7\xd0\xd1\x67\x17\x32\xbd\x13\xbf\x41\xac\xd4\x4d\x5a\x65\x42\
+\x70\xe9\xea\x1c\xfe\xf0\xf3\x7f\x8a\x67\x9f\xbc\x1f\xb7\x1e\x3b\
+\x82\x54\x2a\xc5\x2d\xb0\x07\x04\x60\x4b\xa5\x08\x6e\xde\x3f\x88\
+\xee\x5c\x1a\x6f\x5c\x5c\xc6\x66\xb9\x0e\x22\xce\x49\x67\x7d\x33\
+\x10\xad\xa9\x88\xdd\xe4\x2a\x37\x0c\x67\x69\xf1\x90\x82\x11\x52\
+\x3a\x40\x11\x0d\xb4\xc0\xa5\xcf\xa6\x53\xe8\xca\xa6\x95\x56\x93\
+\x27\xfc\xfb\x45\x35\xe1\xc1\x41\x28\xac\x20\x82\x82\x2a\xc0\xa1\
+\x28\x4b\x80\x4f\x78\x1e\x94\xb3\x0d\x7c\xa3\x9a\x52\x09\x8c\xd1\
+\xa1\xa6\x02\x55\xa0\x24\x5e\x2b\xca\x64\xc8\x67\x13\x94\x68\x53\
+\xf1\x1a\xee\x3e\x69\xc6\x47\x15\xd7\x17\xb5\xd3\x7d\x54\xf2\x27\
+\xb5\x51\x5a\x38\x7b\x21\xd3\x3d\xfc\x5a\x2a\xd7\x77\x3d\xb1\x52\
+\xfb\x74\x17\x90\x10\x82\x62\xb1\x8c\x0b\x17\xa7\x90\x49\x11\x4c\
+\x4e\x8e\x21\x9d\x66\xf9\x2f\x4e\x24\x06\x06\x7b\x72\x18\xe8\xcd\
+\x61\xbd\x58\x45\xb9\xda\x60\x1c\xd2\x26\xdf\x14\x1b\x1e\xc5\x37\
+\x65\xf6\x4b\xb1\x23\xa0\x8d\x3e\x2b\xef\x3b\x43\x3c\xcf\x29\xae\
+\x82\x14\xeb\xb9\x4a\x59\x16\x26\x87\xba\xd0\x93\x4f\x45\x7a\x4f\
+\x98\xf5\x56\x15\xe1\x6c\x09\xea\xf7\x4e\x61\x5c\x19\xf2\x81\x02\
+\x26\x8c\x4f\x8c\x86\xe4\xa9\x38\x56\xe5\xa7\x3b\x56\x83\x53\xf8\
+\xce\x5a\x54\x6d\x28\x43\xbc\xba\xbb\xc9\x47\x95\x38\xd3\x0d\x4e\
+\xf6\xf2\xf2\xf9\x59\x92\xca\xbc\x98\xee\x1e\x1e\x23\x56\xfa\x7a\
+\x68\x7a\x49\x09\x21\xa8\x54\x6b\xb8\x78\x79\x06\xd5\x4a\x15\xfb\
+\xf7\x8e\x23\x9b\xcb\xfa\x59\x71\xa0\x72\xff\xed\xed\xce\x60\xa4\
+\x3f\x8f\x62\xa5\xe6\x58\x56\x06\x20\x45\x82\x90\x18\xae\x80\x5d\
+\x24\x1d\xa6\x0e\xc1\x77\x57\x57\x68\x22\xfa\x37\x8a\x1d\x1b\xc5\
+\xfc\x59\x16\xc1\x9e\xe1\x2e\xf4\x76\x65\xe0\x01\xdb\xf4\xb4\xcb\
+\x8e\x7a\x08\x75\x60\xea\xa2\x7a\xda\xf8\x8b\xac\x52\xd0\x07\x91\
+\x90\xac\x94\xfa\xbc\xd9\x1c\xe7\x4d\x26\x51\x22\x15\x85\x37\x4d\
+\x0b\xa5\x8f\xb1\xed\xa0\x8a\x6a\xb7\xc5\xb6\xef\x76\x02\xa8\xc2\
+\xf4\xb6\x13\x60\xa4\xba\x3e\xb5\x6a\xd7\x4a\xcf\x67\x9d\x69\x37\
+\x47\x01\x62\x98\x76\xd3\xc0\x95\xe9\x39\xac\xae\xae\x63\xef\x9e\
+\x31\x74\x77\x77\x2b\x1e\xfc\xe0\x89\xee\xca\xa5\x30\x3e\xd0\x85\
+\x5a\xc3\xc6\x7a\xb1\xe6\xe7\xa3\xb5\xa6\xdc\x7c\x62\x2d\x19\x23\
+\x86\xb3\xf9\xc5\x81\x14\x61\xcf\x01\x10\xc7\x40\xa9\xc4\xb2\x08\
+\xf6\x0c\x75\xa1\x27\x9f\x0e\x32\x8f\x30\x50\x54\xf4\x8b\xf1\x61\
+\xc2\xd3\xa0\x3f\x14\x5b\xaa\x8a\xf8\xf8\x68\x89\x9c\x42\x2c\x2f\
+\xf2\x60\x26\x43\xad\x62\x51\x8a\x84\x46\x13\xbc\x37\x2d\x2a\xdd\
+\xa7\x0e\x4c\x51\xf5\x9a\x05\x98\x2e\x3c\xae\x9e\x55\x2f\x2e\x95\
+\x6a\x85\x85\x17\x33\xfd\x93\x9b\x56\x2a\x77\x1c\x84\xe4\xa1\x10\
+\x42\x88\x3b\xed\x66\x09\xb3\x73\x0b\x98\x1c\x1f\x76\xa6\xdd\x70\
+\x3f\xbc\xc1\x13\x4c\xe0\x4c\xbb\x19\x1b\x70\x80\xb6\x56\xac\xc2\
+\xa6\xd0\x83\x4a\x01\x18\xb3\x35\xa5\x87\x1e\xfb\x22\x19\xb7\xdf\
+\x12\xac\x17\xc2\x46\x32\x17\x4e\x35\x34\x21\x68\xfa\x29\x5c\xa1\
+\x21\xc0\x52\x0f\x10\xe5\x8e\x78\x23\x81\x70\xa1\x0a\xe3\x4a\x49\
+\x2a\x5e\x43\x93\x87\x49\x48\xb3\xa1\x9a\xb2\xa3\xe7\x06\xee\x7e\
+\xab\x4e\x91\x84\x9c\x86\x03\xaa\x4a\x33\xa0\xea\x98\xe5\xa4\x93\
+\xa8\x73\xfd\xb6\xf3\x33\x2a\xc0\xe2\x86\xc7\x01\x1d\x69\x54\x0b\
+\xf5\xf2\xf2\xf9\x57\xb3\xfd\x7b\xa6\xad\x4c\xf7\x31\x42\xc8\x80\
+\xe9\xc2\x2e\xad\xac\xe3\xf2\x95\x19\x0c\x0d\xf4\x61\x64\x64\x88\
+\x71\x8a\x13\xe9\x25\x4a\xa7\x2c\x8c\x0c\xe4\x91\x4b\xa7\xb0\xba\
+\x59\x45\xbd\x41\x83\xc1\x91\x40\x04\x6b\xa9\xf5\x66\xa1\x0e\x52\
+\xa2\x15\x25\x8f\x22\xf7\x92\x11\xe9\xcf\xb1\xa8\xba\xd1\x93\xcf\
+\x08\x97\x95\xbd\xc2\xc4\x05\x3c\x85\x6d\xdb\x4e\x37\xbb\xf7\x67\
+\x53\xd8\x94\x82\xd2\x20\xdc\xb6\x99\x78\x37\xdc\x0f\x73\x3f\x6d\
+\x4f\xdf\x3f\x66\xf4\x6d\xf6\xd8\x2b\xc3\xd6\x97\x29\x96\xc7\x1d\
+\x7b\x65\xf3\xe9\xa9\x26\xbd\x4d\x29\xa8\x74\x8e\xc2\xb1\x70\x6e\
+\xd1\xe2\xa2\xd5\xd5\xd3\x83\x7b\x4c\x28\x50\x2c\x16\xf1\xfa\x99\
+\x73\xad\x5a\x54\x9d\x70\xd5\x73\x79\xee\x86\x5e\x3f\x7e\x80\x52\
+\xf3\xe1\x61\x7a\x61\xf9\x11\xbb\x5a\x6c\x2c\xbf\xf1\xf9\x2f\x0d\
+\x1e\x79\x7a\x31\x3b\xb0\xff\x37\x88\x95\x3e\xae\xcb\x9c\x10\x82\
+\xe9\xb9\x25\x7c\xe6\x0b\xff\x07\xcf\x3c\xbe\x89\x3b\xef\xb8\xd5\
+\x71\xb2\x53\x75\x01\x29\xe2\x6c\x29\xdf\x95\x4b\xe3\xf5\x8b\xcb\
+\xd8\x28\xd5\xc0\x9b\x3d\x10\x8e\xe5\xaa\xf2\x2a\xd1\x47\xbb\x83\
+\x8d\xd5\x40\x8a\x9f\x43\x28\xa4\x91\x2a\xa1\xae\x32\x40\xfc\x5e\
+\x2a\xc7\x82\xac\x61\x6a\x69\x13\x73\xd3\xd3\x98\x9f\xba\x8a\x4a\
+\xb9\xe2\xbc\x40\xc2\xb5\x89\xf5\x1e\x50\xe3\xa1\x3a\x01\x0d\xcd\
+\x26\x96\x88\x43\x08\xa2\xd6\x37\x52\x5d\xc3\x42\x43\x33\x09\x7a\
+\x1a\x09\x21\x28\x57\xaa\x28\x16\x4b\xc6\x29\x61\x3b\x41\x3c\x50\
+\x85\xbd\xb4\xad\x42\x41\x27\xad\xa6\xef\x44\x59\xc6\x73\xa5\xd4\
+\xc6\xca\xd9\xaf\x3d\xd7\x7f\xdd\x83\xbf\xd9\x35\x76\xe4\xef\x91\
+\x54\xf6\x41\x18\x9c\xec\xab\x6b\x05\x7c\xf1\x6b\xdf\xc1\xda\x7a\
+\x01\x0f\xdd\x7f\x17\xba\xba\xbb\xf8\xae\x7a\xa1\xa4\xbd\x23\xdd\
+\xc8\x65\x53\x78\xfd\xe2\x0a\x96\xd6\xcb\x7c\x7e\xaa\x4f\xc2\xc2\
+\x83\x84\x28\xab\xcf\x2c\x00\x17\x93\xd8\x08\x29\xf5\xc0\x51\x39\
+\x63\x59\x87\xd0\x20\xff\x42\xb9\x86\x6f\x7f\xef\x25\xbc\xf9\xd2\
+\x4b\x28\x97\x8a\x11\x6e\xcd\x7b\x45\xb6\x10\x1a\x04\xce\x32\xda\
+\x66\x69\xc7\x00\x07\x1a\x31\x5c\x79\xac\x5a\x33\xbd\x9d\xcd\xb1\
+\x30\x7f\x50\xdc\xf4\x3b\xe6\xb3\xb2\x7a\x79\x91\xda\xf5\x1f\x66\
+\x7a\xc6\xfa\x49\x2a\x73\x23\x4c\xd3\x6e\x6a\x75\x5c\xba\x32\x83\
+\xcd\x62\x11\xfb\xf6\x8e\x23\x9f\xcf\x33\x2f\xba\x60\x95\x10\xa0\
+\x3b\x9f\xc1\x68\x7f\x1e\xe5\x6a\x03\x85\x52\xdd\x57\x33\x35\xfb\
+\x62\x4f\xb9\xd1\x36\xf9\xe4\x75\xad\x82\xef\x6e\xbc\x70\x77\x88\
+\x1b\x2a\xfe\x97\xb2\x88\xec\xa3\x72\xd3\x59\x84\x60\x61\x71\x0d\
+\xdf\xf8\x93\x6f\x61\xb3\xb0\x01\xcb\xb2\xf8\x55\x19\x92\xbf\x2d\
+\xfb\x33\x88\xa9\xe9\xd7\x2c\x78\xe2\xea\x01\x68\x1e\x54\x71\x3f\
+\x75\x60\x8a\xaa\xd7\xe9\xf0\x66\xd2\x5b\xb5\xc2\xfc\x46\xbd\xbc\
+\xfa\x42\xb6\x6f\x82\x5a\xe9\xec\x2d\x00\xc9\xaa\x2e\x32\x21\x04\
+\x0d\x4a\x31\x35\x3d\x8f\xc5\xa5\x15\xec\x99\x18\x41\x5f\x5f\xaf\
+\x17\xc9\x15\xe2\xf9\x93\x72\x99\x14\xc6\x06\xf3\x68\xd8\xc0\x7a\
+\xb1\xea\xce\x11\x94\xe1\xd3\x54\x0f\xa0\x90\x87\x12\x60\x6c\xdd\
+\x18\x3f\x14\x6b\xb8\x79\x80\xf2\x9d\x69\xc2\x5f\xe0\xa3\x92\x3d\
+\x0c\xc4\xb2\x70\xf9\xca\x34\x9e\xff\xe1\x2b\xb0\x6d\xed\x5c\xf0\
+\x44\xb6\x57\x28\xb5\x6b\x5f\x16\xd6\xa3\x6a\x37\xa0\x22\x89\x69\
+\x17\x9a\x6d\xb7\x5a\x76\xc1\x27\x69\x94\xd7\x2a\xd5\xb5\xab\x2f\
+\x67\xfa\x26\x97\x53\x99\xfc\xad\x20\x44\xb5\x1e\xb1\x9f\x68\x7e\
+\x61\x05\x57\xa7\xe7\x30\x36\x32\x80\xa1\xa1\x01\xa5\xef\xc7\xc3\
+\x49\x26\x65\x61\x74\x20\x8f\x54\x8a\x60\x6d\xb3\x86\x86\x4d\x61\
+\xb9\xe6\x93\x0c\x22\x3d\xa8\xa2\x0d\x22\xd5\xe8\x88\xf9\xb0\x75\
+\xf4\xbd\xfd\x4a\x4e\xf9\x16\x55\xaf\x0a\x54\x84\xe0\xf2\x95\x69\
+\xbc\xfc\xea\xdb\x09\xa8\x76\xae\x14\x1a\xd5\xcd\xff\x52\x9c\x7b\
+\xfd\x12\xf4\xed\xd1\x8e\x3b\xd2\x81\x78\xa0\x6a\x57\x78\xb3\x7a\
+\xcd\x7e\x46\xad\x9f\x98\x36\x72\x7a\xbb\x5e\x6e\x94\x97\xde\x39\
+\x93\xe9\x1d\xbf\x98\xca\xf6\x1e\x25\xc4\x1a\xd6\xdd\x01\xcf\x6f\
+\x75\xe1\xd2\x34\xfa\xfb\xba\x31\x3e\x36\x02\xcb\xb2\xb8\x9c\xd9\
+\xee\x71\x8b\x10\x0c\xf7\xe5\xd1\x9d\x4b\x63\xad\x58\x45\xad\x61\
+\x33\xc3\x12\x54\x40\x8a\xdf\xec\xd3\x35\xf9\xb8\xe6\x9e\x64\x45\
+\x09\x17\x46\x31\x3e\xc1\xf2\x9a\x7e\xb9\x8c\x0f\x51\xd6\xa2\x9b\
+\x9a\x9e\xc7\xcb\xaf\x25\xa0\xda\xb1\x42\xed\x57\x2a\x2b\x97\xfe\
+\x53\x65\xe5\xe2\x26\xf4\xa0\xe2\x52\xb4\x29\x5c\x92\x9d\xb8\x01\
+\x69\xa7\x9a\x73\x9d\xfd\xa4\x36\xca\x8b\xe7\x2e\xa4\xf3\xfd\x6f\
+\xa4\xf3\x03\xd7\x13\x2b\xb5\x57\x77\xd1\x09\x21\xd8\x2c\x96\x71\
+\xde\x9d\x76\xb3\x77\x0f\x3f\xed\x86\x88\x4d\x2c\x02\x0c\xf4\xe4\
+\x30\xd0\x93\xc5\x7a\xb1\x86\x4a\xad\xe1\x9c\x38\x51\x59\x51\xe6\
+\x66\x5f\xac\xa5\x8c\x85\xe6\x5e\x00\x24\x19\x50\x7a\x8b\xca\x6b\
+\xfa\x11\x3e\x6d\x02\xaa\x9d\x2d\xd4\x7e\xbd\x51\xd9\xf8\x9d\xe5\
+\x33\x5f\x7a\x83\x0d\x15\x3e\xa1\x39\x46\x88\x5e\xdc\xf0\x8e\x0c\
+\x4f\x68\xf7\xb0\x81\x76\xe5\x1b\xa5\x2c\x7f\x5a\x69\x73\x9f\x94\
+\xac\xbd\xfb\xcd\x57\x1a\x95\x8d\x7f\xd8\x3d\x79\xfc\x6f\x5b\xe9\
+\xfc\x93\xba\x6b\x4c\x08\xc1\x46\xa1\x88\xaf\x7c\xe3\x2f\xb0\xb6\
+\x5e\xc0\x13\x8f\xde\x8b\x9e\xde\x1e\x7d\xaf\x36\x01\xc6\x07\xf3\
+\xb8\xeb\xa6\x51\xbc\x71\x69\x05\xf3\x6b\x25\xa6\xf2\xfa\xd3\xf7\
+\xe2\xcd\x17\x88\x30\xc8\x25\x72\x3a\xc2\x97\xc3\x59\x5a\x72\x61\
+\x21\x42\xb8\xe2\xf4\x77\x86\x56\xec\x7a\xe9\x79\x6a\xd7\xd7\x0c\
+\xda\xaa\xd9\x6c\x72\x18\x31\xe9\x1b\xd2\x09\x69\x18\x4b\xd7\x38\
+\xd5\x50\x28\x54\x93\x2f\x11\xa7\x36\x1a\xca\x27\x9a\x70\xe1\xfe\
+\x13\x13\x40\x88\x26\x9c\xad\x12\x01\x28\xad\x51\x6a\x5f\xa9\x17\
+\x97\xbf\xba\xfc\xe6\xe7\xdf\x84\x59\xda\xea\x87\x32\x89\x0e\x54\
+\xe2\x8b\x28\x86\xeb\xf4\x9b\x0d\x6f\xb6\xbc\x56\x41\x13\x56\x4e\
+\x9c\x73\xf1\xc7\x5b\x15\xae\xbe\x70\xa9\x51\x5e\xff\x9d\xde\x83\
+\xa7\xe6\x53\xd9\x9e\x4f\x00\xfa\x91\xec\x95\x6a\x0d\xdf\xfe\x8b\
+\x97\xb0\xbe\xb1\x89\x67\x9f\x7e\x10\xa3\x23\xc3\xd2\xea\x0b\xde\
+\x01\xa5\xc0\x40\x4f\x06\x77\x1c\x1e\xc1\x99\x2b\xab\xb8\xba\x58\
+\xe4\x67\xe5\x33\x15\x0c\x9f\x1e\x42\x14\x69\x98\x4f\xc2\x02\x29\
+\x08\x50\x42\x4a\x6c\xb2\x32\xe7\xe7\x59\x57\xd2\x93\x1b\x52\x3d\
+\x0a\xbb\x50\x5a\x78\xfb\xbf\x17\xae\xfe\xf0\x0c\xb1\xd2\x96\x1f\
+\xac\x7e\xe1\x54\xbf\xc8\xd4\xa0\xe7\xbe\xd4\x24\x4c\x4f\x11\x47\
+\xa8\x51\x97\x98\x75\x09\x7f\x1e\x62\x1a\x31\x9d\x90\x3f\x97\x46\
+\x2a\x83\x78\xf1\x7c\x1d\xdc\x30\xb1\x2e\x41\x5e\xc4\x89\xa3\x00\
+\x81\xdd\xa8\xd9\x8d\xf2\x6a\xd5\xd5\xb5\x14\xb7\xae\x5d\xcd\xbb\
+\xa8\x56\x15\x00\x19\x54\xed\x02\x4b\xbb\x40\x14\x96\x3e\x2c\x9f\
+\x38\xe7\x16\x17\x6a\x6c\xb8\xa8\x63\x95\x16\xdf\x5e\x6a\x54\xd6\
+\xff\x5d\xff\x0d\x8f\xcc\xa7\xf3\x83\xbf\x08\x42\x06\x55\x95\x22\
+\x84\xc0\xb6\x29\x5e\x7c\xe5\x2c\xd6\x37\x36\xf1\xa1\x67\x1f\xc6\
+\x81\x03\x7c\xab\x91\x2b\x9c\x02\xdd\xb9\x14\x6e\xbb\x6e\x18\x5d\
+\xb9\x34\xce\xcf\x6e\x38\x5b\xca\xb3\x9a\x9a\x06\xaa\xb4\x9c\xb1\
+\xa4\xc7\x39\xa9\x98\xf2\x35\x90\x52\xf8\xd4\x74\xc2\x5e\x28\x3f\
+\x84\x28\x11\xc6\x9c\xac\x5d\xa7\x76\xa3\x4e\xed\x86\xf8\xc2\x44\
+\x07\x52\x6c\x10\x45\x8a\xf3\xbe\xc7\xc9\x27\xee\xa7\x58\x46\x3b\
+\xf3\x0e\xfb\x4c\x41\xbe\x31\xed\x6a\xc6\x35\x05\x3e\xd5\xd8\x1f\
+\xc9\x59\x2c\x84\xb7\xeb\x53\xcc\x5f\xd4\x09\xab\x47\x98\x7e\x3b\
+\xea\xd6\xca\xa7\xd5\xa8\x16\x6a\xe5\xe5\xf3\xaf\x65\xfa\x26\x67\
+\xad\x6c\xf7\x2d\x84\x90\x7e\x18\x64\x69\x79\x0d\x17\x2f\xcf\x60\
+\x64\xb0\x1f\xa3\xa3\xea\x69\x37\x9e\xa4\x52\x16\x46\xfa\x73\xc8\
+\xa5\x2d\xac\x15\x6b\xce\xb4\x1b\x4b\xdd\x1b\x18\x67\xee\xa0\x17\
+\xcf\x39\xcc\x85\x21\x0b\x6c\x19\xbe\x1e\xe3\xb7\xf2\xfe\x2c\x22\
+\x8f\xa3\x0a\x98\xe8\xfa\xa8\x5e\x3d\xeb\xac\x78\x2a\x4b\xa9\xb6\
+\x31\xf7\x8d\xea\xfa\xd4\xa2\x10\x1e\x05\x58\xa6\xf8\x08\xcd\x36\
+\x65\x5c\x58\x59\x9d\x92\x66\xdd\x1a\xa6\xb4\x44\x13\x2f\xfe\x9e\
+\xc4\x1a\xeb\xd4\x06\xd1\xe6\xaf\x5b\xfa\x4f\xf5\xf2\x6d\x05\x20\
+\x3a\xfd\xb9\xe5\x79\x50\xbb\x6e\x97\x17\xdf\x79\x27\xdd\x3d\xfc\
+\x76\x2a\xd7\x77\x13\x21\xd6\xb8\xee\x66\x78\x7e\xab\x77\x2f\x5c\
+\x45\x77\x3e\x8b\x3d\x93\x63\x48\xa5\x52\x52\xe9\x3e\x30\x08\xc1\
+\x60\x6f\x0e\x7d\xf9\x0c\xd6\x4b\x35\x54\x6b\x0d\xc6\xc1\x6e\x02\
+\x91\x0c\x24\x1e\x42\xd1\x57\x62\x60\x01\x15\x10\xcb\xf9\x4c\x59\
+\x04\x13\x83\x79\x77\xae\x5f\x70\x0e\x04\x51\x40\x45\x4b\xb5\xc2\
+\xdc\x9f\x54\xd7\xa6\x16\xc4\x08\xc3\x71\xfc\x26\x60\x73\x96\x54\
+\xdc\x38\x53\x1a\x9d\xb4\x33\x8f\xb0\xbc\xa3\xea\xb7\x7a\x9e\x51\
+\xcb\x35\x0e\x4f\x60\x65\xab\xc1\xb1\x95\x10\x14\xf3\x6e\xa6\x8c\
+\x98\xe5\x52\x94\x97\xde\xbd\x92\xca\x74\xbd\x9a\xee\x1a\xda\x47\
+\xac\xd4\x01\x21\xaf\x20\x53\x42\x50\x2a\x57\xf0\xee\xc5\xab\xa0\
+\xb6\x8d\xfd\x7b\xc7\x91\xc9\x66\x04\x9d\x20\x7b\x02\xa0\xb7\x3b\
+\x83\xc1\xde\x1c\x36\xcb\x75\x94\xaa\x0d\x84\x0f\x4b\x68\x61\x28\
+\x83\x5b\xa8\x38\xc9\x19\xde\x24\x6a\x0f\x5c\xc4\xb1\xa8\x26\x06\
+\xbb\x82\x5e\x3f\xe6\xaa\x58\x84\xe0\x6a\x38\xa8\xbe\xae\x00\x15\
+\x10\xdd\xaa\x6a\x67\x53\x30\xae\x7e\xd4\xa6\x5d\x54\xdd\xb0\xf3\
+\x6f\x47\x53\x33\x4a\x78\x33\xd2\xb2\xd3\x3d\x0c\x54\xec\xf7\x9d\
+\x6a\x55\x89\x75\x68\xa5\x2e\x9d\xd2\x25\x00\x48\x65\xf5\xca\x02\
+\xb5\x6b\x2f\x64\x7a\x46\x07\x48\x2a\x73\x18\x21\xd3\x6e\x2e\x5e\
+\x9e\xc6\xe6\x66\x11\x07\xf6\x4d\xf8\xbb\xdd\x10\xfe\x1f\xff\x6b\
+\x77\x2e\x8d\x91\xbe\x3c\xca\xb5\x06\x0a\xe5\x60\xda\x8d\x79\x58\
+\x82\xb9\xd9\x17\x75\x25\x06\x45\xcb\x14\x80\x3b\x3c\x61\x90\x6d\
+\xfa\x31\x56\x98\x6f\x51\xe9\x86\x27\xd0\x62\xad\x30\xff\x27\xd5\
+\xb5\xab\x0b\xcc\x75\x8c\x0b\x28\xf6\xfb\x56\x5a\x5e\xed\x86\x54\
+\x54\xa8\xb4\x02\x84\xed\xb6\xa6\x8c\x75\x34\xad\xfa\xbe\x93\x81\
+\xd2\x2c\x4c\xda\x0d\xa4\xb8\x75\x22\xb5\xc2\xfc\x46\xbd\xb4\xfa\
+\x42\xb6\x77\x02\x51\xa6\xdd\x5c\x9d\x9e\xc7\xfc\xc2\x32\xf6\xee\
+\x19\x95\xa6\xdd\xf8\x99\xbb\x87\xd9\x4c\x0a\xa3\xfd\x39\xd8\x94\
+\x62\xa3\x58\x83\xed\xe6\x13\x06\xaa\xa6\x9a\x7d\x62\xb8\x17\xc7\
+\xcc\x21\xb3\x08\xc1\xc4\x50\x1e\x3d\xee\x2e\x28\x84\xfd\xd7\x8a\
+\x02\xaa\xb9\xaf\x47\x04\x95\x29\xae\x5d\x8e\xf7\xa8\x61\xad\x40\
+\x4a\x25\xcd\x00\x20\x2e\xd8\xda\x61\xd9\x85\xd5\xbf\xa5\xf0\x28\
+\xa0\x62\xbf\x6f\x95\xf5\x24\x96\xd5\xc9\x26\x60\xab\xba\x61\x71\
+\xa2\x58\xce\xb4\x9b\x2b\x2f\x67\xfa\xf6\xac\x44\x99\x76\x33\xb7\
+\xb0\x8c\x2b\x53\xb3\x18\x1f\x1d\xc2\xf0\xf0\x00\x97\x3d\x6b\x61\
+\x11\x38\xd3\x6e\x46\xfa\xf3\x48\xa7\x1c\x27\xbb\x6d\x53\xb7\x49\
+\x26\x83\x4a\x02\x8e\xc2\xca\x92\xe1\xc4\x5b\x53\x41\xcf\xa1\x3f\
+\x4c\xd5\x97\xc0\x47\x25\x2f\x6f\x13\xcd\xa2\x32\x82\x0a\x8a\xb0\
+\x76\x36\x03\x55\x61\xdb\x15\x17\xc7\xa1\xdf\x49\xf8\xb4\x0b\x80\
+\x61\xf9\x49\x12\xb6\x8f\xce\x4e\x04\x8d\x18\xb6\x13\x9a\x7a\xb1\
+\xe3\xec\x7a\xb9\x5e\x5e\x7a\xe7\xcd\x4c\xef\xc4\xc5\x54\xb6\x27\
+\xd2\xb4\x9b\xf3\x17\xaf\xa2\xbf\xb7\x1b\x13\xe3\xc1\xb4\x1b\x11\
+\x54\x70\x7d\x43\x43\x7d\x39\x74\x65\x53\x58\x2f\x56\x51\x73\x17\
+\xe2\xf3\xf2\x72\x3e\x19\xe8\x28\x21\x86\x18\x56\x16\x3b\xd9\x39\
+\xf8\x73\x7c\x54\x79\x45\xaf\x1f\x89\xda\xf4\xfb\x7a\x75\xed\xea\
+\xbc\x70\x2d\x81\xd6\x9a\x80\xba\xef\x71\x9a\x55\x3b\x05\x52\xed\
+\x00\x43\xab\xf0\x81\x26\x9d\x49\x62\xa7\x8d\x0a\x2a\xf6\xfb\x56\
+\x35\xd3\x5a\xc9\xa3\x53\xcd\xb7\xf6\xc6\x51\x1b\xe5\xc5\xb7\x2f\
+\xa4\xf3\x03\x91\xa7\xdd\x9c\xbb\x70\x15\xe9\x94\x85\x7d\x7b\xc7\
+\x91\x49\xa7\x99\x12\xf8\xb1\x4d\x16\x01\xfa\xbb\xb3\xe8\xef\xce\
+\xa0\x50\xaa\xa3\x5c\xb3\xfd\x26\xa0\x0f\x9d\x98\xab\x31\x44\x5f\
+\x32\xc6\xf9\x4b\xb9\x4d\x3f\x7f\x03\x4c\xc2\x9f\x4f\x28\xa8\x36\
+\xe7\xbf\xe6\x5a\x54\x52\x64\x8c\xe3\x56\x9b\x84\xdb\x09\xb0\x56\
+\x9a\x8d\xed\xb4\xbe\x4c\xd2\x6e\x2b\x4b\x29\x51\x76\x26\x8c\x0b\
+\x81\x4e\x5a\x4f\x9d\xca\xab\x93\xf9\x88\xdf\xa5\xeb\x5b\x59\xb9\
+\x38\x43\xac\xd4\x8b\xe9\xee\xe1\xf1\x28\xbb\xdd\x9c\xbf\x38\x85\
+\x6a\xa5\x82\x03\xfb\x26\x90\xcb\x65\xfd\x22\x58\x50\x79\xd0\xe8\
+\xc9\xa5\x31\xd4\x97\x43\xa9\xd2\x40\xb1\x52\x0f\xed\xf1\x0b\x05\
+\x95\xc6\x9a\xe2\x7a\x22\xdd\xa7\xc0\xb2\xdc\x5e\xbf\x1c\xbf\x5d\
+\x96\x97\x57\xb8\x45\xb5\xf0\xf5\xea\xda\x95\x79\x55\x64\x48\x58\
+\x27\xac\xac\xa8\xcd\xb0\xed\x82\x54\x27\x81\xd1\xa9\xa6\x5d\x14\
+\x98\x02\x88\x06\x2a\x60\x7b\x9b\x69\xad\x94\xdf\x09\x5f\x53\x94\
+\xb8\x30\x7d\x51\x8f\x54\xd7\xa7\x57\xed\x6a\xf1\x87\x99\xde\xb1\
+\x9c\x95\xca\xdc\x0c\x10\xed\x1c\xc1\x7a\xc3\xc6\xa5\xab\xb3\x58\
+\x59\x5d\xc7\xfe\xbd\xe3\xe8\xe9\xe9\x0e\x32\x15\x40\x05\x38\xbb\
+\x34\x8f\xf4\xe7\x50\x6f\x50\x6c\x94\x6a\xee\x32\xb4\x31\x41\x15\
+\xd7\xca\x02\xd3\xf4\xcb\xa5\xa5\xa7\x30\x62\xd3\xef\x6b\x1a\x50\
+\xf9\x4a\x9a\xef\x61\xc7\xed\x72\xa0\xab\xe2\x77\x92\xdf\xab\x9d\
+\x8e\xfe\x66\x9a\x93\x88\xa0\x6b\xd2\xf7\x25\x2e\xa8\xd8\xef\x5b\
+\x69\x2d\x79\xdf\xdb\x01\xb1\x76\xc6\xb5\xa2\x2f\xc6\x93\x7a\x71\
+\xa9\x58\x2b\xcc\xbf\x98\xed\x9b\x2c\x59\xe9\xfc\xad\xd0\xee\x76\
+\x03\x50\x0a\x4c\xcf\x2e\x62\x7a\x66\x01\x7b\x26\x86\x31\x38\xd8\
+\xcf\xe5\xc8\x82\x0a\x00\xb2\x69\x0b\xc3\xfd\x39\x10\x42\xb0\x5e\
+\xac\xb9\xbb\xdd\x44\x03\x15\x3b\x88\x34\x1a\xa8\x82\xa6\xdf\x78\
+\x2b\xa0\xda\x5c\xf8\x6a\x75\xf5\x0a\xeb\xa3\x8a\x03\x23\xf1\x38\
+\x4a\x5c\x33\xcd\xbc\xb0\xf8\xed\x02\x58\x2b\x4d\xc4\xed\x74\xe6\
+\x2b\x25\xce\xa6\xf4\x3b\xc5\xf2\xd9\x0d\xb0\x12\xbf\x9b\xf4\xb8\
+\x78\xbb\x5a\xa8\x95\x97\x2f\xbc\x9a\xed\xdb\x33\x9b\xca\x76\x1f\
+\x43\xc8\xb4\x9b\xc5\xe5\x35\x5c\xbc\x34\x8d\xe1\xa1\x3e\x8c\x8f\
+\x0d\x7b\xc4\x90\x40\x05\xe2\xf4\xc2\x0d\xf7\xe5\x90\xcb\x58\x58\
+\xf7\xa6\xdd\x10\xc1\x6f\xd5\x02\xa8\x58\xe7\xbc\xe7\x4c\xdf\x62\
+\x50\x45\xd1\x69\x15\x50\x61\xf1\xad\x58\x68\x5b\x01\xa9\x66\x9b\
+\x69\x51\xce\xbf\x15\x1f\x97\x51\xe2\x80\x0a\xd8\x39\x96\xcf\x4e\
+\x81\x95\xf8\x1d\x11\xd3\x98\xc2\x40\xed\x9a\x5d\x5e\x7c\xe7\x6c\
+\xa6\x67\xf4\x9d\x54\xae\xf7\x08\x21\xd6\x18\x34\x42\x08\xc1\x7a\
+\xa1\x88\x73\x17\xae\xa2\x2b\x97\xc5\x5e\x76\xda\x0d\x93\x3d\xeb\
+\x97\x1a\xe8\xcd\xa2\xd7\x9d\x76\x53\xab\xdb\x1d\xb2\xa8\x1c\x87\
+\x7e\x87\x41\x05\x4d\x78\x33\xcd\x3e\xf6\xb8\xd9\x66\x4e\x5c\x80\
+\x45\x4d\xd3\x29\x48\xed\x14\x4b\x2d\x54\x9a\x05\x15\xfb\x7d\xbb\
+\x60\xd2\xee\xfc\x11\x12\x16\xe5\x1a\x44\x29\x23\x4a\x79\x04\xa0\
+\x28\x2f\x9d\xbb\x92\xca\x74\xbf\x92\xee\x1a\x3c\x40\xac\xd4\x7e\
+\x5d\xbd\xbc\x69\x37\xe7\x2e\x5c\x81\x6d\x37\xb0\x7f\xdf\x04\xb2\
+\xca\x69\x37\x4e\xd6\x84\x00\xbd\xf9\x34\x06\x7b\xb2\xd8\x2c\x3b\
+\x3d\x82\x9e\x4e\x5c\x1f\x95\xe8\x4c\x67\xc6\xa2\x82\xb4\xe0\xa3\
+\x22\xa0\xc5\xfa\xe6\xe2\x57\x2a\xab\x97\xc3\x86\x27\xa8\x8e\xc5\
+\xb0\x76\x37\x01\xa3\x7c\xef\x54\xd3\xd0\x94\x76\x3b\x21\xd5\xac\
+\x75\x1a\x49\xe2\x82\x0a\x68\x2f\x78\x5a\xb5\x6e\xe2\x5a\x42\xba\
+\x73\x69\x87\x1f\x4a\x57\x56\x14\xff\x94\x2e\x3d\xa9\xac\x5e\x5e\
+\x00\xb5\x7f\x98\xe9\x19\x1d\x8c\xb2\xdb\xcd\x85\x4b\x33\x28\x14\
+\x36\x71\x60\xff\x04\xba\xba\xf2\x4c\x7c\x50\x84\xf7\xbd\x2b\x9b\
+\xc2\x70\x5f\x0e\x95\x9a\x8d\xcd\x72\x5d\xdb\xf4\x33\xf7\xfa\x09\
+\xba\xc1\x17\xc6\x99\x9e\x92\x9e\xe8\x48\x16\x55\x31\x32\xa8\x54\
+\xe1\x51\xad\xac\x56\x20\xd6\x4c\xbc\x4a\xb7\x59\xa8\xb5\xdb\xfa\
+\x0a\x8b\x6b\x35\xff\x28\x3e\x2e\xa5\x34\x03\x2a\x60\xeb\x9b\x7a\
+\x5b\x91\x4f\xd4\x38\xd3\x75\xd0\xe9\x45\x89\xd7\xe6\x5b\x2b\xcc\
+\x6d\xd4\xcb\x6b\x3f\x74\x77\xbb\x39\x06\xc3\xb4\x1b\x9b\x52\x5c\
+\x99\x9e\xc3\xfc\xc2\x12\xf6\xef\x19\xf3\xa7\xdd\x70\xa0\x62\x4a\
+\xc8\x66\x2c\x8c\xf4\xe5\x9d\x69\x37\xa5\xba\x0b\x11\x9d\xf5\xe4\
+\x84\x9b\xc7\x51\x05\x99\x3b\xa0\xca\x05\xe3\xa8\x84\xba\x86\x80\
+\x6a\xb3\xa6\xb7\xa8\x7c\xa5\x16\x8e\xe3\x34\x01\xa3\xe8\x34\xf3\
+\x42\x87\xc5\x6f\x65\x13\x31\x6a\x9c\x28\xad\x34\x05\x23\x4b\xb3\
+\xa0\x02\x76\x96\xdf\xa8\x5d\x3a\xe2\x77\xc4\x4c\x1b\x96\x06\x86\
+\x30\x53\x3e\xa4\x51\x5e\x2d\x57\xd7\xae\xbe\x94\xed\xdf\xb3\xe2\
+\xf6\x08\xf6\xc0\x20\x73\xf3\xcb\xb8\x7c\xc5\x99\x76\x33\x32\x32\
+\x28\x15\xc3\x36\xd1\xd2\x29\x0b\xc3\x7d\x39\xa4\x2c\x82\xf5\x62\
+\x1d\x0d\x77\xda\x4d\xb3\xcb\xbe\x78\x62\x11\x60\x7c\x80\x19\x99\
+\xce\x3c\x9e\xd1\x7c\x54\x1c\xa8\x9a\x71\x9c\x8b\x61\x71\xad\x27\
+\x93\x5e\x1c\xcb\x4a\x15\xde\x69\x80\x6d\x87\x45\x16\xe7\x3a\xc4\
+\x92\x56\x40\x05\xec\x0c\x58\x45\xa9\x4f\x54\x9d\x76\xc3\x2c\x4a\
+\xba\xc8\x69\xed\x7a\xb9\x5e\x5a\x7a\xf7\x8d\x6c\xdf\xe4\x25\x67\
+\x21\x3e\x6b\x08\xba\x0c\x09\xc1\xca\xda\x06\xde\xbd\x70\x15\x03\
+\x7d\xdd\x98\x98\xf0\xa6\xdd\x50\x48\xbe\x24\x38\x83\x33\x07\x7b\
+\x72\xe8\xca\xa5\xb0\x51\xaa\xa1\x56\xa7\x4d\xcc\xf5\xe3\x85\x1d\
+\x47\xe5\x3d\x9e\xd4\xfd\x37\x1a\xa8\x96\xbe\x5c\x59\xbd\x14\x07\
+\x54\xaa\xf0\xb0\x5f\xf2\x38\x4d\xb5\x56\xbe\xb7\xcb\x01\xdf\x6e\
+\x20\xb5\x9a\x67\xb3\xf5\x88\x25\xad\x82\x0a\xd8\x39\xb0\x6a\xd5\
+\x6f\xd5\xae\xe6\x5e\xbb\xbe\xab\xc5\x6e\xd0\xd2\xc2\xd9\x77\x33\
+\xdd\xc3\x6f\xa4\xf2\x7d\x37\x10\x12\x36\xed\xa6\x84\x77\xde\xbd\
+\x82\x74\xca\xc2\xfe\xbd\xe3\xfe\x6e\x37\x22\xa8\x3c\x87\x79\x5f\
+\x57\x06\xfd\x5d\x59\x6c\x94\x9d\xdd\x6e\x22\x5b\x55\x41\xa1\x3e\
+\x55\x38\x50\x81\x7f\x4a\x09\xc2\x41\x55\x2f\x2e\x7d\xb9\xb2\x62\
+\x04\x15\x10\x0f\x3e\x61\xf1\xcd\x58\x59\x9d\x70\xb0\xab\xe2\x3b\
+\x11\xd7\x6c\x5e\x5b\x0a\x29\xa0\xbd\xa0\x62\xbf\xef\x36\x58\xb5\
+\x0a\x24\x84\xc4\xb7\x62\x55\x29\x75\xcb\xcb\xe7\xa7\xad\x54\xf6\
+\xc5\x74\xd7\xf0\x44\x94\x69\x37\xef\x5e\xbc\x8a\x4a\xb9\x82\x83\
+\xfb\x27\x91\xcb\xe5\x94\x7a\x9e\x74\xe7\xd2\x18\xea\xcd\x3a\xd3\
+\x6e\xaa\x8d\x48\xce\x73\x55\x85\x2d\x0b\x98\x18\x70\xd6\xa3\x0a\
+\x9e\x52\xea\x97\x17\xb2\x70\x9e\x07\xaa\x39\xe1\x7a\xc4\xf5\x4b\
+\xa9\xc2\x9b\x01\x59\x2b\x10\xdb\x89\x00\x6b\x36\xaf\x56\x1c\xf1\
+\x4d\x4b\x3b\x40\x05\xb4\xd7\xc7\xd4\x4a\x3e\x51\xe3\x5a\xa9\x7b\
+\x58\xbd\xa3\xa4\x33\xa5\x35\xe5\xc5\x85\x57\xd7\xa6\x96\xed\x7a\
+\xe5\xf9\x6c\xef\x78\x9e\xa4\x32\x47\x61\xd8\x9a\xab\x5e\xb7\x71\
+\xe9\xca\x0c\x56\x56\xd6\x71\x60\xdf\x84\x3f\xed\x86\xd5\x61\x8b\
+\xcc\x67\x9c\x1e\xc1\x5a\x83\x62\xa3\x5c\x83\xe7\x65\x57\xc3\xca\
+\x0f\xf4\x8f\x03\x8b\xaa\x0b\xdd\xfe\xea\x09\x41\xfb\x2f\x1a\xa8\
+\x96\xbf\x54\x59\xb9\x18\x06\xaa\xa8\x61\xdb\x61\x65\xb5\xea\xdf\
+\xda\x4e\x0b\xac\x13\x3e\xae\xa6\xa5\x5d\xa0\x02\xda\x0b\x92\xb8\
+\x4d\xb4\x38\x71\x71\xeb\x60\xfa\x6e\x0a\x8b\x92\x2e\x4a\x9c\x49\
+\x8f\xd4\x37\x17\x37\x6b\x9b\x0b\x2f\x64\xfb\x26\xcb\x56\x2a\x77\
+\x3c\xda\xb4\x9b\x39\xec\x99\x18\xc5\xd0\x60\x3f\x9f\xb1\xb0\x2d\
+\x4d\x26\x6d\x61\xb8\x2f\x0b\x02\x6f\xda\x4d\xb0\x5c\x0c\x0b\x2b\
+\xbe\x62\xc1\x37\xcb\x5f\x8f\x8a\x79\xcc\x68\x50\xa1\xa9\x30\x50\
+\x95\x96\x44\x50\x99\x1e\xf8\x66\x2c\xad\x56\xe1\xa4\x8b\x6b\x16\
+\x50\x61\xba\x9d\xb4\x94\x3a\x1d\xd7\x92\xb4\x13\x54\x40\xe7\x61\
+\xd5\x89\xa6\x20\x62\x84\x75\x02\x58\x51\xe3\x74\x79\x92\x46\x65\
+\xa3\x5a\x59\xb9\xf4\x72\xb6\x7f\xcf\x4c\x2a\xd3\x75\x3c\x74\xda\
+\xcd\xd2\x1a\x2e\x5c\xbc\x8a\x91\xa1\x7e\x67\xda\x8d\xd7\x88\x13\
+\xac\x2a\x10\x07\x36\x43\xbd\x59\x64\x33\x16\x36\x8a\xb5\x60\x6d\
+\x2b\x1f\x50\x3c\xa9\x78\x8b\x0a\xfc\x2e\x34\x8c\x43\x3d\xc2\xe6\
+\x0e\xc5\x7a\x71\xf9\x8b\x0a\x8b\x8a\xc9\xc9\x18\x16\xb7\x09\x18\
+\x76\xbc\x13\x00\x15\x16\xbf\x53\x01\xd6\xb2\xb4\x1b\x54\xc0\xce\
+\x87\x55\x9c\xfc\x10\x92\x8f\x4e\xbf\xd5\x66\x5d\x9c\x3c\x00\x00\
+\xb4\x51\xb5\xcb\x8b\x6f\xbf\x95\xe9\x9b\x78\x3b\x95\xed\xbd\x39\
+\x74\xda\xcd\x46\x11\xef\xbc\x7b\x05\xdd\xf9\x2c\xf6\xee\x19\x67\
+\xa6\xdd\x04\xc5\xfb\xcd\x3c\x42\x30\xd0\x9d\x45\x77\x3e\x8d\x8d\
+\x52\x0d\x95\x3a\x0d\x2a\x47\x18\x58\x09\xb5\xb6\x88\xbb\x66\xba\
+\xdb\xeb\x47\x85\x3a\x44\x00\xd5\x97\x5a\x00\x95\x2e\xbc\xd9\x26\
+\xa0\x29\x2e\x2e\xa0\x54\x3a\x71\xe2\x5b\x01\xdc\xae\x83\x14\xd0\
+\x19\x50\x79\xd2\x6e\x67\x79\xab\xd6\x90\x2e\xdf\x28\x69\xa3\xe4\
+\xdd\x49\x7f\x55\x14\x68\x11\x50\x8a\xf2\xe2\x3b\x97\xd3\xf9\xfe\
+\x97\xd2\xf9\x81\x83\xc4\x4a\x1d\xd4\xa5\xf5\xa6\xdd\xbc\xf3\xee\
+\x55\xd0\x46\x03\x07\xf6\x4f\x22\x9b\x49\x4b\x59\xb2\x46\x56\x4f\
+\x3e\x8d\x81\xee\x0c\x8a\x95\x3a\x4a\xee\x42\x7c\x6c\xed\x58\x60\
+\x51\x04\xeb\x51\x75\xe7\x55\x53\x68\x80\xa9\xa9\x39\xbc\xfc\xda\
+\x3b\x86\x5e\xbf\x95\x2f\x56\x56\x2e\x44\x05\x95\x2e\xae\x95\x26\
+\x60\x58\x7c\xdc\xef\xec\x71\xbb\x1c\xf0\x3b\xc5\x39\xdf\x76\x07\
+\x3a\x2b\x9d\x04\x15\x10\xdf\xfa\x89\x13\xd7\x4c\xfe\xad\x02\x29\
+\x2e\xb0\xda\xe9\x3c\x8f\x9c\x4f\x65\xe5\xe2\x3c\xb1\xac\xe7\xd3\
+\xdd\x23\x83\xc4\x4a\xdf\x84\x90\x69\x37\xe7\x2f\x4e\xa3\x50\xd8\
+\xc4\xc1\x03\x93\xdc\xb4\x1b\xa7\x30\xbe\x4b\xaf\x2b\x9b\xc2\x50\
+\x6f\x16\x95\xaa\x8d\x42\xa5\xce\x57\x48\xa8\x99\xd4\xf4\xf3\x85\
+\xc2\x1f\x9e\xf0\x9a\x61\x78\x42\x69\xe5\x0b\x95\x65\x25\xa8\x82\
+\x8c\xc2\xc3\x9a\x69\x02\x9a\xe2\x3b\x65\x65\x75\x32\xbe\x13\x56\
+\x57\x98\x7e\x5b\xa5\xd3\xa0\x02\xe2\x5b\x35\xed\x6c\xee\xe9\xea\
+\xd1\x4c\xaf\x5e\x2b\x43\x0c\x9a\x01\x56\x54\x5d\xe5\xb9\x56\xd7\
+\x67\xd6\xed\xea\xe6\x0f\xb2\xbd\x13\x84\xa4\x32\xb7\x02\x24\xa3\
+\x4c\xec\x4d\xbb\x99\x9a\xc3\xdc\xbc\x33\xed\xa6\xbf\xbf\x97\xcb\
+\x9e\x08\xa5\x64\xd3\xce\x48\x76\x6a\xbb\x0b\xf1\x29\x2a\xe2\x59\
+\x54\x12\xa8\x28\xf5\x0a\x8e\x02\xaa\x2f\x56\x96\x2f\xcc\xa2\x35\
+\x50\xe9\xc2\x5b\x81\x53\x54\xdd\x66\xbf\x77\xd2\x8f\xa5\x0a\xdb\
+\x71\x4d\x3d\x51\xb6\x02\x54\xc0\xf6\x00\xa9\x19\x27\x78\xbb\x00\
+\xd4\x2e\xeb\xa9\x19\x7d\xff\x5c\xea\xc5\xe5\x72\x75\x7d\xe6\x85\
+\xdc\xc0\xde\x15\x2b\x95\x3b\x01\x42\xba\x4d\x09\x67\xe7\x97\x71\
+\xf9\xca\x0c\xc6\xc7\x86\x30\x3a\x3c\xc8\x65\x29\xc2\x2a\x6d\x39\
+\x1b\x48\x38\xd3\x6e\x6a\x68\x38\x2b\xf1\x71\xf9\xf9\xbd\x7e\xb9\
+\xb4\x0f\xa8\xa0\xd3\x2f\x0c\x54\xd8\x6c\x94\x57\xbe\x50\x5e\x3e\
+\x1f\x17\x54\xba\xb8\xb8\xd6\x57\xa7\xad\xac\x66\x9c\xf1\xcd\xe4\
+\xb5\x95\x00\xeb\x98\x6c\x15\xa8\x80\xad\x07\x52\x94\x72\xa3\xd4\
+\x35\x2c\xaf\x38\x3a\xad\x38\xcf\xe3\xe4\xe5\x8b\x5d\x2b\x36\xca\
+\x4b\xef\xbe\x96\xed\xdf\x7b\xd1\xca\x74\xdd\x4a\x08\x19\xd2\x16\
+\x40\x08\x56\x56\x37\x70\xee\xfc\x55\x0c\xf4\x77\x63\x62\x62\x94\
+\x9f\x76\x23\x94\x6a\x11\x82\xc1\x9e\x2c\xf2\xd9\x14\xd6\x8b\xee\
+\xda\x56\x60\xe3\xbd\xa6\x5f\x4a\x7a\x92\xa3\x80\xaa\x5e\x5a\x0d\
+\x03\x15\x10\xdd\x82\xd2\x85\xb7\xcb\xb9\xae\xd3\x6d\x47\x6f\x61\
+\x9c\x66\xe4\x76\x01\xac\xa3\xb2\x95\xa0\xf2\x24\xaa\xff\xc9\xa4\
+\xdf\x6a\xd3\xcd\x14\x16\x25\xbe\x1d\xd6\x53\xdb\x7a\xfc\xc2\xd2\
+\x51\xbb\x4e\x4b\xf3\x67\xce\x65\x7b\xc7\x5f\x4b\xe5\xfa\x6e\x22\
+\xc4\x8a\x30\xed\xe6\x32\x32\x29\x0b\xfb\xf7\x4e\xb8\xd3\x6e\xd4\
+\xb0\xf2\xa6\xdd\xf4\x75\x65\xb0\x51\xaa\xa3\x52\x0f\xa0\x63\x59\
+\x04\x13\x4a\x1f\x55\x54\x50\xad\x7c\xde\x05\x95\x47\x4b\xe5\xe9\
+\x19\xae\x47\xb3\x3e\xac\x56\xe1\x14\x55\xaf\x9d\x80\x6a\x35\xbe\
+\x15\xe7\x7c\xc7\x65\x3b\x40\x05\x6c\x8d\x75\xd5\x4c\x7c\x94\xfa\
+\xc6\x3d\xaf\x28\xf9\xb5\xab\x7c\xe3\xb9\x97\x97\xce\x4d\xa5\xb2\
+\xbd\xcf\xa7\xbb\x06\xf6\x10\x2b\x75\x3d\x4c\xd3\x6e\x2a\x35\x9c\
+\xbb\x70\x15\xd5\x72\x05\x07\x0f\x4c\xba\xbb\xdd\x30\xb0\x12\x6a\
+\xd5\x93\x4b\x63\xd0\x9b\x76\x53\x69\x80\x02\x48\x11\x82\x49\x61\
+\x5f\xbf\x20\xa9\x07\x2a\xdd\xf0\x04\x6c\xd6\xcb\xab\x9f\x2f\x2f\
+\xbd\xeb\x59\x54\x61\x2f\x46\x54\x7f\x55\x33\xf0\x8a\x63\x85\xb5\
+\xa3\x27\x30\x0a\xa0\x9a\x49\xb7\xab\xac\x28\x56\xb6\x0b\x54\xc0\
+\xd6\x37\xf7\x10\x12\x66\x0a\x8f\x12\xdf\xae\x41\x9d\xcd\x3a\xd0\
+\xa3\x08\xa9\xac\x5e\x5a\x06\xe8\xf7\x33\x3d\xa3\xdd\xc4\x4a\xdf\
+\x82\x90\x69\x37\x17\xaf\xcc\x60\x65\x65\x0d\x07\xf7\x7b\xd3\x6e\
+\x02\xd7\xb9\x08\xac\x60\xda\x8d\x8d\x8d\x52\x0d\xc4\x38\xe0\x13\
+\x98\x9a\x9e\xc7\x2b\xaf\xbd\x1d\x06\xaa\x28\x53\x68\x74\xe1\xed\
+\x72\xac\x87\x1d\x37\x63\x3d\xa9\xe2\x9a\x05\x54\x94\x32\xdb\xdd\
+\x0c\xdc\x52\xd9\x4e\x50\x79\xb2\x55\xcd\xbd\x76\x02\x2b\xaa\x4e\
+\x98\x5e\x33\x83\x47\x5b\x19\x60\x0a\x00\xa4\xb6\x31\xbb\x59\x2f\
+\xad\xfe\x20\xdb\x3f\x59\xb6\x52\x99\xdb\x00\xf3\xb4\x9b\xa9\x99\
+\x45\x4c\x4f\xcf\x63\xef\xe4\x68\xb0\xdb\x0d\x53\x34\x5b\x78\x26\
+\x6d\x61\xa8\x2f\x07\x02\x82\x42\xa9\xe6\x4f\x4a\x06\x65\x9f\x70\
+\x6f\x99\x97\xb9\x10\x50\xad\x7d\x8e\xb1\xa8\x82\xc4\x6a\xe9\x74\
+\x13\x50\x3c\xde\xca\x26\xa0\x29\x7c\xab\x9b\x81\xdb\x22\x3b\x01\
+\x54\x40\x67\x9b\x7b\xcd\xe6\x6f\x0a\x37\xe9\x34\xeb\x4c\x6f\xa6\
+\xec\xa6\xd3\x37\xca\xab\xb5\xea\xea\x95\x1f\x65\x07\xf6\xcf\x5a\
+\xe9\xdc\x6d\x61\xd3\x6e\x16\x96\x56\x71\xe1\xe2\x14\x46\x86\xf9\
+\x69\x37\x62\x91\x5e\x93\x6f\xb0\x37\x8b\x5c\x26\x85\xae\x6c\x0a\
+\xf9\x4c\x0a\x54\x78\xce\x3d\x1f\x95\x09\x54\x8d\xca\xda\xe7\xca\
+\x4b\xe7\x66\x10\x0d\x54\xa6\xf8\x66\xad\xad\x4e\x34\x09\xe3\xea\
+\xe8\xd2\x74\xba\x07\x71\xc7\x40\x0a\xd8\x39\xa0\xf2\xa4\x13\xcd\
+\xbd\xa8\x3d\x7d\x61\x3a\xad\x82\xad\xd5\x26\x5f\x2b\x30\x55\xea\
+\xdb\xf5\x72\xa3\xb4\xf0\xd6\x9b\xb9\xc1\xfd\x67\xad\x4c\xf7\x31\
+\x42\x48\xc8\xb4\x9b\x4d\x67\xda\x4d\x97\x6e\xda\x0d\xab\x0f\xf4\
+\x77\x67\x90\xcb\xa4\x94\x35\x8c\xd2\xf4\x6b\x94\xd7\x3f\x5b\x5e\
+\x3a\xa7\x1b\xf0\xd9\x6a\x6f\x9f\x2e\x7c\x3b\xfd\x55\xed\x82\x5b\
+\x27\x9a\x81\xdb\x2a\x3b\x0d\x54\xc0\xf6\x8e\x24\x8f\xa2\xb3\x55\
+\x4d\xbe\x56\xcb\x88\x26\xd4\x46\x69\xfe\xad\x0b\xd9\xde\xb1\x1f\
+\xa5\x72\xbd\xd7\x11\x62\x45\x98\x76\x73\x05\xd4\x76\xa6\xdd\x64\
+\x32\x19\x63\xf6\x44\x89\x18\x0a\x10\x82\xe9\x99\x30\x8b\x6a\xfd\
+\x73\xe5\xc5\x77\x74\xc3\x13\xae\xc5\x26\xa0\x78\xbc\x95\x80\x0a\
+\x2b\x6f\x5b\x65\x27\x82\xca\x93\xed\x1c\x49\x1e\x45\xa7\x93\xc3\
+\x0d\xda\xd1\xcb\x17\x2b\x4d\x79\xe9\xdc\x5c\x2a\xd3\xfd\xfd\x74\
+\xd7\xe0\x08\xb1\x52\x47\x60\xe8\x11\xe4\xa6\xdd\xec\x9f\x44\x57\
+\x57\x2e\xbc\x04\xc5\x80\xcf\x08\xa0\xfa\x6c\x13\xa0\x32\xc5\x6f\
+\x77\x2f\xa0\x49\xb7\x93\xdf\x77\x55\x33\x4f\x25\x3b\x19\x54\x40\
+\x7b\x86\x1b\x74\xe2\x7b\x58\x3d\x5b\xe9\xe5\x6b\x97\xb5\x15\x56\
+\x47\x29\xbe\xb2\x7a\x79\x8d\xda\xf5\xef\x67\x7a\xc7\x09\xb1\xd2\
+\xc7\x01\x68\x77\xbb\x69\x50\x8a\x2b\x53\xb3\x98\x9f\x5f\xc6\xbe\
+\x3d\x63\xe8\xef\xeb\x01\x75\x61\xe4\x15\x64\x7a\xe2\x23\x80\xaa\
+\xd0\xa8\x6c\x98\x40\xe5\x49\x3b\x7a\x01\x55\x71\x5b\xd1\x04\x34\
+\xc5\xb5\x1b\x50\xaa\xf0\x28\xd6\xe4\x8e\x90\x9d\x0e\x2a\x4f\xda\
+\xd1\x7b\xb7\x55\x53\x5f\x76\x47\x93\x4f\x9d\x27\xa9\x15\xe6\x4b\
+\xf5\xe2\xf2\xf3\xd9\xfe\x3d\xab\x56\x2a\x73\x12\x50\x4f\xbb\xf1\
+\x2a\x30\x3b\xbf\xe4\xec\x76\x33\x36\x84\x61\x6e\xda\x4d\x48\x61\
+\x51\x2c\xaa\xea\xc6\x67\xcb\x8b\x6f\x8b\xce\x74\x51\x76\x5b\x13\
+\xd0\x14\xd7\x2e\x88\xb5\xd2\x5b\xb8\x23\x65\xb7\x80\xca\x93\x76\
+\x03\x2b\xaa\x4e\xb3\xcd\xbf\x9d\xde\xe4\x53\xe6\xd3\x28\xaf\xd5\
+\x2b\xcb\xe7\x5f\xc9\x0d\x1e\xbc\xe8\xf6\x08\x86\x4e\xbb\x79\xf7\
+\xc2\x55\x0c\xf6\xf7\x60\x62\x7c\x04\x96\x15\x5e\x15\x42\x08\xa6\
+\x42\x40\x65\x57\x0a\x7f\x5c\x6a\x1e\x54\xa6\xf8\xad\x68\x02\x86\
+\x1d\xb7\x6b\x08\x43\x14\x9d\x5d\x0b\x28\x4f\x76\x1b\xa8\x3c\xe9\
+\x24\xb0\xa2\xe6\x15\x57\x6f\x2b\x07\x76\x36\x93\x07\xf7\xd0\xd2\
+\x46\xd5\x2e\xce\xbf\x79\x36\x37\x78\xf0\x35\x2b\xd3\x7d\x84\x10\
+\x62\x9c\x76\x53\xd8\x74\xa7\xdd\xa4\x53\xd8\xc7\xec\x76\xa3\x2c\
+\x88\xba\x16\xd5\xf4\x3c\x5e\x79\xdd\x64\x51\x15\xfe\xb8\xb4\x70\
+\x36\x0c\x54\xca\xfa\x87\x84\x77\x6a\x20\x68\x98\xfe\x76\x8e\xc3\
+\xda\x95\x80\xf2\x64\xb7\x82\xca\x93\x56\xe7\xf2\xa9\x74\xb6\xc2\
+\x79\xde\xae\xba\xb6\x43\x8c\xe7\x51\x9a\x7f\xeb\x4a\xb6\x77\xec\
+\x07\xa9\x5c\xef\x3e\x42\xac\xc3\x3a\x7d\x6e\xda\x4d\xa5\x8a\x03\
+\xfb\xdd\x69\x37\x54\xfd\x56\x10\x02\x4c\xcf\x2c\xe8\x41\x45\xb0\
+\xd9\xa8\x14\xfe\xc8\x05\x95\x69\xae\x9f\x27\xed\x68\x02\x36\x63\
+\x69\xc5\x8d\x6f\x15\x50\xed\xe8\x09\xdc\x75\xb2\xdb\x41\xe5\x49\
+\x3b\x86\x24\x98\xc2\x9b\xcd\x2f\x6a\x9e\xad\x8c\x36\xef\x04\xbc\
+\xb8\xfc\xcb\x4b\xe7\x16\xad\x74\xd7\xf7\x32\xdd\xc3\xdd\xc4\x4a\
+\x1d\x83\x71\xda\x4d\x03\x17\x2f\xcf\x60\x75\xd5\xd9\xed\xa6\xbb\
+\xbb\x8b\xd1\xa0\x9c\xee\xf4\xcc\x02\x5e\x36\x5a\x54\xc5\x3f\x2a\
+\x2d\xbc\xe5\x59\x54\xcd\x82\xca\x14\xdf\xae\x26\xa0\x18\xd6\xc9\
+\x26\xa0\x49\xef\x9a\x03\x94\x27\xd7\x0a\xa8\x3c\x69\x65\x50\x66\
+\xbb\xac\xa7\x76\x4c\x30\xde\xb6\x26\x9f\x2e\xaf\xea\xda\x95\x0d\
+\x38\x3d\x82\x15\x62\xa5\x4f\x02\xd0\x4c\xbb\x21\xee\xb4\x9b\x05\
+\x4c\xcf\xcc\x63\xef\xc4\x08\x06\x07\xfb\xa4\x62\x3c\x50\x99\x9a\
+\x7e\x76\x75\xd3\x03\x55\x1c\xd9\x09\x4d\xc0\xb0\xe3\x66\x74\x5b\
+\x75\xb4\xef\x6a\xb9\xd6\x40\xe5\x49\x27\x7b\xf8\xda\xd9\xe4\xdb\
+\xca\x29\x35\xad\xe6\x47\x6a\x85\xf9\x4a\xad\x30\xff\x42\x6e\x60\
+\xff\x0c\xb1\x32\xb7\x47\x9a\x76\x73\x69\x0a\x23\x43\x03\x18\x1b\
+\x1d\x12\x46\x7f\x12\x4c\x85\x81\xaa\x56\xfc\x4c\x69\xfe\x2d\xaf\
+\xe9\xe7\x49\xbb\x9b\x80\xed\x02\xd8\x4e\xb2\xb2\xae\x19\x40\x79\
+\x72\xad\x82\xca\x93\x4e\x3b\xcc\xdb\x39\xc8\xb3\x99\x34\x9d\x6e\
+\xf6\x89\x65\x91\x46\x65\xa3\x51\x9c\x7f\xeb\xf5\xfc\xf0\x0d\x67\
+\xad\x74\xf6\x56\x10\x32\xae\x4d\x40\x08\xd6\x36\x36\x71\xee\xfc\
+\x15\xf4\x74\xe5\x30\x39\x39\x06\xcb\x4a\x05\xce\xf4\x50\x8b\xaa\
+\xf8\x99\xd2\xfc\x99\x76\xcc\xf5\x33\xc5\xb5\x73\x6c\x95\x18\xb6\
+\x5d\x4d\xc0\x6b\x4e\xae\x75\x50\x79\xd2\x0e\x87\x79\xa7\xe6\xea\
+\xc5\xad\x7b\x94\xfc\x5a\xe9\x25\x0b\xd7\xa7\x0d\x5a\x9c\x7b\xfd\
+\x7c\x6e\xe8\xd0\x8b\xa9\x4c\xd7\x0d\x20\xe4\x90\xae\x4c\x42\x08\
+\x4a\xa5\x0a\xce\x9d\xbf\x02\x50\x1b\xfb\xf7\x4d\x20\x93\xc9\x44\
+\x03\x55\xad\xf4\x87\x02\xa8\xa2\xd6\x39\x2e\xac\x74\xe1\x9d\x6e\
+\x02\x8a\xc7\x09\xa0\x34\xf2\x5e\x01\x15\x2b\x3b\x65\xae\xde\x76\
+\x8d\x99\x6a\x25\x2d\xfb\x42\x90\xd2\xfc\x99\xe9\x4c\xef\xf8\x5f\
+\xa4\x72\x7d\xa3\x84\x58\x47\x60\xd8\xed\xa6\x5a\xab\xe3\xfc\xa5\
+\x69\x6c\x16\x8a\x38\xb0\x7f\x02\x5d\x5d\x79\x67\x52\xf2\xeb\xef\
+\x68\x47\xa6\x3b\xa0\x7a\xb3\x99\x29\x34\x3b\x69\x6c\x55\x98\x4e\
+\x02\xa7\x08\xf2\x5e\x04\x95\x27\x5b\xb9\x3c\x4b\xbb\xd7\x94\x8a\
+\x53\x76\x27\xf3\x24\xe5\xa5\x73\x2b\xa9\x6c\xcf\xf7\xd2\x5d\x43\
+\x29\x62\xa5\x6e\x83\x69\xda\x4d\xc3\x99\x76\xb3\xb0\xb0\x82\xfd\
+\xfb\xc6\xb1\xb1\x51\x74\x41\xa5\x5c\x8a\xb8\x60\xd7\xcb\x9f\x29\
+\xcd\xbd\xa9\x1b\x47\x15\xe5\x45\xed\x84\x5f\x4a\x15\xd6\xce\x26\
+\x60\xdc\xb4\xef\x09\x79\x2f\x83\x8a\x95\xed\x58\x9e\x25\x4c\x67\
+\xbb\x9d\xe7\x91\xf3\xad\xac\x5e\x2e\x82\x36\x9e\xcb\xf6\x8e\xaf\
+\x11\x2b\x7d\x3b\x80\x1e\xa5\xa2\x5b\x83\xd9\xf9\x25\x5c\x9d\x9a\
+\x43\xc3\x6e\xe0\xca\xd5\x39\x2d\xa8\x68\xbd\xfc\x87\xc5\xb9\x37\
+\x5a\x19\x99\xbe\x53\xa6\xd7\xc4\x3d\x4e\xe0\x24\x48\x02\x2a\x59\
+\xae\xd5\x26\x5f\x9c\x87\xbd\x89\x1e\xc1\xb9\x5a\x75\x6d\xea\x47\
+\xf9\xe1\xeb\x2e\x92\x54\xfa\x24\x40\x86\xb5\xca\x84\x60\x79\x65\
+\x1d\xd3\x33\x0b\xa8\x37\x6c\x9d\x5a\xc1\xae\x57\xfe\x77\x08\xa8\
+\x76\xf2\xd8\xaa\x76\x36\x01\xdf\xf3\x92\x80\xca\x2c\xd7\x52\x93\
+\xaf\xe3\x3d\x84\x76\xad\x48\x8b\xf3\x67\xce\x74\x8d\xde\xf4\xaa\
+\x95\xca\x1e\x05\x21\xfb\xb4\x95\x21\x44\xe7\x9b\xf2\x34\x0a\xb4\
+\x51\xfd\xc3\xe2\xec\xeb\xd3\x68\xde\xa2\x0a\xd3\xd9\xe9\x4d\xc0\
+\x44\x5c\x49\x40\x15\x5d\xb6\xbb\x97\xaf\x5d\xf5\xee\xac\xd0\x06\
+\x8a\xb3\xaf\x5d\xca\x8f\xdc\xf0\x9c\x95\xce\xef\x07\x21\x87\xa1\
+\x59\xdb\x2a\x44\x0a\xb4\x5e\xfd\xdf\xc5\xd9\xd7\xc2\x40\xe5\x97\
+\xdc\x44\x5c\xa7\xa7\xd7\x34\x73\x9c\x88\x42\x12\x50\x35\x27\xd7\
+\x62\x93\xaf\x9d\x40\x23\xc5\xb9\x37\x17\xb2\xfd\x7b\xbe\x63\xe5\
+\x7a\xfa\x08\xb1\xb4\xd3\x6e\x0c\x52\xa0\x8d\xca\xa7\x23\x82\x6a\
+\x2b\x9a\x80\xcd\x8e\x62\x8f\x3b\x76\x2b\x11\x85\x24\xa0\x6a\x5d\
+\xb6\x73\x82\x71\x3b\xe1\xd2\xee\x97\x87\x94\x16\xdf\x5e\xcf\x74\
+\x8f\x7c\x37\x95\xef\xaf\x12\x62\xdd\x01\xcd\xb4\x1b\x8d\x14\xa8\
+\x5d\xfb\x74\x71\xe6\xd5\x76\x80\x2a\x4c\xaf\xd3\xd3\x6b\xe2\xd4\
+\x31\x11\x85\x24\xa0\x6a\xbf\x74\x62\x82\x71\x33\x0f\xf9\xd6\x36\
+\xf9\x34\x75\x28\x2f\x9f\xaf\x80\xd2\x1f\x64\x7b\x27\x66\x89\x95\
+\xba\x03\x40\x7f\xc4\xb4\x05\xda\xa8\xfd\xaf\x88\xa0\x62\xa5\x93\
+\x23\xd3\x5b\x0d\x4b\xa4\x49\x49\x40\xd5\x79\x69\x15\x52\xed\xee\
+\x9a\x6f\xb6\x7e\x4d\x4b\x6d\x63\xb6\x51\x5d\x9f\x7a\xa5\x6b\xf8\
+\x86\xb7\x88\x95\x3a\x0e\x90\x89\x08\xc9\x0a\xb0\xeb\x9f\xde\x9c\
+\x79\x65\x1a\xd1\x96\x79\x69\xf5\x7a\xb4\x62\x41\x45\xc9\x3f\x91\
+\x16\xa4\x19\x27\x67\x22\xf1\x84\x0a\x7f\xba\xf0\xb8\x7f\xed\xca\
+\x67\x2b\xfe\x50\x2b\xcc\xd3\xb9\x17\xfe\xcb\x57\xed\x5a\xf9\x17\
+\x01\xfa\x4d\x84\xbf\xd8\x14\x20\x8d\x76\xd6\xa1\xc3\xd7\x3d\x91\
+\x0e\x4a\x62\x51\xed\x0c\xd9\xce\x9e\xbe\xad\x7c\xc9\xc8\xe6\xcc\
+\x2b\x53\x5d\xe3\xb7\x7c\xd7\xb2\x32\x63\x20\xe4\x28\xf4\xcf\xe0\
+\xf9\x46\x6d\xf3\x3f\x16\x67\x5f\x2f\x34\x51\xce\x56\x0c\x02\x4d\
+\x64\x0b\x25\x01\xd5\xce\x95\x8e\x2f\x88\xb7\x5d\xe7\x55\x9c\x79\
+\x75\xb9\x6b\xfc\x96\x6f\x5b\xa9\x4c\x06\x84\x9c\x84\x6a\xda\x0d\
+\xa5\x9f\x29\xcd\xbf\xf5\xd9\xea\xfa\x14\x15\xea\xba\x5d\x4d\xc0\
+\x44\xb6\x51\x12\x50\xed\x3e\xd9\x09\x4e\xf2\xb8\x75\x12\x5f\x7e\
+\x52\x9c\x7d\x75\x33\x3f\x76\xe4\x7b\x56\x2a\xbb\xe2\x5a\x56\x03\
+\x6e\x3e\x35\x00\x5f\xa4\x76\xed\x9f\x2f\x9f\xf9\xd2\x82\x22\xef\
+\x56\x41\x15\x47\x27\x91\x1d\x22\x3b\xf1\xa1\x4f\xa4\x79\xd9\xc9\
+\xeb\x59\xa9\x84\x0e\xde\xf4\x54\x2a\x37\x74\xdd\x31\x62\x59\x1f\
+\x00\x90\x07\xc5\x25\x6a\xd7\xbf\x3c\xf7\xc3\xff\xec\x6d\xe5\x1e\
+\xd7\x9a\x42\x0b\xfa\x89\xec\x50\xd9\xee\x07\x35\x91\xad\x17\x71\
+\xfd\xf1\x9d\xf0\x0c\xa8\x80\x62\xb2\xa4\xa2\xac\xa1\x9e\xc8\x35\
+\x24\x3b\xe1\x21\x4d\x64\x77\x48\xa7\x9e\x95\x04\x38\x89\x84\xca\
+\xff\x0f\x54\x62\xd6\x8a\x59\xb9\x9c\x52\x00\x00\x00\x14\x74\x45\
+\x58\x74\x41\x75\x74\x68\x6f\x72\x00\x4a\x61\x6b\x75\x62\x20\x53\
+\x74\x65\x69\x6e\x65\x72\xe6\xfb\xf7\x2f\x00\x00\x00\x49\x74\x45\
+\x58\x74\x43\x6f\x70\x79\x72\x69\x67\x68\x74\x00\x50\x75\x62\x6c\
+\x69\x63\x20\x44\x6f\x6d\x61\x69\x6e\x20\x68\x74\x74\x70\x3a\x2f\
+\x2f\x63\x72\x65\x61\x74\x69\x76\x65\x63\x6f\x6d\x6d\x6f\x6e\x73\
+\x2e\x6f\x72\x67\x2f\x6c\x69\x63\x65\x6e\x73\x65\x73\x2f\x70\x75\
+\x62\x6c\x69\x63\x64\x6f\x6d\x61\x69\x6e\x2f\x59\xc3\xfe\xca\x00\
+\x00\x00\x25\x74\x45\x58\x74\x64\x61\x74\x65\x3a\x63\x72\x65\x61\
+\x74\x65\x00\x32\x30\x31\x35\x2d\x31\x30\x2d\x31\x33\x54\x31\x35\
+\x3a\x30\x33\x3a\x33\x32\x2b\x30\x39\x3a\x30\x30\xf5\xf6\x5c\xde\
+\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\x74\x65\x3a\x6d\x6f\x64\
+\x69\x66\x79\x00\x32\x30\x31\x35\x2d\x31\x30\x2d\x31\x33\x54\x31\
+\x35\x3a\x30\x33\x3a\x33\x32\x2b\x30\x39\x3a\x30\x30\x84\xab\xe4\
+\x62\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\
+\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\
+\x72\x67\x9b\xee\x3c\x1a\x00\x00\x00\x21\x74\x45\x58\x74\x53\x6f\
+\x75\x72\x63\x65\x00\x68\x74\x74\x70\x3a\x2f\x2f\x6a\x69\x6d\x6d\
+\x61\x63\x2e\x6d\x75\x73\x69\x63\x68\x61\x6c\x6c\x2e\x63\x7a\x69\
+\x66\xe3\x5e\x00\x00\x00\x0d\x74\x45\x58\x74\x54\x69\x74\x6c\x65\
+\x00\x47\x6f\x20\x44\x6f\x77\x6e\xf3\xfd\x14\x79\x00\x00\x00\x00\
+\x49\x45\x4e\x44\xae\x42\x60\x82\
+\x00\x00\x07\xc9\
+\x73\
+\x61\x76\x65\x41\x73\x44\x65\x74\x61\x69\x6c\x3d\xe5\xb0\x87\xe6\
+\xa8\x99\xe7\xb1\xa4\xe4\xbf\x9d\xe5\xad\x98\xe5\x88\xb0\xe5\x85\
+\xb6\xe4\xbb\x96\xe6\x96\x87\xe4\xbb\xb6\x0a\x63\x68\x61\x6e\x67\
+\x65\x53\x61\x76\x65\x44\x69\x72\x3d\xe6\x94\xb9\xe8\xae\x8a\xe5\
+\xad\x98\xe6\x94\xbe\xe7\x9b\xae\xe9\x8c\x84\x0a\x6f\x70\x65\x6e\
+\x46\x69\x6c\x65\x3d\xe9\x96\x8b\xe5\x95\x9f\xe6\xaa\x94\xe6\xa1\
+\x88\x0a\x73\x68\x61\x70\x65\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\x72\
+\x44\x65\x74\x61\x69\x6c\x3d\xe6\x9b\xb4\xe6\x94\xb9\xe7\xb7\x9a\
+\xe6\xa2\x9d\xe9\xa1\x8f\xe8\x89\xb2\x0a\x72\x65\x73\x65\x74\x41\
+\x6c\x6c\x3d\xe9\x87\x8d\xe7\xbd\xae\x0a\x63\x72\x74\x42\x6f\x78\
+\x3d\xe5\x89\xb5\xe5\xbb\xba\xe5\x8d\x80\xe5\xa1\x8a\x0a\x63\x72\
+\x74\x42\x6f\x78\x44\x65\x74\x61\x69\x6c\x3d\xe7\x95\xab\xe4\xb8\
+\x80\xe5\x80\x8b\xe5\x8d\x80\xe5\xa1\x8a\x0a\x64\x75\x70\x42\x6f\
+\x78\x44\x65\x74\x61\x69\x6c\x3d\xe8\xa4\x87\xe8\xa3\xbd\xe5\x8d\
+\x80\xe5\xa1\x8a\x0a\x76\x65\x72\x69\x66\x79\x49\x6d\x67\x3d\xe9\
+\xa9\x97\xe8\xad\x89\xe5\x9c\x96\xe5\x83\x8f\x0a\x7a\x6f\x6f\x6d\
+\x69\x6e\x44\x65\x74\x61\x69\x6c\x3d\xe6\x94\xbe\xe5\xa4\xa7\x0a\
+\x76\x65\x72\x69\x66\x79\x49\x6d\x67\x44\x65\x74\x61\x69\x6c\x3d\
+\xe9\xa9\x97\xe8\xad\x89\xe5\x9c\x96\xe5\x83\x8f\x0a\x73\x61\x76\
+\x65\x44\x65\x74\x61\x69\x6c\x3d\xe5\xb0\x87\xe6\xa8\x99\xe7\xb1\
+\xa4\xe5\xad\x98\xe5\x88\xb0\x0a\x6f\x70\x65\x6e\x46\x69\x6c\x65\
+\x44\x65\x74\x61\x69\x6c\x3d\xe6\x89\x93\xe9\x96\x8b\xe5\x9c\x96\
+\xe5\x83\x8f\x0a\x66\x69\x74\x57\x69\x64\x74\x68\x44\x65\x74\x61\
+\x69\x6c\x3d\xe8\xaa\xbf\xe6\x95\xb4\xe5\x88\xb0\xe7\xaa\x97\xe5\
+\x8f\xa3\xe5\xaf\xac\xe5\xba\xa6\x0a\x74\x75\x74\x6f\x72\x69\x61\
+\x6c\x3d\x59\x6f\x75\x54\x75\x62\x65\xe6\x95\x99\xe5\xad\xb8\x0a\
+\x65\x64\x69\x74\x4c\x61\x62\x65\x6c\x3d\xe7\xb7\xa8\xe8\xbc\xaf\
+\xe6\xa8\x99\xe7\xb1\xa4\x0a\x6f\x70\x65\x6e\x41\x6e\x6e\x6f\x74\
+\x61\x74\x69\x6f\x6e\x44\x65\x74\x61\x69\x6c\x3d\xe6\x89\x93\xe9\
+\x96\x8b\xe6\xa8\x99\xe7\xb1\xa4\xe6\x96\x87\xe4\xbb\xb6\x0a\x71\
+\x75\x69\x74\x3d\xe7\xb5\x90\xe6\x9d\x9f\x0a\x73\x68\x61\x70\x65\
+\x46\x69\x6c\x6c\x43\x6f\x6c\x6f\x72\x44\x65\x74\x61\x69\x6c\x3d\
+\xe6\x9b\xb4\xe6\x94\xb9\xe5\xa1\xab\xe5\x85\x85\xe9\xa1\x8f\xe8\
+\x89\xb2\x0a\x63\x6c\x6f\x73\x65\x43\x75\x72\x44\x65\x74\x61\x69\
+\x6c\x3d\xe9\x97\x9c\xe9\x96\x89\xe7\x9b\xae\xe5\x89\x8d\xe6\xaa\
+\x94\xe6\xa1\x88\x0a\x63\x6c\x6f\x73\x65\x43\x75\x72\x3d\xe9\x97\
+\x9c\xe9\x96\x89\x0a\x64\x65\x6c\x65\x74\x65\x49\x6d\x67\x3d\xe5\
+\x88\xaa\xe9\x99\xa4\xe5\x9c\x96\xe5\x83\x8f\x0a\x64\x65\x6c\x65\
+\x74\x65\x49\x6d\x67\x44\x65\x74\x61\x69\x6c\x3d\xe5\x88\xaa\xe9\
+\x99\xa4\xe7\x9b\xae\xe5\x89\x8d\xe5\x9c\x96\xe5\x83\x8f\x0a\x66\
+\x69\x74\x57\x69\x6e\x3d\xe8\xaa\xbf\xe6\x95\xb4\xe5\x88\xb0\xe8\
+\xb7\x9f\xe7\xaa\x97\xe5\x8f\xa3\xe4\xb8\x80\xe6\xa8\xa3\xe5\xa4\
+\xa7\xe5\xb0\x8f\x0a\x64\x65\x6c\x42\x6f\x78\x3d\xe5\x88\xaa\xe9\
+\x99\xa4\xe9\x81\xb8\xe5\x8f\x96\xe5\x8d\x80\xe5\xa1\x8a\x0a\x62\
+\x6f\x78\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\x72\x44\x65\x74\x61\x69\
+\x6c\x3d\xe9\x81\xb8\xe6\x93\x87\xe6\xa1\x86\xe7\xb7\x9a\xe9\xa1\
+\x8f\xe8\x89\xb2\x0a\x6f\x72\x69\x67\x69\x6e\x61\x6c\x73\x69\x7a\
+\x65\x3d\xe5\x8e\x9f\xe5\xa7\x8b\xe5\xa4\xa7\xe5\xb0\x8f\x0a\x72\
+\x65\x73\x65\x74\x41\x6c\x6c\x44\x65\x74\x61\x69\x6c\x3d\xe9\x87\
+\x8d\xe8\xa8\xad\xe6\x89\x80\xe6\x9c\x89\xe8\xa8\xad\xe5\xae\x9a\
+\x0a\x7a\x6f\x6f\x6d\x6f\x75\x74\x44\x65\x74\x61\x69\x6c\x3d\xe7\
+\x95\xab\xe9\x9d\xa2\xe6\x94\xbe\xe5\xa4\xa7\x0a\x73\x61\x76\x65\
+\x3d\xe5\x84\xb2\xe5\xad\x98\x0a\x73\x61\x76\x65\x41\x73\x3d\xe5\
+\x8f\xa6\xe5\xad\x98\xe7\x82\xba\x0a\x66\x69\x74\x57\x69\x6e\x44\
+\x65\x74\x61\x69\x6c\x3d\xe7\xb8\xae\xe6\x94\xbe\xe5\x88\xb0\xe7\
+\xaa\x97\xe5\x8f\xa3\xe4\xb8\x80\xe6\xa8\xa3\x0a\x6f\x70\x65\x6e\
+\x44\x69\x72\x3d\xe9\x96\x8b\xe5\x95\x9f\xe7\x9b\xae\xe9\x8c\x84\
+\x0a\x63\x6f\x70\x79\x50\x72\x65\x76\x42\x6f\x75\x6e\x64\x69\x6e\
+\x67\x3d\xe8\xa4\x87\xe8\xa3\xbd\xe7\x95\xb6\xe5\x89\x8d\xe5\x9c\
+\x96\xe5\x83\x8f\xe4\xb8\xad\xe7\x9a\x84\xe4\xb8\x8a\xe4\xb8\x80\
+\xe5\x80\x8b\xe9\x82\x8a\xe7\x95\x8c\xe6\xa1\x86\x0a\x73\x68\x6f\
+\x77\x48\x69\x64\x65\x3d\xe9\xa1\xaf\xe7\xa4\xba\x2f\xe9\x9a\xb1\
+\xe8\x97\x8f\xe6\xa8\x99\xe7\xb1\xa4\x0a\x63\x68\x61\x6e\x67\x65\
+\x53\x61\x76\x65\x46\x6f\x72\x6d\x61\x74\x3d\xe6\x9b\xb4\xe6\x94\
+\xb9\xe5\x84\xb2\xe5\xad\x98\xe6\xa0\xbc\xe5\xbc\x8f\x0a\x73\x68\
+\x61\x70\x65\x46\x69\x6c\x6c\x43\x6f\x6c\x6f\x72\x3d\xe5\xa1\xab\
+\xe5\x85\x85\xe9\xa1\x8f\xe8\x89\xb2\x0a\x71\x75\x69\x74\x41\x70\
+\x70\x3d\xe9\x9b\xa2\xe9\x96\x8b\xe6\x9c\xac\xe7\xa8\x8b\xe5\xbc\
+\x8f\x0a\x64\x75\x70\x42\x6f\x78\x3d\xe8\xa4\x87\xe8\xa3\xbd\xe5\
+\x8d\x80\xe5\xa1\x8a\x0a\x64\x65\x6c\x42\x6f\x78\x44\x65\x74\x61\
+\x69\x6c\x3d\xe5\x88\xaa\xe9\x99\xa4\xe5\x8d\x80\xe5\xa1\x8a\x0a\
+\x7a\x6f\x6f\x6d\x69\x6e\x3d\xe6\x94\xbe\xe5\xa4\xa7\xe7\x95\xab\
+\xe9\x9d\xa2\x0a\x69\x6e\x66\x6f\x3d\xe8\xb3\x87\xe8\xa8\x8a\x0a\
+\x6f\x70\x65\x6e\x41\x6e\x6e\x6f\x74\x61\x74\x69\x6f\x6e\x3d\xe9\
+\x96\x8b\xe5\x95\x9f\xe6\xa8\x99\xe7\xb1\xa4\x0a\x70\x72\x65\x76\
+\x49\x6d\x67\x44\x65\x74\x61\x69\x6c\x3d\xe4\xb8\x8a\xe4\xb8\x80\
+\xe5\x80\x8b\xe5\x9c\x96\xe5\x83\x8f\x0a\x66\x69\x74\x57\x69\x64\
+\x74\x68\x3d\xe7\xb8\xae\xe6\x94\xbe\xe5\x88\xb0\xe8\xb7\x9f\xe7\
+\x95\xab\xe9\x9d\xa2\xe4\xb8\x80\xe6\xa8\xa3\xe5\xaf\xac\x0a\x7a\
+\x6f\x6f\x6d\x6f\x75\x74\x3d\xe7\xb8\xae\xe5\xb0\x8f\xe7\x95\xab\
+\xe9\x9d\xa2\x0a\x63\x68\x61\x6e\x67\x65\x53\x61\x76\x65\x64\x41\
+\x6e\x6e\x6f\x74\x61\x74\x69\x6f\x6e\x44\x69\x72\x3d\xe6\x9b\xb4\
+\xe6\x94\xb9\xe9\xa0\x90\xe8\xa8\xad\xe6\xa8\x99\xe7\xb1\xa4\xe5\
+\xad\x98\xe7\x9a\x84\xe7\x9b\xae\xe9\x8c\x84\x0a\x6e\x65\x78\x74\
+\x49\x6d\x67\x44\x65\x74\x61\x69\x6c\x3d\xe4\xb8\x8b\xe4\xb8\x80\
+\xe5\x80\x8b\xe5\x9c\x96\xe5\x83\x8f\x0a\x6f\x72\x69\x67\x69\x6e\
+\x61\x6c\x73\x69\x7a\x65\x44\x65\x74\x61\x69\x6c\x3d\xe6\x94\xbe\
+\xe5\xa4\xa7\xe5\x88\xb0\xe5\x8e\x9f\xe5\xa7\x8b\xe5\xa4\xa7\xe5\
+\xb0\x8f\x0a\x70\x72\x65\x76\x49\x6d\x67\x3d\xe4\xb8\x8a\xe4\xb8\
+\x80\xe5\x80\x8b\xe5\x9c\x96\xe5\x83\x8f\x0a\x74\x75\x74\x6f\x72\
+\x69\x61\x6c\x44\x65\x74\x61\x69\x6c\x3d\xe9\xa1\xaf\xe7\xa4\xba\
+\xe7\xa4\xba\xe7\xaf\x84\xe5\x85\xa7\xe5\xae\xb9\x0a\x73\x68\x61\
+\x70\x65\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\x72\x3d\xe5\xbd\xa2\xe7\
+\x8b\x80\xe7\xb7\x9a\xe6\xa2\x9d\xe9\xa1\x8f\xe8\x89\xb2\x0a\x62\
+\x6f\x78\x4c\x69\x6e\x65\x43\x6f\x6c\x6f\x72\x3d\xe6\x97\xa5\xe6\
+\x9c\x9f\xe5\x88\x86\xe9\x9a\x94\xe7\xb7\x9a\xe9\xa1\x8f\xe8\x89\
+\xb2\x0a\x65\x64\x69\x74\x4c\x61\x62\x65\x6c\x44\x65\x74\x61\x69\
+\x6c\x3d\xe4\xbf\xae\xe6\x94\xb9\xe6\x89\x80\xe9\x81\xb8\xe5\x8d\
+\x80\xe5\xa1\x8a\xe7\x9a\x84\xe6\xa8\x99\xe7\xb1\xa4\x0a\x6e\x65\
+\x78\x74\x49\x6d\x67\x3d\xe4\xb8\x8b\xe4\xb8\x80\xe5\xbc\xb5\xe5\
+\x9c\x96\xe7\x89\x87\x0a\x75\x73\x65\x44\x65\x66\x61\x75\x6c\x74\
+\x4c\x61\x62\x65\x6c\x3d\xe4\xbd\xbf\xe7\x94\xa8\xe9\xa0\x90\xe8\
+\xa8\xad\xe6\xa8\x99\xe7\xb1\xa4\x0a\x75\x73\x65\x44\x69\x66\x66\
+\x69\x63\x75\x6c\x74\x3d\xe6\x9c\x89\xe9\x9b\xa3\xe5\xba\xa6\xe7\
+\x9a\x84\x0a\x62\x6f\x78\x4c\x61\x62\x65\x6c\x54\x65\x78\x74\x3d\
+\xe5\x8d\x80\xe5\xa1\x8a\xe7\x9a\x84\xe6\xa8\x99\xe7\xb1\xa4\x0a\
+\x6c\x61\x62\x65\x6c\x73\x3d\xe6\xa8\x99\xe7\xb1\xa4\x0a\x61\x75\
+\x74\x6f\x53\x61\x76\x65\x4d\x6f\x64\x65\x3d\xe8\x87\xaa\xe5\x8b\
+\x95\xe5\x84\xb2\xe5\xad\x98\xe6\xa8\xa1\xe5\xbc\x8f\x0a\x73\x69\
+\x6e\x67\x6c\x65\x43\x6c\x73\x4d\x6f\x64\x65\x3d\xe5\x96\xae\xe4\
+\xb8\x80\xe9\xa1\x9e\xe5\x88\xa5\xe6\xa8\xa1\xe5\xbc\x8f\x0a\x64\
+\x69\x73\x70\x6c\x61\x79\x4c\x61\x62\x65\x6c\x3d\xe9\xa1\xaf\xe7\
+\xa4\xba\xe9\xa1\x9e\xe5\x88\xa5\x0a\x66\x69\x6c\x65\x4c\x69\x73\
+\x74\x3d\xe6\xaa\x94\xe6\xa1\x88\xe6\xb8\x85\xe5\x96\xae\x0a\x66\
+\x69\x6c\x65\x73\x3d\xe6\xaa\x94\xe6\xa1\x88\x0a\x69\x63\x6f\x6e\
+\x4c\x69\x73\x74\x3d\x58\x58\x0a\x69\x63\x6f\x6e\x3d\x58\x58\x0a\
+\x61\x64\x76\x61\x6e\x63\x65\x64\x4d\x6f\x64\x65\x3d\xe9\x80\xb2\
+\xe9\x9a\x8e\xe6\xa8\xa1\xe5\xbc\x8f\x0a\x61\x64\x76\x61\x6e\x63\
+\x65\x64\x4d\x6f\x64\x65\x44\x65\x74\x61\x69\x6c\x3d\xe5\x88\x87\
+\xe5\x88\xb0\xe9\x80\xb2\xe9\x9a\x8e\xe6\xa8\xa1\xe5\xbc\x8f\x0a\
+\x73\x68\x6f\x77\x41\x6c\x6c\x42\x6f\x78\x44\x65\x74\x61\x69\x6c\
+\x3d\xe9\xa1\xaf\xe7\xa4\xba\xe6\x89\x80\xe6\x9c\x89\xe5\x8d\x80\
+\xe5\xa1\x8a\x0a\x68\x69\x64\x65\x41\x6c\x6c\x42\x6f\x78\x44\x65\
+\x74\x61\x69\x6c\x3d\xe9\x9a\xb1\xe8\x97\x8f\xe6\x89\x80\xe6\x9c\
+\x89\xe5\x8d\x80\xe5\xa1\x8a\x0a\
+\x00\x00\x04\x44\
+\x89\
+\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0\x77\x3d\xf8\
+\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\x12\x00\x00\
+\x0b\x12\x01\xd2\xdd\x7e\xfc\x00\x00\x00\x07\x74\x49\x4d\x45\x07\
+\xd3\x0a\x17\x0a\x12\x16\x5e\xb7\xf3\xf2\x00\x00\x00\x1d\x74\x45\
+\x58\x74\x43\x6f\x6d\x6d\x65\x6e\x74\x00\x43\x72\x65\x61\x74\x65\
+\x64\x20\x77\x69\x74\x68\x20\x54\x68\x65\x20\x47\x49\x4d\x50\xef\
+\x64\x25\x6e\x00\x00\x03\xa8\x49\x44\x41\x54\x78\xda\xad\x96\x5f\
+\x68\x1c\x55\x18\xc5\x7f\x77\x76\x36\x9b\x34\xe9\xda\x6e\xda\xb2\
+\x2a\x98\x27\x31\x55\xfa\x66\xdb\x6d\x82\x42\x5e\x35\x45\xf0\x29\
+\x46\x10\x82\xe0\x83\xa2\x82\xb5\x11\x04\x8b\xcf\xea\x8b\x0f\xe2\
+\x9f\x60\x7c\x08\x41\x6a\x71\x5b\xcd\xa3\x88\x6d\xd3\xc4\x9a\x36\
+\x69\x35\x14\x2a\xad\x94\xe2\x96\x4d\x28\x49\x48\xc8\xee\xce\xec\
+\xcc\xbd\x9f\x0f\x33\x3b\xfb\x67\x92\xda\xa2\x1f\x5c\x66\x19\x66\
+\xce\x39\xdf\xf9\xee\x3d\xb3\xf0\x3f\xd4\xd0\xd0\x90\x75\x3f\xcf\
+\xbd\x04\xc8\x03\xac\x32\xb0\x91\x4e\xa7\xa5\xb7\xb7\x57\x46\x46\
+\x46\x6e\x00\xed\x80\xda\x8e\x40\x16\x17\x17\xa5\x5c\x2e\xcb\xbf\
+\x95\xeb\xba\xe2\xba\x8e\xb8\xae\x23\xc5\x62\x51\x0a\x85\x82\xcc\
+\xcf\xcf\x4b\x4f\x4f\x4f\x01\xd8\x03\x6c\xd9\xd1\x7d\x81\xd7\x49\
+\x1c\x59\x5b\x5b\x95\xd3\xa7\xf3\xb2\xbc\xbc\x2c\x22\x22\x53\x53\
+\x53\x92\xcb\xe5\x34\x90\xae\x91\xd8\x8d\x0c\x1d\x1d\x1d\x00\x4c\
+\x4f\x4f\xc7\xd9\x45\x50\x4a\x21\x22\x88\x08\x5a\xfb\x38\x8e\x4b\
+\xa9\x54\x22\x95\x4a\x01\x30\x30\x30\x80\xe3\x38\xd6\xf0\xf0\xf0\
+\xc7\x9e\xe7\xbd\x13\xda\xd8\x88\x11\x2f\x63\x8c\x68\xad\xc5\xf7\
+\xbd\xe8\xea\x79\x9e\xb8\xae\x23\x1b\x1b\x1b\x32\x3e\x3e\xbe\xdd\
+\x8c\x46\x80\xa4\x6a\x21\x88\x3a\xa8\x29\x15\x31\x04\xb7\x25\x9c\
+\x5f\x70\x1f\xc0\xf7\x35\x4b\x4b\x45\xb2\xfb\xf6\xf1\xdb\xa5\x39\
+\x4e\x9c\xf8\x10\xaf\xd8\x4f\xe5\x4a\x86\xf4\x73\x53\x00\x9d\x31\
+\x82\x56\xe0\xe0\x2a\x4d\x16\x21\x82\xb2\x2c\xaa\xae\xcb\xca\xea\
+\x2a\x9e\xeb\xf0\xf8\x13\xfb\xf1\xef\x3e\x83\x37\x97\xe2\xb5\xb1\
+\xa2\x4c\x9c\xb9\xa6\x80\xbd\x76\xab\xd7\xc6\x68\xce\x9f\x9f\x8e\
+\x94\x06\x80\x20\x08\x0a\x85\x84\x0e\x18\x2d\x18\xa3\x31\xc6\xf0\
+\xfc\xe0\x51\xfc\xe5\x7e\xbc\xb9\x76\x8e\x7f\xb7\x46\x08\xfe\x3e\
+\xd0\x1e\xeb\xc0\xf3\xaa\x0d\xc0\x21\x09\x82\x18\x41\x59\x0a\x31\
+\x75\x8b\x44\x84\x9d\xe9\x87\xa8\x16\xfa\xa8\x2e\xec\xe0\xcd\xc9\
+\x4d\xbe\x39\x79\xb1\x86\xf7\x32\x70\x6e\x8b\x0e\x0c\x17\xa6\x2f\
+\x44\x4a\x03\xc0\x78\x07\xbe\xaf\x19\x1c\x3c\x8a\x7b\xeb\x08\xee\
+\xa5\x76\x5e\x9f\x58\x65\x22\xbf\xc0\xdb\x6f\xbc\xca\xa7\x9f\x7d\
+\x0d\xb0\x0e\x38\x71\x02\xad\x39\xd2\x97\x43\x4c\xa8\xb2\xc1\xaa\
+\x68\x9b\x1a\xc3\xae\xdd\xdd\xb8\x37\x73\x94\xaf\xed\xe1\xbd\x53\
+\x77\x98\xc8\x2f\x30\xf6\xe5\xe7\xdc\xbe\x75\xbd\x06\xb5\x06\xb8\
+\x5b\x77\x30\x33\x13\xf8\x1c\xda\x61\x85\xc0\x4a\xa9\xc8\x73\xe7\
+\xfa\x61\x2a\xf3\x29\x46\xcf\xfc\xcd\xd8\xb7\x57\x19\x1d\x3d\x46\
+\xa6\x3b\x43\x69\x3d\x53\x83\xaa\x00\xda\xde\xea\x48\xf7\xf7\xf5\
+\x21\x08\xc6\x98\x26\x02\x80\x5d\xbb\xbb\x29\xff\x71\x88\xd2\xe5\
+\x14\x6f\xe5\xd7\x99\xcc\x5f\x65\xec\xab\x2f\xc8\x64\x32\x3c\x9c\
+\xcd\xb2\xbe\x72\x27\xd2\x1a\x3b\xc9\x00\xbe\xf6\x99\x99\x99\xad\
+\xcd\x3d\x1c\x74\x30\x50\xcf\xf3\x00\xb8\x7d\xf3\x59\x3e\xfa\xf1\
+\x27\x26\xf3\xbf\x73\xfc\xdd\x63\x14\x97\x96\x10\x84\x03\x07\x9e\
+\x42\xb5\x44\x5d\x8c\x40\x6b\x4d\xee\xf0\xa1\x48\x71\x6d\xb7\x78\
+\x5e\x95\x47\x1e\x7d\x8c\x17\x06\xf6\xb2\xff\xc5\x4f\x00\xf8\xfe\
+\xd4\x49\xba\x76\x76\x91\xcd\x66\x49\xa5\xda\x50\x4a\x61\x29\xeb\
+\xde\x04\x46\x6b\x66\x67\x67\x43\x60\xa2\xf3\xe0\xba\x2e\x00\x3f\
+\xfc\x72\x97\x73\x67\x7f\x46\x59\x8a\xae\xce\x4e\x6c\x3b\x49\x5b\
+\x5b\x92\x44\x22\x81\x52\xf1\xa4\x8e\x5b\xe4\x7b\x1c\x3c\xf8\x74\
+\x93\x7a\x31\x06\x5f\xfb\xfc\x75\xe3\x4f\x94\x05\x95\x8a\x43\x32\
+\x69\x07\xf3\xb1\xac\xe8\xcc\x68\xad\x31\x46\x6f\x4f\x50\xad\x56\
+\xd1\x5a\x87\xf6\x04\xfb\x1e\x15\xcc\xc5\x18\x83\x36\x3e\xc6\x37\
+\x24\x93\x36\x89\x44\xa2\x1e\x1b\x4a\x45\xef\x35\x38\x1b\x27\xd8\
+\xdc\xdc\x44\x6b\x1d\x78\xa3\x68\x52\xa8\x94\x42\x29\x85\x6d\xdb\
+\xc1\xef\xb0\xbb\xda\xdc\x1a\xb3\xab\xb1\x9a\x26\x52\x28\x14\x40\
+\x0c\x22\x06\x63\xea\xab\x51\xa9\xa5\x14\xad\x32\x83\x38\x21\xcc\
+\x26\xd9\xbe\x83\x8b\xbf\x9e\x65\x47\x9b\x0a\x22\x41\x24\x8a\x68\
+\x23\x26\x0c\x6a\x1a\x94\xab\xc8\xef\x1a\xa8\x11\xc3\xe5\x85\x2b\
+\xd4\xf7\x78\x73\xbd\xf2\x80\x1f\xfd\x7b\xad\x0f\x80\x27\x5b\xd3\
+\xd4\x06\xba\xc3\x95\xfc\x8f\xff\x64\x3c\x60\x05\x58\xf9\x07\xbb\
+\x78\x04\xf0\x58\x0d\x4c\x09\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
+\x42\x60\x82\
+"
+
+qt_resource_name = b"\
+\x00\x04\
+\x00\x06\xa6\x79\
+\x00\x63\
+\x00\x6f\x00\x70\x00\x79\
+\x00\x04\
+\x00\x07\xc4\xaf\
+\x00\x75\
+\x00\x6e\x00\x64\x00\x6f\
+\x00\x0a\
+\x03\x87\xc0\x73\
+\x00\x66\
+\x00\x6f\x00\x72\x00\x6d\x00\x61\x00\x74\x00\x5f\x00\x76\x00\x6f\x00\x63\
+\x00\x0a\
+\x04\xd5\xeb\x87\
+\x00\x66\
+\x00\x69\x00\x74\x00\x2d\x00\x77\x00\x69\x00\x6e\x00\x64\x00\x6f\x00\x77\
+\x00\x05\
+\x00\x6a\x63\x62\
+\x00\x63\
+\x00\x6f\x00\x6c\x00\x6f\x00\x72\
+\x00\x06\
+\x06\xac\x2c\xa5\
+\x00\x64\
+\x00\x65\x00\x6c\x00\x65\x00\x74\x00\x65\
+\x00\x05\
+\x00\x6a\x36\x95\
+\x00\x63\
+\x00\x6c\x00\x6f\x00\x73\x00\x65\
+\x00\x07\
+\x09\x8c\x83\x63\
+\x00\x73\
+\x00\x61\x00\x76\x00\x65\x00\x2d\x00\x61\x00\x73\
+\x00\x04\
+\x00\x06\xef\xa5\
+\x00\x68\
+\x00\x69\x00\x64\x00\x65\
+\x00\x06\
+\x07\xcc\x8f\xd9\
+\x00\x76\
+\x00\x65\x00\x72\x00\x69\x00\x66\x00\x79\
+\x00\x03\
+\x00\x00\x68\x70\
+\x00\x61\
+\x00\x70\x00\x70\
+\x00\x04\
+\x00\x06\xb6\x45\
+\x00\x64\
+\x00\x6f\x00\x6e\x00\x65\
+\x00\x07\
+\x0a\xb9\x04\x03\
+\x00\x73\
+\x00\x74\x00\x72\x00\x69\x00\x6e\x00\x67\x00\x73\
+\x00\x04\
+\x00\x06\xec\x30\
+\x00\x68\
+\x00\x65\x00\x6c\x00\x70\
+\x00\x0b\
+\x08\x7c\x58\x4f\
+\x00\x66\
+\x00\x6f\x00\x72\x00\x6d\x00\x61\x00\x74\x00\x5f\x00\x79\x00\x6f\x00\x6c\x00\x6f\
+\x00\x04\
+\x00\x07\x98\xc5\
+\x00\x73\
+\x00\x61\x00\x76\x00\x65\
+\x00\x04\
+\x00\x08\x16\x5d\
+\x00\x7a\
+\x00\x6f\x00\x6f\x00\x6d\
+\x00\x03\
+\x00\x00\x74\xc7\
+\x00\x6e\
+\x00\x65\x00\x77\
+\x00\x04\
+\x00\x07\x8c\x04\
+\x00\x71\
+\x00\x75\x00\x69\x00\x74\
+\x00\x04\
+\x00\x06\xd0\x25\
+\x00\x66\
+\x00\x69\x00\x6c\x00\x65\
+\x00\x09\
+\x07\x4d\x21\xa8\
+\x00\x66\
+\x00\x69\x00\x74\x00\x2d\x00\x77\x00\x69\x00\x64\x00\x74\x00\x68\
+\x00\x04\
+\x00\x07\x66\xbe\
+\x00\x6f\
+\x00\x70\x00\x65\x00\x6e\
+\x00\x08\
+\x0c\x9c\xab\x2c\
+\x00\x72\
+\x00\x65\x00\x73\x00\x65\x00\x74\x00\x61\x00\x6c\x00\x6c\
+\x00\x04\
+\x00\x04\x8c\xaf\
+\x00\x41\
+\x00\x75\x00\x74\x00\x6f\
+\x00\x0a\
+\x06\x8b\x64\x25\
+\x00\x63\
+\x00\x6f\x00\x6c\x00\x6f\x00\x72\x00\x5f\x00\x6c\x00\x69\x00\x6e\x00\x65\
+\x00\x06\
+\x06\xcf\x6c\x94\
+\x00\x65\
+\x00\x78\x00\x70\x00\x65\x00\x72\x00\x74\
+\x00\x08\
+\x06\x60\x56\xe4\
+\x00\x7a\
+\x00\x6f\x00\x6f\x00\x6d\x00\x2d\x00\x6f\x00\x75\x00\x74\
+\x00\x05\
+\x00\x78\xa8\xb3\
+\x00\x72\
+\x00\x65\x00\x52\x00\x65\x00\x63\
+\x00\x0d\
+\x03\x22\xb9\x5e\
+\x00\x73\
+\x00\x74\x00\x72\x00\x69\x00\x6e\x00\x67\x00\x73\x00\x2d\x00\x7a\x00\x68\x00\x2d\x00\x43\x00\x4e\
+\x00\x07\
+\x01\x66\x02\xfe\
+\x00\x7a\
+\x00\x6f\x00\x6f\x00\x6d\x00\x2d\x00\x69\x00\x6e\
+\x00\x04\
+\x00\x07\x4c\xf4\
+\x00\x6e\
+\x00\x65\x00\x78\x00\x74\
+\x00\x06\
+\x07\x27\x8c\x33\
+\x00\x6c\
+\x00\x61\x00\x62\x00\x65\x00\x6c\x00\x73\
+\x00\x04\
+\x00\x07\x78\xc6\
+\x00\x70\
+\x00\x72\x00\x65\x00\x76\
+\x00\x0d\
+\x03\x22\xba\xb7\
+\x00\x73\
+\x00\x74\x00\x72\x00\x69\x00\x6e\x00\x67\x00\x73\x00\x2d\x00\x7a\x00\x68\x00\x2d\x00\x54\x00\x57\
+\x00\x04\
+\x00\x06\xbb\x04\
+\x00\x65\
+\x00\x64\x00\x69\x00\x74\
+"
+
+qt_resource_struct_v1 = b"\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x23\x00\x00\x00\x01\
+\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x01\x00\x00\x47\xf0\
+\x00\x00\x01\x2a\x00\x00\x00\x00\x00\x01\x00\x00\x8b\xda\
+\x00\x00\x01\x8e\x00\x00\x00\x00\x00\x01\x00\x00\xb6\x5c\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x01\x00\x00\x66\xb8\
+\x00\x00\x02\x70\x00\x00\x00\x00\x00\x01\x00\x01\xf9\x1e\
+\x00\x00\x01\x44\x00\x00\x00\x00\x00\x01\x00\x00\x97\xac\
+\x00\x00\x00\xe4\x00\x00\x00\x00\x00\x01\x00\x00\x79\xde\
+\x00\x00\x00\x96\x00\x00\x00\x00\x00\x01\x00\x00\x37\x17\
+\x00\x00\x02\x22\x00\x00\x00\x00\x00\x01\x00\x00\xf9\xdf\
+\x00\x00\x01\x6a\x00\x00\x00\x00\x00\x01\x00\x00\xa0\x06\
+\x00\x00\x02\x42\x00\x00\x00\x00\x00\x01\x00\x01\x79\x84\
+\x00\x00\x01\x36\x00\x00\x00\x00\x00\x01\x00\x00\x90\x2d\
+\x00\x00\x01\x0e\x00\x00\x00\x00\x00\x01\x00\x00\x82\xbc\
+\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x01\x00\x00\x02\x8a\
+\x00\x00\x01\x1c\x00\x00\x00\x00\x00\x01\x00\x00\x87\x63\
+\x00\x00\x00\x72\x00\x00\x00\x00\x00\x01\x00\x00\x1f\xed\
+\x00\x00\x00\x50\x00\x00\x00\x00\x00\x01\x00\x00\x11\xd8\
+\x00\x00\x01\xde\x00\x00\x00\x00\x00\x01\x00\x00\xe3\xf1\
+\x00\x00\x02\x0e\x00\x00\x00\x00\x00\x01\x00\x00\xf5\x90\
+\x00\x00\x01\xee\x00\x00\x00\x00\x00\x01\x00\x00\xeb\x5b\
+\x00\x00\x02\x50\x00\x00\x00\x00\x00\x01\x00\x01\xf1\x51\
+\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x01\x00\x00\x0a\x70\
+\x00\x00\x00\x36\x00\x00\x00\x00\x00\x01\x00\x00\x0d\x86\
+\x00\x00\x01\xc8\x00\x00\x00\x00\x00\x01\x00\x00\xdf\xbb\
+\x00\x00\x01\x9c\x00\x00\x00\x00\x00\x01\x00\x00\xd5\x24\
+\x00\x00\x00\x60\x00\x00\x00\x00\x00\x01\x00\x00\x17\x91\
+\x00\x00\x01\xb6\x00\x00\x00\x00\x00\x01\x00\x00\xde\x68\
+\x00\x00\x02\x30\x00\x00\x00\x00\x00\x01\x00\x01\x70\x33\
+\x00\x00\x01\x52\x00\x00\x00\x00\x00\x01\x00\x00\x9a\xad\
+\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x01\x00\x00\x3c\x0b\
+\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x01\x00\x00\x80\x15\
+\x00\x00\x00\x82\x00\x00\x00\x00\x00\x01\x00\x00\x2c\x18\
+\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x01\x00\x00\x6f\x52\
+\x00\x00\x01\x78\x00\x00\x00\x00\x00\x01\x00\x00\xa8\x23\
+"
+
+qt_resource_struct_v2 = b"\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x23\x00\x00\x00\x01\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\xb6\x00\x00\x00\x00\x00\x01\x00\x00\x47\xf0\
+\x00\x00\x01\x75\xf3\xca\x7e\xa3\
+\x00\x00\x01\x2a\x00\x00\x00\x00\x00\x01\x00\x00\x8b\xda\
+\x00\x00\x01\x74\x83\x79\x45\x48\
+\x00\x00\x01\x8e\x00\x00\x00\x00\x00\x01\x00\x00\xb6\x5c\
+\x00\x00\x01\x75\xe3\x7f\xf9\x6b\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x01\x74\x83\x79\x45\x48\
+\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x01\x00\x00\x66\xb8\
+\x00\x00\x01\x74\x83\x79\x45\x48\
+\x00\x00\x02\x70\x00\x00\x00\x00\x00\x01\x00\x01\xf9\x1e\
+\x00\x00\x01\x74\x83\x79\x45\x48\
+\x00\x00\x01\x44\x00\x00\x00\x00\x00\x01\x00\x00\x97\xac\
+\x00\x00\x01\x74\x83\x79\x45\x48\
+\x00\x00\x00\xe4\x00\x00\x00\x00\x00\x01\x00\x00\x79\xde\
+\x00\x00\x01\x74\x83\x79\x45\x48\
+\x00\x00\x00\x96\x00\x00\x00\x00\x00\x01\x00\x00\x37\x17\
+\x00\x00\x01\x74\x83\x79\x45\x48\
+\x00\x00\x02\x22\x00\x00\x00\x00\x00\x01\x00\x00\xf9\xdf\
+\x00\x00\x01\x74\x83\x79\x45\x48\
+\x00\x00\x01\x6a\x00\x00\x00\x00\x00\x01\x00\x00\xa0\x06\
+\x00\x00\x01\x74\x83\x79\x45\x48\
+\x00\x00\x02\x42\x00\x00\x00\x00\x00\x01\x00\x01\x79\x84\
+\x00\x00\x01\x74\x83\x79\x45\x48\
+\x00\x00\x01\x36\x00\x00\x00\x00\x00\x01\x00\x00\x90\x2d\
+\x00\x00\x01\x74\x83\x79\x45\x48\
+\x00\x00\x01\x0e\x00\x00\x00\x00\x00\x01\x00\x00\x82\xbc\
+\x00\x00\x01\x74\x83\x79\x45\x48\
+\x00\x00\x00\x0e\x00\x00\x00\x00\x00\x01\x00\x00\x02\x8a\
+\x00\x00\x01\x74\x83\x79\x45\x48\
+\x00\x00\x01\x1c\x00\x00\x00\x00\x00\x01\x00\x00\x87\x63\
+\x00\x00\x01\x74\x83\x79\x45\x48\
+\x00\x00\x00\x72\x00\x00\x00\x00\x00\x01\x00\x00\x1f\xed\
+\x00\x00\x01\x74\x83\x79\x45\x48\
+\x00\x00\x00\x50\x00\x00\x00\x00\x00\x01\x00\x00\x11\xd8\
+\x00\x00\x01\x74\x83\x79\x45\x48\
+\x00\x00\x01\xde\x00\x00\x00\x00\x00\x01\x00\x00\xe3\xf1\
+\x00\x00\x01\x75\xe3\x7f\xf9\x6b\
+\x00\x00\x02\x0e\x00\x00\x00\x00\x00\x01\x00\x00\xf5\x90\
+\x00\x00\x01\x74\x83\x79\x45\x48\
+\x00\x00\x01\xee\x00\x00\x00\x00\x00\x01\x00\x00\xeb\x5b\
+\x00\x00\x01\x75\xfe\x68\xaf\x02\
+\x00\x00\x02\x50\x00\x00\x00\x00\x00\x01\x00\x01\xf1\x51\
+\x00\x00\x01\x74\xde\xd2\xc1\x11\
+\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x01\x00\x00\x0a\x70\
+\x00\x00\x01\x74\x83\x79\x45\x48\
+\x00\x00\x00\x36\x00\x00\x00\x00\x00\x01\x00\x00\x0d\x86\
+\x00\x00\x01\x74\x83\x79\x45\x48\
+\x00\x00\x01\xc8\x00\x00\x00\x00\x00\x01\x00\x00\xdf\xbb\
+\x00\x00\x01\x74\x83\x79\x45\x48\
+\x00\x00\x01\x9c\x00\x00\x00\x00\x00\x01\x00\x00\xd5\x24\
+\x00\x00\x01\x74\x83\x79\x45\x48\
+\x00\x00\x00\x60\x00\x00\x00\x00\x00\x01\x00\x00\x17\x91\
+\x00\x00\x01\x74\x83\x79\x45\x48\
+\x00\x00\x01\xb6\x00\x00\x00\x00\x00\x01\x00\x00\xde\x68\
+\x00\x00\x01\x74\x83\x79\x45\x48\
+\x00\x00\x02\x30\x00\x00\x00\x00\x00\x01\x00\x01\x70\x33\
+\x00\x00\x01\x74\x83\x79\x45\x48\
+\x00\x00\x01\x52\x00\x00\x00\x00\x00\x01\x00\x00\x9a\xad\
+\x00\x00\x01\x74\x83\x79\x45\x48\
+\x00\x00\x00\xa4\x00\x00\x00\x00\x00\x01\x00\x00\x3c\x0b\
+\x00\x00\x01\x74\x83\x79\x45\x48\
+\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x01\x00\x00\x80\x15\
+\x00\x00\x01\x74\x83\x79\x45\x48\
+\x00\x00\x00\x82\x00\x00\x00\x00\x00\x01\x00\x00\x2c\x18\
+\x00\x00\x01\x74\x83\x79\x45\x48\
+\x00\x00\x00\xd0\x00\x00\x00\x00\x00\x01\x00\x00\x6f\x52\
+\x00\x00\x01\x75\xfe\x68\x20\xb4\
+\x00\x00\x01\x78\x00\x00\x00\x00\x00\x01\x00\x00\xa8\x23\
+\x00\x00\x01\x74\x83\x79\x45\x48\
+"
+
+qt_version = [int(v) for v in QtCore.qVersion().split('.')]
+if qt_version < [5, 8, 0]:
+ rcc_version = 1
+ qt_resource_struct = qt_resource_struct_v1
+else:
+ rcc_version = 2
+ qt_resource_struct = qt_resource_struct_v2
+
+def qInitResources():
+ QtCore.qRegisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+def qCleanupResources():
+ QtCore.qUnregisterResourceData(rcc_version, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+qInitResources()
diff --git a/PPOCRLabel/libs/settings.py b/PPOCRLabel/libs/settings.py
new file mode 100644
index 0000000000000000000000000000000000000000..7f9a4fdda63bf3564abb3b281b9602560b6893fd
--- /dev/null
+++ b/PPOCRLabel/libs/settings.py
@@ -0,0 +1,60 @@
+# Copyright (c) <2015-Present> Tzutalin
+# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba,
+# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+# associated documentation files (the "Software"), to deal in the Software without restriction, including without
+# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+# The above copyright notice and this permission notice shall be included in all copies or substantial portions of
+# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
+# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+import pickle
+import os
+import sys
+
+
+class Settings(object):
+ def __init__(self):
+ # Be default, the home will be in the same folder as labelImg
+ home = os.path.expanduser("~")
+ self.data = {}
+ # self.path = os.path.join(home, '.labelImgSettings.pkl')
+ self.path = os.path.join(home, '.autoOCRSettings.pkl')
+
+ def __setitem__(self, key, value):
+ self.data[key] = value
+
+ def __getitem__(self, key):
+ return self.data[key]
+
+ def get(self, key, default=None):
+ if key in self.data:
+ return self.data[key]
+ return default
+
+ def save(self):
+ if self.path:
+ with open(self.path, 'wb') as f:
+ pickle.dump(self.data, f, pickle.HIGHEST_PROTOCOL)
+ return True
+ return False
+
+ def load(self):
+ try:
+ if os.path.exists(self.path):
+ with open(self.path, 'rb') as f:
+ self.data = pickle.load(f)
+ return True
+ except:
+ print('Loading setting failed')
+ return False
+
+ def reset(self):
+ if os.path.exists(self.path):
+ os.remove(self.path)
+ print('Remove setting pkl file ${0}'.format(self.path))
+ self.data = {}
+ self.path = None
diff --git a/PPOCRLabel/libs/shape.py b/PPOCRLabel/libs/shape.py
new file mode 100644
index 0000000000000000000000000000000000000000..2770bac1df9b62c3023ca10be0da1c2cec0a5002
--- /dev/null
+++ b/PPOCRLabel/libs/shape.py
@@ -0,0 +1,217 @@
+# Copyright (c) <2015-Present> Tzutalin
+# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba,
+# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+# associated documentation files (the "Software"), to deal in the Software without restriction, including without
+# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+# The above copyright notice and this permission notice shall be included in all copies or substantial portions of
+# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
+# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+
+try:
+ from PyQt5.QtGui import *
+ from PyQt5.QtCore import *
+except ImportError:
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+
+from libs.utils import distance
+import sys
+
+DEFAULT_LINE_COLOR = QColor(0, 255, 0, 128)
+DEFAULT_FILL_COLOR = QColor(255, 0, 0, 128)
+DEFAULT_SELECT_LINE_COLOR = QColor(255, 255, 255)
+DEFAULT_SELECT_FILL_COLOR = QColor(0, 128, 255, 155)
+DEFAULT_VERTEX_FILL_COLOR = QColor(0, 255, 0, 255)
+DEFAULT_HVERTEX_FILL_COLOR = QColor(255, 0, 0)
+MIN_Y_LABEL = 10
+
+
+class Shape(object):
+ P_SQUARE, P_ROUND = range(2)
+
+ MOVE_VERTEX, NEAR_VERTEX = range(2)
+
+ # The following class variables influence the drawing
+ # of _all_ shape objects.
+ line_color = DEFAULT_LINE_COLOR
+ fill_color = DEFAULT_FILL_COLOR
+ select_line_color = DEFAULT_SELECT_LINE_COLOR
+ select_fill_color = DEFAULT_SELECT_FILL_COLOR
+ vertex_fill_color = DEFAULT_VERTEX_FILL_COLOR
+ hvertex_fill_color = DEFAULT_HVERTEX_FILL_COLOR
+ point_type = P_ROUND
+ point_size = 8
+ scale = 1.0
+
+ def __init__(self, label=None, line_color=None, difficult=False, paintLabel=False):
+ self.label = label
+ self.points = []
+ self.fill = False
+ self.selected = False
+ self.difficult = difficult
+ self.paintLabel = paintLabel
+
+ self._highlightIndex = None
+ self._highlightMode = self.NEAR_VERTEX
+ self._highlightSettings = {
+ self.NEAR_VERTEX: (4, self.P_ROUND),
+ self.MOVE_VERTEX: (1.5, self.P_SQUARE),
+ }
+
+ self._closed = False
+
+ if line_color is not None:
+ # Override the class line_color attribute
+ # with an object attribute. Currently this
+ # is used for drawing the pending line a different color.
+ self.line_color = line_color
+
+ def close(self):
+ self._closed = True
+
+ def reachMaxPoints(self):
+ if len(self.points) >= 4:
+ return True
+ return False
+
+ def addPoint(self, point):
+ if not self.reachMaxPoints():
+ self.points.append(point)
+
+ def popPoint(self):
+ if self.points:
+ return self.points.pop()
+ return None
+
+ def isClosed(self):
+ return self._closed
+
+ def setOpen(self):
+ self._closed = False
+
+ def paint(self, painter):
+ if self.points:
+ color = self.select_line_color if self.selected else self.line_color
+ pen = QPen(color)
+ # Try using integer sizes for smoother drawing(?)
+ pen.setWidth(max(1, int(round(2.0 / self.scale))))
+ painter.setPen(pen)
+
+ line_path = QPainterPath()
+ vrtx_path = QPainterPath()
+
+ line_path.moveTo(self.points[0])
+ # Uncommenting the following line will draw 2 paths
+ # for the 1st vertex, and make it non-filled, which
+ # may be desirable.
+ #self.drawVertex(vrtx_path, 0)
+
+ for i, p in enumerate(self.points):
+ line_path.lineTo(p)
+ self.drawVertex(vrtx_path, i)
+ if self.isClosed():
+ line_path.lineTo(self.points[0])
+
+ painter.drawPath(line_path)
+ painter.drawPath(vrtx_path)
+ painter.fillPath(vrtx_path, self.vertex_fill_color)
+
+ # Draw text at the top-left
+ if self.paintLabel:
+ min_x = sys.maxsize
+ min_y = sys.maxsize
+ for point in self.points:
+ min_x = min(min_x, point.x())
+ min_y = min(min_y, point.y())
+ if min_x != sys.maxsize and min_y != sys.maxsize:
+ font = QFont()
+ font.setPointSize(8)
+ font.setBold(True)
+ painter.setFont(font)
+ if(self.label == None):
+ self.label = ""
+ if(min_y < MIN_Y_LABEL):
+ min_y += MIN_Y_LABEL
+ painter.drawText(min_x, min_y, self.label)
+
+ if self.fill:
+ color = self.select_fill_color if self.selected else self.fill_color
+ painter.fillPath(line_path, color)
+
+ def drawVertex(self, path, i):
+ d = self.point_size / self.scale
+ shape = self.point_type
+ point = self.points[i]
+ if i == self._highlightIndex:
+ size, shape = self._highlightSettings[self._highlightMode]
+ d *= size
+ if self._highlightIndex is not None:
+ self.vertex_fill_color = self.hvertex_fill_color
+ else:
+ self.vertex_fill_color = Shape.vertex_fill_color
+ if shape == self.P_SQUARE:
+ path.addRect(point.x() - d / 2, point.y() - d / 2, d, d)
+ elif shape == self.P_ROUND:
+ path.addEllipse(point, d / 2.0, d / 2.0)
+ else:
+ assert False, "unsupported vertex shape"
+
+ def nearestVertex(self, point, epsilon):
+ for i, p in enumerate(self.points):
+ if distance(p - point) <= epsilon:
+ return i
+ return None
+
+ def containsPoint(self, point):
+ return self.makePath().contains(point)
+
+ def makePath(self):
+ path = QPainterPath(self.points[0])
+ for p in self.points[1:]:
+ path.lineTo(p)
+ return path
+
+ def boundingRect(self):
+ return self.makePath().boundingRect()
+
+ def moveBy(self, offset):
+ self.points = [p + offset for p in self.points]
+
+ def moveVertexBy(self, i, offset):
+ self.points[i] = self.points[i] + offset
+
+ def highlightVertex(self, i, action):
+ self._highlightIndex = i
+ self._highlightMode = action
+
+ def highlightClear(self):
+ self._highlightIndex = None
+
+ def copy(self):
+ shape = Shape("%s" % self.label)
+ shape.points = [p for p in self.points]
+ shape.fill = self.fill
+ shape.selected = self.selected
+ shape._closed = self._closed
+ if self.line_color != Shape.line_color:
+ shape.line_color = self.line_color
+ if self.fill_color != Shape.fill_color:
+ shape.fill_color = self.fill_color
+ shape.difficult = self.difficult
+ return shape
+
+ def __len__(self):
+ return len(self.points)
+
+ def __getitem__(self, key):
+ return self.points[key]
+
+ def __setitem__(self, key, value):
+ self.points[key] = value
diff --git a/PPOCRLabel/libs/stringBundle.py b/PPOCRLabel/libs/stringBundle.py
new file mode 100644
index 0000000000000000000000000000000000000000..2417104425323357e3ef49feaabfcfa35fefaf00
--- /dev/null
+++ b/PPOCRLabel/libs/stringBundle.py
@@ -0,0 +1,86 @@
+# Copyright (c) <2015-Present> Tzutalin
+# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba,
+# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+# associated documentation files (the "Software"), to deal in the Software without restriction, including without
+# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+# The above copyright notice and this permission notice shall be included in all copies or substantial portions of
+# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
+# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+import re
+import os
+import sys
+import locale
+from libs.ustr import ustr
+
+try:
+ from PyQt5.QtCore import *
+except ImportError:
+ if sys.version_info.major >= 3:
+ import sip
+ sip.setapi('QVariant', 2)
+ from PyQt4.QtCore import *
+
+
+class StringBundle:
+
+ __create_key = object()
+
+ def __init__(self, create_key, localeStr):
+ assert(create_key == StringBundle.__create_key), "StringBundle must be created using StringBundle.getBundle"
+ self.idToMessage = {}
+ paths = self.__createLookupFallbackList(localeStr)
+ for path in paths:
+ self.__loadBundle(path)
+
+ @classmethod
+ def getBundle(cls, localeStr=None):
+ if localeStr is None:
+ try:
+ localeStr = locale.getlocale()[0] if locale.getlocale() and len(
+ locale.getlocale()) > 0 else os.getenv('LANG')
+ except:
+ print('Invalid locale')
+ localeStr = 'en'
+
+ return StringBundle(cls.__create_key, localeStr)
+
+ def getString(self, stringId):
+ assert(stringId in self.idToMessage), "Missing string id : " + stringId
+ return self.idToMessage[stringId]
+
+ def __createLookupFallbackList(self, localeStr):
+ resultPaths = []
+ basePath = ":/strings"
+ resultPaths.append(basePath)
+ if localeStr is not None:
+ # Don't follow standard BCP47. Simple fallback
+ tags = re.split('[^a-zA-Z]', localeStr)
+ for tag in tags:
+ lastPath = resultPaths[-1]
+ resultPaths.append(lastPath + '-' + tag)
+
+ return resultPaths
+
+ def __loadBundle(self, path):
+ PROP_SEPERATOR = '='
+ f = QFile(path)
+ if f.exists():
+ if f.open(QIODevice.ReadOnly | QFile.Text):
+ text = QTextStream(f)
+ text.setCodec("UTF-8")
+
+ while not text.atEnd():
+ line = ustr(text.readLine())
+ key_value = line.split(PROP_SEPERATOR)
+ key = key_value[0].strip()
+ value = PROP_SEPERATOR.join(key_value[1:]).strip().strip('"')
+ self.idToMessage[key] = value
+
+ f.close()
diff --git a/PPOCRLabel/libs/toolBar.py b/PPOCRLabel/libs/toolBar.py
new file mode 100644
index 0000000000000000000000000000000000000000..9a63929ae966ae02715f10868f9980230d064ccd
--- /dev/null
+++ b/PPOCRLabel/libs/toolBar.py
@@ -0,0 +1,51 @@
+# Copyright (c) <2015-Present> Tzutalin
+# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba,
+# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+# associated documentation files (the "Software"), to deal in the Software without restriction, including without
+# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+# The above copyright notice and this permission notice shall be included in all copies or substantial portions of
+# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
+# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+try:
+ from PyQt5.QtGui import *
+ from PyQt5.QtCore import *
+ from PyQt5.QtWidgets import *
+except ImportError:
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+
+
+class ToolBar(QToolBar):
+
+ def __init__(self, title):
+ super(ToolBar, self).__init__(title)
+ layout = self.layout()
+ m = (0, 0, 0, 0)
+ layout.setSpacing(0)
+ layout.setContentsMargins(*m)
+ self.setContentsMargins(*m)
+ self.setWindowFlags(self.windowFlags() | Qt.FramelessWindowHint)
+
+ def addAction(self, action):
+ if isinstance(action, QWidgetAction):
+ return super(ToolBar, self).addAction(action)
+ btn = ToolButton()
+ btn.setDefaultAction(action)
+ btn.setToolButtonStyle(self.toolButtonStyle())
+ self.addWidget(btn)
+
+
+class ToolButton(QToolButton):
+ """ToolBar companion class which ensures all buttons have the same size."""
+ minSize = (60, 60)
+
+ def minimumSizeHint(self):
+ ms = super(ToolButton, self).minimumSizeHint()
+ w1, h1 = ms.width(), ms.height()
+ w2, h2 = self.minSize
+ ToolButton.minSize = max(w1, w2), max(h1, h2)
+ return QSize(*ToolButton.minSize)
diff --git a/PPOCRLabel/libs/ustr.py b/PPOCRLabel/libs/ustr.py
new file mode 100644
index 0000000000000000000000000000000000000000..b35cf5d3ff707b11d658efd6e585bb9de74d27cb
--- /dev/null
+++ b/PPOCRLabel/libs/ustr.py
@@ -0,0 +1,29 @@
+# Copyright (c) <2015-Present> Tzutalin
+# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba,
+# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+# associated documentation files (the "Software"), to deal in the Software without restriction, including without
+# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+# The above copyright notice and this permission notice shall be included in all copies or substantial portions of
+# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
+# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+import sys
+from libs.constants import DEFAULT_ENCODING
+
+def ustr(x):
+ '''py2/py3 unicode helper'''
+
+ if sys.version_info < (3, 0, 0):
+ from PyQt4.QtCore import QString
+ if type(x) == str:
+ return x.decode(DEFAULT_ENCODING)
+ if type(x) == QString:
+ #https://blog.csdn.net/friendan/article/details/51088476
+ #https://blog.csdn.net/xxm524/article/details/74937308
+ return unicode(x.toUtf8(), DEFAULT_ENCODING, 'ignore')
+ return x
+ else:
+ return x
diff --git a/PPOCRLabel/libs/utils.py b/PPOCRLabel/libs/utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..3c2f316dca16bd754d34a46c484c335e7a866d95
--- /dev/null
+++ b/PPOCRLabel/libs/utils.py
@@ -0,0 +1,167 @@
+# Copyright (c) <2015-Present> Tzutalin
+# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba,
+# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+# associated documentation files (the "Software"), to deal in the Software without restriction, including without
+# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+# The above copyright notice and this permission notice shall be included in all copies or substantial portions of
+# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
+# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+from math import sqrt
+from libs.ustr import ustr
+import hashlib
+import re
+import sys
+import cv2
+import numpy as np
+
+try:
+ from PyQt5.QtGui import *
+ from PyQt5.QtCore import *
+ from PyQt5.QtWidgets import *
+except ImportError:
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+
+
+def newIcon(icon, iconSize=None):
+ if iconSize is not None:
+ return QIcon(QIcon(':/' + icon).pixmap(iconSize,iconSize))
+ else:
+ return QIcon(':/' + icon)
+
+
+def newButton(text, icon=None, slot=None):
+ b = QPushButton(text)
+ if icon is not None:
+ b.setIcon(newIcon(icon))
+ if slot is not None:
+ b.clicked.connect(slot)
+ return b
+
+
+def newAction(parent, text, slot=None, shortcut=None, icon=None,
+ tip=None, checkable=False, enabled=True, iconSize=None):
+ """Create a new action and assign callbacks, shortcuts, etc."""
+ a = QAction(text, parent)
+ if icon is not None:
+ if iconSize is not None:
+ a.setIcon(newIcon(icon, iconSize))
+ else:
+ a.setIcon(newIcon(icon))
+ if shortcut is not None:
+ if isinstance(shortcut, (list, tuple)):
+ a.setShortcuts(shortcut)
+ else:
+ a.setShortcut(shortcut)
+ if tip is not None:
+ a.setToolTip(tip)
+ a.setStatusTip(tip)
+ if slot is not None:
+ a.triggered.connect(slot)
+ if checkable:
+ a.setCheckable(True)
+ a.setEnabled(enabled)
+ return a
+
+
+def addActions(widget, actions):
+ for action in actions:
+ if action is None:
+ widget.addSeparator()
+ elif isinstance(action, QMenu):
+ widget.addMenu(action)
+ else:
+ widget.addAction(action)
+
+
+def labelValidator():
+ return QRegExpValidator(QRegExp(r'^[^ \t].+'), None)
+
+
+class struct(object):
+
+ def __init__(self, **kwargs):
+ self.__dict__.update(kwargs)
+
+
+def distance(p):
+ return sqrt(p.x() * p.x() + p.y() * p.y())
+
+
+def fmtShortcut(text):
+ mod, key = text.split('+', 1)
+ return '%s+%s' % (mod, key)
+
+
+def generateColorByText(text):
+ s = ustr(text)
+ hashCode = int(hashlib.sha256(s.encode('utf-8')).hexdigest(), 16)
+ r = int((hashCode / 255) % 255)
+ g = int((hashCode / 65025) % 255)
+ b = int((hashCode / 16581375) % 255)
+ return QColor(r, g, b, 100)
+
+def have_qstring():
+ '''p3/qt5 get rid of QString wrapper as py3 has native unicode str type'''
+ return not (sys.version_info.major >= 3 or QT_VERSION_STR.startswith('5.'))
+
+def util_qt_strlistclass():
+ return QStringList if have_qstring() else list
+
+def natural_sort(list, key=lambda s:s):
+ """
+ Sort the list into natural alphanumeric order.
+ """
+ def get_alphanum_key_func(key):
+ convert = lambda text: int(text) if text.isdigit() else text
+ return lambda s: [convert(c) for c in re.split('([0-9]+)', key(s))]
+ sort_key = get_alphanum_key_func(key)
+ list.sort(key=sort_key)
+
+
+def get_rotate_crop_image(img, points):
+
+ try:
+ img_crop_width = int(
+ max(
+ np.linalg.norm(points[0] - points[1]),
+ np.linalg.norm(points[2] - points[3])))
+ img_crop_height = int(
+ max(
+ np.linalg.norm(points[0] - points[3]),
+ np.linalg.norm(points[1] - points[2])))
+ pts_std = np.float32([[0, 0], [img_crop_width, 0],
+ [img_crop_width, img_crop_height],
+ [0, img_crop_height]])
+ M = cv2.getPerspectiveTransform(points, pts_std)
+ dst_img = cv2.warpPerspective(
+ img,
+ M, (img_crop_width, img_crop_height),
+ borderMode=cv2.BORDER_REPLICATE,
+ flags=cv2.INTER_CUBIC)
+ dst_img_height, dst_img_width = dst_img.shape[0:2]
+ if dst_img_height * 1.0 / dst_img_width >= 1.5:
+ dst_img = np.rot90(dst_img)
+ return dst_img
+ except Exception as e:
+ print(e)
+
+def steps():
+ msg = "1. 安装与运行:使用上述命令安装与运行程序。\n" \
+ "2. 打开文件夹:在菜单栏点击 “文件” - 打开目录 选择待标记图片的文件夹.\n"\
+ "3. 自动标注:点击 ”自动标注“,使用PPOCR超轻量模型对图片文件名前图片状态为 “X” 的图片进行自动标注。\n" \
+ "4. 手动标注:点击 “矩形标注”(推荐直接在英文模式下点击键盘中的 “W”),用户可对当前图片中模型未检出的部分进行手动" \
+ "绘制标记框。点击键盘P,则使用四点标注模式(或点击“编辑” - “四点标注”),用户依次点击4个点后,双击左键表示标注完成。\n" \
+ "5. 标记框绘制完成后,用户点击 “确认”,检测框会先被预分配一个 “待识别” 标签。\n" \
+ "6. 重新识别:将图片中的所有检测画绘制/调整完成后,点击 “重新识别”,PPOCR模型会对当前图片中的**所有检测框**重新识别。\n" \
+ "7. 内容更改:双击识别结果,对不准确的识别结果进行手动更改。\n" \
+ "8. 保存:点击 “保存”,图片状态切换为 “√”,跳转至下一张。\n" \
+ "9. 删除:点击 “删除图像”,图片将会被删除至回收站。\n" \
+ "10. 标注结果:关闭应用程序或切换文件路径后,手动保存过的标签将会被存放在所打开图片文件夹下的" \
+ "*Label.txt*中。在菜单栏点击 “PaddleOCR” - 保存识别结果后,会将此类图片的识别训练数据保存在*crop_img*文件夹下," \
+ "识别标签保存在*rec_gt.txt*中。\n"
+ return msg
\ No newline at end of file
diff --git a/PPOCRLabel/libs/yolo_io.py b/PPOCRLabel/libs/yolo_io.py
new file mode 100644
index 0000000000000000000000000000000000000000..216fba388cabec6705718771b80b549577bf4e78
--- /dev/null
+++ b/PPOCRLabel/libs/yolo_io.py
@@ -0,0 +1,146 @@
+#!/usr/bin/env python
+# -*- coding: utf8 -*-
+import sys
+import os
+from xml.etree import ElementTree
+from xml.etree.ElementTree import Element, SubElement
+from lxml import etree
+import codecs
+from libs.constants import DEFAULT_ENCODING
+
+TXT_EXT = '.txt'
+ENCODE_METHOD = DEFAULT_ENCODING
+
+class YOLOWriter:
+
+ def __init__(self, foldername, filename, imgSize, databaseSrc='Unknown', localImgPath=None):
+ self.foldername = foldername
+ self.filename = filename
+ self.databaseSrc = databaseSrc
+ self.imgSize = imgSize
+ self.boxlist = []
+ self.localImgPath = localImgPath
+ self.verified = False
+
+ def addBndBox(self, xmin, ymin, xmax, ymax, name, difficult):
+ bndbox = {'xmin': xmin, 'ymin': ymin, 'xmax': xmax, 'ymax': ymax}
+ bndbox['name'] = name
+ bndbox['difficult'] = difficult
+ self.boxlist.append(bndbox)
+
+ def BndBox2YoloLine(self, box, classList=[]):
+ xmin = box['xmin']
+ xmax = box['xmax']
+ ymin = box['ymin']
+ ymax = box['ymax']
+
+ xcen = float((xmin + xmax)) / 2 / self.imgSize[1]
+ ycen = float((ymin + ymax)) / 2 / self.imgSize[0]
+
+ w = float((xmax - xmin)) / self.imgSize[1]
+ h = float((ymax - ymin)) / self.imgSize[0]
+
+ # PR387
+ boxName = box['name']
+ if boxName not in classList:
+ classList.append(boxName)
+
+ classIndex = classList.index(boxName)
+
+ return classIndex, xcen, ycen, w, h
+
+ def save(self, classList=[], targetFile=None):
+
+ out_file = None #Update yolo .txt
+ out_class_file = None #Update class list .txt
+
+ if targetFile is None:
+ out_file = open(
+ self.filename + TXT_EXT, 'w', encoding=ENCODE_METHOD)
+ classesFile = os.path.join(os.path.dirname(os.path.abspath(self.filename)), "classes.txt")
+ out_class_file = open(classesFile, 'w')
+
+ else:
+ out_file = codecs.open(targetFile, 'w', encoding=ENCODE_METHOD)
+ classesFile = os.path.join(os.path.dirname(os.path.abspath(targetFile)), "classes.txt")
+ out_class_file = open(classesFile, 'w')
+
+
+ for box in self.boxlist:
+ classIndex, xcen, ycen, w, h = self.BndBox2YoloLine(box, classList)
+ # print (classIndex, xcen, ycen, w, h)
+ out_file.write("%d %.6f %.6f %.6f %.6f\n" % (classIndex, xcen, ycen, w, h))
+
+ # print (classList)
+ # print (out_class_file)
+ for c in classList:
+ out_class_file.write(c+'\n')
+
+ out_class_file.close()
+ out_file.close()
+
+
+
+class YoloReader:
+
+ def __init__(self, filepath, image, classListPath=None):
+ # shapes type:
+ # [labbel, [(x1,y1), (x2,y2), (x3,y3), (x4,y4)], color, color, difficult]
+ self.shapes = []
+ self.filepath = filepath
+
+ if classListPath is None:
+ dir_path = os.path.dirname(os.path.realpath(self.filepath))
+ self.classListPath = os.path.join(dir_path, "classes.txt")
+ else:
+ self.classListPath = classListPath
+
+ # print (filepath, self.classListPath)
+
+ classesFile = open(self.classListPath, 'r')
+ self.classes = classesFile.read().strip('\n').split('\n')
+
+ # print (self.classes)
+
+ imgSize = [image.height(), image.width(),
+ 1 if image.isGrayscale() else 3]
+
+ self.imgSize = imgSize
+
+ self.verified = False
+ # try:
+ self.parseYoloFormat()
+ # except:
+ # pass
+
+ def getShapes(self):
+ return self.shapes
+
+ def addShape(self, label, xmin, ymin, xmax, ymax, difficult):
+
+ points = [(xmin, ymin), (xmax, ymin), (xmax, ymax), (xmin, ymax)]
+ self.shapes.append((label, points, None, None, difficult))
+
+ def yoloLine2Shape(self, classIndex, xcen, ycen, w, h):
+ label = self.classes[int(classIndex)]
+
+ xmin = max(float(xcen) - float(w) / 2, 0)
+ xmax = min(float(xcen) + float(w) / 2, 1)
+ ymin = max(float(ycen) - float(h) / 2, 0)
+ ymax = min(float(ycen) + float(h) / 2, 1)
+
+ xmin = int(self.imgSize[1] * xmin)
+ xmax = int(self.imgSize[1] * xmax)
+ ymin = int(self.imgSize[0] * ymin)
+ ymax = int(self.imgSize[0] * ymax)
+
+ return label, xmin, ymin, xmax, ymax
+
+ def parseYoloFormat(self):
+ bndBoxFile = open(self.filepath, 'r')
+ for bndBox in bndBoxFile:
+ classIndex, xcen, ycen, w, h = bndBox.strip().split(' ')
+ label, xmin, ymin, xmax, ymax = self.yoloLine2Shape(classIndex, xcen, ycen, w, h)
+
+ # Caveat: difficult flag is discarded when saved as yolo format.
+ self.addShape(label, xmin, ymin, xmax, ymax, False)
diff --git a/PPOCRLabel/libs/zoomWidget.py b/PPOCRLabel/libs/zoomWidget.py
new file mode 100644
index 0000000000000000000000000000000000000000..4512d2ab4f582399798307d86fbedee1221cfd46
--- /dev/null
+++ b/PPOCRLabel/libs/zoomWidget.py
@@ -0,0 +1,38 @@
+# Copyright (c) <2015-Present> Tzutalin
+# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba,
+# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+# associated documentation files (the "Software"), to deal in the Software without restriction, including without
+# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+# The above copyright notice and this permission notice shall be included in all copies or substantial portions of
+# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
+# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+try:
+ from PyQt5.QtGui import *
+ from PyQt5.QtCore import *
+ from PyQt5.QtWidgets import *
+except ImportError:
+ from PyQt4.QtGui import *
+ from PyQt4.QtCore import *
+
+
+class ZoomWidget(QSpinBox):
+
+ def __init__(self, value=100):
+ super(ZoomWidget, self).__init__()
+ self.setButtonSymbols(QAbstractSpinBox.NoButtons)
+ self.setRange(1, 500)
+ self.setSuffix(' %')
+ self.setValue(value)
+ self.setToolTip(u'Zoom Level')
+ self.setStatusTip(self.toolTip())
+ self.setAlignment(Qt.AlignCenter)
+
+ def minimumSizeHint(self):
+ height = super(ZoomWidget, self).minimumSizeHint().height()
+ fm = QFontMetrics(self.font())
+ width = fm.width(str(self.maximum()))
+ return QSize(width, height)
diff --git a/PPOCRLabel/requirements/requirements-linux-python3.txt b/PPOCRLabel/requirements/requirements-linux-python3.txt
new file mode 100644
index 0000000000000000000000000000000000000000..787a7fda11ade96de811381d158f2742298b0632
--- /dev/null
+++ b/PPOCRLabel/requirements/requirements-linux-python3.txt
@@ -0,0 +1,2 @@
+pyqt5==5.10.1
+lxml==4.2.4
diff --git a/PPOCRLabel/resources.qrc b/PPOCRLabel/resources.qrc
new file mode 100644
index 0000000000000000000000000000000000000000..3ec50bce36369993a4b12f8886eea366c35b5733
--- /dev/null
+++ b/PPOCRLabel/resources.qrc
@@ -0,0 +1,40 @@
+
+
+
+resources/icons/help.png
+resources/icons/app.png
+resources/icons/Auto.png
+resources/icons/reRec.png
+resources/icons/expert2.png
+resources/icons/done.png
+resources/icons/file.png
+resources/icons/labels.png
+resources/icons/objects.png
+resources/icons/close.png
+resources/icons/fit-width.png
+resources/icons/fit-window.png
+resources/icons/undo.png
+resources/icons/eye.png
+resources/icons/quit.png
+resources/icons/copy.png
+resources/icons/edit.png
+resources/icons/open.png
+resources/icons/save.png
+resources/icons/format_voc.png
+resources/icons/format_yolo.png
+resources/icons/save-as.png
+resources/icons/color.png
+resources/icons/color_line.png
+resources/icons/zoom.png
+resources/icons/zoom-in.png
+resources/icons/zoom-out.png
+resources/icons/cancel.png
+resources/icons/next.png
+resources/icons/prev.png
+resources/icons/resetall.png
+resources/icons/verify.png
+resources/strings/strings.properties
+resources/strings/strings-zh-TW.properties
+resources/strings/strings-zh-CN.properties
+
+
diff --git a/PPOCRLabel/resources/icons/Auto.png b/PPOCRLabel/resources/icons/Auto.png
new file mode 100644
index 0000000000000000000000000000000000000000..267f2e1d9dc3a44431b27679d8654063f77f20dc
Binary files /dev/null and b/PPOCRLabel/resources/icons/Auto.png differ
diff --git a/PPOCRLabel/resources/icons/app.icns b/PPOCRLabel/resources/icons/app.icns
new file mode 100644
index 0000000000000000000000000000000000000000..9409991b4c47986568db5fa594f4522a6130976c
Binary files /dev/null and b/PPOCRLabel/resources/icons/app.icns differ
diff --git a/PPOCRLabel/resources/icons/app.png b/PPOCRLabel/resources/icons/app.png
new file mode 100644
index 0000000000000000000000000000000000000000..267f2e1d9dc3a44431b27679d8654063f77f20dc
Binary files /dev/null and b/PPOCRLabel/resources/icons/app.png differ
diff --git a/PPOCRLabel/resources/icons/app.svg b/PPOCRLabel/resources/icons/app.svg
new file mode 100644
index 0000000000000000000000000000000000000000..bf4a252c61df76d8563beb309820265a6c67922d
--- /dev/null
+++ b/PPOCRLabel/resources/icons/app.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/PPOCRLabel/resources/icons/cancel.png b/PPOCRLabel/resources/icons/cancel.png
new file mode 100644
index 0000000000000000000000000000000000000000..8fbfab89d036a18e8b38c2156ca2636baf78d16f
Binary files /dev/null and b/PPOCRLabel/resources/icons/cancel.png differ
diff --git a/PPOCRLabel/resources/icons/close.png b/PPOCRLabel/resources/icons/close.png
new file mode 100644
index 0000000000000000000000000000000000000000..aa52a8d67a2567a142c89ed68843291ba43ff480
Binary files /dev/null and b/PPOCRLabel/resources/icons/close.png differ
diff --git a/PPOCRLabel/resources/icons/color.png b/PPOCRLabel/resources/icons/color.png
new file mode 100644
index 0000000000000000000000000000000000000000..1a1e1ad03b799acb31b1ace1c68c48ca0635b2ef
Binary files /dev/null and b/PPOCRLabel/resources/icons/color.png differ
diff --git a/PPOCRLabel/resources/icons/color_line.png b/PPOCRLabel/resources/icons/color_line.png
new file mode 100644
index 0000000000000000000000000000000000000000..6ef10bfc47505002aa3d06f67a4b6a6c6434f72f
Binary files /dev/null and b/PPOCRLabel/resources/icons/color_line.png differ
diff --git a/PPOCRLabel/resources/icons/copy.png b/PPOCRLabel/resources/icons/copy.png
new file mode 100644
index 0000000000000000000000000000000000000000..a4c9bddc74e0e365fc448b8e61d760b1d179537f
Binary files /dev/null and b/PPOCRLabel/resources/icons/copy.png differ
diff --git a/PPOCRLabel/resources/icons/delete.png b/PPOCRLabel/resources/icons/delete.png
new file mode 100644
index 0000000000000000000000000000000000000000..a1a4074f08042ab12ef344a8d79adbd6c44fd2f8
Binary files /dev/null and b/PPOCRLabel/resources/icons/delete.png differ
diff --git a/PPOCRLabel/resources/icons/done.png b/PPOCRLabel/resources/icons/done.png
new file mode 100644
index 0000000000000000000000000000000000000000..d8a03f4f479f3496e72cab5a60c61c4bf1217582
Binary files /dev/null and b/PPOCRLabel/resources/icons/done.png differ
diff --git a/PPOCRLabel/resources/icons/done.svg b/PPOCRLabel/resources/icons/done.svg
new file mode 100644
index 0000000000000000000000000000000000000000..aa8fd28843e6281cade711282d748a3cd4e61a6c
--- /dev/null
+++ b/PPOCRLabel/resources/icons/done.svg
@@ -0,0 +1,400 @@
+
+
+
+
diff --git a/PPOCRLabel/resources/icons/edit.png b/PPOCRLabel/resources/icons/edit.png
new file mode 100644
index 0000000000000000000000000000000000000000..36775390f1e8e89e7007e4978a003751acab855d
Binary files /dev/null and b/PPOCRLabel/resources/icons/edit.png differ
diff --git a/PPOCRLabel/resources/icons/expert1.png b/PPOCRLabel/resources/icons/expert1.png
new file mode 100644
index 0000000000000000000000000000000000000000..281364540cb28396ff70aa411ef806842695d18e
Binary files /dev/null and b/PPOCRLabel/resources/icons/expert1.png differ
diff --git a/PPOCRLabel/resources/icons/expert2.png b/PPOCRLabel/resources/icons/expert2.png
new file mode 100644
index 0000000000000000000000000000000000000000..7c470b6a564bcfbe423e6ff0aa4a055485cf5d0c
Binary files /dev/null and b/PPOCRLabel/resources/icons/expert2.png differ
diff --git a/PPOCRLabel/resources/icons/eye.png b/PPOCRLabel/resources/icons/eye.png
new file mode 100644
index 0000000000000000000000000000000000000000..c4b65505acc1538d6a2fcc79604702f563fa16b8
Binary files /dev/null and b/PPOCRLabel/resources/icons/eye.png differ
diff --git a/PPOCRLabel/resources/icons/feBlend-icon.png b/PPOCRLabel/resources/icons/feBlend-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..1c1aca8497817ec07f2ab55216df32cb74d138af
Binary files /dev/null and b/PPOCRLabel/resources/icons/feBlend-icon.png differ
diff --git a/PPOCRLabel/resources/icons/file.png b/PPOCRLabel/resources/icons/file.png
new file mode 100644
index 0000000000000000000000000000000000000000..1ec0515a25dc982de92c4f84105c32c5b8e38d01
Binary files /dev/null and b/PPOCRLabel/resources/icons/file.png differ
diff --git a/PPOCRLabel/resources/icons/fit-width.png b/PPOCRLabel/resources/icons/fit-width.png
new file mode 100644
index 0000000000000000000000000000000000000000..0a5490748b44ed1ab49cfc355bf853cd9837e492
Binary files /dev/null and b/PPOCRLabel/resources/icons/fit-width.png differ
diff --git a/PPOCRLabel/resources/icons/fit-window.png b/PPOCRLabel/resources/icons/fit-window.png
new file mode 100644
index 0000000000000000000000000000000000000000..585e970773e3fcd327874e6b1c95f194e25db04b
Binary files /dev/null and b/PPOCRLabel/resources/icons/fit-window.png differ
diff --git a/PPOCRLabel/resources/icons/fit.png b/PPOCRLabel/resources/icons/fit.png
new file mode 100644
index 0000000000000000000000000000000000000000..9e0e817be2ac2e29799aeb5f0752224c1996e73a
Binary files /dev/null and b/PPOCRLabel/resources/icons/fit.png differ
diff --git a/PPOCRLabel/resources/icons/format_createml.png b/PPOCRLabel/resources/icons/format_createml.png
new file mode 100644
index 0000000000000000000000000000000000000000..c08af9426e7888aa05f57c58c6f680442b80339b
Binary files /dev/null and b/PPOCRLabel/resources/icons/format_createml.png differ
diff --git a/PPOCRLabel/resources/icons/format_voc.png b/PPOCRLabel/resources/icons/format_voc.png
new file mode 100644
index 0000000000000000000000000000000000000000..cb15e43974b065d73b7776b8e11559b2a0baf995
Binary files /dev/null and b/PPOCRLabel/resources/icons/format_voc.png differ
diff --git a/PPOCRLabel/resources/icons/format_yolo.png b/PPOCRLabel/resources/icons/format_yolo.png
new file mode 100644
index 0000000000000000000000000000000000000000..ca9acc71c97f8cded4b8111b87f09b29e6276e3b
Binary files /dev/null and b/PPOCRLabel/resources/icons/format_yolo.png differ
diff --git a/PPOCRLabel/resources/icons/help.png b/PPOCRLabel/resources/icons/help.png
new file mode 100644
index 0000000000000000000000000000000000000000..93bf094a114d46d3f2c0236badc2914c04fd2e89
Binary files /dev/null and b/PPOCRLabel/resources/icons/help.png differ
diff --git a/PPOCRLabel/resources/icons/labels.png b/PPOCRLabel/resources/icons/labels.png
new file mode 100644
index 0000000000000000000000000000000000000000..c82ffb7b6fa64c44f97559c8ac954eae1e73da85
Binary files /dev/null and b/PPOCRLabel/resources/icons/labels.png differ
diff --git a/PPOCRLabel/resources/icons/labels.svg b/PPOCRLabel/resources/icons/labels.svg
new file mode 100644
index 0000000000000000000000000000000000000000..652cef3f4676512d174665884059e031e75d0fc6
--- /dev/null
+++ b/PPOCRLabel/resources/icons/labels.svg
@@ -0,0 +1,819 @@
+
+
+
+
\ No newline at end of file
diff --git a/PPOCRLabel/resources/icons/new.png b/PPOCRLabel/resources/icons/new.png
new file mode 100644
index 0000000000000000000000000000000000000000..dd795cfffc5c1ce273b3afedb5ed01da3fc5668c
Binary files /dev/null and b/PPOCRLabel/resources/icons/new.png differ
diff --git a/PPOCRLabel/resources/icons/next.png b/PPOCRLabel/resources/icons/next.png
new file mode 100644
index 0000000000000000000000000000000000000000..163a343cb44010ea43ae8216396e8db82080ce04
Binary files /dev/null and b/PPOCRLabel/resources/icons/next.png differ
diff --git a/PPOCRLabel/resources/icons/objects.png b/PPOCRLabel/resources/icons/objects.png
new file mode 100644
index 0000000000000000000000000000000000000000..593bb6d8a63ad8dbde0ec664d3fbae9e2ceb18cb
Binary files /dev/null and b/PPOCRLabel/resources/icons/objects.png differ
diff --git a/PPOCRLabel/resources/icons/open.png b/PPOCRLabel/resources/icons/open.png
new file mode 100644
index 0000000000000000000000000000000000000000..45fa2883a71fcb891f1ef7c0c217d71eeae284bc
Binary files /dev/null and b/PPOCRLabel/resources/icons/open.png differ
diff --git a/PPOCRLabel/resources/icons/open.svg b/PPOCRLabel/resources/icons/open.svg
new file mode 100644
index 0000000000000000000000000000000000000000..48e7a34376746d3a18326cdaf80889eea61a9e18
--- /dev/null
+++ b/PPOCRLabel/resources/icons/open.svg
@@ -0,0 +1,577 @@
+
+
+
\ No newline at end of file
diff --git a/PPOCRLabel/resources/icons/prev.png b/PPOCRLabel/resources/icons/prev.png
new file mode 100644
index 0000000000000000000000000000000000000000..31b454519354679289cd809d42e052c024908e6c
Binary files /dev/null and b/PPOCRLabel/resources/icons/prev.png differ
diff --git a/PPOCRLabel/resources/icons/quit.png b/PPOCRLabel/resources/icons/quit.png
new file mode 100644
index 0000000000000000000000000000000000000000..7445887949c3b817d3fd5a223747264e7a5d2ac9
Binary files /dev/null and b/PPOCRLabel/resources/icons/quit.png differ
diff --git a/PPOCRLabel/resources/icons/reRec.png b/PPOCRLabel/resources/icons/reRec.png
new file mode 100644
index 0000000000000000000000000000000000000000..e3d0d5c0c021735b0ae8f6ff034c107e045f2855
Binary files /dev/null and b/PPOCRLabel/resources/icons/reRec.png differ
diff --git a/PPOCRLabel/resources/icons/resetall.png b/PPOCRLabel/resources/icons/resetall.png
new file mode 100644
index 0000000000000000000000000000000000000000..acc12c332879ad5eeeb54c7b8a3d5df8244123ec
Binary files /dev/null and b/PPOCRLabel/resources/icons/resetall.png differ
diff --git a/PPOCRLabel/resources/icons/save-as.png b/PPOCRLabel/resources/icons/save-as.png
new file mode 100644
index 0000000000000000000000000000000000000000..1b5d900064c79dac15ee24d0a33b22f3245aa222
Binary files /dev/null and b/PPOCRLabel/resources/icons/save-as.png differ
diff --git a/PPOCRLabel/resources/icons/save-as.svg b/PPOCRLabel/resources/icons/save-as.svg
new file mode 100644
index 0000000000000000000000000000000000000000..c8441a1f5491f8f0fd0ca6f54bd31c04be65d514
--- /dev/null
+++ b/PPOCRLabel/resources/icons/save-as.svg
@@ -0,0 +1,1358 @@
+
+
+
+
diff --git a/PPOCRLabel/resources/icons/save.png b/PPOCRLabel/resources/icons/save.png
new file mode 100644
index 0000000000000000000000000000000000000000..daba865fafd22fa18e7c0488eb699b79d3554170
Binary files /dev/null and b/PPOCRLabel/resources/icons/save.png differ
diff --git a/PPOCRLabel/resources/icons/save.svg b/PPOCRLabel/resources/icons/save.svg
new file mode 100644
index 0000000000000000000000000000000000000000..5533e489925c35102834a23074cad3c36ad1c8a5
--- /dev/null
+++ b/PPOCRLabel/resources/icons/save.svg
@@ -0,0 +1,679 @@
+
+
+
+
diff --git a/PPOCRLabel/resources/icons/undo-cross.png b/PPOCRLabel/resources/icons/undo-cross.png
new file mode 100644
index 0000000000000000000000000000000000000000..7d57dcbd0f63427cd0de28a6108660e366b984e5
Binary files /dev/null and b/PPOCRLabel/resources/icons/undo-cross.png differ
diff --git a/PPOCRLabel/resources/icons/undo.png b/PPOCRLabel/resources/icons/undo.png
new file mode 100644
index 0000000000000000000000000000000000000000..b2ac62bc03f106a5c6bac3a43d51e45c9a1402f4
Binary files /dev/null and b/PPOCRLabel/resources/icons/undo.png differ
diff --git a/PPOCRLabel/resources/icons/verify.png b/PPOCRLabel/resources/icons/verify.png
new file mode 100644
index 0000000000000000000000000000000000000000..3f4a3b5fd827e4211c8f471aa04834301c71f141
Binary files /dev/null and b/PPOCRLabel/resources/icons/verify.png differ
diff --git a/PPOCRLabel/resources/icons/zoom-in.png b/PPOCRLabel/resources/icons/zoom-in.png
new file mode 100644
index 0000000000000000000000000000000000000000..1ac4864d4a0c95a022e19ef38b4544711de39f1e
Binary files /dev/null and b/PPOCRLabel/resources/icons/zoom-in.png differ
diff --git a/PPOCRLabel/resources/icons/zoom-out.png b/PPOCRLabel/resources/icons/zoom-out.png
new file mode 100644
index 0000000000000000000000000000000000000000..d67a87de533e307cb0e95ab2623259d98eb1adae
Binary files /dev/null and b/PPOCRLabel/resources/icons/zoom-out.png differ
diff --git a/PPOCRLabel/resources/icons/zoom.png b/PPOCRLabel/resources/icons/zoom.png
new file mode 100644
index 0000000000000000000000000000000000000000..8265f27840a14b4b275086df67af01c73a3a8420
Binary files /dev/null and b/PPOCRLabel/resources/icons/zoom.png differ
diff --git a/PPOCRLabel/resources/strings/strings-zh-CN.properties b/PPOCRLabel/resources/strings/strings-zh-CN.properties
new file mode 100644
index 0000000000000000000000000000000000000000..e462fbf1582f6617452e8b896b404197df5d53cb
--- /dev/null
+++ b/PPOCRLabel/resources/strings/strings-zh-CN.properties
@@ -0,0 +1,90 @@
+saveAsDetail=將标签保存到其他文件
+changeSaveDir=改变存放目录
+openFile=打开文件
+shapeLineColorDetail=更改线条颜色
+resetAll=重置界面与保存地址
+crtBox=矩形标注
+crtBoxDetail=创建一个新的区块
+dupBoxDetail=复制区块
+verifyImg=验证图像
+zoominDetail=放大
+verifyImgDetail=验证图像
+saveDetail=保存标签文件
+openFileDetail=打开图像文件
+fitWidthDetail=调整宽度适应到窗口宽度
+tutorial=PaddleOCR地址
+editLabel=编辑标签
+openAnnotationDetail=打开标签文件
+quit=退出
+shapeFillColorDetail=更改填充颜色
+closeCurDetail=关闭当前文件
+closeCur=关闭文件
+deleteImg=删除图像
+deleteImgDetail=删除当前图像
+fitWin=调整到窗口大小
+delBox=删除选择的区块
+boxLineColorDetail=选择线框颜色
+originalsize=原始大小
+resetAllDetail=重置所有设定
+zoomoutDetail=放大画面
+save=保存
+saveAs=另存为
+fitWinDetail=缩放到当前窗口大小
+openDir=打开目录
+copyPrevBounding=复制当前图像中的上一个边界框
+showHide=显示/隐藏标签
+changeSaveFormat=更改存储格式
+shapeFillColor=填充颜色
+quitApp=退出程序
+dupBox=复制区块
+delBoxDetail=删除区块
+zoomin=放大画面
+info=信息
+openAnnotation=开启标签
+prevImgDetail=上一个图像
+fitWidth=缩放到跟当前画面一样宽
+zoomout=缩小画面
+changeSavedAnnotationDir=更改保存标签文件的预设目录
+nextImgDetail=下一个图像
+originalsizeDetail=放大到原始大小
+prevImg=上一张
+tutorialDetail=显示示范内容
+shapeLineColor=形状线条颜色
+boxLineColor=区块线条颜色
+editLabelDetail=修改当前所选的区块颜色
+nextImg=下一张
+useDefaultLabel=使用预设标签
+useDifficult=有难度的
+boxLabelText=区块的标签
+labels=标签
+autoSaveMode=自动保存模式
+singleClsMode=单一类别模式
+displayLabel=显示类别
+fileList=文件列表
+files=文件
+advancedMode=专家模式
+advancedModeDetail=切换到专家模式
+showAllBoxDetail=显示所有区块
+hideAllBoxDetail=隐藏所有区块
+annoPanel=标注面板
+anno=标注
+addNewBbox=新框
+reLabel=重标注
+choosemodel=选择模型
+tipchoosemodel=选择OCR模型
+ImageResize=图片缩放
+IR=图片缩放
+autoRecognition=自动标注
+reRecognition=重新识别
+mfile=文件
+medit=编辑
+mview=视图
+mhelp=帮助
+iconList=缩略图
+detectionBoxposition=检测框位置
+recognitionResult=识别结果
+creatPolygon=四点标注
+drawSquares=正方形标注
+saveRec=保存识别结果
+tempLabel=待识别
+steps=操作步骤
\ No newline at end of file
diff --git a/PPOCRLabel/resources/strings/strings-zh-TW.properties b/PPOCRLabel/resources/strings/strings-zh-TW.properties
new file mode 100644
index 0000000000000000000000000000000000000000..c14eeb9b22b25adfd6a163a520f29410834e3a4d
--- /dev/null
+++ b/PPOCRLabel/resources/strings/strings-zh-TW.properties
@@ -0,0 +1,70 @@
+saveAsDetail=將標籤保存到其他文件
+changeSaveDir=改變存放目錄
+openFile=開啟檔案
+shapeLineColorDetail=更改線條顏色
+resetAll=重置
+crtBox=創建區塊
+crtBoxDetail=畫一個區塊
+dupBoxDetail=複製區塊
+verifyImg=驗證圖像
+zoominDetail=放大
+verifyImgDetail=驗證圖像
+saveDetail=將標籤存到
+openFileDetail=打開圖像
+fitWidthDetail=調整到窗口寬度
+tutorial=YouTube教學
+editLabel=編輯標籤
+openAnnotationDetail=打開標籤文件
+quit=結束
+shapeFillColorDetail=更改填充顏色
+closeCurDetail=關閉目前檔案
+closeCur=關閉
+deleteImg=刪除圖像
+deleteImgDetail=刪除目前圖像
+fitWin=調整到跟窗口一樣大小
+delBox=刪除選取區塊
+boxLineColorDetail=選擇框線顏色
+originalsize=原始大小
+resetAllDetail=重設所有設定
+zoomoutDetail=畫面放大
+save=儲存
+saveAs=另存為
+fitWinDetail=縮放到窗口一樣
+openDir=開啟目錄
+copyPrevBounding=複製當前圖像中的上一個邊界框
+showHide=顯示/隱藏標籤
+changeSaveFormat=更改儲存格式
+shapeFillColor=填充顏色
+quitApp=離開本程式
+dupBox=複製區塊
+delBoxDetail=刪除區塊
+zoomin=放大畫面
+info=資訊
+openAnnotation=開啟標籤
+prevImgDetail=上一個圖像
+fitWidth=縮放到跟畫面一樣寬
+zoomout=縮小畫面
+changeSavedAnnotationDir=更改預設標籤存的目錄
+nextImgDetail=下一個圖像
+originalsizeDetail=放大到原始大小
+prevImg=上一個圖像
+tutorialDetail=顯示示範內容
+shapeLineColor=形狀線條顏色
+boxLineColor=日期分隔線顏色
+editLabelDetail=修改所選區塊的標籤
+nextImg=下一張圖片
+useDefaultLabel=使用預設標籤
+useDifficult=有難度的
+boxLabelText=區塊的標籤
+labels=標籤
+autoSaveMode=自動儲存模式
+singleClsMode=單一類別模式
+displayLabel=顯示類別
+fileList=檔案清單
+files=檔案
+iconList=XX
+icon=XX
+advancedMode=進階模式
+advancedModeDetail=切到進階模式
+showAllBoxDetail=顯示所有區塊
+hideAllBoxDetail=隱藏所有區塊
diff --git a/PPOCRLabel/resources/strings/strings.properties b/PPOCRLabel/resources/strings/strings.properties
new file mode 100644
index 0000000000000000000000000000000000000000..c1f505153794f385adc0e4c7a63069baff5934b3
--- /dev/null
+++ b/PPOCRLabel/resources/strings/strings.properties
@@ -0,0 +1,90 @@
+openFile=Open
+openFileDetail=Open image or label file
+quit=Quit
+quitApp=Quit application
+openDir=Open Dir
+copyPrevBounding=Copy previous Bounding Boxes in the current image
+changeSavedAnnotationDir=Change default saved Annotation dir
+openAnnotation=Open Annotation
+openAnnotationDetail=Open an annotation file
+changeSaveDir=Change Save Dir
+nextImg=Next Image
+nextImgDetail=Open the next Image
+prevImg=Prev Image
+prevImgDetail=Open the previous Image
+verifyImg=Verify Image
+verifyImgDetail=Verify Image
+save=Save
+saveDetail=Save the labels to a file
+changeSaveFormat=Change save format
+saveAs=Save As
+saveAsDetail=Save the labels to a different file
+closeCur=Close
+closeCurDetail=Close the current file
+deleteImg=Delete current image
+deleteImgDetail=Delete the current image
+resetAll=Reset Interface and Save Dir
+resetAllDetail=Reset All
+boxLineColor=Box Line Color
+boxLineColorDetail=Choose Box line color
+crtBox=Create RectBox
+crtBoxDetail=Draw a new box
+delBox=Delete RectBox
+delBoxDetail=Remove the box
+dupBox=Duplicate RectBox
+dupBoxDetail=Create a duplicate of the selected box
+tutorial=PaddleOCR url
+tutorialDetail=Show demo
+info=Information
+zoomin=Zoom In
+zoominDetail=Increase zoom level
+zoomout=Zoom Out
+zoomoutDetail=Decrease zoom level
+originalsize=Original size
+originalsizeDetail=Zoom to original size
+fitWin=Fit Window
+fitWinDetail=Zoom follows window size
+fitWidth=Fit Width
+fitWidthDetail=Zoom follows window width
+editLabel=Edit Label
+editLabelDetail=Modify the label of the selected Box
+shapeLineColor=Shape Line Color
+shapeLineColorDetail=Change the line color for this specific shape
+shapeFillColor=Shape Fill Color
+shapeFillColorDetail=Change the fill color for this specific shape
+showHide=Show/Hide Label Panel
+useDefaultLabel=Use default label
+useDifficult=Difficult
+boxLabelText=Box Labels
+labels=Labels
+autoSaveMode=Auto Save mode
+singleClsMode=Single Class Mode
+displayLabel=Display Labels
+fileList=File List
+files=Files
+advancedMode=Advanced Mode
+advancedModeDetail=Swtich to advanced mode
+showAllBoxDetail=Show all bounding boxes
+hideAllBoxDetail=Hide all bounding boxes
+annoPanel=anno Panel
+anno=anno
+addNewBbox=new bbox
+reLabel=reLabel
+choosemodel=Choose OCR model
+tipchoosemodel=Choose OCR model from dir
+ImageResize=Image Resize
+IR=Image Resize
+autoRecognition=Auto Recognition
+reRecognition=Re-recognition
+mfile=file
+medit=eidt
+mview=view
+mhelp=help
+iconList=Icon List
+detectionBoxposition=Detection box position
+recognitionResult=Recognition result
+creatPolygon=Create Quadrilateral
+drawSquares=Draw Squares
+saveRec=Save Recognition Result
+tempLabel=TEMPORARY
+setps=Steps
\ No newline at end of file
diff --git a/PPOCRLabel/setup.cfg b/PPOCRLabel/setup.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..3b273b63db2b4485f8a0c33df53004f0d960b87b
--- /dev/null
+++ b/PPOCRLabel/setup.cfg
@@ -0,0 +1,8 @@
+[bumpversion]
+commit = True
+tag = True
+
+[bumpversion:file:setup.py]
+
+[bdist_wheel]
+universal = 1
diff --git a/PPOCRLabel/setup.py b/PPOCRLabel/setup.py
new file mode 100644
index 0000000000000000000000000000000000000000..008514fd7777713eb76f900f5ea15a4366517dd8
--- /dev/null
+++ b/PPOCRLabel/setup.py
@@ -0,0 +1,139 @@
+# Copyright (c) <2015-Present> Tzutalin
+# Copyright (C) 2013 MIT, Computer Science and Artificial Intelligence Laboratory. Bryan Russell, Antonio Torralba,
+# William T. Freeman. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+# associated documentation files (the "Software"), to deal in the Software without restriction, including without
+# limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
+# Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+# The above copyright notice and this permission notice shall be included in all copies or substantial portions of
+# the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
+# NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+from setuptools import setup, find_packages, Command
+from sys import platform as _platform
+from shutil import rmtree
+import sys
+import os
+
+here = os.path.abspath(os.path.dirname(__file__))
+NAME = 'labelImg'
+REQUIRES_PYTHON = '>=3.0.0'
+REQUIRED_DEP = ['pyqt5', 'lxml']
+about = {}
+
+with open(os.path.join(here, 'libs', '__init__.py')) as f:
+ exec(f.read(), about)
+
+with open('README.rst') as readme_file:
+ readme = readme_file.read()
+
+with open('HISTORY.rst') as history_file:
+ history = history_file.read()
+
+
+# OS specific settings
+SET_REQUIRES = []
+if _platform == "linux" or _platform == "linux2":
+ # linux
+ print('linux')
+elif _platform == "darwin":
+ # MAC OS X
+ SET_REQUIRES.append('py2app')
+
+required_packages = find_packages()
+required_packages.append('labelImg')
+
+APP = [NAME + '.py']
+OPTIONS = {
+ 'argv_emulation': True,
+ 'iconfile': 'resources/icons/app.icns'
+}
+
+class UploadCommand(Command):
+ """Support setup.py upload."""
+
+ description=readme + '\n\n' + history,
+
+ user_options = []
+
+ @staticmethod
+ def status(s):
+ """Prints things in bold."""
+ print('\033[1m{0}\033[0m'.format(s))
+
+ def initialize_options(self):
+ pass
+
+ def finalize_options(self):
+ pass
+
+ def run(self):
+ try:
+ self.status('Removing previous builds…')
+ rmtree(os.path.join(here, 'dist'))
+ except OSError:
+ self.status('Fail to remove previous builds..')
+ pass
+
+ self.status('Building Source and Wheel (universal) distribution…')
+ os.system(
+ '{0} setup.py sdist bdist_wheel --universal'.format(sys.executable))
+
+ self.status('Uploading the package to PyPI via Twine…')
+ os.system('twine upload dist/*')
+
+ self.status('Pushing git tags…')
+ os.system('git tag -d v{0}'.format(about['__version__']))
+ os.system('git tag v{0}'.format(about['__version__']))
+ # os.system('git push --tags')
+
+ sys.exit()
+
+
+setup(
+ app=APP,
+ name=NAME,
+ version=about['__version__'],
+ description="LabelImg is a graphical image annotation tool and label object bounding boxes in images",
+ long_description=readme + '\n\n' + history,
+ author="TzuTa Lin",
+ author_email='tzu.ta.lin@gmail.com',
+ url='https://github.com/tzutalin/labelImg',
+ python_requires=REQUIRES_PYTHON,
+ package_dir={'labelImg': '.'},
+ packages=required_packages,
+ entry_points={
+ 'console_scripts': [
+ 'labelImg=labelImg.labelImg:main'
+ ]
+ },
+ include_package_data=True,
+ install_requires=REQUIRED_DEP,
+ license="MIT license",
+ zip_safe=False,
+ keywords='labelImg labelTool development annotation deeplearning',
+ classifiers=[
+ 'Development Status :: 5 - Production/Stable',
+ 'Intended Audience :: Developers',
+ 'License :: OSI Approved :: MIT License',
+ 'Natural Language :: English',
+ 'Programming Language :: Python :: 3',
+ 'Programming Language :: Python :: 3.3',
+ 'Programming Language :: Python :: 3.4',
+ 'Programming Language :: Python :: 3.5',
+ 'Programming Language :: Python :: 3.6',
+ 'Programming Language :: Python :: 3.7',
+ ],
+ package_data={'data/predefined_classes.txt': ['data/predefined_classes.txt']},
+ options={'py2app': OPTIONS},
+ setup_requires=SET_REQUIRES,
+ # $ setup.py publish support.
+ cmdclass={
+ 'upload': UploadCommand,
+ }
+)
diff --git a/README.md b/README.md
index 1d0320f6d3e8053238cd20d6e9962308c5125f06..6c0d0828e4c7f6ea442696769b758020b3378cf8 100644
--- a/README.md
+++ b/README.md
@@ -1,13 +1,14 @@
English | [简体中文](README_ch.md)
## Introduction
-PaddleOCR aims to create rich, leading, and practical OCR tools that help users train better models and apply them into practice.
+PaddleOCR aims to create multilingual, awesome, leading, and practical OCR tools that help users train better models and apply them into practice.
**Recent updates**
-
-- 2020.9.19 Update the ultra lightweight compressed ppocr_mobile_slim series models, the overall model size is 3.5M (see [PP-OCR Pipline](#PP-OCR)), suitable for mobile deployment. [Model Downloads](#Supported-Chinese-model-list)
+- 2020.9.22 Update the PP-OCR technical article, https://arxiv.org/abs/2009.09941
+- 2020.9.19 Update the ultra lightweight compressed ppocr_mobile_slim series models, the overall model size is 3.5M (see [PP-OCR Pipeline](#PP-OCR-Pipeline)), suitable for mobile deployment. [Model Downloads](#Supported-Chinese-model-list)
- 2020.9.17 Update the ultra lightweight ppocr_mobile series and general ppocr_server series Chinese and English ocr models, which are comparable to commercial effects. [Model Downloads](#Supported-Chinese-model-list)
-- 2020.8.24 Support the use of PaddleOCR through whl package installation,pelease refer [PaddleOCR Package](./doc/doc_en/whl_en.md)
+- 2020.9.17 update [English recognition model](./doc/doc_en/models_list_en.md#english-recognition-model) and [Multilingual recognition model](doc/doc_en/models_list_en.md#english-recognition-model), `English`, `Chinese`, `German`, `French`, `Japanese` and `Korean` have been supported. Models for more languages will continue to be updated.
+- 2020.8.24 Support the use of PaddleOCR through whl package installation,please refer [PaddleOCR Package](./doc/doc_en/whl_en.md)
- 2020.8.21 Update the replay and PPT of the live lesson at Bilibili on August 18, lesson 2, easy to learn and use OCR tool spree. [Get Address](https://aistudio.baidu.com/aistudio/education/group/info/1519)
- [more](./doc/doc_en/update_en.md)
@@ -29,7 +30,16 @@ PaddleOCR aims to create rich, leading, and practical OCR tools that help users
-The above picture is the effect display of the general ppocr_server model. For more effect pictures, please see [More visualization](./doc/doc_en/visualization_en.md).
+The above pictures are the visualizations of the general ppocr_server model. For more effect pictures, please see [More visualizations](./doc/doc_en/visualization_en.md).
+
+
+## Community
+- Scan the QR code below with your Wechat, you can access to official technical exchange group. Look forward to your participation.
+
+
+
+
+
## Quick Experience
@@ -49,14 +59,19 @@ Mobile DEMO experience (based on EasyEdge and Paddle-Lite, supports iOS and Andr
## PP-OCR 1.1 series model list(Update on Sep 17)
-| Model introduction | Model name | Recommended scene | Detection model | Direction classifier | Recognition model | |
-| ------------------------------------------------------------ | ---------------------------- | ----------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ---- |
-| Chinese and English ultra-lightweight OCR model (8.1M) | ch_ppocr_mobile_v1.1_xx | Mobile & server | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_train.tar) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_pre.tar) | |
-| Chinese and English general OCR model (155.1M) | ch_ppocr_server_v1.1_xx | Server | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_train.tar) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_train.tar) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_pre.tar) | |
-| Chinese and English ultra-lightweight compressed OCR model (3.5M) | ch_ppocr_mobile_slim_v1.1_xx | Mobile | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/det/ch_ppocr_mobile_v1.1_det_prune_infer.tar) / [slim model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/det/ch_ppocr_mobile_v1.1_det_prune_opt.nb) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/rec/ch_ppocr_mobile_v1.1_rec_quant_infer.tar) / [slim model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/rec/ch_ppocr_mobile_v1.1_rec_quant_opt.nb) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_quant_infer.tar) / [slim model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_cls_quant_opt.nb) | |
+| Model introduction | Model name | Recommended scene | Detection model | Direction classifier | Recognition model |
+| ------------------------------------------------------------ | ---------------------------- | ----------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
+| Chinese and English ultra-lightweight OCR model (8.1M) | ch_ppocr_mobile_v1.1_xx | Mobile & server | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_train.tar) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_pre.tar) |
+| Chinese and English general OCR model (155.1M) | ch_ppocr_server_v1.1_xx | Server | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_train.tar) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_train.tar) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_pre.tar) |
+| Chinese and English ultra-lightweight compressed OCR model (3.5M) | ch_ppocr_mobile_slim_v1.1_xx | Mobile | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/det/ch_ppocr_mobile_v1.1_det_prune_infer.tar) / [slim model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_det_prune_opt.nb) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_quant_infer.tar) / [slim model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_cls_quant_opt.nb) | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/rec/ch_ppocr_mobile_v1.1_rec_quant_infer.tar) / [slim model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_rec_quant_opt.nb) |
+| French ultra-lightweight OCR model (4.6M) | french_ppocr_mobile_v1.1_xx | Mobile & server | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar) | - | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/fr/french_ppocr_mobile_v1.1_rec_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/fr/french_ppocr_mobile_v1.1_rec_train.tar) |
+| German ultra-lightweight OCR model (4.6M) | german_ppocr_mobile_v1.1_xx | Mobile & server | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar) | - |[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/ge/german_ppocr_mobile_v1.1_rec_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/ge/german_ppocr_mobile_v1.1_rec_train.tar) |
+| Korean ultra-lightweight OCR model (5.9M) | korean_ppocr_mobile_v1.1_xx | Mobile & server | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar) | - |[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/kr/korean_ppocr_mobile_v1.1_rec_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/kr/korean_ppocr_mobile_v1.1_rec_train.tar)|
+| Japan ultra-lightweight OCR model (6.2M) | japan_ppocr_mobile_v1.1_xx | Mobile & server | [inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar) | - |[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/jp/japan_ppocr_mobile_v1.1_rec_infer.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/jp/japan_ppocr_mobile_v1.1_rec_train.tar) |
-For more model downloads (including multiple languages), please refer to [PP-OCR v1.1 series model downloads](./doc/doc_en/models_list_en.md)
+For more model downloads (including multiple languages), please refer to [PP-OCR v1.1 series model downloads](./doc/doc_en/models_list_en.md).
+For a new language request, please refer to [Guideline for new language_requests](#language_requests).
## Tutorials
- [Installation](./doc/doc_en/installation_en.md)
@@ -65,10 +80,11 @@ For more model downloads (including multiple languages), please refer to [PP-OCR
- Algorithm introduction
- [Text Detection Algorithm](./doc/doc_en/algorithm_overview_en.md)
- [Text Recognition Algorithm](./doc/doc_en/algorithm_overview_en.md)
- - [PP-OCR Pipline](#PP-OCR-Pipline)
+ - [PP-OCR Pipeline](#PP-OCR-Pipeline)
- Model training/evaluation
- [Text Detection](./doc/doc_en/detection_en.md)
- [Text Recognition](./doc/doc_en/recognition_en.md)
+ - [Direction Classification](./doc/doc_en/angle_class_en.md)
- [Yml Configuration](./doc/doc_en/config_en.md)
- Inference and Deployment
- [Quick inference based on pip](./doc/doc_en/whl_en.md)
@@ -86,41 +102,64 @@ For more model downloads (including multiple languages), please refer to [PP-OCR
- [Data Annotation Tools](./doc/doc_en/data_annotation_en.md)
- [Data Synthesis Tools](./doc/doc_en/data_synthesis_en.md)
- [Visualization](#Visualization)
+- [New language requests](#language_requests)
- [FAQ](./doc/doc_en/FAQ_en.md)
- [Community](#Community)
- [References](./doc/doc_en/reference_en.md)
- [License](#LICENSE)
- [Contribution](#CONTRIBUTION)
-
+
-## PP-OCR Pipline
+## PP-OCR Pipeline
-PP-OCR is a practical ultra-lightweight OCR system. It is mainly composed of three parts: DB text detection, detection frame correction and CRNN text recognition. The system adopts 19 effective strategies from 8 aspects including backbone network selection and adjustment, prediction head design, data augmentation, learning rate transformation strategy, regularization parameter selection, pre-training model use, and automatic model tailoring and quantization to optimize and slim down the models of each module. The final results are an ultra-lightweight Chinese and English OCR model with an overall size of 3.5M and a 2.8M English digital OCR model. For more details, please refer to the PP-OCR technical article (Arxiv article link is being generated).
+PP-OCR is a practical ultra-lightweight OCR system. It is mainly composed of three parts: DB text detection, detection frame correction and CRNN text recognition. The system adopts 19 effective strategies from 8 aspects including backbone network selection and adjustment, prediction head design, data augmentation, learning rate transformation strategy, regularization parameter selection, pre-training model use, and automatic model tailoring and quantization to optimize and slim down the models of each module. The final results are an ultra-lightweight Chinese and English OCR model with an overall size of 3.5M and a 2.8M English digital OCR model. For more details, please refer to the PP-OCR technical article (https://arxiv.org/abs/2009.09941). Besides, The implementation of the FPGM Pruner and PACT quantization is based on [PaddleSlim](https://github.com/PaddlePaddle/PaddleSlim).
-## Visualization [more](./doc/doc_en/visualization_en.md)
+
+## Visualization [more](./doc/doc_en/visualization_en.md)
+- Chinese OCR model
-
-
-
-## Community
-Scan the QR code below with your Wechat and completing the questionnaire, you can access to offical technical exchange group.
+- English OCR model
+
+
+
+- Multilingual OCR model
-
+
+
+
+
+## Guideline for new language requests
+
+If you want to request a new language support, a PR with 2 following files are needed:
+
+1. In folder [ppocr/utils/dict](https://github.com/PaddlePaddle/PaddleOCR/tree/develop/ppocr/utils/dict),
+it is necessary to submit the dict text to this path and name it with `{language}_dict.txt` that contains a list of all characters. Please see the format example from other files in that folder.
+
+2. In folder [ppocr/utils/corpus](https://github.com/PaddlePaddle/PaddleOCR/tree/develop/ppocr/utils/corpus),
+it is necessary to submit the corpus to this path and name it with `{language}_corpus.txt` that contains a list of words in your language.
+Maybe, 50000 words per language is necessary at least.
+Of course, the more, the better.
+
+If your language has unique elements, please tell me in advance within any way, such as useful links, wikipedia and so on.
+
+More details, please refer to [Multilingual OCR Development Plan](https://github.com/PaddlePaddle/PaddleOCR/issues/1048).
+
+
## License
This project is released under Apache 2.0 license
@@ -136,3 +175,5 @@ We welcome all the contributions to PaddleOCR and appreciate for your feedback v
- Thanks [authorfu](https://github.com/authorfu) for contributing Android demo and [xiadeye](https://github.com/xiadeye) contributing iOS demo, respectively.
- Thanks [BeyondYourself](https://github.com/BeyondYourself) for contributing many great suggestions and simplifying part of the code style.
- Thanks [tangmq](https://gitee.com/tangmq) for contributing Dockerized deployment services to PaddleOCR and supporting the rapid release of callable Restful API services.
+- Thanks [lijinhan](https://github.com/lijinhan) for contributing a new way, i.e., java SpringBoot, to achieve the request for the Hubserving deployment.
+- Thanks [Mejans](https://github.com/Mejans) for contributing the Occitan corpus and character set.
diff --git a/README_ch.md b/README_ch.md
index 27d5da04bbc6d7ef71240a62c4cafeb0c3d0e2b9..6806ab6662ef8e9bb195cf97f7fe3bd87f3d7e73 100644
--- a/README_ch.md
+++ b/README_ch.md
@@ -4,17 +4,19 @@
PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力使用者训练出更好的模型,并应用落地。
**近期更新**
-- 2020.9.19 更新超轻量压缩ppocr_mobile_slim系列模型,整体模型3.5M(详见[PP-OCR Pipline](#PP-OCR)),适合在移动端部署使用。[模型下载](#模型下载)
+- 2020.11.25 更新半自动标注工具[PPOCRLabel](./PPOCRLabel/README.md),辅助开发者高效完成标注任务,输出格式与PP-OCR训练任务完美衔接。
+- 2020.11.16 [FAQ](./doc/doc_ch/FAQ.md)新增5个高频问题,共计109个常见问题及解答,并且计划以后每周一都会更新,欢迎大家持续关注。
+- 2020.9.22 更新PP-OCR技术文章,https://arxiv.org/abs/2009.09941
+- 2020.9.19 更新超轻量压缩ppocr_mobile_slim系列模型,整体模型3.5M(详见[PP-OCR Pipeline](#PP-OCR)),适合在移动端部署使用。[模型下载](#模型下载)
- 2020.9.17 更新超轻量ppocr_mobile系列和通用ppocr_server系列中英文ocr模型,媲美商业效果。[模型下载](#模型下载)
-- 2020.8.26 更新OCR相关的84个常见问题及解答,具体参考[FAQ](./doc/doc_ch/FAQ.md)
+- 2020.9.17 更新[英文识别模型](./doc/doc_ch/models_list.md#英文识别模型)和[多语言识别模型](doc/doc_ch/models_list.md#多语言识别模型),已支持`德语、法语、日语、韩语`,更多语种识别模型将持续更新。
- 2020.8.24 支持通过whl包安装使用PaddleOCR,具体参考[Paddleocr Package使用说明](./doc/doc_ch/whl.md)
- 2020.8.21 更新8月18日B站直播课回放和PPT,课节2,易学易用的OCR工具大礼包,[获取地址](https://aistudio.baidu.com/aistudio/education/group/info/1519)
- [More](./doc/doc_ch/update.md)
-
## 特性
-- PPOCR系列高质量预训练模型,媲美商业效果
+- PPOCR系列高质量预训练模型,准确的识别效果
- 超轻量ppocr_mobile移动端系列:检测(2.6M)+方向分类器(0.9M)+ 识别(4.6M)= 8.1M
- 通用ppocr_server系列:检测(47.2M)+方向分类器(0.9M)+ 识别(107M)= 155.1M
- 超轻量压缩ppocr_mobile_slim系列:检测(1.4M)+方向分类器(0.5M)+ 识别(1.6M)= 3.5M
@@ -33,6 +35,15 @@ PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力
上图是通用ppocr_server模型效果展示,更多效果图请见[效果展示页面](./doc/doc_ch/visualization.md)。
+
+## 欢迎加入PaddleOCR技术交流群
+- 微信扫描二维码加入官方交流群,获得更高效的问题答疑,与各行各业开发者充分交流,期待您的加入。
+
+
+
+
## 许可证书
本项目的发布受Apache 2.0 license许可认证。
@@ -138,3 +153,6 @@ PP-OCR是一个实用的超轻量OCR系统。主要由DB文本检测、检测框
- 非常感谢 [authorfu](https://github.com/authorfu) 贡献Android和[xiadeye](https://github.com/xiadeye) 贡献IOS的demo代码
- 非常感谢 [BeyondYourself](https://github.com/BeyondYourself) 给PaddleOCR提了很多非常棒的建议,并简化了PaddleOCR的部分代码风格。
- 非常感谢 [tangmq](https://gitee.com/tangmq) 给PaddleOCR增加Docker化部署服务,支持快速发布可调用的Restful API服务。
+- 非常感谢 [lijinhan](https://github.com/lijinhan) 给PaddleOCR增加java SpringBoot 调用OCR Hubserving接口完成对OCR服务化部署的使用。
+- 非常感谢 [Mejans](https://github.com/Mejans) 给PaddleOCR增加新语言奥克西坦语Occitan的字典和语料。
+- 非常感谢 [Evezerest](https://github.com/Evezerest), [ninetailskim](https://github.com/ninetailskim), [edencfc](https://github.com/edencfc), [BeyondYourself](https://github.com/BeyondYourself), [1084667371](https://github.com/1084667371) 贡献了PPOCRLabel的完整代码。
diff --git a/configs/det/det_db_icdar15_reader.yml b/configs/det/det_db_icdar15_reader.yml
index 0f99257b53a366ccdb2521ca742198adfe3ff556..6c6833612ae3d56fbe1a23d80da24b00ab13ef3a 100755
--- a/configs/det/det_db_icdar15_reader.yml
+++ b/configs/det/det_db_icdar15_reader.yml
@@ -15,8 +15,6 @@ EvalReader:
TestReader:
reader_function: ppocr.data.det.dataset_traversal,EvalTestReader
process_function: ppocr.data.det.db_process,DBProcessTest
- infer_img:
img_set_dir: ./train_data/icdar2015/text_localization/
label_file_path: ./train_data/icdar2015/text_localization/test_icdar2015_label.txt
- test_image_shape: [736, 1280]
do_eval: True
diff --git a/configs/det/det_east_icdar15_reader.yml b/configs/det/det_east_icdar15_reader.yml
index 060ed4dd380d0457574c1d20be3225c7fd188108..f2df30ca29115035bc6acb7c3d8d6b33498fa6c2 100755
--- a/configs/det/det_east_icdar15_reader.yml
+++ b/configs/det/det_east_icdar15_reader.yml
@@ -17,7 +17,6 @@ EvalReader:
TestReader:
reader_function: ppocr.data.det.dataset_traversal,EvalTestReader
process_function: ppocr.data.det.east_process,EASTProcessTest
- infer_img:
img_set_dir: ./train_data/icdar2015/text_localization/
label_file_path: ./train_data/icdar2015/text_localization/test_icdar2015_label.txt
do_eval: True
diff --git a/configs/det/det_mv3_db.yml b/configs/det/det_mv3_db.yml
index 5f67ca1db758069bb6d19276339895302604fd62..24443a8f2adfff29a17fa9ae527852ba7abc8143 100755
--- a/configs/det/det_mv3_db.yml
+++ b/configs/det/det_mv3_db.yml
@@ -16,6 +16,7 @@ Global:
checkpoints:
save_res_path: ./output/det_db/predicts_db.txt
save_inference_dir:
+ infer_img:
Architecture:
function: ppocr.modeling.architectures.det_model,DetModel
@@ -24,7 +25,6 @@ Backbone:
function: ppocr.modeling.backbones.det_mobilenet_v3,MobileNetV3
scale: 0.5
model_name: large
- disable_se: true
Head:
function: ppocr.modeling.heads.det_db_head,DBHead
diff --git a/configs/det/det_mv3_db_v1.1.yml b/configs/det/det_mv3_db_v1.1.yml
new file mode 100755
index 0000000000000000000000000000000000000000..3cd7e34e5aade2e91910164ba71a6a792c1b0e70
--- /dev/null
+++ b/configs/det/det_mv3_db_v1.1.yml
@@ -0,0 +1,60 @@
+Global:
+ algorithm: DB
+ use_gpu: true
+ epoch_num: 1200
+ log_smooth_window: 20
+ print_batch_step: 2
+ save_model_dir: ./output/det_db/
+ save_epoch_step: 200
+ # evaluation is run every 5000 iterations after the 4000th iteration
+ eval_batch_step: [4000, 5000]
+ train_batch_size_per_card: 16
+ test_batch_size_per_card: 16
+ image_shape: [3, 640, 640]
+ reader_yml: ./configs/det/det_db_icdar15_reader.yml
+ pretrain_weights: ./pretrain_models/MobileNetV3_large_x0_5_pretrained/
+ checkpoints:
+ save_res_path: ./output/det_db/predicts_db.txt
+ save_inference_dir:
+ infer_img:
+
+Architecture:
+ function: ppocr.modeling.architectures.det_model,DetModel
+
+Backbone:
+ function: ppocr.modeling.backbones.det_mobilenet_v3,MobileNetV3
+ scale: 0.5
+ model_name: large
+ disable_se: true
+
+Head:
+ function: ppocr.modeling.heads.det_db_head,DBHead
+ model_name: large
+ k: 50
+ inner_channels: 96
+ out_channels: 2
+
+Loss:
+ function: ppocr.modeling.losses.det_db_loss,DBLoss
+ balance_loss: true
+ main_loss_type: DiceLoss
+ alpha: 5
+ beta: 10
+ ohem_ratio: 3
+
+Optimizer:
+ function: ppocr.optimizer,AdamDecay
+ base_lr: 0.001
+ beta1: 0.9
+ beta2: 0.999
+ decay:
+ function: cosine_decay_warmup
+ step_each_epoch: 16
+ total_epoch: 1200
+
+PostProcess:
+ function: ppocr.postprocess.db_postprocess,DBPostProcess
+ thresh: 0.3
+ box_thresh: 0.6
+ max_candidates: 1000
+ unclip_ratio: 1.5
diff --git a/configs/det/det_mv3_east.yml b/configs/det/det_mv3_east.yml
index 67b82fffff8c47e5ee5866ad22f238ece3822776..14f453c705e43076b6f27cb7127bb44d3f628587 100755
--- a/configs/det/det_mv3_east.yml
+++ b/configs/det/det_mv3_east.yml
@@ -15,6 +15,7 @@ Global:
checkpoints:
save_res_path: ./output/det_east/predicts_east.txt
save_inference_dir:
+ infer_img:
Architecture:
function: ppocr.modeling.architectures.det_model,DetModel
diff --git a/configs/det/det_r18_vd_db_v1.1.yml b/configs/det/det_r18_vd_db_v1.1.yml
new file mode 100755
index 0000000000000000000000000000000000000000..c850599b0cd324fb078ab6e433cd0fb819733aba
--- /dev/null
+++ b/configs/det/det_r18_vd_db_v1.1.yml
@@ -0,0 +1,58 @@
+Global:
+ algorithm: DB
+ use_gpu: true
+ epoch_num: 1200
+ log_smooth_window: 20
+ print_batch_step: 2
+ save_model_dir: ./output/det_r_18_vd_db/
+ save_epoch_step: 200
+ eval_batch_step: [3000, 2000]
+ train_batch_size_per_card: 8
+ test_batch_size_per_card: 1
+ image_shape: [3, 640, 640]
+ reader_yml: ./configs/det/det_db_icdar15_reader.yml
+ pretrain_weights: ./pretrain_models/ResNet18_vd_pretrained/
+ save_res_path: ./output/det_r18_vd_db/predicts_db.txt
+ checkpoints:
+ save_inference_dir:
+ infer_img:
+
+Architecture:
+ function: ppocr.modeling.architectures.det_model,DetModel
+
+Backbone:
+ function: ppocr.modeling.backbones.det_resnet_vd,ResNet
+ layers: 18
+
+Head:
+ function: ppocr.modeling.heads.det_db_head,DBHead
+ model_name: large
+ k: 50
+ inner_channels: 256
+ out_channels: 2
+
+Loss:
+ function: ppocr.modeling.losses.det_db_loss,DBLoss
+ balance_loss: true
+ main_loss_type: DiceLoss
+ alpha: 5
+ beta: 10
+ ohem_ratio: 3
+
+Optimizer:
+ function: ppocr.optimizer,AdamDecay
+ base_lr: 0.001
+ beta1: 0.9
+ beta2: 0.999
+ decay:
+ function: cosine_decay_warmup
+ step_each_epoch: 32
+ total_epoch: 1200
+
+PostProcess:
+ function: ppocr.postprocess.db_postprocess,DBPostProcess
+ thresh: 0.3
+ box_thresh: 0.5
+ max_candidates: 1000
+ unclip_ratio: 1.6
+
diff --git a/configs/det/det_r50_vd_db.yml b/configs/det/det_r50_vd_db.yml
index 9a3b77e7cebce99f669d0b1be89ee56c84f41034..726ecd8ea012a42f4e82690aeb06250a35520b89 100755
--- a/configs/det/det_r50_vd_db.yml
+++ b/configs/det/det_r50_vd_db.yml
@@ -15,6 +15,7 @@ Global:
save_res_path: ./output/det_db/predicts_db.txt
checkpoints:
save_inference_dir:
+ infer_img:
Architecture:
function: ppocr.modeling.architectures.det_model,DetModel
diff --git a/configs/det/det_r50_vd_east.yml b/configs/det/det_r50_vd_east.yml
index 8d86819937c902e47dded38ae0238fb8254d8ff0..2fb8e5cf024fac1f5e5e056965d96f3173b35c0c 100755
--- a/configs/det/det_r50_vd_east.yml
+++ b/configs/det/det_r50_vd_east.yml
@@ -15,6 +15,7 @@ Global:
save_res_path: ./output/det_east/predicts_east.txt
checkpoints:
save_inference_dir:
+ infer_img:
Architecture:
function: ppocr.modeling.architectures.det_model,DetModel
diff --git a/configs/det/det_r50_vd_sast_icdar15.yml b/configs/det/det_r50_vd_sast_icdar15.yml
index f1ecd61dc8ccb14fde98c2fc55cb2c9e630b5c44..02593293bd0bb83cdb73a99370af6c1820f131f3 100644
--- a/configs/det/det_r50_vd_sast_icdar15.yml
+++ b/configs/det/det_r50_vd_sast_icdar15.yml
@@ -15,6 +15,7 @@ Global:
save_res_path: ./output/det_sast/predicts_sast.txt
checkpoints:
save_inference_dir:
+ infer_img:
Architecture:
function: ppocr.modeling.architectures.det_model,DetModel
diff --git a/configs/det/det_r50_vd_sast_totaltext.yml b/configs/det/det_r50_vd_sast_totaltext.yml
index ec42ce6d4bafd0c5d4360a255f35d07e83f90787..96522852836b70a8995ae54f1e56765b58240e2d 100644
--- a/configs/det/det_r50_vd_sast_totaltext.yml
+++ b/configs/det/det_r50_vd_sast_totaltext.yml
@@ -15,6 +15,7 @@ Global:
save_res_path: ./output/det_sast/predicts_sast.txt
checkpoints:
save_inference_dir:
+ infer_img:
Architecture:
function: ppocr.modeling.architectures.det_model,DetModel
diff --git a/configs/det/det_sast_icdar15_reader.yml b/configs/det/det_sast_icdar15_reader.yml
index ee45a85da7452e2069b0d7467b1ccfc44dd656b7..db5c6ac64e84eed4ade19a6bdaa92103aad030fb 100644
--- a/configs/det/det_sast_icdar15_reader.yml
+++ b/configs/det/det_sast_icdar15_reader.yml
@@ -20,5 +20,4 @@ EvalReader:
TestReader:
reader_function: ppocr.data.det.dataset_traversal,EvalTestReader
process_function: ppocr.data.det.sast_process,SASTProcessTest
- infer_img: ./train_data/icdar2015/text_localization/ch4_test_images/img_11.jpg
max_side_len: 1536
diff --git a/configs/det/det_sast_totaltext_reader.yml b/configs/det/det_sast_totaltext_reader.yml
index 92503d9f0e2b57f0d22b15591c5400185daf2afa..d303d176d5cee89827255ddddea4d5d771f19ddb 100644
--- a/configs/det/det_sast_totaltext_reader.yml
+++ b/configs/det/det_sast_totaltext_reader.yml
@@ -20,5 +20,4 @@ EvalReader:
TestReader:
reader_function: ppocr.data.det.dataset_traversal,EvalTestReader
process_function: ppocr.data.det.sast_process,SASTProcessTest
- infer_img: ./train_data/afs/total_text/Images/Test/img623.jpg
max_side_len: 768
diff --git a/configs/rec/ch_ppocr_v1.1/rec_chinese_common_train_v1.1.yml b/configs/rec/ch_ppocr_v1.1/rec_chinese_common_train_v1.1.yml
new file mode 100644
index 0000000000000000000000000000000000000000..8a84c635d32cce44daf405a8d48bcb0547b13acd
--- /dev/null
+++ b/configs/rec/ch_ppocr_v1.1/rec_chinese_common_train_v1.1.yml
@@ -0,0 +1,52 @@
+Global:
+ algorithm: CRNN
+ use_gpu: true
+ epoch_num: 500
+ log_smooth_window: 20
+ print_batch_step: 10
+ save_model_dir: ./output/rec_CRNN
+ save_epoch_step: 3
+ eval_batch_step: 2000
+ train_batch_size_per_card: 128
+ test_batch_size_per_card: 128
+ image_shape: [3, 32, 320]
+ max_text_length: 25
+ character_type: ch
+ character_dict_path: ./ppocr/utils/ppocr_keys_v1.txt
+ loss_type: ctc
+ distort: true
+ use_space_char: true
+ reader_yml: ./configs/rec/rec_chinese_reader.yml
+ pretrain_weights:
+ checkpoints:
+ save_inference_dir:
+ infer_img:
+
+Architecture:
+ function: ppocr.modeling.architectures.rec_model,RecModel
+
+Backbone:
+ function: ppocr.modeling.backbones.rec_resnet_vd,ResNet
+ layers: 34
+
+Head:
+ function: ppocr.modeling.heads.rec_ctc_head,CTCPredict
+ encoder_type: rnn
+ fc_decay: 0.00004
+ SeqRNN:
+ hidden_size: 256
+
+Loss:
+ function: ppocr.modeling.losses.rec_ctc_loss,CTCLoss
+
+Optimizer:
+ function: ppocr.optimizer,AdamDecay
+ base_lr: 0.0005
+ l2_decay: 0.00004
+ beta1: 0.9
+ beta2: 0.999
+ decay:
+ function: cosine_decay_warmup
+ step_each_epoch: 254
+ total_epoch: 500
+ warmup_minibatch: 1000
diff --git a/configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml b/configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml
new file mode 100755
index 0000000000000000000000000000000000000000..89333f89ad9a6af4dd744daa8972ce35f805113a
--- /dev/null
+++ b/configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml
@@ -0,0 +1,54 @@
+Global:
+ algorithm: CRNN
+ use_gpu: true
+ epoch_num: 500
+ log_smooth_window: 20
+ print_batch_step: 10
+ save_model_dir: ./output/rec_CRNN
+ save_epoch_step: 3
+ eval_batch_step: 2000
+ train_batch_size_per_card: 256
+ test_batch_size_per_card: 256
+ image_shape: [3, 32, 320]
+ max_text_length: 25
+ character_type: ch
+ character_dict_path: ./ppocr/utils/ppocr_keys_v1.txt
+ loss_type: ctc
+ distort: true
+ use_space_char: true
+ reader_yml: ./configs/rec/rec_chinese_reader.yml
+ pretrain_weights:
+ checkpoints:
+ save_inference_dir:
+ infer_img:
+
+Architecture:
+ function: ppocr.modeling.architectures.rec_model,RecModel
+
+Backbone:
+ function: ppocr.modeling.backbones.rec_mobilenet_v3,MobileNetV3
+ scale: 0.5
+ model_name: small
+ small_stride: [1, 2, 2, 2]
+
+Head:
+ function: ppocr.modeling.heads.rec_ctc_head,CTCPredict
+ encoder_type: rnn
+ fc_decay: 0.00001
+ SeqRNN:
+ hidden_size: 48
+
+Loss:
+ function: ppocr.modeling.losses.rec_ctc_loss,CTCLoss
+
+Optimizer:
+ function: ppocr.optimizer,AdamDecay
+ base_lr: 0.0005
+ l2_decay: 0.00001
+ beta1: 0.9
+ beta2: 0.999
+ decay:
+ function: cosine_decay_warmup
+ step_each_epoch: 254
+ total_epoch: 500
+ warmup_minibatch: 1000
diff --git a/configs/rec/multi_languages/rec_french_lite_train.yml b/configs/rec/multi_languages/rec_french_lite_train.yml
index 2cf54c427eb6a7c64f4b54b021c44013a1dc1d6a..b4347bcd3a353fe65bddc2e96dc11b97f3eb0a08 100755
--- a/configs/rec/multi_languages/rec_french_lite_train.yml
+++ b/configs/rec/multi_languages/rec_french_lite_train.yml
@@ -12,7 +12,7 @@ Global:
image_shape: [3, 32, 320]
max_text_length: 25
character_type: french
- character_dict_path: ./ppocr/utils/french_dict.txt
+ character_dict_path: ./ppocr/utils/dict/french_dict.txt
loss_type: ctc
distort: true
use_space_char: false
diff --git a/configs/rec/multi_languages/rec_ger_lite_train.yml b/configs/rec/multi_languages/rec_ger_lite_train.yml
index beb1755b105fea9cbade9f35ceac15d380651f37..4e3b6c9ed21aa54e13dbf8d9fa5cea6bebf0c1d3 100755
--- a/configs/rec/multi_languages/rec_ger_lite_train.yml
+++ b/configs/rec/multi_languages/rec_ger_lite_train.yml
@@ -12,7 +12,7 @@ Global:
image_shape: [3, 32, 320]
max_text_length: 25
character_type: german
- character_dict_path: ./ppocr/utils/german_dict.txt
+ character_dict_path: ./ppocr/utils/dict/german_dict.txt
loss_type: ctc
distort: true
use_space_char: false
diff --git a/configs/rec/multi_languages/rec_japan_lite_train.yml b/configs/rec/multi_languages/rec_japan_lite_train.yml
index fbbab33eadd2901d9eac93f49e737e92d9441270..ddfb7e2fe7c56cfff02ac9a1fc6a7da35c989a45 100755
--- a/configs/rec/multi_languages/rec_japan_lite_train.yml
+++ b/configs/rec/multi_languages/rec_japan_lite_train.yml
@@ -12,7 +12,7 @@ Global:
image_shape: [3, 32, 320]
max_text_length: 25
character_type: japan
- character_dict_path: ./ppocr/utils/japan_dict.txt
+ character_dict_path: ./ppocr/utils/dict/japan_dict.txt
loss_type: ctc
distort: true
use_space_char: false
diff --git a/configs/rec/multi_languages/rec_korean_lite_train.yml b/configs/rec/multi_languages/rec_korean_lite_train.yml
index 29cc08aaefb017c690551e030a57e85ebb21e2dd..2dba08854426535e849809a5d39b7329442e6304 100755
--- a/configs/rec/multi_languages/rec_korean_lite_train.yml
+++ b/configs/rec/multi_languages/rec_korean_lite_train.yml
@@ -12,7 +12,7 @@ Global:
image_shape: [3, 32, 320]
max_text_length: 25
character_type: korean
- character_dict_path: ./ppocr/utils/korean_dict.txt
+ character_dict_path: ./ppocr/utils/dict/korean_dict.txt
loss_type: ctc
distort: true
use_space_char: false
diff --git a/configs/rec/rec_mv3_none_bilstm_ctc.yml b/configs/rec/rec_mv3_none_bilstm_ctc.yml
index d2e096fb1c51588a6bd2c7ca8321cf817d435f23..55feaaf883e18791bc76430a7afaaacb7f5812b6 100755
--- a/configs/rec/rec_mv3_none_bilstm_ctc.yml
+++ b/configs/rec/rec_mv3_none_bilstm_ctc.yml
@@ -12,6 +12,7 @@ Global:
image_shape: [3, 32, 100]
max_text_length: 25
character_type: en
+ character_dict_path:
loss_type: ctc
reader_yml: ./configs/rec/rec_benchmark_reader.yml
pretrain_weights:
diff --git a/configs/rec/rec_mv3_none_none_ctc.yml b/configs/rec/rec_mv3_none_none_ctc.yml
index ceec09ce6f3b6cb2238d6fb2e15f510cb31e0fd8..0cf377834e733756b356525896ba57a242fa3f62 100755
--- a/configs/rec/rec_mv3_none_none_ctc.yml
+++ b/configs/rec/rec_mv3_none_none_ctc.yml
@@ -12,6 +12,7 @@ Global:
image_shape: [3, 32, 100]
max_text_length: 25
character_type: en
+ character_dict_path:
loss_type: ctc
reader_yml: ./configs/rec/rec_benchmark_reader.yml
pretrain_weights:
diff --git a/configs/rec/rec_mv3_tps_bilstm_attn.yml b/configs/rec/rec_mv3_tps_bilstm_attn.yml
index 7fc4f6799459bf9fbcd25e1609aeca5e3fd12a74..d02edaba238af701a8b81b240ee9a89cbc1ed995 100755
--- a/configs/rec/rec_mv3_tps_bilstm_attn.yml
+++ b/configs/rec/rec_mv3_tps_bilstm_attn.yml
@@ -12,6 +12,7 @@ Global:
image_shape: [3, 32, 100]
max_text_length: 25
character_type: en
+ character_dict_path:
loss_type: attention
tps: true
reader_yml: ./configs/rec/rec_benchmark_reader.yml
diff --git a/configs/rec/rec_mv3_tps_bilstm_ctc.yml b/configs/rec/rec_mv3_tps_bilstm_ctc.yml
index 4b9660bcdec60989a6d9b9926c40814a83db6f39..509d616bc0e9456c1fb86c94e5eef1c2f9515aad 100755
--- a/configs/rec/rec_mv3_tps_bilstm_ctc.yml
+++ b/configs/rec/rec_mv3_tps_bilstm_ctc.yml
@@ -12,6 +12,7 @@ Global:
image_shape: [3, 32, 100]
max_text_length: 25
character_type: en
+ character_dict_path:
loss_type: ctc
tps: true
reader_yml: ./configs/rec/rec_benchmark_reader.yml
diff --git a/configs/rec/rec_r34_vd_none_bilstm_ctc.yml b/configs/rec/rec_r34_vd_none_bilstm_ctc.yml
index b71e8feae7ac8f235bf471101efd4383c61bfab2..7332f0f8679c32afd4435dbddef29f651c994b26 100755
--- a/configs/rec/rec_r34_vd_none_bilstm_ctc.yml
+++ b/configs/rec/rec_r34_vd_none_bilstm_ctc.yml
@@ -12,6 +12,7 @@ Global:
image_shape: [3, 32, 100]
max_text_length: 25
character_type: en
+ character_dict_path:
loss_type: ctc
reader_yml: ./configs/rec/rec_benchmark_reader.yml
pretrain_weights:
diff --git a/configs/rec/rec_r34_vd_none_none_ctc.yml b/configs/rec/rec_r34_vd_none_none_ctc.yml
index d9c9458d6d8fcdb9df590b0093d54b71e3e53fcc..b42b5535471f078b79002b8ea930a7c846207a86 100755
--- a/configs/rec/rec_r34_vd_none_none_ctc.yml
+++ b/configs/rec/rec_r34_vd_none_none_ctc.yml
@@ -12,6 +12,7 @@ Global:
image_shape: [3, 32, 100]
max_text_length: 25
character_type: en
+ character_dict_path:
loss_type: ctc
reader_yml: ./configs/rec/rec_benchmark_reader.yml
pretrain_weights:
diff --git a/configs/rec/rec_r34_vd_tps_bilstm_attn.yml b/configs/rec/rec_r34_vd_tps_bilstm_attn.yml
index dfcd97fad67081a7ed04ad1d67ff298c9f553b0c..73ed68481f8ca189491375321c3848998b74410f 100755
--- a/configs/rec/rec_r34_vd_tps_bilstm_attn.yml
+++ b/configs/rec/rec_r34_vd_tps_bilstm_attn.yml
@@ -12,6 +12,7 @@ Global:
image_shape: [3, 32, 100]
max_text_length: 25
character_type: en
+ character_dict_path:
loss_type: attention
tps: true
reader_yml: ./configs/rec/rec_benchmark_reader.yml
diff --git a/configs/rec/rec_r34_vd_tps_bilstm_ctc.yml b/configs/rec/rec_r34_vd_tps_bilstm_ctc.yml
index 574a088cc024541e086bedc0bc0a52082e9e7eb2..9a621a1462df156272938740ceddef1aa850f95a 100755
--- a/configs/rec/rec_r34_vd_tps_bilstm_ctc.yml
+++ b/configs/rec/rec_r34_vd_tps_bilstm_ctc.yml
@@ -12,6 +12,7 @@ Global:
image_shape: [3, 32, 100]
max_text_length: 25
character_type: en
+ character_dict_path:
loss_type: ctc
tps: true
reader_yml: ./configs/rec/rec_benchmark_reader.yml
diff --git a/configs/rec/rec_r50fpn_vd_none_srn.yml b/configs/rec/rec_r50fpn_vd_none_srn.yml
index 30709e479f8da56b6bd7fe9ebf817a27bff9cc38..e7040d9a1d6a311d61fe3f8b6396ccfdfd8c0b95 100755
--- a/configs/rec/rec_r50fpn_vd_none_srn.yml
+++ b/configs/rec/rec_r50fpn_vd_none_srn.yml
@@ -12,6 +12,7 @@ Global:
image_shape: [1, 64, 256]
max_text_length: 25
character_type: en
+ character_dict_path:
loss_type: srn
num_heads: 8
average_window: 0.15
diff --git a/deploy/android_demo/README.md b/deploy/android_demo/README.md
index e35e757914aa355c97293662652b1e02676e32eb..285f7a84387e5f50ac3286cee10b0c4bea0deb31 100644
--- a/deploy/android_demo/README.md
+++ b/deploy/android_demo/README.md
@@ -2,7 +2,7 @@
### 1. 安装最新版本的Android Studio
可以从https://developer.android.com/studio 下载。本Demo使用是4.0版本Android Studio编写。
-### 2. 按照NDK 20 以上版本
+### 2. 按照NDK 20 以上版本
Demo测试的时候使用的是NDK 20b版本,20版本以上均可以支持编译成功。
如果您是初学者,可以用以下方式安装和测试NDK编译环境。
@@ -17,3 +17,10 @@ Demo测试的时候使用的是NDK 20b版本,20版本以上均可以支持编
- Demo APP:可使用手机扫码安装,方便手机端快速体验文字识别
- SDK:模型被封装为适配不同芯片硬件和操作系统SDK,包括完善的接口,方便进行二次开发
+
+
+# FAQ:
+Q1: 更新1.1版本的模型后,demo报错?
+
+
+A1. 如果要更换V1.1 版本的模型,请更新模型的同时,更新预测库文件,建议使用[PaddleLite 2.6.3](https://github.com/PaddlePaddle/Paddle-Lite/releases/tag/v2.6.3)版本的预测库文件,OCR移动端部署参考[教程](../lite/readme.md)。
diff --git a/deploy/android_demo/app/build.gradle b/deploy/android_demo/app/build.gradle
index 5ecb11692c2a66f941dc41425761519607bad39e..494247a3792814ab8373f150c5f7b35b1b821971 100644
--- a/deploy/android_demo/app/build.gradle
+++ b/deploy/android_demo/app/build.gradle
@@ -57,7 +57,7 @@ def archives = [
],
[
'src' : 'https://paddleocr.bj.bcebos.com/deploy/lite/ocr_v1_for_cpu.tar.gz',
- 'dest' : 'src/main/assets/models/ocr_v1_for_cpu'
+ 'dest' : 'src/main/assets/models'
]
]
diff --git a/deploy/android_demo/app/src/main/cpp/ocr_cls_process.cpp b/deploy/android_demo/app/src/main/cpp/ocr_cls_process.cpp
index d720066667b60ee87bc1a1227ad720074254074e..e7de9b0b1c7c228ba7e00ad912cdfedcce7812a1 100644
--- a/deploy/android_demo/app/src/main/cpp/ocr_cls_process.cpp
+++ b/deploy/android_demo/app/src/main/cpp/ocr_cls_process.cpp
@@ -20,7 +20,7 @@
#include
#include
-const std::vector CLS_IMAGE_SHAPE = {3, 32, 100};
+const std::vector CLS_IMAGE_SHAPE = {3, 48, 192};
cv::Mat cls_resize_img(const cv::Mat &img) {
int imgC = CLS_IMAGE_SHAPE[0];
diff --git a/deploy/android_demo/app/src/main/cpp/ocr_ppredictor.h b/deploy/android_demo/app/src/main/cpp/ocr_ppredictor.h
index 0ec458a4952cbc605e9979ce7850bdeab36c4629..588f25cb0662b6cc5c8677549e7eb3527d74fa9b 100644
--- a/deploy/android_demo/app/src/main/cpp/ocr_ppredictor.h
+++ b/deploy/android_demo/app/src/main/cpp/ocr_ppredictor.h
@@ -98,7 +98,7 @@ private:
* @param origin
* @return
*/
- cv::Mat infer_cls(const cv::Mat &origin, float thresh = 0.5);
+ cv::Mat infer_cls(const cv::Mat &origin, float thresh = 0.9);
/**
* Postprocess or sencod model to extract text
diff --git a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/OCRPredictorNative.java b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/OCRPredictorNative.java
index 7499d4b92689645c0b1009256884733d392ff68d..1fa419e32a4cbefc27fc687b376ecc7e6a1e8a2f 100644
--- a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/OCRPredictorNative.java
+++ b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/OCRPredictorNative.java
@@ -35,12 +35,6 @@ public class OCRPredictorNative {
}
- public void release() {
- if (nativePointer != 0) {
- nativePointer = 0;
-// destory(nativePointer);
- }
- }
public ArrayList runImage(float[] inputData, int width, int height, int channels, Bitmap originalImage) {
Log.i("OCRPredictorNative", "begin to run image " + inputData.length + " " + width + " " + height);
@@ -59,11 +53,18 @@ public class OCRPredictorNative {
}
+ public void destory(){
+ if (nativePointer > 0) {
+ release(nativePointer);
+ nativePointer = 0;
+ }
+ }
+
protected native long init(String detModelPath, String recModelPath,String clsModelPath, int threadNum, String cpuMode);
protected native float[] forward(long pointer, float[] buf, float[] ddims, Bitmap originalImage);
- protected native void destory(long pointer);
+ protected native void release(long pointer);
private ArrayList postprocess(float[] raw) {
ArrayList results = new ArrayList();
diff --git a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Predictor.java b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Predictor.java
index ddf69ab481618696189a7d0d45264791267e5631..572d0b22deada648d1291091d05130d5ecf270a8 100644
--- a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Predictor.java
+++ b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Predictor.java
@@ -135,7 +135,7 @@ public class Predictor {
public void releaseModel() {
if (paddlePredictor != null) {
- paddlePredictor.release();
+ paddlePredictor.destory();
paddlePredictor = null;
}
isLoaded = false;
diff --git a/deploy/cpp_infer/CMakeLists.txt b/deploy/cpp_infer/CMakeLists.txt
index 466c2be8f79c11a9e6cf39631ef2dc5a2a213321..0f751a22ce7f848b2d7e268fb92059f9d5170cb5 100644
--- a/deploy/cpp_infer/CMakeLists.txt
+++ b/deploy/cpp_infer/CMakeLists.txt
@@ -52,20 +52,29 @@ include_directories(${OpenCV_INCLUDE_DIRS})
if (WIN32)
add_definitions("/DGOOGLE_GLOG_DLL_DECL=")
- set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /bigobj /MTd")
- set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /bigobj /MT")
- set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /bigobj /MTd")
- set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /bigobj /MT")
+ if(WITH_MKL)
+ set(FLAG_OPENMP "/openmp")
+ endif()
+ set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /bigobj /MTd ${FLAG_OPENMP}")
+ set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /bigobj /MT ${FLAG_OPENMP}")
+ set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /bigobj /MTd ${FLAG_OPENMP}")
+ set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /bigobj /MT ${FLAG_OPENMP}")
if (WITH_STATIC_LIB)
safe_set_static_flag()
add_definitions(-DSTATIC_LIB)
endif()
+ message("cmake c debug flags " ${CMAKE_C_FLAGS_DEBUG})
+ message("cmake c release flags " ${CMAKE_C_FLAGS_RELEASE})
+ message("cmake cxx debug flags " ${CMAKE_CXX_FLAGS_DEBUG})
+ message("cmake cxx release flags " ${CMAKE_CXX_FLAGS_RELEASE})
else()
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -o3 -std=c++11")
+ if(WITH_MKL)
+ set(FLAG_OPENMP "-fopenmp")
+ endif()
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -o3 ${FLAG_OPENMP} -std=c++11")
set(CMAKE_STATIC_LIBRARY_PREFIX "")
+ message("cmake cxx flags" ${CMAKE_CXX_FLAGS})
endif()
-message("flags" ${CMAKE_CXX_FLAGS})
-
if (WITH_GPU)
if (NOT DEFINED CUDA_LIB OR ${CUDA_LIB} STREQUAL "")
@@ -198,4 +207,4 @@ if (WIN32 AND WITH_MKL)
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_LIB}/third_party/install/mklml/lib/libiomp5md.dll ./release/libiomp5md.dll
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_LIB}/third_party/install/mkldnn/lib/mkldnn.dll ./release/mkldnn.dll
)
-endif()
\ No newline at end of file
+endif()
diff --git a/deploy/cpp_infer/include/preprocess_op.h b/deploy/cpp_infer/include/preprocess_op.h
index 5cbc5cd7134238c4f09f536ca6b1153d2d703023..bda7d1230fdc11c3b1a7d99130df755d26895de8 100644
--- a/deploy/cpp_infer/include/preprocess_op.h
+++ b/deploy/cpp_infer/include/preprocess_op.h
@@ -59,7 +59,7 @@ public:
class ClsResizeImg {
public:
virtual void Run(const cv::Mat &img, cv::Mat &resize_img,
- const std::vector &rec_image_shape = {3, 32, 320});
+ const std::vector &rec_image_shape = {3, 48, 192});
};
} // namespace PaddleOCR
\ No newline at end of file
diff --git a/deploy/cpp_infer/readme.md b/deploy/cpp_infer/readme.md
index 571ed2eb2b071574aec3cabdff01b6c9d7f17440..7296936643af87817da40592753550fed9a7c8b5 100644
--- a/deploy/cpp_infer/readme.md
+++ b/deploy/cpp_infer/readme.md
@@ -194,7 +194,37 @@ sh tools/run.sh
```
* 若需要使用方向分类器,则需要将`tools/config.txt`中的`use_angle_cls`参数修改为1,表示开启方向分类器的预测。
+* 更多地,tools/config.txt中的参数及解释如下。
+```
+use_gpu 0 # 是否使用GPU,1表示使用,0表示不使用
+gpu_id 0 # GPU id,使用GPU时有效
+gpu_mem 4000 # 申请的GPU内存
+cpu_math_library_num_threads 10 # CPU预测时的线程数,在机器核数充足的情况下,该值越大,预测速度越快
+use_mkldnn 1 # 是否使用mkldnn库
+use_zero_copy_run 1 # 是否使用use_zero_copy_run进行预测
+
+# det config
+max_side_len 960 # 输入图像长宽大于960时,等比例缩放图像,使得图像最长边为960
+det_db_thresh 0.3 # 用于过滤DB预测的二值化图像,设置为0.-0.3对结果影响不明显
+det_db_box_thresh 0.5 # DB后处理过滤box的阈值,如果检测存在漏框情况,可酌情减小
+det_db_unclip_ratio 1.6 # 表示文本框的紧致程度,越小则文本框更靠近文本
+det_model_dir ./inference/det_db # 检测模型inference model地址
+
+# cls config
+use_angle_cls 0 # 是否使用方向分类器,0表示不使用,1表示使用
+cls_model_dir ./inference/cls # 方向分类器inference model地址
+cls_thresh 0.9 # 方向分类器的得分阈值
+
+# rec config
+rec_model_dir ./inference/rec_crnn # 识别模型inference model地址
+char_list_file ../../ppocr/utils/ppocr_keys_v1.txt # 字典文件
+
+# show the detection results
+visualize 1 # 是否对结果进行可视化,为1时,会在当前文件夹下保存文件名为`ocr_vis.png`的预测结果。
+```
+
+* PaddleOCR也支持多语言的预测,更多细节可以参考[识别文档](../../doc/doc_ch/recognition.md)中的多语言字典与模型部分。
最终屏幕上会输出检测结果如下。
@@ -205,4 +235,4 @@ sh tools/run.sh
### 2.3 注意
-* C++预测默认未开启MKLDNN(`tools/config.txt`中的`use_mkldnn`设置为0),如果需要使用MKLDNN进行预测加速,则需要将`use_mkldnn`修改为1,同时使用最新版本的Paddle源码编译预测库。在使用MKLDNN进行CPU预测时,如果同时预测多张图像,则会出现内存泄露的问题(不打开MKLDNN则没有该问题),目前该问题正在修复中,临时解决方案为:预测多张图片时,每隔30张图片左右对识别(`CRNNRecognizer`)和检测类(`DBDetector`)重新初始化一次。
+* 在使用Paddle预测库时,推荐使用2.0.0-beta0版本的预测库。
diff --git a/deploy/cpp_infer/readme_en.md b/deploy/cpp_infer/readme_en.md
index a545b8606cda0b476b439543382d997065721892..30a6912eb919101b59dacb46127577988ca89388 100644
--- a/deploy/cpp_infer/readme_en.md
+++ b/deploy/cpp_infer/readme_en.md
@@ -202,6 +202,38 @@ sh tools/run.sh
```
* If you want to orientation classifier to correct the detected boxes, you can set `use_angle_cls` in the file `tools/config.txt` as 1 to enable the function.
+* What's more, Parameters and their meanings in `tools/config.txt` are as follows.
+
+
+```
+use_gpu 0 # Whether to use GPU, 0 means not to use, 1 means to use
+gpu_id 0 # GPU id when use_gpu is 1
+gpu_mem 4000 # GPU memory requested
+cpu_math_library_num_threads 10 # Number of threads when using CPU inference. When machine cores is enough, the large the value, the faster the inference speed
+use_mkldnn 1 # Whether to use mkdlnn library
+use_zero_copy_run 1 # Whether to use use_zero_copy_run for inference
+
+max_side_len 960 # Limit the maximum image height and width to 960
+det_db_thresh 0.3 # Used to filter the binarized image of DB prediction, setting 0.-0.3 has no obvious effect on the result
+det_db_box_thresh 0.5 # DDB post-processing filter box threshold, if there is a missing box detected, it can be reduced as appropriate
+det_db_unclip_ratio 1.6 # Indicates the compactness of the text box, the smaller the value, the closer the text box to the text
+det_model_dir ./inference/det_db # Address of detection inference model
+
+# cls config
+use_angle_cls 0 # Whether to use the direction classifier, 0 means not to use, 1 means to use
+cls_model_dir ./inference/cls # Address of direction classifier inference model
+cls_thresh 0.9 # Score threshold of the direction classifier
+
+# rec config
+rec_model_dir ./inference/rec_crnn # Address of recognition inference model
+char_list_file ../../ppocr/utils/ppocr_keys_v1.txt # dictionary file
+
+# show the detection results
+visualize 1 # Whether to visualize the results,when it is set as 1, The prediction result will be save in the image file `./ocr_vis.png`.
+```
+
+* Multi-language inference is also supported in PaddleOCR, for more details, please refer to part of multi-language dictionaries and models in [recognition tutorial](../../doc/doc_en/recognition_en.md).
+
The detection results will be shown on the screen, which is as follows.
@@ -210,6 +242,6 @@ The detection results will be shown on the screen, which is as follows.
-### 2.3 Note
+### 2.3 Notes
-* `MKLDNN` is disabled by default for C++ inference (`use_mkldnn` in `tools/config.txt` is set to 0), if you need to use MKLDNN for inference acceleration, you need to modify `use_mkldnn` to 1, and use the latest version of the Paddle source code to compile the inference library. When using MKLDNN for CPU prediction, if multiple images are predicted at the same time, there will be a memory leak problem (the problem is not present if MKLDNN is disabled). The problem is currently being fixed, and the temporary solution is: when predicting multiple pictures, Re-initialize the recognition (`CRNNRecognizer`) and detection class (`DBDetector`) every 30 pictures or so.
+* Paddle2.0.0-beta0 inference model library is recommanded for this tuturial.
diff --git a/deploy/cpp_infer/src/main.cpp b/deploy/cpp_infer/src/main.cpp
index e708a6e341e6dd5ba66abe46456e2d74a89e0cb5..4b84dbd0903b4290c8d3b2b4feeb95c3bd234fe8 100644
--- a/deploy/cpp_infer/src/main.cpp
+++ b/deploy/cpp_infer/src/main.cpp
@@ -12,6 +12,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
+#include "glog/logging.h"
+#include "omp.h"
#include "opencv2/core.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
@@ -67,6 +69,19 @@ int main(int argc, char **argv) {
config.use_mkldnn, config.use_zero_copy_run,
config.char_list_file);
+#ifdef USE_MKL
+#pragma omp parallel
+ for (auto i = 0; i < 10; i++) {
+ LOG_IF(WARNING,
+ config.cpu_math_library_num_threads != omp_get_num_threads())
+ << "WARNING! MKL is running on " << omp_get_num_threads()
+ << " threads while cpu_math_library_num_threads is set to "
+ << config.cpu_math_library_num_threads
+ << ". Possible reason could be 1. You have set omp_set_num_threads() "
+ "somewhere; 2. MKL is not linked properly";
+ }
+#endif
+
auto start = std::chrono::system_clock::now();
std::vector>> boxes;
det.Run(srcimg, boxes);
diff --git a/deploy/cpp_infer/src/ocr_cls.cpp b/deploy/cpp_infer/src/ocr_cls.cpp
index 7cdaaab40108026edffe5cb1ca53ac3972768cc6..0e92fbe54963e4257e92cf529bd8dc5882c1f5dd 100644
--- a/deploy/cpp_infer/src/ocr_cls.cpp
+++ b/deploy/cpp_infer/src/ocr_cls.cpp
@@ -21,7 +21,7 @@ cv::Mat Classifier::Run(cv::Mat &img) {
img.copyTo(src_img);
cv::Mat resize_img;
- std::vector rec_image_shape = {3, 32, 100};
+ std::vector rec_image_shape = {3, 48, 192};
int index = 0;
float wh_ratio = float(img.cols) / float(img.rows);
diff --git a/deploy/cpp_infer/src/preprocess_op.cpp b/deploy/cpp_infer/src/preprocess_op.cpp
index b44e9d022f2dcfb390cb28a7f34e0ba4b031832d..1d3e31a14888969b0b56398bdcb9925d03e91cfe 100644
--- a/deploy/cpp_infer/src/preprocess_op.cpp
+++ b/deploy/cpp_infer/src/preprocess_op.cpp
@@ -85,10 +85,10 @@ void ResizeImgType0::Run(const cv::Mat &img, cv::Mat &resize_img,
if (resize_w % 32 == 0)
resize_w = resize_w;
- else if (resize_w / 32 < 1)
+ else if (resize_w / 32 < 1 + 1e-5)
resize_w = 32;
else
- resize_w = (resize_w / 32 - 1) * 32;
+ resize_w = resize_w / 32 * 32;
cv::resize(img, resize_img, cv::Size(resize_w, resize_h));
@@ -138,4 +138,4 @@ void ClsResizeImg::Run(const cv::Mat &img, cv::Mat &resize_img,
}
}
-} // namespace PaddleOCR
\ No newline at end of file
+} // namespace PaddleOCR
diff --git a/deploy/docker/hubserving/README.md b/deploy/docker/hubserving/README.md
index 62381073d4c7448f9a238ca4dda4b294ce864f7a..c4bb1413db42ff40c9c99d76b86364e73a71e561 100644
--- a/deploy/docker/hubserving/README.md
+++ b/deploy/docker/hubserving/README.md
@@ -20,7 +20,7 @@ git clone https://github.com/PaddlePaddle/PaddleOCR.git
```
b. Goto Dockerfile directory(ps:Need to distinguish between cpu and gpu version, the following takes cpu as an example, gpu version needs to replace the keyword)
```
-cd deploy/docker/cpu
+cd deploy/docker/hubserving/cpu
```
c. Build image
```
diff --git a/deploy/docker/hubserving/README_cn.md b/deploy/docker/hubserving/README_cn.md
index f117a0ab4186fea0cb94881c65b2b353bee37ff7..d13dab6b15ec283a328b67c6cbe716d75b42ce8d 100644
--- a/deploy/docker/hubserving/README_cn.md
+++ b/deploy/docker/hubserving/README_cn.md
@@ -20,7 +20,7 @@ git clone https://github.com/PaddlePaddle/PaddleOCR.git
```
b.切换至Dockerfile目录(注:需要区分cpu或gpu版本,下文以cpu为例,gpu版本需要替换一下关键字即可)
```
-cd deploy/docker/cpu
+cd deploy/docker/hubserving/cpu
```
c.生成镜像
```
diff --git a/deploy/docker/hubserving/cpu/Dockerfile b/deploy/docker/hubserving/cpu/Dockerfile
index 8404b4c007731fa02816aecfefc2fe3cd7da7c73..21bb41d38f2ddc60da85ee2ad39e8a500334ec6f 100755
--- a/deploy/docker/hubserving/cpu/Dockerfile
+++ b/deploy/docker/hubserving/cpu/Dockerfile
@@ -8,21 +8,25 @@ RUN python3.7 -m pip install paddlepaddle==1.7.2 -i https://pypi.tuna.tsinghua.e
RUN pip3.7 install paddlehub --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple
-RUN git clone https://gitee.com/PaddlePaddle/PaddleOCR
+RUN git clone https://gitee.com/paddlepaddle/PaddleOCR.git /PaddleOCR
WORKDIR /PaddleOCR
-RUN pip3.7 install -r requirments.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
+RUN pip3.7 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
-RUN mkdir -p /PaddleOCR/inference
-# Download orc detect model(light version). if you want to change normal version, you can change ch_det_mv3_db_infer to ch_det_r50_vd_db_infer, also remember change det_model_dir in deploy/hubserving/ocr_system/params.py)
-ADD https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db_infer.tar /PaddleOCR/inference
-RUN tar xf /PaddleOCR/inference/ch_det_mv3_db_infer.tar -C /PaddleOCR/inference
+RUN mkdir -p /PaddleOCR/inference/
+# Download orc detect model(light version). if you want to change normal version, you can change ch_ppocr_mobile_v1.1_det_infer to ch_ppocr_server_v1.1_det_infer, also remember change det_model_dir in deploy/hubserving/ocr_system/params.py)
+ADD https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar /PaddleOCR/inference/
+RUN tar xf /PaddleOCR/inference/ch_ppocr_mobile_v1.1_det_infer.tar -C /PaddleOCR/inference/
-# Download orc recognition model(light version). If you want to change normal version, you can change ch_rec_mv3_crnn_infer to ch_rec_r34_vd_crnn_enhance_infer, also remember change rec_model_dir in deploy/hubserving/ocr_system/params.py)
-ADD https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_infer.tar /PaddleOCR/inference
-RUN tar xf /PaddleOCR/inference/ch_rec_mv3_crnn_infer.tar -C /PaddleOCR/inference
+# Download direction classifier(light version). If you want to change normal version, you can change ch_ppocr_mobile_v1.1_cls_infer to ch_ppocr_mobile_v1.1_cls_infer, also remember change cls_model_dir in deploy/hubserving/ocr_system/params.py)
+ADD https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar /PaddleOCR/inference/
+RUN tar xf /PaddleOCR/inference/ch_ppocr_mobile_v1.1_cls_infer.tar -C /PaddleOCR/inference/
+
+# Download orc recognition model(light version). If you want to change normal version, you can change ch_ppocr_mobile_v1.1_rec_infer to ch_ppocr_server_v1.1_rec_infer, also remember change rec_model_dir in deploy/hubserving/ocr_system/params.py)
+ADD https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_infer.tar /PaddleOCR/inference/
+RUN tar xf /PaddleOCR/inference/ch_ppocr_mobile_v1.1_rec_infer.tar -C /PaddleOCR/inference/
EXPOSE 8866
-CMD ["/bin/bash","-c","export PYTHONPATH=. && hub install deploy/hubserving/ocr_system/ && hub serving start -m ocr_system"]
\ No newline at end of file
+CMD ["/bin/bash","-c","hub install deploy/hubserving/ocr_system/ && hub serving start -m ocr_system"]
\ No newline at end of file
diff --git a/deploy/docker/hubserving/gpu/Dockerfile b/deploy/docker/hubserving/gpu/Dockerfile
index 1320a7f34b05ee470fa2bcf30548295f11427237..f0c81140732145d371dc638a7b00ee22d38b59f7 100755
--- a/deploy/docker/hubserving/gpu/Dockerfile
+++ b/deploy/docker/hubserving/gpu/Dockerfile
@@ -8,21 +8,25 @@ RUN python3.7 -m pip install paddlepaddle-gpu==1.7.2.post107 -i https://pypi.tun
RUN pip3.7 install paddlehub --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple
-RUN git clone https://gitee.com/PaddlePaddle/PaddleOCR
+RUN git clone https://gitee.com/paddlepaddle/PaddleOCR.git /PaddleOCR
-WORKDIR /home/PaddleOCR
+WORKDIR /PaddleOCR
-RUN pip3.7 install -r requirments.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
+RUN pip3.7 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
-RUN mkdir -p /PaddleOCR/inference
-# Download orc detect model(light version). if you want to change normal version, you can change ch_det_mv3_db_infer to ch_det_r50_vd_db_infer, also remember change det_model_dir in deploy/hubserving/ocr_system/params.py)
-ADD https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db_infer.tar /PaddleOCR/inference
-RUN tar xf /PaddleOCR/inference/ch_det_mv3_db_infer.tar -C /PaddleOCR/inference
+RUN mkdir -p /PaddleOCR/inference/
+# Download orc detect model(light version). if you want to change normal version, you can change ch_ppocr_mobile_v1.1_det_infer to ch_ppocr_server_v1.1_det_infer, also remember change det_model_dir in deploy/hubserving/ocr_system/params.py)
+ADD https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar /PaddleOCR/inference/
+RUN tar xf /PaddleOCR/inference/ch_ppocr_mobile_v1.1_det_infer.tar -C /PaddleOCR/inference/
-# Download orc recognition model(light version). If you want to change normal version, you can change ch_rec_mv3_crnn_infer to ch_rec_r34_vd_crnn_enhance_infer, also remember change rec_model_dir in deploy/hubserving/ocr_system/params.py)
-ADD https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_infer.tar /PaddleOCR/inference
-RUN tar xf /PaddleOCR/inference/ch_rec_mv3_crnn_infer.tar -C /PaddleOCR/inference
+# Download direction classifier(light version). If you want to change normal version, you can change ch_ppocr_mobile_v1.1_cls_infer to ch_ppocr_mobile_v1.1_cls_infer, also remember change cls_model_dir in deploy/hubserving/ocr_system/params.py)
+ADD https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar /PaddleOCR/inference/
+RUN tar xf /PaddleOCR/inference/ch_ppocr_mobile_v1.1_cls_infer.tar -C /PaddleOCR/inference/
+
+# Download orc recognition model(light version). If you want to change normal version, you can change ch_ppocr_mobile_v1.1_rec_infer to ch_ppocr_server_v1.1_rec_infer, also remember change rec_model_dir in deploy/hubserving/ocr_system/params.py)
+ADD https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_infer.tar /PaddleOCR/inference/
+RUN tar xf /PaddleOCR/inference/ch_ppocr_mobile_v1.1_rec_infer.tar -C /PaddleOCR/inference/
EXPOSE 8866
-CMD ["/bin/bash","-c","export PYTHONPATH=. && hub install deploy/hubserving/ocr_system/ && hub serving start -m ocr_system"]
\ No newline at end of file
+CMD ["/bin/bash","-c","hub install deploy/hubserving/ocr_system/ && hub serving start -m ocr_system"]
\ No newline at end of file
diff --git a/deploy/hubserving/ocr_det/module.py b/deploy/hubserving/ocr_det/module.py
index be74306dacf4a3648e3227f11227e6399e6ed2eb..d2cecaa475961e273b7dfcf68e9a0a991b21a69e 100644
--- a/deploy/hubserving/ocr_det/module.py
+++ b/deploy/hubserving/ocr_det/module.py
@@ -3,11 +3,14 @@ from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
+import os
+import sys
+sys.path.insert(0, ".")
+
import argparse
import ast
import copy
import math
-import os
import time
from paddle.fluid.core import AnalysisConfig, create_paddle_predictor, PaddleTensor
@@ -67,9 +70,7 @@ class OCRDet(hub.Module):
images.append(img)
return images
- def predict(self,
- images=[],
- paths=[]):
+ def predict(self, images=[], paths=[]):
"""
Get the text box in the predicted images.
Args:
@@ -87,7 +88,7 @@ class OCRDet(hub.Module):
raise TypeError("The input data is inconsistent with expectations.")
assert predicted_data != [], "There is not any image to be predicted. Please check the input data."
-
+
all_results = []
for img in predicted_data:
if img is None:
@@ -99,11 +100,9 @@ class OCRDet(hub.Module):
rec_res_final = []
for dno in range(len(dt_boxes)):
- rec_res_final.append(
- {
- 'text_region': dt_boxes[dno].astype(np.int).tolist()
- }
- )
+ rec_res_final.append({
+ 'text_region': dt_boxes[dno].astype(np.int).tolist()
+ })
all_results.append(rec_res_final)
return all_results
@@ -116,7 +115,7 @@ class OCRDet(hub.Module):
results = self.predict(images_decode, **kwargs)
return results
-
+
if __name__ == '__main__':
ocr = OCRDet()
image_path = [
@@ -124,4 +123,4 @@ if __name__ == '__main__':
'./doc/imgs/12.jpg',
]
res = ocr.predict(paths=image_path)
- print(res)
\ No newline at end of file
+ print(res)
diff --git a/deploy/hubserving/ocr_det/params.py b/deploy/hubserving/ocr_det/params.py
index f37993a10b85097b11e38bbb2efe25c649bec8d0..865c5288305435d94f66f744f67504b57189ac6e 100644
--- a/deploy/hubserving/ocr_det/params.py
+++ b/deploy/hubserving/ocr_det/params.py
@@ -37,5 +37,6 @@ def read_params():
# cfg.use_space_char = True
cfg.use_zero_copy_run = False
+ cfg.use_pdserving = False
return cfg
diff --git a/deploy/hubserving/ocr_rec/module.py b/deploy/hubserving/ocr_rec/module.py
index 846f5437fe3b0a5136bff6c902481f888558d594..e2d0bfdda3cf10dd425b09eaf41f48b43592d921 100644
--- a/deploy/hubserving/ocr_rec/module.py
+++ b/deploy/hubserving/ocr_rec/module.py
@@ -3,11 +3,14 @@ from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
+import os
+import sys
+sys.path.insert(0, ".")
+
import argparse
import ast
import copy
import math
-import os
import time
from paddle.fluid.core import AnalysisConfig, create_paddle_predictor, PaddleTensor
@@ -67,9 +70,7 @@ class OCRRec(hub.Module):
images.append(img)
return images
- def predict(self,
- images=[],
- paths=[]):
+ def predict(self, images=[], paths=[]):
"""
Get the text box in the predicted images.
Args:
@@ -87,31 +88,28 @@ class OCRRec(hub.Module):
raise TypeError("The input data is inconsistent with expectations.")
assert predicted_data != [], "There is not any image to be predicted. Please check the input data."
-
+
img_list = []
for img in predicted_data:
if img is None:
continue
img_list.append(img)
-
+
rec_res_final = []
try:
rec_res, predict_time = self.text_recognizer(img_list)
for dno in range(len(rec_res)):
text, score = rec_res[dno]
- rec_res_final.append(
- {
- 'text': text,
- 'confidence': float(score),
- }
- )
+ rec_res_final.append({
+ 'text': text,
+ 'confidence': float(score),
+ })
except Exception as e:
print(e)
return [[]]
return [rec_res_final]
-
@serving
def serving_method(self, images, **kwargs):
"""
@@ -121,7 +119,7 @@ class OCRRec(hub.Module):
results = self.predict(images_decode, **kwargs)
return results
-
+
if __name__ == '__main__':
ocr = OCRRec()
image_path = [
@@ -130,4 +128,4 @@ if __name__ == '__main__':
'./doc/imgs_words/ch/word_3.jpg',
]
res = ocr.predict(paths=image_path)
- print(res)
\ No newline at end of file
+ print(res)
diff --git a/deploy/hubserving/ocr_rec/params.py b/deploy/hubserving/ocr_rec/params.py
index 58a8bc119e2a54ad78446bd616eeb7a9089a6084..284ca640f2ddddadd69767c46654050097981b75 100644
--- a/deploy/hubserving/ocr_rec/params.py
+++ b/deploy/hubserving/ocr_rec/params.py
@@ -38,6 +38,15 @@ def read_params():
cfg.rec_char_dict_path = "./ppocr/utils/ppocr_keys_v1.txt"
cfg.use_space_char = True
+ #params for text classifier
+ cfg.use_angle_cls = True
+ cfg.cls_model_dir = "./inference/ch_ppocr_mobile_v1.1_cls_infer/"
+ cfg.cls_image_shape = "3, 48, 192"
+ cfg.label_list = ['0', '180']
+ cfg.cls_batch_num = 30
+ cfg.cls_thresh = 0.9
+
cfg.use_zero_copy_run = False
+ cfg.use_pdserving = False
return cfg
diff --git a/deploy/hubserving/ocr_system/module.py b/deploy/hubserving/ocr_system/module.py
index cb526e1185d8eb623af84ba2451ff38523bbf642..a959fc0e063597acda3d6a6f0d5828b73db0be2e 100644
--- a/deploy/hubserving/ocr_system/module.py
+++ b/deploy/hubserving/ocr_system/module.py
@@ -3,11 +3,14 @@ from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
+import os
+import sys
+sys.path.insert(0, ".")
+
import argparse
import ast
import copy
import math
-import os
import time
from paddle.fluid.core import AnalysisConfig, create_paddle_predictor, PaddleTensor
@@ -52,7 +55,7 @@ class OCRSystem(hub.Module):
)
cfg.ir_optim = True
cfg.enable_mkldnn = enable_mkldnn
-
+
self.text_sys = TextSystem(cfg)
def read_images(self, paths=[]):
@@ -67,9 +70,7 @@ class OCRSystem(hub.Module):
images.append(img)
return images
- def predict(self,
- images=[],
- paths=[]):
+ def predict(self, images=[], paths=[]):
"""
Get the chinese texts in the predicted images.
Args:
@@ -104,13 +105,11 @@ class OCRSystem(hub.Module):
for dno in range(dt_num):
text, score = rec_res[dno]
- rec_res_final.append(
- {
- 'text': text,
- 'confidence': float(score),
- 'text_region': dt_boxes[dno].astype(np.int).tolist()
- }
- )
+ rec_res_final.append({
+ 'text': text,
+ 'confidence': float(score),
+ 'text_region': dt_boxes[dno].astype(np.int).tolist()
+ })
all_results.append(rec_res_final)
return all_results
@@ -123,7 +122,7 @@ class OCRSystem(hub.Module):
results = self.predict(images_decode, **kwargs)
return results
-
+
if __name__ == '__main__':
ocr = OCRSystem()
image_path = [
@@ -131,4 +130,4 @@ if __name__ == '__main__':
'./doc/imgs/12.jpg',
]
res = ocr.predict(paths=image_path)
- print(res)
\ No newline at end of file
+ print(res)
diff --git a/deploy/hubserving/ocr_system/params.py b/deploy/hubserving/ocr_system/params.py
index d83fe692dca7c94c7225a1aa26e782765e665bdd..434a49ff4077df550037a711050e9f6b6501dfa1 100644
--- a/deploy/hubserving/ocr_system/params.py
+++ b/deploy/hubserving/ocr_system/params.py
@@ -39,12 +39,14 @@ def read_params():
cfg.use_space_char = True
#params for text classifier
- cfg.use_angle_cls = False
- cfg.cls_model_dir = "./inference/ch_ppocr_mobile-v1.1.cls_infer/"
+ cfg.use_angle_cls = True
+ cfg.cls_model_dir = "./inference/ch_ppocr_mobile_v1.1_cls_infer/"
cfg.cls_image_shape = "3, 48, 192"
cfg.label_list = ['0', '180']
cfg.cls_batch_num = 30
+ cfg.cls_thresh = 0.9
cfg.use_zero_copy_run = False
+ cfg.use_pdserving = False
return cfg
diff --git a/deploy/hubserving/readme.md b/deploy/hubserving/readme.md
index 5d29b432ba3d4c098872431c9b5fde13f553eee0..9e87dd135256546f223492cbc7ab7ab8cde83d58 100644
--- a/deploy/hubserving/readme.md
+++ b/deploy/hubserving/readme.md
@@ -1,8 +1,8 @@
[English](readme_en.md) | 简体中文
PaddleOCR提供2种服务部署方式:
-- 基于PaddleHub Serving的部署:代码路径为"`./deploy/hubserving`",按照本教程使用;
-- 基于PaddleServing的部署:代码路径为"`./deploy/pdserving`",使用方法参考[文档](../pdserving/readme.md)。
+- 基于PaddleHub Serving的部署:代码路径为"`./deploy/hubserving`",按照本教程使用;
+- 基于PaddleServing的部署:代码路径为"`./deploy/pdserving`",使用方法参考[文档](../../deploy/pdserving/readme.md)。
# 基于PaddleHub Serving的服务部署
@@ -29,17 +29,15 @@ deploy/hubserving/ocr_system/
```shell
# 安装paddlehub
pip3 install paddlehub --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple
-
-# 在Linux下设置环境变量
-export PYTHONPATH=.
-
-# 或者,在Windows下设置环境变量
-SET PYTHONPATH=.
```
### 2. 下载推理模型
-安装服务模块前,需要准备推理模型并放到正确路径。默认使用的是v1.1版的超轻量模型,默认检测模型路径为:
-`./inference/ch_ppocr_mobile_v1.1_det_infer/`,识别模型路径为:`./inference/ch_ppocr_mobile_v1.1_rec_infer/`。
+安装服务模块前,需要准备推理模型并放到正确路径。默认使用的是v1.1版的超轻量模型,默认模型路径为:
+```
+检测模型:./inference/ch_ppocr_mobile_v1.1_det_infer/
+识别模型:./inference/ch_ppocr_mobile_v1.1_rec_infer/
+方向分类器:./inference/ch_ppocr_mobile_v1.1_cls_infer/
+```
**模型路径可在`params.py`中查看和修改。** 更多模型可以从PaddleOCR提供的[模型库](../../doc/doc_ch/models_list.md)下载,也可以替换成自己训练转换好的模型。
@@ -173,7 +171,7 @@ hub serving start -c deploy/hubserving/ocr_system/config.json
```hub serving stop --port/-p XXXX```
- 2、 到相应的`module.py`和`params.py`等文件中根据实际需求修改代码。
-例如,如果需要替换部署服务所用模型,则需要到`params.py`中修改模型路径参数`det_model_dir`和`rec_model_dir`,当然,同时可能还需要修改其他相关参数,请根据实际情况修改调试。 **强烈建议修改后先直接运行`module.py`调试,能正确运行预测后再启动服务测试。**
+例如,如果需要替换部署服务所用模型,则需要到`params.py`中修改模型路径参数`det_model_dir`和`rec_model_dir`,如果需要关闭文本方向分类器,则将参数`use_angle_cls`置为`False`,当然,同时可能还需要修改其他相关参数,请根据实际情况修改调试。 **强烈建议修改后先直接运行`module.py`调试,能正确运行预测后再启动服务测试。**
- 3、 卸载旧服务包
```hub uninstall ocr_system```
diff --git a/deploy/hubserving/readme_en.md b/deploy/hubserving/readme_en.md
index efef1cda6dd5a91d6ad2f7db27061418fa24e105..6a8da865a1bcb5564a4a8694bbbff0f4a4f75850 100644
--- a/deploy/hubserving/readme_en.md
+++ b/deploy/hubserving/readme_en.md
@@ -1,8 +1,8 @@
English | [简体中文](readme.md)
-PaddleOCR provides 2 service deployment methods:
-- Based on **PaddleHub Serving**: Code path is "`./deploy/hubserving`". Please follow this tutorial.
-- Based on **PaddleServing**: Code path is "`./deploy/pdserving`". Please refer to the [tutorial](../pdserving/readme_en.md) for usage.
+PaddleOCR provides 2 service deployment methods:
+- Based on **PaddleHub Serving**: Code path is "`./deploy/hubserving`". Please follow this tutorial.
+- Based on **PaddleServing**: Code path is "`./deploy/pdserving`". Please refer to the [tutorial](../../deploy/pdserving/readme.md) for usage.
# Service deployment based on PaddleHub Serving
@@ -30,16 +30,15 @@ The following steps take the 2-stage series service as an example. If only the d
```shell
# Install paddlehub
pip3 install paddlehub --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple
-
-# Set environment variables on Linux
-export PYTHONPATH=.
-
-# Set environment variables on Windows
-SET PYTHONPATH=.
```
### 2. Download inference model
-Before installing the service module, you need to prepare the inference model and put it in the correct path. By default, the ultra lightweight model of v1.1 is used, and the default detection model path is: `./inference/ch_ppocr_mobile_v1.1_det_infer/`, the default recognition model path is: `./inference/ch_ppocr_mobile_v1.1_rec_infer/`.
+Before installing the service module, you need to prepare the inference model and put it in the correct path. By default, the ultra lightweight model of v1.1 is used, and the default model path is:
+```
+detection model: ./inference/ch_ppocr_mobile_v1.1_det_infer/
+recognition model: ./inference/ch_ppocr_mobile_v1.1_rec_infer/
+text direction classifier: ./inference/ch_ppocr_mobile_v1.1_cls_infer/
+```
**The model path can be found and modified in `params.py`.** More models provided by PaddleOCR can be obtained from the [model library](../../doc/doc_en/models_list_en.md). You can also use models trained by yourself.
@@ -180,7 +179,7 @@ If you need to modify the service logic, the following steps are generally requi
hub serving stop --port/-p XXXX
```
- 2. Modify the code in the corresponding files, like `module.py` and `params.py`, according to the actual needs.
-For example, if you need to replace the model used by the deployed service, you need to modify model path parameters `det_model_dir` and `rec_model_dir` in `params.py`. Of course, other related parameters may need to be modified at the same time. Please modify and debug according to the actual situation. It is suggested to run `module.py` directly for debugging after modification before starting the service test.
+For example, if you need to replace the model used by the deployed service, you need to modify model path parameters `det_model_dir` and `rec_model_dir` in `params.py`. If you want to turn off the text direction classifier, set the parameter `use_angle_cls` to `False`. Of course, other related parameters may need to be modified at the same time. Please modify and debug according to the actual situation. It is suggested to run `module.py` directly for debugging after modification before starting the service test.
- 3. Uninstall old service module
```shell
hub uninstall ocr_system
diff --git a/deploy/lite/cls_process.cc b/deploy/lite/cls_process.cc
index f522e4bc5a9050c981a91bcbd8dfefd719f034c2..9f5c3e9406cfe82fd1ded523d88890b6448ad5f1 100644
--- a/deploy/lite/cls_process.cc
+++ b/deploy/lite/cls_process.cc
@@ -17,7 +17,7 @@
#include
#include
-const std::vector rec_image_shape{3, 32, 100};
+const std::vector rec_image_shape{3, 48, 192};
cv::Mat ClsResizeImg(cv::Mat img) {
int imgC, imgH, imgW;
diff --git a/deploy/lite/config.txt b/deploy/lite/config.txt
index f08f8e49dfe45ab0f4e47c994d471e0515771df6..670b2ff00efd7bd289c34c460df4582dd72a2df6 100644
--- a/deploy/lite/config.txt
+++ b/deploy/lite/config.txt
@@ -1,4 +1,5 @@
max_side_len 960
det_db_thresh 0.3
det_db_box_thresh 0.5
-det_db_unclip_ratio 1.6
\ No newline at end of file
+det_db_unclip_ratio 1.6
+use_direction_classify 0
\ No newline at end of file
diff --git a/deploy/lite/db_post_process.cc b/deploy/lite/db_post_process.cc
index 495016bc7df5e2a901983fa8d78aecbc471f1166..0c1c8b9278a1f74857a8848a1ad6d7606e8d6415 100644
--- a/deploy/lite/db_post_process.cc
+++ b/deploy/lite/db_post_process.cc
@@ -112,7 +112,7 @@ OrderPointsClockwise(std::vector> pts) {
}
std::vector> GetMiniBoxes(cv::RotatedRect box, float &ssid) {
- ssid = std::max(box.size.width, box.size.height);
+ ssid = std::min(box.size.width, box.size.height);
cv::Mat points;
cv::boxPoints(box, points);
diff --git a/deploy/lite/ocr_db_crnn.cc b/deploy/lite/ocr_db_crnn.cc
index 07bec2c6f8fc02936b6c69d472984735c7b541cb..cc06ce86b896699444b08869a1b2303d5494f4b2 100644
--- a/deploy/lite/ocr_db_crnn.cc
+++ b/deploy/lite/ocr_db_crnn.cc
@@ -107,13 +107,14 @@ cv::Mat DetResizeImg(const cv::Mat img, int max_size_len,
}
cv::Mat RunClsModel(cv::Mat img, std::shared_ptr predictor_cls,
- const float thresh = 0.5) {
+ const float thresh = 0.9) {
std::vector mean = {0.5f, 0.5f, 0.5f};
std::vector scale = {1 / 0.5f, 1 / 0.5f, 1 / 0.5f};
cv::Mat srcimg;
img.copyTo(srcimg);
cv::Mat crop_img;
+ img.copyTo(crop_img);
cv::Mat resize_img;
int index = 0;
@@ -154,7 +155,8 @@ void RunRecModel(std::vector>> boxes, cv::Mat img,
std::vector &rec_text,
std::vector &rec_text_score,
std::vector charactor_dict,
- std::shared_ptr predictor_cls) {
+ std::shared_ptr predictor_cls,
+ int use_direction_classify) {
std::vector mean = {0.5f, 0.5f, 0.5f};
std::vector scale = {1 / 0.5f, 1 / 0.5f, 1 / 0.5f};
@@ -166,7 +168,9 @@ void RunRecModel(std::vector>> boxes, cv::Mat img,
int index = 0;
for (int i = boxes.size() - 1; i >= 0; i--) {
crop_img = GetRotateCropImage(srcimg, boxes[i]);
- crop_img = RunClsModel(crop_img, predictor_cls);
+ if (use_direction_classify >= 1) {
+ crop_img = RunClsModel(crop_img, predictor_cls);
+ }
float wh_ratio =
static_cast(crop_img.cols) / static_cast(crop_img.rows);
@@ -290,7 +294,7 @@ RunDetModel(std::shared_ptr predictor, cv::Mat img,
cv::Mat bit_map;
cv::threshold(cbuf_map, bit_map, threshold, maxvalue, cv::THRESH_BINARY);
cv::Mat dilation_map;
- cv::Mat dila_ele = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(2,2));
+ cv::Mat dila_ele = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(2, 2));
cv::dilate(bit_map, dilation_map, dila_ele);
auto boxes = BoxesFromBitmap(pred_map, dilation_map, Config);
@@ -366,7 +370,8 @@ std::map LoadConfigTxt(std::string config_path) {
int main(int argc, char **argv) {
if (argc < 5) {
std::cerr << "[ERROR] usage: " << argv[0]
- << " det_model_file rec_model_file image_path\n";
+ << " det_model_file cls_model_file rec_model_file image_path "
+ "charactor_dict\n";
exit(1);
}
std::string det_model_file = argv[1];
@@ -377,6 +382,7 @@ int main(int argc, char **argv) {
//// load config from txt file
auto Config = LoadConfigTxt("./config.txt");
+ int use_direction_classify = int(Config["use_direction_classify"]);
auto start = std::chrono::system_clock::now();
@@ -392,8 +398,9 @@ int main(int argc, char **argv) {
std::vector rec_text;
std::vector rec_text_score;
+
RunRecModel(boxes, srcimg, rec_predictor, rec_text, rec_text_score,
- charactor_dict, cls_predictor);
+ charactor_dict, cls_predictor, use_direction_classify);
auto end = std::chrono::system_clock::now();
auto duration =
diff --git a/deploy/lite/readme.md b/deploy/lite/readme.md
index 219cc83fe4487400e886e47e46cb30275ba72c14..3bc6f2866ce63dc8103815cf6c9ebc772ee671af 100644
--- a/deploy/lite/readme.md
+++ b/deploy/lite/readme.md
@@ -15,10 +15,9 @@ Paddle Lite是飞桨轻量化推理引擎,为手机、IOT端提供高效推理
交叉编译环境用于编译 Paddle Lite 和 PaddleOCR 的C++ demo。
支持多种开发环境,不同开发环境的编译流程请参考对应文档。
-1. [Docker](https://paddle-lite.readthedocs.io/zh/latest/user_guides/source_compile.html#docker)
-2. [Linux](https://paddle-lite.readthedocs.io/zh/latest/user_guides/source_compile.html#android)
-3. [MAC OS](https://paddle-lite.readthedocs.io/zh/latest/user_guides/source_compile.html#id13)
-4. [Windows](https://paddle-lite.readthedocs.io/zh/latest/demo_guides/x86.html#id4)
+1. [Docker](https://paddle-lite.readthedocs.io/zh/latest/source_compile/compile_env.html#docker)
+2. [Linux](https://paddle-lite.readthedocs.io/zh/latest/source_compile/compile_env.html#linux)
+3. [MAC OS](https://paddle-lite.readthedocs.io/zh/latest/source_compile/compile_env.html#mac-os)
### 1.2 准备预测库
@@ -26,18 +25,17 @@ Paddle Lite是飞桨轻量化推理引擎,为手机、IOT端提供高效推理
- 1. 直接下载,预测库下载链接如下:
|平台|预测库下载链接|
|-|-|
- |Android|[arm7](https://paddlelite-data.bj.bcebos.com/Release/2.6.1/Android/inference_lite_lib.android.armv7.gcc.c++_static.with_extra.CV_ON.tar.gz) / [arm8](https://paddlelite-data.bj.bcebos.com/Release/2.6.1/Android/inference_lite_lib.android.armv8.gcc.c++_static.with_extra.CV_ON.tar.gz)|
- |IOS|[arm7](https://paddlelite-data.bj.bcebos.com/Release/2.6.1/iOS/inference_lite_lib.ios.armv7.with_extra.CV_ON.tar.gz) / [arm8](https://paddlelite-data.bj.bcebos.com/Release/2.6.1/iOS/inference_lite_lib.ios64.armv8.with_extra.CV_ON.tar.gz)|
- |x86(Linux)|[预测库](https://paddlelite-data.bj.bcebos.com/Release/2.6.1/X86/Linux/inference_lite_lib.x86.linux.tar.gz)|
+ |Android|[arm7](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.6.3/inference_lite_lib.android.armv7.gcc.c++_shared.with_extra.with_cv.tar.gz) / [arm8](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.6.3/inference_lite_lib.android.armv8.gcc.c++_shared.with_extra.with_cv.tar.gz)|
+ |IOS|[arm7](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.6.3/inference_lite_lib.ios.armv7.with_cv.with_extra.with_log.tiny_publish.tar.gz) / [arm8](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.6.3/inference_lite_lib.ios.armv8.with_cv.with_extra.with_log.tiny_publish.tar.gz)|
- 注:如果是从下Paddle-Lite[官网文档](https://paddle-lite.readthedocs.io/zh/latest/user_guides/release_lib.html#android-toolchain-gcc)下载的预测库,
- 注意选择`with_extra=ON,with_cv=ON`的下载链接。
+ 注:1. 上述预测库为PaddleLite 2.6.3分支编译得到,有关PaddleLite 2.6.3 详细信息可参考[链接](https://github.com/PaddlePaddle/Paddle-Lite/releases/tag/v2.6.3)。
-- 2. 编译Paddle-Lite得到预测库,Paddle-Lite的编译方式如下:
+- 2. [推荐]编译Paddle-Lite得到预测库,Paddle-Lite的编译方式如下:
```
git clone https://github.com/PaddlePaddle/Paddle-Lite.git
cd Paddle-Lite
-git checkout develop
+# 切换到Paddle-Lite release/v2.7 稳定分支
+git checkout release/v2.7
./lite/tools/build_android.sh --arch=armv8 --with_cv=ON --with_extra=ON
```
@@ -80,11 +78,17 @@ inference_lite_lib.android.armv8/
Paddle-Lite 提供了多种策略来自动优化原始的模型,其中包括量化、子图融合、混合调度、Kernel优选等方法,使用Paddle-lite的opt工具可以自动
对inference模型进行优化,优化后的模型更轻量,模型运行速度更快。
-下述表格中提供了优化好的超轻量中文模型:
+如果已经准备好了 `.nb` 结尾的模型文件,可以跳过此步骤。
-|模型简介|检测模型|识别模型|Paddle-Lite版本|
-|-|-|-|-|
-|超轻量级中文OCR opt优化模型|[下载地址](https://paddleocr.bj.bcebos.com/deploy/lite/ch_det_mv3_db_opt.nb)|[下载地址](https://paddleocr.bj.bcebos.com/deploy/lite/ch_rec_mv3_crnn_opt.nb)|develop|
+下述表格中也提供了一系列中文移动端模型:
+
+|模型版本|模型简介|模型大小|检测模型|文本方向分类模型|识别模型|Paddle-Lite版本|
+|-|-|-|-|-|-|-|
+|V1.1|超轻量中文OCR 移动端模型|8.1M|[下载地址](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_det_opt.nb)|[下载地址](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_cls_opt.nb)|[下载地址](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_rec_opt.nb)|v2.7|
+|【slim】V1.1|超轻量中文OCR 移动端模型|3.5M|[下载地址](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_det_prune_opt.nb)|[下载地址](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_cls_quant_opt.nb)|[下载地址](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_rec_quant_opt.nb)|v2.7|
+|V1.0|轻量级中文OCR 移动端模型|8.6M|[下载地址](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.0_det_opt.nb)|---|[下载地址](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.0_rec_opt.nb)|v2.7|
+
+注意:V1.1 3.0M 轻量模型是使用PaddleSlim优化后的,需要配合Paddle-Lite最新预测库使用。
如果直接使用上述表格中的模型进行部署,可略过下述步骤,直接阅读 [2.2节](#2.2与手机联调)。
@@ -95,7 +99,7 @@ Paddle-Lite 提供了多种策略来自动优化原始的模型,其中包括
# 如果准备环境时已经clone了Paddle-Lite,则不用重新clone Paddle-Lite
git clone https://github.com/PaddlePaddle/Paddle-Lite.git
cd Paddle-Lite
-git checkout develop
+git checkout release/v2.7
# 启动编译
./lite/tools/build.sh build_optimize_tool
```
@@ -121,20 +125,27 @@ cd build.opt/lite/api/
下面以PaddleOCR的超轻量中文模型为例,介绍使用编译好的opt文件完成inference模型到Paddle-Lite优化模型的转换。
```
-# 下载PaddleOCR的超轻量文inference模型,并解压
+# 【推荐】 下载PaddleOCR V1.1版本的中英文 inference模型,V1.1比1.0效果更好,模型更小
+wget https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/det/ch_ppocr_mobile_v1.1_det_prune_infer.tar && tar xf ch_ppocr_mobile_v1.1_det_prune_infer.tar
+wget https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/rec/ch_ppocr_mobile_v1.1_rec_quant_infer.tar && tar xf ch_ppocr_mobile_v1.1_rec_quant_infer.tar
+# 转换V1.1检测模型
+./opt --model_file=./ch_ppocr_mobile_v1.1_det_prune_infer/model --param_file=./ch_ppocr_mobile_v1.1_det_prune_infer/params --optimize_out=./ch_ppocr_mobile_v1.1_det_prune_opt --valid_targets=arm
+# 转换V1.1识别模型
+./opt --model_file=./ch_ppocr_mobile_v1.1_rec_quant_infer/model --param_file=./ch_ppocr_mobile_v1.1_rec_quant_infer/params --optimize_out=./ch_ppocr_mobile_v1.1_rec_quant_opt --valid_targets=arm
+
+
+# 或下载使用PaddleOCR的V1.0超轻量中英文 inference模型,解压并转换为移动端支持的模型
wget https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db_infer.tar && tar xf ch_det_mv3_db_infer.tar
wget https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_infer.tar && tar xf ch_rec_mv3_crnn_infer.tar
-
-# 转换检测模型
+# 转换V1.0检测模型
./opt --model_file=./ch_det_mv3_db/model --param_file=./ch_det_mv3_db/params --optimize_out_type=naive_buffer --optimize_out=./ch_det_mv3_db_opt --valid_targets=arm
-
-# 转换识别模型
+# 转换V1.0识别模型
./opt --model_file=./ch_rec_mv3_crnn/model --param_file=./ch_rec_mv3_crnn/params --optimize_out_type=naive_buffer --optimize_out=./ch_rec_mv3_crnn_opt --valid_targets=arm
```
-转换成功后,当前目录下会多出`ch_det_mv3_db_opt.nb`, `ch_rec_mv3_crnn_opt.nb`结尾的文件,即是转换成功的模型文件。
+转换成功后,当前目录下会多出`.nb`结尾的文件,即是转换成功的模型文件。
-注意:使用paddle-lite部署时,需要使用opt工具优化后的模型。 opt 转换的输入模型是paddle保存的inference模型
+注意:使用paddle-lite部署时,需要使用opt工具优化后的模型。 opt 工具的输入模型是paddle保存的inference模型
### 2.2 与手机联调
@@ -182,17 +193,18 @@ wget https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_infer.tar && tar
```
准备测试图像,以`PaddleOCR/doc/imgs/11.jpg`为例,将测试的图像复制到`demo/cxx/ocr/debug/`文件夹下。
- 准备lite opt工具优化后的模型文件,`ch_det_mv3_db_opt.nb,ch_rec_mv3_crnn_opt.nb`,放置在`demo/cxx/ocr/debug/`文件夹下。
+ 准备lite opt工具优化后的模型文件,比如使用`ch_ppocr_mobile_v1.1_det_prune_opt.nb,ch_ppocr_mobile_v1.1_rec_quant_opt.nb, ch_ppocr_mobile_cls_quant_opt.nb`,模型文件放置在`demo/cxx/ocr/debug/`文件夹下。
执行完成后,ocr文件夹下将有如下文件格式:
```
demo/cxx/ocr/
|-- debug/
-| |--ch_det_mv3_db_opt.nb 优化后的检测模型文件
-| |--ch_rec_mv3_crnn_opt.nb 优化后的识别模型文件
+| |--ch_ppocr_mobile_v1.1_det_prune_opt.nb 优化后的检测模型文件
+| |--ch_ppocr_mobile_v1.1_rec_quant_opt.nb 优化后的识别模型文件
+| |--ch_ppocr_mobile_cls_quant_opt.nb 优化后的文字方向分类器模型文件
| |--11.jpg 待测试图像
-| |--ppocr_keys_v1.txt 字典文件
+| |--ppocr_keys_v1.txt 中文字典文件
| |--libpaddle_light_api_shared.so C++预测库文件
| |--config.txt DB-CRNN超参数配置
|-- config.txt DB-CRNN超参数配置
@@ -202,7 +214,27 @@ demo/cxx/ocr/
|-- db_post_process.h
|-- Makefile 编译文件
|-- ocr_db_crnn.cc C++预测源文件
+```
+#### 注意:
+1. ppocr_keys_v1.txt是中文字典文件,如果使用的 nb 模型是英文数字或其他语言的模型,需要更换为对应语言的字典。
+PaddleOCR 在ppocr/utils/下存放了多种字典,包括:
+```
+dict/french_dict.txt # 法语字典
+dict/german_dict.txt # 德语字典
+ic15_dict.txt # 英文字典
+dict/japan_dict.txt # 日语字典
+dict/korean_dict.txt # 韩语字典
+ppocr_keys_v1.txt # 中文字典
+```
+
+2. `config.txt` 包含了检测器、分类器的超参数,如下:
+```
+max_side_len 960 # 输入图像长宽大于960时,等比例缩放图像,使得图像最长边为960
+det_db_thresh 0.3 # 用于过滤DB预测的二值化图像,设置为0.-0.3对结果影响不明显
+det_db_box_thresh 0.5 # DB后处理过滤box的阈值,如果检测存在漏框情况,可酌情减小
+det_db_unclip_ratio 1.6 # 表示文本框的紧致程度,越小则文本框更靠近文本
+use_direction_classify 0 # 是否使用方向分类器,0表示不使用,1表示使用
```
5. 启动调试
@@ -212,7 +244,7 @@ demo/cxx/ocr/
```
# 执行编译,得到可执行文件ocr_db_crnn
# ocr_db_crnn可执行文件的使用方式为:
- # ./ocr_db_crnn 检测模型文件 识别模型文件 测试图像路径
+ # ./ocr_db_crnn 检测模型文件 方向分类器模型文件 识别模型文件 测试图像路径 字典文件路径
make -j
# 将编译的可执行文件移动到debug文件夹中
mv ocr_db_crnn ./debug/
@@ -220,8 +252,8 @@ demo/cxx/ocr/
adb push debug /data/local/tmp/
adb shell
cd /data/local/tmp/debug
- export LD_LIBRARY_PATH=/data/local/tmp/debug:$LD_LIBRARY_PATH
- ./ocr_db_crnn ch_det_mv3_db_opt.nb ch_rec_mv3_crnn_opt.nb ./11.jpg ppocr_keys_v1.txt
+ export LD_LIBRARY_PATH=${PWD}:$LD_LIBRARY_PATH
+ ./ocr_db_crnn ch_ppocr_mobile_v1.1_det_prune_opt.nb ch_ppocr_mobile_v1.1_rec_quant_opt.nb ch_ppocr_mobile_cls_quant_opt.nb ./11.jpg ppocr_keys_v1.txt
```
如果对代码做了修改,则需要重新编译并push到手机上。
@@ -231,3 +263,14 @@ demo/cxx/ocr/
+
+
+## FAQ
+Q1:如果想更换模型怎么办,需要重新按照流程走一遍吗?
+A1:如果已经走通了上述步骤,更换模型只需要替换 .nb 模型文件即可,同时要注意字典更新
+
+Q2:换一个图测试怎么做?
+A2:替换debug下的.jpg测试图像为你想要测试的图像,adb push 到手机上即可
+
+Q3:如何封装到手机APP中?
+A3:此demo旨在提供能在手机上运行OCR的核心算法部分,PaddleOCR/deploy/android_demo是将这个demo封装到手机app的示例,供参考
diff --git a/deploy/lite/readme_en.md b/deploy/lite/readme_en.md
index bf2f4b2212bf4d362fe2127da66127ab05766668..d72e0b9ce9c71fab72e8cc7042cc0338a5fabcde 100644
--- a/deploy/lite/readme_en.md
+++ b/deploy/lite/readme_en.md
@@ -1,10 +1,10 @@
# Tutorial of PaddleOCR Mobile deployment
-This tutorial will introduce how to use paddle-lite to deploy paddleOCR ultra-lightweight Chinese and English detection models on mobile phones.
+This tutorial will introduce how to use [paddle-lite](https://github.com/PaddlePaddle/Paddle-Lite) to deploy paddleOCR ultra-lightweight Chinese and English detection models on mobile phones.
paddle-lite is a lightweight inference engine for PaddlePaddle.
-It provides efficient inference capabilities for mobile phones and IOTs,
+It provides efficient inference capabilities for mobile phones and IoTs,
and extensively integrates cross-platform hardware to provide lightweight
deployment solutions for end-side deployment issues.
@@ -14,19 +14,28 @@ deployment solutions for end-side deployment issues.
- Mobile phone (arm7 or arm8)
## 2. Build PaddleLite library
-[build for Docker](https://paddle-lite.readthedocs.io/zh/latest/user_guides/source_compile.html#docker)
-[build for Linux](https://paddle-lite.readthedocs.io/zh/latest/user_guides/source_compile.html#android)
-[build for MAC OS](https://paddle-lite.readthedocs.io/zh/latest/user_guides/source_compile.html#id13)
-[build for windows](https://paddle-lite.readthedocs.io/zh/latest/demo_guides/x86.html#id4)
+1. [Docker](https://paddle-lite.readthedocs.io/zh/latest/source_compile/compile_env.html#docker)
+2. [Linux](https://paddle-lite.readthedocs.io/zh/latest/source_compile/compile_env.html#linux)
+3. [MAC OS](https://paddle-lite.readthedocs.io/zh/latest/source_compile/compile_env.html#mac-os)
-## 3. Download prebuild library for android and ios
+## 3. Prepare prebuild library for android and ios
+### 3.1 Download prebuild library
|Platform|Prebuild library Download Link|
|-|-|
-|Android|[arm7](https://paddlelite-data.bj.bcebos.com/Release/2.6.1/Android/inference_lite_lib.android.armv7.gcc.c++_static.with_extra.CV_ON.tar.gz) / [arm8](https://paddlelite-data.bj.bcebos.com/Release/2.6.1/Android/inference_lite_lib.android.armv8.gcc.c++_static.with_extra.CV_ON.tar.gz)|
-|IOS|[arm7](https://paddlelite-data.bj.bcebos.com/Release/2.6.1/iOS/inference_lite_lib.ios.armv7.with_extra.CV_ON.tar.gz) / [arm8](https://paddlelite-data.bj.bcebos.com/Release/2.6.1/iOS/inference_lite_lib.ios64.armv8.with_extra.CV_ON.tar.gz)|
-|x86(Linux)|[预测库](https://paddlelite-data.bj.bcebos.com/Release/2.6.1/X86/Linux/inference_lite_lib.x86.linux.tar.gz)|
+|Android|[arm7](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.6.3/inference_lite_lib.android.armv7.gcc.c++_shared.with_extra.with_cv.tar.gz) / [arm8](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.6.3/inference_lite_lib.android.armv8.gcc.c++_shared.with_extra.with_cv.tar.gz)|
+|IOS|[arm7](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.6.3/inference_lite_lib.ios.armv7.with_cv.with_extra.with_log.tiny_publish.tar.gz) / [arm8](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.6.3/inference_lite_lib.ios.armv8.with_cv.with_extra.with_log.tiny_publish.tar.gz)|
+note: The above pre-build inference library is compiled from the PaddleLite `release/v2.7` branch. For more information about PaddleLite 2.6.3, please refer to [link](https://github.com/PaddlePaddle/Paddle-Lite/releases/tag/v2.6.3).
+
+### 3.2 Compile prebuild library (Recommended)
+```
+git clone https://github.com/PaddlePaddle/Paddle-Lite.git
+cd Paddle-Lite
+# checkout to Paddle-Lite release/v2.7 branch
+git checkout release/v2.7
+./lite/tools/build_android.sh --arch=armv8 --with_cv=ON --with_extra=ON
+```
The structure of the prediction library is as follows:
@@ -56,24 +65,27 @@ inference_lite_lib.android.armv8/
```
-
## 4. Inference Model Optimization
Paddle Lite provides a variety of strategies to automatically optimize the original training model, including quantization, sub-graph fusion, hybrid scheduling, Kernel optimization and so on. In order to make the optimization process more convenient and easy to use, Paddle Lite provide opt tools to automatically complete the optimization steps and output a lightweight, optimal executable model.
-If you use PaddleOCR 8.6M OCR model to deploy, you can directly download the optimized model.
+If you have prepared the model file ending in `.nb`, you can skip this step.
+The following table also provides a series of models that can be deployed on mobile phones to recognize Chinese.
+You can directly download the optimized model.
-|Introduction|Detection model|Recognition model|Paddle Lite branch |
-|-|-|-|-|
-|lightweight Chinese OCR optimized model|[Download](https://paddleocr.bj.bcebos.com/deploy/lite/ch_det_mv3_db_opt.nb)|[Download](https://paddleocr.bj.bcebos.com/deploy/lite/ch_rec_mv3_crnn_opt.nb)|develop|
+| Version | Introduction | Model size | Detection model | Text Direction model | Recognition model | Paddle Lite branch |
+| - | - | - | - | - | - | - |
+| V1.1 | extra-lightweight chinese OCR optimized model | 8.1M | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_det_opt.nb) | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_cls_opt.nb) | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_rec_opt.nb) | develop |
+| [slim] V1.1 | extra-lightweight chinese OCR optimized model | 3.5M | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_det_prune_opt.nb) | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_cls_quant_opt.nb) | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_rec_quant_opt.nb) | develop |
+| V1.0 | lightweight Chinese OCR optimized model | 8.6M | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.0_det_opt.nb) | - | [Download](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.0_rec_opt.nb) | develop |
If the model to be deployed is not in the above table, you need to follow the steps below to obtain the optimized model.
```
git clone https://github.com/PaddlePaddle/Paddle-Lite.git
cd Paddle-Lite
-git checkout develop
+git checkout release/v2.7
./lite/tools/build.sh build_optimize_tool
```
@@ -85,6 +97,14 @@ The `opt` can optimize the inference model saved by paddle.io.save_inference_mod
The usage of opt is as follows:
```
+# 【Recommend】V1.1 is better than V1.0. steps for convert V1.1 model to nb file are as follows
+wget https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/det/ch_ppocr_mobile_v1.1_det_prune_infer.tar && tar xf ch_ppocr_mobile_v1.1_det_prune_infer.tar
+wget https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/rec/ch_ppocr_mobile_v1.1_rec_quant_infer.tar && tar xf ch_ppocr_mobile_v1.1_rec_quant_infer.tar
+
+./opt --model_file=./ch_ppocr_mobile_v1.1_det_prune_infer/model --param_file=./ch_ppocr_mobile_v1.1_det_prune_infer/params --optimize_out=./ch_ppocr_mobile_v1.1_det_prune_opt --valid_targets=arm
+./opt --model_file=./ch_ppocr_mobile_v1.1_rec_quant_infer/model --param_file=./ch_ppocr_mobile_v1.1_rec_quant_infer/params --optimize_out=./ch_ppocr_mobile_v1.1_rec_quant_opt --valid_targets=arm
+
+# or use V1.0 model
wget https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db_infer.tar && tar xf ch_det_mv3_db_infer.tar
wget https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_infer.tar && tar xf ch_rec_mv3_crnn_infer.tar
@@ -93,8 +113,7 @@ wget https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_infer.tar && tar
```
-When the above code command is completed, there will be two more files `ch_det_mv3_db_opt.nb`,
-`ch_rec_mv3_crnn_opt.nb` in the current directory, which is the converted model file.
+When the above code command is completed, there will be two more files `.nb` in the current directory, which is the converted model file.
## 5. Run optimized model on Phone
@@ -153,8 +172,9 @@ The structure of the OCR demo is as follows after the above command is executed:
```
demo/cxx/ocr/
|-- debug/
-| |--ch_det_mv3_db_opt.nb Detection model
-| |--ch_rec_mv3_crnn_opt.nb Recognition model
+| |--ch_ppocr_mobile_v1.1_det_prune_opt.nb Detection model
+| |--ch_ppocr_mobile_v1.1_rec_quant_opt.nb Recognition model
+| |--ch_ppocr_mobile_cls_quant_opt.nb Text direction classification model
| |--11.jpg Image for OCR
| |--ppocr_keys_v1.txt Dictionary file
| |--libpaddle_light_api_shared.so C++ .so file
@@ -169,6 +189,28 @@ demo/cxx/ocr/
```
+#### Note:
+1. ppocr_keys_v1.txt is a Chinese dictionary file.
+If the nb model is used for English recognition or other language recognition, dictionary file should be replaced with a dictionary of the corresponding language.
+PaddleOCR provides a variety of dictionaries under ppocr/utils/, including:
+```
+dict/french_dict.txt # french
+dict/german_dict.txt # german
+ic15_dict.txt # english
+dict/japan_dict.txt # japan
+dict/korean_dict.txt # korean
+ppocr_keys_v1.txt # chinese
+```
+
+2. `config.txt` of the detector and classifier, as shown below:
+```
+max_side_len 960 # Limit the maximum image height and width to 960
+det_db_thresh 0.3 # Used to filter the binarized image of DB prediction, setting 0.-0.3 has no obvious effect on the result
+det_db_box_thresh 0.5 # DDB post-processing filter box threshold, if there is a missing box detected, it can be reduced as appropriate
+det_db_unclip_ratio 1.6 # Indicates the compactness of the text box, the smaller the value, the closer the text box to the text
+use_direction_classify 0 # Whether to use the direction classifier, 0 means not to use, 1 means to use
+```
+
5. Run Model on phone
```
@@ -180,7 +222,7 @@ adb shell
cd /data/local/tmp/debug
export LD_LIBRARY_PATH=/data/local/tmp/debug:$LD_LIBRARY_PATH
# run model
-./ocr_db_crnn ch_det_mv3_db_opt.nb ch_rec_mv3_crnn_opt.nb ./11.jpg ppocr_keys_v1.txt
+ ./ocr_db_crnn ch_ppocr_mobile_v1.1_det_prune_opt.nb ch_ppocr_mobile_v1.1_rec_quant_opt.nb ch_ppocr_mobile_cls_quant_opt.nb ./11.jpg ppocr_keys_v1.txt
```
The outputs are as follows:
@@ -188,3 +230,15 @@ The outputs are as follows:
+
+## FAQ
+
+Q1: What if I want to change the model, do I need to run it again according to the process?
+A1: If you have performed the above steps, you only need to replace the .nb model file to complete the model replacement.
+
+Q2: How to test with another picture?
+A2: Replace the .jpg test image under `./debug` with the image you want to test, and run `adb push` to push new image to the phone.
+
+Q3: How to package it into the mobile APP?
+A3: This demo aims to provide the core algorithm part that can run OCR on mobile phones. Further,
+PaddleOCR/deploy/android_demo is an example of encapsulating this demo into a mobile app for reference.
diff --git a/deploy/pdserving/clas_local_server.py b/deploy/pdserving/clas_local_server.py
new file mode 100644
index 0000000000000000000000000000000000000000..f823ae5a1f1a2e0afd5d10a94e55ee34292089f6
--- /dev/null
+++ b/deploy/pdserving/clas_local_server.py
@@ -0,0 +1,129 @@
+# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from paddle_serving_client import Client
+import cv2
+import sys
+import numpy as np
+import os
+import time
+import re
+import base64
+from tools.infer.predict_cls import TextClassifier
+from params import read_params
+
+global_args = read_params()
+if global_args.use_gpu:
+ from paddle_serving_server_gpu.web_service import WebService
+else:
+ from paddle_serving_server.web_service import WebService
+
+
+class TextClassifierHelper(TextClassifier):
+ def __init__(self, args):
+ self.cls_image_shape = [int(v) for v in args.cls_image_shape.split(",")]
+ self.cls_batch_num = args.rec_batch_num
+ self.label_list = args.label_list
+ self.cls_thresh = args.cls_thresh
+ self.fetch = [
+ "save_infer_model/scale_0.tmp_0", "save_infer_model/scale_1.tmp_0"
+ ]
+
+ def preprocess(self, img_list):
+ args = {}
+ img_num = len(img_list)
+ args["img_list"] = img_list
+ # Calculate the aspect ratio of all text bars
+ width_list = []
+ for img in img_list:
+ width_list.append(img.shape[1] / float(img.shape[0]))
+ # Sorting can speed up the cls process
+ indices = np.argsort(np.array(width_list))
+ args["indices"] = indices
+ cls_res = [['', 0.0]] * img_num
+ batch_num = self.cls_batch_num
+ predict_time = 0
+ beg_img_no, end_img_no = 0, img_num
+ norm_img_batch = []
+ max_wh_ratio = 0
+ for ino in range(beg_img_no, end_img_no):
+ h, w = img_list[indices[ino]].shape[0:2]
+ wh_ratio = w * 1.0 / h
+ max_wh_ratio = max(max_wh_ratio, wh_ratio)
+ for ino in range(beg_img_no, end_img_no):
+ norm_img = self.resize_norm_img(img_list[indices[ino]])
+ norm_img = norm_img[np.newaxis, :]
+ norm_img_batch.append(norm_img)
+ norm_img_batch = np.concatenate(norm_img_batch)
+ feed = {"image": norm_img_batch.copy()}
+ return feed, self.fetch, args
+
+ def postprocess(self, outputs, args):
+ prob_out = outputs[0]
+ label_out = outputs[1]
+ indices = args["indices"]
+ img_list = args["img_list"]
+ cls_res = [['', 0.0]] * len(label_out)
+ if len(label_out.shape) != 1:
+ prob_out, label_out = label_out, prob_out
+ for rno in range(len(label_out)):
+ label_idx = label_out[rno]
+ score = prob_out[rno][label_idx]
+ label = self.label_list[label_idx]
+ cls_res[indices[rno]] = [label, score]
+ if '180' in label and score > self.cls_thresh:
+ img_list[indices[rno]] = cv2.rotate(img_list[indices[rno]], 1)
+ return img_list, cls_res
+
+
+class OCRService(WebService):
+ def init_rec(self):
+ self.text_classifier = TextClassifierHelper(global_args)
+
+ def preprocess(self, feed=[], fetch=[]):
+ img_list = []
+ for feed_data in feed:
+ data = base64.b64decode(feed_data["image"].encode('utf8'))
+ data = np.fromstring(data, np.uint8)
+ im = cv2.imdecode(data, cv2.IMREAD_COLOR)
+ img_list.append(im)
+ feed, fetch, self.tmp_args = self.text_classifier.preprocess(img_list)
+ return feed, fetch
+
+ def postprocess(self, feed={}, fetch=[], fetch_map=None):
+ outputs = [fetch_map[x] for x in self.text_classifier.fetch]
+ for x in fetch_map.keys():
+ if ".lod" in x:
+ self.tmp_args[x] = fetch_map[x]
+ _, rec_res = self.text_classifier.postprocess(outputs, self.tmp_args)
+ res = []
+ for i in range(len(rec_res)):
+ res.append({
+ "direction": rec_res[i][0],
+ "confidence": float(rec_res[i][1])
+ })
+ return res
+
+
+if __name__ == "__main__":
+ ocr_service = OCRService(name="ocr")
+ ocr_service.load_model_config(global_args.cls_server_dir)
+ ocr_service.init_rec()
+ if global_args.use_gpu:
+ ocr_service.prepare_server(
+ workdir="workdir", port=9292, device="gpu", gpuid=0)
+ else:
+ ocr_service.prepare_server(workdir="workdir", port=9292, device="cpu")
+ ocr_service.run_debugger_service()
+ ocr_service.run_web_service()
diff --git a/deploy/pdserving/clas_rpc_server.py b/deploy/pdserving/clas_rpc_server.py
new file mode 100644
index 0000000000000000000000000000000000000000..cd480031a893d50ee795937533467ca1eba026e7
--- /dev/null
+++ b/deploy/pdserving/clas_rpc_server.py
@@ -0,0 +1,135 @@
+# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from paddle_serving_client import Client
+import cv2
+import sys
+import numpy as np
+import os
+import time
+import re
+import base64
+from tools.infer.predict_cls import TextClassifier
+from params import read_params
+
+global_args = read_params()
+if global_args.use_gpu:
+ from paddle_serving_server_gpu.web_service import WebService
+else:
+ from paddle_serving_server.web_service import WebService
+
+
+class TextClassifierHelper(TextClassifier):
+ def __init__(self, args):
+ self.cls_image_shape = [int(v) for v in args.cls_image_shape.split(",")]
+ self.cls_batch_num = args.rec_batch_num
+ self.label_list = args.label_list
+ self.cls_thresh = args.cls_thresh
+ self.fetch = [
+ "save_infer_model/scale_0.tmp_0", "save_infer_model/scale_1.tmp_0"
+ ]
+
+ def preprocess(self, img_list):
+ args = {}
+ img_num = len(img_list)
+ args["img_list"] = img_list
+ # Calculate the aspect ratio of all text bars
+ width_list = []
+ for img in img_list:
+ width_list.append(img.shape[1] / float(img.shape[0]))
+ # Sorting can speed up the cls process
+ indices = np.argsort(np.array(width_list))
+ args["indices"] = indices
+ cls_res = [['', 0.0]] * img_num
+ batch_num = self.cls_batch_num
+ predict_time = 0
+ beg_img_no, end_img_no = 0, img_num
+ norm_img_batch = []
+ max_wh_ratio = 0
+ for ino in range(beg_img_no, end_img_no):
+ h, w = img_list[indices[ino]].shape[0:2]
+ wh_ratio = w * 1.0 / h
+ max_wh_ratio = max(max_wh_ratio, wh_ratio)
+ for ino in range(beg_img_no, end_img_no):
+ norm_img = self.resize_norm_img(img_list[indices[ino]])
+ norm_img = norm_img[np.newaxis, :]
+ norm_img_batch.append(norm_img)
+ norm_img_batch = np.concatenate(norm_img_batch)
+ if img_num > 1:
+ feed = [{
+ "image": norm_img_batch[x]
+ } for x in range(norm_img_batch.shape[0])]
+ else:
+ feed = {"image": norm_img_batch[0]}
+ return feed, self.fetch, args
+
+ def postprocess(self, outputs, args):
+ prob_out = outputs[0]
+ label_out = outputs[1]
+ indices = args["indices"]
+ img_list = args["img_list"]
+ cls_res = [['', 0.0]] * len(label_out)
+ if len(label_out.shape) != 1:
+ prob_out, label_out = label_out, prob_out
+ for rno in range(len(label_out)):
+ label_idx = label_out[rno]
+ score = prob_out[rno][label_idx]
+ label = self.label_list[label_idx]
+ cls_res[indices[rno]] = [label, score]
+ if '180' in label and score > self.cls_thresh:
+ img_list[indices[rno]] = cv2.rotate(img_list[indices[rno]], 1)
+ return img_list, cls_res
+
+
+class OCRService(WebService):
+ def init_rec(self):
+ self.text_classifier = TextClassifierHelper(global_args)
+
+ def preprocess(self, feed=[], fetch=[]):
+ # TODO: to handle batch rec images
+ img_list = []
+ for feed_data in feed:
+ data = base64.b64decode(feed_data["image"].encode('utf8'))
+ data = np.fromstring(data, np.uint8)
+ im = cv2.imdecode(data, cv2.IMREAD_COLOR)
+ img_list.append(im)
+ feed, fetch, self.tmp_args = self.text_classifier.preprocess(img_list)
+ return feed, fetch
+
+ def postprocess(self, feed={}, fetch=[], fetch_map=None):
+ outputs = [fetch_map[x] for x in self.text_classifier.fetch]
+ for x in fetch_map.keys():
+ if ".lod" in x:
+ self.tmp_args[x] = fetch_map[x]
+ _, rec_res = self.text_classifier.postprocess(outputs, self.tmp_args)
+ res = []
+ for i in range(len(rec_res)):
+ res.append({
+ "direction": rec_res[i][0],
+ "confidence": float(rec_res[i][1])
+ })
+ return res
+
+
+if __name__ == "__main__":
+ ocr_service = OCRService(name="ocr")
+ ocr_service.load_model_config(global_args.cls_server_dir)
+ ocr_service.init_rec()
+ if global_args.use_gpu:
+ ocr_service.prepare_server(
+ workdir="workdir", port=9292, device="gpu", gpuid=0)
+ else:
+ ocr_service.prepare_server(workdir="workdir", port=9292, device="cpu")
+ ocr_service.run_rpc_service()
+ ocr_service.run_web_service()
diff --git a/deploy/pdserving/det_local_server.py b/deploy/pdserving/det_local_server.py
index eb7948daadd018810997bba78367e86aa3398e31..1ddb2d9a70f1304d2c3eaf047f7de986b730c86d 100644
--- a/deploy/pdserving/det_local_server.py
+++ b/deploy/pdserving/det_local_server.py
@@ -17,63 +17,93 @@ import cv2
import sys
import numpy as np
import os
-from paddle_serving_client import Client
-from paddle_serving_app.reader import Sequential, ResizeByFactor
-from paddle_serving_app.reader import Div, Normalize, Transpose
-from paddle_serving_app.reader import DBPostProcess, FilterBoxes
-if sys.argv[1] == 'gpu':
- from paddle_serving_server_gpu.web_service import WebService
-elif sys.argv[1] == 'cpu':
- from paddle_serving_server.web_service import WebService
import time
import re
import base64
+from tools.infer.predict_det import TextDetector
+from params import read_params
+
+global_args = read_params()
+if global_args.use_gpu:
+ from paddle_serving_server_gpu.web_service import WebService
+else:
+ from paddle_serving_server.web_service import WebService
-class OCRService(WebService):
+class TextDetectorHelper(TextDetector):
+ def __init__(self, args):
+ super(TextDetectorHelper, self).__init__(args)
+ if self.det_algorithm == "SAST":
+ self.fetch = [
+ "bn_f_border4.output.tmp_2", "bn_f_tco4.output.tmp_2",
+ "bn_f_tvo4.output.tmp_2", "sigmoid_0.tmp_0"
+ ]
+ elif self.det_algorithm == "EAST":
+ self.fetch = ["sigmoid_0.tmp_0", "tmp_2"]
+ elif self.det_algorithm == "DB":
+ self.fetch = ["save_infer_model/scale_0.tmp_0"]
+
+ def preprocess(self, img):
+ img = img.copy()
+ im, ratio_list = self.preprocess_op(img)
+ if im is None:
+ return None, 0
+ return {
+ "image": im.copy()
+ }, self.fetch, {
+ "ratio_list": [ratio_list],
+ "ori_im": img
+ }
+
+ def postprocess(self, outputs, args):
+ outs_dict = {}
+ if self.det_algorithm == "EAST":
+ outs_dict['f_geo'] = outputs[0]
+ outs_dict['f_score'] = outputs[1]
+ elif self.det_algorithm == 'SAST':
+ outs_dict['f_border'] = outputs[0]
+ outs_dict['f_score'] = outputs[1]
+ outs_dict['f_tco'] = outputs[2]
+ outs_dict['f_tvo'] = outputs[3]
+ else:
+ outs_dict['maps'] = outputs[0]
+ dt_boxes_list = self.postprocess_op(outs_dict, args["ratio_list"])
+ dt_boxes = dt_boxes_list[0]
+ if self.det_algorithm == "SAST" and self.det_sast_polygon:
+ dt_boxes = self.filter_tag_det_res_only_clip(dt_boxes,
+ args["ori_im"].shape)
+ else:
+ dt_boxes = self.filter_tag_det_res(dt_boxes, args["ori_im"].shape)
+ return dt_boxes
+
+
+class DetService(WebService):
def init_det(self):
- self.det_preprocess = Sequential([
- ResizeByFactor(32, 960), Div(255),
- Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]), Transpose(
- (2, 0, 1))
- ])
- self.filter_func = FilterBoxes(10, 10)
- self.post_func = DBPostProcess({
- "thresh": 0.3,
- "box_thresh": 0.5,
- "max_candidates": 1000,
- "unclip_ratio": 1.5,
- "min_size": 3
- })
+ self.text_detector = TextDetectorHelper(global_args)
def preprocess(self, feed=[], fetch=[]):
data = base64.b64decode(feed[0]["image"].encode('utf8'))
data = np.fromstring(data, np.uint8)
im = cv2.imdecode(data, cv2.IMREAD_COLOR)
- self.ori_h, self.ori_w, _ = im.shape
- det_img = self.det_preprocess(im)
- _, self.new_h, self.new_w = det_img.shape
- return {"image": det_img[np.newaxis, :].copy()}, ["concat_1.tmp_0"]
+ feed, fetch, self.tmp_args = self.text_detector.preprocess(im)
+ return feed, fetch
def postprocess(self, feed={}, fetch=[], fetch_map=None):
- det_out = fetch_map["concat_1.tmp_0"]
- ratio_list = [
- float(self.new_h) / self.ori_h, float(self.new_w) / self.ori_w
- ]
- dt_boxes_list = self.post_func(det_out, [ratio_list])
- dt_boxes = self.filter_func(dt_boxes_list[0], [self.ori_h, self.ori_w])
- return {"dt_boxes": dt_boxes.tolist()}
-
+ outputs = [fetch_map[x] for x in fetch]
+ det_res = self.text_detector.postprocess(outputs, self.tmp_args)
+ res = []
+ for i in range(len(det_res)):
+ res.append({"text_region": det_res[i].tolist()})
+ return res
-ocr_service = OCRService(name="ocr")
-ocr_service.load_model_config("ocr_det_model")
-ocr_service.init_det()
-if sys.argv[1] == 'gpu':
- ocr_service.set_gpus("0")
- ocr_service.prepare_server(workdir="workdir", port=9292, device="gpu", gpuid=0)
- ocr_service.run_debugger_service(gpu=True)
-elif sys.argv[1] == 'cpu':
- ocr_service.prepare_server(workdir="workdir", port=9292)
+if __name__ == "__main__":
+ ocr_service = DetService(name="ocr")
+ ocr_service.load_model_config(global_args.det_server_dir)
+ ocr_service.init_det()
+ if global_args.use_gpu:
+ ocr_service.prepare_server(
+ workdir="workdir", port=9292, device="gpu", gpuid=0)
+ else:
+ ocr_service.prepare_server(workdir="workdir", port=9292, device="cpu")
ocr_service.run_debugger_service()
-ocr_service.init_det()
-ocr_service.run_web_service()
+ ocr_service.run_web_service()
diff --git a/deploy/pdserving/det_rpc_server.py b/deploy/pdserving/det_rpc_server.py
new file mode 100644
index 0000000000000000000000000000000000000000..96b9493eaad7417172b84af60a6b8fe6deb7c5e2
--- /dev/null
+++ b/deploy/pdserving/det_rpc_server.py
@@ -0,0 +1,108 @@
+# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from paddle_serving_client import Client
+import cv2
+import sys
+import numpy as np
+import os
+import time
+import re
+import base64
+from tools.infer.predict_det import TextDetector
+from params import read_params
+
+global_args = read_params()
+if global_args.use_gpu:
+ from paddle_serving_server_gpu.web_service import WebService
+else:
+ from paddle_serving_server.web_service import WebService
+
+
+class TextDetectorHelper(TextDetector):
+ def __init__(self, args):
+ super(TextDetectorHelper, self).__init__(args)
+ if self.det_algorithm == "SAST":
+ self.fetch = [
+ "bn_f_border4.output.tmp_2", "bn_f_tco4.output.tmp_2",
+ "bn_f_tvo4.output.tmp_2", "sigmoid_0.tmp_0"
+ ]
+ elif self.det_algorithm == "EAST":
+ self.fetch = ["sigmoid_0.tmp_0", "tmp_2"]
+ elif self.det_algorithm == "DB":
+ self.fetch = ["save_infer_model/scale_0.tmp_0"]
+
+ def preprocess(self, img):
+ im, ratio_list = self.preprocess_op(img)
+ if im is None:
+ return None, 0
+ return {
+ "image": im[0]
+ }, self.fetch, {
+ "ratio_list": [ratio_list],
+ "ori_im": img
+ }
+
+ def postprocess(self, outputs, args):
+ outs_dict = {}
+ if self.det_algorithm == "EAST":
+ outs_dict['f_geo'] = outputs[0]
+ outs_dict['f_score'] = outputs[1]
+ elif self.det_algorithm == 'SAST':
+ outs_dict['f_border'] = outputs[0]
+ outs_dict['f_score'] = outputs[1]
+ outs_dict['f_tco'] = outputs[2]
+ outs_dict['f_tvo'] = outputs[3]
+ else:
+ outs_dict['maps'] = outputs[0]
+ dt_boxes_list = self.postprocess_op(outs_dict, args["ratio_list"])
+ dt_boxes = dt_boxes_list[0]
+ if self.det_algorithm == "SAST" and self.det_sast_polygon:
+ dt_boxes = self.filter_tag_det_res_only_clip(dt_boxes,
+ args["ori_im"].shape)
+ else:
+ dt_boxes = self.filter_tag_det_res(dt_boxes, args["ori_im"].shape)
+ return dt_boxes
+
+
+class DetService(WebService):
+ def init_det(self):
+ self.text_detector = TextDetectorHelper(global_args)
+
+ def preprocess(self, feed=[], fetch=[]):
+ data = base64.b64decode(feed[0]["image"].encode('utf8'))
+ data = np.fromstring(data, np.uint8)
+ im = cv2.imdecode(data, cv2.IMREAD_COLOR)
+ feed, fetch, self.tmp_args = self.text_detector.preprocess(im)
+ return feed, fetch
+
+ def postprocess(self, feed={}, fetch=[], fetch_map=None):
+ outputs = [fetch_map[x] for x in fetch]
+ det_res = self.text_detector.postprocess(outputs, self.tmp_args)
+ res = []
+ for i in range(len(det_res)):
+ res.append({"text_region": det_res[i].tolist()})
+ return res
+
+if __name__ == "__main__":
+ ocr_service = DetService(name="ocr")
+ ocr_service.load_model_config(global_args.det_server_dir)
+ ocr_service.init_det()
+ if global_args.use_gpu:
+ ocr_service.prepare_server(
+ workdir="workdir", port=9292, device="gpu", gpuid=0)
+ else:
+ ocr_service.prepare_server(workdir="workdir", port=9292, device="cpu")
+ ocr_service.run_rpc_service()
+ ocr_service.run_web_service()
diff --git a/deploy/pdserving/det_web_server.py b/deploy/pdserving/det_web_server.py
deleted file mode 100644
index 14be74130dcb413c31a3e76c150d74f65575f451..0000000000000000000000000000000000000000
--- a/deploy/pdserving/det_web_server.py
+++ /dev/null
@@ -1,78 +0,0 @@
-# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-from paddle_serving_client import Client
-import cv2
-import sys
-import numpy as np
-import os
-from paddle_serving_client import Client
-from paddle_serving_app.reader import Sequential, ResizeByFactor
-from paddle_serving_app.reader import Div, Normalize, Transpose
-from paddle_serving_app.reader import DBPostProcess, FilterBoxes
-if sys.argv[1] == 'gpu':
- from paddle_serving_server_gpu.web_service import WebService
-elif sys.argv[1] == 'cpu':
- from paddle_serving_server.web_service import WebService
-import time
-import re
-import base64
-
-
-class OCRService(WebService):
- def init_det(self):
- self.det_preprocess = Sequential([
- ResizeByFactor(32, 960), Div(255),
- Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]), Transpose(
- (2, 0, 1))
- ])
- self.filter_func = FilterBoxes(10, 10)
- self.post_func = DBPostProcess({
- "thresh": 0.3,
- "box_thresh": 0.5,
- "max_candidates": 1000,
- "unclip_ratio": 1.5,
- "min_size": 3
- })
-
- def preprocess(self, feed=[], fetch=[]):
- data = base64.b64decode(feed[0]["image"].encode('utf8'))
- data = np.fromstring(data, np.uint8)
- im = cv2.imdecode(data, cv2.IMREAD_COLOR)
- self.ori_h, self.ori_w, _ = im.shape
- det_img = self.det_preprocess(im)
- _, self.new_h, self.new_w = det_img.shape
- print(det_img)
- return {"image": det_img}, ["concat_1.tmp_0"]
-
- def postprocess(self, feed={}, fetch=[], fetch_map=None):
- det_out = fetch_map["concat_1.tmp_0"]
- ratio_list = [
- float(self.new_h) / self.ori_h, float(self.new_w) / self.ori_w
- ]
- dt_boxes_list = self.post_func(det_out, [ratio_list])
- dt_boxes = self.filter_func(dt_boxes_list[0], [self.ori_h, self.ori_w])
- return {"dt_boxes": dt_boxes.tolist()}
-
-
-ocr_service = OCRService(name="ocr")
-ocr_service.load_model_config("ocr_det_model")
-if sys.argv[1] == 'gpu':
- ocr_service.set_gpus("0")
- ocr_service.prepare_server(workdir="workdir", port=9292, device="gpu", gpuid=0)
-elif sys.argv[1] == 'cpu':
- ocr_service.prepare_server(workdir="workdir", port=9292, device="cpu")
-ocr_service.init_det()
-ocr_service.run_rpc_service()
-ocr_service.run_web_service()
diff --git a/deploy/pdserving/inference_to_serving.py b/deploy/pdserving/inference_to_serving.py
new file mode 100644
index 0000000000000000000000000000000000000000..76efca14d4320336b0ee6060af98ed4a1acfb5d8
--- /dev/null
+++ b/deploy/pdserving/inference_to_serving.py
@@ -0,0 +1,32 @@
+# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import os
+import argparse
+from paddle_serving_client.io import inference_model_to_serving
+def parse_args():
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--model_dir", type=str)
+ parser.add_argument("--server_dir", type=str, default="serving_server_dir")
+ parser.add_argument("--client_dir", type=str, default="serving_client_dir")
+ return parser.parse_args()
+
+args = parse_args()
+inference_model_dir = args.model_dir
+serving_server_dir = os.path.join(args.model_dir, args.server_dir)
+serving_client_dir = os.path.join(args.model_dir, args.client_dir)
+feed_var_names, fetch_var_names = inference_model_to_serving(
+ inference_model_dir, serving_server_dir, serving_client_dir, model_filename="model", params_filename="params")
+
+print("success!")
diff --git a/deploy/pdserving/ocr_local_server.py b/deploy/pdserving/ocr_local_server.py
index de5b3d13f12afd4a84c5d46625682c42f418d6bb..e838f71a6bb5470678b6d4a4839105698cab5d1b 100644
--- a/deploy/pdserving/ocr_local_server.py
+++ b/deploy/pdserving/ocr_local_server.py
@@ -13,102 +13,113 @@
# limitations under the License.
from paddle_serving_client import Client
-from paddle_serving_app.reader import OCRReader
import cv2
import sys
import numpy as np
import os
-from paddle_serving_client import Client
-from paddle_serving_app.reader import Sequential, URL2Image, ResizeByFactor
-from paddle_serving_app.reader import Div, Normalize, Transpose
-from paddle_serving_app.reader import DBPostProcess, FilterBoxes, GetRotateCropImage, SortedBoxes
-if sys.argv[1] == 'gpu':
- from paddle_serving_server_gpu.web_service import WebService
-elif sys.argv[1] == 'cpu':
- from paddle_serving_server.web_service import WebService
-from paddle_serving_app.local_predict import Debugger
import time
import re
import base64
+from clas_local_server import TextClassifierHelper
+from det_local_server import TextDetectorHelper
+from rec_local_server import TextRecognizerHelper
+from tools.infer.predict_system import TextSystem, sorted_boxes
+from paddle_serving_app.local_predict import Debugger
+import copy
+from params import read_params
+global_args = read_params()
-class OCRService(WebService):
- def init_det_debugger(self, det_model_config):
- self.det_preprocess = Sequential([
- ResizeByFactor(32, 960), Div(255),
- Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]), Transpose(
- (2, 0, 1))
- ])
+if global_args.use_gpu:
+ from paddle_serving_server_gpu.web_service import WebService
+else:
+ from paddle_serving_server.web_service import WebService
+
+
+class TextSystemHelper(TextSystem):
+ def __init__(self, args):
+ self.text_detector = TextDetectorHelper(args)
+ self.text_recognizer = TextRecognizerHelper(args)
+ self.use_angle_cls = args.use_angle_cls
+ if self.use_angle_cls:
+ self.clas_client = Debugger()
+ self.clas_client.load_model_config(
+ global_args.cls_server_dir, gpu=True, profile=False)
+ self.text_classifier = TextClassifierHelper(args)
self.det_client = Debugger()
- if sys.argv[1] == 'gpu':
- self.det_client.load_model_config(
- det_model_config, gpu=True, profile=False)
- elif sys.argv[1] == 'cpu':
- self.det_client.load_model_config(
- det_model_config, gpu=False, profile=False)
- self.ocr_reader = OCRReader()
+ self.det_client.load_model_config(
+ global_args.det_server_dir, gpu=True, profile=False)
+ self.fetch = ["save_infer_model/scale_0.tmp_0", "save_infer_model/scale_1.tmp_0"]
+
+ def preprocess(self, img):
+ feed, fetch, self.tmp_args = self.text_detector.preprocess(img)
+ fetch_map = self.det_client.predict(feed, fetch)
+ outputs = [fetch_map[x] for x in fetch]
+ dt_boxes = self.text_detector.postprocess(outputs, self.tmp_args)
+ if dt_boxes is None:
+ return None, None
+ img_crop_list = []
+ dt_boxes = sorted_boxes(dt_boxes)
+ self.dt_boxes = dt_boxes
+ for bno in range(len(dt_boxes)):
+ tmp_box = copy.deepcopy(dt_boxes[bno])
+ img_crop = self.get_rotate_crop_image(img, tmp_box)
+ img_crop_list.append(img_crop)
+ if self.use_angle_cls:
+ feed, fetch, self.tmp_args = self.text_classifier.preprocess(
+ img_crop_list)
+ fetch_map = self.clas_client.predict(feed, fetch)
+ outputs = [fetch_map[x] for x in self.text_classifier.fetch]
+ for x in fetch_map.keys():
+ if ".lod" in x:
+ self.tmp_args[x] = fetch_map[x]
+ img_crop_list, _ = self.text_classifier.postprocess(outputs,
+ self.tmp_args)
+ feed, fetch, self.tmp_args = self.text_recognizer.preprocess(
+ img_crop_list)
+ return feed, self.fetch, self.tmp_args
+
+ def postprocess(self, outputs, args):
+ return self.text_recognizer.postprocess(outputs, args)
+
+
+class OCRService(WebService):
+ def init_rec(self):
+ self.text_system = TextSystemHelper(global_args)
def preprocess(self, feed=[], fetch=[]):
+ # TODO: to handle batch rec images
data = base64.b64decode(feed[0]["image"].encode('utf8'))
data = np.fromstring(data, np.uint8)
im = cv2.imdecode(data, cv2.IMREAD_COLOR)
- ori_h, ori_w, _ = im.shape
- det_img = self.det_preprocess(im)
- _, new_h, new_w = det_img.shape
- det_img = det_img[np.newaxis, :]
- det_img = det_img.copy()
- det_out = self.det_client.predict(
- feed={"image": det_img}, fetch=["concat_1.tmp_0"])
- filter_func = FilterBoxes(10, 10)
- post_func = DBPostProcess({
- "thresh": 0.3,
- "box_thresh": 0.5,
- "max_candidates": 1000,
- "unclip_ratio": 1.5,
- "min_size": 3
- })
- sorted_boxes = SortedBoxes()
- ratio_list = [float(new_h) / ori_h, float(new_w) / ori_w]
- dt_boxes_list = post_func(det_out["concat_1.tmp_0"], [ratio_list])
- dt_boxes = filter_func(dt_boxes_list[0], [ori_h, ori_w])
- dt_boxes = sorted_boxes(dt_boxes)
- get_rotate_crop_image = GetRotateCropImage()
- img_list = []
- max_wh_ratio = 0
- for i, dtbox in enumerate(dt_boxes):
- boximg = get_rotate_crop_image(im, dt_boxes[i])
- img_list.append(boximg)
- h, w = boximg.shape[0:2]
- wh_ratio = w * 1.0 / h
- max_wh_ratio = max(max_wh_ratio, wh_ratio)
- if len(img_list) == 0:
- return [], []
- _, w, h = self.ocr_reader.resize_norm_img(img_list[0],
- max_wh_ratio).shape
- imgs = np.zeros((len(img_list), 3, w, h)).astype('float32')
- for id, img in enumerate(img_list):
- norm_img = self.ocr_reader.resize_norm_img(img, max_wh_ratio)
- imgs[id] = norm_img
- feed = {"image": imgs.copy()}
- fetch = ["ctc_greedy_decoder_0.tmp_0", "softmax_0.tmp_0"]
+ feed, fetch, self.tmp_args = self.text_system.preprocess(im)
return feed, fetch
def postprocess(self, feed={}, fetch=[], fetch_map=None):
- rec_res = self.ocr_reader.postprocess(fetch_map, with_score=True)
- res_lst = []
- for res in rec_res:
- res_lst.append(res[0])
- res = {"res": res_lst}
+ outputs = [fetch_map[x] for x in self.text_system.fetch]
+ for x in fetch_map.keys():
+ if ".lod" in x:
+ self.tmp_args[x] = fetch_map[x]
+ rec_res = self.text_system.postprocess(outputs, self.tmp_args)
+ res = []
+ for i in range(len(rec_res)):
+ tmp_res = {
+ "text_region": self.text_system.dt_boxes[i].tolist(),
+ "text": rec_res[i][0],
+ "confidence": float(rec_res[i][1])
+ }
+ res.append(tmp_res)
return res
-ocr_service = OCRService(name="ocr")
-ocr_service.load_model_config("ocr_rec_model")
-ocr_service.init_det_debugger(det_model_config="ocr_det_model")
-if sys.argv[1] == 'gpu':
- ocr_service.prepare_server(workdir="workdir", port=9292, device="gpu", gpuid=0)
- ocr_service.run_debugger_service(gpu=True)
-elif sys.argv[1] == 'cpu':
- ocr_service.prepare_server(workdir="workdir", port=9292, device="cpu")
+if __name__ == "__main__":
+ ocr_service = OCRService(name="ocr")
+ ocr_service.load_model_config(global_args.rec_server_dir)
+ ocr_service.init_rec()
+ if global_args.use_gpu:
+ ocr_service.prepare_server(
+ workdir="workdir", port=9292, device="gpu", gpuid=0)
+ else:
+ ocr_service.prepare_server(workdir="workdir", port=9292, device="cpu")
ocr_service.run_debugger_service()
-ocr_service.run_web_service()
+ ocr_service.run_web_service()
diff --git a/deploy/pdserving/ocr_rpc_server.py b/deploy/pdserving/ocr_rpc_server.py
new file mode 100644
index 0000000000000000000000000000000000000000..8fa60b8e234636b3de1bec0cc7a9e0ec4c3b962f
--- /dev/null
+++ b/deploy/pdserving/ocr_rpc_server.py
@@ -0,0 +1,127 @@
+# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from paddle_serving_client import Client
+import cv2
+import sys
+import numpy as np
+import os
+import time
+import re
+import base64
+from clas_rpc_server import TextClassifierHelper
+from det_rpc_server import TextDetectorHelper
+from rec_rpc_server import TextRecognizerHelper
+from tools.infer.predict_system import TextSystem, sorted_boxes
+import copy
+from params import read_params
+
+global_args = read_params()
+if global_args.use_gpu:
+ from paddle_serving_server_gpu.web_service import WebService
+else:
+ from paddle_serving_server.web_service import WebService
+
+
+class TextSystemHelper(TextSystem):
+ def __init__(self, args):
+ self.text_detector = TextDetectorHelper(args)
+ self.text_recognizer = TextRecognizerHelper(args)
+ self.use_angle_cls = args.use_angle_cls
+ if self.use_angle_cls:
+ self.clas_client = Client()
+ self.clas_client.load_client_config(
+ os.path.join(args.cls_client_dir, "serving_client_conf.prototxt")
+ )
+ self.clas_client.connect(["127.0.0.1:9294"])
+ self.text_classifier = TextClassifierHelper(args)
+ self.det_client = Client()
+ self.det_client.load_client_config(
+ os.path.join(args.det_client_dir, "serving_client_conf.prototxt")
+ )
+ self.det_client.connect(["127.0.0.1:9293"])
+ self.fetch = ["save_infer_model/scale_0.tmp_0", "save_infer_model/scale_1.tmp_0"]
+
+ def preprocess(self, img):
+ feed, fetch, self.tmp_args = self.text_detector.preprocess(img)
+ fetch_map = self.det_client.predict(feed, fetch)
+ outputs = [fetch_map[x] for x in fetch]
+ dt_boxes = self.text_detector.postprocess(outputs, self.tmp_args)
+ if dt_boxes is None:
+ return None, None
+ img_crop_list = []
+ dt_boxes = sorted_boxes(dt_boxes)
+ self.dt_boxes = dt_boxes
+ for bno in range(len(dt_boxes)):
+ tmp_box = copy.deepcopy(dt_boxes[bno])
+ img_crop = self.get_rotate_crop_image(img, tmp_box)
+ img_crop_list.append(img_crop)
+ if self.use_angle_cls:
+ feed, fetch, self.tmp_args = self.text_classifier.preprocess(
+ img_crop_list)
+ fetch_map = self.clas_client.predict(feed, fetch)
+ outputs = [fetch_map[x] for x in self.text_classifier.fetch]
+ for x in fetch_map.keys():
+ if ".lod" in x:
+ self.tmp_args[x] = fetch_map[x]
+ img_crop_list, _ = self.text_classifier.postprocess(outputs,
+ self.tmp_args)
+ feed, fetch, self.tmp_args = self.text_recognizer.preprocess(
+ img_crop_list)
+ return feed, self.fetch, self.tmp_args
+
+ def postprocess(self, outputs, args):
+ return self.text_recognizer.postprocess(outputs, args)
+
+
+class OCRService(WebService):
+ def init_rec(self):
+ self.text_system = TextSystemHelper(global_args)
+
+ def preprocess(self, feed=[], fetch=[]):
+ # TODO: to handle batch rec images
+ data = base64.b64decode(feed[0]["image"].encode('utf8'))
+ data = np.fromstring(data, np.uint8)
+ im = cv2.imdecode(data, cv2.IMREAD_COLOR)
+ feed, fetch, self.tmp_args = self.text_system.preprocess(im)
+ return feed, fetch
+
+ def postprocess(self, feed={}, fetch=[], fetch_map=None):
+ outputs = [fetch_map[x] for x in self.text_system.fetch]
+ for x in fetch_map.keys():
+ if ".lod" in x:
+ self.tmp_args[x] = fetch_map[x]
+ rec_res = self.text_system.postprocess(outputs, self.tmp_args)
+ res = []
+ for i in range(len(rec_res)):
+ tmp_res = {
+ "text_region": self.text_system.dt_boxes[i].tolist(),
+ "text": rec_res[i][0],
+ "confidence": float(rec_res[i][1])
+ }
+ res.append(tmp_res)
+ return res
+
+
+if __name__ == "__main__":
+ ocr_service = OCRService(name="ocr")
+ ocr_service.load_model_config(global_args.rec_server_dir)
+ ocr_service.init_rec()
+ if global_args.use_gpu:
+ ocr_service.prepare_server(
+ workdir="workdir", port=9292, device="gpu", gpuid=0)
+ else:
+ ocr_service.prepare_server(workdir="workdir", port=9292, device="cpu")
+ ocr_service.run_rpc_service()
+ ocr_service.run_web_service()
diff --git a/deploy/pdserving/ocr_web_client.py b/deploy/pdserving/ocr_web_client.py
deleted file mode 100644
index e2a92eb8ee4aa62059be184dd7e67237ed460f13..0000000000000000000000000000000000000000
--- a/deploy/pdserving/ocr_web_client.py
+++ /dev/null
@@ -1,37 +0,0 @@
-# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# -*- coding: utf-8 -*-
-
-import requests
-import json
-import cv2
-import base64
-import os, sys
-import time
-
-def cv2_to_base64(image):
- #data = cv2.imencode('.jpg', image)[1]
- return base64.b64encode(image).decode(
- 'utf8') #data.tostring()).decode('utf8')
-
-headers = {"Content-type": "application/json"}
-url = "http://127.0.0.1:9292/ocr/prediction"
-test_img_dir = "../../doc/imgs/"
-for img_file in os.listdir(test_img_dir):
- with open(os.path.join(test_img_dir, img_file), 'rb') as file:
- image_data1 = file.read()
- image = cv2_to_base64(image_data1)
- data = {"feed": [{"image": image}], "fetch": ["res"]}
- r = requests.post(url=url, headers=headers, data=json.dumps(data))
- print(r.json())
diff --git a/deploy/pdserving/ocr_web_server.py b/deploy/pdserving/ocr_web_server.py
deleted file mode 100644
index 6c0de44661958a6425f57039261969551ff552c5..0000000000000000000000000000000000000000
--- a/deploy/pdserving/ocr_web_server.py
+++ /dev/null
@@ -1,105 +0,0 @@
-# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-from paddle_serving_client import Client
-from paddle_serving_app.reader import OCRReader
-import cv2
-import sys
-import numpy as np
-import os
-from paddle_serving_client import Client
-from paddle_serving_app.reader import Sequential, URL2Image, ResizeByFactor
-from paddle_serving_app.reader import Div, Normalize, Transpose
-from paddle_serving_app.reader import DBPostProcess, FilterBoxes, GetRotateCropImage, SortedBoxes
-if sys.argv[1] == 'gpu':
- from paddle_serving_server_gpu.web_service import WebService
-elif sys.argv[1] == 'cpu':
- from paddle_serving_server.web_service import WebService
-import time
-import re
-import base64
-
-
-class OCRService(WebService):
- def init_det_client(self, det_port, det_client_config):
- self.det_preprocess = Sequential([
- ResizeByFactor(32, 960), Div(255),
- Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]), Transpose(
- (2, 0, 1))
- ])
- self.det_client = Client()
- self.det_client.load_client_config(det_client_config)
- self.det_client.connect(["127.0.0.1:{}".format(det_port)])
- self.ocr_reader = OCRReader()
-
- def preprocess(self, feed=[], fetch=[]):
- data = base64.b64decode(feed[0]["image"].encode('utf8'))
- data = np.fromstring(data, np.uint8)
- im = cv2.imdecode(data, cv2.IMREAD_COLOR)
- ori_h, ori_w, _ = im.shape
- det_img = self.det_preprocess(im)
- det_out = self.det_client.predict(
- feed={"image": det_img}, fetch=["concat_1.tmp_0"])
- _, new_h, new_w = det_img.shape
- filter_func = FilterBoxes(10, 10)
- post_func = DBPostProcess({
- "thresh": 0.3,
- "box_thresh": 0.5,
- "max_candidates": 1000,
- "unclip_ratio": 1.5,
- "min_size": 3
- })
- sorted_boxes = SortedBoxes()
- ratio_list = [float(new_h) / ori_h, float(new_w) / ori_w]
- dt_boxes_list = post_func(det_out["concat_1.tmp_0"], [ratio_list])
- dt_boxes = filter_func(dt_boxes_list[0], [ori_h, ori_w])
- dt_boxes = sorted_boxes(dt_boxes)
- get_rotate_crop_image = GetRotateCropImage()
- feed_list = []
- img_list = []
- max_wh_ratio = 0
- for i, dtbox in enumerate(dt_boxes):
- boximg = get_rotate_crop_image(im, dt_boxes[i])
- img_list.append(boximg)
- h, w = boximg.shape[0:2]
- wh_ratio = w * 1.0 / h
- max_wh_ratio = max(max_wh_ratio, wh_ratio)
- for img in img_list:
- norm_img = self.ocr_reader.resize_norm_img(img, max_wh_ratio)
- feed = {"image": norm_img}
- feed_list.append(feed)
- fetch = ["ctc_greedy_decoder_0.tmp_0", "softmax_0.tmp_0"]
- return feed_list, fetch
-
- def postprocess(self, feed={}, fetch=[], fetch_map=None):
- rec_res = self.ocr_reader.postprocess(fetch_map, with_score=True)
- res_lst = []
- for res in rec_res:
- res_lst.append(res[0])
- res = {"res": res_lst}
- return res
-
-
-ocr_service = OCRService(name="ocr")
-ocr_service.load_model_config("ocr_rec_model")
-if sys.argv[1] == 'gpu':
- ocr_service.set_gpus("0")
- ocr_service.prepare_server(workdir="workdir", port=9292, device="gpu", gpuid=0)
-elif sys.argv[1] == 'cpu':
- ocr_service.prepare_server(workdir="workdir", port=9292)
-ocr_service.init_det_client(
- det_port=9293,
- det_client_config="ocr_det_client/serving_client_conf.prototxt")
-ocr_service.run_rpc_service()
-ocr_service.run_web_service()
diff --git a/deploy/pdserving/params.py b/deploy/pdserving/params.py
new file mode 100644
index 0000000000000000000000000000000000000000..60273ba6ca579391f0521256af11b33a39fdd6d6
--- /dev/null
+++ b/deploy/pdserving/params.py
@@ -0,0 +1,53 @@
+# -*- coding:utf-8 -*-
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+
+class Config(object):
+ pass
+
+def read_params():
+ cfg = Config()
+ #use gpu
+ cfg.use_gpu = False
+ cfg.use_pdserving = True
+
+ #params for text detector
+ cfg.det_algorithm = "DB"
+ cfg.det_server_dir = "../../inference/ch_ppocr_mobile_v1.1_det_infer/serving_server_dir"
+ cfg.det_client_dir = "../../inference/ch_ppocr_mobile_v1.1_det_infer/serving_client_dir"
+ cfg.det_max_side_len = 960
+
+ #DB parmas
+ cfg.det_db_thresh =0.3
+ cfg.det_db_box_thresh =0.5
+ cfg.det_db_unclip_ratio =2.0
+
+ #EAST parmas
+ cfg.det_east_score_thresh = 0.8
+ cfg.det_east_cover_thresh = 0.1
+ cfg.det_east_nms_thresh = 0.2
+
+ #params for text recognizer
+ cfg.rec_algorithm = "CRNN"
+ cfg.rec_server_dir = "../../inference/ch_ppocr_mobile_v1.1_rec_infer/serving_server_dir"
+ cfg.rec_client_dir = "../../inference/ch_ppocr_mobile_v1.1_rec_infer/serving_client_dir"
+
+ cfg.rec_image_shape = "3, 32, 320"
+ cfg.rec_char_type = 'ch'
+ cfg.rec_batch_num = 30
+ cfg.max_text_length = 25
+
+ cfg.rec_char_dict_path = "../../ppocr/utils/ppocr_keys_v1.txt"
+ cfg.use_space_char = True
+
+ #params for text classifier
+ cfg.use_angle_cls = True
+ cfg.cls_server_dir = "../../inference/ch_ppocr_mobile_v1.1_cls_infer/serving_server_dir"
+ cfg.cls_client_dir = "../../inference/ch_ppocr_mobile_v1.1_cls_infer/serving_client_dir"
+ cfg.cls_image_shape = "3, 48, 192"
+ cfg.label_list = ['0', '180']
+ cfg.cls_batch_num = 30
+ cfg.cls_thresh = 0.9
+
+ return cfg
diff --git a/deploy/pdserving/pdserving_client.py b/deploy/pdserving/pdserving_client.py
new file mode 100644
index 0000000000000000000000000000000000000000..f3effb950255c1e71b5ccc8063811733d7679ab6
--- /dev/null
+++ b/deploy/pdserving/pdserving_client.py
@@ -0,0 +1,117 @@
+# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import os
+import sys
+__dir__ = os.path.dirname(os.path.abspath(__file__))
+sys.path.append(__dir__)
+sys.path.append(os.path.abspath(os.path.join(__dir__, '..')))
+sys.path.append(os.path.abspath(os.path.join(__dir__, '../../')))
+
+from ppocr.utils.utility import initial_logger
+logger = initial_logger()
+import cv2
+import numpy as np
+import time
+from PIL import Image
+from ppocr.utils.utility import get_image_file_list
+from tools.infer.utility import draw_ocr, draw_boxes
+
+import requests
+import json
+import base64
+
+
+def cv2_to_base64(image):
+ return base64.b64encode(image).decode('utf8')
+
+
+def draw_server_result(image_file, res):
+ img = cv2.imread(image_file)
+ image = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
+ if len(res) == 0:
+ return np.array(image)
+ keys = res[0].keys()
+ if 'text_region' not in keys: # for rec or clas, draw function is invalid
+ logger.info("draw function is invalid for rec or clas!")
+ return None
+ elif 'text' not in keys: # for ocr_det
+ logger.info("draw text boxes only!")
+ boxes = []
+ for dno in range(len(res)):
+ boxes.append(res[dno]['text_region'])
+ boxes = np.array(boxes)
+ draw_img = draw_boxes(image, boxes)
+ return draw_img
+ else: # for ocr_system
+ logger.info("draw boxes and texts!")
+ boxes = []
+ texts = []
+ scores = []
+ for dno in range(len(res)):
+ boxes.append(res[dno]['text_region'])
+ texts.append(res[dno]['text'])
+ scores.append(res[dno]['confidence'])
+ boxes = np.array(boxes)
+ scores = np.array(scores)
+ draw_img = draw_ocr(image, boxes, texts, scores, drop_score=0.5, font_path="../../doc/simfang.ttf")
+ return draw_img
+
+
+def main(image_path):
+ image_file_list = get_image_file_list(image_path)
+ is_visualize = True
+ headers = {"Content-type": "application/json"}
+ url = "http://127.0.0.1:9292/ocr/prediction"
+ cnt = 0
+ total_time = 0
+ for image_file in image_file_list:
+ img = open(image_file, 'rb').read()
+ if img is None:
+ logger.info("error in loading image:{}".format(image_file))
+ continue
+
+ # 发送HTTP请求
+ starttime = time.time()
+ data = {"feed": [{"image": cv2_to_base64(img)}], "fetch": ["res"]}
+ r = requests.post(url=url, headers=headers, data=json.dumps(data))
+ elapse = time.time() - starttime
+ total_time += elapse
+ logger.info("Predict time of %s: %.3fs" % (image_file, elapse))
+ res = r.json()['result']
+ logger.info(res)
+
+ if is_visualize:
+ draw_img = draw_server_result(image_file, res)
+ if draw_img is not None:
+ draw_img_save = "./server_results/"
+ if not os.path.exists(draw_img_save):
+ os.makedirs(draw_img_save)
+ cv2.imwrite(
+ os.path.join(draw_img_save, os.path.basename(image_file)),
+ draw_img[:, :, ::-1])
+ logger.info("The visualized image saved in {}".format(
+ os.path.join(draw_img_save, os.path.basename(image_file))))
+ cnt += 1
+ if cnt % 100 == 0:
+ logger.info("{} processed".format(cnt))
+ logger.info("avg time cost: {}".format(float(total_time) / cnt))
+
+
+if __name__ == '__main__':
+ if len(sys.argv) != 2:
+ logger.info("Usage: %s image_path" % sys.argv[0])
+ else:
+ image_path = sys.argv[1]
+ main(image_path)
diff --git a/deploy/pdserving/readme.md b/deploy/pdserving/readme.md
index af12d508ba9c04e6032f2a392701e72b41462395..b488a9df055a8687c7360a03c5eb75bb83beb404 100644
--- a/deploy/pdserving/readme.md
+++ b/deploy/pdserving/readme.md
@@ -1,120 +1,197 @@
-[English](readme_en.md) | 简体中文
+[English](readme_en.md) | 简体中文
-PaddleOCR提供2种服务部署方式:
-- 基于PaddleHub Serving的部署:代码路径为"`./deploy/hubserving`",使用方法参考[文档](../hubserving/readme.md)。
-- 基于PaddleServing的部署:代码路径为"`./deploy/pdserving`",按照本教程使用。
+PaddleOCR提供2种服务部署方式:
+- 基于PaddleHub Serving的部署:代码路径为"`./deploy/hubserving`",使用方法参考[文档](../hubserving/readme.md)。
+- 基于PaddleServing的部署:代码路径为"`./deploy/pdserving`",按照本教程使用。
-# Paddle Serving 服务部署
+# Paddle Serving 服务部署
本教程将介绍基于[Paddle Serving](https://github.com/PaddlePaddle/Serving)部署PaddleOCR在线预测服务的详细步骤。
-
+- [快速启动服务](#快速启动服务)
+ - [1. 准备环境](#准备环境)
+ - [2. 转换模型](#转换模型)
+ - [3. 启动服务](#启动服务)
+- [发送预测请求](#发送预测请求)
+
+pdserving服务部署目录下包括`检测`、`方向分类器`、`识别`、`串联`四种服务部署工具,请根据需求选择相应的服务。目录结构如下:
+```
+deploy/pdserving/
+ └─ det_local_server.py 快速版 检测 服务端
+ └─ det_rpc_server.py 标准版 检测 服务端
+ └─ clas_local_server.py 快速版 方向分类器 服务端
+ └─ clas_rpc_server.py 标准版 方向分类器 服务端
+ └─ rec_local_server.py 快速版 识别 服务端
+ └─ rec_rpc_server.py 标准版 识别 服务端
+ └─ ocr_local_server.py 快速版 串联 服务端
+ └─ ocr_rpc_server.py 标准版 串联 服务端
+ └─ pdserving_client.py 客户端
+ └─ params.py 配置文件
+```
+
+
## 快速启动服务
+
### 1. 准备环境
-我们先安装Paddle Serving相关组件
-我们推荐用户使用GPU来做Paddle Serving的OCR服务部署
-
-**CUDA版本:9.0**
+环境版本要求:
+- **CUDA版本:9.X/10.X**
+- **CUDNN版本:7.X**
+- **操作系统版本:Linux/Windows**
+- **Python版本: 2.7/3.5/3.6/3.7**
-**CUDNN版本:7.0**
+**Python操作指南:**
-**操作系统版本:CentOS 6以上**
+目前Serving用于OCR的部分功能还在测试当中,因此在这里我们给出[Servnig latest package](https://github.com/PaddlePaddle/Serving/blob/develop/doc/LATEST_PACKAGES.md)
+大家根据自己的环境选择需要安装的whl包即可,例如以Python 3.5为例,执行下列命令:
+```
+# 安装服务端,CPU/GPU版本选择一个
+# GPU版本服务端
+# CUDA 9
+python -m pip install -U https://paddle-serving.bj.bcebos.com/whl/paddle_serving_server_gpu-0.0.0.post9-py3-none-any.whl
+# CUDA 10
+python -m pip install -U https://paddle-serving.bj.bcebos.com/whl/paddle_serving_server_gpu-0.0.0.post10-py3-none-any.whl
+# CPU版本服务端
+python -m pip install -U https://paddle-serving.bj.bcebos.com/whl/paddle_serving_server-0.0.0-py3-none-any.whl
-**Python版本: 2.7/3.6/3.7**
+# 安装客户端和App包,CPU、GPU通用
+python -m pip install -U https://paddle-serving.bj.bcebos.com/whl/paddle_serving_client-0.0.0-cp35-none-any.whl https://paddle-serving.bj.bcebos.com/whl/paddle_serving_app-0.0.0-py3-none-any.whl
-**Python操作指南:**
-```
-#CPU/GPU版本选择一个
-#GPU版本服务端
-python -m pip install paddle_serving_server_gpu
-#CPU版本服务端
-python -m pip install paddle_serving_server
-#客户端和App包使用以下链接(CPU,GPU通用)
-python -m pip install paddle_serving_app paddle_serving_client
+# 安装其他依赖
+pip3.5 install func-timeout
```
+
+## 2. 转换模型
-### 2. 模型转换
-可以使用`paddle_serving_app`提供的模型,执行下列命令
-```
-python -m paddle_serving_app.package --get_model ocr_rec
-tar -xzvf ocr_rec.tar.gz
-python -m paddle_serving_app.package --get_model ocr_det
-tar -xzvf ocr_det.tar.gz
-```
-执行上述命令会下载`db_crnn_mobile`的模型,如果想要下载规模更大的`db_crnn_server`模型,可以在下载预测模型并解压之后。参考[如何从Paddle保存的预测模型转为Paddle Serving格式可部署的模型](https://github.com/PaddlePaddle/Serving/blob/develop/doc/INFERENCE_TO_SERVING_CN.md)。
+Paddle Serving无法直接用训练模型(checkpoints 模型)或推理模型(inference 模型)进行部署。Serving模型由两个文件夹构成,用于存放客户端和服务端的配置。本节介绍如何将推理模型转换为Paddle Serving可部署的模型。
-我们以`ch_rec_r34_vd_crnn`模型作为例子,下载链接在:
+**以文本检测模型`ch_ppocr_mobile_v1.1_det_infer`为例,文本识别模型和方向分类器的转换同理。**
+首先下载推理模型:
+```shell
+wget -P ./inference/ https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar && tar xf ./inference/ch_ppocr_mobile_v1.1_det_infer.tar -C ./inference/
```
-wget --no-check-certificate https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_infer.tar
-tar xf ch_rec_r34_vd_crnn_infer.tar
+然后运行如下python脚本进行转换,其中,使用参数`model_dir`指定待转换的推理模型路径:
```
-因此我们按照Serving模型转换教程,运行下列python文件。
+python deploy/pdserving/inference_to_serving.py --model_dir ./inference/ch_ppocr_mobile_v1.1_det_infer
```
-from paddle_serving_client.io import inference_model_to_serving
-inference_model_dir = "ch_rec_r34_vd_crnn"
-serving_client_dir = "serving_client_dir"
-serving_server_dir = "serving_server_dir"
-feed_var_names, fetch_var_names = inference_model_to_serving(
- inference_model_dir, serving_client_dir, serving_server_dir, model_filename="model", params_filename="params")
+最终会在`ch_ppocr_mobile_v1.1_det_infer`目录下生成客户端和服务端的模型配置,结构如下:
```
-最终会在`serving_client_dir`和`serving_server_dir`生成客户端和服务端的模型配置。
+/ch_ppocr_mobile_v1.1_det_infer/
+├── serving_client_dir # 客户端配置文件夹
+└── serving_server_dir # 服务端配置文件夹
+```
+
+
+## 3. 启动服务
-### 3. 启动服务
启动服务可以根据实际需求选择启动`标准版`或者`快速版`,两种方式的对比如下表:
|版本|特点|适用场景|
|-|-|-|
-|标准版|稳定性高,分布式部署|适用于吞吐量大,需要跨机房部署的情况|
-|快速版|部署方便,预测速度快|适用于对预测速度要求高,迭代速度快的场景|
+|标准版|稳定性高,分布式部署|适用于吞吐量大,需要跨机房部署的情况,只能用于Linux平台|
+|快速版|部署方便,预测速度快|适用于对预测速度要求高,迭代速度快的场景,可以支持Linux/Windows|
-#### 方式1. 启动标准版服务
+
+**step 1. 配置环境变量**
```
-# cpu,gpu启动二选一,以下是cpu启动
-python -m paddle_serving_server.serve --model ocr_det_model --port 9293
-python ocr_web_server.py cpu
-# gpu启动
-python -m paddle_serving_server_gpu.serve --model ocr_det_model --port 9293 --gpu_id 0
-python ocr_web_server.py gpu
+# 以下两步的顺序不能反
+export PYTHONPATH=$PWD:$PYTHONPATH
+cd deploy/pdserving
```
-#### 方式2. 启动快速版服务
+**step 2. 修改配置参数**
+
+配置参数在`params.py`中,具体内容如下所示,可根据需要修改相关参数,如修改模型路径、修改后处理参数等。
```
-# cpu,gpu启动二选一,以下是cpu启动
-python ocr_local_server.py cpu
-# gpu启动
-python ocr_local_server.py gpu
-```
+def read_params():
+ cfg = Config()
+ #use gpu
+ cfg.use_gpu = False #是否使用GPU,False代表使用CPU
+ cfg.use_pdserving = True #使用paddle serving部署时必须为True
-## 发送预测请求
+ #params for text detector
+ cfg.det_algorithm = "DB"
+ cfg.det_server_dir = "../../inference/ch_ppocr_mobile_v1.1_det_infer/serving_server_dir"
+ cfg.det_client_dir = "../../inference/ch_ppocr_mobile_v1.1_det_infer/serving_client_dir"
+ cfg.det_max_side_len = 960
-```
-python ocr_web_client.py
-```
+ #DB parmas
+ cfg.det_db_thresh =0.3
+ cfg.det_db_box_thresh =0.5
+ cfg.det_db_unclip_ratio =2.0
-## 返回结果格式说明
+ #EAST parmas
+ cfg.det_east_score_thresh = 0.8
+ cfg.det_east_cover_thresh = 0.1
+ cfg.det_east_nms_thresh = 0.2
-返回结果是json格式
-```
-{u'result': {u'res': [u'\u571f\u5730\u6574\u6cbb\u4e0e\u571f\u58e4\u4fee\u590d\u7814\u7a76\u4e2d\u5fc3', u'\u534e\u5357\u519c\u4e1a\u5927\u5b661\u7d20\u56fe']}}
+ #params for text recognizer
+ cfg.rec_algorithm = "CRNN"
+ cfg.rec_server_dir = "../../inference/ch_ppocr_mobile_v1.1_rec_infer/serving_server_dir"
+ cfg.rec_client_dir = "../../inference/ch_ppocr_mobile_v1.1_rec_infer/serving_client_dir"
+
+ cfg.rec_image_shape = "3, 32, 320"
+ cfg.rec_char_type = 'ch'
+ cfg.rec_batch_num = 30
+ cfg.max_text_length = 25
+
+ cfg.rec_char_dict_path = "../../ppocr/utils/ppocr_keys_v1.txt"
+ cfg.use_space_char = True
+
+ #params for text classifier
+ cfg.use_angle_cls = True
+ cfg.cls_server_dir = "../../inference/ch_ppocr_mobile_v1.1_cls_infer/serving_server_dir"
+ cfg.cls_client_dir = "../../inference/ch_ppocr_mobile_v1.1_cls_infer/serving_client_dir"
+ cfg.cls_image_shape = "3, 48, 192"
+ cfg.label_list = ['0', '180']
+ cfg.cls_batch_num = 30
+ cfg.cls_thresh = 0.9
+
+ return cfg
```
-我们也可以打印结果json串中`res`字段的每一句话
+
+**step 3_1. 启动独立的检测服务或识别服务**
+
+如果只需要搭建检测服务或识别服务,一行命令即可,检测服务的启动方式如下,识别同理。检测+识别的串联服务请直接跳至step 3_2。
+
```
-土地整治与土壤修复研究中心
-华南农业大学1素图
+# 启动文本检测服务,标准版/快速版 二选一
+python det_rpc_server.py #标准版,Linux用户
+python det_local_server.py #快速版,Windows/Linux用户
```
-## 自定义修改服务逻辑
+**step 3_2. 启动文本检测、识别串联的服务**
-在`ocr_web_server.py`或是`ocr_local_server.py`当中的`preprocess`函数里面做了检测服务和识别服务的前处理,`postprocess`函数里面做了识别的后处理服务,可以在相应的函数中做修改。调用了`paddle_serving_app`库提供的常见CV模型的前处理/后处理库。
+如果需要搭建检测+识别的串联服务,快速版与step 3_1中的独立服务启动方式相同,但标准版略有不同,具体步骤如下:
-如果想要单独启动Paddle Serving的检测服务和识别服务,参见下列表格, 执行对应的脚本即可,并且在命令行参数注明用的CPU或是GPU来提供服务。
+```
+# 标准版,Linux用户
+# GPU用户
+# 启动检测服务
+python -m paddle_serving_server_gpu.serve --model ../../inference/ch_ppocr_mobile_v1.1_det_infer/serving_server_dir/ --port 9293 --gpu_id 0
+# 启动方向分类器服务
+python -m paddle_serving_server_gpu.serve --model ../../inference/ch_ppocr_mobile_v1.1_cls_infer/serving_server_dir/ --port 9294 --gpu_id 0
+# 启动串联服务
+python ocr_rpc_server.py
+
+# CPU用户
+# 启动检测服务
+python -m paddle_serving_server.serve --model ../../inference/ch_ppocr_mobile_v1.1_det_infer/serving_server_dir/ --port 9293
+# 启动方向分类器服务
+python -m paddle_serving_server.serve --model ../../inference/ch_ppocr_mobile_v1.1_cls_infer/serving_server_dir/ --port 9294
+# 启动串联服务
+python ocr_rpc_server.py
+
+# 快速版,Windows/Linux用户
+python ocr_local_server.py
+```
-| 模型 | 标准版 | 快速版 |
-| ---- | ----------------- | ------------------- |
-| 检测 | det_web_server.py | det_local_server.py |
-| 识别 | rec_web_server.py | rec_local_server.py |
+
+## 发送预测请求
+以上所有单独或串联的服务均可使用如下客户端进行访问:
+```
+python pdserving_client.py image_path
+```
-更多信息参见[Paddle Serving](https://github.com/PaddlePaddle/Serving)
diff --git a/deploy/pdserving/readme_en.md b/deploy/pdserving/readme_en.md
deleted file mode 100644
index 9a0c684fb6fb4f0eeff2552af70f62053d3351fb..0000000000000000000000000000000000000000
--- a/deploy/pdserving/readme_en.md
+++ /dev/null
@@ -1,123 +0,0 @@
-English | [简体中文](readme.md)
-
-PaddleOCR provides 2 service deployment methods:
-- Based on **PaddleHub Serving**: Code path is "`./deploy/hubserving`". Please refer to the [tutorial](../hubserving/readme_en.md) for usage.
-- Based on **PaddleServing**: Code path is "`./deploy/pdserving`". Please follow this tutorial.
-
-# Service deployment based on Paddle Serving
-
-This tutorial will introduce the detail steps of deploying PaddleOCR online prediction service based on [Paddle Serving](https://github.com/PaddlePaddle/Serving).
-
-## Quick start service
-
-### 1. Prepare the environment
-Let's first install the relevant components of Paddle Serving. GPU is recommended for service deployment with Paddle Serving.
-
-**Requirements:**
-- **CUDA version: 9.0**
-- **CUDNN version: 7.0**
-- **Operating system version: >= CentOS 6**
-- **Python version: 2.7/3.6/3.7**
-
-**Installation:**
-```
-# install GPU server
-python -m pip install paddle_serving_server_gpu
-
-# or, install CPU server
-python -m pip install paddle_serving_server
-
-# install client and App package (CPU/GPU)
-python -m pip install paddle_serving_app paddle_serving_client
-```
-
-### 2. Model transformation
-You can directly use converted model provided by `paddle_serving_app` for convenience. Execute the following command to obtain:
-```
-python -m paddle_serving_app.package --get_model ocr_rec
-tar -xzvf ocr_rec.tar.gz
-python -m paddle_serving_app.package --get_model ocr_det
-tar -xzvf ocr_det.tar.gz
-```
-Executing the above command will download the `db_crnn_mobile` model, which is in different format with inference model. If you want to use other models for deployment, you can refer to the [tutorial](https://github.com/PaddlePaddle/Serving/blob/develop/doc/INFERENCE_TO_SERVING_CN.md) to convert your inference model to a model which is deployable for Paddle Serving.
-
-We take `ch_rec_r34_vd_crnn` model as example. Download the inference model by executing the following command:
-```
-wget --no-check-certificate https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_infer.tar
-tar xf ch_rec_r34_vd_crnn_infer.tar
-```
-
-Convert the downloaded model by executing the following python script:
-```
-from paddle_serving_client.io import inference_model_to_serving
-inference_model_dir = "ch_rec_r34_vd_crnn"
-serving_client_dir = "serving_client_dir"
-serving_server_dir = "serving_server_dir"
-feed_var_names, fetch_var_names = inference_model_to_serving(
- inference_model_dir, serving_client_dir, serving_server_dir, model_filename="model", params_filename="params")
-```
-
-Finally, model configuration of client and server will be generated in `serving_client_dir` and `serving_server_dir`.
-
-### 3. Start service
-Start the standard version or the fast version service according to your actual needs. The comparison of the two versions is shown in the table below:
-
-|version|characteristics|recommended scenarios|
-|-|-|-|
-|standard version|High stability, suitable for distributed deployment|Large throughput and cross regional deployment|
-|fast version|Easy to deploy and fast to predict|Suitable for scenarios which requires high prediction speed and fast iteration speed|
-
-#### Mode 1. Start the standard mode service
-
-```
-# start with CPU
-python -m paddle_serving_server.serve --model ocr_det_model --port 9293
-python ocr_web_server.py cpu
-
-# or, with GPU
-python -m paddle_serving_server_gpu.serve --model ocr_det_model --port 9293 --gpu_id 0
-python ocr_web_server.py gpu
-```
-
-#### Mode 2. Start the fast mode service
-
-```
-# start with CPU
-python ocr_local_server.py cpu
-
-# or, with GPU
-python ocr_local_server.py gpu
-```
-
-## Send prediction requests
-
-```
-python ocr_web_client.py
-```
-
-## Returned result format
-
-The returned result is a JSON string, eg.
-```
-{u'result': {u'res': [u'\u571f\u5730\u6574\u6cbb\u4e0e\u571f\u58e4\u4fee\u590d\u7814\u7a76\u4e2d\u5fc3', u'\u534e\u5357\u519c\u4e1a\u5927\u5b661\u7d20\u56fe']}}
-```
-
-You can also print the readable result in `res`:
-```
-土地整治与土壤修复研究中心
-华南农业大学1素图
-```
-
-## User defined service module modification
-
-The pre-processing and post-processing process, can be found in the `preprocess` and `postprocess` function in `ocr_web_server.py` or `ocr_local_server.py`. The pre-processing/post-processing library for common CV models provided by `paddle_serving_app` is called.
-You can modify the corresponding code as actual needs.
-
-If you only want to start the detection service or the recognition service, execute the corresponding script reffering to the following table. Indicate the CPU or GPU is used in the start command parameters.
-
-| task | standard | fast |
-| ---- | ----------------- | ------------------- |
-| detection | det_web_server.py | det_local_server.py |
-| recognition | rec_web_server.py | rec_local_server.py |
-
-More info can be found in [Paddle Serving](https://github.com/PaddlePaddle/Serving).
diff --git a/deploy/pdserving/rec_local_server.py b/deploy/pdserving/rec_local_server.py
index ba021c1cd5054071eb115b3e6e9c64cb572ff871..72a40f3aad01d87a2cb173d0fdfaec50cce9a064 100644
--- a/deploy/pdserving/rec_local_server.py
+++ b/deploy/pdserving/rec_local_server.py
@@ -13,67 +13,163 @@
# limitations under the License.
from paddle_serving_client import Client
-from paddle_serving_app.reader import OCRReader
import cv2
import sys
import numpy as np
import os
-from paddle_serving_client import Client
-from paddle_serving_app.reader import Sequential, URL2Image, ResizeByFactor
-from paddle_serving_app.reader import Div, Normalize, Transpose
-from paddle_serving_app.reader import DBPostProcess, FilterBoxes, GetRotateCropImage, SortedBoxes
-if sys.argv[1] == 'gpu':
- from paddle_serving_server_gpu.web_service import WebService
-elif sys.argv[1] == 'cpu':
- from paddle_serving_server.web_service import WebService
import time
import re
import base64
+from tools.infer.predict_rec import TextRecognizer
+from params import read_params
+
+global_args = read_params()
+
+if global_args.use_gpu:
+ from paddle_serving_server_gpu.web_service import WebService
+else:
+ from paddle_serving_server.web_service import WebService
+
+
+class TextRecognizerHelper(TextRecognizer):
+ def __init__(self, args):
+ super(TextRecognizerHelper, self).__init__(args)
+ if self.loss_type == "ctc":
+ self.fetch = ["save_infer_model/scale_0.tmp_0", "save_infer_model/scale_1.tmp_0"]
+
+ def preprocess(self, img_list):
+ img_num = len(img_list)
+ args = {}
+ # Calculate the aspect ratio of all text bars
+ width_list = []
+ for img in img_list:
+ width_list.append(img.shape[1] / float(img.shape[0]))
+ indices = np.argsort(np.array(width_list))
+ args["indices"] = indices
+ predict_time = 0
+ beg_img_no = 0
+ end_img_no = img_num
+ norm_img_batch = []
+ max_wh_ratio = 0
+ for ino in range(beg_img_no, end_img_no):
+ h, w = img_list[indices[ino]].shape[0:2]
+ wh_ratio = w * 1.0 / h
+ max_wh_ratio = max(max_wh_ratio, wh_ratio)
+ for ino in range(beg_img_no, end_img_no):
+ if self.loss_type != "srn":
+ norm_img = self.resize_norm_img(img_list[indices[ino]],
+ max_wh_ratio)
+ norm_img = norm_img[np.newaxis, :]
+ norm_img_batch.append(norm_img)
+ else:
+ norm_img = self.process_image_srn(img_list[indices[ino]],
+ self.rec_image_shape, 8, 25,
+ self.char_ops)
+ encoder_word_pos_list = []
+ gsrm_word_pos_list = []
+ gsrm_slf_attn_bias1_list = []
+ gsrm_slf_attn_bias2_list = []
+ encoder_word_pos_list.append(norm_img[1])
+ gsrm_word_pos_list.append(norm_img[2])
+ gsrm_slf_attn_bias1_list.append(norm_img[3])
+ gsrm_slf_attn_bias2_list.append(norm_img[4])
+ norm_img_batch.append(norm_img[0])
+ norm_img_batch = np.concatenate(norm_img_batch, axis=0).copy()
+ feed = {"image": norm_img_batch.copy()}
+ return feed, self.fetch, args
+
+ def postprocess(self, outputs, args):
+ if self.loss_type == "ctc":
+ rec_idx_batch = outputs[0]
+ predict_batch = outputs[1]
+ rec_idx_lod = args["save_infer_model/scale_0.tmp_0.lod"]
+ predict_lod = args["save_infer_model/scale_1.tmp_0.lod"]
+ indices = args["indices"]
+ rec_res = [['', 0.0]] * (len(rec_idx_lod) - 1)
+ for rno in range(len(rec_idx_lod) - 1):
+ beg = rec_idx_lod[rno]
+ end = rec_idx_lod[rno + 1]
+ rec_idx_tmp = rec_idx_batch[beg:end, 0]
+ preds_text = self.char_ops.decode(rec_idx_tmp)
+ beg = predict_lod[rno]
+ end = predict_lod[rno + 1]
+ probs = predict_batch[beg:end, :]
+ ind = np.argmax(probs, axis=1)
+ blank = probs.shape[1]
+ valid_ind = np.where(ind != (blank - 1))[0]
+ if len(valid_ind) == 0:
+ continue
+ score = np.mean(probs[valid_ind, ind[valid_ind]])
+ rec_res[indices[rno]] = [preds_text, score]
+ elif self.loss_type == 'srn':
+ char_num = self.char_ops.get_char_num()
+ preds = rec_idx_batch.reshape(-1)
+ elapse = time.time() - starttime
+ predict_time += elapse
+ total_preds = preds.copy()
+ for ino in range(int(len(rec_idx_batch) / self.text_len)):
+ preds = total_preds[ino * self.text_len:(ino + 1) *
+ self.text_len]
+ ind = np.argmax(probs, axis=1)
+ valid_ind = np.where(preds != int(char_num - 1))[0]
+ if len(valid_ind) == 0:
+ continue
+ score = np.mean(probs[valid_ind, ind[valid_ind]])
+ preds = preds[:valid_ind[-1] + 1]
+ preds_text = self.char_ops.decode(preds)
+ rec_res[indices[ino]] = [preds_text, score]
+ else:
+ for rno in range(len(rec_idx_batch)):
+ end_pos = np.where(rec_idx_batch[rno, :] == 1)[0]
+ if len(end_pos) <= 1:
+ preds = rec_idx_batch[rno, 1:]
+ score = np.mean(predict_batch[rno, 1:])
+ else:
+ preds = rec_idx_batch[rno, 1:end_pos[1]]
+ score = np.mean(predict_batch[rno, 1:end_pos[1]])
+ preds_text = self.char_ops.decode(preds)
+ rec_res[indices[rno]] = [preds_text, score]
+ return rec_res
class OCRService(WebService):
def init_rec(self):
- self.ocr_reader = OCRReader()
+ self.text_recognizer = TextRecognizerHelper(global_args)
def preprocess(self, feed=[], fetch=[]):
+ # TODO: to handle batch rec images
img_list = []
for feed_data in feed:
data = base64.b64decode(feed_data["image"].encode('utf8'))
data = np.fromstring(data, np.uint8)
im = cv2.imdecode(data, cv2.IMREAD_COLOR)
img_list.append(im)
- max_wh_ratio = 0
- for i, boximg in enumerate(img_list):
- h, w = boximg.shape[0:2]
- wh_ratio = w * 1.0 / h
- max_wh_ratio = max(max_wh_ratio, wh_ratio)
- _, w, h = self.ocr_reader.resize_norm_img(img_list[0],
- max_wh_ratio).shape
- imgs = np.zeros((len(img_list), 3, w, h)).astype('float32')
- for i, img in enumerate(img_list):
- norm_img = self.ocr_reader.resize_norm_img(img, max_wh_ratio)
- imgs[i] = norm_img
- feed = {"image": imgs.copy()}
- fetch = ["ctc_greedy_decoder_0.tmp_0", "softmax_0.tmp_0"]
+ feed, fetch, self.tmp_args = self.text_recognizer.preprocess(img_list)
return feed, fetch
def postprocess(self, feed={}, fetch=[], fetch_map=None):
- rec_res = self.ocr_reader.postprocess(fetch_map, with_score=True)
- res_lst = []
- for res in rec_res:
- res_lst.append(res[0])
- res = {"res": res_lst}
+ outputs = [fetch_map[x] for x in self.text_recognizer.fetch]
+ for x in fetch_map.keys():
+ if ".lod" in x:
+ self.tmp_args[x] = fetch_map[x]
+ rec_res = self.text_recognizer.postprocess(outputs, self.tmp_args)
+ res = []
+ for i in range(len(rec_res)):
+ res.append({
+ "text": rec_res[i][0],
+ "confidence": float(rec_res[i][1])
+ })
return res
-ocr_service = OCRService(name="ocr")
-ocr_service.load_model_config("ocr_rec_model")
-ocr_service.init_rec()
-if sys.argv[1] == 'gpu':
- ocr_service.set_gpus("0")
- ocr_service.prepare_server(workdir="workdir", port=9292, device="gpu", gpuid=0)
- ocr_service.run_debugger_service(gpu=True)
-elif sys.argv[1] == 'cpu':
- ocr_service.prepare_server(workdir="workdir", port=9292, device="cpu")
+if __name__ == "__main__":
+ ocr_service = OCRService(name="ocr")
+ ocr_service.load_model_config(global_args.rec_server_dir)
+ ocr_service.init_rec()
+ if global_args.use_gpu:
+ ocr_service.prepare_server(
+ workdir="workdir", port=9292, device="gpu", gpuid=0)
+ else:
+ ocr_service.prepare_server(workdir="workdir", port=9292, device="cpu")
ocr_service.run_debugger_service()
-ocr_service.run_web_service()
+ ocr_service.run_web_service()
diff --git a/deploy/pdserving/rec_rpc_server.py b/deploy/pdserving/rec_rpc_server.py
new file mode 100644
index 0000000000000000000000000000000000000000..63bbee3ca3a58e4610a97095afc7c13cea9adc5c
--- /dev/null
+++ b/deploy/pdserving/rec_rpc_server.py
@@ -0,0 +1,180 @@
+# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from paddle_serving_client import Client
+import cv2
+import sys
+import numpy as np
+import os
+import time
+import re
+import base64
+from tools.infer.predict_rec import TextRecognizer
+from params import read_params
+
+global_args = read_params()
+if global_args.use_gpu:
+ from paddle_serving_server_gpu.web_service import WebService
+else:
+ from paddle_serving_server.web_service import WebService
+
+
+class TextRecognizerHelper(TextRecognizer):
+ def __init__(self, args):
+ super(TextRecognizerHelper, self).__init__(args)
+ if self.loss_type == "ctc":
+ self.fetch = ["save_infer_model/scale_0.tmp_0", "save_infer_model/scale_1.tmp_0"]
+
+ def preprocess(self, img_list):
+ img_num = len(img_list)
+ args = {}
+ # Calculate the aspect ratio of all text bars
+ width_list = []
+ for img in img_list:
+ width_list.append(img.shape[1] / float(img.shape[0]))
+ indices = np.argsort(np.array(width_list))
+ args["indices"] = indices
+ predict_time = 0
+ beg_img_no = 0
+ end_img_no = img_num
+ norm_img_batch = []
+ max_wh_ratio = 0
+ for ino in range(beg_img_no, end_img_no):
+ h, w = img_list[indices[ino]].shape[0:2]
+ wh_ratio = w * 1.0 / h
+ max_wh_ratio = max(max_wh_ratio, wh_ratio)
+ for ino in range(beg_img_no, end_img_no):
+ if self.loss_type != "srn":
+ norm_img = self.resize_norm_img(img_list[indices[ino]],
+ max_wh_ratio)
+ norm_img = norm_img[np.newaxis, :]
+ norm_img_batch.append(norm_img)
+ else:
+ norm_img = self.process_image_srn(img_list[indices[ino]],
+ self.rec_image_shape, 8, 25,
+ self.char_ops)
+ encoder_word_pos_list = []
+ gsrm_word_pos_list = []
+ gsrm_slf_attn_bias1_list = []
+ gsrm_slf_attn_bias2_list = []
+ encoder_word_pos_list.append(norm_img[1])
+ gsrm_word_pos_list.append(norm_img[2])
+ gsrm_slf_attn_bias1_list.append(norm_img[3])
+ gsrm_slf_attn_bias2_list.append(norm_img[4])
+ norm_img_batch.append(norm_img[0])
+
+ norm_img_batch = np.concatenate(norm_img_batch, axis=0)
+ if img_num > 1:
+ feed = [{
+ "image": norm_img_batch[x]
+ } for x in range(norm_img_batch.shape[0])]
+ else:
+ feed = {"image": norm_img_batch[0]}
+ return feed, self.fetch, args
+
+ def postprocess(self, outputs, args):
+ if self.loss_type == "ctc":
+ rec_idx_batch = outputs[0]
+ predict_batch = outputs[1]
+ rec_idx_lod = args["save_infer_model/scale_0.tmp_0.lod"]
+ predict_lod = args["save_infer_model/scale_1.tmp_0.lod"]
+ indices = args["indices"]
+ rec_res = [['', 0.0]] * (len(rec_idx_lod) - 1)
+ for rno in range(len(rec_idx_lod) - 1):
+ beg = rec_idx_lod[rno]
+ end = rec_idx_lod[rno + 1]
+ rec_idx_tmp = rec_idx_batch[beg:end, 0]
+ preds_text = self.char_ops.decode(rec_idx_tmp)
+ beg = predict_lod[rno]
+ end = predict_lod[rno + 1]
+ probs = predict_batch[beg:end, :]
+ ind = np.argmax(probs, axis=1)
+ blank = probs.shape[1]
+ valid_ind = np.where(ind != (blank - 1))[0]
+ if len(valid_ind) == 0:
+ continue
+ score = np.mean(probs[valid_ind, ind[valid_ind]])
+ rec_res[indices[rno]] = [preds_text, score]
+ elif self.loss_type == 'srn':
+ char_num = self.char_ops.get_char_num()
+ preds = rec_idx_batch.reshape(-1)
+ elapse = time.time() - starttime
+ predict_time += elapse
+ total_preds = preds.copy()
+ for ino in range(int(len(rec_idx_batch) / self.text_len)):
+ preds = total_preds[ino * self.text_len:(ino + 1) *
+ self.text_len]
+ ind = np.argmax(probs, axis=1)
+ valid_ind = np.where(preds != int(char_num - 1))[0]
+ if len(valid_ind) == 0:
+ continue
+ score = np.mean(probs[valid_ind, ind[valid_ind]])
+ preds = preds[:valid_ind[-1] + 1]
+ preds_text = self.char_ops.decode(preds)
+ rec_res[indices[ino]] = [preds_text, score]
+ else:
+ for rno in range(len(rec_idx_batch)):
+ end_pos = np.where(rec_idx_batch[rno, :] == 1)[0]
+ if len(end_pos) <= 1:
+ preds = rec_idx_batch[rno, 1:]
+ score = np.mean(predict_batch[rno, 1:])
+ else:
+ preds = rec_idx_batch[rno, 1:end_pos[1]]
+ score = np.mean(predict_batch[rno, 1:end_pos[1]])
+ preds_text = self.char_ops.decode(preds)
+ rec_res[indices[rno]] = [preds_text, score]
+ return rec_res
+
+
+class OCRService(WebService):
+ def init_rec(self):
+ self.text_recognizer = TextRecognizerHelper(global_args)
+
+ def preprocess(self, feed=[], fetch=[]):
+ # TODO: to handle batch rec images
+ img_list = []
+ for feed_data in feed:
+ data = base64.b64decode(feed_data["image"].encode('utf8'))
+ data = np.fromstring(data, np.uint8)
+ im = cv2.imdecode(data, cv2.IMREAD_COLOR)
+ img_list.append(im)
+ feed, fetch, self.tmp_args = self.text_recognizer.preprocess(img_list)
+ return feed, fetch
+
+ def postprocess(self, feed={}, fetch=[], fetch_map=None):
+ outputs = [fetch_map[x] for x in self.text_recognizer.fetch]
+ for x in fetch_map.keys():
+ if ".lod" in x:
+ self.tmp_args[x] = fetch_map[x]
+ rec_res = self.text_recognizer.postprocess(outputs, self.tmp_args)
+ res = []
+ for i in range(len(rec_res)):
+ res.append({
+ "text": rec_res[i][0],
+ "confidence": float(rec_res[i][1])
+ })
+ return res
+
+
+if __name__ == "__main__":
+ ocr_service = OCRService(name="ocr")
+ ocr_service.load_model_config(global_args.rec_server_dir)
+ ocr_service.init_rec()
+ if global_args.use_gpu:
+ ocr_service.prepare_server(
+ workdir="workdir", port=9292, device="gpu", gpuid=0)
+ else:
+ ocr_service.prepare_server(workdir="workdir", port=9292, device="cpu")
+ ocr_service.run_rpc_service()
+ ocr_service.run_web_service()
diff --git a/deploy/pdserving/rec_web_server.py b/deploy/pdserving/rec_web_server.py
deleted file mode 100644
index 0f4e9f6d264ed602f387bfaf0303cd59af7823fa..0000000000000000000000000000000000000000
--- a/deploy/pdserving/rec_web_server.py
+++ /dev/null
@@ -1,77 +0,0 @@
-# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-from paddle_serving_client import Client
-from paddle_serving_app.reader import OCRReader
-import cv2
-import sys
-import numpy as np
-import os
-from paddle_serving_client import Client
-from paddle_serving_app.reader import Sequential, URL2Image, ResizeByFactor
-from paddle_serving_app.reader import Div, Normalize, Transpose
-from paddle_serving_app.reader import DBPostProcess, FilterBoxes, GetRotateCropImage, SortedBoxes
-if sys.argv[1] == 'gpu':
- from paddle_serving_server_gpu.web_service import WebService
-elif sys.argv[1] == 'cpu':
- from paddle_serving_server.web_service import WebService
-import time
-import re
-import base64
-
-
-class OCRService(WebService):
- def init_rec(self):
- self.ocr_reader = OCRReader()
-
- def preprocess(self, feed=[], fetch=[]):
- # TODO: to handle batch rec images
- img_list = []
- for feed_data in feed:
- data = base64.b64decode(feed_data["image"].encode('utf8'))
- data = np.fromstring(data, np.uint8)
- im = cv2.imdecode(data, cv2.IMREAD_COLOR)
- img_list.append(im)
- feed_list = []
- max_wh_ratio = 0
- for i, boximg in enumerate(img_list):
- h, w = boximg.shape[0:2]
- wh_ratio = w * 1.0 / h
- max_wh_ratio = max(max_wh_ratio, wh_ratio)
- for img in img_list:
- norm_img = self.ocr_reader.resize_norm_img(img, max_wh_ratio)
- feed = {"image": norm_img}
- feed_list.append(feed)
- fetch = ["ctc_greedy_decoder_0.tmp_0", "softmax_0.tmp_0"]
- return feed_list, fetch
-
- def postprocess(self, feed={}, fetch=[], fetch_map=None):
- rec_res = self.ocr_reader.postprocess(fetch_map, with_score=True)
- res_lst = []
- for res in rec_res:
- res_lst.append(res[0])
- res = {"res": res_lst}
- return res
-
-
-ocr_service = OCRService(name="ocr")
-ocr_service.load_model_config("ocr_rec_model")
-ocr_service.init_rec()
-if sys.argv[1] == 'gpu':
- ocr_service.set_gpus("0")
- ocr_service.prepare_server(workdir="workdir", port=9292, device="gpu", gpuid=0)
-elif sys.argv[1] == 'cpu':
- ocr_service.prepare_server(workdir="workdir", port=9292, device="cpu")
-ocr_service.run_rpc_service()
-ocr_service.run_web_service()
diff --git a/deploy/slim/prune/README.md b/deploy/slim/prune/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..9dc53f2cc6bb65925247f7ddc5887b54c5f7e0e5
--- /dev/null
+++ b/deploy/slim/prune/README.md
@@ -0,0 +1,75 @@
+
+## 介绍
+
+复杂的模型有利于提高模型的性能,但也导致模型中存在一定冗余,模型裁剪通过移出网络模型中的子模型来减少这种冗余,达到减少模型计算复杂度,提高模型推理性能的目的。
+本教程将介绍如何使用飞桨模型压缩库PaddleSlim做PaddleOCR模型的压缩。
+[PaddleSlim](https://github.com/PaddlePaddle/PaddleSlim)集成了模型剪枝、量化(包括量化训练和离线量化)、蒸馏和神经网络搜索等多种业界常用且领先的模型压缩功能,如果您感兴趣,可以关注并了解。
+
+
+在开始本教程之前,建议先了解:
+1. [PaddleOCR模型的训练方法](../../../doc/doc_ch/quickstart.md)
+2. [分类模型裁剪教程](https://paddlepaddle.github.io/PaddleSlim/tutorials/pruning_tutorial/)
+3. [PaddleSlim 裁剪压缩API](https://paddlepaddle.github.io/PaddleSlim/api/prune_api/)
+
+
+## 快速开始
+
+模型裁剪主要包括五个步骤:
+1. 安装 PaddleSlim
+2. 准备训练好的模型
+3. 敏感度分析、训练
+4. 模型裁剪训练
+5. 导出模型、预测部署
+
+### 1. 安装PaddleSlim
+
+```bash
+git clone https://github.com/PaddlePaddle/PaddleSlim.git
+cd Paddleslim
+python setup.py install
+```
+
+### 2. 获取预训练模型
+模型裁剪需要加载事先训练好的模型,PaddleOCR也提供了一系列(模型)[../../../doc/doc_ch/models_list.md],开发者可根据需要自行选择模型或使用自己的模型。
+
+### 3. 敏感度分析训练
+
+加载预训练模型后,通过对现有模型的每个网络层进行敏感度分析,得到敏感度文件:sensitivities_0.data,可以通过PaddleSlim提供的[接口](https://github.com/PaddlePaddle/PaddleSlim/blob/develop/paddleslim/prune/sensitive.py#L221)加载文件,获得各网络层在不同裁剪比例下的精度损失。从而了解各网络层冗余度,决定每个网络层的裁剪比例。
+敏感度分析的具体细节见:[敏感度分析](https://github.com/PaddlePaddle/PaddleSlim/blob/develop/docs/zh_cn/tutorials/image_classification_sensitivity_analysis_tutorial.md)
+敏感度文件内容格式:
+ sensitivities_0.data(Dict){
+ 'layer_weight_name_0': sens_of_each_ratio(Dict){'pruning_ratio_0': acc_loss, 'pruning_ratio_1': acc_loss}
+ 'layer_weight_name_1': sens_of_each_ratio(Dict){'pruning_ratio_0': acc_loss, 'pruning_ratio_1': acc_loss}
+ }
+
+ 例子:
+ {
+ 'conv10_expand_weights': {0.1: 0.006509952684312718, 0.2: 0.01827734339798862, 0.3: 0.014528405644659832, 0.6: 0.06536008804270439, 0.8: 0.11798612250664964, 0.7: 0.12391408417493704, 0.4: 0.030615754498018757, 0.5: 0.047105205602406594}
+ 'conv10_linear_weights': {0.1: 0.05113190831455035, 0.2: 0.07705573833558801, 0.3: 0.12096721757739311, 0.6: 0.5135061352930738, 0.8: 0.7908166677143281, 0.7: 0.7272187676899062, 0.4: 0.1819252083008504, 0.5: 0.3728054727792405}
+ }
+加载敏感度文件后会返回一个字典,字典中的keys为网络模型参数模型的名字,values为一个字典,里面保存了相应网络层的裁剪敏感度信息。例如在例子中,conv10_expand_weights所对应的网络层在裁掉10%的卷积核后模型性能相较原模型会下降0.65%,详细信息可见[PaddleSlim](https://github.com/PaddlePaddle/PaddleSlim/blob/develop/docs/zh_cn/algo/algo.md#2-%E5%8D%B7%E7%A7%AF%E6%A0%B8%E5%89%AA%E8%A3%81%E5%8E%9F%E7%90%86)
+
+进入PaddleOCR根目录,通过以下命令对模型进行敏感度分析训练:
+```bash
+python deploy/slim/prune/sensitivity_anal.py -c configs/det/det_mv3_db_v1.1.yml -o Global.pretrain_weights="your trained model" Global.test_batch_size_per_card=1
+```
+
+### 4. 模型裁剪训练
+裁剪时通过之前的敏感度分析文件决定每个网络层的裁剪比例。在具体实现时,为了尽可能多的保留从图像中提取的低阶特征,我们跳过了backbone中靠近输入的4个卷积层。同样,为了减少由于裁剪导致的模型性能损失,我们通过之前敏感度分析所获得的敏感度表,人工挑选出了一些冗余较少,对裁剪较为敏感的[网络层](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/deploy/slim/prune/pruning_and_finetune.py#L41)(指在较低的裁剪比例下就导致很高性能损失的网络层),并在之后的裁剪过程中选择避开这些网络层。裁剪过后finetune的过程沿用OCR检测模型原始的训练策略。
+
+```bash
+python deploy/slim/prune/pruning_and_finetune.py -c configs/det/det_mv3_db_v1.1.yml -o Global.pretrain_weights=./deploy/slim/prune/pretrain_models/det_mv3_db/best_accuracy Global.test_batch_size_per_card=1
+```
+通过对比可以发现,经过裁剪训练保存的模型更小。
+
+### 5. 导出模型、预测部署
+
+在得到裁剪训练保存的模型后,我们可以将其导出为inference_model:
+```bash
+python deploy/slim/prune/export_prune_model.py -c configs/det/det_mv3_db_v1.1.yml -o Global.pretrain_weights=./output/det_db/best_accuracy Global.test_batch_size_per_card=1 Global.save_inference_dir=inference_model
+```
+
+inference model的预测和部署参考:
+1. [inference model python端预测](../../../doc/doc_ch/inference.md)
+2. [inference model C++预测](../../cpp_infer/readme.md)
+3. [inference model在移动端部署](../../lite/readme.md)
diff --git a/deploy/slim/prune/README_ch.md b/deploy/slim/prune/README_ch.md
deleted file mode 100644
index fbd9921da91a61e796e1f35c5dfce6531e83bd45..0000000000000000000000000000000000000000
--- a/deploy/slim/prune/README_ch.md
+++ /dev/null
@@ -1,180 +0,0 @@
-\> 运行示例前请先安装develop版本PaddleSlim
-
-
-
-# 模型裁剪压缩教程
-
-压缩结果:
-
-
-
-## Overview
+
+## Introduction
Generally, a more complex model would achive better performance in the task, but it also leads to some redundancy in the model. Model Pruning is a technique that reduces this redundancy by removing the sub-models in the neural network model, so as to reduce model calculation complexity and improve model inference performance.
This example uses PaddleSlim provided[APIs of Pruning](https://paddlepaddle.github.io/PaddleSlim/api/prune_api/) to compress the OCR model.
+[PaddleSlim](https://github.com/PaddlePaddle/PaddleSlim), an open source library which integrates model pruning, quantization (including quantization training and offline quantization), distillation, neural network architecture search, and many other commonly used and leading model compression technique in the industry.
-It is recommended that you could understand following pages before reading this example,:
-
-
-
-\- [The training strategy of OCR model](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_ch/detection.md)
-
-\- [PaddleSlim Document](https://paddlepaddle.github.io/PaddleSlim/)
+It is recommended that you could understand following pages before reading this example:
+1. [PaddleOCR training methods](../../../doc/doc_ch/quickstart.md)
+2. [The demo of prune](https://paddlepaddle.github.io/PaddleSlim/tutorials/pruning_tutorial/)
+3. [PaddleSlim prune API](https://paddlepaddle.github.io/PaddleSlim/api/prune_api/)
+## Quick start
+Five steps for OCR model prune:
+1. Install PaddleSlim
+2. Prepare the trained model
+3. Sensitivity analysis and training
+4. Model tailoring training
+5. Export model, predict deployment
-## Install PaddleSlim
+### 1. Install PaddleSlim
```bash
-
git clone https://github.com/PaddlePaddle/PaddleSlim.git
-
cd Paddleslim
-
python setup.py install
-
```
-## Download Pretrain Model
+### 2. Download Pretrain Model
+Model prune needs to load pre-trained models.
+PaddleOCR also provides a series of (models)[../../../doc/doc_en/models_list_en.md]. Developers can choose their own models or use their own models according to their needs.
-[Download link of Detection pretrain model]()
+### 3. Pruning sensitivity analysis
-## Pruning sensitivity analysis
+ After the pre-training model is loaded, sensitivity analysis is performed on each network layer of the model to understand the redundancy of each network layer, and save a sensitivity file which named: sensitivities_0.data. After that, user could load the sensitivity file via the [methods provided by PaddleSlim](https://github.com/PaddlePaddle/PaddleSlim/blob/develop/paddleslim/prune/sensitive.py#L221) and determining the pruning ratio of each network layer automatically. For specific details of sensitivity analysis, see:[Sensitivity analysis](https://github.com/PaddlePaddle/PaddleSlim/blob/develop/docs/zh_cn/tutorials/image_classification_sensitivity_analysis_tutorial.md)
+ The data format of sensitivity file:
+ sensitivities_0.data(Dict){
+ 'layer_weight_name_0': sens_of_each_ratio(Dict){'pruning_ratio_0': acc_loss, 'pruning_ratio_1': acc_loss}
+ 'layer_weight_name_1': sens_of_each_ratio(Dict){'pruning_ratio_0': acc_loss, 'pruning_ratio_1': acc_loss}
+ }
+
+ example:
+ {
+ 'conv10_expand_weights': {0.1: 0.006509952684312718, 0.2: 0.01827734339798862, 0.3: 0.014528405644659832, 0.6: 0.06536008804270439, 0.8: 0.11798612250664964, 0.7: 0.12391408417493704, 0.4: 0.030615754498018757, 0.5: 0.047105205602406594}
+ 'conv10_linear_weights': {0.1: 0.05113190831455035, 0.2: 0.07705573833558801, 0.3: 0.12096721757739311, 0.6: 0.5135061352930738, 0.8: 0.7908166677143281, 0.7: 0.7272187676899062, 0.4: 0.1819252083008504, 0.5: 0.3728054727792405}
+ }
+ The function would return a dict after loading the sensitivity file. The keys of the dict are name of parameters in each layer. And the value of key is the information about pruning sensitivity of correspoding layer. In example, pruning 10% filter of the layer corresponding to conv10_expand_weights would lead to 0.65% degradation of model performance. The details could be seen at: [Sensitivity analysis](https://github.com/PaddlePaddle/PaddleSlim/blob/develop/docs/zh_cn/algo/algo.md#2-%E5%8D%B7%E7%A7%AF%E6%A0%B8%E5%89%AA%E8%A3%81%E5%8E%9F%E7%90%86)
- After the pre-training model is loaded, sensitivity analysis is performed on each network layer of the model to understand the redundancy of each network layer, thereby determining the pruning ratio of each network layer. For specific details of sensitivity analysis, see:[Sensitivity analysis](https://github.com/PaddlePaddle/PaddleSlim/blob/develop/docs/zh_cn/tutorials/image_classification_sensitivity_analysis_tutorial.md)
Enter the PaddleOCR root directory,perform sensitivity analysis on the model with the following command:
```bash
-python deploy/slim/prune/sensitivity_anal.py -c configs/det/det_mv3_db.yml -o Global.pretrain_weights=./deploy/slim/prune/pretrain_models/det_mv3_db/best_accuracy Global.test_batch_size_per_card=1
+python deploy/slim/prune/sensitivity_anal.py -c configs/det/det_mv3_db_v1.1.yml -o Global.pretrain_weights=./deploy/slim/prune/pretrain_models/det_mv3_db/best_accuracy Global.test_batch_size_per_card=1
```
-## Model pruning and Fine-tune
+### 4. Model pruning and Fine-tune
When pruning, the previous sensitivity analysis file would determines the pruning ratio of each network layer. In the specific implementation, in order to retain as many low-level features extracted from the image as possible, we skipped the 4 convolutional layers close to the input in the backbone. Similarly, in order to reduce the model performance loss caused by pruning, we selected some of the less redundant and more sensitive [network layer](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/deploy/slim/prune/pruning_and_finetune.py#L41) through the sensitivity table obtained from the previous sensitivity analysis.And choose to skip these network layers in the subsequent pruning process. After pruning, the model need a finetune process to recover the performance and the training strategy of finetune is similar to the strategy of training original OCR detection model.
```bash
-python deploy/slim/prune/pruning_and_finetune.py -c configs/det/det_mv3_db.yml -o Global.pretrain_weights=./deploy/slim/prune/pretrain_models/det_mv3_db/best_accuracy Global.test_batch_size_per_card=1
+python deploy/slim/prune/pruning_and_finetune.py -c configs/det/det_mv3_db_v1.1.yml -o Global.pretrain_weights=./deploy/slim/prune/pretrain_models/det_mv3_db/best_accuracy Global.test_batch_size_per_card=1
```
+### 5. Export inference model and deploy it
-
-
-## Export inference model
-
-After getting the model after pruning and finetuning we, can export it as inference_model for predictive deployment:
-
+We can export the pruned model as inference_model for deployment:
```bash
-
-python deploy/slim/prune/export_prune_model.py -c configs/det/det_mv3_db.yml -o Global.pretrain_weights=./output/det_db/best_accuracy Global.test_batch_size_per_card=1 Global.save_inference_dir=inference_model
-
+python deploy/slim/prune/export_prune_model.py -c configs/det/det_mv3_db_v1.1.yml -o Global.pretrain_weights=./output/det_db/best_accuracy Global.test_batch_size_per_card=1 Global.save_inference_dir=inference_model
```
+
+Reference for prediction and deployment of inference model:
+1. [inference model python prediction](../../../doc/doc_en/inference_en.md)
+2. [inference model C++ prediction](../../cpp_infer/readme_en.md)
+3. [Deployment of inference model on mobile](../../lite/readme_en.md)
diff --git a/deploy/slim/prune/export_prune_model.py b/deploy/slim/prune/export_prune_model.py
index 0603966f8eeb9a59fa8c4494bf47de9cdaf53774..2ffcf1d8fa5a8847a720fde3e500d03c8117314d 100644
--- a/deploy/slim/prune/export_prune_model.py
+++ b/deploy/slim/prune/export_prune_model.py
@@ -24,6 +24,7 @@ sys.path.append(os.path.join(__dir__, '..', '..', '..'))
sys.path.append(os.path.join(__dir__, '..', '..', '..', 'tools'))
import program
+import paddle
from paddle import fluid
from ppocr.utils.utility import initial_logger
logger = initial_logger()
@@ -32,6 +33,12 @@ from paddleslim.prune import load_model
def main():
+ # Run code with static graph mode.
+ try:
+ paddle.enable_static()
+ except:
+ pass
+
startup_prog, eval_program, place, config, _ = program.preprocess()
feeded_var_names, target_vars, fetches_var_name = program.build_export(
diff --git a/deploy/slim/prune/pruning_and_finetune.py b/deploy/slim/prune/pruning_and_finetune.py
index 0a03cb449523232dbeedf1d7066b4ea4ba01f31f..b066b73682f649c58104a93eb46f99a4d610ad2d 100644
--- a/deploy/slim/prune/pruning_and_finetune.py
+++ b/deploy/slim/prune/pruning_and_finetune.py
@@ -19,6 +19,7 @@ from __future__ import print_function
import os
import sys
import numpy as np
+import paddle
__dir__ = os.path.dirname(__file__)
sys.path.append(__dir__)
sys.path.append(os.path.join(__dir__, '..', '..', '..'))
@@ -49,6 +50,12 @@ skip_list = [
def main():
+ # Run code with static graph mode.
+ try:
+ paddle.enable_static()
+ except:
+ pass
+
config = program.load_config(FLAGS.config)
program.merge_config(FLAGS.opt)
logger.info(config)
@@ -92,7 +99,8 @@ def main():
sen = load_sensitivities("sensitivities_0.data")
for i in skip_list:
- sen.pop(i)
+ if i in sen.keys():
+ sen.pop(i)
back_bone_list = ['conv' + str(x) for x in range(1, 5)]
for i in back_bone_list:
for key in list(sen.keys()):
@@ -134,7 +142,7 @@ def main():
if alg in ['EAST', 'DB']:
program.train_eval_det_run(
- config, exe, train_info_dict, eval_info_dict, is_pruning=True)
+ config, exe, train_info_dict, eval_info_dict, is_slim="prune")
else:
program.train_eval_rec_run(config, exe, train_info_dict, eval_info_dict)
diff --git a/deploy/slim/prune/sensitivity_anal.py b/deploy/slim/prune/sensitivity_anal.py
index b416f09a3a17527eccbd131917ca257b39bc7884..1eebd61408a0890957e2fdf9761eb938fb53d476 100644
--- a/deploy/slim/prune/sensitivity_anal.py
+++ b/deploy/slim/prune/sensitivity_anal.py
@@ -25,6 +25,7 @@ sys.path.append(os.path.join(__dir__, '..', '..', '..', 'tools'))
import json
import cv2
+import paddle
from paddle import fluid
import paddleslim as slim
from copy import deepcopy
@@ -60,6 +61,12 @@ def eval_function(eval_args, mode='eval'):
def main():
+ # Run code with static graph mode.
+ try:
+ paddle.enable_static()
+ except:
+ pass
+
config = program.load_config(FLAGS.config)
program.merge_config(FLAGS.opt)
logger.info(config)
diff --git a/deploy/slim/quantization/README.md b/deploy/slim/quantization/README.md
index d1aa3d71e5254cf6b5b2be7fdf6943903d42fafd..e1844367a02a45b681cdec48893ebcf9e59b1e17 100755
--- a/deploy/slim/quantization/README.md
+++ b/deploy/slim/quantization/README.md
@@ -1,162 +1,61 @@
-> 运行示例前请先安装1.2.0或更高版本PaddleSlim
-
-
-# 模型量化压缩教程
-
-压缩结果:
-
diff --git a/doc/doc_ch/whl.md b/doc/doc_ch/whl.md
index 46796ce64a60f12db9bbfbdd7b16ff77238c1831..1b04a9a8a967f39516db0c0f1be3e3842a87278b 100644
--- a/doc/doc_ch/whl.md
+++ b/doc/doc_ch/whl.md
@@ -11,8 +11,8 @@ pip install paddleocr
本地构建并安装
```bash
-python setup.py bdist_wheel
-pip install dist/paddleocr-x.x.x-py3-none-any.whl # x.x.x是paddleocr的版本号
+python3 setup.py bdist_wheel
+pip3 install dist/paddleocr-x.x.x-py3-none-any.whl # x.x.x是paddleocr的版本号
```
### 1. 代码使用
@@ -20,7 +20,7 @@ pip install dist/paddleocr-x.x.x-py3-none-any.whl # x.x.x是paddleocr的版本
```python
from paddleocr import PaddleOCR, draw_ocr
# Paddleocr目前支持中英文、英文、法语、德语、韩语、日语,可以通过修改lang参数进行切换
-# 参数依次为`zh`, `en`, `french`, `german`, `korean`, `japan`。
+# 参数依次为`ch`, `en`, `french`, `german`, `korean`, `japan`。
ocr = PaddleOCR(use_angle_cls=True, lang="ch") # need to run only once to download and load model into memory
img_path = 'PaddleOCR/doc/imgs/11.jpg'
result = ocr.ocr(img_path, cls=True)
@@ -280,7 +280,7 @@ paddleocr --image_dir PaddleOCR/doc/imgs/11.jpg --det_model_dir {your_det_model_
| rec_algorithm | 使用的识别算法类型 | CRNN |
| rec_model_dir | 识别模型所在文件夹。传参方式有两种,1. None: 自动下载内置模型到 `~/.paddleocr/rec`;2.自己转换好的inference模型路径,模型路径下必须包含model和params文件 | None |
| rec_image_shape | 识别算法的输入图片尺寸 | "3,32,320" |
-| rec_char_type | 识别算法的字符类型,中文(ch)或英文(en) | ch |
+| rec_char_type | 识别算法的字符类型,中英文(ch)、英文(en)、法语(french)、德语(german)、韩语(korean)、日语(japan) | ch |
| rec_batch_num | 进行识别时,同时前向的图片数 | 30 |
| max_text_length | 识别算法能识别的最大文字长度 | 25 |
| rec_char_dict_path | 识别模型字典路径,当rec_model_dir使用方式2传参时需要修改为自己的字典路径 | ./ppocr/utils/ppocr_keys_v1.txt |
diff --git a/doc/doc_en/algorithm_overview_en.md b/doc/doc_en/algorithm_overview_en.md
index 3b0f77841aedf7e2c3e4aad1d8856844ee8d0172..2e21fd621971e062384a9323e79a8cf4498d7495 100644
--- a/doc/doc_en/algorithm_overview_en.md
+++ b/doc/doc_en/algorithm_overview_en.md
@@ -1,9 +1,13 @@
+
## Algorithm introduction
-[TOC]
+This tutorial lists the text detection algorithms and text recognition algorithms supported by PaddleOCR, as well as the models and metrics of each algorithm on **English public datasets**. It is mainly used for algorithm introduction and algorithm performance comparison. For more models on other datasets including Chinese, please refer to [PP-OCR v1.1 models list](./models_list_en.md).
-
+- [1. Text Detection Algorithm](#TEXTDETECTIONALGORITHM)
+- [2. Text Recognition Algorithm](#TEXTRECOGNITIONALGORITHM)
+
+
### 1. Text Detection Algorithm
PaddleOCR open source text detection algorithms list:
@@ -29,14 +33,6 @@ On Total-Text dataset, the text detection result is as follows:
**Note:** Additional data, like icdar2013, icdar2017, COCO-Text, ArT, was added to the model training of SAST. Download English public dataset in organized format used by PaddleOCR from [Baidu Drive](https://pan.baidu.com/s/12cPnZcVuV1zn5DOd4mqjVw) (download code: 2bpi).
-For use of [LSVT](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_en/datasets_en.md#1-icdar2019-lsvt) street view dataset with a total of 3w training data,the related configuration and pre-trained models for text detection task are as follows:
-|Model|Backbone|Configuration file|Pre-trained model|
-|-|-|-|-|
-|ultra-lightweight OCR model|MobileNetV3|det_mv3_db.yml|[Download link](https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db.tar)|
-|General OCR model|ResNet50_vd|det_r50_vd_db.yml|[Download link](https://paddleocr.bj.bcebos.com/ch_models/ch_det_r50_vd_db.tar)|
-
-* Note: For the training and evaluation of the above DB model, post-processing parameters box_thresh=0.6 and unclip_ratio=1.5 need to be set. If using different datasets and different models for training, these two parameters can be adjusted for better result.
-
For the training guide and use of PaddleOCR text detection algorithms, please refer to the document [Text detection model training/evaluation/prediction](./doc/doc_en/detection_en.md)
@@ -67,11 +63,4 @@ Refer to [DTRB](https://arxiv.org/abs/1904.01906), the training and evaluation r
The average accuracy of the two-stage training in the original paper is 89.74%, and that of one stage training in paddleocr is 88.33%. Both pre-trained weights can be downloaded [here](https://paddleocr.bj.bcebos.com/SRN/rec_r50fpn_vd_none_srn.tar).
-We use [LSVT](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_en/datasets_en.md#1-icdar2019-lsvt) dataset and cropout 30w training data from original photos by using position groundtruth and make some calibration needed. In addition, based on the LSVT corpus, 500w synthetic data is generated to train the model. The related configuration and pre-trained models are as follows:
-
-|Model|Backbone|Configuration file|Pre-trained model|
-|-|-|-|-|
-|ultra-lightweight OCR model|MobileNetV3|rec_chinese_lite_train.yml|[Download link](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn.tar)|[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_enhance_infer.tar) & [pre-trained model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_enhance.tar)|
-|General OCR model|Resnet34_vd|rec_chinese_common_train.yml|[Download link](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn.tar)|[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_enhance_infer.tar) & [pre-trained model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_enhance.tar)|
-
Please refer to the document for training guide and use of PaddleOCR text recognition algorithms [Text recognition model training/evaluation/prediction](./doc/doc_en/recognition_en.md)
diff --git a/doc/doc_en/angle_class_en.md b/doc/doc_en/angle_class_en.md
index c7fff3a1833570cda7687b87efb7c3af2ec49120..c8c99c10a52fbc55caa6f796a0843e8ab9028949 100644
--- a/doc/doc_en/angle_class_en.md
+++ b/doc/doc_en/angle_class_en.md
@@ -110,7 +110,7 @@ The default prediction picture is stored in `infer_img`, and the weight is speci
```
# Predict English results
-python3 tools/infer_rec.py -c configs/cls/cls_mv3.yml -o Global.checkpoints={path/to/weights}/best_accuracy TestReader.infer_img=doc/imgs_words/en/word_1.jpg
+python3 tools/infer_cls.py -c configs/cls/cls_mv3.yml -o Global.checkpoints={path/to/weights}/best_accuracy Global.infer_img=doc/imgs_words/en/word_1.png
```
Input image:
diff --git a/doc/doc_en/config_en.md b/doc/doc_en/config_en.md
index b54def895f0758df7cdbd089253d6acd712d2b8e..722da6620fd03912c48a47679e7c13a23f15752e 100644
--- a/doc/doc_en/config_en.md
+++ b/doc/doc_en/config_en.md
@@ -10,7 +10,7 @@ The following list can be viewed via `--help`
## INTRODUCTION TO GLOBAL PARAMETERS OF CONFIGURATION FILE
-Take `rec_chinese_lite_train.yml` as an example
+Take `rec_chinese_lite_train_v1.1.yml` as an example
| Parameter | Use | Default | Note |
@@ -32,6 +32,7 @@ Take `rec_chinese_lite_train.yml` as an example
| loss_type | Set loss type | ctc | Supports two types of loss: ctc / attention |
| distort | Set use distort | false | Support distort type ,read [img_tools.py](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/ppocr/data/rec/img_tools.py) |
| use_space_char | Wether to recognize space | false | Only support in character_type=ch mode |
+ label_list | Set the angle supported by the direction classifier | ['0','180'] | Only valid in the direction classifier |
| reader_yml | Set the reader configuration file | ./configs/rec/rec_icdar15_reader.yml | \ |
| pretrain_weights | Load pre-trained model path | ./pretrain_models/CRNN/best_accuracy | \ |
| checkpoints | Load saved model path | None | Used to load saved parameters to continue training after interruption |
diff --git a/doc/doc_en/detection_en.md b/doc/doc_en/detection_en.md
index 401d7a9ad479716a6d6694ca1f432a2c934def88..2d9983be7892b1e93a762b337c0c8bd26d79cc5b 100644
--- a/doc/doc_en/detection_en.md
+++ b/doc/doc_en/detection_en.md
@@ -27,7 +27,7 @@ The provided annotation file format is as follow, seperated by "\t":
" Image file name Image annotation information encoded by json.dumps"
ch4_test_images/img_61.jpg [{"transcription": "MASA", "points": [[310, 104], [416, 141], [418, 216], [312, 179]]}, {...}]
```
-The image annotation after **json.dumps()** encoding is a list containing multiple dictionaries.
+The image annotation after **json.dumps()** encoding is a list containing multiple dictionaries.
The `points` in the dictionary represent the coordinates (x, y) of the four points of the text box, arranged clockwise from the point at the upper left corner.
@@ -38,12 +38,14 @@ If you want to train PaddleOCR on other datasets, please build the annotation fi
## TRAINING
-First download the pretrained model. The detection model of PaddleOCR currently supports two backbones, namely MobileNetV3 and ResNet50_vd. You can use the model in [PaddleClas](https://github.com/PaddlePaddle/PaddleClas/tree/master/ppcls/modeling/architectures) to replace backbone according to your needs.
+First download the pretrained model. The detection model of PaddleOCR currently supports 3 backbones, namely MobileNetV3, ResNet18_vd and ResNet50_vd. You can use the model in [PaddleClas](https://github.com/PaddlePaddle/PaddleClas/tree/master/ppcls/modeling/architectures) to replace backbone according to your needs.
```shell
cd PaddleOCR/
# Download the pre-trained model of MobileNetV3
wget -P ./pretrain_models/ https://paddle-imagenet-models-name.bj.bcebos.com/MobileNetV3_large_x0_5_pretrained.tar
-# Download the pre-trained model of ResNet50
+# or, download the pre-trained model of ResNet18_vd
+wget -P ./pretrain_models/ https://paddle-imagenet-models-name.bj.bcebos.com/ResNet18_vd_pretrained.tar
+# or, download the pre-trained model of ResNet50_vd
wget -P ./pretrain_models/ https://paddle-imagenet-models-name.bj.bcebos.com/ResNet50_vd_ssld_pretrained.tar
# decompressing the pre-training model file, take MobileNetV3 as an example
@@ -62,7 +64,7 @@ tar -xf ./pretrain_models/MobileNetV3_large_x0_5_pretrained.tar ./pretrain_model
#### START TRAINING
*If CPU version installed, please set the parameter `use_gpu` to `false` in the configuration.*
```shell
-python3 tools/train.py -c configs/det/det_mv3_db.yml 2>&1 | tee train_det.log
+python3 tools/train.py -c configs/det/det_mv3_db_v1.1.yml 2>&1 | tee train_det.log
```
In the above instruction, use `-c` to select the training to use the `configs/det/det_db_mv3.yml` configuration file.
@@ -70,7 +72,7 @@ For a detailed explanation of the configuration file, please refer to [config](.
You can also use `-o` to change the training parameters without modifying the yml file. For example, adjust the training learning rate to 0.0001
```shell
-python3 tools/train.py -c configs/det/det_mv3_db.yml -o Optimizer.base_lr=0.0001
+python3 tools/train.py -c configs/det/det_mv3_db_v1.1.yml -o Optimizer.base_lr=0.0001
```
#### load trained model and continue training
@@ -78,7 +80,7 @@ If you expect to load trained model and continue the training again, you can spe
For example:
```shell
-python3 tools/train.py -c configs/det/det_mv3_db.yml -o Global.checkpoints=./your/trained/model
+python3 tools/train.py -c configs/det/det_mv3_db_v1.1.yml -o Global.checkpoints=./your/trained/model
```
**Note**: The priority of `Global.checkpoints` is higher than that of `Global.pretrain_weights`, that is, when two parameters are specified at the same time, the model specified by `Global.checkpoints` will be loaded first. If the model path specified by `Global.checkpoints` is wrong, the one specified by `Global.pretrain_weights` will be loaded.
@@ -88,18 +90,18 @@ python3 tools/train.py -c configs/det/det_mv3_db.yml -o Global.checkpoints=./you
PaddleOCR calculates three indicators for evaluating performance of OCR detection task: Precision, Recall, and Hmean.
-Run the following code to calculate the evaluation indicators. The result will be saved in the test result file specified by `save_res_path` in the configuration file `det_db_mv3.yml`
+Run the following code to calculate the evaluation indicators. The result will be saved in the test result file specified by `save_res_path` in the configuration file `det_db_mv3_v1.1.yml`
When evaluating, set post-processing parameters `box_thresh=0.6`, `unclip_ratio=1.5`. If you use different datasets, different models for training, these two parameters should be adjusted for better result.
```shell
-python3 tools/eval.py -c configs/det/det_mv3_db.yml -o Global.checkpoints="{path/to/weights}/best_accuracy" PostProcess.box_thresh=0.6 PostProcess.unclip_ratio=1.5
+python3 tools/eval.py -c configs/det/det_mv3_db_v1.1.yml -o Global.checkpoints="{path/to/weights}/best_accuracy" PostProcess.box_thresh=0.6 PostProcess.unclip_ratio=1.5
```
The model parameters during training are saved in the `Global.save_model_dir` directory by default. When evaluating indicators, you need to set `Global.checkpoints` to point to the saved parameter file.
Such as:
```shell
-python3 tools/eval.py -c configs/det/det_mv3_db.yml -o Global.checkpoints="./output/det_db/best_accuracy" PostProcess.box_thresh=0.6 PostProcess.unclip_ratio=1.5
+python3 tools/eval.py -c configs/det/det_mv3_db_v1.1.yml -o Global.checkpoints="./output/det_db/best_accuracy" PostProcess.box_thresh=0.6 PostProcess.unclip_ratio=1.5
```
* Note: `box_thresh` and `unclip_ratio` are parameters required for DB post-processing, and not need to be set when evaluating the EAST model.
@@ -108,16 +110,16 @@ python3 tools/eval.py -c configs/det/det_mv3_db.yml -o Global.checkpoints="./ou
Test the detection result on a single image:
```shell
-python3 tools/infer_det.py -c configs/det/det_mv3_db.yml -o TestReader.infer_img="./doc/imgs_en/img_10.jpg" Global.checkpoints="./output/det_db/best_accuracy"
+python3 tools/infer_det.py -c configs/det/det_mv3_db_v1.1.yml -o Global.infer_img="./doc/imgs_en/img_10.jpg" Global.checkpoints="./output/det_db/best_accuracy"
```
When testing the DB model, adjust the post-processing threshold:
```shell
-python3 tools/infer_det.py -c configs/det/det_mv3_db.yml -o TestReader.infer_img="./doc/imgs_en/img_10.jpg" Global.checkpoints="./output/det_db/best_accuracy" PostProcess.box_thresh=0.6 PostProcess.unclip_ratio=1.5
+python3 tools/infer_det.py -c configs/det/det_mv3_db_v1.1.yml -o Global.infer_img="./doc/imgs_en/img_10.jpg" Global.checkpoints="./output/det_db/best_accuracy" PostProcess.box_thresh=0.6 PostProcess.unclip_ratio=1.5
```
Test the detection result on all images in the folder:
```shell
-python3 tools/infer_det.py -c configs/det/det_mv3_db.yml -o TestReader.infer_img="./doc/imgs_en/" Global.checkpoints="./output/det_db/best_accuracy"
+python3 tools/infer_det.py -c configs/det/det_mv3_db_v1.1.yml -o Global.infer_img="./doc/imgs_en/" Global.checkpoints="./output/det_db/best_accuracy"
```
diff --git a/doc/doc_en/inference_en.md b/doc/doc_en/inference_en.md
index 1cdad899af727f645dd6cb6001229be464f46bef..609b65fa55a743acd72407a34288afc793885d3c 100644
--- a/doc/doc_en/inference_en.md
+++ b/doc/doc_en/inference_en.md
@@ -5,7 +5,7 @@ The inference model (the model saved by `fluid.io.save_inference_model`) is gene
The model saved during the training process is the checkpoints model, which saves the parameters of the model and is mostly used to resume training.
-Compared with the checkpoints model, the inference model will additionally save the structural information of the model. It has superior performance in predicting in deployment and accelerating inferencing, is flexible and convenient, and is suitable for integration with actual systems. For more details, please refer to the document [Classification Framework](https://paddleclas.readthedocs.io/zh_CN/latest/extension/paddle_inference.html).
+Compared with the checkpoints model, the inference model will additionally save the structural information of the model. It has superior performance in predicting in deployment and accelerating inferencing, is flexible and convenient, and is suitable for integration with actual systems. For more details, please refer to the document [Classification Framework](https://github.com/PaddlePaddle/PaddleClas/blob/master/docs/zh_CN/extension/paddle_inference.md).
Next, we first introduce how to convert a trained model into an inference model, and then we will introduce text detection, text recognition, and the concatenation of them based on inference model.
@@ -26,7 +26,9 @@ Next, we first introduce how to convert a trained model into an inference model,
- [1. LIGHTWEIGHT CHINESE MODEL](#LIGHTWEIGHT_RECOGNITION)
- [2. CTC-BASED TEXT RECOGNITION MODEL INFERENCE](#CTC-BASED_RECOGNITION)
- [3. ATTENTION-BASED TEXT RECOGNITION MODEL INFERENCE](#ATTENTION-BASED_RECOGNITION)
- - [4. TEXT RECOGNITION MODEL INFERENCE USING CUSTOM CHARACTERS DICTIONARY](#USING_CUSTOM_CHARACTERS)
+ - [4. SRN-BASED TEXT RECOGNITION MODEL INFERENCE](#SRN-BASED_RECOGNITION)
+ - [5. TEXT RECOGNITION MODEL INFERENCE USING CUSTOM CHARACTERS DICTIONARY](#USING_CUSTOM_CHARACTERS)
+ - [6. MULTILINGUAL MODEL INFERENCE](MULTILINGUAL_MODEL_INFERENCE)
- [ANGLE CLASSIFICATION MODEL INFERENCE](#ANGLE_CLASS_MODEL_INFERENCE)
- [1. ANGLE CLASSIFICATION MODEL INFERENCE](#ANGLE_CLASS_MODEL_INFERENCE)
@@ -42,8 +44,9 @@ Next, we first introduce how to convert a trained model into an inference model,
Download the lightweight Chinese detection model:
```
-wget -P ./ch_lite/ https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db.tar && tar xf ./ch_lite/ch_det_mv3_db.tar -C ./ch_lite/
+wget -P ./ch_lite/ https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar && tar xf ./ch_lite/ch_ppocr_mobile_v1.1_det_train.tar -C ./ch_lite/
```
+
The above model is a DB algorithm trained with MobileNetV3 as the backbone. To convert the trained model into an inference model, just run the following command:
```
# -c Set the training algorithm yml configuration file
@@ -51,9 +54,9 @@ The above model is a DB algorithm trained with MobileNetV3 as the backbone. To c
# Global.checkpoints parameter Set the training model address to be converted without adding the file suffix .pdmodel, .pdopt or .pdparams.
# Global.save_inference_dir Set the address where the converted model will be saved.
-python3 tools/export_model.py -c configs/det/det_mv3_db.yml -o Global.checkpoints=./ch_lite/det_mv3_db/best_accuracy \
- Global.save_inference_dir=./inference/det_db/
+python3 tools/export_model.py -c configs/det/det_mv3_db_v1.1.yml -o Global.checkpoints=./ch_lite/ch_ppocr_mobile_v1.1_det_train/best_accuracy Global.save_inference_dir=./inference/det_db/
```
+
When converting to an inference model, the configuration file used is the same as the configuration file used during training. In addition, you also need to set the `Global.checkpoints` and `Global.save_inference_dir` parameters in the configuration file.
`Global.checkpoints` points to the model parameter file saved during training, and `Global.save_inference_dir` is the directory where the generated inference model is saved.
After the conversion is successful, there are two files in the `save_inference_dir` directory:
@@ -68,7 +71,7 @@ inference/det_db/
Download the lightweight Chinese recognition model:
```
-wget -P ./ch_lite/ https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn.tar && tar xf ./ch_lite/ch_rec_mv3_crnn.tar -C ./ch_lite/
+wget -P ./ch_lite/ https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_train.tar && tar xf ch_ppocr_mobile_v1.1_rec_train.tar -C ./ch_lite/
```
The recognition model is converted to the inference model in the same way as the detection, as follows:
@@ -78,8 +81,7 @@ The recognition model is converted to the inference model in the same way as the
# Global.checkpoints parameter Set the training model address to be converted without adding the file suffix .pdmodel, .pdopt or .pdparams.
# Global.save_inference_dir Set the address where the converted model will be saved.
-python3 tools/export_model.py -c configs/rec/rec_chinese_lite_train.yml -o Global.checkpoints=./ch_lite/rec_mv3_crnn/best_accuracy \
- Global.save_inference_dir=./inference/rec_crnn/
+python3 tools/export_model.py -c configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml -o Global.checkpoints=./ch_lite/ch_ppocr_mobile_v1.1_rec_train/best_accuracy \
```
If you have a model trained on your own dataset with a different dictionary file, please make sure that you modify the `character_dict_path` in the configuration file to your dictionary file path.
@@ -96,7 +98,7 @@ After the conversion is successful, there are two files in the directory:
Download the angle classification model:
```
-wget -P ./ch_lite/ https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile-v1.1.cls_pre.tar && tar xf ./ch_lite/ch_ppocr_mobile-v1.1.cls_pre.tar -C ./ch_lite/
+wget -P ./ch_lite/ https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_train.tar && tar xf ./ch_lite/ch_ppocr_mobile_v1.1_cls_train.tar -C ./ch_lite/
```
The angle classification model is converted to the inference model in the same way as the detection, as follows:
@@ -106,7 +108,7 @@ The angle classification model is converted to the inference model in the same w
# Global.checkpoints parameter Set the training model address to be converted without adding the file suffix .pdmodel, .pdopt or .pdparams.
# Global.save_inference_dir Set the address where the converted model will be saved.
-python3 tools/export_model.py -c configs/cls/cls_mv3.yml -o Global.checkpoints=./ch_lite/cls_model/best_accuracy \
+python3 tools/export_model.py -c configs/cls/cls_mv3.yml -o Global.checkpoints=./ch_lite/ch_ppocr_mobile_v1.1_cls_train/best_accuracy \
Global.save_inference_dir=./inference/cls/
```
@@ -299,31 +301,45 @@ self.character_str = "0123456789abcdefghijklmnopqrstuvwxyz"
dict_character = list(self.character_str)
```
+
+### 4. SRN-BASED TEXT RECOGNITION MODEL INFERENCE
+
+The recognition model based on SRN requires additional setting of the recognition algorithm parameter --rec_algorithm="SRN".
+At the same time, it is necessary to ensure that the predicted shape is consistent with the training, such as: --rec_image_shape="1, 64, 256"
+
+```
+python3 tools/infer/predict_rec.py --image_dir="./doc/imgs_words_en/word_336.png" \
+ --rec_model_dir="./inference/srn/" \
+ --rec_image_shape="1, 64, 256" \
+ --rec_char_type="en" \
+ --rec_algorithm="SRN"
+```
+
+
-### 4. TEXT RECOGNITION MODEL INFERENCE USING CUSTOM CHARACTERS DICTIONARY
+### 5. TEXT RECOGNITION MODEL INFERENCE USING CUSTOM CHARACTERS DICTIONARY
If the chars dictionary is modified during training, you need to specify the new dictionary path by setting the parameter `rec_char_dict_path` when using your inference model to predict.
```
python3 tools/infer/predict_rec.py --image_dir="./doc/imgs_words_en/word_336.png" --rec_model_dir="./your inference model" --rec_image_shape="3, 32, 100" --rec_char_type="en" --rec_char_dict_path="your text dict path"
```
-
-
-### 5. Multilingual Model Reasoning
+
+### 6. MULTILINGAUL MODEL INFERENCE
If you need to predict other language models, when using inference model prediction, you need to specify the dictionary path used by `--rec_char_dict_path`. At the same time, in order to get the correct visualization results,
You need to specify the visual font path through `--vis_font_path`. There are small language fonts provided by default under the `doc/` path, such as Korean recognition:
```
-python3 tools/infer/predict_rec.py --image_dir="./doc/imgs_words/korean/1.jpg" --rec_model_dir="./your inference model" --rec_char_type="korean" --rec_char_dict_path="ppocr/ utils/korean_dict.txt" --vis_font_path="doc/korean.ttf"
+python3 tools/infer/predict_rec.py --image_dir="./doc/imgs_words/korean/1.jpg" --rec_model_dir="./your inference model" --rec_char_type="korean" --rec_char_dict_path="ppocr/utils/dict/korean_dict.txt" --vis_font_path="doc/korean.ttf"
```

After executing the command, the prediction result of the above figure is:
``` text
-2020-09-19 16:15:05,076-INFO: index: [205 206 38 39]
-2020-09-19 16:15:05,077-INFO: word : 바탕으로
-2020-09-19 16:15:05,077-INFO: score: 0.9171358942985535
+2020-09-19 16:15:05,076-INFO: index: [205 206 38 39]
+2020-09-19 16:15:05,077-INFO: word : 바탕으로
+2020-09-19 16:15:05,077-INFO: score: 0.9171358942985535
```
@@ -357,7 +373,11 @@ Predicts of ./doc/imgs_words/ch/word_4.jpg:['0', 0.9999963]
When performing prediction, you need to specify the path of a single image or a folder of images through the parameter `image_dir`, the parameter `det_model_dir` specifies the path to detect the inference model, the parameter `cls_model_dir` specifies the path to angle classification inference model and the parameter `rec_model_dir` specifies the path to identify the inference model. The parameter `use_angle_cls` is used to control whether to enable the angle classification model.The visualized recognition results are saved to the `./inference_results` folder by default.
```
-python3 tools/infer/predict_system.py --image_dir="./doc/imgs/2.jpg" --det_model_dir="./inference/det_db/" --cls_model_dir="./inference/cls/" --rec_model_dir="./inference/rec_crnn/" --use_angle_cls true
+# use direction classifier
+python3 tools/infer/predict_system.py --image_dir="./doc/imgs/2.jpg" --det_model_dir="./inference/det_db/" --cls_model_dir="./inference/cls/" --rec_model_dir="./inference/rec_crnn/" --use_angle_cls=true
+
+# not use use direction classifier
+python3 tools/infer/predict_system.py --image_dir="./doc/imgs/2.jpg" --det_model_dir="./inference/det_db/" --rec_model_dir="./inference/rec_crnn/"
```
After executing the command, the recognition result image is as follows:
diff --git a/doc/doc_en/installation_en.md b/doc/doc_en/installation_en.md
index b62d9b298dcb6f1757cb1a522565fb4c19484d6d..12af13c0b33e72f9cfd412e1990ebcddb167c54c 100644
--- a/doc/doc_en/installation_en.md
+++ b/doc/doc_en/installation_en.md
@@ -3,7 +3,7 @@
After testing, paddleocr can run on glibc 2.23. You can also test other glibc versions or install glic 2.23 for the best compatibility.
PaddleOCR working environment:
-- PaddlePaddle1.7
+- PaddlePaddle1.8+, Recommend PaddlePaddle 2.0.0.beta
- python3.7
- glibc 2.23
@@ -18,7 +18,7 @@ cd /home/Projects
# You need to create a docker container for the first run, and do not need to run the current command when you run it again
# Create a docker container named ppocr and map the current directory to the /paddle directory of the container
-#If using CPU, use docker instead of nvidia-docker to create docker
+# If using CPU, use docker instead of nvidia-docker to create docker
sudo docker run --name ppocr -v $PWD:/paddle --network=host -it hub.baidubce.com/paddlepaddle/paddle:latest-gpu-cuda9.0-cudnn7-dev /bin/bash
```
If using CUDA9, please run the following command to create a container:
@@ -49,18 +49,15 @@ docker images
hub.baidubce.com/paddlepaddle/paddle latest-gpu-cuda9.0-cudnn7-dev f56310dcc829
```
-**2. Install PaddlePaddle Fluid v1.7 (the higher version is not supported yet, the adaptation work is in progress)**
+**2. Install PaddlePaddle v2.0**
```
-pip3 install --upgrade pip
+python3 -m pip install --upgrade pip
-# If you have cuda9 installed on your machine, please run the following command to install
-python3 -m pip install paddlepaddle-gpu==1.7.2.post97 -i https://pypi.tuna.tsinghua.edu.cn/simple
-
-# If you have cuda10 installed on your machine, please run the following command to install
-python3 -m pip install paddlepaddle-gpu==1.7.2.post107 -i https://pypi.tuna.tsinghua.edu.cn/simple
+# If you have cuda9 or cuda10 installed on your machine, please run the following command to install
+python3 -m pip install paddlepaddle-gpu==2.0.0b0 -i https://mirror.baidu.com/pypi/simple
# If you only have cpu on your machine, please run the following command to install
-python3 -m pip install paddlepaddle==1.7.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
+python3 -m pip install paddlepaddle==2.0.0b0 -i https://mirror.baidu.com/pypi/simple
```
For more software version requirements, please refer to the instructions in [Installation Document](https://www.paddlepaddle.org.cn/install/quick) for operation.
@@ -80,7 +77,7 @@ git clone https://gitee.com/paddlepaddle/PaddleOCR
**4. Install third-party libraries**
```
cd PaddleOCR
-pip3 install -r requirments.txt
+python3 -m pip install -r requirements.txt
```
If you getting this error `OSError: [WinError 126] The specified module could not be found` when you install shapely on windows.
diff --git a/doc/doc_en/models_list_en.md b/doc/doc_en/models_list_en.md
index 71878ac32bc116448de6d74888bbce59dbb0bb05..3d3cdc1d6c2e2a52c64f6ed0fd502456271173b6 100644
--- a/doc/doc_en/models_list_en.md
+++ b/doc/doc_en/models_list_en.md
@@ -18,11 +18,11 @@ The downloadable models provided by PaddleOCR include `inference model`, `traine
### 1. Text Detection Model
-|model name|description|model size|download|
-|-|-|-|-|
-|ch_ppocr_mobile_slim_v1.1_det|Slim pruned lightweight model, supporting Chinese, English, multilingual text detection|1.4M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/det/ch_ppocr_mobile_v1.1_det_prune_infer.tar) / [slim model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/det/ch_ppocr_mobile_v1.1_det_prune_opt.nb)|
-|ch_ppocr_mobile_v1.1_det|Original lightweight model, supporting Chinese, English, multilingual text detection|2.6M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar)|
-|ch_ppocr_server_v1.1_det|General model, which is larger than the lightweight model, but achieved better performance|47.2M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_train.tar)|
+|model name|description|config|model size|download|
+|-|-|-|-|-|
+|ch_ppocr_mobile_slim_v1.1_det|Slim pruned lightweight model, supporting Chinese, English, multilingual text detection|[det_mv3_db_v1.1.yml](../../configs/det/det_mv3_db_v1.1.yml)|1.4M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/det/ch_ppocr_mobile_v1.1_det_prune_infer.tar) / [slim model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_det_prune_opt.nb)|
+|ch_ppocr_mobile_v1.1_det|Original lightweight model, supporting Chinese, English, multilingual text detection|[det_mv3_db_v1.1.yml](../../configs/det/det_mv3_db_v1.1.yml)|2.6M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar)|
+|ch_ppocr_server_v1.1_det|General model, which is larger than the lightweight model, but achieved better performance|[det_r18_vd_db_v1.1.yml](../../configs/det/det_r18_vd_db_v1.1.yml)|47.2M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_train.tar)|
@@ -30,41 +30,41 @@ The downloadable models provided by PaddleOCR include `inference model`, `traine
#### Chinese Recognition Model
-|model name|description|model size|download|
-|-|-|-|-|
-|ch_ppocr_mobile_slim_v1.1_rec|Slim pruned and quantized lightweight model, supporting Chinese, English and number recognition|1.6M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/rec/ch_ppocr_mobile_v1.1_rec_quant_infer.tar) / [slim model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/rec/ch_ppocr_mobile_v1.1_rec_quant_opt.nb)|
-|ch_ppocr_mobile_v1.1_rec|Original lightweight model, supporting Chinese, English and number recognition|4.6M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_train.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_pre.tar)|
-|ch_ppocr_server_v1.1_rec|General model, supporting Chinese, English and number recognition|105M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_train.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_pre.tar)|
+|model name|description|config|model size|download|
+|-|-|-|-|-|
+|ch_ppocr_mobile_slim_v1.1_rec|Slim pruned and quantized lightweight model, supporting Chinese, English and number recognition|[rec_chinese_lite_train_v1.1.yml](../../configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml)|1.6M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/rec/ch_ppocr_mobile_v1.1_rec_quant_infer.tar) / [slim model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_rec_quant_opt.nb) |
+|ch_ppocr_mobile_v1.1_rec|Original lightweight model, supporting Chinese, English and number recognition|[rec_chinese_lite_train_v1.1.yml](../../configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml)|4.6M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_train.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_pre.tar) |
+|ch_ppocr_server_v1.1_rec|General model, supporting Chinese, English and number recognition|[rec_chinese_common_train_v1.1.yml](../../configs/rec/ch_ppocr_v1.1/rec_chinese_common_train_v1.1.yml)|105M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_train.tar) / [pre-trained model](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_pre.tar) |
**Note:** The `trained model` is finetuned on the `pre-trained model` with real data and synthsized vertical text data, which achieved better performance in real scene. The `pre-trained model` is directly trained on the full amount of real data and synthsized data, which is more suitable for finetune on your own dataset.
#### English Recognition Model
-|model name|description|model size|download|
-|-|-|-|-|
-|en_ppocr_mobile_slim_v1.1_rec|Slim pruned and quantized lightweight model, supporting English and number recognition|0.9M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/en/en_ppocr_mobile_v1.1_rec_quant_infer.tar) / [slim model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/en/en_ppocr_mobile_v1.1_rec_quant_opt.nb)|
-|en_ppocr_mobile_v1.1_rec|Original lightweight model, supporting English and number recognition|2.0M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/en/en_ppocr_mobile_v1.1_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/en/en_ppocr_mobile_v1.1_rec_train.tar)|
+|model name|description|config|model size|download|
+|-|-|-|-|-|
+|en_ppocr_mobile_slim_v1.1_rec|Slim pruned and quantized lightweight model, supporting English and number recognition|[rec_en_lite_train.yml](../../configs/rec/multi_languages/rec_en_lite_train.yml)|0.9M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/en/en_ppocr_mobile_v1.1_rec_quant_infer.tar) / [slim model](https://paddleocr.bj.bcebos.com/20-09-22/mobile-slim/en/en_ppocr_mobile_v1.1_rec_quant_opt.nb) |
+|en_ppocr_mobile_v1.1_rec|Original lightweight model, supporting English and number recognition|[rec_en_lite_train.yml](../../configs/rec/multi_languages/rec_en_lite_train.yml)|2.0M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/en/en_ppocr_mobile_v1.1_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/en/en_ppocr_mobile_v1.1_rec_train.tar) |
#### Multilingual Recognition Model(Updating...)
-|model name|description|model size|download|
-|-|-|-|-|
-| french_ppocr_mobile_v1.1_rec |Lightweight model for French recognition|2.1M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/fr/french_ppocr_mobile_v1.1_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/fr/french_ppocr_mobile_v1.1_rec_train.tar)|
-| german_ppocr_mobile_v1.1_rec |German model for French recognition|2.1M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/ge/german_ppocr_mobile_v1.1_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/ge/german_ppocr_mobile_v1.1_rec_train.tar)|
-| korean_ppocr_mobile_v1.1_rec |Lightweight model for Korean recognition|3.4M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/kr/korean_ppocr_mobile_v1.1_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/kr/korean_ppocr_mobile_v1.1_rec_train.tar)|
-| japan_ppocr_mobile_v1.1_rec |Lightweight model for Japanese recognition|3.7M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/jp/japan_ppocr_mobile_v1.1_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/jp/japan_ppocr_mobile_v1.1_rec_train.tar)|
+|model name|description|config|model size|download|
+|-|-|-|-|-|
+| french_ppocr_mobile_v1.1_rec |Lightweight model for French recognition|[rec_french_lite_train.yml](../../configs/rec/multi_languages/rec_french_lite_train.yml)|2.1M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/fr/french_ppocr_mobile_v1.1_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/fr/french_ppocr_mobile_v1.1_rec_train.tar) |
+| german_ppocr_mobile_v1.1_rec |German model for French recognition|[rec_ger_lite_train.yml](../../configs/rec/multi_languages/rec_ger_lite_train.yml)|2.1M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/ge/german_ppocr_mobile_v1.1_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/ge/german_ppocr_mobile_v1.1_rec_train.tar) |
+| korean_ppocr_mobile_v1.1_rec |Lightweight model for Korean recognition|[rec_korean_lite_train.yml](../../configs/rec/multi_languages/rec_korean_lite_train.yml)|3.4M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/kr/korean_ppocr_mobile_v1.1_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/kr/korean_ppocr_mobile_v1.1_rec_train.tar) |
+| japan_ppocr_mobile_v1.1_rec |Lightweight model for Japanese recognition|[rec_japan_lite_train.yml](../../configs/rec/multi_languages/rec_japan_lite_train.yml)|3.7M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/jp/japan_ppocr_mobile_v1.1_rec_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/jp/japan_ppocr_mobile_v1.1_rec_train.tar) |
### 3. Text Angle Classification Model
-|model name|description|model size|download|
-|-|-|-|-|
-|ch_ppocr_mobile_v1.1_cls_quant|Slim quantized model|0.5M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_quant_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_quant_train.tar) / [slim model]()|
-|ch_ppocr_mobile_v1.1_cls|Original model|850kb|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_train.tar)|
+|model name|description|config|model size|download|
+|-|-|-|-|-|
+|ch_ppocr_mobile_v1.1_cls_quant|Slim quantized model|[cls_mv3.yml](../../configs/cls/cls_mv3.yml)|0.5M|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_quant_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_quant_train.tar) / [slim model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/lite/ch_ppocr_mobile_v1.1_cls_quant_opt.nb) |
+|ch_ppocr_mobile_v1.1_cls|Original model|[cls_mv3.yml](../../configs/cls/cls_mv3.yml)|850kb|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_train.tar) |
## OCR model list(V1.0, updated on 7.16)
|model name|description|detection model|recognition model|recognition model supporting space recognition|
|-|-|-|-|-|
-|chinese_db_crnn_mobile|8.6M lightweight OCR model|[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db.tar)|[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn.tar)|[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_enhance_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_enhance.tar)
-|chinese_db_crnn_server|General OCR model|[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_det_r50_vd_db_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/ch_models/ch_det_r50_vd_db.tar)|[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn.tar)|[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_enhance_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_enhance.tar)
+|chinese_db_crnn_mobile|8.6M lightweight OCR model|[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db.tar) | [inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn.tar) |[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_enhance_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_enhance.tar)
+|chinese_db_crnn_server|General OCR model|[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_det_r50_vd_db_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/ch_models/ch_det_r50_vd_db.tar) | [inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn.tar) |[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_enhance_infer.tar) / [trained model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_enhance.tar)
diff --git a/doc/doc_en/quickstart_en.md b/doc/doc_en/quickstart_en.md
index d1fa1683fcfea14be477c910fb2a8dc7709c5d36..bc5700e77bbb03e79216e9af4594e3c862b13a4e 100644
--- a/doc/doc_en/quickstart_en.md
+++ b/doc/doc_en/quickstart_en.md
@@ -5,16 +5,19 @@
Please refer to [quick installation](./installation_en.md) to configure the PaddleOCR operating environment.
-*Note: Support the use of PaddleOCR through whl package installation,pelease refer [PaddleOCR Package](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_en/whl_en.md)。*
+* Note: Support the use of PaddleOCR through whl package installation,pelease refer [PaddleOCR Package](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_en/whl_en.md).
## 2.inference models
-| Name | Introduction | Detection model | Recognition model | Recognition model with space support |
-|-|-|-|-|-|
-|chinese_db_crnn_mobile| Ultra-lightweight Chinese OCR model |[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db_infer.tar) / [pretrained model](https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db.tar)|[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_infer.tar) / [pretrained model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn.tar)|[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_enhance_infer.tar) / [pretrained model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_enhance.tar)
-|chinese_db_crnn_server| Universal Chinese OCR model |[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_det_r50_vd_db_infer.tar) / [pretrained model](https://paddleocr.bj.bcebos.com/ch_models/ch_det_r50_vd_db.tar)|[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_infer.tar) / [pretrained model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn.tar)|[inference model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_enhance_infer.tar) / [pretrained model](https://paddleocr.bj.bcebos.com/ch_models/ch_rec_r34_vd_crnn_enhance.tar)
+The detection and recognition models on the mobile and server sides are as follows. For more models (including multiple languages), please refer to [PP-OCR v1.1 series model list](../doc_ch/models_list.md)
-* If wget is not installed in the windows environment, you can copy the link to the browser to download when downloading the model, and uncompress it and place it in the corresponding directory.
+
+| Model introduction | Model name | Recommended scene | Detection model | Direction Classifier | Recognition model |
+| ------------ | --------------- | ----------------|---- | ---------- | -------- |
+| Ultra-lightweight Chinese OCR model(8.1M) | ch_ppocr_mobile_v1.1_xx |Mobile-side/Server-side|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar) / [pretrained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_train.tar)|[inference model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar) / [pretrained model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_train.tar) |[inference model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_infer.tar) / [pretrained model](https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_pre.tar) |
+| Universal Chinese OCR model(155.1M) |ch_ppocr_server_v1.1_xx|Server-side |[inference model](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_infer.tar) / [pretrained model](https://paddleocr.bj.bcebos.com/20-09-22/server/det/ch_ppocr_server_v1.1_det_train.tar) |[inference model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar) / [pretrained model](https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_train.tar) |[inference model](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_infer.tar) / [pretrained model](https://paddleocr.bj.bcebos.com/20-09-22/server/rec/ch_ppocr_server_v1.1_rec_pre.tar) |
+
+* If `wget` is not installed in the windows environment, you can copy the link to the browser to download when downloading the model, then uncompress it and place it in the corresponding directory.
Copy the download address of the `inference model` for detection and recognition in the table above, and uncompress them.
@@ -24,6 +27,8 @@ mkdir inference && cd inference
wget {url/of/detection/inference_model} && tar xf {name/of/detection/inference_model/package}
# Download the recognition model and unzip
wget {url/of/recognition/inference_model} && tar xf {name/of/recognition/inference_model/package}
+# Download the direction classifier model and unzip
+wget {url/of/classification/inference_model} && tar xf {name/of/classification/inference_model/package}
cd ..
```
@@ -32,9 +37,11 @@ Take the ultra-lightweight model as an example:
```
mkdir inference && cd inference
# Download the detection model of the ultra-lightweight Chinese OCR model and uncompress it
-wget https://paddleocr.bj.bcebos.com/ch_models/ch_det_mv3_db_infer.tar && tar xf ch_det_mv3_db_infer.tar
+wget https://paddleocr.bj.bcebos.com/20-09-22/mobile/det/ch_ppocr_mobile_v1.1_det_infer.tar && tar xf ch_ppocr_mobile_v1.1_det_infer.tar
# Download the recognition model of the ultra-lightweight Chinese OCR model and uncompress it
-wget https://paddleocr.bj.bcebos.com/ch_models/ch_rec_mv3_crnn_infer.tar && tar xf ch_rec_mv3_crnn_infer.tar
+wget https://paddleocr.bj.bcebos.com/20-09-22/mobile/rec/ch_ppocr_mobile_v1.1_rec_infer.tar && tar xf ch_ppocr_mobile_v1.1_rec_infer.tar
+# Download the direction classifier model of the ultra-lightweight Chinese OCR model and uncompress it
+wget https://paddleocr.bj.bcebos.com/20-09-22/cls/ch_ppocr_mobile_v1.1_cls_infer.tar && tar xf ch_ppocr_mobile_v1.1_cls_infer.tar
cd ..
```
@@ -42,10 +49,13 @@ After decompression, the file structure should be as follows:
```
|-inference
- |-ch_rec_mv3_crnn
+ |-ch_ppocr_mobile_v1.1_det_infer
+ |- model
+ |- params
+ |-ch_ppocr_mobile_v1.1_rec_infer
|- model
|- params
- |-ch_det_mv3_db
+ |-ch_ppocr_mobile_v1.1_cls_infer
|- model
|- params
...
@@ -53,20 +63,20 @@ After decompression, the file structure should be as follows:
## 3. Single image or image set prediction
-* The following code implements text detection and recognition process. When performing prediction, you need to specify the path of a single image or image set through the parameter `image_dir`, the parameter `det_model_dir` specifies the path to detect the inference model, and the parameter `rec_model_dir` specifies the path to identify the inference model. The visual results are saved to the `./inference_results` folder by default.
+* The following code implements text detection and recognition process. When performing prediction, you need to specify the path of a single image or image set through the parameter `image_dir`, the parameter `det_model_dir` specifies the path to detect the inference model, the parameter `rec_model_dir` specifies the path to identify the inference model, the parameter `use_angle_cls` specifies whether to use the direction classifier, the parameter `cls_model_dir` specifies the path to identify the direction classifier model, the parameter `use_space_char` specifies whether to predict the space char. The visual results are saved to the `./inference_results` folder by default.
```bash
# Predict a single image specified by image_dir
-python3 tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_model_dir="./inference/ch_det_mv3_db/" --rec_model_dir="./inference/ch_rec_mv3_crnn/"
+python3 tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_model_dir="./inference/ch_ppocr_mobile_v1.1_det_infer/" --rec_model_dir="./inference/ch_ppocr_mobile_v1.1_rec_infer/" --cls_model_dir="./inference/ch_ppocr_mobile_v1.1_cls_infer/" --use_angle_cls=True --use_space_char=True
# Predict imageset specified by image_dir
-python3 tools/infer/predict_system.py --image_dir="./doc/imgs/" --det_model_dir="./inference/ch_det_mv3_db/" --rec_model_dir="./inference/ch_rec_mv3_crnn/"
+python3 tools/infer/predict_system.py --image_dir="./doc/imgs/" --det_model_dir="./inference/ch_ppocr_mobile_v1.1_det_infer/" --rec_model_dir="./inference/ch_ppocr_mobile_v1.1_rec_infer/" --cls_model_dir="./inference/ch_ppocr_mobile_v1.1_cls_infer/" --use_angle_cls=True --use_space_char=True
# If you want to use the CPU for prediction, you need to set the use_gpu parameter to False
-python3 tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_model_dir="./inference/ch_det_mv3_db/" --rec_model_dir="./inference/ch_rec_mv3_crnn/" --use_gpu=False
+python3 tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_model_dir="./inference/ch_ppocr_mobile_v1.1_det_infer/" --rec_model_dir="./inference/ch_ppocr_mobile_v1.1_rec_infer/" --cls_model_dir="./inference/ch_ppocr_mobile_v1.1_cls_infer/" --use_angle_cls=True --use_space_char=True --use_gpu=False
```
- Universal Chinese OCR model
@@ -75,25 +85,18 @@ Please follow the above steps to download the corresponding models and update th
```
# Predict a single image specified by image_dir
-python3 tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_model_dir="./inference/ch_det_r50_vd_db/" --rec_model_dir="./inference/ch_rec_r34_vd_crnn/"
+python3 tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_model_dir="./inference/ch_ppocr_server_v1.1_det_infer/" --rec_model_dir="./inference/ch_ppocr_server_v1.1_rec_infer/" --cls_model_dir="./inference/ch_ppocr_mobile_v1.1_cls_infer/" --use_angle_cls=True --use_space_char=True
```
-- Universal Chinese OCR model with the support of space
-
-Please follow the above steps to download the corresponding models and update the relevant parameters, The example is as follows.
+* Note
+ - If you want to use the recognition model which does not support space char recognition, please update the source code to the latest version and add parameters `--use_space_char=False`.
+ - If you do not want to use direction classifier, please update the source code to the latest version and add parameters `--use_angle_cls=False`.
-* Note: Please update the source code to the latest version and add parameters `--use_space_char=True`
-
-```
-# Predict a single image specified by image_dir
-python3 tools/infer/predict_system.py --image_dir="./doc/imgs_en/img_12.jpg" --det_model_dir="./inference/ch_det_r50_vd_db/" --rec_model_dir="./inference/ch_rec_r34_vd_crnn_enhance/" --use_space_char=True
-```
-
For more text detection and recognition tandem reasoning, please refer to the document tutorial
: [Inference with Python inference engine](./inference_en.md)。
In addition, the tutorial also provides other deployment methods for the Chinese OCR model:
- [Server-side C++ inference](../../deploy/cpp_infer/readme_en.md)
-- [Service deployment](./serving_en.md)
+- [Service deployment](../../deploy/hubserving/readme_en.md)
- [End-to-end deployment](../../deploy/lite/readme_en.md)
diff --git a/doc/doc_en/recognition_en.md b/doc/doc_en/recognition_en.md
index c9d69b3dae0587177c5cef2e075cc8beff85710b..f162b377e0ed226490279735b20f5a78f74ba8fb 100644
--- a/doc/doc_en/recognition_en.md
+++ b/doc/doc_en/recognition_en.md
@@ -1,5 +1,22 @@
## TEXT RECOGNITION
+- [DATA PREPARATION](#DATA_PREPARATION)
+ - [Dataset Download](#Dataset_download)
+ - [Costom Dataset](#Costom_Dataset)
+ - [Dictionary](#Dictionary)
+ - [Add Space Category](#Add_space_category)
+
+- [TRAINING](#TRAINING)
+ - [Data Augmentation](#Data_Augmentation)
+ - [Training](#Training)
+ - [Multi-language](#Multi_language)
+
+- [EVALUATION](#EVALUATION)
+
+- [PREDICTION](#PREDICTION)
+ - [Training engine prediction](#Training_engine_prediction)
+
+
### DATA PREPARATION
@@ -13,13 +30,14 @@ The default storage path for training data is `PaddleOCR/train_data`, if you alr
ln -sf /train_data/dataset
```
-
+
* Dataset download
If you do not have a dataset locally, you can download it on the official website [icdar2015](http://rrc.cvc.uab.es/?ch=4&com=downloads). Also refer to [DTRB](https://github.com/clovaai/deep-text-recognition-benchmark#download-lmdb-dataset-for-traininig-and-evaluation-from-here),download the lmdb format dataset required for benchmark
If you want to reproduce the paper indicators of SRN, you need to download offline [augmented data](https://pan.baidu.com/s/1-HSZ-ZVdqBF2HaBZ5pRAKA), extraction code: y3ry. The augmented data is obtained by rotation and perturbation of mjsynth and synthtext. Please unzip the data to {your_path}/PaddleOCR/train_data/data_lmdb_Release/training/path.
+
* Use your own dataset:
If you want to use your own data for training, please refer to the following to organize your data.
@@ -72,7 +90,7 @@ Similar to the training set, the test set also needs to be provided a folder con
|- word_003.jpg
| ...
```
-
+
- Dictionary
Finally, a dictionary ({word_dict_name}.txt) needs to be provided so that when the model is trained, all the characters that appear can be mapped to the dictionary index.
@@ -92,9 +110,21 @@ In `word_dict.txt`, there is a single word in each line, which maps characters a
`ppocr/utils/ppocr_keys_v1.txt` is a Chinese dictionary with 6623 characters.
-`ppocr/utils/ic15_dict.txt` is an English dictionary with 36 characters.
+`ppocr/utils/ic15_dict.txt` is an English dictionary with 63 characters
+
+`ppocr/utils/dict/french_dict.txt` is a French dictionary with 118 characters
+
+`ppocr/utils/dict/japan_dict.txt` is a Japan dictionary with 4399 characters
+
+`ppocr/utils/dict/korean_dict.txt` is a Korean dictionary with 3636 characters
+
+`ppocr/utils/dict/german_dict.txt` is a German dictionary with 131 characters
+
+You can use it on demand.
+
+The current multi-language model is still in the demo stage and will continue to optimize the model and add languages. **You are very welcome to provide us with dictionaries and fonts in other languages**,
+If you like, you can submit the dictionary file to [dict](../../ppocr/utils/dict) or corpus file to [corpus](../../ppocr/utils/corpus) and we will thank you in the Repo.
-You can use them if needed.
To customize the dict file, please modify the `character_dict_path` field in `configs/rec/rec_icdar15_train.yml` and set `character_type` to `ch`.
@@ -102,12 +132,14 @@ To customize the dict file, please modify the `character_dict_path` field in `co
If you need to customize dic file, please add character_dict_path field in configs/rec/rec_icdar15_train.yml to point to your dictionary path. And set character_type to ch.
+
- Add space category
If you want to support the recognition of the `space` category, please set the `use_space_char` field in the yml file to `true`.
**Note: use_space_char only takes effect when character_type=ch**
+
### TRAINING
PaddleOCR provides training scripts, evaluation scripts, and prediction scripts. In this section, the CRNN recognition model will be used as an example:
@@ -126,14 +158,12 @@ tar -xf rec_mv3_none_bilstm_ctc.tar && rm -rf rec_mv3_none_bilstm_ctc.tar
Start training:
```
-# Set PYTHONPATH path
-export PYTHONPATH=$PYTHONPATH:.
# GPU training Support single card and multi-card training, specify the card number through CUDA_VISIBLE_DEVICES
export CUDA_VISIBLE_DEVICES=0,1,2,3
# Training icdar15 English data and saving the log as train_rec.log
python3 tools/train.py -c configs/rec/rec_icdar15_train.yml 2>&1 | tee train_rec.log
```
-
+
- Data Augmentation
PaddleOCR provides a variety of data augmentation methods. If you want to add disturbance during training, please set `distort: true` in the configuration file.
@@ -142,7 +172,7 @@ The default perturbation methods are: cvtColor, blur, jitter, Gasuss noise, rand
Each disturbance method is selected with a 50% probability during the training process. For specific code implementation, please refer to: [img_tools.py](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/ppocr/data/rec/img_tools.py)
-
+
- Training
PaddleOCR supports alternating training and evaluation. You can modify `eval_batch_step` in `configs/rec/rec_icdar15_train.yml` to set the evaluation frequency. By default, it is evaluated every 500 iter and the best acc model is saved under `output/rec_CRNN/best_accuracy` during the evaluation process.
@@ -154,7 +184,10 @@ If the evaluation set is large, the test will be time-consuming. It is recommend
| Configuration file | Algorithm | backbone | trans | seq | pred |
| :--------: | :-------: | :-------: | :-------: | :-----: | :-----: |
+| [rec_chinese_lite_train_v1.1.yml](../../configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml) | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc |
+| [rec_chinese_common_train_v1.1.yml](../../configs/rec/ch_ppocr_v1.1/rec_chinese_common_train_v1.1.yml) | CRNN | ResNet34_vd | None | BiLSTM | ctc |
| rec_chinese_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc |
+| rec_chinese_common_train.yml | CRNN | ResNet34_vd | None | BiLSTM | ctc |
| rec_icdar15_train.yml | CRNN | Mobilenet_v3 large 0.5 | None | BiLSTM | ctc |
| rec_mv3_none_bilstm_ctc.yml | CRNN | Mobilenet_v3 large 0.5 | None | BiLSTM | ctc |
| rec_mv3_none_none_ctc.yml | Rosetta | Mobilenet_v3 large 0.5 | None | None | ctc |
@@ -165,7 +198,8 @@ If the evaluation set is large, the test will be time-consuming. It is recommend
| rec_r34_vd_tps_bilstm_attn.yml | RARE | Resnet34_vd | tps | BiLSTM | attention |
| rec_r34_vd_tps_bilstm_ctc.yml | STARNet | Resnet34_vd | tps | BiLSTM | ctc |
-For training Chinese data, it is recommended to use `rec_chinese_lite_train.yml`. If you want to try the result of other algorithms on the Chinese data set, please refer to the following instructions to modify the configuration file:
+For training Chinese data, it is recommended to use
+训练中文数据,推荐使用[rec_chinese_lite_train_v1.1.yml](../../configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml). If you want to try the result of other algorithms on the Chinese data set, please refer to the following instructions to modify the configuration file:
co
Take `rec_mv3_none_none_ctc.yml` as an example:
```
@@ -201,7 +235,8 @@ Optimizer:
```
**Note that the configuration file for prediction/evaluation must be consistent with the training.**
--Minor language
+
+- Multi-language
PaddleOCR also provides multi-language. The configuration file in `configs/rec/multi_languages` provides multi-language configuration files. Currently, the multi-language algorithms supported by PaddleOCR are:
@@ -213,8 +248,30 @@ PaddleOCR also provides multi-language. The configuration file in `configs/rec/m
| rec_japan_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | Japanese |
| rec_korean_lite_train.yml | CRNN | Mobilenet_v3 small 0.5 | None | BiLSTM | ctc | Korean |
-The multi-language model training method is the same as the Chinese model. The training data set is 100w synthetic data. A small amount of fonts and test data can be downloaded on [Baidu Netdisk]().
+The multi-language model training method is the same as the Chinese model. The training data set is 100w synthetic data. A small amount of fonts and test data can be downloaded on [Baidu Netdisk](https://pan.baidu.com/s/1bS_u207Rm7YbY33wOECKDA),Extraction code:frgi.
+
+If you want to finetune on the basis of the existing model effect, please refer to the following instructions to modify the configuration file:
+
+Take `rec_french_lite_train` as an example:
+
+```
+Global:
+ ...
+ # Add a custom dictionary, if you modify the dictionary
+ # please point the path to the new dictionary
+ character_dict_path: ./ppocr/utils/dict/french_dict.txt
+ # Add data augmentation during training
+ distort: true
+ # Identify spaces
+ use_space_char: true
+ ...
+ # Modify reader type
+ reader_yml: ./configs/rec/multi_languages/rec_french_reader.yml
+ ...
+...
+```
+
### EVALUATION
The evaluation data set can be modified via `configs/rec/rec_icdar15_reader.yml` setting of `label_file_path` in EvalReader.
@@ -222,11 +279,13 @@ The evaluation data set can be modified via `configs/rec/rec_icdar15_reader.yml`
```
export CUDA_VISIBLE_DEVICES=0
# GPU evaluation, Global.checkpoints is the weight to be tested
-python3 tools/eval.py -c configs/rec/rec_chinese_lite_train.yml -o Global.checkpoints={path/to/weights}/best_accuracy
+python3 tools/eval.py -c configs/rec/rec_icdar15_reader.yml -o Global.checkpoints={path/to/weights}/best_accuracy
```
+
### PREDICTION
+
* Training engine prediction
Using the model trained by paddleocr, you can quickly get prediction through the following script.
@@ -235,7 +294,7 @@ The default prediction picture is stored in `infer_img`, and the weight is speci
```
# Predict English results
-python3 tools/infer_rec.py -c configs/rec/rec_chinese_lite_train.yml -o Global.checkpoints={path/to/weights}/best_accuracy TestReader.infer_img=doc/imgs_words/en/word_1.jpg
+python3 tools/infer_rec.py -c configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml -o Global.checkpoints={path/to/weights}/best_accuracy Global.infer_img=doc/imgs_words/en/word_1.jpg
```
Input image:
@@ -250,11 +309,11 @@ infer_img: doc/imgs_words/en/word_1.png
word : joint
```
-The configuration file used for prediction must be consistent with the training. For example, you completed the training of the Chinese model with `python3 tools/train.py -c configs/rec/rec_chinese_lite_train.yml`, you can use the following command to predict the Chinese model:
+The configuration file used for prediction must be consistent with the training. For example, you completed the training of the Chinese model with `python3 tools/train.py -c configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml`, you can use the following command to predict the Chinese model:
```
# Predict Chinese results
-python3 tools/infer_rec.py -c configs/rec/rec_chinese_lite_train.yml -o Global.checkpoints={path/to/weights}/best_accuracy TestReader.infer_img=doc/imgs_words/ch/word_1.jpg
+python3 tools/infer_rec.py -c configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml -o Global.checkpoints={path/to/weights}/best_accuracy Global.infer_img=doc/imgs_words/ch/word_1.jpg
```
Input image:
diff --git a/doc/doc_en/update_en.md b/doc/doc_en/update_en.md
index ca050370989ba3cded8c7211b7ab297ebe239c5f..71f784812bcac9ff55aa0523831ba9b1a5849403 100644
--- a/doc/doc_en/update_en.md
+++ b/doc/doc_en/update_en.md
@@ -1,4 +1,8 @@
# RECENT UPDATES
+- 2020.9.22 Update the PP-OCR technical article, https://arxiv.org/abs/2009.09941
+- 2020.9.19 Update the ultra lightweight compressed ppocr_mobile_slim series models, the overall model size is 3.5M (see [PP-OCR Pipline](../../README.md#PP-OCR-Pipline)), suitable for mobile deployment. [Model Downloads](../../README.md#Supported-Chinese-model-list)
+- 2020.9.17 Update the ultra lightweight ppocr_mobile series and general ppocr_server series Chinese and English ocr models, which are comparable to commercial effects. [Model Downloads](../../README.md#Supported-Chinese-model-list)
+- 2020.9.17 update [English recognition model](./models_list_en.md#english-recognition-model) and [Multilingual recognition model](./models_list_en.md#english-recognition-model), `German`, `French`, `Japanese` and `Korean` have been supported. Models for more languages will continue to be updated.
- 2020.8.24 Support the use of PaddleOCR through whl package installation,pelease refer [PaddleOCR Package](https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_en/whl_en.md)
- 2020.8.16 Release text detection algorithm [SAST](https://arxiv.org/abs/1908.05498) and text recognition algorithm [SRN](https://arxiv.org/abs/2003.12294)
- 2020.7.23, Release the playback and PPT of live class on BiliBili station, PaddleOCR Introduction, [address](https://aistudio.baidu.com/aistudio/course/introduce/1519)
@@ -7,7 +11,7 @@
- 2020.7.15, Add several related datasets, data annotation and synthesis tools.
- 2020.7.9 Add a new model to support recognize the character "space".
- 2020.7.9 Add the data augument and learning rate decay strategies during training.
-- 2020.6.8 Add [datasets](./doc/doc_en/datasets_en.md) and keep updating
+- 2020.6.8 Add [datasets](./datasets_en.md) and keep updating
- 2020.6.5 Support exporting `attention` model to `inference_model`
- 2020.6.5 Support separate prediction and recognition, output result score
- 2020.6.5 Support exporting `attention` model to `inference_model`
diff --git a/doc/doc_en/visualization_en.md b/doc/doc_en/visualization_en.md
index 698db3f2d8ae31dd14829f7a1dfbd13f174f3e23..853987645e6046d9a6e87b4eb1acb2d9c7328c6d 100644
--- a/doc/doc_en/visualization_en.md
+++ b/doc/doc_en/visualization_en.md
@@ -1,71 +1,50 @@
# Visualization
-- [Chinese/English OCR Visualization (Space_support )](#Space_support)
-- [Ultra-lightweight Chinese/English OCR Visualization](#Ultra-lightweight)
-- [General Chinese/English OCR Visualization](#General)
+
+## ch_ppocr_server_1.1
-
-
-## Chinese/English OCR Visualization (Space_support )
-
-### Ultra-lightweight Model
-