合并流程
This commit is contained in:
		
							parent
							
								
									b2fbfee4ae
								
							
						
					
					
						commit
						34bd93da45
					
				@ -1,4 +1,6 @@
 | 
				
			|||||||
from asyncio.windows_events import NULL
 | 
					from asyncio.windows_events import NULL
 | 
				
			||||||
 | 
					from concurrent.futures import thread
 | 
				
			||||||
 | 
					from email.policy import default
 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
import pdb
 | 
					import pdb
 | 
				
			||||||
from threading import Thread
 | 
					from threading import Thread
 | 
				
			||||||
@ -6,15 +8,18 @@ import numpy as np
 | 
				
			|||||||
from plugins.basic_change.main import MyDialog
 | 
					from plugins.basic_change.main import MyDialog
 | 
				
			||||||
from rscder.gui.actions import ActionManager
 | 
					from rscder.gui.actions import ActionManager
 | 
				
			||||||
from rscder.plugins.basic import BasicPlugin
 | 
					from rscder.plugins.basic import BasicPlugin
 | 
				
			||||||
from PyQt5.QtWidgets import QAction, QDialog, QHBoxLayout, QVBoxLayout, QPushButton,QWidget,QLabel,QLineEdit,QPushButton
 | 
					from PyQt5.QtWidgets import QAction, QDialog, QHBoxLayout, QVBoxLayout, QPushButton,QWidget,QLabel,QLineEdit,QPushButton,QComboBox
 | 
				
			||||||
from PyQt5.QtGui import QIcon,QPixmap
 | 
					from PyQt5.QtGui import QIcon,QPixmap
 | 
				
			||||||
from PyQt5.QtCore import Qt
 | 
					from PyQt5.QtCore import Qt
 | 
				
			||||||
from rscder.gui.layercombox import RasterLayerCombox
 | 
					from rscder.gui.layercombox import LayerCombox,PairLayerCombox
 | 
				
			||||||
from rscder.utils.icons import IconInstance
 | 
					from rscder.utils.icons import IconInstance
 | 
				
			||||||
from rscder.utils.project import Project, RasterLayer, SingleBandRasterLayer
 | 
					from rscder.utils.project import Project, RasterLayer, SingleBandRasterLayer,ResultPointLayer
 | 
				
			||||||
from threshold.otsu import OTSU
 | 
					from In_one.otsu import OTSU
 | 
				
			||||||
from osgeo import gdal
 | 
					from osgeo import gdal
 | 
				
			||||||
from plugins.In_one import pic
 | 
					from plugins.In_one import pic
 | 
				
			||||||
 | 
					import math
 | 
				
			||||||
 | 
					from skimage.filters import rank
 | 
				
			||||||
 | 
					from skimage.morphology import disk, rectangle
 | 
				
			||||||
class LockerButton(QPushButton):
 | 
					class LockerButton(QPushButton):
 | 
				
			||||||
    def __init__(self,parent=NULL):
 | 
					    def __init__(self,parent=NULL):
 | 
				
			||||||
        super(LockerButton,self).__init__(parent)
 | 
					        super(LockerButton,self).__init__(parent)
 | 
				
			||||||
@ -39,29 +44,50 @@ class LockerButton(QPushButton):
 | 
				
			|||||||
    def SetTextLabel(self, text):
 | 
					    def SetTextLabel(self, text):
 | 
				
			||||||
        self.m_textLabel.setText(text)
 | 
					        self.m_textLabel.setText(text)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class selectCombox(QComboBox):
 | 
				
			||||||
 | 
					    def __init__(self, parent,list:list,default='--') :
 | 
				
			||||||
 | 
					        super(selectCombox,self).__init__(parent)
 | 
				
			||||||
 | 
					        self.choose=None
 | 
				
			||||||
 | 
					        self.list=list
 | 
				
			||||||
 | 
					        self.default=default
 | 
				
			||||||
 | 
					        self.addItem(default, None)
 | 
				
			||||||
 | 
					        self.addItems(list)
 | 
				
			||||||
 | 
					        self.currentIndexChanged.connect(self.on_change)
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    def on_change(self,index):
 | 
				
			||||||
 | 
					        if index == 0:
 | 
				
			||||||
 | 
					            self.choose=self.default
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            self.choose=self.list[index-1]
 | 
				
			||||||
 | 
					        # print(self.choose)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class AllInOne(QDialog):
 | 
					class AllInOne(QDialog):
 | 
				
			||||||
    def __init__(self, parent=None):
 | 
					    def __init__(self, pre,cd,threshold,parent=None):
 | 
				
			||||||
        super(AllInOne, self).__init__(parent)
 | 
					        super(AllInOne, self).__init__(parent)
 | 
				
			||||||
        self.setWindowTitle('变化检测')
 | 
					        self.setWindowTitle('变化检测')
 | 
				
			||||||
        self.setWindowIcon(IconInstance().LOGO)
 | 
					        self.setWindowIcon(IconInstance().LOGO)
 | 
				
			||||||
 | 
					        self.pre=pre#['均值滤波','test滤波']
 | 
				
			||||||
 | 
					        self.cd=cd#['差分法','test法']
 | 
				
			||||||
 | 
					        self.threshold=threshold#['OTSU']
 | 
				
			||||||
        self.initUI()
 | 
					        self.initUI()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def initUI(self):
 | 
					    def initUI(self):
 | 
				
			||||||
 | 
					        #图层
 | 
				
			||||||
 | 
					        self.layer_combox = PairLayerCombox(self)
 | 
				
			||||||
 | 
					        layerbox = QHBoxLayout()
 | 
				
			||||||
 | 
					        layerbox.addWidget(self.layer_combox)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #预处理
 | 
					        #预处理
 | 
				
			||||||
        filterWeight=QWidget(self)
 | 
					        filterWeight=QWidget(self)
 | 
				
			||||||
        filterlayout=QVBoxLayout()
 | 
					        filterlayout=QVBoxLayout()
 | 
				
			||||||
        filerButton =LockerButton(filterWeight); 
 | 
					        filerButton =LockerButton(filterWeight)
 | 
				
			||||||
        filerButton.setObjectName("LockerButton")
 | 
					        filerButton.setObjectName("filerButton")
 | 
				
			||||||
        filerButton.SetTextLabel("大小")
 | 
					        filerButton.SetTextLabel("预处理")
 | 
				
			||||||
        filerButton.SetImageLabel(QPixmap('plugins/In_one/pic/箭头 下.svg'))
 | 
					        filerButton.SetImageLabel(QPixmap('plugins/In_one/pic/箭头_列表展开.png'))
 | 
				
			||||||
        filerButton.setStyleSheet("#LockerButton{background-color:transparent;border:none;}"
 | 
					        filerButton.setStyleSheet("#filerButton{background-color:transparent;border:none;}"
 | 
				
			||||||
        "#LockerButton:hover{background-color:rgba(195,195,195,0.4);border:none;}")
 | 
					        "#filerButton:hover{background-color:rgba(195,195,195,0.4);border:none;}")
 | 
				
			||||||
        self.layer_combox = RasterLayerCombox(self)
 | 
					        self.pre_select=selectCombox(self,self.pre)
 | 
				
			||||||
        layer_label = QLabel('图层:')
 | 
					        
 | 
				
			||||||
        hbox = QHBoxLayout()
 | 
					 | 
				
			||||||
        hbox.addWidget(layer_label)
 | 
					 | 
				
			||||||
        hbox.addWidget(self.layer_combox)
 | 
					 | 
				
			||||||
        x_size_input = QLineEdit(self)
 | 
					        x_size_input = QLineEdit(self)
 | 
				
			||||||
        x_size_input.setText('3')
 | 
					        x_size_input.setText('3')
 | 
				
			||||||
        y_size_input = QLineEdit(self)
 | 
					        y_size_input = QLineEdit(self)
 | 
				
			||||||
@ -78,35 +104,101 @@ class AllInOne(QDialog):
 | 
				
			|||||||
        hlayout1.addWidget(time_label)
 | 
					        hlayout1.addWidget(time_label)
 | 
				
			||||||
        hlayout1.addWidget(y_size_input)
 | 
					        hlayout1.addWidget(y_size_input)
 | 
				
			||||||
        vlayout = QVBoxLayout()
 | 
					        vlayout = QVBoxLayout()
 | 
				
			||||||
        # vlayout.addWidget(filerButton)
 | 
					        vlayout.addWidget(self.pre_select)
 | 
				
			||||||
        vlayout.addLayout(hbox)
 | 
					 | 
				
			||||||
        vlayout.addLayout(hlayout1)
 | 
					        vlayout.addLayout(hlayout1)
 | 
				
			||||||
        filterWeight.setLayout(vlayout)
 | 
					        filterWeight.setLayout(vlayout)
 | 
				
			||||||
        filterlayout.addWidget(filerButton)
 | 
					        filterlayout.addWidget(filerButton)
 | 
				
			||||||
        filterlayout.addWidget(filterWeight)
 | 
					        filterlayout.addWidget(filterWeight)
 | 
				
			||||||
        #变化检测
 | 
					        #变化检测
 | 
				
			||||||
 | 
					        changelayout=QVBoxLayout()
 | 
				
			||||||
        changeWeight=QWidget(self)
 | 
					        changeWeight=QWidget(self)
 | 
				
			||||||
 | 
					        changeButton =LockerButton(changeWeight)
 | 
				
			||||||
 | 
					        changeButton.setObjectName("changeButton")
 | 
				
			||||||
 | 
					        changeButton.SetTextLabel("变化检测")
 | 
				
			||||||
 | 
					        changeButton.SetImageLabel(QPixmap('plugins/In_one/pic/箭头_列表展开.png'))
 | 
				
			||||||
 | 
					        changeButton.setStyleSheet("#changeButton{background-color:transparent;border:none;}"
 | 
				
			||||||
 | 
					        "#changeButton:hover{background-color:rgba(195,195,195,0.4);border:none;}")
 | 
				
			||||||
 | 
					        changeWeightlayout=QVBoxLayout()
 | 
				
			||||||
 | 
					        self.cd_select=selectCombox(self,self.cd)
 | 
				
			||||||
 | 
					        changeWeightlayout.addWidget(self.cd_select)
 | 
				
			||||||
 | 
					        changeWeight.setLayout(changeWeightlayout)
 | 
				
			||||||
 | 
					        changelayout.addWidget(changeButton)
 | 
				
			||||||
 | 
					        changelayout.addWidget(changeWeight)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        #阈值处理
 | 
				
			||||||
 | 
					        thresholdlayout=QVBoxLayout()
 | 
				
			||||||
 | 
					        thresholdWeight=QWidget(self)
 | 
				
			||||||
 | 
					        thresholdButton =LockerButton(thresholdWeight)
 | 
				
			||||||
 | 
					        thresholdButton.setObjectName("thresholdButton")
 | 
				
			||||||
 | 
					        thresholdButton.SetTextLabel("阈值处理")
 | 
				
			||||||
 | 
					        thresholdButton.SetImageLabel(QPixmap('plugins/In_one/pic/箭头_列表展开.png'))
 | 
				
			||||||
 | 
					        thresholdButton.setStyleSheet("#thresholdButton{background-color:transparent;border:none;}"
 | 
				
			||||||
 | 
					        "#thresholdButton:hover{background-color:rgba(195,195,195,0.4);border:none;}")
 | 
				
			||||||
 | 
					        self.threshold_select=selectCombox(self,self.threshold,default='手动阈值')
 | 
				
			||||||
 | 
					        self.threshold_input=QLineEdit(self)
 | 
				
			||||||
 | 
					        self.threshold_input.setText('0.5')
 | 
				
			||||||
 | 
					        self.threshold_select.currentIndexChanged.connect(lambda index:self.hide_(self.threshold_input,index==0))
 | 
				
			||||||
 | 
					        thresholdWeightlayout=QVBoxLayout()
 | 
				
			||||||
 | 
					        thresholdWeightlayout.addWidget(self.threshold_select)
 | 
				
			||||||
 | 
					        thresholdWeightlayout.addWidget(self.threshold_input)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        thresholdWeight.setLayout(thresholdWeightlayout)
 | 
				
			||||||
 | 
					        thresholdlayout.addWidget(thresholdButton)
 | 
				
			||||||
 | 
					        thresholdlayout.addWidget(thresholdWeight)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        #确认
 | 
				
			||||||
 | 
					        oklayout=QHBoxLayout()
 | 
				
			||||||
 | 
					        self.ok_button = QPushButton('确定', self)
 | 
				
			||||||
 | 
					        self.ok_button.setIcon(IconInstance().OK)
 | 
				
			||||||
 | 
					        self.ok_button.clicked.connect(self.accept)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.cancel_button = QPushButton('取消', self)
 | 
				
			||||||
 | 
					        self.cancel_button.setIcon(IconInstance().CANCEL)
 | 
				
			||||||
 | 
					        self.cancel_button.clicked.connect(self.reject)
 | 
				
			||||||
 | 
					        oklayout.addWidget(self.ok_button)
 | 
				
			||||||
 | 
					        oklayout.addWidget(self.cancel_button)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        totalvlayout=QVBoxLayout()
 | 
					        totalvlayout=QVBoxLayout()
 | 
				
			||||||
 | 
					        totalvlayout.addLayout(layerbox)
 | 
				
			||||||
        totalvlayout.addLayout(filterlayout)
 | 
					        totalvlayout.addLayout(filterlayout)
 | 
				
			||||||
 | 
					        totalvlayout.addLayout(changelayout)
 | 
				
			||||||
 | 
					        totalvlayout.addLayout(thresholdlayout)
 | 
				
			||||||
 | 
					        totalvlayout.addLayout(oklayout)
 | 
				
			||||||
        totalvlayout.addStretch()
 | 
					        totalvlayout.addStretch()
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        self.setLayout(totalvlayout)
 | 
					        self.setLayout(totalvlayout)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        filerButton.clicked.connect(lambda: self.hide(filerButton,filterWeight))
 | 
					        filerButton.clicked.connect(lambda: self.hide(filerButton,filterWeight))
 | 
				
			||||||
 | 
					        changeButton.clicked.connect(lambda: self.hide(changeButton,changeWeight))
 | 
				
			||||||
 | 
					        thresholdButton.clicked.connect(lambda: self.hide(thresholdButton,thresholdWeight))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def hide(self,button:LockerButton,weight:QWidget):
 | 
					    def hide(self,button:LockerButton,weight:QWidget):
 | 
				
			||||||
        if ((button.hide_)%2)==1:
 | 
					        if ((button.hide_)%2)==1:
 | 
				
			||||||
            weight.setVisible(False)
 | 
					            weight.setVisible(False)
 | 
				
			||||||
            button.SetImageLabel(QPixmap('plugins/In_one/pic/箭头 下.svg'))
 | 
					            button.SetImageLabel(QPixmap('plugins/In_one/pic/箭头_列表向右.png'))
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            weight.setVisible(True)
 | 
					            weight.setVisible(True)
 | 
				
			||||||
            button.SetImageLabel(QPixmap('plugins/In_one/pic/箭头 右.svg'))
 | 
					            button.SetImageLabel(QPixmap('plugins/In_one/pic/箭头_列表展开.png'))
 | 
				
			||||||
        button.hide_=(button.hide_)%2+1
 | 
					        button.hide_=(button.hide_)%2+1
 | 
				
			||||||
 | 
					    def hide_(self,widget:QWidget,h:bool):
 | 
				
			||||||
 | 
					        if h:
 | 
				
			||||||
 | 
					            widget.setVisible(True)
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            widget.setVisible(False)
 | 
				
			||||||
 | 
					    def hideWidget(self,widget:QWidget):
 | 
				
			||||||
 | 
					        if widget.isVisible:
 | 
				
			||||||
 | 
					            widget.setVisible(False)
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            widget.setVisible(True)
 | 
				
			||||||
class InOnePlugin(BasicPlugin):
 | 
					class InOnePlugin(BasicPlugin):
 | 
				
			||||||
 | 
					    pre=['均值滤波']
 | 
				
			||||||
 | 
					    cd=['差分法']
 | 
				
			||||||
 | 
					    threshold=['OTSU阈值']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @staticmethod
 | 
					    @staticmethod
 | 
				
			||||||
    def info():
 | 
					    def info():
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
@ -118,12 +210,287 @@ class InOnePlugin(BasicPlugin):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    def set_action(self):
 | 
					    def set_action(self):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        basic_diff_method_in_one = QAction('inone差分法')
 | 
					        basic_diff_method_in_one = QAction('总流程')
 | 
				
			||||||
        ActionManager().change_detection_menu.addAction(basic_diff_method_in_one)
 | 
					        ActionManager().change_detection_menu.addAction(basic_diff_method_in_one)
 | 
				
			||||||
        self.basic_diff_method_in_one = basic_diff_method_in_one
 | 
					        self.basic_diff_method_in_one = basic_diff_method_in_one
 | 
				
			||||||
        basic_diff_method_in_one.triggered.connect(self.run) 
 | 
					        basic_diff_method_in_one.triggered.connect(self.run) 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def run(self):
 | 
					    def run(self):
 | 
				
			||||||
        myDialog=AllInOne(self.mainwindow)
 | 
					        myDialog=AllInOne(self.pre,self.cd,self.threshold,self.mainwindow)
 | 
				
			||||||
        myDialog.show()
 | 
					        myDialog.show()
 | 
				
			||||||
 | 
					        if myDialog.exec_()==QDialog.Accepted:
 | 
				
			||||||
 | 
					            t=Thread(target=self.run_alg,args=(myDialog,))
 | 
				
			||||||
 | 
					            t.start()
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					    def run_alg(self,w:AllInOne):
 | 
				
			||||||
 | 
					        layer1=w.layer_combox.layer1
 | 
				
			||||||
 | 
					        layer2=w.layer_combox.layer2
 | 
				
			||||||
 | 
					        if not layer1.compare(layer2):
 | 
				
			||||||
 | 
					            self.send_message.emit('两个图层的尺寸不同')
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					        pth1 = w.layer_combox.layer1.path
 | 
				
			||||||
 | 
					        pth2 = w.layer_combox.layer2.path
 | 
				
			||||||
 | 
					        name=layer1.layer_parent.name
 | 
				
			||||||
 | 
					        if w.pre_select.choose==self.pre[0]:
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            pth1=Meanfilter(w.x_size_input.text(),w.y_size_input.text(),w.layer_combox.layer1)
 | 
				
			||||||
 | 
					            self.send_message.emit('均值滤波图像{}'.format(w.layer_combox.layer1.name))
 | 
				
			||||||
 | 
					            pth2=Meanfilter(w.x_size_input.text(),w.y_size_input.text(),w.layer_combox.layer2)
 | 
				
			||||||
 | 
					            self.send_message.emit('均值滤波图像{}'.format(w.layer_combox.layer2.name))
 | 
				
			||||||
 | 
					            name=name+'_mean_filter'
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        cdpth=None
 | 
				
			||||||
 | 
					        if w.cd_select.choose==self.cd[0]:
 | 
				
			||||||
 | 
					            cdpth=basic_cd(pth1,pth2,w.layer_combox.layer1.layer_parent,self.send_message)
 | 
				
			||||||
 | 
					            name += '_basic_cd'
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        thpth=None
 | 
				
			||||||
 | 
					        if w.threshold_select.choose==self.threshold[0]:
 | 
				
			||||||
 | 
					            thpth=otsu(cdpth,w.layer_combox.layer1.layer_parent.name,self.send_message)
 | 
				
			||||||
 | 
					            name+='_otsu'
 | 
				
			||||||
 | 
					        elif w.threshold_select.choose=='手动阈值':
 | 
				
			||||||
 | 
					            thpth=thresh(cdpth,float(w.threshold_input.text()),w.layer_combox.layer1.layer_parent.name,self.send_message)
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        table_layer(thpth,layer1,name,self.send_message)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def Meanfilter(x_size,y_size,layer:RasterLayer):
 | 
				
			||||||
 | 
					    x_size = int(x_size)
 | 
				
			||||||
 | 
					    y_size = int(y_size)
 | 
				
			||||||
 | 
					    pth = layer.path
 | 
				
			||||||
 | 
					    if pth is None:
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    ds = gdal.Open(pth)
 | 
				
			||||||
 | 
					    band_count = ds.RasterCount
 | 
				
			||||||
 | 
					    out_path = os.path.join(Project().other_path, '{}_mean_filter.tif'.format(layer.name))
 | 
				
			||||||
 | 
					    out_ds = gdal.GetDriverByName('GTiff').Create(out_path, ds.RasterXSize, ds.RasterYSize, band_count, ds.GetRasterBand(1).DataType)
 | 
				
			||||||
 | 
					    out_ds.SetProjection(ds.GetProjection())
 | 
				
			||||||
 | 
					    out_ds.SetGeoTransform(ds.GetGeoTransform())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for i in range(band_count):
 | 
				
			||||||
 | 
					        band = ds.GetRasterBand(i+1)
 | 
				
			||||||
 | 
					        data = band.ReadAsArray()
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        data = rank.mean(data, rectangle(y_size, x_size))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        out_band = out_ds.GetRasterBand(i+1)
 | 
				
			||||||
 | 
					        out_band.WriteArray(data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    out_ds.FlushCache()
 | 
				
			||||||
 | 
					    del out_ds
 | 
				
			||||||
 | 
					    del ds
 | 
				
			||||||
 | 
					    return out_path
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def basic_cd(pth1,pth2,layer_parent,send_message):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ds1 = gdal.Open(pth1)
 | 
				
			||||||
 | 
					    ds2 = gdal.Open(pth2)
 | 
				
			||||||
 | 
					    cell_size = layer_parent.cell_size
 | 
				
			||||||
 | 
					    xsize = ds1.RasterXSize
 | 
				
			||||||
 | 
					    ysize = ds1.RasterYSize
 | 
				
			||||||
 | 
					    band = ds1.RasterCount
 | 
				
			||||||
 | 
					    yblocks = ysize // cell_size[1]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    driver = gdal.GetDriverByName('GTiff')
 | 
				
			||||||
 | 
					    out_tif = os.path.join(Project().cmi_path, 'temp.tif')
 | 
				
			||||||
 | 
					    out_ds = driver.Create(out_tif, xsize, ysize, 1, gdal.GDT_Float32)
 | 
				
			||||||
 | 
					    out_ds.SetGeoTransform(ds1.GetGeoTransform())
 | 
				
			||||||
 | 
					    out_ds.SetProjection(ds1.GetProjection())
 | 
				
			||||||
 | 
					    max_diff = 0
 | 
				
			||||||
 | 
					    min_diff = math.inf
 | 
				
			||||||
 | 
					    for j in range(yblocks + 1):
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        send_message.emit(f'计算{j}/{yblocks}')
 | 
				
			||||||
 | 
					        block_xy = (0, j * cell_size[1])
 | 
				
			||||||
 | 
					        if block_xy[1] > ysize:
 | 
				
			||||||
 | 
					            break
 | 
				
			||||||
 | 
					        block_size = (xsize, cell_size[1])
 | 
				
			||||||
 | 
					        if block_xy[1] + block_size[1] > ysize:
 | 
				
			||||||
 | 
					            block_size = (xsize, ysize - block_xy[1])
 | 
				
			||||||
 | 
					        block_data1 = ds1.ReadAsArray(*block_xy, *block_size)
 | 
				
			||||||
 | 
					        block_data2 = ds2.ReadAsArray(*block_xy, *block_size)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if band == 1:
 | 
				
			||||||
 | 
					            block_data1 =  block_data1[None, ...]
 | 
				
			||||||
 | 
					            block_data2 =  block_data2[None, ...]
 | 
				
			||||||
 | 
					        # pdb.set_trace()
 | 
				
			||||||
 | 
					        block_diff = block_data1.sum(0) - block_data2.sum(0)
 | 
				
			||||||
 | 
					        block_diff = block_diff.astype(np.float32)
 | 
				
			||||||
 | 
					        block_diff = np.abs(block_diff)
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        min_diff = min(min_diff, block_diff[block_diff > 0].min())
 | 
				
			||||||
 | 
					        max_diff = max(max_diff, block_diff.max())
 | 
				
			||||||
 | 
					        out_ds.GetRasterBand(1).WriteArray(block_diff, *block_xy)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        send_message.emit(f'完成{j}/{yblocks}')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    out_ds.FlushCache()
 | 
				
			||||||
 | 
					    del out_ds
 | 
				
			||||||
 | 
					    send_message.emit('归一化概率中...')
 | 
				
			||||||
 | 
					    temp_in_ds = gdal.Open(out_tif) 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    out_normal_tif = os.path.join(Project().cmi_path, '{}_{}_cmi.tif'.format(layer_parent.name, int(np.random.rand() * 100000)))
 | 
				
			||||||
 | 
					    out_normal_ds = driver.Create(out_normal_tif, xsize, ysize, 1, gdal.GDT_Byte)
 | 
				
			||||||
 | 
					    out_normal_ds.SetGeoTransform(ds1.GetGeoTransform())
 | 
				
			||||||
 | 
					    out_normal_ds.SetProjection(ds1.GetProjection())
 | 
				
			||||||
 | 
					    # hist = np.zeros(256, dtype=np.int32)
 | 
				
			||||||
 | 
					    for j in range(yblocks+1):
 | 
				
			||||||
 | 
					        block_xy = (0, j * cell_size[1])
 | 
				
			||||||
 | 
					        if block_xy[1] > ysize:
 | 
				
			||||||
 | 
					            break
 | 
				
			||||||
 | 
					        block_size = (xsize, cell_size[1])
 | 
				
			||||||
 | 
					        if block_xy[1] + block_size[1] > ysize:
 | 
				
			||||||
 | 
					            block_size = (xsize, ysize - block_xy[1])
 | 
				
			||||||
 | 
					        block_data = temp_in_ds.ReadAsArray(*block_xy, *block_size)
 | 
				
			||||||
 | 
					        block_data = (block_data - min_diff) / (max_diff - min_diff) * 255
 | 
				
			||||||
 | 
					        block_data = block_data.astype(np.uint8)
 | 
				
			||||||
 | 
					        out_normal_ds.GetRasterBand(1).WriteArray(block_data, *block_xy)
 | 
				
			||||||
 | 
					        # hist_t, _ = np.histogram(block_data, bins=256, range=(0, 256))
 | 
				
			||||||
 | 
					        # hist += hist_t
 | 
				
			||||||
 | 
					    # print(hist)
 | 
				
			||||||
 | 
					    del temp_in_ds
 | 
				
			||||||
 | 
					    del out_normal_ds
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        os.remove(out_tif)
 | 
				
			||||||
 | 
					    except:
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # raster_result_layer = SingleBandRasterLayer(None, True, out_normal_tif, BasicLayer.BOATH_VIEW)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # layer1.layer_parent.add_result_layer(point_result_lalyer)
 | 
				
			||||||
 | 
					    # layer1.layer_parent.add_result_layer(raster_result_layer)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # self.send_message.emit('完成计算变化表格')
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					    send_message.emit('差分法计算完成')
 | 
				
			||||||
 | 
					    return out_normal_tif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def otsu(pth,name,send_message):
 | 
				
			||||||
 | 
					    ds = gdal.Open(pth)
 | 
				
			||||||
 | 
					    band = ds.GetRasterBand(1)
 | 
				
			||||||
 | 
					    # band_count = ds.RasterCount
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    hist = np.zeros(256, dtype=np.int)
 | 
				
			||||||
 | 
					    xsize = ds.RasterXSize
 | 
				
			||||||
 | 
					    ysize = ds.RasterYSize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    max_pixels = 1e7
 | 
				
			||||||
 | 
					    max_rows = max_pixels // xsize
 | 
				
			||||||
 | 
					    if max_rows < 1:
 | 
				
			||||||
 | 
					        max_rows = 1
 | 
				
			||||||
 | 
					    if max_rows > ysize:
 | 
				
			||||||
 | 
					        max_rows = ysize
 | 
				
			||||||
 | 
					    block_count = ysize // max_rows + 1
 | 
				
			||||||
 | 
					    for i in range(block_count):
 | 
				
			||||||
 | 
					        start_row = i * max_rows
 | 
				
			||||||
 | 
					        end_row = min((i + 1) * max_rows, ysize)
 | 
				
			||||||
 | 
					        block = band.ReadAsArray(0, start_row, xsize, end_row - start_row)
 | 
				
			||||||
 | 
					        hist += np.histogram(block.flatten(), bins=256, range=(0, 255))[0]
 | 
				
			||||||
 | 
					    hist = hist.astype(np.float32)
 | 
				
			||||||
 | 
					    gap = OTSU(hist)
 | 
				
			||||||
 | 
					    send_message.emit('阈值为:{}'.format(gap))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    out_th = os.path.join(Project().bcdm_path, '{}_otsu_bcdm.tif'.format(name))
 | 
				
			||||||
 | 
					    out_ds = gdal.GetDriverByName('GTiff').Create(out_th, xsize, ysize, 1, gdal.GDT_Byte)
 | 
				
			||||||
 | 
					    out_ds.SetGeoTransform(ds.GetGeoTransform())
 | 
				
			||||||
 | 
					    out_ds.SetProjection(ds.GetProjection())
 | 
				
			||||||
 | 
					    out_band = out_ds.GetRasterBand(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for i in range(block_count):
 | 
				
			||||||
 | 
					        start_row = i * max_rows
 | 
				
			||||||
 | 
					        end_row = min((i + 1) * max_rows, ysize)
 | 
				
			||||||
 | 
					        block = band.ReadAsArray(0, start_row, xsize, end_row - start_row)
 | 
				
			||||||
 | 
					        out_band.WriteArray(block > gap, 0, start_row)
 | 
				
			||||||
 | 
					    out_band.FlushCache()
 | 
				
			||||||
 | 
					    out_ds = None
 | 
				
			||||||
 | 
					    ds = None
 | 
				
			||||||
 | 
					    send_message.emit('OTSU阈值完成')
 | 
				
			||||||
 | 
					    return out_th
 | 
				
			||||||
 | 
					    #otsu_layer = SingleBandRasterLayer(path = out_th, style_info={})
 | 
				
			||||||
 | 
					    #layer.layer_parent.add_result_layer(otsu_layer)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def thresh(pth,gap,name,send_message):
 | 
				
			||||||
 | 
					    ds = gdal.Open(pth)
 | 
				
			||||||
 | 
					    band = ds.GetRasterBand(1)
 | 
				
			||||||
 | 
					    # band_count = ds.RasterCount
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    xsize = ds.RasterXSize
 | 
				
			||||||
 | 
					    ysize = ds.RasterYSize
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    max_pixels = 1e7
 | 
				
			||||||
 | 
					    max_rows = max_pixels // xsize
 | 
				
			||||||
 | 
					    if max_rows < 1:
 | 
				
			||||||
 | 
					        max_rows = 1
 | 
				
			||||||
 | 
					    if max_rows > ysize:
 | 
				
			||||||
 | 
					        max_rows = ysize
 | 
				
			||||||
 | 
					    block_count = ysize // max_rows + 1
 | 
				
			||||||
 | 
					    # for i in range(block_count):
 | 
				
			||||||
 | 
					    #     start_row = i * max_rows
 | 
				
			||||||
 | 
					    #     end_row = min((i + 1) * max_rows, ysize)
 | 
				
			||||||
 | 
					    #     block = band.ReadAsArray(0, start_row, xsize, end_row - start_row)
 | 
				
			||||||
 | 
					        # hist += np.histogram(block.flatten(), bins=256, range=(0, 255))[0]
 | 
				
			||||||
 | 
					    # hist = hist.astype(np.float32)
 | 
				
			||||||
 | 
					    send_message.emit('阈值为:{}'.format(gap))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    out_th = os.path.join(Project().bcdm_path, '{}_thresh{}_bcdm.tif'.format(name,gap))
 | 
				
			||||||
 | 
					    out_ds = gdal.GetDriverByName('GTiff').Create(out_th, xsize, ysize, 1, gdal.GDT_Byte)
 | 
				
			||||||
 | 
					    out_ds.SetGeoTransform(ds.GetGeoTransform())
 | 
				
			||||||
 | 
					    out_ds.SetProjection(ds.GetProjection())
 | 
				
			||||||
 | 
					    out_band = out_ds.GetRasterBand(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for i in range(block_count):
 | 
				
			||||||
 | 
					        start_row = i * max_rows
 | 
				
			||||||
 | 
					        end_row = min((i + 1) * max_rows, ysize)
 | 
				
			||||||
 | 
					        block = band.ReadAsArray(0, start_row, xsize, end_row - start_row)
 | 
				
			||||||
 | 
					        out_band.WriteArray(block > gap, 0, start_row)
 | 
				
			||||||
 | 
					    out_band.FlushCache()
 | 
				
			||||||
 | 
					    out_ds = None
 | 
				
			||||||
 | 
					    ds = None
 | 
				
			||||||
 | 
					    send_message.emit('自定义阈值分割完成')
 | 
				
			||||||
 | 
					    return out_th
 | 
				
			||||||
 | 
					    #otsu_layer = SingleBandRasterLayer(path = out_th, style_info={})
 | 
				
			||||||
 | 
					    #layer.layer_parent.add_result_layer(otsu_layer)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def table_layer(pth,layer,name,send_message):
 | 
				
			||||||
 | 
					    send_message.emit('正在计算表格结果...')
 | 
				
			||||||
 | 
					    cell_size = layer.layer_parent.cell_size
 | 
				
			||||||
 | 
					    ds = gdal.Open(pth)
 | 
				
			||||||
 | 
					    xsize = ds.RasterXSize
 | 
				
			||||||
 | 
					    ysize = ds.RasterYSize
 | 
				
			||||||
 | 
					    geo = ds.GetGeoTransform()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    out_csv = os.path.join(Project().other_path, f'{name}_table_result.csv')
 | 
				
			||||||
 | 
					    yblocks = ysize // cell_size[1] + 1
 | 
				
			||||||
 | 
					    xblocks = xsize // cell_size[0] + 1
 | 
				
			||||||
 | 
					    with open(out_csv, 'w') as f:
 | 
				
			||||||
 | 
					        f.write('x,y,diff,status\n')
 | 
				
			||||||
 | 
					        for j in range(yblocks):
 | 
				
			||||||
 | 
					            block_xy = (0, j * cell_size[1])
 | 
				
			||||||
 | 
					            block_size = (xsize, cell_size[1])
 | 
				
			||||||
 | 
					            if block_xy[1] + block_size[1] > ysize:
 | 
				
			||||||
 | 
					                block_size = (xsize, ysize - block_xy[1])
 | 
				
			||||||
 | 
					            block_data = ds.ReadAsArray(*block_xy, *block_size)
 | 
				
			||||||
 | 
					            for i in range(xblocks):
 | 
				
			||||||
 | 
					                start_x = i * cell_size[0]
 | 
				
			||||||
 | 
					                end_x = start_x + cell_size[0]
 | 
				
			||||||
 | 
					                if end_x > xsize:
 | 
				
			||||||
 | 
					                    end_x = xsize
 | 
				
			||||||
 | 
					                block_data_xy = block_data[:, start_x:end_x]
 | 
				
			||||||
 | 
					                if block_data_xy.mean() > 0.5:
 | 
				
			||||||
 | 
					                    center_x = start_x + cell_size[0] // 2
 | 
				
			||||||
 | 
					                    center_y = j * cell_size[1] + cell_size[1] // 2
 | 
				
			||||||
 | 
					                    center_x = center_x * geo[1] + geo [0]
 | 
				
			||||||
 | 
					                    center_y = center_y * geo[5] + geo [3]
 | 
				
			||||||
 | 
					                    f.write(f'{center_x},{center_y},{block_data_xy.mean() * 100},1\n')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    result_layer = ResultPointLayer(out_csv, enable=True, proj=layer.proj, geo=layer.geo)
 | 
				
			||||||
 | 
					    layer.layer_parent.add_result_layer(result_layer)
 | 
				
			||||||
 | 
					    send_message.emit('计算完成')
 | 
				
			||||||
							
								
								
									
										42
									
								
								plugins/In_one/otsu.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								plugins/In_one/otsu.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,42 @@
 | 
				
			|||||||
 | 
					import numpy as np
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def OTSU(hist):
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					    u1=0.0#背景像素的平均灰度值
 | 
				
			||||||
 | 
					    u2=0.0#前景像素的平均灰度值
 | 
				
			||||||
 | 
					    th=0.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #总的像素数目
 | 
				
			||||||
 | 
					    PixSum= np.sum(hist)
 | 
				
			||||||
 | 
					    #各灰度值所占总像素数的比例
 | 
				
			||||||
 | 
					    PixRate=hist / PixSum
 | 
				
			||||||
 | 
					    #统计各个灰度值的像素个数
 | 
				
			||||||
 | 
					    Max_var = 0
 | 
				
			||||||
 | 
					    #确定最大类间方差对应的阈值
 | 
				
			||||||
 | 
					    GrayScale = len(hist)
 | 
				
			||||||
 | 
					    for i in range(1,len(hist)):#从1开始是为了避免w1为0.
 | 
				
			||||||
 | 
					        u1_tem=0.0
 | 
				
			||||||
 | 
					        u2_tem=0.0
 | 
				
			||||||
 | 
					        #背景像素的比列
 | 
				
			||||||
 | 
					        w1=np.sum(PixRate[:i])
 | 
				
			||||||
 | 
					        #前景像素的比例
 | 
				
			||||||
 | 
					        w2=1.0-w1
 | 
				
			||||||
 | 
					        if w1==0 or w2==0:
 | 
				
			||||||
 | 
					            pass
 | 
				
			||||||
 | 
					        else:#背景像素的平均灰度值
 | 
				
			||||||
 | 
					            for m in range(i):
 | 
				
			||||||
 | 
					                u1_tem=u1_tem+PixRate[m]*m
 | 
				
			||||||
 | 
					            u1 = u1_tem * 1.0 / w1
 | 
				
			||||||
 | 
					             #前景像素的平均灰度值
 | 
				
			||||||
 | 
					            for n in range(i,GrayScale):
 | 
				
			||||||
 | 
					                u2_tem = u2_tem + PixRate[n]*n
 | 
				
			||||||
 | 
					            u2 = u2_tem / w2
 | 
				
			||||||
 | 
					            #print(u1)
 | 
				
			||||||
 | 
					            #类间方差公式:G=w1*w2*(u1-u2)**2
 | 
				
			||||||
 | 
					            tem_var=w1*w2*np.power((u1-u2),2)
 | 
				
			||||||
 | 
					            #print(tem_var)
 | 
				
			||||||
 | 
					            #判断当前类间方差是否为最大值。
 | 
				
			||||||
 | 
					            if Max_var<tem_var:
 | 
				
			||||||
 | 
					                Max_var=tem_var#深拷贝,Max_var与tem_var占用不同的内存空间。
 | 
				
			||||||
 | 
					                th=i
 | 
				
			||||||
 | 
					    return th 
 | 
				
			||||||
@ -9,89 +9,6 @@
 | 
				
			|||||||
from PyQt5 import QtCore
 | 
					from PyQt5 import QtCore
 | 
				
			||||||
 | 
					
 | 
				
			||||||
qt_resource_data = b"\
 | 
					qt_resource_data = b"\
 | 
				
			||||||
\x00\x00\x05\x0d\
 | 
					 | 
				
			||||||
\x3c\
 | 
					 | 
				
			||||||
\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
 | 
					 | 
				
			||||||
\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\
 | 
					 | 
				
			||||||
\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\
 | 
					 | 
				
			||||||
\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\
 | 
					 | 
				
			||||||
\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\
 | 
					 | 
				
			||||||
\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\
 | 
					 | 
				
			||||||
\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\
 | 
					 | 
				
			||||||
\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\
 | 
					 | 
				
			||||||
\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x36\
 | 
					 | 
				
			||||||
\x35\x35\x31\x30\x35\x33\x35\x33\x37\x31\x33\x22\x20\x63\x6c\x61\
 | 
					 | 
				
			||||||
\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\
 | 
					 | 
				
			||||||
\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\
 | 
					 | 
				
			||||||
\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\
 | 
					 | 
				
			||||||
\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
 | 
					 | 
				
			||||||
\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\
 | 
					 | 
				
			||||||
\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x32\x39\x32\x22\x20\x78\
 | 
					 | 
				
			||||||
\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\
 | 
					 | 
				
			||||||
\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\
 | 
					 | 
				
			||||||
\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x77\x69\x64\x74\x68\x3d\
 | 
					 | 
				
			||||||
\x22\x31\x32\x38\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x32\
 | 
					 | 
				
			||||||
\x38\x22\x3e\x3c\x64\x65\x66\x73\x3e\x3c\x73\x74\x79\x6c\x65\x20\
 | 
					 | 
				
			||||||
\x74\x79\x70\x65\x3d\x22\x74\x65\x78\x74\x2f\x63\x73\x73\x22\x3e\
 | 
					 | 
				
			||||||
\x40\x66\x6f\x6e\x74\x2d\x66\x61\x63\x65\x20\x7b\x20\x66\x6f\x6e\
 | 
					 | 
				
			||||||
\x74\x2d\x66\x61\x6d\x69\x6c\x79\x3a\x20\x66\x65\x65\x64\x62\x61\
 | 
					 | 
				
			||||||
\x63\x6b\x2d\x69\x63\x6f\x6e\x66\x6f\x6e\x74\x3b\x20\x73\x72\x63\
 | 
					 | 
				
			||||||
\x3a\x20\x75\x72\x6c\x28\x22\x2f\x2f\x61\x74\x2e\x61\x6c\x69\x63\
 | 
					 | 
				
			||||||
\x64\x6e\x2e\x63\x6f\x6d\x2f\x74\x2f\x66\x6f\x6e\x74\x5f\x31\x30\
 | 
					 | 
				
			||||||
\x33\x31\x31\x35\x38\x5f\x75\x36\x39\x77\x38\x79\x68\x78\x64\x75\
 | 
					 | 
				
			||||||
\x2e\x77\x6f\x66\x66\x32\x3f\x74\x3d\x31\x36\x33\x30\x30\x33\x33\
 | 
					 | 
				
			||||||
\x37\x35\x39\x39\x34\x34\x22\x29\x20\x66\x6f\x72\x6d\x61\x74\x28\
 | 
					 | 
				
			||||||
\x22\x77\x6f\x66\x66\x32\x22\x29\x2c\x20\x75\x72\x6c\x28\x22\x2f\
 | 
					 | 
				
			||||||
\x2f\x61\x74\x2e\x61\x6c\x69\x63\x64\x6e\x2e\x63\x6f\x6d\x2f\x74\
 | 
					 | 
				
			||||||
\x2f\x66\x6f\x6e\x74\x5f\x31\x30\x33\x31\x31\x35\x38\x5f\x75\x36\
 | 
					 | 
				
			||||||
\x39\x77\x38\x79\x68\x78\x64\x75\x2e\x77\x6f\x66\x66\x3f\x74\x3d\
 | 
					 | 
				
			||||||
\x31\x36\x33\x30\x30\x33\x33\x37\x35\x39\x39\x34\x34\x22\x29\x20\
 | 
					 | 
				
			||||||
\x66\x6f\x72\x6d\x61\x74\x28\x22\x77\x6f\x66\x66\x22\x29\x2c\x20\
 | 
					 | 
				
			||||||
\x75\x72\x6c\x28\x22\x2f\x2f\x61\x74\x2e\x61\x6c\x69\x63\x64\x6e\
 | 
					 | 
				
			||||||
\x2e\x63\x6f\x6d\x2f\x74\x2f\x66\x6f\x6e\x74\x5f\x31\x30\x33\x31\
 | 
					 | 
				
			||||||
\x31\x35\x38\x5f\x75\x36\x39\x77\x38\x79\x68\x78\x64\x75\x2e\x74\
 | 
					 | 
				
			||||||
\x74\x66\x3f\x74\x3d\x31\x36\x33\x30\x30\x33\x33\x37\x35\x39\x39\
 | 
					 | 
				
			||||||
\x34\x34\x22\x29\x20\x66\x6f\x72\x6d\x61\x74\x28\x22\x74\x72\x75\
 | 
					 | 
				
			||||||
\x65\x74\x79\x70\x65\x22\x29\x3b\x20\x7d\x0a\x3c\x2f\x73\x74\x79\
 | 
					 | 
				
			||||||
\x6c\x65\x3e\x3c\x2f\x64\x65\x66\x73\x3e\x3c\x70\x61\x74\x68\x20\
 | 
					 | 
				
			||||||
\x64\x3d\x22\x4d\x35\x31\x37\x2e\x36\x38\x38\x38\x38\x39\x20\x37\
 | 
					 | 
				
			||||||
\x39\x36\x2e\x34\x34\x34\x34\x34\x34\x63\x2d\x34\x35\x2e\x35\x31\
 | 
					 | 
				
			||||||
\x31\x31\x31\x31\x20\x30\x2d\x38\x35\x2e\x33\x33\x33\x33\x33\x33\
 | 
					 | 
				
			||||||
\x2d\x31\x37\x2e\x30\x36\x36\x36\x36\x37\x2d\x31\x31\x39\x2e\x34\
 | 
					 | 
				
			||||||
\x36\x36\x36\x36\x37\x2d\x35\x31\x2e\x32\x4c\x37\x33\x2e\x39\x35\
 | 
					 | 
				
			||||||
\x35\x35\x35\x36\x20\x33\x38\x31\x2e\x31\x35\x35\x35\x35\x36\x63\
 | 
					 | 
				
			||||||
\x2d\x32\x32\x2e\x37\x35\x35\x35\x35\x36\x2d\x32\x32\x2e\x37\x35\
 | 
					 | 
				
			||||||
\x35\x35\x35\x36\x2d\x31\x37\x2e\x30\x36\x36\x36\x36\x37\x2d\x35\
 | 
					 | 
				
			||||||
\x36\x2e\x38\x38\x38\x38\x38\x39\x20\x35\x2e\x36\x38\x38\x38\x38\
 | 
					 | 
				
			||||||
\x38\x2d\x37\x39\x2e\x36\x34\x34\x34\x34\x35\x20\x32\x32\x2e\x37\
 | 
					 | 
				
			||||||
\x35\x35\x35\x35\x36\x2d\x32\x32\x2e\x37\x35\x35\x35\x35\x36\x20\
 | 
					 | 
				
			||||||
\x35\x36\x2e\x38\x38\x38\x38\x38\x39\x2d\x31\x37\x2e\x30\x36\x36\
 | 
					 | 
				
			||||||
\x36\x36\x37\x20\x37\x39\x2e\x36\x34\x34\x34\x34\x35\x20\x35\x2e\
 | 
					 | 
				
			||||||
\x36\x38\x38\x38\x38\x39\x6c\x33\x32\x39\x2e\x39\x35\x35\x35\x35\
 | 
					 | 
				
			||||||
\x35\x20\x33\x36\x34\x2e\x30\x38\x38\x38\x38\x39\x63\x35\x2e\x36\
 | 
					 | 
				
			||||||
\x38\x38\x38\x38\x39\x20\x35\x2e\x36\x38\x38\x38\x38\x39\x20\x31\
 | 
					 | 
				
			||||||
\x37\x2e\x30\x36\x36\x36\x36\x37\x20\x31\x31\x2e\x33\x37\x37\x37\
 | 
					 | 
				
			||||||
\x37\x38\x20\x32\x38\x2e\x34\x34\x34\x34\x34\x35\x20\x31\x31\x2e\
 | 
					 | 
				
			||||||
\x33\x37\x37\x37\x37\x38\x73\x32\x32\x2e\x37\x35\x35\x35\x35\x36\
 | 
					 | 
				
			||||||
\x2d\x35\x2e\x36\x38\x38\x38\x38\x39\x20\x33\x34\x2e\x31\x33\x33\
 | 
					 | 
				
			||||||
\x33\x33\x33\x2d\x31\x37\x2e\x30\x36\x36\x36\x36\x37\x6c\x33\x31\
 | 
					 | 
				
			||||||
\x32\x2e\x38\x38\x38\x38\x38\x39\x2d\x33\x36\x34\x2e\x30\x38\x38\
 | 
					 | 
				
			||||||
\x38\x38\x39\x63\x32\x32\x2e\x37\x35\x35\x35\x35\x36\x2d\x32\x32\
 | 
					 | 
				
			||||||
\x2e\x37\x35\x35\x35\x35\x36\x20\x35\x36\x2e\x38\x38\x38\x38\x38\
 | 
					 | 
				
			||||||
\x39\x2d\x32\x38\x2e\x34\x34\x34\x34\x34\x34\x20\x37\x39\x2e\x36\
 | 
					 | 
				
			||||||
\x34\x34\x34\x34\x35\x2d\x35\x2e\x36\x38\x38\x38\x38\x39\x20\x32\
 | 
					 | 
				
			||||||
\x32\x2e\x37\x35\x35\x35\x35\x36\x20\x32\x32\x2e\x37\x35\x35\x35\
 | 
					 | 
				
			||||||
\x35\x36\x20\x32\x38\x2e\x34\x34\x34\x34\x34\x34\x20\x35\x36\x2e\
 | 
					 | 
				
			||||||
\x38\x38\x38\x38\x38\x39\x20\x35\x2e\x36\x38\x38\x38\x38\x38\x20\
 | 
					 | 
				
			||||||
\x37\x39\x2e\x36\x34\x34\x34\x34\x35\x4c\x36\x33\x37\x2e\x31\x35\
 | 
					 | 
				
			||||||
\x35\x35\x35\x36\x20\x37\x33\x39\x2e\x35\x35\x35\x35\x35\x36\x63\
 | 
					 | 
				
			||||||
\x2d\x32\x38\x2e\x34\x34\x34\x34\x34\x34\x20\x33\x39\x2e\x38\x32\
 | 
					 | 
				
			||||||
\x32\x32\x32\x32\x2d\x36\x38\x2e\x32\x36\x36\x36\x36\x37\x20\x35\
 | 
					 | 
				
			||||||
\x36\x2e\x38\x38\x38\x38\x38\x39\x2d\x31\x31\x39\x2e\x34\x36\x36\
 | 
					 | 
				
			||||||
\x36\x36\x37\x20\x35\x36\x2e\x38\x38\x38\x38\x38\x38\x20\x35\x2e\
 | 
					 | 
				
			||||||
\x36\x38\x38\x38\x38\x39\x20\x30\x20\x30\x20\x30\x20\x30\x20\x30\
 | 
					 | 
				
			||||||
\x7a\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x32\x39\x33\x22\x3e\x3c\
 | 
					 | 
				
			||||||
\x2f\x70\x61\x74\x68\x3e\x3c\x2f\x73\x76\x67\x3e\
 | 
					 | 
				
			||||||
\x00\x00\x05\x32\
 | 
					\x00\x00\x05\x32\
 | 
				
			||||||
\x3c\
 | 
					\x3c\
 | 
				
			||||||
\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
 | 
					\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
 | 
				
			||||||
@ -178,6 +95,286 @@ qt_resource_data = b"\
 | 
				
			|||||||
\x37\x37\x37\x37\x38\x7a\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x31\
 | 
					\x37\x37\x37\x37\x38\x7a\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x31\
 | 
				
			||||||
\x33\x38\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x2f\x73\x76\x67\
 | 
					\x33\x38\x22\x3e\x3c\x2f\x70\x61\x74\x68\x3e\x3c\x2f\x73\x76\x67\
 | 
				
			||||||
\x3e\
 | 
					\x3e\
 | 
				
			||||||
 | 
					\x00\x00\x04\xf8\
 | 
				
			||||||
 | 
					\x89\
 | 
				
			||||||
 | 
					\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
 | 
				
			||||||
 | 
					\x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3\x3e\x61\xcb\
 | 
				
			||||||
 | 
					\x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x04\
 | 
				
			||||||
 | 
					\xb2\x49\x44\x41\x54\x78\x5e\xed\x99\xef\x8e\x15\x45\x10\xc5\xab\
 | 
				
			||||||
 | 
					\xf7\x71\xf0\x31\xa6\x7b\xdf\x40\xfc\x13\x10\x54\xa2\x04\x95\x68\
 | 
				
			||||||
 | 
					\x50\x09\x2a\x51\x09\x2a\x41\x45\x09\x2a\x41\x82\x88\x4a\x80\x7d\
 | 
				
			||||||
 | 
					\x85\xa9\x7e\x0c\x7d\x9c\x5b\x66\xd4\xd5\x05\x2e\x5b\x3b\xe5\x07\
 | 
				
			||||||
 | 
					\xee\x9c\x3a\xfd\x75\xeb\x64\x73\xce\xf9\xa5\x7a\x66\x6e\x11\x9e\
 | 
				
			||||||
 | 
					\xd4\x09\x94\xd4\xee\x69\x5e\x08\x40\x72\x08\x08\x00\x01\x48\x9e\
 | 
				
			||||||
 | 
					\x40\x72\xfb\xdc\x00\x04\x20\x79\x02\xc9\xed\x73\x03\x10\x80\xe4\
 | 
				
			||||||
 | 
					\x09\x24\xb7\xcf\x0d\x40\x00\x92\x27\x90\xdc\x3e\x37\x00\x01\x48\
 | 
				
			||||||
 | 
					\x9e\x40\x72\xfb\xdc\x00\x04\x20\x79\x02\xc9\xed\x73\x03\x10\x80\
 | 
				
			||||||
 | 
					\xe4\x09\x24\xb7\xcf\x0d\x40\x00\x92\x27\x90\xdc\x3e\x37\x00\x01\
 | 
				
			||||||
 | 
					\x48\x9e\x40\x72\xfb\xdc\x00\x04\x20\x79\x02\xc9\xed\x73\x03\x10\
 | 
				
			||||||
 | 
					\x80\xe4\x09\x24\xb7\xcf\x0d\x40\x00\x92\x27\x90\xdc\x3e\x37\x00\
 | 
				
			||||||
 | 
					\x01\x48\x9e\x40\x72\xfb\xdc\x00\x04\x20\x79\x02\xc9\xed\x43\x6f\
 | 
				
			||||||
 | 
					\x80\x61\x18\x0e\xf5\xde\xff\x48\xde\xf1\xbe\xf6\x61\x01\x98\xca\
 | 
				
			||||||
 | 
					\xdf\xda\xda\xda\x59\xad\x56\x87\x09\xc1\x93\x19\x80\x04\x60\xb7\
 | 
				
			||||||
 | 
					\x7c\x33\x7b\xa6\x94\xf2\x3b\x21\x48\x04\xc0\xde\xf2\x77\x6d\x13\
 | 
				
			||||||
 | 
					\x82\x24\x00\xac\x2b\x9f\x10\xec\xff\x04\x04\x73\x05\xec\x57\x3e\
 | 
				
			||||||
 | 
					\x21\x00\xdf\x00\x07\x29\x9f\x10\xac\x87\x60\xf1\x1b\x60\x4e\xf9\
 | 
				
			||||||
 | 
					\x84\xe0\x71\x08\x16\x0d\x40\xa4\x7c\x42\xf0\x30\x04\x8b\x06\x60\
 | 
				
			||||||
 | 
					\xb2\x42\x08\xfe\xdf\x67\xae\xc5\x03\x40\x08\x08\xc0\x5f\x09\x70\
 | 
				
			||||||
 | 
					\x13\xc4\x40\x80\xd8\x00\xbb\xd6\x09\xc1\x7c\x08\xa0\x00\xe0\x26\
 | 
				
			||||||
 | 
					\x20\x00\xbc\x0e\x66\x32\x00\xb7\x01\x78\x1d\xcc\x23\x00\x16\x00\
 | 
				
			||||||
 | 
					\x5e\x07\x07\x03\x01\x1a\x00\x42\xe0\x43\x00\x0f\x00\x21\x48\xf2\
 | 
				
			||||||
 | 
					\x6b\xa0\xc7\x3a\x5f\x11\x41\x7f\x0c\xf2\x8a\xdf\xfb\x77\x42\x00\
 | 
				
			||||||
 | 
					\xf6\x63\xd0\x9c\xf2\xf9\x76\xc0\x0d\xf0\x6f\x02\xdc\x04\xff\xc1\
 | 
				
			||||||
 | 
					\x90\xe2\x21\x70\x1d\xfb\x84\xe0\xef\x54\xd2\x02\xc0\xb7\x03\x02\
 | 
				
			||||||
 | 
					\xc0\xcf\xc6\xd9\x37\x00\x1f\x0c\x93\x5f\x01\x7c\x45\x24\x00\x0f\
 | 
				
			||||||
 | 
					\x3d\x1f\x66\x7c\x30\x4c\xfd\x10\xc8\xb7\x03\x6e\x80\xb5\x5f\x47\
 | 
				
			||||||
 | 
					\x6a\xad\x1f\x8b\xc8\x27\x91\x0f\x4d\x22\xf2\xa9\xaa\x46\xb5\xc1\
 | 
				
			||||||
 | 
					\x7f\x19\x97\x71\x03\x3c\x92\xdd\x30\x0c\xe7\x4b\x29\x17\x22\x91\
 | 
				
			||||||
 | 
					\x9a\xd9\x85\xde\xfb\x04\xcf\x62\x0e\x01\xd8\x53\x55\xad\xf5\x43\
 | 
				
			||||||
 | 
					\x11\xb9\x18\x6c\xef\xa2\xaa\x9e\x0f\x6a\x9f\x9a\x8c\x00\xfc\x13\
 | 
				
			||||||
 | 
					\xfd\x30\x0c\xe7\x4a\x29\x9f\x07\x9b\xf8\x4c\x55\x3f\x0a\x6a\x9f\
 | 
				
			||||||
 | 
					\xaa\x8c\x00\x88\x48\x6b\xed\xac\x99\x5d\x8a\x34\x51\x4a\xf9\x62\
 | 
				
			||||||
 | 
					\x1c\xc7\x0f\x22\xda\x4d\xd0\xa4\x07\xa0\xd6\xfa\x9e\x88\x5c\x0e\
 | 
				
			||||||
 | 
					\x96\x71\x49\x55\xcf\x05\xb5\x1b\x21\x4b\x0d\x40\x6b\xed\x8c\x99\
 | 
				
			||||||
 | 
					\x7d\x15\x69\xc2\xcc\x2e\xf7\xde\xcf\x46\xb4\x9b\xa4\x49\x0b\x40\
 | 
				
			||||||
 | 
					\xad\xf5\x1d\x11\xb9\x12\x2c\xe3\x4b\x55\x7d\x3f\xa8\xdd\x28\x59\
 | 
				
			||||||
 | 
					\x4a\x00\x6a\xad\x6f\x8b\xc8\x37\x91\x26\xcc\xec\xeb\xde\xfb\xbb\
 | 
				
			||||||
 | 
					\x11\xed\x26\x6a\xd2\x01\x30\x0c\xc3\xe9\x52\xca\xd5\x48\x19\xa5\
 | 
				
			||||||
 | 
					\x94\x2b\xe3\x38\x9e\x89\x68\x37\x55\x93\x0a\x80\x5a\xeb\x9b\x22\
 | 
				
			||||||
 | 
					\x72\x2d\x58\xc6\xb7\xaa\x3a\x5d\x1b\x50\x27\x0d\x00\xc3\x30\x9c\
 | 
				
			||||||
 | 
					\x2a\xa5\x7c\x1f\x69\xcf\xcc\xae\xf6\xde\xa7\x6b\x03\xee\xa4\x00\
 | 
				
			||||||
 | 
					\xa0\xb5\x76\xd2\xcc\xae\x07\xdb\xbb\xa6\xaa\xa7\x83\xda\x8d\x97\
 | 
				
			||||||
 | 
					\xc1\x03\x50\x6b\x7d\x4d\x44\x6e\x04\x9b\xf8\x4e\x55\xdf\x0a\x6a\
 | 
				
			||||||
 | 
					\x17\x21\x83\x06\xa0\xb5\x76\xc2\xcc\x6e\x06\x9b\xf8\x41\x55\xdf\
 | 
				
			||||||
 | 
					\x08\x6a\x17\x23\x83\x05\xa0\xd6\xfa\x8a\x88\xdc\x0a\x36\x71\x5d\
 | 
				
			||||||
 | 
					\x55\x4f\x05\xb5\x8b\x92\x41\x02\xd0\x5a\x3b\x6e\x66\xb7\x23\x4d\
 | 
				
			||||||
 | 
					\x98\xd9\x8d\xde\xfb\xc9\x88\x76\x89\x1a\x38\x00\x6a\xad\x2f\x89\
 | 
				
			||||||
 | 
					\xc8\x9d\x60\x19\x3f\xaa\xea\xeb\x41\xed\x22\x65\x50\x00\xb4\xd6\
 | 
				
			||||||
 | 
					\x8e\x98\xd9\xaf\xc1\x26\x6e\xaa\xea\xf4\xc0\x98\xea\xc0\x00\x50\
 | 
				
			||||||
 | 
					\x6b\x7d\x51\x44\xee\x46\xda\x2b\xa5\xdc\x1a\xc7\xf1\x44\x44\xbb\
 | 
				
			||||||
 | 
					\x74\x0d\x04\x00\xdb\xdb\xdb\xcf\xaf\x56\xab\x7b\xc1\x32\x7e\x52\
 | 
				
			||||||
 | 
					\xd5\x57\x83\xda\xc5\xcb\x16\x0f\x40\xad\xf5\xb0\x88\x3c\x88\x34\
 | 
				
			||||||
 | 
					\x61\x66\x3f\xf7\xde\x5f\x8e\x68\x51\x34\x08\x00\xec\x88\xc8\xb3\
 | 
				
			||||||
 | 
					\x73\x0b\x29\xa5\xdc\x19\xc7\xf1\xf8\x5c\x1d\xda\xfc\xe2\x01\x98\
 | 
				
			||||||
 | 
					\x0a\xa9\xb5\xce\x85\xe0\x17\x55\x3d\x86\x56\x66\xc4\x0f\x04\x00\
 | 
				
			||||||
 | 
					\x73\x20\x30\xb3\xdf\x7a\xef\x47\x23\x61\x21\x6a\x60\x00\x38\x20\
 | 
				
			||||||
 | 
					\x04\x77\x55\xf5\x08\x62\x91\x51\x4f\x50\x00\x38\x10\xdc\x53\xd5\
 | 
				
			||||||
 | 
					\xe9\x55\x91\x67\x4f\x02\x70\x00\xac\x83\xa0\x94\x72\x7f\x1c\xc7\
 | 
				
			||||||
 | 
					\x17\xd8\xfc\xe3\x09\x40\x02\xf0\x08\x04\x3b\xaa\xfa\x1c\xcb\x5f\
 | 
				
			||||||
 | 
					\x9f\x00\x2c\x00\xbb\x10\xa8\xea\xf4\x9d\x80\xe7\x09\x09\x40\x03\
 | 
				
			||||||
 | 
					\xc0\xd6\xfd\x04\x08\x80\x9f\x11\xf4\x04\x01\x80\xae\xd7\x37\x47\
 | 
				
			||||||
 | 
					\x00\xfc\x8c\xa0\x27\x08\x00\x74\xbd\xbe\x39\x02\xe0\x67\x04\x3d\
 | 
				
			||||||
 | 
					\x41\x00\xa0\xeb\xf5\xcd\x11\x00\x3f\x23\xe8\x09\x02\x00\x5d\xaf\
 | 
				
			||||||
 | 
					\x6f\x8e\x00\xf8\x19\x41\x4f\x10\x00\xe8\x7a\x7d\x73\x04\xc0\xcf\
 | 
				
			||||||
 | 
					\x08\x7a\x82\x00\x40\xd7\xeb\x9b\x23\x00\x7e\x46\xd0\x13\x04\x00\
 | 
				
			||||||
 | 
					\xba\x5e\xdf\x1c\x01\xf0\x33\x82\x9e\x20\x00\xd0\xf5\xfa\xe6\x08\
 | 
				
			||||||
 | 
					\x80\x9f\x11\xf4\x04\x01\x80\xae\xd7\x37\x47\x00\xfc\x8c\xa0\x27\
 | 
				
			||||||
 | 
					\x08\x00\x74\xbd\xbe\x39\x02\xe0\x67\x04\x3d\x41\x00\xa0\xeb\xf5\
 | 
				
			||||||
 | 
					\xcd\x11\x00\x3f\x23\xe8\x09\x02\x00\x5d\xaf\x6f\x8e\x00\xf8\x19\
 | 
				
			||||||
 | 
					\x41\x4f\x10\x00\xe8\x7a\x7d\x73\x04\xc0\xcf\x08\x7a\x82\x00\x40\
 | 
				
			||||||
 | 
					\xd7\xeb\x9b\x23\x00\x7e\x46\xd0\x13\x04\x00\xba\x5e\xdf\x1c\x01\
 | 
				
			||||||
 | 
					\xf0\x33\x82\x9e\x20\x00\xd0\xf5\xfa\xe6\x08\x80\x9f\x11\xf4\x04\
 | 
				
			||||||
 | 
					\x01\x80\xae\xd7\x37\x47\x00\xfc\x8c\xa0\x27\x08\x00\x74\xbd\xbe\
 | 
				
			||||||
 | 
					\xb9\x3f\x01\xc2\xa1\x1b\x9f\x9b\x5d\x0e\x95\x00\x00\x00\x00\x49\
 | 
				
			||||||
 | 
					\x45\x4e\x44\xae\x42\x60\x82\
 | 
				
			||||||
 | 
					\x00\x00\x05\x0d\
 | 
				
			||||||
 | 
					\x3c\
 | 
				
			||||||
 | 
					\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\
 | 
				
			||||||
 | 
					\x30\x22\x20\x73\x74\x61\x6e\x64\x61\x6c\x6f\x6e\x65\x3d\x22\x6e\
 | 
				
			||||||
 | 
					\x6f\x22\x3f\x3e\x3c\x21\x44\x4f\x43\x54\x59\x50\x45\x20\x73\x76\
 | 
				
			||||||
 | 
					\x67\x20\x50\x55\x42\x4c\x49\x43\x20\x22\x2d\x2f\x2f\x57\x33\x43\
 | 
				
			||||||
 | 
					\x2f\x2f\x44\x54\x44\x20\x53\x56\x47\x20\x31\x2e\x31\x2f\x2f\x45\
 | 
				
			||||||
 | 
					\x4e\x22\x20\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x77\
 | 
				
			||||||
 | 
					\x33\x2e\x6f\x72\x67\x2f\x47\x72\x61\x70\x68\x69\x63\x73\x2f\x53\
 | 
				
			||||||
 | 
					\x56\x47\x2f\x31\x2e\x31\x2f\x44\x54\x44\x2f\x73\x76\x67\x31\x31\
 | 
				
			||||||
 | 
					\x2e\x64\x74\x64\x22\x3e\x3c\x73\x76\x67\x20\x74\x3d\x22\x31\x36\
 | 
				
			||||||
 | 
					\x35\x35\x31\x30\x35\x33\x35\x33\x37\x31\x33\x22\x20\x63\x6c\x61\
 | 
				
			||||||
 | 
					\x73\x73\x3d\x22\x69\x63\x6f\x6e\x22\x20\x76\x69\x65\x77\x42\x6f\
 | 
				
			||||||
 | 
					\x78\x3d\x22\x30\x20\x30\x20\x31\x30\x32\x34\x20\x31\x30\x32\x34\
 | 
				
			||||||
 | 
					\x22\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\x31\x22\x20\
 | 
				
			||||||
 | 
					\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\
 | 
				
			||||||
 | 
					\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\x76\
 | 
				
			||||||
 | 
					\x67\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x32\x39\x32\x22\x20\x78\
 | 
				
			||||||
 | 
					\x6d\x6c\x6e\x73\x3a\x78\x6c\x69\x6e\x6b\x3d\x22\x68\x74\x74\x70\
 | 
				
			||||||
 | 
					\x3a\x2f\x2f\x77\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x31\x39\
 | 
				
			||||||
 | 
					\x39\x39\x2f\x78\x6c\x69\x6e\x6b\x22\x20\x77\x69\x64\x74\x68\x3d\
 | 
				
			||||||
 | 
					\x22\x31\x32\x38\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x31\x32\
 | 
				
			||||||
 | 
					\x38\x22\x3e\x3c\x64\x65\x66\x73\x3e\x3c\x73\x74\x79\x6c\x65\x20\
 | 
				
			||||||
 | 
					\x74\x79\x70\x65\x3d\x22\x74\x65\x78\x74\x2f\x63\x73\x73\x22\x3e\
 | 
				
			||||||
 | 
					\x40\x66\x6f\x6e\x74\x2d\x66\x61\x63\x65\x20\x7b\x20\x66\x6f\x6e\
 | 
				
			||||||
 | 
					\x74\x2d\x66\x61\x6d\x69\x6c\x79\x3a\x20\x66\x65\x65\x64\x62\x61\
 | 
				
			||||||
 | 
					\x63\x6b\x2d\x69\x63\x6f\x6e\x66\x6f\x6e\x74\x3b\x20\x73\x72\x63\
 | 
				
			||||||
 | 
					\x3a\x20\x75\x72\x6c\x28\x22\x2f\x2f\x61\x74\x2e\x61\x6c\x69\x63\
 | 
				
			||||||
 | 
					\x64\x6e\x2e\x63\x6f\x6d\x2f\x74\x2f\x66\x6f\x6e\x74\x5f\x31\x30\
 | 
				
			||||||
 | 
					\x33\x31\x31\x35\x38\x5f\x75\x36\x39\x77\x38\x79\x68\x78\x64\x75\
 | 
				
			||||||
 | 
					\x2e\x77\x6f\x66\x66\x32\x3f\x74\x3d\x31\x36\x33\x30\x30\x33\x33\
 | 
				
			||||||
 | 
					\x37\x35\x39\x39\x34\x34\x22\x29\x20\x66\x6f\x72\x6d\x61\x74\x28\
 | 
				
			||||||
 | 
					\x22\x77\x6f\x66\x66\x32\x22\x29\x2c\x20\x75\x72\x6c\x28\x22\x2f\
 | 
				
			||||||
 | 
					\x2f\x61\x74\x2e\x61\x6c\x69\x63\x64\x6e\x2e\x63\x6f\x6d\x2f\x74\
 | 
				
			||||||
 | 
					\x2f\x66\x6f\x6e\x74\x5f\x31\x30\x33\x31\x31\x35\x38\x5f\x75\x36\
 | 
				
			||||||
 | 
					\x39\x77\x38\x79\x68\x78\x64\x75\x2e\x77\x6f\x66\x66\x3f\x74\x3d\
 | 
				
			||||||
 | 
					\x31\x36\x33\x30\x30\x33\x33\x37\x35\x39\x39\x34\x34\x22\x29\x20\
 | 
				
			||||||
 | 
					\x66\x6f\x72\x6d\x61\x74\x28\x22\x77\x6f\x66\x66\x22\x29\x2c\x20\
 | 
				
			||||||
 | 
					\x75\x72\x6c\x28\x22\x2f\x2f\x61\x74\x2e\x61\x6c\x69\x63\x64\x6e\
 | 
				
			||||||
 | 
					\x2e\x63\x6f\x6d\x2f\x74\x2f\x66\x6f\x6e\x74\x5f\x31\x30\x33\x31\
 | 
				
			||||||
 | 
					\x31\x35\x38\x5f\x75\x36\x39\x77\x38\x79\x68\x78\x64\x75\x2e\x74\
 | 
				
			||||||
 | 
					\x74\x66\x3f\x74\x3d\x31\x36\x33\x30\x30\x33\x33\x37\x35\x39\x39\
 | 
				
			||||||
 | 
					\x34\x34\x22\x29\x20\x66\x6f\x72\x6d\x61\x74\x28\x22\x74\x72\x75\
 | 
				
			||||||
 | 
					\x65\x74\x79\x70\x65\x22\x29\x3b\x20\x7d\x0a\x3c\x2f\x73\x74\x79\
 | 
				
			||||||
 | 
					\x6c\x65\x3e\x3c\x2f\x64\x65\x66\x73\x3e\x3c\x70\x61\x74\x68\x20\
 | 
				
			||||||
 | 
					\x64\x3d\x22\x4d\x35\x31\x37\x2e\x36\x38\x38\x38\x38\x39\x20\x37\
 | 
				
			||||||
 | 
					\x39\x36\x2e\x34\x34\x34\x34\x34\x34\x63\x2d\x34\x35\x2e\x35\x31\
 | 
				
			||||||
 | 
					\x31\x31\x31\x31\x20\x30\x2d\x38\x35\x2e\x33\x33\x33\x33\x33\x33\
 | 
				
			||||||
 | 
					\x2d\x31\x37\x2e\x30\x36\x36\x36\x36\x37\x2d\x31\x31\x39\x2e\x34\
 | 
				
			||||||
 | 
					\x36\x36\x36\x36\x37\x2d\x35\x31\x2e\x32\x4c\x37\x33\x2e\x39\x35\
 | 
				
			||||||
 | 
					\x35\x35\x35\x36\x20\x33\x38\x31\x2e\x31\x35\x35\x35\x35\x36\x63\
 | 
				
			||||||
 | 
					\x2d\x32\x32\x2e\x37\x35\x35\x35\x35\x36\x2d\x32\x32\x2e\x37\x35\
 | 
				
			||||||
 | 
					\x35\x35\x35\x36\x2d\x31\x37\x2e\x30\x36\x36\x36\x36\x37\x2d\x35\
 | 
				
			||||||
 | 
					\x36\x2e\x38\x38\x38\x38\x38\x39\x20\x35\x2e\x36\x38\x38\x38\x38\
 | 
				
			||||||
 | 
					\x38\x2d\x37\x39\x2e\x36\x34\x34\x34\x34\x35\x20\x32\x32\x2e\x37\
 | 
				
			||||||
 | 
					\x35\x35\x35\x35\x36\x2d\x32\x32\x2e\x37\x35\x35\x35\x35\x36\x20\
 | 
				
			||||||
 | 
					\x35\x36\x2e\x38\x38\x38\x38\x38\x39\x2d\x31\x37\x2e\x30\x36\x36\
 | 
				
			||||||
 | 
					\x36\x36\x37\x20\x37\x39\x2e\x36\x34\x34\x34\x34\x35\x20\x35\x2e\
 | 
				
			||||||
 | 
					\x36\x38\x38\x38\x38\x39\x6c\x33\x32\x39\x2e\x39\x35\x35\x35\x35\
 | 
				
			||||||
 | 
					\x35\x20\x33\x36\x34\x2e\x30\x38\x38\x38\x38\x39\x63\x35\x2e\x36\
 | 
				
			||||||
 | 
					\x38\x38\x38\x38\x39\x20\x35\x2e\x36\x38\x38\x38\x38\x39\x20\x31\
 | 
				
			||||||
 | 
					\x37\x2e\x30\x36\x36\x36\x36\x37\x20\x31\x31\x2e\x33\x37\x37\x37\
 | 
				
			||||||
 | 
					\x37\x38\x20\x32\x38\x2e\x34\x34\x34\x34\x34\x35\x20\x31\x31\x2e\
 | 
				
			||||||
 | 
					\x33\x37\x37\x37\x37\x38\x73\x32\x32\x2e\x37\x35\x35\x35\x35\x36\
 | 
				
			||||||
 | 
					\x2d\x35\x2e\x36\x38\x38\x38\x38\x39\x20\x33\x34\x2e\x31\x33\x33\
 | 
				
			||||||
 | 
					\x33\x33\x33\x2d\x31\x37\x2e\x30\x36\x36\x36\x36\x37\x6c\x33\x31\
 | 
				
			||||||
 | 
					\x32\x2e\x38\x38\x38\x38\x38\x39\x2d\x33\x36\x34\x2e\x30\x38\x38\
 | 
				
			||||||
 | 
					\x38\x38\x39\x63\x32\x32\x2e\x37\x35\x35\x35\x35\x36\x2d\x32\x32\
 | 
				
			||||||
 | 
					\x2e\x37\x35\x35\x35\x35\x36\x20\x35\x36\x2e\x38\x38\x38\x38\x38\
 | 
				
			||||||
 | 
					\x39\x2d\x32\x38\x2e\x34\x34\x34\x34\x34\x34\x20\x37\x39\x2e\x36\
 | 
				
			||||||
 | 
					\x34\x34\x34\x34\x35\x2d\x35\x2e\x36\x38\x38\x38\x38\x39\x20\x32\
 | 
				
			||||||
 | 
					\x32\x2e\x37\x35\x35\x35\x35\x36\x20\x32\x32\x2e\x37\x35\x35\x35\
 | 
				
			||||||
 | 
					\x35\x36\x20\x32\x38\x2e\x34\x34\x34\x34\x34\x34\x20\x35\x36\x2e\
 | 
				
			||||||
 | 
					\x38\x38\x38\x38\x38\x39\x20\x35\x2e\x36\x38\x38\x38\x38\x38\x20\
 | 
				
			||||||
 | 
					\x37\x39\x2e\x36\x34\x34\x34\x34\x35\x4c\x36\x33\x37\x2e\x31\x35\
 | 
				
			||||||
 | 
					\x35\x35\x35\x36\x20\x37\x33\x39\x2e\x35\x35\x35\x35\x35\x36\x63\
 | 
				
			||||||
 | 
					\x2d\x32\x38\x2e\x34\x34\x34\x34\x34\x34\x20\x33\x39\x2e\x38\x32\
 | 
				
			||||||
 | 
					\x32\x32\x32\x32\x2d\x36\x38\x2e\x32\x36\x36\x36\x36\x37\x20\x35\
 | 
				
			||||||
 | 
					\x36\x2e\x38\x38\x38\x38\x38\x39\x2d\x31\x31\x39\x2e\x34\x36\x36\
 | 
				
			||||||
 | 
					\x36\x36\x37\x20\x35\x36\x2e\x38\x38\x38\x38\x38\x38\x20\x35\x2e\
 | 
				
			||||||
 | 
					\x36\x38\x38\x38\x38\x39\x20\x30\x20\x30\x20\x30\x20\x30\x20\x30\
 | 
				
			||||||
 | 
					\x7a\x22\x20\x70\x2d\x69\x64\x3d\x22\x32\x32\x39\x33\x22\x3e\x3c\
 | 
				
			||||||
 | 
					\x2f\x70\x61\x74\x68\x3e\x3c\x2f\x73\x76\x67\x3e\
 | 
				
			||||||
 | 
					\x00\x00\x07\x08\
 | 
				
			||||||
 | 
					\x89\
 | 
				
			||||||
 | 
					\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
 | 
				
			||||||
 | 
					\x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3\x3e\x61\xcb\
 | 
				
			||||||
 | 
					\x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x06\
 | 
				
			||||||
 | 
					\xc2\x49\x44\x41\x54\x78\x5e\xed\x9b\x7b\x68\x1c\x55\x14\xc6\xcf\
 | 
				
			||||||
 | 
					\xc9\x6c\x51\x50\x50\xa2\x28\xa8\x28\x28\x28\x28\x28\x28\x28\x28\
 | 
				
			||||||
 | 
					\xe8\xec\xce\xce\x2e\x0a\x0a\x2a\xe6\x61\xd3\x52\x69\xf1\x51\xd1\
 | 
				
			||||||
 | 
					\xfa\x2a\x4a\x8b\x62\x8b\x5a\xd1\x2a\x5a\x14\x2b\x6a\x8b\x5a\xa3\
 | 
				
			||||||
 | 
					\x35\x54\xc5\x77\x66\xee\x4d\x57\x22\x0d\xc5\x42\xb1\x50\x28\x15\
 | 
				
			||||||
 | 
					\x25\x50\x14\x4a\x45\xa9\x18\x34\x66\x33\x47\x46\x6e\x30\x94\x24\
 | 
				
			||||||
 | 
					\xdd\xb9\xfb\x9a\xd9\x73\xf6\xaf\x40\xee\x77\x77\xbe\xef\xfc\xf6\
 | 
				
			||||||
 | 
					\xbb\xb3\xbb\x09\x82\x3c\x58\x27\x80\xac\xdd\x8b\x79\x10\x00\x98\
 | 
				
			||||||
 | 
					\x43\x20\x00\x08\x00\xcc\x13\x60\x6e\x5f\x1a\x40\x00\x60\x9e\x00\
 | 
				
			||||||
 | 
					\x73\xfb\xd2\x00\x02\x00\xf3\x04\x98\xdb\x97\x06\x10\x00\x98\x27\
 | 
				
			||||||
 | 
					\xc0\xdc\xbe\x34\x80\x00\xc0\x3c\x01\xe6\xf6\xa5\x01\x04\x00\xe6\
 | 
				
			||||||
 | 
					\x09\x30\xb7\x2f\x0d\x20\x00\x30\x4f\x80\xb9\x7d\x69\x00\x01\x80\
 | 
				
			||||||
 | 
					\x79\x02\xcc\xed\x4b\x03\x08\x00\xcc\x13\x60\x6e\x5f\x1a\x40\x00\
 | 
				
			||||||
 | 
					\x60\x9e\x00\x73\xfb\xd2\x00\x02\x00\xf3\x04\x98\xdb\x97\x06\x10\
 | 
				
			||||||
 | 
					\x00\x98\x27\xc0\xdc\xbe\x34\x80\x00\xc0\x3c\x01\xe6\xf6\xa5\x01\
 | 
				
			||||||
 | 
					\x04\x00\xe6\x09\x30\xb7\x2f\x0d\x20\x00\x30\x4f\x80\xb9\x7d\x69\
 | 
				
			||||||
 | 
					\x00\x01\x80\x79\x02\xcc\xed\x4b\x03\x08\x00\xcc\x13\x60\x6e\x5f\
 | 
				
			||||||
 | 
					\x1a\x40\x00\x60\x9e\x00\x73\xfb\xd2\x00\x02\x00\xf3\x04\x98\xdb\
 | 
				
			||||||
 | 
					\x97\x06\x10\x00\x98\x27\xc0\xdc\x7e\xe6\x1a\xc0\xf7\xfd\xf5\xd5\
 | 
				
			||||||
 | 
					\x6a\x75\xc7\xce\x9d\x3b\xbf\x4f\xfb\xec\x5c\xd7\xcd\xe5\x72\xb9\
 | 
				
			||||||
 | 
					\x41\xa5\x54\x4f\x5a\xaf\x35\x53\x00\x78\x9e\xb7\x11\x11\x1f\x06\
 | 
				
			||||||
 | 
					\x80\x83\x44\x34\xa0\xb5\xfe\x2e\xad\xc1\xba\xae\x7b\xa2\xe3\x38\
 | 
				
			||||||
 | 
					\x83\x88\x78\x33\x00\x0c\xa5\x15\x82\xcc\x00\x50\x2c\x16\x5f\x05\
 | 
				
			||||||
 | 
					\x80\x95\x33\x03\x27\xa2\x71\xc7\x71\x16\x07\x41\xb0\x2b\x6d\x10\
 | 
				
			||||||
 | 
					\xb8\xae\x7b\xb2\x19\xfe\x8d\xb3\xae\x2d\x95\x10\x64\x02\x00\xcf\
 | 
				
			||||||
 | 
					\xf3\xb6\x22\xe2\xb2\x39\x06\xfd\x33\x00\x0c\x28\xa5\x2a\x69\x81\
 | 
				
			||||||
 | 
					\xc0\x75\xdd\x53\xcd\xf0\xaf\x9f\xe3\x9a\x52\x07\x41\xaa\x01\x88\
 | 
				
			||||||
 | 
					\x6b\x34\x97\xcb\x6d\x03\x80\x5b\x17\x18\xf0\x11\x44\x1c\x08\xc3\
 | 
				
			||||||
 | 
					\x30\x68\x37\x04\xae\xeb\x9e\xbe\x68\xd1\xa2\x41\x22\xf2\x17\xb8\
 | 
				
			||||||
 | 
					\x96\x54\x41\x90\x5a\x00\xca\xe5\x72\xf7\xf4\xf4\xf4\x20\x00\x94\
 | 
				
			||||||
 | 
					\x6b\x18\xec\x51\x73\x4f\xf0\x79\x0d\x6b\x9b\xb2\xc4\xf3\xbc\x33\
 | 
				
			||||||
 | 
					\x11\xf1\x7d\x00\xc8\xd7\xf0\x04\xa9\x81\x20\x95\x00\xb8\xae\x7b\
 | 
				
			||||||
 | 
					\x8e\xe3\x38\xdb\x11\xf1\xea\x1a\xc2\x9c\x59\xf2\x97\x39\x0e\x3e\
 | 
				
			||||||
 | 
					\x4a\xa0\x69\xc8\xd2\x42\xa1\x70\x76\x5c\xfb\x44\x74\x6d\x82\x0d\
 | 
				
			||||||
 | 
					\x53\x01\x41\xea\x00\xc8\xe7\xf3\x17\x39\x8e\xf3\x21\x00\x5c\x9a\
 | 
				
			||||||
 | 
					\x20\xcc\x99\xa5\xd3\x44\xb4\x58\x6b\xbd\xdd\x42\x6b\x25\x29\x14\
 | 
				
			||||||
 | 
					\x0a\xe7\x99\xe1\x27\x81\x75\xe6\xb9\xda\x0e\x41\xea\x00\x88\x93\
 | 
				
			||||||
 | 
					\xf1\x7d\xff\x09\x22\x5a\x67\x35\x11\x00\x40\xc4\xa5\x61\x18\xbe\
 | 
				
			||||||
 | 
					\x6b\xab\xaf\x55\x57\x28\x14\x2e\x30\xc3\xbf\xb2\x56\xcd\xac\x75\
 | 
				
			||||||
 | 
					\x11\x00\xf4\x28\xa5\x76\x58\x68\x1b\x26\x49\x25\x00\xb1\x3b\xcf\
 | 
				
			||||||
 | 
					\xf3\x1e\x47\xc4\xf5\xb6\x4e\x89\x68\x85\xd6\xfa\x2d\x5b\xfd\xf1\
 | 
				
			||||||
 | 
					\x74\xa6\xa9\xe2\x7b\x94\xcb\x8f\xb7\x76\x8e\xdf\x4f\x11\x51\x8f\
 | 
				
			||||||
 | 
					\xd6\xfa\x13\x0b\x6d\x43\x25\xa9\x05\x20\x76\x59\x2c\x16\xd7\x02\
 | 
				
			||||||
 | 
					\xc0\x53\x75\x38\x5e\xa9\x94\x7a\xad\x0e\xfd\x9c\xd2\x7c\x3e\x7f\
 | 
				
			||||||
 | 
					\x49\xfc\xca\xb7\x3c\xa6\xfe\xee\xea\xea\xea\x09\x82\xe0\xb3\x46\
 | 
				
			||||||
 | 
					\x5f\x97\xcd\x7e\xa9\x06\xc0\x1c\x07\x6b\x88\xe8\x69\x1b\x73\xb1\
 | 
				
			||||||
 | 
					\x86\x88\x1e\xd0\x5a\xbf\x6c\xab\x3f\x56\x57\x2e\x97\x2f\x33\xef\
 | 
				
			||||||
 | 
					\x4e\x2e\xb6\xd8\x73\x02\x11\x7b\xc2\x30\xfc\xd2\x42\xdb\x14\x49\
 | 
				
			||||||
 | 
					\xea\x01\x30\x4d\xf0\x18\x00\x6c\xa8\x23\x81\xd5\x4a\xa9\x8d\x75\
 | 
				
			||||||
 | 
					\xe8\xff\x93\x96\x4a\xa5\x2b\xa2\x28\x8a\x5f\xf9\x17\x5a\xec\xf5\
 | 
				
			||||||
 | 
					\x07\x11\xf5\x6a\xad\xbf\xb6\xd0\x36\x4d\x92\x09\x00\x4c\x13\x3c\
 | 
				
			||||||
 | 
					\x4a\x44\xcf\xda\x26\x81\x88\x6b\xc3\x30\x7c\xc6\x56\x5f\x2a\x95\
 | 
				
			||||||
 | 
					\xae\x32\xc3\x3f\x3f\xe9\x1e\x88\xf8\x7b\x14\x45\xf1\xf0\xc3\xa4\
 | 
				
			||||||
 | 
					\xda\x66\xaf\xcf\x0c\x00\xa6\x09\x56\x03\xc0\x73\x75\x84\xb2\x4e\
 | 
				
			||||||
 | 
					\x29\xf5\x64\x52\xbd\xef\xfb\xd7\x10\x51\xfc\xca\x3f\x37\xa9\x16\
 | 
				
			||||||
 | 
					\x00\x7e\xed\xea\xea\xea\x0d\x82\x60\xc4\x42\xdb\x74\x49\xa6\x00\
 | 
				
			||||||
 | 
					\x30\x10\x3c\x02\x00\xcf\xdb\x26\x83\x88\x1b\xc2\x30\x5c\x53\xab\
 | 
				
			||||||
 | 
					\xde\xf7\xfd\xeb\xcc\xf0\xcf\xaa\x55\x33\x6b\xdd\x61\x44\xec\x0d\
 | 
				
			||||||
 | 
					\xc3\xf0\x1b\x0b\x6d\x4b\x24\x99\x03\xc0\x1c\x07\x0f\x11\xd1\x0b\
 | 
				
			||||||
 | 
					\xb6\x09\xc5\x5a\xad\x75\x0c\xd2\x82\x8f\x52\xa9\x54\x88\xa2\x28\
 | 
				
			||||||
 | 
					\xfe\x78\xf7\x8c\xe3\xad\x9d\xe3\xf7\xbf\x00\x40\xaf\x52\xea\x5b\
 | 
				
			||||||
 | 
					\x0b\x6d\xcb\x24\x99\x04\xc0\x34\xc1\x83\x00\xf0\xa2\x6d\x52\x88\
 | 
				
			||||||
 | 
					\xb8\x29\x0c\xc3\x55\xf3\xe9\x7d\xdf\x2f\x99\x57\xfe\x69\x16\xcf\
 | 
				
			||||||
 | 
					\x71\xc8\xdc\xf0\x8d\x59\x68\x5b\x2a\xc9\x2c\x00\xa6\x09\x56\x11\
 | 
				
			||||||
 | 
					\xd1\x4b\x75\x24\xb6\x59\x29\x75\xcf\xb1\x7a\xdf\xf7\x6f\x30\xc3\
 | 
				
			||||||
 | 
					\x3f\x25\xe9\xde\x88\x38\x8e\x88\x7d\x41\x10\xec\x4e\xaa\x6d\xc7\
 | 
				
			||||||
 | 
					\xfa\x4c\x03\x10\x07\xe6\x79\xde\xfd\x88\x58\xcf\xfb\xfc\x2d\x4a\
 | 
				
			||||||
 | 
					\xa9\xe5\x33\xe1\xfb\xbe\x7f\x93\x19\xfe\x49\x16\x03\xf9\xc9\x9c\
 | 
				
			||||||
 | 
					\xf9\x7b\x2c\xb4\x6d\x91\x64\x1e\x00\x73\x1c\xdc\x07\x00\x9b\x6c\
 | 
				
			||||||
 | 
					\x13\x24\xa2\x6d\x5a\xeb\x25\xc5\x62\xf1\x16\x00\x88\xef\xf6\x4f\
 | 
				
			||||||
 | 
					\xb0\xd8\xeb\x07\x73\xe6\xef\xb5\xd0\xb6\x4d\xd2\x11\x00\x98\xe3\
 | 
				
			||||||
 | 
					\xe0\x5e\x22\x7a\xa5\x8e\x24\xe3\x6f\x20\xe3\x3f\x3c\x71\x2c\xf6\
 | 
				
			||||||
 | 
					\x38\x60\xce\xfc\x7d\x16\xda\xb6\x4a\x3a\x06\x00\x73\x1c\xac\x44\
 | 
				
			||||||
 | 
					\xc4\xf8\x6f\x07\x5b\xf6\x20\xa2\xfd\xb9\x5c\xae\x77\x78\x78\x78\
 | 
				
			||||||
 | 
					\x7f\xcb\x9e\xb4\x81\x4f\xd4\x51\x00\x98\x26\xb8\x9b\x88\x1a\xfe\
 | 
				
			||||||
 | 
					\x05\xd0\x3c\x99\xef\x33\x1f\xf2\x1c\x68\xe0\x4c\x5a\xba\x55\xc7\
 | 
				
			||||||
 | 
					\x01\x60\x9a\xe0\x2e\x44\xdc\xdc\xe4\x24\xf7\x12\x51\x9f\xd6\xfa\
 | 
				
			||||||
 | 
					\x60\x93\x9f\xa7\xa9\xdb\x77\x24\x00\xe6\xc6\xf0\x4e\x00\x78\xbd\
 | 
				
			||||||
 | 
					\x49\xe9\xed\x89\xa2\xa8\x6f\x64\x64\xe4\xc7\x26\xed\xdf\xb2\x6d\
 | 
				
			||||||
 | 
					\x3b\x16\x00\x73\x1c\xac\x20\xa2\x37\x1a\x9c\xe6\xee\x6a\xb5\xda\
 | 
				
			||||||
 | 
					\x57\xa9\x54\xc6\x1b\xbc\x6f\x5b\xb6\xeb\x68\x00\xcc\x71\xb0\x1c\
 | 
				
			||||||
 | 
					\x11\xdf\x6c\x44\xba\x88\xb8\xcb\x7c\xc8\x73\xa8\x11\xfb\xa5\x61\
 | 
				
			||||||
 | 
					\x8f\x8e\x07\xc0\x1c\x07\x77\x00\xc0\x96\x3a\x03\x1f\x8d\x87\x1f\
 | 
				
			||||||
 | 
					\x86\x61\xfc\x19\x7f\xc7\x3c\x58\x00\x60\x8e\x83\x65\x44\xb4\xd5\
 | 
				
			||||||
 | 
					\x72\x72\x15\x73\xc3\x77\xd8\x52\x9f\x5a\x19\x1b\x00\x4c\x13\x2c\
 | 
				
			||||||
 | 
					\x05\x80\xb7\x13\x4e\x43\x4f\x4e\x4e\xf6\x8f\x8e\x8e\x1e\x49\xa8\
 | 
				
			||||||
 | 
					\xcb\xc4\x72\x56\x00\x98\x26\x58\x42\x44\xef\xd4\x38\x9d\xc0\x71\
 | 
				
			||||||
 | 
					\x9c\xfe\xe1\xe1\xe1\xdf\x6a\x5c\x9f\xb9\x65\xec\x00\x30\x37\x86\
 | 
				
			||||||
 | 
					\x03\x88\xb8\xe0\xff\x0d\x20\xe2\x57\x44\xd4\xaf\x94\x3a\x9a\xb9\
 | 
				
			||||||
 | 
					\xa9\x26\xb8\x60\x96\x00\x98\xe3\xe0\x76\x00\x78\x6f\x9e\xac\xbe\
 | 
				
			||||||
 | 
					\x30\x6f\xf5\xfe\x4c\x90\x65\x26\x97\xb2\x05\xc0\x1c\x07\xfd\xe6\
 | 
				
			||||||
 | 
					\xab\xdf\xd9\xc3\xfb\x74\x62\x62\xa2\x6f\x6c\x6c\x2c\xfe\x5f\xc3\
 | 
				
			||||||
 | 
					\x8e\x7f\xb0\x06\xc0\x1c\x07\xbd\x88\xf8\x41\xfc\x33\x11\x7d\xdc\
 | 
				
			||||||
 | 
					\xdd\xdd\xdd\x37\x34\x34\xf4\x4f\xc7\x4f\xde\x18\x64\x0f\x80\x39\
 | 
				
			||||||
 | 
					\x0e\x7a\x10\xf1\xb6\xa9\xa9\xa9\xfe\x4a\xa5\x52\xe5\x32\xfc\xd8\
 | 
				
			||||||
 | 
					\xa7\x00\xf0\xff\xb4\xe3\x2c\x88\xd3\xf0\x05\x00\x6e\xd3\x9e\xc3\
 | 
				
			||||||
 | 
					\xaf\x34\x00\x73\x08\x04\x00\x01\x80\x79\x02\xcc\xed\x4b\x03\x08\
 | 
				
			||||||
 | 
					\x00\xcc\x13\x60\x6e\x5f\x1a\x40\x00\x60\x9e\x00\x73\xfb\xd2\x00\
 | 
				
			||||||
 | 
					\x02\x00\xf3\x04\x98\xdb\x97\x06\x10\x00\x98\x27\xc0\xdc\xbe\x34\
 | 
				
			||||||
 | 
					\x80\x00\xc0\x3c\x01\xe6\xf6\xa5\x01\x04\x00\xe6\x09\x30\xb7\x2f\
 | 
				
			||||||
 | 
					\x0d\x20\x00\x30\x4f\x80\xb9\x7d\x69\x00\x01\x80\x79\x02\xcc\xed\
 | 
				
			||||||
 | 
					\x4b\x03\x08\x00\xcc\x13\x60\x6e\x5f\x1a\x40\x00\x60\x9e\x00\x73\
 | 
				
			||||||
 | 
					\xfb\xd2\x00\x02\x00\xf3\x04\x98\xdb\x97\x06\x10\x00\x98\x27\xc0\
 | 
				
			||||||
 | 
					\xdc\xbe\x34\x80\x00\xc0\x3c\x01\xe6\xf6\xa5\x01\x04\x00\xe6\x09\
 | 
				
			||||||
 | 
					\x30\xb7\x2f\x0d\x20\x00\x30\x4f\x80\xb9\x7d\x69\x00\x01\x80\x79\
 | 
				
			||||||
 | 
					\x02\xcc\xed\x4b\x03\x08\x00\xcc\x13\x60\x6e\x5f\x1a\x40\x00\x60\
 | 
				
			||||||
 | 
					\x9e\x00\x73\xfb\xd2\x00\x02\x00\xf3\x04\x98\xdb\x97\x06\x10\x00\
 | 
				
			||||||
 | 
					\x98\x27\xc0\xdc\xbe\x34\x80\x00\xc0\x3c\x01\xe6\xf6\xa5\x01\x98\
 | 
				
			||||||
 | 
					\x03\xf0\x2f\x1a\xf0\xdc\x90\x9e\x40\x3c\x9b\x00\x00\x00\x00\x49\
 | 
				
			||||||
 | 
					\x45\x4e\x44\xae\x42\x60\x82\
 | 
				
			||||||
"
 | 
					"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
qt_resource_name = b"\
 | 
					qt_resource_name = b"\
 | 
				
			||||||
@ -194,22 +391,32 @@ qt_resource_name = b"\
 | 
				
			|||||||
\x00\x70\
 | 
					\x00\x70\
 | 
				
			||||||
\x00\x69\x00\x63\
 | 
					\x00\x69\x00\x63\
 | 
				
			||||||
\x00\x08\
 | 
					\x00\x08\
 | 
				
			||||||
\x04\x1e\x72\x67\
 | 
					 | 
				
			||||||
\x7b\xad\
 | 
					 | 
				
			||||||
\x59\x34\x00\x20\x4e\x0b\x00\x2e\x00\x73\x00\x76\x00\x67\
 | 
					 | 
				
			||||||
\x00\x08\
 | 
					 | 
				
			||||||
\x09\xe6\x72\x67\
 | 
					\x09\xe6\x72\x67\
 | 
				
			||||||
\x7b\xad\
 | 
					\x7b\xad\
 | 
				
			||||||
\x59\x34\x00\x20\x53\xf3\x00\x2e\x00\x73\x00\x76\x00\x67\
 | 
					\x59\x34\x00\x20\x53\xf3\x00\x2e\x00\x73\x00\x76\x00\x67\
 | 
				
			||||||
 | 
					\x00\x0b\
 | 
				
			||||||
 | 
					\x0f\x8a\xc9\x87\
 | 
				
			||||||
 | 
					\x7b\xad\
 | 
				
			||||||
 | 
					\x59\x34\x00\x5f\x52\x17\x88\x68\x54\x11\x53\xf3\x00\x2e\x00\x70\x00\x6e\x00\x67\
 | 
				
			||||||
 | 
					\x00\x08\
 | 
				
			||||||
 | 
					\x04\x1e\x72\x67\
 | 
				
			||||||
 | 
					\x7b\xad\
 | 
				
			||||||
 | 
					\x59\x34\x00\x20\x4e\x0b\x00\x2e\x00\x73\x00\x76\x00\x67\
 | 
				
			||||||
 | 
					\x00\x0b\
 | 
				
			||||||
 | 
					\x0e\xdf\xc8\xa7\
 | 
				
			||||||
 | 
					\x7b\xad\
 | 
				
			||||||
 | 
					\x59\x34\x00\x5f\x52\x17\x88\x68\x5c\x55\x5f\x00\x00\x2e\x00\x70\x00\x6e\x00\x67\
 | 
				
			||||||
"
 | 
					"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
qt_resource_struct_v1 = b"\
 | 
					qt_resource_struct_v1 = b"\
 | 
				
			||||||
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
 | 
					\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
 | 
				
			||||||
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\
 | 
					\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\
 | 
				
			||||||
\x00\x00\x00\x14\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\
 | 
					\x00\x00\x00\x14\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\
 | 
				
			||||||
\x00\x00\x00\x26\x00\x02\x00\x00\x00\x02\x00\x00\x00\x04\
 | 
					\x00\x00\x00\x26\x00\x02\x00\x00\x00\x04\x00\x00\x00\x04\
 | 
				
			||||||
 | 
					\x00\x00\x00\x64\x00\x00\x00\x00\x00\x01\x00\x00\x0a\x32\
 | 
				
			||||||
\x00\x00\x00\x32\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
 | 
					\x00\x00\x00\x32\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
 | 
				
			||||||
\x00\x00\x00\x48\x00\x00\x00\x00\x00\x01\x00\x00\x05\x11\
 | 
					\x00\x00\x00\x7a\x00\x00\x00\x00\x00\x01\x00\x00\x0f\x43\
 | 
				
			||||||
 | 
					\x00\x00\x00\x48\x00\x00\x00\x00\x00\x01\x00\x00\x05\x36\
 | 
				
			||||||
"
 | 
					"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
qt_resource_struct_v2 = b"\
 | 
					qt_resource_struct_v2 = b"\
 | 
				
			||||||
@ -219,12 +426,16 @@ qt_resource_struct_v2 = b"\
 | 
				
			|||||||
\x00\x00\x00\x00\x00\x00\x00\x00\
 | 
					\x00\x00\x00\x00\x00\x00\x00\x00\
 | 
				
			||||||
\x00\x00\x00\x14\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\
 | 
					\x00\x00\x00\x14\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\
 | 
				
			||||||
\x00\x00\x00\x00\x00\x00\x00\x00\
 | 
					\x00\x00\x00\x00\x00\x00\x00\x00\
 | 
				
			||||||
\x00\x00\x00\x26\x00\x02\x00\x00\x00\x02\x00\x00\x00\x04\
 | 
					\x00\x00\x00\x26\x00\x02\x00\x00\x00\x04\x00\x00\x00\x04\
 | 
				
			||||||
\x00\x00\x00\x00\x00\x00\x00\x00\
 | 
					\x00\x00\x00\x00\x00\x00\x00\x00\
 | 
				
			||||||
\x00\x00\x00\x32\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
 | 
					\x00\x00\x00\x64\x00\x00\x00\x00\x00\x01\x00\x00\x0a\x32\
 | 
				
			||||||
\x00\x00\x01\x81\x5b\xf7\x7e\xef\
 | 
					\x00\x00\x01\x81\x5b\xf7\x7e\xef\
 | 
				
			||||||
\x00\x00\x00\x48\x00\x00\x00\x00\x00\x01\x00\x00\x05\x11\
 | 
					\x00\x00\x00\x32\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
 | 
				
			||||||
\x00\x00\x01\x81\x5b\xf7\x72\x92\
 | 
					\x00\x00\x01\x81\x5b\xf7\x72\x92\
 | 
				
			||||||
 | 
					\x00\x00\x00\x7a\x00\x00\x00\x00\x00\x01\x00\x00\x0f\x43\
 | 
				
			||||||
 | 
					\x00\x00\x01\x81\x5b\xfc\x68\x05\
 | 
				
			||||||
 | 
					\x00\x00\x00\x48\x00\x00\x00\x00\x00\x01\x00\x00\x05\x36\
 | 
				
			||||||
 | 
					\x00\x00\x01\x81\x5b\xfc\x85\xb4\
 | 
				
			||||||
"
 | 
					"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
qt_version = [int(v) for v in QtCore.qVersion().split('.')]
 | 
					qt_version = [int(v) for v in QtCore.qVersion().split('.')]
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										
											BIN
										
									
								
								plugins/In_one/pic/箭头_列表向右.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								plugins/In_one/pic/箭头_列表向右.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 1.2 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								plugins/In_one/pic/箭头_列表展开.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								plugins/In_one/pic/箭头_列表展开.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 1.8 KiB  | 
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user