-rw-r--r-- | core/settings/citytime/.cvsignore | 2 | ||||
-rw-r--r-- | core/settings/citytime/TODO | 2 | ||||
-rw-r--r-- | core/settings/citytime/citytime.cpp | 18 | ||||
-rw-r--r-- | core/settings/citytime/citytime.h | 6 | ||||
-rw-r--r-- | core/settings/citytime/citytime.pro | 10 | ||||
-rw-r--r-- | core/settings/citytime/citytimebase.cpp | 414 | ||||
-rw-r--r-- | core/settings/citytime/citytimebase.h | 60 | ||||
-rw-r--r-- | core/settings/citytime/citytimebase.ui | 1199 | ||||
-rw-r--r-- | core/settings/citytime/light.png | bin | 223 -> 0 bytes | |||
-rw-r--r-- | core/settings/citytime/mag.png | bin | 193 -> 0 bytes | |||
-rw-r--r-- | core/settings/citytime/opie-citytime.control | 6 | ||||
-rw-r--r-- | core/settings/citytime/zonemap.cpp | 67 | ||||
-rw-r--r-- | core/settings/citytime/zonemap.h | 18 |
13 files changed, 579 insertions, 1223 deletions
diff --git a/core/settings/citytime/.cvsignore b/core/settings/citytime/.cvsignore index f4f5e13..2c33e73 100644 --- a/core/settings/citytime/.cvsignore +++ b/core/settings/citytime/.cvsignore | |||
@@ -1,5 +1,3 @@ | |||
1 | moc_* | 1 | moc_* |
2 | *.moc | 2 | *.moc |
3 | Makefile* | 3 | Makefile* |
4 | citytimebase.cpp | ||
5 | citytimebase.h | ||
diff --git a/core/settings/citytime/TODO b/core/settings/citytime/TODO new file mode 100644 index 0000000..0511b63 --- a/dev/null +++ b/core/settings/citytime/TODO | |||
@@ -0,0 +1,2 @@ | |||
1 | - when button is pressed the set city should be shown. | ||
2 | - better date/ time format \ No newline at end of file | ||
diff --git a/core/settings/citytime/citytime.cpp b/core/settings/citytime/citytime.cpp index b2f9f14..f33b19f 100644 --- a/core/settings/citytime/citytime.cpp +++ b/core/settings/citytime/citytime.cpp | |||
@@ -1,272 +1,282 @@ | |||
1 | /********************************************************************** | 1 | /********************************************************************** |
2 | ** Copyright (C) 2000 Trolltech AS. All rights reserved. | 2 | ** Copyright (C) 2000 Trolltech AS. All rights reserved. |
3 | ** | 3 | ** |
4 | ** This file is part of Qtopia Environment. | 4 | ** This file is part of Qtopia Environment. |
5 | ** | 5 | ** |
6 | ** This file may be distributed and/or modified under the terms of the | 6 | ** This file may be distributed and/or modified under the terms of the |
7 | ** GNU General Public License version 2 as published by the Free Software | 7 | ** GNU General Public License version 2 as published by the Free Software |
8 | ** Foundation and appearing in the file LICENSE.GPL included in the | 8 | ** Foundation and appearing in the file LICENSE.GPL included in the |
9 | ** packaging of this file. | 9 | ** packaging of this file. |
10 | ** | 10 | ** |
11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE | 11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE |
12 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | 12 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
13 | ** | 13 | ** |
14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | 14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. |
15 | ** | 15 | ** |
16 | ** Contact info@trolltech.com if any conditions of this licensing are | 16 | ** Contact info@trolltech.com if any conditions of this licensing are |
17 | ** not clear to you. | 17 | ** not clear to you. |
18 | ** | 18 | ** |
19 | **********************************************************************/ | 19 | **********************************************************************/ |
20 | 20 | ||
21 | // changes by Maximilian Reiss <harlekin@handhelds.org> | ||
22 | |||
21 | #include "zonemap.h" | 23 | #include "zonemap.h" |
22 | #include "citytime.h" | 24 | #include "citytime.h" |
23 | 25 | ||
24 | #include <qpe/qpeapplication.h> | 26 | #include <qpe/qpeapplication.h> |
25 | #include <qpe/config.h> | 27 | #include <qpe/config.h> |
26 | #include <qpe/timestring.h> | 28 | #include <qpe/timestring.h> |
27 | #include <qpe/tzselect.h> | 29 | #include <qpe/tzselect.h> |
28 | #if ( defined Q_WS_QWS || defined(_WS_QWS_) ) && !defined(QT_NO_COP) | 30 | #if ( defined Q_WS_QWS || defined(_WS_QWS_) ) && !defined(QT_NO_COP) |
29 | #include <qpe/qcopenvelope_qws.h> | 31 | #include <qpe/qcopenvelope_qws.h> |
30 | #endif | 32 | #endif |
31 | 33 | ||
32 | |||
33 | #include <qdir.h> | 34 | #include <qdir.h> |
34 | #include <qfile.h> | 35 | #include <qfile.h> |
35 | #include <qlabel.h> | 36 | #include <qlabel.h> |
36 | #include <qmessagebox.h> | 37 | #include <qmessagebox.h> |
37 | #include <qregexp.h> | 38 | #include <qregexp.h> |
38 | #include <qtextstream.h> | 39 | #include <qtextstream.h> |
39 | #include <qtoolbutton.h> | 40 | #include <qtoolbutton.h> |
41 | #include <qlayout.h> | ||
40 | 42 | ||
41 | #include <stdlib.h> | 43 | #include <stdlib.h> |
42 | 44 | ||
43 | CityTime::CityTime( QWidget *parent, const char* name, | 45 | CityTime::CityTime( QWidget *parent, const char* name, |
44 | WFlags fl ) | 46 | WFlags fl ) |
45 | : CityTimeBase( parent, name, fl ), | 47 | : CityTimeBase( parent, name, fl ), |
46 | strRealTz(0), | 48 | strRealTz(0), |
47 | bAdded(false) | 49 | bAdded(false) |
48 | { | 50 | { |
49 | Config config( "qpe" ); | 51 | Config config( "qpe" ); |
50 | bWhichClock = config.readBoolEntry( "AMPM", TRUE ); | 52 | bWhichClock = config.readBoolEntry( "AMPM", TRUE ); |
51 | frmMap->changeClock( bWhichClock ); | 53 | frmMap->changeClock( bWhichClock ); |
52 | 54 | ||
53 | char *pEnv; | 55 | char *pEnv; |
54 | pEnv = NULL; | 56 | pEnv = NULL; |
55 | pEnv = getenv("TZ"); | 57 | pEnv = getenv("TZ"); |
56 | if ( pEnv ) | 58 | if ( pEnv ) |
57 | strRealTz = pEnv; | 59 | strRealTz = pEnv; |
58 | pEnv = NULL; | 60 | pEnv = NULL; |
59 | pEnv = getenv("HOME"); | 61 | pEnv = getenv("HOME"); |
60 | if ( pEnv ) | 62 | if ( pEnv ) |
61 | strHome = pEnv; | 63 | strHome = pEnv; |
62 | // append the labels to their respective lists... | 64 | // append the labels to their respective lists... |
63 | listCities.setAutoDelete( true ); | 65 | listCities.setAutoDelete( true ); |
64 | listTimes.setAutoDelete( true ); | 66 | listTimes.setAutoDelete( true ); |
65 | 67 | ||
66 | listCities.append( cmdCity1 ); | 68 | listCities.append( cmdCity1 ); |
67 | listCities.append( cmdCity2 ); | 69 | listCities.append( cmdCity2 ); |
68 | listCities.append( cmdCity3 ); | 70 | listCities.append( cmdCity3 ); |
69 | 71 | ||
70 | listTimes.append( lblCTime1 ); | 72 | listTimes.append( lblCTime1 ); |
71 | listTimes.append( lblCTime2 ); | 73 | listTimes.append( lblCTime2 ); |
72 | listTimes.append( lblCTime3 ); | 74 | listTimes.append( lblCTime3 ); |
73 | 75 | ||
74 | 76 | ||
75 | // kludgy way of getting the screen size so we don't have to depend | 77 | // kludgy way of getting the screen size so we don't have to depend |
76 | // on a resize event... | 78 | // on a resize event... |
77 | QWidget *d = QApplication::desktop(); | 79 | QWidget *d = QApplication::desktop(); |
78 | if ( d->width() < d->height() ) { | 80 | if ( d->width() < d->height() ) { |
79 | // append for that 4 down look | 81 | // append for that 4 down look |
80 | |||
81 | listCities.append( cmdCity4 ); | 82 | listCities.append( cmdCity4 ); |
82 | listCities.append( cmdCity5 ); | 83 | listCities.append( cmdCity5 ); |
83 | listCities.append( cmdCity6 ); | 84 | listCities.append( cmdCity6 ); |
84 | listTimes.append( lblCTime4 ); | 85 | listTimes.append( lblCTime4 ); |
85 | listTimes.append( lblCTime5 ); | 86 | listTimes.append( lblCTime5 ); |
86 | listTimes.append( lblCTime6 ); | 87 | listTimes.append( lblCTime6 ); |
87 | lblCTime7->hide(); | 88 | lblCTime7->hide(); |
88 | lblCTime8->hide(); | 89 | lblCTime8->hide(); |
89 | lblCTime9->hide(); | 90 | lblCTime9->hide(); |
90 | cmdCity7->hide(); | 91 | cmdCity7->hide(); |
91 | cmdCity8->hide(); | 92 | cmdCity8->hide(); |
92 | cmdCity9->hide(); | 93 | cmdCity9->hide(); |
93 | } else { | 94 | } else { |
94 | listCities.append( cmdCity7 ); | 95 | listCities.append( cmdCity7 ); |
95 | listCities.append( cmdCity8 ); | 96 | listCities.append( cmdCity8 ); |
96 | listCities.append( cmdCity9 ); | 97 | listCities.append( cmdCity9 ); |
97 | listTimes.append( lblCTime7 ); | 98 | listTimes.append( lblCTime7 ); |
98 | listTimes.append( lblCTime8 ); | 99 | listTimes.append( lblCTime8 ); |
99 | listTimes.append( lblCTime9 ); | 100 | listTimes.append( lblCTime9 ); |
100 | lblCTime4->hide(); | 101 | lblCTime4->hide(); |
101 | lblCTime5->hide(); | 102 | lblCTime5->hide(); |
102 | lblCTime6->hide(); | 103 | lblCTime6->hide(); |
103 | cmdCity4->hide(); | 104 | cmdCity4->hide(); |
104 | cmdCity5->hide(); | 105 | cmdCity5->hide(); |
105 | cmdCity6->hide(); | 106 | cmdCity6->hide(); |
106 | } | 107 | } |
108 | |||
109 | selWidget = frmMap->selectionWidget( this ); | ||
110 | selWidget->hide(); | ||
111 | CityTimeBaseLayout->addWidget( selWidget ); | ||
107 | bAdded = true; | 112 | bAdded = true; |
108 | readInTimes(); | 113 | readInTimes(); |
109 | changed = FALSE; | 114 | changed = FALSE; |
110 | QObject::connect( qApp, SIGNAL( clockChanged(bool) ), | 115 | QObject::connect( qApp, SIGNAL( clockChanged( bool ) ), |
111 | this, SLOT( changeClock(bool) ) ); | 116 | this, SLOT( changeClock( bool ) ) ); |
112 | // now start the timer so we can update the time quickly every second | 117 | // now start the timer so we can update the time quickly every second |
113 | timerEvent( 0 ); | 118 | timerEvent( 0 ); |
114 | } | 119 | } |
115 | 120 | ||
116 | CityTime::~CityTime() | 121 | CityTime::~CityTime() |
117 | { | 122 | { |
118 | if ( changed ) { | 123 | if ( changed ) { |
119 | Config cfg("CityTime"); | 124 | Config cfg("CityTime"); |
120 | cfg.setGroup("TimeZones"); | 125 | cfg.setGroup("TimeZones"); |
121 | QListIterator<QToolButton> itCity( listCities ); | 126 | QListIterator<QToolButton> itCity( listCities ); |
122 | int i; | 127 | int i; |
123 | bool realTzWritten = FALSE; | 128 | bool realTzWritten = FALSE; |
124 | for ( i = 0, itCity.toFirst(); i < CITIES; i++, ++itCity ) { | 129 | for ( i = 0, itCity.toFirst(); i < CITIES; i++, ++itCity ) { |
125 | if ( !strCityTz[i].isNull() ) { | 130 | if ( !strCityTz[i].isNull() ) { |
126 | cfg.writeEntry("Zone"+QString::number(i), strCityTz[i]); | 131 | cfg.writeEntry("Zone"+QString::number(i), strCityTz[i]); |
127 | cfg.writeEntry("ZoneName"+QString::number(i), itCity.current()->text()); | 132 | cfg.writeEntry("ZoneName"+QString::number(i), itCity.current()->text()); |
128 | if ( strCityTz[i] == strRealTz ) | 133 | if ( strCityTz[i] == strRealTz ) |
129 | realTzWritten = TRUE; | 134 | realTzWritten = TRUE; |
130 | } | 135 | } |
131 | } | 136 | } |
132 | if ( realTzWritten ) { | 137 | if ( realTzWritten ) { |
133 | cfg.removeEntry("Zone"+QString::number(CITIES)); | 138 | cfg.removeEntry("Zone"+QString::number(CITIES)); |
134 | cfg.removeEntry("ZoneName"+QString::number(CITIES)); | 139 | cfg.removeEntry("ZoneName"+QString::number(CITIES)); |
135 | } else { | 140 | } else { |
136 | cfg.writeEntry("Zone"+QString::number(CITIES), strRealTz); | 141 | cfg.writeEntry("Zone"+QString::number(CITIES), strRealTz); |
137 | if ( nameRealTz.isEmpty() ) { | 142 | if ( nameRealTz.isEmpty() ) { |
138 | int i = strRealTz.find( '/' ); | 143 | int i = strRealTz.find( '/' ); |
139 | nameRealTz = strRealTz.mid( i+1 ); | 144 | nameRealTz = strRealTz.mid( i+1 ); |
140 | } | 145 | } |
141 | cfg.writeEntry("ZoneName"+QString::number(CITIES), nameRealTz); | 146 | cfg.writeEntry("ZoneName"+QString::number(CITIES), nameRealTz); |
142 | } | 147 | } |
143 | QCopEnvelope ( "QPE/System", "timeZoneListChange()" ); | 148 | QCopEnvelope ( "QPE/System", "timeZoneListChange()" ); |
144 | 149 | ||
145 | changed = FALSE; | 150 | changed = FALSE; |
146 | } | 151 | } |
147 | // restore the timezone, just in case we messed with it and | 152 | // restore the timezone, just in case we messed with it and |
148 | // are destroyed at an inoppurtune moment | 153 | // are destroyed at an inoppurtune moment |
149 | if ( !strRealTz.isNull() ) { | 154 | if ( !strRealTz.isNull() ) { |
150 | // this should be checked, but there is not much that can done at this | 155 | // this should be checked, but there is not much that can done at this |
151 | //point if it fails | 156 | //point if it fails |
152 | setenv( "TZ", strRealTz, true ); | 157 | setenv( "TZ", strRealTz, true ); |
153 | } | 158 | } |
154 | } | 159 | } |
155 | 160 | ||
156 | void CityTime::timerEvent( QTimerEvent *e ) | 161 | void CityTime::timerEvent( QTimerEvent *e ) |
157 | { | 162 | { |
158 | if ( e ) | 163 | if ( e ) |
159 | killTimer( timerId ); | 164 | killTimer( timerId ); |
160 | // change the time again!! | 165 | // change the time again!! |
161 | showTime(); | 166 | showTime(); |
162 | int ms = 1000 - QTime::currentTime().msec(); | 167 | int ms = 1000 - QTime::currentTime().msec(); |
163 | timerId = startTimer( ms ); | 168 | timerId = startTimer( ms ); |
164 | } | 169 | } |
165 | 170 | ||
166 | void CityTime::mousePressEvent( QMouseEvent * ) | 171 | void CityTime::mousePressEvent( QMouseEvent * ) |
167 | { | 172 | { |
168 | // DEBUG enable this to get a look at the zone information DEBUG | 173 | // DEBUG enable this to get a look at the zone information DEBUG |
169 | // frmMap->showZones(); | 174 | // frmMap->showZones(); |
170 | } | 175 | } |
171 | 176 | ||
172 | void CityTime::showTime( void ) | 177 | void CityTime::showTime( void ) |
173 | { | 178 | { |
174 | int i; | 179 | int i; |
175 | QListIterator<QLabel> itTime(listTimes); | 180 | QListIterator<QLabel> itTime(listTimes); |
176 | 181 | ||
177 | // traverse the list... | 182 | // traverse the list... |
178 | for ( i = 0, itTime.toFirst(); i < CITIES; i++, ++itTime) { | 183 | for ( i = 0, itTime.toFirst(); i < CITIES; i++, ++itTime) { |
179 | if ( !strCityTz[i].isNull() ) { | 184 | if ( !strCityTz[i].isNull() ) { |
180 | if ( setenv( "TZ", strCityTz[i], true ) == 0 ) { | 185 | if ( setenv( "TZ", strCityTz[i], true ) == 0 ) { |
181 | itTime.current()->setText( TimeString::shortTime(bWhichClock) ); | 186 | itTime.current()->setText( TimeString::shortTime(bWhichClock) ); |
182 | } else { | 187 | } else { |
183 | QMessageBox::critical( this, tr( "Time Changing" ), | 188 | QMessageBox::critical( this, tr( "Time Changing" ), |
184 | tr( "There was a problem setting timezone %1" ) | 189 | tr( "There was a problem setting timezone %1" ) |
185 | .arg( QString::number( i + 1 ) ) ); | 190 | .arg( QString::number( i + 1 ) ) ); |
186 | } | 191 | } |
187 | } | 192 | } |
188 | } | 193 | } |
189 | // done playing around... put it all back | 194 | // done playing around... put it all back |
190 | unsetenv( "TZ" ); | 195 | unsetenv( "TZ" ); |
191 | if ( !strRealTz.isNull() ) { | 196 | if ( !strRealTz.isNull() ) { |
192 | if ( setenv( "TZ", strRealTz, true ) != 0 ) { | 197 | if ( setenv( "TZ", strRealTz, true ) != 0 ) { |
193 | QMessageBox::critical( this, tr( "Restore Time Zone" ), | 198 | QMessageBox::critical( this, tr( "Restore Time Zone" ), |
194 | tr( "There was a problem setting your timezone." | 199 | tr( "There was a problem setting your timezone." |
195 | "Your time may be wrong now..." ) ); | 200 | "Your time may be wrong now..." ) ); |
196 | } | 201 | } |
197 | } | 202 | } |
198 | } | 203 | } |
199 | 204 | ||
200 | void CityTime::beginNewTz() | 205 | void CityTime::beginNewTz() |
201 | { | 206 | { |
207 | buttonWidget->hide(); | ||
202 | frmMap->setFocus(); | 208 | frmMap->setFocus(); |
209 | selWidget->show(); | ||
210 | // CityTimeBaseLayout->addWidget( selWidget ); | ||
203 | } | 211 | } |
204 | 212 | ||
205 | void CityTime::slotNewTz( const QString & strNewCountry, | 213 | void CityTime::slotNewTz( const QString & strNewCountry, |
206 | const QString & strNewCity ) | 214 | const QString & strNewCity ) |
207 | { | 215 | { |
208 | // determine what to do based on what putton is pressed... | 216 | // determine what to do based on what putton is pressed... |
209 | QListIterator<QToolButton> itCity(listCities); | 217 | QListIterator<QToolButton> itCity(listCities); |
210 | int i; | 218 | int i; |
211 | // go through the list and make adjustments based on which button is on | 219 | // go through the list and make adjustments based on which button is on |
212 | for ( i = 0, itCity.toFirst(); itCity.current(), i < CITIES; i++, ++itCity ) { | 220 | for ( i = 0, itCity.toFirst(); itCity.current(), i < CITIES; i++, ++itCity ) { |
213 | QToolButton *cmdTmp = itCity.current(); | 221 | QToolButton *cmdTmp = itCity.current(); |
214 | if ( cmdTmp->isOn() ) { | 222 | if ( cmdTmp->isOn() ) { |
215 | strCityTz[i] = strNewCountry + strNewCity; | 223 | strCityTz[i] = strNewCountry + strNewCity; |
216 | QString s = strNewCity; | 224 | QString s = strNewCity; |
217 | cmdTmp->setText( s.replace( QRegExp("_"), " " ) ); | 225 | cmdTmp->setText( s.replace( QRegExp("_"), " " ) ); |
218 | cmdTmp->toggle(); | 226 | cmdTmp->toggle(); |
219 | // we can actually break, since there is only one button | 227 | // we can actually break, since there is only one button |
220 | // that is ever pressed! | 228 | // that is ever pressed! |
221 | changed = TRUE; | 229 | changed = TRUE; |
222 | break; | 230 | break; |
223 | } | 231 | } |
224 | } | 232 | } |
225 | showTime(); | 233 | showTime(); |
234 | buttonWidget->show(); | ||
235 | selWidget->hide(); | ||
226 | } | 236 | } |
227 | 237 | ||
228 | void CityTime::readInTimes( void ) | 238 | void CityTime::readInTimes( void ) |
229 | { | 239 | { |
230 | Config cfg("CityTime"); | 240 | Config cfg("CityTime"); |
231 | cfg.setGroup("TimeZones"); | 241 | cfg.setGroup("TimeZones"); |
232 | QListIterator<QToolButton> itCity( listCities ); | 242 | QListIterator<QToolButton> itCity( listCities ); |
233 | int i=0; | 243 | int i=0; |
234 | nameRealTz = QString::null; | 244 | nameRealTz = QString::null; |
235 | QString zn; | 245 | QString zn; |
236 | for ( ; i < CITIES ; i++ ) { | 246 | for ( ; i < CITIES ; i++ ) { |
237 | zn = cfg.readEntry("Zone"+QString::number(i), QString::null); | 247 | zn = cfg.readEntry("Zone"+QString::number(i), QString::null); |
238 | if ( zn.isNull() ) | 248 | if ( zn.isNull() ) |
239 | break; | 249 | break; |
240 | QString nm = cfg.readEntry("ZoneName"+QString::number(i)); | 250 | QString nm = cfg.readEntry("ZoneName"+QString::number(i)); |
241 | strCityTz[i] = zn; | 251 | strCityTz[i] = zn; |
242 | itCity.current()->setText(nm); | 252 | itCity.current()->setText(nm); |
243 | if ( zn == strRealTz ) | 253 | if ( zn == strRealTz ) |
244 | nameRealTz = nm; | 254 | nameRealTz = nm; |
245 | ++itCity; | 255 | ++itCity; |
246 | } | 256 | } |
247 | if ( i == 0 ) { | 257 | if ( i == 0 ) { |
248 | // write in our own in a shameless self promotion and some humor | 258 | // write in our own in a shameless self promotion and some humor |
249 | QStringList list = timezoneDefaults(); | 259 | QStringList list = timezoneDefaults(); |
250 | int i; | 260 | int i; |
251 | QStringList::Iterator it = list.begin(); | 261 | QStringList::Iterator it = list.begin(); |
252 | for ( i = 0, itCity.toFirst(); i < CITIES && itCity.current(); | 262 | for ( i = 0, itCity.toFirst(); i < CITIES && itCity.current(); |
253 | i++, ++itCity ) { | 263 | i++, ++itCity ) { |
254 | strCityTz[i] = *it++; | 264 | strCityTz[i] = *it++; |
255 | itCity.current()->setText( *it++ ); | 265 | itCity.current()->setText( *it++ ); |
256 | } | 266 | } |
257 | } | 267 | } |
258 | if ( nameRealTz.isEmpty() ) { | 268 | if ( nameRealTz.isEmpty() ) { |
259 | //remember the current time zone even if we don't have room | 269 | //remember the current time zone even if we don't have room |
260 | //to show it. | 270 | //to show it. |
261 | zn = cfg.readEntry("Zone"+QString::number(CITIES), QString::null); | 271 | zn = cfg.readEntry("Zone"+QString::number(CITIES), QString::null); |
262 | if ( zn == strRealTz ) | 272 | if ( zn == strRealTz ) |
263 | nameRealTz = cfg.readEntry("ZoneName"+QString::number(CITIES)); | 273 | nameRealTz = cfg.readEntry("ZoneName"+QString::number(CITIES)); |
264 | i++; | 274 | i++; |
265 | } | 275 | } |
266 | } | 276 | } |
267 | 277 | ||
268 | void CityTime::changeClock( bool newClock ) | 278 | void CityTime::changeClock( bool newClock ) |
269 | { | 279 | { |
270 | bWhichClock = newClock; | 280 | bWhichClock = newClock; |
271 | showTime(); | 281 | showTime(); |
272 | } | 282 | } |
diff --git a/core/settings/citytime/citytime.h b/core/settings/citytime/citytime.h index 5a2c4d8..63e3102 100644 --- a/core/settings/citytime/citytime.h +++ b/core/settings/citytime/citytime.h | |||
@@ -1,66 +1,68 @@ | |||
1 | /********************************************************************** | 1 | /********************************************************************** |
2 | ** Copyright (C) 2000 Trolltech AS. All rights reserved. | 2 | ** Copyright (C) 2000 Trolltech AS. All rights reserved. |
3 | ** | 3 | ** |
4 | ** This file is part of Qtopia Environment. | 4 | ** This file is part of Qtopia Environment. |
5 | ** | 5 | ** |
6 | ** This file may be distributed and/or modified under the terms of the | 6 | ** This file may be distributed and/or modified under the terms of the |
7 | ** GNU General Public License version 2 as published by the Free Software | 7 | ** GNU General Public License version 2 as published by the Free Software |
8 | ** Foundation and appearing in the file LICENSE.GPL included in the | 8 | ** Foundation and appearing in the file LICENSE.GPL included in the |
9 | ** packaging of this file. | 9 | ** packaging of this file. |
10 | ** | 10 | ** |
11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE | 11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE |
12 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | 12 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
13 | ** | 13 | ** |
14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | 14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. |
15 | ** | 15 | ** |
16 | ** Contact info@trolltech.com if any conditions of this licensing are | 16 | ** Contact info@trolltech.com if any conditions of this licensing are |
17 | ** not clear to you. | 17 | ** not clear to you. |
18 | ** | 18 | ** |
19 | **********************************************************************/ | 19 | **********************************************************************/ |
20 | 20 | ||
21 | #ifndef TIMEWIDGETIMPL_H | 21 | #ifndef TIMEWIDGETIMPL_H |
22 | #define TIMEWIDGETIMPL_H | 22 | #define TIMEWIDGETIMPL_H |
23 | 23 | ||
24 | #include <qlist.h> | 24 | #include <qlist.h> |
25 | #include <qwidget.h> | 25 | #include <qwidget.h> |
26 | 26 | ||
27 | #include "citytimebase.h" | 27 | #include "citytimebase.h" |
28 | 28 | ||
29 | const int CITIES = 6; // the number of cities... | 29 | const int CITIES = 6; // the number of cities... |
30 | 30 | ||
31 | class ZoneMap; | 31 | class ZoneMap; |
32 | 32 | ||
33 | class CityTime : public CityTimeBase | 33 | class CityTime : public CityTimeBase |
34 | { | 34 | { |
35 | Q_OBJECT | 35 | Q_OBJECT |
36 | public: | 36 | public: |
37 | CityTime(QWidget* parent = 0, const char *name = 0, WFlags fl = 0); | 37 | CityTime(QWidget* parent = 0, const char *name = 0, WFlags fl = 0); |
38 | ~CityTime(); | 38 | ~CityTime(); |
39 | 39 | ||
40 | public slots: | 40 | public slots: |
41 | void beginNewTz(); | 41 | void beginNewTz(); |
42 | void slotNewTz( const QString& strNewCountry, const QString& strNewCity ); | 42 | void slotNewTz( const QString& strNewCountry, const QString& strNewCity ); |
43 | void changeClock( bool newClock ); | 43 | void changeClock( bool newClock ); |
44 | 44 | ||
45 | protected: | 45 | protected: |
46 | void timerEvent( QTimerEvent* ); | 46 | void timerEvent( QTimerEvent* ); |
47 | void mousePressEvent( QMouseEvent* event ); | 47 | void mousePressEvent( QMouseEvent* event ); |
48 | 48 | ||
49 | private: | 49 | private: |
50 | void showTime( void ); // get and show the time for various places... | 50 | void showTime( void ); // get and show the time for various places... |
51 | void readInTimes( void ); // a method to get information from the config | 51 | void readInTimes( void ); // a method to get information from the config |
52 | QString strRealTz; // save the TZ var | 52 | QString strRealTz; // save the TZ var |
53 | QString nameRealTz; // and what it is called | 53 | QString nameRealTz; // and what it is called |
54 | QString strHome; // the home variable... | 54 | QString strHome; // the home variable... |
55 | bool bAdded; // a flag to indicate things have been added... | 55 | bool bAdded; // a flag to indicate things have been added... |
56 | bool bWhichClock; | 56 | bool bWhichClock; |
57 | int timerId; | 57 | int timerId; |
58 | 58 | ||
59 | |||
60 | QWidget* selWidget; | ||
59 | // a spot to hold the time zone for each city | 61 | // a spot to hold the time zone for each city |
60 | QString strCityTz[CITIES]; | 62 | QString strCityTz[CITIES]; |
61 | QList<QToolButton> listCities; | 63 | QList<QToolButton> listCities; |
62 | QList<QLabel> listTimes; | 64 | QList<QLabel> listTimes; |
63 | bool changed; | 65 | bool changed; |
64 | }; | 66 | }; |
65 | 67 | ||
66 | #endif | 68 | #endif |
diff --git a/core/settings/citytime/citytime.pro b/core/settings/citytime/citytime.pro index 4b0b3ff..52ba3b6 100644 --- a/core/settings/citytime/citytime.pro +++ b/core/settings/citytime/citytime.pro | |||
@@ -1,26 +1,26 @@ | |||
1 | # $Id$ | 1 | #CONFIG += qt warn_on release |
2 | CONFIG += qt warn_on release | 2 | CONFIG += qt warn_on debug |
3 | TEMPLATE = app | 3 | TEMPLATE = app |
4 | DESTDIR = $(OPIEDIR)/bin | 4 | DESTDIR = $(OPIEDIR)/bin |
5 | INTERFACES = citytimebase.ui | 5 | #INTERFACES = citytimebase.ui |
6 | HEADERS = citytime.h zonemap.h sun.h stylusnormalizer.h | 6 | HEADERS = citytime.h citytimebase.h zonemap.h sun.h stylusnormalizer.h |
7 | SOURCES = citytime.cpp zonemap.cpp main.cpp sun.c stylusnormalizer.cpp | 7 | SOURCES = citytime.cpp citytimebase.cpp zonemap.cpp main.cpp sun.c stylusnormalizer.cpp |
8 | TARGET = citytime | 8 | TARGET = citytime |
9 | INCLUDEPATH += $(OPIEDIR)/include | 9 | INCLUDEPATH += $(OPIEDIR)/include |
10 | DEPENDPATH += $(OPIEDIR)/include | 10 | DEPENDPATH += $(OPIEDIR)/include |
11 | LIBS += -lqpe | 11 | LIBS += -lqpe |
12 | 12 | ||
13 | TRANSLATIONS = ../../../i18n/de/citytime.ts \ | 13 | TRANSLATIONS = ../../../i18n/de/citytime.ts \ |
14 | ../../../i18n/en/citytime.ts \ | 14 | ../../../i18n/en/citytime.ts \ |
15 | ../../../i18n/es/citytime.ts \ | 15 | ../../../i18n/es/citytime.ts \ |
16 | ../../../i18n/fr/citytime.ts \ | 16 | ../../../i18n/fr/citytime.ts \ |
17 | ../../../i18n/hu/citytime.ts \ | 17 | ../../../i18n/hu/citytime.ts \ |
18 | ../../../i18n/ja/citytime.ts \ | 18 | ../../../i18n/ja/citytime.ts \ |
19 | ../../../i18n/ko/citytime.ts \ | 19 | ../../../i18n/ko/citytime.ts \ |
20 | ../../../i18n/no/citytime.ts \ | 20 | ../../../i18n/no/citytime.ts \ |
21 | ../../../i18n/pl/citytime.ts \ | 21 | ../../../i18n/pl/citytime.ts \ |
22 | ../../../i18n/pt/citytime.ts \ | 22 | ../../../i18n/pt/citytime.ts \ |
23 | ../../../i18n/pt_BR/citytime.ts \ | 23 | ../../../i18n/pt_BR/citytime.ts \ |
24 | ../../../i18n/sl/citytime.ts \ | 24 | ../../../i18n/sl/citytime.ts \ |
25 | ../../../i18n/zh_CN/citytime.ts \ | 25 | ../../../i18n/zh_CN/citytime.ts \ |
26 | ../../../i18n/zh_TW/citytime.ts | 26 | ../../../i18n/zh_TW/citytime.ts |
diff --git a/core/settings/citytime/citytimebase.cpp b/core/settings/citytime/citytimebase.cpp new file mode 100644 index 0000000..d734cf3 --- a/dev/null +++ b/core/settings/citytime/citytimebase.cpp | |||
@@ -0,0 +1,414 @@ | |||
1 | |||
2 | |||
3 | // changes by Maximilian Reiss <harlekin@handhelds.org> | ||
4 | |||
5 | #include "citytimebase.h" | ||
6 | |||
7 | #include <qlabel.h> | ||
8 | #include <qpushbutton.h> | ||
9 | #include <qtoolbutton.h> | ||
10 | #include "zonemap.h" | ||
11 | #include <qlayout.h> | ||
12 | #include <qvariant.h> | ||
13 | #include <qtooltip.h> | ||
14 | #include <qwhatsthis.h> | ||
15 | |||
16 | |||
17 | /* | ||
18 | * Constructs a CityTimeBase which is a child of 'parent', with the | ||
19 | * name 'name' and widget flags set to 'f' | ||
20 | */ | ||
21 | CityTimeBase::CityTimeBase( QWidget* parent, const char* name, WFlags ) | ||
22 | : QWidget( parent, name, WStyle_ContextHelp ) | ||
23 | { | ||
24 | if ( !name ) | ||
25 | setName( "CityTimeBase" ); | ||
26 | setCaption( tr( "City Time" ) ); | ||
27 | CityTimeBaseLayout = new QVBoxLayout( this ); | ||
28 | CityTimeBaseLayout->setSpacing( 3 ); | ||
29 | CityTimeBaseLayout->setMargin( 0 ); | ||
30 | |||
31 | frmMap = new ZoneMap( this, "frmMap" ); | ||
32 | frmMap->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)7, frmMap->sizePolicy().hasHeightForWidth() ) ); | ||
33 | CityTimeBaseLayout->addWidget( frmMap ); | ||
34 | |||
35 | buttonWidget = new QWidget( this ); | ||
36 | QWhatsThis::add( buttonWidget, tr( "Click on one of the set cities to replace it" ) ); | ||
37 | Layout2 = new QGridLayout( buttonWidget ); | ||
38 | Layout2->setSpacing( 3 ); | ||
39 | Layout2->setMargin( 4 ); | ||
40 | |||
41 | cmdCity7 = new QToolButton( buttonWidget, "cmdCity7" ); | ||
42 | cmdCity7->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)1, cmdCity7->sizePolicy().hasHeightForWidth() ) ); | ||
43 | QFont cmdCity7_font( cmdCity7->font() ); | ||
44 | cmdCity7_font.setBold( TRUE ); | ||
45 | cmdCity7->setFont( cmdCity7_font ); | ||
46 | cmdCity7->setFocusPolicy( QToolButton::TabFocus ); | ||
47 | cmdCity7->setText( tr( "" ) ); | ||
48 | cmdCity7->setToggleButton( TRUE ); | ||
49 | cmdCity7->setToggleButton( TRUE ); | ||
50 | |||
51 | Layout2->addWidget( cmdCity7, 0, 2 ); | ||
52 | |||
53 | lblCTime9 = new QLabel( buttonWidget, "lblCTime9" ); | ||
54 | lblCTime9->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)1, lblCTime9->sizePolicy().hasHeightForWidth() ) ); | ||
55 | QFont lblCTime9_font( lblCTime9->font() ); | ||
56 | lblCTime9_font.setPointSize( 10 ); | ||
57 | lblCTime9->setFont( lblCTime9_font ); | ||
58 | lblCTime9->setText( tr( "" ) ); | ||
59 | lblCTime9->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) ); | ||
60 | |||
61 | Layout2->addWidget( lblCTime9, 2, 3 ); | ||
62 | |||
63 | cmdCity8 = new QToolButton( buttonWidget, "cmdCity8" ); | ||
64 | cmdCity8->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)1, cmdCity8->sizePolicy().hasHeightForWidth() ) ); | ||
65 | QFont cmdCity8_font( cmdCity8->font() ); | ||
66 | cmdCity8_font.setBold( TRUE ); | ||
67 | cmdCity8->setFont( cmdCity8_font ); | ||
68 | cmdCity8->setFocusPolicy( QToolButton::TabFocus ); | ||
69 | cmdCity8->setText( tr( "" ) ); | ||
70 | cmdCity8->setToggleButton( TRUE ); | ||
71 | cmdCity8->setToggleButton( TRUE ); | ||
72 | |||
73 | Layout2->addWidget( cmdCity8, 1, 2 ); | ||
74 | |||
75 | cmdCity2 = new QToolButton( buttonWidget, "cmdCity2" ); | ||
76 | QFont cmdCity2_font( cmdCity2->font() ); | ||
77 | cmdCity2_font.setBold( TRUE ); | ||
78 | cmdCity2->setFont( cmdCity2_font ); | ||
79 | cmdCity2->setFocusPolicy( QToolButton::TabFocus ); | ||
80 | cmdCity2->setText( tr( "" ) ); | ||
81 | cmdCity2->setToggleButton( TRUE ); | ||
82 | cmdCity2->setToggleButton( TRUE ); | ||
83 | |||
84 | Layout2->addWidget( cmdCity2, 1, 0 ); | ||
85 | |||
86 | lblCTime6 = new QLabel( buttonWidget, "lblCTime6" ); | ||
87 | QFont lblCTime6_font( lblCTime6->font() ); | ||
88 | lblCTime6_font.setPointSize( 10 ); | ||
89 | lblCTime6->setFont( lblCTime6_font ); | ||
90 | lblCTime6->setText( tr( "" ) ); | ||
91 | lblCTime6->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) ); | ||
92 | |||
93 | Layout2->addWidget( lblCTime6, 5, 1 ); | ||
94 | |||
95 | cmdCity6 = new QToolButton( buttonWidget, "cmdCity6" ); | ||
96 | cmdCity6->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)1, cmdCity6->sizePolicy().hasHeightForWidth() ) ); | ||
97 | QFont cmdCity6_font( cmdCity6->font() ); | ||
98 | cmdCity6_font.setBold( TRUE ); | ||
99 | cmdCity6->setFont( cmdCity6_font ); | ||
100 | cmdCity6->setFocusPolicy( QToolButton::TabFocus ); | ||
101 | cmdCity6->setText( tr( "" ) ); | ||
102 | cmdCity6->setToggleButton( TRUE ); | ||
103 | cmdCity6->setToggleButton( TRUE ); | ||
104 | |||
105 | Layout2->addWidget( cmdCity6, 5, 0 ); | ||
106 | |||
107 | cmdCity4 = new QToolButton( buttonWidget, "cmdCity4" ); | ||
108 | cmdCity4->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)1, cmdCity4->sizePolicy().hasHeightForWidth() ) ); | ||
109 | QFont cmdCity4_font( cmdCity4->font() ); | ||
110 | cmdCity4_font.setBold( TRUE ); | ||
111 | cmdCity4->setFont( cmdCity4_font ); | ||
112 | cmdCity4->setFocusPolicy( QToolButton::TabFocus ); | ||
113 | cmdCity4->setText( tr( "" ) ); | ||
114 | cmdCity4->setToggleButton( TRUE ); | ||
115 | cmdCity4->setToggleButton( TRUE ); | ||
116 | |||
117 | Layout2->addWidget( cmdCity4, 3, 0 ); | ||
118 | |||
119 | lblCTime5 = new QLabel( buttonWidget, "lblCTime5" ); | ||
120 | QFont lblCTime5_font( lblCTime5->font() ); | ||
121 | lblCTime5_font.setPointSize( 10 ); | ||
122 | lblCTime5->setFont( lblCTime5_font ); | ||
123 | lblCTime5->setText( tr( "" ) ); | ||
124 | lblCTime5->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) ); | ||
125 | |||
126 | Layout2->addWidget( lblCTime5, 4, 1 ); | ||
127 | |||
128 | lblCTime2 = new QLabel( buttonWidget, "lblCTime2" ); | ||
129 | lblCTime2->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)1, (QSizePolicy::SizeType)1, lblCTime2->sizePolicy().hasHeightForWidth() ) ); | ||
130 | QFont lblCTime2_font( lblCTime2->font() ); | ||
131 | lblCTime2_font.setPointSize( 10 ); | ||
132 | lblCTime2->setFont( lblCTime2_font ); | ||
133 | lblCTime2->setText( tr( "" ) ); | ||
134 | lblCTime2->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) ); | ||
135 | |||
136 | Layout2->addWidget( lblCTime2, 1, 1 ); | ||
137 | |||
138 | lblCTime1 = new QLabel( buttonWidget, "lblCTime1" ); | ||
139 | lblCTime1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)1, (QSizePolicy::SizeType)1, lblCTime1->sizePolicy().hasHeightForWidth() ) ); | ||
140 | QFont lblCTime1_font( lblCTime1->font() ); | ||
141 | lblCTime1_font.setPointSize( 10 ); | ||
142 | lblCTime1->setFont( lblCTime1_font ); | ||
143 | lblCTime1->setText( tr( "" ) ); | ||
144 | lblCTime1->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) ); | ||
145 | |||
146 | Layout2->addWidget( lblCTime1, 0, 1 ); | ||
147 | |||
148 | cmdCity3 = new QToolButton( buttonWidget, "cmdCity3" ); | ||
149 | cmdCity3->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)1, cmdCity3->sizePolicy().hasHeightForWidth() ) ); | ||
150 | QFont cmdCity3_font( cmdCity3->font() ); | ||
151 | cmdCity3_font.setBold( TRUE ); | ||
152 | cmdCity3->setFont( cmdCity3_font ); | ||
153 | cmdCity3->setFocusPolicy( QToolButton::TabFocus ); | ||
154 | cmdCity3->setText( tr( "" ) ); | ||
155 | cmdCity3->setToggleButton( TRUE ); | ||
156 | cmdCity3->setToggleButton( TRUE ); | ||
157 | |||
158 | Layout2->addWidget( cmdCity3, 2, 0 ); | ||
159 | |||
160 | lblCTime8 = new QLabel( buttonWidget, "lblCTime8" ); | ||
161 | lblCTime8->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)1, lblCTime8->sizePolicy().hasHeightForWidth() ) ); | ||
162 | QFont lblCTime8_font( lblCTime8->font() ); | ||
163 | lblCTime8_font.setPointSize( 10 ); | ||
164 | lblCTime8->setFont( lblCTime8_font ); | ||
165 | lblCTime8->setText( tr( "" ) ); | ||
166 | lblCTime8->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) ); | ||
167 | |||
168 | Layout2->addWidget( lblCTime8, 1, 3 ); | ||
169 | |||
170 | cmdCity1 = new QToolButton( buttonWidget, "cmdCity1" ); | ||
171 | cmdCity1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)1, cmdCity1->sizePolicy().hasHeightForWidth() ) ); | ||
172 | QFont cmdCity1_font( cmdCity1->font() ); | ||
173 | cmdCity1_font.setBold( TRUE ); | ||
174 | cmdCity1->setFont( cmdCity1_font ); | ||
175 | cmdCity1->setFocusPolicy( QToolButton::TabFocus ); | ||
176 | cmdCity1->setText( tr( "" ) ); | ||
177 | cmdCity1->setToggleButton( TRUE ); | ||
178 | cmdCity1->setToggleButton( TRUE ); | ||
179 | |||
180 | Layout2->addWidget( cmdCity1, 0, 0 ); | ||
181 | |||
182 | lblCTime7 = new QLabel( buttonWidget, "lblCTime7" ); | ||
183 | lblCTime7->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)1, lblCTime7->sizePolicy().hasHeightForWidth() ) ); | ||
184 | QFont lblCTime7_font( lblCTime7->font() ); | ||
185 | lblCTime7_font.setPointSize( 10 ); | ||
186 | lblCTime7->setFont( lblCTime7_font ); | ||
187 | lblCTime7->setText( tr( "" ) ); | ||
188 | lblCTime7->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) ); | ||
189 | |||
190 | Layout2->addWidget( lblCTime7, 0, 3 ); | ||
191 | |||
192 | lblCTime4 = new QLabel( buttonWidget, "lblCTime4" ); | ||
193 | QFont lblCTime4_font( lblCTime4->font() ); | ||
194 | lblCTime4_font.setPointSize( 10 ); | ||
195 | lblCTime4->setFont( lblCTime4_font ); | ||
196 | lblCTime4->setText( tr( "" ) ); | ||
197 | lblCTime4->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) ); | ||
198 | |||
199 | Layout2->addWidget( lblCTime4, 3, 1 ); | ||
200 | |||
201 | cmdCity5 = new QToolButton( buttonWidget, "cmdCity5" ); | ||
202 | cmdCity5->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)1, cmdCity5->sizePolicy().hasHeightForWidth() ) ); | ||
203 | QFont cmdCity5_font( cmdCity5->font() ); | ||
204 | cmdCity5_font.setBold( TRUE ); | ||
205 | cmdCity5->setFont( cmdCity5_font ); | ||
206 | cmdCity5->setFocusPolicy( QToolButton::TabFocus ); | ||
207 | cmdCity5->setText( tr( "" ) ); | ||
208 | cmdCity5->setToggleButton( TRUE ); | ||
209 | cmdCity5->setToggleButton( TRUE ); | ||
210 | |||
211 | Layout2->addWidget( cmdCity5, 4, 0 ); | ||
212 | |||
213 | lblCTime3 = new QLabel( buttonWidget, "lblCTime3" ); | ||
214 | QFont lblCTime3_font( lblCTime3->font() ); | ||
215 | lblCTime3_font.setPointSize( 10 ); | ||
216 | lblCTime3->setFont( lblCTime3_font ); | ||
217 | lblCTime3->setText( tr( "" ) ); | ||
218 | lblCTime3->setAlignment( int( QLabel::AlignVCenter | QLabel::AlignRight ) ); | ||
219 | |||
220 | Layout2->addWidget( lblCTime3, 2, 1 ); | ||
221 | |||
222 | cmdCity9 = new QToolButton( buttonWidget, "cmdCity9" ); | ||
223 | cmdCity9->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)1, cmdCity9->sizePolicy().hasHeightForWidth() ) ); | ||
224 | QFont cmdCity9_font( cmdCity9->font() ); | ||
225 | cmdCity9_font.setBold( TRUE ); | ||
226 | cmdCity9->setFont( cmdCity9_font ); | ||
227 | cmdCity9->setFocusPolicy( QToolButton::TabFocus ); | ||
228 | cmdCity9->setText( tr( "" ) ); | ||
229 | cmdCity9->setToggleButton( TRUE ); | ||
230 | cmdCity9->setToggleButton( TRUE ); | ||
231 | |||
232 | Layout2->addWidget( cmdCity9, 2, 2 ); | ||
233 | CityTimeBaseLayout->addWidget( buttonWidget ); | ||
234 | |||
235 | // signals and slots connections | ||
236 | connect( frmMap, SIGNAL( signalTz(const QString &, const QString &) ), this, SLOT( slotNewTz(const QString &, const QString &) ) ); | ||
237 | connect( cmdCity1, SIGNAL( toggled(bool) ), cmdCity2, SLOT( setDisabled(bool) ) ); | ||
238 | connect( cmdCity1, SIGNAL( toggled(bool) ), cmdCity3, SLOT( setDisabled(bool) ) ); | ||
239 | connect( cmdCity1, SIGNAL( toggled(bool) ), cmdCity4, SLOT( setDisabled(bool) ) ); | ||
240 | connect( cmdCity1, SIGNAL( toggled(bool) ), cmdCity7, SLOT( setDisabled(bool) ) ); | ||
241 | connect( cmdCity1, SIGNAL( toggled(bool) ), cmdCity8, SLOT( setDisabled(bool) ) ); | ||
242 | connect( cmdCity2, SIGNAL( toggled(bool) ), cmdCity1, SLOT( setDisabled(bool) ) ); | ||
243 | connect( cmdCity2, SIGNAL( toggled(bool) ), cmdCity3, SLOT( setDisabled(bool) ) ); | ||
244 | connect( cmdCity2, SIGNAL( toggled(bool) ), cmdCity4, SLOT( setDisabled(bool) ) ); | ||
245 | connect( cmdCity4, SIGNAL( toggled(bool) ), cmdCity7, SLOT( setDisabled(bool) ) ); | ||
246 | connect( cmdCity2, SIGNAL( toggled(bool) ), cmdCity8, SLOT( setDisabled(bool) ) ); | ||
247 | connect( cmdCity2, SIGNAL( toggled(bool) ), cmdCity7, SLOT( setDisabled(bool) ) ); | ||
248 | connect( cmdCity3, SIGNAL( toggled(bool) ), cmdCity1, SLOT( setDisabled(bool) ) ); | ||
249 | connect( cmdCity3, SIGNAL( toggled(bool) ), cmdCity2, SLOT( setDisabled(bool) ) ); | ||
250 | connect( cmdCity3, SIGNAL( toggled(bool) ), cmdCity4, SLOT( setDisabled(bool) ) ); | ||
251 | connect( cmdCity3, SIGNAL( toggled(bool) ), cmdCity7, SLOT( setDisabled(bool) ) ); | ||
252 | connect( cmdCity3, SIGNAL( toggled(bool) ), cmdCity8, SLOT( setDisabled(bool) ) ); | ||
253 | connect( cmdCity4, SIGNAL( toggled(bool) ), cmdCity1, SLOT( setDisabled(bool) ) ); | ||
254 | connect( cmdCity4, SIGNAL( toggled(bool) ), cmdCity2, SLOT( setDisabled(bool) ) ); | ||
255 | connect( cmdCity4, SIGNAL( toggled(bool) ), cmdCity3, SLOT( setDisabled(bool) ) ); | ||
256 | connect( cmdCity4, SIGNAL( toggled(bool) ), cmdCity8, SLOT( setDisabled(bool) ) ); | ||
257 | connect( cmdCity7, SIGNAL( toggled(bool) ), cmdCity1, SLOT( setDisabled(bool) ) ); | ||
258 | connect( cmdCity7, SIGNAL( toggled(bool) ), cmdCity2, SLOT( setDisabled(bool) ) ); | ||
259 | connect( cmdCity7, SIGNAL( toggled(bool) ), cmdCity3, SLOT( setDisabled(bool) ) ); | ||
260 | connect( cmdCity7, SIGNAL( toggled(bool) ), cmdCity4, SLOT( setDisabled(bool) ) ); | ||
261 | connect( cmdCity7, SIGNAL( toggled(bool) ), cmdCity8, SLOT( setDisabled(bool) ) ); | ||
262 | connect( cmdCity8, SIGNAL( toggled(bool) ), cmdCity1, SLOT( setDisabled(bool) ) ); | ||
263 | connect( cmdCity8, SIGNAL( toggled(bool) ), cmdCity2, SLOT( setDisabled(bool) ) ); | ||
264 | connect( cmdCity8, SIGNAL( toggled(bool) ), cmdCity3, SLOT( setDisabled(bool) ) ); | ||
265 | connect( cmdCity8, SIGNAL( toggled(bool) ), cmdCity4, SLOT( setDisabled(bool) ) ); | ||
266 | connect( cmdCity8, SIGNAL( toggled(bool) ), cmdCity7, SLOT( setDisabled(bool) ) ); | ||
267 | connect( cmdCity1, SIGNAL( toggled(bool) ), cmdCity5, SLOT( setDisabled(bool) ) ); | ||
268 | connect( cmdCity2, SIGNAL( toggled(bool) ), cmdCity5, SLOT( setDisabled(bool) ) ); | ||
269 | connect( cmdCity3, SIGNAL( toggled(bool) ), cmdCity5, SLOT( setDisabled(bool) ) ); | ||
270 | connect( cmdCity4, SIGNAL( toggled(bool) ), cmdCity5, SLOT( setDisabled(bool) ) ); | ||
271 | connect( cmdCity7, SIGNAL( toggled(bool) ), cmdCity5, SLOT( setDisabled(bool) ) ); | ||
272 | connect( cmdCity8, SIGNAL( toggled(bool) ), cmdCity5, SLOT( setDisabled(bool) ) ); | ||
273 | connect( cmdCity5, SIGNAL( toggled(bool) ), cmdCity1, SLOT( setDisabled(bool) ) ); | ||
274 | connect( cmdCity5, SIGNAL( toggled(bool) ), cmdCity2, SLOT( setDisabled(bool) ) ); | ||
275 | connect( cmdCity5, SIGNAL( toggled(bool) ), cmdCity3, SLOT( setDisabled(bool) ) ); | ||
276 | connect( cmdCity5, SIGNAL( toggled(bool) ), cmdCity4, SLOT( setDisabled(bool) ) ); | ||
277 | connect( cmdCity5, SIGNAL( toggled(bool) ), cmdCity7, SLOT( setDisabled(bool) ) ); | ||
278 | connect( cmdCity5, SIGNAL( toggled(bool) ), cmdCity8, SLOT( setDisabled(bool) ) ); | ||
279 | connect( cmdCity1, SIGNAL( toggled(bool) ), cmdCity6, SLOT( setDisabled(bool) ) ); | ||
280 | connect( cmdCity2, SIGNAL( toggled(bool) ), cmdCity6, SLOT( setDisabled(bool) ) ); | ||
281 | connect( cmdCity3, SIGNAL( toggled(bool) ), cmdCity6, SLOT( setDisabled(bool) ) ); | ||
282 | connect( cmdCity4, SIGNAL( toggled(bool) ), cmdCity6, SLOT( setDisabled(bool) ) ); | ||
283 | connect( cmdCity5, SIGNAL( toggled(bool) ), cmdCity6, SLOT( setDisabled(bool) ) ); | ||
284 | connect( cmdCity6, SIGNAL( toggled(bool) ), cmdCity1, SLOT( setDisabled(bool) ) ); | ||
285 | connect( cmdCity6, SIGNAL( toggled(bool) ), cmdCity2, SLOT( setDisabled(bool) ) ); | ||
286 | connect( cmdCity6, SIGNAL( toggled(bool) ), cmdCity3, SLOT( setDisabled(bool) ) ); | ||
287 | connect( cmdCity6, SIGNAL( toggled(bool) ), cmdCity4, SLOT( setDisabled(bool) ) ); | ||
288 | connect( cmdCity6, SIGNAL( toggled(bool) ), cmdCity5, SLOT( setDisabled(bool) ) ); | ||
289 | connect( cmdCity6, SIGNAL( toggled(bool) ), cmdCity7, SLOT( setDisabled(bool) ) ); | ||
290 | connect( cmdCity6, SIGNAL( toggled(bool) ), cmdCity8, SLOT( setDisabled(bool) ) ); | ||
291 | connect( cmdCity6, SIGNAL( toggled(bool) ), cmdCity9, SLOT( setDisabled(bool) ) ); | ||
292 | connect( cmdCity7, SIGNAL( toggled(bool) ), cmdCity6, SLOT( setDisabled(bool) ) ); | ||
293 | connect( cmdCity8, SIGNAL( toggled(bool) ), cmdCity6, SLOT( setDisabled(bool) ) ); | ||
294 | connect( cmdCity9, SIGNAL( toggled(bool) ), cmdCity1, SLOT( setDisabled(bool) ) ); | ||
295 | connect( cmdCity9, SIGNAL( toggled(bool) ), cmdCity3, SLOT( setDisabled(bool) ) ); | ||
296 | connect( cmdCity9, SIGNAL( toggled(bool) ), cmdCity4, SLOT( setDisabled(bool) ) ); | ||
297 | connect( cmdCity9, SIGNAL( toggled(bool) ), cmdCity5, SLOT( setDisabled(bool) ) ); | ||
298 | connect( cmdCity9, SIGNAL( toggled(bool) ), cmdCity6, SLOT( setDisabled(bool) ) ); | ||
299 | connect( cmdCity9, SIGNAL( toggled(bool) ), cmdCity7, SLOT( setDisabled(bool) ) ); | ||
300 | connect( cmdCity9, SIGNAL( toggled(bool) ), cmdCity8, SLOT( setDisabled(bool) ) ); | ||
301 | connect( cmdCity1, SIGNAL( toggled(bool) ), cmdCity9, SLOT( setDisabled(bool) ) ); | ||
302 | connect( cmdCity2, SIGNAL( toggled(bool) ), cmdCity9, SLOT( setDisabled(bool) ) ); | ||
303 | connect( cmdCity3, SIGNAL( toggled(bool) ), cmdCity9, SLOT( setDisabled(bool) ) ); | ||
304 | connect( cmdCity4, SIGNAL( toggled(bool) ), cmdCity9, SLOT( setDisabled(bool) ) ); | ||
305 | connect( cmdCity5, SIGNAL( toggled(bool) ), cmdCity9, SLOT( setDisabled(bool) ) ); | ||
306 | connect( cmdCity7, SIGNAL( toggled(bool) ), cmdCity9, SLOT( setDisabled(bool) ) ); | ||
307 | connect( cmdCity8, SIGNAL( toggled(bool) ), cmdCity9, SLOT( setDisabled(bool) ) ); | ||
308 | connect( cmdCity9, SIGNAL( toggled(bool) ), cmdCity2, SLOT( setDisabled(bool) ) ); | ||
309 | connect( cmdCity1, SIGNAL( toggled(bool) ), this, SLOT( beginNewTz() ) ); | ||
310 | connect( cmdCity2, SIGNAL( toggled(bool) ), this, SLOT( beginNewTz() ) ); | ||
311 | connect( cmdCity7, SIGNAL( toggled(bool) ), this, SLOT( beginNewTz() ) ); | ||
312 | connect( cmdCity3, SIGNAL( toggled(bool) ), this, SLOT( beginNewTz() ) ); | ||
313 | connect( cmdCity4, SIGNAL( toggled(bool) ), this, SLOT( beginNewTz() ) ); | ||
314 | connect( cmdCity5, SIGNAL( toggled(bool) ), this, SLOT( beginNewTz() ) ); | ||
315 | connect( cmdCity6, SIGNAL( toggled(bool) ), this, SLOT( beginNewTz() ) ); | ||
316 | connect( cmdCity8, SIGNAL( toggled(bool) ), this, SLOT( beginNewTz() ) ); | ||
317 | connect( cmdCity9, SIGNAL( toggled(bool) ), this, SLOT( beginNewTz() ) ); | ||
318 | |||
319 | // tab order | ||
320 | setTabOrder( cmdCity1, cmdCity2 ); | ||
321 | setTabOrder( cmdCity2, cmdCity3 ); | ||
322 | setTabOrder( cmdCity3, cmdCity4 ); | ||
323 | setTabOrder( cmdCity4, cmdCity5 ); | ||
324 | setTabOrder( cmdCity5, cmdCity6 ); | ||
325 | setTabOrder( cmdCity6, cmdCity7 ); | ||
326 | setTabOrder( cmdCity7, cmdCity8 ); | ||
327 | setTabOrder( cmdCity8, cmdCity9 ); | ||
328 | setTabOrder( cmdCity9, frmMap ); | ||
329 | } | ||
330 | |||
331 | /* | ||
332 | * Destroys the object and frees any allocated resources | ||
333 | */ | ||
334 | CityTimeBase::~CityTimeBase() | ||
335 | { | ||
336 | // no need to delete child widgets, Qt does it all for us | ||
337 | } | ||
338 | |||
339 | /* | ||
340 | * Main event handler. Reimplemented to handle application | ||
341 | * font changes | ||
342 | */ | ||
343 | bool CityTimeBase::event( QEvent* ev ) | ||
344 | { | ||
345 | bool ret = QWidget::event( ev ); | ||
346 | if ( ev->type() == QEvent::ApplicationFontChange ) { | ||
347 | QFont cmdCity7_font( cmdCity7->font() ); | ||
348 | cmdCity7_font.setBold( TRUE ); | ||
349 | cmdCity7->setFont( cmdCity7_font ); | ||
350 | QFont lblCTime9_font( lblCTime9->font() ); | ||
351 | lblCTime9_font.setPointSize( 10 ); | ||
352 | lblCTime9->setFont( lblCTime9_font ); | ||
353 | QFont cmdCity8_font( cmdCity8->font() ); | ||
354 | cmdCity8_font.setBold( TRUE ); | ||
355 | cmdCity8->setFont( cmdCity8_font ); | ||
356 | QFont cmdCity2_font( cmdCity2->font() ); | ||
357 | cmdCity2_font.setBold( TRUE ); | ||
358 | cmdCity2->setFont( cmdCity2_font ); | ||
359 | QFont lblCTime6_font( lblCTime6->font() ); | ||
360 | lblCTime6_font.setPointSize( 10 ); | ||
361 | lblCTime6->setFont( lblCTime6_font ); | ||
362 | QFont cmdCity6_font( cmdCity6->font() ); | ||
363 | cmdCity6_font.setBold( TRUE ); | ||
364 | cmdCity6->setFont( cmdCity6_font ); | ||
365 | QFont cmdCity4_font( cmdCity4->font() ); | ||
366 | cmdCity4_font.setBold( TRUE ); | ||
367 | cmdCity4->setFont( cmdCity4_font ); | ||
368 | QFont lblCTime5_font( lblCTime5->font() ); | ||
369 | lblCTime5_font.setPointSize( 10 ); | ||
370 | lblCTime5->setFont( lblCTime5_font ); | ||
371 | QFont lblCTime2_font( lblCTime2->font() ); | ||
372 | lblCTime2_font.setPointSize( 10 ); | ||
373 | lblCTime2->setFont( lblCTime2_font ); | ||
374 | QFont lblCTime1_font( lblCTime1->font() ); | ||
375 | lblCTime1_font.setPointSize( 10 ); | ||
376 | lblCTime1->setFont( lblCTime1_font ); | ||
377 | QFont cmdCity3_font( cmdCity3->font() ); | ||
378 | cmdCity3_font.setBold( TRUE ); | ||
379 | cmdCity3->setFont( cmdCity3_font ); | ||
380 | QFont lblCTime8_font( lblCTime8->font() ); | ||
381 | lblCTime8_font.setPointSize( 10 ); | ||
382 | lblCTime8->setFont( lblCTime8_font ); | ||
383 | QFont cmdCity1_font( cmdCity1->font() ); | ||
384 | cmdCity1_font.setBold( TRUE ); | ||
385 | cmdCity1->setFont( cmdCity1_font ); | ||
386 | QFont lblCTime7_font( lblCTime7->font() ); | ||
387 | lblCTime7_font.setPointSize( 10 ); | ||
388 | lblCTime7->setFont( lblCTime7_font ); | ||
389 | QFont lblCTime4_font( lblCTime4->font() ); | ||
390 | lblCTime4_font.setPointSize( 10 ); | ||
391 | lblCTime4->setFont( lblCTime4_font ); | ||
392 | QFont cmdCity5_font( cmdCity5->font() ); | ||
393 | cmdCity5_font.setBold( TRUE ); | ||
394 | cmdCity5->setFont( cmdCity5_font ); | ||
395 | QFont lblCTime3_font( lblCTime3->font() ); | ||
396 | lblCTime3_font.setPointSize( 10 ); | ||
397 | lblCTime3->setFont( lblCTime3_font ); | ||
398 | QFont cmdCity9_font( cmdCity9->font() ); | ||
399 | cmdCity9_font.setBold( TRUE ); | ||
400 | cmdCity9->setFont( cmdCity9_font ); | ||
401 | } | ||
402 | return ret; | ||
403 | } | ||
404 | |||
405 | void CityTimeBase::beginNewTz() | ||
406 | { | ||
407 | qWarning( "CityTimeBase::beginNewTz(): Not implemented yet!" ); | ||
408 | } | ||
409 | |||
410 | void CityTimeBase::slotNewTz(const QString &, const QString &) | ||
411 | { | ||
412 | qWarning( "CityTimeBase::slotNewTz(const QString &, const QString &): Not implemented yet!" ); | ||
413 | } | ||
414 | |||
diff --git a/core/settings/citytime/citytimebase.h b/core/settings/citytime/citytimebase.h new file mode 100644 index 0000000..56606ee --- a/dev/null +++ b/core/settings/citytime/citytimebase.h | |||
@@ -0,0 +1,60 @@ | |||
1 | /**************************************************************************** | ||
2 | ** Form interface generated from reading ui file 'citytimebase.ui' | ||
3 | ** | ||
4 | ** Created: Sat Oct 12 11:23:02 2002 | ||
5 | ** by: The User Interface Compiler (uic) | ||
6 | ** | ||
7 | ** WARNING! All changes made in this file will be lost! | ||
8 | ****************************************************************************/ | ||
9 | #ifndef CITYTIMEBASE_H | ||
10 | #define CITYTIMEBASE_H | ||
11 | |||
12 | #include <qvariant.h> | ||
13 | #include <qwidget.h> | ||
14 | class QVBoxLayout; | ||
15 | class QHBoxLayout; | ||
16 | class QGridLayout; | ||
17 | class QLabel; | ||
18 | class QToolButton; | ||
19 | class ZoneMap; | ||
20 | |||
21 | class CityTimeBase : public QWidget | ||
22 | { | ||
23 | Q_OBJECT | ||
24 | |||
25 | public: | ||
26 | CityTimeBase( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); | ||
27 | ~CityTimeBase(); | ||
28 | |||
29 | ZoneMap* frmMap; | ||
30 | QToolButton* cmdCity7; | ||
31 | QLabel* lblCTime9; | ||
32 | QToolButton* cmdCity8; | ||
33 | QToolButton* cmdCity2; | ||
34 | QLabel* lblCTime6; | ||
35 | QToolButton* cmdCity6; | ||
36 | QToolButton* cmdCity4; | ||
37 | QLabel* lblCTime5; | ||
38 | QLabel* lblCTime2; | ||
39 | QLabel* lblCTime1; | ||
40 | QToolButton* cmdCity3; | ||
41 | QLabel* lblCTime8; | ||
42 | QToolButton* cmdCity1; | ||
43 | QLabel* lblCTime7; | ||
44 | QLabel* lblCTime4; | ||
45 | QToolButton* cmdCity5; | ||
46 | QLabel* lblCTime3; | ||
47 | QToolButton* cmdCity9; | ||
48 | |||
49 | public slots: | ||
50 | virtual void beginNewTz(); | ||
51 | virtual void slotNewTz(const QString &, const QString &); | ||
52 | |||
53 | protected: | ||
54 | QVBoxLayout* CityTimeBaseLayout; | ||
55 | QGridLayout* Layout2; | ||
56 | bool event( QEvent* ); | ||
57 | QWidget* buttonWidget; | ||
58 | }; | ||
59 | |||
60 | #endif // CITYTIMEBASE_H | ||
diff --git a/core/settings/citytime/citytimebase.ui b/core/settings/citytime/citytimebase.ui deleted file mode 100644 index a17b92e..0000000 --- a/core/settings/citytime/citytimebase.ui +++ b/dev/null | |||
@@ -1,1199 +0,0 @@ | |||
1 | <!DOCTYPE UI><UI> | ||
2 | <class>CityTimeBase</class> | ||
3 | <comment>********************************************************************* | ||
4 | ** Copyright (C) 2001 Trolltech AS. All rights reserved. | ||
5 | ** | ||
6 | ** This file is part of Qtopia Environment. | ||
7 | ** | ||
8 | ** This file may be distributed and/or modified under the terms of the | ||
9 | ** GNU General Public License version 2 as published by the Free Software | ||
10 | ** Foundation and appearing in the file LICENSE.GPL included in the | ||
11 | ** packaging of this file. | ||
12 | ** | ||
13 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE | ||
14 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | ||
15 | ** | ||
16 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | ||
17 | ** | ||
18 | ** Contact info@trolltech.com if any conditions of this licensing are | ||
19 | ** not clear to you. | ||
20 | ** | ||
21 | ** $Id$ | ||
22 | ** | ||
23 | *********************************************************************</comment> | ||
24 | <author>Trenton Schulz</author> | ||
25 | <widget> | ||
26 | <class>QWidget</class> | ||
27 | <property stdset="1"> | ||
28 | <name>name</name> | ||
29 | <cstring>CityTimeBase</cstring> | ||
30 | </property> | ||
31 | <property stdset="1"> | ||
32 | <name>geometry</name> | ||
33 | <rect> | ||
34 | <x>0</x> | ||
35 | <y>0</y> | ||
36 | <width>285</width> | ||
37 | <height>359</height> | ||
38 | </rect> | ||
39 | </property> | ||
40 | <property stdset="1"> | ||
41 | <name>caption</name> | ||
42 | <string>City Time</string> | ||
43 | </property> | ||
44 | <property> | ||
45 | <name>layoutMargin</name> | ||
46 | </property> | ||
47 | <property> | ||
48 | <name>layoutSpacing</name> | ||
49 | </property> | ||
50 | <vbox> | ||
51 | <property stdset="1"> | ||
52 | <name>margin</name> | ||
53 | <number>0</number> | ||
54 | </property> | ||
55 | <property stdset="1"> | ||
56 | <name>spacing</name> | ||
57 | <number>3</number> | ||
58 | </property> | ||
59 | <widget> | ||
60 | <class>ZoneMap</class> | ||
61 | <property stdset="1"> | ||
62 | <name>name</name> | ||
63 | <cstring>frmMap</cstring> | ||
64 | </property> | ||
65 | <property stdset="1"> | ||
66 | <name>sizePolicy</name> | ||
67 | <sizepolicy> | ||
68 | <hsizetype>7</hsizetype> | ||
69 | <vsizetype>7</vsizetype> | ||
70 | </sizepolicy> | ||
71 | </property> | ||
72 | </widget> | ||
73 | <widget> | ||
74 | <class>QLayoutWidget</class> | ||
75 | <property stdset="1"> | ||
76 | <name>name</name> | ||
77 | <cstring>Layout2</cstring> | ||
78 | </property> | ||
79 | <property> | ||
80 | <name>layoutMargin</name> | ||
81 | </property> | ||
82 | <property> | ||
83 | <name>layoutSpacing</name> | ||
84 | </property> | ||
85 | <grid> | ||
86 | <property stdset="1"> | ||
87 | <name>margin</name> | ||
88 | <number>4</number> | ||
89 | </property> | ||
90 | <property stdset="1"> | ||
91 | <name>spacing</name> | ||
92 | <number>3</number> | ||
93 | </property> | ||
94 | <widget row="0" column="2" > | ||
95 | <class>QToolButton</class> | ||
96 | <property stdset="1"> | ||
97 | <name>name</name> | ||
98 | <cstring>cmdCity7</cstring> | ||
99 | </property> | ||
100 | <property stdset="1"> | ||
101 | <name>sizePolicy</name> | ||
102 | <sizepolicy> | ||
103 | <hsizetype>5</hsizetype> | ||
104 | <vsizetype>1</vsizetype> | ||
105 | </sizepolicy> | ||
106 | </property> | ||
107 | <property stdset="1"> | ||
108 | <name>font</name> | ||
109 | <font> | ||
110 | <bold>1</bold> | ||
111 | </font> | ||
112 | </property> | ||
113 | <property stdset="1"> | ||
114 | <name>focusPolicy</name> | ||
115 | <enum>TabFocus</enum> | ||
116 | </property> | ||
117 | <property stdset="1"> | ||
118 | <name>text</name> | ||
119 | <string></string> | ||
120 | </property> | ||
121 | <property stdset="1"> | ||
122 | <name>toggleButton</name> | ||
123 | <bool>true</bool> | ||
124 | </property> | ||
125 | <property stdset="1"> | ||
126 | <name>toggleButton</name> | ||
127 | <bool>true</bool> | ||
128 | </property> | ||
129 | </widget> | ||
130 | <widget row="2" column="3" > | ||
131 | <class>QLabel</class> | ||
132 | <property stdset="1"> | ||
133 | <name>name</name> | ||
134 | <cstring>lblCTime9</cstring> | ||
135 | </property> | ||
136 | <property stdset="1"> | ||
137 | <name>sizePolicy</name> | ||
138 | <sizepolicy> | ||
139 | <hsizetype>5</hsizetype> | ||
140 | <vsizetype>1</vsizetype> | ||
141 | </sizepolicy> | ||
142 | </property> | ||
143 | <property stdset="1"> | ||
144 | <name>font</name> | ||
145 | <font> | ||
146 | <pointsize>10</pointsize> | ||
147 | </font> | ||
148 | </property> | ||
149 | <property stdset="1"> | ||
150 | <name>text</name> | ||
151 | <string></string> | ||
152 | </property> | ||
153 | <property stdset="1"> | ||
154 | <name>alignment</name> | ||
155 | <set>AlignVCenter|AlignRight</set> | ||
156 | </property> | ||
157 | <property> | ||
158 | <name>hAlign</name> | ||
159 | </property> | ||
160 | </widget> | ||
161 | <widget row="1" column="2" > | ||
162 | <class>QToolButton</class> | ||
163 | <property stdset="1"> | ||
164 | <name>name</name> | ||
165 | <cstring>cmdCity8</cstring> | ||
166 | </property> | ||
167 | <property stdset="1"> | ||
168 | <name>sizePolicy</name> | ||
169 | <sizepolicy> | ||
170 | <hsizetype>5</hsizetype> | ||
171 | <vsizetype>1</vsizetype> | ||
172 | </sizepolicy> | ||
173 | </property> | ||
174 | <property stdset="1"> | ||
175 | <name>font</name> | ||
176 | <font> | ||
177 | <bold>1</bold> | ||
178 | </font> | ||
179 | </property> | ||
180 | <property stdset="1"> | ||
181 | <name>focusPolicy</name> | ||
182 | <enum>TabFocus</enum> | ||
183 | </property> | ||
184 | <property stdset="1"> | ||
185 | <name>text</name> | ||
186 | <string></string> | ||
187 | </property> | ||
188 | <property stdset="1"> | ||
189 | <name>toggleButton</name> | ||
190 | <bool>true</bool> | ||
191 | </property> | ||
192 | <property stdset="1"> | ||
193 | <name>toggleButton</name> | ||
194 | <bool>true</bool> | ||
195 | </property> | ||
196 | </widget> | ||
197 | <widget row="1" column="0" > | ||
198 | <class>QToolButton</class> | ||
199 | <property stdset="1"> | ||
200 | <name>name</name> | ||
201 | <cstring>cmdCity2</cstring> | ||
202 | </property> | ||
203 | <property stdset="1"> | ||
204 | <name>font</name> | ||
205 | <font> | ||
206 | <bold>1</bold> | ||
207 | </font> | ||
208 | </property> | ||
209 | <property stdset="1"> | ||
210 | <name>focusPolicy</name> | ||
211 | <enum>TabFocus</enum> | ||
212 | </property> | ||
213 | <property stdset="1"> | ||
214 | <name>text</name> | ||
215 | <string></string> | ||
216 | </property> | ||
217 | <property stdset="1"> | ||
218 | <name>toggleButton</name> | ||
219 | <bool>true</bool> | ||
220 | </property> | ||
221 | <property stdset="1"> | ||
222 | <name>toggleButton</name> | ||
223 | <bool>true</bool> | ||
224 | </property> | ||
225 | </widget> | ||
226 | <widget row="5" column="1" > | ||
227 | <class>QLabel</class> | ||
228 | <property stdset="1"> | ||
229 | <name>name</name> | ||
230 | <cstring>lblCTime6</cstring> | ||
231 | </property> | ||
232 | <property stdset="1"> | ||
233 | <name>font</name> | ||
234 | <font> | ||
235 | <pointsize>10</pointsize> | ||
236 | </font> | ||
237 | </property> | ||
238 | <property stdset="1"> | ||
239 | <name>text</name> | ||
240 | <string></string> | ||
241 | </property> | ||
242 | <property stdset="1"> | ||
243 | <name>alignment</name> | ||
244 | <set>AlignVCenter|AlignRight</set> | ||
245 | </property> | ||
246 | <property> | ||
247 | <name>hAlign</name> | ||
248 | </property> | ||
249 | </widget> | ||
250 | <widget row="5" column="0" > | ||
251 | <class>QToolButton</class> | ||
252 | <property stdset="1"> | ||
253 | <name>name</name> | ||
254 | <cstring>cmdCity6</cstring> | ||
255 | </property> | ||
256 | <property stdset="1"> | ||
257 | <name>sizePolicy</name> | ||
258 | <sizepolicy> | ||
259 | <hsizetype>5</hsizetype> | ||
260 | <vsizetype>1</vsizetype> | ||
261 | </sizepolicy> | ||
262 | </property> | ||
263 | <property stdset="1"> | ||
264 | <name>font</name> | ||
265 | <font> | ||
266 | <bold>1</bold> | ||
267 | </font> | ||
268 | </property> | ||
269 | <property stdset="1"> | ||
270 | <name>focusPolicy</name> | ||
271 | <enum>TabFocus</enum> | ||
272 | </property> | ||
273 | <property stdset="1"> | ||
274 | <name>text</name> | ||
275 | <string></string> | ||
276 | </property> | ||
277 | <property stdset="1"> | ||
278 | <name>toggleButton</name> | ||
279 | <bool>true</bool> | ||
280 | </property> | ||
281 | <property stdset="1"> | ||
282 | <name>toggleButton</name> | ||
283 | <bool>true</bool> | ||
284 | </property> | ||
285 | </widget> | ||
286 | <widget row="3" column="0" > | ||
287 | <class>QToolButton</class> | ||
288 | <property stdset="1"> | ||
289 | <name>name</name> | ||
290 | <cstring>cmdCity4</cstring> | ||
291 | </property> | ||
292 | <property stdset="1"> | ||
293 | <name>sizePolicy</name> | ||
294 | <sizepolicy> | ||
295 | <hsizetype>5</hsizetype> | ||
296 | <vsizetype>1</vsizetype> | ||
297 | </sizepolicy> | ||
298 | </property> | ||
299 | <property stdset="1"> | ||
300 | <name>font</name> | ||
301 | <font> | ||
302 | <bold>1</bold> | ||
303 | </font> | ||
304 | </property> | ||
305 | <property stdset="1"> | ||
306 | <name>focusPolicy</name> | ||
307 | <enum>TabFocus</enum> | ||
308 | </property> | ||
309 | <property stdset="1"> | ||
310 | <name>text</name> | ||
311 | <string></string> | ||
312 | </property> | ||
313 | <property stdset="1"> | ||
314 | <name>toggleButton</name> | ||
315 | <bool>true</bool> | ||
316 | </property> | ||
317 | <property stdset="1"> | ||
318 | <name>toggleButton</name> | ||
319 | <bool>true</bool> | ||
320 | </property> | ||
321 | </widget> | ||
322 | <widget row="4" column="1" > | ||
323 | <class>QLabel</class> | ||
324 | <property stdset="1"> | ||
325 | <name>name</name> | ||
326 | <cstring>lblCTime5</cstring> | ||
327 | </property> | ||
328 | <property stdset="1"> | ||
329 | <name>font</name> | ||
330 | <font> | ||
331 | <pointsize>10</pointsize> | ||
332 | </font> | ||
333 | </property> | ||
334 | <property stdset="1"> | ||
335 | <name>text</name> | ||
336 | <string></string> | ||
337 | </property> | ||
338 | <property stdset="1"> | ||
339 | <name>alignment</name> | ||
340 | <set>AlignVCenter|AlignRight</set> | ||
341 | </property> | ||
342 | <property> | ||
343 | <name>hAlign</name> | ||
344 | </property> | ||
345 | </widget> | ||
346 | <widget row="1" column="1" > | ||
347 | <class>QLabel</class> | ||
348 | <property stdset="1"> | ||
349 | <name>name</name> | ||
350 | <cstring>lblCTime2</cstring> | ||
351 | </property> | ||
352 | <property stdset="1"> | ||
353 | <name>sizePolicy</name> | ||
354 | <sizepolicy> | ||
355 | <hsizetype>1</hsizetype> | ||
356 | <vsizetype>1</vsizetype> | ||
357 | </sizepolicy> | ||
358 | </property> | ||
359 | <property stdset="1"> | ||
360 | <name>font</name> | ||
361 | <font> | ||
362 | <pointsize>10</pointsize> | ||
363 | </font> | ||
364 | </property> | ||
365 | <property stdset="1"> | ||
366 | <name>text</name> | ||
367 | <string></string> | ||
368 | </property> | ||
369 | <property stdset="1"> | ||
370 | <name>alignment</name> | ||
371 | <set>AlignVCenter|AlignRight</set> | ||
372 | </property> | ||
373 | <property> | ||
374 | <name>hAlign</name> | ||
375 | </property> | ||
376 | </widget> | ||
377 | <widget row="0" column="1" > | ||
378 | <class>QLabel</class> | ||
379 | <property stdset="1"> | ||
380 | <name>name</name> | ||
381 | <cstring>lblCTime1</cstring> | ||
382 | </property> | ||
383 | <property stdset="1"> | ||
384 | <name>sizePolicy</name> | ||
385 | <sizepolicy> | ||
386 | <hsizetype>1</hsizetype> | ||
387 | <vsizetype>1</vsizetype> | ||
388 | </sizepolicy> | ||
389 | </property> | ||
390 | <property stdset="1"> | ||
391 | <name>font</name> | ||
392 | <font> | ||
393 | <pointsize>10</pointsize> | ||
394 | </font> | ||
395 | </property> | ||
396 | <property stdset="1"> | ||
397 | <name>text</name> | ||
398 | <string></string> | ||
399 | </property> | ||
400 | <property stdset="1"> | ||
401 | <name>alignment</name> | ||
402 | <set>AlignVCenter|AlignRight</set> | ||
403 | </property> | ||
404 | <property> | ||
405 | <name>hAlign</name> | ||
406 | </property> | ||
407 | </widget> | ||
408 | <widget row="2" column="0" > | ||
409 | <class>QToolButton</class> | ||
410 | <property stdset="1"> | ||
411 | <name>name</name> | ||
412 | <cstring>cmdCity3</cstring> | ||
413 | </property> | ||
414 | <property stdset="1"> | ||
415 | <name>sizePolicy</name> | ||
416 | <sizepolicy> | ||
417 | <hsizetype>5</hsizetype> | ||
418 | <vsizetype>1</vsizetype> | ||
419 | </sizepolicy> | ||
420 | </property> | ||
421 | <property stdset="1"> | ||
422 | <name>font</name> | ||
423 | <font> | ||
424 | <bold>1</bold> | ||
425 | </font> | ||
426 | </property> | ||
427 | <property stdset="1"> | ||
428 | <name>focusPolicy</name> | ||
429 | <enum>TabFocus</enum> | ||
430 | </property> | ||
431 | <property stdset="1"> | ||
432 | <name>text</name> | ||
433 | <string></string> | ||
434 | </property> | ||
435 | <property stdset="1"> | ||
436 | <name>toggleButton</name> | ||
437 | <bool>true</bool> | ||
438 | </property> | ||
439 | <property stdset="1"> | ||
440 | <name>toggleButton</name> | ||
441 | <bool>true</bool> | ||
442 | </property> | ||
443 | </widget> | ||
444 | <widget row="1" column="3" > | ||
445 | <class>QLabel</class> | ||
446 | <property stdset="1"> | ||
447 | <name>name</name> | ||
448 | <cstring>lblCTime8</cstring> | ||
449 | </property> | ||
450 | <property stdset="1"> | ||
451 | <name>sizePolicy</name> | ||
452 | <sizepolicy> | ||
453 | <hsizetype>5</hsizetype> | ||
454 | <vsizetype>1</vsizetype> | ||
455 | </sizepolicy> | ||
456 | </property> | ||
457 | <property stdset="1"> | ||
458 | <name>font</name> | ||
459 | <font> | ||
460 | <pointsize>10</pointsize> | ||
461 | </font> | ||
462 | </property> | ||
463 | <property stdset="1"> | ||
464 | <name>text</name> | ||
465 | <string></string> | ||
466 | </property> | ||
467 | <property stdset="1"> | ||
468 | <name>alignment</name> | ||
469 | <set>AlignVCenter|AlignRight</set> | ||
470 | </property> | ||
471 | <property> | ||
472 | <name>hAlign</name> | ||
473 | </property> | ||
474 | </widget> | ||
475 | <widget row="0" column="0" > | ||
476 | <class>QToolButton</class> | ||
477 | <property stdset="1"> | ||
478 | <name>name</name> | ||
479 | <cstring>cmdCity1</cstring> | ||
480 | </property> | ||
481 | <property stdset="1"> | ||
482 | <name>sizePolicy</name> | ||
483 | <sizepolicy> | ||
484 | <hsizetype>5</hsizetype> | ||
485 | <vsizetype>1</vsizetype> | ||
486 | </sizepolicy> | ||
487 | </property> | ||
488 | <property stdset="1"> | ||
489 | <name>font</name> | ||
490 | <font> | ||
491 | <bold>1</bold> | ||
492 | </font> | ||
493 | </property> | ||
494 | <property stdset="1"> | ||
495 | <name>focusPolicy</name> | ||
496 | <enum>TabFocus</enum> | ||
497 | </property> | ||
498 | <property stdset="1"> | ||
499 | <name>text</name> | ||
500 | <string> </string> | ||
501 | </property> | ||
502 | <property stdset="1"> | ||
503 | <name>toggleButton</name> | ||
504 | <bool>true</bool> | ||
505 | </property> | ||
506 | <property stdset="1"> | ||
507 | <name>toggleButton</name> | ||
508 | <bool>true</bool> | ||
509 | </property> | ||
510 | </widget> | ||
511 | <widget row="0" column="3" > | ||
512 | <class>QLabel</class> | ||
513 | <property stdset="1"> | ||
514 | <name>name</name> | ||
515 | <cstring>lblCTime7</cstring> | ||
516 | </property> | ||
517 | <property stdset="1"> | ||
518 | <name>sizePolicy</name> | ||
519 | <sizepolicy> | ||
520 | <hsizetype>5</hsizetype> | ||
521 | <vsizetype>1</vsizetype> | ||
522 | </sizepolicy> | ||
523 | </property> | ||
524 | <property stdset="1"> | ||
525 | <name>font</name> | ||
526 | <font> | ||
527 | <pointsize>10</pointsize> | ||
528 | </font> | ||
529 | </property> | ||
530 | <property stdset="1"> | ||
531 | <name>text</name> | ||
532 | <string></string> | ||
533 | </property> | ||
534 | <property stdset="1"> | ||
535 | <name>alignment</name> | ||
536 | <set>AlignVCenter|AlignRight</set> | ||
537 | </property> | ||
538 | <property> | ||
539 | <name>hAlign</name> | ||
540 | </property> | ||
541 | </widget> | ||
542 | <widget row="3" column="1" > | ||
543 | <class>QLabel</class> | ||
544 | <property stdset="1"> | ||
545 | <name>name</name> | ||
546 | <cstring>lblCTime4</cstring> | ||
547 | </property> | ||
548 | <property stdset="1"> | ||
549 | <name>font</name> | ||
550 | <font> | ||
551 | <pointsize>10</pointsize> | ||
552 | </font> | ||
553 | </property> | ||
554 | <property stdset="1"> | ||
555 | <name>text</name> | ||
556 | <string></string> | ||
557 | </property> | ||
558 | <property stdset="1"> | ||
559 | <name>alignment</name> | ||
560 | <set>AlignVCenter|AlignRight</set> | ||
561 | </property> | ||
562 | <property> | ||
563 | <name>hAlign</name> | ||
564 | </property> | ||
565 | </widget> | ||
566 | <widget row="4" column="0" > | ||
567 | <class>QToolButton</class> | ||
568 | <property stdset="1"> | ||
569 | <name>name</name> | ||
570 | <cstring>cmdCity5</cstring> | ||
571 | </property> | ||
572 | <property stdset="1"> | ||
573 | <name>sizePolicy</name> | ||
574 | <sizepolicy> | ||
575 | <hsizetype>5</hsizetype> | ||
576 | <vsizetype>1</vsizetype> | ||
577 | </sizepolicy> | ||
578 | </property> | ||
579 | <property stdset="1"> | ||
580 | <name>font</name> | ||
581 | <font> | ||
582 | <bold>1</bold> | ||
583 | </font> | ||
584 | </property> | ||
585 | <property stdset="1"> | ||
586 | <name>focusPolicy</name> | ||
587 | <enum>TabFocus</enum> | ||
588 | </property> | ||
589 | <property stdset="1"> | ||
590 | <name>text</name> | ||
591 | <string></string> | ||
592 | </property> | ||
593 | <property stdset="1"> | ||
594 | <name>toggleButton</name> | ||
595 | <bool>true</bool> | ||
596 | </property> | ||
597 | <property stdset="1"> | ||
598 | <name>toggleButton</name> | ||
599 | <bool>true</bool> | ||
600 | </property> | ||
601 | </widget> | ||
602 | <widget row="2" column="1" > | ||
603 | <class>QLabel</class> | ||
604 | <property stdset="1"> | ||
605 | <name>name</name> | ||
606 | <cstring>lblCTime3</cstring> | ||
607 | </property> | ||
608 | <property stdset="1"> | ||
609 | <name>font</name> | ||
610 | <font> | ||
611 | <pointsize>10</pointsize> | ||
612 | </font> | ||
613 | </property> | ||
614 | <property stdset="1"> | ||
615 | <name>text</name> | ||
616 | <string></string> | ||
617 | </property> | ||
618 | <property stdset="1"> | ||
619 | <name>alignment</name> | ||
620 | <set>AlignVCenter|AlignRight</set> | ||
621 | </property> | ||
622 | <property> | ||
623 | <name>hAlign</name> | ||
624 | </property> | ||
625 | </widget> | ||
626 | <widget row="2" column="2" > | ||
627 | <class>QToolButton</class> | ||
628 | <property stdset="1"> | ||
629 | <name>name</name> | ||
630 | <cstring>cmdCity9</cstring> | ||
631 | </property> | ||
632 | <property stdset="1"> | ||
633 | <name>sizePolicy</name> | ||
634 | <sizepolicy> | ||
635 | <hsizetype>5</hsizetype> | ||
636 | <vsizetype>1</vsizetype> | ||
637 | </sizepolicy> | ||
638 | </property> | ||
639 | <property stdset="1"> | ||
640 | <name>font</name> | ||
641 | <font> | ||
642 | <bold>1</bold> | ||
643 | </font> | ||
644 | </property> | ||
645 | <property stdset="1"> | ||
646 | <name>focusPolicy</name> | ||
647 | <enum>TabFocus</enum> | ||
648 | </property> | ||
649 | <property stdset="1"> | ||
650 | <name>text</name> | ||
651 | <string></string> | ||
652 | </property> | ||
653 | <property stdset="1"> | ||
654 | <name>toggleButton</name> | ||
655 | <bool>true</bool> | ||
656 | </property> | ||
657 | <property stdset="1"> | ||
658 | <name>toggleButton</name> | ||
659 | <bool>true</bool> | ||
660 | </property> | ||
661 | </widget> | ||
662 | </grid> | ||
663 | </widget> | ||
664 | </vbox> | ||
665 | </widget> | ||
666 | <customwidgets> | ||
667 | <customwidget> | ||
668 | <class>ZoneMap</class> | ||
669 | <header location="local">zonemap.h</header> | ||
670 | <sizehint> | ||
671 | <width>200</width> | ||
672 | <height>400</height> | ||
673 | </sizehint> | ||
674 | <container>0</container> | ||
675 | <sizepolicy> | ||
676 | <hordata>7</hordata> | ||
677 | <verdata>7</verdata> | ||
678 | </sizepolicy> | ||
679 | <pixmap>image0</pixmap> | ||
680 | <signal>signalTz(const QString &, const QString &)</signal> | ||
681 | <slot access="public">slotIllum(bool)</slot> | ||
682 | <slot access="public">slotZoom(bool)</slot> | ||
683 | </customwidget> | ||
684 | </customwidgets> | ||
685 | <images> | ||
686 | <image> | ||
687 | <name>image0</name> | ||
688 | <data format="XPM.GZ" length="197524">789cc4bdd772e34ab6ae7bbf9ea263e16ec5096c7973712e442f2fca5066c7be8025e8404f82da2f7f3273fcff20c45255cd9ea64f7760b23e024c9fc36526f4bffee75f6f0fb7fffa9ffff55ff345b0e845ff8ab260f6afff8997a3d1e67fff9ffff7fffed77f1fededfdebc05e07e707ff3af8efffe7bffe3b4aff15fdcbdb33ffdb3fb39c2ec887fb96e3087cb4bf67793c201f9c5b0e1ec1677bee7ed822cbf3c944d9a53f69930fdcfda8098ee4f7d991b27b3ede9025bd75872cf9373fc887529e27e1fd3d492f682bbbf4bc2a59ca138cc9529ec903f9c8d57fd8051fa17e4db2fcdeab91e5f7f1a7b22b4f780d46fbaca660d47790081fa0bc9f6764f9fde6068cfc0728cf01d2f39ec892ffec108cf4d7f8fde19eb45f9a3b36bd23fddbe8928f02777f4e3e76e363d604b33e9760f4e7ea992cf7177b64e98f690f8cfecb1764793e2f844dfd5c7af33159ee8ff03cebbb7e5576cf0f62b294675903a3feab1659f29f3c29bbe73f376469bfd695f021c6c700ed7188feaef7c128cf12e53f42ffad0330faabf96ed98eb63475edb10023bff12959fa231b9065fccd2ac21c0fe10559da773e25cbf3f13518e3d1e3efcf24fd8b5b30f20f5fc8727f3e5496fc9ec952fe7e57f810e5f944fdd83e9f8764493fe7f3ecaf09599eaf8ec892de2a07a3bffaa9f011e6e7ba0d46fbe7efca2ebd9a3c6f66c3e9a14b9f7c24e37b5a05637c0613b2dccfdec1189fe32159daa7be4796f6a8497f9af122ed9f57c018bffd108cfa0d911feb37dd234bfdfad764997f952559f29b838fd0fee34730e64f2f26a3fd5fc148bf3e5696fe43fb1c433e3402f0b1b46ffd982cf7ab48eff85ceea72e3d333ad1bec3028cf64c783f121e84e41357bfe041f810fd9be56469efe0932ceddb7c261fbbf4ba2bb2b44fbc00531eef9125bde246d9d5bf9290a5bd7bfb60c8d3f4912cbfcf3764298fd75076e5194dc9529ee0058cf65f307d8ca7f5a9b28cff0959d25f5f90a57cc5bb30e743109025bd694bd9a5d778214b79d2148cf1d9bb214bf93fd11f47d0df692c7c8cfc8673f0b1ccdf06ca777c8ef183f63f8ee57ed7c97f636ea03d920e18f5a92f850fa17fa615b28c8f469f7c1abaf6be071f49fb2443b28c87ca2df9c4716345167910cfc1d45763b2b4d7724096f4e76f6429afa7bf97fc965764296ff64a96fa2e593ef46fb343c6f8699225fdd654d9a5df3f163ec2fc5c4cc8f2fbe593b28c3f94ef08f65ad12523ff6bb2fcbef1a42cf9dd90a53eb31a18f2ba774686feb852167db422cb78acf695657cdf9225bf794696fa2f781ff269b8244b7a9348d9ddaf2664496f21f3e99ce375ec298bbc8cc892deb04686bd575576e9e523f031e4694a96df8f7df039e4d70559ee2f36e018f213e3e9e45ce475712e7cba0ff93d134e53e1aeebbfc3fd038c87e642f8d09820aeff7a60f457f3802ce33d3922cb78ec6560b47fccdf9fc9fc5adc81393f6365994f73b2e4e7cd94ddfdc93359f2ef2564c97fd817e678adf864c9ef739f8cf46a60c86faf4e467b5c9131ff3c30c65fda5076fd9f1d93213f06ca529e53b294273d5076f7eb73b2d4a7f108e6780dc892df22254b7e41ae2cf9b13e68ef0998e377345376e9ad33b2a47fd1274bfa953d6599cf9a1ef41bea67c6b3fbfdac4796f45a3764c8939c8cfe417b1f9fcbfd469b2ced93a3fec7b1a47f714686be8dc852de02e3f3641ff3e95d599eef8031ffe647cad21e0f60e89f5ea82cfaa94ac6fc7d5376bfaf3f81313febe7caeef7eb3a19f6d38bf0e9bedc1fd7c89087b7c2692adc75f2ffd0e803990ff501f9cccdb7f10959c653510163fe345265f7bcbf20cbfcf77365b93f23c31e92f960f403f469a6ecfaabda214b7ed95059d28bc8925ffd5159f4f10359f28b0a30f489774896fc2f5acaee7e5127e3f70918f3353a26cbf84a3fc992defc4359c6fb9c2cf52998df9994bfb55076e59f0664c827b60fe667d6274bfee303b2e4df3f54167b94e9a1ff9257b2a4df45ff72be365f9545de5d9165be6dfaca222f5ec8927f0fe5e1fc1d256449ef624096f2ccf6c0e7f2fca64186ffd2264bfea39ab2f4e70519f56f29bbfb338c17cefff11d19f6fc5059fcaf902cf9d76e94c51eec90e10f15cae24fe8f3529e96a687f120f3f99cf265305576f90f32b2e43fa82b4b7f60bc51fe2c7d65b117f97bd80353f4c709da735e5116fb84e9419e64ca529e19fad7c813493f06c3de6ebd9111af5a2b8b3cc4f3690a7b2d22c37eba5096fafb64296fd821cb78f5ddf83b52fded4f8439ff570559eed7d760d81f9b800cf9b15276bfafb7c9f2fb0519f3797c44167994be9191de81b2cce70bf2f991931f6764497f7d09c67cee75c9327e8a3b65773f9c9325bd6241867f5711e67c0d2e94c53ea99125fd68ac2cfed63359d20b1be063e98ff11919f6415559e6db3b19f6fa8c2ced5f63798e215fd17f9cdff3736597de8af9637e7fde288b7ec778e07ccde7ca321f3d32cadb5196f938254bfae395b2d8a34b61ced7a44f96fcb25365f77ce09125bfe158d9ddaf1d91211f6aca521ffe1ef2334dc892dfa2af2cf2e8810c7ffc4559ee0fc8925f88f63b813f508c945d7e454496fcaa17caa2efeec8925fb65096faf5c0901f0b65941ff99fa23d1b7764dc477a942721ef439ed53d32e4f3abb2f8bf28ff29ecab75830cfbee130c79d77a5516fbeb830cf98cf97c06f9d728c8682ff4ff19e4dde6168cf6ad67c2947f2b9f0cfff3932ce51b6dc8323f2ea4fd02da0fdd3e18fabc9b9345fea4cf64f8fb32bf8263d853e92b599e8ffbca4e5ec55db2c897fe800c797a0fc678eb0f95c57e3b204b7e8b4765977ed5274bfaa9fe5ed2ff9c81319e3653b2cc0faf45467d06ca2efda5fe5eeab7395476f7d72cffb9e41fb3bc9017930a59eab79a298bfdb221cb7caa9c2bcbfcd7fb90779a3ee2455764c86bf417e5c5c5882ce9e72d65d13f7db2a49f2f955dfa952332ec79948ff2242ec8f0bfb62cf3774e96fc070fca62efb13ce8df55872cf569be80212f862bb2e4d77d55167d744b96fc96e7caa20ff5bee4d7bf5276f59b37c0e8afe05559d23f25e3f7b7caeef7b9d80701e55174a1ecda6b724b863d365616fdb44f86bff948867fd3204bfe6106a67df44696fc860b32fcdd2332c6c7842ce94f1230fcc70ad3873c9f9c9225bdd93119f67b0886bcfb8cc9f2fce6832ccf17d7c26768af39e6f319e4f30afd734679ef7e7f7c40f9d198828fcf23371e7db2dccfc660daef2119f264a0ecfa2f699065be2f4e9445deec9131df47ca2eff5a420edcfd614e86fd47c6fc4eeec8884f0dc9927f559f477e3159d2abd684399fd73919f6e4922ce9559e9445be8dc958bfcbc098bf69932ce363b165e94ffe1ef3f7f34859f2bf2023ff4f32e2f57530e6737caa2cfaf78d0cf91129cbf89990a1bf9ec9925f7eaf2cf26c4396f66c0dc8909f7c1ef37fd65296f9f94e86bd7ba52cfe34f3877c182d955dfe337d5ecab7667ba07f9be764f4475ff814f27c3e5296fe3921233e9829cb7c5f91a53cd33765579ecd0359daa77946c6fa1fc623e547af4586bc3f5716793f204b79aa7a1ff36f4996f2788fcae26f8dc9982f183fb4b7364b65f15f5ec9529eda87b2e85f9607e3e7e25459fab34746fbec2b4b7bd4c9d23e39e637e5d9f89a8c78c6bdb2c4ff597e8c9751ac2ce3fb4098f65f744b467b42be511e7ebe29cbfa668d2ce5a956c8529efc058cf6fa44f9cf604fafe764c8f38ef039ca5393f632f64de0e45b3d25433fdf8363699f2823cb785ee8fde8d8f11319f25bca63ec0bf89ff7ca2ebfe69a2cf2343e2363bded018cf157dc92a53fd71365917715b2ccbfd11559f2af8d94459ec764c9bf182bbbfb594a0e63371ffb64c427f7c1187f714886bdc1fa425e5d44cae2efcfc952beea89b2cb7f7c48c6fa47074cff735f59fc4fb60fe4d35cef4b79c6ac1fe453b05696fb6c4ff4efe7b5b22bcfe0890cf92ee353ed99784286fddd264b79962365975fff8e2ce5496e95ddfd6e932ce5493e955d79d26b32fae3088cf991f9ca323f981fe4d7aaa22cf6679d2ce51d9e2a4b79591f8eaf1b65b11f94a5bcf90319f27e09c67cdd4464c46753b2946f5a288bfed7df637dca53167dccfc31ded62d6577bfc7fad35ec17ca33c9b4ec9f0ff1f9525fec1f6c4f80ab62cfa86ed83f155cf95a57d1a64699f19cb83f19443bea8bfac0cfd744c96fe1d0764c47b06cae27fbd91a5bc83a5b22bcf28224b799ba8ff19e3057b64c85b5f59f4cb0119f6f5bbb2c4933664c9af1882195f6d91e11f27cad2dfb764d8479fcaa27faa60f4d76757f81cf37189fccf519f02f3f71cfaa1e1daeb44edcd2e98f6e5a2410e45debf2b3b79d8d4fb22ffe77a1ff27f0386bc5d4ec990f7e7caeefea24a96fc92bab2cb2f5c9325bfe69db2bbefcfc918df2330edfd0765d1ff4db28cc75eaaeccab362f961efa7beb2bbef6bfa689f58d99567119151de7d65773fbe27c39f617a984f9f4f64297ff74c59e2032159ca3f59288bbfc4f689a5fcd3a6b2e8fb822ce5f79f9545dfb1bd313ee24361cafbfa0319f18c2a19f19696b2f85f4f64e89f4259ea9392a53e5e57d995b7abbf97fa7c2e94dd7d2f21c3be45ff51be476b32ca575516f9f84a96f279c7ca222ff479f817a9b2cb3fbf234bf95667caee7e634c96f6f65664ec8f63f930ffb31e19fe4740863dbb5176e50b876429ffa0adecee5fccc9d0efbeb22b5fa2e9617ebe91111f3c01435f041d32f4c54059fc17f61ff4457aa5ecca93bd90a5bcfd4cd9dd1f3c92115fbc57167b44d3837db4274cfd30ed92a57c9b2b65f11feec8586f4d94653c7e92a1ef7d6569cf942ce51b5c2bcb789890614fe760fa5727ca629f0fc8f0f72265f1173a64e8ff6b65d1bf0b32e2bbb7caee7eed812ce56d7864d827187fd43f459f8cf5ea6b65f13f0332e27b4365591fbb20c3bf7a22a3bfa03fce389e6232f469ae2cfaac49867ff9ac2cfe25db13e3677a4f46fb63fe9d233e57bf5116fb4b19ebc785b2dc0fc9d0b71565b137347dac5723ff73ee4f6992e14f8e94459e7e92b11f0aed7f8ef8dc6c4ac6fafe868c78df5259ec872119e31ff2ec1ceddd833c08b85e74a5eceeb7d0bee101f6fbc87c54ff6e5113a63db0e890e10fd6c1d0dff1982cf7fd776577bfd620c7723f234b7e5e0f0c79b578258bbcaa2e94453f4fc9d06f89b2d80b2959cae3dd2acbfd980c7fb405863caa9d28bbfca29c2ce5f1c7ca529e908cf204ca2ebf19eb0f7fba3e5596f27864acf748ffa8ffe46564ac1ff7945dfed543b2946f73a12cfee63119e57b50167baf4a46ff0dc9529ecd040c79345c9361bf7c288b7c8dc9b05f96caa28f4ec852de40ef4b79bb7a1ffa342263bfff080cf914337fe8c7d99bb294e7920cfb63a9ecf26bb17e186f599d2cf9a70519fdc3f683fc5a35c9588fd9b2c42f72b2946fd85396f5b657b2942f7c5276e59b6dc852bee64c59eca30519f6bed8dfea1fcd2e9545ffde93e14f46cae26f1e92a19f17ca2ebf8b0a59ca53cb9525bed225a3bf8ec0908fd1a1b2c8bb3732f6ef1c288b3f3423233eeb298b3ed0fbd0e70365f1cf347da9cf455d59e2452c2fc6e3469f97f95163fbd19e9b83e9df2764ac575d90a5bc514b59eccd2119f37bad2ce395fd87f1ba0a945d79e737649407e353f52dfb13e3336a90113f4a95c53ede90a53c134f59f4ef0719f379cbae3c9fec2fea0f945ff5e9a9b2ec476b91a53ce38eb28ccf828cf97ca32cf6c73559ca9355c8680ff417f5ef608f8cf5d40365b1770ec9d81f74a22cf615cb8bf17571ac2cf18f902cf9afd0bed4e7d11d19fb95efc9386f72a82cf1a39c2ce5b9785196f6d907237ebd7e57167b93ed037b6b33579678d83319e977c9904f6db2d46782f60c604f557232f253c6fa41a12cf61dc67710c03e86fe0b12c4cbf07c7880fdbc536591aff764ec97417b8427d80fff41c67905e8b33080bd83f998a6287f4c867de6c6ffe9e1c939ec932e19f6491f0cf9bb08c9d0a797caa2cf0764d84bcf64a4df23c35e06535f0f876449af1f90613fe87d496f9190b17f6209867cebc664493fb9244bf9c38db2d87b6f64c92fce94a57e1764d807cc1fe3b3fa4286ff14288bbc5d93a53dbb756589ff3e91a17f3d6597fff2992ce54b6764ec4f5980195f7953167f7a4c96f275dbca22cf5a64295f63a62ce55b91a57c9f7bcaae7c05cb87fecf3a64d89b5361eadfc140d9956ff242c6faf1908c78cf4859e26f0bb29467d55676e519b6c8b05fd0fed4a7d14a59ec910a19f6c93b59cab33c5596f1744396f2f59764ec1fac8121efd6a9b2c4ef1b64d8733332f4e389b2c4cfcec9d08fb1b22bcf94e5c3f81a4f95a5ff8ec8d8dfcefb5c0f7e24637f7ca82ceb056332faef4c59e21f4f6429df66a62cf67a44863d3750967852872ce59ba17ef4579b2b32ca1b92117fd1e7a57cabb5b2bbdfa893d19ffbca127fd1f4a57cad3bb28ca7cd1319faf6100c7d9ab6c988cfaf95453eb4c8d03737ca626f7864d89f97ca62affb64c4e34ec9523eaf20437fb13e187f514d59f407eb8ff1377a5616fbe89e8cfd1d81b2c48b347dc49bc9184f3dd61fe36978a22ce399e9613c5d1c294b7c654cc678bf264bfdd790bfd4c7618f8c784b5759f4ed862ce5697acae2dfbd93610f1e80113fc823b2e8dbf05e59e26f2959f2af79ca627f3c90913fe445007d1db23eb017ea1d65b127987e80fd627c1ef6c46245c6f9bdb5b2d8eb4f649407cc78c8649f8cdf1f2bcb7ada1159f2af8f94253e73053e91f84bf4a82ce59b91b15fada52cfdf349463c13fd4f7b66caf2a27d366b6591a7e88f10edf13927e3f92365292fca43fb68b626a3fe736529ff1119e759dfc9d89f25fa23a43d525d81313fbb1118fa7cea93e3c4c98f7732d6a32760c8c7e48a2cfaae3b5276e97d5e92612f1d2abbfbf92d59d21fa1bcf46f932659e657724d96fcf20b6597dee88d2cf9452764e8bf1c0cf9d57f2763fde94559e46f9f2cf9d526ca22dfeec892fee0030c79145f91213ff53eecaf4f32e21d7a5ff2afec9325ffca48d9e53f1892a5be3dd61ffdf5790c867c4b2fc9224f6a2fcaa24ff7c858ffdf90b15e31509678c7940cff3c224b793ed97ee8df3eea437f336f90a53cd1a5b2ec975892a5fd46afca92ff2959ca57a9298bfed6f4a4fd96b7cad27ee764d8631918f2721393b1be169011df4895c55e9c93b1feaee94979d75532ecc7576529ef1119e57d274bf95a981fd4876bd617fab03f5196fd1d2f64294fe54e59daef8c8c78cbb3b294674496f6aa0ec9d84fd003733fdfa7b2aca7b0bda06f972b65991f6c0feee7f395459f2fc88817bd2bcbfce4f8c1785ced91e17f883c0da98fb31332ec812619eb67a7caa2ef5764f82f1d6569df828cfd455565579e4d9d0cffe58a0c79fa00c6781b3595257ed423633dea52d9e51f307d8cc7eabbb2b41febcf785b9b8cf982f6a57e5f1c92717e305796f274c9d89fb2a72cf613db23c07eff9ab2ec77c07ca63dd08a94c59e66fd12e8f389b2c4abf43eec43d63fc17ed567658917a1feb4278a1519f652a42cf65448c679af4765193ff764d88f7a1ff14f8c2fda13cb5059c6db822ce90f67caa2cfafc992fe04ed4bfb6271a92cf649858cf35dac1ffa6780fe547b03f23742fd2ece95a57d30de687f4c4664d84797ca62afdd91b1bfb950167b668f8cf5cb6332cedb7e2a4bfbb9fe3e53ffba9b91451ed6bb6489b75c3c91b11f810cfd3cf5c8a28fba21599eaff03ee45da28c78cc4cd9a5179d9325bdea3559ca130764c4936a60c8abfa1919f6c64859fc65a60f7baaea298b7edd274bfe69870c799708533ff61fc9b02fce95451f55c888575495653dea842cf6daf2958cfddea81ff561ff4959e2c3fb64913fd3908cfaeb7dc44fcec8883765ca2eff16eb87fe5cadc838bf3805433f161f64ec7f7c54167b88e5817eecce945d7946ef64c8cb0b65590f5a90a5bc9b336529ef2559cadbd4fca43d9b5db28c9f44d387bd8ef940fd387f5496fd552d32eccb95b2e8f70d19e729f69565ff04db8bf6fb5ad995af32264bf9f32119fb95303ea84fa31919ef0b682bcbfee63a19fb93de95c59eb923e33cdab1b2b4f72d19feb6de97fa046f64c41bd01fd4a70b8f2ce5aba4ca128fec93a57cbda1b2c41f3ec958efa892d1be15b2e43fc6f8537dd9571679774d86fe3a5616ff7f8f8cf8edadb2c45f3232e2e1e84feacf755f59e4fb920cfd79ab2cf67641c67993a6b2c48bd89f09f6678d9565bf00ca437db9689161ff7595c55ef8244b7ed32b6577bf35244b7ef51e18fa74fe42c67ac4a3b2c4173664bc2fe34c59e60fd33f813e823ca53e0d4ec8d0a735b23cbf84bc0fd19e4bd4274279466d32f6933d83a18f43c803f5e7bb64f847556589c7f5c9189f0fca325e3ec838cf2eed13aafebb2763ff68050c7934fd24239eb80786bc985c9325bd7a5559f4d3922cf26c7d424e4edcfc1f91b19e83f4e9df855332fc8f2519eb0d2f64c97f38529678c30759e217b52a3911be22a7ae3cb34459e4ed06ccf59a1a19f6c85859f67ff2f7d057515f59f6e3a464e8eb9eb2bb9f9c92a5bd86976429af7744c67ac51c0c7d54c4ca529e0e59cad31c298bbfabf7a53cb5736559dff2c8529e4a43d995a7d1244bf93e5764ec7760ff41fff4d85fd03fb3bab2d85b8764296f7fa62cfa4759cadb8a95ddfdc60159ca9b56c8d84f89fea0fe594564c4132664eccfc9c8b0bf1e94255e35234b79066fcad27e4db29467d35176ed35d1f2c05e5980a18fb203658937b4c988d7acc8d2bec323b2947f744d46f93f95653d8ce5c378ac687e684fd617e3b1b1afecca3ff4c868df4730f455fd990cfdd4204bff8fee9425fea58cf973ad2cf3794896fc830118faa9c6e7a18f2a5b96f4efc9583fa92b4b7f633c515ff54664e8837b65f127dfc9d87f7345c67ee99c2ce51fa3bda97ffa1764e88f076549ff8c8cfa1c2bbbfc8a13b2e47781fe08e97fd7c958afd823e37c18fa23843d50f92043ffb7c9586f785396f39fac2fdabb1991218fd03ff427375d32f66ff860e8c7f10519fb1f301e23d46701a67f99e764ec9f8994657f6e8f0cfb527f2fe5dfbc90e1ffb9fadad747897ebaa881795e600286fe5a56c988272f858d7e71f7c385b21baf714e167d130d94455e3e80313f9367b2ccbfd92759d2f7af945dfad1902ce98785b2e8d77d30f48577a02ce397cf435f5c74c8220faafa7b294f375176f9872bb2942f592abbfb498d2ce5f38f94c55f6d81a10f821959e45372ae2ce725a664294f76a3ecf21bb0fdd05f4955d9dd9f4fc8529ede4059e2f73d61ea832c214bfb142959cad77f5376e5ebf964f873156597ff6c4ec6783a5276f72ff4f752beee9db2ecef60fe5cffdf23a37c3365d1f7af6429efa8a52cfa2a274b790797caae3c59832ce54d0332e22dac3fe47d764646fbed93b13f235216f9c8fc02295f3653167d744a867de42bbbf2f51ec952bec689b2bb5f1c93e1af9221efc22a59e4c5e79a8cf3496c3fe88b569f2cf5199e2bbbf2663532ec83a6b2bbbfee9211bfca955d79bbecdf04fb0d503eeaa3bcae2cfb0b6ec9d0b73d32e21567ca32dfa76429ffbcab2cfaf6950cfbfa4259ee9f90a5fca33119eb3bbc0ffd56657ed05fe32bb2946ffeaa2cf12a65d80337ca321ef43eda93f99f487922b617e3cf0365b1ff6a64c44bd6ca120f3b224b79aafa7b29cf7aa12cf1408c67fa7f8d0f65d177ec2ffad37d32fcd92b65592fb826c35e867e88d0ffcb0b65d9bf7a4c863e0e94e5fcf7848cfdfb4d65d9bfba0143ff6e86ca52fe3e19f1a71365b10794e1bf613c517f176b32eca95c59e23d900f11ec91568b8cf7e7bc9271de15fd17239e30817c8ae1ef579fc8386f84f68d196f91f112a9bf7a284c7d9d7f9245fe0e07caa24f8760c8cfe61159e4cfea5c59e453950cfdf7aa2ce97960e8d35a850c7dbfafeceefb7532d26b2b8b3db107e67eb71659e647fd5559ec934732f2d3e791df0d19f93595c51f15f91251ff250b32e2e16d65b1074664e477af2cf9adc9c8afaa2cf6d82518fa2cbb5696fc5764e88b86b2ec67f8204bfede5859fced9c8cfc5f94a5be2c2fe441ab20c3bfdf5396fd012c1ff5d781b2e437214b79bac7cae22f866494e74c59fcaf0e18fa69c5e7a99f9acab2dfe3882ce55d2e95657fe22159cabbbc5316ffef930c7bf952d9ddefb3bd1394f75459f623a03d19cf9b1f90b1ffae5096f8cb928cf589b9b2c4d7db64a9cf7aa52cfae2980c7fd65796f8c5882cf5691e2a4b7d1ec8187fbc0ff9b7627d20ffaa4b6589570764c8df2b65a91feb037d37b95776e59fe8efa57e17b1b2d4ef8d8cf17546c67e06f417f561dc5216ff8aed017db80894c5dfd4fb58bfbe5696fdb95532e6c35c59ec2165297fe3990cf983f94efd387e25e3fd0e97ca521e8f0c7f3b5416fb82e5c1f8dfe8efb13f08fd4dfd39fd204b7e6bbd2ff9550ec9f08fb62cfb2f3330f4e3e8932ce98dbbcad25e6332e25f3d30faa772af2cf1ef1919e59982d15e2d9697f18f7765d1efe2bf44d497f30e19f93d90719e0df9c7d0ffb3828cf533cc57ead3cf5b32ec2df44f0c7ba82ff64594c0ffbf70e32b50fff4e2044c7df6a62cf1b15330f493e72b8bbed823e3f73565895fdf0a53ff783764e89f4f65496f49467a1565594fe2efa16f8a07b2a4ef9f9391fe9db2dcdf9091feb5b2e8ef7730e64b75ae2cf91d90a15f5f94653eb13cd427fa3ce2114f64e47fa22cfe78138cf935e07de8871edb03fa21592b8b7ecfc9927ffcac2cfa83f5877e882f9445be5e09539e77f7c9925f912b8b7f3a254b7e595359e2012f64c96fd55596f58f1618f3b15e21633df45059fc697d1ef1990b65a97f4196f2543f94ddfdd12519e313fd45f91ab33e90a7d51e59dabfb2224bfed51919faf851d9e5573d2643ffb6c19097d32159f21bb1bdd0df9b7332ec1fcc4fcacb6843c6f9c36365592fcac09087ab4459d677f6c858ef3927239e3157167d1781210fe757648cd791b2f83ffc3de395a9b2946f46863fda5416ffaf4b867d119271be0cfd4f793a8cc890ff6b65896fed93b1ffef4559f417e415e56db1a72cfbbd1232ec8db1b2e8871b32fcc71365a90fcb03791d85cab2bebd24637de4942ce94d30be13d477b352167fb44146ff4ec028ef27da37c17aea6ca22cebcb4764fcfd12942f813ed9ec29cb7ac30919ed75a92cfa1ded9142ffb4d6643c8ff19b32febca72ce5b923e3f94259ce6f407fa4287f6b45c6f9815730e2d3d35b32fe3e83c817f5dfa63918faacdb50167921e5d9fa471fcae24f8ec0d4378f64c8bb180cf9d0ef9125bd60a12cef733806437ecf07643c3f5596f8a9e82fb5cfe70bb2c8a77ca02cf9f7c9a8cfb1b2c4e7f93ce4e9f2902ccfd72f95a5bc4f60e8c3594a46fdc53e30f61bf69b77c0f87de3168cf13ead29cb7a92de17f93446fb45186fc52119fb839ec9d80f22f233e2fcaf5c2a4bfcae4b86bf93298b3c7e24633d3400637e5d3494259ef64cc6fadb81b2c88353b2e4377b5596785f878cf833c61fe5c3f05659e41bcb8bf69b1f2b8b7cab90e19fde8369ff6f59e2435332d6afdaca12aff3c8927e21f222a27c5a3f2a4bff74c888ffc5caa22f3232fa674dc67903fe9ef1af2e19fec3b5b2accfeaf3925edd5796f640ff50de8581b2f89798cf946f832365799f418b8cfebf27233fa497c2fe8fde9465bd6f4ec6fee64f65592f3b25e3bc39fa93f232ae2bcb7af53e19fe42aa2cf24f19fa6002863e481265492f2323bdaeb2f8276764b4ff81b2c443d0ffdc8fba6279b17ed88f9465fffe1119f1f65365293feb9f227e112bbbfc7c977fa8fec7c5b5b0c68f8ec19047bd3e18f2a1910b53fead6ec0987fb5028cdf77ab60fcfe2211a67c4b6660cce7cd3b19fb39eb60ccc78b1b65896fbe91112f1d9345beae9fc992df300463fc5d0cc9f8fda330e5df305596fd9fd764f8efafcaeef7171f64496fd40363be4ddfc9b09f6332f6bb64ca120f5b90b15fea098cf1b4ba5316fb6a42463ce45059ca7f4f463cc45316ff8df5817fd75a92a11fd0ff31daafd75616f97441c67ee837658917a17d29efd60519e75146ca223fd7649cffa82acbf98a3b32d68b4ec1b43f1f9545df54c8d0370fcad23f3119f27f0ac67caebc9125fde05459ecfd1e19fbb1ae9445ff34c8d21e6bf40fe567f55e59dedf9092b1bff25859eaf342c6786e2a8b7c3922a3bf1f94e57d43283fe5eff45259f6675c91b1df62a32cf6784086fc8d95257eb447c6f95b4d1ff1b90b32c6cb2d18f27b5e5396fdb9af64f8077bcab25eba4f46ff687a58df6b90b1df06f389f27d5c5796fc5ec8d07fe7cae2efb07de88fec2b8b7d3526435f431e51de4f2664e4c7f240be47efca72ff838cf63e5496f1c7f2a788e70ac711e39b4365d9ff7749867d2af339a63c5bde80299f0fc890574d65777ff506467d9b9f60c63f5b64e9efc65a59e2070119fbb9a5ff63ceefd6b5b27bbefe4e86be40f939df7b8764bc6fa0a62ce393bfc77c0f3e9465bd81f9a13f93900cfd9028cb7e822519f18a3365d99f7744c6fa06f3c37c1fbf90b15e992abbf4c30732ecff3b65912fc764d88387ca32dffb64c97f8efae8fc1e2acb78f3c888173c28cbfac0868cfd3b6fcab2bfbf43c6fb5c3f94c5fffa24a33d301e39bf477bca32bf591eaee71e298b3dfb4ac679923b65699f2619fb4fd17f9cefeb3332ecd985b2ccf76b32f23f5096fe6179e99f1d2a8b7ed1fcb05e3f5096f9c3e7290f9ec990070fcad21ea76494c75716fd5090616f1f29cbfc70f2263ae6fccef6c8886f2fc15c9fb8204b7ff5de95c51eab90b1df2116e6fc9df494a5ff03b2a4378d94451e0cc9581f6e80d19fa33e19fee84259ca7b4e96f427beb2ccef2b32f68f7964f1e7d72c2fd79bf6c9381f74a62cf6c82919efa3fb501679552763fee5ca623f56c9a8ef1d18f3bffa4c863ceb284b7b303fceff1b65b127597ff45ff75659da9bf9a3ff5a1b61cefff999b29ccfb926a33dce95ddfdf49e0c7998294b7d4332f4c99665fdf4968cf5842618f33d7c27431e1f2bcb7c4fc992ffa0a22cfdff46c67ac6a5b29c37780463fe8f3fc9b02fce9565be55c9781f40a42cf2e9858cf6385196f1caf6c2f898b0be900715961ff2205b298bbce89011fff695a53d6ec8789fe299b2ecbfda27e37ca1e417737ef79ec988ef4b7faafebdb820cbfd6943d9f963cd4730da7bd95096fd767b64aca754c9f03f6fc068cfde0719f1a1aeb2f81be764f4e71919fb078ec1982fab0765b1cf9b64d82327ca22ef7c32e6abf4b7eabfa84296f47b47ca22ff9ec8d82ff2a02cfaba4d46fbf5c890cf0760cc87fc9c0cfbfa912cf94febcad29f5764ecbf5c2b4bf9fa64ac27697ef0f7311e38ded7e7ca220f7332ea5f5796f68bc992ff67a62cf547fb6a7c6345c6f9b6b5b2ccbf4f32fcd389b2d82b1764f4f74059fcff1a59ca131c294bbcd1b57f6cf585f4c70d19f6f30318e36bbd1166ffc62b30fae3d32323fed026e37c46138cf6a89e91a15ff7c1a8efec4959d68f5ec9902f7a1fe7a39cbeb2e623f6433bf994a687fc7b9e9f60fc7dd3e61e187f8f74b60fc6df0f1c8f848ff0f7bfa32e19f1a04730d2db8460a417d6c1fcfba4488f7f0f6c81f2f17d7bfe1318f12cff5698ef93497c30d7af4fc17c5f5f00e679af8130cf6b072b30cfef1e81f1fb10e5e37efb654f98efdb0a2764a43707f3fd8f4b30de2fe577c8c88fcfe37d157e838cfaa27c5c5f096330deb73454c6fb8f3c6549af20a33f5ac2f407ab684fae0f143561c6bfd2088cf1df457d192faaa0fc317e1fdf0827905f33b427fdb5f1828cf5894732f46548c678dc80217f669eb2c4bbe664e8ff0b32e2917760f85ba34765c97f4896f4c3b6b2f837ef64a43f23a3fe180ff4afe6cfca12ef0fc888f79f298b3dd725239e74a32ce5fb20c3de7c21633f08fa93fed3e4848cfd4b67ca223f4fc9a8ef87b2d4f7958cfa56c9e8ff6b30fca7f14c59fc15e647ffe95859f425db03fd19be294b7ca34d86be3f2763fc62bef3efd7171764fcfdda3365f73ef5b94796f76fad3f94e5fd59cc0fef97984c95e57d1b0519e77f626589e73f91b17ea0f7f17e943b32fc3bcd0fef676a90d15e27ca62ff1e92a1efc6caee7e5c234b7bb5176469aff6c2f7cc15fcc39f21ae089ff6fbd85c49e9b9f89bdfa5f87ef7332971b7f43d7f97949e0b713fc3bf7b7edf1f80839df492d2efbf2b97fdfdb0549fd1ceef83d2bddd72ecd637ff4d7b8d4b57f84dfdbd523ebf6affdd76297f4e7ed35f7f24fdf137ed1deee4bf5bff292ef79c3f73cfcd7ff1fc3f3d3eede7e2bbfc9d8e5cfa2b7f6dae7feeb370d7c6fcfbd3bf3057612eb95fc1fddde7d7ee372bbf8aefed674d9fdf5ef6fbbadf70df37bffc5eeed7c072bfe1b75c190affd27dd7f8925605d715d2bb362db4c13337e6f3c6a56feb51987f4b7d58cea596bfd06bb9736f7b15a61cf6f7b7fe1d9e633ae5fadb72dee3b35cc6efdae177fd50be6a680f9bcf9de98f1fdb7fa5e5bfff52aeef3e0bedcf8abfedcffb9dfefbd5657fffe09e6ffce4996d7b7efff9d7c66745fb93fdf1257fe891ca7fe86a62ced6c0b5d2bfffc8f5b367af77f2a8eedcaf969ebb0657f16c7327fd72d9da25661e6d5cfcee71a75cb5f61faf57f0933afebbd75fe913ef37f9fed17ef9ee77fcf76e7fec3ecb3e68fe0df5f92bd777fd51717a84f3ff9fba6aa57f37fda7bf31ed0232a0e1744913df55dd2532ac82cfaa2f7aa6897f3f9b675ebe2927afb6fbae81ef1b861bf8ae70f71ffd8eff6a3edfcc67ed17e97cdf1e52eea5b131a8e37ef6fb1af2fff1bb5fe7f1abab59fab72dc3aff3fe23fddbf8f2ecee6fd91f3faba7fd77fab78d893f333e7fd91fd0237f4676fdd9ebfd1f9493d4212fedadae28eb107e36db5f75c9ae6c2beb865a296d7bb54bdf7ffc442efe4e27f07ef69be7fe48fdff6c3f5066277f639a3f6b8bea6f2eb66dadbdd5ddffc9eb97fdf11fd32394174d3ffed3f2ef67d79e91637bf02f6efcd50f3a64cf5f397bd97eb69ddc6f38b9b5814ff1639a0dc89595bfef6ceb95b3af37ed057c11eb03d9fc3a4eb7ecca5dfa5fbb32767b15f88c55a6ffba3d98def6f3cfb4ffae6e123dd22b95f7df4bf7bbfeddcd8f3e5455afe287ebab1ef9b1bd7e97f7dfa147e492fed8c9ff3fa447ca7333fe66feeecaca5fc9e3b2cce17560ae433cfbf84dde1fa5ebed9b72354b97956b47f83c36d789b94ecd75d6deea277e5fd6477f468fa43fa9ff77bfffbb64fd6e9af1df90f6aecefe553b7ca747fea89cff27dae067fdf1558f70eefc539fb4e1a94776e76a59e6574abf235316d397a8224d2bdbcffdc2f3cde57981177a91177b89979acf2eaecc5c3dbfebf5bd813734cf8ddcf32b3f94dfbadfe7a56bdc5e78137fe54dbd9937f716ded25b796baff0367ec3fbf42ebc8a57f56a5edd6b784df3df9677e95d79c67af3c6b0b96d393f4d3a37285fb5549ff225df79dfd67fb71dfeeae7aff4c89ee98fea5f4c9ffaa11c8b2cc7debeaf7bd94f6c78b7ae8f79fd7a7cfcddedb4db1fdfeb91ff44ccc0cadc6bccd51afe6d3f1f71bf1c43aa959ea7bfc0989491dfde9db94c3adebdf7e099df798fde93f76c3e8d9cf73ae67a3597d1179ef17d3ca33bbc3d73ed9bcbe81bcfe81bcfe8096f692ea30f3c9b9ed1139ed113de797b11f8e6f2822008cd67642e23670363b30726bfa06b2e63b3063d73f5cd3530d730180579300e269089a68cc1d45c3329abd6f3bbeb3b195e29d5b91c437bdcf9aeec5ffdaeed77f32dfb54ec8f721ffd913477cb5bee2ffebb9cd775a9dcd7edaf7dfb3bbdb0fb1c7ffff8cdbd3f73edf6c7171de3f4c83fa943c4de6e409758fbddf3afcdbfad1ddfb69fc1dc7f7431a9225848ecc87c16fabb1b534a895d17c1325805eba00836c16770115402332203634706c637081ae6dfa6b5825670195c994f3b52cd6f83dbe02eb80f1e8276f0183c05cfc14bd0098c7f11bc066f819941819941819941c17e701098d91398d91398991398d11d9899139899139899139a99137ae60ac2308cc2384c82bbd08caeb01b6661cf2fc27e380887e128ccbdbb701c4ec2a9df0967de4338f77fee13548c0ca74d5c928da6fe2bdb53a1fdb4b2f9daef04263d7f6dbe3333db5fba36e9189f6865effd2159fa35dfad5e5ea20c4d97966977d31f6dedb7af9f3f4bbf8998a2ad832de3ca94ef0e7aaa5daabfa953b030e98b0e93b860536c8c70fd93b2d65cb9b6e5603bd577e28c7f872eb1fdf18ddefb0fe991b2dd9795e40bf548bbf4ec6be99e19e96161ae4df8195e984f3b72cccc086b613d34b3226c86adf032bc0aed7337e16d68f44b786fae0773b545ee8726fdf0297c0e5fc24e68d20e8d7e09cdec08cdec08cdec088d7e098d7e09cd0c09cd0c098f65768566968466968467f8343325f2f1bc2ff723336ba2c05c46e74446e744460e4549308ad2a81bd97abefc42265386574a6dc38bb19e13a461ca1419dd15f5457f064bd155d4597fa8fd77ffbdeb8f40fe078bf6575df22b7f0097fb4d490f79617bebbb510f3c4a5f6adf7e7cd3f7bf1a3be5f8e39fd1757fa48d921d76ff767ae477f6de5ffdac610d416455ec6228120f6a4403730f32221afa76dda1509961d7246c4bdc44a3288fc6d1249a46b3681e991e89cc288956d13a2afc4eb4893e2333832253a3c8f44a548bea51236a46ade832323a2532694466d447b7d15d646650f410b523db63e7e6f3c9f0737017991e8d3af61eeedb7f9b1915991915bd476d37433ee4d3ce98684f668ad359360f33732233d3a2c3e8283a8e4ea253532fab03ef4b7eca5759bed523cd925c371c4ca3b3e83cf6632f0e82c28be2303a8ea33836e98ee32498c7c6df8abb81e890aaae0bfdaafdbf5e5cfbb1f1b94f5706892d5de39ee885dfa7cb4fd797ed459cc5bdb86fca672cd078e83762bb4ba7093db8b0fd6cbecfdd772ba343cc1808276e969872c463f4fb777a64bb9e23b1cbb69653c6c85f1f9fdbfe28ef65f8cfea9157c80cfb196ce58dde6feec8a2d7d2bfabb8674671b0095bb1b1fb63233b6363efc77373997bb19931b1d1f0b1d1f471116fe24ff37921f22c36e9c46ee698cf9ae8023baaed088f8c3e71b3c4c8b2b86e3e5fe43ba7233ea03b0cc70dcc0c7c67d93dc719637f6f4740cb702e7575656eb77f6e2f7f67ffe25e6446577c692e53ced8b4536c665b7cdb16bd62afa31df9fdefe891529bbbcf698929a37f27dbbf4b9fbec6d894f54e2ea74b76d7aa76d7ab5e7f925e6de7df657d52f647fe2e7db2eb1f7ed523ffa40ed9ca50d109e7f17dfce017b19103b1d119f1139ebb31f2c78c56b73fcaca302bd3f6cdfd67fcfecafcdbb476dcf18ee3d7f82d7e8f3fe2bd783f3e880f633362e2e3f8c4ea97f834fef0baf1997f629e3f4ffcc4f35749e0744b3b31332689e40a5a32e2a3a7244e9292ee30233f31d64cd28585e59bef5f4497b819f581d9716ad8e89c24333ae8499e4d7a493f1924c3c4ca4f2b23696fffce1fd9b58fcd8c48f23848c6c9246c25d36416cc93b95f24a67ec912a3b12d723ebef8c3edbf2b9b1bceff58fa17c67790f59f3be7f7358c0fd4713e611b72fa77b1a50fd809f6593b3b6cbb188995185f2a29bc45b289df92cfe422290c9b5197548dff68fcabc4cd2cf12792fa2ff54849af99df583b847e2af7eafdf5f1f9ffb33fa232d5c890c4c8e0c4c882a4158c12c8416b532797edafeb0d8861254696fa47613d319cd8d1736b678af934bd9118cb29b13d62d24e8c4c49ec2ce3da85e5e7e425e924af817dde584d8919ddf6ff8919e9c9de5627b811de9519c04fce06ea0bab2bdc73fba27b924c2c33ea94e440625dc9617264edeee4785be76fe3f1657f64477e3abbddd6d7d42336333c3915bda87e0af5d31fb5cb7f96bf4dc3b6fd19fac0d43335fa35e51eae3f2aa3e95742c7d919929a72a7462aa54622a5463ea7499aa656f20ccdbfe9abedda13df95b5561a43e5d859f527bfffb33a64d73ffc1ad7fa2ece5cf9328fff48eceac7b9f94536fa45da4bfbe9201d867974928e924e9aa7e37412ac8caf318adbde209da6337f1cdfbb98c8951fa7f374911ab999ae8c9c794ed7c9495aa41b634135d3cff4c24be2abb49256fd4e5a4beb69236dc6af693f5ce9da77c7c5cb6c9438f6ee5263a3a597f12cbd4aafd39bf43635dfa7f7f0ba3f4a3ae2cbec303a82b3e4743b2becf7cec27a828e319f96d387b49d3e7a51928b6c8cec0efafa4f657943f5c8fa9bf6bf36f74facae35695066deb876e47356ee769c9efa5d7fec7ecf7d6be7d1287d4a9fd397b4939c4747e96bfa16e5a61f56e9bbff893c7fb65ee16258a64f4d5ba546daa4fbde223df0eae9a1b7f2ced3a3f4383d496d9b9c491bdbd8606aaeae99815dc3ddc05b191ba1e31f3bbdf5d51fd9d52715897bfafbddb01b794137f687c9953f4f9ffc6137f9859efef7d7f1e2efc6ef377aa46cf7bde1bbf29e9ab25dc939cd58f80f73b0bdb5534d6b7553c87ac35d2353ba59b7d735b2b73b08465d2b5fcc68ec8eb6b2b26b6cfbee586493935155db1be63be393748ddceb1a9fa46b7c92ae9131dd6577e59edbcdbfb4aee264d789c8b8aef15dba465e7737a223e8777c99254f72515794f54af7b3e4a79851d23572be5b11d9ff4b3f8097ade377eb23bb6bbff40fcaedcc7581ddb6a77d5f96b52fdb7434ae64f5b8ed0373bf6b7edb35be983b07c3be2eade9741b320ed4f7a96dd3ed9a74bac66aed1a1ba07b25eb523602af31c363699feeb544cebb66b6778d1de0594967fbefaebdd5b3d55299cb3e11cb603f8d54eb3e881dd16d771fa39352993e76ca5cfb26dddd314a3dcf768edb5ff7856ffd9135e6625bd631e2dcad5548bcc9edec40cca9a2f128c6401a883388bde82279760fae6d517cef4683bfea3e759fbbb6553bdd57efc41b74dfa293ae1d6de3ee47f72df1bb7b626f77f74dba77f8cd81b90ecd7766e4778fe3b3ee49f7b47b963c45c7c12a9e76cf333ff3b220bdcac2709245599c257ec3d8b90ddff48edb6765cb7a02996dcbdc7231161b07696476b6165937cb24f21b3d88cea067be9d25e2776c67c856e7d83518f7db7bd149592feb67836ce8cea8883c6afc726dba525a9bd8c66e28ebb76b0e4eca5839eaafb0d7b8e12ec48cd41778f465cde91ab134f96cb8357049af80cfe785b3d8cb46599e56b3b1f5f3cc771da77b4dbf1a5decf6a6651397a6cdcbf88666541b1d60d73f3233ba33239db279b6c896887e7c9422e4e576329f99b1bcb2b58d966445b6c93eb38bac92991198d56c1f58cbcc5f6566cc640d632f98f1923583b9675764efe16bbca1ff96a6dfcc8ccc2efd2233333233ed9fdda0af1f55df75dc5eec57b70e5394da53c681f3afcc3df39d95182ece76adb1d427d74edbbd64653d529643e5f317afa57b8feded5a2fe354bbeb1be57808f58779c6d5ccc88fcc8cfecc8e2633eab276f09499df664fd0d6b6759ecd657bcce89cac93bd2603f3f996bdc7a6b533d30bd99ee880ccf45866466776981d65465665469e64a68732fbbb73b187bfd8abe57a94d67d7ba6777b9eac8b385df1b0f53bbee88ea7af7ac47af77634f44c597a612fea19f993f57b49ef3bffe25736309fdf3d5fc1fb6599d6fe2ad7bfac3197754f796f32ebcb34b0c7acd78dbabd4cf602f47af25cafdfdeeaa0335c94d3d0e3bd81e8f19ed1f93da3777a6684f5c6a5f6faf851e7daef7a66c4f7a6bd59cfe8fc9e91843d33b37aa68f7a6b8939f68ab09e9a51df3333b367f473cfe8e4f4103e18751ad78b6c392a320e740fdd0bcad8de8e4bb76ec431588e2d725da63cde311ee231ee97dbf5edcb7e2dccb7de40e48fd384b6542d27676c9ca9e164999d9f1f7ea357d539d930f2ad83348a2f766fd5fd2eebd564fda257ef357acd5eab67b473ef4a767af4ae7b37bddbde5defbef7d0b33b4b4ccbf51ebd453c882b3d333a7bcff16def257eeb75e249efd5c892ebde5bcfb47eefa3b7d7dbef1df44c6bf68e7ac7bd93de69efac77def7b3671ba3ef5bcfb30af9f1a8b6b52d67a31f98729b1e493fc2513f8cda6ea7c9b5917daf5bffe38b2e29f57a3f4a622b1bed6a623fee27fdb4dfed67e1c8cae37e0feb0ef4397e661f97d74776fd9536e467a5a40faeb1cfb8069dcd337856de5d8713e955e8f526f63534b9d66d65b25da337f5eef7077d33c2fb2323b3ed9af7c69f3b7f67cfc95fd746fd3cadf4c7feaa3fe94ffb6616f5cdc8f6ae4d3b2dfacbfe2a98f7d7a237dd4aeb81c40177a31c655dd237f2babf81d5f5299f56baf43f6535d7b67ddfcc06ab93fa668cf4cdace99bf1d2af9b7218dd62758af57bec67dfd4b3dfea67d98b29df65ffaa7fddbfe9dff6effaf7d151d6747be41a3646978cfc8ed531f1f3ce9eb93db173421701c0de8e6b9c43b47ba0df5c3b6ccf0d192ee911dab727327ffb0fb8da223fdcfac4b4342f2193dcdea469e9f74d99d31a87c1f37d3377fb66c4db1eb271ffc0e88cbebd5e24d6e4ec58e3a3f48d8cee9b91da37b2b26f5bd8b44edfe88fbe1d9176bf9549af7f287aa47fd43fee9b72f44fd1b267e219f6cf07fec0cc9041792da6acfb6adb38c920345734880789f9b4bdfdbcf54fb4d7777c94e04ed659ba9783eec0c8e3be9931835ed4fd72f6e177bae43b7fe43b5f8ecfc29f7292eb4cdac1b6b14ab2a31d7959b2b9a3c136ad415ffcb9c140facdbb6d7fb1fd07a67f0646470c72f135acef30180f2603f3ec6026f27f309791ed2cabce763d4975c8ce6cb1cfd978a08b099674b59d29b61d6dbfb9bd0fc626182ce0e799e70666d60c6c7e66560ecc4c1bd8b298993530f51ed8ba983e1fd4c40f1a98913f30bf1bd83630690f5a251d53dedb56d64b65bb89fe48a9fd9dce3ec47e2db776696dd5f4c32f069783abc1f5e06670ebaf06a607fa937032b81f3c64cfe9f5a0ed1d0f1e074f7d33576d29ac5d6af7c95a39357836cf9b12d9f5816c6aee9bd61bbc7a496c46dde04d2ca4c17bd6e9be8793e062f031580ff606fb83838119f103d3c3836319a5bd23f3db7ba32b52230f8cac1c9c04f3c8f6aaadf9d9e07ce81b7bf469e80d03bf188632ab6c8f0da3616c771f0e13d159c374d81d66c3deb0df3d8ddde8f53bc381e892e1d06fb8fdbfa6d587a361debf1b8e87268fe1d4c8bee71ddd51eef1a7e0ceaea7d81e1ece86f3e162b81cae329bcf7a5804723eb1565aa3fe598ca5ec8fecae236d7d94865848a6bcb69c9fd1d1f062686cf9617558cbb2613d9c78a7de62d8b07d66f71e436fca6f3bd8cb447f7145ff6cd8343afa63d88afb26bdcb7466d7a8ba07b6ff6cbf99ba5c89c4195a6b7433bcb1ed3ebc1dde0def65440f1f86ede1a3e804bbbee45652cf77db6aeb8fb0ed5c5cb0f4bdfd4d706574b8c967f824fe9df30bb1de64a3294353a6e18bfcdbce8aa1e9ebe1abe870f7fc9e3c1b98993e34636cf83efc181a5dd1bb0fdefa2bd36efb224d860732b6ed65748cacd318bf7b68a56d43ee9b761cbab3f5b592ce39f41b3bfe8829cdf04876fad91884b5d3ed7ea4e1b170af2e7b696d69ec5c76a5323264685bd1c882a1a9f5c8b4a2675a6f64e4f8c8fc766446f12832572cf26094c83af928953db9a3ae4406ede7c8b4e2c8d8c7a3bef8155c2b1819993732f26d6466dfc8c8b7d15874dc68329a8e66a3f9c8c89e915d6bb7cf19b9335a4b7ab6dca362b419f6c3ba4dc7e98e725ca814fbeabd8e3623c4aa18cffa4e26bafbbee82e2b6b6d7b8c4c5b8c767db63f1293dff55f76e38ad00f23336247e6bb9169ff5143765adad8d1a829bab55f17d9396ab5b77b8d21235d9de9ef5445f7f01a999935ba1a6dac1f30b4699bdf8d4c3f5bc96875c3c88cbc91f9f7c8cc8ed183c878ab03466decc079927d6edffa21a54bd79c76fc14ee7be3a74bf343dad7e992fdd2beb96399096e5f1dd6abd84fce320e64f6d87eb156e0c8f4c3c8dc1bd9991f8b056fd766ac5d3432e37c64ed95898c2b7b6f647e1bbfc2662aad6975dd1c71b11023ff466fc3d6c8f6b86dfd3dd18a2a1f5eb0f3023bfa46a54f37b20fccdcbd1c1d8e6c8f1ecb9c77dad88e64dbdaa7b29f76647a7774de1b8e9e8379eee75e6e74411ee65118e5719ee4e9609c77f32cefe57d6f959cfbab7c900ea3ab7c387830cf8df2dca6958ff3493e0d27b9d161f95c6654be103d68f79ce6cbec395fc97aba6dbd7c9d17b91905f18b5ff4447e77faa645f34fa75bdc1ed4fc222df24a5e7591e0779165db19b28d6d59fbdb3e637da9dcb4605ef71b79236fda588b3beb58c3fea16a49377cb75eb4eb8f509fd4109b32be9e975b9fca1be466e4e7976295bad1749ac4b63cb92d8319d5f98d8d88983a4d928b78667444eacb7b4e5af96d37f657d696b7fb15864646e677d1517e9f3f74d7f15b7a93bd644f793bb7918b439158f963fe943fe72f79473cedf4d6f4d36bfe96bbba4b8ccaad15591f22dac6f8649c7cf5dbbeec4d285bada54fb79fc1e49f9776feb87d713656d6d9d1e99a8ee91fbb729cc867b90c6eb6bcc8f74e3fd95913cb18756b336696e57bf97e7e2063d4fa55b9a97b6ec66d7e9ccf4783e8e8cb79a0bd2feb23d72287f313d8e5af28356a9397a3a23b570e7bd2ce61ce65b797f60c330d9ad1ed36ef8a5d9b9bb4c7fed81b9bd13ab6bac6c8f971243ecad8d46a9cc8bc1f9bb2d81a0d17928fdb4962eee5fb2203aca535ee8a1c55dd603ec71974a1d167e39ec4bdc67d919fba5716f67a7e3b1e8c87e3d138472ba3bedc9162659a2dbfad979de53d5b56a3cbc613898d7d91dde5787cb5f4fdaffc91b27d5cd2e9e369bcb13bf86d3dacdd3f9e89ac1dcfc56fb2ed6b63855697f54c2f8f6dccc8f4c778d956bfd2ee574bcce7d88ceec0e88ab19199e342f61cd874c71b91c1e34fc860d3dee30bb49bf9ed187edeb826e3a2bc5feda73360f7fa6175f6ebe5f4c7eef3dfc51477d6adf45efbebf7e33a74cf09a4f9a1440e9c0ef2f179b0d54de38648beb11d37769792b9c697f4a99d1eb16bc1c7c62635a98dafc6d7e39b30b6769eec6d2dd9955f6a58fafe4166829b05d7b42bf1bdb1dfb95b707c9bc7e3224dc6a657c766fe8e1f249661479d3d11356e8f1f6d34d1dac256ffd8796fe7b9b598c6b6e6cf18c176b4d8f4ece76b5e1ddbdf4eddb98b8eff61e4e5c0d8999bb43286b7e89eb523676fbc3f3e181f8e8f82f9d8ee14e17edbd6f8647c3a3e1bdb673fa55e3a43ce45f3dbb32256bf4efc8937b17e903d1d7cefd6c20b5ddf30ad6ced5c3b6bac7f3009fd55b2fcc9f98eb23fd246eca92d7b63fd4a30ef9b5eebdd4e221bef91f59ba86d2d9d492c52683c175d674757de99249374d29d642863cf5a1493bef515f355af3919e44fe32bb13cec3a85b5446c3ab61d27c3c9c8f517fad1adf9d8f21f06977938d89be4a343d71f1e2cbcfd926edd9d21dfe9909f7d3e61cf3574c464fc8be7bfe4f1f5775f74bdf97e32810d60eedbfecb758f369e7fd8de57fd732ad7f86132b5d6b3f5bf26b3f071328f8e260bf5474ccf4ecc68cd8c3c9f187933312d39294a73f41732e08b9dfed1fe71addab680193d93cfc9c5c4e6539dd4267599e3d65a703626ce6d4c1ab043fdd2dc3f43cf99cf8919411333c727978885999e9b9834268c55d833ed66c64ccc28b0114a966762f29898993931336ef2108cf4bc3ad61fa27cd2eed911f3d8fe21a6e564911d794f62abdb9892d3453bebce13338327d61a32bab8d7125bd77a84dfae7decfa23dcc3cab508db4bb63caf6d8d01d9a8c6e4cd8e7a911cbaf7f84474c0c4b6f387ac37f57d597718ec61cdfb1db123e8442743f785277bdb76d2fbf67b737f7280f58f7db4cb838cb8727fff6a4ce8f58c586059e697f636a86efa6e9cd9b63ffcfe7bdee3de6b8da361557372d4d6b89a1b0747dfe826db6e76ec99769c9c8a9f6dfdd9891d6fe677a377f7ae56dfef4cbd69303533646a2c99a991315363cd4c53a4465fe414adf4bed511ce5e7cdf99d3bb357d109d31ed4eb3683ded656df1d2b315f63d754446aa6c413af969d47672e045f64345cf62878726bfa037ed4f07dee774181d4d47c1dc9e699fe6e61a1b9e0c5be955300fb013c2eaa1e9d46f4c67c3d674ee776cfcc61ff16c8aefde8fe285d3c57419dc59399b64c8d794636a46e4743d2da6e6997e6ef7ddfa6e5fae7ba760056b45cde9e7f4625a999a5139adc91ea5a99102d346ba9c364be7477ee68f5cfb1db78f016bbcc3cf7c386dd97247ede9655b6247a6d7a7575123b575b91e35eda89f9a724cedec37b3717a37bd8f6e8cdf76ddbbebbf4e1fac8fc23394d1de56d7dbe82bfb523ea7a5fdccd28ff61939cb69f27fa45d602d18ec8d2efb077f4467bcc3aff826d6c534a64f18edfe8ff7b73364e7f71867eea4c3e9f679ab3f5c9460c7af9c1c71dc96c699cdfb59c6d7f465da99bec66fd3b7c1d9d47eff31dd9b6ed2027a04711ecfa43c352d3435f263caf8c1c376aebbb9fab295294e363cff4686d83db2b1ac1859bb797a84124fe49ec6c3fdb6da93b655a6c75b1fc8f90376449c88976acf91db75d8a9add919d67e2193edbaf1d4f6fe93f83d3393eecce89b5910d6273ccbd0dcea107796cf9461164e7b337b96b08328a52fb265168bde98e18c9aee61e685b5e9280f4633538659576279339346daf983fe082fbc8365d64384f344dad77ecefab2463033759f0da57c6c5feba7cc6ccccfea1a339367795bf70ed8116ffd17ee5956d90a9d61a3ae724a602beb13f81d2eff0efafbb9247f9fb63ae00fe9919ff8b1e5516efb7c3696cfefd6eabff821fcbebd538e529a3a6bec787d954f893e976297e6f733330e67c63fcd53ec3fbb9335fcbe797666df49f022eb23c1dcc8b162665a72b6982d474170385b41239f5306e10c1e668df3376cab3dff5e86b8d960e7aa8d5216b3b5fddec5441e3012f6709d62ae97f4508efdb6f6deacb0dab0f7305cd998b7bf1abdf9c3feaa3feecec2d16c9375669f7ec3c670ecfeaed985bfca3e6695998d9af666b5dec5e07e564fd799db371bcc67b69506d005764da365be6bce5a36fee156baacaeb2d1eebdf4313987cee1790a9ecf6ffbb23fd75ed69a5c78c17433bb1c9c798bd915f6122d4b670c7fe68fdc886eb265ef2f8c061cceaec70fdc851fb5ad3799af6637b3dbd9dde8507ca3e07c766f634fd65ab5bacffa0c363a3b7b907fd39f747b92cfd15f7654f8c19d9b254fd415939193d3c62610a9b56d7ff73b9c207067354b52affcdcaffbff2733636706508ffc546794fd90a7d2f7bb7e09d3a66f75007f8efef5f95642b8fba762b9ceda76b5c11f3adfbc62df8fe3d652acbf097f84e7fcac2d3b333a65f62473afbc6f89ba64774df5a7fb744a25b73ac2ca325b2aab0b6c69ad7d3c3072636666dacce43deb94ece1f36d4da9b3acbf327b95f799fc70de9b7124bcdbc4c6c4dc1e2f93dfec4de23c767d99e7aa7f5807c73e9f99f9cdec43f2b3f190d9de6cdfed2f58949ee31edcf2faec6be91ecae1cab59bd72fd647ac1eec87a26bdddb244e4477da585eb496b58cd981b0b37eee6687b9a9e7ec4874c6ec78b4999d88df36434cc7ed12c18850195cf6037cf4c747c926f8101daea3ed05ed6f75d9d93723fcaf5ed023badeb1bbc7e1573aa9a4d3766788f581edeae3ec5c2242737feed9757db7de728ed8d6838cf7818d0f5a3b81fbb55ecb673c759dfd462c977920a74ee761dbc50068eb59af6d901a7533c3cec43bd101aa070eca312d5c28f93c46e9edccf89c4c6d8c649e6445af314fe7dd7916199b7adec37cf7b7739c7e8ff50fec77f3fef4cded566c39d9ecf62ff57bee2c5ae1bfca9af4e0117132bbc6f3ee453d2313b24b2ba3bba7767d55cf2b4f455e58fd29a3dfefcc077e311fce47d68fb196e63c9f8f23b7e30fe7b1edefaeb67b4983a9d3017226aeb4dfcdea88f9c4c5d91aba67b5bce65ed9f147cc6f527f3e9dcfe6732b9dac0f61dbd5591fa62e79c3946be1af86175e61e380b66dec3ad17c395fcdd7f3626e46c3fc737e31afccab56ffcc6ba23be675aea770b41b9d7eb4d501f2b68b69fb4b9f7deccaf3ed2cb3ebea368af2a3eed819c13f7cfeda5fb5d268326e8bae7a6eff38e277d21b718dfde3eb38d3f7e1d815e16534cf0fbaad79c36fcc9bbde6bc35bfb433c6452faaa23be657f96a7e3dbfb1fb8fed2ec9f9ad1fcfef5c9fc978c27ebbd2fa886d75fb4bdbca762e7b628f3bbbd7ae619a916cdf3735b77b75cdc899cfe49cf5fc49f6cd58cfd8c640ecefe6cfd064c7d2132e467d20f1f7f98ba437efc8de9fe98becb7b1eb1ebaae7252d229bec8469bbf3b63585ec7663c8bfb3d4f249ee5f6efd85a5b3b74d2d6bdca2a1b1ebfc6b5beece5b1ab9c83782fb3657cfb853ff1ef5c4c03ef88b4e5b0d7fcbdadfbd9e61f7256d2ad539c49d4c4c6fc9c0cdc43ffec4b64d2bef325ec87f5b969abb99dcd66e4cf4ddbcc4f4aedc775809db56ceed6b47d62dbdbeec3d5b5ec93ef9fffb7beffc9735627da7eb775b29fa1bf8da169bf63f4ff90ce213cf363c43a312e2d5ba960ef5b8b746ec797952a75ecd732ff9e9fcb5e8485dd4563f4eac28ccf45207b00adae777b13d0f7a661bfe93ff737cf22df5bc48b647c1c9fa5cbfe7291e673bb00b7c8f2380f8777a19911a629fbf1647ce8d58d933df482eed962b4c887fdc57831091f2783d151d8b76b10612fcf17d3ac981c8461f438991a07671eb426d3a035bccbc3ac08a3c562b1342ed22ab85cacb362fcb4b0ebec7178bfd82c3e179b301ade4d4fa6d6951a3957cafcdefc7b3a7f595c04d5eea91f2c2ab3869f2daa8ba41ff8f1a2e67717f5c45f34fc9ed10dc345737ebd6865c5e27271b5b0b5be59dccede7c2f3ef72f1677899f98e7ba9191dfd12259dcdb7a1b1b34f13df35bcf7cc67e6ad2ac9aef1fccd0795c3c2597e63bf3bd79eecf7f06fe6d5237ff7e5ebc2c3aa6ecafe6df6fe67a5f7c24f545129f9b7a8d177b0b334216d9e2607118dd2dae17478be3ac085a8b22baec0f1627be973e79c9629285836e783d3b5c9c2ece06e3fef9e27ce92fbdec7e512c0353ef6369efc5ccb4ef8c9fb61d83cb65b8e5e9937dcef6c732faf1f9bff773fa346df7a692ff647f7867f3b5ef41b3e5306364b434e362190fefecfde9097f67fb1fe99876983e4d4683c3697b99ccd661649e4f4d7dbb66865f0607cbcce8d9ebd960b6b7ec1953bc1f1f2c07c9c9e2697cec45f1ebe42a3e35be696f395c8e867dafbdccf3e672bc9cc4f7fe831f2fa78bc4f6bfe91fd3ffe313d3573a0edca7b9a047da5bf966e7ce7226bec9c2ccc1e55cd615acafbfc4bb97dc5e5ff830f65ada9540231317669e2e57d82181f5e0d1fe560658bbd9dabf5cefe09ecfe57a592c3722d3969f78fe4c3e9d0e32d7f2c25cb66c90ffee4c1ded7d9c5b737b90c2b6eef7b1bb2996b5b033b3ebcb368dba9c0fd773118c2fedfa09e5fda07f5587301686f7c24c3f652dcadde3be64d32e0b53a6a5f5e9ccb56c623dc393b3318b91d4d1be5f725a601f5a5764a75dffb03a98eb18aeedcedb5fd695d89edcfbc0371e595e865fdbfb9ff8a4ce608c943606cbc7f53167fd95bee773cb96fc6e79293ac4ead28ce7208dcd927c8ace585e0523bb57245dc9194bbbd76269d2581a1d66638edcbf4e7f56639495527f7cab4710a759b9f32078efd2b0216ff7b42b56de59d65d1a0dd94dfced3bf35edd730dbb47ca1bfb8da5dd1f3c4b8bfedde06a1289d7e96261a75b7bd4d5d82bd9bfafb2e7b3070decae9bf63672076fdfc6badddaf04c76cbd87304f6ddbc7ab6ac16ccdd7b3ceefc6264f7397590beb1bb6dec67791f35968697a635968fcba791f16796cfcee694f7bf6fdf27dcc03ed9c29d25dcb833f11d5d47ffb357db97f70adade7af1926567f96adf0b63f2f0dc1eaf7b777eb2331e2f5f97f60dac67cb77279d6c9cab63ca6afdb85e30f7726fb1dc1f27cb03b1c8ec0cb23e1ecf71587fc1ed5279d8c622759fd9e9d7cbd9efd7b2b6bc7bef9fb86c19ecfa8addefa55104f43323398c33fd701d6037a5ddf36ba473af9dc56e1ce4a66d8c95b5b4abae2f720e24be30fd65f7661c64ddde265fd975a2e5f1f26479eaaf701e7385f39bfc1b02d24775e75b7aa5f7057c779efda3bd3ddf762db6fff24cbc603b07ddde95f2bed4d299697db71fce372ccfc54e2cefcdd418d82362253ca7f1b0f5d0ac5dc958cc17cfad2d2dd8bd59f97607caca937dbf2a03dee40a9c11077bf541e498f37e63d8af764dbadb7d747bbb8ee4375fce3e972ffa38dfddfb77ae4aa99ca6ad56466eaf2279d789f547d447aa8aae5ec5b2877a9588ae18f36d412772767f95a23daeb03b1df6b89d2d5ff62c97d63bd4f33efb9117b39fc48ffee68b33c5bda969c7b3576f9bfbb6be598b9fd7646f85dd3fb6eab6bfbe0f8c3e26fc6aab435699c400edba9cf59bf55c3fe3a0b415cafe6679ff9c5ed8f72b73aa22670b8d4cbe3576dad370d43db57b8fe2e770e4f6415a79e57a14ef1eb1f3f245ce27381df4e8ce4337ecfc5ef5567dbb276b5edbc62a9cccb89a8c54b7b855a9ed3972591bfd3e4ee25ad64687cd4858d9d3417babe1788a73662d1b430ae656060c2e8337ebb9329e6e5b7d35dab28d68aff2d5d8ee4674e7dbdfbe795779c59eeb737127fb1ec9bfe77db24647d9bd5ce9663559deaca62bab13dbbee7cacd5350ebb65bf99ccda2a3d57cd25f2d56cbf9e36a65f732dbb321f68480b562ed6871eb45ce5a95bd073666e5eaf7107dddcff4f0e3bebaf2a8b5eb23ba77e2fd1ffa7c91f2d112dcddefe5d6b8b9c3fd071d289fb6ced6c24c6f930b6f62fae4c897773dd660ff3c3a9deff674db3dcf2bbb13c993347b8746077767896de7a4865824dfb552515d62d3f2be7bc717f4c8754987bcae0a1b275e6ddadbb8cf71fbebbed4f219876bd141ee3c34623856ef0c1e569fab8b922e799788a2935b5ca17ad9eea329bffbf0073df28e5d14a7b0bbb18fa86766e1aa22efc0b5f9aeacfcc0085ad5657f17d3ed47c8d76af56ee84ef3ba3abc96e4fd6e1caaf9cdbd3f19d7b2b670909b72d9f298b65d35e59d62e5772d5a89349ac8c9b5fe427c3c2b33ed2e98d160d5b2fbc6ec3b469cc582758cf27ad20fe7f079710de1e12bbbd179f20feb9027e46b75a4a9ef4a67c9b68fe93ffd4a07d933aaab6b9c6367ffd4da5fde87a2b149c4feac54b57b2decb990d54dfbebfe8aefde359cb6bfb105709ebdc1f55ecf3732d4beb74fdedd27fe4705fb519b784f0663fc559fef8eed94cecf35ecbed5c4dc5b19ff62654feb9c96de25723599aa2cd15520deffeabf3042b9badf6a61b787ec436425cf72ac1ef26152f18b553beb8eec68f1a3b65d9b5f3dae9e448789aeb272977b95c6e1aab27a1e1fb97a528f94ff766dbbf4fddff04ef260393e58d9f3eed9aab37a9d4e57f694dabd17b9fce55d2dee9d20ab77a3bb5ac3faf0349cac3e96efe673b4f2567babfdd54170ccf527539f52fb717789db69f1cbf5891ff73b85fb76bfd63fa843ec2c3f0cee6c5fad8e56c733ec3891dd2fdbb57ab73ef25ed21d5fd231f535f6c3bcba3a599d7aab95dd55daee9eaecef1b708f8774b5acea628ecb99b35def3bff6fccef4d43b72ef9face26fc2ac314eb7efb497bf6375e3fec65af1133df22b19f8dd7b06cbb676f9bd45e5eb45cea2db13508c83db91ce5d073fdb95409de1e48791716b2337d621e2ea3bfb765cfc7ccf7ae26d17d758476d7de73b9f2bef76e33b3c86d375bc36d6dbda9ef01db575bf9abe0b70f74cfa5fbc6c2ccbae3bd9bf8fb236f2706d46f3ba676422d768ae65af5c62da6add97b5e1a9912e8b965818367665576ddd3beacba3ffbbb5687c9f60ad9e7b6275bf5d593effa7fc11eb3fd97707d8ba0fd03fa5f5f16057b7ec5cd6afb2d19bf5d05c23899daef36fc622c6a3f589ed2ab2dda7b71e97c6e977e3b96c1b95f7cf699afa5e14bec384b1229ead586bdce7abddfe5dfc06efeee3fbc7e327bfb19ecc47eba9d4d0eeee0efdf5eceb5aebcefe1b6ad653d129c1d57abe5e64954477aa71ef265aef4ad6a5d7c6b35dafc2d17a2d79592bc48d127fbbb7d8ae3e592fd7cae2856d651b45ad1b59be11dd27ebe8edc5173952fe7b7e7ff6d3f86b9e19216ba3f3d626fff5859cfb9b75b3deba9275d28f60beaeae6b569ad835605b1fbb93c24519ec0aeec356a7feb8ef69a7fdd84ed81deedeb4906ddb7577368507b27fee9fd325b20a3048d7f57543fe8252e8f6917ddd933b7d6aff5ce7b1af717a3c6e66857d0bfac4ee86cd313e9bbefc1d4a77fed39ebc36eddc5cf4d72d7eb7f37e94f2beb9edfe875fbd37befceec5f299b8eaee9cfac9557e3738edf9b6c8e5f5254e4dd93d40a675d6bb67ce4ab246f77de19c82931d26adf5cd8e5ff1c4198359627588ddd1725192511fa2d519e3b2e9db91e7fc9fa1d8a96b236ff2bbf6d73592f64fe4d35fb8522feadaf7c2d873e9eb7bc9d7e69f9e88bf61cff8bbbf8be26d756e794dfc877dafa5ef5cec6ae75c9eeae1b27f421f7067264df64bdffd039f36fff5c3babd7e94f8627eb6ed0fc6366d1ffeeafc885e0fb2c7796deab97ec6787bfd46475ccb7b78ac3fe7d6c276f7e77dd74ff6fbeffec6f0f67dbf3fd30be573d9dc67b4867cc5fcd4b3bf120b92b505fbfc87df59bfac3bebd7f5dbfa1d27801fd61fdbbd9a3fd121e7d21a7cbbcc285befadb10796e717f8b73f68b5857e1edb78967db70acf0dac0f204fed4cc30e36fb66212bc3e7d7e1647d349dad8fa3a3c4daaf27a57750eeeaccbffaee7c93763e307ab56d63fad1d1f4757dda1f87a3a8919df6fdde9d3d412be7692279bf17ac511be7d35341eff6344112bbbdb93a024bb141b6236357d8e75696c9e5b50abe85c1eed7fadb7729ee5c6ee592fb6e6dfecf3887cef347653df24d5974ffd84b70b7b6d2f0bcd728fc609e3ac9fc839e70ef2788edbb80cd9871ef862bbfff7857e794fffec8f2b77f7fa4baf3f99d5ff2b3fb5c2b29bd6784ffb67f03a4b0ab5d46c61701f448fb272d5a6e219e5b3123bc3069d8d9411d63cf22ba1de367a5a8b12feb097a26cdfa22fbb2d66ecf5b1411dec93894f559bb37c0fed585d5aebedc5d13f93b7c92135c6d792f7b11cbf99785edf1f5f6bd5eceee2ef94f5fecf69fe9de87afeda97e072d52eca5559d827387dcfbf08ffb231f523f1b81b7f9db98dcee99c41fa238edafbf9fe02c93fdbdddbf56d81380a1585be5b527ed43c6afaeb12f63d7efd8d51ffcfcb93fb2fb1ea8257cfff2f7d59dabf9e5f9ed1af5f6ddb5f29e40630f16693829ba8bb3c29d5c2a7a7ae670c76efd628fbe94ec6b9ea5e0fabb7d2bd1a8e8dbb314fdaaf82dd6e6b6766f8473cb3c87626749312886c5689e8e7c6f51189d61f7061463efaeb032392ea6bd97c5937feee3ef33aafef8d1fffab39f128bef488bdb732d5e50cc96effdf5bc657bdcc5d9e618cd9de8cb79fa7e54d211e591573e476175ee39628290d5c93e58d7494ae7f53012650d7b32fafa4e93bfdf1f717b256cffbdd8185712ef9eff70e78618ebfa690c0ef5347d5fcc83f9f8322dfaefc5a29b489b96fa49faed3a98f7faf6fda1edc5b76740b7efd4dff671f9efc1fca8477e36bf7855bfb9be7b8edff19db3909fd6e68e27abcfc2c8ee62d5feb2b6fe831dbb73b175dd0e6aab7103796792db0360d22a8c1c2e70f67e803dacc546648e5d632d3e8b8bf1ad3de1da767fa9c1b59ab90a53cec2d4a330e59efeec7dbb7fa71e698b4c8b0645dd9e99b67b538b86c8723b1b66d0893c7bc9730ee57d4e3ff826ef5f6386fa9eaa9b9d75a6f7ad0ed9dd37f59f5a67b752cc5ebbef7274e5b82af9a13b6bec22f1a0535f25565598f155b4b6edbadb4fba3faed296d5d9dff9d4eceb74876baa476a5fe6d28fefaaddd521bbbaa42c73656e16f6fc967946f63a195db23cf31b53e327b8774f2cb0ff665777bc977400d78c3f648dbdb8945dd1c555713dbe995f67cf9e7bf7888d83db952917f37910bde17ac3edf18ada83c3f587953d767d7a9da595f8c597f7ef5d7a83ec7af696568b9be2b6b82b8c27adefe9dd95257f7d8d5dce1a9a116adfd9523c743fec0ecbf4dcc870affd250ea556d67efbcbd90f3d53f325962511e1a22d116267853c6645017fad2ccbdd1b9d2af36892664518b4d59a0dffbff6feaba975a6690385cff7cff87cae2287da474eb2c12c4004033e9373c63955edfffecd35dd2d8dc632782d8c59ef7aeea2a684654b1a4de8dc579fa8cf27e27fb2f3412a9bb1707ee7c85824c8bf0f2aec59947128f37d1fd30fc977014e8ee2f7e30662f61295c513e7e8986b1532cd92e59902afc5a9a187989898d17a91ee167ce4335af8510c6c1ccd357e8f38aac53369d49aab8abcfc1b7448f39037d200174a37598017bcf6960b756ea1467071e045722485b6ea95a068f4e290f25e16475eb46e4a9afc171bfd3cbb6812fb8556223ad7be250b34fa1b6097b13f07b61b5d67eb35e4b9813e51220a000c29e45d003f0b188b8b63c2235c481ebb7814d92f84d8ed851aff05f8938c25f0017cf23b74388337d083f8fb052c27c3c5c5e272e92c13c4d7b7ce63ffacc94ee12c3dd19bfa6c5de8b1cd0d9fc11bb52df090e66de92fcbbf53fbf7d3b6a91eccdeeab337477307e8669d93d19cf808db64b6a1518f5e94c69e93269e58f5ef97956575a9f8ccb23e6b2f1b1c497f497e10587ae14f81cd68d95cb6de6bd5c2b23daa2d14bd98209251c70f3096bc67d4aad8fdfbd351f54363ef979c62e23d315b76140d7708070ab8b7da1a5125bd6ad95df6967dfaacf5068769ec2b4965c02c435cf0f21df8ef4e77a9c66339acbc2f4794a3283a9ad6ce6f96e379be9b47ccd760bad49899824db09cce52c0c7edea982a8e4e31a24a97b3515147ae3bb63eb343bd45cdef72ce91ef97225d553ce4516a4c173def4a2648719538259754fa8df258d7aff7266bfaf19f1c6dfc65e3fb3dd5d53d23bc278cf47211b53d6d6d7934e457ecaea5da01d343f25d036d1bf6a9b1da19cb154b2997cc4380b7d5210c62d439590a3696992762d3935dbf7f9a79c905f154f88181bbb14c31ed649eb14cd37b21a374a9fab7645e11f010c648111ffad2a5b1c5fbf4789c13eab7cb1cf38a22496dc04a411f205122bf46d36cec9e33c26a7e2f1bfa80a1f3e0b9c8dd08f485831df2106b6e75ae6121aaaf80ca013d095455e7aa1e7b81beb1440c02e7deec648e4c7d649d8f7c270fc1d1234ba7ceaa74285e8b109545defd84d698181c684ffe2d667e79354800cb6a79ddb900aaf1b2d0a9751acb9be52f8eb057cf5bde2eef902dd61f9507d349bda8b115b34eb13ce7ba1305434e95bae5bb7e7fc4626512fefbb073bdbc6fddf66eea374b0ffac164ac33559f5b33ec8ce5c3f271895da07dc4eaf368f93ceb3a3354b4d1e8e48c638b6be0efe91d4ddf9645f8a38065ac66f392b058eacbcec5f285f53158314e66a7cb57fdbec9e51bc54d97d987ff5e6c679725cedb61fc32338e4eb00c44178afaea77c34b96a05c1213ac737f28be4e57d3cb912ef9de18df00715dcfd7d4197731df47b5e4f2b83c88c52ffb135ebf7d3dc4ef68698a9f815d627962c46b3d867ac6474ddbd38d5d82cf4b255b2fcfc87685bc3d60d4c3ba0c9abc64da8bb8a7ce0bd1ef20af50f20c4c3bfa77f00eb3a915bcbce0fea4280f025968c80104dac5529d5f395c4b04f9fdeabd5609ca1d0122c1caa75805e820e227420635f24cf06e01d63937c4c6aeca8ccf7b4ef8043206c0b2ed30ee098ed89de803ee8b710d10dc04a3e4c0f0fd5f7ab1715f3be123871c8123b6ad22f18ec198ea290798caf06d9d53cdb2c685b7bbfaec3fab8f649cc5aad24f2302a47c3e196357686d2ce21dfb441f1169ab441207fc09ab2afcd3156f555bd5578dce01b0a5a07b089efd0a28701d67ac6d6ca81b78c678178aa656951c1fd40b2c04b904dfa38f00e3319758e8b85d96e99b73e849fd2a6aa5b41f1c5763b69ce95ccf05ea406277ac5a4e717abe6a43425c75bc008b173c45e754e21dbbcbe74aa1d9981e7613ef437fdc551463d553ad3fcdc1d6a5fd4c6ad7adde576dbc6fe2bd9e6c56bca00640e7543df28068f76a60485b8fe4d30f72012f19a76bc73c44e675350ceb8ae8f97ea5a84e50166da73ae0f951e3d9bc5c8d9a17f03381a2a879fdbfaf8fb07fa5dc261feb6a6c44177ce443dea08fe8e32bfb012ed80fc2b8c0d062250f1a3c66257e5889eb113fbaf4ebc40bea7105b4e43b6c5b881fba32e4fa22c50abc97016ac1cf2dd16f578c1fb6526335032598132fd43c48f185d582ea05a296e44ad1dd15764592f432e0e7c3b3ba4a91ed0f7c4747afa89db5e218e3a17ad62a435a3f227de01f814d0b3c44f252223e988390b60791423be421180fd4245e2122e7d40b700e747d15f4f995c7c6f3024cb595cb3c7797fcff67f5911745bf141d874fbcf232d458ba2461d9f15a9fe8236f952836a068e625b291ad72b4fa707e8c4caf31e705487e0cfaf2ea90ce5177c87e6ed6fe306d50bb7cff0cdebf3cd031afbcc27484feafa50b1ea173da291f72b1523b67754578f489413db5423dc066f50e1e536042b56bab6be82cd581e3f64f156daff378700428fc2d628732636bf1bb95e223e545b9b7ba616fabb68e0f757ea01e4fe8230635828f5f7203bfd3170fc48afa2dea62a20688dab58a2aac7e398b9ef6fe490d4b6fa2733fd26a8c6e413d1c8d03b053dbe3cfe9232cf72f5ec94ebfba33f88191a3f861f32c3e1213d723b69ff7e7d5fdf2da5baf5bbea9ed08fbe4c3f7874ee1197e07b512560f5c433865e073e4289e2bd0934033d5f880f7c1ea091cb3f63bb005564fab67aad514c465199896413c94c4f71e537ea6e00dac8a5e50836a22988cb6446b8fbf35de5f694229305fa889857168962a8d9e9ab715f34c5493d53c5efc4aa24f9e13cfac5d1abc6517f3f4b3fa08f2889504d1bd812fd8bfd29afa1acafd16726b44ea121e13ad65e41756afabb7c42471c31889052b579d730d2755c6c8d8854de4b363c959546bf5c6b84d7e0ed890743df76ae7b18b7ac573d44d7774adc27ac999d52069951295d541a2b33a74ba9573e004a8f7bb5e1dad8e9b6dd4f15b9dac4ea758dd8ee030abf100ef28fab73348b28390e76a1de864d0688e094364a5f4b3f2015dd75e4cc66b3ef6dff27f6c3b7feb47eab7d283cecb3d5f499035e4fecc1227ab0baa2ab8c22eb87538f6cf9b24755d17ff155562e715eddb5aec4c7ffc79ff08fbb351776a5a67b99769df6f638fcbce92cf06fd83269f4c948b0db52b93c87b169cc5b8380013a3f1bbf9488972eea12321de2c59c68a57c70ad1f6a4a25f0df57d7f48fc7606daaa5649b266f43f4d3913d55b3a57cf53cda5c931e7e778acf5428ae5bc8cc06608cc6275af649d9e9384dd8af50c78ef62c7f99338ba2f37e649d085928a472694c4976cd17b26db54636bc6b10f62b74b760863b1c9586a71b15a5f9aa79fd347ce880e366f56ed6417b6f85a9530d195bc1b892bfae4c833a76b15bd195a3fc7b66aba8891ec35ca24c3aa4658bc6b31bc08400ef8c837bfbf46273a70dc641f96d6f9db2a937c4f2a4d3a396c7b8b57a7981c55d3dd036736ee038316d246b301fb542f5ff59b3784673c85fdedae511e6a0fa83f56fca6981cb7a7c9c9f2daaff8478de270f85e4e4e7525bc02f9e47b8c92f19e55e37c4975ff9233d49e657f8bd633cc7cf6981db16b9fba79e4ba32b07726e7cdf7245005a7cea2d64f2e93eafd93c9baae9f8ef880ce93b348aa159b04a56df7ddee1161d770bcd6ff757d24cd7b3e47347338e2bcf24b2fb0956c4d7b36f091aaa03f9f5175cd0886a39d9f6ee64a9a9fbf918f24990fa01eb0f616de914f074873c8fc820d071e565d4f12f43e4b988c669d45adb31878c1824f0fad1f7e02f09f2478b2e345b0f6033d459d4fe6a8495d113d070f31e31bc7bbbfa9e95dcc7100627bac7609b312b63d8de17c403a0be2a5e11d85bfc48ceddd49fb597da44098ebc052ac979279d4e61bd66c4be216b4c78a7995cfa4dbf8b788e15a1cf7f3fd5bf23d3b73c69db4e54e9b8f7c872dcb3cbed0739257ce0c7891a8d6895a6189d7c110fa8348435211c06f3b45d4c0d5381f197f5c5e906daee1328e5446e34b516c755ee353fe9a2ae92a790d6b6e74bc0413b37cae9ef362f8b21fc5f7311f7dcc33ecb66b9e823e8cfaa8680a0cff6441bfe3b8dea927910557adb75e6be3c46cfada4d246f92bf2a57e56eb5a3784d86b17abc1dcdd3cfeb239253fc4a769b59977cbf5ae2facc5662d332b171f175413cf019c5bd6a7a74e685787ca5284f8bd4bbdd873ec2ef8f98db1ec75b95196fcacf7b816d4f7cd9c95bb25c6b4cb314f7ff998e5a6a135fc1b317e6e0e588a7203a3e620394f112de227aca8077a3993f62da0a9fc2f1dd877e92bca33833bc8f7e479639c04f92f78b4943ad9d86e820cf216f951a62bbe2f73fa88f3cb33ea038662bedfc028e54d2a3e8ef966ff1880db486242c432f613c5fec101d497dc43b64091a83d154cf7be6e78b8c69b49deb2331726c7054b431f930be4185212de1307e607be15f493d10a92e878c567cdfbdf167c3f3fabcd6776609d5e01ba80f928f4920402b9a8b9abd1ae7f610df118e63f2d9a22c26cf7d032a1ffb4b9e041b13b6b079697d9c0dcc925889eb776d5bf6f7eb54b0fb40f5265be9a01e8c1ab7fa6406fe591ad592451d7fe06abb24f827a4f485e6a5bbb14dfeb83e12c9cda8d3671dc50d146ca9d964626398f9d86fb40b922f5e185587ef5fbca01a19ae4bbe7a512cd7cff2f277d5ec5c4da16f465c31f2301bbfd8e6f4e80558eab134fc5e902e285f2239241e51bf21bf00ea6724d56f3b39c23c06a22b7854e28978aa543ba54cdd90475165662f92b7833c95ca43f85cc17c8cf857e27887e52f096c93717e9452f87d80e152328e6f145f37169c33c15be498de72ff9bd7672a9ca71fd447d2c65e05f6c403f0e65bafc992a211c5f7026c3158e9c98330bb26a8b7c83b04f416769ae421d964e697e4634870551b1f35c995bcae694bcaa8659b661bba997b9633fc23bb78bf57c60094f7541a37d7d573b5def04c56ef8a6065f10ad69824360f7d249b9460c2248f66ed41a9dc4b1e0ffafe39dd03e3957c4e9e244ffb8f0de4663a8e8b5c1344e6086a50404d044fd9f1b8dab441e3f5b9d15cae099017c45668c63698fd7b8bfb2cef56f136d65a7e0cfd36da3669dc77f100cb83e2b767141301ab8b3f699c4f406da6dfbc3eff0e7dc4a4dd4ddab3902d81833e2c1818f3a5b04268a42e3c327cce8916ebaac06d5878d996734e1ea7ee8917e6697c17cfd8f63d25ef9065e8f98c6c571144eab3183e62d166c4a1758b8882279f3a2a616b5be009c5c40209097e11d8b3e04f08fc4e252fa2b7e9dd8638b66668d3125d2e796949556f5ebcff294e4f8ce1156bfa6529e65efc596751bd918fa4794eb6aa24c7170432c12e6d579fc9033fa78f44f386b15717a81fd229d64f666aa6fb1215fd2678bf5eb4e202bc4ce5fa6d62d57ceee79d623d9f725209a577f494ac3e2044b7943fbea9698e19e42f7fd8af401fd9c5fb092693f025fdd91f63d43b4fce6c3e6b15dee1a97be69ab6fc9ec0488ccdc7901ac60e614beadc0ecd83484f10cc626db342e4e27daaac63c17c8af1b525198c654af19ee67836d7190ad821cf749fd17baada3f17dba0ec10b6b5993cc5ec9fadc56fd322fa66b84345b71ca8d599aa19750881cba3debb76ba23ffc7dfad8f98f415da34f057b95689c628545248aace91df975e68cf971d7240b517bbc75ee82f60dfb3b6915f504edffbd48be71bdf95a31ef78e668e0aeb28a8f38b3fedd736e2d3b0ca0543df5e5192f3a7a51fbe4eefaa63635ccec3959e6a2c2e524d8edf7ab276c913f95d509765a6f8cc50d1ee548baf3fa0bcd088de21f15e81c7d6e225256ff32eb1be0b788b956d6d361d818fac00a9b322f56fa47671e91be62aaefdac3e920bf6a6abf988d21f46aa3937f5362c7a58ddcb29cbcce7511c58b4543b314b753cc2ad3f74dcd9a5b67f503c96e72caa4f959314761a72300a8a7e4f1d3396773d3674d7fac8d4d04570843ee251dc958ed69b7a84fb751f62ef6a9d43e923211f09696c8df58620e3f829f4920a7ea3605196594749f5fb69e03dc247a457de09dfef897dee77dd9b146a9838957c6a40b919a921e212fc2becc45a43e2bb2a9e19ff16d8b81e6378c8267f4a64f754d6f00822bc6450ab2282bf7e5e3fa99734be599122e0039d7277b1bd7fb73e62d62e697a614df333aab70e6c8ff28317d49a8a70639f703f02fa2c58c2432fd03d528a1ea7c66c3f8fab3d95f2d663b67665578fe3976c93e978c443748d261383916d4db17ca464f09267e221c038c6ce81e4a56ba73f7a119b95c6cecfd18eac303290fe9de807f7d40fe434a2ce3baaf8614cfb6aac53132fac712be36ff272e103a67e68f779139f8991ac8218b25278dfe16d6aaa6b8b717ecfa8e685d859af7be2233fab8f888c2efa08fecf3a8b4a87b0e5db6ff562f7b872023aa871612d5ffaf47e5e699c3a33aeb73573729c874e7bbf086c8cde4ba2d3293ab3c0af6ec668c5f4a73cdfa13e227428cc45d1b50f51ef1e5a75ff9a6c3da0ed417c1a249a82e823eb34582a18e96cac01e90b7d41a853b49d2420cebf68e878ea4a6a564fbd5f53bc167608f40ceccec109e917a9796a915a92d4da2ba456a964e26c591d4e7b2bb21136aefce3d61557713071ae1eadfe99e71f0d5ef3813f44766c903764dc171ed53976c81d8f9dce0c6019c0fb067c81bf531f3163fcdfd6693c7802ea64cf1256fc9647752b74ed43e12322f35f78a17e82bc88acc51f5eaccf19ebf85d3c44def79c6a12a752965f40e8e77d0c46a24d83e3f26b0c1e625ed77e22fd2e95269e20985de03d03ceba828518f919ad2ed59b45de7be28ab0f353cc63e66a1e126f948515f157193c0ea880d8a5ba021ff33a7db4fbea197d36721951b94df2f231bf293577cd4b6f3dae6e5fbaa4ccd9cfeb23c44b9a4e2642eb67e34ecd5926fbbf526ac45239b6d73c8672f120a1eb2ec25e855a8d849b7b81ba8b1ee18203170412499bea14b55b1c0f0a9e73eb8478c4b9108f38e023bb9467a5a955d81ca6f2a92bac04aea5c5fe8640d208f4910df2fc47fe88185b135674fbdd292e2f12f37695fd20ea77ef6e883f0ffb58eaba750f5f12fc4ba942e52471fe7eace3e928be0df6c659e2bc59d1281007d68e957e615e04fbfd852ccb8873d07a4d33be7fc88fd73ad5395da36b9029c93875537e482a99e2bd8d8ad1467dc2f91e78c7dfa58f98f4a0697dce103fa8bf11ed7d5fb08471c23852afcc33525e807368c61237949490faa5665d7d9f2c72ccafe5e78ee567dfc54b32d4b785c3166d436a34f160027d24d64aba81bf6cb02b699b9792661acf941f823c12cdbb9ee8bcd8c0407dda9c2f0ecc7d581312522f596a624247b9a53c1f6d53cc5acf171ec67160c0e44fdd91ff475ba96ddec73638ade71c501e3f3218fa88439e908ca0ebe40a768de90fd9271ff9797d24e3881fa11ad89a0487556b6744eb13057f9cbaa719951a4e88c3d276b003a631409e035a99d265525eeaa176552fa61e139d55dee9f693e50163de2f347dc4a8df18b827361fd9350f21dc587704fb5542560bd1d27087304ed691ad8f7c9c3723ff23de20a869c5e720bd8037203265c63c20f554ab06188fcf610cb0e46d68cf6c29f55c7d207ba11e9f5767068caed602f926a962eac57c16f3887bea7f4aeda8d45ba7d93caf9f75e64eb171ed31ae89a19f887e75483111a91222e197add4417980aae6ad073d3f337fda38af6a0b8c3f8ee803732366e2dfd6474c39b3eeadf311c9272b501c52f9358c9cd7d5a6abf4bdce2df4087faac7f7e976bc20ff1bf96a5db542526a46827adc39eb59dfc54b4c1f10aab95d87345e6c422269691bd711c7fdda3ce3a3c6f789d513ee498f48a9fba68e69d7d4180955c765dd132d1f9cb275f9887f7fe2456d81291ac71eea144b751d8b8f006d15d2584add0bc870e003a809d2612cce40ffe27ee3b929cc19acd4e7e4a7d115d964ee24deedc48bea8f19631ebfbbfd34be56a07b301f89e66db057b0da87be91a8a52ea41e15afa8ba3f6e6b3c13f5bb2c67691d53a68d8e132d710daa3367562da62edb0fc97cdaa9f4aab78df374826ba9160cfd63d7fa8859eb8bce2d066345ab356268c55b93e72577e36030d4df7fc443626c4411694ce2aa9efd5be8246958ca1dc71d8c189bff9178089e07dc43f1d5e3ffee73ba9cae242ace9cb16332acc321c3ebdd59805a4177d1fcc7789ef6f1ab96ae564ef46f864e11b5c0d2358ecebff7a2befa279c4f3cadd42e49a6d2f5fa23fbd3319f88cf52d74cd28849f0265cc7395c2f6983fffffbfa88f00ec9f130692ff6f00bd333752edd20da03bb098e405383dc5a874f84e3b3505f35a0419e17d45f94baaab0d9a49b54174feb28dfe10fb17988bceb05c55811b2911746d698f2bcbf051fd932e2437855bf48fa08de7f7a67acee472fc0d417fd007a4953f5a17ae985f52c3146252fc8cb48b7587fb17819763fb023b54f43f418758f749b7cfa66ccb6b6ad614e3b1cff3cf002ff7992d745200b3c7bd1f562d7baf9ee35fa73fa88d005a2b909ad2f987e697058e80b0f4a16559cbd964a77577ebf8a382d689fa087abace3b69dd9bc3d705cec984e2add43fd11e786b11605af575b86d5b9fb64bea1deb0fde8cfd2fdca99fe9dc89db63e62d62f8c9353b7d547425bcc62557116e8bb44aa07bc80fd09c44708eff7539fb57d3ea861252b5e7ce16a25be1356632fef8f5ba26db38d0978591a6bf91745914ed5ca1eff727e4d4fd86e9866db9fc7b56aef9c597a605686667f869aa3f410baa347b506091b6c36bd2584229d2bff64f41f1ecea4bad7c899f5d26a3e808d5562dd12e3fbe22cd2132751ed266e03bf888ceb2e6d8f7fbf3e22ffc7ed55db270e8c73252da4a7145f54e61cbb3647f2c186b2945cbc82417f0ad173dae67e66d1235b3f31e995f9bbdfa55f663dbe53a04dafd76c8ad06227f4b307da7c1c9ff80c7fcce035da2f7243f4fdbd49bc2ab8fe91f4044d75801cb120be9b9e6da6d7d0abc6cc8350d141f75bddab31f2a2b93a1c5305de8ddfa7e7ebfa481abcdcc4e735e75cdd37bd54f3fb66ad955de29e7cd67e5e1f31f76a6e7daf1ab23c8e1afbb676e98fdfa735bf754248d21aade092626287d7cbe777c5476a0b67361a63c65827a17b1731e3880b0eb01873461fd4736a59431f09ebb22e029e60f6eb335e22d7482cc183534cafc8feafe3aa6c1ec0f92195d2308a87cfbfa3efe8983cb0f5918f790d284843edcee9eda00dc4d3ca0bf398fb5a1591f5a8b43aae371bf5a61e2fe08e28de6df1443d4e7afcdcc1335974a56a27f84f0fba0470c104673fa5b15b8ac00f4857d46a4fa65390fa827eb1b499567c0a71d04e1803c13a90fa2ed37e4c67cb039d9fffc2f734e6eb7f441f91ff63f76acc9e16f9946356d38a46a6735c8f43ed9a96a255e93c69f011de60e81d01968879df38da6fe72efe290fe17705fdedb0ef23883af7425a2e345fd7f432f985f81dd89614e8335bdabdb092313eb0310d946ed0bbe0e73d132f4e5f514c17f4151def86f71e7ff05ed031c43e77463b10b15e7a5e245f90710a344f820e03a4d4297b169d9097226619a814c1b5a6dc80eb9404d8bcb2d6cc77ea90716bf4e7fd23b2576d395f68356328d2aaa59827e46a8f045fb0b77c84dd0631abc8f0d508ca3a5b95ed311ef3204fe935ea1e65f8e44b4e202f9bbc2ad047a4a6b7cd137ec796928edc47f5bb72561d92669bbef5421b8fe4e8dd73fe083049ccfaea461e39f2da41bf71fcd47f22d7956815d72f17edc5ab3faeff22c92a7d47f158a39bfe207d4fb9efce893f460e8feaf3630caf9fe9f85bf0e249b9071ba3aee7f248be975943d3faa2e29733e730a8e1a27d50b04d35ddde0d50f6a8de8c17581550050395bf2336c034cdf7ead11f6bac46c5bb462bae0d83f9bcf99ff28fc8ff9bf411fbb3994fc858533adfa4a3661d362cb522d20f6a54cbf49d796d402353065ea31daf25b8281217b449eedd96a798f779a65a5288ba087884914fa1d145c12b1e0cfe61c46069f9fd51b26bb7e0212646cc3df9d061f71b5e1325692bcd7bfa8b69b89983835d90fdf8bd10c7a591390e884705310fc29f390e5b68bef6ad287e907e22ec1bc16186e505f92dc1f5c6b8c1ee987eae34d24a42832ea7e78f6380f7c64bfe767d44fcee54175e8f0ac77c2a5aa27d2039c51b8018ad565a1395237f0d8b7d356b3dd53a18f5bc13faed5ff8f39953d4715b05b6d384f5e3173a7f646ef4c36c66fdee6d6898fc2ec7bc042bebd2af94ef0d9b9365bbd2188ac867bf37f2330c5b15be4fbfa45fdf9fb6c0a9628c18b9bfaea800d49dc47b21fd9658f43ace225d7216e301c563693eebe97a5e88bbee46f006e8bdc5b6a5f135617d004f9b239bed6e35734e823973b56f25c57825391aeb9ae2e5a87132698f5ad32453844bca241e61a7aed56756d46f099e5573d207f5515abd7b4d6a54ee5bc6f93bf591381aee7d702fb659a186d3f894ea7547eceacc77342d83b473ec85b67fd173e4735c3fcdbefca95ec2b1ac5a6bb77cec92d787cf917c76c3d398e67ae4a63cbfa905750c4d0dfe95f48fde096143a64f897ea7b976a2b64389bc5f8d197f23d60dba55fa9cee87bc791d2797611c2c5327111f17d70841dd4550b3f69c7810785b5a741973bc247ff3848e13b7d12ab3cd6da7f859dbacd1bf571f31f5019c175fabc77e0fa91fe209eea2da1d6aa57593e94b20ecf460edbc637a96d3b59a52fde9f826592a77c6a3cac9eab29644959bee11be231fb2839c45a9c73e3572e06d5eb22dfe96f0c6291d1b6a770e3b821f16f2108dfec6982083638ed7b27608647fa977b5753c97d8ccdee87af0928c9349a0eae8fcb4e7f43ae501aaa6a58f190739e390fe567012d6fccca86201f35cf59b767f76803c98ca61c6ef1eeb772d46e623c7c7943eaff953bb54eeb513f0fa564e52d7a41765cacbe74cc5e0cdf360ec16f0b367aace385373dc4c9d7deb9eb33d2fffdfd0473eb283dbf9841ec9bd19a59f649a4cdb385e0b3a0baa84c2af92511ae658d1ae4c5bad1aac2497f054025a267a8a6db38fe30d9fbd9ff93b8e17c87404cd22d45e45a2425e47df8ee5b57c1e412ee227fa48246f5cce3f91b6debda7382aacf2b4e4fc9bfa59ed93b14f139e3d2a77eaba2e675ed456283cf9951beb1035b11582dfab39cf74393e4be404d137e477eabe19999b7ddab3a4fdedfac8e6df87b486ce1f38240b6394e74e31d3af9f64de9b8dccc0716b3789ce3cd54d0045e21db6a37a669819553c8da8833a4f09d2f0e799722f51d73274d179e51aed39877089bd20aeecf7311cd35ac7d1fc0cd24242f5e91dd1200ee755948c3c731d0b3b2f691c31ec9e52c5d3194b8f849dd25fcb2bf9e068c6e4ca0ee3d862608f61a70c67feedfcd21fd765fc44075c293e227a9aad8709af3f2bf79a4a8f582432e30c24a09431173927cccfc9b00e9975168389d3cd4c499f68ba9debcc6c389ade06f5c41688a7d0fc8c9ebba8018fec36d1c9a8f14b562a27ce25f5afbc70d6f483ff417dc4a4d59b6c4ca60f5be8cf03db3fd2437f04d48043b22ca2163b383b625d6117923c6d39f6149fe92819b99ef242599ae3bd6269cbefc4099bfe9602d3d053d258237a4589e3a71eb89fe721ed5fc321f90c0f39c647227c085127fa399c47329578683b7eee335f36749b37aa675b35e7d4f62b19f7c92cbc805f577dba87d631f01bd15b3ce3a87ed751fc3ea3f86ef517cfadccf13ef8c8dfad8fcc2d1b939ccf18df9bfe07f1ef66c886d43d5acd32ab4c1208caa8d35e663f36ea7e138d36564d81337c4efd714dada60c66536b8db86779d06a1b7c2467b48fdecbf405934eb2108c46c44d6532e42b89e46d14287f043e045d59075afaa5ed27d9929798fa4809b9e3747ef41e4635229a1d988e3a362b6df091a991cf638ebfd818339abfbab51efc1ed397641258ee819e48d7dc05b1b9aea356b8a3de197a08e2b2152f255fcb1dce6b9f0a70e167b31bf2bf346af089284dbdeab8ab2ba7db01f548ad668b7bba3f6aadec55c6f97bf511931699d7d87926568c4fd00ae43b862e92567467207507cf3897f132dc2592b3870a074d608df4092f57cbca71b5da7fc73f228d311a2163a37af238676051de4bdd46b53bb39060d4b373148fa6f1b31c838f6cc3430c5d26c0c57a0c71abe47d61290f72fd8cb1cdb8dee77c44de0fba5dceb8470c0fd131d6a7a423ea6a6d175ea8f331bfd0fce4997e03dc67b947a543715bd34114f7662fedefd64722b6728b87449bd85066da26a5ed5f780b4763fa81de7572dd945e6dac21131695c44711edd5e86f57540324931f2486a3cc1562bf60f3ca5c6bbf40d4b6b52d8f0cfb4ffe9807c26c498fcabd4c81aa8422661971021deccce3cccde2b596ec22c2c66975118da8eb146e63cbb231474a95001f992cccb5aa8e8279216c9486b37c6ce7b8664926c22b9bc11ca4acf7119c5d3aaf734ca617a3d7f62bf349cf09f33b52ac23e6fbbf2031a1ee14906633bfa66fd507cd4b161a778cf43e5d37b8bbca5c81a22d8789ce3b706fd4f7d5fbc46dbaa87847be3cf027ce4ce36cfda78f98b468132fb1e99c60c29af766bb3c72a4a59a3256499c7fc1bf26ab2c22fc809b8bd599b9f5a275dc4ddeb0edfb99581e19a28b520b16ba4046491c997bc22906b664a2c1fc0bf5bd5ec80f312f6ce717319b44e0a35a28aed331bac25f3c923e6b6cfbb3fb5bbdfb60aee433e79883b66bfa6ed46834e37fc11fea40007f217d2fa39e9d61db95e62fa2c360ee5019f48eb0f0338f466de19431b7df8d3f60bfe7dfab8fd8727f141f58ec3026bf014d2bf23584d7f8007f87a2d59541bf2c1e35f161dfafcbefc3c7102914d6595458c3caad65029f7c54575a7f8f28cf9b1a3a13be3b203f4ea54374103e99d4c8592415bf025658d785ac5e9feb77d1b8244ed19ff79cfae9f20e39e49a0f3e0b36ccc7bc44dbca4ad821ea7d9f08a581f0ac88b7f419eb4bd763c906745f8f63a2ef24ac9882a88d4b6c55922b7212f04bc2e7273d92e2743daa115251ef58ed38eee8977f9451cf6fbd388b96e87cea37a88f9bec977b4039d291fae0313ef7cd633fcba1c1c3e2622136afafffabfa88499feac6e76d7303b6f19d7894bfb06c84f536827a8b563d0c9d69540869b5ae137e46f43ec09c159da210d30fc9db8b7b874dbccfe499122f253c959f01f91cfc0c3c4eef608ee10aea81b03e63f391f76c98ff1fe8288267f516f2aa35ba8ce7d67e73ec6dbe6adbb4d43d331c2f9c415ea4637d7fc1185e45aa8b997931c604dfdb3e2b390a66a37cbf8bb5638f45d5ba4e5f1bf091ef6fe24baff251e2a7dcafde3b79c6fbfeae73bdca8a2d87f329ae65e584f2bba0514b9e869ceb1ef8a0f7820fe2b21f1a3e04a2a5af8caf32774cbfcde7fdb76956d8aa5aaf129ff28d532ccf6a495d01416a95d878bb7136ad7b8a5bc335a8be4d98c29ceb584705674597616fba31e21984dfcd99af7fa559b1d38b7b6791812ef29629650e38730a3a89ea43e6703643761c223a813c01fcafcc91fa4ef1d9aaa64ac46bba6ea31cd80749f7046ec12c83c822c2bc91e71703de77e0cc3876c235fbb375bbe1f988aecf9fe023ad6fba37e8d709e34939a14d47ea0c9a476d793d655a8d95f64231ada8671bd8b6848e0876b9498f0a46fb42bf47ae75ee9430826129969a52c20b237e9ef3101b45e77500d78a637303448963b20e683de4cce8b74557279ff1916d9b41f7c1b7106bac7dfb40b7635e832a759953aa26a479a3e2252344df4ca8de6106bef673fafdc2e655199a071dc79d339e578ae9435cbffe643e74db0b1ff1784fdee8f6a8f7ea4d4083bfca475c455f5c6073f4f3acf132fe94f010bb61874ccbe4770f2a3aa8d597b9e877bbc78a9ec12af9c0f4a810e97fc83714cd4a384ee86bfe3d7a35d375ae6e942e206381fb43abbf7c9fa112b3ee27c76c69c9f03a7c27b3e19cbad5693641b439ebf3b5a80e77972d23beaaaa768df64ddcf0bbc4cdc757e778ce6343f75a3487fe385b517c62de9d25105139251f4b2f4116048dd9029b9bdadd6db55bb2d5ea45b656f5ebaf3507fe96cc63b69e6d50ec173e5793ea9867bd3307bd0736302543f8fe98f9fb4ce305df713f3c5e5be15afbb8d9f321f37c13f09104efa16f3c6a3d04f25eff1beeafeedb50ab63029c11c5b197736ad0cc91eb373ce3e3234959d372b6996df1f903da31ab5ab6bd442df0ece8708cd588d8a631e757005b12f4b6c5ef015c41dff8fc87fdce76f83eea39d92ed51c1e6327abd5b5ba23dc14f41b4769780734bc278e59b5f2b26a4cb3eff42e389f1d507d3060f22b461419ffc9d36ee7233be4fbf87494f365f40d590ce78d87049ea5c6b876961d57a03bddd198f7cbc8ec45a465a59e9d8c0eb353bf27f3999d118fcb222602c8a7e0856a8cb20b3a6a3c1735fed965f4b9724cfcfa8df76885f3b1febde623b277beab613f42ae3cd0f4a6b5f6dd57efafeedd386a4fe7392fa8590bdb8e641ce9ca0685308e56fbb42b74d4e70fe8fc027478d5d5a8058d97f614354f90afa26df4738dd315d2fc03876d5706adda762c6c3e72cbf91a4afeaecd076d68b9bd838a17f04287a42f34bc93f0c7808fa855363c244c32d067d069d88c6a97ea9e8842a4da8cb68e143f1f7f3abf26ed453ba39887fa05d0b713b344d59995678e9b594ddfc63e6560c15734bd4f775ba99ad3cad486d9547990159bd214f988b00a4f53f0ed77949e9228f8b3eacba00ddc7b60e234a0c7488ea9c9a3e378c747fdcff071ca983d37d1ebf6a88f484b7cc33dd3c4b12131bd5b5823c87b086c5825d657586f11bd44e4ff6c86f412e47da046baae197e4ebef8005fc5d683b6b59bd832728169afa927a863b344fe1ae821bdc3757d4a620544af42ae5f4fd151d4451c5ed17559c4af15d9e760dd7fadbfbb9c0fb9f719e924f3348de7fbaddf9b3cd079f097e63de104675dc24deba871c82a0a97cd877e92d90dfd3e0b4bf239fd6eaeee9f55bb3e5ba0d88820f6ecabfdb6e7635d1fb1633d777dcc39a1dffa86eb8f48ada9cc0eee3f0726971afd16cbb9412cac17d40d0ca20639666bc0689e22ef8b1f426afa968fb2373ef48382e3766fa66f29b56b925746ce89d93eebdfba5d7fa17df16247b933304096149d018b6dd86fa3b6d49b17c47dc1af032b716b5af1da88a057bc278b28c6fbb9932868ecfc22db868afa7992e761cfc797c7df7837fd0eec2b7a9ebe205e387b0b7f7b2297e8eb671713a7ad45b3e257d456d091a8b5c93495bdcbdea7b3555fe918646f4b65bdec43d65b5df9e3446eda6f1c977bc30cc527d49085966ba616afcea2bb74c88735b5fa239fb7991fdbae958abecf5f10afb50b3aa0560850a8d77cd3864d2812737bc15186669c93156bab7750896c33f8434df40097f04ffb6ce7c1c4c51c3c137e15a446c91ff1a56a0efb7960e105cfccaa3e77eaa1cd4b7f5fa49cff203e2a673ddbe67dbbb26bd963c2f82bd927c288c16e101ea36b58aad55e61de9c3ef67b1d45e12666cc9c110f5c57bac9ac4cf8c4908c75c508252da7cd3951bfeffffae2bc54adcfa17fe4fb7decaeb12fab5bf94c7fe7587016994a3701ec0f2d6d4450dbe2f1a8869263ce79173a3750bee798db408f392404e8e4a473dd0cfdfb519cdfcffa19177bb6213e087825bd27b6e40a968ae11fd128d76a970caad9e72c70ac9ea88f3a36ed1eb5db8125a331afc82e17ff7cc1a209fd237f3afe769c178d8df623a11fc06f863daba6decb1f42aff374ad138d79a2aead749d5fb5b3ca59efda71abc002c66e2ae89c46f2bbdf386ef665d5eedcf9e3c615538357a222d9d7c4bc3657e78ffabf9cbbcac9242eee6c1bdfbb391fd638fd10deef269af6a72d47ba837f69f8a44d1e1113af151b0f1587afcb988ac0bdcdbe71cea3195fb66d3c575c33630ef83df07f0b5a7b8f56bfcebcb26a0d4b6e481658bacfb49b468cd535bba23cf2c0a790def06ce9db36f923bfcb47ccbc12d5dedbd983ac5af9038e4f90da31121f57e994b38db2818702be20710e8269af7e9f547df51bc6783864bfab0ffd5ef6484967c75e887793f2b69b1b737eec1810ddf612af65f3119bb67ef5fe9ece512f22b6b67760ee10c9cd5bafeba7d1df6cccf652fc758810d4d5c91c4270e3fa26eb3992dbf39078ba253c57bdcffb9553ecbef8b7e4338ff64feab6674f54638b83aeb98bcf4a7a999f4cdf10371591b5ed67c7cdc7578f26cd36e3a015cf182b9d2baba858f622e1573b895b8de7bf7474ed43c54716ce3df33dc159cbb16fe48175a897f24023e2ad329de66dc583de098ad885c7f2b93eaa4d8055a0780fe29ad77057b69a9fbf898fd4bdddf211894bbd209bc71a8a82c439597c24825b65238a5ab5a7a4d62c625413b6df769bd8d44d7cc4967fe57f648279d178b2080f618b7015769e4bc67ce4fc45ec1ec4adadc5226f1af3bab79b39f8e83c6220e0af425f6b8499827cc600070d630a3b15e703e918613366ee21ac09807869fc41b2ce94282eac8ddc98672b67f17778c9bfaf8f300d731d37d13db556ff5b68b332e579f091489e86cd438c7ae454edb9e2a1f6794f6288f0cc03a6777fa68fcc2274cba4f779c7ad4d81956ff2bab07fe02ddacfa36b0aba3e7426b74c3b04b9fb6ea5dcd37cc47336c5ccaef3915df290100b20c033436e885b7566d57bf094fa22f3bc6abb3a07d1adbb8dc6b9db745b6edbedd47a4e7199ccd6870e61b7e878e194c619283a2fd0d5eaa9d1aff14d323db81da931e9e4d57dba9c452c3cc7e623dbce4f8a6dae3fc747e4ffd8d8caafdd5bd318ac945e983b1244309af5c6df8c78ad0b2326f8d1c0a9f2a2bf973c14c43fa1ee6f8001b20bdabb2127d3edabf64e96dd35bd49f01c5f48fac37bc096e50ebcc0ff335c1afd3363cfe278499c6d6d577cc4fc5e748b02e58b061829aa7feeb0d2d0f85a29f2eb747b5e88b1c2b6b9c0d793a2ead9ee283cb754e3e26a6474efcff411e963ac8d6f2ffe119b6ed936e8dc17ef8f1a7a9a7e287aa2ebf25a1821817f21c4561f9e19fe07337ffc9e7788601fbe51dd0e48369d5fb524b01fb56fd7c410fe5dff4846fa6dc9bf920bcf7ef7ee9be4531a7a9399ef8ea343f889b32b97aa7bde137aa93be57ccabc81976bf7973e57bf3cfe1927ea8f90fb890f2cc5f45d78d892f251ca0bce6f5f3a0b7748d85cddae3fabcd027c469d9782fac9f07fe975f3aa6d7545e752e927397dfd223dae2f56f944c59df16f72464b6fd97fb1f1997e3b3eff17f84776757fb5eaa72fc8800d7902a4a47e4cfe88f090585caa18fd05bf73e7de6e6b869bf9d3f63d1953a57d1e2339c6f87fc03bdc05bd07f2f7e18fa04aac5e7c3d4133ff6517fac8b673643ec71c4bd14984df18b88df556390b9cc9e9947fcb3cdc5d1af73563b04d5c813f9d8f753ef2fdfa48485b7e075f6bdba3a76965116fd47e4d7781dd889852ac1e77b5d93fb275de38f2334aad828edd7a60dff5b63613db7f1095df858fb8119ae7211fbc9b685d99b50837e7b343ba6c2cdd64d9e1dc11e005df301f79d67e88a2a2bd2d57af285d276411d8e4a6413ecff7cebb39df266dcfd0fb3a35d431738a15485959ae05537016f5c3e5e37cea14dfeb9dcbe1d8a7586bc53b600168649d993f34c633ce96b5adbefbf7e7b3ef8a2e2bdad9ef52541ffc22b1f9ec25c33f525a6fc1ef0dfd05f15b880fd2f9e9362dfcca98d8f6f874f82e33a020f9466ee186a6f5ab1b450dd264d3c2e7aef009f1419c517e466d62f45b9eb52bffc857c641f23d61db3aa1237cf4ed09e597a0924695e3b70403d3cda0a29d17ad1960fa84be321feb7c641f3cc4dcab9b68eb9f1e53864f56ad0e17f81a39f69dc7e5839b7c246697d83e7ad88f5c1718c3865c8d77996f89d911c7334d7d44f0ee83715112c6312152e8a8934f781d76fcfb7d73d19a7841c463fd387886eb622ca0d5e747358da39f336c3fd31dfa47b67dffa83e44e309abed9de3d6b0faaf563769d493bc74afdb45c2c007d2d272e4507ec899b368568124d8b91b25992786b6b428affa5d19e7e7f2d9f7a18ff0ffb097b805da2541ac6c4c3e7b8826647c6f1fd972dcfbc5b88ec2af4c5af5a734d8967f2dfed463bde9231e12485b979c15c0b997a941782ff03fe497b88a0e37c41e9733faff19deef77af0b7936d74549295dca55e3ed2a3ee2726d60bc17fe7718771eef94e638b08e6d63b4df655b9ef26feb231927e44b39a7582f396eab4015aae1d388f292187de4de3a9ab4fa9122e95df881cffcb1c6880af587108beb2bfac84a9fa77b6a4c4a2515f9443fd7305d628e5a1a7b619bd635495a33baff227598b972d58e1f43377ba89c683afc6ae83ff31df947b69dff4c4c7b55ad46b83689a1fbd87e025f9c3d0a4e9a605b767e75ae5df5ddbca1c6a64eb1d17dd8b2e6fc3eb66ded7778c9ff863e82e6b1cdfc8272d351a3bc6fd3625b1fc1b9a7f8b82e91f75b8c798e7b0798b542a3fe9406dbf2afc19b10cf54166c932df888f873504d0d357375de0be35ac1a73d3ca61a523a46c0c60fdb873eb229ef869bf8d0578efbdc7927ea00de01fd4a5799636ccb3eaac72a0914f9a2f8dcbc25c97a2dd6c1d6effe643ea27ce4ffba3e92e5fc01dc53e38b00270bd1d76e71d9617fc947fac8a31d5b1bdd51ddd3f640e3d6e6743eb5590f2bd42376a58f68daa7a422442a16ad78ad8d47c2d5d2117ed7fd47f7057a92e2790f949584e847f0191d6b9675421d809e97f8b6f9b6f50f9b8fc8fb02b7d17766ee6b37051c159db5c05553096793e647c761ab559c4eb96fba0a1e223fcfd2e5d68313ea87612d99a8adf03f7d24ae71ae9a5bfa5c1f89d45167db166647cbf76ab6122b6fbd46c92ef511532ec77d9f2997705bcc78f41748df8b33aaefa57dd8afc48f705e6bf64d2f5a7b446c5b4f5f7887afac05f169708d46a0c9428faa705d7bbb663de2d1b47e891de487d82ffe01c7a7e5ac67fc2e2ff9b7f511933e1d18fc448d4ef362d92a9f7ca48f6cb069315615ceb907e55e50274b9e65dae03fe389bfeb1f51f4b0fdeabfea4a719b70b5acfa23a0a98da253740f518f50cdec0beeafa413c63df67ff959f7886bd51a7dd6388ddfad8fd8fe9014e7449e39b3660eb8ff6a77e45b05f718b995a4176287e85df2e8df9a989315a9d51b447656bca5d213db41053fc39f4fe3bc88ccd5ffb63e62c7cea25d9056b7b57f84b5747d7c269a063ce096600d4afda63ff5e5dafdb5f347e47ecf843e8ae8ef4f717fb9efef4a4e0f560a631a8236030b11abaa65faa2f7ad8fd8efcd3924c8515fa25a7599f4284dcd9ebda00e7180812fd804e7eb3c063106a92b9219024c619387fc4e0ec9bfab8f08a6de2b1f8536237e4bc9a6dd974ff411d31fc21183b01521a210928aaba322f89e1ed3a53963a5d8b6943fd14732d6ef804938571aac2ff5143fe625c86f41de8cae52f04cef9ff451933173d5e3ace471ce1f374e0dff8ec8ddf33dea2399e0fddce989e3baa76e71ac28106ab94f8e29eb18e31ee4849648c2ea1b7e2c1d775032e6eb8d28d952ddd33d631f5954dfdaaebefbbfaf8fc4c5b3b25c9f2a7cae8f04fc43eaa31f52be34ea082ee03f105fae8909181707f53bcd967f4dfdc6a3d8d8f7c616fa086335f62f39bf0ff7e0dcbd296bb6a34bc67689ab1bb24fff88cc0ff0fd536473838517fa45e7c49817838f5095552fc06f0e6221e433f052506de9867cf36b6be03f7d2467b4687cb1d64760050536f9a7f15a467d7444762076b655e8dfb7d4b58ce7a171d1959c1fcab9730363fe2bfa88e92316591abad408b9889fd71f1129e41d517fcf0ec51d3c386ed72d0ffc1cf9113a3a2a9df511799ec9d7bf7bdee5bdf859ee7962914cb3ff0abe0f919e1c89c11649cbbfa55d52abea9d125007fa9df60ddd9394863a98a3b1c1477e27aeeedfd747e26805e8c205d1aa4ffd236f5e18430b6b2fec2c52afd7ac8928b8bfa69f7a57fe1193ce624523e7714b7d04ef83b8a6a07e0ae7f0019f1d3c7188efccfc49539fda873e62f178d8a1908b831d52ab729c00ef927625baf38379c2ce79e27ca0378ac513bf092cdbb8befdee45716bfed3476c7997e28fe8dc0be528241805c8d64702dc78eb3cbc52493573ae46a4d1f4b8a835e01b43960f7de2a1cffa2bfa88c41be5023ea8e3c01aa7992bf803627987f1193b64e1ad8eda23e613afea5a17f7ada792a0af47f586ae494fb53dc2da9339633ef631ff86ad69de280f3a29aa0a81958ff9181cdb39978c85263ce691b06a82df3d528c81447d425e40d5711d4b20e3fe3bbef67f5b1f3179099e05ba9923f954631e5a762b9d3f724047b1bbe33bf8e4878a36e9b8a038fa13476f7719af65de4bad8624accf82b3f5e405182d1541b6f06887b817949bb7c6ef142faa2dd95f62c41447fab1affc11f31d117ff518f284a0b6704cfc9cde45bc73345a600c768dde290e61567666d6b37e878fd8328e9619fe097d242a5f8718b0cfce625c37d0e6c4a77e4fe8d2fafc93926b79c435d646a9f91cf8d4cd5cb5aff6ef33f9375a339d72f72ecabdfe15ef88a7505f82dfa67c49ef31440dc5b7d5d1424b7f1a6b8478e9ab3fd6fa538af2c0b90f8b4037907eed025febb36348cbc5a6e6d64ba97c73caabdbc01788f0f6c770bef44e30eac5c4c5726397745f17b544819ff5ea8476ad4db1c7618e66888b62d92aff117d248e97a4c896d3b63d854ca3ccfa23e32ac9c5dd21d5fff892dfe377c6a46ef4dbe6231ef96546092f5adfdda8cd8b2a37e07d885cd1bcc2acbbf5ea45eba4d8788de67cec2b5e4b9e8de8ff25c591e9fc97ebf01820249dd16713057c936f48ff9eadf53ddf7896f9eccfe6e2dfd647e4dea6dcabe5eecee5ace605bee8d0f354f1c4ae85363f22090c79e1ee65e544c9ee517bfe2edefb237dc4a46538deb0fd2c4d96035df3a96e68ae1ca38c1d32eb79939cd3bead971cf25f670d5b5b4adf2bc4f80d63a3d7e7e3bbe79d9ecbbc52adbc3baa182a3e73c1cd948a75828ea473f44dcc1ab1411abb446a276bf9e0dc59d40f780ca61b7888bdfe8487cb7c98fd9e3b8b7f501f91868ace6a16de575ed46f6b5a4c2f429a8511465476e0538fa3b9bb6ca63e62d359f9fe9978046c36366e98ae3baffa9fbae738e185b7ce2b74748617e67ca7bca8dd47e6631ffa8869db82dded9c6d8ecf848f1f8973f0580a3b33ea429afcc30bf5333b9eab6adb1b7f175f6b4d2ffca7f4919c611757e706e5fe7d2b6bd42d37685180af75ef05d8f2bdc5f8265130f2da4c1de13bf591d0176cd44ed7582fb3e989e213098e123f8cee12e8537ebdf7043f0ae5b27814a725b570a96e6e584737c5bc66dffa4894e733afa4f805d4a3d73cfe5d7881d20f5fbca04e4cf745bc8a060e9ae82166acf6a37f0bed7ed6e925344f7d0d702add98715fef5734ee21e4bb773fc247be531f319fa3e847b2cef5482c395673f233d6d26f49cacaf9ee73aeecadc7f77e178db5f511fb99ac17c1df9eab90fe14d871cea9ffb92ac529e95a1d292f8a8f6bf22bb9b7f9bf391ffbf28f98ff3f938fc4f49deb0a431764cbd398fd77142fa7d15acf42bdccae0520d837d85543aea7f847f3578be9efbfa18f84be54c32ee44d9aeef2b16bacac00978ae55f1dfba3f8484e8d4caedecbe41a0ee532d834fdab3c6f1b7d24d4a75ca92dab3fabfecc1ba31bf8fd358d7d23c90499b9fd9b6675a9add4e039de2488e9255f3ad1c267a3b6498a6397f7ad8f649ce83890bd6dd67ae839dd9a17d6393ea29880de7dc5eb1ff9e3f7e2e0763eed0fa639ff28c77a99d4b08c48676cfdc5795d01c3ce97b779c8a6f9583a89006bd8e025ff983e62d160f8a93b134bd67da3ea36429b746dd7ae1af52b2fea53ff4e1e22f4bdeaadc710dbcfe5cc5d8901061236fe06238e4fb2f946ccf59fcec7bee37e313f67403822dc01cd23de28f61775787b8c2fa6e3e49e292726d7422e65b6895d02fb5580c3cc1218e2bd1609e2bb1b799834d3ce277371c635860b9ec583fe297d44e83ee590b8ab9ee3fa81cddda8057540d535736d8a5c443460aee3b8e585c6748ae61fc4c4ef7c833eb24e73c3fcc4595bc9d653b59a4073735d3f9b7e7366bdeef42d072caa0cd795cd84bf0f9e638fb34d43f7a58fc8fb0bbf7c205e594b273a03c79bacd42e1f9cd7cf5b8aff0309dc45e5bdc700ab51eb6bcde1aa9df995ebe7de590fbb09299fced57c01d57016c92b7ec69d919b6abf7f8a632772cea22675be701ef529cfd6b16efe417d24c3f9d18afee406965fe12dc4fb5da088d890ec20c3b2119bb50f1e22cfb0f3d9e3fe4f11fe6ded063b99f40fb420c6d7eeeb36fddeb73e22cde269b911d571472d4b603106f10d76cc849aafb4a26a5db54372639692bdd006066d7de13396a3e0fddab93246d3eb43edaa1ce344a301735ed7503eb17fff8fe92342ff35b608326cfd0bd3274bda3ab8726e0a8d30371b76298aa30a9ca613aa8711a1c5bbeadf67fa88795e9e2f7c21a5e99dae6fa577067040607b2b10b67af0dbe907cf33e5f19fd447f0fc2ccf91a2d958d5f0f466150faf69d43ccd3f8a814e059900317359f5ee4ff5457bb83aeafe2209193112e29747fd329dc5807191dc1e53b688be3fe2f0502f3299a3dfbbba7664ba7a077b5ba49ee2bfa78f1874b5c5f13b9a137ba1dc0a4e8d6c1e2db92c58a63fa1a6e98b1dcff45d3ef74df9ec71b4ef818f268d145c5cef8331dfc41ff6ad8fd8be8a9217c404e85d7f66bc5b4c5e3ae605fe1ffc76a6f8480e3efa8710a312b114b995757d5cec82b4173afac3c47dfd857518257754efe2e6fb9fd047e47e62db56f427d15fb573498e6b327cb33aef1b517e8a76e5d408642eb5fc099a463ee91b431edd959cfe793e7b48efe6fc7f385eb320b72ec77ef46b67a6eb35a53486fac2e01d8233b508c62263f5e327f411b30f78fe0bf311ec8a39e98039c2472972bfc9fec6b92eed16d52f211d862a5a03a1afcf3829e315b2192ad7ad14df57c623942b22362d8d48eb117e7df5b93ecd659c62eda6f5aa74986aa40e16cfdb3fa28fa4d79f05ac586dd3923a828f64e91da8e7232a7baef847aac7f4ccf4437b1beefb1d6362e3fd7ec4031eaccf422f4f365cb72d1ff96e7dc4ec47cc3cc97b04d86585e8f9604e72e1717ac178c86a4cdad02bb21cafa63e277defe3bc918cf11c60402a6a39468d328cc393d54fddf77f421f11fa2434589d4b0cfa83729d6d5986e5b7a334c3f7b7f203b4bf453fa8ed4af43927ba8c4187b6c961fbaa3e62f29118fbbcbe3e1b609ad0779e81f115de5778d13a1ff9597dc4cc2f9f39e203ba09f8c522877c97824375800b016e3c5d23c71ce33a2b9e8f7a243d64528fca0354481da1424f100fe684b10ba6adcf9c07fcf64e3d57edb877c4c30d9d59d775ba465e4dc087fe217dc47a564b4954a850dc3f0f7dea65458772c01a872f5664e07dfa06ccf651fd914de73e3a1ff7dddfa68f989ffff499a28f315e41fd80751abb4ea5c9471e8ce7caefb84e7cb54cf57e35a67e22aedfff843e62d34e4563d323ff7501db4789f1a7a0d55d39ee60dcb8a8979cc5a4ca7159991df7e34ff4915df3d48ffaf153fac84747d5ca73f6876ce2c1260f446d441cef9cae3baa8f12d3c9236abfb3cee2aefdfe81f349b35e80ac048c824ebbdece5dafda9d337f5cbd57bfbbd5f3b1165bf18fe923429f148dce15c20a378809d5987e152f94553fb09fefa5d9fe917d3fdb9c8f9f1a832f34e81435a53f34d4dcb6525e68ebb3df53f48f07b28da1417799abb590030af76db816b47f646d2cfe097d241aafe522f6d59ffae34a92f3a1b90e49a294fbd5d33bc499e56e8d9a7bfb78ef4d3c7553fcd0f78d7ffc7cfc140fe163c04736f16033275474b14367b1b8f326cd42eeae8add21ba5c78bd81b7e68f1db6a575d4ceea29ca99bbaf8e3a4567d1043ef454eb3f4dad27e1fa69f8dc7f441f11de207ce4816a76b72fc2ac9db6fadd08f4c4f6a3fe0dfac8bedb4fc66beda219b50f1bb04d9e1975776dbd44d64421f4b134d47a484f152f01e6d8b3715dec7cfc13fa888da1f4ea2c205fa6ea946105df7af250697737ce42db3f941ea2f5911b87f8c83ede7b134ffd4f1f89f2918f787024de8a63ac4e1de8118a0750be8d3fa4638467aa63a54b7e91eeb259ccc172f35099e51e956c01ec8202f39a17e7d1096d83c1f3ff317d841be845b247b1b2e021d821c3438eed35f3f1ecbeedb3fda78ffc597fa5f1fc21ce2a32a7361f91f35cab17b98fb907b21c4bad48e135895f71cffa27f4918c139557e74e32f7d4b9ae5f867986c977606639ae3f6479151c9a7098fed3477e9287f0f1537d24daff20c6c01fb28d8b7eafe3b002bf888cabae214c3ba476e6cf66955ad2d799cd0ec52be4187bac60f0d469f8dc7f401f89c997489cf4968b4418a785789e865993dca043ffe9233f3806fb784fd3c78f3570e105751523fef8b8f9f897fc23141f3a15ffacd24366e9a4e03322a36afcd8eb346a4c2fd435938a41b7f6f1de9b78ea7ffa48948f7cc4836d3d23ee7cf4fb68ac0263346bccca2856251d250fd1cc47cafd13fa884d2bd284279be6a86920cba03e928eed34ede73fcd47fed347f6f39e968cb1969f62feb61c374eff843ef2ca7c84730650c7a93f55bbe48122a7c7adee0cd56a225853d0474c3ffb77bff7269efa9f3e12e523dbf2e06ddf338a8d12d6434ec7fcfe96f9483a7addbfa98fe85ce9996a8a77248a542f49cb9f8ca71eb17ffca78ffcdfe623196f7d0d7cb446ecd86333fef8df8ed74a87adbc70dcc6d1f83507741a441d289ed275f1c69cb7b75274a417f847f6f3de9b78ea7ffa48948f6ce209f67a89d33be2de378c050fe3b0e439d3e03bfa0c7d24b5fe9c7f401f316983d085176f929d7b93e6ab3769e57b4bf8dcd7f2d20adee7f4e7bbc7e43f7de4cffbfd3bbffbe8b3996f538b39f76fe823c29784a6bceae32251cd15732fd3d79cfa9cea391a1b70a35d6bdfb473dffac8265a3cfd0d7d64d338c5db9462797c6c9b1bf31167a3dad696b5e977c21b24363cc4f334df6b1def97afdf131f31f7a68d05b24b1a26f7132c8d7eee2d575a9647ea9999f9e830a8c361d6a1dad7bbdb72f3c6f8a03df4c33cf727fac8363a80d9d29fb4b87512778f5daf45f37f733e22efb7177d84ec0982bf5a8dd0a45dd170eb5e95aef6a92f9c436fb2b8f7c783e9f4a576ee4da627d4974935a02fdf1faf15f7ae391e8b9b6f7eaecd4332d67ccc793e3e93ff3f6ae94faecb399ff111b79675a44e58886b66df3fee39dbb68fd7e7fa7c18ed07f848c23ab72b3e62ee7dd8ae047391f349847f44b04ff0ddeb8e9eff27b4775ffac8261a5cf0d66d399fd1dd8fee6f1fbf3a3e9fdd3f0e2739ae6ddb071b5f20aa8f7c6713ba40b42161d0ce306f7b17cf90fb119ec6c2996247705e34e151cd025ae5732ef5ae9ebf5dff84362d1cc2fe48e87eeee3f9664bb15c4e7439b1c535ae930bc6c9b53e7f7eadd895e0c33a303e1b3c23f18be72615fbaced9eb1f9f8f9dc6434ae6342c76ad0b9c056b6473e2234bd669cfb2e3e62da25848720be53fcecc23b3ec2a7da65db44d7f6a58fc4f90784cfc6e98776cbc5b46de9b6f06af3fb57eb9cdcd3fbe4de329771facc2ef84822e65ec4473eb211ece29873423e329dd4024c41913977f11c537e159ca502d3cbb937d1f8afb06b31fd1ab9ba0f6e70ed77beff7aff088f65ea3c46e283be729c7ff27d38ce8b00434cb798f9b05bc87336dbe0ccdfcaefa7ceba7fc2e6216c5fd2f391fa603ee2d689f8cb53cefa18c7f57fd311bf09e76311b94f68d7aa334dfba6a38ecbc767c543b21d3a7ef7f3c66ffc19b4019127496f32c93236782d7780dfe9fce5c4f7bfbf7d1cb9f45c3d16fb787e2d7ad4cf97cfc8c52b73b37ee70cb995ad368cbfefda519eff44c7dca1f159dd6752e5cfe5d1a1be6f8fc7e3b3fbd6a2f7ddf8dc9dcc47c047beb3493dd71b4d337ee9bd3a75ecfa4a7fdad6ef930dce1166df52c779528dc4953aa23ec915d32d9386eeb369baa569f82ec661113b0ed2a64633e7e380e763a5c76511cc8b34397fcb2dee73f41a798ed9171d67abeb6931edc7ff89778d4d4271daf8fd95be1fd58eb1fbf13b2d1573fd67e317f0119e0f6b3dec511f9156dbf3f34406377118cdfab33fd9be4b1f11d95d3ec3ce2735dbf199f16ea1134c32c6351fe914e66f1eaccf252fd42f1e8c67caf566bd0f23177dad0e88cc8f3caf64dc4b9add17f319f67bffee1cc7cec75ef411910989c654bf4d1f91fbadd9c63dc2f04b132fc9a837af293ed238c20830c6ec3ef49175fa5edd993e62ea09e633d4e796faae76caf9dec0474f219b591db102b34e2b66ccc42624f741ec82db701db1c949bd5ed2f93cc64fd4bf57cfb171267306e662ced04b3cc12c718a895f6cd3421e21304c80095cd2f7c5ef8bfadc837e0737d2cf8cbe6611fc6fea34264fd86e7d561d5b2fdb1f1f31f7fb77d1ce8f9a4779cfbaf6ecb3e2f2854a6388aacd477f406b763926dfc5534dbf109f13ecf5488c81c7f361fe3e8e87487b357e2778569ef13b7e4e10cb20cfc26f042b1ebce0c50bf99ac9df6c9e224d303553deba5dcd7c5fab2fbb990fcd47be9b86466d1ee4cb34cfefeafe9b1ae53ecf5c20d31d7b9376d39ba4ef1d1788d8b913835e7ef7fbafdb7faa3b7b8e69634a05e7d9b6571e807fd450c1065538dfe9e800d5756ac41edb4deef76abc8760ecdf514e9fbebfde09541fa5a69ed938f526f512ea510287c699e54e9d59e59c7503d4b03ad07e2b578dbdb62d02b364f2c67d422b305fba56d7afd05ff5ff9d33ab3eaa6bcff89969ddbfa2e6451e788c8ee9e6cf06afd9767e36f191fdf947cc7dfd9df15a9b1ad7df1bbef496fd43aabbd7291a74edbb9fbf694cbe93a70aad9723ea442187e69c723257334fd3786dd3d914476563b7e33ec027bba07ba09e16723e751cdc05e1ceb4d52a5f287e93529f9b556a99153fff84efa1be6b1c7a411e8fc6eb4d7bd13c73ce3dc7fd076d45cdb836a27e96fc26e5ade3fd7fa4577d3417f67c04d7ee297fc4dcd7df1fafb54eb315ed5bcd50d76adc2244a1dcb9b6abcc02f9f67bdf3fae8571a6a92fdedfbe5ee20c966a8697541f0ab862ee69bd302bad8e926ffe78f15a3f71af501b2a51019d0606b234e796ae635a4df7d2fa1c300ea72fd54ee524f1d09bf51c7f3c2865ae528a2f2d2f3ad7ed66eea28dca487d6f922cf7d3be925c062fa8ff8b4a16ed66baa2aecf75ae474da73877da83fa75ee32a9eedd56fc67be6a36862ffe6c39ca5ce53afeec7da8cecd12d7d3c3cea59bf5c733c597f24ef57579df4dccd5ee9caa3e76516de94ae94935d5c7bce653517dc4aebff2f1fc84f361cdd51ef988eccbaaf1ffaef8c86736995ceea0adf491b6da2503458fbaf7444ff5f7a51d3cff77fb27ed9be2b5829834b467aac5b268d07b57d5731b8a6e27d4f9016ab068fdccd3345bd713b469b9e814fc1bf08e7c82eba6abfb75d4774bb51b3b2375ee95723fbbeabbd63b654a0367f9fd9e6a8a2dd54e4d28a92aa3fa9044ec1cf0aeb26a17299ee62bea95f7e9fbd6b56aea5cb94535ab50d955675eabf19aaabe0f81483a57f7549f07d78cb175eaadd79fdf767dd9f31199a7adf247c4bfba0b9aba8bfc914d74d98c199d925d5ed345c5fddfdbe01ffe6d7346d5def2657fd65d8acd24e67d455e35db2e789adc1f72ef92e3833e9297c5576de659cb3bce49c6877e01f91fefaa7d11f83c2cf7564e6252bb290fc66ac5fa07b4a2a58e208e7a45ab7bcf9d7e37a9f483b9e3bfce1dc76dcf6ac979da7151d7a3bb22bd42eb18cdf14d4fe90eef73e2c5bab6cb4b58331d3866bd0342fdd3750a0fa4a67178ae7c48b899a8af2e0d5593f215c2d49cab1d5551bca8a2ee39e8d2fd9a33d5df17f4bde26994f30455aaeea27a2a106b07b3d9cc4dccdab7f5c568599fe7abce0ce3c17acc624d5fcb396b3a4720e384e783f5c47c242efec53cc67d6fda2d64cf6dcaed33aed3bed6b8fb9af625d35e21f7f7bce8feb63f9bf691025502eda132a81ac9e1886850e5996676a4662c5f633bcf677d8e1b179b1f70ac518039cb36a0866bdd9beb6640feae2b1a39e11a1891e79a74fbcca0e7f85f72f1a51fa0e9eabd7ab754d7a9c7efdd519420df209a8c9a5d159f28435063f88d57af3adf2fabff517de2803e830780e6af147d7f573b093b2cdf54b43f4fbc02558ef47d9ed4fbded278e233ee27f7b78f664d6354bab08fe553e37afb7ef77cbd755eefb8537a2ff0aee12df1b486da612d5826d4580d212b9c5bebe9848f2f3c9e9e319ea28fc4f3915c402f176bb4739d9eba6cf3261f6681fdbc520f358cbd25db834993898f446331e999e135b2d7f52a7150636ac6b6787daf6a9f6df399a0feea4cff4f75cadd4caa72517eec5ce6d52a6c4e2b5e6b4e68a6ef638c3461c8f7665cc735cc5958ab9bb7b14569901be903f555eaf2119f52ef50eb693a3f6bab9db380c4703e9be5dbf94ef7bcdc7d7faf2fe66a6652a3cac9cae9e67be9faa2f3d09eceaae5c1fbb473d97cac9cf4c00be6f50534dd66c11f27c7ab76beed8f51b939afe86dbe47727f67b19c244f99221c50fd47da15525b385a63b87c34e8e1a8cf3f1a752351031d55d592cb650f3b51e918c363ba26a82ff91877dfdf3dd22e19bc1bf5c6fee03ea87ba9778d43bb1c481f8d5faadfefb383a6e2afd05d6a73e82fcc5fa06fa5746d7b93b75783dcc4104bc5e42326efb0f7529c0c67c66aa60c3a9ae1a3d8416c9adbdc702ff3c8f7d4368c336ea75e886772e685f69a94d10ffefc3e181dced5b37a6a16cbaf542514dc5eea790fd40aca5e311db16352ed7e65ac71896b621b337dc469ea3f6c3da0f1dd1b929ffb905ace8926bf9788d6a3c6ef44d1695f7db7043ed81dd1764813a0916dc5474625da052d753fac5afce1bd502318f23ef42cff9c7e8755a2df7360ae3aab79448b27237b758634ba794bf7c373c063b0434c5ea4af2b7df08c6d5ac9b86fc9baff96d7077d609ea36b961d53e571e84dbd5f34d618f756827977c15b5bcb938ab50f343fd77cc48e595a97f36db92d3c9fd27e56b69307f770f99cab6b9e9bf13ca5c9732487e0d571993785f56caf81efed8ff383c4ace3555f1bb97a01752260cbc8a895ee1e414e56fce4499d3b51d73d33bfb9a3d61cd54f06155a79ed34c9b77a87bcf9b7b51a8d647ee868fb4fd267ffb0f9bea12dcefde0fdc3ffb38ed4c470a5566c52ad64c8f3ab97f14d7e44abbefb4cab0d2bba7c8236e8a17f22ab3756520942d14648858ffeadac72fc062bc9ffc5ed9ade07bb9ef8a392e52f58967748121a0c6ad528ad8fd268fddca3c130e00dc24b9e154dbe0c6932faaaeff9c2ab50ee07fa7fbc035ea2ee337c64a9ebfccfaea75d22bc508dcb13c6407dd67da6f7812e8335911f67aef29384ef98f92924232422f202d779dfd2ae15679391f3c24fcc7d29745ee46a693837dcf00c432e6c29da9e6f931f630a4e3fed389922d9617a5da2cb3e6650ad8aae7afb461dab51ad16c5a312eabb8a4bb616d062ade5496d5d8ce833d974741fc1435e36bcdf261bd9a6ef3cae6da1fa38573c61a5e8ae7b473619d4636c4127b8a095a76d3d6a65778ea95fa8d98886ff753df937e6797ccccfe83aacc8619d6c46f939d1dcc14928b7bf8f425a2ad7f7cfc3dd61d368f42b8e8f681e7349fdd5dab868e86fc65176c857f9084b7d5fe2494655589115deb3a1be84392f4b5dcc73c65bb3f560531f8934f68face786a11d382606d1faf7a297202f43f18c1adb929a6a266a8abec22692af2626f5e3ca49f3b17eb2784d74eac7f5557e41951ed1dc73aa0101fb7d17b6fc1459223b1763b7a3becf2fc98601cb1f68311a248eda5b3fed1f38453feb67a16ff4b2f955efd871df1bf80eb85af383acda551dd040754c1e54bc60b5a8d5d6873f173cf0c0d03f4c39d46c531e0be133af4e14cf29ad7dc0b3761fb5c3d3dd91479a32e87df93ca4e19a462a391eab9acee5937ae59f100dd4c712fd7e70429fdb15ff96760ff51f3b032b33dc5554ef51ff7f4ff7c7fbd60ee9fcf034ca3b36eb23e1efaa59be97b92b1e896789beb22e69fdac3e621e032a23fdbea777d576bc553e35ba72dce60dfb7c0a2cdfcc9da89fddb071321ff98c86dae7cc3df84cbed099a2754b456f6655427d833e3050ab66f440bd835cdb9c926c08991a0d16495fcdc88c790378809b255b0af800e4c9f113bd2d6880b6b7b32d0335aa348d2e91f531387fce92cc19af4aa1a93ca3b036ae44d711fe67dbac3ee3a5396b1c8026a1ee0b1fbe7efe79947605f4edd15805f08aa5bd807780c6d70ee3e571b1e500bb18bf89ac268bfe6ae94c2417e703da6cea2371df3f7a6bfd2e9fc7dfe74b7ce4abfa88f4d51c0b93c7b10497b9e82df319d645326c737cb5e6f62d6e1f047e76d3266cfa09c42e6f606ec3f60c3b817b5e4f65faf542db4bccf36a65e7ddf762ab4b741e9638c8ded51cf550ece7e5c3c1102b19964669d048f17bd8667a6a97b46bfe512691cfe595c402db4ce549c9d5d8292c2743bed4e70fc8deae3ff3f7d0d6f477daca4b3424a081588dd07093fe71e7a6fababca01aed8901d93a8c1c87a8be61dada44767da66b14bf5c2c5ebb37d0c4810989f79c1db33cfcccb3f448bbbcd60c79048eb5c6682e2b582ad2c5d2e647ae33ffcc7a8a4133710deea7774f839ff564c8e936cd363e933e32f46c5a2cfd0b6d57f67de47b1ed79fd647827e84bb431a3e634d8c0bed615e51e54c8af3541eb44dcb357886bb2906c4f28f98f6f9e7b041c6467c4e0236168ff844fe9a6d2c25a69d6f7c3c229a8ed522766c99797cc668986f10d8c79907689b8c69cf37e9af671cef43da13274f4766d7b3eea3ee9f47dddd36d99adc2bf21f07ef1ce727326a82cb780c5fc85ea5dffbc0b2f39736f42d46c2b0edfe7147d34f10797fa1a3f2ac4796c34d199d9fb9511f89e9dbdae7b8f7b179e31fb62feb2396ff25721f354ec90449f55a07b5f55f23966062c6fd06f38f3d02db3d68e2a04c713dd527c7d5b130b9ca49329bb9eadd341bed666fba9ce46f206bf72e487ad2924f82f6e9fc8269f93dd3bc0db607ff9a69a749e3c426c13270b0ab3ea255b65cbc89d6c97dc546f448b60e78ceb42f173e5e25fd3516e96ee2b23f404c11ec67da8e3ea0463e6cf239b79c7a2a39aebeb612cd2a78e6f48e76b3f082d8d564cf3cbf63f97c4836fdf3e8f591e39b415befd78f7ec1a0f5a66d4776e19a6d6b5d1fd96e3cedf7326c485fe12116b5f8701e3f9adfe0685c2ffa93d3afb6eeba09e8baa95ef5ae71515f941fabafab4262965773ed2a89b4a63405a5a3741b4712ab10d42961bb563343b6a1740b9535158d54aba7a7686d2e4976fcde3dd999612f07cdd4d6d433da1d364d5ba3a146837c0c3e62fa6423ed31a409b1b4ec23fa65cbe506af0af412ee9f5ed53ef7234316e25197fc1379b5ea1b4aca6b252966b5b5245e01bb9a12962633f85d94fed07ba0880c6d5b3af6d67786c9f32c5e213c1634fcb7e56ffbbdbde8fb06beeb33de09b71bee63ea23969eb471a76fe2275f695fd547ccf567f058fddecc5331bfbd278a1b802f1e5139d08ff3f7142fd65414b3aac621c536afbc4747c42c38e7d8230da5455495bee1677bc7a91c623669b5688d986de3819c8ff6423e4d6d773ef7368fa0b93b5827f1af873ae646df4ff4085bae3469da8734ec031b8bf17bfddc42785eaf0cd87b947c3f3f227f84f63ab1b68f11852e857a8af0e2e958e13a35f16fe07ef30bff76766c3c3f8e863d867d90a3f00ebf309a073cc2fc7d1cadfd8006cb7bf50e3d6bdc797cd7c6f3637d2476bc3fdc413fac8fbc7996655a64071ecf22cd29641fc83db95a68eb42c37c4263984dfca37cc159f4677eb63f7366d574a33877441f014dd4deac63f2dbc2670b8f16ecedb0e36b1a78493615cda1cfd8ce7f465af087b4a6e405344bd3dcf7d08e2f7b7d4d76fe8c86f1c8c4ca9fe6bdc41e736ae93feca7c0f307bcca250a4ff348f60b68df7581c645dbca4ec3f78ee8099be8bdcdef2c7da2f2f0c1f55b501e737c3f1c0773bc8cfbafe923dbe879f6f73be0275fd54736c58999f162b26e4dff8e5c8f6a808843cb3f504cb4d846493fc61ea1f84dc86d6c5934f766408348eec48ec1eac0ce88ec8e8f6696ef45b69b418fbc52c65edf441b2c5a134bbb6cde12acd0284f32bd5de8c740bd67fe91fc0ada1ef4c636a37bbeef7dd8e49dc5eea4479bffafd56dfd28466f7ab48ec1f7f3927ec6672be323e967edf7162ffa607c491f11db5a8c7c1f370fa6dc6ff3ce3f3a7a5fd74762fb698cd53dcd6be037e1dfe9cf6c33a43886c1d0bf086524997fe2239af3f35ed6fca2492d79109d01b1e347f48688c6f8f14ce339c255833d1ec31b02fde129469e8eb36d99e7ed26b4dc7886c423e9880d5b5a8a93cd0daa1119e992419b6c3dea33ba68af8c8f7e6bdedf6ef6f98ffa6f5d1789d72a19f78b7b9ecd033f9aebdf69a51dc66b6dfafe39bcbf50765306d05e53752eff443243f47acd470cfa44fe5bf2f16235c867cd5f1ea3b451dbd137d99ce2e4eb12e9239b24a735f972d37db6a695cc430686ed855790d647021abee93e3caa4dbe5e6c381be4fb753dc1babf79d4ef1e43c3b7399ae3f2e4ad8fcb9a8d2afe3e14c3c4f31177ff381afdd9bcfcc97117fa88fdfe46bf484e083f4bd44f649dbd212661346f2fac3559123eb2339af0c97ec7de5d8d7ff3ba1dd8dfe36c60b13ee33d363c7f75e77d4c03bfb989bfea27c741e623b26a7f683e8696bc414df311fddf1769c14747e639e0a8b5fa7cf4edcffbf0482dffccff7fc283beeb081e5dbe9c97b45eb6c7f70e69ad7fab75aa839f9e0f3ae69f7ff0f9180fac878321c57158dfef918f987b754fcfdbd8fe44eedd71131afe23fdb8ff6f3eb69e0f2fe423dfd938ceaa14fa47227e95bd8d4425f48f8c423fc5be6723c8edbe1ccdc96fb38716d1fd581f3967ff489cad6c1b4bc2aec60373f0b0613ef6b43e3896b0277e2cf33cf1916de285be720c7a7116fa96bff3799f1dc9eac97e929fea87436361c6b5edeba8fd0585bf673e341244e1e7e7637816ce87f0b6b2f6b393ff5bfce0bb3f0a7dd0b91255ff0ade19f1717ee77337f607b9da79de25e7fb7fbef8fd25067aefef2ff37144f311998b1f9a0fcdd77f7a3e12341fbdc3e858b07f447cc7df75647f0476c732c5a3f19dcffbec28f15a092fcc0ddcf3f3311e188bfe0f3c5f68b6c6c19afce03cc8f184e7e3d08bc632ec713e300ff962cc7c9c628f0c0e47f3c1e1d0fbae63e561349f8c06c3c969f7b635c9bf4ce6fed5773e6fd3b1fb88e360382d776ff3afcdc5e474345fccf6df8fc121de1fe331ade48b83e1f73f6fd0c3f3c27118f4866743a4b6e9f9d8fffb478f988f6995e683fa89feeeeff96a6df62633c5432ae17c4c46f2fd60f8fffbfffedfffe7ff0f035432c6</data> | ||
689 | </image> | ||
690 | </images> | ||
691 | <connections> | ||
692 | <connection> | ||
693 | <sender>frmMap</sender> | ||
694 | <signal>signalTz(const QString &, const QString &)</signal> | ||
695 | <receiver>CityTimeBase</receiver> | ||
696 | <slot>slotNewTz(const QString &, const QString &)</slot> | ||
697 | </connection> | ||
698 | <connection> | ||
699 | <sender>cmdCity1</sender> | ||
700 | <signal>toggled(bool)</signal> | ||
701 | <receiver>cmdCity2</receiver> | ||
702 | <slot>setDisabled(bool)</slot> | ||
703 | </connection> | ||
704 | <connection> | ||
705 | <sender>cmdCity1</sender> | ||
706 | <signal>toggled(bool)</signal> | ||
707 | <receiver>cmdCity3</receiver> | ||
708 | <slot>setDisabled(bool)</slot> | ||
709 | </connection> | ||
710 | <connection> | ||
711 | <sender>cmdCity1</sender> | ||
712 | <signal>toggled(bool)</signal> | ||
713 | <receiver>cmdCity4</receiver> | ||
714 | <slot>setDisabled(bool)</slot> | ||
715 | </connection> | ||
716 | <connection> | ||
717 | <sender>cmdCity1</sender> | ||
718 | <signal>toggled(bool)</signal> | ||
719 | <receiver>cmdCity7</receiver> | ||
720 | <slot>setDisabled(bool)</slot> | ||
721 | </connection> | ||
722 | <connection> | ||
723 | <sender>cmdCity1</sender> | ||
724 | <signal>toggled(bool)</signal> | ||
725 | <receiver>cmdCity8</receiver> | ||
726 | <slot>setDisabled(bool)</slot> | ||
727 | </connection> | ||
728 | <connection> | ||
729 | <sender>cmdCity2</sender> | ||
730 | <signal>toggled(bool)</signal> | ||
731 | <receiver>cmdCity1</receiver> | ||
732 | <slot>setDisabled(bool)</slot> | ||
733 | </connection> | ||
734 | <connection> | ||
735 | <sender>cmdCity2</sender> | ||
736 | <signal>toggled(bool)</signal> | ||
737 | <receiver>cmdCity3</receiver> | ||
738 | <slot>setDisabled(bool)</slot> | ||
739 | </connection> | ||
740 | <connection> | ||
741 | <sender>cmdCity2</sender> | ||
742 | <signal>toggled(bool)</signal> | ||
743 | <receiver>cmdCity4</receiver> | ||
744 | <slot>setDisabled(bool)</slot> | ||
745 | </connection> | ||
746 | <connection> | ||
747 | <sender>cmdCity4</sender> | ||
748 | <signal>toggled(bool)</signal> | ||
749 | <receiver>cmdCity7</receiver> | ||
750 | <slot>setDisabled(bool)</slot> | ||
751 | </connection> | ||
752 | <connection> | ||
753 | <sender>cmdCity2</sender> | ||
754 | <signal>toggled(bool)</signal> | ||
755 | <receiver>cmdCity8</receiver> | ||
756 | <slot>setDisabled(bool)</slot> | ||
757 | </connection> | ||
758 | <connection> | ||
759 | <sender>cmdCity2</sender> | ||
760 | <signal>toggled(bool)</signal> | ||
761 | <receiver>cmdCity7</receiver> | ||
762 | <slot>setDisabled(bool)</slot> | ||
763 | </connection> | ||
764 | <connection> | ||
765 | <sender>cmdCity3</sender> | ||
766 | <signal>toggled(bool)</signal> | ||
767 | <receiver>cmdCity1</receiver> | ||
768 | <slot>setDisabled(bool)</slot> | ||
769 | </connection> | ||
770 | <connection> | ||
771 | <sender>cmdCity3</sender> | ||
772 | <signal>toggled(bool)</signal> | ||
773 | <receiver>cmdCity2</receiver> | ||
774 | <slot>setDisabled(bool)</slot> | ||
775 | </connection> | ||
776 | <connection> | ||
777 | <sender>cmdCity3</sender> | ||
778 | <signal>toggled(bool)</signal> | ||
779 | <receiver>cmdCity4</receiver> | ||
780 | <slot>setDisabled(bool)</slot> | ||
781 | </connection> | ||
782 | <connection> | ||
783 | <sender>cmdCity3</sender> | ||
784 | <signal>toggled(bool)</signal> | ||
785 | <receiver>cmdCity7</receiver> | ||
786 | <slot>setDisabled(bool)</slot> | ||
787 | </connection> | ||
788 | <connection> | ||
789 | <sender>cmdCity3</sender> | ||
790 | <signal>toggled(bool)</signal> | ||
791 | <receiver>cmdCity8</receiver> | ||
792 | <slot>setDisabled(bool)</slot> | ||
793 | </connection> | ||
794 | <connection> | ||
795 | <sender>cmdCity4</sender> | ||
796 | <signal>toggled(bool)</signal> | ||
797 | <receiver>cmdCity1</receiver> | ||
798 | <slot>setDisabled(bool)</slot> | ||
799 | </connection> | ||
800 | <connection> | ||
801 | <sender>cmdCity4</sender> | ||
802 | <signal>toggled(bool)</signal> | ||
803 | <receiver>cmdCity2</receiver> | ||
804 | <slot>setDisabled(bool)</slot> | ||
805 | </connection> | ||
806 | <connection> | ||
807 | <sender>cmdCity4</sender> | ||
808 | <signal>toggled(bool)</signal> | ||
809 | <receiver>cmdCity3</receiver> | ||
810 | <slot>setDisabled(bool)</slot> | ||
811 | </connection> | ||
812 | <connection> | ||
813 | <sender>cmdCity4</sender> | ||
814 | <signal>toggled(bool)</signal> | ||
815 | <receiver>cmdCity8</receiver> | ||
816 | <slot>setDisabled(bool)</slot> | ||
817 | </connection> | ||
818 | <connection> | ||
819 | <sender>cmdCity7</sender> | ||
820 | <signal>toggled(bool)</signal> | ||
821 | <receiver>cmdCity1</receiver> | ||
822 | <slot>setDisabled(bool)</slot> | ||
823 | </connection> | ||
824 | <connection> | ||
825 | <sender>cmdCity7</sender> | ||
826 | <signal>toggled(bool)</signal> | ||
827 | <receiver>cmdCity2</receiver> | ||
828 | <slot>setDisabled(bool)</slot> | ||
829 | </connection> | ||
830 | <connection> | ||
831 | <sender>cmdCity7</sender> | ||
832 | <signal>toggled(bool)</signal> | ||
833 | <receiver>cmdCity3</receiver> | ||
834 | <slot>setDisabled(bool)</slot> | ||
835 | </connection> | ||
836 | <connection> | ||
837 | <sender>cmdCity7</sender> | ||
838 | <signal>toggled(bool)</signal> | ||
839 | <receiver>cmdCity4</receiver> | ||
840 | <slot>setDisabled(bool)</slot> | ||
841 | </connection> | ||
842 | <connection> | ||
843 | <sender>cmdCity7</sender> | ||
844 | <signal>toggled(bool)</signal> | ||
845 | <receiver>cmdCity8</receiver> | ||
846 | <slot>setDisabled(bool)</slot> | ||
847 | </connection> | ||
848 | <connection> | ||
849 | <sender>cmdCity8</sender> | ||
850 | <signal>toggled(bool)</signal> | ||
851 | <receiver>cmdCity1</receiver> | ||
852 | <slot>setDisabled(bool)</slot> | ||
853 | </connection> | ||
854 | <connection> | ||
855 | <sender>cmdCity8</sender> | ||
856 | <signal>toggled(bool)</signal> | ||
857 | <receiver>cmdCity2</receiver> | ||
858 | <slot>setDisabled(bool)</slot> | ||
859 | </connection> | ||
860 | <connection> | ||
861 | <sender>cmdCity8</sender> | ||
862 | <signal>toggled(bool)</signal> | ||
863 | <receiver>cmdCity3</receiver> | ||
864 | <slot>setDisabled(bool)</slot> | ||
865 | </connection> | ||
866 | <connection> | ||
867 | <sender>cmdCity8</sender> | ||
868 | <signal>toggled(bool)</signal> | ||
869 | <receiver>cmdCity4</receiver> | ||
870 | <slot>setDisabled(bool)</slot> | ||
871 | </connection> | ||
872 | <connection> | ||
873 | <sender>cmdCity8</sender> | ||
874 | <signal>toggled(bool)</signal> | ||
875 | <receiver>cmdCity7</receiver> | ||
876 | <slot>setDisabled(bool)</slot> | ||
877 | </connection> | ||
878 | <connection> | ||
879 | <sender>cmdCity1</sender> | ||
880 | <signal>toggled(bool)</signal> | ||
881 | <receiver>cmdCity5</receiver> | ||
882 | <slot>setDisabled(bool)</slot> | ||
883 | </connection> | ||
884 | <connection> | ||
885 | <sender>cmdCity2</sender> | ||
886 | <signal>toggled(bool)</signal> | ||
887 | <receiver>cmdCity5</receiver> | ||
888 | <slot>setDisabled(bool)</slot> | ||
889 | </connection> | ||
890 | <connection> | ||
891 | <sender>cmdCity3</sender> | ||
892 | <signal>toggled(bool)</signal> | ||
893 | <receiver>cmdCity5</receiver> | ||
894 | <slot>setDisabled(bool)</slot> | ||
895 | </connection> | ||
896 | <connection> | ||
897 | <sender>cmdCity4</sender> | ||
898 | <signal>toggled(bool)</signal> | ||
899 | <receiver>cmdCity5</receiver> | ||
900 | <slot>setDisabled(bool)</slot> | ||
901 | </connection> | ||
902 | <connection> | ||
903 | <sender>cmdCity7</sender> | ||
904 | <signal>toggled(bool)</signal> | ||
905 | <receiver>cmdCity5</receiver> | ||
906 | <slot>setDisabled(bool)</slot> | ||
907 | </connection> | ||
908 | <connection> | ||
909 | <sender>cmdCity8</sender> | ||
910 | <signal>toggled(bool)</signal> | ||
911 | <receiver>cmdCity5</receiver> | ||
912 | <slot>setDisabled(bool)</slot> | ||
913 | </connection> | ||
914 | <connection> | ||
915 | <sender>cmdCity5</sender> | ||
916 | <signal>toggled(bool)</signal> | ||
917 | <receiver>cmdCity1</receiver> | ||
918 | <slot>setDisabled(bool)</slot> | ||
919 | </connection> | ||
920 | <connection> | ||
921 | <sender>cmdCity5</sender> | ||
922 | <signal>toggled(bool)</signal> | ||
923 | <receiver>cmdCity2</receiver> | ||
924 | <slot>setDisabled(bool)</slot> | ||
925 | </connection> | ||
926 | <connection> | ||
927 | <sender>cmdCity5</sender> | ||
928 | <signal>toggled(bool)</signal> | ||
929 | <receiver>cmdCity3</receiver> | ||
930 | <slot>setDisabled(bool)</slot> | ||
931 | </connection> | ||
932 | <connection> | ||
933 | <sender>cmdCity5</sender> | ||
934 | <signal>toggled(bool)</signal> | ||
935 | <receiver>cmdCity4</receiver> | ||
936 | <slot>setDisabled(bool)</slot> | ||
937 | </connection> | ||
938 | <connection> | ||
939 | <sender>cmdCity5</sender> | ||
940 | <signal>toggled(bool)</signal> | ||
941 | <receiver>cmdCity7</receiver> | ||
942 | <slot>setDisabled(bool)</slot> | ||
943 | </connection> | ||
944 | <connection> | ||
945 | <sender>cmdCity5</sender> | ||
946 | <signal>toggled(bool)</signal> | ||
947 | <receiver>cmdCity8</receiver> | ||
948 | <slot>setDisabled(bool)</slot> | ||
949 | </connection> | ||
950 | <connection> | ||
951 | <sender>cmdCity1</sender> | ||
952 | <signal>toggled(bool)</signal> | ||
953 | <receiver>cmdCity6</receiver> | ||
954 | <slot>setDisabled(bool)</slot> | ||
955 | </connection> | ||
956 | <connection> | ||
957 | <sender>cmdCity2</sender> | ||
958 | <signal>toggled(bool)</signal> | ||
959 | <receiver>cmdCity6</receiver> | ||
960 | <slot>setDisabled(bool)</slot> | ||
961 | </connection> | ||
962 | <connection> | ||
963 | <sender>cmdCity3</sender> | ||
964 | <signal>toggled(bool)</signal> | ||
965 | <receiver>cmdCity6</receiver> | ||
966 | <slot>setDisabled(bool)</slot> | ||
967 | </connection> | ||
968 | <connection> | ||
969 | <sender>cmdCity4</sender> | ||
970 | <signal>toggled(bool)</signal> | ||
971 | <receiver>cmdCity6</receiver> | ||
972 | <slot>setDisabled(bool)</slot> | ||
973 | </connection> | ||
974 | <connection> | ||
975 | <sender>cmdCity5</sender> | ||
976 | <signal>toggled(bool)</signal> | ||
977 | <receiver>cmdCity6</receiver> | ||
978 | <slot>setDisabled(bool)</slot> | ||
979 | </connection> | ||
980 | <connection> | ||
981 | <sender>cmdCity6</sender> | ||
982 | <signal>toggled(bool)</signal> | ||
983 | <receiver>cmdCity1</receiver> | ||
984 | <slot>setDisabled(bool)</slot> | ||
985 | </connection> | ||
986 | <connection> | ||
987 | <sender>cmdCity6</sender> | ||
988 | <signal>toggled(bool)</signal> | ||
989 | <receiver>cmdCity2</receiver> | ||
990 | <slot>setDisabled(bool)</slot> | ||
991 | </connection> | ||
992 | <connection> | ||
993 | <sender>cmdCity6</sender> | ||
994 | <signal>toggled(bool)</signal> | ||
995 | <receiver>cmdCity3</receiver> | ||
996 | <slot>setDisabled(bool)</slot> | ||
997 | </connection> | ||
998 | <connection> | ||
999 | <sender>cmdCity6</sender> | ||
1000 | <signal>toggled(bool)</signal> | ||
1001 | <receiver>cmdCity4</receiver> | ||
1002 | <slot>setDisabled(bool)</slot> | ||
1003 | </connection> | ||
1004 | <connection> | ||
1005 | <sender>cmdCity6</sender> | ||
1006 | <signal>toggled(bool)</signal> | ||
1007 | <receiver>cmdCity5</receiver> | ||
1008 | <slot>setDisabled(bool)</slot> | ||
1009 | </connection> | ||
1010 | <connection> | ||
1011 | <sender>cmdCity6</sender> | ||
1012 | <signal>toggled(bool)</signal> | ||
1013 | <receiver>cmdCity7</receiver> | ||
1014 | <slot>setDisabled(bool)</slot> | ||
1015 | </connection> | ||
1016 | <connection> | ||
1017 | <sender>cmdCity6</sender> | ||
1018 | <signal>toggled(bool)</signal> | ||
1019 | <receiver>cmdCity8</receiver> | ||
1020 | <slot>setDisabled(bool)</slot> | ||
1021 | </connection> | ||
1022 | <connection> | ||
1023 | <sender>cmdCity6</sender> | ||
1024 | <signal>toggled(bool)</signal> | ||
1025 | <receiver>cmdCity9</receiver> | ||
1026 | <slot>setDisabled(bool)</slot> | ||
1027 | </connection> | ||
1028 | <connection> | ||
1029 | <sender>cmdCity7</sender> | ||
1030 | <signal>toggled(bool)</signal> | ||
1031 | <receiver>cmdCity6</receiver> | ||
1032 | <slot>setDisabled(bool)</slot> | ||
1033 | </connection> | ||
1034 | <connection> | ||
1035 | <sender>cmdCity8</sender> | ||
1036 | <signal>toggled(bool)</signal> | ||
1037 | <receiver>cmdCity6</receiver> | ||
1038 | <slot>setDisabled(bool)</slot> | ||
1039 | </connection> | ||
1040 | <connection> | ||
1041 | <sender>cmdCity9</sender> | ||
1042 | <signal>toggled(bool)</signal> | ||
1043 | <receiver>cmdCity1</receiver> | ||
1044 | <slot>setDisabled(bool)</slot> | ||
1045 | </connection> | ||
1046 | <connection> | ||
1047 | <sender>cmdCity9</sender> | ||
1048 | <signal>toggled(bool)</signal> | ||
1049 | <receiver>cmdCity3</receiver> | ||
1050 | <slot>setDisabled(bool)</slot> | ||
1051 | </connection> | ||
1052 | <connection> | ||
1053 | <sender>cmdCity9</sender> | ||
1054 | <signal>toggled(bool)</signal> | ||
1055 | <receiver>cmdCity4</receiver> | ||
1056 | <slot>setDisabled(bool)</slot> | ||
1057 | </connection> | ||
1058 | <connection> | ||
1059 | <sender>cmdCity9</sender> | ||
1060 | <signal>toggled(bool)</signal> | ||
1061 | <receiver>cmdCity5</receiver> | ||
1062 | <slot>setDisabled(bool)</slot> | ||
1063 | </connection> | ||
1064 | <connection> | ||
1065 | <sender>cmdCity9</sender> | ||
1066 | <signal>toggled(bool)</signal> | ||
1067 | <receiver>cmdCity6</receiver> | ||
1068 | <slot>setDisabled(bool)</slot> | ||
1069 | </connection> | ||
1070 | <connection> | ||
1071 | <sender>cmdCity9</sender> | ||
1072 | <signal>toggled(bool)</signal> | ||
1073 | <receiver>cmdCity7</receiver> | ||
1074 | <slot>setDisabled(bool)</slot> | ||
1075 | </connection> | ||
1076 | <connection> | ||
1077 | <sender>cmdCity9</sender> | ||
1078 | <signal>toggled(bool)</signal> | ||
1079 | <receiver>cmdCity8</receiver> | ||
1080 | <slot>setDisabled(bool)</slot> | ||
1081 | </connection> | ||
1082 | <connection> | ||
1083 | <sender>cmdCity1</sender> | ||
1084 | <signal>toggled(bool)</signal> | ||
1085 | <receiver>cmdCity9</receiver> | ||
1086 | <slot>setDisabled(bool)</slot> | ||
1087 | </connection> | ||
1088 | <connection> | ||
1089 | <sender>cmdCity2</sender> | ||
1090 | <signal>toggled(bool)</signal> | ||
1091 | <receiver>cmdCity9</receiver> | ||
1092 | <slot>setDisabled(bool)</slot> | ||
1093 | </connection> | ||
1094 | <connection> | ||
1095 | <sender>cmdCity3</sender> | ||
1096 | <signal>toggled(bool)</signal> | ||
1097 | <receiver>cmdCity9</receiver> | ||
1098 | <slot>setDisabled(bool)</slot> | ||
1099 | </connection> | ||
1100 | <connection> | ||
1101 | <sender>cmdCity4</sender> | ||
1102 | <signal>toggled(bool)</signal> | ||
1103 | <receiver>cmdCity9</receiver> | ||
1104 | <slot>setDisabled(bool)</slot> | ||
1105 | </connection> | ||
1106 | <connection> | ||
1107 | <sender>cmdCity5</sender> | ||
1108 | <signal>toggled(bool)</signal> | ||
1109 | <receiver>cmdCity9</receiver> | ||
1110 | <slot>setDisabled(bool)</slot> | ||
1111 | </connection> | ||
1112 | <connection> | ||
1113 | <sender>cmdCity7</sender> | ||
1114 | <signal>toggled(bool)</signal> | ||
1115 | <receiver>cmdCity9</receiver> | ||
1116 | <slot>setDisabled(bool)</slot> | ||
1117 | </connection> | ||
1118 | <connection> | ||
1119 | <sender>cmdCity8</sender> | ||
1120 | <signal>toggled(bool)</signal> | ||
1121 | <receiver>cmdCity9</receiver> | ||
1122 | <slot>setDisabled(bool)</slot> | ||
1123 | </connection> | ||
1124 | <connection> | ||
1125 | <sender>cmdCity9</sender> | ||
1126 | <signal>toggled(bool)</signal> | ||
1127 | <receiver>cmdCity2</receiver> | ||
1128 | <slot>setDisabled(bool)</slot> | ||
1129 | </connection> | ||
1130 | <connection> | ||
1131 | <sender>cmdCity1</sender> | ||
1132 | <signal>toggled(bool)</signal> | ||
1133 | <receiver>CityTimeBase</receiver> | ||
1134 | <slot>beginNewTz()</slot> | ||
1135 | </connection> | ||
1136 | <connection> | ||
1137 | <sender>cmdCity2</sender> | ||
1138 | <signal>toggled(bool)</signal> | ||
1139 | <receiver>CityTimeBase</receiver> | ||
1140 | <slot>beginNewTz()</slot> | ||
1141 | </connection> | ||
1142 | <connection> | ||
1143 | <sender>cmdCity7</sender> | ||
1144 | <signal>toggled(bool)</signal> | ||
1145 | <receiver>CityTimeBase</receiver> | ||
1146 | <slot>beginNewTz()</slot> | ||
1147 | </connection> | ||
1148 | <connection> | ||
1149 | <sender>cmdCity3</sender> | ||
1150 | <signal>toggled(bool)</signal> | ||
1151 | <receiver>CityTimeBase</receiver> | ||
1152 | <slot>beginNewTz()</slot> | ||
1153 | </connection> | ||
1154 | <connection> | ||
1155 | <sender>cmdCity4</sender> | ||
1156 | <signal>toggled(bool)</signal> | ||
1157 | <receiver>CityTimeBase</receiver> | ||
1158 | <slot>beginNewTz()</slot> | ||
1159 | </connection> | ||
1160 | <connection> | ||
1161 | <sender>cmdCity5</sender> | ||
1162 | <signal>toggled(bool)</signal> | ||
1163 | <receiver>CityTimeBase</receiver> | ||
1164 | <slot>beginNewTz()</slot> | ||
1165 | </connection> | ||
1166 | <connection> | ||
1167 | <sender>cmdCity6</sender> | ||
1168 | <signal>toggled(bool)</signal> | ||
1169 | <receiver>CityTimeBase</receiver> | ||
1170 | <slot>beginNewTz()</slot> | ||
1171 | </connection> | ||
1172 | <connection> | ||
1173 | <sender>cmdCity8</sender> | ||
1174 | <signal>toggled(bool)</signal> | ||
1175 | <receiver>CityTimeBase</receiver> | ||
1176 | <slot>beginNewTz()</slot> | ||
1177 | </connection> | ||
1178 | <connection> | ||
1179 | <sender>cmdCity9</sender> | ||
1180 | <signal>toggled(bool)</signal> | ||
1181 | <receiver>CityTimeBase</receiver> | ||
1182 | <slot>beginNewTz()</slot> | ||
1183 | </connection> | ||
1184 | <slot access="public">beginNewTz()</slot> | ||
1185 | <slot access="public">slotNewTz(const QString &, const QString &)</slot> | ||
1186 | </connections> | ||
1187 | <tabstops> | ||
1188 | <tabstop>cmdCity1</tabstop> | ||
1189 | <tabstop>cmdCity2</tabstop> | ||
1190 | <tabstop>cmdCity3</tabstop> | ||
1191 | <tabstop>cmdCity4</tabstop> | ||
1192 | <tabstop>cmdCity5</tabstop> | ||
1193 | <tabstop>cmdCity6</tabstop> | ||
1194 | <tabstop>cmdCity7</tabstop> | ||
1195 | <tabstop>cmdCity8</tabstop> | ||
1196 | <tabstop>cmdCity9</tabstop> | ||
1197 | <tabstop>frmMap</tabstop> | ||
1198 | </tabstops> | ||
1199 | </UI> | ||
diff --git a/core/settings/citytime/light.png b/core/settings/citytime/light.png deleted file mode 100644 index 2aab906..0000000 --- a/core/settings/citytime/light.png +++ b/dev/null | |||
Binary files differ | |||
diff --git a/core/settings/citytime/mag.png b/core/settings/citytime/mag.png deleted file mode 100644 index 9cbd32b..0000000 --- a/core/settings/citytime/mag.png +++ b/dev/null | |||
Binary files differ | |||
diff --git a/core/settings/citytime/opie-citytime.control b/core/settings/citytime/opie-citytime.control index aa94dd4..faaf3a2 100644 --- a/core/settings/citytime/opie-citytime.control +++ b/core/settings/citytime/opie-citytime.control | |||
@@ -1,9 +1,9 @@ | |||
1 | Files: bin/citytime apps/Applications/citytime.desktop pics/citytime | 1 | Files: bin/citytime apps/Settings/citytime.desktop pics/citytime |
2 | Priority: optional | 2 | Priority: optional |
3 | Section: opie/applications | 3 | Section: opie/settings |
4 | Maintainer: Warwick Allison <warwick@trolltech.com> | 4 | Maintainer: Maximilian Reiss <harlekin@handhelds.org> |
5 | Architecture: arm | 5 | Architecture: arm |
6 | Version: $QPE_VERSION-$SUB_VERSION | 6 | Version: $QPE_VERSION-$SUB_VERSION |
7 | Depends: opie-base ($QPE_VERSION), timezones | 7 | Depends: opie-base ($QPE_VERSION), timezones |
8 | Description: Time-zone / world clock settings | 8 | Description: Time-zone / world clock settings |
9 | The time-zone manager for the Opie environment. | 9 | The time-zone manager for the Opie environment. |
diff --git a/core/settings/citytime/zonemap.cpp b/core/settings/citytime/zonemap.cpp index 1d60aee..872e786 100644 --- a/core/settings/citytime/zonemap.cpp +++ b/core/settings/citytime/zonemap.cpp | |||
@@ -1,87 +1,93 @@ | |||
1 | /********************************************************************** | 1 | /********************************************************************** |
2 | ** Copyright (C) 2000 Trolltech AS. All rights reserved. | 2 | ** Copyright (C) 2000 Trolltech AS. All rights reserved. |
3 | ** | 3 | ** |
4 | ** This file is part of Qtopia Environment. | 4 | ** This file is part of Qtopia Environment. |
5 | ** | 5 | ** |
6 | ** This file may be distributed and/or modified under the terms of the | 6 | ** This file may be distributed and/or modified under the terms of the |
7 | ** GNU General Public License version 2 as published by the Free Software | 7 | ** GNU General Public License version 2 as published by the Free Software |
8 | ** Foundation and appearing in the file LICENSE.GPL included in the | 8 | ** Foundation and appearing in the file LICENSE.GPL included in the |
9 | ** packaging of this file. | 9 | ** packaging of this file. |
10 | ** | 10 | ** |
11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE | 11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE |
12 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | 12 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
13 | ** | 13 | ** |
14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | 14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. |
15 | ** | 15 | ** |
16 | ** Contact info@trolltech.com if any conditions of this licensing are | 16 | ** Contact info@trolltech.com if any conditions of this licensing are |
17 | ** not clear to you. | 17 | ** not clear to you. |
18 | ** | 18 | ** |
19 | **********************************************************************/ | 19 | **********************************************************************/ |
20 | 20 | ||
21 | // changes by Maximilian Reiss <harlekin@handhelds.org> | ||
22 | |||
21 | #include "sun.h" | 23 | #include "sun.h" |
22 | #include "zonemap.h" | 24 | #include "zonemap.h" |
23 | 25 | ||
24 | #include <qpe/resource.h> | 26 | #include <qpe/resource.h> |
25 | #include <qpe/timestring.h> | 27 | #include <qpe/timestring.h> |
26 | #include <qpe/qpeapplication.h> | 28 | #include <qpe/qpeapplication.h> |
27 | 29 | ||
28 | #include <qdatetime.h> | 30 | #include <qdatetime.h> |
29 | #include <qfile.h> | 31 | #include <qfile.h> |
30 | #include <qimage.h> | 32 | #include <qimage.h> |
31 | #include <qlabel.h> | 33 | #include <qlabel.h> |
32 | #include <qlist.h> | 34 | #include <qlist.h> |
33 | #include <qmessagebox.h> | 35 | #include <qmessagebox.h> |
34 | #include <qpixmap.h> | 36 | #include <qpixmap.h> |
35 | #include <qpainter.h> | 37 | #include <qpainter.h> |
36 | #include <qregexp.h> | 38 | #include <qregexp.h> |
37 | #include <qtextstream.h> | 39 | #include <qtextstream.h> |
38 | #include <qtimer.h> | 40 | #include <qtimer.h> |
39 | #include <qtoolbutton.h> | 41 | #include <qtoolbutton.h> |
42 | #include <qlayout.h> | ||
43 | #include <qhbox.h> | ||
44 | #include <qlistview.h> | ||
45 | #include <qwhatsthis.h> | ||
40 | 46 | ||
41 | #include <limits.h> | 47 | #include <limits.h> |
42 | 48 | ||
43 | // the map file... | 49 | // the map file... |
44 | static const char strZONEINFO[] = "/usr/share/zoneinfo/zone.tab"; | 50 | static const char strZONEINFO[] = "/usr/share/zoneinfo/zone.tab"; |
45 | static const char strMAP[] = "citytime/simple_grid_400"; | 51 | static const char strMAP[] = "citytime/simple_grid_400"; |
46 | 52 | ||
47 | // the maximum distance we'll allow the pointer to be away from a city | 53 | // the maximum distance we'll allow the pointer to be away from a city |
48 | // and still show the city's time | 54 | // and still show the city's time |
49 | static const int iTHRESHOLD = 50000; | 55 | static const int iTHRESHOLD = 50000; |
50 | 56 | ||
51 | // The label offset (how far away from pointer) | 57 | // The label offset (how far away from pointer) |
52 | static const int iLABELOFFSET = 8; | 58 | static const int iLABELOFFSET = 8; |
53 | 59 | ||
54 | // the size of the dot to draw, and where to start it | 60 | // the size of the dot to draw, and where to start it |
55 | static const int iCITYSIZE = 3; | 61 | static const int iCITYSIZE = 3; |
56 | const int iCITYOFFSET = 2; | 62 | const int iCITYOFFSET = 2; |
57 | 63 | ||
58 | // the darkening function | 64 | // the darkening function |
59 | static inline void darken( QImage *pImage, int start, int stop, int row ); | 65 | static inline void darken( QImage *pImage, int start, int stop, int row ); |
60 | static void dayNight( QImage *pImage ); | 66 | static void dayNight( QImage *pImage ); |
61 | 67 | ||
62 | ZoneField::ZoneField( const QString& strLine ) | 68 | ZoneField::ZoneField( const QString& strLine ) |
63 | { | 69 | { |
64 | // make a bunch of RegExp's to match the data from the line | 70 | // make a bunch of RegExp's to match the data from the line |
65 | QRegExp regCoord( "[-+][0-9]+" );// the latitude | 71 | QRegExp regCoord( "[-+][0-9]+" );// the latitude |
66 | QRegExp regCountry( "[A-Za-z]+/" ); // the country (not good enough) | 72 | QRegExp regCountry( "[A-Za-z]+/" ); // the country (not good enough) |
67 | QRegExp regCity( "[A-Za-z_-]*" ); // the city | 73 | QRegExp regCity( "[A-Za-z_-]*" ); // the city |
68 | 74 | ||
69 | int iStart, | 75 | int iStart, |
70 | iStop, | 76 | iStop, |
71 | iLen, | 77 | iLen, |
72 | tmp; | 78 | tmp; |
73 | QString strTmp; | 79 | QString strTmp; |
74 | // we should be able to assume that the country code is always the first | 80 | // we should be able to assume that the country code is always the first |
75 | // two chars, so just grap them and let it go... | 81 | // two chars, so just grap them and let it go... |
76 | strCountryCode = strLine.left( 2 ); | 82 | strCountryCode = strLine.left( 2 ); |
77 | iStart = regCoord.match( strLine, 0, &iLen ); | 83 | iStart = regCoord.match( strLine, 0, &iLen ); |
78 | if ( iStart >= 0 ) { | 84 | if ( iStart >= 0 ) { |
79 | strTmp = strLine.mid( iStart, iLen ); | 85 | strTmp = strLine.mid( iStart, iLen ); |
80 | tmp = strTmp.toInt(); | 86 | tmp = strTmp.toInt(); |
81 | // okay, there are two versions of the format, make a decision based on | 87 | // okay, there are two versions of the format, make a decision based on |
82 | // the size... | 88 | // the size... |
83 | // Oh BTW, we are storing everything in seconds! | 89 | // Oh BTW, we are storing everything in seconds! |
84 | if ( iLen < 7 ) { | 90 | if ( iLen < 7 ) { |
85 | _y = tmp / 100; | 91 | _y = tmp / 100; |
86 | _y *= 60; | 92 | _y *= 60; |
87 | _y += tmp % 100; | 93 | _y += tmp % 100; |
@@ -412,101 +418,156 @@ void ZoneMap::showCity( ZoneField *city ) | |||
412 | // this only happens on the a zoom when you are near the top, | 418 | // this only happens on the a zoom when you are near the top, |
413 | // a quick workaround.. | 419 | // a quick workaround.. |
414 | y = iLABELOFFSET; | 420 | y = iLABELOFFSET; |
415 | } else { | 421 | } else { |
416 | // the default | 422 | // the default |
417 | y += iLABELOFFSET; | 423 | y += iLABELOFFSET; |
418 | } | 424 | } |
419 | 425 | ||
420 | // draw in the city and the label | 426 | // draw in the city and the label |
421 | if ( pRepaint ) { | 427 | if ( pRepaint ) { |
422 | int repx, | 428 | int repx, |
423 | repy; | 429 | repy; |
424 | zoneToWin( pRepaint->x(), pRepaint->y(), repx, repy ); | 430 | zoneToWin( pRepaint->x(), pRepaint->y(), repx, repy ); |
425 | updateContents( repx - iCITYOFFSET, repy - iCITYOFFSET, | 431 | updateContents( repx - iCITYOFFSET, repy - iCITYOFFSET, |
426 | iCITYSIZE, iCITYSIZE ); | 432 | iCITYSIZE, iCITYSIZE ); |
427 | } | 433 | } |
428 | updateContents( tmpx - iCITYOFFSET, tmpy - iCITYOFFSET, iCITYSIZE, | 434 | updateContents( tmpx - iCITYOFFSET, tmpy - iCITYOFFSET, iCITYSIZE, |
429 | iCITYSIZE ); | 435 | iCITYSIZE ); |
430 | pRepaint = pLast; | 436 | pRepaint = pLast; |
431 | 437 | ||
432 | lblCity->move( x, y ); | 438 | lblCity->move( x, y ); |
433 | lblCity->show(); | 439 | lblCity->show(); |
434 | } | 440 | } |
435 | 441 | ||
436 | void ZoneMap::resizeEvent( QResizeEvent *e ) | 442 | void ZoneMap::resizeEvent( QResizeEvent *e ) |
437 | { | 443 | { |
438 | // keep the zoom button down in the corner | 444 | // keep the zoom button down in the corner |
439 | QSize _size = e->size(); | 445 | QSize _size = e->size(); |
440 | cmdZoom->move( _size.width() - cmdZoom->width(), | 446 | cmdZoom->move( _size.width() - cmdZoom->width(), |
441 | _size.height() - cmdZoom->height() ); | 447 | _size.height() - cmdZoom->height() ); |
442 | if ( !bZoom ) { | 448 | if ( !bZoom ) { |
443 | drawableW = width() - 2 * frameWidth(); | 449 | drawableW = width() - 2 * frameWidth(); |
444 | drawableH = height() - 2 * frameWidth(); | 450 | drawableH = height() - 2 * frameWidth(); |
445 | makeMap( drawableW, drawableH ); | 451 | makeMap( drawableW, drawableH ); |
446 | resizeContents( drawableW, drawableH ); | 452 | resizeContents( drawableW, drawableH ); |
447 | } | 453 | } |
448 | } | 454 | } |
449 | 455 | ||
450 | void ZoneMap::showZones( void ) const | 456 | void ZoneMap::showZones( void ) const |
451 | { | 457 | { |
452 | // go through the zones in the list and just display the values... | 458 | // go through the zones in the list and just display the values... |
453 | QListIterator<ZoneField> itZone( zones ); | 459 | QListIterator<ZoneField> itZone( zones ); |
454 | for ( itZone.toFirst(); itZone.current(); ++itZone ) { | 460 | for ( itZone.toFirst(); itZone.current(); ++itZone ) { |
455 | ZoneField *pZone = itZone.current(); | 461 | ZoneField *pZone = itZone.current(); |
456 | pZone->showStructure(); | 462 | pZone->showStructure(); |
457 | } | 463 | } |
458 | } | 464 | } |
459 | 465 | ||
466 | |||
467 | QWidget* ZoneMap::selectionWidget( QWidget *parent) { | ||
468 | |||
469 | QWidget *returnWidget = new QWidget( parent ); | ||
470 | |||
471 | QVBoxLayout *layout = new QVBoxLayout( returnWidget ); | ||
472 | QHBox *hBox = new QHBox( returnWidget ); | ||
473 | QListView *continentView = new QListView( hBox ); | ||
474 | continentView->addColumn( tr("Continent") ); | ||
475 | QWhatsThis::add( continentView, tr("Select a continent/country here, then select a city") ); | ||
476 | connect ( continentView, SIGNAL( clicked ( QListViewItem * ) ), this, SLOT( slotGetCities( QListViewItem * ) ) ); | ||
477 | |||
478 | QStringList continentList; | ||
479 | QListIterator<ZoneField> itZone( zones ); | ||
480 | for ( itZone.toFirst(); itZone.current(); ++itZone ) { | ||
481 | ZoneField *pZone = itZone.current(); | ||
482 | if ( continentList.contains( pZone->country() ) == 0 ) { | ||
483 | QString name; | ||
484 | QListViewItem *item; | ||
485 | if ( !(pZone->country().length() > 24) ) { | ||
486 | name = pZone->country().left(pZone->country().length()-1 ); | ||
487 | } else { | ||
488 | name = pZone->country().left( 24 ); | ||
489 | } | ||
490 | item = new QListViewItem( continentView, name, pZone->country() ); | ||
491 | continentList.append( pZone->country() ); | ||
492 | } | ||
493 | } | ||
494 | |||
495 | cityView = new QListView( hBox ); | ||
496 | cityView->addColumn( tr("City") ); | ||
497 | |||
498 | layout->addWidget( hBox ); | ||
499 | return returnWidget; | ||
500 | } | ||
501 | |||
502 | void ZoneMap::slotGetCities( QListViewItem * contItem) { | ||
503 | |||
504 | cityView->clear(); | ||
505 | selectedCont = contItem->text( 1 ); | ||
506 | QListIterator<ZoneField> itZone( zones ); | ||
507 | for ( itZone.toFirst(); itZone.current(); ++itZone ) { | ||
508 | ZoneField *pZone = itZone.current(); | ||
509 | if ( pZone->country() == contItem->text( 1 ) ) { | ||
510 | QListViewItem *item; | ||
511 | item = new QListViewItem( cityView, pZone->city() ); | ||
512 | connect ( cityView, SIGNAL( clicked ( QListViewItem* ) ), this, SLOT( slotCitySelected( QListViewItem* ) ) ); | ||
513 | } | ||
514 | } | ||
515 | } | ||
516 | |||
517 | void ZoneMap::slotCitySelected( QListViewItem *cityItem ) { | ||
518 | if ( cityItem ) { | ||
519 | emit signalTz( selectedCont, cityItem->text( 0 ) ); | ||
520 | } | ||
521 | } | ||
522 | |||
460 | void ZoneMap::drawCities( QPainter *p ) | 523 | void ZoneMap::drawCities( QPainter *p ) |
461 | { | 524 | { |
462 | int x, | 525 | int x, y, j; |
463 | y, | ||
464 | j; | ||
465 | // draw in the cities | 526 | // draw in the cities |
466 | // for testing only as when you put it | 527 | // for testing only as when you put it |
467 | // on the small screen it looks awful and not to mention useless | 528 | // on the small screen it looks awful and not to mention useless |
468 | p->setPen( red ); | 529 | p->setPen( red ); |
469 | QListIterator<ZoneField> itZone( zones ); | 530 | QListIterator<ZoneField> itZone( zones ); |
470 | for ( itZone.toFirst(), j = 0; itZone.current(); ++itZone, j++ ) { | 531 | for ( itZone.toFirst(), j = 0; itZone.current(); ++itZone, j++ ) { |
471 | ZoneField *pZone = itZone.current(); | 532 | ZoneField *pZone = itZone.current(); |
472 | zoneToWin( pZone->x(), pZone->y(), x, y ); | 533 | zoneToWin( pZone->x(), pZone->y(), x, y ); |
473 | if ( x > wImg ) | 534 | if ( x > wImg ) |
474 | x = x - wImg; | 535 | x = x - wImg; |
475 | p->drawRect( x - iCITYOFFSET, y - iCITYOFFSET, iCITYSIZE, iCITYSIZE); | 536 | p->drawRect( x - iCITYOFFSET, y - iCITYOFFSET, iCITYSIZE, iCITYSIZE); |
476 | } | 537 | } |
477 | } | 538 | } |
478 | 539 | ||
479 | static void dayNight(QImage *pImage) | 540 | static void dayNight(QImage *pImage) |
480 | { | 541 | { |
481 | // create a mask the functions from sun.h | 542 | // create a mask the functions from sun.h |
482 | double dJulian, | 543 | double dJulian, |
483 | dSunRad, | 544 | dSunRad, |
484 | dSunDecl, | 545 | dSunDecl, |
485 | dSunRadius, | 546 | dSunRadius, |
486 | dSunLong; | 547 | dSunLong; |
487 | int wImage = pImage->width(), | 548 | int wImage = pImage->width(), |
488 | hImage = pImage->height(), | 549 | hImage = pImage->height(), |
489 | iStart, | 550 | iStart, |
490 | iStop, | 551 | iStop, |
491 | iMid, | 552 | iMid, |
492 | relw, | 553 | relw, |
493 | i; | 554 | i; |
494 | short wtab[ wImage ]; | 555 | short wtab[ wImage ]; |
495 | time_t tCurrent; | 556 | time_t tCurrent; |
496 | struct tm *pTm; | 557 | struct tm *pTm; |
497 | 558 | ||
498 | // get the position of the sun bassed on our current time... | 559 | // get the position of the sun bassed on our current time... |
499 | tCurrent = time( NULL ); | 560 | tCurrent = time( NULL ); |
500 | pTm = gmtime( &tCurrent ); | 561 | pTm = gmtime( &tCurrent ); |
501 | dJulian = jtime( pTm ); | 562 | dJulian = jtime( pTm ); |
502 | sunpos( dJulian, 0, &dSunRad, &dSunDecl, &dSunRadius, &dSunLong ); | 563 | sunpos( dJulian, 0, &dSunRad, &dSunDecl, &dSunRadius, &dSunLong ); |
503 | 564 | ||
504 | // now get the projected illumination | 565 | // now get the projected illumination |
505 | projillum( wtab, wImage, hImage, dSunDecl ); | 566 | projillum( wtab, wImage, hImage, dSunDecl ); |
506 | relw = wImage - int( wImage * 0.0275 ); | 567 | relw = wImage - int( wImage * 0.0275 ); |
507 | 568 | ||
508 | // draw the map, keeping in mind that we may go too far off the map... | 569 | // draw the map, keeping in mind that we may go too far off the map... |
509 | iMid = ( relw * ( 24*60 - pTm->tm_hour * 60 - pTm->tm_min ) ) / ( 24*60 ); | 570 | iMid = ( relw * ( 24*60 - pTm->tm_hour * 60 - pTm->tm_min ) ) / ( 24*60 ); |
510 | 571 | ||
511 | for ( i = 0; i < hImage; i++ ) { | 572 | for ( i = 0; i < hImage; i++ ) { |
512 | if ( wtab[i] > 0 ) { | 573 | if ( wtab[i] > 0 ) { |
diff --git a/core/settings/citytime/zonemap.h b/core/settings/citytime/zonemap.h index c9c2035..ea0142b 100644 --- a/core/settings/citytime/zonemap.h +++ b/core/settings/citytime/zonemap.h | |||
@@ -1,157 +1,165 @@ | |||
1 | /********************************************************************** | 1 | /********************************************************************** |
2 | ** Copyright (C) 2000 Trolltech AS. All rights reserved. | 2 | ** Copyright (C) 2000 Trolltech AS. All rights reserved. |
3 | ** | 3 | ** |
4 | ** This file is part of Qtopia Environment. | 4 | ** This file is part of Qtopia Environment. |
5 | ** | 5 | ** |
6 | ** This file may be distributed and/or modified under the terms of the | 6 | ** This file may be distributed and/or modified under the terms of the |
7 | ** GNU General Public License version 2 as published by the Free Software | 7 | ** GNU General Public License version 2 as published by the Free Software |
8 | ** Foundation and appearing in the file LICENSE.GPL included in the | 8 | ** Foundation and appearing in the file LICENSE.GPL included in the |
9 | ** packaging of this file. | 9 | ** packaging of this file. |
10 | ** | 10 | ** |
11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE | 11 | ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE |
12 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | 12 | ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
13 | ** | 13 | ** |
14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. | 14 | ** See http://www.trolltech.com/gpl/ for GPL licensing information. |
15 | ** | 15 | ** |
16 | ** Contact info@trolltech.com if any conditions of this licensing are | 16 | ** Contact info@trolltech.com if any conditions of this licensing are |
17 | ** not clear to you. | 17 | ** not clear to you. |
18 | ** | 18 | ** |
19 | **********************************************************************/ | 19 | **********************************************************************/ |
20 | 20 | ||
21 | #ifndef ZONEMAP_H | 21 | #ifndef ZONEMAP_H |
22 | #define ZONEMAP_H | 22 | #define ZONEMAP_H |
23 | 23 | ||
24 | #include "stylusnormalizer.h" | 24 | #include "stylusnormalizer.h" |
25 | 25 | ||
26 | #include <qlist.h> | 26 | #include <qlist.h> |
27 | #include <qscrollview.h> | 27 | #include <qscrollview.h> |
28 | #include <qstring.h> | 28 | #include <qstring.h> |
29 | 29 | ||
30 | extern const int iCITYOFFSET; | 30 | extern const int iCITYOFFSET; |
31 | 31 | ||
32 | class QImage; | 32 | class QImage; |
33 | class QComboBox; | 33 | class QComboBox; |
34 | class QLabel; | 34 | class QLabel; |
35 | class QTimer; | 35 | class QTimer; |
36 | class QToolButton; | 36 | class QToolButton; |
37 | 37 | class QListViewItem; | |
38 | class QListView; | ||
38 | 39 | ||
39 | 40 | ||
40 | class ZoneField | 41 | class ZoneField |
41 | { | 42 | { |
42 | public: | 43 | public: |
43 | ZoneField( const QString & ); | 44 | ZoneField( const QString & ); |
44 | void showStructure( void ) const; | 45 | void showStructure( void ) const; |
45 | inline int x( void ) const { return _x; }; | 46 | inline int x( void ) const { return _x; }; |
46 | inline int y( void ) const { return _y; }; | 47 | inline int y( void ) const { return _y; }; |
47 | 48 | ||
48 | inline QString city( void ) const { return strCity; }; | 49 | inline QString city( void ) const { return strCity; }; |
49 | inline QString country( void ) const { return strCountry; }; | 50 | inline QString country( void ) const { return strCountry; }; |
50 | inline QString code( void ) const { return strCountryCode; }; | 51 | inline QString code( void ) const { return strCountryCode; }; |
51 | private: | 52 | private: |
52 | int _x; | 53 | int _x; |
53 | int _y; | 54 | int _y; |
54 | QString strCountryCode; | 55 | QString strCountryCode; |
55 | QString strCountry; | 56 | QString strCountry; |
56 | QString strCity; | 57 | QString strCity; |
57 | }; | 58 | }; |
58 | 59 | ||
59 | class ZoneMap : public QScrollView | 60 | class ZoneMap : public QScrollView |
60 | { | 61 | { |
61 | Q_OBJECT | 62 | Q_OBJECT |
62 | public: | 63 | public: |
63 | ZoneMap( QWidget *parent = 0, const char *name = 0 ); | 64 | ZoneMap( QWidget *parent = 0, const char *name = 0 ); |
64 | ~ZoneMap(); | 65 | ~ZoneMap(); |
65 | void showZones( void ) const; | 66 | void showZones( void ) const; |
67 | QWidget* selectionWidget( QWidget* parent ); | ||
66 | // convert between the pixels on the image and the coordinates in the | 68 | // convert between the pixels on the image and the coordinates in the |
67 | // database | 69 | // database |
68 | inline bool zoneToWin( int zoneX, int zoneY, int &winX, int &winY ) const; | 70 | inline bool zoneToWin( int zoneX, int zoneY, int &winX, int &winY ) const; |
69 | inline bool winToZone( int winX, int winY, int &zoneX, int &zoneY ) const; | 71 | inline bool winToZone( int winX, int winY, int &zoneX, int &zoneY ) const; |
70 | 72 | ||
71 | public slots: | 73 | public slots: |
72 | void slotZoom( bool setZoom ); | 74 | void slotZoom( bool setZoom ); |
73 | void slotIllum( bool setIllum ); | 75 | void slotIllum( bool setIllum ); |
74 | void slotUpdate( void ); | 76 | void slotUpdate( void ); |
75 | void slotRedraw( void ); | 77 | void slotRedraw( void ); |
76 | void slotFindCity( const QPoint &pos ); // Find the closest city | 78 | void slotFindCity( const QPoint &pos ); // Find the closest city |
77 | void changeClock( bool ); | 79 | void changeClock( bool ); |
78 | 80 | ||
79 | signals: | 81 | signals: |
80 | void signalTz( const QString &newCountry, const QString &newCity ); | 82 | void signalTz( const QString &newCountry, const QString &newCity ); |
81 | 83 | ||
82 | protected: | 84 | protected: |
83 | virtual void viewportMouseMoveEvent( QMouseEvent *event ); | 85 | virtual void viewportMouseMoveEvent( QMouseEvent *event ); |
84 | virtual void viewportMousePressEvent( QMouseEvent *event ); | 86 | virtual void viewportMousePressEvent( QMouseEvent *event ); |
85 | virtual void viewportMouseReleaseEvent( QMouseEvent *event ); | 87 | virtual void viewportMouseReleaseEvent( QMouseEvent *event ); |
86 | virtual void keyPressEvent( QKeyEvent * ); | 88 | virtual void keyPressEvent( QKeyEvent * ); |
87 | virtual void resizeEvent( QResizeEvent *); | 89 | virtual void resizeEvent( QResizeEvent *); |
88 | virtual void drawContents( QPainter *p, int cx, int cy, int cw, int ch ); | 90 | virtual void drawContents( QPainter *p, int cx, int cy, int cw, int ch ); |
89 | 91 | ||
92 | private slots: | ||
93 | void slotGetCities( QListViewItem * ); | ||
94 | void slotCitySelected( QListViewItem * ); | ||
90 | private: | 95 | private: |
91 | ZoneField *findCityNear( ZoneField *city, int key ); | 96 | ZoneField *findCityNear( ZoneField *city, int key ); |
92 | void showCity( ZoneField *city ); | 97 | void showCity( ZoneField *city ); |
93 | void drawCities( QPainter *p );// put all the cities on the map (ugly) | 98 | void drawCities( QPainter *p );// put all the cities on the map (ugly) |
94 | void drawCity( QPainter *p, const ZoneField *pCity ); // draw the given city on the map | 99 | void drawCity( QPainter *p, const ZoneField *pCity ); // draw the given city on the map |
95 | void readZones( void ); // Read in the zone information from the file | 100 | void readZones( void ); // Read in the zone information from the file |
96 | void zoom( void ); // Zoom the map... | 101 | void zoom( void ); // Zoom the map... |
97 | void makeMap( int width, int height ); | 102 | void makeMap( int width, int height ); |
98 | QPixmap* pixCurr; // image to be drawn on the screen | 103 | QPixmap* pixCurr; // image to be drawn on the screen |
99 | QLabel* lblCity; // the "tool-tip" that shows up when you pick a city... | 104 | QLabel* lblCity; // the "tool-tip" that shows up when you pick a city... |
100 | QToolButton *cmdZoom; // our zoom option... | 105 | QToolButton *cmdZoom; // our zoom option... |
101 | QTimer*tHide; // the timer to hide the "tool tip" | 106 | QTimer*tHide; // the timer to hide the "tool tip" |
102 | ZoneField *pLast; // the last known good city that was found... | 107 | ZoneField *pLast; // the last known good city that was found... |
103 | ZoneField *pRepaint; // save the location to maximize the repaint... | 108 | ZoneField *pRepaint; // save the location to maximize the repaint... |
104 | QList<ZoneField> zones; // a linked list to hold all this information | 109 | QList<ZoneField> zones; // a linked list to hold all this information |
105 | StylusNormalizer norm; | 110 | StylusNormalizer norm; |
106 | 111 | ||
112 | QListView *cityView; | ||
113 | QString selectedCont; | ||
114 | |||
107 | //the True width and height of the map... | 115 | //the True width and height of the map... |
108 | int wImg; | 116 | int wImg; |
109 | int hImg; | 117 | int hImg; |
110 | // the pixel points that correspond to (0, 0); | 118 | // the pixel points that correspond to (0, 0); |
111 | int ox; | 119 | int ox; |
112 | int oy; | 120 | int oy; |
113 | 121 | ||
114 | // the drawable area of the map... | 122 | // the drawable area of the map... |
115 | int drawableW; | 123 | int drawableW; |
116 | int drawableH; | 124 | int drawableH; |
117 | 125 | ||
118 | bool bZoom; // a flag to indicate zoom is active | 126 | bool bZoom; // a flag to indicate zoom is active |
119 | bool bIllum; // flag to indicat that illumination is active | 127 | bool bIllum; // flag to indicat that illumination is active |
120 | bool ampm; | 128 | bool ampm; |
121 | 129 | ||
122 | ZoneField *cursor; | 130 | ZoneField *cursor; |
123 | }; | 131 | }; |
124 | 132 | ||
125 | inline bool ZoneMap::zoneToWin( int zoneX, int zoneY, | 133 | inline bool ZoneMap::zoneToWin( int zoneX, int zoneY, |
126 | int &winX, int &winY ) const | 134 | int &winX, int &winY ) const |
127 | { | 135 | { |
128 | winY = oy - ( ( hImg * zoneY ) / 648000 ); // 180 degrees in secs | 136 | winY = oy - ( ( hImg * zoneY ) / 648000 ); // 180 degrees in secs |
129 | winX = ox + ( ( wImg * zoneX ) / 1296000 ); // 360 degrees in secs | 137 | winX = ox + ( ( wImg * zoneX ) / 1296000 ); // 360 degrees in secs |
130 | // whoa, some things aren't in the best spots.. | 138 | // whoa, some things aren't in the best spots.. |
131 | if ( winX > wImg ) { | 139 | if ( winX > wImg ) { |
132 | winX = wImg - iCITYOFFSET; | 140 | winX = wImg - iCITYOFFSET; |
133 | } else if ( winX <= 0 ) { | 141 | } else if ( winX <= 0 ) { |
134 | winX = iCITYOFFSET; | 142 | winX = iCITYOFFSET; |
135 | } | 143 | } |
136 | 144 | ||
137 | if ( winY >= hImg ) { | 145 | if ( winY >= hImg ) { |
138 | winY = hImg - iCITYOFFSET; | 146 | winY = hImg - iCITYOFFSET; |
139 | } else if ( winY <= 0 ) { | 147 | } else if ( winY <= 0 ) { |
140 | winY = iCITYOFFSET; | 148 | winY = iCITYOFFSET; |
141 | } | 149 | } |
142 | // perhaps in the future there will be some real error checking | 150 | // perhaps in the future there will be some real error checking |
143 | // for now just return true... | 151 | // for now just return true... |
144 | return true; | 152 | return true; |
145 | } | 153 | } |
146 | 154 | ||
147 | inline bool ZoneMap::winToZone( int winX, int winY, | 155 | inline bool ZoneMap::winToZone( int winX, int winY, |
148 | int &zoneX, int &zoneY ) const | 156 | int &zoneX, int &zoneY ) const |
149 | { | 157 | { |
150 | zoneY = ( 648000 * ( oy - winY ) ) / hImg; | 158 | zoneY = ( 648000 * ( oy - winY ) ) / hImg; |
151 | zoneX = ( 1296000 * ( winX - ox ) ) / wImg; | 159 | zoneX = ( 1296000 * ( winX - ox ) ) / wImg; |
152 | // perhaps in the future there will be some real error checking | 160 | // perhaps in the future there will be some real error checking |
153 | // for now just return true... | 161 | // for now just return true... |
154 | return true; | 162 | return true; |
155 | } | 163 | } |
156 | 164 | ||
157 | #endif | 165 | #endif |