Skip to content
Browse files

git-svn-id: https://k9copy.svn.sourceforge.net/svnroot/k9copy/trunk@89

…250c61c0-cc0d-0410-af45-d4f8fccfe43b
  • Loading branch information...
1 parent c9c069f commit bf80c1ca1f5719ba7a8c5f712e3f702e63ad47c8 jnmchlptt committed Jun 17, 2006
View
12 README
@@ -1,2 +1,12 @@
+install from sources:
-if problems with ./configure try make -f Makefile.cvs before
+make -f Makefile.cvs
+./configure --prefix=/usr
+make
+make install (as root)
+
+
+k9copy can now copy dvd with bad sectors.
+for a faster copy from a dvd with bad sectors : reduce the readahead for the drive :
+
+as root: hdparm -a8 /dev/dvd
View
82 libk9copy/k9dvdbackup.cpp
@@ -401,6 +401,7 @@ uint32_t k9DVDBackup::copyMenu2(int _vts) {
k9Ifo kifo(&m_dvdread);
kifo.openIFO( _vts);
ifo_handle_t *hifo =kifo.getIFO();
+ m_ifo=hifo;
uint32_t msize=0;
if (_vts==0)
msize=hifo->vmgi_mat->vmg_last_sector -1 - 2* hifo->vmgi_mat->vmgi_last_sector;
@@ -659,6 +660,45 @@ void k9DVDBackup::playCell (int vts_num, k9Cell *_cell) {
dvdfile->close();
}
+void k9DVDBackup::setDummyNavPack(uchar *buf,uint32_t _sector)
+{
+ int8_t *ptr = (int8_t*)buf;
+ static uint8_t nav_pack1 [] =
+ {
+ /* pack header: SCR=0, mux rate=10080000bps, stuffing length=0 */
+ 0, 0, 1, 0xba, 0x44, 0x00, 0x04, 0x00, 0x04, 0x01, 0x01, 0x89, 0xc3, 0xf8,
+ /* system header */
+ 0, 0, 1, 0xbb, 0x00, 0x12,
+ /* contents of system header filled in at run time (18 bytes) */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* PES header for first private stream 2 packet */
+ 0, 0, 1, 0xbf, 0x03, 0xd4
+ };
+ static uint8_t nav_pack2 [] =
+ {
+ /* PES header for second private stream 2 packet */
+ 0, 0, 1, 0xbf, 0x03, 0xfa
+ };
+
+ memcpy (ptr, nav_pack1, sizeof (nav_pack1));
+ ptr += sizeof (nav_pack1);
+ memset (ptr, 0, DVD_VIDEO_LB_LEN/2 - sizeof (nav_pack1));
+ ptr = (int8_t*)buf + DVD_VIDEO_LB_LEN/2;
+ memcpy (ptr, nav_pack2, sizeof (nav_pack2));
+ ptr += sizeof (nav_pack2);
+ memset (ptr, 0, DVD_VIDEO_LB_LEN/2 - sizeof (nav_pack2));
+
+ dsi_t dsiPack;
+ pci_t pciPack;
+ navRead_DSI (&dsiPack, buf + DSI_START_BYTE);
+ k9Ifo::navRead_PCI (&pciPack, buf+0x2d);
+ dsiPack.dsi_gi.nv_pck_lbn=_sector;
+ dsiPack.dsi_gi.vobu_ea = 0;
+
+ navRead_DSI((dsi_t*)(buf + DSI_START_BYTE),(uchar*)&dsiPack);
+ pciPack.pci_gi.nv_pck_lbn =dsiPack.dsi_gi.nv_pck_lbn;
+ k9Ifo::navRead_PCI((pci_t*)(buf+0x2d),(uchar*)&pciPack);
+}
void k9DVDBackup::setDummyPack(uchar *_buffer) {
@@ -677,16 +717,46 @@ void k9DVDBackup::setDummyPack(uchar *_buffer) {
}
+
+uint32_t k9DVDBackup::findNextVobu(uint32_t _sector) {
+ k9Ifo ifo(&m_dvdread);
+ ifo.openIFO(currVTS);
+ m_ifo=ifo.getIFO();
+ vobu_admap_t * vobu_admap;
+ if (m_copyMenu)
+ vobu_admap = m_ifo->menu_vobu_admap;
+ else
+ vobu_admap = m_ifo->vts_vobu_admap;
+ uint32_t length = vobu_admap->last_byte + 1 - VOBU_ADMAP_SIZE;
+ for(uint32_t i = 0; i < length/sizeof(uint32_t); i++) {
+ if (vobu_admap->vobu_start_sectors[i]== _sector) {
+ uint32_t nextVobu=vobu_admap->vobu_start_sectors[i+1];
+ ifo.closeIFO();
+ return nextVobu;
+ }
+ }
+ ifo.closeIFO();
+ return 0;
+
+}
+
+
+
uint32_t k9DVDBackup::copyVobu(k9DVDFile *_fileHandle,uint32_t _startSector,k9Vobu * _vobu) {
dsi_t dsi_pack;
k9Vobu * currVobu;
- uint32_t nsectors, len;
+ uint32_t nsectors, len,nextVobu=0;
uchar *buf;
uint32_t sector=_startSector;
/* read nav pack */
buf=(uchar*) malloc(DVD_VIDEO_LB_LEN);
len = _fileHandle->readBlocks ( sector, 1, buf);
+ if (len==-1) {
+ setDummyNavPack(buf,sector);
+ nextVobu=findNextVobu(sector);
+ qDebug (QString("VOBU : %1 Read Error !!!! ==> %2").arg(sector).arg(nextVobu));
+ }
currVobu=_vobu;
mutex.lock();
@@ -712,6 +782,7 @@ uint32_t k9DVDBackup::copyVobu(k9DVDFile *_fileHandle,uint32_t _startSector,k9V
buf=(uchar*) realloc(buf,nsectors*DVD_VIDEO_LB_LEN);
uint32_t end=nsectors;
+ if (nextVobu !=0) end=nextVobu-1;
/* read VOBU */
for (uint32_t i=0;i< nsectors;i++) {
@@ -723,6 +794,7 @@ uint32_t k9DVDBackup::copyVobu(k9DVDFile *_fileHandle,uint32_t _startSector,k9V
break;
}
}
+
/* write VOBU */
for (uint32_t i=0;i<nsectors ;i++) {
vamps->addData(buf + (i*DVD_VIDEO_LB_LEN), DVD_VIDEO_LB_LEN);
@@ -891,7 +963,7 @@ void k9DVDBackup::updateMainIfo() {
updatePgci_ut(hifo);
update4Menu(hifo);
- //mise à jour des startSectors
+ //mise jour des startSectors
k9TitleSet *TSp=NULL;
titleSets.sort();
for (uint iTS=0;iTS < titleSets.count();iTS++) {
@@ -977,7 +1049,7 @@ void k9DVDBackup::updatePgci_ut(ifo_handle_t *_hifo) {
}
void k9DVDBackup::update4Menu(ifo_handle_t *_hifo) {
- // Mise à jour vtsm_c_adt pour le menu
+ // Mise jour vtsm_c_adt pour le menu
m_copyMenu=true; //indispensable pour remapvobu
c_adt_t *c_adt = _hifo->menu_c_adt;
uint32_t length;
@@ -1407,11 +1479,11 @@ void k9DVDBackup::updateVob(k9CellList *cellLst) {
pciPack.pci_gi.e_eltm.hour = pciPack.pci_gi.e_eltm.minute =pciPack.pci_gi.e_eltm.second=0;
dsiPack.dsi_gi.c_eltm.hour=dsiPack.dsi_gi.c_eltm.minute=dsiPack.dsi_gi.c_eltm.second=0;
}
- // mise en place des donnees modifiï¿?s dans le buffer de sortie
+ // mise en place des donnees modifi�s dans le buffer de sortie
navRead_DSI((dsi_t*)(buffer + DSI_START_BYTE),(uchar*)&dsiPack);
pciPack.pci_gi.nv_pck_lbn =dsiPack.dsi_gi.nv_pck_lbn;
k9Ifo::navRead_PCI((pci_t*)(buffer+0x2d),(uchar*)&pciPack);
- //mise ï¿?jour du fichier
+ //mise jour du fichier
fseek(file,pos,SEEK_SET);
fwrite(buffer,DVD_VIDEO_LB_LEN,1,file);
}
View
3 libk9copy/k9dvdbackup.h
@@ -91,6 +91,7 @@ public slots:
long currVTS;
k9TitleSet *currTS;
int currVOB;
+ ifo_handle_t *m_ifo;
k9Cell *currCell,*cellOut;//,*currCopyCell;
k9CellCopyList *m_cellCopyList;
uint32_t m_position,m_vmgSize;
@@ -100,6 +101,7 @@ public slots:
uint64_t argSize;
void prepareVTS(int VTS);
void playCell (int vts_num, k9Cell *_cell);
+ uint32_t findNextVobu(uint32_t _sector);
uint32_t copyVobu(k9DVDFile *_fileHandle,uint32_t _startSector,k9Vobu *_vobu);
void copyCell(int VTS, k9Cell *_cell,bool _empty);
// void copyAngleBlock(k9CellCopyList *_list,uint _num);
@@ -111,6 +113,7 @@ public slots:
void updatePgci_ut(ifo_handle_t *_hifo);
void update4Menu(ifo_handle_t *_hifo);
void setDummyPack(uchar *_buffer);
+ void setDummyNavPack(uchar *_buffer,uint32_t _sector);
uint32_t copyMenu (int _vts);
uint32_t copyMenu2(int _vts);
k9CellList vmgCells;
View
9 libk9copy/k9dvdread.cpp
@@ -11,6 +11,7 @@
//
#include "k9dvdread.h"
+
k9DVDRead::k9DVDRead(){
m_dvd=NULL;
files.setAutoDelete(true);
@@ -136,9 +137,13 @@ int k9DVDFile::readBytes(uchar *_buffer,uint32_t _size)
}
int k9DVDFile::readBlocks(uint32_t _sector,uint32_t _size,uchar*_buffer) {
- if (m_file !=NULL)
- return DVDReadBlocks(m_file,_sector,_size,_buffer);
+ if (m_file !=NULL) {
+ return DVDReadBlocks(m_file,_sector,_size,_buffer);
+ }
else
return -1;
}
+
+
+
View
2 libk9copy/k9dvdread.h
@@ -15,6 +15,7 @@
/**
@author Jean-Michel PETIT <k9copy@free.fr>
*/
+
class k9DVDRead;
class k9DVDFile {
@@ -58,4 +59,5 @@ friend class k9DVDTitle;
};
+
#endif
View
13 libk9copy/k9mp4enc.cpp
@@ -48,12 +48,13 @@ void k9MP4Enc::execute(k9DVDTitle *_title) {
bool error=false;
m_percent=0;
m_remain="--:--:--";
+ m_totalSize=(_title->getChapter(_title->getchapterCount()-1)->getendSector() - _title->getChapter(0)->getstartSector());
for (uint m_part =1 ; (m_part <=m_parts) && !error ;m_part++) {
uint32_t sec1=_title->getChapter(0)->getstartSector();
uint32_t sec2=_title->getChapter(_title->getchapterCount()-1)->getendSector();
- uint32_t nbSectors= (_title->getChapter(_title->getchapterCount()-1)->getendSector() - _title->getChapter(0)->getstartSector()) / m_parts ;
+ uint32_t nbSectors= m_totalSize / m_parts ;
uint32_t startSector= nbSectors*(m_part-1);
uint32_t endSector= startSector+nbSectors;
@@ -84,9 +85,15 @@ void k9MP4Enc::execute(k9DVDTitle *_title) {
m_progress->setsize(m_size +i18n("mb") +" X " +QString::number(m_parts));
m_process=new KProcess();
m_process->setUseShell(true);
- *m_process << "k9copy" << "--play" << "--startsector" << QString::number(startSector) << "--endsector" << QString::number(endSector) ;
+ *m_process << "k9copy" << "--play" << "--endsector" << QString::number(endSector) ;
+ *m_process << "--inject" << "/tmp/kde-jmp/inject";
*m_process << "--input" << "'"+m_device+"'";
*m_process << "--dvdtitle" << QString::number(_title->getnumTitle());
+ if (m_part==1)
+ *m_process << "--initstatus";
+ else
+ *m_process << "--continue";
+
for (uint i=0;i<_title->getaudioStreamCount();i++) {
if (_title->getaudioStream(i)->getselected()) {
@@ -259,7 +266,7 @@ void k9MP4Enc::getStderr(KProcess *proc, char *buffer, int buflen) {
QString tmp=m_stderr.mid(pos);
uint32_t totalBytes,totalSize;
sscanf(tmp.latin1(),"INFOPOS: %d %d",&totalBytes,&totalSize);
- m_percent=(float)totalBytes / (float)totalSize;
+ m_percent=(float)totalBytes / (float)m_totalSize;
QTime time2(0,0);
View
1 libk9copy/k9mp4enc.h
@@ -47,6 +47,7 @@ class k9MP4Enc : public QObject {
float m_percent;
QTimer *timer;
QString m_remain;
+ uint32_t m_totalSize;
Codec m_codec;
QStringList m_lstVideo,m_lstAudio,m_lstCodecs;
View
89 src/MainDlg.ui.h
@@ -1,89 +0,0 @@
-/****************************************************************************
-** ui.h extension file, included from the uic-generated form implementation.
-**
-** If you want to add, delete, or rename functions or slots, use
-** Qt Designer to update this file, preserving your code.
-**
-** You should not define a constructor or destructor in this file.
-** Instead, write your code in functions called init() and destroy().
-** These will automatically be called by the form's constructor and
-** destructor.
-*****************************************************************************/
-
-
-void MainDlg::bOpenCLick()
-{
-
-}
-
-
-void MainDlg::bCopyClick()
-{
-
-}
-
-
-void MainDlg::bPreviewClick()
-{
-
-}
-
-
-void MainDlg::bSaveClick()
-{
-
-}
-
-
-void MainDlg::bPreviewTitleClick()
-{
-
-}
-
-
-
-void MainDlg::bDevicesClick()
-{
-
-}
-
-
-
-
-
-
-
-void MainDlg::cbStartActivated( int )
-{
-
-}
-
-
-void MainDlg::cbTitleActivated( int )
-{
-
-}
-
-
-void MainDlg::listView1CurrentChanged( QListViewItem * )
-{
-
-}
-
-
-void MainDlg::cbAudioActivated( int )
-{
-
-}
-
-
-void MainDlg::ckMenuClick()
-{
-
-}
-
-
-void MainDlg::helpAboutActionActivated()
-{
-
-}
View
2 src/Makefile.in
@@ -968,7 +968,7 @@ clean-metasources:
-rm -f menupreview.moc k9main.moc.cpp kcddrive.moc.cpp k9settings.moc k9copy.moc.cpp kviewmpeg2.moc.cpp k9prefdvd.moc k9prefmpeg4.moc k9prefmencoder.moc
#>+ 2
-KDE_DIST=viewmpeg2.ui open_k9copy.desktop configDlg.ui prefMPEG4.ui k9mainw.ui k9copyui.rc hi16-app-k9copy.png k9mainw.h hi48-app-k9copy.png prefDVD.h prefDVD.ui hi32-app-k9copy.png prefMencoder.h configDlg.ui.h viewmpeg2.h Makefile.in prefMencoder.ui k9copy.desktop MainDlg.ui.h k9copy configDlg.h menupreview.cpp Makefile.am prefMPEG4.h menupreview.h
+KDE_DIST=viewmpeg2.ui open_k9copy.desktop configDlg.ui prefMPEG4.ui k9mainw.ui k9copyui.rc hi16-app-k9copy.png k9mainw.h hi48-app-k9copy.png prefDVD.h prefDVD.ui hi32-app-k9copy.png prefMencoder.h viewmpeg2.h Makefile.in prefMencoder.ui k9copy.desktop configDlg.h k9copy menupreview.cpp Makefile.am prefMPEG4.h menupreview.h
#>+ 9
clean-ui:
View
4 src/configDlg.ui
@@ -188,9 +188,7 @@
<slot>bAddClick()</slot>
</connection>
</connections>
-<includes>
- <include location="local" impldecl="in implementation">configDlg.ui.h</include>
-</includes>
+
<slots>
<slot>bRemoveClick()</slot>
<slot>bAddClick()</slot>
View
30 src/configDlg.ui.h
@@ -1,30 +0,0 @@
-/****************************************************************************
-** ui.h extension file, included from the uic-generated form implementation.
-**
-** If you want to add, delete, or rename functions or slots, use
-** Qt Designer to update this file, preserving your code.
-**
-** You should not define a constructor or destructor in this file.
-** Instead, write your code in functions called init() and destroy().
-** These will automatically be called by the form's constructor and
-** destructor.
-*****************************************************************************/
-
-
-
-void configDlg::bRemoveClick()
-{
-
-}
-
-
-void configDlg::bAddClick()
-{
-
-}
-
-
-void configDlg::bOkClick()
-{
-
-}
View
23 src/k9play.cpp
@@ -41,7 +41,7 @@ void k9play::readStatus(k9play_st &_status) {
fstatus.close();
} else memset(&_status,0,sizeof(k9play_st));
- //kdebug (QString("reading status : title:%1 chapter:%2 cell:%3 sector:%4 written:%5 readen:%6 skipped:%7 chapters:%8 \n").arg(_status.title).arg(_status.chapter).arg(_status.cell).arg(_status.sector).arg(_status.bytesWritten).arg(_status.bytesRead).arg(_status.bytesSkipped).arg(_status.bytesChapters));
+ kdebug (QString("reading status : title:%1 chapter:%2 cell:%3 sector:%4 written:%5 readen:%6 skipped:%7 chapters:%8 \n").arg(_status.title).arg(_status.chapter).arg(_status.cell).arg(_status.sector).arg(_status.bytesWritten).arg(_status.bytesRead).arg(_status.bytesSkipped).arg(_status.bytesChapters));
}
@@ -129,6 +129,11 @@ void k9play::setinitStatus(bool _value) {
m_initstatus=_value;
}
+void k9play::setcontinue(bool _value) {
+ m_continue=_value;
+}
+
+
void k9play::execute() {
//playCell();
play();
@@ -207,9 +212,11 @@ void k9play::play() {
if (m_initstatus)
memset(&status,0,sizeof(k9play_st));
- else
+ else {
readStatus( status);
-
+ if (m_continue)
+ m_startSector=status.sector;
+ }
m_output.open(IO_WriteOnly,stdout);
k9vamps vamps(NULL);
vamps.reset();
@@ -320,19 +327,21 @@ void k9play::play() {
status.cell=currCell;
status.sector=pos;
- if ((m_endSector !=0xFFFFFFFF) && (pos >m_endSector))
+ if ((m_endSector !=0xFFFFFFFF) && (((status.bytesRead+status.bytesSkipped)/2048) >m_endSector)) {
finished=1;
+ kdebug(QString("pos >m_endSector %1 %2").arg((status.bytesRead+status.bytesSkipped)/2048).arg(m_endSector));
+ }
if ((m_chapter !=0 && ptt !=m_chapter) || (tt != m_title))
finished=1;
if (m_cell!=0 && currCell>m_cell)
finished=1;
- if (m_startSector!=0xFFFFFFFF) {
+ if (m_continue) {
uint32_t lg2;
dvdnav_sector_search(dvdnav,m_startSector , SEEK_SET);
-
- m_startSector=0xFFFFFFFF;
+ kdebug (QString("repositionning on %1").arg(m_startSector));
+ m_continue=false;
finished=0;
bcell=true;
} else {
View
2 src/k9play.h
@@ -49,6 +49,7 @@ class k9play{
uint m_chapter;
uint m_cell;
bool m_initstatus;
+ bool m_continue;
QString m_inject;
QStringList m_audioFilter;
QStringList m_subpictureFilter;
@@ -81,6 +82,7 @@ class k9play{
void setdvdSize(QString _value);
void setchapterSize(QString _value);
void setinitStatus(bool _value);
+ void setcontinue (bool _value);
};
#endif
View
18 src/main.cpp
@@ -50,6 +50,7 @@ static const KCmdLineOptions options[] = {
{ "cell <number>", I18N_NOOP("cell number in selected chapter"),0},
{ "inject <filename>", I18N_NOOP("status file name"),0},
{ "initstatus" ,I18N_NOOP("initialize status file"),0},
+ { "continue" ,I18N_NOOP("continue playing from last sector"),0},
@@ -96,20 +97,19 @@ int main(int argc, char **argv) {
QString chapterSizeArg(args->getOption("chaptersize"));
bool play= args->isSet("play");
-
- /*InputOptionArg="/dev/hdb";
+/*
+ InputOptionArg="/dev/hdb";
play=true;
- TitleNumber="8";
- chapterArg="4";
- cellArg="2";
- audioFilterArg="1,2,3";
- subpictureFilterArg="2";
- vampsFactorArg="1.49";
+ TitleNumber="1";
+ audioFilterArg="2";
+ endSectorArg="3383054";
+ startSectorArg="0";
+ injectArg="/tmp/kde-jmp/inject";
*/
-
if (play) {
k9play player;
player.setinitStatus( args->isSet("initstatus"));
+ player.setcontinue( args->isSet("continue"));
player.setDevice(InputOptionArg);
player.setTitle(TitleNumber.toInt());
player.setstartSector(startSectorArg);
View
116 src/menupreview.ui
@@ -1,116 +0,0 @@
-<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
-<class>MenuPreview</class>
-<widget class="QDialog">
- <property name="name">
- <cstring>MenuPreview</cstring>
- </property>
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>590</width>
- <height>515</height>
- </rect>
- </property>
- <property name="caption">
- <string>k9Copy - Menu Preview</string>
- </property>
- <property name="icon">
- <pixmap>image0</pixmap>
- </property>
- <property name="sizeGripEnabled">
- <bool>true</bool>
- </property>
- <grid>
- <property name="name">
- <cstring>unnamed</cstring>
- </property>
- <widget class="QLayoutWidget" row="0" column="1">
- <property name="name">
- <cstring>Layout5</cstring>
- </property>
- <vbox>
- <property name="name">
- <cstring>unnamed</cstring>
- </property>
- <property name="margin">
- <number>0</number>
- </property>
- <property name="spacing">
- <number>6</number>
- </property>
- <widget class="QPushButton">
- <property name="name">
- <cstring>buttonOk</cstring>
- </property>
- <property name="sizePolicy">
- <sizepolicy>
- <hsizetype>0</hsizetype>
- <vsizetype>0</vsizetype>
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string>&amp;OK</string>
- </property>
- <property name="accel">
- <string></string>
- </property>
- <property name="autoDefault">
- <bool>true</bool>
- </property>
- <property name="default">
- <bool>true</bool>
- </property>
- </widget>
- <spacer>
- <property name="name">
- <cstring>Spacer1</cstring>
- </property>
- <property name="orientation">
- <enum>Vertical</enum>
- </property>
- <property name="sizeType">
- <enum>Expanding</enum>
- </property>
- <property name="sizeHint">
- <size>
- <width>20</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </vbox>
- </widget>
- <widget class="QLabel" row="0" column="0">
- <property name="name">
- <cstring>PicLabel</cstring>
- </property>
- <property name="pixmap">
- <pixmap>image1</pixmap>
- </property>
- <property name="scaledContents">
- <bool>true</bool>
- </property>
- </widget>
- </grid>
-</widget>
-<images>
- <image name="image0">
- <data format="XPM.GZ" length="8463">789c85d85b6fe3ba1107f0f7fd14c1e1dba2e0b164cb9650f421173b8e132771e25c8b3e0c87742e8e73f325898b7ef7d29cff68f714d82d842cf61789126738a4a8fcf97debfa74b8f5fdcf6ff3052d1e788befe97debbb5fce665ffffcd73ffefded8fbcdcca3b5badbcd8cafff8dbb73ffc7a8bb78e5f9ec306a3c54fa0b30893959b23f97ce3bc91b7f2c6c69ccee755d6c8926924ce39afd29d3be266a399258f376e66b54bb8d594eb2d5c8a59ce570d96fbf397589fc79538f647da1b71bc5fba3f4d6ba7f3b403e3fefe5cdd92fee07e4d16738aa795c5e7a5f8f95caced690ce37a3f10b71af0215cb668e360d545ca7c30e2a251a4f3fe2199f479fe116ec15d719daf0b9891cf37359eff2eaefbd3835bd21f7f00a37fbe0f33dc166bff38b9c8b53f5ca8a51efc142ee11d71aefddb15c7f197feefc18887d7b0f6ff52dcd278f76196fcf15332e9f37908ebf3f5bcd6e34c5cd7cb8bb8cee72baccfbf12b730de26131785e42390b89db5253fa9dedb75fc7c0cebf39fc575fcd7e242c7e706ae24ff5c5be2f567627d5e70e24e5636d3f527c975fcbc84f17cf3298eedd3fdcc115ca1ffab8d3b4dbd9e4fc571c64b7f6fc5ed0cf54ab097f6e658dd49fda1277127138703d84b7fc36b6d97cce232ab5ac91e2e2a4efd49f3a5e3eafedd8bb57f3c13b70b898f6f610fcbf35d47e36fc155479ebf0b6bffd6e2ba3f3bb0477f523ecb3a3ffca1967ae70718eb913f15ebf3790c17921f7e1797184f730817623bab9dfa4b195c89ed935afa4b03d88b7da126f1445c65e270045794e27369be97ae8e670a231e772e6eb6b05e9258eb2b047107f5e5e76ad4435f5c66c8ff5c8dfcefc188df2c61c44b8f30eac73eab255ef722ae328cd721ec25be0053e67cba3ecddfaa55c7578875bde68558e78b7d106bfdd85358eb795f5ca2fef91ac678872e5c21be1cd6fe3f8bab4cee670ed472de9cc08598e7b077d2be258ef1c9f9265c48bca4267118c0818bd43ecde78a351ffc583bd5bb2b61ac8f6e298eef1b594feec405e69f95f8b8adf52efd631d6f7f5f5bf2d78335bf7a5eebfd05d6fade166b7ee800467ecc075c493d98268cf96cd15ef3e58670210e6f30497ec2bbd8e52cf593f60fd4aaf3b18219fb855d7127437e8e608c3f0fc4a5c77cf81257c817cd60cc5f83fb13e6af5ba8d17f0b07b1bf13bbb6f497e5fc8ff13b81d15ff7296ee37de7a53f1cfb2ffbab4b718978ec2b8cf1e086b8c2fca64318e3e77a30e68b776a696fefd4129f9d88a990f96b163089e9020e621bd412bf79ac9de2b74db1cbe5bcf5b5e53cc36d196fce611dffa198732ff325d597fb31fe6730f269d76ac99fdd1337b1dfb2bb627dbffb20ee78ecc7bcb8acf0fe9888637d48fe18c6fbcb75c584f9c4176acc8737b5e497b761427d3560e48f705ef345f730d60faad4921febe020f5661fc575bed27ae97c13fb1f927cf8b697fd6590f87ca7423e1fd4a8c74f7199c9fa4c0d18e7ed1b8cf91da4bfbed2f76f565bf62faf7085f7630bd6f9f82226dd5f5cc184f7d5a31afb8555edf47cbf80b53e4762cd9fdd11c70928f94bf3910bcd8f1bd596f8ce61ece7ed99b8c07e8cba62cd275d893b19dc830bd92f863b7189fda67d57637d457feafcbdc1589fcc8b1af95ec0babf7a1093aef71f30f63306fd7139ea2fc06dccdf5b719d1f03079fbe576d5a9fb8ae277b0c637f623f6ba7fcb87b71d19078e85a5ce7a72f2eb11fb77335de2f125fac0789875a70c0f84fc5ae2de3cd9730eac1edabb19e497e3c63fe98018cf943323edee78897600aede4b49ff44513df73b60bebfa3214b71a18df0fb8c47c3982195e890bec77cc93b8adefe3168cf9619762fd1eb10b58f73753b1be1fcc736d59bf5fc515d637c2fd88503fb5f1fec8e180f56e4fec729c473cae8df1c2f31cd637f75a5beaf5130e584f8fd578bfacc58cf52f207f8cf1f52bb5cc678fe733e6b729e020eb9fc17878ac8766523b8dafb983494cb95ac63b6c8b431ea41ed27ae64313dfc7f6425c8f6f0fd6f12dd4d89fed8b8b02fbdb4b58f7bb8730d617db17b7b1bfb50730d6037b0b63bf6f3b30eac5497ca1a3fb831b58d72bb42f33599f08fd2b0bd98f9a991af56460ad2f27d6fd3fbdc0d8cf38b4afebed4d4c88c73561bc5f0dab510f7371ac37a96ff4df61fe3be44bebc53935f613bb30ea273cc384fdf18e1af584feb0de7fa0c6fe1df1f81cef9ba55ad68ff00463ffe71b6ad4df7bed544f3e87315ffc502dd7d3696da9d77b18ebb11f89b53e0dc62fb451afe9f9b15cf0f702db16d7f53480b59eae6acb7a730debfa7323eee8f77209ebf76125d6ef0bf70817f2fdee266ad48f85b1de1b126b3db90063bfe0bc58bf17dc18c6783a16ebfe92de61ec178c57a33e70ffba9e3231e7785f205fb13ee4fc1cd6ef37dcdfa3de1cfaafe3e5713f8ff78b336a8c675f8df7cb541cc733d989e37c43febed4f87e5e8bab02fbbb95d861fd26c9f7a6fe25fe12d6f761578def5786753d96f8637de3bcaf2df1bca9257ec2fdbde6f7b9b65c7fa0c6feb40feb7a7d5a5bf2837803493dd3031cc42ecdb7495be377db62d2fdea9158c7979d98317fe9036ea3deae60ec1ff8558d7c75d4d89f7bb1d77ab986f17e32576ae48761ddcf77d4c8571f467fcd9e38607de1dac8df0d8cf5845f60d4934bebdb64125f67b21e5f885d0eefc278ffbb4b31e3fd4e05acf5f029d67829c0d83fd210467cee5a8df8bf60aca774acc6f913b1c66b2a58bfa7f761dd9fdcaa255e7230ee67466aa917ee8927da7f524b7fb8abc6f32fd5588f0dace369d5a8df3335eab3a19ea4fe19e47b827a366bf564923c8627b8df456db9fe5c2df19a9dda727e5b8de7cd6ba7fb8f16bf3bacf9d599ff6d6bc93acbf1f036d889bdb3f7f6c13efebaad9dda273bb3cff6c5beda37fb6ee776619776653feca7fdb26bbbfd9bb63b76d7eec5ebbab667f76ddf1ed841fc39b44776688fed893dfd4ddb913db3e7766c2feca5bdb2d7f6261db7b611ef95c527e7bf69dbb4ad78f7cc16b66d3bb6b495b1c618322e1e6cbc096662eeccbd79884f317f6d6b1ecdd43c999979362fe6d5bc997733370bb3342bf3613ecd9759476f9b1db36bf64cd7f4ccfecf7936fd78fecb1c9881393447f167688ea34ee2ef4ecdc89c9973333617e632b6bd32d7e6c6f24f6d6f63db86c9e2bfb9699a566c5fc43bb44cdb744c692ab2648828be00292ec2f13b794277da96eee9811e694a4fb1976b734bb3d8cb2f7aa6177aa5377a8fd7cf69414b5ad1077dc6b65fb4d6b6d623aa7b3b8a3d5dd1b6f9a01ddaa53dea528ff6a94f073488c7211dc5b6433aa6931f6de9946634a2333aa7716c7711a35dd2255dd135ddd02d3528a39c9ab1752bee0cdbd4a1922a69ebac19c60121e71cc7effce026eeceddbb07ba718f6eea9edccc3d9b13f76296ee95daeecdbdbbb96da2edc22dddca7dc4513e89f5f519eb24d693fb745f6eedb6dd8edb757baeeb7a6edff5dd811bb843776486683b8c6d8f63eb1377ea4eede6df913b73e76eec2e62bb4b77e5aedd8dbb758d78f45d1677244d8dd7b5dce68bbbe34a57c5f6f1876dfc31bcf9c3d70773fc5eedbb86d488bb8d7bcf194f7eb4e53bbee787d4bec38fe92e1d9ef213cf4c8a8f9ff925b6bc883572c9affcc6efda96e7bce025af627bc31ffc891f137ff7c56bdee61ddee53dee728ff7b9efba7cc083baed211ff1908ff924b697e334fd7b127f3be2333ee7315ff0255ff135dff02d3738e31c6de3e731c76fb678e51377e2bf9d740ce311d7d1d87ac425573e96502c49e7e3e7767cff63bdf277fede3f70e11ffd345efd14fff7e467fed9bff8d7d8e7b57ff3ef34f673bff04bbff21ffed37f699ffdda6ffb1dbfebf77c375ed7f3fbbeef0ffc80c6b132c77e10ff7f189f78e487e938f627fed48f74adf367f1bacd55bdcd11ff77eec734f517fed25ff96b7fe36fe9c037e8d467f16bb2e95bbef8b14ec6fdfdd877367f160b3698f8767261f327941026e12edc8787f018a67e159ec22c3c8797f0ead73fda86376e86f7cd6f7e3e5c2bccc3222ca9657a6115a6e1237c86afb09655f7ffaded613bec84ddb017baa117f6433f1cf0e1afd6f65fdc61100ec351ecd9f02febe47ffefeedbfcf02238a</data>
- </image>
- <image name="image1">
- <data format="XPM.GZ" length="27587">789cdd5c59536ac9967ebfbfa2e2e6db8d8ebc0aa2181dfd20a020e28003a01dfd901328c820220e1dfddf7be51a92cde0399e2aeb764517b18f7eeebd33d73c6426f5cf7ffcd6b938fded1ffffcdbf3cccc1edc6feede4c7ffb877f190edffff3bffee3bffff6f7edadaddfe2b5b3b3fb5beeeffff6b7bfabc96fee37b585ff21be49b818b1b182b7e9fe98f10e3fdf4a989e3782f9f911e3223d6f1e13a6e70f05d3f3ee3c61ba5f67ece87d7f9530dd3f21bccdf4bb1a63a6cf123d45a1d7b884e9fd81609adf2f30deb79631d3afda09d37d799ee9f7cf09d3f85b8c997e779130ddf782595ed784851f3f4c989edf174ce3ab27c6a20f795ee4cdf46ef3fcf63d62188de7f333c2325f78134cf7ed216319bfca58e45163cce39b3ee11c8fa7f719f3fba1c098dff7f47c519e371f8cf979bf9730f2ab8b8c65fe0e639e3f207fb9349f1d3116797418f3f34a13ce8bfd4f19f3fbaec758e643fbcbedcbf3a19c30e967ce58ec6dca58e62f32167b60bc23e3e17cf96d795fef3196f90b8ce57d9d30cdff4a58c6532a61ba2f58f87b4918effb8260d6ff39639edfa13cf3895eeb188bbc3f1226fb3c12ccf6fdc858f8394e98e80b8c993fbd9b30de0f17840b05a607dfdfd996f77d97b1e8d7244cf7cb82891e7346b820f6f79430f9f7b160a6ff9931cfef8f1226fab618eff3fc3661bcef068239dea1fc764ca1c0f46c33e6e7ed9960d6c78cf0ee3663d45f2157f0140f7c51706e1f718ff0ee368fd711ccef0f19f3fc6194303dbf2f3847f41618337f2130f6cc3fda5f01e8cb6fe3fb63c62c1fb52398f93f64ccfcea8260a6a7cb98c73743c1fc7e3561badf12ccf4de13de63fed5ad60e6ff32617a7f4f30bd1f4e198bbe6dc224ef33c1f47e40fdece6847eff2a388ffa708f8c85fe9d8469bcb1609adfbf082679faeb8449bf4dc2c25f3816ccf67494308d7f2f98e5d365ccfcd8b6607adebd0b6679ec3266fdfb8a607a5eef08e6e705337f16f3dd6e9297bf15ccf4bc254cfc6d0b26fe4d8531cfe70f04d3f3b62f98e5d54e18efab196396bf69244cfc3605333ded84899e16e1a2d8cb9b60d6d75dc47bf9c4ff36639ecf4f05f3f323c14c6f9e7051f4772398e929274cfc38c62c3f5f4b18ef9b03c62c9f50114cf33994ff9e4de31d0ae6fbf384e9fe80318f1f4a82d9dfdf18cb7c2782597f321ff36f74c2f4fc15e17d966fb814ccfc351226feae05f3fc385e319feee704f3fc2f0993bd1c31667b545e30bfbf2b98f523e3337f662298eeeb7cc2642fa7840dfba7c37850b432be3d10ccf49d274cef3f0adea1f9e53ecf17ee1226f91d326679aabe60e67787b0d013fa82d95e7309137fcf82d91e4e12a678b6cf58ec6f81897e998ff90bcf09d3fb68dffb3b89be0961993f7404f3f30dc63c9e530913bd1782495ee68ab1e1f7af05d37d374bd8e07c4f8c03eba72898ded739c1f4be657a6c8eeb915dc12ccf8784491e4e30d1afee19eff2fb0709537c1931361c6f3f1226fd79c19c4f307fec3be1dfef264cfc1d306679a817c6c26f4d30ebe35930f34bf275c28f0a8279bc8a607a3eb412c6f9dd2963e637ec254cf1fc4130e7ffa66092a74e98e7bb13ccf38d0517a8bf657e457ea69c30f9bbcccff2d39584299f9d0b667beb244cf630651cb85e7d4d98de7f11cce3bf254cfaed0926fe6c2161b2e777c28eed4b0f13a6f1fb8279fce78429dee418b3bcd55bc2c4ff9960ae6f997e27f2c1f86b92fdfb27c16c0ff58451bf561116fd9b8784e9fea360d24f6833dee5f8d74c98fcf54c30fb6b3d61b2a7be601e4fe667fafdbb60cebf9709533df22498edeb4230c7f3f43cebfb4a30f397ee333d5b82d9fe647eb60f759e30e92fdde77a749e30d1772798f3ff02133d229fc0f49e264cf20b82391ef884895ee13f10bd9a71b2b779c2446f4f30dbdb2c61ba5f16ccf23c4e98e2494530c7bf6ec2c40fcb4fec55fb84697c2598e7b709d3fd0fc15c5f141226fbad0be67c344898e667f93a8e17ba9a308d3f11ccf3df274cfaca0be6f9d2fb3c9f612cf1e228617a7f4f308f47fa73c9de3d63b63f7f9330de5775c1a44fdb63cce3f98960b6a76dc19c3f4b82399eea84c97faf04f3f8a4af148fecbd60b6e769c2148f8e04b37e7612a6f94f05b37d1413a678ff2098e3413e61924f9a8fe993f1c49e1e13267d0e04b33e43c274ff5030d1ab4a0993bdd405b3ff9d244cfc8c0573bc6c254cf45e0a267acd8cb1d89f4b18e969a6fb4caf4998e83d10ccf9249730d1db11ccf1f62e6192afd0cff6a56f12267a3f0433bd35c662cfa584899eae60a6f72161ba7f2b98e3c576c2448fd0cff1cda6fb1cdfc85f9ce77815ae13a6fc752a98ed31dd67ffba11ccf51ac6679be2913f11ccf13e9f30cac31bc19c7faa09d37dc598edc79712a678d815ccf1e12861d2d7b5609a5fed274ce35f08a6f9fd61c2e4af65c66c2fa19630d58f6782891e27fc48fe6b244cf67c2f98edf924619aef4130d3d34998e89d3366fb705630dbc72861b20fa197edc31c274cf621f449fe6b274cf77705733c9b264cf1f283b0d8871e274cf6b32d98ed6398308ddf13ccf5e155c2747f4b30cf5f67ccf12538c12c7f8c0fd627f9be264cfe5711ccf6d64898e4fb26782f8fef97188b3cca82d99ef209e3fba62a98f51712267991febcf0e79e0573bc68254cf6702b98e95d60ea471e05efe27d3764ccf2b155c12cef0bc11c0f7613267a268259de366192df8360a6e79eb1d8775730fb17eacf15449e3e97b0c5f75f18b37cc25c70119f0f3784657ed5144cf3bb52c234dfb1609247f860ccf610f28299fe49c2246f1a3ff1d79c69f5675dda2cfd6ee395b0d39eaf6f990b6deb4fe3e4279770e2bf67bc6fd08bcfc8f757a8f37f3dbd6ce26495caf8f3bb28fe53f5f253ee3e7d2efa4f58f8cfffbd5ebec0cde7cf99efe3e4cfd14bf3131ffa9115fe75f5f28bdcfdc5f4a2bbf8b307d7bd7e00ac743ffa02e794644d7a007fefc2e5f1f93ee0fbbf965ef4a31e02753dfc5d21850a38327a049c11173df84b0f7ebf87bfd1ef0fc845effb74ff1d7ad1633d817f87f0fb24ea07b81aa2f5440e9ff434e983b8897a7ad633b87afa05ae6fe3e6dbfc65ce9c4c9a0bdf98c3bff1e76bd41947e037fd0e7c04fda10f505f626d7f0dbd78fc94809348f55cbf66ee59e660063f23f565f8ada20f75b4b957e4b5a48ffe5279bf0a1455d1ba0640790d283ed4c7baae4f74439fea337dae2f74535fea2b7dad6f740bfeded61d7d0bcf76e1bdbbbf543d56d25bf051e0d5db40e509509cd379bda30b7a57efe9a2dec74f11c282524659e594574175550f9e1fa87f6d1cfb2c0f2c7284072f3ed427ea41f5d5403d02d543355263bcc66a923e63fcdb483da9a97a5633f502efcc418f6085ace33f906fbea017185dbdc2f586b3710f021175aede75557da803dd532555561575a88e5415e995cfe493cf98b9aaa963bda3eaea443520aecd61bc53887d31cec5e860c1a720b67f9f5e505647c04d559d817f2327ea1c7c77ac5f918f0bd55497baa0aed435527fc39fcd5cc8dd966a231e01f71d75abeed416503f074e269083a22fc1476dc3fcafdfae9723d24be67ad533955379b0fc1d55603e2640e38f3859f042fc4c989f6873b730d2ae6eab3dcca55d8cf29069d5de37fb4b55bd41c4111f01cb82d966aaa8f60d4c06b488ddb43ee521c38d31c61a4bdc18a7dac6e3db4f2628a79ba66b7a986fc90f5137dfa617b8d4d992b76f814e0ecdbd79503ba61ff501d40dbec4c746fd44cecc23caa266863a07daf9e0b9265c017da96ffd5a7e89350a8fb8a59d19e99a199b8979120f4972deecf19bacaeb5c28bc527223753f30cd12dd66b43e4c67fb5b6fe95fc12473191a343e0e4c5cc916ab2ac755a57e4be1411daf06931472d7c7b92ee417433afe60da27b09fc666866e6fdabeb09bf94f769a4a04fcc9bf9604e886ea2699d8f659ce574c25c2d46c9c46b333707a6a44a3067ccc2dfa817cc2751d38f06aa13f5602a90c3c769e6094757b695a483d56cc25a348fe6304b3b78cab23e29b2d5cc91a9c26cefa606940f25764216507f482f319f78885dafe618aceb8d39214d64b4839cc07f196ba9c3e7c4f4a98a01fa4e165c010f2dd619d5020b6ba5bf68d330a7ba06199924fa481d1fe4b53f10c7402fb1c798e8a08ae0271fc96e96e26c461b635307bae7e60c647b6e2e4c53dd994b553157e6dadc98969a9a36d20ef25844e7e43f82c6a6636e551e2a1c83bd6a6fb5075df59d2fe9e5156431d43373a73c797c92fd724c223eb680f96d9333795385caa66876f4b12a990254291da89b4f40b35766d7ec9922701cc7da8f1a5df1a61be474648a1608c07a4dbaedd8d12dfbaffb25bd4ca1720cba6e953993181ce78c26c59cb4ac257d5867bd0dfad476cd8eeda93d7b0f6f8eb0431bc6de06a4db8778dbb60fe6c2f6a16e1ef288033bc8f093ec0ec67b84ca7b061ddc5becde801bf3fbf58279fe4035d4be1d423ec9441de464c23115a46847766c27ba619fec14661f00dd8f40ff22f66c41448fbd0e749906f9b1cf7646d936f9df2479e104343c51d7f605a2cdb17eb373a8d76257575be664c1cd57eab158b1d857fb86b34a4ec9c41efb8e9c7cd803f560212bd8b21ec8851c79ace5b883e67a7b0272feb015d5d53990fd618a89121527699eaa3dd21db0d0d88fbe69ea55b31696ac2ce96563cce627a7b66a6be695ebf465bb460ac0b68e6ddd9ed8b96de0f3a7a08f47f4d678cdb9968b1cc4fefe1539a39ff7ba03da3943df19e37854418f53cd3db6e7f6027abc327012b0dbf8c4fb592fab196882deeef5245a85bdb74da88569ae9411a12a8499a24ecc89bdb457aa0872b3ab33c0ec0a38a9da6ba05aa16e8670bda227c7d5276f6fc0135bb60ddc4cd067962b089496edd85b7b67b7706d67b242eb8abf6caa0c2227ba0b15c423745a977a6f297a656dec5addda0bbb6d7310213cae48240be0b1aa90bb87b142053e5ef4adcddb1d5bb0bb1aaccdeec1dffaaa648b761fbd71b542c5191db41dcea8737b0aa33da6b16915712d8ead5606718dcb59e0e649bf40fe2de03c6db1a94c753f72ce7988d63db49e853eb2bae9469f83dfe660ed0d175cd7f5dcbdbed275f0015a77eabb07d77703b4e0f13a2ff6d03daa07d071cf0d216fcb4e8859f688257f1139f63082028a3f6d0ebadfab4c7732e65a1033801bb931f8ef217352a2d5be15ab9de812d85857bfb9897b829e788835ca9e9bba67e0660cbd515797cdbd9bb917ccb393b5cf585d5905bc07a0fff167797f69e7472d6a1e6dcc9d9b47ad5006493e8ff5bde9b8577d0d9cbc924ec0226525365b09962043cda112da3597ee0d3821cf1eba77f7e18c3bc01efc40575cc95c737db456d199ba2bbb0ad6ce9fc6dc8d7a89abd713aae8402b0ff603e7ce4417cad330fea1be76475c79968093a7b4a29a8d98b1d67d5373d04315bae131d66d876aec6ab60d96d6011faac2bb73f0b86b786294b859447d0b4f1fbbba6ebb0367a946fca95e481703eee562766ab8138cfeada52a7280b27a750da0f0142384230fe7d5f025bd402c546ad79d814ee22a4dcb9d1b6b07ee0246f8704d7709b613a507f3b92b776da6ebbca075d7dc8db9d7efcdd9265f59cefb192b93aef4c51cabae7d5b8ec5a00fa88663fc3215d7820c3e43c9474b1a62bea07a2972b025d201dd5db976ac57b0c2bf4999295a5ad5c6beab1fc750dbaee36e9366567cc695edab7e9718c6347f522727bd3cb0270f203f5dab47e4255b2bd1efda0688f965b0abac4e252797c0e6e2cfaeb6cee82beb41278bfe64d1fd40f6b56d17d40574de5b7ae2ee1cd4a629536635037106f2d03de6983966e10c576bf558d20b3c197b6d05356e0e475eed11630dbbedb6a1ee1a408e5fed5ce77acbe5f41d4502557279b7a36a581f58d4f0987b32eac2c67adf15dc2ed459317a144c09aaecfa527d21560665a59ee1fe01d51448efc2da36ea05448ed41977a7f358c966b4c2f579cde46c57cf402feb1d6cc9e5dc1ef8cf13e40d03f9e40d3919677b13b6a3281ba8875dd1edab1c4ab3a6cfec01547eabbcc43987602c8af492a5f753bdc4bb6f6065f1770b5eb99366155fb1188fafbc01adc5da71bd178f6be571ddff0532e8a96b629e9d80af2fec53c6a49eabefad77e053913ad0a3b9842e69935e46a601143da25e96aa97cd7a41adc58c847a81cea1b05c15232f71d43353b53dac89e7ebdc60747ed10defa1cf6d2f49575662d2bfd045dfb88eb983ac6940eceffac307df5dadc52972fa1e7473efa297cfe358462f568fd0d62de4c1dd0d7a81f9fdbdcafb87281ff0c6d57c12e3c69bbbf2de554d3b43557b2dce8e7ddfed80e7374c013aad680d537d60eed52deb2579a9a72c1020dbcdb12ffa41de5fd24becaf9f70f5e8146aca65f9102f5bfe5115818b184fdee34eeb5255fac075573372e2878993650dc1bfbeef472e0f91ff0cbd34e6982d9060c3e4c82e57bc746ca6260ffa1bfc8a5ee09ac2ef33e0a5b8ca0b52716d2ecc29f0eaa0d21bac8d5ad6f5c8498c1a7ef8c9de05763d7eecf27ea25f9ad4417bec3907b6e29fb0d2491d265b27d44c10ddef502f3ddcab5ecb2fd97880ba19a08c863ab88ede5f89265489d5dc993e861cefb13aa8a2a74f222531c743a59187d8f5a464656c79753fae64fa58fbfaa9be8c3e872b12d116265899be427dd784c837495579e21fea046fef9ad417cd36f6fb9257e20ea9fcee31325f6ee005238fba835c0d9d1ad4b813b40cec3fe34e9f3b820c7184b448359d5db9847ffd3358d7ccbfb82dc8a2733f070bebeb7e738615ea245aa82ac20c497f8b0f78d7598c77486bd8b40e93e90129af747165ad17e5c3ab61cb760ed90de26621d62eec1f43f5016fc5f59ab63bb3def7d56a1792cd50063deed5bf997bff8e7170883a99fb0f94e0a10bcccb8a668097ba3e46492ff4a236eba5293b0531efc70ae612fc659d9709cc54518db8728dbb0a71052eae1acdd45cddf903ac2047984fd6fb441aa3853676ef3c64e377d0ed967a53a7911bd08dc5dcbf9117906cc597d013925e3e896352dfd2d989a8972b35ddc48baa9a58ab43ad12eb2decdbe7901977210abfb1d7120fcbb16b75942773e4630e9b603e8a7b9551221fba63ae928d2ef3d2811e7607256e7e92f7a53ec6de12f82eab7da53644a1b13981aea9a15f0dadad4ce2aaa69bc47c82d54a8b576485a3857d2d621a556535c853fb368f3bae4fb8da1423411d1af99355cbc4b70b60db3b297ef9f538b6a6178f56f302d5d6892f27efcdc6d3b1b901797a5d85e7fa40491ff2c914ac8baafae5d5e5e52e7111635b9885ab7eac2fa00bbb05eb7a4af542052bb6c55bb20e6ffca17d8a55e54feb31d14beca82c48e84db7fcd17acf1af7e34ccb8c818312d8ba87ebd605e0a4469c2cedc66ce878b1dbe68808bf8f94d3e7be8ab68a9513e4f621f6b1abbc406d6e4f30bf6cdc51daa417d674f4ae135fc36ae286a20f7a00f202e1a608de1fd7be86ba6b73ae1bfdc41888b7591b671bb30363936eb3519a2cb66edbfed8d763cf087a393479d351d9ddb61bbe46aeec4f7499abfdb53d9845bfbfe22f71ede9c519df7035ea5f783d5c56b0873a0ff520f5907d7fea7ad162b88a6e738e64dde03e715c1bccc6b445c689d634f467a684eb2c2faa04a9adb6c46d8baf277fae4fa067fae47c46a6df97b3771e4fe8c46b6e0af6197b31d99510db89fb447bfec2466e20f6d8826fa28519e6956c27c55f3f335b4cd5a6930cd82bab5b7fa18afed28ced586c61c14b5cbd004a2aba61e72bd5d68a5e56d601fbb873f3106b56d555cfc976130dfe0ae82e9a0bb50b3ee575df4234367b718d85b20a58e1887581b1d75ffb6bec911752598a8cb88ed1064bbbb10ffe062d6c61596c5ff0b76755460b4b312caef0aed763dcafc899c87bb82678f6a8ed69056699861656866ddf816cf0aa95da836af2d2dfe21ede88d79fa44bb9f677aeefb7b0425befe3c5867047d06ffb1cc490eb8caf2d3437f279dd86aadca4ba914f04ade57dea2303e7160357177a7667737e87571d849b36a3b12ff85d5f8ffe0257c54ddc876d9b8f9443b83ff163e8d21bf6c479c825b5152e16b923ee1c4dfc9e2fe21ae9cabe488c7c30d2be3936655e1ff35c937dae972c9fded4809b9e7a50c76831edacc760541bda99eaeab8320236a9f62052783f45e97314351f7e04455e4fcf837277de0037d54d1d0046f2094597cc1acd224a44ad94f5b58dfd924bfefd23bd2c7fc3c3070375d27db0b846b7e085e23284df98b755c5e642ac90877a1cbc33b605bd649d2c8dfa13ced353b08e86bff0eb67cac4cee23ef420a3a9a435f4ba6b0f9498b2c65e76c58ed6f5b2da5149ac28dbabe88de09f1c97d1226445f9d5c6131f679067bcbed3afaae42ecd515c47815afa465f9ae32821b8ef62efe8aba689196bbd96d884177f1f1b0515601b3378762571e914fd17f62b83be36b853c9eb1664bf3752ed3a07b22fe867a8328f809b3e70134270c51074d35d610481ee04f4b60515ca0354a44df7bee89db99a5efeacea0d7c2974a1fe8b2b6fb2c21bf73eb3ab8bea4bfb9533d55095d003d9b8b4778d71802cc2d4410f57ee417fa80397833ea617eec343e87ba7e38a440f77f2fa7a0295ce13fcbc0d83f0e8aaae967acecf3f63e1cc145d239034bacb6b139fd6639bf532b07355763bd8f366bac36cde0ea33036f7986ba0c704abbe5539a817e34e695ccd8d95fc042ad0b8fa07fd89af43c575a96a14bb7efa89d1ba616267bc656ad8572ded242ef7953fd18b82fcbf631544b3d51388646731463fb9819b8509d03fa75e04cfec0fc0a6e24e51dc91d88adcc44a14c67bd71dfb00f1fb04fb03bb81faa578e6bbe129c617538368345fdedff945bd38c832f761eacaa93f5ae92b62bd05b1eb187a9a6bf0cf1abe33e45da4099e5dde3223ece51dee6e283bb515730999b1cfd17dd347ce3055c333c4421bbddd50ff9a22d3e7fdcb2797f773756e4ba6196669ad7e75af17f3a22e423cbed04d98b98c1eead501eaa89476c03daebb3dea9ebd0b2f611e5e33f25fd70e7013dec2bbebeb63dc8f7694c9fe905ea630fb7bf80807781a66bca03ee3bf63ca2a661a4aae0efa39c193ee06a3e82b76dd138c412f701daa125490c16f87f2464ec64bff564305fcab62630ceba6f3301b4ec57dc55f2c48599d43057b1f0e5521d37f64675e44d391deb31d7f1eb4a9c21b47b682eb3b07a6e00c44e4b619fb0bb3eb7b90b3aed36ec8788d87cc981029f74215aafd39564bc3e6fad98b2fea2546e550c375e343736a6ef86c22553372a624eb47635c0ff8305373168e4dce8d55d097aea32ffd8eb955b7b6035cd484e274cef247712c9ec26cd92ba8ca819350e795beb06a695f8a6387b8cf02b5906a041d4e14f59acb7df06a77851fb0bb2755357df87c40d559434d64e9fefc1c73f613eb8461dc43b7dba08f396770fbeb7a81c87a08bd1c9e3902fdd44dc9df538761299aae9fb35cb6fb552b6c674ebeaef6646db5b9568bd55ddb57c00be30e7ad6977f35bf04774427a8209ef5743d345cd3e2e92eb3954e5c2dcfbd84e3d9ea9538beceb1fcbb713d0df7fca0c20ba7e03326bb3bf26b71ac39834eaba643dc6789dc845a380be7e696f7aec79bfa44f6a76c4e5dd6d9e7d5cb277f8f51d2d4c3456866d6f77f3dbf28dcc90b1801063163a9775d53e570691ddaff8f4ff0c7cebfcde7447fcc05de0d6f9f44e918cda6e10a62217eef49e2d8afea458fd43bd458319fcff59399856bc878b370135af665736ff513492f7bbfac348d3197bcf3b74e96f800cfaf2badf3baa5679c5fd64e777d512febbbab20177ba78a2ed8237bfe536e563958e5e586bef70375d7b3eb874af6e4afc2155fccc1cf618a2b17f27d98cfcff5fdb08a59e3e401e2c9812eab9eca85b61d428b77c8732ffbeea66aa7b5c211e65753348df06476dc5daca1637f035d299d027a82bbc13c431d5e8ea7e237d1f407f432c77d2c0bf56e053279dd544307b2e234f31d183c1b6b067eb0765a97d6675bb8de45671eaf8d0a5d07557dc0aed756fca169e1a98211797cfcb64298e83adc9d70de5f92f22ff9cb12471c0de2f7f53ec07ae3f9d4436754d1d6fc813af6fd95ae645354907596912efab28bfb1fd069c1b8d3b86f00ddd20974e52dfac61954101d77023aa9c33c2a9e62fd9cc6dff33d3e3dc675cd1e7e67126a02751ecff9033db7e632dcf903374adf7d5bed1dd377dfcc3c6c85ed90d3d721ae7ae17710a0d38a3dfcbd9d1bb0b4b0130aa8935df4135a49c26f917c46d7effa7e2545c5397e03f7450f0039c8a260cfce987b95b72dd3f4da34a07e0c404bc77cf8be8f554c072a5363b65dd99fbb33053c986390f63baef6bec74e8b4f03c5fdd88e3e09bbc06facc2caf8ad2b3acdaafe58de5fd3cb14cfc95a3c2b06d666b79a3337847830087b41e917e06ae6e389c286199bbcbe72de9db9baaa381fb43fb40ffa5a15c166eeec94ce0600a5f7b86f3dc79dd7beb3f0bbd21ffe3234550363577f5592bf3b8ead7313d79b3d7ee75be92ee925ae5bb918f56506e87940ea15a0f9ce1d999d70667654c9def9899df3b972a188764b06d865450dc45a38ea2046df78aef6813d1e3b3a399ffcfbe2d817a3f5e26f74fa269db65e92029dbede34d6daa9c30d6b761be7ff43fef2234ee235cf7093ce14ad46f6cd364f5cf17ae4d2df7ffeffc6f8237ad940197db36359173dee9c661bcee1cb794c5a83ccac6b73a7a5326bdc36bb42bce9fa7adeff815e56ffbe6445f0fb4cfac04d129035c8a5ba823b2dd6c7f7e96563af90a56a45669f59d1fadf8943fb23ebfba26d7c512f9f753ed99196f607bec6894d96b7415f4b3afa0147bf1cc73ef3f01f59df0f66dc707fb91789cf6e659edf346f1a176a85bb6fd5cb7a1c5af6d24fa9c93ebf14d53363fe400af1993be0e677d4c93f7beebbaeafcef73d79ffaf79fdd9ff5fb87fe5f5ff4a2ffff3ef7ffb5fd55b5fd0</data>
- </image>
-</images>
-<connections>
- <connection>
- <sender>buttonOk</sender>
- <signal>clicked()</signal>
- <receiver>MenuPreview</receiver>
- <slot>accept()</slot>
- </connection>
-</connections>
-<layoutdefaults spacing="6" margin="11"/>
-</UI>

0 comments on commit bf80c1c

Please sign in to comment.
Something went wrong with that request. Please try again.