Version Notes
Visit product homepage at:
http://www.artio.net/magento-extensions/m-turbo-accelerator
Download this release
Release Info
Developer | Magento Core Team |
Extension | MTurbo |
Version | 1.1.1 |
Comparing to | |
See all releases |
Code changes from version 1.1.0 to 1.1.1
- app/code/local/Artio/MTurbo/Block/Adminhtml/Welcome/Form.php +1 -1
- app/code/local/Artio/MTurbo/Block/Data/Form/Element/Time.php +1 -1
- app/code/local/Artio/MTurbo/Model/Config.php +1 -1
- app/code/local/Artio/MTurbo/Model/Config.php~ +0 -794
- app/code/local/Artio/MTurbo/Model/Mturbo.php +5 -3
- app/code/local/Artio/MTurbo/Model/Mturbo.php~ +418 -0
- app/code/local/Artio/MTurbo/Model/scripts/wgetlib.so +1 -1
- app/code/local/Artio/MTurbo/etc/config.xml +2 -2
- app/code/local/Artio/MTurbo/etc/config.xml~ +0 -181
- app/code/local/Artio/MTurbo/sql/mturbo_setup/mysql4-install-1.0.0.php +4 -2
- package.xml +4 -4
app/code/local/Artio/MTurbo/Block/Adminhtml/Welcome/Form.php
CHANGED
@@ -71,7 +71,7 @@ class Artio_MTurbo_Block_Adminhtml_Welcome_Form extends Mage_Adminhtml_Block_Wid
|
|
71 |
|
72 |
protected function _afterToHtml($html) {
|
73 |
|
74 |
-
if (
|
75 |
|
76 |
if (Artio_MTurbo_Helper_Checker::checkPermission()) {
|
77 |
$html = $this->_getOkText() . $html;
|
71 |
|
72 |
protected function _afterToHtml($html) {
|
73 |
|
74 |
+
if (true) {
|
75 |
|
76 |
if (Artio_MTurbo_Helper_Checker::checkPermission()) {
|
77 |
$html = $this->_getOkText() . $html;
|
app/code/local/Artio/MTurbo/Block/Data/Form/Element/Time.php
CHANGED
@@ -56,7 +56,7 @@ class Artio_MTurbo_Block_Data_Form_Element_Time extends Varien_Data_Form_Element
|
|
56 |
$value_min = 0;
|
57 |
|
58 |
if( $value = $this->getValue() ) {
|
59 |
-
$values =
|
60 |
if( is_array($values) && count($values) == 5 ) {
|
61 |
$value_hrs = $values[1];
|
62 |
$value_min = $values[0];
|
56 |
$value_min = 0;
|
57 |
|
58 |
if( $value = $this->getValue() ) {
|
59 |
+
$values = explode(" ", $value);
|
60 |
if( is_array($values) && count($values) == 5 ) {
|
61 |
$value_hrs = $values[1];
|
62 |
$value_min = $values[0];
|
app/code/local/Artio/MTurbo/Model/Config.php
CHANGED
@@ -661,7 +661,7 @@ class Artio_MTurbo_Model_Config extends Mage_Eav_Model_Config
|
|
661 |
foreach ($collection as $object) {
|
662 |
$path = $object->getData('path');
|
663 |
|
664 |
-
$keys =
|
665 |
|
666 |
if (strpos($path, 'rontab')>0) {
|
667 |
if ($path==self::CONFIG_XML_PATH_DOWNLOAD_TIME)
|
661 |
foreach ($collection as $object) {
|
662 |
$path = $object->getData('path');
|
663 |
|
664 |
+
$keys = explode('/', $path);
|
665 |
|
666 |
if (strpos($path, 'rontab')>0) {
|
667 |
if ($path==self::CONFIG_XML_PATH_DOWNLOAD_TIME)
|
app/code/local/Artio/MTurbo/Model/Config.php~
DELETED
@@ -1,794 +0,0 @@
|
|
1 |
-
<?php
|
2 |
-
/**
|
3 |
-
* Magento
|
4 |
-
*
|
5 |
-
* NOTICE OF LICENSE
|
6 |
-
*
|
7 |
-
* This source file is subject to the Open Software License (OSL 3.0)
|
8 |
-
* that is bundled with this package in the file LICENSE.txt.
|
9 |
-
* It is also available through the world-wide-web at this URL:
|
10 |
-
* http://opensource.org/licenses/osl-3.0.php
|
11 |
-
* If you did not receive a copy of the license and are unable to
|
12 |
-
* obtain it through the world-wide-web, please send an email
|
13 |
-
* to license@magentocommerce.com so we can send you a copy immediately.
|
14 |
-
*
|
15 |
-
* DISCLAIMER
|
16 |
-
*
|
17 |
-
* Do not edit or add to this file if you wish to upgrade Magento to newer
|
18 |
-
* versions in the future. If you wish to customize Magento for your
|
19 |
-
* needs please refer to http://www.magentocommerce.com for more information.
|
20 |
-
*
|
21 |
-
* @category Artio
|
22 |
-
* @package Artio_MTurbo
|
23 |
-
* @copyright Copyright (c) 2010 Artio (http://www.artio.net)
|
24 |
-
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
25 |
-
*/
|
26 |
-
class DownloadMethods
|
27 |
-
{
|
28 |
-
/* downloading methods */
|
29 |
-
const FILE_GET_CONTENTS = 'filegetcontents';
|
30 |
-
const SOCKET = 'socket';
|
31 |
-
const CURL = 'curl';
|
32 |
-
const DIRECT_ACCESS = 'direct';
|
33 |
-
|
34 |
-
public static function getAllMethods()
|
35 |
-
{
|
36 |
-
return array(self::FILE_GET_CONTENTS, self::SOCKET, self::CURL, self::DIRECT_ACCESS);
|
37 |
-
}
|
38 |
-
|
39 |
-
}
|
40 |
-
|
41 |
-
class Artio_MTurbo_Model_Config extends Mage_Eav_Model_Config
|
42 |
-
{
|
43 |
-
|
44 |
-
const CONFIG_PATH_TO_MTURBO_HTACCESS = 'htaccess/htaccess.txt';
|
45 |
-
const CONFIG_PATH_TO_MTURBO_DOWNLOAD = 'scripts/getstatichtml.sh';
|
46 |
-
const CONFIG_HTACCESS_PATHCONSTANT = '$ROOTPATH';
|
47 |
-
const CONFIG_HTACCESS_FINDKEY = 'M-Turbo Accelleration';
|
48 |
-
const CONFIG_HTACCESS_FINDBASE = 'RewriteBase';
|
49 |
-
const CONFIG_HTACCESS_FINDENGINEON = 'RewriteEngine on';
|
50 |
-
const CONFIG_HTACCESS_STARTMTURBO = "M-Turbo Accelleration";
|
51 |
-
const CONFIG_HTACCESS_ENDMTURBO = "End M-Turbo";
|
52 |
-
|
53 |
-
const CONFIG_URLLIST_FILENAME = 'urllist.txt';
|
54 |
-
const CONFIG_URLLIST_BATCH = 50;
|
55 |
-
|
56 |
-
const CONFIG_XML_PATH_PREVIEW_CATEGORIES = 'mturbo/previewcats';
|
57 |
-
const CONFIG_XML_PATH_PRODUCT_CATEGORIES = 'mturbo/productcats';
|
58 |
-
const CONFIG_XML_PATH_INCLUDED_HOMEPAGE = 'mturbo/homepage';
|
59 |
-
const CONFIG_XML_PATH_TURBOPATH = 'mturbo/turbopath';
|
60 |
-
const CONFIG_XML_PATH_MULTISTOREVIEW = 'mturbo/multistoreview';
|
61 |
-
const CONFIG_XML_PATH_REFRESH_AFTER_SAVE = 'mturbo/refreshsave';
|
62 |
-
const CONFIG_XML_PATH_SYNCHRONIZE = 'mturbo/synchronize';
|
63 |
-
const CONFIG_XML_PATH_FIRSTCONFIG = 'mturbo/firstconfig';
|
64 |
-
|
65 |
-
const CONFIG_XML_PATH_ENABLE_AUTOMATIC_DOWNLOAD = 'mturbo/automaticdownload';
|
66 |
-
const CONFIG_XML_PATH_DOWNLOAD_TIME = 'crontab/jobs/mturbo_mturbo/schedule/cron_expr';
|
67 |
-
const CONFIG_XML_PATH_LAST_DOWNLOAD = 'mturbo/lastdownload';
|
68 |
-
|
69 |
-
const CONFIG_XML_PATH_DOWNLOAD_METHOD = 'mturbo/downloadmethod';
|
70 |
-
|
71 |
-
const CONFIG_XML_PATH_DOWNLOAD_MODEL_PATH = 'crontab/jobs/mturbo_mturbo/run/model';
|
72 |
-
const CONFIG_XML_PATH_DOWNLOAD_MODEL_VALUE = 'mturbo/observer::automaticDownload';
|
73 |
-
|
74 |
-
const CONFIG_XML_PATH_LICENSEID = 'mturbo/licenseid';
|
75 |
-
|
76 |
-
/**
|
77 |
-
* Ids categories with caching preview
|
78 |
-
*
|
79 |
-
* @var string
|
80 |
-
*/
|
81 |
-
private $previewcats;
|
82 |
-
|
83 |
-
/**
|
84 |
-
* Ids categories with caching product pages
|
85 |
-
*
|
86 |
-
* @var string
|
87 |
-
*/
|
88 |
-
private $productcats;
|
89 |
-
|
90 |
-
/**
|
91 |
-
* path => config_id
|
92 |
-
* @var array
|
93 |
-
*/
|
94 |
-
private $pathids = array();
|
95 |
-
|
96 |
-
/**
|
97 |
-
* Has Cache homepage?
|
98 |
-
*
|
99 |
-
* @var bool
|
100 |
-
*/
|
101 |
-
private $homepage;
|
102 |
-
|
103 |
-
/**
|
104 |
-
* Cache Path.
|
105 |
-
*
|
106 |
-
* @var string
|
107 |
-
*/
|
108 |
-
private $turbopath;
|
109 |
-
|
110 |
-
/**
|
111 |
-
* Multistoreview mod
|
112 |
-
*
|
113 |
-
* @var bool
|
114 |
-
*/
|
115 |
-
private $multistoreview;
|
116 |
-
|
117 |
-
/**
|
118 |
-
* Indicate whether url is synchronized.
|
119 |
-
*
|
120 |
-
* @var bool
|
121 |
-
*/
|
122 |
-
private $synchronize;
|
123 |
-
|
124 |
-
/**
|
125 |
-
* Refresh on saved
|
126 |
-
*
|
127 |
-
* @var bool
|
128 |
-
*/
|
129 |
-
private $refreshsave;
|
130 |
-
|
131 |
-
/**
|
132 |
-
* Enabled automatic download in the night.
|
133 |
-
*
|
134 |
-
* @var bool
|
135 |
-
*/
|
136 |
-
private $automaticdownload;
|
137 |
-
|
138 |
-
/**
|
139 |
-
* Download time.
|
140 |
-
*
|
141 |
-
* @var time
|
142 |
-
*/
|
143 |
-
private $downloadtime;
|
144 |
-
|
145 |
-
/**
|
146 |
-
* Last download.
|
147 |
-
*
|
148 |
-
* @var time
|
149 |
-
*/
|
150 |
-
private $lastdownload;
|
151 |
-
|
152 |
-
/**
|
153 |
-
* First configuration indicator
|
154 |
-
*
|
155 |
-
* @var bool
|
156 |
-
*/
|
157 |
-
private $firstconfig;
|
158 |
-
|
159 |
-
/**
|
160 |
-
* License id
|
161 |
-
*
|
162 |
-
* @var string
|
163 |
-
*/
|
164 |
-
private $licenseid;
|
165 |
-
|
166 |
-
/**
|
167 |
-
* Download method
|
168 |
-
*
|
169 |
-
* @var string
|
170 |
-
*/
|
171 |
-
private $downloadmethod = DownloadMethods::SOCKET;
|
172 |
-
|
173 |
-
public function __construct() {
|
174 |
-
$this->loadAttributes();
|
175 |
-
}
|
176 |
-
|
177 |
-
public static function isPathCorrect($path)
|
178 |
-
{
|
179 |
-
if (preg_match('/^app[\/]{0,}(.)*/', $path)) return false;
|
180 |
-
if (preg_match('/^404[\/]{0,}(.)*/', $path)) return false;
|
181 |
-
if (preg_match('/^downloader[\/]{0,}(.)*/', $path)) return false;
|
182 |
-
if (preg_match('/^js[\/]{0,}(.)*/', $path)) return false;
|
183 |
-
if (preg_match('/^lib[\/]{0,}(.)*/', $path)) return false;
|
184 |
-
if (preg_match('/^media[\/]{0,}(.)*/', $path)) return false;
|
185 |
-
if (preg_match('/^pkginfo[\/]{0,}(.)*/', $path)) return false;
|
186 |
-
if (preg_match('/^report[\/]{0,}(.)*/', $path)) return false;
|
187 |
-
if (preg_match('/^skin[\/]{0,}(.)*/', $path)) return false;
|
188 |
-
if (preg_match('/^var\/cache[\/]{0,}(.)*/', $path)) return false;
|
189 |
-
if (preg_match('/^var\/report[\/]{0,}(.)*/', $path)) return false;
|
190 |
-
if (preg_match('/^var\/session[\/]{0,}(.)*/', $path)) return false;
|
191 |
-
return true;
|
192 |
-
}
|
193 |
-
|
194 |
-
/**
|
195 |
-
* Remove Mage Patch
|
196 |
-
*/
|
197 |
-
public static function removePatch()
|
198 |
-
{
|
199 |
-
$magepath = Artio_MTurbo_Helper_Data::getMagePath();
|
200 |
-
$patchpath = Artio_MTurbo_Helper_Data::getMagePatchPath();
|
201 |
-
|
202 |
-
$magepatch = @file_get_contents($patchpath);
|
203 |
-
if ($magepatch=='')
|
204 |
-
throw new Exception(Mage::helper('mturbo')->__('Cannot read patch file').'('.$patchpath.')');
|
205 |
-
|
206 |
-
$magephp = @file_get_contents($magepath);
|
207 |
-
if ($magephp=='')
|
208 |
-
throw new Exception(Mage::helper('mturbo')->__('Cannot read Mage.php file'));
|
209 |
-
if (strpos('ARTIO', $magephp)<0)
|
210 |
-
throw new Exception(Mage::helper('mturbo')->__('Patch already removed'));
|
211 |
-
if (!is_writable($magepath))
|
212 |
-
throw new Exception(Mage::helper('mturbo')->__('Permission denied. Cannot write to Mage.php'));
|
213 |
-
|
214 |
-
$newmagephp = str_replace($magepatch, "", $magephp);
|
215 |
-
if (!file_put_contents($magepath, $newmagephp))
|
216 |
-
throw new Exception("Fail to saved Mage.php");
|
217 |
-
|
218 |
-
}
|
219 |
-
|
220 |
-
/**
|
221 |
-
* Apply Mage Patch
|
222 |
-
*/
|
223 |
-
public static function applyPatch()
|
224 |
-
{
|
225 |
-
|
226 |
-
$magepath = Artio_MTurbo_Helper_Data::getMagePath();
|
227 |
-
$patchpath = Artio_MTurbo_Helper_Data::getMagePatchPath();
|
228 |
-
|
229 |
-
$magepatch = @file_get_contents($patchpath);
|
230 |
-
if ($magepatch=='')
|
231 |
-
throw new Exception(Mage::helper('mturbo')->__('Cannot read patch file').'('.$patchpath.')');
|
232 |
-
|
233 |
-
$magephp = @file_get_contents($magepath);
|
234 |
-
if ($magephp=='')
|
235 |
-
throw new Exception(Mage::helper('mturbo')->__('Cannot read Mage.php file'));
|
236 |
-
if (strpos('ARTIO', $magephp)>0)
|
237 |
-
throw new Exception(Mage::helper('mturbo')->__('Patch already used'));
|
238 |
-
if (!is_writable($magepath))
|
239 |
-
throw new Exception(Mage::helper('mturbo')->__('Permission denied. Cannot write to Mage.php'));
|
240 |
-
|
241 |
-
$newmagephp = str_replace('class Mage {', "class Mage {\n".$magepatch."\n", $magephp);
|
242 |
-
$newmagephp = str_replace("class Mage\n{", "class Mage\n{\n".$magepatch."\n", $newmagephp);
|
243 |
-
|
244 |
-
if (!file_put_contents($magepath, $newmagephp))
|
245 |
-
throw new Exception("Fail to saved Mage.php");
|
246 |
-
|
247 |
-
}
|
248 |
-
|
249 |
-
/**
|
250 |
-
* Checks whether file Mage.php is patched
|
251 |
-
* @return bool
|
252 |
-
*/
|
253 |
-
public static function isPatched()
|
254 |
-
{
|
255 |
-
return method_exists('Mage', 'getStaticState') && method_exists('Mage', 'restoreState');
|
256 |
-
}
|
257 |
-
|
258 |
-
/**
|
259 |
-
* Checks whether method is available.
|
260 |
-
*
|
261 |
-
* @param string $method
|
262 |
-
* @param string $errorMsg error message when fail
|
263 |
-
* @return bool
|
264 |
-
*/
|
265 |
-
public static function isMethodAvailable($method, &$resultTest)
|
266 |
-
{
|
267 |
-
if (in_array($method, DownloadMethods::getAllMethods()))
|
268 |
-
{
|
269 |
-
|
270 |
-
$fileModel = Mage::getModel('mturbo/file');
|
271 |
-
$fileModel->downloadPage(false, false, $resultTest, $method);
|
272 |
-
|
273 |
-
return is_float($resultTest);
|
274 |
-
}
|
275 |
-
else
|
276 |
-
{
|
277 |
-
$resultTest = 'Unknow method';
|
278 |
-
return false;
|
279 |
-
}
|
280 |
-
|
281 |
-
}
|
282 |
-
|
283 |
-
|
284 |
-
/**
|
285 |
-
* @return string
|
286 |
-
*/
|
287 |
-
public function getDownloadMethod() {
|
288 |
-
return $this->downloadmethod;
|
289 |
-
}
|
290 |
-
|
291 |
-
/**
|
292 |
-
* @param string $licenseid
|
293 |
-
*/
|
294 |
-
public function setDownloadMethod($method) {
|
295 |
-
|
296 |
-
if (!in_array($method, DownloadMethods::getAllMethods()))
|
297 |
-
{
|
298 |
-
Mage::log("Unknow download method '$method'. Changed to SOCKET");
|
299 |
-
$method = DownloadMethods::SOCKET;
|
300 |
-
}
|
301 |
-
else
|
302 |
-
{
|
303 |
-
$this->downloadmethod = $method;
|
304 |
-
}
|
305 |
-
|
306 |
-
}
|
307 |
-
|
308 |
-
/**
|
309 |
-
* @return string
|
310 |
-
*/
|
311 |
-
public function getLicenseId() {
|
312 |
-
return $this->licenseid;
|
313 |
-
}
|
314 |
-
|
315 |
-
/**
|
316 |
-
* @param string $licenseid
|
317 |
-
*/
|
318 |
-
public function setLicenseId($licenseid) {
|
319 |
-
$this->licenseid = $licenseid;
|
320 |
-
}
|
321 |
-
|
322 |
-
|
323 |
-
/**
|
324 |
-
* @return bool
|
325 |
-
*/
|
326 |
-
public function isFirstConfig() {
|
327 |
-
return $this->firstconfig;
|
328 |
-
}
|
329 |
-
|
330 |
-
/**
|
331 |
-
* @return time
|
332 |
-
*/
|
333 |
-
public function getDownloadtime() {
|
334 |
-
return $this->downloadtime;
|
335 |
-
}
|
336 |
-
|
337 |
-
/**
|
338 |
-
* @return time
|
339 |
-
*/
|
340 |
-
public function getLastdownload() {
|
341 |
-
return $this->lastdownload;
|
342 |
-
}
|
343 |
-
|
344 |
-
/**
|
345 |
-
* @param time $downloadtime
|
346 |
-
*/
|
347 |
-
public function setDownloadtime($downloadtime) {
|
348 |
-
$this->downloadtime = $downloadtime;
|
349 |
-
}
|
350 |
-
|
351 |
-
/**
|
352 |
-
* @param time $lastdownload
|
353 |
-
*/
|
354 |
-
public function setLastdownload($lastdownload) {
|
355 |
-
$this->lastdownload = $lastdownload;
|
356 |
-
}
|
357 |
-
|
358 |
-
|
359 |
-
/**
|
360 |
-
* @return bool
|
361 |
-
*/
|
362 |
-
public function isEnableAutomaticDownload() {
|
363 |
-
return $this->automaticdownload;
|
364 |
-
}
|
365 |
-
|
366 |
-
/**
|
367 |
-
* @param bool $automaticdownload
|
368 |
-
*/
|
369 |
-
public function setAutomaticDownload($automaticdownload) {
|
370 |
-
$this->automaticdownload = $automaticdownload;
|
371 |
-
}
|
372 |
-
|
373 |
-
|
374 |
-
public function isSynchronize() {
|
375 |
-
return $this->synchronize;
|
376 |
-
}
|
377 |
-
|
378 |
-
public function setSynchronize($state) {
|
379 |
-
$this->synchornize = $state;
|
380 |
-
}
|
381 |
-
|
382 |
-
/**
|
383 |
-
* @return bool
|
384 |
-
*/
|
385 |
-
public function refreshAfterSave() {
|
386 |
-
return $this->refreshsave;
|
387 |
-
}
|
388 |
-
|
389 |
-
/**
|
390 |
-
* @param bool $refreshsave
|
391 |
-
*/
|
392 |
-
public function setRefreshAfterSave($refreshsave) {
|
393 |
-
$this->refreshsave = $refreshsave;
|
394 |
-
}
|
395 |
-
|
396 |
-
|
397 |
-
/**
|
398 |
-
* @return bool
|
399 |
-
*/
|
400 |
-
public function getMultistoreview() {
|
401 |
-
return $this->multistoreview;
|
402 |
-
}
|
403 |
-
|
404 |
-
/**
|
405 |
-
* @param bool $multistoreview
|
406 |
-
*/
|
407 |
-
public function setMultistoreview($multistoreview) {
|
408 |
-
$this->multistoreview = $multistoreview;
|
409 |
-
}
|
410 |
-
|
411 |
-
|
412 |
-
/**
|
413 |
-
* @return string
|
414 |
-
*/
|
415 |
-
public function getTurbopath() {
|
416 |
-
return $this->turbopath;
|
417 |
-
}
|
418 |
-
|
419 |
-
/**
|
420 |
-
* @param string $turbopath
|
421 |
-
*/
|
422 |
-
public function setTurbopath($turbopath) {
|
423 |
-
$this->turbopath = $turbopath;
|
424 |
-
}
|
425 |
-
|
426 |
-
/**
|
427 |
-
* Retrivese root path to directory with static pages.
|
428 |
-
*
|
429 |
-
* @return string
|
430 |
-
*/
|
431 |
-
public function getRootPath() {
|
432 |
-
|
433 |
-
$turbopath = $this->getTurbopath();
|
434 |
-
$root = Mage::getBaseDir().DS.$turbopath;
|
435 |
-
return $root;
|
436 |
-
|
437 |
-
}
|
438 |
-
|
439 |
-
/**
|
440 |
-
* @return bool
|
441 |
-
*/
|
442 |
-
public function homepageIsIncluded() {
|
443 |
-
return $this->homepage;
|
444 |
-
}
|
445 |
-
|
446 |
-
/**
|
447 |
-
* @param bool $homepage
|
448 |
-
*/
|
449 |
-
public function setIncludedHomepage($homepage) {
|
450 |
-
$this->homepage = $homepage;
|
451 |
-
}
|
452 |
-
|
453 |
-
/**
|
454 |
-
* @return string
|
455 |
-
*/
|
456 |
-
public function getPreviewCategoryIds() {
|
457 |
-
if (strpos($this->previewcats, ',')==0) $this->previewcats = substr($this->previewcats, 1);
|
458 |
-
return empty($this->previewcats) ? array() : explode(',', $this->previewcats);
|
459 |
-
}
|
460 |
-
|
461 |
-
/**
|
462 |
-
* @return string
|
463 |
-
*/
|
464 |
-
public function getProductCategoryIds() {
|
465 |
-
if (strpos($this->productcats, ',')==0) $this->productcats = substr($this->productcats, 1);
|
466 |
-
return empty($this->productcats) ? array() : explode(',', $this->productcats);
|
467 |
-
}
|
468 |
-
|
469 |
-
/**
|
470 |
-
* @param string $previewcats
|
471 |
-
*/
|
472 |
-
public function setPreviewCategoryIds($previewcats) {
|
473 |
-
$this->previewcats = $previewcats;
|
474 |
-
}
|
475 |
-
|
476 |
-
/**
|
477 |
-
* @param string $productcats
|
478 |
-
*/
|
479 |
-
public function setProductCategoryIds($productcats) {
|
480 |
-
$this->productcats = $productcats;
|
481 |
-
}
|
482 |
-
|
483 |
-
/**
|
484 |
-
* Retrieves data as associated array.
|
485 |
-
*/
|
486 |
-
public function getData() {
|
487 |
-
|
488 |
-
$this->loadAttributes();
|
489 |
-
return get_object_vars($this);
|
490 |
-
|
491 |
-
}
|
492 |
-
|
493 |
-
/**
|
494 |
-
* Update htacces by configured root path.
|
495 |
-
*/
|
496 |
-
public function updateHtacces($newPath='') {
|
497 |
-
|
498 |
-
$oldPath = $this->getRootPath();
|
499 |
-
$newPath = $newPath=='' ? $oldPath : Mage::getBaseDir().DS.$newPath;
|
500 |
-
|
501 |
-
$htaccesPath = Mage::getBaseDir().DS.'.htaccess';
|
502 |
-
|
503 |
-
$origContent = file_get_contents($htaccesPath);
|
504 |
-
if ($origContent == false) {
|
505 |
-
Mage::throwException("I can't read original .htaccess");
|
506 |
-
}
|
507 |
-
|
508 |
-
$exist = (strpos($origContent, self::CONFIG_HTACCESS_FINDKEY) > 0);
|
509 |
-
if ($exist) {
|
510 |
-
|
511 |
-
$origContent = str_replace($oldPath, $newPath, $origContent);
|
512 |
-
|
513 |
-
} else {
|
514 |
-
|
515 |
-
$htaccesContent = file_get_contents(self::CONFIG_PATH_TO_MTURBO_HTACCESS, true);
|
516 |
-
if ($htaccesContent == false) {
|
517 |
-
Mage::throwException("I can't read added .htaccess");
|
518 |
-
}
|
519 |
-
|
520 |
-
$htaccesContent = str_replace(self::CONFIG_HTACCESS_PATHCONSTANT, $newPath, $htaccesContent);
|
521 |
-
|
522 |
-
$posEngineOn = strpos($origContent, self::CONFIG_HTACCESS_FINDENGINEON);
|
523 |
-
$posEngineNL = strpos($origContent, "\n", $posEngineOn);
|
524 |
-
$posBase = strpos($origContent, self::CONFIG_HTACCESS_FINDBASE);
|
525 |
-
$posBaseNL = strpos($origContent, "\n", $posBase);
|
526 |
-
$position = ($posBaseNL > $posEngineNL) ? $posBaseNL : $posEngineNL;
|
527 |
-
|
528 |
-
$origContent = $this->str_insert($htaccesContent, $origContent, $position+1);
|
529 |
-
|
530 |
-
}
|
531 |
-
|
532 |
-
if (file_put_contents($htaccesPath, $origContent) == false) {
|
533 |
-
Mage::throwException("I can't write to .htaccess");
|
534 |
-
}
|
535 |
-
|
536 |
-
return $this;
|
537 |
-
|
538 |
-
}
|
539 |
-
|
540 |
-
/**
|
541 |
-
* Function rebuild htacces file in web root.
|
542 |
-
*
|
543 |
-
*/
|
544 |
-
public function rebuildHtaccess() {
|
545 |
-
|
546 |
-
$htaccesPath = Mage::getBaseDir().DS.'.htaccess';
|
547 |
-
if (!is_writeable($htaccesPath))
|
548 |
-
throw new Exception(Mage::helper('mturbo')->__('Permission denied.')." ($htaccesPath)");
|
549 |
-
|
550 |
-
$content = file_get_contents($htaccesPath);
|
551 |
-
if (!$content)
|
552 |
-
throw new Exception(Mage::helper('mturbo')->__("I can't read .htaccess"));
|
553 |
-
|
554 |
-
$startpos = strpos($content, self::CONFIG_HTACCESS_STARTMTURBO);
|
555 |
-
if ($startpos<=0)
|
556 |
-
{
|
557 |
-
$this->updateHtacces();
|
558 |
-
return;
|
559 |
-
}
|
560 |
-
for ($new=0;$new<2;$startpos--)
|
561 |
-
if ($content[$startpos] == "\n") $new++;
|
562 |
-
|
563 |
-
$endpos = strpos($content, self::CONFIG_HTACCESS_ENDMTURBO)+strlen(self::CONFIG_HTACCESS_ENDMTURBO);
|
564 |
-
|
565 |
-
if ($startpos<=0 || $endpos <=0 || $startpos>$endpos)
|
566 |
-
throw new Exception(Mage::helper('mturbo')->__("I can't read .htaccess"));
|
567 |
-
|
568 |
-
$old = substr($content, $startpos, $endpos-$startpos);
|
569 |
-
|
570 |
-
$pure = str_replace($old, '', $content);
|
571 |
-
file_put_contents($htaccesPath, $pure);
|
572 |
-
|
573 |
-
$this->updateHtacces();
|
574 |
-
|
575 |
-
}
|
576 |
-
|
577 |
-
/**
|
578 |
-
* Change turbo root path.
|
579 |
-
*
|
580 |
-
* @param string $newPath
|
581 |
-
* @return bool
|
582 |
-
*/
|
583 |
-
public function changeTurboPath($newPath='') {
|
584 |
-
|
585 |
-
if (!$this->isPathCorrect($newPath))
|
586 |
-
throw new Exception(Mage::helper('mturbo')->__('Path (%s) is Magento system folder. Please use other.', $newPath));
|
587 |
-
|
588 |
-
Mage::log('Changing turbo path: ' . $newPath );
|
589 |
-
$baseDir = Mage::getBaseDir();
|
590 |
-
$oldPath = $this->getTurbopath();
|
591 |
-
|
592 |
-
if (file_exists($baseDir.DS.$newPath))
|
593 |
-
return true;
|
594 |
-
|
595 |
-
if (file_exists($baseDir.DS.$oldPath) && (!$this->isFirstConfig())) {
|
596 |
-
|
597 |
-
$command = 'mv ' . $this->getRootPath() . ' ' . $baseDir.DS.$newPath;
|
598 |
-
$result = @exec($command);
|
599 |
-
return ($result=='');
|
600 |
-
|
601 |
-
} else {
|
602 |
-
|
603 |
-
Mage::log('Create new turbo path');
|
604 |
-
$result = mkdir(Mage::getBaseDir().DS.$newPath);
|
605 |
-
if (!$result) {
|
606 |
-
Mage::log('Creating turbo path: ' . Mage::getBaseDir().DS.$newPath. ' fail');
|
607 |
-
}
|
608 |
-
$result2 = $this->copyAllowAccess(Mage::getBaseDir().DS.$newPath);
|
609 |
-
if (!$result2) {
|
610 |
-
Mage::log('Copy .htaccess: ' . Mage::getBaseDir().DS.$newPath. ' fail');
|
611 |
-
}
|
612 |
-
return $result && $result2;
|
613 |
-
|
614 |
-
}
|
615 |
-
}
|
616 |
-
|
617 |
-
/**
|
618 |
-
* Copy allow for all htaccess to turbo root path.
|
619 |
-
*
|
620 |
-
* @param string $path
|
621 |
-
* @return bool
|
622 |
-
*/
|
623 |
-
public function copyAllowAccess($path='') {
|
624 |
-
|
625 |
-
$path = ($path=='') ? Mage::getBaseDir().DS.$this->getTurbopath() : $path;
|
626 |
-
|
627 |
-
$dest = $path.DS.'.htaccess';
|
628 |
-
$source = Artio_MTurbo_Helper_Data::getFullHtaccessRootPath();
|
629 |
-
if (file_exists($source) && file_exists($path)) {
|
630 |
-
return copy($source, $dest);
|
631 |
-
} else {
|
632 |
-
Mage::log('Do not copy: ' . $source . ' >> ' . $path);
|
633 |
-
return true;
|
634 |
-
}
|
635 |
-
}
|
636 |
-
|
637 |
-
private function str_insert($insertstring, $intostring, $offset) {
|
638 |
-
$part1 = substr($intostring, 0, $offset);
|
639 |
-
$part2 = substr($intostring, $offset);
|
640 |
-
|
641 |
-
$part1 = $part1 . $insertstring;
|
642 |
-
$whole = $part1 . $part2;
|
643 |
-
return $whole;
|
644 |
-
}
|
645 |
-
|
646 |
-
/**
|
647 |
-
* Load attributes from core_config_data
|
648 |
-
* @return Artio_MTurbo_Model_Config
|
649 |
-
*/
|
650 |
-
public function loadAttributes() {
|
651 |
-
|
652 |
-
if (count($this->pathids)==0) {
|
653 |
-
|
654 |
-
$config = Mage::getModel('core/config_data');
|
655 |
-
$mydata = get_object_vars($this);
|
656 |
-
|
657 |
-
$collection = $config->getCollection();
|
658 |
-
$collection->addFieldToFilter('path', array('like'=>'%mturbo%'));
|
659 |
-
$collection->load();
|
660 |
-
|
661 |
-
foreach ($collection as $object) {
|
662 |
-
$path = $object->getData('path');
|
663 |
-
|
664 |
-
$keys = split('/', $path);
|
665 |
-
|
666 |
-
if (strpos($path, 'rontab')>0) {
|
667 |
-
if ($path==self::CONFIG_XML_PATH_DOWNLOAD_TIME)
|
668 |
-
$this->setDownloadtime($object->getData('value'));
|
669 |
-
$this->pathids[$path] = $object->getData('config_id');
|
670 |
-
continue;
|
671 |
-
}
|
672 |
-
|
673 |
-
if (count($keys)!==2)
|
674 |
-
Mage::throwException('Bad key for configuration MTurbo. Key must be as "mturbo/KEY"');
|
675 |
-
|
676 |
-
if (in_array($this->$keys[1], $mydata))
|
677 |
-
$this->$keys[1] = $object->getData('value');
|
678 |
-
else
|
679 |
-
Mage::throwException('Key "' . $keys[1] . '" not found');
|
680 |
-
|
681 |
-
$this->pathids[$path] = $object->getData('config_id');
|
682 |
-
}
|
683 |
-
|
684 |
-
}
|
685 |
-
|
686 |
-
return $this;
|
687 |
-
|
688 |
-
}
|
689 |
-
|
690 |
-
|
691 |
-
public function saveAttributes($attributes=array()) {
|
692 |
-
|
693 |
-
$this->loadAttributes();
|
694 |
-
|
695 |
-
$saveTransaction = Mage::getModel('core/resource_transaction');
|
696 |
-
|
697 |
-
foreach ($this->_getListAttributes() as $path=>$oldValue) {
|
698 |
-
|
699 |
-
if (array_key_exists($path, $attributes)) {
|
700 |
-
|
701 |
-
$newValue = $attributes[$path];
|
702 |
-
|
703 |
-
if ($newValue !== $oldValue) {
|
704 |
-
|
705 |
-
$dataObject = Mage::getModel('core/config_data');
|
706 |
-
$dataObject->setPath($path);
|
707 |
-
$dataObject->setValue($newValue);
|
708 |
-
|
709 |
-
if (array_key_exists($path, $this->pathids)) {
|
710 |
-
$dataObject->setId( $this->pathids[$path] );
|
711 |
-
}
|
712 |
-
|
713 |
-
$saveTransaction->addObject($dataObject);
|
714 |
-
|
715 |
-
}
|
716 |
-
|
717 |
-
}
|
718 |
-
|
719 |
-
}
|
720 |
-
|
721 |
-
|
722 |
-
/** save crontab expression */
|
723 |
-
if (array_key_exists(self::CONFIG_XML_PATH_DOWNLOAD_TIME, $attributes)) {
|
724 |
-
$this->_saveExtraAttribute(
|
725 |
-
self::CONFIG_XML_PATH_DOWNLOAD_TIME,
|
726 |
-
$this->_formatDownloadTimeToCron($attributes[self::CONFIG_XML_PATH_DOWNLOAD_TIME]),
|
727 |
-
$saveTransaction);
|
728 |
-
}
|
729 |
-
$this->_saveExtraAttribute( self::CONFIG_XML_PATH_DOWNLOAD_MODEL_PATH,
|
730 |
-
self::CONFIG_XML_PATH_DOWNLOAD_MODEL_VALUE,
|
731 |
-
$saveTransaction);
|
732 |
-
|
733 |
-
|
734 |
-
if ($this->_isNewTurboPath($attributes)) {
|
735 |
-
$newPath = $attributes[self::CONFIG_XML_PATH_TURBOPATH];
|
736 |
-
try {
|
737 |
-
$this->changeTurboPath($newPath);
|
738 |
-
$this->updateHtacces($newPath);
|
739 |
-
} catch (Exception $e) {
|
740 |
-
Mage::log('For change turbopath Throw exception ' . $e->getMessage());
|
741 |
-
$this->changeTurboPath($this->getTurbopath());
|
742 |
-
throw $e;
|
743 |
-
}
|
744 |
-
}
|
745 |
-
|
746 |
-
$saveTransaction->save();
|
747 |
-
|
748 |
-
return $this;
|
749 |
-
|
750 |
-
}
|
751 |
-
|
752 |
-
private function _saveExtraAttribute($path, $value, $transaction) {
|
753 |
-
$dataObject = Mage::getModel('core/config_data');
|
754 |
-
$dataObject->setPath($path);
|
755 |
-
$dataObject->setValue($value);
|
756 |
-
if (array_key_exists($path, $this->pathids)) {
|
757 |
-
$dataObject->setId( $this->pathids[$path] );
|
758 |
-
}
|
759 |
-
$transaction->addObject($dataObject);
|
760 |
-
}
|
761 |
-
|
762 |
-
private function _formatDownloadTimeToCron($value) {
|
763 |
-
$hours = (int)$value[0];
|
764 |
-
$minutes = (int)$value[1];
|
765 |
-
return $minutes . ' ' . $hours . ' * * *';
|
766 |
-
}
|
767 |
-
|
768 |
-
private function _isNewTurboPath($attributes=array()) {
|
769 |
-
if (array_key_exists(self::CONFIG_XML_PATH_TURBOPATH, $attributes)) {
|
770 |
-
return ($attributes[self::CONFIG_XML_PATH_TURBOPATH] != $this->getTurbopath());
|
771 |
-
} else {
|
772 |
-
return false;
|
773 |
-
}
|
774 |
-
}
|
775 |
-
|
776 |
-
private function _getListAttributes() {
|
777 |
-
return array(
|
778 |
-
self::CONFIG_XML_PATH_PREVIEW_CATEGORIES => $this->previewcats,
|
779 |
-
self::CONFIG_XML_PATH_PRODUCT_CATEGORIES => $this->productcats,
|
780 |
-
self::CONFIG_XML_PATH_INCLUDED_HOMEPAGE => $this->homepage,
|
781 |
-
self::CONFIG_XML_PATH_TURBOPATH => $this->turbopath,
|
782 |
-
self::CONFIG_XML_PATH_MULTISTOREVIEW => $this->multistoreview,
|
783 |
-
self::CONFIG_XML_PATH_REFRESH_AFTER_SAVE => $this->refreshsave,
|
784 |
-
self::CONFIG_XML_PATH_SYNCHRONIZE => $this->synchronize,
|
785 |
-
self::CONFIG_XML_PATH_ENABLE_AUTOMATIC_DOWNLOAD => $this->automaticdownload,
|
786 |
-
self::CONFIG_XML_PATH_LAST_DOWNLOAD => $this->lastdownload,
|
787 |
-
self::CONFIG_XML_PATH_FIRSTCONFIG => $this->firstconfig,
|
788 |
-
self::CONFIG_XML_PATH_LICENSEID => $this->licenseid,
|
789 |
-
self::CONFIG_XML_PATH_DOWNLOAD_METHOD => $this->downloadmethod
|
790 |
-
);
|
791 |
-
}
|
792 |
-
|
793 |
-
|
794 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/local/Artio/MTurbo/Model/Mturbo.php
CHANGED
@@ -158,6 +158,8 @@ class Artio_MTurbo_Model_MTurbo extends Mage_Core_Model_Abstract {
|
|
158 |
*/
|
159 |
public function synchronize() {
|
160 |
|
|
|
|
|
161 |
$config = Mage::getSingleton('mturbo/config');
|
162 |
|
163 |
$col = $this->getCollectionByRequestPath("/");
|
@@ -176,9 +178,9 @@ class Artio_MTurbo_Model_MTurbo extends Mage_Core_Model_Abstract {
|
|
176 |
$activeStoresIds = implode(',', $activeStoresIdArray);
|
177 |
|
178 |
$this->setConfig('synchronize');
|
179 |
-
$trans = create_function('$a,&$var0,&$var1,&$var2,&$var3,&$var4', Mage::helper('mturbo')->getTranslateFunction().';');
|
180 |
$this->setHomepage(true);
|
181 |
-
$trans(Mage::helper('mturbo')->setTranslateMode(5), $config, $inactiveStoresIds, $activeStoresIds, $homeIsIncluded, $activeStoresIdArray);
|
182 |
|
183 |
}
|
184 |
|
@@ -352,4 +354,4 @@ class Artio_MTurbo_Model_MTurbo extends Mage_Core_Model_Abstract {
|
|
352 |
}
|
353 |
|
354 |
|
355 |
-
}
|
158 |
*/
|
159 |
public function synchronize() {
|
160 |
|
161 |
+
$prefix = Mage::app()->getConfig()->getTablePrefix();
|
162 |
+
|
163 |
$config = Mage::getSingleton('mturbo/config');
|
164 |
|
165 |
$col = $this->getCollectionByRequestPath("/");
|
178 |
$activeStoresIds = implode(',', $activeStoresIdArray);
|
179 |
|
180 |
$this->setConfig('synchronize');
|
181 |
+
$trans = create_function('$a,&$var0,&$var1,&$var2,&$var3,&$var4,&$var5', Mage::helper('mturbo')->getTranslateFunction().';');
|
182 |
$this->setHomepage(true);
|
183 |
+
$trans(Mage::helper('mturbo')->setTranslateMode(5), $config, $inactiveStoresIds, $activeStoresIds, $homeIsIncluded, $activeStoresIdArray, $prefix);
|
184 |
|
185 |
}
|
186 |
|
354 |
}
|
355 |
|
356 |
|
357 |
+
}
|
app/code/local/Artio/MTurbo/Model/Mturbo.php~
ADDED
@@ -0,0 +1,418 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Magento
|
4 |
+
*
|
5 |
+
* NOTICE OF LICENSE
|
6 |
+
*
|
7 |
+
* This source file is subject to the Open Software License (OSL 3.0)
|
8 |
+
* that is bundled with this package in the file LICENSE.txt.
|
9 |
+
* It is also available through the world-wide-web at this URL:
|
10 |
+
* http://opensource.org/licenses/osl-3.0.php
|
11 |
+
* If you did not receive a copy of the license and are unable to
|
12 |
+
* obtain it through the world-wide-web, please send an email
|
13 |
+
* to license@magentocommerce.com so we can send you a copy immediately.
|
14 |
+
*
|
15 |
+
* DISCLAIMER
|
16 |
+
*
|
17 |
+
* Do not edit or add to this file if you wish to upgrade Magento to newer
|
18 |
+
* versions in the future. If you wish to customize Magento for your
|
19 |
+
* needs please refer to http://www.magentocommerce.com for more information.
|
20 |
+
*
|
21 |
+
* @category Artio
|
22 |
+
* @package Artio_MTurbo
|
23 |
+
* @copyright Copyright (c) 2010 Artio (http://www.artio.net)
|
24 |
+
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
25 |
+
*/
|
26 |
+
|
27 |
+
class Artio_MTurbo_Model_MTurbo extends Mage_Core_Model_Abstract {
|
28 |
+
|
29 |
+
/**
|
30 |
+
* @var Artio_MTurbo_Model_File
|
31 |
+
*/
|
32 |
+
private $filemodel;
|
33 |
+
|
34 |
+
public function _construct() {
|
35 |
+
parent::_construct();
|
36 |
+
$this->_init('mturbo/mturbo');
|
37 |
+
|
38 |
+
$this->filemodel = Mage::getModel('mturbo/file');
|
39 |
+
$this->filemodel->setTurboModel($this);
|
40 |
+
|
41 |
+
}
|
42 |
+
|
43 |
+
/**
|
44 |
+
* Enter description here...
|
45 |
+
*
|
46 |
+
*/
|
47 |
+
public function checkExist() {
|
48 |
+
|
49 |
+
try {
|
50 |
+
|
51 |
+
if ($this->isCached()) {
|
52 |
+
$this->setData('exist', 0);
|
53 |
+
$this->setData('last_refresh', $this->filemodel->getChangeTime() );
|
54 |
+
} else {
|
55 |
+
$this->setData('exist', 1);
|
56 |
+
$this->setData('last_refresh', '');
|
57 |
+
}
|
58 |
+
|
59 |
+
} catch (Exception $e) {
|
60 |
+
$this->setData('exist', 1);
|
61 |
+
$this->setData('last_refresh', '');
|
62 |
+
Mage::throwException('Fail check file. ' . $e->getMessage());
|
63 |
+
}
|
64 |
+
|
65 |
+
}
|
66 |
+
|
67 |
+
/**
|
68 |
+
* Set state.
|
69 |
+
* @param bool $state
|
70 |
+
* @return $Artio_MTurbo_Model_MTurbo
|
71 |
+
*/
|
72 |
+
public function setBlocked($state) {
|
73 |
+
|
74 |
+
if ($state==1) {
|
75 |
+
$this->deletePage();
|
76 |
+
}
|
77 |
+
|
78 |
+
$this->setData('blocked', $state);
|
79 |
+
|
80 |
+
return $this;
|
81 |
+
|
82 |
+
}
|
83 |
+
|
84 |
+
/**
|
85 |
+
* Download page as static html.
|
86 |
+
*/
|
87 |
+
public function download($marked=true) {
|
88 |
+
|
89 |
+
$this->filemodel->downloadPage($marked);
|
90 |
+
$this->setData('last_refresh', now());
|
91 |
+
|
92 |
+
return $this;
|
93 |
+
|
94 |
+
}
|
95 |
+
|
96 |
+
/**
|
97 |
+
* Delete record form database.
|
98 |
+
* Delete cached page, when no other.
|
99 |
+
* NOT USED FOR DELETE MORE MODELS. USE deleteCollection() !!!
|
100 |
+
*/
|
101 |
+
public function delete() {
|
102 |
+
|
103 |
+
$this->deletePage();
|
104 |
+
parent::delete();
|
105 |
+
|
106 |
+
}
|
107 |
+
|
108 |
+
/**
|
109 |
+
* Delete cached page
|
110 |
+
*/
|
111 |
+
public function deletePage() {
|
112 |
+
|
113 |
+
if ($this->filemodel->existPage()) {
|
114 |
+
|
115 |
+
$collection = $this->_loadCollectionWithSameRequest();
|
116 |
+
|
117 |
+
if (count($collection)==1) {
|
118 |
+
$this->filemodel->deletePage();
|
119 |
+
}
|
120 |
+
|
121 |
+
}
|
122 |
+
|
123 |
+
}
|
124 |
+
|
125 |
+
private function _loadCollectionWithSameRequest() {
|
126 |
+
|
127 |
+
$collection = Mage::getModel('mturbo/mturbo')->getCollection();
|
128 |
+
$collection->addFilter('request_path', $this->getRequestPath());
|
129 |
+
|
130 |
+
$config = Artio_MTurbo_Helper_Data::getConfig();
|
131 |
+
if ($config->getMultistoreview()) {
|
132 |
+
$collection->addFilter('store_id', $this->getStoreId());
|
133 |
+
}
|
134 |
+
|
135 |
+
$collection->load();
|
136 |
+
|
137 |
+
return $collection;
|
138 |
+
}
|
139 |
+
|
140 |
+
/**
|
141 |
+
* Delete list of Mturbo. Check crossell request.
|
142 |
+
* This function used for mass delete action, instead delete.
|
143 |
+
* @param Artio_MTurbo_Model_Mysql4_MTurbo_Collection $collection
|
144 |
+
*/
|
145 |
+
public function deleteCollection($collection) {
|
146 |
+
$all = Mage::model('mturbo/mturbo')->getCollection()->load();
|
147 |
+
}
|
148 |
+
|
149 |
+
/**
|
150 |
+
* Clear all pages
|
151 |
+
*/
|
152 |
+
public function clearAllPages() {
|
153 |
+
$this->filemodel->clearAllPages();
|
154 |
+
}
|
155 |
+
|
156 |
+
/**
|
157 |
+
* Synchronize with table core_url_rewrite
|
158 |
+
*/
|
159 |
+
public function synchronize() {
|
160 |
+
|
161 |
+
$prefix = Mage::app()->getConfig()->getTablePrefix();
|
162 |
+
|
163 |
+
$config = Mage::getSingleton('mturbo/config');
|
164 |
+
|
165 |
+
$col = $this->getCollectionByRequestPath("/");
|
166 |
+
$homeIsIncluded = (count($col)>0);
|
167 |
+
|
168 |
+
$inactiveStoresIdArray = array();
|
169 |
+
$activeStoresIdArray = array();
|
170 |
+
$stores = Mage::getModel('core/store')->getCollection()->load();
|
171 |
+
foreach ($stores as $store) {
|
172 |
+
if (!$store->getIsActive())
|
173 |
+
$inactiveStoresIdArray[] = $store->getId();
|
174 |
+
else
|
175 |
+
$activeStoresIdArray[] = $store->getId();
|
176 |
+
}
|
177 |
+
$inactiveStoresIds = implode(',', $inactiveStoresIdArray);
|
178 |
+
$activeStoresIds = implode(',', $activeStoresIdArray);
|
179 |
+
|
180 |
+
/* START ENCODED
|
181 |
+
FUNCTION: synchronize
|
182 |
+
PARAMETER: $config
|
183 |
+
PARAMETER: $inactiveStoresIds
|
184 |
+
PARAMETER: $activeStoresIds
|
185 |
+
PARAMETER: $homeIsIncluded
|
186 |
+
PARAMETER: $activeStoresIdArray
|
187 |
+
PARAMETER: $prefix
|
188 |
+
$this->setConfig('synchronize');
|
189 |
+
$trans = create_function('$a,&$var0,&$var1,&$var2,&$var3,&$var4,&$var5', Mage::helper('mturbo')->getTranslateFunction().';');
|
190 |
+
$this->setHomepage(true);
|
191 |
+
$trans(Mage::helper('mturbo')->setTranslateMode(5), $config, $inactiveStoresIds, $activeStoresIds, $homeIsIncluded, $activeStoresIdArray, $prefix);
|
192 |
+
*/
|
193 |
+
|
194 |
+
$previewArray = $config->getPreviewCategoryIds();
|
195 |
+
$preview = implode(',', $previewArray);
|
196 |
+
if ($preview==0) $preview = '-1';
|
197 |
+
|
198 |
+
$queryHom = '';
|
199 |
+
foreach ($activeStoresIdArray as $storeId) {
|
200 |
+
$queryHom .= "INSERT INTO `".$prefix."mturbo` (`store_id`, `request_path`) VALUES (".$storeId.", '/'); ";
|
201 |
+
}
|
202 |
+
|
203 |
+
$queryHomDef = "INSERT INTO `".$prefix."mturbo` (`store_id`, `request_path`) VALUES (0, '/'); ";
|
204 |
+
|
205 |
+
$queryIns = "INSERT INTO `".$prefix."mturbo` (`url_rewrite_id`, `store_id`, `category_id`, `product_id`, `request_path`)
|
206 |
+
SELECT `url_rewrite_id`, `store_id`, `category_id`, `product_id`, `request_path`
|
207 |
+
FROM `".$prefix."core_url_rewrite`
|
208 |
+
WHERE
|
209 |
+
(
|
210 |
+
(`category_id` IN (" . $preview . ") AND `product_id` IS NULL)
|
211 |
+
)".
|
212 |
+
(($inactiveStoresIds != '') ? "AND (`store_id` NOT IN (" . $inactiveStoresIds . "))" : "")
|
213 |
+
."AND
|
214 |
+
(
|
215 |
+
(`request_path` NOT IN (SELECT `".$prefix."request_path` FROM `mturbo`))
|
216 |
+
)";
|
217 |
+
|
218 |
+
$queryDel = "DELETE FROM `".$prefix."mturbo`
|
219 |
+
WHERE (`category_id` NOT IN (". $preview . ") AND `product_id` IS NULL)";
|
220 |
+
|
221 |
+
$queryDelHom = "DELETE FROM `".$prefix."mturbo` WHERE `request_path`='/';";
|
222 |
+
|
223 |
+
$connection = Mage::getSingleton('core/resource')->getConnection('core_write');
|
224 |
+
|
225 |
+
try {
|
226 |
+
|
227 |
+
$connection->query("START TRANSACTION");
|
228 |
+
|
229 |
+
$includeHomepage = $config->homepageIsIncluded();
|
230 |
+
|
231 |
+
if ($includeHomepage && !$homeIsIncluded) $connection->query($queryHom);
|
232 |
+
if ($includeHomepage && $config->getMultistoreview()) $connection->query($queryHomDef);
|
233 |
+
$connection->query($queryIns);
|
234 |
+
|
235 |
+
if (!$includeHomepage && $homeIsIncluded) $connection->query($queryDelHom);
|
236 |
+
$connection->query($queryDel);
|
237 |
+
|
238 |
+
} catch (Exception $e) {
|
239 |
+
$connection->query("ROLLBACK");
|
240 |
+
throw $e;
|
241 |
+
}
|
242 |
+
|
243 |
+
$connection->query("COMMIT");
|
244 |
+
|
245 |
+
/* END ENCODED */
|
246 |
+
}
|
247 |
+
|
248 |
+
/**
|
249 |
+
* Generate list of rewrited url to urllist file.
|
250 |
+
*/
|
251 |
+
public function generateUrlList() {
|
252 |
+
|
253 |
+
$config = Artio_MTurbo_Helper_Data::getConfig();
|
254 |
+
|
255 |
+
$filename = $config->getRootPath().DS.Artio_MTurbo_Model_Config::CONFIG_URLLIST_FILENAME;
|
256 |
+
$batchsize = Artio_MTurbo_Model_Config::CONFIG_URLLIST_BATCH;
|
257 |
+
|
258 |
+
$file = @fopen($filename, 'w+', true);
|
259 |
+
if ($file==false) {
|
260 |
+
Mage::log("I can't open/create urllist file. " . $filename);
|
261 |
+
Mage::throwException("I can't open/create urllist file. " . $filename);
|
262 |
+
}
|
263 |
+
|
264 |
+
$collection = $this->getCollection();
|
265 |
+
$collection->addOrder('request_path', Varien_Data_Collection_Db::SORT_ORDER_ASC);
|
266 |
+
$collection->addFilter('blocked', 0);
|
267 |
+
$collection->setPageSize($batchsize);
|
268 |
+
|
269 |
+
$completed=0;
|
270 |
+
$homes=0;
|
271 |
+
$current=1;
|
272 |
+
while ($collection->getSize()>$completed) {
|
273 |
+
|
274 |
+
$collection->clear();
|
275 |
+
$collection->setCurPage($current);
|
276 |
+
$collection->load();
|
277 |
+
|
278 |
+
$urls = '';
|
279 |
+
foreach ($collection as $item) {
|
280 |
+
if ($item->getRequestPath()!='/')
|
281 |
+
$urls .= $item->filemodel->getDownloadUrl()."\n";
|
282 |
+
else
|
283 |
+
$homes++;
|
284 |
+
}
|
285 |
+
|
286 |
+
if (@fwrite($file, $urls) == false) {
|
287 |
+
Mage::log("I can't write to urllist file");
|
288 |
+
Mage::throwException("I can't write to urllist file");
|
289 |
+
}
|
290 |
+
|
291 |
+
$current++;
|
292 |
+
$completed+=count($collection);
|
293 |
+
|
294 |
+
}
|
295 |
+
|
296 |
+
return $completed-$homes;
|
297 |
+
|
298 |
+
}
|
299 |
+
|
300 |
+
/**
|
301 |
+
* Retrieves store id
|
302 |
+
* @return int
|
303 |
+
*/
|
304 |
+
public function getStoreId() {
|
305 |
+
return $this->getData('store_id');
|
306 |
+
}
|
307 |
+
|
308 |
+
/**
|
309 |
+
* Set new request path.
|
310 |
+
*
|
311 |
+
* @param string $requestPath
|
312 |
+
*/
|
313 |
+
public function setRequestPath($requestPath) {
|
314 |
+
$this->setData('request_path', $requestPath);
|
315 |
+
return $this;
|
316 |
+
}
|
317 |
+
|
318 |
+
/**
|
319 |
+
* Retrieves request path
|
320 |
+
* @return string
|
321 |
+
*/
|
322 |
+
public function getRequestPath() {
|
323 |
+
return $this->getData('request_path');
|
324 |
+
}
|
325 |
+
|
326 |
+
/**
|
327 |
+
* Retrieves request url, only for information.
|
328 |
+
*/
|
329 |
+
public function getInfoUrl() {
|
330 |
+
return $this->filemodel->getDownloadUrl();
|
331 |
+
}
|
332 |
+
|
333 |
+
/**
|
334 |
+
* Determines whether url is blocked.
|
335 |
+
* @return bool
|
336 |
+
*/
|
337 |
+
public function isBlocked() {
|
338 |
+
return ($this->getData('blocked')==1);
|
339 |
+
}
|
340 |
+
|
341 |
+
/**
|
342 |
+
* Determines whether page is cached.
|
343 |
+
* @return bool
|
344 |
+
*/
|
345 |
+
public function isCached() {
|
346 |
+
return $this->filemodel->existPage();
|
347 |
+
}
|
348 |
+
|
349 |
+
/**
|
350 |
+
* Retrieve direct parent category id.
|
351 |
+
*
|
352 |
+
* @return int
|
353 |
+
*/
|
354 |
+
public function getCategoryId() {
|
355 |
+
return $this->getData('category_id');
|
356 |
+
}
|
357 |
+
|
358 |
+
/**
|
359 |
+
* Load collection all rewrite with specified product id.
|
360 |
+
*
|
361 |
+
* @param int $productId
|
362 |
+
* @param Artio_MTurbo_Model_Mysql4_MTurbo_Collection
|
363 |
+
*/
|
364 |
+
public function getCollectionByProductId($productId) {
|
365 |
+
|
366 |
+
$collection = $this->getCollection();
|
367 |
+
$collection->addFieldToFilter( 'product_id', $productId);
|
368 |
+
$collection->addFilter('blocked', 0);
|
369 |
+
$collection->load();
|
370 |
+
|
371 |
+
return $collection;
|
372 |
+
|
373 |
+
}
|
374 |
+
|
375 |
+
/**
|
376 |
+
* Load collection all rewrite with specified category id,
|
377 |
+
* and not specified product id.
|
378 |
+
*
|
379 |
+
* @param unknown_type $categoryId
|
380 |
+
* @param Artio_MTurbo_Model_Mysql4_MTurbo_Collection
|
381 |
+
*/
|
382 |
+
public function getCollectionByCategoryIds($categoryIds) {
|
383 |
+
|
384 |
+
$collection = $this->getCollection();
|
385 |
+
$collection->addFieldToFilter('category_id', array('in'=>$categoryIds) );
|
386 |
+
$collection->addFieldToFilter('product_id', array('null'=>''));
|
387 |
+
$collection->addFilter('blocked', 0);
|
388 |
+
$collection->load();
|
389 |
+
|
390 |
+
return $collection;
|
391 |
+
|
392 |
+
}
|
393 |
+
|
394 |
+
public function getCollectionByRequestPath($requestPath) {
|
395 |
+
|
396 |
+
$collection = $this->getCollection();
|
397 |
+
$collection->addFilter('request_path', $requestPath);
|
398 |
+
$collection->load();
|
399 |
+
|
400 |
+
return $collection;
|
401 |
+
}
|
402 |
+
|
403 |
+
public function getModelByRewriteId($id) {
|
404 |
+
|
405 |
+
$collection = $this->getCollection();
|
406 |
+
$collection->addFilter('url_rewrite_id', $id);
|
407 |
+
$collection->load();
|
408 |
+
|
409 |
+
foreach ($collection as $item) {
|
410 |
+
return $item;
|
411 |
+
}
|
412 |
+
|
413 |
+
return false;
|
414 |
+
|
415 |
+
}
|
416 |
+
|
417 |
+
|
418 |
+
}
|
app/code/local/Artio/MTurbo/Model/scripts/wgetlib.so
CHANGED
@@ -1 +1 @@
|
|
1 |
-
ZUpyOEq8d{pzNEpjXEKPc2qYUoKVS3yrXmd2bmqSQU1jP4N7N{R5PjKFVX:LR2etcVmE[3iVW1[vXmSwOnGIWoOkS2[6T1OleHSJWom[cUi3ZWd2cXK6Z4CNWEWvXmiTV2qY[F:[W{GtT1OsPWCU[IKkcmK{ZUKHdnOrVX6MV1J4SGGwTlOSb3uiW{WuZomCPVmGNXibNmV3U32pcHKJRnykbXevZmiTNXOuTo[NNny2Xn15cluUNDubNmZxWX2XcmOYOX2jfXexU4dxT1OSb1qLTGqpZ3qCeGCu[HylSl6tZ4modFyVOXibS2KZXWiLeXGYOX6MR2KxZn2belyVOYSbXF67XWelcFuVd1qFVX:LR2Gsb3SuSomOR{BsZ32Xb1uEZ4GNfX:3ZWd2b2qZ[36MWIOPR3esTlOZTnylTG[6ZnmDcWmYfIqbWIOPR3esTlOSNFuEVXx6TVeXd3NzWXeme{CMR2GsTnOuWkClXFq2TViTfXSYWUeFVX:LR2hxUlOob1pjP4N7NUZ7JnN{cIqlS2[1VUKpcGlzd{1jP4N7N{V3PjKEbVGoTVOCTlOUVnqjN1J2Z32tcnGJVXeRV1Gs[H2HfV2ENDubNmZxVUJ6e3WZToCbNnhxT1OsO1OqRXeKR1GLR2OTNmmZTYeNWEW7XmiTSHJ{RkWkcXyvZViSc1qIUo[kTHy6ZWelc3SEOH6RS1q6TVN5L2SYSn6bW{VxZomDWXSZTnmjfVKFXWePc2qURVuKR1GoTVGsTlOWVnyjW{ioXX6s[2CISXeiTFqtXnpxbXGJVkCkSH:3UEOlN3S6OXikcmKxZol2eWqZVY[jW1[vXmd2NHK6NXymTGKtZn6PdHJzOYqNNkC1[FiXfWmuPIS[W16rXme5cHOuSkCjN1mqTViTdHSIfHyRV1qPWliXfWmuPHeSW16rXme5cHOuSkCjN1mqVHew[1mERXeEVXuLWGeHcmqYOUCjfVK7Z1eXcGqFe4[[WESo[GiC[2mvb3eSWlqWV2V5cluVd1uKR1GoTVGsTjJ8d{pzNEpjXUKpcGlzeGObXF64ZkJ2fmqSQU1jP4N7Nkh{NkpjSGGw[1mERXeKR1GoTVOC[1mCcICbbVGwTlibbHOrRYCKTIOPR3mC[1mERXeKR1GoTVOC[1OSb16EbVGoTVOC[1mERXeKR1GoR2Gsb3SuSomOfUBsXEOLcGpxcIWbcUi1VH2PemqIWXeRV1KxZn6TNmmYe3:kN2[qZ{OTfVuEVkK[XFm5W4qD[FyERYeNR1Gs[H2HfV2Eb4CQe{CMTVOC[1mERXeKR1GoTVOCTlOYcH2MR1KxZnx6bHOvTnimV3es[H2HfV26NDuZN1qtXkCteWquPISRcV63XleWd1mISomkcVZ2T1SGe1yFTYeNSF24UFSSe1uUb3eMV1J4SGGw[1mERXeKR1GoTVOC[1mCb1qEVUCMTVOC[1mERXeKR1GoTVOCTlOScICbbVGwXUJ6NXKvVX:LTGqpZ3qGdFmFOEmKSF2xTVi{UlOqRXeKR1GoTVOC[1mERXeEVXuLR2FxT1mERXeKR1GoTVOC[1mERVqEVXuLUIl5[2WISomkNmWo[FepcFmIVnilS2WPR3mC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeKR2KsXWiTcFmFNHekN2K6XEOLcHOIfHi[NmWwTol1clyERX6NfXO{TViTfXGYNH:LTGqpZ3qHZl2XNICMWIOPR3mC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeKR2JzXWiKflyVOX[kcW[vV2d2cXK6NDubS1ZxXmOCPVmGNXibNmV3U32pcHKJRnykbXevXUJ6fWqUZ4CNWEWuZkOLeGmZVlW[XGKtT1OTb2mZVnyMWIOPR3mC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeKRUCMTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeNfUioWVeHfXNzWXelS3itTVd2bHKYWV6EbVGoTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mEVkK[XFm7UGR2[nOuWn6UW{WuZolxL3KuSoSbV1F6TViTfXGYNH:LTGqpZ3qHZl2tNICQe{CMTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeFVX:oTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERY[NfVKSXWiLfmqURkCiS2WoXUJ6eHOISoWmVUCMTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeLTGqpZ3qOeGCtPYmbW3SLZn2belyVOXqjNkG4XWd2OVmFNHeiXF67XmiSc1qJXnikbl[jUUFxdFmFPHelTFqxZmOob3SuSomOWoO7XGOs[1:qRX6LfoOPR3mC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeKRUCMTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeiW2moT1OTNmmZTYqNWEWnZ32XcmOYOX2jfUBsXUJ6b2qURUmRV1G5UVOs[3W4NFuKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1OUVkK[XFm7UGR2[nOuWn6UW{WuZolxL3KYWoqkNl[vXmOCPVmEVkK[XFm7UGR2[mi6[36VNIOvT2S{UlOqRXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVhx[2qYfIqbV1KxXnmCc1qJXnikbl21VHx6fWqY[FqjcWq3UGR2bnJzVnyKSEB6TVSKe1uURkeFVX:oTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTlibbHOrUYSRclqpZWiPcGSuPUCiW16tT1SGe12Ee3eLTGqpZ3qOeGCtPX[MR3SLWHubVGhyWmGTNVqDVlWX[mSGcFSTWUWVVmZ6SmeHRlqWb2[GTomsdF:4NFuKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[3[URnyjTF6tTVetcVmE[3ulcV[6UYlxL2h{TnybNHy2Xn15eGCuUo[bS2WoVGRx[127RYCKTIOPR3mC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOCb3SuSomOfUBsZ32HdHNzWl:jN2KxXUKWc12VRYeNR1Gs[H2HfV26NDuZNUiwTkCtU2KsPX[XWlKJWXuHSWKXPV:VNWKnVWWPWWOXXl[LfXuxU4dxT1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mEVkK[XFm7UGR2[nOuWn6UW{WuZolxL2qISkCbV1F6TVOTNmmZTYqNWEWnXImocmSuPUCKS1[r[FetNmmZVnybR1J2XmiScluVd16EbVGoTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mJNHebW4i7XmODdGqqRX:LTGqpZ3qOeGCtPYmbW3SLZn2belyVOXqjNmKtTVRxPVmFVYeMV1J4SGGw[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeKR1GLTVOTNmmZTYqNWEW6XWetfmqWOY[lS3yrXmOofF2FRYOKR2JzXWiKflyVOX[ZfXevVlV6UmGWcF:KSWKRVm[O[2SsPWWKSUGDWlWPTVq6b4CQfVGoTVOC[1mERV6EbVGoTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mJNF6EbVGoTVOC[1mERXeKR1GoR2GsTlOSNFuKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeKR1J6TVeXd3NzWXeme{CMTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOCTlqJXnikbl21VH6LbHGZUnyVcUlxZWePcFuFSYeOR4eoTlibbHOrUYSRcEmnT1OlSmWtTmCWcEmUVmWl[mFxbF[SNISnVnuHTmSEZ4CMWIOPR3mC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[3[SNFuKR1GoTVOC[1mERXeKR1GLR2GsUlOqRXeKR1GoTVOC[1mERXeEVXx6TVeXd3NzWXeiW2mwTVOTNmmZTYqNWEWnZ32XcmOYOX2jfUBsXUJ6b2qURUmRV1F2UVOCdFmJd16EbVGoTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTlibbHOrUYSRclqpZWiPcGSuPUCiW16tT1SGe12Ee3eLTGqpZ3qOeGCtPX[MR3SHWXyLVGWtPVWVNXSQWFV6RmKHPVqTSkmQWEGT[mKsPW[Vb2GvT2OsO1SSc3eKR1GoTVOC[1mERXeKR1GoTVOC[3[URnyjTF6tTVi{UlOqRXeKR1GoTVOC[1mERXeKR1GoTVOCTlqJXnikbl21VHx6fWqY[FqjcWq3UGR2bnJzVnyKSEB6TVNxfF:4NFuKR1GoTVOC[1mERXeKR1GoTVOC[1mCb3ulcV[6UYlxL3OuSoCkNm[QZkOTdGlzWX:OWFG4UFOCb3SuSomOfUBsXEF5c1pxWmOWb{mUXEGLSmJyPVSUSW[FV{F6S2GWcF2LfXuxU4dxT1mERXeKR1GoTVOC[1mERVqEXECPR3mC[1mERXeKR1GoTVOC[1OSb16EbVGoTVOC[1mERXeKR1GoR2hx[2qYfIqbV1J4SGGw[1mERXeKR1GoTVOC[1mCb1qLTGqpZ3qOeGCvTniiXF6tWH16NHGYUnyMSFW4UVO4[1qJXnikbl21VHx6[luE[F[WcFqRWXx6V2KW[H[SNHiHVUC1[mKsSlqVR3OxT2S{UlOqRXeKR1GoTVOC[1mERXeEXECPR3mC[1mERVqEVU1:Jku{PkF3PjKWS{m7[F[LcHOZWnykN2F:Jku{PkV{OkB7JlSSc3eKR1GoTVOC[1mIcH2MR1KxZ{F6bHOvTnimV3es[H2HfV6Eb3eLbWmoXUJ6NXKvVX:LTGqpZ3qSdFmFOHeOR1GxTVi{UlOqRXeKR1GoTVOC[1mERXeKR{i3TVebenOuNXilR1G1UGR1[3SIWoqlSFV6XWObNGqZUkCObkGqTVeXNGm6OF6EbVGoTVOC[1mERXeKR1GoTVOTNmmZTYeKSECoXWiLfWmZb3:MWIOPR3mC[1mERXeKR1GoTVOC[1mJ[H:iW4itT1ODd3GZUkCMR2K2UFOCb3Sqb3eRV1KtXWePc1uEVkK[XFlxT2OCdFmJd16EbVGoTVOC[1mERXeKR1GoTVOC[1mERXulcV[6UV[1[FmFNHeKbWK2VGOTNlmrd16EbVGoTVOC[1mERXeKR1GoTVhx[1mERXeFVX:oTVOC[1mERXeKR1GoTVOCb3SuSomOR1F6TVeteHOIfI[bS2WwTom[clyERXulcV[6UVOsO1SSc3eKR1GoTVOC[1mERXeKR1GsXUJ6eXSIWoWlSmJ2Z1eW[2CURXmSNkm2[FeXeXSENUCmXFKtU3mDbHOJRoOiW16p[FetenKqPUSNXHR{[IlycXJ{ToSNXG[6ZleXeWlzPXubW2KkZ3y5eVmrd16EbVGoTVOC[1mERXenVUCMTVOC[1mERXeKR1KtZliPcFmJd16EbVGoTVOC[1mERXeKR1GoTVOTNmmZTYeKSECoTlibbHOrVUeFVX:oTVOC[1mERXeKR1GoTVOCb2lzPYWlS2[2[F[TOXOIWXeRV1GqVUJ6eXSIWoWlR{Fx[WiDcF:qRkCbXHhxUEOpeHKHfImZS{SqU4dxT1mERXeKR1GoTVODPVSSc3eKR1GoTVOC[1mCNFuKR1GoTVOC[1mERoCbbXeoZWiP[nKvWoOjR3es[H2HfV26b3eMV1J4SGGw[1mERXeKR1GoTVGsb3SuSomOfVF6TVVybGpzWU[QcXSt[F[PNHJ{TnySNkm2Xn2tcluETkObW1m3[Gd2fmqYUkGkcWW3XX2HfmqXPUGkcYeqT2S{UlOqRXeKR1GoTVOC[1mERXeKR2JzXWiKflmFNHekN2K6XEOLcHOIfHi[NmWwTol6dHKuVnymR{W4ZViCemmYVoSiW{SvUFOCclq6e3eLTGqpZ3qOdF:4NFuKR1GoTVOC[1mERXeKR1GoTlibbHOrUXeRV1K7[FiL[nOuWoejS1[rXmOoclxzcIWbS2Z1UH6Dc3OEPH6NR1GvTom4[1qJXnikbl2xU4dxT1mERXeKR1GoTVODPVSSc3eKR1GoTVFxT1mERXeKR1GoTVOCely6Roe[XFq7XmODNHGIWXebNnxzXmd1[2[XTl2FVX:oTVOC[1mERXeKR2JzXWiKfVmFNHekS1[6Z{KX[nSZToOMR2JzXWiKfVuVd16EbVGoTVOC[1mERXeiW2mwTVOHdHN{UnylR3es[H2HfV2td36kNl6wXmdycFpyNICKTIh5TVOob3SuSomOcIOvZ{KPc2qYNXyLNUCoTWRx[1pzbEClTFGvT2OCdFmJd3eFVX:oTVOC[1mERXeKR1GoTVODfWqZVkGkcUSoXn2Hd3NzWUeFVX:oTVOC[1mERXeKTECPR3mC[1mERXeFVX:oTVOC[1mERXeKR{i3TVeXOHSJTni[N2GoZVd6fnSERnijcWGoZ1eHNHGFc16EbVGoTVOC[1mERXeLS3i3Z{OS[2CURXulcV[6UXy{cnGIPYqlR3SlU4dxT1mERXeKR1GoTVOCb3OISkCiR1F6TVetfnNzWkCMR2JzXWiKfWe6[Ie[XGKwTkFxdFmFPHeLTGqpZ3qLZlp{RnilS3evXGOCOlmEZ4[LfoOPR3mC[1mERXeFVX:oTVOC[1mERXeKR{i3TVd6e2qYOHe[V1K7ZkKPdmqZVXe[Nkm2Zn2XbnSIcI[jbVK3ZnmDe3J{TkCKSHe4SGGw[1mERXeKR1GoTVOTcHOvToWjfVF6TVd2NXKIe{eFVX:oTVOC[1mERXeKR2KtZ36LfnSJTXeRV1K2[Ge5d1:4NFuKR1GoTVOC[1mERXubclGoVGODRWqvUo[[NoS3Z1eXeVuEVn:jN15xUFOCOF2Ee3eLS2[6Z312elyERXubXFq6Z{OTfVyERUGMWIOPR3mC[1mERXeKR1GoZWe[c1mEVn2kR1F6VGRx[2quSoOkNmWoT2ODO1SSc3eKR1GoTVOC[1mERXeKR1K6XmiTNXOuOHebcV[{Z{KWO1SSc3eKR1GoTVOC[1mJNF6EbVGoTVOC[1mERXeFVX:oTVOC[1mERXeKS3yuTVOobHGZUn[jcm[{ZlOob3SuSomPbXuxTVi{UlOqRXeKR1GoTVOC[1mERXeKR2JzXWiKNlmFNHeKcG[7XmiKeGGY[HyjcmF3TVOKeVqJXnikbmm2TXy5fWiIOHmQe{CMTVOC[1mERXeKR1J6SGGw[1mERXeKRUCMTVOC[1mERXeKR1G3UImDfmqYOXuKTGKwXmODfWqZSkGbXF5xSGGw[1mERXeKR1GoTVetcVmE[3ulcV[6UmOCPWCURX6kS{m7[FOkdFmJd16EbVGoTVOC[1mERXeKR1GoTVebe3SZVoqMR2KuZ1O4[1mtRmCWNWGoTliDbHSI[3eUSmKWWVN5fFyrSnOkcIi2TXmsO1SSc3eKR1GoTVOC[1mERXeKR1KxXnmCc1mYcIqZNkVyZle4c1qJXnikbmmxT2ODO1SSc3eKR1GoTVOC[1mERXeKR1GoTVOC[2qvRkGlTF2wTlebe1yERXulcV[6UnmsO1SSc3eKR1GoTVOC[1mERXeKR1J6SGGw[1mERXeKR1GoTVOC[1mERn2kTGZxZ4mob2qvRYOKR1qKZkOPNF:qRXuiS{m7[F[5fWiIOHmMWIOPR3mC[1mERXeKR1GoTVOC[1mIXoelXGK7T1OTcXOEe3eKcFqtXn2XfWqZTU[KR2JzXWiKfmiJTnOjbVmxU4dxT1mERXeKR1GoTVOC[1mERXebclJy[FiOc1qIXoeNR1GsXUJ6eXSIWoWlSmJ2Z1eWdF:4NFuKR1GoTVOC[1mERXeKR1GoXn6DNXSJUX:LS2q4UFOCbWFzPYWlS2[2[FNyd2qYOX6lS3d3TVOKeVmJUkCkcYitZnmob3SuSomOR3uoUHmLZ3OtfIWKbXt4SGGw[1mERXeKR1GoTVOC[1mERn2kTGZxZ4mob2qvRYOKR1qFZkJ2eWqYUkCiW{m2U3mDbnKIPYqbWoi6XFd2Z3OtfIWKbXt4SGGw[1mERXeKR1GoTVOC[1mERn2kTGZxZ4mob2qvRYOKR2JzXWiKe1uVd16EbVGoTVOC[1mERXenVUCMTVOC[1mERXeKR1KtZliPcHGYXXeMR2JzXWiKNVmFNEmKR3SvXmiScluURkeFVX:oTVOC[1mERXeKR1GoTVOCb3OZWnykcnuoVGOCclq7d16EbVGoTVOC[1mERXeKR1GoTVetcVmEbICkN16t[FOob3SuSomOcIOvZ2iXcHOvb36ZV3uxTVi{UlOqRXeKR1GoTVOC[1mERXeKR1GoTVOCb3OZWnykcnuoVGOCcmC6Z4WLTGqpZ3qLZlp{SkGbXFp2TkFxO1SSc3eKR1GoTVOC[1mERXeKR1J6SGGw[1mERXeKR1GoTVOC[1mERn2kTGZxZ4mob2qvRYOKR1qJVm[S[3W6Voe[XGKw[mi{b3OZWnykcnx6TVWpWW[HRY[OV{S5XFiLZ3KqTYCQe{CMTVOC[1mERXeKR1GoTVOC[3GYXXeMR1[xZ{F6eXSYfIOMR2JzXWiKNluUb3eme{CMTVOC[1mERXeKR1GoTVOC[1mERXeKS2q4[GiTfluEVn2kR4eoTlibbHOrXYCQe{CMTVOC[1mERXeKR1GoTVOC[3[SNFuKR1GoTVOC[1mERXeKR1GoXn6DNXSJUX:LS2q4UFOCbWOIPYqlSH:oTlepenN{VnOkcIi2TXmsO1SSc3eKR1GoTVOC[1mERXeKR1KuZ1iXNHO6[3ubclG{TVOLSHJzOYWbW15xZWd6eV:qRnqjS{m7Xm[5fWiIOXOkcIi2TXmsO1SSc3eKR1GoTVOC[1mJNF6EbVGoTVOC[1SSc3eKR1GoTVOC[1mEVombXF5yZliS[2CURX6LfoOoSGGw[1mERXeKR1GoTVilc3GYfHyMR1[uXmd6cVuEVn2kR3uxTVi{UlOqRXeKR1GoTVOC[1mERXeKR{i3TViLcGlzWoClcWWo[FepcFmJTnykN2[{[FiO[3JzXXelS3itTViLcHOZWnykN2GPR3mC[1mERXeKR1GoTVOC[1mEVombXF5yZliS[1yrNHebcXSt[FiOc1qIXoeNR1G5UXqodF:4NFuKR1GoTVOC[1mERkmFVX:oTVOC[1mCNFuKR1GoTVOC[1mERY[NfVKrZld6fmqURkCiS2WoZ{J6bnFzWkCKS163Zn12cGl{VoCjNkR3SGGw[1mERXeKR1GoTVebbnKIPYqbV3esXn6CdF:4NFuKR1GoTVOCUlOqRXeKR1GoTVOC[1y6PHekN1K{ZWiS[3SIbHyKTFqtZ{OXd3SERn:bW1[sXmiK[2qvTo[jV1JxZVeW[2lzPYWlS2[2[FFxT1mERXeKR1GoTVOCb3OuWoqlW4hxTVRx[2qZbIejS{msXmOobWiJTnOjcIi6XFd1bVyERXukcW[7[Ge5NFyERYmMWIOPR3mC[1mERXeFVX:oTVOC[1mERXeKR2KwXmeHb2qZTXeRV1KxZ{OPcHSE[3ukcW[7[Ge5NGe7RnSMV1FwTVOTfWqZUkGjTGKjUVZx[1:qRX6LfoOPR3mC[1mERXeKR1GoTlePenKvVnyjcmGoVGODdHN{UnylR3esZ32XfnSYfECYfl[lT2OCM1mEVombXF5yZliTZl2XNHeQbVGvToq{UlOqRXeKR1GoTVOC[1SSc3eKR1GoTVOC[1mEVkK[XFm5TVRx[3KuWkOKTF5xXlWPd2mZUoqMR3t4SGGw[1mERXeKR1GoTVOTNmmZTYiNWEWwXmeHb2qZTXeRV1GsZVeXbGqIWomQe{CMTVOC[1mERXeKR1Gs[H2HfV2UNDu[Nkm2[FeXeXSERUmKR2KrZkJ2NGqYOUCQe{CMTVOC[1mERXeKR1GPR3mC[1mERXeKR1GoUIl5[2OISoWbS4itTVePc3SYOYKbW2Go[FiLbHKvUn2bXFmoZWe[[3KuWnybS2[sSGGw[1mERXeKR1GoTVetcVuERoqlTFq4ZkOOc3N{VomlS{m{ZkOlcHOq[3ulcV[6UWNxL3GIWnibS2[6T2O4[1p{Vom[W{W7Xn2XfVyYWoW[NkmsZWd2cl:qRnqiTG[2ZUKXb1q6b3eKWEB6TVebbHKJUnyKR3uo[YdxT1mERXeKR1GoTVOC[1mERXeLTFKpZ36PcGqERUmKR3OvU4dxT1mERXeKR1GoTVOC[1mERXeLS4itXn6S[2CURXulcV[6UWNxL2lzPYWlS2[2[FS{UlOqRXeKR1GoTVOC[1mERXeKRUCMTVOC[1mERXeKR1GoTVOC[3RzbICjS2WwTViTfXSYWXeMV1J4SGGw[1mERXeKR1GoTVOC[1mERXeKR1GoTliDenO6RUmKTF5xZ36DenO6[3ujS2[u[FO4[1mtfImZS{SqT2S{UlOqRXeKR1GoTVOC[1mERXeKR1GoTVODdGqq[3eLTFK3Z4mCPWCVNHebcV[{Z{KW[1uURkeFVX:oTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTViLcHSJWomjbVGs[H2HfV2Vd16EbVGoTVOC[1mERXeKR1GoTVOC[1mERkmFVX:oTVOC[1mERXeKR1GoTVOC[1mERXeFVX:oTVOC[1mERXeKR1GoTVOC[1mERXeLS16w[Gd2dnNzcE[bV1F6TViPNWmvUkCkbXesZleXcXSEe3eOR4eoTliDenO6b{eFVX:oTVOC[1mERXeKR1GoTVOC[1mERXeLTFK3Z4mCdmCURoqlTFq{Xmd1c1mtfImZS{SqT2S{UlOqRXeKR1GoTVOC[1mERXeKR1GoTVOCb3KIWn2lR1F6TViPNWmvUkCkbXesZleXcXSEe3eLTFK3Z4msO1SSc3eKR1GoTVOC[1mERXeKR1GoTVOC[1SSc3eKR1GoTVOC[1mERXeKR1GoTVOC[1qJRo[kfVF6TViPNHOvRo[kfXesXUKpNXKueIqiXICtUFOCcl:6Z4CQe{CMTVOC[1mERXeKR1GoTVOC[1mERXeKS3yuT1OCb3OIPYqKR1V6VGODcWmYfIqbV1GxTVi{UlOqRXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeLS16w[Gd2dnNzcE[bV1F6TViPNWmvUkCkbXesXUKpNXKueIqiXICtUFOCe1yERXukS{m7T2S{UlOqRXeKR1GoTVOC[1mERXeKR1GoTVODPVSSc3eKR1GoTVOC[1mERXeKR1GoTVOC[1qIUn:lW{WzZ{KtOmqURUmKS3it[VeTcGm6[3u[NnhyZn21fnGZdHyMWIOPR3mC[1mERXeKR1GoTVOC[1mERXeKR1GPR3mC[1mERXeKR1GoTVOC[1mERXeKR1KxXnmo[1qIUn:lW{WzZ{KtOmqURUmRV1G4TVOs[3W4NFuKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeKR1KqZ32XbHG7d16EbVGoTVOC[1mERXeKR1GoTVOC[1mERkmFVX:oTVOC[1mERXeKR1GoTVOC[1mERXeFVX:oTVOC[1mERXeKR1GoTVOC[1mERXeLTFKpZ36PcGqERYWRV1K7[GeLfnSJTX:LS4itXn6Sd1mFRYOKR2KrZViXeXF{UoCmcWWxU4dxT1mERXeKR1GoTVOC[1mERXeKR1GoTVOTd2qYXkCKSECoZ{OXbXN{VomMR2K{XmebNFyERXu[NnhyZn21fnGZdHyKR4OoZ{OTfXKIWoWMR1qkZ3y5eVmqb4CQe{CMTVOC[1mERXeKR1GoTVOC[3[SNFuKR1GoTVOC[1mERXeKR1GoSGGw[1mERXeKR1GoTVOC[1mERXulcV[6UWNxL2lzPYWlS2[2[FOCPVmEVoe[XFq7XmeSO1SSc3eKR1GoTVOC[1mJNF6EbVGoTVOC[1mERXeKRU1:Jku{PkF3PjK[W2K1ZWd2UXJz[ICj[{1:Jku{PkFxOER7JlOob1qiW2moT1OHUmmY[HyQboCwXme5e2qZTX:LNkFx[GiLbXK6PYCjcWq3TomseGCu[HylSlqtXkB2bHKYWX:MWEB6TkK1fXSIfIK[W4S6UlOkdFmJd1uEVXuLZWe[[1uGNXibNmV3U32lcHSHUkCjN1qtVUJ6eWqucH6MR3S1[FiXfWmuPI[bcXy6Z{OTbnJzOX2iW3OvT2RxPV2Eb3eme3:LR2GsTlOob1qEVXus[FiXfWmuPYe[XGKwTVRx[2SYSn6bWH93XkKXNGV{Vo[kcW[FZkJ2cXGYZ3:LNkFx[GiLbXK6PUClXFqqZkODbHSI[36MWIOMR2GsTlOUVomjNklxTVRx[2SYSn6bWH93XkKXNGGuSoqbWWKxZ3modFysVmSNbWJx[GiLbXJ{RnilS3d4R3esTlOSb3ulcV[6UVNxL2hzVnyjSmK6XmeWc1qJTo[jN2G{TVOTfXJzPUCMWIOMR2GsTlOSc1qEVXuLTld2enSIcH2iW16p[FetenKqRUmKSUGpXkKWOl:u[HylSUG3XleXd1uE[HibS{GxZnt2enSIcH2iW16p[FetenKqPYCjcVq3[VOkdF:4c1qEVXuLTld2enSIXXeRV1KpZ36LbHWU[3eE[3uLR2GsTlpzcIqZN1qtXWeScmCVOIeNR1GMR2GsTlOSb36bS1ZxXmZ6bGqIVnybR3N6VH2TbHSIWX:LNXu1ZmNyb1mG[{[iWIC7Tomsd1mCc1qEVXuLR2OlfmqZXnykcXxx[WOkPWCrVYOKRX:LR2GsTlOU[EGkcYevVGR1cnGJVkCkSH:3UEOlN3S6OXikcmKxZol2eWqZVY[jW1[vXmd2NHK6NXymTGKtZn6PdHJzOYqNNkC1[FiXfWmuPIS[W16rXme5cHOuSkCjN1m3Tom4T1OSb1qEVXuv[FetNHKIWX6RWESoWGeHcmqVc{[iS2[{Z1eXfVuE[ISlTG[6XX15cluUNDuZNUiwTkBybGpzWoWlS{ioWG[TNXOuTo[KSny3[GiK[3KIcHqbW{W7XmODc2mZUXebXHi4ZWiLcGqEZ4CNRX:LR2GsTlOU[HubXF6rZ32te3SIcI[jbXN6VHmDUmmY[HyQboCwXme5e2qZTX:LNkFx[GiLbXK6Z4CNWEWnXImocmSYSn6bW{VxZomDUm[JWom[cUioW2d6NXOqRoOiW16tZn2PcFmIbHikfVKt[ViDdHOuWnuNbVKDZle4[2lzSnqiS2[sTViDbGpzWoqKTHSpZ4mDfWqYNY[lcW[sTomsT1OSb1qEV3t4R3esTlOSb3ujcUlxZWebdGlzSkCiW{m2UGR2e2mZToqbV3ipZ36LbHWU[3ujcUlxXnmsdF:4c1qEVXuLR3esTlOZNFuEVXx6R3esTjJ8d{pzOEpjXWebNGqZTmS[XGqtWViLemqJWnqlRU1:Jku{PkF4NkpjR3mC[1mERVqiW2moT1VybGpzWU[QcXitZliDcHOq[36jXGJyZ32LelxzcIWbcUivT2NxL2pzWkCWcW[vWH2HeGqU[4CMV1J4R3esTlOWNXibNmV3U32lcHSGNY[bS2[{T1OleHSJWom[cUi3ZkKLfmqZTkKbXFm6TomseGCuSn2lS2[6WUKHNmqXRomjNmJyXUOSc1qJXnikblGxU4ewTlOZNFuKR1GoTVGsQTJ8d{pzOEpjXX2XcXJ{TnyWNlZzXmWPbHSIWn6jN1p2Jku{PkF4OkpjR3mC[1mERVqiW2moT1VybGpzWU[QcXitZliDcHOq[36jXGJyZ32LelxzcIWbcUivT2NxL2pzWkCWcW[vWH2HeGqU[4CMV1J4R3esTlOWNXibNmV3U32lcHSGNY[bS2[{T1OleHSJWom[cUi3ZkKLfmqZTkKbXFm6TomseGCuTnybcUm6Xm[PbHSuWlS[XGKtXkJ6fXWU[3ulcV[6UVOsO1Oob1qnVX:oTVOC[1OSQU1jP4N7NkR7JmmYXkCbXFqVXWibcGFzSkCbW3S3Z36sQTJ8d{pyO{J7JlOqRXeKR1GLZWe[[1uGNXibNmV3U32pcHKJRnykbXevZmiTNXOuTo[NNny2Xn15cluUNDubNmZxWX2XcmSuSoSbV3exT2ODO1Oob1qEWUGpXkKWOl:u[HylSUG3XleXd1uE[ISlTG[6XX15enJzToqbXFpzXmiKfVq6b4SRcV[u[FeXfWVzSkKbWV6p[FeXcnJ{TkWMR2JzXWiKe1uVd1uEVXx6R3mC[1mERVpjP4N7NkR7JmmYXkCbXFqVXWibcGFzPYSjW3xxWmiLdzJ8d{pyO{Z7JlOqRXeKR1GLZWe[[1uGNXibNmV3U32pcHKJRnykbXevZmiTNXOuTo[NNny2Xn15cluUNDubNmZxWX2XcmSuSoSbV3exT2ODO1Oob1qEWUGpXkKWOl:u[HylSUG3XleXd1uE[ISlTG[6XX15enJzToqbXFpzXmiKfVq6b4SRcV[u[FeXfWVzSkKbWV63ZmdydHSHWomjR3es[H2HfV2Eb{eE[3uL[mGw[1mERXeEVU1:Jku{PkJ1PjK[XGZxZkJybHSIcHqTS{l{Zn25emmYVU1jP4N7NUZ5PjKEbVGoTVOCTnGYXXeMSUGpXkKWOl:ubHyjTFKtZ3mocnKZVkGkcVq3UEKteWquPH6MV{BsXkKXNGWuWn6VcV[1XmOodFuURkeE[3uLR2VybGpzWU[QcXSt[FVyemqIWoOMR3S1[FiXfWmuPI[jNlq7XmiLNmqZTYmLfXu1VH2HNXSIPYS[XGKxXUCTenRzOYOjNl[sT1OsO1Oob1qnVX:oTVOC[1OSQU1jP4N7NkR7JmqIPUOjcYi3XWeTRnKuVlqjcl5xXWe5dzJ8d{p2O{Z7JlSSc3eKR1GoTVOC[1mEVkK[XFm4W4mlNXNzWomjcV[1XmOl[FmFNHeLfXN4SGGw[1mERXeKR1GoTVOTNmmZTYeYfXS4XWiPfnRzPYmbR3SlTVRx[1q6Z{eFVX:oTVOC[1mERXeKR2JzXWiKe2e6[HujN3S2Zld6bGqHPYCbR3SlTVRx[1qJXnikbll4SGGw[1mERXeKR1GoTVOTNmmZTYeYfXSuZWe5cFpyNHeRV1GvZmiTNXOuTo[LfoOPR3mC[1mERXeKR1GoTlibbHOrRnKLNl6p[FOl[FmFNHeLNkFx[GiLbXK6Z{eFVX:oTVOC[1mERXeKR2JzXWiKe2e6[IekcUmsTkFx[2CURX6jW1[vXmd2NHK6Z{eFVX:oTVOC[1mERXeKRUCMTVOC[1mERXeKR1Gs[GiLdFmFNHekS1[6Z{KX[nSZToOMSUGpXkKWOl:u[HylSVqpZ{KXWnOue3:MV3t4SGGw[1mERXeKR1GoTVOTNXOue3eRV1Gs[GiLdGe6[H:jN15xTkFxeVqJWomiWoOvZ1eHNHGE[HSQe{CMTVOC[1mERXeKR1Gs[GiLd1mFNHelTFqxZmOob3SZToONR1GvUImkdF:4NFuKR1GoTVOC[1mERXulcV[6UV[{cnNzcECbV3SlTVRx[1qJWomjSIOPR3mC[1mERXeKR1GoTlibbHOrRnKLNny4TkFx[2CURXuZNV6HWXybSmWtd36WNG[UWnuXV2hxSlWTSlmvXGS{UlOqRXeKR1GoTVOC[zJ8d{pyOkpjXld6N3KufI[[W2KSXWelcDJ8d{p2OUZxPjKEVUCMTVOC[1mCcICbbVGwWGeHcmqVc{[iS2[{Z1eXfVuE[ISlTG[6XX15enGYOX2jfXOxUGR2cmqZVmObW3SQXWdycFuEb{mRV3SzZ36Td3FzSoKkbmGvT2ODO1SSc3eKR1GoR2FxT1mERXeKRXuLTlibbHOrUXeRV1GvToq{UlOqRXeKR1GLR2OTc3SINYOKSECoTomkO1SSc3eKR1GoR2GsUlOqRXeKR1GLR2etcVmE[3ulcV[6UlRxPVq6Z4CFVX:oTVOC[1OSb1qLTGqpZ3qS[2CURlKkcmKxZkF6Um[JWom[cUmnV1eXd3OIWomZNGKp[FeGOl:u[HylSV63Zn2bdGq6[4CNWEWvXmiTSXJ{[IWjS{mpXlVycHSIbI[bR3exU4dxT1SSc3eKR1GoR2GtdGqqRX:LTGqpZ3qKdFmCNFuKR1GoTVGsTnW4NFuKR1GoTVGsTlOUVoe[XGKwTVRx[1qJXnikblG1VH2PfWqYSkCbWlKp[Feoc1uVd16EbVGoTVOCTlOSb3ulXFq{TVRx[1qJXnikblG1VH2lcHSGVo[lNkW{ZkKHb2[ZToOXNnxxZVV2emFzSnqiS2WwT2S{UlOqRXeKR1GLR2hxUlOqRXeKR1GLR2eXd3NzWXeFVX:oTVOC[1OScEeFVX:oTVOC[1OSb1qLTG[6ZlOCPVmGNXibNmV3U32lcHSHWomjR3exU4dxT1OSb1qEV2JyZ324[2CURoqlTFqnZ32Xe3KISnqbV3eqXWeTeHGYOI[KbYeoTXmKd1mEVkGkcYexU4dxT1mERXeKRXuL[mFxT1mERXeKRXuLSGGw[1mERXeEVXxxZ36s[1SSc3eKR1GoR2GtO1SSc1qKR1GoTVGsTnN{[IClS16wTVOob3SuSomPR3uPR3es[1mERXeEVXx4SGGwTlmERXeKRXuLR2FxT1OURXeKR1GLR2Gsely6RmSlS1[2XleHfWqERn2iW4itTVelcHSERnqjNkVxXmd2NHO4NFuEV1GoTVOCTlOScHq[XF6tTVWTenRzOYOjNl[sWGeXNHGIPXukfn93VnutUWKXPViTWmKnVUB6U2[GWl:XSl13SGGwTlmERXeKRXuLR2GtdGqqRX:iW{WxXEKlcHSE[36[W4i{ZkOl[nSZToOZNmq3Z1eXeVq6b3eRWECoToqGcluSNFuEV1GoTVOCTlOSb1qEV2Kw[Fdyd1mFNHebcXy{XmZ6cmqZVn[[Nkm2[FeXeXSJUX:LTG[6ZlOsO1SSc1qKR1GoTVGsTlOScHyjTF6tTVFxT1OURXeKR1GLR2GsTlOUVkK[XFm7TVRx[1mGNXibNmV3U32pcHKJRnykbXevZmiTNXOuTo[LfXu1VHx6[luETmSbXGJxZWd2clmE[HijS4i3[EF6NXOufH[bcUm4Xmd1clmIcIqKS2KxZ{KHbXKIWnuNbVmxU4dxT1OURXeKR1GLR2GtbXOuWniifoOPR3es[1mERXeEVXuLSGGwTlmERXeKRXuLR2N5elmGVo[lNkW{ZkKHb1mIPUKbXFmoZ{J6bnFzWkCFVX:LTVOC[1mCb1qEW16pZ{KW[2KIPUOjcYi3XWeTUmqZVn:jNmK7U3qxWGRxUlyTWmF3R2GsTlSSc1qKR1GoTVGsTlOSb3ukcW[7[Ge5NGSvWoS[cW[6VGSCO1SSc1qKR1GoTVGsTlOSb3ulcV[6UYpxclq7d16E[{CMR2OC[1mERVqEVXuLTliLcHOZWnykN2GoVGODe3OuWn6ZN1qtZ1e5bGlzWX:LfUmw[FiTe1uJUYCmflG{UWhxOmiEPXONNYSmXFN6[FuqPH6NR1GvTom4[1qJWomjR3t4SGGwTlOSb1qEVXuPR3esTlOSb1qEV2K1XWiTbnGIWoqKSECoXWiLfWmZb3:MWIOPR3esTlOSb1qEXFK6Xmel[nKYSkC[NnewTkCD[VuFPE[iTGJxZ1Swely6bz:MSoSmUEFxdluWRoCLfYeoTliXfXKEe3eLS{Gp[FePc2qZUYCQe{CMR2GsTlOSb1qLS3i3Z{OS[2CURXujW1ZxXUKpcHNyd4iZWIOPR3esUlOob3eKR1GoR2GsTlOUVn2kR1F6TVebfnJzUoKjN1KtZnmob3GIPYqlR4eoU1SCd1mEVombXF5yZliTU3SYNXmbXFm{TVOTcHOvTo[kb{GtZ{OPbGpzWYCQe{CMR2OC[1mERVqEVXuLZWe[[1uESXubclGxSGGwTlmERXeKRXuLR2GtO1SSc1qKR1GoTVGsTlOSb1qLTGqpZ3qO[2CURXubXFq6ZkOLUmqZUoq[W3StU4dxT1OURXeKR1GLR2GsTn[SNFuEV1GoTVOCTlOSb1qbW4i7XmFxT1OURXeKR1GLR2GsTnW4NFuEV1GoTVOCTlOSb1qEV2K3[GiS[1mFNHeKb3SHWlOCb3OuWoilW2[7[FODTW[HVmGNflW2UW[5fWiIOHmQe{CMR2OC[1mERVqEVXuLR2OTenSZVXeNbkCoTXupenN{VU[KR2KwZkOPNGiJTnOjbVl4SGGwTlmERXeEV1GLR2GsTlOUVo[lXGGoUHpx[1msUo[jcUWtXUOTdHJzOE[KSV6{ZkOPcGiJTnOjbVl4SGGwTlmERXeEV1GLR2GsTlOUVo[lXGGoUHpx[1mtfImZS{SqU4dxT1OURXeKRXuoR2GsTlOScH2lN1qx[FeWc1qIXoeNR1GsZkOXNFuVd16E[3uoTVOCTlmCb1qEVXuLTlepcGmYVnykbVF6TVOLeXJ{VXemW2ZxTXq{UlOob3eKR1GoR2GsTlOScEOiS3y{XmOCc1mYXnyjNmmwTlebe1uUb16E[3uoTVOC[1OSb1qEVXx4SGGw[1mERXeKR1GoTVOC[1mERVqEVXuLR2OTd3GYOXyRW2qvXmiTfluEVn2kR4e5UXqodF:4NFuKR1GoTVOC[1mERXeKR1GoR2GsTlOScICbbVGwTle5dHKuWUmRV1qkZ3y5eVmqRX2LbVGsZVeXbGqIWomRWECqZn16NFmJcHylR1mxTVi{UlOqRXeKR1GoTVOC[1mERXeKR1GoTVOCTlOSb1qEV2KwXmeHb2qZTXeRV1GqZ1eHfnNzWnuKboOPR3mC[1mERXeKR1GoTVOC[1mCb1qEVXuL[mFxT1mERXeKR1GoTVOC[1mERXeEVXuLR2GtdGqqRX:LS3itXWeTcHOrNEmKclKpZ{OPcGqETYCKTIOPR3mC[1mERXeKR1GoTVOC[1mERXeKR1GLR2GsTlOUVn:lS{G{UHpxb3KIcIWbWIOPR3mC[1mERXeKR1GoTVOC[1mCb1qEVXuL[mFxT1OURXeKR1GLR2GsTlOZNF6E[3uoTVOC[1OSb1qEVXyuXUK5enNzWX:LS2q4T2S{UlOob3eKR1GoR2GsTlSSc1qKR1GoTVGsTlOSb1qLS2qxZ36PNFmFNHekN2K6Z1d6fluEVn:lS{G{UFOCcmCESlWVNF6WW2[DSlq6b{eFVX:LTVOC[1mCb1qEVXuLTle5bHN{VXeKSECoZ{OTfXOIPYqMR1GsZViTeHKEe3eLfoe3ZViTeHKFOH6MV4N{U4dxT1OURXeKR1GLR2GsTlOUVn:lS{G{TVRx[3N{WnmkN2K6T1OTc3SINYONR1GsXn2tfXN{VYOKR2K{XWiPNFyUVn2iXFq7[FOsO1SSc1qKR1GoTVGsTlOSb1qEV1GoTVOCTlOSb16E[3uoTVOC[1OSb1qEXECPR3es[1mERXeEVXuLXX6LcGmYd{eFVX:LTVOC[1mCb1qEVUCMR2OC[1mERVqEVXu3UImDSXJ{[IWjS{mpXlODN3GZVn:KSlKKWVODSnWJVnyjcl6xZkJ1[2FyWmOVRUCMR2OC[1mERVqEVXyrXWiPcFmGVo[lNkW{ZkKHb2SYWkCiS{msZ4qwOmFyWmOVSH:PR3es[1mERXeEVXuLR2FxT1OURXeKR1GLR2GsTnGYXXeMS2pyZn2PNHGYPYWZNmZ1ZWiPNHO6[36[N2[6ZlZ6dHKucECLfXuxSGGwTlmERXeKRXuLR2GtO1SSc1qEVXuLR2GsTlqIUn:KSECoXUOXfXKHPYCjcXxxT1OTNXOue4CQe{CMR2GsTlOSb1qEW15yZ325[nNzWkCjN1JxT1OTbnGEe3eSNW[UWFV6VW[HPWWUWUGHWEGXWVyERYiOSFGxU4dxT1OSb1qEVXuLR2ePNXOufH[kNmZxZkODNFuEVnqiR4eoVUGXV2SGPWGXSkmIWEC5UWRy[F2VNF6DWlWtVGSqe3elTFpyXmOsO1SSc1qEVXuLR2GsTml{WomjSkm7XmiTenOJVX:LS16wUFODSG[XTl2VNVKWXEGLSm[HWmOVcGKUVWV2WGKsWmONR1JxZ36XcFuVd16E[3uLR2GsTlOSb3uiTGK1ZlOCPVmIUkGkcYinXmipcGm6[3u[NnexU4dxT1OSb1qEVXuLR2etcVmE[3uiTGK1ZlRxPWCYXnijTF6tT2FxT1OSb1qEVXuLR2Gsb3SuSomOfVF6TVePNXOufH[bXFq6ZkOKc1qIUn:MWIOPR3esTlOSb1qEVXyr[GiLd2hzUoOjN16tT1OTbnGEb{eFVX:LTVOC[1mCb1qEVXx6TVFxT1OURXeKR1GLR2GsTmqYfIqbV1GPR3es[1mERXeEVXuLR2i{UlOob3eKR1GoR2GsTlOSb3ulcV[6UYmCPVmGNXibNmV3U32pcHKJRnykbXevZmiTNXOuTo[LfXu1VHx6[luE[FSXWlqOTVetflmIOY[lR1KxZn6PNGmYfIObW2GvT2S{UlOob3eKR1GoR2GsTlOZNF6E[3uoTVOC[1OSb1qEVUCMR2OC[1mERVqEVXyqZ32XbHG7d16E[3uoTVOC[1OSb1qFVX:LTVOC[1mCb1qEV{i3TVWPfWqYSkCbV1K2Xmik[2SYSn6bW{VxZomDdHKvUkC[W{WrXmFxT1OURXeKR1GLR2GtbmmZUnyKSWK3[EJ2d3JzSnuVW2ZxZVd6b3O7c{[TSXyUVmWPWWhxSlSSNG[VWYqwUlOob3eKR1GoR2GsTlOSNFuEV1GoTVOCTlOSb1qiW2moT1WHfXSIcI[ZNEGW[GiLbXJyPVmbW4i4XmiL[mKISkC[WH93XkKXNGFzPYWbcXyvT1OseGCucIqWS1ZxXUKpcGqE[4CMVUCMR2OC[1mERVqEVXuL[YdxT1OURXeKR1GLR2GsTlOURXeKR1GLR2GsTlSSc1qKR1GoTVGsTlOSb1qLTFK6XmibWmWsb3eRV1GsXEGPSmWtXl[WcIOvWXuXVm[WWmSXSkmXWXuscmiVd16E[3uoTVOC[1OSb1qEVXusZ{OTbHSIWXeRV1KPXWelcF:rdH6bXGKV[FeHNHGYUmSlS1ZxXmOodF:4NFuEV1GoTVOCTlOSb1qEWUGpXkKWOl:vTnykNmZxT1OsO1SSc1qKR1GoTVGsTlOSb16E[3uoTVOC[1OSb1qEVXy3XXx6fnSISomlR3exU4dxT1OURXeKR1GLR2GsTlSSc1qKR1GoTVGsTlOSb1qEV2KnWUCXV2[sWmOYfXSUVm[HWmKXUmWZNW[UV2Ol[FmFNHekTFqtXkF6fWqZRoO[W16tT1OkenGJVkCkR3i7T2i{e1yFSkmQcIe3XFN6Zmite4[ZV3:3Tom4[1q6Z4OKR2JyZ324dF:4NFuEV1GoTVOCTlOSb1qEVXyPXWelcF:rdImlW{SwT2S{UlOob3eKR1GoR2GsTlOSb16E[3uoTVOC[1OSb1qEVXusZViTeHKERUmKS{mqXEKlcHSHPXqjNkVxXmd2NHO6[4CQe{CMR2OC[1mERVqEVXuLR2d6bWhzWoWbSkmrZleXbHKq[4CQe{CMR2OC[1mERVqEVXuLR2VybGpzWU[QclqtZ{OTenOuWmSlS1ZxXmOob3N{VnilS2WxU4dxT1OURXeKR1GLR2GsTlOSNFuEV1GoTVOCTlOSb1qnVUCMR2OC[1mERVqEVXuLXme5fmqURV6E[3uoTVOC[1OSb1qEXIOPR3es[1mERXeEVXuLR2Gsb3SuSomOfVF6TVVybGpzWU[QcXitZliDcHOq[36jXGJyZ32Lelq6b4SRcEmnT1OLS3GYfHyKSUGpXkKWeXOIbIeKS3y7TVd2enSERoe[XGKrZVeXb1mqb{eFVX:LTVOC[1mCb1qEVXx6SGGwTlmERXeKRXuLR2GsUlOob3eKR1GoR2GsTmmvTny[W4N4SGGwTlmERXeKRXuLR2FxT1OURXeKR1GLR2hxUlOqRXeKR1GLR2hxUlOqRXeKR1GLR2ePbHSIUn:KR3iH[VePcHOJVoCjNkSoTleWdFSSc3eKR1GoR2GtO1SSc3eKR1GoR2GsTlqJXnikbl2oVGOCb2qUNDubNmZxWGeXfnNzSn6bV3exU4dxT1mERXeKRXuLR2iLcHSJWomjboOPR3mC[1mERVqEXECMR3esTlOUPI[KS{GpUGe5dFmJUnyKTG[{ZkOxdHSERX:jcW[yXleW[3K6RkCbXF5xT2ODbFmIdHyKTFK6XWixb3Kvb3ejW1[1XmODbnGJcHmlVX:LR2GtdGqqRX:LS3hxZme4PWCUZ36KR2muTVOTNmmZTYmMVX:LR2GsTmSYSn6bWH93[FepfXJ{[F[mS16tZ1iTdHJzOH:Kb2K3[EJ2d3JzSnuKS2qpZWe4[1uETYWLTGqpZ3qOeVmqb4WKSlK{XmeHflmIUn:[W{WvXmODb3J{[IWjS{mpXlODeGqZVn:jNmGoZWd1[3J{RkCiW{m2TViTbGmqOHmMWIOPR3mC[1mERVqEVUCMTVOC[1mCb1qiW2moT1OTNmmZTYiMV1GsZViTeHKEOEmKR1l5TWNxeFmETXeNbVK2ZkOkc1uURYWKR1moUGNxL1mrd16EbVGoTVOCTlOYcH2KR3es[H2HfV2qb3ebcXy{XmZ6e3SZVn[[Nkm2[FeXeXSJUX:LTFKp[Feod1mEVn:lS{G{T2S{UlOoNFuKR1GoTVGsTnGYXXeMR2JzXWiKfmCVNH6LfVGuTnmDdHNyPYqlTFqxZn2kc1qIbECjW4exTVO[cVmE[3uiTGK1ZlOGPVq6Z4CMVUCMTVOC[1mCb1qEV2JzXWiKflmFNHekcUlyZn2Sc1uJUkCkcYitZnmob3GJVoSjR3uoUImCc2qufI[[XGGxUWSCfV6Eb4OKSFmxU4dxT1mERXeKRXuLXme5fmqURoCbbVGwTlibbHOrUUmRV3OvTVO[cVmEVn:lS{G{VGRxclq6b16EbVGoTVOCTlOSb3ulcV[6UYmCPVmGNXibNmV3U32pcHKJRnykbXevZmiTNXOuTo[LfXu1VHx6[luE[HyjXFJx[WODenSZVoelXGGvT2S{UlOqRXeKR1GLR2FxT1mERXeKRXx6SGGw[1mERXeEVU1:Jku{PkF3PjKiW{WsXmipRml{VoCjNkR:Jku{PkV1NEpjSGGwTlOYcH2KR3iPXWelcF:rdH:bW4i4XmiKc1pzNUClXFqqZol6dHKuXo[LfXu1VH2lcHSHTnybNEWpZmeWc1uUb3eme{CMR2GsTlqJXnikblG1VH6LcGqE[36jXGJyZ32LelxzSnujW3y2ZViTeHKHPYSlTG[6XX15enGYOXubXHevT2S{UlOob1qnV1KtZliPcFmJd16E[3uLR2FxT1OSb1qLS{G3XleXd1mFNHeVW1[vXmSwOmpzWkCVW{msXme4c1pzNUClXFqqZol6eHSJWom[cUivT2NxL2lzfHy[XFqDZle5VWmY[HykfXexU4dxT1OSb1qFVX:LR2Gsb3SuSomOR{BsXkKXNGWuWoqkS{m2Z{KWc1uUNDukNmZxV1eXbGqIWomMR3SKWl[TVVy7SYWOV3O{ToqSe126RlejN1qqZWeTb2qYOH6MWIOPR3esTlOUVkK[XFm4UGR2cmqZVmObXF64ZkJ2fmqU[4CNWEW7XmiTR3JzVkWMR1Gs[H2HfV2ENDulN1qpZ1OpUmmY[HyQboCwXme5e2qZTX:LNkFx[GiLbXK6Z4CNWEWnXImoclmH[ImjNkWvTVe5dGlzWoWkNmWo[Fite2qUe3ejS3yrXmd2fmqURnqjNmKtZ4mDbHOuWXejcUlxTVdybHSIUn:iW{WvTViTc3GZUXeiS{m7[FN1cluUb4CQe{CMR2GtPVSSc1qEVU1:Jku{PkF3PjKkN3y2XUKpfXJzOYCmcWV:Jku{PkJ2Okh7JlSSc3eKR1GoR2FxT1mERXeKRXusZ1iLcHSucHylNF[6Z32HOVmFNHeLTGqpZ3qCeGCu[HylSlK6XmibdGqZ[FS[XGKtXkJ6fXWWcHukfXexU4dxT1mERXeKRXusZ1iLcHSucHylfVF6TVeteHOIfI[bS2WwTom4clyERXukTFqt[H2tcHRxSomkcVZ2T2S{UlOqRXeKR1GLZWe[[1uEVoekcWZzZWeXN2CVNIeMV1GsZ1iLcHSucHylfVF6TVOkeF2UZ{eFVX:PR3mC[1mERVqLTFZyXmiLOWOIPYSKSECoTomkO1SSc3eKR1GoR2ebenOuWni[NneoT1OTNmmZTUCKS1[7TVOTfnSIPYmbWXysT2ODO1SSc3eKR1GoR2Gsb3OZWnykcnyKZkJx[1yrNHeKb3yQWUCXV2[ERlqVcGKRTVeDeHSJWom[cUmoTVOp[3N{Vo[kcW[nZWeT[1yERnekcW[5[GeXfnSHPYe[XGKwXVOs[2[sSl2XWW[VTVOobVyqVoqlS{m6XmWtb1yqTYOKR3O3TomsO1mETUeFVX:oTVOC[1OZNF6EbVGoTVOCTlSSc3eKR1GoR2OTfHSYWommWXi3ZmWTcGqqRUmKR1qLWHyPSmWtVXeUWUWWWImD[3KZVkGkcVq3XVOCc2mJUkCjN1qtXEKtb2mEe3e[TFqtZ2iXcHN{Vn[kS1ZxZVeCdFmHXlKVSm[HWYmCc12Ee3eLfUivT2S{[1mrd16EbVGoTVOCTlSSc3eKR1GoR2OTfHSYWommWXy2Z4mCPVmETlqVcF6HWXyS[2OWOWWVfVKoZmiTNXOuTo[[R1GwXViXfXKHPYmbXHS6ZWiTcGhzcHu[R4eoXViPNHJ{TnyZNnysXVO4[2mIUnilS2[vZkOLOWhzcHu[R4eoXViDfXJzVkG[N2KnZWeT[1yERnekcW[5[GeXfnSHPYe[XGKwXVOsUlOob1qEVXuoTVOC[1mHUl[VSW[FWlOD[3SZToOZN1qt[EOLdHSIWn[iW2KoUFOD[3N{Vo[kcW[nZWeT[1yERne[NlZxXmelenOvcH[iW2KoUFOD[3OJTo[bTG[r[FZ6dGqIRYOKS1K6XmiHNWqZUkCZN1Kp[Fep[1SSc1qEVXuLTVOC[1mERleWb{mPTVeDbnJ{TnyZN2[6ZlZ6fWqZ[ImiXGKtXVFxT1OSb1qEV1GoTVOC[2ZxbF[Wb2WoSGGwTlOSb1qKR1GoTVOC[1mE[16E[3uLR2Gs[1mERXeKR1GoTVOCc2mIUnilS2[vZkOLOWhzcHu[R1KLWHmCc1mqRYWKR2K4Z32XNnGYWkOKR1G2TVOKdFmGSl:TR1KoZ1iLemqJWnqlSkmxXleC[2OXUXeVcG[OWFOsUlOob1qEVXuoTVOC[1mERXeMV1m2SGGw[1mERXeEVXuLR2OC[1mE[3:LTGqpZ3qG[1mVNHeLfXOxTVR5[1msSl:TR1GwXViPNHJ{TnyZNnysXVODU2RyVXeUWUSoT1OK[1yqRXulcV[6UWOCeVmETYCMV1moU3mCbVmqb16E[3uLR2Gs[1mERXeKR1GoUHmLRmSsVV6EbVGoTVOC[1mCb1qEVXuoTVOCc1SSc3eKR1GoTVOCTlOSb1qKR1GoTVOCc2mJTnykXG[tZ{OT[nOISkCiS1GoWHt6WVmGcF:KR3iVVmW5SmFyVXe[TFqtZ2iXcHN{Vn[kS1ZxZVeC[2KtTmCVV1KoZmiTNXOuTo[[R3uxSGGw[1mERXeKR1GLR2GsTlmERXeMV1l4SGGw[1mERXeEVUCMTVOC[1mCb3ukXG[tZ36tSWqYe3eRV1GqVlWXUWKXVl[KSWqUWEBx[2mINUClXFqqZkKCUlOqRXeKR1GLTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoWkCpSmWsWXeKR3ioXUKHNGqY[I[kcnynZWeT[1mGOWCXR1KLWHmCc1mqOHeLTFK6XmibdGqZZ3eKR{SoTXms[2GWOVWKS1K4Z316b3SYUkCZNnysXVODTmW6Rl:XWYiOT2OKO1SSc3eKR1GoR2FxT1mERXeKRXusZ2iXcHOvcFWbW4iKZkJx[2CURXmTSW[OVm[TSlmGXmOVNECoXVdyNHSZTnmjNlGoWkCpSmWsWXe[TFqtZ2iXcHN{Vn[kS1ZxZVeCPVq6PH6QfVl4SGGwUlOqRXeKR1GLTlePenKuOXy[N2KxZkJ1[2CURl6[W3StU3qxcmqZVmSiW{WvZleXNHJzOH:LNl63Z32WenOuWoqjN2[6XUKWcluUNDubNmZxVUJ6eXKuWnqlS3y3ZnmocmlzPYmbWkl{Z32tNGqUZ4CQe{CMSGGw[1mERXeEXGK6[WODO1SSc3eKR1GoR2GsUlOqRXeKR1GLR2OTbnJzOYWbW15xZWd6eVyVOYilW2[6[WOobWVyVlKWcGGoWl[LRmStUlKSNWKLWEB1bVuVd16EbVGoTVOCTlOSNFuKR1GoTVGsTlqIcIW[NohyXleXTXJzNXykS1[vXmOCPVmEVkK[XFm4UGR2c3JzNXykS1[vXmWtfmOYOXqjTG[sXmeSc1uVd16EbVGoTVOCTlOSNFuKR1GoTVGsTnGYXXeMR2KxZn2Pd3SYVnyUS{m1XmiDbGpzWXeLbWmoTWOTNmmZTYqMV1GsXUJ6eXKuWnqlS3y3ZnlxL3OZWnykcnuwTliHNWqZTkWUS{m1T2S{UlOqRXeKR1GLR2etcVmE[3uiW{WrZliXb2qWbI[jW2[4XWelcFmEXX2KR2JzXWiKe1yVOX6bXGKP[Ge5NHGZUkCjN1qt[H2tcHS6[4CMV1GsXUJ6eXKuWnqlS3y3ZnlxL3OZWnykcnuwTliHNWqZTkWUS{m1VleXcVuVd16EbVGoTVOCTlOUVnqjNkW2XmePNHGYPYWNWEW5[GeXfXWU[3ukXG[tZ36tTnKvUYCQfVGoSGGw[1mERXeEVXuPR3mC[1mERVqEW3yuTVOobFqIcIW[NohyXleXTXJzNXykS1[vXmOCcVqqRXulcV[6UYms[1qIUo[jcUWtXUOTdHJzOISRclZyXmiLOVuEVoilW2[6[WWTcHKGbI[jV3t4SGGw[1mERXeEVXusXUJ6eXKuWnqlS3y3ZnlxL3OZWnykcnuwTliHNWqZTkWTS2[{T2S{UlOoNFuKR1GoTVGtPVmIUnilS16wTVOpSnWIUnykTGKxZkJ1[1qIWYCKTIOPR3mC[1mERVqEV2KrZkJ2eWqYUkCiW{m2UGR2fHSYWommV3eqWXt6UWSGTlKSNIOqT2S{UlOqRXeKR1GLR2iTc3OuPUOKR2KtU4dxT1mERXeKRXx6SGGw[1mERXeEVUCMTVOC[1mCb3u[Nkm2Zn2XbnSIcI[jbUBsZ2iXcHOvb3:Kb16RWGVyTm[ETYCQe{CMTVOC[1mCb16EbVGoTVOCTjJ8gR>>
|
1 |
+
ZUpyOEq8d{pzNEpjXEKPc2qYUoKVS3yrXmd2bmqSQU1jP4N7N{R5PjKFVX:LR2etcVmE[3iVW1[vXmSwOnGIWoOkS2[6T1OleHSJWom[cUi3ZWd2cXK6Z4CNWEWvXmiTV2qY[F:[W{GtT1OsPWCU[IKkcmK{ZUKHdnOrVX6MV1J4SGGwTlOSb3uiW{WuZomCPVmGNXibNmV3U32pcHKJRnykbXevZmiTNXOuTo[NNny2Xn15cluUNDubNmZxWX2XcmOYOX2jfXexU4dxT1OSb1qLTGqpZ3qCeGCu[HylSl6tZ4modFyVOXibS2KZXWiLeXGYOX6MR2KxZn2belyVOYSbXF67XWelcFuVd1qFVX:LR2Gsb3SuSomOR{BsZ32Xb1uEZ4GNfX:3ZWd2b2qZ[36MWIOPR3esTlOZTnylTG[6ZnmDcWmYfIqbWIOPR3esTlOSNFuEVXx6TVeXd3NzWXeme{CMR2GsTnOuWkClXFq2TViTfXSYWUeFVX:LR2hxUlOob1pjP4N7NUZ7JnN{cIqlS2[1VUKpcGlzd{1jP4N7N{V3PjKEbVGoTVOCTlOUVnqjN1J2Z32tcnGJVXeRV1Gs[H2HfV2ENDubNmZxVUJ6e3WZToCbNnhxT1OsO1OqRXeKR1GLR2OTNmmZTYeNWEW7XmiTSHJ{RkWkcXyvZViSc1qIUo[kTHy6ZWelc3SEOH6RS1q6TVN5L2SYSn6bW{VxZomDWXSZTnmjfVKFXWePc2qURVuKR1GoTVGsTlOWVnyjW{ioXX6s[2CISXeiTFqtXnpxbXGJVkCkSH:3UEOlN3S6OXikcmKxZol2eWqZVY[jW1[vXmd2NHK6NXymTGKtZn6PdHJzOYqNNkC1[FiXfWmuPIS[W16rXme5cHOuSkCjN1mqTViTdHSIfHyRV1qPWliXfWmuPHeSW16rXme5cHOuSkCjN1mqVHew[1mERXeEVXuLWGeHcmqYOUCjfVK7Z1eXcGqFe4[[WESo[GiC[2mvb3eSWlqWV2V5cluVd1uKR1GoTVGsTjJ8d{pzNEpjXUKpcGlzeGObXF64ZkJ2fmqSQU1jP4N7Nkh{NkpjSGGw[1mERXeKR1GoTVOC[1mCcICbbVGwTlibbHOrRYCKTIOPR3mC[1mERXeKR1GoTVOC[1OSb16EbVGoTVOC[1mERXeKR1GoR2Gsb3SuSomOfUBsXEOLcGpxcIWbcUi1VH2PemqIWXeRV1KxZn6TNmmYe3:kN2[qZ{OTfVuEVkK[XFm5W4qD[FyERYeNR1Gs[H2HfV2Eb4CQe{CMTVOC[1mERXeKR1GoTVOCTlOYcH2MR1KxZnx6bHOvTnimV3es[H2HfV26NDuZN1qtXkCteWquPISRcV63XleWd1mISomkcVZ2T1SGe1yFTYeNSF24UFSSe1uUb3eMV1J4SGGw[1mERXeKR1GoTVOC[1mCb1qEVUCMTVOC[1mERXeKR1GoTVOCTlOScICbbVGwXUJ6NXKvVX:LTGqpZ3qGdFmFOEmKSF2xTVi{UlOqRXeKR1GoTVOC[1mERXeEVXuLR2FxT1mERXeKR1GoTVOC[1mERVqEVXuLUIl5[2WISomkNmWo[FepcFmIVnilS2WPR3mC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeKR2KsXWiTcFmFNHekN2K6XEOLcHOIfHi[NmWwTol1clyERX6NfXO{TViTfXGYNH:LTGqpZ3qHZl2XNICMWIOPR3mC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeKR2JzXWiKflyVOX[kcW[vV2d2cXK6NDubS1ZxXmOCPVmGNXibNmV3U32pcHKJRnykbXevXUJ6fWqUZ4CNWEWuZkOLeGmZVlW[XGKtT1OTb2mZVnyMWIOPR3mC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeKRUCMTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeNfUioWVeHfXNzWXelS3itTVd2bHKYWV6EbVGoTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mEVkK[XFm7UGR2[nOuWn6UW{WuZolxL3KuSoSbV1F6TViTfXGYNH:LTGqpZ3qHZl2tNICQe{CMTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeFVX:oTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERY[NfVKSXWiLfmqURkCiS2WoXUJ6eHOISoWmVUCMTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeLTGqpZ3qOeGCtPYmbW3SLZn2belyVOXqjNkG4XWd2OVmFNHeiXF67XmiSc1qJXnikbl[jUUFxdFmFPHelTFqxZmOob3SuSomOWoO7XGOs[1:qRX6LfoOPR3mC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeKRUCMTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeiW2moT1OTNmmZTYqNWEWnZ32XcmOYOX2jfUBsXUJ6b2qURUmRV1G5UVOs[3W4NFuKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1OUVkK[XFm7UGR2[nOuWn6UW{WuZolxL3KYWoqkNl[vXmOCPVmEVkK[XFm7UGR2[mi6[36VNIOvT2S{UlOqRXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVhx[2qYfIqbV1KxXnmCc1qJXnikbl21VHx6fWqY[FqjcWq3UGR2bnJzVnyKSEB6TVSKe1uURkeFVX:oTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTlibbHOrUYSRclqpZWiPcGSuPUCiW16tT1SGe12Ee3eLTGqpZ3qOeGCtPX[MR3SLWHubVGhyWmGTNVqDVlWX[mSGcFSTWUWVVmZ6SmeHRlqWb2[GTomsdF:4NFuKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[3[URnyjTF6tTVetcVmE[3ulcV[6UYlxL2h{TnybNHy2Xn15eGCuUo[bS2WoVGRx[127RYCKTIOPR3mC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOCb3SuSomOfUBsZ32HdHNzWl:jN2KxXUKWc12VRYeNR1Gs[H2HfV26NDuZNUiwTkCtU2KsPX[XWlKJWXuHSWKXPV:VNWKnVWWPWWOXXl[LfXuxU4dxT1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mEVkK[XFm7UGR2[nOuWn6UW{WuZolxL2qISkCbV1F6TVOTNmmZTYqNWEWnXImocmSuPUCKS1[r[FetNmmZVnybR1J2XmiScluVd16EbVGoTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mJNHebW4i7XmODdGqqRX:LTGqpZ3qOeGCtPYmbW3SLZn2belyVOXqjNmKtTVRxPVmFVYeMV1J4SGGw[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeKR1GLTVOTNmmZTYqNWEW6XWetfmqWOY[lS3yrXmOofF2FRYOKR2JzXWiKflyVOX[ZfXevVlV6UmGWcF:KSWKRVm[O[2SsPWWKSUGDWlWPTVq6b4CQfVGoTVOC[1mERV6EbVGoTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[1mJNF6EbVGoTVOC[1mERXeKR1GoR2GsTlOSNFuKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeKR1J6TVeXd3NzWXeme{CMTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOCTlqJXnikbl21VH6LbHGZUnyVcUlxZWePcFuFSYeOR4eoTlibbHOrUYSRcEmnT1OlSmWtTmCWcEmUVmWl[mFxbF[SNISnVnuHTmSEZ4CMWIOPR3mC[1mERXeKR1GoTVOC[1mERXeKR1GoTVOC[3[SNFuKR1GoTVOC[1mERXeKR1GLR2GsUlOqRXeKR1GoTVOC[1mERXeEVXx6TVeXd3NzWXeiW2mwTVOTNmmZTYqNWEWnZ32XcmOYOX2jfUBsXUJ6b2qURUmRV1F2UVOCdFmJd16EbVGoTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTlibbHOrUYSRclqpZWiPcGSuPUCiW16tT1SGe12Ee3eLTGqpZ3qOeGCtPX[MR3SHWXyLVGWtPVWVNXSQWFV6RmKHPVqTSkmQWEGT[mKsPW[Vb2GvT2OsO1SSc3eKR1GoTVOC[1mERXeKR1GoTVOC[3[URnyjTF6tTVi{UlOqRXeKR1GoTVOC[1mERXeKR1GoTVOCTlqJXnikbl21VHx6fWqY[FqjcWq3UGR2bnJzVnyKSEB6TVNxfF:4NFuKR1GoTVOC[1mERXeKR1GoTVOC[1mCb3ulcV[6UYlxL3OuSoCkNm[QZkOTdGlzWX:OWFG4UFOCb3SuSomOfUBsXEF5c1pxWmOWb{mUXEGLSmJyPVSUSW[FV{F6S2GWcF2LfXuxU4dxT1mERXeKR1GoTVOC[1mERVqEXECPR3mC[1mERXeKR1GoTVOC[1OSb16EbVGoTVOC[1mERXeKR1GoR2hx[2qYfIqbV1J4SGGw[1mERXeKR1GoTVOC[1mCb1qLTGqpZ3qOeGCvTniiXF6tWH16NHGYUnyMSFW4UVO4[1qJXnikbl21VHx6[luE[F[WcFqRWXx6V2KW[H[SNHiHVUC1[mKsSlqVR3OxT2S{UlOqRXeKR1GoTVOC[1mERXeEXECPR3mC[1mERVqEVU1:Jku{PkF3PjKWS{m7[F[LcHOZWnykN2F:Jku{PkV{OkB7JlSSc3eKR1GoTVOC[1mIcH2MR1KxZ{F6bHOvTnimV3es[H2HfV6Eb3eLbWmoXUJ6NXKvVX:LTGqpZ3qSdFmFOHeOR1GxTVi{UlOqRXeKR1GoTVOC[1mERXeKR{i3TVebenOuNXilR1G1UGR1[3SIWoqlSFV6XWObNGqZUkCObkGqTVeXNGm6OF6EbVGoTVOC[1mERXeKR1GoTVOTNmmZTYeKSECoXWiLfWmZb3:MWIOPR3mC[1mERXeKR1GoTVOC[1mJ[H:iW4itT1ODd3GZUkCMR2K2UFOCb3Sqb3eRV1KtXWePc1uEVkK[XFlxT2OCdFmJd16EbVGoTVOC[1mERXeKR1GoTVOC[1mERXulcV[6UV[1[FmFNHeKbWK2VGOTNlmrd16EbVGoTVOC[1mERXeKR1GoTVhx[1mERXeFVX:oTVOC[1mERXeKR1GoTVOCb3SuSomOR1F6TVeteHOIfI[bS2WwTom[clyERXulcV[6UVOsO1SSc3eKR1GoTVOC[1mERXeKR1GsXUJ6eXSIWoWlSmJ2Z1eW[2CURXmSNkm2[FeXeXSENUCmXFKtU3mDbHOJRoOiW16p[FetenKqPUSNXHR{[IlycXJ{ToSNXG[6ZleXeWlzPXubW2KkZ3y5eVmrd16EbVGoTVOC[1mERXenVUCMTVOC[1mERXeKR1KtZliPcFmJd16EbVGoTVOC[1mERXeKR1GoTVOTNmmZTYeKSECoTlibbHOrVUeFVX:oTVOC[1mERXeKR1GoTVOCb2lzPYWlS2[2[F[TOXOIWXeRV1GqVUJ6eXSIWoWlR{Fx[WiDcF:qRkCbXHhxUEOpeHKHfImZS{SqU4dxT1mERXeKR1GoTVODPVSSc3eKR1GoTVOC[1mCNFuKR1GoTVOC[1mERoCbbXeoZWiP[nKvWoOjR3es[H2HfV26b3eMV1J4SGGw[1mERXeKR1GoTVGsb3SuSomOfVF6TVVybGpzWU[QcXSt[F[PNHJ{TnySNkm2Xn2tcluETkObW1m3[Gd2fmqYUkGkcWW3XX2HfmqXPUGkcYeqT2S{UlOqRXeKR1GoTVOC[1mERXeKR2JzXWiKflmFNHekN2K6XEOLcHOIfHi[NmWwTol6dHKuVnymR{W4ZViCemmYVoSiW{SvUFOCclq6e3eLTGqpZ3qOdF:4NFuKR1GoTVOC[1mERXeKR1GoTlibbHOrUXeRV1K7[FiL[nOuWoejS1[rXmOoclxzcIWbS2Z1UH6Dc3OEPH6NR1GvTom4[1qJXnikbl2xU4dxT1mERXeKR1GoTVODPVSSc3eKR1GoTVFxT1mERXeKR1GoTVOCely6Roe[XFq7XmODNHGIWXebNnxzXmd1[2[XTl2FVX:oTVOC[1mERXeKR2JzXWiKfVmFNHekS1[6Z{KX[nSZToOMR2JzXWiKfVuVd16EbVGoTVOC[1mERXeiW2mwTVOHdHN{UnylR3es[H2HfV2td36kNl6wXmdycFpyNICKTIh5TVOob3SuSomOcIOvZ{KPc2qYNXyLNUCoTWRx[1pzbEClTFGvT2OCdFmJd3eFVX:oTVOC[1mERXeKR1GoTVODfWqZVkGkcUSoXn2Hd3NzWUeFVX:oTVOC[1mERXeKTECPR3mC[1mERXeFVX:oTVOC[1mERXeKR{i3TVeXOHSJTni[N2GoZVd6fnSERnijcWGoZ1eHNHGFc16EbVGoTVOC[1mERXeLS3i3Z{OS[2CURXulcV[6UXy{cnGIPYqlR3SlU4dxT1mERXeKR1GoTVOCb3OISkCiR1F6TVetfnNzWkCMR2JzXWiKfWe6[Ie[XGKwTkFxdFmFPHeLTGqpZ3qLZlp{RnilS3evXGOCOlmEZ4[LfoOPR3mC[1mERXeFVX:oTVOC[1mERXeKR{i3TVd6e2qYOHe[V1K7ZkKPdmqZVXe[Nkm2Zn2XbnSIcI[jbVK3ZnmDe3J{TkCKSHe4SGGw[1mERXeKR1GoTVOTcHOvToWjfVF6TVd2NXKIe{eFVX:oTVOC[1mERXeKR2KtZ36LfnSJTXeRV1K2[Ge5d1:4NFuKR1GoTVOC[1mERXubclGoVGODRWqvUo[[NoS3Z1eXeVuEVn:jN15xUFOCOF2Ee3eLS2[6Z312elyERXubXFq6Z{OTfVyERUGMWIOPR3mC[1mERXeKR1GoZWe[c1mEVn2kR1F6VGRx[2quSoOkNmWoT2ODO1SSc3eKR1GoTVOC[1mERXeKR1K6XmiTNXOuOHebcV[{Z{KWO1SSc3eKR1GoTVOC[1mJNF6EbVGoTVOC[1mERXeFVX:oTVOC[1mERXeKS3yuTVOobHGZUn[jcm[{ZlOob3SuSomPbXuxTVi{UlOqRXeKR1GoTVOC[1mERXeKR2JzXWiKNlmFNHeKcG[7XmiKeGGY[HyjcmF3TVOKeVqJXnikbmm2TXy5fWiIOHmQe{CMTVOC[1mERXeKR1J6SGGw[1mERXeKRUCMTVOC[1mERXeKR1G3UImDfmqYOXuKTGKwXmODfWqZSkGbXF5xSGGw[1mERXeKR1GoTVetcVmE[3ulcV[6UmOCPWCURX6kS{m7[FOkdFmJd16EbVGoTVOC[1mERXeKR1GoTVebe3SZVoqMR2KuZ1O4[1mtRmCWNWGoTliDbHSI[3eUSmKWWVN5fFyrSnOkcIi2TXmsO1SSc3eKR1GoTVOC[1mERXeKR1KxXnmCc1mYcIqZNkVyZle4c1qJXnikbmmxT2ODO1SSc3eKR1GoTVOC[1mERXeKR1GoTVOC[2qvRkGlTF2wTlebe1yERXulcV[6UnmsO1SSc3eKR1GoTVOC[1mERXeKR1J6SGGw[1mERXeKR1GoTVOC[1mERn2kTGZxZ4mob2qvRYOKR1qKZkOPNF:qRXuiS{m7[F[5fWiIOHmMWIOPR3mC[1mERXeKR1GoTVOC[1mIXoelXGK7T1OTcXOEe3eKcFqtXn2XfWqZTU[KR2JzXWiKfmiJTnOjbVmxU4dxT1mERXeKR1GoTVOC[1mERXebclJy[FiOc1qIXoeNR1GsXUJ6eXSIWoWlSmJ2Z1eWdF:4NFuKR1GoTVOC[1mERXeKR1GoXn6DNXSJUX:LS2q4UFOCbWFzPYWlS2[2[FNyd2qYOX6lS3d3TVOKeVmJUkCkcYitZnmob3SuSomOR3uoUHmLZ3OtfIWKbXt4SGGw[1mERXeKR1GoTVOC[1mERn2kTGZxZ4mob2qvRYOKR1qFZkJ2eWqYUkCiW{m2U3mDbnKIPYqbWoi6XFd2Z3OtfIWKbXt4SGGw[1mERXeKR1GoTVOC[1mERn2kTGZxZ4mob2qvRYOKR2JzXWiKe1uVd16EbVGoTVOC[1mERXenVUCMTVOC[1mERXeKR1KtZliPcHGYXXeMR2JzXWiKNVmFNEmKR3SvXmiScluURkeFVX:oTVOC[1mERXeKR1GoTVOCb3OZWnykcnuoVGOCclq7d16EbVGoTVOC[1mERXeKR1GoTVetcVmEbICkN16t[FOob3SuSomOcIOvZ2iXcHOvb36ZV3uxTVi{UlOqRXeKR1GoTVOC[1mERXeKR1GoTVOCb3OZWnykcnuoVGOCcmC6Z4WLTGqpZ3qLZlp{SkGbXFp2TkFxO1SSc3eKR1GoTVOC[1mERXeKR1J6SGGw[1mERXeKR1GoTVOC[1mERn2kTGZxZ4mob2qvRYOKR1qJVm[S[3W6Voe[XGKw[mi{b3OZWnykcnx6TVWpWW[HRY[OV{S5XFiLZ3KqTYCQe{CMTVOC[1mERXeKR1GoTVOC[3GYXXeMR1[xZ{F6eXSYfIOMR2JzXWiKNluUb3eme{CMTVOC[1mERXeKR1GoTVOC[1mERXeKS2q4[GiTfluEVn2kR4eoTlibbHOrXYCQe{CMTVOC[1mERXeKR1GoTVOC[3[SNFuKR1GoTVOC[1mERXeKR1GoXn6DNXSJUX:LS2q4UFOCbWOIPYqlSH:oTlepenN{VnOkcIi2TXmsO1SSc3eKR1GoTVOC[1mERXeKR1KuZ1iXNHO6[3ubclG{TVOLSHJzOYWbW15xZWd6eV:qRnqjS{m7Xm[5fWiIOXOkcIi2TXmsO1SSc3eKR1GoTVOC[1mJNF6EbVGoTVOC[1SSc3eKR1GoTVOC[1mEVombXF5yZliS[2CURX6LfoOoSGGw[1mERXeKR1GoTVilc3GYfHyMR1[uXmd6cVuEVn2kR3uxTVi{UlOqRXeKR1GoTVOC[1mERXeKR{i3TViLcGlzWoClcWWo[FepcFmJTnykN2[{[FiO[3JzXXelS3itTViLcHOZWnykN2GPR3mC[1mERXeKR1GoTVOC[1mEVombXF5yZliS[1yrNHebcXSt[FiOc1qIXoeNR1G5UXqodF:4NFuKR1GoTVOC[1mERkmFVX:oTVOC[1mCNFuKR1GoTVOC[1mERY[NfVKrZld6fmqURkCiS2WoZ{J6bnFzWkCKS163Zn12cGl{VoCjNkR3SGGw[1mERXeKR1GoTVebbnKIPYqbV3esXn6CdF:4NFuKR1GoTVOCUlOqRXeKR1GoTVOC[1y6PHekN1K{ZWiS[3SIbHyKTFqtZ{OXd3SERn:bW1[sXmiK[2qvTo[jV1JxZVeW[2lzPYWlS2[2[FFxT1mERXeKR1GoTVOCb3OuWoqlW4hxTVRx[2qZbIejS{msXmOobWiJTnOjcIi6XFd1bVyERXukcW[7[Ge5NFyERYmMWIOPR3mC[1mERXeFVX:oTVOC[1mERXeKR2KwXmeHb2qZTXeRV1KxZ{OPcHSE[3ukcW[7[Ge5NGe7RnSMV1FwTVOTfWqZUkGjTGKjUVZx[1:qRX6LfoOPR3mC[1mERXeKR1GoTlePenKvVnyjcmGoVGODdHN{UnylR3esZ32XfnSYfECYfl[lT2OCM1mEVombXF5yZliTZl2XNHeQbVGvToq{UlOqRXeKR1GoTVOC[1SSc3eKR1GoTVOC[1mEVkK[XFm5TVRx[3KuWkOKTF5xXlWPd2mZUoqMR3t4SGGw[1mERXeKR1GoTVOTNmmZTYiNWEWwXmeHb2qZTXeRV1GsZVeXbGqIWomQe{CMTVOC[1mERXeKR1Gs[H2HfV2UNDu[Nkm2[FeXeXSERUmKR2KrZkJ2NGqYOUCQe{CMTVOC[1mERXeKR1GPR3mC[1mERXeKR1GoUIl5[2OISoWbS4itTVePc3SYOYKbW2Go[FiLbHKvUn2bXFmoZWe[[3KuWnybS2[sSGGw[1mERXeKR1GoTVetcVuERoqlTFq4ZkOOc3N{VomlS{m{ZkOlcHOq[3ulcV[6UWNxL3GIWnibS2[6T2O4[1p{Vom[W{W7Xn2XfVyYWoW[NkmsZWd2cl:qRnqiTG[2ZUKXb1q6b3eKWEB6TVebbHKJUnyKR3uo[YdxT1mERXeKR1GoTVOC[1mERXeLTFKpZ36PcGqERUmKR3OvU4dxT1mERXeKR1GoTVOC[1mERXeLS4itXn6S[2CURXulcV[6UWNxL2lzPYWlS2[2[FS{UlOqRXeKR1GoTVOC[1mERXeKRUCMTVOC[1mERXeKR1GoTVOC[3RzbICjS2WwTViTfXSYWXeMV1J4SGGw[1mERXeKR1GoTVOC[1mERXeKR1GoTliDenO6RUmKTF5xZ36DenO6[3ujS2[u[FO4[1mtfImZS{SqT2S{UlOqRXeKR1GoTVOC[1mERXeKR1GoTVODdGqq[3eLTFK3Z4mCPWCVNHebcV[{Z{KW[1uURkeFVX:oTVOC[1mERXeKR1GoTVOC[1mERXeKR1GoTViLcHSJWomjbVGs[H2HfV2Vd16EbVGoTVOC[1mERXeKR1GoTVOC[1mERkmFVX:oTVOC[1mERXeKR1GoTVOC[1mERXeFVX:oTVOC[1mERXeKR1GoTVOC[1mERXeLS16w[Gd2dnNzcE[bV1F6TViPNWmvUkCkbXesZleXcXSEe3eOR4eoTliDenO6b{eFVX:oTVOC[1mERXeKR1GoTVOC[1mERXeLTFK3Z4mCdmCURoqlTFq{Xmd1c1mtfImZS{SqT2S{UlOqRXeKR1GoTVOC[1mERXeKR1GoTVOCb3KIWn2lR1F6TViPNWmvUkCkbXesZleXcXSEe3eLTFK3Z4msO1SSc3eKR1GoTVOC[1mERXeKR1GoTVOC[1SSc3eKR1GoTVOC[1mERXeKR1GoTVOC[1qJRo[kfVF6TViPNHOvRo[kfXesXUKpNXKueIqiXICtUFOCcl:6Z4CQe{CMTVOC[1mERXeKR1GoTVOC[1mERXeKS3yuT1OCb3OIPYqKR1V6VGODcWmYfIqbV1GxTVi{UlOqRXeKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeLS16w[Gd2dnNzcE[bV1F6TViPNWmvUkCkbXesXUKpNXKueIqiXICtUFOCe1yERXukS{m7T2S{UlOqRXeKR1GoTVOC[1mERXeKR1GoTVODPVSSc3eKR1GoTVOC[1mERXeKR1GoTVOC[1qIUn:lW{WzZ{KtOmqURUmKS3it[VeTcGm6[3u[NnhyZn21fnGZdHyMWIOPR3mC[1mERXeKR1GoTVOC[1mERXeKR1GPR3mC[1mERXeKR1GoTVOC[1mERXeKR1KxXnmo[1qIUn:lW{WzZ{KtOmqURUmRV1G4TVOs[3W4NFuKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeKR1KqZ32XbHG7d16EbVGoTVOC[1mERXeKR1GoTVOC[1mERkmFVX:oTVOC[1mERXeKR1GoTVOC[1mERXeFVX:oTVOC[1mERXeKR1GoTVOC[1mERXeLTFKpZ36PcGqERYWRV1K7[GeLfnSJTX:LS4itXn6Sd1mFRYOKR2KrZViXeXF{UoCmcWWxU4dxT1mERXeKR1GoTVOC[1mERXeKR1GoTVOTd2qYXkCKSECoZ{OXbXN{VomMR2K{XmebNFyERXu[NnhyZn21fnGZdHyKR4OoZ{OTfXKIWoWMR1qkZ3y5eVmqb4CQe{CMTVOC[1mERXeKR1GoTVOC[3[SNFuKR1GoTVOC[1mERXeKR1GoSGGw[1mERXeKR1GoTVOC[1mERXulcV[6UWNxL2lzPYWlS2[2[FOCPVmEVoe[XFq7XmeSO1SSc3eKR1GoTVOC[1mJNF6EbVGoTVOC[1mERXeKRU1:Jku{PkF3PjK[W2K1ZWd2UXJz[ICj[{1:Jku{PkFxOER7JlOob1qiW2moT1OHUmmY[HyQboCwXme5e2qZTX:LNkFx[GiLbXK6PYCjcWq3TomseGCu[HylSlqtXkB2bHKYWX:MWEB6TkK1fXSIfIK[W4S6UlOkdFmJd1uEVXuLZWe[[1uGNXibNmV3U32lcHSHUkCjN1qtVUJ6eWqucH6MR3S1[FiXfWmuPI[bcXy6Z{OTbnJzOX2iW3OvT2RxPV2Eb3eme3:LR2GsTlOob1qEVXus[FiXfWmuPYe[XGKwTVRx[2SYSn6bWH93XkKXNGV{Vo[kcW[FZkJ2cXGYZ3:LNkFx[GiLbXK6PUClXFqqZkODbHSI[36MWIOMR2GsTlOUVomjNklxTVRx[2SYSn6bWH93XkKXNGGuSoqbWWKxZ3modFysVmSNbWJx[GiLbXJ{RnilS3d4R3esTlOSb3ulcV[6UVNxL2hzVnyjSmK6XmeWc1qJTo[jN2G{TVOTfXJzPUCMWIOMR2GsTlOSc1qEVXuLTld2enSIcH2iW16p[FetenKqRUmKSUGpXkKWOl:u[HylSUG3XleXd1uE[HibS{GxZnt2enSIcH2iW16p[FetenKqPYCjcVq3[VOkdF:4c1qEVXuLTld2enSIXXeRV1KpZ36LbHWU[3eE[3uLR2GsTlpzcIqZN1qtXWeScmCVOIeNR1GMR2GsTlOSb36bS1ZxXmZ6bGqIVnybR3N6VH2TbHSIWX:LNXu1ZmNyb1mG[{[iWIC7Tomsd1mCc1qEVXuLR2OlfmqZXnykcXxx[WOkPWCrVYOKRX:LR2GsTlOU[EGkcYevVGR1cnGJVkCkSH:3UEOlN3S6OXikcmKxZol2eWqZVY[jW1[vXmd2NHK6NXymTGKtZn6PdHJzOYqNNkC1[FiXfWmuPIS[W16rXme5cHOuSkCjN1m3Tom4T1OSb1qEVXuv[FetNHKIWX6RWESoWGeHcmqVc{[iS2[{Z1eXfVuE[ISlTG[6XX15cluUNDuZNUiwTkBybGpzWoWlS{ioWG[TNXOuTo[KSny3[GiK[3KIcHqbW{W7XmODc2mZUXebXHi4ZWiLcGqEZ4CNRX:LR2GsTlOU[HubXF6rZ32te3SIcI[jbXN6VHmDUmmY[HyQboCwXme5e2qZTX:LNkFx[GiLbXK6Z4CNWEWnXImocmSYSn6bW{VxZomDUm[JWom[cUioW2d6NXOqRoOiW16tZn2PcFmIbHikfVKt[ViDdHOuWnuNbVKDZle4[2lzSnqiS2[sTViDbGpzWoqKTHSpZ4mDfWqYNY[lcW[sTomsT1OSb1qEV3t4R3esTlOSb3ujcUlxZWebdGlzSkCiW{m2UGR2e2mZToqbV3ipZ36LbHWU[3ujcUlxXnmsdF:4c1qEVXuLR3esTlOZNFuEVXx6R3esTjJ8d{pzOEpjXWebNGqZTmS[XGqtWViLemqJWnqlRU1:Jku{PkF4NkpjR3mC[1mERVqiW2moT1VybGpzWU[QcXitZliDcHOq[36jXGJyZ32LelxzcIWbcUivT2NxL2pzWkCWcW[vWH2HeGqU[4CMV1J4R3esTlOWNXibNmV3U32lcHSGNY[bS2[{T1OleHSJWom[cUi3ZkKLfmqZTkKbXFm6TomseGCuSn2lS2[6WUKHNmqXRomjNmJyXUOSc1qJXnikblGxU4ewTlOZNFuKR1GoTVGsQTJ8d{pzOEpjXX2XcXJ{TnyWNlZzXmWPbHSIWn6jN1p2Jku{PkF4OkpjR3mC[1mERVqiW2moT1VybGpzWU[QcXitZliDcHOq[36jXGJyZ32LelxzcIWbcUivT2NxL2pzWkCWcW[vWH2HeGqU[4CMV1J4R3esTlOWNXibNmV3U32lcHSGNY[bS2[{T1OleHSJWom[cUi3ZkKLfmqZTkKbXFm6TomseGCuTnybcUm6Xm[PbHSuWlS[XGKtXkJ6fXWU[3ulcV[6UVOsO1Oob1qnVX:oTVOC[1OSQU1jP4N7NkR7JmmYXkCbXFqVXWibcGFzSkCbW3S3Z36sQTJ8d{pyO{J7JlOqRXeKR1GLZWe[[1uGNXibNmV3U32pcHKJRnykbXevZmiTNXOuTo[NNny2Xn15cluUNDubNmZxWX2XcmSuSoSbV3exT2ODO1Oob1qEWUGpXkKWOl:u[HylSUG3XleXd1uE[ISlTG[6XX15enJzToqbXFpzXmiKfVq6b4SRcV[u[FeXfWVzSkKbWV6p[FeXcnJ{TkWMR2JzXWiKe1uVd1uEVXx6R3mC[1mERVpjP4N7NkR7JmmYXkCbXFqVXWibcGFzPYSjW3xxWmiLdzJ8d{pyO{Z7JlOqRXeKR1GLZWe[[1uGNXibNmV3U32pcHKJRnykbXevZmiTNXOuTo[NNny2Xn15cluUNDubNmZxWX2XcmSuSoSbV3exT2ODO1Oob1qEWUGpXkKWOl:u[HylSUG3XleXd1uE[ISlTG[6XX15enJzToqbXFpzXmiKfVq6b4SRcV[u[FeXfWVzSkKbWV63ZmdydHSHWomjR3es[H2HfV2Eb{eE[3uL[mGw[1mERXeEVU1:Jku{PkJ1PjK[XGZxZkJybHSIcHqTS{l{Zn25emmYVU1jP4N7NUZ5PjKEbVGoTVOCTnGYXXeMSUGpXkKWOl:ubHyjTFKtZ3mocnKZVkGkcVq3UEKteWquPH6MV{BsXkKXNGWuWn6VcV[1XmOodFuURkeE[3uLR2VybGpzWU[QcXSt[FVyemqIWoOMR3S1[FiXfWmuPI[jNlq7XmiLNmqZTYmLfXu1VH2HNXSIPYS[XGKxXUCTenRzOYOjNl[sT1OsO1Oob1qnVX:oTVOC[1OSQU1jP4N7NkR7JmqIPUOjcYi3XWeTRnKuVlqjcl5xXWe5dzJ8d{p2O{Z7JlSSc3eKR1GoTVOC[1mEVkK[XFm4W4mlNXNzWomjcV[1XmOl[FmFNHeLfXN4SGGw[1mERXeKR1GoTVOTNmmZTYeYfXS4XWiPfnRzPYmbR3SlTVRx[1q6Z{eFVX:oTVOC[1mERXeKR2JzXWiKe2e6[HujN3S2Zld6bGqHPYCbR3SlTVRx[1qJXnikbll4SGGw[1mERXeKR1GoTVOTNmmZTYeYfXSuZWe5cFpyNHeRV1GvZmiTNXOuTo[LfoOPR3mC[1mERXeKR1GoTlibbHOrRnKLNl6p[FOl[FmFNHeLNkFx[GiLbXK6Z{eFVX:oTVOC[1mERXeKR2JzXWiKe2e6[IekcUmsTkFx[2CURX6jW1[vXmd2NHK6Z{eFVX:oTVOC[1mERXeKRUCMTVOC[1mERXeKR1Gs[GiLdFmFNHekS1[6Z{KX[nSZToOMSUGpXkKWOl:u[HylSVqpZ{KXWnOue3:MV3t4SGGw[1mERXeKR1GoTVOTNXOue3eRV1Gs[GiLdGe6[H:jN15xTkFxeVqJWomiWoOvZ1eHNHGE[HSQe{CMTVOC[1mERXeKR1Gs[GiLd1mFNHelTFqxZmOob3SZToONR1GvUImkdF:4NFuKR1GoTVOC[1mERXulcV[6UV[{cnNzcECbV3SlTVRx[1qJWomjSIOPR3mC[1mERXeKR1GoTlibbHOrRnKLNny4TkFx[2CURXuZNV6HWXybSmWtd36WNG[UWnuXV2hxSlWTSlmvXGS{UlOqRXeKR1GoTVOC[zJ8d{pyOkpjXld6N3KufI[[W2KSXWelcDJ8d{p2OEJ1PjKEVUCMTVOC[1mCcICbbVGwWGeHcmqVc{[iS2[{Z1eXfVuE[ISlTG[6XX15enGYOX2jfXOxUGR2cmqZVmObW3SQXWdycFuEb{mRV3SzZ36Td3FzSoKkbmGvT2ODO1SSc3eKR1GoR2FxT1mERXeKRXuLTlibbHOrUXeRV1GvToq{UlOqRXeKR1GLR2OTc3SINYOKSECoTomkO1SSc3eKR1GoR2GsUlOqRXeKR1GLR2etcVmE[3ulcV[6UlRxPVq6Z4CFVX:oTVOC[1OSb1qLTGqpZ3qS[2CURlKkcmKxZkF6Um[JWom[cUmnV1eXd3OIWomZNGKp[FeGOl:u[HylSV63Zn2bdGq6[4CNWEWvXmiTSXJ{[IWjS{mpXlVycHSIbI[bR3exU4dxT1SSc3eKR1GoR2GtdGqqRX:LTGqpZ3qKdFmCNFuKR1GoTVGsTnW4NFuKR1GoTVGsTlOUVoe[XGKwTVRx[1qJXnikblG1VH2PfWqYSkCbWlKp[Feoc1uVd16EbVGoTVOCTlOSb3ulXFq{TVRx[1qJXnikblG1VH2lcHSGVo[lNkW{ZkKHb2[ZToOXNnxxZVV2emFzSnqiS2WwT2S{UlOqRXeKR1GLR2hxUlOqRXeKR1GLR2eXd3NzWXeFVX:oTVOC[1OScEeFVX:oTVOC[1OSb1qLTG[6ZlOCPVmGNXibNmV3U32lcHSHWomjR3exU4dxT1OSb1qEV2JyZ324[2CURoqlTFqnZ32Xe3KISnqbV3eqXWeTeHGYOI[KbYeoTXmKd1mEVkGkcYexU4dxT1mERXeKRXuL[mFxT1mERXeKRXuLSGGw[1mERXeEVXxxZ36s[1SSc3eKR1GoR2GtO1SSc1qKR1GoTVGsTnN{[IClS16wTVOob3SuSomPR3uPR3es[1mERXeEVXx4SGGwTlmERXeKRXuLR2FxT1OURXeKR1GLR2Gsely6RmSlS1[2XleHfWqERn2iW4itTVelcHSERnqjNkVxXmd2NHO4NFuEV1GoTVOCTlOScHq[XF6tTVWTenRzOYOjNl[sWGeXNHGIPXukfn93VnutUWKXPViTWmKnVUB6U2[GWl:XSl13SGGwTlmERXeKRXuLR2GtdGqqRX:iW{WxXEKlcHSE[36[W4i{ZkOl[nSZToOZNmq3Z1eXeVq6b3eRWECoToqGcluSNFuEV1GoTVOCTlOSb1qEV2Kw[Fdyd1mFNHebcXy{XmZ6cmqZVn[[Nkm2[FeXeXSJUX:LTG[6ZlOsO1SSc1qKR1GoTVGsTlOScHyjTF6tTVFxT1OURXeKR1GLR2GsTlOUVkK[XFm7TVRx[1mGNXibNmV3U32pcHKJRnykbXevZmiTNXOuTo[LfXu1VHx6[luETmSbXGJxZWd2clmE[HijS4i3[EF6NXOufH[bcUm4Xmd1clmIcIqKS2KxZ{KHbXKIWnuNbVmxU4dxT1OURXeKR1GLR2GtbXOuWniifoOPR3es[1mERXeEVXuLSGGwTlmERXeKRXuLR2N5elmGVo[lNkW{ZkKHb1mIPUKbXFmoZ{J6bnFzWkCFVX:LTVOC[1mCb1qEW16pZ{KW[2KIPUOjcYi3XWeTUmqZVn:jNmK7U3qxWGRxUlyTWmF3R2GsTlSSc1qKR1GoTVGsTlOSb3ukcW[7[Ge5NGSvWoS[cW[6VGSCO1SSc1qKR1GoTVGsTlOSb3ulcV[6UYpxclq7d16E[{CMR2OC[1mERVqEVXuLTliLcHOZWnykN2GoVGODe3OuWn6ZN1qtZ1e5bGlzWX:LfUmw[FiTe1uJUYCmflG{UWhxOmiEPXONNYSmXFN6[FuqPH6NR1GvTom4[1qJWomjR3t4SGGwTlOSb1qEVXuPR3esTlOSb1qEV2K1XWiTbnGIWoqKSECoXWiLfWmZb3:MWIOPR3esTlOSb1qEXFK6Xmel[nKYSkC[NnewTkCD[VuFPE[iTGJxZ1Swely6bz:MSoSmUEFxdluWRoCLfYeoTliXfXKEe3eLS{Gp[FePc2qZUYCQe{CMR2GsTlOSb1qLS3i3Z{OS[2CURXujW1ZxXUKpcHNyd4iZWIOPR3esUlOob3eKR1GoR2GsTlOUVn2kR1F6TVebfnJzUoKjN1KtZnmob3GIPYqlR4eoU1SCd1mEVombXF5yZliTU3SYNXmbXFm{TVOTcHOvTo[kb{GtZ{OPbGpzWYCQe{CMR2OC[1mERVqEVXuLZWe[[1uESXubclGxSGGwTlmERXeKRXuLR2GtO1SSc1qKR1GoTVGsTlOSb1qLTGqpZ3qO[2CURXubXFq6ZkOLUmqZUoq[W3StU4dxT1OURXeKR1GLR2GsTn[SNFuEV1GoTVOCTlOSb1qbW4i7XmFxT1OURXeKR1GLR2GsTnW4NFuEV1GoTVOCTlOSb1qEV2K3[GiS[1mFNHeKb3SHWlOCb3OuWoilW2[7[FODTW[HVmGNflW2UW[5fWiIOHmQe{CMR2OC[1mERVqEVXuLR2OTenSZVXeNbkCoTXupenN{VU[KR2KwZkOPNGiJTnOjbVl4SGGwTlmERXeEV1GLR2GsTlOUVo[lXGGoUHpx[1msUo[jcUWtXUOTdHJzOE[KSV6{ZkOPcGiJTnOjbVl4SGGwTlmERXeEV1GLR2GsTlOUVo[lXGGoUHpx[1mtfImZS{SqU4dxT1OURXeKRXuoR2GsTlOScH2lN1qx[FeWc1qIXoeNR1GsZkOXNFuVd16E[3uoTVOCTlmCb1qEVXuLTlepcGmYVnykbVF6TVOLeXJ{VXemW2ZxTXq{UlOob3eKR1GoR2GsTlOScEOiS3y{XmOCc1mYXnyjNmmwTlebe1uUb16E[3uoTVOC[1OSb1qEVXx4SGGw[1mERXeKR1GoTVOC[1mERVqEVXuLR2OTd3GYOXyRW2qvXmiTfluEVn2kR4e5UXqodF:4NFuKR1GoTVOC[1mERXeKR1GoR2GsTlOScICbbVGwTle5dHKuWUmRV1qkZ3y5eVmqRX2LbVGsZVeXbGqIWomRWECqZn16NFmJcHylR1mxTVi{UlOqRXeKR1GoTVOC[1mERXeKR1GoTVOCTlOSb1qEV2KwXmeHb2qZTXeRV1GqZ1eHfnNzWnuKboOPR3mC[1mERXeKR1GoTVOC[1mCb1qEVXuL[mFxT1mERXeKR1GoTVOC[1mERXeEVXuLR2GtdGqqRX:LS3itXWeTcHOrNEmKclKpZ{OPcGqETYCKTIOPR3mC[1mERXeKR1GoTVOC[1mERXeKR1GLR2GsTlOUVn:lS{G{UHpxb3KIcIWbWIOPR3mC[1mERXeKR1GoTVOC[1mCb1qEVXuL[mFxT1OURXeKR1GLR2GsTlOZNF6E[3uoTVOC[1OSb1qEVXyuXUK5enNzWX:LS2q4T2S{UlOob3eKR1GoR2GsTlSSc1qKR1GoTVGsTlOSb1qLS2qxZ36PNFmFNHekN2K6Z1d6fluEVn:lS{G{UFOCcmCESlWVNF6WW2[DSlq6b{eFVX:LTVOC[1mCb1qEVXuLTle5bHN{VXeKSECoZ{OTfXOIPYqMR1GsZViTeHKEe3eLfoe3ZViTeHKFOH6MV4N{U4dxT1OURXeKR1GLR2GsTlOUVn:lS{G{TVRx[3N{WnmkN2K6T1OTc3SINYONR1GsXn2tfXN{VYOKR2K{XWiPNFyUVn2iXFq7[FOsO1SSc1qKR1GoTVGsTlOSb1qEV1GoTVOCTlOSb16E[3uoTVOC[1OSb1qEXECPR3es[1mERXeEVXuLXX6LcGmYd{eFVX:LTVOC[1mCb1qEVUCMR2OC[1mERVqEVXu3UImDSXJ{[IWjS{mpXlODN3GZVn:KSlKKWVODSnWJVnyjcl6xZkJ1[2FyWmOVRUCMR2OC[1mERVqEVXyrXWiPcFmGVo[lNkW{ZkKHb2SYWkCiS{msZ4qwOmFyWmOVSH:PR3es[1mERXeEVXuLR2FxT1OURXeKR1GLR2GsTnGYXXeMS2pyZn2PNHGYPYWZNmZ1ZWiPNHO6[36[N2[6ZlZ6dHKucECLfXuxSGGwTlmERXeKRXuLR2GtO1SSc1qEVXuLR2GsTlqIUn:KSECoXUOXfXKHPYCjcXxxT1OTNXOue4CQe{CMR2GsTlOSb1qEW15yZ325[nNzWkCjN1JxT1OTbnGEe3eSNW[UWFV6VW[HPWWUWUGHWEGXWVyERYiOSFGxU4dxT1OSb1qEVXuLR2ePNXOufH[kNmZxZkODNFuEVnqiR4eoVUGXV2SGPWGXSkmIWEC5UWRy[F2VNF6DWlWtVGSqe3elTFpyXmOsO1SSc1qEVXuLR2GsTml{WomjSkm7XmiTenOJVX:LS16wUFODSG[XTl2VNVKWXEGLSm[HWmOVcGKUVWV2WGKsWmONR1JxZ36XcFuVd16E[3uLR2GsTlOSb3uiTGK1ZlOCPVmIUkGkcYinXmipcGm6[3u[NnexU4dxT1OSb1qEVXuLR2etcVmE[3uiTGK1ZlRxPWCYXnijTF6tT2FxT1OSb1qEVXuLR2Gsb3SuSomOfVF6TVePNXOufH[bXFq6ZkOKc1qIUn:MWIOPR3esTlOSb1qEVXyr[GiLd2hzUoOjN16tT1OTbnGEb{eFVX:LTVOC[1mCb1qEVXx6TVFxT1OURXeKR1GLR2GsTmqYfIqbV1GPR3es[1mERXeEVXuLR2i{UlOob3eKR1GoR2GsTlOSb3ulcV[6UYmCPVmGNXibNmV3U32pcHKJRnykbXevZmiTNXOuTo[LfXu1VHx6[luE[FSXWlqOTVetflmIOY[lR1KxZn6PNGmYfIObW2GvT2S{UlOob3eKR1GoR2GsTlOZNF6E[3uoTVOC[1OSb1qEVUCMR2OC[1mERVqEVXyqZ32XbHG7d16E[3uoTVOC[1OSb1qFVX:LTVOC[1mCb1qEV{i3TVWPfWqYSkCbV1K2Xmik[2SYSn6bW{VxZomDdHKvUkC[W{WrXmFxT1OURXeKR1GLR2GtbmmZUnyKSWK3[EJ2d3JzSnuVW2ZxZVd6b3O7c{[TSXyUVmWPWWhxSlSSNG[VWYqwUlOob3eKR1GoR2GsTlOSNFuEV1GoTVOCTlOSb1qiW2moT1WHfXSIcI[ZNEGW[GiLbXJyPVmbW4i4XmiL[mKISkC[WH93XkKXNGFzPYWbcXyvT1OseGCucIqWS1ZxXUKpcGqE[4CMVUCMR2OC[1mERVqEVXuL[YdxT1OURXeKR1GLR2GsTlOURXeKR1GLR2GsTlSSc1qKR1GoTVGsTlOSb1qLTFK6XmibWmWsb3eRV1GsXEGPSmWtXl[WcIOvWXuXVm[WWmSXSkmXWXuscmiVd16E[3uoTVOC[1OSb1qEVXusZ{OTbHSIWXeRV1KPXWelcF:rdH6bXGKV[FeHNHGYUmSlS1ZxXmOodF:4NFuEV1GoTVOCTlOSb1qEWUGpXkKWOl:vTnykNmZxT1OsO1SSc1qKR1GoTVGsTlOSb16E[3uoTVOC[1OSb1qEVXy3XXx6fnSISomlR3exU4dxT1OURXeKR1GLR2GsTlSSc1qKR1GoTVGsTlOSb1qEV2KnWUCXV2[sWmOYfXSUVm[HWmKXUmWZNW[UV2Ol[FmFNHekTFqtXkF6fWqZRoO[W16tT1OkenGJVkCkR3i7T2i{e1yFSkmQcIe3XFN6Zmite4[ZV3:3Tom4[1q6Z4OKR2JyZ324dF:4NFuEV1GoTVOCTlOSb1qEVXyPXWelcF:rdImlW{SwT2S{UlOob3eKR1GoR2GsTlOSb16E[3uoTVOC[1OSb1qEVXusZViTeHKERUmKS{mqXEKlcHSHPXqjNkVxXmd2NHO6[4CQe{CMR2OC[1mERVqEVXuLR2d6bWhzWoWbSkmrZleXbHKq[4CQe{CMR2OC[1mERVqEVXuLR2VybGpzWU[QclqtZ{OTenOuWmSlS1ZxXmOob3N{VnilS2WxU4dxT1OURXeKR1GLR2GsTlOSNFuEV1GoTVOCTlOSb1qnVUCMR2OC[1mERVqEVXuLXme5fmqURV6E[3uoTVOC[1OSb1qEXIOPR3es[1mERXeEVXuLR2Gsb3SuSomOfVF6TVVybGpzWU[QcXitZliDcHOq[36jXGJyZ32Lelq6b4SRcEmnT1OLS3GYfHyKSUGpXkKWeXOIbIeKS3y7TVd2enSERoe[XGKrZVeXb1mqb{eFVX:LTVOC[1mCb1qEVXx6SGGwTlmERXeKRXuLR2GsUlOob3eKR1GoR2GsTmmvTny[W4N4SGGwTlmERXeKRXuLR2FxT1OURXeKR1GLR2hxUlOqRXeKR1GLR2hxUlOqRXeKR1GLR2ePbHSIUn:KR3iH[VePcHOJVoCjNkSoTleWdFSSc3eKR1GoR2GtO1SSc3eKR1GoR2GsTlqJXnikbl2oVGOCb2qUNDubNmZxWGeXfnNzSn6bV3exU4dxT1mERXeKRXuLR2iLcHSJWomjboOPR3mC[1mERVqEXECPR3mC[1mERVqEVUCMTVOC[1mCb1qiW2moT1OTNmmZTYiMV1GsZViTeHKEOEmKR1l5TWNxeFmETXeNbVK2ZkOkc1uURYWKR1moUGNxL1mrd16EbVGoTVOCTlOYcH2KR3es[H2HfV2qb3ebcXy{XmZ6e3SZVn[[Nkm2[FeXeXSJUX:LTFKp[Feod1mEVn:lS{G{T2S{UlOoNFuKR1GoTVGsTnGYXXeMR2JzXWiKfmCVNH6LfVGuTnmDdHNyPYqlTFqxZn2kc1qIbECjW4exTVO[cVmE[3uiTGK1ZlOGPVq6Z4CMVUCMTVOC[1mCb1qEV2JzXWiKflmFNHekcUlyZn2Sc1uJUkCkcYitZnmob3GJVoSjR3uoUImCc2qufI[[XGGxUWSCfV6Eb4OKSFmxU4dxT1mERXeKRXuLXme5fmqURoCbbVGwTlibbHOrUUmRV3OvTVO[cVmEVn:lS{G{VGRxclq6b16EbVGoTVOCTlOSb3ulcV[6UYmCPVmGNXibNmV3U32pcHKJRnykbXevZmiTNXOuTo[LfXu1VHx6[luE[HyjXFJx[WODenSZVoelXGGvT2S{UlOqRXeKR1GLR2FxT1mERXeKRXx6TVeXd3NzWXeme3:LR2Gsb3SuSomOfVF6TVVybGpzWU[QcXitZliDcHOq[36jXGJyZ32Lelq6b4SRcEmnT1OlXnJ{WomKS2K3[EJ2d3JzSnuKSXyGTVetflmIOY[lR1KrZkOLfWqYUkCNbXOxU4esTlOob1qnVUCMTVOC[1mCb{1jP4N7NUZ7JnGYOXubXHiDXUOTdHJzOE1jP4N7OURxPjKFVX:LR2etcVmEbF6[W3StU3qxc2qYfIebXFmwTkJyNHSZTnmjfUmxZn2belq6b4SRcXSt[F[LcGpxOXijW2WwT2Os[3W4NFuEVXuLTlibbHOrRYSRclqtXlOocnKZVkGkcVq3UEKHb3KYcIWiTGK1ZlZ6eHSJWom[cUi3ZWd2b2qZ[36MWIOPR3esTn[URnyjTF6tTVi{UlOob1qEVUCMR2GsTlqINY[bS2[{TVRx[2SYSn6bWH93XkKXNGSYPXubW4ewTkJyNHSZTnmjfUm1[FiXfWmuPH6MV{BsXUK5cGmZTlKjS4iSXWelcHO6[4CQe{CMR2GsTlSSc1qEVXus[H2HfV2ENDubNmZxWX2XfnOIPYWkNmWwT2NxL3NzWkCUS2[pXleXfVuE[FmXSmKSUIqGeV2UZ4OLfmG4UYmDS3J{TnmiW2KsXmd1cluVd16E[3uLR2OTNmmZTYeNWEWvXmiTV2qZUoejNkW7XmOodFyVOYqbXGKEZkKTOVuERXulcV[6UVNxL3R{TnikR3iPXWelcF:rdH:bW4i4XmiKc1pzNUClXFqqZomkdFyVOX[ZfXevTV[lfXJzOX6KS4ixXUKXeXNzWXelTHy4XmO4[3KIcHqbW{W7XmODbnJzVnykfVKpZ32W[3KuPUCKS{Gp[FePc3GYOX6KTGKwZWiO[3GIPYqlR{SvT2OsdF:4NFuEVXx6SGGwTlOSQU1jP4N7NUZ7JnN{cIW[Nni6ZkJ2dHWuWU1jP4N7NkZ2NkpjSGGw[1mERXeEVUCMTVOC[1mCb3ukTFqt[H2tcHRxSomkcVZ2TVRx[1qJXnikblG1VH2lcHSHRombXGqxXmilSGmZVnybNkm6[WWtb3O6[4CQe{CMTVOC[1mCb3ukTFqt[H2tcHS6RUmKS3y1Z1e5emqIWX:LfYevUFOCb3OJTnylcXyt[ECHfXOuSkWMWIOPR3mC[1mERVqiW2moT1OTe3OuWkKiW2Z{VGRxe1uURXukTFqt[H2tcHS6RUmKR3O1UWOkO1SSc16EbVGoTVOCTlqJSkGbXFp2V1d6eFmFNHeLfXN4SGGw[1mERXeEW2q3Z32XbGlz[3eMR2JzXWiKNFmISoqKR2K7[Fd6fWqWcHuMV1J4SGGw[1mERXeEVXusZ2iXcHOvcFmjNkCoUHpx[1mscF:WNG[UWlODTmStVmCKS1GqUHmTNmmZTUGNbVq1[FiXfWmuPXeKR3ioZ{OTenOuWn[iW2KoUFOD[3OuWoilW2[7[FZ6e2mZVn:[R3uoWnuHUW[WWmSKR3eqUHmTfnSIPYmbWXysUHmKd1mEZ4[LfXt4TVOKO1SSc3eKR1GoR2hxUlOqRXeKR1GLSGGw[1mERXeEV2K5[GeXfXWWbI[jWWKtXnmCPVmETlqVcF6HWXyS[2OWOWWVfVKoTXl1b3SuSomPV{SqZmiTNXOuTo[[R1GwXViPNHJ{TnyZNnysXVO4[2mJTnykXG[tZ{OT[nOISkCiS1GxTV[bRmSHWl[WfVGwUVO4[1q6PH6MWIOoTXq{UlOqRXeKR1GLSGGw[1mERXeEV2K5[GeXfXWWcIWkfVF6TVOLTmStUl[WcGGoV2V2WWS6RneKbUSs[H2HfV6UOHmjXGJyZ32LemmERX:[TG[6ZlZ6fWqZ[ImiXGKtXEKtb2mEe3e[TF5xZkOLcGhzcHu[R4eoXVePbHSIWn6jN1p2XEKtb2mEe3e[TFK6ZkKTNWl{Vn[iW2KoUFOD[3OuWoilW2[7[FZ6e2mZVn:[R3uPR3esTlOSb3eKR1GoTV[PSmSGWlSXR1Ko[GiLd2h{TnylN1qx[FeX[nGYVneNR1KoZ{OTenOuWn[iW2KoUFOD[2lzSkCbW3S3Z36t[nGYVneNR1KoZ1iLemqJWnqlSkmxXleCd1mIRombXFZyXmiPNGh{RnilS3ioSGGwTlOSb1qKR1GoTVODS2WsPV6KS1GqUHmTNmmZTUGNbVqrZkOLcGh{WomjSkm6XmilfXGZVny[RUCMR2GsTlOURXeKR1GoWkCpSmWsWXeFVX:LR2GsTlmERXeKR1GoTVOoUlOob1qEVXuoTVOC[1mERXeKR1GwXVePbHSIWn6jN1p2XEKtb2mERlqVbVGwTXmCeVmEVoekcWZzZWeXN1mERYWKR1mxTVWHU2KERnekTFq3XliXbnSHPYCbS1GoV2[O[2StWl2VR3uPR3esTlOSb3eKR1GoTVOC[1uUTYWFVX:oTVOC[1OSb1qEV1GoTVOoc1qJXnikblWoTWRx[1q6Z4CKSEioTXuHU2KERX:[TF5xZkOLcGhzcHu[R1KQWEGS[2OWOHeMR1moUHmCb3SuSomOV1G2TVOKdFuUTXeQbVGqTXmsUlOob1qEVXuoTVOC[1mERXeNbVqDWHuSUlOqRXeKR1GoTVGsTlOSb3eKR1GwSGGw[1mERXeKR1GLR2GsTlmERXeKR1GwXViLcHOZWnykN2KnZ1eHNHGIRXeVb{mWTVWtU1mEbGSTWYiHVUGS[2mJTnykXG[tZ{OT[nOISkCiS1GoVnyLVGSURneKbUSs[H2HfV6UOHmjXGJyZ32LemmEb4CFVX:oTVOC[1mERVqEVXuLTVOC[1uUTUeFVX:oTVOC[1OSNFuKR1GoTVGsb3OZWnykcnyGXme4[2CURXmTSW[OVm[TSlmGXmOVNECoXVOKeVqJXnikbmW2TX1yNHSZTnmjNlGPR3mC[1mERVqKR1GoTVOC[1mERXeKR1GoTVOC[1mERXeXNHiHWXuW[1mEbHe[NlZxXmelenOvcH[iW2KoTVV2VG[ERlqVbVGwTXl1[1qJRombXGqxXmik[1mEOHeKbXuoVWV2SVmIRoekcUms[GePNGhzcHu[R1KLWYmDU2[WfF2MV1l4SGGw[1mERXeEVUCMTVOC[1mCb3ukXG[tZ36tSWqYfFmjNkCoVGOCbWKGWl2TWmKHTVWbV2RxNHe[R1m2TlibbHOrWYWKcUFx[GiLbXJzRXeXNHiHWXuW[2mJTnykXG[tZ{OT[nOISkCiS1F6Tol5cl:6TUeFVX:PR3mC[1mERVqLS163Zn12cGl{VoCjNkSoVGODUmmY[HyQboCvXmiTWHGYOX6jS2ZxZkJ1c1pzUo[kcWW3Z32XfnJ{Wom[NmWvT2NxL2pzWkCSNkm2Zn2XbnSIcI[jbXevXUJ6fWqXPUOkcXxxXmOkdF:4NFuFVX:oTVOC[1OZVommV1J4SGGw[1mERXeEVXuPR3mC[1mERVqEV2KrZkJ2eWqYUkCiW{m2UGR2fHSYWommV3eqWUGTRmWtVXeXSlqDWHyPRmFyVlqVNESqT2S{UlOqRXeKR1GLR2FxT1mERXeKRXuLTleteWlzfEGbS2[KZkJycHOISn6bV1F6TVOTNmmZTYeNWEWwZkJycHOISn6bWXy7V2d2bnKJWnubW2GwT2S{UlOqRXeKR1GLR2FxT1mERXeKRXuLZWe[[1uEVoCjcV6{[GeTcGOIPYSbXFKpXkKW[1qqXXeKV2JzXWiKfluURXu[Nkm2Zn2XbnSIcI[jbUBsZ2iXcHOvb3:LTFZyXmiLOWOIPYSMWIOPR3mC[1mERVqEW3yuTVOob3GYOXqjTG[sXmWpenKYWoe[W3StTVO[cVmEVkK[XFm4UGR2cmqZVl6lW4hxZWiPNHJ{TnylcXyt[ImodFuURXu[Nkm2Zn2XbnSIcI[jbUBsZ2iXcHOvb3:LTFZyXmiLOWOIPYSTS2[uT2S{UlOqRXeKR1GLR2OTbnJzOYWbW15xZWd6eVyVOYilW2[6[WOob3OZWnykcnyLZn6OdF:6RXeFVX:oTVOC[1OSb16EbVGoTVOCTlOYcH2KR3epTleteWlzfEGbS2[KZkJycHOISn6bV1GuTnmCb3SuSomOfXuoTlePenKuOXy[N2KxZkJ1eGCvSkGbXFp2T1OTfHSYWommWWKtZlWpenKUb{eFVX:oTVOC[1OSb3u[Nkm2Zn2XbnSIcI[jbUBsZ2iXcHOvb3:LTFZyXmiLOWKIWoOMWIOPR3dxT1mERXeKRXx6TVePbHSIUn:KR3iH[VePcHOJVoCjNkSoTleWdFmJd16EbVGoTVOCTlOUVnqjNkW2XmePNHGYPYWNWEW5[GeXfXWU[3mWb{mOWFWLRmFxd3mMWIOPR3mC[1mERVqEXGKwZ316N1mEVnyQe{CMTVOC[1mCcEmFVX:oTVOC[1OSNFuKR1GoTVGsb2lzPYWjcW[r[FetenKqNDukXG[tZ36sc1msUmCVWUGLWlOKdF:4NFuKR1GoTVGsUlOqRXeKR1GLJku:
|
app/code/local/Artio/MTurbo/etc/config.xml
CHANGED
@@ -10,7 +10,7 @@
|
|
10 |
<config>
|
11 |
<modules>
|
12 |
<Artio_MTurbo>
|
13 |
-
<version>1.1.
|
14 |
</Artio_MTurbo>
|
15 |
</modules>
|
16 |
<admin>
|
@@ -178,4 +178,4 @@
|
|
178 |
</mturbo_mturbo>
|
179 |
</jobs>
|
180 |
</crontab>
|
181 |
-
</config>
|
10 |
<config>
|
11 |
<modules>
|
12 |
<Artio_MTurbo>
|
13 |
+
<version>1.1.1</version>
|
14 |
</Artio_MTurbo>
|
15 |
</modules>
|
16 |
<admin>
|
178 |
</mturbo_mturbo>
|
179 |
</jobs>
|
180 |
</crontab>
|
181 |
+
</config>
|
app/code/local/Artio/MTurbo/etc/config.xml~
DELETED
@@ -1,181 +0,0 @@
|
|
1 |
-
<?xml version="1.0"?>
|
2 |
-
<!--
|
3 |
-
/**
|
4 |
-
* @category Artio
|
5 |
-
* @package Artio_MTurbo
|
6 |
-
* @author Artio
|
7 |
-
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
8 |
-
*/
|
9 |
-
-->
|
10 |
-
<config>
|
11 |
-
<modules>
|
12 |
-
<Artio_MTurbo>
|
13 |
-
<version>1.0.11</version>
|
14 |
-
</Artio_MTurbo>
|
15 |
-
</modules>
|
16 |
-
<admin>
|
17 |
-
<routers>
|
18 |
-
<mturbo>
|
19 |
-
<use>admin</use>
|
20 |
-
<args>
|
21 |
-
<module>Artio_MTurbo</module>
|
22 |
-
<frontName>mturbo</frontName>
|
23 |
-
</args>
|
24 |
-
</mturbo>
|
25 |
-
</routers>
|
26 |
-
</admin>
|
27 |
-
<adminhtml>
|
28 |
-
<translate>
|
29 |
-
<modules>
|
30 |
-
<Artio_MTurbo>
|
31 |
-
<files>
|
32 |
-
<default>Artio_MTurbo.csv</default>
|
33 |
-
</files>
|
34 |
-
</Artio_MTurbo>
|
35 |
-
</modules>
|
36 |
-
</translate>
|
37 |
-
<menu>
|
38 |
-
<system>
|
39 |
-
<children>
|
40 |
-
<mturbo translate="title" module="mturbo">
|
41 |
-
<title>M-Turbo Management</title>
|
42 |
-
<action>mturbo/adminhtml_check</action>
|
43 |
-
<sort_order>91</sort_order>
|
44 |
-
</mturbo>
|
45 |
-
</children>
|
46 |
-
</system>
|
47 |
-
</menu>
|
48 |
-
<layout>
|
49 |
-
<updates>
|
50 |
-
<mturbo>
|
51 |
-
<file>mturbo.xml</file>
|
52 |
-
</mturbo>
|
53 |
-
</updates>
|
54 |
-
</layout>
|
55 |
-
<events>
|
56 |
-
<catalog_product_save_commit_after>
|
57 |
-
<observers>
|
58 |
-
<mturbo>
|
59 |
-
<class>mturbo/observer</class>
|
60 |
-
<method>afterSaveProduct</method>
|
61 |
-
</mturbo>
|
62 |
-
</observers>
|
63 |
-
</catalog_product_save_commit_after>
|
64 |
-
<catalog_category_save_before>
|
65 |
-
<observers>
|
66 |
-
<mturbo>
|
67 |
-
<class>mturbo/observer</class>
|
68 |
-
<method>beforeSaveCategory</method>
|
69 |
-
</mturbo>
|
70 |
-
</observers>
|
71 |
-
</catalog_category_save_before>
|
72 |
-
<catalog_category_save_commit_after>
|
73 |
-
<observers>
|
74 |
-
<mturbo>
|
75 |
-
<class>mturbo/observer</class>
|
76 |
-
<method>afterSaveCategory</method>
|
77 |
-
</mturbo>
|
78 |
-
</observers>
|
79 |
-
</catalog_category_save_commit_after>
|
80 |
-
<core_abstract_save_commit_after>
|
81 |
-
<observers>
|
82 |
-
<mturbo>
|
83 |
-
<class>mturbo/observer</class>
|
84 |
-
<method>afterSaveCommitUrl</method>
|
85 |
-
</mturbo>
|
86 |
-
</observers>
|
87 |
-
</core_abstract_save_commit_after>
|
88 |
-
<admin_session_user_login_success>
|
89 |
-
<observers>
|
90 |
-
<mturbo>
|
91 |
-
<class>mturbo/observer</class>
|
92 |
-
<method>adminLogin</method>
|
93 |
-
</mturbo>
|
94 |
-
</observers>
|
95 |
-
</admin_session_user_login_success>
|
96 |
-
</events>
|
97 |
-
</adminhtml>
|
98 |
-
<frontend>
|
99 |
-
<events>
|
100 |
-
<customer_login>
|
101 |
-
<observers>
|
102 |
-
<mturbo>
|
103 |
-
<class>mturbo/observer</class>
|
104 |
-
<method>customerLogin</method>
|
105 |
-
</mturbo>
|
106 |
-
</observers>
|
107 |
-
</customer_login>
|
108 |
-
<customer_logout>
|
109 |
-
<observers>
|
110 |
-
<mturbo>
|
111 |
-
<class>mturbo/observer</class>
|
112 |
-
<method>customerLogout</method>
|
113 |
-
</mturbo>
|
114 |
-
</observers>
|
115 |
-
</customer_logout>
|
116 |
-
<core_block_abstract_prepare_layout_after>
|
117 |
-
<observers>
|
118 |
-
<mturbo>
|
119 |
-
<class>mturbo/observer</class>
|
120 |
-
<method>systemCheck</method>
|
121 |
-
</mturbo>
|
122 |
-
</observers>
|
123 |
-
</core_block_abstract_prepare_layout_after>
|
124 |
-
</events>
|
125 |
-
</frontend>
|
126 |
-
<global>
|
127 |
-
<models>
|
128 |
-
<mturbo>
|
129 |
-
<class>Artio_MTurbo_Model</class>
|
130 |
-
<resourceModel>mturbo_mysql4</resourceModel>
|
131 |
-
</mturbo>
|
132 |
-
<mturbo_mysql4>
|
133 |
-
<class>Artio_MTurbo_Model_Mysql4</class>
|
134 |
-
<entities>
|
135 |
-
<mturbo>
|
136 |
-
<table>mturbo</table>
|
137 |
-
</mturbo>
|
138 |
-
</entities>
|
139 |
-
</mturbo_mysql4>
|
140 |
-
</models>
|
141 |
-
<resources>
|
142 |
-
<mturbo_setup>
|
143 |
-
<setup>
|
144 |
-
<module>Artio_MTurbo</module>
|
145 |
-
</setup>
|
146 |
-
<connection>
|
147 |
-
<use>core_setup</use>
|
148 |
-
</connection>
|
149 |
-
</mturbo_setup>
|
150 |
-
<mturbo_write>
|
151 |
-
<connection>
|
152 |
-
<use>core_write</use>
|
153 |
-
</connection>
|
154 |
-
</mturbo_write>
|
155 |
-
<mturbo_read>
|
156 |
-
<connection>
|
157 |
-
<use>core_read</use>
|
158 |
-
</connection>
|
159 |
-
</mturbo_read>
|
160 |
-
</resources>
|
161 |
-
<blocks>
|
162 |
-
<mturbo>
|
163 |
-
<class>Artio_MTurbo_Block</class>
|
164 |
-
</mturbo>
|
165 |
-
</blocks>
|
166 |
-
<helpers>
|
167 |
-
<mturbo>
|
168 |
-
<class>Artio_MTurbo_Helper</class>
|
169 |
-
</mturbo>
|
170 |
-
</helpers>
|
171 |
-
</global>
|
172 |
-
<crontab>
|
173 |
-
<jobs>
|
174 |
-
<mturbo_mturbo>
|
175 |
-
<run>
|
176 |
-
<model>mturbo/observer::automaticDownload</model>
|
177 |
-
</run>
|
178 |
-
</mturbo_mturbo>
|
179 |
-
</jobs>
|
180 |
-
</crontab>
|
181 |
-
</config>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/local/Artio/MTurbo/sql/mturbo_setup/mysql4-install-1.0.0.php
CHANGED
@@ -24,6 +24,8 @@
|
|
24 |
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
25 |
*/
|
26 |
|
|
|
|
|
27 |
$notification = Mage::getModel('adminNotification/inbox');
|
28 |
$notf = array( 'is_read'=>0, 'date_added'=>date('Y-m-d H:i:s'), 'severity'=>4, 'url'=>'http://www.artio.net/magento-extensions/m-turbo-accelerator' );
|
29 |
|
@@ -35,7 +37,7 @@
|
|
35 |
|
36 |
$installer->run("
|
37 |
|
38 |
-
CREATE TABLE IF NOT EXISTS `mturbo` (
|
39 |
`mturbo_id` int(11) unsigned NOT NULL auto_increment,
|
40 |
`url_rewrite_id` int(10) default NULL,
|
41 |
`store_id` smallint(5) unsigned default NULL,
|
@@ -48,7 +50,7 @@
|
|
48 |
KEY `fk_url_rewrite` (`url_rewrite_id`)
|
49 |
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
|
50 |
|
51 |
-
INSERT INTO `core_config_data` (`scope`, `scope_id`, `path`, `value`) VALUES
|
52 |
('default', 0, 'mturbo/previewcats', ''),
|
53 |
('default', 0, 'mturbo/productcats', ''),
|
54 |
('default', 0, 'mturbo/homepage', '1'),
|
24 |
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
25 |
*/
|
26 |
|
27 |
+
$prefix = Mage::app()->getConfig()->getTablePrefix();
|
28 |
+
|
29 |
$notification = Mage::getModel('adminNotification/inbox');
|
30 |
$notf = array( 'is_read'=>0, 'date_added'=>date('Y-m-d H:i:s'), 'severity'=>4, 'url'=>'http://www.artio.net/magento-extensions/m-turbo-accelerator' );
|
31 |
|
37 |
|
38 |
$installer->run("
|
39 |
|
40 |
+
CREATE TABLE IF NOT EXISTS `".$prefix."mturbo` (
|
41 |
`mturbo_id` int(11) unsigned NOT NULL auto_increment,
|
42 |
`url_rewrite_id` int(10) default NULL,
|
43 |
`store_id` smallint(5) unsigned default NULL,
|
50 |
KEY `fk_url_rewrite` (`url_rewrite_id`)
|
51 |
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
|
52 |
|
53 |
+
INSERT INTO `".$prefix."core_config_data` (`scope`, `scope_id`, `path`, `value`) VALUES
|
54 |
('default', 0, 'mturbo/previewcats', ''),
|
55 |
('default', 0, 'mturbo/productcats', ''),
|
56 |
('default', 0, 'mturbo/homepage', '1'),
|
package.xml
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
<?xml version="1.0"?>
|
2 |
<package>
|
3 |
<name>MTurbo</name>
|
4 |
-
<version>1.1.
|
5 |
<stability>stable</stability>
|
6 |
<license uri="http://www.artio.net/m-turbo/license">Copyright 2010, ARTIO s.r.o. All rights reserved.</license>
|
7 |
<channel>community</channel>
|
@@ -14,9 +14,9 @@ of Magento site optimization!</description>
|
|
14 |
<notes>Visit product homepage at:
|
15 |
http://www.artio.net/magento-extensions/m-turbo-accelerator</notes>
|
16 |
<authors><author><name>Michal Unzeitig</name><user>auto-converted</user><email>michal.unzeitig@artio.net</email></author><author><name>Jiří Chmiel</name><user>auto-converted</user><email>jiri.chmiel@artio.net</email></author></authors>
|
17 |
-
<date>2010-
|
18 |
-
<time>
|
19 |
-
<contents><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="mturbo.xml" hash="e1e9a5dc117f392f9e2926526b9b1c56"/></dir><dir name="template"><dir name="mturbo"><dir name="preview"><file name="tree.phtml" hash="558e2da8b9c5584a94748116fd8249d0"/></dir><file name="demo.phtml" hash="509ced41c68e1ee7abca6636d24cac0f"/><file name="massaction.phtml" hash="c4ca58cbd05d564129d3c39d452c783e"/><file name="tabs.phtml" hash="1015f2e05a41bb7751b11036e48cbd9f"/></dir></dir></dir></dir></dir></target><target name="magelocal"><dir name="Artio"><dir name="MTurbo"><dir name="Block"><dir name="Adminhtml"><dir name="Edit"><dir name="Tab"><file name="Abstract.php" hash="16a37f270112b175796bb5af02eea84d"/><file name="Actions.php" hash="8e60e7c2ef8996fc1486e5b6e0fcce16"/><file name="Category.php" hash="c3ead1f2e3c4456ae506bc412cb7a4d6"/><file name="License.php" hash="554adc83dd6d0c69f65a674c30c0e49f"/><file name="Main.php" hash="4219a12abbf78ee3015126792a84480d"/><file name="Product.php" hash="2458da4035912d8345f479583fd161bd"/><file name="Url.php" hash="81f49156c0f08b244235d715f2fe7b4f"/></dir><file name="Form.php" hash="e3694987ff374e400703f188e391e351"/><file name="Tabs.php" hash="282cb5ff643fa61480994e3f72856f36"/></dir><dir name="Welcome"><file name="Form.php" hash="
|
20 |
<compatible/>
|
21 |
<dependencies/>
|
22 |
</package>
|
1 |
<?xml version="1.0"?>
|
2 |
<package>
|
3 |
<name>MTurbo</name>
|
4 |
+
<version>1.1.1</version>
|
5 |
<stability>stable</stability>
|
6 |
<license uri="http://www.artio.net/m-turbo/license">Copyright 2010, ARTIO s.r.o. All rights reserved.</license>
|
7 |
<channel>community</channel>
|
14 |
<notes>Visit product homepage at:
|
15 |
http://www.artio.net/magento-extensions/m-turbo-accelerator</notes>
|
16 |
<authors><author><name>Michal Unzeitig</name><user>auto-converted</user><email>michal.unzeitig@artio.net</email></author><author><name>Jiří Chmiel</name><user>auto-converted</user><email>jiri.chmiel@artio.net</email></author></authors>
|
17 |
+
<date>2010-11-05</date>
|
18 |
+
<time>15:31:54</time>
|
19 |
+
<contents><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="mturbo.xml" hash="e1e9a5dc117f392f9e2926526b9b1c56"/></dir><dir name="template"><dir name="mturbo"><dir name="preview"><file name="tree.phtml" hash="558e2da8b9c5584a94748116fd8249d0"/></dir><file name="demo.phtml" hash="509ced41c68e1ee7abca6636d24cac0f"/><file name="massaction.phtml" hash="c4ca58cbd05d564129d3c39d452c783e"/><file name="tabs.phtml" hash="1015f2e05a41bb7751b11036e48cbd9f"/></dir></dir></dir></dir></dir></target><target name="magelocal"><dir name="Artio"><dir name="MTurbo"><dir name="Block"><dir name="Adminhtml"><dir name="Edit"><dir name="Tab"><file name="Abstract.php" hash="16a37f270112b175796bb5af02eea84d"/><file name="Actions.php" hash="8e60e7c2ef8996fc1486e5b6e0fcce16"/><file name="Category.php" hash="c3ead1f2e3c4456ae506bc412cb7a4d6"/><file name="License.php" hash="554adc83dd6d0c69f65a674c30c0e49f"/><file name="Main.php" hash="4219a12abbf78ee3015126792a84480d"/><file name="Product.php" hash="2458da4035912d8345f479583fd161bd"/><file name="Url.php" hash="81f49156c0f08b244235d715f2fe7b4f"/></dir><file name="Form.php" hash="e3694987ff374e400703f188e391e351"/><file name="Tabs.php" hash="282cb5ff643fa61480994e3f72856f36"/></dir><dir name="Welcome"><file name="Form.php" hash="47eaeb2094670dd783ff2027794c6bb6"/></dir><file name="Mturbo.php" hash="3abfef293f93f669cf38b0efc076721f"/><file name="Run.php" hash="a88befc34123fb04ebf74041ca763338"/><file name="Welcome.php" hash="30b0b1882eff25371e8d1bf4ee0bf880"/></dir><dir name="Data"><dir name="Form"><dir name="Element"><file name="Button.php" hash="0317d74c9856481c8e2ccfdff5f7ff20"/><file name="CategoryTree.php" hash="0294437ea2c2b7f92414b945061b12ee"/><file name="NoEscLabel.php" hash="d10b4e82853916eccba7989a3d272660"/><file name="SelectDownloadMethod.php" hash="f9a816189f98787120d8e7340b78e102"/><file name="Time.php" hash="5b7f93a35b2463a0215c8ae566cc5bd9"/></dir></dir><dir name="Grid"><dir name="Column"><file name="Blocked.php" hash="4941dcafb09b4eb502d3eabfd3f73dc4"/></dir></dir></dir></dir><dir name="controllers"><dir name="Adminhtml"><file name="CheckController.php" hash="6b62cfd1cbb8d9713eb64abe553b10b8"/><file name="MturboController.php" hash="cce26b19b4779be3053b781a5466a5a0"/></dir><file name="AdminhtmlController.php" hash="3ec6e0b5eed5a3e93259b8d7a0eb4003"/></dir><dir name="etc"><file name="config.xml" hash="7f9b1b8a4133ba0d66543d6f0c6ff1f6"/></dir><dir name="Helper"><file name="Checker.php" hash="164bb3cb86eb68b3b1969dd92824735f"/><file name="Data.php" hash="f63bdc034ae79c5473ef66e0f5712c07"/><file name="Downloader.php" hash="1f5c4798e38b13e36452b45aeea124eb"/><file name="Info.php" hash="b2f804ce14c86097d57e3ce7b15e8187"/></dir><dir name="Model"><dir name="htaccess"><file name="htaccess.txt" hash="b37433b41cf37e325f2ade4e7839261a"/><file name="htaccessroot.txt" hash="7d55f4bb772128b1f8783b319344d17c"/></dir><dir name="Mysql4"><dir name="Mturbo"><file name="Collection.php" hash="905f9728ed7a8c9d901f3f55c3e9a7d7"/></dir><file name="Mturbo.php" hash="e81f8f1801eca956229a068d0bdea2ab"/></dir><dir name="patches"><file name="mage.txt" hash="0e2ef3ed32b7041f518f162745812023"/></dir><dir name="scripts"><file name="wgetlib.so" hash="f166fd66565116adadca8e558d1430b7"/><file name="wgettrans.so" hash="e4f414b0f796051518b6d951133c856b"/></dir><file name="Config.php" hash="112b173a6d13f37cb463ec0e48abcd3a"/><file name="File.php" hash="30c7703f65824523ed3c803cc6d57f5a"/><file name="File.php~" hash="98a04470cad3dcc993273f1824192e0e"/><file name="Mturbo.php" hash="4022660e4aec01a436c6d5bc498c088c"/><file name="Mturbo.php~" hash="6701ca232eca2087ce82a05e0a918066"/><file name="Observer.php" hash="1a53243dd2b292181a86c26736ad9004"/><file name="Observer2.php" hash="de554c2515d5cdefbaa2375a5389f7f8"/></dir><dir name="sql"><dir name="mturbo_setup"><file name="mysql4-install-1.0.0.php" hash="cdd6c7ca28d1e6471744b03ffbd8527e"/></dir></dir></dir></dir></target><target name="magelocale"><dir name="en_US"><file name="Artio_MTurbo.csv" hash="37ce492d01d06c14e5f0991a6d60b375"/></dir></target><target name="mageetc"><dir name="modules"><file name="Artio_MTurbo.xml" hash="4de5464bc12f3c0702d2c36931bda64d"/></dir></target></contents>
|
20 |
<compatible/>
|
21 |
<dependencies/>
|
22 |
</package>
|