LiteSpeed_LiteMage - Version 1.0.18

Version Notes

License changed from LiteSpeed proprietary to GPLv3.

Download this release

Release Info

Developer LiteSpeed Technologies
Extension LiteSpeed_LiteMage
Version 1.0.18
Comparing to
See all releases


Code changes from version 1.0.17 to 1.0.18

Files changed (30) hide show
  1. app/code/community/Litespeed/Litemage/Block/Adminhtml/Cache/Management.php +74 -34
  2. app/code/community/Litespeed/Litemage/Block/Core/Esi.php +74 -47
  3. app/code/community/Litespeed/Litemage/Block/Core/Messages.php +344 -164
  4. app/code/community/Litespeed/Litemage/Block/Inject/Jsvar.php +23 -5
  5. app/code/community/Litespeed/Litemage/Block/Inject/Nickname.php +22 -4
  6. app/code/community/Litespeed/Litemage/Helper/Data.php +516 -317
  7. app/code/community/Litespeed/Litemage/Helper/Esi.php +596 -322
  8. app/code/community/Litespeed/Litemage/Helper/Viewvary.php +109 -48
  9. app/code/community/Litespeed/Litemage/Model/Config/Source/CustomerGroup.php +22 -4
  10. app/code/community/Litespeed/Litemage/Model/Config/Source/EnableWarmUp.php +22 -4
  11. app/code/community/Litespeed/Litemage/Model/Layout.php +121 -57
  12. app/code/community/Litespeed/Litemage/Model/Layout/Update.php +215 -113
  13. app/code/community/Litespeed/Litemage/Model/Observer/Cron.php +786 -436
  14. app/code/community/Litespeed/Litemage/Model/Observer/Esi.php +670 -360
  15. app/code/community/Litespeed/Litemage/Model/Observer/Purge.php +290 -170
  16. app/code/community/Litespeed/Litemage/Model/Session.php +66 -33
  17. app/code/community/Litespeed/Litemage/Model/Translate.php +20 -4
  18. app/code/community/Litespeed/Litemage/controllers/AdminController.php +108 -55
  19. app/code/community/Litespeed/Litemage/controllers/Adminhtml/LitemageCacheController.php +66 -38
  20. app/code/community/Litespeed/Litemage/controllers/EsiController.php +763 -411
  21. app/code/community/Litespeed/Litemage/etc/config.xml +25 -1
  22. app/code/community/Litespeed/Litemage/etc/config.xml.dev +506 -0
  23. app/code/community/Litespeed/Litemage/etc/config.xml.package +505 -0
  24. app/code/community/Litespeed/Litemage/etc/system.xml +22 -5
  25. app/design/adminhtml/default/default/layout/litemage.xml +25 -0
  26. app/design/adminhtml/default/default/template/litemage/cache_management.phtml +144 -88
  27. app/design/frontend/base/default/layout/litemage.xml +22 -2
  28. app/design/frontend/base/default/template/litemage/inject/jsvar.phtml +22 -3
  29. app/etc/modules/Litespeed_Litemage.xml +22 -2
  30. package.xml +7 -10
app/code/community/Litespeed/Litemage/Block/Adminhtml/Cache/Management.php CHANGED
@@ -1,34 +1,74 @@
1
- <?php //0046a
2
- if(!extension_loaded('ionCube Loader')){$__oc=strtolower(substr(php_uname(),0,3));$__ln='ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');if(function_exists('dl')){@dl($__ln);}if(function_exists('_il_exec')){return _il_exec();}$__ln='/ioncube/'.$__ln;$__oid=$__id=realpath(ini_get('extension_dir'));$__here=dirname(__FILE__);if(strlen($__id)>1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file <b>'.__FILE__.'</b> requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the <a href="http://www.ioncube.com/lw/">ionCube Loader Wizard</a> to assist with installation.');exit(199);
3
- ?>
4
- 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
- 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
- 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
- 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
- 1UZoEVX1oh/v6/8iJhOERuAiqBwsDSZk/D7HJP1zz8y83+HGLC2BNizuBsA6wOPk55M4+4R/P2PH
9
- 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
- Q7Ko6XpWAySZbplyRS0YjFVm5+LHTT9+KkJgf3qKzDsWEkqNMyuxCVf0QQTBhcnoZMwEgzgoQuQu
11
- RfCIRdRBO/zoODEoIdJUjHAxe+yZBfB2gIpRjCV8eKN/WhBPDUiSfT/oHKGzS8/AlmEkG/Jbn0QZ
12
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- BffRKH6xb4GPnWLD4zZ1ETvCg0w/7TxNHkVo+Qp5JZrbtbXevcY/aQ+qQvrggcUUkpSzuP9YkRvA
26
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * LiteMage
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This program is free software: you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License as published by
10
+ * the Free Software Foundation, either version 3 of the License, or
11
+ * (at your option) any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ * GNU General Public License for more details.
17
+ *
18
+ * You should have received a copy of the GNU General Public License
19
+ * along with this program. If not, see https://opensource.org/licenses/GPL-3.0 .
20
+ *
21
+ * @package LiteSpeed_LiteMage
22
+ * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
23
+ * @license https://opensource.org/licenses/GPL-3.0
24
+ */
25
+
26
+
27
+ class Litespeed_Litemage_Block_Adminhtml_Cache_Management extends Mage_Adminhtml_Block_Template
28
+ {
29
+ /**
30
+ * Get clean cache url
31
+ *
32
+ * @return string
33
+ */
34
+ public function getPurgeUrl($type)
35
+ {
36
+ if ($type == 'Refresh') {
37
+ return $this->getUrl('*/cache/index');
38
+ }
39
+ else {
40
+ $types = array('All', 'Tag', 'Url');
41
+
42
+ if (in_array($type, $types)) {
43
+ return $this->getUrl('*/litemageCache/purge' . $type);
44
+ }
45
+ else {
46
+ return $this->getUrl('*/litemageCache/purgeAll');
47
+ }
48
+ }
49
+ }
50
+
51
+ public function getCrawlerStatus()
52
+ {
53
+ $status = Mage::getModel( 'litemage/observer_cron' )->getCrawlerStatus();
54
+ $status['url_reset'] = $this->getUrl('*/litemageCache/resetCrawlerList');
55
+ $status['url_details'] = $this->getUrl('*/litemageCache/getCrawlerList');
56
+ return $status;
57
+ }
58
+
59
+ /**
60
+ * Check if block can be displayed
61
+ *
62
+ * @return bool
63
+ */
64
+ public function canShowButton()
65
+ {
66
+ return Mage::helper('litemage/data')->moduleEnabled();
67
+ }
68
+
69
+ public function isCacheAvailable()
70
+ {
71
+ return Mage::app()->useCache('layout') && Mage::app()->useCache('config');
72
+ }
73
+
74
+ }
app/code/community/Litespeed/Litemage/Block/Core/Esi.php CHANGED
@@ -1,47 +1,74 @@
1
- <?php //0046a
2
- if(!extension_loaded('ionCube Loader')){$__oc=strtolower(substr(php_uname(),0,3));$__ln='ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');if(function_exists('dl')){@dl($__ln);}if(function_exists('_il_exec')){return _il_exec();}$__ln='/ioncube/'.$__ln;$__oid=$__id=realpath(ini_get('extension_dir'));$__here=dirname(__FILE__);if(strlen($__id)>1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file <b>'.__FILE__.'</b> requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the <a href="http://www.ioncube.com/lw/">ionCube Loader Wizard</a> to assist with installation.');exit(199);
3
- ?>
4
- HR+cPnHTsuZ1ep+lYEzEgwTzpvZkoL8p4pUflUwMViTx7fsoebWGEjtM4mOL0ytJ1abof6Gc0LXa
5
- yoEUPG17VerEVU10PmjV/xlQDaPS2tmFLSAtOCuLVZZVGmCzAiwQCdNLqQ5uu37EKCV/Hr0iD9VJ
6
- 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
- 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
- kDAr/GmODD+OWrCt0wnNfP1u3+ADw59F//cDUpFUjpb+ajQqSdLwDym7zbmNn0ABsnWiaXFLVGZP
9
- 9ixM2enw/kyLZOQ8jG259zhXZ5N9vN2DhMuCL+Ry+STJlRNU+zZR9S2nbEyJVedmK+jsGcaF08wK
10
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * LiteMage
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This program is free software: you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation, either version 3 of the License, or
10
+ * (at your option) any later version.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License
18
+ * along with this program. If not, see https://opensource.org/licenses/GPL-3.0 .
19
+ *
20
+ * @package LiteSpeed_LiteMage
21
+ * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
22
+ * @license https://opensource.org/licenses/GPL-3.0
23
+ */
24
+
25
+
26
+ class Litespeed_Litemage_Block_Core_Esi extends Mage_Core_Block_Abstract
27
+ {
28
+ public function initByPeer( $peer, $esiHtml )
29
+ {
30
+ $this->setData('esiHtml', $esiHtml) ;
31
+ $peer->setData('litemageInjected', 1);
32
+
33
+ $this->_layout = $peer->_layout;
34
+ $this->_nameInLayout = $peer->_nameInLayout ;
35
+ $this->_alias = $peer->_alias;
36
+ $parent = $peer->getParentBlock();
37
+ if ($parent != null) {
38
+ $parent->setChild($peer->_alias, $this) ;
39
+ }
40
+ $this->_layout->setBlock($this->_nameInLayout, $this) ;
41
+
42
+ if (!$this->hasData('valueonly') && Mage::registry('LITEMAGE_SHOWHOLES')) {
43
+ $tip = 'LiteMage ESI block ' . $this->_nameInLayout;
44
+ $wrapperBegin = '<div style="position:relative;border:1px dotted red;background-color:rgba(198,245,174,0.3);margin:2px;padding:18px 2px 2px 2px;zoom:1;" title="' . $tip
45
+ . '"><div style="position: absolute; left: 0px; top: 0px; padding: 2px 5px; color: white; font-style: normal; font-variant: normal; font-weight: normal; font-size: 11px; line-height: normal; font-family: Arial; z-index: 998; text-align: left !important; background: rgba(0,100,0,0.5);">' . $tip . '</div>';
46
+ $this->setData('lmwrapperBegin', $wrapperBegin);
47
+ $this->setData('lmwrapperEnd', '</div>');
48
+ }
49
+
50
+ }
51
+
52
+ protected function _loadCache()
53
+ {
54
+ if ($this->hasData('esiHtml')) {
55
+ $esiHtml = $this->getData('esiHtml');
56
+ Mage::helper('litemage/data')->debugMesg('Injected ESI block ' . $this->_nameInLayout . ' ' . $esiHtml) ;
57
+
58
+ if (!$this->hasData('valueonly') && Mage::registry('LITEMAGE_SHOWHOLES'))
59
+ return $this->getData('lmwrapperBegin') . $esiHtml . $this->getData('lmwrapperEnd') ;
60
+ else {
61
+ return $esiHtml;
62
+ }
63
+ }
64
+ else {
65
+ return false;
66
+ }
67
+ }
68
+
69
+ protected function _saveCache($data)
70
+ {
71
+ return false;
72
+ }
73
+
74
+ }
app/code/community/Litespeed/Litemage/Block/Core/Messages.php CHANGED
@@ -1,164 +1,344 @@
1
- <?php //0046a
2
- if(!extension_loaded('ionCube Loader')){$__oc=strtolower(substr(php_uname(),0,3));$__ln='ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');if(function_exists('dl')){@dl($__ln);}if(function_exists('_il_exec')){return _il_exec();}$__ln='/ioncube/'.$__ln;$__oid=$__id=realpath(ini_get('extension_dir'));$__here=dirname(__FILE__);if(strlen($__id)>1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file <b>'.__FILE__.'</b> requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the <a href="http://www.ioncube.com/lw/">ionCube Loader Wizard</a> to assist with installation.');exit(199);
3
- ?>
4
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- NtebJmUUER+u77YrSP3R30uqC8pDuJ591q0Ng+BPRThqDE76GMLxVk9KVBYmYN9VLTg65utJRQcr
17
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- mJsDNQi3Rxu0C0Vw9RazZfwECcdbVELS+zQV6Tfztm4MEx4htonsOQSNSCkmP2kZAJU/pqD/bygu
51
- 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
- 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
- cUrQKnh4sVEmG0IHEOgMpaT3dS1XGMMfXhUokMqj/Ck4bd8eaoTwMdapvKmjk0sUjLoPi/Kpg0Pu
54
- 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
- taWVc7GSj+4bbcbJ77jI3myJVrFiFzpeMnv29rP750vIQcxdCQy4qN7p9stc/buspZWV+aFa5THX
56
- 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
- 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
- 6q7v3Lxzqvd9JVoD2oJkAr8uEHWvtEtjSEjPb3fKgma1hynGdbM65x+p1Fd/ogwyMhoBGGlQ5pwM
59
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- qUjK40Quxv183bOE44GFMKkqYF4BG427ZWcbyfU28JYh7HSBLNvxH3rgLirQSFYZs/VDdLciqEwW
70
- Hq8vcreM+kmnyXQRsmbT5fd55Z27DyIpaH8ML8La39JxB1xPcMkv92iI0lam5fsEWUtri91BIHfg
71
- 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
- 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
- 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
- LmPXRNRMavCoBPaQU0+YdTxM7TF8jBBbKsu+jUVrC/dsEj3+O+x8zjfevnyT+i45KxsMJ2NlqHeV
75
- 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
- mFhvMjpBwUsgzoknDyReyahE97+E+fQC5amRAAqaO9g5SYcb8n8R7D9DMetleve127QTWb7tosC4
77
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- a4llYJczmZkH9iPq72QzbLK2T04il0K+hhg8OZFJkd/w5aPzC/WzMmbBtWHZvvDR2BVSjDD6Wfa7
106
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- dC6A3y7ACY6so5SEymm0SXHkWFUfPD8qbeMkvNHAjWsMXeFmWqS8KRj/Jhs7bZeop8qogUxM3hop
115
- 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
- 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
- 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
- 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
- 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
- 72sZUK/LLaiYWhPb3XFsPK0N8TvlHbQRS9ZWnNjQCShN6iOdab99QM+fEiNhJNNbhdHI/ZP8h/Xh
121
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- Oj1Xp7muJq4FUy/AG53213c7Hkmvx1Z0YCSQkqJ5D64vWrFWxXQunEMOrPl+UIi6/6N2KghOT833
140
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- HyCIVsxnZtla3M3YMq7fa1cIutGBK8VkfSapJd7SOssvdszaXJxIGO1pG+lrwyYMfO293YNea4Nb
152
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * LiteMage
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This program is free software: you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation, either version 3 of the License, or
10
+ * (at your option) any later version.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License
18
+ * along with this program. If not, see https://opensource.org/licenses/GPL-3.0 .
19
+ *
20
+ * @package LiteSpeed_LiteMage
21
+ * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
22
+ * @license https://opensource.org/licenses/GPL-3.0
23
+ */
24
+
25
+
26
+ class Litespeed_Litemage_Block_Core_Messages extends Mage_Core_Block_Messages
27
+ {
28
+
29
+ protected $_isEsiInject = false ;
30
+ protected $_hasSaved = false ;
31
+ protected $_outputCall ;
32
+
33
+ /*Override Mage_Core_Block_Abstract:getMessagesBlock */
34
+ public function getMessagesBlock()
35
+ {
36
+ return $this;
37
+ }
38
+
39
+ public function initByPeer( $peer, $esiHtml )
40
+ {
41
+ $this->_isEsiInject = true ;
42
+ $this->setData('esiHtml', $esiHtml) ;
43
+ $peer->setData('litemageInjected', 1);
44
+ $this->_layout = $peer->_layout;
45
+ if ( $peer instanceof Mage_Core_Block_Messages ) {
46
+ $this->_messagesBlock = $peer ;
47
+ }
48
+ else {
49
+ $this->_messagesBlock = $this->_layout->getMessagesBlock();
50
+ }
51
+ $this->_nameInLayout = $peer->_nameInLayout ;
52
+ $this->_alias = $peer->_alias;
53
+ $parent = $peer->getParentBlock();
54
+ if ($parent != null) {
55
+ $parent->setChild($peer->_alias, $this) ;
56
+ }
57
+ $this->_layout->setBlock($this->_nameInLayout, $this) ;
58
+
59
+ if (Mage::registry('LITEMAGE_SHOWHOLES')) {
60
+ $tip = 'LiteMage ESI message block ' . $this->_nameInLayout;
61
+ $wrapperBegin = '<div style="position:relative;border:1px dotted red;background-color:rgba(255,255,0,0.3);margin:2px;padding:18px 2px 2px 2px;zoom:1;" title="' . $tip
62
+ . '"><div style="position: absolute; left: 0px; top: 0px; padding: 2px 5px; color: green; font-style: normal; font-variant: normal; font-weight: normal; font-size: 11px; line-height: normal; font-family: Arial; z-index: 998; text-align: left !important;">' . $tip . '</div>';
63
+
64
+ $this->setData('lmwrapperBegin', $wrapperBegin);
65
+ $this->setData('lmwrapperEnd', '</div>');
66
+ }
67
+ }
68
+
69
+ public function initByEsi( $storageNames, $outputCall, $peer )
70
+ {
71
+ $this->_layout = $peer->_layout;
72
+ if ( $peer instanceof Mage_Core_Block_Messages ) {
73
+ $this->_messagesBlock = $peer ;
74
+ }
75
+ else {
76
+ $this->_messagesBlock = $this->_layout->getMessagesBlock();
77
+ if ($tmpl = $peer->getTemplate()) {
78
+ $this->setTemplate($tmpl);
79
+ }
80
+ }
81
+
82
+ $this->_usedStorageTypes = $storageNames ;
83
+ $this->_nameInLayout = $peer->getNameInLayout() ;
84
+ $this->_outputCall = $outputCall ;
85
+ $this->_alias = $peer->_alias;
86
+ $parent = $peer->getParentBlock();
87
+ if ($parent != null) {
88
+ $parent->setChild($peer->_alias, $this) ;
89
+ }
90
+ $this->_layout->setBlock($this->_nameInLayout, $this) ;
91
+ }
92
+
93
+ public function renderView()
94
+ {
95
+ if ( ! $this->_hasSaved ) {
96
+ $messages = $this->getMessages() ;
97
+ if ( count($messages) > 0 ) {
98
+ // maybe multiple places point to same mesg block if use getMessageBlock(), use the name of the this->_messagesBlock, not itself
99
+ Mage::getSingleton('litemage/session')->saveMessages($this->_messagesBlock->_nameInLayout, $messages) ;
100
+ $this->getMessageCollection()->clear();
101
+ }
102
+
103
+ $this->_hasSaved = true ;
104
+ }
105
+ if ($this->_isEsiInject) {
106
+ $esiHtml = $this->getData('esiHtml');
107
+ Mage::helper('litemage/data')->debugMesg('Injected ESI Message block ' . $this->_nameInLayout . ' ' . $esiHtml) ;
108
+
109
+ if (Mage::registry('LITEMAGE_SHOWHOLES'))
110
+ return $this->getData('lmwrapperBegin') . $esiHtml . $this->getData('lmwrapperEnd') ;
111
+ else
112
+ return $esiHtml;
113
+ }
114
+ else
115
+ return parent::renderView() ;
116
+ }
117
+
118
+ public function getGroupedHtml()
119
+ {
120
+ if ( $this->_isEsiInject ) {
121
+ $this->_adjustEsiUrl('getGroupedHtml') ;
122
+ return $this->renderView() ;
123
+ }
124
+ else {
125
+ $this->_loadMessages() ;
126
+ return $this->_messagesBlock->getGroupedHtml() ;
127
+ }
128
+ }
129
+
130
+ public function getHtml( $type = null )
131
+ {
132
+ if ( $this->_isEsiInject ) {
133
+ $this->_adjustEsiUrl('getHtml', $type) ;
134
+ return $this->renderView() ;
135
+ }
136
+ else {
137
+ $this->_loadMessages($type) ;
138
+ return $this->_messagesBlock->getHtml($type) ;
139
+ }
140
+ }
141
+
142
+ public function _prepareLayout()
143
+ {
144
+ // do nothing, as data already carried over
145
+ return $this ;
146
+ }
147
+
148
+ protected function _loadCache()
149
+ {
150
+ if ( $this->_isEsiInject && $this->hasData('esiHtml') ) {
151
+ $html = $this->getData('esiHtml') ;
152
+ if ( strpos($html, '/getMessage/') ) {
153
+ Mage::helper('litemage/data')->debugMesg('Injected ESI Message block ' . $this->_nameInLayout . ' ' . $html) ;
154
+
155
+ if (Mage::registry('LITEMAGE_SHOWHOLES'))
156
+ return $this->getData('lmwrapperBegin') . $html . $this->getData('lmwrapperEnd') ;
157
+ else
158
+ return $html ;
159
+ }
160
+ }
161
+ return false ;
162
+ }
163
+
164
+ protected function _toHtml()
165
+ {
166
+ if ( $this->_isEsiInject ) {
167
+ $this->_adjustEsiUrl('_toHtml') ;
168
+ return $this->renderView() ;
169
+ }
170
+ else {
171
+
172
+ if ($this->getTemplate()) {
173
+ $this->_loadMessages();
174
+ $this->setScriptPath(Mage::getBaseDir('design'));
175
+ $html = $this->fetchView($this->getTemplateFile());
176
+ return $html;
177
+ }
178
+
179
+ // default is getGroupedHtml
180
+ if ( strncmp($this->_outputCall, 'getHtml', 7) == 0 ) {
181
+ $type = ($this->_outputCall == 'getHtml') ? null : substr($this->_outputCall, 7) ;
182
+ return $this->getHtml($type) ;
183
+ }
184
+ else {
185
+ return $this->getGroupedHtml() ;
186
+ }
187
+ }
188
+ }
189
+
190
+
191
+ protected function _adjustEsiUrl( $caller, $type = null )
192
+ {
193
+ $esiHtml = $this->getData('esiHtml') ;
194
+
195
+ if ( strpos($esiHtml, '/getBlock/') ) {
196
+ $types = join(',', $this->_getStorageTypes());
197
+ $param = array( $types, $caller . $type ) ;
198
+ $param1 = str_replace('/session', '--', $param) ;
199
+ $param1 = str_replace('/', '-', $param1) ;
200
+ $replaced = '/getMessage/st/' . $param1[0] . '/call/' . $param1[1] . '/' ;
201
+
202
+ $esiHtml = str_replace('/getBlock/', $replaced, $esiHtml) ;
203
+ $this->setData('esiHtml', $esiHtml) ;
204
+ Mage::helper('litemage/esi')->setEsiBlockHtml($this->_nameInLayout, $esiHtml);
205
+ }
206
+ }
207
+
208
+ protected function _loadMessages( $type = null )
209
+ {
210
+ $session = Mage::getSingleton('litemage/session') ;
211
+ if ( ($savedMessages = $session->loadMessages($this->_messagesBlock->_nameInLayout)) != null ) {
212
+ foreach ( $savedMessages as $savedMessage ) {
213
+ $this->addMessage($savedMessage) ;
214
+ }
215
+ }
216
+
217
+ $types = ($type == null) ? $this->_usedStorageTypes : (is_array($type) ? $type : array( $type )) ;
218
+
219
+ foreach ( $types as $storageName ) {
220
+ if ( ($storage = Mage::getSingleton($storageName)) != null ) {
221
+ $this->addMessages($storage->getMessages(true)) ;
222
+ $this->setEscapeMessageFlag($storage->getEscapeMessages(true)) ;
223
+ }
224
+ }
225
+ }
226
+
227
+ public function setEscapeMessageFlag( $flag )
228
+ {
229
+ $this->_messagesBlock->setEscapeMessageFlag($flag) ;
230
+ return $this ;
231
+ }
232
+
233
+ /**
234
+ * Set messages collection
235
+ *
236
+ * @param Mage_Core_Model_Message_Collection $messages
237
+ * @return Mage_Core_Block_Messages
238
+ */
239
+ public function setMessages( Mage_Core_Model_Message_Collection $messages )
240
+ {
241
+ $this->_messagesBlock->setMessages($messages) ;
242
+ return $this ;
243
+ }
244
+
245
+ /**
246
+ * Add messages to display
247
+ *
248
+ * @param Mage_Core_Model_Message_Collection $messages
249
+ * @return Mage_Core_Block_Messages
250
+ */
251
+ public function addMessages( Mage_Core_Model_Message_Collection $messages )
252
+ {
253
+ if ( $messages->count() > 0 ) {
254
+ $this->_messagesBlock->addMessages($messages) ;
255
+ }
256
+ return $this ;
257
+ }
258
+
259
+ /**
260
+ * Retrieve messages collection
261
+ *
262
+ * @return Mage_Core_Model_Message_Collection
263
+ */
264
+ public function getMessageCollection()
265
+ {
266
+ return $this->_messagesBlock->getMessageCollection() ;
267
+ }
268
+
269
+ /**
270
+ * Adding new message to message collection
271
+ *
272
+ * @param Mage_Core_Model_Message_Abstract $message
273
+ * @return Mage_Core_Block_Messages
274
+ */
275
+ public function addMessage( Mage_Core_Model_Message_Abstract $message )
276
+ {
277
+ $this->_messagesBlock->addMessage($message) ;
278
+ return $this ;
279
+ }
280
+
281
+ /**
282
+ * Retrieve messages array by message type
283
+ *
284
+ * @param string $type
285
+ * @return array
286
+ */
287
+ public function getMessages( $type = null )
288
+ {
289
+ return $this->_messagesBlock->getMessages($type) ;
290
+ }
291
+
292
+ /**
293
+ * Set messages first level html tag name for output messages as html
294
+ *
295
+ * @param string $tagName
296
+ */
297
+ public function setMessagesFirstLevelTagName( $tagName )
298
+ {
299
+ $this->_messagesBlock->setMessagesFirstLevelTagName($tagName) ;
300
+ }
301
+
302
+ /**
303
+ * Set messages first level html tag name for output messages as html
304
+ *
305
+ * @param string $tagName
306
+ */
307
+ public function setMessagesSecondLevelTagName( $tagName )
308
+ {
309
+ $this->_messagesBlock->setMessagesSecondLevelTagName($tagName) ;
310
+ }
311
+
312
+ /**
313
+ * Get cache key informative items
314
+ *
315
+ * @return array
316
+ */
317
+ public function getCacheKeyInfo()
318
+ {
319
+ return $this->_messagesBlock->getCacheKeyInfo() ;
320
+ }
321
+
322
+ /**
323
+ * Add used storage type
324
+ *
325
+ * @param string $type
326
+ */
327
+ public function addStorageType( $type )
328
+ {
329
+ $this->_messagesBlock->addStorageType($type) ;
330
+ if ( ! in_array($type, $this->_usedStorageTypes) )
331
+ $this->_usedStorageTypes[] = $type ;
332
+ }
333
+
334
+ protected function _getStorageTypes()
335
+ {
336
+ // it's possible, messageblock already replaced with esi one, when using layout->getMessageBlock
337
+ $types = array_merge($this->_usedStorageTypes, $this->_messagesBlock->_usedStorageTypes);
338
+ if ( ($this->_messagesBlock instanceof Litespeed_Litemage_Block_Core_Messages) && ($this->_messagesBlock->_messagesBlock != null)) {
339
+ $types = array_merge($types, $this->_messagesBlock->_messagesBlock->_usedStorageTypes);
340
+ }
341
+ return array_unique($types);
342
+ }
343
+
344
+ }
app/code/community/Litespeed/Litemage/Block/Inject/Jsvar.php CHANGED
@@ -1,10 +1,28 @@
1
  <?php
2
-
3
- /*
4
- * LiteMage plugin for LiteSpeed web server
5
- * @copyright Copyright (c) 2015 LiteSpeed Technologies, Inc. (http://www.litespeedtech.com)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  */
7
 
 
8
  /* This is place holder block to adjust javascript variables. This is a private block, so javascript variable can be adjusted to correct value.
9
  *
10
  * The template file is jsvar.phtml
@@ -24,6 +42,6 @@ class Litespeed_Litemage_Block_Inject_Jsvar extends Mage_Core_Block_Template
24
  return false;
25
  }
26
  }
27
-
28
  // you can add your own function here to handle customized javascript variable
29
  }
1
  <?php
2
+ /**
3
+ * LiteMage
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This program is free software: you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation, either version 3 of the License, or
10
+ * (at your option) any later version.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License
18
+ * along with this program. If not, see https://opensource.org/licenses/GPL-3.0 .
19
+ *
20
+ * @package LiteSpeed_LiteMage
21
+ * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
22
+ * @license https://opensource.org/licenses/GPL-3.0
23
  */
24
 
25
+
26
  /* This is place holder block to adjust javascript variables. This is a private block, so javascript variable can be adjusted to correct value.
27
  *
28
  * The template file is jsvar.phtml
42
  return false;
43
  }
44
  }
45
+
46
  // you can add your own function here to handle customized javascript variable
47
  }
app/code/community/Litespeed/Litemage/Block/Inject/Nickname.php CHANGED
@@ -1,10 +1,28 @@
1
  <?php
2
-
3
- /*
4
- * LiteMage plugin for LiteSpeed web server
5
- * @copyright Copyright (c) 2015 LiteSpeed Technologies, Inc. (http://www.litespeedtech.com)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  */
7
 
 
8
  /* This is sample code to inject a private block which shows customer name only.
9
  * In litemage config.xml, this block needs to have <valueonly>1</valueonly>. It will output pure value, no added html tags.
10
  *
1
  <?php
2
+ /**
3
+ * LiteMage
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This program is free software: you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation, either version 3 of the License, or
10
+ * (at your option) any later version.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License
18
+ * along with this program. If not, see https://opensource.org/licenses/GPL-3.0 .
19
+ *
20
+ * @package LiteSpeed_LiteMage
21
+ * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
22
+ * @license https://opensource.org/licenses/GPL-3.0
23
  */
24
 
25
+
26
  /* This is sample code to inject a private block which shows customer name only.
27
  * In litemage config.xml, this block needs to have <valueonly>1</valueonly>. It will output pure value, no added html tags.
28
  *
app/code/community/Litespeed/Litemage/Helper/Data.php CHANGED
@@ -1,317 +1,516 @@
1
- <?php //0046a
2
- if(!extension_loaded('ionCube Loader')){$__oc=strtolower(substr(php_uname(),0,3));$__ln='ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');if(function_exists('dl')){@dl($__ln);}if(function_exists('_il_exec')){return _il_exec();}$__ln='/ioncube/'.$__ln;$__oid=$__id=realpath(ini_get('extension_dir'));$__here=dirname(__FILE__);if(strlen($__id)>1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file <b>'.__FILE__.'</b> requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the <a href="http://www.ioncube.com/lw/">ionCube Loader Wizard</a> to assist with installation.');exit(199);
3
- ?>
4
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 1sJueH15eDSjg/OXNGX/c0Cc1GuLc+6y63x8dxNAQo6m7Lj192sX405xI/8IGuMDW3XJn+3s9SZx
15
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- er7ZGXpbA/svXRW+Q/tLqlV6mLmQTrrqFNc0wGX1I4igYDTphn+nDtJGGUqGK+3oM/tbAtExi5h+
40
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 9uWvKSaZ2GElJ4yj9KC26sYyKCRd3RFXkrKFA7KnoG9Ftd3CsbF5OEgxoxbGAO025drUWpDo4HXT
71
- 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
- 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
- kFRZ/McyMONAfnIkeJsi9+WiKCO47xe+9QLFc3LwRu3ew4NdXWOYkpgmSgIsZTz9oxmUeDLpHYAd
74
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- ZOrod9vEIHiHp5q9qWiCGgLF8XRTqv58kzeF3NVZzT26yjVHtJBGsPFJCTcO2DSxpd368uLZSHgg
89
- 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
- YLgcUGt3cXu6XE7TVlYoldG1UHmsiGBxYUhS2YDdXG+Qk0BSIhRhr9flk9eJPnIagrlqkcZ26KcA
91
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 2Bepy0uOrvo8DTHGW2TNQ/GbtNK4G+J8vc11pShC/m1VgtIEKjvonB6cL0LVLbOXSdH571jzBjWH
104
- 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
- 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
- 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
- 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
- 7xuKm/vkxs0dZMNsrpJtzQS34a8DZZKSyro1nUIyaOoolGsEG8F1gg9xf9O0dSsNW1z02LISEaBF
109
- fsv7+e3+3emW3nO6FeDX/i88tu+e3ATt8MT3lVzJikllEAKuXI0jeWXgNMRT02FvkrkHHORdb43V
110
- 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
- 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
- D1srGZ4dbtvD9Wn9Dq7/rmdC+oMzzk5BmYjhZZNtWoIaFHGTrulD3uu0f4TSG5lzGF/o9l7Vw28N
113
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- rF1gUSP3kJH7wJYGNOGpSadKU5v2GIEF72cMiz5LwlJ6Sc/R0etEI0L4w+EriLcXh0E6iHiUgHRk
121
- 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
- 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
- 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
- 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
- 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
- BoakrlmZ1yt/1Rv++/YGMkGwKvB/0QwJzXFAjQjqC5xgn8vBqqmQPLcw3Gs7yXRiU77unJQH+hPk
127
- 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
- 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
- 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
- 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
- VfPozz8u/qcGBDNAJihr/VcMVMw0vFdtrTtpGLn4JD1W3eDeTN6OyA94H8wYvLERdnkFwkgDRmRK
132
- 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
- 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
- GIg48Gt8ysr8LxKscunhz3OKFkkEcXnk7YguYmOYMzG4Zti0SHJZrSth2l6pgIlaaK60gFWQwrqY
135
- 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
- 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
- 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
- fNM3Kp4fuRyNvpZcLzcnL4nS5LwzLdVm4t3i2DmIwi2FL0vWGik+b9ifT3Ir/y8Hn3PYPdJWJVM0
139
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- fFeC09Ix+og39MKNl0d6ICGR5ZbD7nsDL8WzsbPkQSKaMrd6sf+ETeq0X5qT/5bCs5j3s8dcYjN+
162
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- v6y6YksKO6y6BGVWwr20Z+Cx4RGtqitqozQiR8ioP2VdSJ2YctSzEcBWU97xlZC1M5jUukByUxHt
173
- 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
- 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
- XXnS+IT4hRNFfguwZTEJvZQr9duhOSy4ngSIMnQq9+uSawnvKpda6FJzrUOP7zJQCqgWIfXOsSo7
176
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- bshUEWRS0h22YzGPtvoBHHtrBR9+tMxmHHKheJVZqhOrOyATKpUGelLkszDy3NSKAm2Rdyjp0qMZ
197
- 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
- rMXWl0pkHcqrvmfSZXtfwXPzJ0wmPLUFbhyajOgF57vRsaIhdLMw5z30CY0UB0QDMSFjQjt7K3DF
199
- 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
- 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
- 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
- 3FRddKOemfxCvT/zKPd/isRcpd7elL0AUh7/r3BOiKvS4xfeIDe86kGDIiBM2S2mapEC9QAdw36w
203
- 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
- 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
- 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
- RGz2fh+qkTzHiz8mQ7M8X2w9BX06bMSaKAJAIK3v+7MFDW1FE/HEsDW9Kja+V4S6jFU0L6JknIQ/
207
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +lsLxYGHNY4kQ8cDD7VIS8yYCV2yebg4MdlfBoMLCrd5N0SO5aLfQp9GkxeDKoNbPeXM3OSShF7x
219
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- yMAHmz2c9FaR+YGXmMsgErXW0BC1Ts/AFukv1i/fkFyM/gNHywUHJ8XFvA4FMPJG0TNYR0g6QPUy
257
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- k5BEUgiCjZ8oxhs0O2CZ9/x4CCbG9ikkpzh2CArY/bBiJFhJs9Sla+AblIdfJcp+SLEtrt0MkrY0
269
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- YVS69CJiwiO/cJRZYnDFKRq2G6N5JK8z1RydsKs3UKByYdi6r25kAg5fSz4QRTQyeNx07s92isy3
287
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 25S36YiLgts7Ui5zpid3PiBmzWSn63kNBdnYJN4UdhxDuEdFDtuVzzgk1AoUGGeMDQyKfhuaMx8I
295
- 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
- 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
- IDpjFHVxAT6Y3VCMWt9C/OAFL9aUPzndeo8eqZGuWo2XYASKDsNvfxP/DSylMEoacmPBUV1w7mp+
298
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * LiteMage
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This program is free software: you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation, either version 3 of the License, or
10
+ * (at your option) any later version.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License
18
+ * along with this program. If not, see https://opensource.org/licenses/GPL-3.0 .
19
+ *
20
+ * @package LiteSpeed_LiteMage
21
+ * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
22
+ * @license https://opensource.org/licenses/GPL-3.0
23
+ */
24
+
25
+ class Litespeed_Litemage_Helper_Data extends Mage_Core_Helper_Abstract
26
+ {
27
+
28
+ const CFGXML_DEFAULTLM = 'default/litemage' ;
29
+ const CFGXML_ESIBLOCK = 'frontend/litemage/esiblock' ;
30
+
31
+ const STOREXML_PUBLICTTL = 'litemage/general/public_ttl' ;
32
+ const STOREXML_PRIVATETTL = 'litemage/general/private_ttl' ;
33
+ const STOREXML_TRACKLASTVIEWED = 'litemage/general/track_viewed' ;
34
+ const STOREXML_DIFFCUSTGRP = 'litemage/general/diff_customergroup' ;
35
+ const STOREXML_WARMUP_EANBLED = 'litemage/warmup/enable_warmup' ;
36
+ const STOREXML_WARMUP_MULTICURR = 'litemage/warmup/multi_currency' ;
37
+ const STOREXML_WARMUP_INTERVAL = 'litemage/warmup/interval' ;
38
+ const STOREXML_WARMUP_PRIORITY = 'litemage/warmup/priority' ;
39
+ const STOREXML_WARMUP_CUSTLIST = 'litemage/warmup/custlist' ;
40
+ const STOREXML_WARMUP_CUSTLIST_PRIORITY = 'litemage/warmup/custlist_priority' ;
41
+ const STOREXML_WARMUP_CUSTLIST_INTERVAL = 'litemage/warmup/custlist_interval' ;
42
+
43
+ const CFG_ENABLED = 'enabled' ;
44
+ const CFG_DEBUGON = 'debug' ;
45
+ const CFG_WARMUP = 'warmup' ;
46
+ const CFG_WARMUP_ALLOW = 'allow_warmup' ;
47
+ const CFG_WARMUP_EANBLED = 'enable_warmup' ;
48
+ const CFG_WARMUP_LOAD_LIMIT = 'load_limit' ;
49
+ const CFG_WARMUP_MAXTIME = 'max_time' ;
50
+ const CFG_WARMUP_THREAD_LIMIT = 'thread_limit' ;
51
+ const CFG_WARMUP_MULTICURR = 'multi_currency';
52
+ const CFG_TRACKLASTVIEWED = 'track_viewed' ;
53
+ const CFG_DIFFCUSTGRP = 'diff_customergroup' ;
54
+ const CFG_PUBLICTTL = 'public_ttl' ;
55
+ const CFG_PRIVATETTL = 'private_ttl' ;
56
+ const CFG_ESIBLOCK = 'esiblock' ;
57
+ const CFG_NOCACHE = 'nocache' ;
58
+ const CFG_CACHE_ROUTE = 'cache_routes' ;
59
+ const CFG_NOCACHE_ROUTE = 'nocache_routes' ;
60
+ const CFG_FULLCACHE_ROUTE = 'fullcache_routes' ;
61
+ const CFG_NOCACHE_VAR = 'nocache_vars' ;
62
+ const CFG_NOCACHE_URL = 'nocache_urls' ;
63
+ const CFG_ALLOWEDIPS = 'allow_ips' ;
64
+ const CFG_ADMINIPS = 'admin_ips';
65
+ const LITEMAGE_GENERAL_CACHE_TAG = 'LITESPEED_LITEMAGE' ;
66
+
67
+ // config items
68
+ protected $_conf = array() ;
69
+ protected $_userModuleEnabled = -2 ; // -2: not set, true, false
70
+ protected $_esiTag;
71
+ protected $_isDebug ;
72
+ protected $_debugTag = 'LiteMage' ;
73
+
74
+ public function moduleEnabled()
75
+ {
76
+ if ( isset($_SERVER['X-LITEMAGE']) && $_SERVER['X-LITEMAGE'] ) {
77
+ return $this->getConf(self::CFG_ENABLED) ;
78
+ }
79
+ else {
80
+ return false ;
81
+ }
82
+ }
83
+
84
+ public function moduleEnabledForUser()
85
+ {
86
+ if ( $this->_userModuleEnabled === -2 ) {
87
+ $allowed = $this->moduleEnabled() ;
88
+ if ( $allowed ) {
89
+ $tag = '';
90
+ $httphelper = Mage::helper('core/http') ;
91
+ $remoteAddr = $httphelper->getRemoteAddr() ;
92
+ if ( $httphelper->getHttpUserAgent() == 'litemage_walker' ) {
93
+ $tag = 'litemage_walker:';
94
+ }
95
+ else if ( $ips = $this->getConf(self::CFG_ALLOWEDIPS) ) {
96
+ if ( ! in_array($remoteAddr, $ips) ) {
97
+ $allowed = false ;
98
+ }
99
+ }
100
+
101
+ if ($this->_isDebug && $allowed) {
102
+ $tag .= $remoteAddr ;
103
+ $msec = microtime();
104
+ $msec1 = substr($msec, 2, strpos($msec, ' ') -2);
105
+ $this->_debugTag .= ' [' . $tag . ':'. $_SERVER['REMOTE_PORT'] . ':' . $msec1 . ']' ;
106
+ }
107
+ }
108
+ $this->_userModuleEnabled = $allowed ;
109
+ }
110
+ return $this->_userModuleEnabled ;
111
+ }
112
+
113
+ public function isAdminIP()
114
+ {
115
+ if ($adminIps = $this->getConf(self::CFG_ADMINIPS) ) {
116
+ $remoteAddr = Mage::helper('core/http')->getRemoteAddr() ;
117
+ if (in_array($remoteAddr, $adminIps)) {
118
+ return true;
119
+ }
120
+ }
121
+ return false;
122
+ }
123
+
124
+ public function isRestrainedIP()
125
+ {
126
+ return ($this->getConf(self::CFG_ALLOWEDIPS) != '') ;
127
+ }
128
+
129
+ public function isDebug()
130
+ {
131
+ return $this->getConf(self::CFG_DEBUGON) ;
132
+ }
133
+
134
+ public function esiTag($type)
135
+ {
136
+ if (isset($this->_esiTag[$type])) {
137
+ return $this->_esiTag[$type];
138
+ }
139
+
140
+ if ( $this->_isDebug ) {
141
+ $this->debugMesg('Invalid type for esiTag ' . $type);
142
+ }
143
+ }
144
+
145
+ public function trackLastViewed()
146
+ {
147
+ return Mage::getStoreConfig(self::STOREXML_TRACKLASTVIEWED);
148
+ }
149
+
150
+ public function getEsiConf( $type = '', $name = '' ) //type = tag, block, event
151
+ {
152
+ $conf = $this->getConf('', self::CFG_ESIBLOCK) ;
153
+ if ( $type == 'event' && ! isset($conf['event']) ) {
154
+ $events = array() ;
155
+ foreach ( $conf['tag'] as $tag => $d ) {
156
+ if ( isset($d['purge_events']) ) {
157
+ $pes = array_keys($d['purge_events']) ;
158
+ foreach ( $pes as $e ) {
159
+ if ( ! isset($events[$e]) )
160
+ $events[$e] = array() ;
161
+ $events[$e][] = $d['cache-tag'];
162
+ }
163
+ }
164
+ }
165
+ $this->_conf[self::CFG_ESIBLOCK]['event'] = $events ;
166
+ return $events ;
167
+ }
168
+ if ( $type == '' )
169
+ return $conf ;
170
+ elseif ( $name == '' )
171
+ return $conf[$type] ;
172
+ else
173
+ return $conf[$type][$name] ;
174
+ }
175
+
176
+ public function getWarmUpConf()
177
+ {
178
+ if (!isset($this->_conf[self::CFG_WARMUP])) {
179
+
180
+ $storeInfo = array();
181
+ if ( $this->getConf(self::CFG_ENABLED) ) {
182
+ $this->getConf('', self::CFG_WARMUP);
183
+ $app = Mage::app();
184
+ $storeIds = array_keys($app->getStores());
185
+ $vary_dev = $this->isRestrainedIP() ? '/vary_dev/1' : '';
186
+
187
+ foreach ($storeIds as $storeId) {
188
+ $isEnabled = Mage::getStoreConfig(self::STOREXML_WARMUP_EANBLED, $storeId);
189
+ if ($isEnabled) {
190
+ $store = $app->getStore($storeId);
191
+ if (!$store->getIsActive()) {
192
+ continue;
193
+ }
194
+ $site = $store->getWebsite();
195
+ $is_default_store = ($site->getDefaultStore()->getId() == $storeId); // cannot use $app->getDefaultStoreView()->getId();
196
+ $is_default_site = $site->getIsDefault();
197
+ $orderAdjust = 0.0;
198
+ if ($is_default_site)
199
+ $orderAdjust -= 0.25;
200
+ if ($is_default_store)
201
+ $orderAdjust -= 0.25;
202
+
203
+ $vary_curr = '';
204
+ $curr = trim(Mage::getStoreConfig(self::STOREXML_WARMUP_MULTICURR, $storeId));
205
+ if ($curr) {
206
+ // get currency vary
207
+ $availCurrCodes = $store->getAvailableCurrencyCodes() ;
208
+ $default_currency = $store->getDefaultCurrencyCode() ;
209
+
210
+ $currs = preg_split("/[\s,]+/", strtoupper($curr), null, PREG_SPLIT_NO_EMPTY) ;
211
+ if (in_array('ALL', $currs)) {
212
+ $currs = $availCurrCodes;
213
+ }
214
+ else {
215
+ $currs = array_unique($currs);
216
+ }
217
+
218
+ foreach ($currs as $cur) {
219
+ if ( $cur != $default_currency && in_array($cur, $availCurrCodes) ) {
220
+ $vary_curr .= ',' . $cur ;
221
+ }
222
+ }
223
+ if ($vary_curr) {
224
+ $vary_curr = '/vary_curr/-' . $vary_curr; // "-" means default
225
+ }
226
+ }
227
+
228
+ $vary_cgrp = '' ;
229
+ /*if ( $diffGrp = Mage::getStoreConfig(self::STOREXML_DIFFCUSTGRP, $storeId)) ) {
230
+ // $crawlgrp = 'out' ;
231
+ $crawlUsers = array(138, 137);
232
+ if ($crawlUsers) {
233
+ if ($diffGrp == 2) {
234
+ // for in & out
235
+ $crawlgrp .= ',in_138';
236
+ }
237
+ * '/vary_cgrp/' . $vary_customergroup ;
238
+ }
239
+ //}*/
240
+
241
+ $env = '';
242
+
243
+ $priority = Mage::getStoreConfig(self::STOREXML_WARMUP_PRIORITY, $storeId) + $orderAdjust;
244
+ if (!$is_default_store) {
245
+ $env .= '/store/' . $store->getCode() . '/storeId/' . $storeId ;
246
+ }
247
+ $env .= $vary_curr . $vary_cgrp . $vary_dev;
248
+ $baseurl = $store->getBaseUrl(Mage_Core_Model_Store::URL_TYPE_LINK);
249
+ $ttl = Mage::getStoreConfig(self::STOREXML_PUBLICTTL, $storeId);
250
+ $interval = Mage::getStoreConfig(self::STOREXML_WARMUP_INTERVAL, $storeId);
251
+ if ($interval == '' || $interval < 600) { // for upgrade users, not refreshed conf
252
+ $interval = $ttl;
253
+ }
254
+
255
+ if ($isEnabled == 1) {
256
+ $listId = 'store' . $storeId;
257
+ $storeInfo[$listId] = array(
258
+ 'id' => $listId,
259
+ 'storeid' => $storeId,
260
+ 'default_store' => $is_default_store,
261
+ 'default_site' => $is_default_site,
262
+ 'env' => $env,
263
+ 'interval' => $interval,
264
+ 'ttl' => $ttl,
265
+ 'priority' => $priority,
266
+ 'baseurl' => $baseurl );
267
+ }
268
+
269
+ // check custom list
270
+ $custlist = Mage::getStoreConfig(self::STOREXML_WARMUP_CUSTLIST, $storeId);
271
+ if (is_readable($custlist)) {
272
+ $priority = Mage::getStoreConfig(self::STOREXML_WARMUP_CUSTLIST_PRIORITY, $storeId) + $orderAdjust;
273
+ $custInterval = Mage::getStoreConfig(self::STOREXML_WARMUP_CUSTLIST_INTERVAL, $storeId);
274
+ $listId = 'cust' . $storeId;
275
+ $storeInfo[$listId] = array(
276
+ 'id' => $listId,
277
+ 'storeid' => $storeId,
278
+ 'env' => $env,
279
+ 'interval' => $custInterval,
280
+ 'ttl' => $ttl,
281
+ 'priority' => $priority,
282
+ 'baseurl' => $baseurl,
283
+ 'file' => $custlist );
284
+ }
285
+ }
286
+ }
287
+ }
288
+ else {
289
+ $this->_conf[self::CFG_WARMUP] = array();
290
+ }
291
+
292
+ if (empty($storeInfo)) {
293
+ if ( $this->_isDebug ) {
294
+ $this->debugMesg('Cron warm up skipped due to configuration not enabled.') ;
295
+ }
296
+ }
297
+ else {
298
+ $load = sys_getloadavg() ;
299
+ $limit = $this->_conf[self::CFG_WARMUP][self::CFG_WARMUP_LOAD_LIMIT] ;
300
+ if ( $load[0] > $limit ) {
301
+ if ( $this->_isDebug ) {
302
+ $this->debugMesg('Cron warm up skipped due to load. Limit is ' . $limit . ', current load is ' . $load[0]) ;
303
+ }
304
+ }
305
+ else {
306
+ $this->_conf[self::CFG_WARMUP]['store'] = $storeInfo;
307
+ }
308
+ }
309
+ }
310
+
311
+ return $this->_conf[self::CFG_WARMUP];
312
+
313
+ }
314
+
315
+ public function isEsiBlock( $block )
316
+ {
317
+ $blockName = $block->getNameInLayout();
318
+ $tag = null;
319
+ $valueonly = 0;
320
+ $blockType = null;
321
+
322
+ $ref = $this->_conf[self::CFG_ESIBLOCK]['block'];
323
+ if (isset($ref['bn'][$blockName])) {
324
+ $tag = $ref['bn'][$blockName]['tag'];
325
+ $valueonly = $ref['bn'][$blockName]['valueonly'];
326
+ }
327
+ else {
328
+ foreach ($ref['bt'] as $bt => $bv) {
329
+ if ($block instanceof $bt) {
330
+ $tag = $bv['tag'];
331
+ $valueonly = $bv['valueonly'];
332
+ $blockType = $bt;
333
+ break;
334
+ }
335
+ }
336
+ }
337
+ if ($tag == null) {
338
+ return null;
339
+ }
340
+ else {
341
+ $tagdata = $this->_conf[self::CFG_ESIBLOCK]['tag'][$tag];
342
+ $bconf = array(
343
+ 'tag' => $tag,
344
+ 'cache-tag' => $tagdata['cache-tag'],
345
+ 'access' => $tagdata['access'],
346
+ 'valueonly' => $valueonly,
347
+ 'bn' => $blockName,
348
+ 'bt' => $blockType
349
+ );
350
+ return $bconf;
351
+ }
352
+ }
353
+
354
+ public function getNoCacheConf( $name = '' )
355
+ {
356
+ return $this->getConf($name, self::CFG_NOCACHE) ;
357
+ }
358
+
359
+ public function getConf( $name, $type = '' )
360
+ {
361
+ if ( ($type == '' && ! isset($this->_conf[$name])) || ($type != '' && ! isset($this->_conf[$type])) ) {
362
+ $this->_initConf($type) ;
363
+ }
364
+
365
+ // get store override, because store id may change after init
366
+ if ($name == self::CFG_DIFFCUSTGRP) {
367
+ $this->_conf[self::CFG_DIFFCUSTGRP] = Mage::getStoreConfig(self::STOREXML_DIFFCUSTGRP);
368
+ }
369
+ elseif ($name == self::CFG_PUBLICTTL) {
370
+ $this->_conf[self::CFG_PUBLICTTL] = Mage::getStoreConfig(self::STOREXML_PUBLICTTL);
371
+ }
372
+ elseif ($name == self::CFG_PRIVATETTL) {
373
+ $this->_conf[self::CFG_PRIVATETTL] = Mage::getStoreConfig(self::STOREXML_PRIVATETTL);
374
+ }
375
+ elseif ($name == self::CFG_TRACKLASTVIEWED) {
376
+ $this->_conf[self::CFG_TRACKLASTVIEWED] = Mage::getStoreConfig(self::STOREXML_TRACKLASTVIEWED);
377
+ }
378
+
379
+ if ( $type == '' )
380
+ return $this->_conf[$name] ;
381
+ else if ( $name == '' )
382
+ return $this->_conf[$type] ;
383
+ else
384
+ return $this->_conf[$type][$name] ;
385
+ }
386
+
387
+ protected function _initConf( $type = '' )
388
+ {
389
+ $storeId = Mage::app()->getStore()->getId();
390
+ if ( ! isset($this->_conf['defaultlm']) ) {
391
+ $this->_conf['defaultlm'] = $this->_getConfigByPath(self::CFGXML_DEFAULTLM) ;
392
+ }
393
+ $pattern = "/[\s,]+/" ;
394
+
395
+ switch ( $type ) {
396
+ case self::CFG_ESIBLOCK:
397
+ $this->_conf[self::CFG_ESIBLOCK] = array() ;
398
+ $this->_conf[self::CFG_ESIBLOCK]['tag'] = $this->_getConfigByPath(self::CFGXML_ESIBLOCK) ;
399
+
400
+ $custblocks = array();
401
+ $custblocks['welcome'] = preg_split($pattern, $this->_conf['defaultlm']['donotcache']['welcome'], null, PREG_SPLIT_NO_EMPTY) ;
402
+ $custblocks['toplinks'] = preg_split($pattern, $this->_conf['defaultlm']['donotcache']['toplinks'], null, PREG_SPLIT_NO_EMPTY) ;
403
+ $custblocks['messages'] = preg_split($pattern, $this->_conf['defaultlm']['donotcache']['messages'], null, PREG_SPLIT_NO_EMPTY) ;
404
+
405
+ $allblocks = array('bn' => array(), 'bt' => array());
406
+ foreach ( $this->_conf[self::CFG_ESIBLOCK]['tag'] as $tag => $d ) {
407
+ $this->_conf[self::CFG_ESIBLOCK]['tag'][$tag]['cache-tag'] = Litespeed_Litemage_Helper_Esi::TAG_PREFIX_ESIBLOCK . $tag ;
408
+ $blocks = preg_split($pattern, $d['blocks'], null, PREG_SPLIT_NO_EMPTY) ;
409
+ if (!empty($custblocks[$tag])) {
410
+ $blocks = array_merge($blocks, $custblocks[$tag]);
411
+ }
412
+
413
+ foreach ( $blocks as $b ) {
414
+ $valueonly = 0;
415
+ if (substr($b, -2) == '$v') {
416
+ $valueonly = 1;
417
+ $b = substr($b, 0, -2);
418
+ }
419
+ $bc = array('tag' => $tag, 'valueonly' => $valueonly);
420
+ if (substr($b,0,2) == 'T:') {
421
+ $b = substr($b,2);
422
+ $allblocks['bt'][$b] = $bc;
423
+ }
424
+ else {
425
+ $allblocks['bn'][$b] = $bc;
426
+ }
427
+ }
428
+ if ( isset($d['purge_tags']) ) {
429
+ $pts = preg_split($pattern, $d['purge_tags'], null, PREG_SPLIT_NO_EMPTY) ;
430
+ if (!isset($d['purge_events']))
431
+ $this->_conf[self::CFG_ESIBLOCK]['tag'][$tag]['purge_events'] = array();
432
+ foreach ( $pts as $t ) {
433
+ if (isset($this->_conf[self::CFG_ESIBLOCK]['tag'][$t]['purge_events'])) {
434
+ $this->_conf[self::CFG_ESIBLOCK]['tag'][$tag]['purge_events'] =
435
+ array_merge($this->_conf[self::CFG_ESIBLOCK]['tag'][$tag]['purge_events'],
436
+ $this->_conf[self::CFG_ESIBLOCK]['tag'][$t]['purge_events']);
437
+ }
438
+ }
439
+
440
+ }
441
+
442
+ }
443
+ $this->_conf[self::CFG_ESIBLOCK]['block'] = $allblocks ;
444
+ break ;
445
+
446
+ case self::CFG_NOCACHE:
447
+ $this->_conf[self::CFG_NOCACHE] = array() ;
448
+ $default = $this->_conf['defaultlm']['default'] ;
449
+ $cust = $this->_conf['defaultlm']['donotcache'] ;
450
+
451
+ $this->_conf[self::CFG_NOCACHE][self::CFG_CACHE_ROUTE] = array_merge(preg_split($pattern, $default['cache_routes'], null, PREG_SPLIT_NO_EMPTY),
452
+ preg_split($pattern, $cust['cache_routes'], null, PREG_SPLIT_NO_EMPTY));
453
+ $this->_conf[self::CFG_NOCACHE][self::CFG_NOCACHE_ROUTE] = array_merge(preg_split($pattern, $default['nocache_subroutes'], null, PREG_SPLIT_NO_EMPTY),
454
+ preg_split($pattern, $default['nocache_subroutes'], null, PREG_SPLIT_NO_EMPTY));
455
+ $this->_conf[self::CFG_NOCACHE][self::CFG_FULLCACHE_ROUTE] = preg_split($pattern, $default['fullcache_routes'], null, PREG_SPLIT_NO_EMPTY) ;
456
+ $this->_conf[self::CFG_NOCACHE][self::CFG_NOCACHE_VAR] = preg_split($pattern, $cust['vars'], null, PREG_SPLIT_NO_EMPTY) ;
457
+ $this->_conf[self::CFG_NOCACHE][self::CFG_NOCACHE_URL] = preg_split($pattern, $cust['urls'], null, PREG_SPLIT_NO_EMPTY) ;
458
+ break ;
459
+
460
+ case self::CFG_WARMUP:
461
+ $warmup = $this->_conf['defaultlm']['warmup'] ;
462
+ $this->_conf[self::CFG_WARMUP] = array(
463
+ self::CFG_WARMUP_EANBLED => $warmup[self::CFG_WARMUP_EANBLED],
464
+ self::CFG_WARMUP_LOAD_LIMIT => $warmup[self::CFG_WARMUP_LOAD_LIMIT],
465
+ self::CFG_WARMUP_THREAD_LIMIT => $warmup[self::CFG_WARMUP_THREAD_LIMIT],
466
+ self::CFG_WARMUP_MAXTIME => $warmup[self::CFG_WARMUP_MAXTIME],
467
+ self::CFG_WARMUP_MULTICURR => $warmup[self::CFG_WARMUP_MULTICURR]);
468
+ break ;
469
+
470
+ default:
471
+ $general = $this->_conf['defaultlm']['general'] ;
472
+ $this->_conf[self::CFG_ENABLED] = $general[self::CFG_ENABLED] ;
473
+
474
+ $test = $this->_conf['defaultlm']['test'] ;
475
+ $this->_conf[self::CFG_DEBUGON] = $test[self::CFG_DEBUGON] ;
476
+ $this->_isDebug = $test[self::CFG_DEBUGON] ; // required by cron, needs to be set even when module disabled.
477
+
478
+ if ( ! $general[self::CFG_ENABLED] )
479
+ break ;
480
+
481
+ // get store override
482
+ $this->_conf[self::CFG_TRACKLASTVIEWED] = Mage::getStoreConfig(self::STOREXML_TRACKLASTVIEWED, $storeId);
483
+ $this->_conf[self::CFG_DIFFCUSTGRP] = Mage::getStoreConfig(self::STOREXML_DIFFCUSTGRP, $storeId);
484
+ $this->_conf[self::CFG_PUBLICTTL] = Mage::getStoreConfig(self::STOREXML_PUBLICTTL, $storeId);
485
+ $this->_conf[self::CFG_PRIVATETTL] = Mage::getStoreConfig(self::STOREXML_PRIVATETTL, $storeId);
486
+
487
+ $adminIps = trim($general[self::CFG_ADMINIPS]);
488
+ $this->_conf[self::CFG_ADMINIPS] = $adminIps ? preg_split($pattern, $adminIps, null, PREG_SPLIT_NO_EMPTY) : '' ;
489
+ if ($general['alt_esi_syntax']) {
490
+ $this->_esiTag = array('include' => 'esi_include', 'inline' => 'esi_inline', 'remove' => 'esi_remove');
491
+ }
492
+ else {
493
+ $this->_esiTag = array('include' => 'esi:include', 'inline' => 'esi:inline', 'remove' => 'esi:remove');
494
+ }
495
+ $allowedIps = trim($test[self::CFG_ALLOWEDIPS]) ;
496
+ $this->_conf[self::CFG_ALLOWEDIPS] = $allowedIps ? preg_split($pattern, $allowedIps, null, PREG_SPLIT_NO_EMPTY) : '' ;
497
+ }
498
+ }
499
+
500
+ protected function _getConfigByPath( $xmlPath )
501
+ {
502
+ $node = Mage::getConfig()->getNode($xmlPath) ;
503
+ if ( ! $node )
504
+ Mage::throwException('Litemage missing config in xml path ' . $xmlPath) ;
505
+ return $node->asCanonicalArray() ;
506
+ }
507
+
508
+ public function debugMesg( $mesg )
509
+ {
510
+ if ( $this->_isDebug ) {
511
+ $mesg = str_replace("\n", ("\n" . $this->_debugTag . ' '), $mesg);
512
+ Mage::log($this->_debugTag . ' '. $mesg ) ;
513
+ }
514
+ }
515
+
516
+ }
app/code/community/Litespeed/Litemage/Helper/Esi.php CHANGED
@@ -1,322 +1,596 @@
1
- <?php //0046a
2
- if(!extension_loaded('ionCube Loader')){$__oc=strtolower(substr(php_uname(),0,3));$__ln='ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');if(function_exists('dl')){@dl($__ln);}if(function_exists('_il_exec')){return _il_exec();}$__ln='/ioncube/'.$__ln;$__oid=$__id=realpath(ini_get('extension_dir'));$__here=dirname(__FILE__);if(strlen($__id)>1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file <b>'.__FILE__.'</b> requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the <a href="http://www.ioncube.com/lw/">ionCube Loader Wizard</a> to assist with installation.');exit(199);
3
- ?>
4
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- ywG0qyC9J8mSYASE+Xue3cGuRlR9DT7ds6BjV6S8I6eNWgGKR/ygdPIqxeLo51ZeiLUQ6GFMZUPq
15
- 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
- 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
- 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
- 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
- CHzO4VBYUP0hehE7fQ22w+UxtCNtzC8wIVysRtrv+r+K/hc5BPF06rEgizIRSPWxZhGmmoKsK9BX
20
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- diDho/PPmkny2s/5kawQv47mX6kQFfBEIDbNYRspvCwnPkdCQUkdQe/siPmt5p4xTGkIxUIwfJFb
28
- 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
- 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
- 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
- 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
- tOzHUiHrDI5+12EoMz8EcHubkwxiSLcZjCaw6cu7PeJ0dgB4i8Vft6/HMq0N56qXNI0LDLqQMQiV
33
- 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
- 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
- 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
- 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
- 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
- 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
- LqC3RO1m6YRc/GTHdDeaWW8OwC5FS0+7tM/Qow492DukvWJDu6yv36SkPYaR30IVvjUpIQgeFapU
40
- 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
- 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
- yCsXFeSUy3E5h5v4v0xqZzqsb6ns6L1aas18RgxYxID0qEDLAV/BQtZw+DaBuT7TXhRNbh+s7fcm
43
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 7VTJICymSWwdbJBzqHU2kZq1X5mVYv8R483BJtAJeJZswizAjDSRxCKNTuyZwHiA5oydBSNoqzxM
59
- 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
- 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
- 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
- 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
- uKdtasiU2UA3QCVTl7b2AqQAGvH06asrP594LImA4UdynzPXlDReb+c6VhyNh0V8m2qxSs0cjxGd
64
- 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
- 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
- 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
- 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
- 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
- D8G59PctrR24akAabB3q3BHpi562AX6NLdsfcbumjn9cFfOPbbG8Xh8qr/Xdf/N6CkT2cmh/8cYv
70
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- y935ztfJSGX2c8MnHwcKqLQACJqisREGqb5rrI/IDkzlhhFnIv9i/o2+mhCdXWoR1/R4b7kofvhp
80
- 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
- 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
- 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
- baIbQ+HFFrHmCEY0m8BgLxGcYkUMbrJ2jxfG3v9bC2LKQCW9M/MnK13S+I5EEhK6uHX8sBz8nBnq
84
- 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
- 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
- fF0pH0AyzkVuarF2+NcWgHW4Uo7cEsGLT3LvQFmXNXXe/LnOUcBwVzntqNV8FX69orLBXtUCfMS4
87
- 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
- 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
- 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
- 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
- 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
- 8NCza0n4fkGLIy8rbjQQY7e82uE+8eUGyKTAbhPw7oLyvnUPjujYJ0X/tZhi2kzRq/0txqpcimxH
93
- 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
- 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
- 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
- VFGYpy2l7a1C1HddJItNRZi1rbnXa+2vPoiaDEV+KbTQaLQvu7kbY0BV52G9lkfkgc3Mu7QcXsB7
97
- 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
- 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
- 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
- Gmueow51vef5QkdZtqyYxp3LM4Ry5AxDoKPvkhGAYNw9qXBYRWwzhZqFeJ8MH3Xhp7FBSGrVHrMb
101
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- YDSihwgyDrJLd85j9S+Jk3JboB3xu2CmKAtPfM1/9RswU3UEBgO0MM20RO3pOjI4x9u+e8IP7pBq
113
- +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
- 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
- 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
- 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
- rW3U1gHI/+zwXfJ/X+MNBOIz8ltPn+dHggkrhQy1WQ48pCNDU9hpKSNzWhwkcmcVUyP4of7bs+T6
118
- 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
- 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
- 98nxP8XVSf5bBOxeHeZ7K2CleHCzoKkgEzHKdXd4DxqI0Tk3kD8p8pgYKN/ny2tZ8YJ2pph1WDpp
121
- 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
- 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
- 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
- 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
- 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
- 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
- AyT0xO3tqAcE45Q9e8MBA4/PlL01nZrnOb4Nn7Q4vQWITBWxyGNbmsjxE4AL+aJIId/VfvYSghgb
128
- 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
- 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
- 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
- 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
- DD+yoMXMKsAnBekklwbdsykxGNkDs8a7vUvKsmid1wcArZjyeXIrYMVYaEMpswV2cAYFCQodU2Si
133
- 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
- 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
- 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
- WqqLsOfsMhlmotb1I5v27P8apd27Hv6m+YAzkuveMZNWZ/0+Ak0rnk5v63233JOwb6RY3SdKfb+b
137
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- CFpV+AYs99X37RZjo6i5keV7DkiisEFsld15LPrb3jqKd89kHSBTypXimQTrPRCmlYEPeoC/boBc
148
- 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
- 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
- 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
- 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
- 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
- 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
- 0ZDehS7YORUm+sN6QeqRNss30bceSt9uWaefxfD5skLZtAf3eID0tlFcIMO7n8WbB0xTE2i8CgEd
155
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- gtl7l//vC/quRsp0v+qYv/Vs1BCTKWSpe3AV3/2RikeGWJ3pXBnjGaFNZ/ODQ9avnRKem+5ORApk
170
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- QKD0WpLmSlbZ2QoyxNmu9IYOCGUgr0cupjub4hj3GGCbpvQOvzUSBD2Tk8N80NSwcWSzCVtJBs/6
192
- 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
- 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
- mT7B7cAL8QfvUVTjAFt5JIfMWvyx8yXnFTynV23++UUTkNAx1mhxLtT1T2sTOH6K0A1+KrVg6n8k
195
- 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
- R9lUvZWr8jM+CUaKAzUt/XbCKzVNV4apu22zRRFsBfPQFPiFJ1IHyWk2NIF/6CA0YrAaMMUd8k7G
197
- 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
- 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
- 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
- wqPARAtAQj9ZaH5LHo9Q5xPhUqf917XqC+72W/+BdTbcXfnQsJd69dVUmUy0aIj5wVkgY7i5K7hg
201
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- DFmcyavyNCcIZPGto5c6Y0+E9IWVAsHVAT4Wlb9la4g3KO9RS3idULoNCC6t4MnbWR8Fx9baUyGr
212
- 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
- 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
- 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
- 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
- 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
- EvekgUcOB4B/lQl48C5pSDsHMeqgnd5KVHETK7nZVCPFa1BDB5lX+gEmYPd0HT+SQIjg0KWjiVFq
218
- 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
- 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
- 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
- m6JNmB7g732w3CarWOGb7tCjPNT1pwXeNxWQ8inXqZCnR8hmZR+3B8MmD+RzDbo7xMB+OVW+b4+R
222
- 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
- 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
- 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
- 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
- 2ywAzP1YAljR3prixRgBLpCVB6eR/y9i50Hn0vd0/YD6O8c0c1s3l0m3sSNvbBTQCITA3EIrayEd
227
- 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
- 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
- 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
- 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
- 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
- 6WVkGI9nkKrCa2y7advEy7BrJgSra8C73DI3JVhrTmkyZzomtkOHR7LEsWr9oDjFs/I0+0GScCei
233
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- Ijeuxhx1+/AQ4YWDl6r+aafjPE+rt03eJrX9P5iRxFj/G15+4hvQoU93j47lIjak4I8GOqgB39qc
248
- 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
- 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
- 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
- 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
- GXA1dUXQWsW3C2CpNxyfkisJ2fuBGcYFQqv6UHdMfZbIbDXiOOai31It2QbItsTXPVYB55w54u73
253
- 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
- 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
- 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
- hCRowED6LFiK22BZi7Mu9zehKr1kpu3UiYIQlkyayuLrOC5q67f7WZT6WKIi0gK5lloWdT7NCwZG
257
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- Xo36K04KhpG2KMPIehMqPzd2xKT5JRF0toOBMFDoNFGeMWu1nQa2NLaKv+W5R+Iy3hnTV0U0NH+D
284
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- XD3/6TTd5xW9zzgaW4ha5xeTnVFPUSZdmsJm5dlBprSA3FL8lgqEc1FbDvCfiDUse801A8vmfubQ
292
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- ZS3BOi34+z0/j0BlSDzIhbjwTaS/k2btHH60PznimADv41JSTBdefOR0KoO+M71sNFkEb6xZ5naW
316
- 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
- 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
- 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
- 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
- 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
- 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
322
- yu4OCtL7gHy9fLFGNPrYqcHpgTckARXhaW==
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * LiteMage
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This program is free software: you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation, either version 3 of the License, or
10
+ * (at your option) any later version.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License
18
+ * along with this program. If not, see https://opensource.org/licenses/GPL-3.0 .
19
+ *
20
+ * @package LiteSpeed_LiteMage
21
+ * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
22
+ * @license https://opensource.org/licenses/GPL-3.0
23
+ */
24
+
25
+
26
+ class Litespeed_Litemage_Helper_Esi
27
+ {
28
+
29
+ const LSHEADER_PURGE = 'X-LiteSpeed-Purge' ;
30
+ const LSHEADER_CACHE_CONTROL = 'X-LiteSpeed-Cache-Control' ;
31
+ const LSHEADER_CACHE_TAG = 'X-LiteSpeed-Tag' ;
32
+ const LSHEADER_CACHE_VARY = 'X-LiteSpeed-Vary';
33
+ const TAG_PREFIX_CMS = 'G.' ;
34
+ const TAG_PREFIX_CATEGORY = 'C.' ;
35
+ const TAG_PREFIX_PRODUCT = 'P.' ;
36
+ const TAG_PREFIX_ESIBLOCK = 'E.' ;
37
+ //BITMASK for Cache Header Flag
38
+ const CHBM_CACHEABLE = 1 ;
39
+ const CHBM_PRIVATE = 2 ;
40
+ const CHBM_ONLY_CACHE_EMPTY = 4 ;
41
+ const CHBM_ESI_ON = 16 ;
42
+ const CHBM_ESI_REQ = 32 ;
43
+ const CHBM_FORMKEY_REPLACED = 64 ;
44
+ const FORMKEY_REAL = '_litemage_realformkey' ;
45
+ const FORMKEY_REPLACE = 'litemagefmkeylmg' ; //do not use special characters, maybe changed by urlencode
46
+ const FORMKEY_NAME = '_form_key' ;
47
+ const ENV_COOKIE_NAME = '_lscache_vary' ;
48
+
49
+ // config items
50
+ protected $_viewedTracker ;
51
+ protected $_cacheVars = array( 'tag' => array(), 'flag' => 0, 'ttl' => -1, 'env' => array(), 'cookie' => array(), 'baseUrl' => '', 'baseUrlESI' => '' ) ;
52
+ protected $_esiBlocks = array();
53
+ protected $_esiPurgeEvents = array() ;
54
+ protected $_isDebug;
55
+ protected $_config;
56
+
57
+
58
+ public function __construct()
59
+ {
60
+ $this->_config = Mage::helper('litemage/data');
61
+ $this->_isDebug = $this->_config->isDebug();
62
+ }
63
+
64
+ public function isDebug()
65
+ {
66
+ return $this->_isDebug;
67
+ }
68
+
69
+ public function setCacheControlFlag( $flag, $ttl = -1, $tag = '' )
70
+ {
71
+ $this->_cacheVars['flag'] = $flag ;
72
+ if ( $tag )
73
+ $this->_cacheVars['tag'][] = $tag ;
74
+ if ( $ttl != -1 )
75
+ $this->_cacheVars['ttl'] = $ttl ;
76
+ // init esiconf
77
+ $this->_config->getEsiConf('tag');
78
+ }
79
+
80
+ public function setEsiOn()
81
+ {
82
+ if ( ($this->_cacheVars['flag'] & self::CHBM_ESI_ON) == 0 ) {
83
+ $this->_cacheVars['flag'] |= self::CHBM_ESI_ON ;
84
+ }
85
+ }
86
+
87
+ public function setEsiBlockHtml($blockIndex, $html)
88
+ {
89
+ if (isset($this->_esiBlocks[$blockIndex])) {
90
+ $this->_esiBlocks['adjusted'] = 1;
91
+ }
92
+ $this->_esiBlocks[$blockIndex] = $html ;
93
+ }
94
+
95
+ public function isEsiBlockAdjusted()
96
+ {
97
+ return isset($this->_esiBlocks['adjusted']);
98
+ }
99
+
100
+ public function getEsiBlockHtml()
101
+ {
102
+ return serialize($this->_esiBlocks);
103
+ }
104
+
105
+ public function getBaseUrl()
106
+ {
107
+ if ($this->_cacheVars['baseUrl'] == '') {
108
+ /*$base2 = Mage::app()->getRequest()->getBaseUrl();
109
+ if (($base2 == '') || (substr($base2, -1) != '/'))
110
+ $base2 .= '/';
111
+
112
+ if (strpos($base2, 'index.php/') === false)
113
+ $base2 .= 'index.php/';
114
+ */
115
+
116
+ $base = Mage::getBaseUrl(); // cannot use request->getBaseUrl, as store ID maybe in url
117
+ $this->_cacheVars['baseUrl'] = $base;
118
+ $esibase = $base;
119
+ if ((stripos($base, 'http') !== false) && ($pos = strpos($base, '://'))) {
120
+ // remove domain, some configuration will use multiple domain/vhosts map to different one.
121
+ $pos2 = strpos($base, '/', $pos+ 4);
122
+ $esibase = ($pos2 === false) ? '/' : substr($base, $pos2);
123
+ }
124
+ $this->_cacheVars['baseUrlESI'] = $esibase;
125
+ }
126
+
127
+ return $this->_cacheVars['baseUrl'];
128
+ }
129
+
130
+ public function getEsiBaseUrl()
131
+ {
132
+ if ($this->_cacheVars['baseUrlESI'] == '') {
133
+ $this->getBaseUrl();
134
+ }
135
+ return $this->_cacheVars['baseUrlESI'];
136
+ }
137
+
138
+ public function getSubReqUrl($route, $params)
139
+ {
140
+ $baseurl = $this->getEsiBaseUrl();
141
+ $url = $baseurl . $route . '/';
142
+ foreach ( $params as $key => $value ) {
143
+ $url .= $key . '/' . $value . '/';
144
+ }
145
+ return $url;
146
+ }
147
+
148
+
149
+ public function canInjectEsi()
150
+ {
151
+ $flag = $this->_cacheVars['flag'] ;
152
+ return ((($flag & self::CHBM_CACHEABLE) != 0) && (($flag & self::CHBM_ESI_REQ) == 0)) ;
153
+ }
154
+
155
+ public function isEsiRequest()
156
+ {
157
+ $flag = $this->_cacheVars['flag'] ;
158
+ return (($flag & self::CHBM_ESI_REQ) != 0) ;
159
+ }
160
+
161
+ public function initFormKey()
162
+ {
163
+ $session = Mage::getSingleton('core/session') ;
164
+ if ( method_exists($session, 'getFormKey') ) {
165
+ $cur_formkey = $session->getFormKey() ;
166
+ if ( $cur_formkey != self::FORMKEY_REPLACE ) {
167
+ $session->setData(self::FORMKEY_REAL, $cur_formkey) ;
168
+ $session->setData(self::FORMKEY_NAME, self::FORMKEY_REPLACE) ;
169
+ }
170
+ $this->_cacheVars['flag'] |= self::CHBM_FORMKEY_REPLACED ;
171
+ }
172
+ }
173
+
174
+ public function restoreFormKey()
175
+ {
176
+ if ( ($this->_cacheVars['flag'] & self::CHBM_FORMKEY_REPLACED) != 0 ) {
177
+ $session = Mage::getSingleton('core/session') ;
178
+ if ( ($realFormKey = $session->getData(self::FORMKEY_REAL)) != null ) {
179
+ $session->unsetData(self::FORMKEY_REAL) ;
180
+ $session->setData(self::FORMKEY_NAME, $realFormKey) ;
181
+ }
182
+ }
183
+ }
184
+
185
+ public function addPurgeEvent( $eventName )
186
+ {
187
+ // always set purge header, due to ajax call, before_reponse_send will not be triggered, also it may die out in the middle, so must set raw header using php directly
188
+ if (!isset($this->_esiPurgeEvents[$eventName])) {
189
+
190
+ $this->_esiPurgeEvents[$eventName] = $eventName ;
191
+
192
+ if ( $cachePurgeHeader = $this->_getEsiPurgeHeader() ) {
193
+ $purgeHeader = $this->_getPurgeHeaderValue($cachePurgeHeader, true);
194
+ header(self::LSHEADER_PURGE . ': ' . $purgeHeader, true);
195
+ if ($this->_isDebug)
196
+ $this->_config->debugMesg("SetPurgeHeader: " . $purgeHeader . ' (triggered by event ' . $eventName . ')') ;
197
+ }
198
+ }
199
+ }
200
+
201
+ protected function _getEsiPurgeHeader()
202
+ {
203
+ if ( count($this->_esiPurgeEvents) == 0 )
204
+ return null ;
205
+
206
+ $events = $this->_config->getEsiConf('event');
207
+ $tags = array() ;
208
+ foreach ( $this->_esiPurgeEvents as $e ) {
209
+ if (isset($events[$e])) {
210
+ foreach($events[$e] as $t) {
211
+ if (!in_array($t, $tags)) {
212
+ $tags[] = $t;
213
+ }
214
+ }
215
+ }
216
+ }
217
+
218
+ if ($this->_isDebug) {
219
+ $this->_config->debugMesg('Purge events ' . implode(', ', $this->_esiPurgeEvents) . ' tags: ' . implode(', ', $tags));
220
+ }
221
+
222
+ return (count($tags) ? $tags : null) ;
223
+ }
224
+
225
+ protected function _getPurgeHeaderValue($tags, $private)
226
+ {
227
+ $purgeHeader = $private ? 'private,' : '' ;
228
+ $t = '';
229
+ foreach ($tags as $tag) {
230
+ $t .= ( $tag == '*' ) ? '*' : 'tag=' . $tag . ',' ;
231
+ }
232
+ $purgeHeader .= trim($t, ',');
233
+ return $purgeHeader;
234
+ }
235
+
236
+ public function setPurgeHeader( $tags, $by, $response = null, $private = false )
237
+ {
238
+ $purgeHeader = $this->_getPurgeHeaderValue($tags, $private);
239
+
240
+ if ( $response == null ) {
241
+ $response = Mage::app()->getResponse() ;
242
+ }
243
+
244
+ if ($this->_isDebug)
245
+ $this->_config->debugMesg("SetPurgeHeader: " . $purgeHeader . ' (triggered by ' . $by . ')') ;
246
+ $response->setHeader(self::LSHEADER_PURGE, $purgeHeader, true) ;
247
+ }
248
+
249
+ public function setPurgeURLHeader( $url, $by )
250
+ {
251
+ $response = Mage::app()->getResponse() ;
252
+
253
+ if ($this->_isDebug)
254
+ $this->_config->debugMesg("SetPurgeHeader: " . $url . ' (triggered by ' . $by . ')') ;
255
+ $response->setHeader(self::LSHEADER_PURGE, $url, true) ;
256
+ }
257
+
258
+ /*public function refreshPrivateSessionOnce($by)
259
+ {
260
+ header(self::LSHEADER_PURGE . ': once, private, *', false);
261
+ }*/
262
+
263
+ public function addCacheEntryTag( $tag )
264
+ {
265
+ $this->_cacheVars['tag'][] = $tag ;
266
+ }
267
+
268
+ public function trackProduct( $productId )
269
+ {
270
+ if ( $this->_viewedTracker == null )
271
+ $this->_viewedTracker = array( 'product' => $productId ) ;
272
+ else
273
+ $this->_viewedTracker['product'] = $productId ;
274
+ }
275
+
276
+ public function beforeResponseSend( $response )
277
+ {
278
+ $extraHeaders = array();
279
+ $envChanged = $this->setEnvCookie();
280
+
281
+ $cacheControlHeader = '' ;
282
+ $flag = $this->_cacheVars['flag'] ;
283
+ $cacheable = true;
284
+
285
+ if ( (($flag & self::CHBM_CACHEABLE) == 0)
286
+ || $envChanged
287
+ || Mage::registry('LITEMAGE_SHOWHOLES')
288
+ || Mage::registry('LITEMAGE_PURGE')
289
+ || !in_array($response->getHttpResponseCode(), array( 200, 301, 404 ))) {
290
+ $cacheable = false;
291
+ }
292
+
293
+ if ( $cacheable ) {
294
+ if ( ($flag & self::CHBM_PRIVATE) != 0 )
295
+ $cacheControlHeader = 'private,max-age=' . (($this->_cacheVars['ttl'] > 0) ? $this->_cacheVars['ttl'] : $this->_config->getConf(Litespeed_Litemage_Helper_Data::CFG_PRIVATETTL)) ;
296
+ else
297
+ $cacheControlHeader = 'public,max-age=' . (($this->_cacheVars['ttl'] > 0) ? $this->_cacheVars['ttl'] : $this->_config->getConf(Litespeed_Litemage_Helper_Data::CFG_PUBLICTTL)) ;
298
+
299
+ $notEsiReq = (($flag & self::CHBM_ESI_REQ) == 0);
300
+ if ($notEsiReq) {
301
+ // for cacheable, non-esi page
302
+ if ($vary_on = $this->_getCacheVaryOn()) {
303
+ $extraHeaders[self::LSHEADER_CACHE_VARY] = $vary_on;
304
+ }
305
+ }
306
+ else {
307
+ $cacheControlHeader .= ',no-vary';
308
+ if ( ($this->_cacheVars['flag'] & self::CHBM_ONLY_CACHE_EMPTY) != 0)
309
+ $cacheControlHeader .= ',set-blank';
310
+ }
311
+
312
+ if ( ($cacheTagHeader = $this->_getCacheTagHeader($notEsiReq)) ) {
313
+ $extraHeaders[self::LSHEADER_CACHE_TAG] = $cacheTagHeader;
314
+ }
315
+ }
316
+
317
+ if ((($flag & self::CHBM_ESI_REQ) == 0) // for non-esi request
318
+ && ((($flag & self::CHBM_ESI_ON) != 0) // esi on
319
+ || (($flag & self::CHBM_FORMKEY_REPLACED) != 0) // formkey replaced
320
+ || ($this->_viewedTracker != null))) { // has view tracker
321
+ $this->_updateResponseBody($response) ;
322
+ }
323
+
324
+ if ( ($flag & self::CHBM_ESI_ON) != 0 ) {
325
+ if ($cacheControlHeader != '')
326
+ $cacheControlHeader .= ',';
327
+ $cacheControlHeader .= 'esi=on' ;
328
+ }
329
+
330
+ if ($cacheControlHeader != '') { // if only no-cache, no need to set header
331
+ $extraHeaders[self::LSHEADER_CACHE_CONTROL] = $cacheControlHeader;
332
+ }
333
+
334
+ // due to ajax, move purge header when event happens, so already purged
335
+ if (Mage::registry('LITEMAGE_PURGE')) {
336
+ $extraHeaders[self::LSHEADER_PURGE] = $this->_getPurgeCacheTags();
337
+ }
338
+
339
+ $this->restoreFormKey() ;
340
+
341
+ foreach($extraHeaders as $key => $val) {
342
+ $response->setHeader($key, $val);
343
+ if ($this->_isDebug) {
344
+ $this->_config->debugMesg("Header $key: $val");
345
+ }
346
+ }
347
+
348
+ return $extraHeaders;
349
+ }
350
+
351
+ protected function _updateResponseBody( $response )
352
+ {
353
+ // only for non-esi request and injected
354
+ $responseBody = $response->getBody() ;
355
+ $updated = false ;
356
+ $combined = '' ;
357
+ $tracker = '' ;
358
+ $sharedParams = $this->getEsiSharedParams();
359
+ $esiIncludeTag = $this->_config->esiTag('include');
360
+
361
+ if ( (($this->_cacheVars['flag'] & self::CHBM_FORMKEY_REPLACED) != 0) && strpos($responseBody, self::FORMKEY_REPLACE) ) {
362
+ $replace = '<' . $esiIncludeTag . ' src="' . $this->getEsiBaseUrl() . 'litemage/esi/getFormKey" as-var="1" combine="sub" cache-control="no-vary,private" cache-tag="E.formkey"/>' ;
363
+ $responseBody = str_replace(self::FORMKEY_REPLACE, $replace, $responseBody) ;
364
+ if ($this->_isDebug) {
365
+ $this->_config->debugMesg('Form key replaced as ' . $replace);
366
+ }
367
+ $updated = true ;
368
+ }
369
+
370
+ if ( $this->_viewedTracker != null ) {
371
+ $logOptions = $this->_viewedTracker;
372
+ $logOptions['s'] = $sharedParams['s'];
373
+ //$tracker = '<!--esi<esi:include src="' . $this->getSubReqUrl('litemage/esi/log', $logOptions)
374
+ // . '" test="$(RESP_HEADER{X-LITESPEED-CACHE})!=\'\'" cache-control="no-cache" combine="sub"/>-->' ;
375
+ // remove comments for html minify
376
+ // if response coming from backend, no need to send separate log request
377
+ $tracker = '<' . $esiIncludeTag . ' src="' . $this->getSubReqUrl('litemage/esi/log', $logOptions)
378
+ . '" test="$(RESP_HEADER{X-LITESPEED-CACHE})!=\'\'" cache-control="no-cache" combine="sub"/>' ;
379
+ $updated = true ;
380
+ }
381
+
382
+ if ( $updated )
383
+ $this->setEsiOn() ;
384
+
385
+ if ( ($this->_cacheVars['flag'] & self::CHBM_ESI_ON) != 0 ) {
386
+ // no need to use comment, will be removed by minify extensions
387
+ $combined = '<' . $esiIncludeTag . ' src="' . $this->getSubReqUrl('litemage/esi/getCombined', $sharedParams) . '" combine="main" cache-control="no-cache"/>' ;
388
+ $updated = true;
389
+ }
390
+
391
+ if ( $updated ) {
392
+ $response->setBody($combined . $tracker . $responseBody) ;
393
+ if ($this->_isDebug) {
394
+ $this->_config->debugMesg('_updateResponseBody combined is ' . $combined);
395
+ }
396
+ }
397
+
398
+ }
399
+
400
+ protected function _getCacheTagHeader($notEsiReq)
401
+ {
402
+ $tags = $this->_cacheVars['tag'] ;
403
+ if ($notEsiReq) {
404
+ if ( count($tags) == 0 ) {
405
+ // set tag for product id, cid, and pageid
406
+ if ( ($curProduct = Mage::registry('current_product')) != null ) {
407
+ $tags[] = self::TAG_PREFIX_PRODUCT . $curProduct->getId() ;
408
+ }
409
+ elseif ( ($curCategory = Mage::registry('current_category')) != null ) {
410
+ $tags[] = self::TAG_PREFIX_CATEGORY . $curCategory->getId() ;
411
+ }
412
+ }
413
+
414
+ $currStore = Mage::app()->getStore() ;
415
+ if ($currStore->getCurrentCurrencyCode() != $currStore->getBaseCurrencyCode()) {
416
+ $tags[] = 'CURR'; // will be purged by currency rate update event
417
+ }
418
+ }
419
+
420
+ $tag = count($tags) ? implode(',', $tags) : '' ;
421
+ return $tag ;
422
+ }
423
+
424
+ protected function _getPurgeCacheTags()
425
+ {
426
+ $tags = $this->_cacheVars['tag'] ;
427
+ if (empty($tags)) {
428
+ // set tag for product id, cid, and pageid
429
+ if ( ($curProduct = Mage::registry('current_product')) != null ) {
430
+ $tags[] = self::TAG_PREFIX_PRODUCT . $curProduct->getId() ;
431
+ }
432
+ elseif ( ($curCategory = Mage::registry('current_category')) != null ) {
433
+ $tags[] = self::TAG_PREFIX_CATEGORY . $curCategory->getId() ;
434
+ }
435
+ else {
436
+ // go by url
437
+ $uri = str_replace('LITEMAGE_CTRL=PURGE', '', $_SERVER['REQUEST_URI']);
438
+ if (substr($uri, -1) == '?') {
439
+ $uri = rtrim($uri, '?');
440
+ }
441
+ $tags[] = $uri;
442
+ }
443
+ }
444
+ $tag = count($tags) ? implode(',', $tags) : '' ;
445
+ return $tag ;
446
+ }
447
+
448
+ public function setEnvCookie()
449
+ {
450
+ $changed = false;
451
+ $this->getDefaultEnvCookie();
452
+ foreach ($this->_cacheVars['env'] as $name => $data) {
453
+ $newVal = '';
454
+ $oldVal = '';
455
+ if ($data != null) {
456
+ ksort($data); // data is array, key sorted
457
+ foreach ($data as $k => $v) {
458
+ $newVal .= $k . '~' . $v . '~';
459
+ }
460
+ }
461
+ if ($cookievar = $this->getCookieEnvVars($name)) {
462
+ $oldVal = $cookievar['_ORG_'];
463
+ }
464
+
465
+ if ($oldVal != $newVal) {
466
+ Mage::getSingleton('core/cookie')->set($name, $newVal);
467
+ $changed = true;
468
+ if ($this->_isDebug)
469
+ $this->_config->debugMesg('Env ' . $name . ' changed, old=' . $oldVal . ' new=' . $newVal) ;
470
+ }
471
+ }
472
+ return $changed;
473
+
474
+ }
475
+
476
+ protected function _getCacheVaryOn()
477
+ {
478
+ $vary_on = array();
479
+
480
+ foreach ($this->_cacheVars['env'] as $name => $data) {
481
+ if ($name != self::ENV_COOKIE_NAME) {
482
+ $vary_on[] = 'cookie=' . $name;
483
+ }
484
+ }
485
+
486
+ switch (count($vary_on)) {
487
+ case 0: return '';
488
+ case 1: return $vary_on[0];
489
+ default: return implode(',', $vary_on);
490
+ }
491
+
492
+ }
493
+
494
+ public function setDefaultEnvCookie()
495
+ {
496
+ // when calling set, always reset, as value may change during processing
497
+ $default = array() ;
498
+ $app = Mage::app() ;
499
+ $currStore = $app->getStore() ;
500
+ $currStoreId = $currStore->getId() ;
501
+ $currStoreCurrency = $currStore->getCurrentCurrencyCode() ;
502
+ $currStoreDefaultCurrency = $currStore->getDefaultCurrencyCode() ;
503
+
504
+ if ($currStoreCurrency != $currStoreDefaultCurrency) {
505
+ $default['curr'] = $currStoreCurrency ;
506
+ }
507
+
508
+ if ( $currStore->getWebsite()->getDefaultStore()->getId() != $currStoreId ) {
509
+ $default['st'] = intval($currStoreId) ;
510
+ }
511
+ if ($diffGrp = $this->_config->getConf(Litespeed_Litemage_Helper_Data::CFG_DIFFCUSTGRP)) {
512
+ // diff cache copy peer customer group
513
+ $currCustomerGroup = Mage::getSingleton('customer/session')->getCustomerGroupId() ;
514
+ if ( Mage_Customer_Model_Group::NOT_LOGGED_IN_ID != $currCustomerGroup ) {
515
+ if ($diffGrp == 1) // diff copy per group
516
+ $default['cgrp'] = $currCustomerGroup ;
517
+ else // diff copy for logged in user
518
+ $default['cgrp'] = 'in' ;
519
+ }
520
+ }
521
+ if ($this->_config->isRestrainedIP()) {
522
+ $default['dev'] = 1; //developer mode for restrained IP
523
+ }
524
+
525
+ $this->_cacheVars['env'][self::ENV_COOKIE_NAME] = count($default) > 0 ? $default : null ;
526
+ }
527
+
528
+
529
+ public function getDefaultEnvCookie()
530
+ {
531
+ if ( ! isset($this->_cacheVars['env'][self::ENV_COOKIE_NAME]) ) {
532
+ $this->setDefaultEnvCookie();
533
+ }
534
+ return $this->_cacheVars['env'][self::ENV_COOKIE_NAME];
535
+ }
536
+
537
+ public function getEsiSharedParams()
538
+ {
539
+ if (!isset($this->_cacheVars['esiUrlSharedParams'])) {
540
+ $design = Mage::getDesign() ;
541
+ $currStore = Mage::app()->getStore() ;
542
+ $urlParams = array(
543
+ 's' => $currStore->getId(), // current store id
544
+ 'dp' => $design->getPackageName(),
545
+ 'dt' => $design->getTheme('layout') ) ;
546
+
547
+ $currency = $currStore->getCurrentCurrencyCode();
548
+ if ($currency != $currStore->getDefaultCurrencyCode()) {
549
+ $urlParams['cur'] = $currency;
550
+ }
551
+
552
+ if ($diffGrp = $this->_config->getConf(Litespeed_Litemage_Helper_Data::CFG_DIFFCUSTGRP)) {
553
+ // diff cache copy peer customer group
554
+ $currCustomerGroup = Mage::getSingleton('customer/session')->getCustomerGroupId() ;
555
+ if ( Mage_Customer_Model_Group::NOT_LOGGED_IN_ID != $currCustomerGroup ) {
556
+ if ($diffGrp == 1) // diff copy per group
557
+ $urlParams['cg'] = $currCustomerGroup ;
558
+ else // diff copy for logged in user
559
+ $urlParams['cg'] = 'in' ;
560
+ }
561
+ }
562
+ // for public block, should consider vary on
563
+ $this->_cacheVars['esiUrlSharedParams'] = $urlParams;
564
+
565
+ }
566
+ return $this->_cacheVars['esiUrlSharedParams'];
567
+ }
568
+
569
+ public function getCookieEnvVars( $cookieName )
570
+ {
571
+ if ( ! isset($this->_cacheVars['cookie'][$cookieName]) ) {
572
+ $this->_cacheVars['cookie'][$cookieName] = null ;
573
+ $cookieVal = Mage::getSingleton('core/cookie')->get($cookieName) ;
574
+ if ( $cookieVal != null ) {
575
+ $cv = explode('~', trim($cookieVal, '~')); // restore cookie value
576
+ for ($i = 0 ; $i < count($cv) ; $i += 2) {
577
+ $this->_cacheVars['cookie'][$cookieName][$cv[$i]] = $cv[$i+1];
578
+ }
579
+
580
+ $this->_cacheVars['cookie'][$cookieName]['_ORG_'] = $cookieVal ;
581
+ }
582
+ }
583
+ return $this->_cacheVars['cookie'][$cookieName] ;
584
+ }
585
+
586
+ public function addEnvVars($cookieName, $key='', $val='' )
587
+ {
588
+ if ( ! isset($this->_cacheVars['env'][$cookieName]) || ($this->_cacheVars['env'][$cookieName] == null) ) {
589
+ $this->_cacheVars['env'][$cookieName] = array() ;
590
+ }
591
+ if ($key != '') {
592
+ $this->_cacheVars['env'][$cookieName][$key] = $val ;
593
+ }
594
+ }
595
+
596
+ }
app/code/community/Litespeed/Litemage/Helper/Viewvary.php CHANGED
@@ -1,48 +1,109 @@
1
- <?php //0046a
2
- if(!extension_loaded('ionCube Loader')){$__oc=strtolower(substr(php_uname(),0,3));$__ln='ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');if(function_exists('dl')){@dl($__ln);}if(function_exists('_il_exec')){return _il_exec();}$__ln='/ioncube/'.$__ln;$__oid=$__id=realpath(ini_get('extension_dir'));$__here=dirname(__FILE__);if(strlen($__id)>1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file <b>'.__FILE__.'</b> requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the <a href="http://www.ioncube.com/lw/">ionCube Loader Wizard</a> to assist with installation.');exit(199);
3
- ?>
4
- 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
- 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
- 0FTJISO1r9BFVFovG1dyQFr1HcUoAR4tInHqxKMgE/9YHFMIct4Tq6k6y7Du0szdULH/eGKNMC+6
7
- 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
- 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
- UtDNydg2zI+6gonZmruHcXasilhGlbTFmucJNVV9CnZboSnzSB1P/u5A7k4dybHvvyOIdlY0I782
10
- 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
- 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
- 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
- eXdkfWicpvW6RXuf6ETpFcUj8H1/OOvbUnY1ZW4mnPxoq95oGJQc4GL3/+VU4uMGzwm42E0ubVCn
14
- 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
- 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
- 3rj2RKoxeX7sVAMeUm2wvzDnM2ZNVZYGrUNVvuJ0PmSbeIA8srxGNCf2BenQT93u6Ntp7mGqiE2q
17
- 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
- 85+B9/DDMv+wDOdJUojqTzygd8WmwtxYVklSbM9LKTwyzMzB/654ZWv2Ey4tDlZjznsPAx1Pny1X
19
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- Odo3ttAaeAVKUwqDtnblwyksYYLu55Yd+u6G1030Omyq5fKEeyyWMM88Hm+X90ZI+6sIHES5o/BS
34
- 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
- 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
- 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
- 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
- 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
- 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
- 9jVCANngSxkmmSTUERBh/lREGsuCqCFS6tB4gc/0S7ZqrEo4Dl4rs5qKSpQKotHUdtaCmF5KvbaM
41
- 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
- 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
- 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
- 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
- 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
- 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
- 2khpaoKOCwZOhaBluGMAbZkVOCErnwL09Dc577mPkHAIFapUtrJjKosnfaPaSW+2GWcvVxSojQP7
48
- JTlQxm4Jg+RWBgzyUuUZzx7qWper
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * LiteMage
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This program is free software: you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation, either version 3 of the License, or
10
+ * (at your option) any later version.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License
18
+ * along with this program. If not, see https://opensource.org/licenses/GPL-3.0 .
19
+ *
20
+ * @package LiteSpeed_LiteMage
21
+ * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
22
+ * @license https://opensource.org/licenses/GPL-3.0
23
+ */
24
+
25
+
26
+ class Litespeed_Litemage_Helper_Viewvary
27
+ {
28
+
29
+ protected $_vary = array( 'toolbar' => '_adjustToolbar', 'env' => '_setEnv' ) ;
30
+
31
+ public function persistViewVary( $tags )
32
+ {
33
+ foreach ( $tags as $tag ) {
34
+ $func = $this->_vary[$tag] ;
35
+ $this->$func(true) ;
36
+ }
37
+ }
38
+
39
+ public function restoreViewVary( $tags )
40
+ {
41
+ foreach ( $tags as $tag ) {
42
+ $func = $this->_vary[$tag] ;
43
+ $this->$func(false) ;
44
+ }
45
+ }
46
+
47
+ protected function _setEnv( $isSave )
48
+ {
49
+ if ($isSave) {
50
+ // run before exit, as value maybe changed during process.
51
+ Mage::helper('litemage/esi')->setDefaultEnvCookie();
52
+ }
53
+ }
54
+
55
+ protected function _adjustToolbar( $isSave )
56
+ {
57
+ // for Mage_Catalog_Block_Product_List
58
+ $helper = Mage::helper('litemage/esi') ;
59
+ $isDebug = $helper->isDebug() ;
60
+ $session = Mage::getSingleton('catalog/session') ;
61
+ $cookieName = '_lscache_vary_toolbar' ;
62
+ $keys = array( 'sort_order', 'sort_direction', 'display_mode', 'limit_page' ) ;
63
+ // limit_page is linked to display_mode, sort_direction is linked to sort_order
64
+ $cookieVars = $helper->getCookieEnvVars($cookieName) ;
65
+
66
+ if ( $isSave ) {
67
+ $saved = false ;
68
+ $mesg = 'addEnv ' . $cookieName;
69
+ foreach ( $keys as $key ) {
70
+ if ( $value = $session->getData($key) ) {
71
+ // only save limit_page if mode is same
72
+ if ( $key == 'limit_page' ) {
73
+ $old_mode = ( $cookieVars != null && isset($cookieVars['display_mode']) ) ? $cookieVars['display_mode'] : '' ;
74
+ $cur_mode = $session->getData('display_mode') ;
75
+ if ( $old_mode != $cur_mode )
76
+ continue ;
77
+ }
78
+
79
+ $helper->addEnvVars($cookieName, $key, $value) ;
80
+ if ($isDebug) {
81
+ $mesg .= ' ' . $key . '=' . $value ;
82
+ }
83
+ $saved = true ;
84
+ }
85
+ }
86
+
87
+ if ( ! $saved ) {
88
+ $helper->addEnvVars($cookieName) ;
89
+ }
90
+
91
+ if ( $isDebug ) {
92
+ Mage::helper('litemage/data')->debugMesg($mesg) ;
93
+ }
94
+
95
+ }
96
+ else {
97
+ // restore
98
+ if ( $cookieVars != null ) {
99
+ foreach ( $keys as $key ) {
100
+ if ( isset($cookieVars[$key]) )
101
+ $session->setData($key, $cookieVars[$key]) ;
102
+ else
103
+ $session->unsetData($key) ;
104
+ }
105
+ }
106
+ }
107
+ }
108
+
109
+ }
app/code/community/Litespeed/Litemage/Model/Config/Source/CustomerGroup.php CHANGED
@@ -1,10 +1,28 @@
1
  <?php
2
-
3
- /*
4
- * LiteMage plugin for LiteSpeed web server
5
- * @copyright Copyright (c) 2015 LiteSpeed Technologies, Inc. (http://www.litespeedtech.com)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  */
7
 
 
8
  class Litespeed_Litemage_Model_Config_Source_CustomerGroup {
9
  public function toOptionArray() {
10
  $helper = Mage::helper('litemage/data');
1
  <?php
2
+ /**
3
+ * LiteMage
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This program is free software: you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation, either version 3 of the License, or
10
+ * (at your option) any later version.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License
18
+ * along with this program. If not, see https://opensource.org/licenses/GPL-3.0 .
19
+ *
20
+ * @package LiteSpeed_LiteMage
21
+ * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
22
+ * @license https://opensource.org/licenses/GPL-3.0
23
  */
24
 
25
+
26
  class Litespeed_Litemage_Model_Config_Source_CustomerGroup {
27
  public function toOptionArray() {
28
  $helper = Mage::helper('litemage/data');
app/code/community/Litespeed/Litemage/Model/Config/Source/EnableWarmUp.php CHANGED
@@ -1,10 +1,28 @@
1
  <?php
2
-
3
- /*
4
- * LiteMage plugin for LiteSpeed web server
5
- * @copyright Copyright (c) 2016 LiteSpeed Technologies, Inc. (http://www.litespeedtech.com)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  */
7
 
 
8
  class Litespeed_Litemage_Model_Config_Source_EnableWarmUp {
9
  public function toOptionArray() {
10
  $helper = Mage::helper('litemage/data');
1
  <?php
2
+ /**
3
+ * LiteMage
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This program is free software: you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation, either version 3 of the License, or
10
+ * (at your option) any later version.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License
18
+ * along with this program. If not, see https://opensource.org/licenses/GPL-3.0 .
19
+ *
20
+ * @package LiteSpeed_LiteMage
21
+ * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
22
+ * @license https://opensource.org/licenses/GPL-3.0
23
  */
24
 
25
+
26
  class Litespeed_Litemage_Model_Config_Source_EnableWarmUp {
27
  public function toOptionArray() {
28
  $helper = Mage::helper('litemage/data');
app/code/community/Litespeed/Litemage/Model/Layout.php CHANGED
@@ -1,57 +1,121 @@
1
- <?php //0046a
2
- if(!extension_loaded('ionCube Loader')){$__oc=strtolower(substr(php_uname(),0,3));$__ln='ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');if(function_exists('dl')){@dl($__ln);}if(function_exists('_il_exec')){return _il_exec();}$__ln='/ioncube/'.$__ln;$__oid=$__id=realpath(ini_get('extension_dir'));$__here=dirname(__FILE__);if(strlen($__id)>1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file <b>'.__FILE__.'</b> requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the <a href="http://www.ioncube.com/lw/">ionCube Loader Wizard</a> to assist with installation.');exit(199);
3
- ?>
4
- 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
- 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
- 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
- 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
- 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
- dq9bH/ReiFsx4a3+83GxvYpq7KL3k4jeZuXmom1nfJB7uCSJL3LEAwH6/2/+4f4jnFia/Nt9Rm0r
10
- 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
- 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
- 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
- T5GvWetBhhrk/bM52AS10q3NCJsjKqAzWXKp/BNo5BdIUPY9ixXTWRhCQ+GThQmPooNlmEcOeUlA
14
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- sI9A7C69WgsL0GdzhlFCoFtr950MRdKMSpAHcpBhHxx7fMX+T1BkjnDV0o+yk4iEsgA6elTat8Qe
23
- 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
- ff1G2Z1UzlGHjWkcEaH8l4W9rh4mKjfeWuUyJGQpFdqJpkFbCrNV9RrCqNaqmAzmxaAJ2I/1XEIP
25
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- WeZCpEjKDE5J4tee37yD1W3VvcD5agrAQc57ctADP+Lc4yLVc0/wucUvnVKDCAArthx6SPerdvF6
34
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 0tyJGwBOI+AV/6w55obT7ckbrUZJL0EkDI71llC/+Nbp/anUQRXgMict1XE4DDk7ZR5INegUBI6b
52
- zsUjyC4WLIZhgYY1qlqFVD9X9UMWZGIxI+glj7mQ7JzfeQyZSL1/kD9gDBuS3SeDyGmI01vBQDks
53
- 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
- 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
- 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
- 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
57
- XOEgg6pO+udzeyVagu9bu2K=
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * LiteMage
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This program is free software: you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation, either version 3 of the License, or
10
+ * (at your option) any later version.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License
18
+ * along with this program. If not, see https://opensource.org/licenses/GPL-3.0 .
19
+ *
20
+ * @package LiteSpeed_LiteMage
21
+ * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
22
+ * @license https://opensource.org/licenses/GPL-3.0
23
+ */
24
+
25
+
26
+ class Litespeed_Litemage_Model_Layout extends Mage_Core_Model_Layout
27
+ {
28
+ /**
29
+ * Class constructor
30
+ *
31
+ * @param array $data
32
+ */
33
+
34
+ //protected $_isDebug;
35
+
36
+ public function __construct()
37
+ {
38
+ $this->_elementClass = Mage::getConfig()->getModelClassName('core/layout_element');
39
+ $this->setXml(simplexml_load_string('<layout/>', $this->_elementClass));
40
+ $this->_update = Mage::getModel('litemage/layout_update');
41
+ }
42
+
43
+ public function getBlock($name)
44
+ {
45
+ if (!isset($this->_blocks[$name])) {
46
+ $dummyblocks = array('root', 'head');
47
+ if (in_array($name, $dummyblocks)) {
48
+ $dummy = new Varien_Object();
49
+ return $dummy;
50
+ }
51
+ return null;
52
+ }
53
+ return $this->_blocks[$name];
54
+ }
55
+
56
+ public function resetBlocks()
57
+ {
58
+ $this->_output = array();
59
+ $this->_blocks = array();
60
+ }
61
+
62
+ /**
63
+ * Create layout blocks hierarchy from layout xml configuration
64
+ *
65
+ * @param Mage_Core_Layout_Element|null $parent
66
+ */
67
+ public function generateBlocks($parent=null)
68
+ {
69
+ if (empty($parent)) {
70
+ $root = $this->addBlock('page/html', 'esiroot');// dummy root
71
+ $parent = $this->getNode();
72
+ foreach ($parent as $node) {
73
+ $node['parent'] = 'esiroot';
74
+ }
75
+ }
76
+ parent::generateBlocks($parent);
77
+ }
78
+
79
+ public function getOutputBlock($name_alias)
80
+ {
81
+ $block = null;
82
+ $mesg = '';
83
+
84
+ if (isset($this->_blocks['esiroot']) && ($block = $this->_blocks['esiroot']->getChild($name_alias))) {
85
+ // as alias
86
+ if ( ($name = $block->getNameInLayout()) != $name_alias ) {
87
+ if ($this->_blocks[$name] != $block) {
88
+ $mesg = 'block name in layout is not unique, please check layout xml for block name ' . $name;
89
+ }
90
+ }
91
+
92
+ }
93
+ elseif (isset($this->_blocks[$name_alias])) {
94
+ $block = $this->_blocks[$name_alias]; // dynamic block
95
+ }
96
+ else {
97
+ $mesg = 'failed to find the block by alias or name';
98
+ }
99
+ if ($mesg != '') {
100
+ Mage::helper('litemage/data')->debugMesg('getOutputBlock ' . $name_alias . ' ALERT: ' . $mesg);
101
+ }
102
+ return $block;
103
+ }
104
+
105
+ // override getOutput, as the output block maybe go by alias
106
+ public function getOutput()
107
+ {
108
+ $out = '';
109
+ if (!empty($this->_output)) {
110
+ foreach ($this->_output as $callback) {
111
+ if ($block = $this->getOutputBlock($callback[0])) {
112
+ $out .= $block->$callback[1]();
113
+ }
114
+ }
115
+ }
116
+
117
+ return $out;
118
+ }
119
+
120
+ }
121
+
app/code/community/Litespeed/Litemage/Model/Layout/Update.php CHANGED
@@ -1,113 +1,215 @@
1
- <?php //0046a
2
- if(!extension_loaded('ionCube Loader')){$__oc=strtolower(substr(php_uname(),0,3));$__ln='ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');if(function_exists('dl')){@dl($__ln);}if(function_exists('_il_exec')){return _il_exec();}$__ln='/ioncube/'.$__ln;$__oid=$__id=realpath(ini_get('extension_dir'));$__here=dirname(__FILE__);if(strlen($__id)>1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file <b>'.__FILE__.'</b> requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the <a href="http://www.ioncube.com/lw/">ionCube Loader Wizard</a> to assist with installation.');exit(199);
3
- ?>
4
- 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
- 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
- biAvqe5upiSf9QCQg2AqiF8WhfDGRdA6f8b/cQWXhy2M/5mfhKLF6pJhLwYTSE+pLRES/tyv2+ej
7
- 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
- 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
- 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
- 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
- ewNp4ljwVdjuy5vhfiIGA2MOs5YXXlEW5ZWAKrSUa5nsZzL80i61s14zkbjzYpgSHDnl7EeRRvRR
12
- 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
- +fnKDmGoNMzZEirXAWwqrlCUp2Qj/5NukuEsHUki5WCoOSVvjwaweWy6OJYcbv6W26hvZ6tyW7LI
14
- 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
- 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
- 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
- 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
- QIY/p9RI8rJis5nanzgPKjpN0h4DAZhBrgeOGU6hP4LihfXxk1+RoZvc6i4pw04W72KD/gDaO20R
19
- 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
- nj/TAxBK6w5F8kA3eln9vWQoohm3HTRue41XgjwGYQIpc+KGSsFD7h6uOKAi7kaliue6umylTZic
21
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +9lyQK8phujnmnRLGz23c21WiF9GU5U4+gKV1QQsQUYJeGVnIvIwnviWcTbTWTXOxoH5I5GEaIzy
42
- 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
- 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
- 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
- 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
- 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
- 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
- phmphhBtqf5uf5MEgy1Mq2yQEOlH497mAphYjk+4APSm6JXZ776fLCej67Oq77ZvNk/m0GzNnHTp
49
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- xO2z4F3JbNGXYc1JccwuzEvSvYtBiF/qZjDxkQ+irxmgHXq85x0T5Bi4NUqL9+6riogtmhVJ7mVv
61
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- tTsKEmvIFY/Rx2QshFFB+lhLCJ6G1bSrPA8lzy8Iy/Lp2wHj44z0VcswVOU9YLqIcieUQv3mEKPE
69
- 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
- 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
- gCXKHaM3PjMe1iTAzQAHOCeLisvCACxyCPIFwRrTojWZ/x2QdI3VoOCCamEOvCh9Y4/RsnQIWeir
72
- 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
- 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
- Jm342xiJ1vHg0X5FBkNRjsY3Ovgpihiqy2+rQN1j01WYAhiH9rdJuxR38gyn0YKsFvhD9nnRZkrx
75
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- kAKWchEqVHE1J+yl5a4enixkxR+Nmiu9RgvK2e2FZunJdzDRHAesx9rMPeYIH2QEvL/I9DcKB+uL
85
- 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
- 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
- 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
- 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
- 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
- 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
- h1DwADG5Rj+bDNCXtCtL1i/jfP23AAVKxfu1ZM8gQaQUBgJvOhAEKrivm337dhcQUSnhMxBnu6YC
92
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- ouEMRQvo0V0/I3q8XdXxzX6LJ8mHwPpMkXc+OJ2Z6jnFP4zl5hk46K+LAi7bshTfO1jPztOfnnAm
105
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
113
- WMHirtrymJCJ5UQZvxERZ562
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * LiteMage
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This program is free software: you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation, either version 3 of the License, or
10
+ * (at your option) any later version.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License
18
+ * along with this program. If not, see https://opensource.org/licenses/GPL-3.0 .
19
+ *
20
+ * @package LiteSpeed_LiteMage
21
+ * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
22
+ * @license https://opensource.org/licenses/GPL-3.0
23
+ */
24
+
25
+
26
+ class Litespeed_Litemage_Model_Layout_Update extends Mage_Core_Model_Layout_Update
27
+ {
28
+ protected $_esiBlockName;
29
+ protected $_storeId;
30
+ protected $_filtered = false;
31
+ protected $_blockNames = array();
32
+ protected $_peerFullXml;
33
+ protected $_isDebug;
34
+
35
+ public function getPackageLayout()
36
+ {
37
+ if (empty($this->_packageLayout)) {
38
+ $this->fetchFileLayoutUpdates();
39
+ }
40
+ return $this->_packageLayout;
41
+ }
42
+
43
+ public function setStoreId($storeId)
44
+ {
45
+ $this->_storeId = $storeId;
46
+ $this->_isDebug = Mage::helper('litemage/data')->isDebug() ;
47
+ }
48
+
49
+ public function getEsiBlockName()
50
+ {
51
+ return $this->_esiBlockName;
52
+ }
53
+
54
+ public function setBlockNames($blockNames)
55
+ {
56
+ $this->_blockNames = $blockNames;
57
+ $this->_esiBlockName = $blockNames[0];
58
+ $this->_cacheId = null;
59
+ $this->_filtered = false;
60
+ $this->resetHandles();
61
+ $this->resetUpdates();
62
+ }
63
+
64
+ public function getBlockNames()
65
+ {
66
+ return $this->_blockNames;
67
+ }
68
+
69
+ public function importLayoutUpdate($blockNames, $blockHandles, $layout )
70
+ {
71
+ $this->setBlockNames($blockNames);
72
+ if ($this->_peerFullXml == null)
73
+ $this->_peerFullXml = $layout->getUpdate()->asSimplexml() ;
74
+
75
+ $this->_filterUpdates($this->_peerFullXml);
76
+ $this->addHandle($blockHandles);
77
+ $this->saveCache();
78
+ return $this->_blockNames;
79
+ }
80
+
81
+ protected function _filterUpdates($layoutUpdateXml)
82
+ {
83
+ $this->resetUpdates();
84
+ $blockUsed = array();
85
+
86
+ foreach ($this->_blockNames as $blockName) {
87
+ $xpath = '//*[@name="' . $blockName . '"]';
88
+ $nameUsed = false;
89
+ if ($els = $layoutUpdateXml->xpath($xpath)) {
90
+ foreach ($els as $el) {
91
+ if (!$el->getAttribute('litemage_used')) {
92
+ $this->addUpdate($el->asNiceXml());
93
+ $nameUsed = true;
94
+ $this->_markNodeUsed($el);
95
+ }
96
+ }
97
+ }
98
+ if ($nameUsed)
99
+ $blockUsed[] = $blockName;
100
+ }
101
+
102
+ // check if children blocks being removed
103
+ $removeNodes = $layoutUpdateXml->xpath("//remove");
104
+
105
+ if (is_array($removeNodes)) {
106
+ $xml = $this->asSimplexml();
107
+
108
+ foreach ($removeNodes as $removeNode) {
109
+ $attributes = $removeNode->attributes();
110
+ $blockName = (string)$attributes->name;
111
+ if ($blockName) {
112
+ $ignoreNodes = $xml->xpath("//block[@name='".$blockName."']");
113
+ if (is_array($ignoreNodes) && count($ignoreNodes) > 0) {
114
+ $this->addUpdate($removeNode->asNiceXml());
115
+ }
116
+ }
117
+ }
118
+ }
119
+
120
+ $this->_blockNames = $blockUsed;
121
+ $this->_filtered = true;
122
+ }
123
+
124
+ protected function _markNodeUsed($node)
125
+ {
126
+ $node->addAttribute('litemage_used', 'esi');
127
+ $children = $node->children();
128
+ foreach ($children as $child) {
129
+ $this->_markNodeUsed($child);
130
+ }
131
+ }
132
+
133
+ /**
134
+ * Get cache id
135
+ *
136
+ * @return string
137
+ */
138
+ public function getCacheId()
139
+ {
140
+ if (!$this->_cacheId) {
141
+ $tags = $this->getHandles();
142
+ if (count($tags) > 1) {
143
+ sort($tags);
144
+ }
145
+ $tags[] = 'LITEMAGE_ESI_' . $this->_esiBlockName;
146
+
147
+ $this->_cacheId = 'LAYOUT_' . $this->_storeId . md5(join('__', $tags));
148
+ }
149
+ return $this->_cacheId;
150
+ }
151
+
152
+ /*
153
+ * @return -1: no layout cache allowed, 0: nocache, 1: has cache
154
+ */
155
+
156
+ public function loadEsiBlockCache($blockName, $handles)
157
+ {
158
+ if (!Mage::app()->useCache('layout')) {
159
+ return -1;
160
+ }
161
+ //reset internals
162
+ $this->setBlockNames(array($blockName));
163
+ $this->addHandle($handles);
164
+
165
+ if ($this->loadCache())
166
+ return 1;
167
+ else
168
+ return 0;
169
+ }
170
+
171
+ public function loadCache()
172
+ {
173
+ if (!Mage::app()->useCache('layout')) {
174
+ return false;
175
+ }
176
+
177
+ if (!$result = Mage::app()->loadCache($this->getCacheId())) {
178
+ return false;
179
+ }
180
+
181
+ $pos = strpos($result, "\n");
182
+ $filteredBlocks = substr($result, 0, $pos);
183
+ $this->_filtered = true;
184
+ if ($this->_isDebug) {
185
+ Mage::helper('litemage/data')->debugMesg('LU_Load B=' . $filteredBlocks . ' H=' . join(',',$this->getHandles()) . ' ID=' . substr($this->getCacheId(), 8, 10));
186
+ }
187
+ $this->_blockNames = explode(',', $filteredBlocks);
188
+ $this->addUpdate(substr($result, $pos+1));
189
+
190
+ return true;
191
+ }
192
+
193
+ public function saveCache()
194
+ {
195
+ if (!$this->_filtered) {
196
+ $this->_filterUpdates($this->asSimplexml());
197
+ }
198
+
199
+ if (!Mage::app()->useCache('layout')) {
200
+ return false;
201
+ }
202
+
203
+ $tags = $this->getHandles();
204
+ $tags[] = Mage_Core_Model_Layout_Update::LAYOUT_GENERAL_CACHE_TAG;
205
+ $tags[] = Litespeed_Litemage_Helper_Data::LITEMAGE_GENERAL_CACHE_TAG;
206
+ $firstLine = join(',', $this->_blockNames);
207
+ if ($this->_isDebug) {
208
+ Mage::helper('litemage/data')->debugMesg('LU_Save B=' . $firstLine . ' H=' . join(',',$this->getHandles()) . ' ID=' . substr($this->getCacheId(), 8, 10));
209
+ }
210
+
211
+ $content = $firstLine . "\n" . $this->asString();
212
+ return Mage::app()->saveCache($content, $this->getCacheId(), $tags, null);
213
+ }
214
+
215
+ }
app/code/community/Litespeed/Litemage/Model/Observer/Cron.php CHANGED
@@ -1,436 +1,786 @@
1
- <?php //0046a
2
- if(!extension_loaded('ionCube Loader')){$__oc=strtolower(substr(php_uname(),0,3));$__ln='ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');if(function_exists('dl')){@dl($__ln);}if(function_exists('_il_exec')){return _il_exec();}$__ln='/ioncube/'.$__ln;$__oid=$__id=realpath(ini_get('extension_dir'));$__here=dirname(__FILE__);if(strlen($__id)>1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file <b>'.__FILE__.'</b> requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the <a href="http://www.ioncube.com/lw/">ionCube Loader Wizard</a> to assist with installation.');exit(199);
3
- ?>
4
- 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
- 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
- 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
- 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
- 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
- EKw1WOyXzTAbXWjtnSHkmix9dxzDEH+jTy4usIFjGYx73PbskQn++obYdQ92YuJE0cU1XLaVI5BB
10
- XlLChxgpVxFzvP3bfPm3XaMwdP83YlQo/ODVW3YEZlLeJIN688FCYYdJ2uR3iEvtEEiSSbY8l8MY
11
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 399w6mrKWRO1Fs/BSCWkrz+nvJJfhC0BeG3d5yXtb9QY213KtJ0SH6QpqAEfrAoQE+FcnTZjRItI
24
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 95Hat9u0U7Hr1FLAAw8rblwxTi/qCzF7UUZ6sjLReLNbEoODYbmYA+GGflsQ/pfxkOCzgOFfBpkA
36
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- OwY16dXcZ5N3yCmOFNYuU/yTY3euHffwJQMxRoh40LDFaXtEjfKK/TvHUjzjJCPEgldnAR6dchPB
45
- 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
- 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
- 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
- 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
- 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
- HMSCMb68dRWFufcQEMwiffZN2B/PDepA3CuZ5kIhsuUhjxqC0lc5IvxoZD44Oc9kUrn25zFpLHO8
51
- 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
- ClSULjtyG/A3VL5r2r8sxx1IceFrkew4aK1JcfKkXUlSi68CEtUFNZscj67aJObIiQ+/llqP3x5x
53
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- dP5Kl+TNtQvXOkJuh03FQxmjSUyaq689mpjr3EXxRQXo5VRaIRfIeONtTcKeeN3wiEq0iDUzNhS3
74
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- QmJpE/zUpwdQBKEisY6GdWw5n0R9WqMKMpy8qAqe+hwsZ3RnxiRKCHM6mp3xY2hfGUnFQMmYZdK9
86
- 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
- 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
- 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
- uH3Znu8p5k/MF+dwOO54+IhFxlCIQzs7ucXyglwBc30zzeI32CBFFK54Zo9FR85neHqmB1h3n306
90
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- m4bCZz9p2LohD8Vfkr0/km9S+D0CrEW2A+r1A5VrVAOiPBFXPQ19Qla2NX5q14O4xu3peYAc9Vmz
100
- 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
- +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
- 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
- KEC4oN3Zz9G8VzAsrd9J4kV64p0FvVefOOZVzYUKOzfWRPDV0aY/vxCKWLKGTX094hfO2SVwSUS1
104
- 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
- AlZcPRCWJswFT3bb2Wt32fEmRW4Qs913g+QskUIXmo65kK225ys8n/2J9tkEmRy647wf3MbJkCTH
106
- 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
- 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
- 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
- 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
- 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
- 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
- PIrcY/el1sweZQcGk1qFjN927aiiNAJf6ex3GiNvFo2eBDIxn7qe+B5ecQ/UHQakgh/0RfbXsYod
113
- 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
- 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
- 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
- TPgq/XAtxJRoUTtCcN7a1wZnkvlkP6Y66dWLIZ/MWDPgOd+i9VDpOwf13Wug6aslkcWVHZSCbVgW
117
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- K2rXciJIGVzp5YG8e6qO4jdQCcmmsv7bbBFn7LwuSlfypuuXAnHbmFIWbg7KGXPB3rnFiCT68TpD
127
- QJ0uPUINAcSFk1d4SGuGVVKzTAc+KLgFzq6zuYKh9aiNQF5z7Ns+yZzAnqKt4zD0b7qjxb251Cb7
128
- 5mKMMNL9rEAFZTHGUUl8SngOGudBNa+nVLkRtMOqd/VU2lohy/tdLs39Wb/6+45Tc3WukYW7EGpM
129
- K/bqI15+BG3NkeTUlXdjUmxF7op9KH4kBYF44WhzdbLCF/CIMaAsHhQCr6HzZm94Z5cWE8t5y9Qu
130
- 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
- 2PU91zBxHJQMWQDgOyjbByhxj0S5o7cmiaCh2U5htJWxI5Prnlro3v4cZBNwDgiPlidEPydWzljS
132
- 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
- 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
- 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
- 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
- u9x4nxAMpJ9Ep3X81wmjt2lMeaIE8d/yWL3fq0sMcM8dLFON/6l005HNGhevLucAbn/ThjcHPBjm
137
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- oSkNbZM8ez40ZoE4Kw92LkoMR9c+h8R/y4fiGA859m/K504DDmv+16sPo2UUdmg7OSeYwc7cwzlS
145
- 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
- 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
- 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
- 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
- oIXaXAR899oviJ660uqBkW6vcw0HbrFh7/yi4WH6eyanO6KgEV+AqeusrI1t2B2rxwDmJo00B1ko
150
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- ort00sFodc/Be+k4U1Z3m5pA88OtsVAfXd8H1Ch080npaPRpH8Q6Ll+HcqdPvcBgfvMvcjFGvjDz
177
- 7xT3Lnwplbydk+k3Tm241FiBNia3SICVHONoyzcgKut94sVrypwDAK6fI3gMIBH0uvHVXdZ9dWKn
178
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- TM7VUu3KwZ2qDhlFg/wS3YX4gjEbvOIjoqRrm/DGAwOhm8aMoMsSld/G2IJ0xnb7ccP8rvGPYuiN
187
- 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
- 6z/QjptPrM1oNfxvbfIX+WcZRFm+SJLBxa6Gy3MRiVcOUQcWn+FOnYAQ0CAu3oFsUIrTfWX4ODMb
189
- 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
- 591fkD9TbrLzgxXjNai3d933Bz5fqFZv8vjENMSdBUfNUW0qJ32ACOVny6rHflYtkI3fBn8rftCs
191
- tcA0mi94IO77FG3l8gcSb7pumGEaLnI/cflKAcb82cWQdh7DRZGxWT8vXSyoQOyKElV+0LtcDGla
192
- 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
- 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
- lOzLKorrbrSLkdR4ApUSUSJxK+oJQgTyp9lOc+8sMc2hVxQNbFR+3yl2Axjefe69m0bZ/z7Vefab
195
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- oDbYvLwYNlN8fyNZZ8stQHbVv8aiRF2VUaO1fXqHDQnXGEF6iAJIaI8A2hTYckTL4MbiWSXyzzGR
218
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- LkvtmBg9FuYkI4UkE9tWO1c8ve6YkMYHvCCe93u1lCCQR43ng73H8oZ+ERcRyleekGEXvdJhUNmv
240
- 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
- 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
- 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
- euyUNJI02p80Gl+ZVlZhiKLoJbL9pqrxQPW4MMN7wOyRfp7UghKSpwT3nmj8bg4vA5RbPa4F6Q3I
244
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- gq/RMgQuhrvVmMGYtyHjqVaS3jol24dBzc2cAtIYIV+ZmnMl99Srvi6GV/wvrqU20JThqEViZPVR
259
- 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
- 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
- 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
- ZUja5y5WZRvR6j0GKPelgJvIBExp7QhZt7DANI1BTwXAY7+XXONNfdr/1S9lOWzRRPB3u0k/DoRn
263
- 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
- 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
- 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
- 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
- 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
- lO0bL0yPaUa7adCGSsHe9Dtgd/TI6K4ev/Xw/NwEc3jkcubccTnG07/Kg3eQ9HYIyquISqijq1dc
269
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- WcVrYmn/XX5hBvcwRu/XstJz1uOxW7F4MLZLObwHywmcP10gubcbhd7LRXZV7MKZcL6oSQ+nHXra
287
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- V4QNxqQPuo7UxWZAdjOJPiUJzVzo8uqk/ufZ7OyDj4x51M9VmmM3fJx8iCtyK/SZgrTgQXKgfNCz
306
- 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
- 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
- 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
- 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
- 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
- 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
- 3aRLZMi+IbU7Fb+JGpUwsukAao9hCnbDihKiMuLlgkfhQxVaLkAcrr0MO/LEBFg5LOET17UQxFvS
313
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- arGUCWhlTz8HztDE/B6rlg/zwwupaB1E/bWdmvpB3TxFTY3cwySc+y+nn9uwGvqtpm0Sa0u23TWQ
324
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- LgMxp1ibr7cCkLYBAvknJDaH9s/7FI5WkvM/uJlVkCkJ9hsbcey3BuXtW/uTT2+/Tr1fwbmmn9lA
338
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- QpXonIu6SYe3lBGzSQLgucRd3HedKMZdPIBUy3arWddbzpLt3MP9eBSCUgFuDcjW/zKmTwz5uslf
354
- fgry8x75iDWxfBisuUkRPHhjk5NcpDJLCYS9/x8ePeNiO5nBzFyvHBubkukswYHD2qMKsoA8Ot0j
355
- pdkg90BQTZuK3Tp2M0YRIOBYPjGxDmYwxwDjNW5+davnzBnhzV9FhLbXFaGw4pbhxbxFvfJZ5ZK+
356
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 6vx457ERs58LPygkpab5KKJf6HSGM1T/i+9B5CguFeWCC9CJlLIanpqhFX7+m8yi8R3DDjIXv3ZF
375
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- HOapAGsr9MTOw+w6F+5dBPadK2HdiA0aYWER8dtK/VC3Uuvjm0tLAw7OhArp6AXKB2oB2F/R8ki7
385
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- /HYsAnN69DPaVyH2wAveAtBMMDgU7vDpJYZm6HZxDKNl12bh0QT5fC7Ta/2D1ZHpC2eQ6SxlLGF6
411
- 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
- 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
- ethwXDDE8W+8RfAGON3fOWGHBzmZBTXfZlZeaYC3EjA9n3SAaNYB2XjyWmYyGS85Y9eC80rEf+Q1
414
- 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
- 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
- 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
- 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
- qFbOMcx2OYCaP22u2l8KSY1SD5CVj0jxJNFspf7L4MgCwi9H/YtOwP5UV3zntZA+3v8aCcW6ZqwD
419
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- DpI9vuzV09ZQFLuHlRP2Wz1SrkhJW10Iy/OPXGm9fhy+SAp6T9xTpdfLDRYUAt5Xlqdwg1pyQRzB
435
- 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
- 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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * LiteMage
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This program is free software: you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation, either version 3 of the License, or
10
+ * (at your option) any later version.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License
18
+ * along with this program. If not, see https://opensource.org/licenses/GPL-3.0 .
19
+ *
20
+ * @package LiteSpeed_LiteMage
21
+ * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
22
+ * @license https://opensource.org/licenses/GPL-3.0
23
+ */
24
+
25
+ class Litespeed_Litemage_Model_Observer_Cron extends Varien_Event_Observer
26
+ {
27
+
28
+ const WARMUP_MAP_FILE = 'litemage_warmup_urlmap' ;
29
+ const WARMUP_META_CACHE_ID = 'litemage_warmup_meta' ;
30
+ const USER_AGENT = 'litemage_walker' ;
31
+ const ENV_COOKIE_NAME = '_lscache_vary' ;
32
+
33
+ protected $_meta ; // time, curfileline
34
+ protected $_metaUpdated = false;
35
+ protected $_conf;
36
+ protected $_isDebug ;
37
+ protected $_debugTag;
38
+ protected $_maxRunTime;
39
+ protected $_curThreads = -1;
40
+ protected $_curThreadTime ;
41
+ protected $_curList ;
42
+ protected $_listDir;
43
+ protected $_priority;
44
+
45
+
46
+ protected function _construct()
47
+ {
48
+ $helper = Mage::helper('litemage/data') ;
49
+ $this->_isDebug = $helper->isDebug() ;
50
+ if ($this->_isDebug) {
51
+ $this->_debugTag = 'LiteMage [' . self::USER_AGENT . ':';
52
+ if (isset($_SERVER['USER']))
53
+ $this->_debugTag .= $_SERVER['USER'];
54
+ elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
55
+ $this->_debugTag .= $_SERVER['HTTP_X_FORWARDED_FOR'];
56
+ $this->_debugTag .= ':'. $_SERVER['REQUEST_TIME'] . '] ' ;
57
+ }
58
+ $this->_listDir = Mage::getBaseDir('var') . DS . 'litemage';
59
+
60
+ if (!is_dir($this->_listDir)) {
61
+ mkdir($this->_listDir);
62
+ chmod($this->_listDir, 0777);
63
+ }
64
+
65
+ $this->_conf = $helper->getWarmUpConf();
66
+ }
67
+
68
+ public function resetCrawlerList($listId)
69
+ {
70
+ $adminSession = Mage::getSingleton('adminhtml/session') ;
71
+ $meta = Mage::app()->loadCache(self::WARMUP_META_CACHE_ID);
72
+ $updated = false;
73
+
74
+ if ($listId) {
75
+ $id = strtolower($listId);
76
+ if ( $meta ) {
77
+ $meta = unserialize($meta) ;
78
+ if (isset($meta[$id])) {
79
+ unset($meta[$id]);
80
+ $updated = true;
81
+ $adminSession->addSuccess($listId . ' ' . Mage::helper('litemage/data')->__('List has been reset and will be regenerated in next run.')) ;
82
+ }
83
+ else {
84
+ $adminSession->addError($listId . ' ' . Mage::helper('litemage/data')->__('List has been reset already. It will be regenerated in next run.')) ;
85
+ }
86
+ }
87
+ }
88
+ else {
89
+ if ($meta) {
90
+ Mage::app()->removeCache(self::WARMUP_META_CACHE_ID);
91
+ $updated = true;
92
+ $adminSession->addSuccess(Mage::helper('litemage/data')->__('All lists have been reset and will be regenerated in next run.')) ;
93
+ }
94
+ else {
95
+ $adminSession->addError(Mage::helper('litemage/data')->__('All lists have been reset already. It will be regenerated in next run.')) ;
96
+ }
97
+ }
98
+
99
+ if ($updated) {
100
+ $this->_saveMeta($meta);
101
+ }
102
+ }
103
+
104
+ public function getCrawlerList($listId)
105
+ {
106
+ $output = '<h3>Generated URL List ' . $listId . '</h3>';
107
+ if ( ($urls = $this->_getCrawlListFileData($listId)) != null ) {
108
+ $output .= '<pre>' . $urls . '</pre>';
109
+ }
110
+ else {
111
+ $output .= '<p>Cannot find generated URL list. It will be regenerated in next run.</p>';
112
+ }
113
+ return $output;
114
+ }
115
+
116
+ public function getCrawlerStatus()
117
+ {
118
+ $priority = $this->_initMeta();
119
+ $saved = $this->_meta;
120
+ $timefmt = 'Y-m-d H:i:s';
121
+ $status = array('lastupdate' => '', 'endreason' => '',
122
+ 'stores' => array());
123
+
124
+ if (isset($saved['lastupdate'])) {
125
+ $status['lastupdate'] = date($timefmt, $saved['lastupdate']);
126
+ }
127
+
128
+ if (isset($saved['endreason'])) {
129
+ $status['endreason'] = $saved['endreason'];
130
+ }
131
+
132
+ foreach ($priority as $listId => $pri ) {
133
+ $store_stat = $saved[$listId];
134
+ $disp = array();
135
+ $disp['priority'] = intval($pri + 0.5);
136
+ $disp['id'] = strtoupper($listId);
137
+ $disp['baseurl'] = $store_stat['baseurl'];
138
+ $disp['file'] = (isset($store_stat['file']) ? $store_stat['file'] : '');
139
+ $disp['ttl'] = $store_stat['ttl'];
140
+ $disp['interval'] = $store_stat['interval'];
141
+ if ($store_stat['gentime'] > 0) {
142
+ $disp['gentime'] = date($timefmt, $store_stat['gentime']);
143
+ }
144
+ else {
145
+ $disp['gentime'] = isset($store_stat['tmpmsg']) ? $store_stat['tmpmsg'] : '';
146
+ }
147
+ $disp['lastquerytime'] = ($store_stat['lastquerytime'] > 0) ? date($timefmt, $store_stat['lastquerytime']) : '';
148
+ $disp['endtime'] = ($store_stat['endtime'] > 0) ? date($timefmt, $store_stat['endtime']) : '';
149
+ $disp['listsize'] = ($store_stat['listsize'] > 0) ? $store_stat['listsize'] : '';
150
+ $disp['curpos'] = $store_stat['curpos'];
151
+ $disp['env'] = $store_stat['env'];
152
+ $disp['curvary'] = preg_replace("/_lscache_vary=.+;/", '', $store_stat['curvary']);
153
+ $disp['queried'] = $store_stat['queried'];
154
+ $status['stores'][] = $disp;
155
+ }
156
+
157
+ return $status;
158
+ }
159
+
160
+ /**
161
+ * called by cron job
162
+ */
163
+
164
+ public function warmCache()
165
+ {
166
+ if ( $this->_isDebug ) {
167
+ $this->_debugLog("cron warmCache envoked") ;
168
+ }
169
+
170
+ $curRunTime = time() ;
171
+
172
+ if (!$this->_init()) {
173
+ $this->_debugLog('skip this round');
174
+ return;
175
+ }
176
+
177
+ $options = array(
178
+ CURLOPT_USERAGENT => self::USER_AGENT,
179
+ CURLOPT_SSL_VERIFYPEER => 0,
180
+ CURLOPT_TIMEOUT => 180
181
+ );
182
+
183
+ $client = new Varien_Http_Adapter_Curl();
184
+ $curCookie = '';
185
+ $endReason = '';
186
+
187
+ while ($urls = $this->_getNextUrls($curCookie)) {
188
+ $curlOptions = $options;
189
+ if ($curCookie) {
190
+ $curlOptions[CURLOPT_COOKIE] = $curCookie;
191
+ }
192
+
193
+ if ($this->_isDebug) {
194
+ $id = $this->_curList['id'];
195
+ $this->_debugLog('crawling ' . $id . ' urls (cur_pos:' . $this->_meta[$id]['curpos'] . ') with cookie ' . $curCookie . ' ' . print_r($urls, true));
196
+ }
197
+
198
+ try {
199
+ $client->multiRequest($urls, $curlOptions);
200
+ } catch ( Exception $e ) {
201
+ $endReason = 'Error when crawling url ' . implode(' ', $urls) . ' : ' . $e->getMessage();
202
+ break ;
203
+ }
204
+
205
+
206
+ $this->_finishCurPosition() ;
207
+
208
+ if ($this->_meta['lastupdate'] > $this->_maxRunTime) {
209
+ $endReason = Mage::helper('litemage/data')->__('Stopped due to exceeding defined Maximum Run Time.');
210
+ break;
211
+ }
212
+
213
+ if ($this->_meta['lastupdate'] - 60 > $this->_curThreadTime) {
214
+ $this->_adjustCurThreads();
215
+ if ($this->_curThreads == 0) {
216
+ $endReason = Mage::helper('litemage/data')->__('Stopped due to current system load exceeding defined load limit.');
217
+ break;
218
+ }
219
+ }
220
+ }
221
+ $this->_meta['endreason'] = $endReason;
222
+
223
+ $this->_saveMeta() ;
224
+ if ( $this->_isDebug ) {
225
+ $this->_debugLog($endReason . ' cron meta end = ' . print_r($this->_meta, true)) ;
226
+ }
227
+ }
228
+
229
+ protected function _getCrawlListFileData($listId)
230
+ {
231
+ $filename = $this->_listDir . DS . self::WARMUP_MAP_FILE . '_' . strtolower($listId);
232
+ if (!file_exists($filename))
233
+ return null;
234
+ else
235
+ return file_get_contents($filename);
236
+ }
237
+
238
+ protected function _saveCrawlListFileData($listId, $data)
239
+ {
240
+ $filename = $this->_listDir . DS . self::WARMUP_MAP_FILE . '_' . strtolower($listId);
241
+ if (!file_put_contents($filename, $data)) {
242
+ $this->_debugLog('Failed to save url map file ' . $filename);
243
+ }
244
+ else {
245
+ chmod($filename, 0644);
246
+ }
247
+ }
248
+
249
+ protected function _prepareCurList()
250
+ {
251
+ $id = array_shift($this->_priority);
252
+ if ($id == null) {
253
+ return false;
254
+ }
255
+
256
+ $m = $this->_meta[$id];
257
+ // parse env & get all possible varies
258
+ $vary = array();
259
+ $fixed = $this->_parseEnvCookies($m['env'], $vary);
260
+ if (!in_array($m['curvary'], $vary) || $m['curpos'] > $m['listsize']) {
261
+ // reset current pointer
262
+ $this->_meta[$id]['curvary'] = $vary[0];
263
+ $this->_meta[$id]['curpos'] = 0;
264
+ if ( $this->_isDebug ) {
265
+ $this->_debugLog('Reset current position pointer to 0. curvary is ' . $m['curvary']);
266
+ }
267
+ }
268
+
269
+ while ($this->_meta[$id]['curvary'] != $vary[0]) {
270
+ array_shift($vary);
271
+ }
272
+
273
+ $this->_curList = array(
274
+ 'id' => $id,
275
+ 'fixed' => $fixed,
276
+ 'vary' => $vary,
277
+ 'working' => 0);
278
+ if ( ($urls = $this->_getCrawlListFileData($id)) != null ) {
279
+ $allurls = explode("\n", $urls) ;
280
+ // verify data
281
+ $header = explode("\t", array_shift($allurls));
282
+ if (($m['gentime'] == $header[0])
283
+ && ($m['listsize'] == $header[1])
284
+ && ($m['env'] == $header[2])
285
+ && count($allurls) == $m['listsize']) {
286
+ $this->_curList['urls'] = $allurls;
287
+ }
288
+ else if ( $this->_isDebug ) {
289
+ $this->_debugLog('load saved url list, header does not match, will regenerate') ;
290
+ }
291
+ }
292
+ else if ($this->_isDebug) {
293
+ $this->_debugLog('load saved url list failed, will regenerate');
294
+ }
295
+
296
+ if (!isset($this->_curList['urls'])) {
297
+ // regenerate
298
+ $this->_curList['urls'] = $this->_generateUrlList($id);
299
+ }
300
+
301
+ if ($this->_meta[$id]['listsize'] > 0) {
302
+ return true;
303
+ }
304
+ else {
305
+ // get next list
306
+ return $this->_prepareCurList();
307
+ }
308
+ }
309
+
310
+ protected function _parseEnvCookies( $env, &$vary )
311
+ {
312
+ $fixed = 'litemage_cron=' . self::USER_AGENT .';';
313
+ if ( $env ) {
314
+ $lsvary = array();
315
+ $multiCurr = array('-') ; // default currency
316
+ $multiCgrp = array('-') ; // default user group
317
+
318
+ $env = trim($env, '/');
319
+ $envs = explode('/', $env) ;
320
+ $envVars = array() ;
321
+ $cnt = count($envs) ;
322
+ for ( $i = 0 ; ($i + 1) < $cnt ; $i+=2 ) {
323
+ $envVars[$envs[$i]] = $envs[$i + 1] ;
324
+ }
325
+ if ( isset($envVars['vary_dev']) ) {
326
+ $lsvary['dev'] = 1 ;
327
+ }
328
+
329
+ if ( isset($envVars['store']) ) {
330
+ $fixed .= Mage_Core_Model_Store::COOKIE_NAME . '=' . $envVars['store'] . ';';
331
+ $lsvary['st'] = $envVars['storeId'] ;
332
+ }
333
+
334
+ if ( isset($envVars['vary_cgrp']) ) {
335
+ $multiCgrp = explode(',', $envVars['vary_cgrp']) ;
336
+ }
337
+
338
+ if ( isset($envVars['vary_curr']) ) {
339
+ $multiCurr = explode(',', $envVars['vary_curr']) ;
340
+ }
341
+
342
+ foreach ( $multiCurr as $currency ) {
343
+ $cookie_vary = '';
344
+ $lsvary1 = $lsvary;
345
+
346
+ if ( $currency != '-' ) {
347
+ $lsvary1['curr'] = $currency ;
348
+ $cookie_vary .= Mage_Core_Model_Store::COOKIE_CURRENCY . '=' . $currency . ';' ;
349
+ }
350
+
351
+ foreach ( $multiCgrp as $cgrp ) {
352
+ if ( $cgrp != '-' ) {
353
+ // need to set user id
354
+ $lsvary1['cgrp'] = $cgrp ;
355
+ }
356
+
357
+ if (!empty($lsvary1)) {
358
+ ksort($lsvary1) ;
359
+ $lsvary1_val = '';
360
+ foreach ($lsvary1 as $k => $v) {
361
+ $lsvary1_val .= $k . '%7E' . urlencode($v) . '%7E'; // %7E is "~"
362
+ }
363
+ $cookie_vary .= self::ENV_COOKIE_NAME . '=' . $lsvary1_val . ';';
364
+ }
365
+ $vary[] = $cookie_vary; // can be empty string for default no vary
366
+ }
367
+ }
368
+
369
+ }
370
+ else {
371
+ $vary[] = ''; // no vary
372
+ }
373
+
374
+ return $fixed;
375
+ }
376
+
377
+ protected function _getNextUrls(&$curCookie)
378
+ {
379
+ $id = $this->_curList['id'];
380
+ if ($this->_meta[$id]['endtime'] > 0) {
381
+ if ($this->_prepareCurList()) {
382
+ return $this->_getNextUrls($curCookie);
383
+ }
384
+ else {
385
+ return null;
386
+ }
387
+ }
388
+
389
+ $curpos = $this->_meta[$id]['curpos'];
390
+ $curCookie = $this->_curList['fixed'] . $this->_meta[$id]['curvary'];
391
+ $urls = array_slice($this->_curList['urls'],
392
+ $this->_meta[$id]['curpos'],
393
+ $this->_curThreads);
394
+ $this->_curList['working'] = count($urls);
395
+
396
+ if (empty($urls)) {
397
+ return null;
398
+ }
399
+ else {
400
+ $baseurl = $this->_meta[$id]['baseurl'];
401
+ foreach ($urls as $key => $val) {
402
+ $urls[$key] = $baseurl . $val;
403
+ }
404
+ return $urls ;
405
+ }
406
+ }
407
+
408
+ protected function _finishCurPosition()
409
+ {
410
+ $now = time();
411
+ $id = $this->_curList['id'];
412
+ if (($this->_meta[$id]['curpos'] + $this->_curList['working']) < $this->_meta[$id]['listsize']) {
413
+ $this->_meta[$id]['curpos'] += $this->_curList['working'];
414
+ }
415
+ else {
416
+ if (count($this->_curList['vary']) > 1) {
417
+ array_shift($this->_curList['vary']);
418
+ $this->_meta[$id]['curvary'] = $this->_curList['vary'][0];
419
+ $this->_meta[$id]['curpos'] = 0;
420
+ }
421
+ else {
422
+ $this->_meta[$id]['endtime'] = $now;
423
+ $this->_meta[$id]['curpos'] = $this->_meta[$id]['listsize'];
424
+ }
425
+ }
426
+ $this->_meta[$id]['queried'] += $this->_curList['working'];
427
+ $this->_meta[$id]['lastquerytime'] = $now;
428
+ $this->_meta['lastupdate'] = $now;
429
+ $this->_metaUpdated = true;
430
+ $this->_curList['working'] = 0;
431
+ }
432
+
433
+ protected function _newStoreMeta($storeInfo, $tmpmsg)
434
+ {
435
+ $meta = array(
436
+ 'id' => $storeInfo['id'], // store1, custom1, delta
437
+ 'storeid' => $storeInfo['storeid'],
438
+ 'baseurl' => $storeInfo['baseurl'],
439
+ 'ttl' => $storeInfo['ttl'],
440
+ 'interval' => $storeInfo['interval'],
441
+ 'priority' => $storeInfo['priority'],
442
+ 'gentime' => 0,
443
+ 'listsize' => 0,
444
+ 'env' => $storeInfo['env'],
445
+ 'curpos' => 0,
446
+ 'curvary' => '',
447
+ 'queried' => 0,
448
+ 'lastquerytime' => 0,
449
+ 'endtime' => 0);
450
+ if (isset($storeInfo['file'])) {
451
+ $meta['file'] = $storeInfo['file'];
452
+ }
453
+ if ($tmpmsg) {
454
+ $meta['tmpmsg'] = $tmpmsg;
455
+ if ( $this->_isDebug ) {
456
+ $this->_debugLog($tmpmsg) ;
457
+ }
458
+ }
459
+
460
+ return $meta;
461
+ }
462
+
463
+ protected function _saveMeta($meta=null)
464
+ {
465
+ if ($meta == null) {
466
+ $meta = $this->_meta ;
467
+ }
468
+ $tags = array( Litespeed_Litemage_Helper_Data::LITEMAGE_GENERAL_CACHE_TAG, self::WARMUP_META_CACHE_ID ) ;
469
+ Mage::app()->saveCache(serialize($meta), self::WARMUP_META_CACHE_ID, $tags) ;
470
+ }
471
+
472
+ protected function _initMeta()
473
+ {
474
+ $priority = array();
475
+ $curtime = time();
476
+ $this->_meta = array();
477
+
478
+ $saved = array();
479
+ if ( $meta = Mage::app()->loadCache(self::WARMUP_META_CACHE_ID) ) {
480
+ $saved = unserialize($meta) ;
481
+ if (isset($saved['lastupdate'])) {
482
+ $this->_meta['lastupdate'] = $saved['lastupdate'];
483
+ }
484
+ if (isset($saved['endreason'])) {
485
+ $this->_meta['endreason'] = $saved['endreason'];
486
+ }
487
+ }
488
+
489
+ if (empty($this->_conf['store'])) {
490
+ return $priority;
491
+ }
492
+
493
+ foreach( $this->_conf['store'] as $listId => $info) {
494
+ $tmpmsg = '';
495
+ if (isset($saved[$listId])) {
496
+ // validate saved
497
+ $m = $saved[$listId];
498
+ if (isset($m['storeid']) && ($m['storeid'] == $info['storeid'])
499
+ && isset($m['env']) && ($m['env'] == $info['env'])
500
+ && isset($m['interval']) && ($m['interval'] == $info['interval'])
501
+ && isset($m['priority']) && ($m['priority'] == $info['priority'])
502
+ && isset($m['baseurl']) && ($m['baseurl'] == $info['baseurl'])) {
503
+
504
+ if (($m['endtime'] == 0) // not finished
505
+ || ($m['endtime'] + $m['interval'] > $curtime)) { // not timedout
506
+ $this->_meta[$listId] = $m;
507
+ }
508
+ else {
509
+ $tmpmsg = strtoupper($listId) . ' - ' . Mage::helper('litemage/data')->__('Maximum Run Time exceeded. List will be regenerated.');
510
+ }
511
+ }
512
+ else {
513
+ $tmpmsg = strtoupper($listId) . ' - ' . Mage::helper('litemage/data')->__('Saved configuration does not match current configuration. List will be regenerated.');
514
+ }
515
+ }
516
+ if (!isset($this->_meta[$listId])) {
517
+ $this->_meta[$listId] = $this->_newStoreMeta($info, $tmpmsg);
518
+ }
519
+ $priority[$listId] = $this->_meta[$listId]['priority'];
520
+ }
521
+
522
+ asort($priority, SORT_NUMERIC);
523
+
524
+ return $priority;
525
+ }
526
+
527
+ protected function _init()
528
+ {
529
+ if (empty($this->_conf['store'])) {
530
+ return false;
531
+ }
532
+ if ( $this->_isDebug ) {
533
+ $this->_debugLog('cron config is = ' . print_r($this->_conf, true)) ;
534
+ }
535
+
536
+ $priority = $this->_initMeta();
537
+ $this->_priority = array();
538
+ foreach ($priority as $listId => $pri ) {
539
+
540
+ if ($this->_meta[$listId]['gentime'] == 0) {
541
+ $this->_generateUrlList($listId);
542
+ }
543
+ if ($this->_meta[$listId]['listsize'] > 0 && $this->_meta[$listId]['endtime'] == 0) {
544
+ // need crawl
545
+ $this->_priority[] = $listId;
546
+ }
547
+ }
548
+
549
+ if ($this->_metaUpdated) {
550
+ $this->_saveMeta();
551
+ }
552
+
553
+ if ( $this->_isDebug ) {
554
+ $this->_debugLog('cron meta starting = ' . print_r($this->_meta, true)) ;
555
+ }
556
+
557
+ if ( empty($this->_priority) ) {
558
+ if ( $this->_isDebug )
559
+ $this->_debugLog("no url list available for warm up") ;
560
+ return false;
561
+ }
562
+ else {
563
+
564
+ $maxTime = (int) ini_get('max_execution_time') ;
565
+ if ( $maxTime == 0 )
566
+ $maxTime = 300 ; // hardlimit
567
+ else
568
+ $maxTime -= 5 ;
569
+
570
+ $configed = $this->_conf[Litespeed_Litemage_Helper_Data::CFG_WARMUP_MAXTIME];
571
+ if ( $maxTime > $configed )
572
+ $maxTime = $configed ;
573
+ $this->_maxRunTime = $maxTime + time();
574
+
575
+ $this->_adjustCurThreads();
576
+
577
+ return $this->_prepareCurList();
578
+ }
579
+ }
580
+
581
+ protected function _adjustCurThreads()
582
+ {
583
+ $max = $this->_conf[Litespeed_Litemage_Helper_Data::CFG_WARMUP_THREAD_LIMIT];
584
+ $limit = $this->_conf[Litespeed_Litemage_Helper_Data::CFG_WARMUP_LOAD_LIMIT] ;
585
+
586
+ $load = sys_getloadavg() ;
587
+ $curload = $load[0];
588
+ $curthreads = $this->_curThreads;
589
+
590
+ if ($this->_curThreads == -1) {
591
+ // init
592
+ if ($curload >= ($limit - 1)) {
593
+ $curthreads = 1;
594
+ }
595
+ else {
596
+ $curthreads = intval($limit - $curload);
597
+ if ($curthreads > $max) {
598
+ $curthreads = $max;
599
+ }
600
+ }
601
+ }
602
+ else {
603
+ // adjust
604
+ if ($curload >= $limit + 1 ) {
605
+ sleep(5); // sleep 5 secs
606
+ $curthreads --;
607
+ }
608
+ elseif ($curload >= $limit) {
609
+ if ($curthreads > 1) // if already 1, keep
610
+ $curthreads --;
611
+ }
612
+ elseif ( ($curload + 1) < $limit ) {
613
+ if ($curthreads < $max)
614
+ $curthreads ++;
615
+ }
616
+ }
617
+
618
+ if ($curthreads <= 0)
619
+ $curthreads = 0;
620
+
621
+ if ($this->_isDebug) {
622
+ $this->_debugLog('set current threads = ' . $curthreads . ' previous=' . $this->_curThreads
623
+ . ' max_allowed=' . $max . ' load_limit=' . $limit . ' current_load=' . $curload);
624
+ }
625
+
626
+ $this->_curThreads = $curthreads;
627
+ $this->_curThreadTime = time();
628
+
629
+ }
630
+
631
+ protected function _generateUrlList($listId)
632
+ {
633
+ if ($listId{0} == 's') {
634
+ // store
635
+ return $this->_generateStoreUrlList($listId);
636
+ }
637
+ else {
638
+ return $this->_generateCustUrlList($listId);
639
+ }
640
+ }
641
+
642
+ protected function _generateStoreUrlList($listId)
643
+ {
644
+ $app = Mage::app() ;
645
+ $storeId = $this->_meta[$listId]['storeid'];
646
+ $store = $app->getStore($storeId);
647
+ $app->setCurrentStore($store) ;
648
+
649
+ $baseUrl = $this->_meta[$listId]['baseurl'];
650
+ $basen = strlen($baseUrl);
651
+
652
+ $urls = array(''); // first line is empty for base url
653
+
654
+ $visibility = array(
655
+ Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH,
656
+ Mage_Catalog_Model_Product_Visibility::VISIBILITY_IN_CATALOG,
657
+ ) ;
658
+ $catModel = Mage::getModel('catalog/category') ;
659
+
660
+ $activeCat = $catModel->getCollection($storeId)->addIsActiveFilter() ;
661
+
662
+ $produrls = array();
663
+
664
+ // url with cat in path
665
+ foreach ( $activeCat as $cat ) {
666
+ $caturl = $cat->getUrl() ;
667
+ if (strncasecmp($baseUrl, $caturl, $basen) == 0) {
668
+ $urls[] = substr($caturl, $basen);
669
+ }
670
+ foreach ( $cat->getProductCollection($storeId)
671
+ ->addUrlRewrite($cat->getId())
672
+ ->addAttributeToFilter('visibility', $visibility)
673
+ as $prod ) {
674
+ $produrl = $prod->getProductUrl() ;
675
+ if (strncasecmp($baseUrl, $produrl, $basen) == 0) {
676
+ $produrls[] = substr($produrl, $basen);
677
+ }
678
+ }
679
+ }
680
+
681
+ // url with no cat info
682
+ foreach ( $activeCat as $cat ) {
683
+ foreach ( $cat->getProductCollection($storeId)
684
+ ->addAttributeToFilter('visibility', $visibility)
685
+ as $prod ) {
686
+ $produrl = $prod->getProductUrl() ;
687
+ if (strncasecmp($baseUrl, $produrl, $basen) == 0) {
688
+ $produrls[] = substr($produrl, $basen);
689
+ }
690
+ }
691
+ }
692
+
693
+ $sitemap = 'sitemap/cms_page' ;
694
+ $sitemap = (Mage::getConfig()->getNode('modules/MageWorx_XSitemap') !== false) ?
695
+ 'xsitemap/cms_page' : 'sitemap/cms_page' ;
696
+
697
+ $sitemodel = Mage::getResourceModel($sitemap);
698
+ if ($sitemodel != null) {
699
+ foreach ( $sitemodel->getCollection($storeId) as $item ) {
700
+ $sitemapurl = $item->getUrl();
701
+ $urls[] = $sitemapurl;
702
+ }
703
+ }
704
+
705
+ $produrls = array_unique($produrls);
706
+ $urls = array_merge($urls, $produrls);
707
+
708
+ $this->_meta[$listId]['listsize'] = count($urls);
709
+ $this->_meta[$listId]['gentime'] = time();
710
+ $this->_meta[$listId]['curpos'] = 0;
711
+ //$this->_meta[$listId]['queried'] = 0;
712
+ $this->_meta['lastupdate'] = $this->_meta[$listId]['gentime'];
713
+ $this->_metaUpdated = true;
714
+ $header = $this->_meta[$listId]['gentime'] . "\t"
715
+ . $this->_meta[$listId]['listsize'] . "\t"
716
+ . $this->_meta[$listId]['env'] . "\n";
717
+
718
+ if ( $this->_isDebug ) {
719
+ $this->_debugLog('Generate url map for ' . $listId . ' url count =' . $this->_meta[$listId]['listsize']);
720
+ }
721
+
722
+ $buf = $header . implode("\n", $urls);
723
+
724
+ $this->_saveCrawlListFileData($listId, $buf);
725
+
726
+ return $urls;
727
+ }
728
+
729
+ protected function _generateCustUrlList($listId)
730
+ {
731
+ $baseUrl = $this->_meta[$listId]['baseurl'];
732
+ $basen = strlen($baseUrl);
733
+ $custlist = $this->_meta[$listId]['file'];
734
+ $lines = file($custlist, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
735
+ $urls = array();
736
+ if ($lines === false) {
737
+ if ( $this->_isDebug ) {
738
+ $this->_debugLog('Fail to read custom URL list file ' . $custlist);
739
+ }
740
+ }
741
+ else if (!empty($lines)) {
742
+ $urls[] = ''; // always add home page
743
+ foreach ($lines as $line) {
744
+ $line = ltrim(trim($line), '/');
745
+ if ($line != '') {
746
+ if (strpos($line, 'http') !== false) {
747
+ if (strncasecmp($baseUrl, $line, $basen) == 0) {
748
+ $urls[] = substr($line, $basen);
749
+ }
750
+ }
751
+ else {
752
+ $urls[] = $line;
753
+ }
754
+ }
755
+ }
756
+ $urls = array_unique($urls);
757
+ }
758
+
759
+ $this->_meta[$listId]['listsize'] = count($urls);
760
+ $this->_meta[$listId]['gentime'] = time();
761
+ $this->_meta['lastupdate'] = $this->_meta[$listId]['gentime'];
762
+ $this->_metaUpdated = true;
763
+ $header = $this->_meta[$listId]['gentime'] . "\t"
764
+ . $this->_meta[$listId]['listsize'] . "\t"
765
+ . $this->_meta[$listId]['env'] . "\n";
766
+
767
+ if ( $this->_isDebug ) {
768
+ $this->_debugLog('Generate url map for ' . $listId . ' url count =' . $this->_meta[$listId]['listsize']);
769
+ }
770
+
771
+ $buf = $header . implode("\n", $urls);
772
+ $this->_saveCrawlListFileData($listId, $buf);
773
+
774
+ return $urls;
775
+ }
776
+
777
+ protected function _debugLog( $message, $level = 0 )
778
+ {
779
+ if ( $this->_isDebug ) {
780
+ $message = str_replace("\n", ("\n" . $this->_debugTag . ' '), $message);
781
+ Mage::log($this->_debugTag . ' '. $message ) ;
782
+ }
783
+
784
+ }
785
+
786
+ }
app/code/community/Litespeed/Litemage/Model/Observer/Esi.php CHANGED
@@ -1,360 +1,670 @@
1
- <?php //0046a
2
- if(!extension_loaded('ionCube Loader')){$__oc=strtolower(substr(php_uname(),0,3));$__ln='ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');if(function_exists('dl')){@dl($__ln);}if(function_exists('_il_exec')){return _il_exec();}$__ln='/ioncube/'.$__ln;$__oid=$__id=realpath(ini_get('extension_dir'));$__here=dirname(__FILE__);if(strlen($__id)>1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file <b>'.__FILE__.'</b> requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the <a href="http://www.ioncube.com/lw/">ionCube Loader Wizard</a> to assist with installation.');exit(199);
3
- ?>
4
- HR+cPnKKppOcTpGvAnjQ5MicRDiUENRj2zdwwAgixuuDmMRJdrfWizGLHi+kS2EX0rObDcIdKJu2
5
- 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
- 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
- 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
- yRWGzVDPsOuFc01Cj1fjq5RHiOpy6fWGbhwN1IMxomRtAAvQdGz4i9NgYRXgirwpAQUNCAuZCmKz
9
- 67bNq3ioP6wnx7qHhZLWJHDlouv8Y5kvzTCrW2MFHLGpCA1PtlKvsCo4ikmNCE3J5BokTEBDh7Kj
10
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- H7ZTJgJnHb1x7gH7Kgn3CZ+S5qHRwZd/iYZrH3qQniW/xzkklHiNNNPL2zyhGbdEFvjh3rtN6gtI
23
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- iLcrb3v5FOyADqbUunYfY76oTQqMdf7xhFzAjiZDq7UAE29Xtq3qqtVVmj75Z572X33tC8VfTuhF
31
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 1wq5k/IUhI1+lpB5ixnBmG5cXJ95i8YyeyBbgfoA6c4ti1p/rHxakAa80u32Z8y1ATqTao5FasNn
43
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- s416YRfUI0jzXKFQmmFWKGCB96ym9LnvvqQnAHD9MUEgEfU1QnYVmuiPqIWrIShIWij09zAULe7z
53
- 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
- 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
- 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
- JTeNYxP3kTWXYYNoqj6T5VaNWS93OE+Yas0aayyJlC+gq0r4u6GBoNuAh+sP7bkaHJQUWCQDntzj
57
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 0YgwvE0bqb2a7vKwO3rmyvD50Xf0BM59TunFeD+uCzS0bHAf41thVhTW5WLLc9914Lv6IrvoMmct
67
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +dELKZ9k4vf8vFLXuXuJroANkQHI/2+C4fwnMx2YC5JOyfSlW+sjDywnKEzG8hCK7ptJi/dNo7oK
77
- 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
- 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
- 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
- 2ylwaz8r9rQlC0pCACiZvwBlnLT7bdHLQW9GGRty6/b7Hf8abjNPfYawbcTBOda7L6TU9PWlvvcU
81
- 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
- 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
- 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
- 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
- 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
- UsYbCDGiL8Dar7HVHERtgoq5SV32+eGpuoGEyrJ+5GP1+O6HEwBJ/RZ0v9FrltT2t58Iu3K4/m04
87
- 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
- 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
- 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
- FPMXqnRcW+PtGomSx6rADklcJ5NXYtLIcgPi1jaA7Rvxuup53oKDalLmjwmXaE+pYDWklph8SAaD
91
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 7BtrRrg9yAW98X4O3Sohj6p/SfFzTfdVpgiULAqd/V9YW4n8MHHbrvL1jAZ6GAcEjWDTdal4EJRN
109
- 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
- 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
- 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
- 7tfxPzGnAIz5SOcutcUOc/F8qcGcT0lHU4cFVvvBqqNNZfO2gtmnwdHWIsn2USTlQASwX/umYOuM
113
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- brRxWUR8tb0l4dOYiVErBvVxGSxP2r4FocIQCVFj1M7jV21vAFKgBVnPLc1DrASsgMINrlDFG7iH
128
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- jFE1QY7t8dVssfhBLsbNVqRQ5Gu7PPg+FWx/tBS41w6T7zP53UhtzGAChbXOHDlBlzqNUHaJptzO
145
- ++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
- IpV6nHhp8oV86NkUY5v/FJT3kdlVYYIYeRLhRXZUZkLNc+ZE5IsqczsEBoodye3ggb1Q5oGh/29q
147
- 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
- XPUKyz7e9Wi1uAjPJw7v99x8/wpPPJwTIHQZjX9zPFQNRhGtp94we75c6RPAB7IP7YAXHSBHqQiv
149
- O9alzqvfslTacQJpInxPic2+nLn9/tc/48jIM8pMPFSl+A4CHCzs/UDCG0TESR2m4KxPs5S0sWt8
150
- 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
- 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
- 8NfJZ1i7JvSof70B+Cz409ok7jyozoLTfD9qKrAT0e6tFcCxPKg8d2pr0W0jdpYU1NhlA23fzI21
153
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- JlYDbeZkvNhw3q0hg911jLS8pwIZ1yhxdjPGS64ee/YHTocr4FnkpNTpt6LSs7Re5LruOHWjMD6A
162
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- CsJux5LRsRMxxJXtB/SPXFrp8FDNWIqehtBTMB/iRl5u3fqfr31BS5AcVtQeiqjgWkc5tkwIvwKl
199
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- OlU+7sqkL6xsSOnx2bgYMro8lh6qYyA+V0jxP2q2pP7R6LFO7o4rAevmuqtoaWMIFPQb9g1y0OVR
218
- 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
- qlAMf4GQYKnLIKX2vk4HulYgQlvTxmf5eXKGnEboNmoFUkUUfjfRI9/lKD+M3zK9jJdLcud5kWi1
220
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- K764/ONeziIWaueGxyPZ1WRpefKu2EJh/hfw1JET8RQJxoiPO/DuZ0TpTRDe885ypKfCj/YEpR/S
239
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 4Xyl9OagxAbMGhKsIMD4J+lv5HF/YIp38sli0EIra0agEW3kKeqXVsvz8Dam0iSJHTVEElDaRVnW
250
- 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
- 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
- XsTogkFC19E6EIZ3kBFlDh54jfsExO5yzWNKnvhvbiJzXpiuf5aiD3tNtaPiCliSK0WsT8ctZMy+
253
- 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
- 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
- g/9tGkgPjtfOuonnwc9PdCdQm6POny3Ck+DZ+dc91SpyoXbBlPXOfPEVo4Fh0MmsETNLoNZQuMV2
256
- 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
- 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
- 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
- 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
- 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
- 87u+VHe5TwITRDYT1mwJ8gV4UgeNAZ5sJyvZwqCGXuoi1TbEjcW77MOI4BM+uQShxMQ0q1RoYgBS
262
- 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
- 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
- 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
- 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
- e2iVMkC1JNw3MkahniJ8CxjdWIoCKapoSR3zjNCuxr01x58R8YuipWKpCJ937tYzPXTO/ahVMeSX
267
- 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
- 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
- xNzymq0FwEHLXEsn/k+y9dPUKEZYeHe9uZPTL890i6DUGcvoWQ+5qGtBGtUbUpFZ2e6Oz9u5CmV5
270
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- B85x/gJZL28k28gKhGE++dfCKLD+x0mZ/tKzVs0jc707avJTHDUmdPe1b+CFEYx+3PQVJgCtSXym
306
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- LjguJ0ULviC+9S5MNgsFnSsb8KRVyHAOP7Fsfwa66A6rxcOgPd0R1LglwIAhbZH3DAjM+9zm0G3B
331
- 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
- M1mTsrEfjsVmJJv3xVy97fICdOKN93LiY/7asYdgVP2rvwCeBialQwlYy1MEbjC0JHYVL82G4Ui7
333
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- jhTbtrNtYvEcugms/Q03kavXAlX4R+Rt6hW7f1hP0nA9y9/EZR8kXtcE2KVcJ6+JYGdpfHD9EuR+
352
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
360
- rKc0Hq9X1UIxuYsui0==
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * LiteMage
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This program is free software: you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation, either version 3 of the License, or
10
+ * (at your option) any later version.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License
18
+ * along with this program. If not, see https://opensource.org/licenses/GPL-3.0 .
19
+ *
20
+ * @package LiteSpeed_LiteMage
21
+ * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
22
+ * @license https://opensource.org/licenses/GPL-3.0
23
+ */
24
+
25
+
26
+ class Litespeed_Litemage_Model_Observer_Esi extends Varien_Event_Observer
27
+ {
28
+
29
+ /**
30
+ * Add the core/messages block rewrite if the flash message fix is enabled
31
+ *
32
+ * The core/messages block is rewritten because it doesn't use a template
33
+ * we can replace with an ESI include tag, just dumps out a block of
34
+ * hard-coded HTML and also frequently skips the toHtml method
35
+ *
36
+ * @param Varien_Object $eventObj
37
+ * @return null
38
+ */
39
+ protected $_esi ;
40
+ protected $_isDebug ;
41
+ protected $_moduleEnabledForUser ;
42
+ protected $_canInjectEsi = -1;
43
+ protected $_helper ;
44
+ protected $_config ;
45
+ protected $_viewVary = array();
46
+ protected $_routeCache;
47
+ protected $_injectedBlocks = array();
48
+
49
+ protected function _construct()
50
+ {
51
+ $this->_helper = Mage::helper('litemage/esi') ;
52
+ $this->_config = Mage::helper('litemage/data') ;
53
+ $this->_isDebug = $this->_config->isDebug() ;
54
+ $this->_moduleEnabledForUser = $this->_config->moduleEnabledForUser();
55
+ }
56
+
57
+ public function purgeEsiCache( $eventObj )
58
+ {
59
+ if ( $this->_moduleEnabledForUser ) {
60
+ $this->_helper->addPurgeEvent($eventObj->getEvent()->getName()) ;
61
+ }
62
+ }
63
+
64
+ //customer_login, customer_logout
65
+ public function purgePrivateCache( $eventObj )
66
+ {
67
+ if ( $this->_moduleEnabledForUser ) {
68
+ $this->_helper->setPurgeHeader(array('*'), $eventObj->getEvent()->getName(), null, true) ;
69
+ $this->_viewVary[] = 'env';
70
+ }
71
+ }
72
+
73
+ //customer_login
74
+ //other are captured when pre-dispatch by action name
75
+ public function changeEnvCookie( $eventObj )
76
+ {
77
+ if ( $this->_moduleEnabledForUser ) {
78
+ $this->_viewVary[] = 'env';
79
+ }
80
+ }
81
+
82
+ //controller_action_predispatch
83
+ public function checkControllerNoCache( $eventObj )
84
+ {
85
+ // no need to check admin, this is frontend event only
86
+ if ( ! $this->_moduleEnabledForUser ) {
87
+ $this->_canInjectEsi = 0;
88
+ return ;
89
+ }
90
+ $req = Mage::app()->getRequest() ;
91
+ $controller = $eventObj->getControllerAction();
92
+ $reason = '';
93
+
94
+ if (($lmdebug = $req->getParam('LITEMAGE_DEBUG')) !== null) {
95
+ // either isDebug or IP match
96
+ if ($this->_isDebug || $this->_config->isRestrainedIP() || $this->_config->isAdminIP()) {
97
+ if ($lmdebug == 'SHOWHOLES') {
98
+ // for redirect, maybe already set, need to check, otherwise exception
99
+ if ( ! Mage::registry('LITEMAGE_SHOWHOLES') ) {
100
+ Mage::register('LITEMAGE_SHOWHOLES', 1) ;
101
+ }
102
+ // set to nocache later at beforeResponseSend
103
+ }
104
+ elseif ($lmdebug == 'NOCACHE') {
105
+ $reason = 'contains var LITEMAGE_DEBUG=NOCACHE';
106
+ }
107
+ }
108
+ else {
109
+ $controller->norouteAction();
110
+ return;
111
+ }
112
+ }
113
+
114
+ $curActionName = $controller->getFullActionName() ;
115
+ if ($reason == '') {
116
+ $reason = $this->_cannotCache($req, $curActionName);
117
+ }
118
+
119
+ if ($reason != '') {
120
+ $this->_canInjectEsi = 0;
121
+ $reason = ' NO_CACHE=' . $reason;
122
+
123
+ // special checks
124
+ $envChanged = array('customer_account_logoutSuccess', 'directory_currency_switch');
125
+ if (in_array($curActionName, $envChanged)) {
126
+ $this->_viewVary[] = 'env';
127
+ }
128
+ }
129
+ else {
130
+
131
+ // hardcode for now
132
+ if ( strncmp('catalog_category_', $curActionName, strlen('catalog_category_')) == 0 ) {
133
+ $this->_viewVary[] = 'toolbar' ;
134
+ Mage::Helper('litemage/viewvary')->restoreViewVary($this->_viewVary) ;
135
+ }
136
+ elseif (in_array($curActionName, $this->_config->getNoCacheConf(Litespeed_Litemage_Helper_Data::CFG_FULLCACHE_ROUTE))) {
137
+ $this->_setWholeRouteCache($curActionName, $controller);
138
+ }
139
+
140
+ if (($lmctrl = $req->getParam('LITEMAGE_CTRL')) !== null) {
141
+ // either isDebug or IP match
142
+ if ($this->_config->isAdminIP()) {
143
+ if ($lmctrl == 'PURGE') {
144
+ // for redirect, maybe already set, need to check, otherwise exception
145
+ if (!Mage::registry('LITEMAGE_PURGE')) {
146
+ Mage::register('LITEMAGE_PURGE', 1);
147
+ }
148
+ // set to nocache later at beforeResponseSend
149
+ }
150
+ }
151
+ else {
152
+ $controller->norouteAction();
153
+ return;
154
+ }
155
+ }
156
+
157
+ $this->_helper->setCacheControlFlag(Litespeed_Litemage_Helper_Esi::CHBM_CACHEABLE) ;
158
+
159
+ if (Mage::getSingleton('core/cookie')->get('litemage_cron') == Litespeed_Litemage_Model_Observer_Cron::USER_AGENT) {
160
+ $currency = Mage::getSingleton('core/cookie')->get('currency');
161
+ if ($currency != '')
162
+ Mage::app()->getStore()->setCurrentCurrencyCode($currency);
163
+ }
164
+ }
165
+
166
+ if ( $this->_isDebug ) {
167
+ $this->_config->debugMesg('****** PRECHECK route_action [' . $curActionName . '] url=' . $req->getRequestString() . $reason) ;
168
+ }
169
+
170
+ }
171
+
172
+ // return reason string. if can be cached, return false;
173
+ protected function _cannotCache( $req, $curActionName )
174
+ {
175
+ $requrl = $req->getRequestString() ;
176
+
177
+ if ( $req->isPost() ) {
178
+ return 'POST';
179
+ }
180
+
181
+ $nocache = $this->_config->getNoCacheConf() ;
182
+ foreach ( $nocache[Litespeed_Litemage_Helper_Data::CFG_NOCACHE_VAR] as $param ) {
183
+ if ( $req->getParam($param) ) {
184
+ return 'contains param ' . $param;
185
+ }
186
+ }
187
+
188
+ // check controller level
189
+ $cacheable = false;
190
+ foreach ( $nocache[Litespeed_Litemage_Helper_Data::CFG_CACHE_ROUTE] as $route ) {
191
+ if ( strncmp($route, $curActionName, strlen($route)) == 0 ) {
192
+ $cacheable = true;
193
+ break;
194
+ }
195
+ }
196
+ if ( !$cacheable ) {
197
+ return 'route not cacheable';
198
+ }
199
+
200
+ foreach ( $nocache[Litespeed_Litemage_Helper_Data::CFG_NOCACHE_ROUTE] as $route ) {
201
+ if ( strncmp($route, $curActionName, strlen($route)) == 0 ) {
202
+ return 'subroute disabled';
203
+ }
204
+ }
205
+
206
+ foreach ( $nocache[Litespeed_Litemage_Helper_Data::CFG_NOCACHE_URL] as $url ) {
207
+ if ( strpos($requrl, $url) !== false ) {
208
+ return 'disabled url ' . $url;
209
+ }
210
+ }
211
+
212
+ return ''; // can be cached
213
+ }
214
+
215
+
216
+ // event core_layout_block_create_after
217
+ public function checkEsiBlock($eventObj)
218
+ {
219
+ if ( ! $this->_moduleEnabledForUser )
220
+ return;
221
+
222
+ if ($this->_canInjectEsi === -1) {
223
+ $this->_canInjectEsi = $this->_helper->canInjectEsi();
224
+ }
225
+
226
+ if ( ! $this->_canInjectEsi )
227
+ return ;
228
+
229
+ // this is to deal with duplicated block names, caused by bad extensions, those blocks are lost in layout->_blocks[name], since name not unique
230
+ $block = $eventObj->getData('block') ;
231
+
232
+ $bconf = $this->_config->isEsiBlock($block);
233
+ if ($bconf != null) {
234
+ $blockName = $bconf['bn'];
235
+
236
+ if (!isset($this->_injectedBlocks[$blockName])) {
237
+ $bconf['blocks'] = array();
238
+ $this->_injectedBlocks[$blockName] = $bconf;
239
+ }
240
+ $this->_injectedBlocks[$blockName]['blocks'][] = $block;
241
+ }
242
+ // needs to be in its own section, not in else
243
+ if ($block->hasData('litemage_dynamic')) {
244
+ // dynamic injection right now
245
+ $this->_injectDynamicBlock($block);
246
+ }
247
+ }
248
+
249
+ protected function _injectDynamicBlock($block)
250
+ {
251
+ $bd = $block->getData('litemage_dynamic');
252
+ if (!isset($bd['type']))
253
+ return;
254
+
255
+ if (!isset($bd['tag'])) { // todo: need to validate tag
256
+ /*$conf = $this->_config->getEsiConf('tag', $tag) ;
257
+ if ($conf == null) {
258
+ if ( $this->_isDebug ) {
259
+ $this->_config->debugMesg('Missing config for tag '. $tag) ;
260
+ }
261
+ return false ;
262
+ } */
263
+ $bd['tag'] = 'welcome';
264
+ }
265
+ $bd['cache-tag'] = 'E.' . $bd['tag'];
266
+ if (!isset($bd['access']) || !in_array($bd['access'], array('private', 'public'))) {
267
+ $bd['access'] = 'private';
268
+ }
269
+ if (!isset($bd['valueonly'])) {
270
+ $bd['valueonly'] = false;
271
+ }
272
+
273
+ /*
274
+ * $litemage_attr = array('litemage_dynamic' =>
275
+ array('tag' => 'welcome', 'access' => 'private', 'type' => 'customer/form_login', 'template' => 'customer/form/mini.login.phtml'));
276
+ */
277
+
278
+ $blockName = $block->getNameInLayout();
279
+ $layout = $block->getLayout();
280
+
281
+ //re-init just in case
282
+ $conf = $this->_config->getEsiConf() ;
283
+ $preload = $this->_initInjectionCache($layout) ; // -1: donot use cache, 0 : no cahce, 1: cache loaded, 2: require update
284
+
285
+
286
+ $esiHtml = '' ;
287
+ if ( $preload && isset($this->_esi['layout']['blocks'][$blockName]) ) {
288
+ $esiHtml = $this->_esi['layout']['blocks'][$blockName] ;
289
+ unset($this->_esi['layout']['blocks'][$blockName]) ;
290
+ }
291
+ else {
292
+ if ( $preload == 1 ) {
293
+ $preload = 2 ; // found a new blockName not preloaded
294
+ }
295
+
296
+ $urlOptions = array('b' => $blockName, 't' => $bd['tag']);
297
+ $urlOptions['p'] = str_replace('/', '--', $bd['type']);
298
+ if (isset($bd['template'])) {
299
+ $urlOptions['l'] = str_replace('/', '--', $bd['template']);
300
+ }
301
+ $urlOptions = array_merge($urlOptions, $this->_esi['urlParams']);
302
+
303
+ $esiUrl = $this->_helper->getSubReqUrl('litemage/esi/getBlock', $urlOptions) ;
304
+ $esiHtml = '<' . $this->_config->esiTag('include') . ' src="' . $esiUrl . '" combine="sub" cache-tag="' . $bd['cache-tag'] . '" cache-control="no-vary,' . $bd['access'] . '"/>' ;
305
+ if (!$bd['valueonly'] && $this->_isDebug) {
306
+ $esiHtml = '<!--Litemage esi started ' . $blockName . '-->' . $esiHtml . '<!--Litemage esi ended ' . $blockName . '-->' ;
307
+ }
308
+ }
309
+
310
+ $this->_helper->setEsiBlockHtml($blockName, $esiHtml) ;
311
+
312
+ $esiBlock = new Litespeed_Litemage_Block_Core_Esi() ;
313
+ if ($bd['valueonly']) {
314
+ $esiBlock->setData('valueonly', 1); // needs to set before initbypeer
315
+ }
316
+ $esiBlock->setData('dynamic', 1);
317
+ $esiBlock->initByPeer($block, $esiHtml) ;
318
+ $this->_esi['layout']['preload'] = $preload ;
319
+
320
+ }
321
+
322
+ //controller_action_layout_generate_blocks_after
323
+ public function prepareInjection( $eventObj )
324
+ {
325
+ if ($this->_canInjectEsi === -1) {
326
+ $this->_canInjectEsi = $this->_helper->canInjectEsi();
327
+ }
328
+
329
+ if ( ! $this->_canInjectEsi )
330
+ return ;
331
+
332
+ $this->_helper->initFormKey() ;
333
+
334
+ if (count($this->_injectedBlocks) == 0)
335
+ return;
336
+
337
+ $layout = $eventObj->getData('layout') ;
338
+ $conf = $this->_config->getEsiConf() ;
339
+ $preload = $this->_initInjectionCache($layout) ; // -1: donot use cache, 0 : no cahce, 1: cache loaded, 2: require update
340
+ $esiLayoutUpdate = null ;
341
+ $conflict = array();
342
+
343
+ foreach ( $this->_injectedBlocks as $blockName => $bd ) {
344
+
345
+ foreach ($bd['blocks'] as $block) {
346
+
347
+ $esiHtml = '' ;
348
+
349
+ $blockAlias = $block->getBlockAlias();
350
+ $blockIndex = $blockName;
351
+ if ($blockAlias != '' && $blockAlias != $blockName) {
352
+ $blockIndex .= '!' . $blockAlias;
353
+ }
354
+
355
+ // check confliction
356
+ if (!isset($conflict[$blockIndex])) {
357
+ $conflict[$blockIndex] = array($block);
358
+ }
359
+ else {
360
+ $conflict[$blockIndex][] = $block;
361
+ if ( $this->_isDebug )
362
+ $this->_config->debugMesg('ALERT not unique block name plus alias ' . $blockIndex);
363
+ }
364
+
365
+ if ( $preload && isset($this->_esi['layout']['blocks'][$blockIndex]) ) {
366
+ $esiHtml = $this->_esi['layout']['blocks'][$blockIndex] ;
367
+ unset($this->_esi['layout']['blocks'][$blockIndex]) ;
368
+ }
369
+ else {
370
+ if ( $preload == 1 ) {
371
+ $preload = 2 ; // found a new blockIndex not preloaded
372
+ }
373
+
374
+ // check if it is a child block of an injected block, bypassed one also need to save esihtml
375
+ if ( $this->_checkIsInjectedChild($block) ) {
376
+ $esiHtml = 'BYPASS';
377
+ }
378
+ else {
379
+
380
+ if ( $esiLayoutUpdate == null ) {
381
+ $esiLayoutUpdate = Mage::getSingleton('litemage/layout_update') ;
382
+ $esiLayoutUpdate->setStoreId($this->_esi['urlParams']['s']) ;
383
+ }
384
+
385
+ $urlOptions = $this->_getEsiUrlBHOptions($blockName, $block, $layout, $esiLayoutUpdate) ;
386
+ $urlOptions['t'] = $bd['tag'];
387
+ if ($blockAlias != '' && $blockName != $blockAlias) {
388
+ $urlOptions['a'] = $blockAlias;
389
+ }
390
+ $urlOptions = array_merge($urlOptions, $this->_esi['urlParams']);
391
+
392
+ $esiUrl = $this->_helper->getSubReqUrl('litemage/esi/getBlock', $urlOptions) ;
393
+
394
+ $esiHtml = '<' . $this->_config->esiTag('include') . ' src="' . $esiUrl . '" combine="sub" cache-tag="' . $bd['cache-tag'] . '" cache-control="no-vary,' . $bd['access'] . '"/>' ;
395
+ if (!$bd['valueonly'] && $this->_isDebug) {
396
+ //$esiHtml = '<esi:remove>ESI processing not enabled</esi:remove><!--esi' . $esiInclude . '-->' ; // remove comment, for html minify
397
+ $esiHtml = '<!--Litemage esi started ' . $blockName . '-->' . $esiHtml . '<!--Litemage esi ended ' . $blockName . '-->' ;
398
+ }
399
+ }
400
+ }
401
+
402
+ $this->_helper->setEsiBlockHtml($blockIndex, $esiHtml) ;
403
+
404
+ if ($esiHtml == 'BYPASS') {
405
+ // can be a child block of an injected block
406
+ continue;
407
+ }
408
+
409
+ if ( $bd['tag'] == 'messages' ) {
410
+ $esiBlock = new Litespeed_Litemage_Block_Core_Messages() ;
411
+ }
412
+ else {
413
+ $esiBlock = new Litespeed_Litemage_Block_Core_Esi() ;
414
+ }
415
+ if ($bd['valueonly']) {
416
+ $esiBlock->setData('valueonly', 1); // needs to be before initbypeer
417
+ }
418
+ $esiBlock->initByPeer($block, $esiHtml) ;
419
+
420
+ }
421
+
422
+ }
423
+
424
+ $this->_esi['layout']['preload'] = $preload ;
425
+ }
426
+
427
+ protected function _checkIsInjectedChild($block)
428
+ {
429
+ $layer = 20;
430
+ $blk = $block;
431
+ while (($blk = $blk->getParentBlock()) && $layer > 0 ) {
432
+ if ($blk->getData('litemageInjected')) {
433
+ return true;
434
+ }
435
+ $layer --;
436
+ }
437
+ return false;
438
+ }
439
+
440
+ protected function _setWholeRouteCache($actionName, $controller)
441
+ {
442
+ $app = Mage::app();
443
+ $design = Mage::getDesign() ;
444
+ $tags = array($actionName);
445
+ $tags[] = $app->getStore()->getId() ;
446
+ $tags[] = $design->getPackageName();
447
+ $tags[] = $design->getTheme('layout');
448
+ $cacheId = 'LITEMAGE_ROUTE_' . md5(join('__', $tags));
449
+
450
+ $this->_routeCache = array('actionName' => $actionName, 'cacheId' => $cacheId);
451
+ if ($result = $app->loadCache($cacheId)) {
452
+ $this->_routeCache['content'] = unserialize($result);
453
+ $controller->setFlag('', Mage_Core_Controller_Varien_Action::FLAG_NO_DISPATCH, 1);
454
+ }
455
+ }
456
+
457
+ protected function _initInjectionCache( $layout )
458
+ {
459
+ if (isset($this->_esi['layout']['cacheId'])) {
460
+ // already initialized
461
+ return isset($this->_esi['layout']['preload']) ? $this->_esi['layout']['preload'] : 0;
462
+ }
463
+
464
+ $this->_esi = array(
465
+ 'layout' => array(),
466
+ 'urlParams' => $this->_helper->getEsiSharedParams()) ;
467
+ $rootHandles = $layout->getUpdate()->getHandles() ;
468
+ //should we deal with wrong theme input? THEME_frontend_neoshop_Designer Sarees, Salwar Kameez, Lehengas, Wedding Sherwanis, Mens Kurta Pyjama, Online Shopping
469
+ $tags = array() ;
470
+ foreach ( $rootHandles as $handle ) {
471
+ if ( (strpos($handle, 'CATEGORY_') === false) && ((strpos($handle, 'PRODUCT_') === false) || (strpos($handle, 'PRODUCT_TYPE_') !== false)) ) {
472
+ $this->_esi['layout']['handles'][] = $handle ;
473
+ if ( ($handle != 'customer_logged_out') && ($handle != 'customer_logged_in') )
474
+ $tags[] = $handle ;
475
+ }
476
+ }
477
+ sort($tags) ;
478
+ $tags[] = 'LITEMAGE_INJECT_ESI' ;
479
+ $tags[] = join('-', $this->_esi['urlParams']); // for env vary
480
+ $cacheId = 'LITEMAGE_BLOCK_' . md5(join('__', $tags)) ;
481
+ $this->_esi['layout']['cacheId'] = $cacheId ;
482
+ $this->_helper->setEsiOn() ;
483
+
484
+ $preload = 0 ;
485
+
486
+ if ( $result = Mage::app()->loadCache($cacheId) ) {
487
+ $preload = 1 ;
488
+ $this->_esi['layout']['blocks'] = unserialize($result) ;
489
+ }
490
+
491
+ if ( $this->_isDebug )
492
+ $this->_config->debugMesg('INJECTING_' . $preload . ' ' . $_SERVER['REQUEST_URI']) ;
493
+
494
+ return $preload ;
495
+ }
496
+
497
+ protected function _getEsiUrlBHOptions( $blockName, $block, $layout, $esiLayoutUpdate )
498
+ {
499
+ // for blocks and handles
500
+ $hParam = array() ;
501
+ $handles = array() ;
502
+ $packageLayout = $esiLayoutUpdate->getPackageLayout() ;
503
+
504
+ $blockNames = $this->_getChildrenNames($block, $layout) ;
505
+ if ( ($alias = $block->getBlockAlias()) && ($alias != $blockName) ) {
506
+ array_unshift($blockNames, $blockName, $alias) ;
507
+ }
508
+ else {
509
+ array_unshift($blockNames, $blockName) ;
510
+ }
511
+ foreach ( $this->_esi['layout']['handles'] as $h ) {
512
+ if ( $h == 'customer_logged_out' || $h == 'customer_logged_in' ) {
513
+ $handles[] = $h ;
514
+ }
515
+ else {
516
+
517
+ foreach ( $blockNames as $name ) {
518
+ $xpath = '//' . $h . '//*[@name="' . $name . '"]' ;
519
+ if ( $node = $packageLayout->xpath($xpath) ) {
520
+ $handles[] = $h ;
521
+ $hParam[] = $h ;
522
+ break ;
523
+ }
524
+ }
525
+ }
526
+ }
527
+
528
+ $hasCache = $esiLayoutUpdate->loadEsiBlockCache($blockName, $handles) ;
529
+ if ( $hasCache === 0 ) {
530
+ //save layout cache right now, most economic way, blockNames will be filtered
531
+ $blockNames = $esiLayoutUpdate->importLayoutUpdate($blockNames, $handles, $layout) ;
532
+ }
533
+ elseif ( $hasCache == 1 ) {
534
+ // blockNames will be filtered
535
+ $blockNames = $esiLayoutUpdate->getBlockNames() ;
536
+ }
537
+
538
+ $urlOptions = array(
539
+ 'b' => implode(',', $blockNames) ) ;
540
+
541
+ if ( count($hParam) > 0 )
542
+ $urlOptions['h'] = implode(',', $hParam) ;
543
+
544
+ return $urlOptions ;
545
+ }
546
+
547
+ protected function _getChildrenNames( $block, $layout )
548
+ {
549
+ if ($block == null) {
550
+ return array();
551
+ }
552
+
553
+ $children = $block->getSortedChildren() ;
554
+ foreach ( $children as $childName ) {
555
+ if ( $childBlock = $layout->getBlock($childName) ) {
556
+ $alias = $childBlock->getBlockAlias() ;
557
+ if ( $alias != $childName ) {
558
+ $children[] = $alias ;
559
+ }
560
+ $grandChildren = $this->_getChildrenNames($childBlock, $layout) ;
561
+ if ( count($grandChildren) > 0 ) {
562
+ $children = array_merge($children, $grandChildren) ;
563
+ }
564
+ }
565
+ }
566
+ return $children ;
567
+ }
568
+
569
+ //event: http_response_send_before
570
+ public function beforeResponseSend( $eventObj )
571
+ {
572
+ if ( !$this->_moduleEnabledForUser )
573
+ return;
574
+
575
+ $resp = $eventObj->getResponse();
576
+
577
+ if (isset($this->_routeCache['content'])) {
578
+ // serve cached whole page
579
+ $resp->setBody($this->_routeCache['content']['body']);
580
+ foreach($this->_routeCache['content']['header'] as $key => $val) {
581
+ $resp->setHeader($key, $val);
582
+ }
583
+ if (isset($this->_routeCache['content']['respcode'])) {
584
+ $resp->setHttpResponseCode($this->_routeCache['content']['respcode']);
585
+ }
586
+ if ($this->_isDebug) {
587
+ // last debug mesg
588
+ $this->_config->debugMesg('###### Served whole route from cache') ;
589
+ }
590
+ return;
591
+ }
592
+
593
+ if ( $this->_esi != null && ($this->_esi['layout']['preload'] != 1 || ! empty($this->_esi['layout']['blocks']) || $this->_helper->isEsiBlockAdjusted()) ) {
594
+ $tags = array(Litespeed_Litemage_Helper_Data::LITEMAGE_GENERAL_CACHE_TAG, Mage_Core_Model_Layout_Update::LAYOUT_GENERAL_CACHE_TAG);
595
+
596
+ if (Mage::app()->useCache('layout')) {
597
+ Mage::app()->saveCache($this->_helper->getEsiBlockHtml(), $this->_esi['layout']['cacheId'], $tags) ;
598
+ }
599
+ }
600
+
601
+ if ( count($this->_viewVary) ) {
602
+ // this needs to run before helper's beforeResponseSend
603
+ Mage::Helper('litemage/viewvary')->persistViewVary($this->_viewVary) ;
604
+ }
605
+
606
+ $extraHeaders = $this->_helper->beforeResponseSend($resp) ;
607
+
608
+ if (isset($this->_routeCache['cacheId']) && Mage::app()->useCache('layout')) {
609
+ $tags = array(Litespeed_Litemage_Helper_Data::LITEMAGE_GENERAL_CACHE_TAG);
610
+ $content = array();
611
+ $content['body'] = $resp->getBody();
612
+ $cheaders = array();
613
+ $headers = $resp->getHeaders();
614
+ foreach ($headers as $header) {
615
+ $cheaders[$header['name']] = $header['value'];
616
+ }
617
+ foreach($extraHeaders as $key => $val) {
618
+ $cheaders[$key] = $val;
619
+ }
620
+ $content['header'] = $cheaders;
621
+ $curRespCode = $resp->getHttpResponseCode();
622
+ if ($curRespCode != 200) {
623
+ $content['respcode'] = $curRespCode;
624
+ }
625
+
626
+ Mage::app()->saveCache(serialize($content), $this->_routeCache['cacheId'], $tags);
627
+ }
628
+
629
+ if ($this->_isDebug) {
630
+ $this->_config->debugMesg('###### end of process, body length ' . strlen($resp->getBody()));
631
+ }
632
+
633
+ }
634
+
635
+ //catalog_controller_product_view
636
+ public function onCatalogProductView( $eventObj )
637
+ {
638
+ if ( $this->_moduleEnabledForUser && ! $this->_helper->isEsiRequest() ) {
639
+ $productId = $eventObj->getProduct()->getId() ;
640
+ $this->_helper->addCacheEntryTag(Litespeed_Litemage_Helper_Esi::TAG_PREFIX_PRODUCT . $productId) ;
641
+
642
+ if ( $this->_config->trackLastViewed() ) {
643
+ $this->_helper->addPurgeEvent($eventObj->getEvent()->getName()) ;
644
+ $this->_helper->trackProduct($productId) ;
645
+ }
646
+ }
647
+ }
648
+
649
+ // cms_page_render
650
+ public function onCmsPageRender( $eventObj )
651
+ {
652
+ if ( $this->_moduleEnabledForUser ) {
653
+ $pageId = $eventObj->getPage()->getId() ;
654
+ $this->_helper->addCacheEntryTag(Litespeed_Litemage_Helper_Esi::TAG_PREFIX_CMS . $pageId) ;
655
+ }
656
+ }
657
+
658
+ public function initNewVisitor($eventObj)
659
+ {
660
+ if ( $this->_moduleEnabledForUser ) {
661
+ if (Mage::registry('LITEMAGE_NEWVISITOR')) {
662
+ Mage::unregister('LITEMAGE_NEWVISITOR'); // to be safe
663
+ }
664
+ else {
665
+ Mage::register('LITEMAGE_NEWVISITOR', 1);
666
+ }
667
+ }
668
+ }
669
+
670
+ }
app/code/community/Litespeed/Litemage/Model/Observer/Purge.php CHANGED
@@ -1,170 +1,290 @@
1
- <?php //0046a
2
- if(!extension_loaded('ionCube Loader')){$__oc=strtolower(substr(php_uname(),0,3));$__ln='ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');if(function_exists('dl')){@dl($__ln);}if(function_exists('_il_exec')){return _il_exec();}$__ln='/ioncube/'.$__ln;$__oid=$__id=realpath(ini_get('extension_dir'));$__here=dirname(__FILE__);if(strlen($__id)>1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file <b>'.__FILE__.'</b> requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the <a href="http://www.ioncube.com/lw/">ionCube Loader Wizard</a> to assist with installation.');exit(199);
3
- ?>
4
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- XErAhBIpSZhtd0ESnx7BfiCWI2JNSjiToYZJ+TPAIIZFOtjCAxgKuvmASEI1yx3sgbYmFkfVwLuH
15
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 8dz9LFXOtaNXEf2L989iBKaiJJQeCe9us9MSdWK5xfRPvJiaa1fgDSzeMtAPpU10y4MltWi0gzDb
42
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- saKPmoaZQf2C4QKmjhC8/p+N4HYqgUjq/jMcrfQRyMR/xyfyyQ/N8rm6Li8LlH7TcD45fS2HZW+1
54
- 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
- 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
- xQ/4LTYhqsTJ8SejqaBi0W0fiEeIpGugjFIkFcJHS/nJvCqBV2J7HqK4+e1AngiP2CKIo1sMcXvM
57
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- tJ88IRamccQ4DYLgdOVuegioRzcuUoRRIoG+EOXe6iMl4Nast/wYy22xVN9ObW4+KgRMJurAm8XO
84
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +j2y4wJlqMonQKPsjVCHe3TMRkHbCdopgW8uu6ybs08pIwp2iKZRiJTOlaejHal8cLK3An57npki
140
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- L3OnLLhZ51l620ypjG/mVNycnTWW0ntqydUSolnzlcOBKsVc0LWfUSGhjrUxp3jvD/WfYPzVSLRx
153
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
170
- 99abVRSYxyOr
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * LiteMage
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This program is free software: you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation, either version 3 of the License, or
10
+ * (at your option) any later version.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License
18
+ * along with this program. If not, see https://opensource.org/licenses/GPL-3.0 .
19
+ *
20
+ * @package LiteSpeed_LiteMage
21
+ * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
22
+ * @license https://opensource.org/licenses/GPL-3.0
23
+ */
24
+
25
+
26
+ class Litespeed_Litemage_Model_Observer_Purge extends Varien_Event_Observer
27
+ {
28
+
29
+ const WARMUP_DELTA_CACHE_ID = 'litemage_warmup_delta' ;
30
+
31
+ protected $_curProductId ;
32
+
33
+ /**
34
+ * Clear LiteSpeed Cache cache by admin actions
35
+ *
36
+ * Events:
37
+ * controller_action_postdispatch_adminhtml_cache_flushAll
38
+ * controller_action_postdispatch_adminhtml_cache_flushSystem
39
+ *
40
+ * @param Varien_Object $eventObj
41
+ * @return null
42
+ */
43
+ public function adminPurgeCache( $eventObj )
44
+ {
45
+ $config = Mage::helper('litemage/data') ;
46
+ if ( $config->moduleEnabled() ) {
47
+ $this->_purgeAllByAdmin($this->_getAdminSession(), $config) ;
48
+ }
49
+ }
50
+
51
+ public function adminPurgeCurrency($eventObj)
52
+ {
53
+ $config = Mage::helper('litemage/data') ;
54
+ if ( $config->moduleEnabled() ) {
55
+ Mage::helper('litemage/esi')->setPurgeHeader(array( 'CURR' ), 'adminPurgeCurrency') ;
56
+ $this->_getAdminSession()->addSuccess($config->__('Notified LiteSpeed web server to purge all cached pages which have currency rates.')) ;
57
+ }
58
+ }
59
+
60
+ public function adminPurgeCacheBy($type, $ids )
61
+ {
62
+ $config = Mage::helper('litemage/data') ;
63
+ if ( $config->moduleEnabled() ) {
64
+ // validate
65
+ $adminSession = $this->_getAdminSession() ;
66
+ if ($ids == '') {
67
+ $adminSession->addError($config->__('Missing input value.'));
68
+ }
69
+ elseif (in_array($type, array('P','C','G'))) {
70
+ $tags = preg_split("/[\s,]+/", $ids, null, PREG_SPLIT_NO_EMPTY);
71
+ if (count($tags) == 0) {
72
+ $adminSession->addError($config->__('Missing ID values.'));
73
+ }
74
+ else {
75
+ $cacheTags = array();
76
+ foreach ($tags as $tag) {
77
+ if (strval(intval($tag)) != $tag) {
78
+ $adminSession->addError($config->__('Invalid ID values ' . $tag));
79
+ break;
80
+ }
81
+ $cacheTags[] = $type . '.' . $tag;
82
+ }
83
+ if (count($cacheTags)) {
84
+ $this->_purgeTagByAdmin($cacheTags, 'by ID ' . $ids . ' (from cache management)');
85
+ }
86
+ }
87
+ }
88
+ elseif ($type == 'U') {
89
+ if ($ids[0] != '/') {
90
+ $adminSession->addError($config->__('Invalid URL value, requires relative URL starting with /'));
91
+ }
92
+ else {
93
+ $this->_purgeUrlByAdmin($ids);
94
+ }
95
+ }
96
+ else {
97
+ $adminSession->addError($config->__('Invalid input type'));
98
+ }
99
+ }
100
+ }
101
+
102
+ public function adminConfigChangedSection( $eventObj )
103
+ {
104
+ $config = Mage::helper('litemage/data') ;
105
+ $moduleEnabled = $config->getConf(Litespeed_Litemage_Helper_Data::CFG_ENABLED) ;
106
+ $serverEnabled = isset($_SERVER['X-LITEMAGE']) && $_SERVER['X-LITEMAGE'] ;
107
+ $adminSession = $this->_getAdminSession() ;
108
+ if ( ! $serverEnabled ) {
109
+ $adminSession->addError($config->__('Your installation of LiteSpeed Web Server does not have LiteMage Cache enabled.')) ;
110
+ }
111
+ if ( $moduleEnabled ) {
112
+ if ( $serverEnabled ) {
113
+ $adminSession->addNotice($config->__('To make your changes take effect immediately, purge LiteSpeed Cache (System -> Cache Management).')) ;
114
+ }
115
+ }
116
+ else {
117
+ $this->_purgeAllByAdmin($adminSession, $config) ;
118
+ }
119
+ }
120
+
121
+ public function adminConfigEditSection( $eventObj )
122
+ {
123
+ $sectionCode = Mage::app()->getRequest()->getParam('section') ;
124
+ if ( $sectionCode == 'litemage' ) {
125
+ $serverEnabled = isset($_SERVER['X-LITEMAGE']) && $_SERVER['X-LITEMAGE'] ;
126
+ if ( ! $serverEnabled ) {
127
+ $config = Mage::helper('litemage/data') ;
128
+ $this->_getAdminSession()->addError($config->__('Your installation of LiteSpeed Web Server does not have LiteMage Cache enabled.')) ;
129
+ }
130
+ }
131
+ }
132
+
133
+ protected function _purgeAllByAdmin( $adminSession, $config )
134
+ {
135
+ $tags = array( Litespeed_Litemage_Helper_Data::LITEMAGE_GENERAL_CACHE_TAG ) ;
136
+ Mage::app()->cleanCache($tags) ;
137
+ $adminSession->addSuccess($config->__('Purged all LiteMage ESI block cache.')) ;
138
+
139
+ Mage::helper('litemage/esi')->setPurgeHeader(array( '*' ), 'purgeAllByAdmin') ;
140
+ $adminSession->addSuccess($config->__('Notified LiteSpeed web server to purge all cached items.')) ;
141
+ }
142
+
143
+ protected function _purgeTagByAdmin( $tags, $message = '' )
144
+ {
145
+ Mage::helper('litemage/esi')->setPurgeHeader($tags, 'purgeTagByAdmin') ;
146
+ if ( $message ) {
147
+ $this->_getAdminSession()->addSuccess(Mage::helper('litemage/data')->__('Notified LiteSpeed web server to purge ' . $message)) ;
148
+ }
149
+ }
150
+
151
+ protected function _purgeUrlByAdmin($url)
152
+ {
153
+ Mage::helper('litemage/esi')->setPurgeURLHeader($url, 'purgeUrlByAdmin') ;
154
+ $this->_getAdminSession()->addSuccess(Mage::helper('litemage/data')->__('Notified LiteSpeed web server to purge URL ' . $url)) ;
155
+ }
156
+
157
+ protected function _getAdminSession()
158
+ {
159
+ return Mage::getSingleton('adminhtml/session') ;
160
+ }
161
+
162
+ /**
163
+ * Event: admin catalog_category_save_commit_after
164
+ */
165
+ public function adminPurgeCatalogCategory( $eventObj )
166
+ {
167
+ try {
168
+ if ( Mage::helper('litemage/data')->moduleEnabled() ) {
169
+ $category = $eventObj->getEvent()->getCategory() ;
170
+ if ( $category != null ) {
171
+ $tag = Litespeed_Litemage_Helper_Esi::TAG_PREFIX_CATEGORY . $category->getId() ;
172
+ $this->_purgeTagByAdmin(array( $tag ), $category->getName()) ;
173
+ }
174
+ }
175
+ } catch ( Exception $e ) {
176
+ Mage::helper('litemage/data')->debugMesg('Error on adminPurgeCatalogCategory: ' . $e->getMessage()) ;
177
+ }
178
+ }
179
+
180
+ //admin catalog_product_save_commit_after
181
+ public function adminPurgeCatalogProduct( $eventObj )
182
+ {
183
+ try {
184
+ if ( Mage::helper('litemage/data')->moduleEnabled() ) {
185
+ $product = $eventObj->getEvent()->getProduct() ;
186
+ if ( $product != null ) {
187
+ $this->_purgeByProduct($product) ;
188
+ }
189
+ }
190
+ } catch ( Exception $e ) {
191
+ Mage::helper('litemage/data')->debugMesg('Error on adminPurgeCatalogProduct: ' . $e->getMessage()) ;
192
+ }
193
+ }
194
+
195
+ // global cataloginventory_stock_item_save_after
196
+ public function purgeCatalogProductByStock( $eventObj )
197
+ {
198
+ try {
199
+ if ( Mage::helper('litemage/data')->moduleEnabled() ) {
200
+ $item = $eventObj->getEvent()->getItem() ;
201
+ if ( $item->getStockStatusChangedAutomatically() || ($item->getOriginalInventoryQty() <= 0 && (($item->getQty() + $item->getQtyCorrection()) > 0)) ) {
202
+ $product = Mage::getModel('catalog/product')->load($item->getProductId());
203
+ $this->_purgeByProduct($product) ;
204
+ }
205
+ }
206
+ } catch ( Exception $e ) {
207
+ Mage::helper('litemage/data')->debugMesg('Error on purgeCatalogProductByStock: ' . $e->getMessage()) ;
208
+ }
209
+ }
210
+
211
+ // on admin cms_page_save_commit_after
212
+ public function adminPurgeCmsPage( $eventObj )
213
+ {
214
+ try {
215
+ if ( Mage::helper('litemage/data')->moduleEnabled() ) {
216
+ $page = $eventObj->getEvent()->getObject() ;
217
+ if ( $page != null ) {
218
+ $id = $page->getId() ;
219
+ if ( $id != null ) {
220
+ $tag = Litespeed_Litemage_Helper_Esi::TAG_PREFIX_CMS . $id ;
221
+ $this->_purgeTagByAdmin(array( $tag ), 'Page ' . $page->getTitle()) ;
222
+ }
223
+ }
224
+ }
225
+ } catch ( Exception $e ) {
226
+ Mage::helper('litemage/data')->debugMesg('Error on adminPurgeCmsPage: ' . $e->getMessage()) ;
227
+ }
228
+ }
229
+
230
+ protected function _purgeByProduct( $product )
231
+ {
232
+ $productId = $product->getId() ;
233
+ if ( $this->_curProductId == $productId )
234
+ return ; // already purged
235
+ $this->_curProductId = $productId ;
236
+
237
+ $cids = $product->getCategoryIds() ;
238
+
239
+ if ( $cids == null )
240
+ $cids = array() ;
241
+
242
+ $tags = array() ;
243
+ $tags[] = Litespeed_Litemage_Helper_Esi::TAG_PREFIX_PRODUCT . $productId ;
244
+
245
+ $pids = array_unique(array_merge(Mage::getModel('catalog/product_type_configurable')->getParentIdsByChild($productId), Mage::getModel('catalog/product_type_grouped')->getParentIdsByChild($productId))) ;
246
+
247
+ foreach ( $pids as $pid ) {
248
+ $tags[] = Litespeed_Litemage_Helper_Esi::TAG_PREFIX_PRODUCT . $pid ;
249
+ $pp = Mage::getModel('catalog/product')->load($pid) ;
250
+ if ( $pp->isVisibleInCatalog() ) {
251
+ if ( ($pcids = $pp->getCategoryIds()) != null ) {
252
+ $cids = array_merge($cids, $pcids) ;
253
+ }
254
+ }
255
+ }
256
+
257
+ $cids = array_unique($cids) ;
258
+ $pcids = array() ;
259
+
260
+ foreach ( $cids as $cid ) {
261
+ $tags[] = Litespeed_Litemage_Helper_Esi::TAG_PREFIX_CATEGORY . $cid ;
262
+ $cat = Mage::getModel('catalog/category')->load($cid) ;
263
+ $pcids = array_merge($pcids, $cat->getParentIds()) ;
264
+ }
265
+
266
+ $pcids = array_diff(array_unique($pcids), $cids) ;
267
+ foreach ( $pcids as $cid ) {
268
+ $cat = Mage::getModel('catalog/category')->load($cid) ;
269
+ $dispmode = $cat->getDisplayMode() ;
270
+ if ( $dispmode == Mage_Catalog_Model_Category::DM_PRODUCT || $dispmode == Mage_Catalog_Model_Category::DM_MIXED )
271
+ $tags[] = Litespeed_Litemage_Helper_Esi::TAG_PREFIX_CATEGORY . $cid ;
272
+ }
273
+
274
+ $this->_purgeTagByAdmin($tags, $product->getName()) ;
275
+ }
276
+
277
+ /* protected function _addDelta($urls)
278
+ {
279
+ $app = Mage::app();
280
+ if ($delta = $app->loadCache( self::WARMUP_DELTA_CACHE_ID )) {
281
+ $delta .= "\n" . implode("\n", $urls);
282
+ }
283
+ else {
284
+ $delta = time() . "\n" . implode("\n", $urls);
285
+ }
286
+ $tags = array(Litespeed_Litemage_Helper_Data::LITEMAGE_GENERAL_CACHE_TAG);
287
+ $app->saveCache($delta, self::WARMUP_DELTA_CACHE_ID, $tags);
288
+
289
+ } */
290
+ }
app/code/community/Litespeed/Litemage/Model/Session.php CHANGED
@@ -1,33 +1,66 @@
1
- <?php //0046a
2
- if(!extension_loaded('ionCube Loader')){$__oc=strtolower(substr(php_uname(),0,3));$__ln='ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');if(function_exists('dl')){@dl($__ln);}if(function_exists('_il_exec')){return _il_exec();}$__ln='/ioncube/'.$__ln;$__oid=$__id=realpath(ini_get('extension_dir'));$__here=dirname(__FILE__);if(strlen($__id)>1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file <b>'.__FILE__.'</b> requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the <a href="http://www.ioncube.com/lw/">ionCube Loader Wizard</a> to assist with installation.');exit(199);
3
- ?>
4
- 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
- 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
- j1/Ak0xA6xkti8dgrcYsBGDVCLiT640EP/Jjj7YZGpQ2zHAQpjg+UhUP01R3+Mmv5fYuLoI8yPb9
7
- 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
- YWFR3IfWdOkmKbsubDJGHiBaEjCKUwVmeplZMSZdwFhGR1f1tg8YQI7HD1NGTrIEGzAGHwAp0qIQ
9
- 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
- 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
- 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
- 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
- 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
- +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
- OjgJEXiEzwehzUZhgviLf+QO2eEVAfgM1PUAt9nrZ1FkByLZGtY5kZG0ZTaDP7P6m8PGVLzvICww
16
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- zvCuk+nKuB0cNx1W7MJydqVTMYNil3zu7HpXWpH//bz1v3U4BLHdUbwuVSqq+3VobTTsjMjNeBtc
28
- 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
- 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
- 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
- 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
- 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
33
- OMklkhGArsw5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * LiteMage
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This program is free software: you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation, either version 3 of the License, or
10
+ * (at your option) any later version.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License
18
+ * along with this program. If not, see https://opensource.org/licenses/GPL-3.0 .
19
+ *
20
+ * @package LiteSpeed_LiteMage
21
+ * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
22
+ * @license https://opensource.org/licenses/GPL-3.0
23
+ */
24
+
25
+ class Litespeed_Litemage_Model_Session extends Mage_Core_Model_Session_Abstract
26
+ {
27
+ protected $_isDebug;
28
+
29
+ public function __construct()
30
+ {
31
+ $this->init('litemage');
32
+ $this->_isDebug = Mage::helper('litemage/data')->isDebug();
33
+ }
34
+
35
+ /**
36
+ * Save the messages for a given block to the session
37
+ *
38
+ * @param string $blockName
39
+ * @param array $messages
40
+ * @return null
41
+ */
42
+ public function saveMessages( $blockName, $messages )
43
+ {
44
+ $stored = $this->getData($blockName);
45
+ if ($stored != null) {
46
+ $messages = array_merge($stored, $messages);
47
+ }
48
+ $this->setData($blockName, $messages);
49
+ if ($this->_isDebug)
50
+ Mage::helper('litemage/data')->debugMesg("saveMessages for $blockName " . print_r($messages, true));
51
+ }
52
+
53
+ /**
54
+ * Retrieve the messages for a given messages block
55
+ *
56
+ * @param string $blockName
57
+ * @return array
58
+ */
59
+ public function loadMessages( $blockName )
60
+ {
61
+ $messages = $this->getData($blockName);
62
+ $this->unsetData($blockName);
63
+ return $messages;
64
+ }
65
+
66
+ }
app/code/community/Litespeed/Litemage/Model/Translate.php CHANGED
@@ -1,12 +1,28 @@
1
  <?php
2
-
3
  /**
4
- * LiteMage by LiteSpeed Technologies, Inc.
 
 
 
 
 
 
 
5
  *
6
- * @package LiteSpeed_LiteMage
7
- * @copyright Copyright (c) 2015 LiteSpeed Technologies (http://www.litespeedtech.com)
 
 
 
 
 
 
 
 
 
8
  */
9
 
 
10
  class Litespeed_Litemage_Model_Translate extends Mage_Core_Model_Translate
11
  {
12
  /* this class rewrite just try to fix one issue with old class: cacheId does not regenerated, so will still point to different store.
1
  <?php
 
2
  /**
3
+ * LiteMage
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This program is free software: you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation, either version 3 of the License, or
10
+ * (at your option) any later version.
11
  *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License
18
+ * along with this program. If not, see https://opensource.org/licenses/GPL-3.0 .
19
+ *
20
+ * @package LiteSpeed_LiteMage
21
+ * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
22
+ * @license https://opensource.org/licenses/GPL-3.0
23
  */
24
 
25
+
26
  class Litespeed_Litemage_Model_Translate extends Mage_Core_Model_Translate
27
  {
28
  /* this class rewrite just try to fix one issue with old class: cacheId does not regenerated, so will still point to different store.
app/code/community/Litespeed/Litemage/controllers/AdminController.php CHANGED
@@ -1,55 +1,108 @@
1
- <?php //0046a
2
- if(!extension_loaded('ionCube Loader')){$__oc=strtolower(substr(php_uname(),0,3));$__ln='ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');if(function_exists('dl')){@dl($__ln);}if(function_exists('_il_exec')){return _il_exec();}$__ln='/ioncube/'.$__ln;$__oid=$__id=realpath(ini_get('extension_dir'));$__here=dirname(__FILE__);if(strlen($__id)>1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file <b>'.__FILE__.'</b> requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the <a href="http://www.ioncube.com/lw/">ionCube Loader Wizard</a> to assist with installation.');exit(199);
3
- ?>
4
- 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
- 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
- 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
- UHrCanpEXvALYkCKfyaT3Wh83nKmBDjckyHDVsJlnkYWtM91bScGb6bujg64ziNCsdXAq+Zuhibf
8
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- IDgb9QthbkwnGt5hXnmxExhuVCRGQoYNR7FVhJ+tFwTs21kTfmO2NMvszHKMO7uKi5y6mjaMM8hk
20
- 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
- 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
- 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
- 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
- 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
- +mSF59u/pAf+WF3ERKEVDuMWTnrCC/qqvLcVhW4mdiKBCAr1wO33uTFac7b9M1wL5nfeaQLYEjkB
26
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 9gfNsnPTBHjn4CWYB6qY9zWkUhuqZVs8dB49qerpMYieO7IiTOIWiuUOqBwKZ4TN/wQSNwXS3qYv
37
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * LiteMage
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This program is free software: you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation, either version 3 of the License, or
10
+ * (at your option) any later version.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License
18
+ * along with this program. If not, see https://opensource.org/licenses/GPL-3.0 .
19
+ *
20
+ * @package LiteSpeed_LiteMage
21
+ * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
22
+ * @license https://opensource.org/licenses/GPL-3.0
23
+ */
24
+
25
+
26
+ class Litespeed_Litemage_AdminController extends Mage_Core_Controller_Front_Action
27
+ {
28
+
29
+ protected $_helper ;
30
+ protected $_config ;
31
+ protected $_isDebug ;
32
+ protected $_data;
33
+
34
+ protected function _construct()
35
+ {
36
+ $this->setFlag('', Mage_Core_Controller_Varien_Action::FLAG_NO_START_SESSION, 1) ; // Do not start standart session
37
+ $this->setFlag('', Mage_Core_Controller_Varien_Action::FLAG_NO_PRE_DISPATCH, true) ;
38
+ $this->setFlag('', Mage_Core_Controller_Varien_Action::FLAG_NO_POST_DISPATCH, true) ;
39
+ }
40
+
41
+ /**
42
+ * It seems this has to exist so we just make it redirect to the base URL
43
+ * for lack of anything better to do.
44
+ *
45
+ * @return null
46
+ */
47
+ public function indexAction()
48
+ {
49
+ Mage::log('Err: litemage/admin/ come to indexaction') ;
50
+ $this->getResponse()->setRedirect(Mage::getBaseUrl()) ;
51
+ }
52
+
53
+ protected function _errorExit($errorMesg)
54
+ {
55
+ if ( $this->_isDebug ) {
56
+ $this->_config->debugMesg('litemage/admin ErrorExit: ' . $errorMesg) ;
57
+ }
58
+ $resp = $this->getResponse() ;
59
+ $resp->setHttpResponseCode(500) ;
60
+ $resp->setBody($errorMesg) ;
61
+ }
62
+
63
+
64
+ public function purgeAction()
65
+ {
66
+ if ( $this->_accessAllowed()) {
67
+ if ($error = $this->_validatePurgeTags()) {
68
+ $this->_errorExit($error);
69
+ }
70
+ else {
71
+ $this->_helper->setPurgeHeader($this->_data, 'litemage/admin/purgeAction');
72
+ }
73
+ }
74
+ else {
75
+ $this->_errorExit('Access denied') ;
76
+ }
77
+ }
78
+
79
+
80
+ protected function _accessAllowed()
81
+ {
82
+ $this->_config = Mage::helper('litemage/data') ;
83
+ $this->_isDebug = $this->_config->isDebug() ;
84
+ if ( $this->_config->moduleEnabledForUser() && $this->_config->isAdminIP() ) {
85
+ $this->_helper = Mage::helper('litemage/esi') ;
86
+ return true ;
87
+ }
88
+ else
89
+ return false ;
90
+ }
91
+
92
+ protected function _validatePurgeTags()
93
+ {
94
+ $req = $this->getRequest() ;
95
+ $tags = $req->getParam('tags');
96
+ if ($tags == null) {
97
+ return 'Missing tags value';
98
+ }
99
+ $data = explode(',', $tags);
100
+ foreach ($data as $d) {
101
+ if ( !preg_match("/^[GCP]\.\d+$/", $d)) {
102
+ return 'Invalid Format';
103
+ }
104
+ }
105
+ $this->_data = $data;
106
+ }
107
+
108
+ }
app/code/community/Litespeed/Litemage/controllers/Adminhtml/LitemageCacheController.php CHANGED
@@ -1,38 +1,66 @@
1
- <?php //0046a
2
- if(!extension_loaded('ionCube Loader')){$__oc=strtolower(substr(php_uname(),0,3));$__ln='ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');if(function_exists('dl')){@dl($__ln);}if(function_exists('_il_exec')){return _il_exec();}$__ln='/ioncube/'.$__ln;$__oid=$__id=realpath(ini_get('extension_dir'));$__here=dirname(__FILE__);if(strlen($__id)>1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file <b>'.__FILE__.'</b> requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the <a href="http://www.ioncube.com/lw/">ionCube Loader Wizard</a> to assist with installation.');exit(199);
3
- ?>
4
- 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
- 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
- 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
- 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
- sWaPaFAYohKx1HPdY4XNhF0bKaTeAGSXJtH95O/4+505fit1DJTKe4XEmYGNHk8mkA8GCPERVC2H
9
- U6OPnGpNbIO1rdEk/2A19w/zzZy0c8bV3d2hcuRZSsz0ceCtuqBmRpRvlfcdfU7wVmVGhb4ZP5YV
10
- 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
- brRU/ziBz5DMCTsitNo/M6LUAqUMmLgkQ9jrwWUJvJKqVMhlpuybB9OIcih+OCm1sEpWi3xCkyoh
12
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- Qi2bCw23q1c9yICory1muZxNwGzMmrK9dvvBVKu7wnDkSxKAZ8dxWV8ZSo89EDYaAJ9tRp7Xr7CL
30
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * LiteMage
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This program is free software: you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation, either version 3 of the License, or
10
+ * (at your option) any later version.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License
18
+ * along with this program. If not, see https://opensource.org/licenses/GPL-3.0 .
19
+ *
20
+ * @package LiteSpeed_LiteMage
21
+ * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
22
+ * @license https://opensource.org/licenses/GPL-3.0
23
+ */
24
+
25
+
26
+
27
+ class Litespeed_Litemage_Adminhtml_LitemageCacheController extends Mage_Adminhtml_Controller_Action
28
+ {
29
+ public function purgeAllAction()
30
+ {
31
+ Mage::getModel( 'litemage/observer_purge' )->adminPurgeCache(null);
32
+ $this->_redirect('*/cache/index');
33
+ }
34
+
35
+ public function purgeTagAction()
36
+ {
37
+ $req = $this->getRequest();
38
+ Mage::getModel( 'litemage/observer_purge' )->adminPurgeCacheBy($req->getParam('tag_types'), $req->getParam('purge_tag'));
39
+ $this->_redirect('*/cache/index');
40
+ }
41
+
42
+ public function purgeUrlAction()
43
+ {
44
+ Mage::getModel( 'litemage/observer_purge' )->adminPurgeCacheBy('U', $this->getRequest()->getParam('purge_url'));
45
+ $this->_redirect('*/cache/index');
46
+ }
47
+
48
+ public function resetCrawlerListAction()
49
+ {
50
+ $req = $this->getRequest();
51
+ Mage::getModel( 'litemage/observer_cron' )->resetCrawlerList($req->getParam('list'));
52
+ $this->_redirect('*/cache/index');
53
+ }
54
+
55
+ public function getCrawlerListAction()
56
+ {
57
+ $req = $this->getRequest();
58
+ $output = Mage::getModel( 'litemage/observer_cron' )->getCrawlerList($req->getParam('list'));
59
+ $this->getResponse()->setBody($output);
60
+ }
61
+
62
+ protected function _isAllowed()
63
+ {
64
+ return Mage::getSingleton('admin/session')->isAllowed('system/cache/litemage');
65
+ }
66
+ }
app/code/community/Litespeed/Litemage/controllers/EsiController.php CHANGED
@@ -1,411 +1,763 @@
1
- <?php //0046a
2
- if(!extension_loaded('ionCube Loader')){$__oc=strtolower(substr(php_uname(),0,3));$__ln='ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');if(function_exists('dl')){@dl($__ln);}if(function_exists('_il_exec')){return _il_exec();}$__ln='/ioncube/'.$__ln;$__oid=$__id=realpath(ini_get('extension_dir'));$__here=dirname(__FILE__);if(strlen($__id)>1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file <b>'.__FILE__.'</b> requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the <a href="http://www.ioncube.com/lw/">ionCube Loader Wizard</a> to assist with installation.');exit(199);
3
- ?>
4
- HR+cPnXaxJ7CEzO6dMTu4Yv1qMKLnucUxC36yxsiGsOwj6ifvfU52IQYga/dklhZi4qucooyhye6
5
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 2UXVKuzbUhEX8MqxL5XMj9+rRU/TcEIrQk4x3MrbQFMDyD81N5L9nnnwvSLmgabPbgtwZS6FLaop
22
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- Qnd7PThfLKLVXLuUl7T8PSHlbouZNH+Ml8nKGxiM1PJjZczyNA+zuRZ/pBeNJ8HCbJxCSyV7zpja
30
- y73c47+FhZVfsT+bvrARWGIQ85xSUkIHuC6SKrpPm6VnVJ9gf57Vr9fD1DTCdHZz3lz6mofOqT+w
31
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 0u2oHeQ9RSn+tzReMa81jKnp8hBBilKE10MWwc7cSfdyEEC+6ThwLcM6FYIyL4zd+VHsfhFnPQpN
42
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- J6TE8FtH1xBEAdj6QNKgLkBAaM71jQqrUZzoV7yuxdRyI1+E0Dd8qfYiudB5w6BlnNZf7+NrLPec
58
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- voUDFR/+ED5RHVVAmY3grE0XKwzei6MoyPKOQ1f3pj2rhQBjH2vK2f6XbLhR1psfDoVr/J76C8N7
66
- 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
- 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
- Qluit/Xa8u5p4I1GS9rvou/2w4T6yEvCOfXxSnSulo1LGblkjv1dUCIMo4+wMhL7nTTtV1CxBbMY
69
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 8P7zMUDWrdrzCwHkYlXkWvA5NgkrJe2ZxixzJFoyRsKL8u8pbAS/gprO59/3YVfav/TlM8uk6jox
80
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 5bxpv1odlAU6ipIES1XCSX48T34LthY/OoFSWgRk4TQCSKQtazXUeBvAUYLTt1odsGJfLz08SSYg
92
- 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
- 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
- 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
- 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
- dkWwJTwWFI3vyqJBbqsD+dYoSYKpshSCDkR9L6aHbCK8W3HHlHOkwDzT9aeavVN/Hmuavt5YFUO6
97
- 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
- bUUOwcehpc3LBQOpfVvzfhpU/YBIVFYs/CdAIUlMxBsGGumjKOhRdpk9rrzGzPjksYbKKvCLJ610
99
- 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
- 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
- pLfFilWQvqNrHsLCFmYARwjy9PPj8oVvjyMcUPhlUbs8+OYmUr7asgfTeS5+95ZKsRVTUiYcJxe3
102
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- IM/DYHrOSScEx+K86trl7SmGlD9T7Z7ShByt8QQQYHblWKIWR+wdo9EPUSLQ+YI3javSRg3uYlbw
118
- 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
- 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
- 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
- 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
- 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
- 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
- KyRWR18D+L8WzPYDDdk5H9mXN39GhUxo8TXBvdDebDaC0JSN8lE9mawQ+I3GwgBHXYXi9hnjU6tn
125
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- lswgUQ3NspYs39qP6xStvPjKabPdReNgbc1pihbWjlNNp2NATdQHaLktXorKmKeYKu3AkdHX8xbd
134
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- y6hLWF8DQmF26mt5QfcVXk94Tj04jqYtDnOKhopMyo/zBn6BOeUxsz4KSyDWJXDbOYjwAWDhPPDd
142
- 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
- /9hzyt7nESl9kEG78GGuwZON5s8vNOYdwNGcPwxPLH1ks4TMv3Y2YQkUsHFn1qRt10ZYBPdCP+zk
144
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- Uvz6Z1e07FZhkA6Ry5ENFaOqKUMRGQrPRkZN8BVgyVSHC72iqOJ1WoUymoYafdGicNlNcFNClVoA
153
- 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
- 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
- 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
- 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
- 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
- dnmFkgPS/MzbFvAXRvMGM3+e0LLGSeBqZc4aMCuW5V8fMRaeBxAERTCGrbBPo3KcnRrmaF+jhwtN
159
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +zd65PgEfVEf54vsM9A9T9HiyOL83vjqC6NCajfxJpXp9ayW2X/S2V6P4DOiB8QrPzbehmUSRAeq
181
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- kvGEBvecvxWATnR/3x9AFMbx0hNfZqCawnVuwK8LJy37M4pVrVNNPlR+rzacifRx7d8DxfVK0TfV
228
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 1vgRqfLMAo7fGXl1GFtgBkOl7taRHCkELTrW2ZbQN4kA9CCi4vTwytSvYK6j09sXGRnoPvFy+e00
240
- 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
- 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
- +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
- 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
- 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
- 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
- Wtx5IPBQmsRz5jvtQqw3as9vO0Pl2ubShF8+kEKFe4R9DQtQpGc7CLjP/KfPuXDHwlFhcG/o+rKl
247
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- kmoHqGwdBxJgfIDw6VCAAWwv6otNbks4cc6HTPiIbQ+MPy6mWcxlNW93b+w0RsPJkLRSAcnpI0RI
260
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- xyWaS2YkIvDkWeZN/6ct2NBv3tP4yc0ppRyKFIFDiaAHQDTWTlz2kMVo34+ixSCFWh+dboHKfQZf
273
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- pT9IRTuR1DP8rAX6arcTB0dkmrw7J+U+W7aWGYLie7R+I8CKA2IBViQMYEc1bn4JmJN5mIlfxNLZ
286
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- DOJx7U3ZHKKUt9V8HSejIrR7Y9tCXibnFeFWudZHZJv0835gNCrXQGsf+VhaU5gEYmBo7neXrEQh
295
- truknfWDk5AFu+iKV7rh5667ShO4XHwTfAv/kId17VznKSGUJKuRDQ14QhCpGygsXQ1ZZxKt8rB5
296
- HptyL2JfGk4TC612IfnObvSfKwQpHtx8NdoQ22ZK91k5XOwz+Epy4OcPaF2vGAEovvxJycxflipl
297
- 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
- LKWXCcECEXNADtCSxMc/XGv1RvYuEod+KVnewrjv+B9s/5FdvYy3ln7u2AbAYdcdILpei0rlZn1T
299
- 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
- 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
- vQxMOs+b8jR5cEaOmKruM2DXcnX9rlrzhWMcKvNLg+gCn2ntsX2kIe54UA56NAQ9eClUKysvxay/
302
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 8j3oikBPz1Xpt0Hs80LCyUeZVovNwb2ddGV/x7Uc7eyJILGn1pQFCW98JLBeT4EvV9OcpmAPtf4Z
334
- 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
- 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
- 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
- rrd/SOQxzkQPPGcJ3tqWBLbcZV9BdmEttmi7WdJ/cKwEU3Ni9czNuDD6jcW8pCu0apeAkOiPZ2ft
338
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- tHm8veU/DQBdm5kxbEdu3Odl6BPY0d/eRoYeazDqhLBhhBdVXxzk8dLRxX2BxshI7Fw1aMm4Pys0
353
- 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
- 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
- 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
- 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
- A478AxpA0KlZEkdOdOg54h5FSkBVlR4oOh4Gx/EjPHJvjLqdEyWYJT0mtHTZ73NNuqz4uLX+dp/Z
358
- 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
- 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
- QqMMe4NTTsvlSNoDy20qaY23yKQ6+2MpwxlE8uha95DmPwZsLKKl2dWWkw1fZYh6WhxtHDw7AGL6
361
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- fsDcgKZbBw3pbc10r4dgw+yc25PdOftBp2MS/LThJ66I3kTfWBm91ipifAjTCD1bZn62WtthidTz
370
- 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
- 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
- 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
- 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
- xhzrXHlatQ2VgBtr9GROmokkqmAkqYLaiowkvEhO+6kCBwQsK9DuHf0eLIKtchE8N4wMaJ2wrYGS
375
- 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
- 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
- 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
- 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
- 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
- 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
- QghavcRSFot5UrOpFGjL6gkHm8mk+zQ7bSjX0AE9rMLVRK2RNtjfOX+xwhftOjobNbbVT/r7G4XE
382
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- s+yqBvMJ1EvrA8L/7/apVzjEmixHocM4jdpuKfa14V+bJHQbLZ5i1l9zS4iRBO7gjhkm79DgWFmj
401
- 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
- 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
- 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
- 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
- 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
- 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
- nqAV+CRA3t4Li2ku69WdB7SfpjTt4/qRsEvbgtyNLFwLe49KaVQoh5XGxmo/W5r2n4HdccbfHtMF
408
- 1pXU2SeEtzA4zPtagakdfRL9RQGtTlTIrt9FUIue3nymVeEjCPyJ8rw0f1kNqiiHiSetqteggvCv
409
- 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
- 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
- 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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * LiteMage
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This program is free software: you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation, either version 3 of the License, or
10
+ * (at your option) any later version.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License
18
+ * along with this program. If not, see https://opensource.org/licenses/GPL-3.0 .
19
+ *
20
+ * @package LiteSpeed_LiteMage
21
+ * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
22
+ * @license https://opensource.org/licenses/GPL-3.0
23
+ */
24
+
25
+
26
+ class Litespeed_Litemage_EsiController extends Mage_Core_Controller_Front_Action
27
+ {
28
+
29
+ const ESIDATA_CACHE_ID = 'litemage_esi_data' ;
30
+ const ESIDATA_CACHE_NOTSET = '__NOTSET__' ;
31
+
32
+ protected $_esiData ;
33
+ protected $_curData ;
34
+ protected $_env = array() ;
35
+ protected $_helper ;
36
+ protected $_config ;
37
+ protected $_isDebug ;
38
+ protected $_layout ;
39
+
40
+ protected function _construct()
41
+ {
42
+ $this->setFlag('', Mage_Core_Controller_Varien_Action::FLAG_NO_PRE_DISPATCH, true);
43
+ $this->setFlag('', Mage_Core_Controller_Varien_Action::FLAG_NO_POST_DISPATCH, true);
44
+ }
45
+
46
+ /**
47
+ * Retrieve current layout object
48
+ *
49
+ * @return Mage_Core_Model_Layout
50
+ */
51
+ public function getLayout()
52
+ {
53
+ if ( $this->_layout == null ) {
54
+ $this->_layout = Mage::getSingleton('litemage/layout') ;
55
+ }
56
+ return $this->_layout ;
57
+ }
58
+
59
+ /**
60
+ * It seems this has to exist so we just make it redirect to the base URL
61
+ * for lack of anything better to do.
62
+ *
63
+ * @return null
64
+ */
65
+ public function indexAction()
66
+ {
67
+ Mage::log('Err: litemage come to indexaction') ;
68
+ $this->getResponse()->setRedirect(Mage::getBaseUrl()) ;
69
+ }
70
+
71
+ public function noRouteAction( $coreRoute = null )
72
+ {
73
+ //set esi off
74
+ $origEsiUrl = $_SERVER['REQUEST_URI'] ;
75
+ if ( $param = $this->_parseUrlParams($origEsiUrl) ) {
76
+ switch ( $param['action'] ) {
77
+ case 'getCombined': $this->getCombinedAction() ;
78
+ break ;
79
+ case 'getFormKey': $this->getFormKeyAction() ;
80
+ break ;
81
+ case 'getBlock': $this->getBlockAction() ;
82
+ break ;
83
+ case 'getMessage': $this->getMessageAction() ;
84
+ break ;
85
+ case 'log': $this->logAction() ;
86
+ break ;
87
+ default: $this->_errorExit() ;
88
+ }
89
+ }
90
+ else {
91
+ $this->_errorExit() ;
92
+ }
93
+ }
94
+
95
+ protected function _errorExit()
96
+ {
97
+ $resp = $this->getResponse() ;
98
+ $resp->setHttpResponseCode(500) ;
99
+ $resp->setBody('<!-- ESI data is not valid -->') ;
100
+ }
101
+
102
+ /**
103
+ * Spit out the form key for this session
104
+ *
105
+ * @return null
106
+ */
107
+ public function getFormKeyAction()
108
+ {
109
+ $action = 'getFormKey' ;
110
+ if ( $this->_initUserParams($action) ) {
111
+ $this->_setEsiFlag($this->_esiData[$action]) ;
112
+ $data = $this->_esiData[$action]['raw_output'] ;
113
+ $this->getResponse()->setBody($data) ;
114
+ }
115
+ else {
116
+ $this->_errorExit() ;
117
+ }
118
+ }
119
+
120
+ protected function _setEsiFlag( $esiData )
121
+ {
122
+ $flag = Litespeed_Litemage_Helper_Esi::CHBM_ESI_REQ ;
123
+ $tag = '' ;
124
+
125
+ if ( $esiData['ttl'] > 0 ) {
126
+ $flag |= Litespeed_Litemage_Helper_Esi::CHBM_CACHEABLE ;
127
+ if ( $esiData['access'] == 'private' )
128
+ $flag |= Litespeed_Litemage_Helper_Esi::CHBM_PRIVATE ;
129
+ if ( isset($esiData['cacheIfEmpty']) && $esiData['cacheIfEmpty'] )
130
+ $flag |= Litespeed_Litemage_Helper_Esi::CHBM_ONLY_CACHE_EMPTY ;
131
+ $tag = $esiData['tag'] ;
132
+ }
133
+ $this->_helper->setCacheControlFlag($flag, $esiData['ttl'], $tag) ;
134
+ }
135
+
136
+ public function getBlockAction()
137
+ {
138
+ if ( ! $this->_initUserParams('getBlock') ) {
139
+ $this->_errorExit() ;
140
+ return ;
141
+ }
142
+
143
+ $esiDatas = array_values($this->_esiData) ;
144
+ $esiData = $esiDatas[0] ;
145
+ if ( count($this->_esiData) > 1 ) {
146
+ // not sure when this will happen
147
+ $includeEsi = '<' . $this->_config->esiTag('include') . ' src="' . $esiData['url'] . '" combine="sub" cache-control="no-vary,private"/>' ;
148
+ $this->_esiData['include'] = array( 'output' => $includeEsi ) ;
149
+ $this->_getCombinedData() ;
150
+ }
151
+ else {
152
+ $this->_setEsiFlag($esiData) ;
153
+ if ( isset($esiData['output']) && ($esiData['output'] != self::ESIDATA_CACHE_NOTSET) ) {
154
+ $this->getResponse()->setBody($esiData['output']) ;
155
+ }
156
+ else {
157
+ $this->_blockData($esiData) ;
158
+ if ( $this->_env['update_cache'] && Mage::app()->useCache('layout') ) {
159
+ if ( $this->_env['update_cache'] & 2 ) {
160
+ $this->_env['esiUrls'][$esiData['n']][$esiData['url']] = $this->getResponse()->getBody() ;
161
+ }
162
+ $tags = array( Litespeed_Litemage_Helper_Data::LITEMAGE_GENERAL_CACHE_TAG ) ;
163
+ Mage::app()->saveCache(serialize($this->_env['esiUrls']), $this->_env['cache_id'], $tags) ;
164
+ }
165
+ }
166
+ }
167
+ }
168
+
169
+ protected function _blockData( $esiData )
170
+ {
171
+ $this->_curData = $esiData ;
172
+ if (isset($esiData['type'])) {
173
+ // dynamic block
174
+ $this->_layout->resetBlocks() ;
175
+ if ($block = $this->_layout->createBlock($esiData['type'], $esiData['n'])) {
176
+ if (isset($esiData['template'])) {
177
+ $block->setTemplate($esiData['template']);
178
+ }
179
+ $this->renderLayout($esiData['n']) ;
180
+ }
181
+ }
182
+ else {
183
+ $this->loadLayoutUpdates() ;
184
+ $this->generateLayoutXml() ;
185
+ $this->generateLayoutBlocks() ;
186
+ $name_alias = isset($esiData['alias']) ? $esiData['alias'] : $esiData['n'];
187
+ $this->renderLayout($name_alias) ;
188
+ }
189
+ }
190
+
191
+ public function renderLayout( $output = '' )
192
+ {
193
+ // override, output can be block name or alias
194
+ if ( $output != '' && $this->_layout->getOutputBlock($output) != null ) {
195
+ try {
196
+ parent::renderLayout($output) ;
197
+ } catch ( Exception $e ) {
198
+ if ( $this->_isDebug ) {
199
+ $this->_config->debugMesg('renderLayout, exception for block ' . $output . ' : ' . $e->getMessage()) ;
200
+ }
201
+ }
202
+ }
203
+ else {
204
+ if ( $this->_isDebug ) {
205
+ $this->_config->debugMesg('renderLayout, not output for ' . $output) ;
206
+ }
207
+ }
208
+ return $this ;
209
+ }
210
+
211
+ public function getMessageAction()
212
+ {
213
+ if ( $this->_initUserParams('getMessage') ) {
214
+ $esiData = array_values($this->_esiData) ;
215
+ $this->_setEsiFlag($esiData[0]) ;
216
+ $this->_messageData($esiData[0]) ;
217
+ }
218
+ else {
219
+ $this->_errorExit() ;
220
+ }
221
+ }
222
+
223
+ protected function _messageData( $esiData )
224
+ {
225
+ $this->_curData = $esiData ;
226
+ $this->loadLayoutUpdates() ;
227
+ $this->generateLayoutXml() ;
228
+ $this->generateLayoutBlocks() ;
229
+
230
+ $name_alias = isset($esiData['alias']) ? $esiData['alias'] : $esiData['n'];
231
+
232
+ $block = $this->_layout->getOutputBlock($name_alias) ;
233
+ $newMessages = new Litespeed_Litemage_Block_Core_Messages() ;
234
+ $newMessages->initByEsi($esiData['st'], $esiData['call'], $block) ;
235
+ $this->renderLayout($name_alias) ;
236
+ }
237
+
238
+ public function getCombinedAction()
239
+ {
240
+ if ( ! $this->_initUserParams('getCombined') ) {
241
+ $this->_errorExit() ;
242
+ return ;
243
+ }
244
+ //add raw header here, to handle ajax exception
245
+ header(Litespeed_Litemage_Helper_Esi::LSHEADER_CACHE_CONTROL . ': esi=on', true) ;
246
+ $this->_getCombinedData() ;
247
+ }
248
+
249
+ protected function _getCombinedData()
250
+ {
251
+ $this->_helper->setCacheControlFlag(Litespeed_Litemage_Helper_Esi::CHBM_ESI_ON | Litespeed_Litemage_Helper_Esi::CHBM_ESI_REQ) ;
252
+ $response = $this->getResponse() ;
253
+ $response->clearBody() ;
254
+ $body = '' ;
255
+
256
+ foreach ( $this->_esiData as $key => $esiData ) {
257
+
258
+ if ( isset($esiData['output']) && ($esiData['output'] != self::ESIDATA_CACHE_NOTSET) ) {
259
+ $body .= $esiData['output'] ;
260
+ continue ;
261
+ }
262
+
263
+ if ( $esiData['action'] == 'log' ) {
264
+ $this->_logData($esiData) ;
265
+ $esiData['raw_output'] = '' ;
266
+ }
267
+
268
+ if ( isset($esiData['raw_output']) ) { //getFormKey & log
269
+ $inlineBody = $this->_getInlineBody($esiData, $esiData['raw_output'], 200) ;
270
+ }
271
+ else {
272
+ if ( $esiData['action'] == 'getMessage' ) {
273
+ $this->_messageData($esiData) ;
274
+ }
275
+ else {
276
+ // getBlock
277
+ $this->_blockData($esiData) ;
278
+ }
279
+ // env['update_cache'] can be changed by logged_in handle
280
+ $inlineBody = $this->_getInlineBody($esiData, $response->getBody(), $response->getHttpResponseCode(), ($this->_env['update_cache'] & 2)) ;
281
+ $response->clearBody() ;
282
+ }
283
+
284
+
285
+ $body .= $inlineBody ;
286
+ }
287
+ $response->setBody($body) ;
288
+ if ( $this->_env['update_cache'] && Mage::app()->useCache('layout')) {
289
+ $tags = array( Litespeed_Litemage_Helper_Data::LITEMAGE_GENERAL_CACHE_TAG ) ;
290
+ Mage::app()->saveCache(serialize($this->_env['esiUrls']), $this->_env['cache_id'], $tags) ;
291
+ }
292
+ }
293
+
294
+ protected function _getInlineBody( $esiData, $output, $responseCode, $updateShared = -1 )
295
+ {
296
+ $output = trim($output) ;
297
+ $esiInlineTag = $this->_config->esiTag('inline');
298
+ $initShared = false ;
299
+
300
+ if ( ($updateShared != -1) && ($esiData['access'] == 'private') && ($esiData['ttl'] > 0) ) {
301
+ if ( $updateShared == 0 ) { // check if same as shared
302
+ $out2 = '">' . $output . "</$esiInlineTag>" ;
303
+ if ( strpos($this->_env['esiUrls'][$esiData['n']][$esiData['url']], $out2) ) {
304
+ $buf = $this->_env['esiUrls'][$esiData['n']][$esiData['url']] ;
305
+ if ( $this->_isDebug ) {
306
+ $this->_config->debugMesg('Inline0m ' . substr($buf, 0, strpos($buf, "\n"))) ;
307
+ }
308
+ return $buf ;
309
+ }
310
+ }
311
+ else if ( $updateShared == 2 ) {
312
+ $initShared = true ;
313
+ }
314
+ }
315
+
316
+
317
+ $buf = '<' . $esiInlineTag . ' name="' . $esiData['url'] . '" cache-control="' ;
318
+
319
+ $ttl = $esiData['ttl'] ;
320
+ if ( $ttl > 0 && ! in_array($responseCode, array( 200, 301, 404 )) ) {
321
+ $ttl = 0 ;
322
+ }
323
+
324
+ if ( $ttl == 0 ) {
325
+ $buf .= 'no-cache' ;
326
+ }
327
+ else {
328
+ $buf .= $esiData['access'] . ',max-age=' . $esiData['ttl'] . ',no-vary' ;
329
+ if ( $esiData['cacheIfEmpty'] )
330
+ $buf .= ',set-blank' ;
331
+ elseif ( $initShared ) {
332
+ $buf .= ',shared' ;
333
+ }
334
+
335
+ $buf .= '" cache-tag="' . $esiData['tag'] ;
336
+ }
337
+
338
+ $buf .= '">' . $output . "</$esiInlineTag>\n" ;
339
+ if ( $initShared ) {
340
+ $this->_env['esiUrls'][$esiData['n']][$esiData['url']] = $buf ;
341
+ }
342
+
343
+ if ( $this->_isDebug ) {
344
+ $this->_config->debugMesg('Inline' . $updateShared . ' ' . substr($buf, 0, strpos($buf, "\n"))) ;
345
+ }
346
+
347
+ return $buf ;
348
+ }
349
+
350
+ public function logAction()
351
+ {
352
+ $action = 'log' ;
353
+ if ( $this->_initUserParams($action) ) {
354
+ $this->_setEsiFlag($this->_esiData[$action]) ;
355
+ $this->_logData($this->_esiData[$action]) ;
356
+ }
357
+ else
358
+ $this->_errorExit() ;
359
+ }
360
+
361
+ protected function _logData( $esiData )
362
+ {
363
+ if ( isset($esiData['product']) ) {
364
+ if ( isset($this->_env['s']) && ! isset($this->_env['dp']) ) {
365
+ Mage::app()->setCurrentStore(Mage::app()->getStore($this->_env['s'])) ;
366
+ }
367
+
368
+ $product = new Varien_Object() ;
369
+ $product->setId($esiData['product']) ;
370
+ try {
371
+ Mage::dispatchEvent('catalog_controller_product_view', array( 'product' => $product )) ;
372
+ } catch ( Exception $e ) {
373
+ if ( $this->_isDebug ) {
374
+ $this->_config->debugMesg('_logData, exception for product ' . $product->getId() . ' : ' . $e->getMessage()) ;
375
+ }
376
+ }
377
+ }
378
+ }
379
+
380
+ protected function _initUserParams( $action )
381
+ {
382
+ $this->_config = Mage::helper('litemage/data') ;
383
+ $this->_isDebug = $this->_config->isDebug() ;
384
+ if ( ! $this->_config->moduleEnabledForUser() ) {
385
+ return false ;
386
+ }
387
+
388
+ $this->_helper = Mage::helper('litemage/esi') ;
389
+
390
+
391
+ $origEsiUrl = $_SERVER['REQUEST_URI'] ;
392
+ $req = $this->getRequest() ;
393
+
394
+ //set original host url
395
+ if ( $refererUrl = $req->getServer('ESI_REFERER') ) {
396
+ $_SERVER['REQUEST_URI'] = $refererUrl ;
397
+ $req->setRequestUri($refererUrl) ;
398
+ $req->setPathInfo() ;
399
+ }
400
+ else {
401
+ // illegal entrance, only allow from lsws
402
+ if ( $this->_isDebug ) {
403
+ $this->_config->debugMesg('Illegal Entrance') ;
404
+ }
405
+
406
+ return false ;
407
+ }
408
+
409
+ if ( $this->_isDebug )
410
+ $this->_config->debugMesg('****** EsiController init url ' . $origEsiUrl) ;
411
+
412
+
413
+ $this->setFlag('', Mage_Core_Controller_Varien_Action::FLAG_NO_START_SESSION, true); // only set here for postdispatch, do not set last viewed url
414
+
415
+ $this->_env['update_cache'] = 0 ;
416
+ $this->_esiData = array() ;
417
+
418
+ if ( $action == 'getCombined' ) {
419
+ if ( ! isset($_REQUEST['esi_include']) ) {
420
+ if ( $this->_isDebug ) {
421
+ $this->_config->debugMesg('Missing param esi_include') ;
422
+ }
423
+
424
+ return false ;
425
+ }
426
+
427
+ $esiIncludes = $_REQUEST['esi_include'] ;
428
+ unset($_REQUEST['esi_include']) ;
429
+
430
+ if ( $this->_isDebug ) {
431
+ $this->_config->debugMesg('combined from ' . $refererUrl . ' includes = ' . print_r($esiIncludes, true)) ;
432
+ }
433
+
434
+ $this->_initEnv($req->getUserParams()) ;
435
+ $res = $this->_parseEsiUrlList($esiIncludes, false) ;
436
+ if ( ! $res )
437
+ return false ;
438
+ }
439
+ else {
440
+ if ( $param = $this->_parseUrlParams($origEsiUrl) ) {
441
+ if ( $esiData = $this->_parseEsiData($param) ) {
442
+ $this->_esiData[$esiData['id']] = $esiData ;
443
+ }
444
+ else {
445
+ return false ;
446
+ }
447
+ }
448
+ else {
449
+ return false ;
450
+ }
451
+ }
452
+ if ( isset($this->_env['fetch_all']) ) {
453
+ $this->_fetchAll() ;
454
+ }
455
+ return true ;
456
+ }
457
+
458
+ protected function _fetchAll()
459
+ {
460
+ $extra = array() ;
461
+
462
+ $session = Mage::getSingleton('core/session') ;
463
+ $is_new_user = (($session->getData('_litemage_user') == null) && Mage::registry('LITEMAGE_NEWVISITOR') && (Mage::registry('current_customer') == null)) ;
464
+ if ( $is_new_user ) {
465
+ // new, return all blocks as non-logged in user first visit
466
+ $session->setData('_litemage_user', 1) ;
467
+ if ( method_exists($session, 'getFormKey') && ! isset($this->_esiData['getFormKey']) ) {
468
+ $formkey_url = 'litemage/esi/getFormKey' ;
469
+ $this->_esiData['getFormKey'] = $this->_getFormKeyEsiData($formkey_url) ;
470
+ }
471
+ foreach ( $this->_env['esiUrls'] as $blockname => $urls ) {
472
+ foreach ( $urls as $url => $output ) {
473
+ if ( $output == self::ESIDATA_CACHE_NOTSET ) {
474
+ $this->_env['update_cache'] |= 2 ; // 2: full update, 1: update url only
475
+ if ( ! isset($this->_esiData[$url]) ) {
476
+ $extra[] = $url ;
477
+ }
478
+ }
479
+ else {
480
+ if ( isset($this->_esiData[$url]) ) {
481
+ $this->_esiData[$url]['output'] = $output ;
482
+ }
483
+ else {
484
+ $this->_esiData[$url] = array( 'output' => $output ) ;
485
+ }
486
+ }
487
+ }
488
+ }
489
+ }
490
+ else {
491
+ // regenerate all blocks for that store
492
+ foreach ( $this->_env['esiUrls'] as $blockname => $urls ) {
493
+ foreach ( array_keys($urls) as $url ) {
494
+ if ( ! isset($this->_esiData[$url]) ) {
495
+ $extra[] = $url ;
496
+ }
497
+ }
498
+ }
499
+ }
500
+
501
+ if ( count($extra) ) {
502
+ $res = $this->_parseEsiUrlList($extra, true) ;
503
+ }
504
+
505
+ if ( $this->_isDebug ) {
506
+ $this->_config->debugMesg(($is_new_user ? 'New user' : 'Existing user') . ' fetch extra = ' . count($extra)) ;
507
+
508
+ //if ($this->_isDebug)
509
+ //Mage::log('extra = ' . print_r($extra, true)) ;
510
+ }
511
+ }
512
+
513
+ protected function _parseUrlParams( $esiUrl )
514
+ {
515
+ $esiUrl = urldecode($esiUrl) ;
516
+ if ( ($pos = strpos($esiUrl, 'litemage/esi/')) !== false ) {
517
+ $buf = explode('/', substr($esiUrl, $pos + 13)) ;
518
+ $c = count($buf) ;
519
+ $param = array() ;
520
+ $param['action'] = $buf[0] ;
521
+ $param['url'] = $esiUrl ;
522
+ for ( $i = 1 ; ($i + 1) < $c ; $i+=2 ) {
523
+ $param[$buf[$i]] = $buf[$i + 1] ;
524
+ }
525
+ return $param ;
526
+ }
527
+ else
528
+ return null ;
529
+ }
530
+
531
+ protected function _parseEsiUrlList( $esiUrls, $ignoreErr = false )
532
+ {
533
+ $res = true ;
534
+ foreach ( $esiUrls as $esiUrl ) {
535
+
536
+ if ( $esiUrl == '*' ) {
537
+ $this->_env['fetch_all'] = 1 ;
538
+ continue ;
539
+ }
540
+ $param = $this->_parseUrlParams($esiUrl) ;
541
+ if ( $param == null ) {
542
+ $res = false ;
543
+ if ( $ignoreErr )
544
+ continue ;
545
+ else
546
+ break ;
547
+ }
548
+ if ( $esiData = $this->_parseEsiData($param) ) {
549
+ $this->_esiData[$esiData['id']] = $esiData ;
550
+ }
551
+ else {
552
+ $res = false ;
553
+ if ( $ignoreErr ) {
554
+ continue ;
555
+ }
556
+ else {
557
+ break ;
558
+ }
559
+ }
560
+ }
561
+ return $res ;
562
+ }
563
+
564
+ protected function _getFormKeyEsiData( $url )
565
+ {
566
+ $session = Mage::getSingleton('core/session') ;
567
+ $real_formkey = $session->getData(Litespeed_Litemage_Helper_Esi::FORMKEY_NAME) ;
568
+ if ( ! $real_formkey ) {
569
+ $real_formkey = $session->getFormKey() ;
570
+ }
571
+
572
+ $pri_ttl = isset($this->_env['pri_ttl']) ? $this->_env['pri_ttl'] : $this->_config->getConf(Litespeed_Litemage_Helper_Data::CFG_PRIVATETTL) ;
573
+
574
+ return array( 'action' => 'getFormKey',
575
+ 'cacheIfEmpty' => false,
576
+ 'url' => $url,
577
+ 'ttl' => $pri_ttl,
578
+ 'tag' => 'E.formkey',
579
+ 'access' => 'private',
580
+ 'id' => 'getFormKey',
581
+ 'raw_output' => $real_formkey ) ;
582
+ }
583
+
584
+ protected function _parseEsiData( $params )
585
+ {
586
+ $action = $params['action'] ;
587
+ $url = $params['url'] ;
588
+ if ( $action == 'getFormKey' ) {
589
+ return $this->_getFormKeyEsiData($url) ;
590
+ }
591
+
592
+ $esiData = array( 'action' => $action, 'cacheIfEmpty' => false, 'url' => $url ) ;
593
+
594
+ if ( $action == 'log' ) {
595
+ if ( isset($params['product']) )
596
+ $esiData['product'] = $params['product'] ;
597
+ if ( isset($params['s']) && ! isset($this->_env['s']) )
598
+ $this->_env['s'] = $params['s'] ;
599
+ $esiData['ttl'] = 0 ; // no cache
600
+ $esiData['id'] = $action ;
601
+ }
602
+ else {
603
+
604
+ if ( ! isset($this->_env['dp']) ) {
605
+ if ( ! $params['s'] || ! $params['dp'] || ! $params['dt'] ) {
606
+ if ( $this->_isDebug ) {
607
+ $this->_config->debugMesg('Missing param s_dp_dt') ;
608
+ }
609
+ return false ;
610
+ }
611
+
612
+ $this->_initEnv($params) ;
613
+ }
614
+
615
+ $tag = $params['t'] ;
616
+ if ( $tag == null ) {
617
+ if ( $this->_isDebug ) {
618
+ $this->_config->debugMesg('Missing param t') ;
619
+ }
620
+ return false ;
621
+ }
622
+ else {
623
+ $conf = $this->_config->getEsiConf('tag', $tag) ;
624
+ if ($conf == null) {
625
+ if ( $this->_isDebug ) {
626
+ $this->_config->debugMesg('Missing config for tag '. $tag) ;
627
+ }
628
+ return false ;
629
+ }
630
+ }
631
+
632
+ $esiData['b'] = explode(',', $params['b']) ;
633
+ if (count($esiData['b']) == 0) {
634
+ if ( $this->_isDebug ) {
635
+ $this->_config->debugMesg('Missing param b') ;
636
+ }
637
+ return false ;
638
+ }
639
+ $blockName = $esiData['b'][0];
640
+ $esiData['n'] = $blockName ;
641
+ $esiData['h'] = isset($params['h']) ? explode(',', $params['h']) : array() ;
642
+ $esiData['access'] = $conf['access'] ;
643
+ $esiData['ttl'] = isset($conf['ttl']) ? $conf['ttl'] :
644
+ (($conf['access'] == 'private') ? $this->_env['pri_ttl'] : $this->_env['pub_ttl'] ) ;
645
+ $esiData['tag'] = $conf['cache-tag'] ;
646
+ if (isset($params['a'])) {
647
+ $esiData['alias'] = $params['a'];
648
+ }
649
+ if (isset($params['p'])) {
650
+ $esiData['type'] = str_replace('--', '/', $params['p']); // dynamic block type
651
+ if (isset($params['l']))
652
+ $esiData['template'] = str_replace('--', '/', $params['l']);
653
+ }
654
+
655
+ if ( isset($params['st']) ) {
656
+ $param1 = array( $params['st'], $params['call'] ) ; // session type and call func
657
+ $param1 = str_replace('--', '/session', $param1) ;
658
+ $param1 = str_replace('-', '/', $param1) ;
659
+ $esiData['st'] = explode(',', $param1[0]) ;
660
+ $esiData['call'] = $param1[1] ;
661
+ $esiData['cacheIfEmpty'] = true ;
662
+ }
663
+ $esiData['id'] = $url ;
664
+ if ( ($conf['access'] == 'private') && ($esiData['ttl'] > 0) ) {
665
+ if ( ! isset($this->_env['esiUrls'][$blockName]) ) {
666
+ $this->_env['esiUrls'][$blockName] = array( $url => self::ESIDATA_CACHE_NOTSET ) ;
667
+ $this->_env['update_cache'] |= 1 ; // 2: full update, 1: update url only
668
+ }
669
+ elseif ( ! isset($this->_env['esiUrls'][$blockName][$url]) ) {
670
+ $this->_env['esiUrls'][$blockName][$url] = self::ESIDATA_CACHE_NOTSET ;
671
+ $this->_env['update_cache'] |= 1 ; // 2: full update, 1: update url only
672
+ }
673
+ }
674
+ }
675
+
676
+ return $esiData ;
677
+ }
678
+
679
+ protected function _initLayout()
680
+ {
681
+ $layout = $this->getLayout() ;
682
+ $update = $layout->getUpdate() ;
683
+
684
+ $update->setStoreId($this->_env['s']) ;
685
+ // dispatch event for adding handles to layout update, this will auto add customer_logged_in or out
686
+ Mage::dispatchEvent(
687
+ 'controller_action_layout_load_before', array( 'action' => $this, 'layout' => $layout )
688
+ ) ;
689
+ $this->_env['defaultHandles'] = $update->getHandles() ;
690
+ if ( (($this->_env['update_cache'] & 2) == 2) && in_array('customer_logged_in', $this->_env['defaultHandles']) ) {
691
+ $this->_env['update_cache'] &= ~2 ; // 2: full update, 1: update url only
692
+ //Mage::log('customer logged in, unset update_cahce 2 to 1 = ' . $this->_env['update_cache']);
693
+ }
694
+ }
695
+
696
+ public function loadLayoutUpdates()
697
+ {
698
+ //$_profilerKey = self::PROFILER_KEY . '::' . $this->getFullActionName() . $this->_curData['n'] ;
699
+
700
+ if ( ! isset($this->_env['defaultHandles']) ) {
701
+ $this->_initLayout() ;
702
+ }
703
+
704
+ $this->_layout->resetBlocks() ;
705
+ $update = $this->_layout->getUpdate() ;
706
+ $update->setBlockNames($this->_curData['b']) ;
707
+
708
+ $update->addHandle($this->_curData['h']) ;
709
+ $update->addHandle($this->_env['defaultHandles']) ;
710
+
711
+ // load layout updates by specified handles
712
+ //Varien_Profiler::start("$_profilerKey::layout_load") ;
713
+ $update->load() ;
714
+ //Varien_Profiler::stop("$_profilerKey::layout_load") ;
715
+
716
+ return $this ;
717
+ }
718
+
719
+ protected function _initEnv( $params )
720
+ {
721
+ if (isset($this->_env['cache_id']))
722
+ return;
723
+
724
+ $this->_env['s'] = $params['s'] ;
725
+ $this->_env['dp'] = $params['dp'] ;
726
+ $this->_env['dt'] = $params['dt'] ;
727
+
728
+ $app = Mage::app() ;
729
+ $app->setCurrentStore($app->getStore($this->_env['s'])) ;
730
+ Mage::getSingleton('core/design_package')
731
+ ->setPackageName($this->_env['dp'])
732
+ ->setTheme($this->_env['dt']) ;
733
+
734
+ $curLocale = $app->getLocale() ;
735
+ $locale = Mage::getStoreConfig(Mage_Core_Model_Locale::XML_PATH_DEFAULT_LOCALE) ;
736
+ if ( $curLocale->getLocaleCode() != $locale ) {
737
+ $curLocale->setLocale($locale) ;
738
+ $translator = $app->getTranslator() ;
739
+ $translator->setLocale($locale) ;
740
+ $translator->init('frontend') ;
741
+ }
742
+
743
+ $customer_session = Mage::getSingleton('customer/session') ;
744
+ $customer_session->setNoReferer(true);
745
+ if ( $customer_session->isLoggedIn() ) {
746
+ Mage::register('current_customer', $customer_session->getCustomer()) ;
747
+ }
748
+
749
+ $tags = $this->_helper->getEsiSharedParams();
750
+ $this->_env['cache_id'] = self::ESIDATA_CACHE_ID . '_' . md5(join('__', $tags)) ;
751
+
752
+ $this->_env['esiUrls'] = array() ;
753
+ if (Mage::app()->useCache('layout')) {
754
+ if ( $data = Mage::app()->loadCache($this->_env['cache_id']) ) {
755
+ $this->_env['esiUrls'] = unserialize($data) ;
756
+ }
757
+ }
758
+
759
+ $this->_env['pri_ttl'] = $this->_config->getConf(Litespeed_Litemage_Helper_Data::CFG_PRIVATETTL) ;
760
+ $this->_env['pub_ttl'] = $this->_config->getConf(Litespeed_Litemage_Helper_Data::CFG_PUBLICTTL) ;
761
+ }
762
+
763
+ }
app/code/community/Litespeed/Litemage/etc/config.xml CHANGED
@@ -1,8 +1,32 @@
1
  <?xml version="1.0" encoding="UTF-8"?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  <config>
3
  <modules>
4
  <Litespeed_Litemage>
5
- <version>1.0.17</version>
6
  </Litespeed_Litemage>
7
  </modules>
8
  <global>
1
  <?xml version="1.0" encoding="UTF-8"?>
2
+ <!--
3
+ /**
4
+ * LiteMage
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This program is free software: you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License as published by
10
+ * the Free Software Foundation, either version 3 of the License, or
11
+ * (at your option) any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ * GNU General Public License for more details.
17
+ *
18
+ * You should have received a copy of the GNU General Public License
19
+ * along with this program. If not, see https://opensource.org/licenses/GPL-3.0 .
20
+ *
21
+ * @package LiteSpeed_LiteMage
22
+ * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
23
+ * @license https://opensource.org/licenses/GPL-3.0
24
+ */
25
+ -->
26
  <config>
27
  <modules>
28
  <Litespeed_Litemage>
29
+ <version>1.0.18</version>
30
  </Litespeed_Litemage>
31
  </modules>
32
  <global>
app/code/community/Litespeed/Litemage/etc/config.xml.dev ADDED
@@ -0,0 +1,506 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!--
3
+ /**
4
+ * LiteMage
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This program is free software: you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License as published by
10
+ * the Free Software Foundation, either version 3 of the License, or
11
+ * (at your option) any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ * GNU General Public License for more details.
17
+ *
18
+ * You should have received a copy of the GNU General Public License
19
+ * along with this program. If not, see https://opensource.org/licenses/GPL-3.0 .
20
+ *
21
+ * @package LiteSpeed_LiteMage
22
+ * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
23
+ * @license https://opensource.org/licenses/GPL-3.0
24
+ */
25
+ -->
26
+ <config>
27
+ <modules>
28
+ <Litespeed_Litemage>
29
+ <version>1.0.17</version>
30
+ </Litespeed_Litemage>
31
+ </modules>
32
+ <global>
33
+ <blocks>
34
+ <litemage>
35
+ <class>Litespeed_Litemage_Block</class>
36
+ </litemage>
37
+ </blocks>
38
+ <helpers>
39
+ <litemage>
40
+ <class>Litespeed_Litemage_Helper</class>
41
+ </litemage>
42
+ </helpers>
43
+ <models>
44
+ <litemage>
45
+ <class>Litespeed_Litemage_Model</class>
46
+ </litemage>
47
+ <core>
48
+ <rewrite>
49
+ <translate>Litespeed_Litemage_Model_Translate</translate>
50
+ </rewrite>
51
+ </core>
52
+ </models>
53
+ <events>
54
+ <!-- purge product cache after stock update -->
55
+ <cataloginventory_stock_item_save_after>
56
+ <observers>
57
+ <litemage_purge>
58
+ <class>litemage/observer_purge</class>
59
+ <method>purgeCatalogProductByStock</method>
60
+ </litemage_purge>
61
+ </observers>
62
+ </cataloginventory_stock_item_save_after>
63
+ </events>
64
+ </global>
65
+ <admin>
66
+ <routers>
67
+ <adminhtml>
68
+ <args>
69
+ <modules>
70
+ <litemage after="Mage_Adminhtml">Litespeed_Litemage_Adminhtml</litemage>
71
+ </modules>
72
+ </args>
73
+ </adminhtml>
74
+ </routers>
75
+ </admin>
76
+ <adminhtml>
77
+ <layout>
78
+ <updates>
79
+ <litemage>
80
+ <file>litemage.xml</file>
81
+ </litemage>
82
+ </updates>
83
+ </layout>
84
+ <acl>
85
+ <resources>
86
+ <admin>
87
+ <children>
88
+ <system>
89
+ <children>
90
+ <cache>
91
+ <children>
92
+ <litemage>
93
+ <title>LiteMage Cache Management</title>
94
+ </litemage>
95
+ </children>
96
+ </cache>
97
+ <config>
98
+ <children>
99
+ <litemage>
100
+ <title>LiteMage Cache Configuration</title>
101
+ </litemage>
102
+ </children>
103
+ </config>
104
+ </children>
105
+ </system>
106
+ </children>
107
+ </admin>
108
+ </resources>
109
+ </acl>
110
+ <events>
111
+ <controller_action_postdispatch_adminhtml_cache_flushAll>
112
+ <observers>
113
+ <litemage_purge>
114
+ <type>singleton</type>
115
+ <class>litemage/observer_purge</class>
116
+ <method>adminPurgeCache</method>
117
+ </litemage_purge>
118
+ </observers>
119
+ </controller_action_postdispatch_adminhtml_cache_flushAll>
120
+ <controller_action_postdispatch_adminhtml_cache_flushSystem>
121
+ <observers>
122
+ <litemage_purge>
123
+ <type>singleton</type>
124
+ <class>litemage/observer_purge</class>
125
+ <method>adminPurgeCache</method>
126
+ </litemage_purge>
127
+ </observers>
128
+ </controller_action_postdispatch_adminhtml_cache_flushSystem>
129
+ <controller_action_postdispatch_adminhtml_system_currency_saveRates>
130
+ <observers>
131
+ <litemage_purge>
132
+ <type>singleton</type>
133
+ <class>litemage/observer_purge</class>
134
+ <method>adminPurgeCurrency</method>
135
+ </litemage_purge>
136
+ </observers>
137
+ </controller_action_postdispatch_adminhtml_system_currency_saveRates>
138
+ <!-- purge category cache after save -->
139
+ <catalog_category_save_commit_after>
140
+ <observers>
141
+ <litemage_purge>
142
+ <class>litemage/observer_purge</class>
143
+ <method>adminPurgeCatalogCategory</method>
144
+ </litemage_purge>
145
+ </observers>
146
+ </catalog_category_save_commit_after>
147
+ <!-- purge product cache after save -->
148
+ <catalog_product_save_commit_after>
149
+ <observers>
150
+ <litemage_purge>
151
+ <class>litemage/observer_purge</class>
152
+ <method>adminPurgeCatalogProduct</method>
153
+ </litemage_purge>
154
+ </observers>
155
+ </catalog_product_save_commit_after>
156
+ <!-- purge cms page cache after save -->
157
+ <cms_page_save_commit_after>
158
+ <observers>
159
+ <litemage_purge>
160
+ <class>litemage/observer_purge</class>
161
+ <method>adminPurgeCmsPage</method>
162
+ </litemage_purge>
163
+ </observers>
164
+ </cms_page_save_commit_after>
165
+ <!-- purge all caches when module disabled -->
166
+ <admin_system_config_changed_section_litemage>
167
+ <observers>
168
+ <litemage_purge>
169
+ <class>litemage/observer_purge</class>
170
+ <method>adminConfigChangedSection</method>
171
+ </litemage_purge>
172
+ </observers>
173
+ </admin_system_config_changed_section_litemage>
174
+ <!-- displays warning if license not enabled -->
175
+ <controller_action_predispatch_adminhtml_system_config_edit>
176
+ <observers>
177
+ <litemage_purge>
178
+ <class>litemage/observer_purge</class>
179
+ <method>adminConfigEditSection</method>
180
+ </litemage_purge>
181
+ </observers>
182
+ </controller_action_predispatch_adminhtml_system_config_edit>
183
+ </events>
184
+ </adminhtml>
185
+ <frontend>
186
+ <routers>
187
+ <litemage>
188
+ <use>standard</use>
189
+ <args>
190
+ <module>Litespeed_Litemage</module>
191
+ <frontName>litemage</frontName>
192
+ </args>
193
+ </litemage>
194
+ </routers>
195
+ <layout>
196
+ <updates>
197
+ <litemage>
198
+ <file>litemage.xml</file>
199
+ </litemage>
200
+ </updates>
201
+ </layout>
202
+ <events>
203
+ <controller_action_predispatch>
204
+ <observers>
205
+ <litemage_esi>
206
+ <class>litemage/observer_esi</class>
207
+ <method>checkControllerNoCache</method>
208
+ </litemage_esi>
209
+ </observers>
210
+ </controller_action_predispatch>
211
+ <visitor_init>
212
+ <observers>
213
+ <litemage_esi>
214
+ <class>litemage/observer_esi</class>
215
+ <method>initNewVisitor</method>
216
+ </litemage_esi>
217
+ </observers>
218
+ </visitor_init>
219
+ <core_layout_block_create_after>
220
+ <observers>
221
+ <litemage_esi>
222
+ <class>litemage/observer_esi</class>
223
+ <method>checkEsiBlock</method>
224
+ </litemage_esi>
225
+ </observers>
226
+ </core_layout_block_create_after>
227
+ <controller_action_layout_generate_blocks_after>
228
+ <observers>
229
+ <litemage_esi>
230
+ <class>litemage/observer_esi</class>
231
+ <method>prepareInjection</method>
232
+ </litemage_esi>
233
+ </observers>
234
+ </controller_action_layout_generate_blocks_after>
235
+ <http_response_send_before>
236
+ <observers>
237
+ <litemage_esi>
238
+ <class>litemage/observer_esi</class>
239
+ <method>beforeResponseSend</method>
240
+ </litemage_esi>
241
+ </observers>
242
+ </http_response_send_before>
243
+ <customer_login>
244
+ <observers>
245
+ <litemage_esi>
246
+ <class>litemage/observer_esi</class>
247
+ <method>purgePrivateCache</method>
248
+ </litemage_esi>
249
+ </observers>
250
+ </customer_login>
251
+ <customer_logout>
252
+ <observers>
253
+ <litemage_esi>
254
+ <class>litemage/observer_esi</class>
255
+ <method>purgePrivateCache</method>
256
+ </litemage_esi>
257
+ </observers>
258
+ </customer_logout>
259
+ <sales_quote_save_after>
260
+ <observers>
261
+ <litemage_esi>
262
+ <class>litemage/observer_esi</class>
263
+ <method>purgeEsiCache</method>
264
+ </litemage_esi>
265
+ </observers>
266
+ </sales_quote_save_after>
267
+ <wishlist_item_save_after>
268
+ <observers>
269
+ <litemage_esi>
270
+ <class>litemage/observer_esi</class>
271
+ <method>purgeEsiCache</method>
272
+ </litemage_esi>
273
+ </observers>
274
+ </wishlist_item_save_after>
275
+ <wishlist_item_delete_after>
276
+ <observers>
277
+ <litemage_esi>
278
+ <class>litemage/observer_esi</class>
279
+ <method>purgeEsiCache</method>
280
+ </litemage_esi>
281
+ </observers>
282
+ </wishlist_item_delete_after>
283
+ <catalog_product_compare_add_product>
284
+ <observers>
285
+ <litemage_esi>
286
+ <class>litemage/observer_esi</class>
287
+ <method>purgeEsiCache</method>
288
+ </litemage_esi>
289
+ </observers>
290
+ </catalog_product_compare_add_product>
291
+ <catalog_product_compare_remove_product>
292
+ <observers>
293
+ <litemage_esi>
294
+ <class>litemage/observer_esi</class>
295
+ <method>purgeEsiCache</method>
296
+ </litemage_esi>
297
+ </observers>
298
+ </catalog_product_compare_remove_product>
299
+ <catalog_product_compare_item_collection_clear>
300
+ <observers>
301
+ <litemage_esi>
302
+ <class>litemage/observer_esi</class>
303
+ <method>purgeEsiCache</method>
304
+ </litemage_esi>
305
+ </observers>
306
+ </catalog_product_compare_item_collection_clear>
307
+ <catalog_controller_product_view>
308
+ <observers>
309
+ <litemage_esi>
310
+ <class>litemage/observer_esi</class>
311
+ <method>onCatalogProductView</method>
312
+ </litemage_esi>
313
+ </observers>
314
+ </catalog_controller_product_view>
315
+ <cms_page_render>
316
+ <observers>
317
+ <litemage_esi>
318
+ <class>litemage/observer_esi</class>
319
+ <method>onCmsPageRender</method>
320
+ </litemage_esi>
321
+ </observers>
322
+ </cms_page_render>
323
+ <poll_vote_add>
324
+ <observers>
325
+ <litemage_esi>
326
+ <class>litemage/observer_esi</class>
327
+ <method>purgeEsiCache</method>
328
+ </litemage_esi>
329
+ </observers>
330
+ </poll_vote_add>
331
+ <core_session_abstract_add_message>
332
+ <observers>
333
+ <litemage_esi>
334
+ <class>litemage/observer_esi</class>
335
+ <method>purgeEsiCache</method>
336
+ </litemage_esi>
337
+ </observers>
338
+ </core_session_abstract_add_message>
339
+ <checkout_onepage_controller_success_action>
340
+ <observers>
341
+ <litemage_esi>
342
+ <class>litemage/observer_esi</class>
343
+ <method>purgeEsiCache</method>
344
+ </litemage_esi>
345
+ </observers>
346
+ </checkout_onepage_controller_success_action>
347
+ </events>
348
+ <litemage>
349
+ <esiblock>
350
+ <!-- If you need to inject any other privately cached custom block groupings,
351
+ you can add them here. <blocks> contains the block names defined in your
352
+ layout files. All blocks that share the same purge events can be listed
353
+ together in a single grouping. If their purge events are not being watched
354
+ in the previous events section, you will also need to add a litemage esi
355
+ observer for those events.
356
+
357
+ This config file will be overwritten with upgrades to the LiteMage module.
358
+ If you have made any modifications, please make sure to keep a copy -->
359
+ <welcome>
360
+ <!-- blocks only purged by login/logout events, no purge_events configuration is required as login/logout will auto purge all private blocks -->
361
+ <access>private</access>
362
+ <blocks>T:Mage_Page_Block_Html_Welcome,welcome,litemage.jsvar,nickname$v</blocks>
363
+ <!-- Marking a block as valueonly, denoted by the suffix “$v”, will only output
364
+ the blocks html value without the added html tags and comments when in debug mode.
365
+ The block will also not be highlighted when using the LITEMAGE_DEBUG=SHOWHOLES parameter -->
366
+ </welcome>
367
+ <cart>
368
+ <access>private</access>
369
+ <!-- Blocks can be set using class type, denoted by the prefix "T:". This will include all blocks that inherit this type in the grouping -->
370
+ <blocks>T:Mage_Checkout_Block_Cart_Abstract</blocks>
371
+ <purge_events>
372
+ <sales_quote_save_after/>
373
+ </purge_events>
374
+ </cart>
375
+ <toplinks>
376
+ <access>private</access>
377
+ <blocks>top.links</blocks>
378
+ <purge_tags>cart, wishlist</purge_tags>
379
+ <!-- This is a composite grouping. The purge events for the blocks in this grouping are
380
+ a combination of existing purge event sets from other groupings. By using purge_tags
381
+ to reference these other groupings, you do not need to redefine these purge events. -->
382
+ </toplinks>
383
+ <compare>
384
+ <access>private</access>
385
+ <blocks>T:Mage_Catalog_Block_Product_Compare_Sidebar, T:Mage_Reports_Block_Product_Compared</blocks>
386
+ <purge_events>
387
+ <catalog_product_compare_add_product/>
388
+ <catalog_product_compare_remove_product/>
389
+ <catalog_product_compare_item_collection_clear/>
390
+ </purge_events>
391
+ </compare>
392
+ <viewed>
393
+ <access>private</access>
394
+ <blocks>T:Mage_Reports_Block_Product_Viewed</blocks>
395
+ <purge_events>
396
+ <catalog_controller_product_view/>
397
+ </purge_events>
398
+ </viewed>
399
+ <poll>
400
+ <access>private</access>
401
+ <blocks>T:Mage_Poll_Block_ActivePoll</blocks>
402
+ <purge_events>
403
+ <poll_vote_add/>
404
+ </purge_events>
405
+ </poll>
406
+ <!-- messages is specially handled, cannot change the tag name here, has to be "messages" -->
407
+ <messages>
408
+ <access>private</access>
409
+ <blocks>T:Mage_Core_Block_Messages</blocks>
410
+ <purge_events>
411
+ <core_session_abstract_add_message/>
412
+ </purge_events>
413
+ </messages>
414
+ <!-- Blocks only visible when logged in -->
415
+ <reorder>
416
+ <access>private</access>
417
+ <blocks>T:Mage_Sales_Block_Reorder_Sidebar</blocks>
418
+ <purge_events>
419
+ <sales_quote_save_after/>
420
+ <checkout_onepage_controller_success_action/>
421
+ </purge_events>
422
+ </reorder>
423
+ <wishlist>
424
+ <access>private</access>
425
+ <blocks>T:Mage_Wishlist_Block_Customer_Sidebar</blocks>
426
+ <purge_events>
427
+ <wishlist_item_save_after/>
428
+ <wishlist_item_delete_after/>
429
+ </purge_events>
430
+ </wishlist>
431
+ <!-- public blocks -->
432
+ <!-- Some themes will use a variable in footer that is declared in the header,
433
+ this causes the footer block to fail to generate. You can modify the
434
+ template to generate the missing variable or simply choose to not punch
435
+ a hole in footer (comment out the footer block).
436
+
437
+ Making the footer a public block will speed up page generation and save some disk space -->
438
+ <footer>
439
+ <access>public</access>
440
+ <blocks>footer</blocks>
441
+ </footer>
442
+ </esiblock>
443
+ </litemage>
444
+ </frontend>
445
+ <default>
446
+ <litemage>
447
+ <general>
448
+ <enabled>1</enabled>
449
+ <admin_ips>127.0.0.1</admin_ips>
450
+ <public_ttl>28800</public_ttl>
451
+ <private_ttl>3600</private_ttl>
452
+ <track_viewed>1</track_viewed>
453
+ <diff_customergroup>0</diff_customergroup>
454
+ <diff_cookie/>
455
+ <alt_esi_syntax>0</alt_esi_syntax>
456
+ </general>
457
+ <warmup>
458
+ <enable_warmup>1</enable_warmup>
459
+ <load_limit>5</load_limit>
460
+ <thread_limit>6</thread_limit>
461
+ <max_time>360</max_time>
462
+ <interval>21600</interval>
463
+ <priority>100</priority>
464
+ <multi_currency/>
465
+ <custlist/>
466
+ <custlist_priority>50</custlist_priority>
467
+ <custlist_interval>7200</custlist_interval>
468
+ </warmup>
469
+ <default>
470
+ <!-- Full or partial match on controller full action name for cacheable routes. Space, return, and comma separated -->
471
+ <cache_routes><![CDATA[catalog cms contacts_index_index]]></cache_routes>
472
+ <!-- Full or partial match on controller full action name for non-cacheable routes within cacheable routes. Space, return, and comma separated -->
473
+ <nocache_subroutes><![CDATA[catalog_product_compare catalogsearch]]></nocache_subroutes>
474
+ <!-- Entire response cached based on routes, same content for all urls, such as "cms_index_noRoute" for 404 pages. Space, return, and comma separated. -->
475
+ <fullcache_routes><![CDATA[cms_index_noRoute]]></fullcache_routes>
476
+ </default>
477
+ <donotcache>
478
+ <!-- configured through Admin Panel, do not update here. Customized settings will be picked up from database -->
479
+ <cache_routes/>
480
+ <nocache_subroutes/>
481
+ <vars>no_cache</vars>
482
+ <urls/>
483
+ <welcome/>
484
+ <toplinks/>
485
+ <messages/>
486
+ </donotcache>
487
+ <test>
488
+ <debug>0</debug>
489
+ <allow_ips/>
490
+ </test>
491
+ </litemage>
492
+ </default>
493
+ <crontab>
494
+ <jobs>
495
+ <litemage_warmup_cache>
496
+ <schedule>
497
+ <!--cron_expr>0,10,20,30,40,50 * * * *</cron_expr-->
498
+ <cron_expr>0,5,10,15,20,25,30,35,40,45,50,55 * * * *</cron_expr>
499
+ </schedule>
500
+ <run>
501
+ <model>litemage/observer_cron::warmCache</model>
502
+ </run>
503
+ </litemage_warmup_cache>
504
+ </jobs>
505
+ </crontab>
506
+ </config>
app/code/community/Litespeed/Litemage/etc/config.xml.package ADDED
@@ -0,0 +1,505 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!--
3
+ /**
4
+ * LiteMage
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This program is free software: you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License as published by
10
+ * the Free Software Foundation, either version 3 of the License, or
11
+ * (at your option) any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ * GNU General Public License for more details.
17
+ *
18
+ * You should have received a copy of the GNU General Public License
19
+ * along with this program. If not, see https://opensource.org/licenses/GPL-3.0 .
20
+ *
21
+ * @package LiteSpeed_LiteMage
22
+ * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
23
+ * @license https://opensource.org/licenses/GPL-3.0
24
+ */
25
+ -->
26
+ <config>
27
+ <modules>
28
+ <Litespeed_Litemage>
29
+ <version>1.0.17</version>
30
+ </Litespeed_Litemage>
31
+ </modules>
32
+ <global>
33
+ <blocks>
34
+ <litemage>
35
+ <class>Litespeed_Litemage_Block</class>
36
+ </litemage>
37
+ </blocks>
38
+ <helpers>
39
+ <litemage>
40
+ <class>Litespeed_Litemage_Helper</class>
41
+ </litemage>
42
+ </helpers>
43
+ <models>
44
+ <litemage>
45
+ <class>Litespeed_Litemage_Model</class>
46
+ </litemage>
47
+ <core>
48
+ <rewrite>
49
+ <translate>Litespeed_Litemage_Model_Translate</translate>
50
+ </rewrite>
51
+ </core>
52
+ </models>
53
+ <events>
54
+ <!-- purge product cache after stock update -->
55
+ <cataloginventory_stock_item_save_after>
56
+ <observers>
57
+ <litemage_purge>
58
+ <class>litemage/observer_purge</class>
59
+ <method>purgeCatalogProductByStock</method>
60
+ </litemage_purge>
61
+ </observers>
62
+ </cataloginventory_stock_item_save_after>
63
+ </events>
64
+ </global>
65
+ <admin>
66
+ <routers>
67
+ <adminhtml>
68
+ <args>
69
+ <modules>
70
+ <litemage after="Mage_Adminhtml">Litespeed_Litemage_Adminhtml</litemage>
71
+ </modules>
72
+ </args>
73
+ </adminhtml>
74
+ </routers>
75
+ </admin>
76
+ <adminhtml>
77
+ <layout>
78
+ <updates>
79
+ <litemage>
80
+ <file>litemage.xml</file>
81
+ </litemage>
82
+ </updates>
83
+ </layout>
84
+ <acl>
85
+ <resources>
86
+ <admin>
87
+ <children>
88
+ <system>
89
+ <children>
90
+ <cache>
91
+ <children>
92
+ <litemage>
93
+ <title>LiteMage Cache Management</title>
94
+ </litemage>
95
+ </children>
96
+ </cache>
97
+ <config>
98
+ <children>
99
+ <litemage>
100
+ <title>LiteMage Cache Configuration</title>
101
+ </litemage>
102
+ </children>
103
+ </config>
104
+ </children>
105
+ </system>
106
+ </children>
107
+ </admin>
108
+ </resources>
109
+ </acl>
110
+ <events>
111
+ <controller_action_postdispatch_adminhtml_cache_flushAll>
112
+ <observers>
113
+ <litemage_purge>
114
+ <type>singleton</type>
115
+ <class>litemage/observer_purge</class>
116
+ <method>adminPurgeCache</method>
117
+ </litemage_purge>
118
+ </observers>
119
+ </controller_action_postdispatch_adminhtml_cache_flushAll>
120
+ <controller_action_postdispatch_adminhtml_cache_flushSystem>
121
+ <observers>
122
+ <litemage_purge>
123
+ <type>singleton</type>
124
+ <class>litemage/observer_purge</class>
125
+ <method>adminPurgeCache</method>
126
+ </litemage_purge>
127
+ </observers>
128
+ </controller_action_postdispatch_adminhtml_cache_flushSystem>
129
+ <controller_action_postdispatch_adminhtml_system_currency_saveRates>
130
+ <observers>
131
+ <litemage_purge>
132
+ <type>singleton</type>
133
+ <class>litemage/observer_purge</class>
134
+ <method>adminPurgeCurrency</method>
135
+ </litemage_purge>
136
+ </observers>
137
+ </controller_action_postdispatch_adminhtml_system_currency_saveRates>
138
+ <!-- purge category cache after save -->
139
+ <catalog_category_save_commit_after>
140
+ <observers>
141
+ <litemage_purge>
142
+ <class>litemage/observer_purge</class>
143
+ <method>adminPurgeCatalogCategory</method>
144
+ </litemage_purge>
145
+ </observers>
146
+ </catalog_category_save_commit_after>
147
+ <!-- purge product cache after save -->
148
+ <catalog_product_save_commit_after>
149
+ <observers>
150
+ <litemage_purge>
151
+ <class>litemage/observer_purge</class>
152
+ <method>adminPurgeCatalogProduct</method>
153
+ </litemage_purge>
154
+ </observers>
155
+ </catalog_product_save_commit_after>
156
+ <!-- purge cms page cache after save -->
157
+ <cms_page_save_commit_after>
158
+ <observers>
159
+ <litemage_purge>
160
+ <class>litemage/observer_purge</class>
161
+ <method>adminPurgeCmsPage</method>
162
+ </litemage_purge>
163
+ </observers>
164
+ </cms_page_save_commit_after>
165
+ <!-- purge all caches when module disabled -->
166
+ <admin_system_config_changed_section_litemage>
167
+ <observers>
168
+ <litemage_purge>
169
+ <class>litemage/observer_purge</class>
170
+ <method>adminConfigChangedSection</method>
171
+ </litemage_purge>
172
+ </observers>
173
+ </admin_system_config_changed_section_litemage>
174
+ <!-- displays warning if license not enabled -->
175
+ <controller_action_predispatch_adminhtml_system_config_edit>
176
+ <observers>
177
+ <litemage_purge>
178
+ <class>litemage/observer_purge</class>
179
+ <method>adminConfigEditSection</method>
180
+ </litemage_purge>
181
+ </observers>
182
+ </controller_action_predispatch_adminhtml_system_config_edit>
183
+ </events>
184
+ </adminhtml>
185
+ <frontend>
186
+ <routers>
187
+ <litemage>
188
+ <use>standard</use>
189
+ <args>
190
+ <module>Litespeed_Litemage</module>
191
+ <frontName>litemage</frontName>
192
+ </args>
193
+ </litemage>
194
+ </routers>
195
+ <layout>
196
+ <updates>
197
+ <litemage>
198
+ <file>litemage.xml</file>
199
+ </litemage>
200
+ </updates>
201
+ </layout>
202
+ <events>
203
+ <controller_action_predispatch>
204
+ <observers>
205
+ <litemage_esi>
206
+ <class>litemage/observer_esi</class>
207
+ <method>checkControllerNoCache</method>
208
+ </litemage_esi>
209
+ </observers>
210
+ </controller_action_predispatch>
211
+ <visitor_init>
212
+ <observers>
213
+ <litemage_esi>
214
+ <class>litemage/observer_esi</class>
215
+ <method>initNewVisitor</method>
216
+ </litemage_esi>
217
+ </observers>
218
+ </visitor_init>
219
+ <core_layout_block_create_after>
220
+ <observers>
221
+ <litemage_esi>
222
+ <class>litemage/observer_esi</class>
223
+ <method>checkEsiBlock</method>
224
+ </litemage_esi>
225
+ </observers>
226
+ </core_layout_block_create_after>
227
+ <controller_action_layout_generate_blocks_after>
228
+ <observers>
229
+ <litemage_esi>
230
+ <class>litemage/observer_esi</class>
231
+ <method>prepareInjection</method>
232
+ </litemage_esi>
233
+ </observers>
234
+ </controller_action_layout_generate_blocks_after>
235
+ <http_response_send_before>
236
+ <observers>
237
+ <litemage_esi>
238
+ <class>litemage/observer_esi</class>
239
+ <method>beforeResponseSend</method>
240
+ </litemage_esi>
241
+ </observers>
242
+ </http_response_send_before>
243
+ <customer_login>
244
+ <observers>
245
+ <litemage_esi>
246
+ <class>litemage/observer_esi</class>
247
+ <method>purgePrivateCache</method>
248
+ </litemage_esi>
249
+ </observers>
250
+ </customer_login>
251
+ <customer_logout>
252
+ <observers>
253
+ <litemage_esi>
254
+ <class>litemage/observer_esi</class>
255
+ <method>purgePrivateCache</method>
256
+ </litemage_esi>
257
+ </observers>
258
+ </customer_logout>
259
+ <sales_quote_save_after>
260
+ <observers>
261
+ <litemage_esi>
262
+ <class>litemage/observer_esi</class>
263
+ <method>purgeEsiCache</method>
264
+ </litemage_esi>
265
+ </observers>
266
+ </sales_quote_save_after>
267
+ <wishlist_item_save_after>
268
+ <observers>
269
+ <litemage_esi>
270
+ <class>litemage/observer_esi</class>
271
+ <method>purgeEsiCache</method>
272
+ </litemage_esi>
273
+ </observers>
274
+ </wishlist_item_save_after>
275
+ <wishlist_item_delete_after>
276
+ <observers>
277
+ <litemage_esi>
278
+ <class>litemage/observer_esi</class>
279
+ <method>purgeEsiCache</method>
280
+ </litemage_esi>
281
+ </observers>
282
+ </wishlist_item_delete_after>
283
+ <catalog_product_compare_add_product>
284
+ <observers>
285
+ <litemage_esi>
286
+ <class>litemage/observer_esi</class>
287
+ <method>purgeEsiCache</method>
288
+ </litemage_esi>
289
+ </observers>
290
+ </catalog_product_compare_add_product>
291
+ <catalog_product_compare_remove_product>
292
+ <observers>
293
+ <litemage_esi>
294
+ <class>litemage/observer_esi</class>
295
+ <method>purgeEsiCache</method>
296
+ </litemage_esi>
297
+ </observers>
298
+ </catalog_product_compare_remove_product>
299
+ <catalog_product_compare_item_collection_clear>
300
+ <observers>
301
+ <litemage_esi>
302
+ <class>litemage/observer_esi</class>
303
+ <method>purgeEsiCache</method>
304
+ </litemage_esi>
305
+ </observers>
306
+ </catalog_product_compare_item_collection_clear>
307
+ <catalog_controller_product_view>
308
+ <observers>
309
+ <litemage_esi>
310
+ <class>litemage/observer_esi</class>
311
+ <method>onCatalogProductView</method>
312
+ </litemage_esi>
313
+ </observers>
314
+ </catalog_controller_product_view>
315
+ <cms_page_render>
316
+ <observers>
317
+ <litemage_esi>
318
+ <class>litemage/observer_esi</class>
319
+ <method>onCmsPageRender</method>
320
+ </litemage_esi>
321
+ </observers>
322
+ </cms_page_render>
323
+ <poll_vote_add>
324
+ <observers>
325
+ <litemage_esi>
326
+ <class>litemage/observer_esi</class>
327
+ <method>purgeEsiCache</method>
328
+ </litemage_esi>
329
+ </observers>
330
+ </poll_vote_add>
331
+ <core_session_abstract_add_message>
332
+ <observers>
333
+ <litemage_esi>
334
+ <class>litemage/observer_esi</class>
335
+ <method>purgeEsiCache</method>
336
+ </litemage_esi>
337
+ </observers>
338
+ </core_session_abstract_add_message>
339
+ <checkout_onepage_controller_success_action>
340
+ <observers>
341
+ <litemage_esi>
342
+ <class>litemage/observer_esi</class>
343
+ <method>purgeEsiCache</method>
344
+ </litemage_esi>
345
+ </observers>
346
+ </checkout_onepage_controller_success_action>
347
+ </events>
348
+ <litemage>
349
+ <esiblock>
350
+ <!-- If you need to inject any other privately cached custom block groupings,
351
+ you can add them here. <blocks> contains the block names defined in your
352
+ layout files. All blocks that share the same purge events can be listed
353
+ together in a single grouping. If their purge events are not being watched
354
+ in the previous events section, you will also need to add a litemage esi
355
+ observer for those events.
356
+
357
+ This config file will be overwritten with upgrades to the LiteMage module.
358
+ If you have made any modifications, please make sure to keep a copy -->
359
+ <welcome>
360
+ <!-- blocks only purged by login/logout events, no purge_events configuration is required as login/logout will auto purge all private blocks -->
361
+ <access>private</access>
362
+ <blocks>T:Mage_Page_Block_Html_Welcome,welcome,litemage.jsvar,nickname$v</blocks>
363
+ <!-- Marking a block as valueonly, denoted by the suffix “$v”, will only output
364
+ the blocks html value without the added html tags and comments when in debug mode.
365
+ The block will also not be highlighted when using the LITEMAGE_DEBUG=SHOWHOLES parameter -->
366
+ </welcome>
367
+ <cart>
368
+ <access>private</access>
369
+ <!-- Blocks can be set using class type, denoted by the prefix "T:". This will include all blocks that inherit this type in the grouping -->
370
+ <blocks>T:Mage_Checkout_Block_Cart_Abstract</blocks>
371
+ <purge_events>
372
+ <sales_quote_save_after/>
373
+ </purge_events>
374
+ </cart>
375
+ <toplinks>
376
+ <access>private</access>
377
+ <blocks>top.links</blocks>
378
+ <purge_tags>cart, wishlist</purge_tags>
379
+ <!-- This is a composite grouping. The purge events for the blocks in this grouping are
380
+ a combination of existing purge event sets from other groupings. By using purge_tags
381
+ to reference these other groupings, you do not need to redefine these purge events. -->
382
+ </toplinks>
383
+ <compare>
384
+ <access>private</access>
385
+ <blocks>T:Mage_Catalog_Block_Product_Compare_Sidebar, T:Mage_Reports_Block_Product_Compared</blocks>
386
+ <purge_events>
387
+ <catalog_product_compare_add_product/>
388
+ <catalog_product_compare_remove_product/>
389
+ <catalog_product_compare_item_collection_clear/>
390
+ </purge_events>
391
+ </compare>
392
+ <viewed>
393
+ <access>private</access>
394
+ <blocks>T:Mage_Reports_Block_Product_Viewed</blocks>
395
+ <purge_events>
396
+ <catalog_controller_product_view/>
397
+ </purge_events>
398
+ </viewed>
399
+ <poll>
400
+ <access>private</access>
401
+ <blocks>T:Mage_Poll_Block_ActivePoll</blocks>
402
+ <purge_events>
403
+ <poll_vote_add/>
404
+ </purge_events>
405
+ </poll>
406
+ <!-- messages is specially handled, cannot change the tag name here, has to be "messages" -->
407
+ <messages>
408
+ <access>private</access>
409
+ <blocks>T:Mage_Core_Block_Messages</blocks>
410
+ <purge_events>
411
+ <core_session_abstract_add_message/>
412
+ </purge_events>
413
+ </messages>
414
+ <!-- Blocks only visible when logged in -->
415
+ <reorder>
416
+ <access>private</access>
417
+ <blocks>T:Mage_Sales_Block_Reorder_Sidebar</blocks>
418
+ <purge_events>
419
+ <sales_quote_save_after/>
420
+ <checkout_onepage_controller_success_action/>
421
+ </purge_events>
422
+ </reorder>
423
+ <wishlist>
424
+ <access>private</access>
425
+ <blocks>T:Mage_Wishlist_Block_Customer_Sidebar</blocks>
426
+ <purge_events>
427
+ <wishlist_item_save_after/>
428
+ <wishlist_item_delete_after/>
429
+ </purge_events>
430
+ </wishlist>
431
+ <!-- public blocks -->
432
+ <!-- Some themes will use a variable in footer that is declared in the header,
433
+ this causes the footer block to fail to generate. You can modify the
434
+ template to generate the missing variable or simply choose to not punch
435
+ a hole in footer (comment out the footer block).
436
+
437
+ Making the footer a public block will speed up page generation and save some disk space -->
438
+ <footer>
439
+ <access>public</access>
440
+ <blocks>footer</blocks>
441
+ </footer>
442
+ </esiblock>
443
+ </litemage>
444
+ </frontend>
445
+ <default>
446
+ <litemage>
447
+ <general>
448
+ <enabled>0</enabled>
449
+ <admin_ips>127.0.0.1</admin_ips>
450
+ <public_ttl>28800</public_ttl>
451
+ <private_ttl>1800</private_ttl>
452
+ <track_viewed>0</track_viewed>
453
+ <diff_customergroup>0</diff_customergroup>
454
+ <diff_cookie/>
455
+ <alt_esi_syntax>0</alt_esi_syntax>
456
+ </general>
457
+ <warmup>
458
+ <enable_warmup>0</enable_warmup>
459
+ <load_limit>5</load_limit>
460
+ <thread_limit>6</thread_limit>
461
+ <max_time>360</max_time>
462
+ <interval>21600</interval>
463
+ <priority>100</priority>
464
+ <multi_currency/>
465
+ <custlist/>
466
+ <custlist_priority>50</custlist_priority>
467
+ <custlist_interval>7200</custlist_interval>
468
+ </warmup>
469
+ <default>
470
+ <!-- Full or partial match on controller full action name for cacheable routes. Space, return, and comma separated -->
471
+ <cache_routes><![CDATA[catalog cms contacts_index_index]]></cache_routes>
472
+ <!-- Full or partial match on controller full action name for non-cacheable routes within cacheable routes. Space, return, and comma separated -->
473
+ <nocache_subroutes><![CDATA[catalog_product_compare catalogsearch]]></nocache_subroutes>
474
+ <!-- Entire response cached based on routes, same content for all urls, such as "cms_index_noRoute" for 404 pages. Space, return, and comma separated. -->
475
+ <fullcache_routes><![CDATA[cms_index_noRoute]]></fullcache_routes>
476
+ </default>
477
+ <donotcache>
478
+ <!-- configured through Admin Panel, do not update here. Customized settings will be picked up from database -->
479
+ <cache_routes/>
480
+ <nocache_subroutes/>
481
+ <vars>no_cache</vars>
482
+ <urls/>
483
+ <welcome/>
484
+ <toplinks/>
485
+ <messages/>
486
+ </donotcache>
487
+ <test>
488
+ <debug>0</debug>
489
+ <allow_ips/>
490
+ </test>
491
+ </litemage>
492
+ </default>
493
+ <crontab>
494
+ <jobs>
495
+ <litemage_warmup_cache>
496
+ <schedule>
497
+ <cron_expr>0,10,20,30,40,50 * * * *</cron_expr>
498
+ </schedule>
499
+ <run>
500
+ <model>litemage/observer_cron::warmCache</model>
501
+ </run>
502
+ </litemage_warmup_cache>
503
+ </jobs>
504
+ </crontab>
505
+ </config>
app/code/community/Litespeed/Litemage/etc/system.xml CHANGED
@@ -1,17 +1,34 @@
1
  <?xml version="1.0" encoding="UTF-8"?>
2
  <!--
3
  /**
4
- * LiteMage by LiteSpeed Technologies, Inc.
5
- *
6
- * @package LiteSpeed_LiteMage
7
- * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies (http://www.litespeedtech.com)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  */
 
9
  -->
10
 
11
  <config>
12
  <tabs>
13
  <Litespeed_Litemage translate="label">
14
- <label>LiteMage Cache 1.0.17</label>
15
  <sort_order>5000</sort_order>
16
  </Litespeed_Litemage>
17
  </tabs>
1
  <?xml version="1.0" encoding="UTF-8"?>
2
  <!--
3
  /**
4
+ * LiteMage
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This program is free software: you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License as published by
10
+ * the Free Software Foundation, either version 3 of the License, or
11
+ * (at your option) any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ * GNU General Public License for more details.
17
+ *
18
+ * You should have received a copy of the GNU General Public License
19
+ * along with this program. If not, see https://opensource.org/licenses/GPL-3.0 .
20
+ *
21
+ * @package LiteSpeed_LiteMage
22
+ * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
23
+ * @license https://opensource.org/licenses/GPL-3.0
24
  */
25
+
26
  -->
27
 
28
  <config>
29
  <tabs>
30
  <Litespeed_Litemage translate="label">
31
+ <label>LiteMage Cache 1.0.18</label>
32
  <sort_order>5000</sort_order>
33
  </Litespeed_Litemage>
34
  </tabs>
app/design/adminhtml/default/default/layout/litemage.xml CHANGED
@@ -1,4 +1,29 @@
1
  <?xml version="1.0" encoding="UTF-8"?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  <layout version="0.1.0">
3
  <adminhtml_cache_index>
4
  <reference name="content">
1
  <?xml version="1.0" encoding="UTF-8"?>
2
+ <!--
3
+ /**
4
+ * LiteMage
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This program is free software: you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License as published by
10
+ * the Free Software Foundation, either version 3 of the License, or
11
+ * (at your option) any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ * GNU General Public License for more details.
17
+ *
18
+ * You should have received a copy of the GNU General Public License
19
+ * along with this program. If not, see https://opensource.org/licenses/GPL-3.0 .
20
+ *
21
+ * @package LiteSpeed_LiteMage
22
+ * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
23
+ * @license https://opensource.org/licenses/GPL-3.0
24
+ */
25
+ -->
26
+
27
  <layout version="0.1.0">
28
  <adminhtml_cache_index>
29
  <reference name="content">
app/design/adminhtml/default/default/template/litemage/cache_management.phtml CHANGED
@@ -1,89 +1,145 @@
1
- <?php //0046a
2
- if(!extension_loaded('ionCube Loader')){$__oc=strtolower(substr(php_uname(),0,3));$__ln='ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');if(function_exists('dl')){@dl($__ln);}if(function_exists('_il_exec')){return _il_exec();}$__ln='/ioncube/'.$__ln;$__oid=$__id=realpath(ini_get('extension_dir'));$__here=dirname(__FILE__);if(strlen($__id)>1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}if(function_exists('dl')){@dl($__ln);}}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file <b>'.__FILE__.'</b> requires the ionCube PHP Loader '.basename($__ln).' to be installed by the website operator. If you are the website operator please use the <a href="http://www.ioncube.com/lw/">ionCube Loader Wizard</a> to assist with installation.');exit(199);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  ?>
4
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- A8FX3Dk7dMCqUki98rLuzzRHin9jQ+JWAwYqm5emC7kl7IGsB1eQajTExhDwvtR4zLcQxnJ2ppcb
14
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- w9kie7W0XP52qr9QMft8eJuYj1Y3h9tJGfi615+P4rDzdL/k9E1al2pKm18UAjpPhE/hD+8tIOy5
33
- kzWFviKmYAvp7gF/afLsIWqehQ9BtnZDbJPRS805Uc+z1wtreqaKjHE2vyG7SKE67ckzRcxbewC5
34
- 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
- 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
- GsUdO9mjFdmKzdYUizA3BAAR1Vi//4sVEa7bSz6WKGe+KjLeuNCx3JMRnOWNMnZidtpMMGu0sRlW
37
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +bIyBqMRMeV9OMgDmqZQOt+dh/ltzx2y5YxNNFmC0tY4NbAvyzCLy8ygeJR0uEvPaL6a05Gs9xrH
57
- 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
- SHvYSl+PBUjhYSuL6fajLrEacz8ss+Km//tYP8hM4NdSDAC0b+iHb6y68sHby0GpHz5jOGX/GauN
59
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- pe4mut1XBwe/RQOHrEBBGz3ehTRJarundQLCVvfJJ4V7tY1tgt09p3Q/lfDsmy629C8bK85DYMOD
77
- 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
- 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
- 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
- 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
- n9BFNXapwqTQHLT45wtW7CtXUsAG3xcRxf6qvt0xaMWC8uIVTMfJm0bJfqaDOXplVm43dMY3sOWg
82
- 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
- 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
- 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
- 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
- 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
- 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
- 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
89
- MGh+WTw5YHM7XCjJvzqK2XOki5tkFVe=
1
+ <?php
2
+ /**
3
+ * LiteMage
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This program is free software: you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation, either version 3 of the License, or
10
+ * (at your option) any later version.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License
18
+ * along with this program. If not, see https://opensource.org/licenses/GPL-3.0 .
19
+ *
20
+ * @package LiteSpeed_LiteMage
21
+ * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
22
+ * @license https://opensource.org/licenses/GPL-3.0
23
+ */
24
+
25
+ if ($this->canShowButton()):
26
+ $lmhelper = Mage::helper('litemage/data');
27
+ ?>
28
+ <br/>
29
+ <div class="content-header">
30
+ <table cellspacing="0">
31
+ <tr>
32
+ <td><h3><?php echo $lmhelper->__('LiteMage Cache Management (LiteSpeed Web Server)') ?></h3></td>
33
+ </tr>
34
+ </table>
35
+ </div>
36
+ <?php if (!$this->isCacheAvailable()) {
37
+ echo '<div><ul class="messages">
38
+ <li class="error-msg">LiteMage extension requires Configuration and Layouts cache types to be enabled. It will not function properly with these settings disabled.
39
+ </li></ul></div>';
40
+ }
41
+ ?>
42
+
43
+ <table class="form-list">
44
+ <tr>
45
+ <td class="scope-label">
46
+ <button onclick="setLocation('<?php echo $this->getPurgeUrl('All')?>')" type="button" class="scalable"><span><?php echo $lmhelper->__('Flush All LiteMage Cache') ?></span></button>
47
+ </td>
48
+ <td class="scope-label">
49
+ <?php echo $lmhelper->__('All cache storage.')?>
50
+ </td>
51
+ </tr>
52
+ </table>
53
+ <form action="<?php echo $this->getPurgeUrl('Tag')?>" method="post" id="litemage_purgeTag">
54
+ <?php echo $this->getBlockHtml('formkey')?>
55
+ <table class="form-list">
56
+ <tr>
57
+ <td class="scope-label">
58
+ <button type="submit" class="scalable"><span><?php echo $lmhelper->__('Flush LiteMage Cache By IDs') ?></span></button>
59
+ </td>
60
+ <td class="scope-label">
61
+ <select name="tag_types" class="required-entry select local-validation">
62
+ <option value="P"><?php echo $lmhelper->__('Product IDs')?></option>
63
+ <option value="C"><?php echo $lmhelper->__('Category IDs')?></option>
64
+ <option value="G"><?php echo $lmhelper->__('CMS IDs')?></option>
65
+ </select>
66
+ </td>
67
+ <td class="scope-label">
68
+ <input type="text" name="purge_tag" class="input-text required-entry" style="width:150px"/>
69
+ </td>
70
+ <td class="scope-label">
71
+ <?php echo $lmhelper->__('Specify one or more IDs separated by spaces. (Under normal operation, related pages will automatically be purged when saving changes to an item through the Admin Panel.)')?>
72
+ </td>
73
+ </tr>
74
+ </table>
75
+ </form>
76
+ <form action="<?php echo $this->getPurgeUrl('Url')?>" method="post" id="litemage_purgeUrl">
77
+ <?php echo $this->getBlockHtml('formkey')?>
78
+ <table class="form-list">
79
+ <tr>
80
+ <td class="scope-label">
81
+ <button type="submit" class="scalable"><span><?php echo $lmhelper->__('Flush LiteMage Cache By URL') ?></span></button>
82
+ </td>
83
+ <td class="scope-label">
84
+ <input type="text" name="purge_url" class="input-text required-entry" style="width:350px"/>
85
+ </td>
86
+ <td class="scope-label">
87
+ <?php echo $lmhelper->__('Specify a relative URL starting with /.')?>
88
+ </td>
89
+ </tr>
90
+ </table>
91
+ </form>
92
+ <br/>
93
+ <?php echo $this->getChildHtml();
94
+
95
+ if ($status = $this->getCrawlerStatus()) : ?>
96
+ <form method="get" action="<?php echo $this->getPurgeUrl('Refresh')?>" id="litemage_crawlstatus">
97
+ <div class="content-header">
98
+ <table class="form-list" cellspacing="0">
99
+ <tr>
100
+ <td><h3><?php echo $lmhelper->__('LiteMage Crawler Warm-up Status') ?><button type="submit" class="scalable"><span><?php echo $lmhelper->__('Refresh') ?></span></button></h3></td>
101
+ </tr>
102
+ <tr><td class="scope-label"><?php echo $lmhelper->__('You can click Reset All / Reset links below to restart a crawler queue.') ?></td></tr>
103
+ </table>
104
+ </div>
105
+ </form>
106
+
107
+ <div class="grid"><div class="hor-scroll"><table>
108
+ <tr class="headings">
109
+ <th class="no-link a-center"><?php echo $lmhelper->__('Prioirty');?></th>
110
+ <th class="no-link a-center"><?php echo $lmhelper->__('List ID')
111
+ . '<br><a href="' . $status['url_reset'] . '" title="Click to reset all crawler queues">' . $lmhelper->__('Reset All') . '</a>'; ?>
112
+ </th>
113
+ <th class="no-link"><?php echo $lmhelper->__('Base URL') . '<br>' . $lmhelper->__('Custom List Path'); ?></th>
114
+ <th class="no-link a-right"><?php echo $lmhelper->__('Run Interval (secs)')
115
+ . '<br>' . $lmhelper->__('Store Public TTL (secs)'); ?>
116
+ </th>
117
+ <th class="no-link a-center"><?php echo $lmhelper->__('Generated') . '<br>' . $lmhelper->__('Finished'); ?></th>
118
+ <th class="no-link"><?php echo $lmhelper->__('Environment') . '<br>' . $lmhelper->__('Current Vary'); ?></th>
119
+ <th class="no-link a-right"><?php echo $lmhelper->__('Current Position') . ' | ' . $lmhelper->__('List Size')
120
+ . '<br>' . $lmhelper->__('Last Query Time | Total Queried'); ?></th>
121
+ </tr>
122
+ <?php foreach ($status['stores'] as $s) {
123
+ $buf = '<tr>';
124
+ $buf .= '<td class="a-center">' . $s['priority'] . '</td>'
125
+ . '<td class="a-center">' . $s['id'] . '<br>'
126
+ . '<a target="_blank" href="' . $status['url_details'] . '?list=' . $s['id'] . '">' . $lmhelper->__('Details')
127
+ . '</a> | <a href="' . $status['url_reset'] . '?list=' . $s['id'] . '" title="Click to reset this crawler queue">' . $lmhelper->__('Reset') . '</a></td>'
128
+ . '<td>' . $s['baseurl'] . '<br>' . $s['file'] . '</td>'
129
+ . '<td class="a-right">' . $s['interval'] . '<br>' . $s['ttl'] . '</td>'
130
+ . '<td class="a-center">' . $s['gentime'] . '<br>' . $s['endtime'] . '</td>'
131
+ . '<td>' . $s['env'] . '<br>' . $s['curvary'] . '</td>'
132
+ . '<td class="a-right">' . $s['curpos'] . ' | ' . $s['listsize'] . '<br>' . $s['lastquerytime'] . ' | '. $s['queried'] . '</td>'
133
+ . "</tr>\n";
134
+ echo $buf;
135
+ }
136
+ ?>
137
+ </table></div>
138
+ <p class="comment"><?php echo $lmhelper->__('Crawler status updated on') . ' ' . $status['lastupdate'] . '. ' . $status['endreason']; ?></p>
139
+ </div>
140
+
141
+ <?php endif;
142
+
143
+ endif;
144
+
145
  ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/design/frontend/base/default/layout/litemage.xml CHANGED
@@ -1,7 +1,27 @@
1
  <?xml version="1.0" encoding="UTF-8"?>
2
  <!--
3
- LiteMage plugin for LiteSpeed web server
4
- @copyright Copyright (c) 2015 LiteSpeed Technologies, Inc. (http://www.litespeedtech.com)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  -->
6
 
7
  <layout>
1
  <?xml version="1.0" encoding="UTF-8"?>
2
  <!--
3
+ /**
4
+ * LiteMage
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This program is free software: you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License as published by
10
+ * the Free Software Foundation, either version 3 of the License, or
11
+ * (at your option) any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ * GNU General Public License for more details.
17
+ *
18
+ * You should have received a copy of the GNU General Public License
19
+ * along with this program. If not, see https://opensource.org/licenses/GPL-3.0 .
20
+ *
21
+ * @package LiteSpeed_LiteMage
22
+ * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
23
+ * @license https://opensource.org/licenses/GPL-3.0
24
+ */
25
  -->
26
 
27
  <layout>
app/design/frontend/base/default/template/litemage/inject/jsvar.phtml CHANGED
@@ -1,9 +1,28 @@
1
  <?php
2
- /*
3
- * LiteMage plugin for LiteSpeed web server
4
- * @copyright Copyright (c) 2015 LiteSpeed Technologies, Inc. (http://www.litespeedtech.com)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  */
6
 
 
7
  /* This is a private block (place holder template) to correct any variable that was set in public cached javascript earlier.
8
  * So you do not need to modify your existing code in third-part's theme/template/extension.
9
  * Since this will be in private block, so all the information can be set correctly for a particular user based on his own session information
1
  <?php
2
+ /**
3
+ * LiteMage
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This program is free software: you can redistribute it and/or modify
8
+ * it under the terms of the GNU General Public License as published by
9
+ * the Free Software Foundation, either version 3 of the License, or
10
+ * (at your option) any later version.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License
18
+ * along with this program. If not, see https://opensource.org/licenses/GPL-3.0 .
19
+ *
20
+ * @package LiteSpeed_LiteMage
21
+ * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
22
+ * @license https://opensource.org/licenses/GPL-3.0
23
  */
24
 
25
+
26
  /* This is a private block (place holder template) to correct any variable that was set in public cached javascript earlier.
27
  * So you do not need to modify your existing code in third-part's theme/template/extension.
28
  * Since this will be in private block, so all the information can be set correctly for a particular user based on his own session information
app/etc/modules/Litespeed_Litemage.xml CHANGED
@@ -1,7 +1,27 @@
1
  <?xml version="1.0"?>
2
  <!--
3
- LiteSpeed LiteMage Extension for Magento
4
- Copyright (C) 2015 LiteSpeed Technologies, Inc. (www.litespeedtech.com)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  -->
6
  <config>
7
  <modules>
1
  <?xml version="1.0"?>
2
  <!--
3
+ /**
4
+ * LiteMage
5
+ *
6
+ * NOTICE OF LICENSE
7
+ *
8
+ * This program is free software: you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License as published by
10
+ * the Free Software Foundation, either version 3 of the License, or
11
+ * (at your option) any later version.
12
+ *
13
+ * This program is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ * GNU General Public License for more details.
17
+ *
18
+ * You should have received a copy of the GNU General Public License
19
+ * along with this program. If not, see https://opensource.org/licenses/GPL-3.0 .
20
+ *
21
+ * @package LiteSpeed_LiteMage
22
+ * @copyright Copyright (c) 2015-2016 LiteSpeed Technologies, Inc. (https://www.litespeedtech.com)
23
+ * @license https://opensource.org/licenses/GPL-3.0
24
+ */
25
  -->
26
  <config>
27
  <modules>
package.xml CHANGED
@@ -1,21 +1,18 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>LiteSpeed_LiteMage</name>
4
- <version>1.0.17</version>
5
  <stability>stable</stability>
6
- <license uri="https://www.litespeedtech.com/docs/webserver/license-enterprise">LiteSpeed proprietary license </license>
7
  <channel>community</channel>
8
  <extends/>
9
  <summary>LiteMage Cache speeds up Magento by automatically integrating Magento with LiteSpeed's superior ESI implementation.</summary>
10
  <description>LiteMage Cache is a powerful Magento page caching utility built into LiteSpeed Web Server. It combines superior ESI implementation with easy set up. LiteMage Cache contains a number of optimizations, including combined subrequests, that give it faster, more efficient performance than other page caching utilities. In addition, because it is part of the web server, LiteMage Cache does away with the communication problems and overhead other page caching solutions suffer from. The LiteMage Magento extension then automatically integrates Magento installations with LiteSpeed's top-of-the-line ESI implementation, combining the greatest Magento performance enhancement possible with a painless set up.</description>
11
- <notes>Domains are now excluded from ESI URLs.&#xD;
12
- &#xD;
13
- Switched cache warm up URL list handling from Magento's cache backend to a file-based system to decrease the chance of large lists exceeding memcached's maximum object size.&#xD;
14
- </notes>
15
  <authors><author><name>LiteSpeed Technologies</name><user>LiteSpeedTech</user><email>lsong@litespeedtech.com</email></author></authors>
16
- <date>2016-03-09</date>
17
- <time>20:54:22</time>
18
- <contents><target name="magecommunity"><dir name="Litespeed"><dir name="Litemage"><dir name="Block"><dir name="Adminhtml"><dir name="Cache"><file name="Management.php" hash="1042dba6c4923c6db5039c23d5ba580a"/></dir></dir><dir name="Core"><file name="Esi.php" hash="0947d9ba855fa731ee213d779b6a9b8e"/><file name="Messages.php" hash="d81de63af89bf70331c0c098b7fd32e4"/></dir><dir name="Inject"><file name="Jsvar.php" hash="615c52d878e849405a7c4666c6260b36"/><file name="Nickname.php" hash="9a23b30cd90e8ddfefdd44e52a09fd8e"/></dir></dir><dir name="Helper"><file name="Data.php" hash="097c05191b4e6d0b9c303e1c77d89973"/><file name="Esi.php" hash="74162be2d5ba9e7890db9ef97025b57e"/><file name="Viewvary.php" hash="c0afe1a19bc891b70afa9d418941c7e8"/></dir><dir name="Model"><dir name="Config"><dir name="Source"><file name="CustomerGroup.php" hash="54c9d902b53e3beeaf6cc9981ff641e6"/><file name="EnableWarmUp.php" hash="d87be436691820f9201cf7a9f2fd9449"/></dir></dir><dir name="Layout"><file name="Update.php" hash="d8244ec11ad8ca22556ac7341fe1e893"/></dir><file name="Layout.php" hash="e19858021f1371a5deea1b8bb650f6c6"/><dir name="Observer"><file name="Cron.php" hash="ac601ee9131b93f606924d74eef1d2b5"/><file name="Esi.php" hash="95ab003e05bc98121e1b0c79145002a7"/><file name="Purge.php" hash="c70d3110207f061ac1212df20fc97a09"/></dir><file name="Session.php" hash="d6ff3c5e965a9225ef1c52bae737f000"/><file name="Translate.php" hash="2fa92bd33d9626ac89b69ff9f89206d2"/></dir><dir name="controllers"><file name="AdminController.php" hash="cb6ae283854e405a2364aff56726ee33"/><dir name="Adminhtml"><file name="LitemageCacheController.php" hash="9c9f1139c1241361ca52ec9cf74bf5c5"/></dir><file name="EsiController.php" hash="f718aab40297541872faf72ce38926b2"/></dir><dir name="etc"><file name="config.xml" hash="bde992646e883e367d857a0a9d67e4cc"/><file name="system.xml" hash="00a9d265724116895f11c9f2c2d38ea3"/></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="litemage.xml" hash="2d250beca1b47210d8f887023621b00f"/></dir><dir name="template"><dir name="litemage"><file name="cache_management.phtml" hash="a15c701d6df587dd9b1958f79a1460a0"/></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="litemage.xml" hash="f4c7d6bd3dcacbae566c735b9ae1996c"/></dir><dir name="template"><dir name="litemage"><dir name="inject"><file name="jsvar.phtml" hash="b6faa64b7612466f42613ff9a3e13f64"/></dir></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Litespeed_Litemage.xml" hash="f0ccb478afdd9c608be72da0d27cc4f4"/></dir></target></contents>
19
  <compatible/>
20
- <dependencies><required><php><min>5.3.0</min><max>6.0.0</max></php></required></dependencies>
21
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>LiteSpeed_LiteMage</name>
4
+ <version>1.0.18</version>
5
  <stability>stable</stability>
6
+ <license uri="https://opensource.org/licenses/GPL-3.0 ">GPL v3</license>
7
  <channel>community</channel>
8
  <extends/>
9
  <summary>LiteMage Cache speeds up Magento by automatically integrating Magento with LiteSpeed's superior ESI implementation.</summary>
10
  <description>LiteMage Cache is a powerful Magento page caching utility built into LiteSpeed Web Server. It combines superior ESI implementation with easy set up. LiteMage Cache contains a number of optimizations, including combined subrequests, that give it faster, more efficient performance than other page caching utilities. In addition, because it is part of the web server, LiteMage Cache does away with the communication problems and overhead other page caching solutions suffer from. The LiteMage Magento extension then automatically integrates Magento installations with LiteSpeed's top-of-the-line ESI implementation, combining the greatest Magento performance enhancement possible with a painless set up.</description>
11
+ <notes>License changed from LiteSpeed proprietary to GPLv3.</notes>
 
 
 
12
  <authors><author><name>LiteSpeed Technologies</name><user>LiteSpeedTech</user><email>lsong@litespeedtech.com</email></author></authors>
13
+ <date>2016-04-07</date>
14
+ <time>21:10:55</time>
15
+ <contents><target name="magecommunity"><dir name="Litespeed"><dir name="Litemage"><dir name="Block"><dir name="Adminhtml"><dir name="Cache"><file name="Management.php" hash="a16c9978a7177adf4aacc00a4a18476a"/></dir></dir><dir name="Core"><file name="Esi.php" hash="e491916a3654cb031113498934e36a81"/><file name="Messages.php" hash="89704ce091098dd0f2c6b5bf091ff32f"/></dir><dir name="Inject"><file name="Jsvar.php" hash="cc0590fe211c81d6d29de570503fe8fd"/><file name="Nickname.php" hash="3edf87b7d3f3da4093110bd4c98e0738"/></dir></dir><dir name="Helper"><file name="Data.php" hash="6640a1843d63da08f36b9bce57a0d5d3"/><file name="Esi.php" hash="7f28730e2be3437ff8e52146d2f1de60"/><file name="Viewvary.php" hash="00b51b413114123c8e5d7bfd44e1cfdc"/></dir><dir name="Model"><dir name="Config"><dir name="Source"><file name="CustomerGroup.php" hash="2aa52d9a1614a545035267958be0656f"/><file name="EnableWarmUp.php" hash="d32dd158463297672dfb58628007a88c"/></dir></dir><dir name="Layout"><file name="Update.php" hash="aed09d2eb10c38680839a7fef957c59c"/></dir><file name="Layout.php" hash="73aa0b370d35111dcc420abbff118782"/><dir name="Observer"><file name="Cron.php" hash="9e397b360d2e5b81efccbd3e4bd2792c"/><file name="Esi.php" hash="655342014432ea5ad124ef3fc6babeee"/><file name="Purge.php" hash="aa3672d74e943a63a6267c2e4025e05c"/></dir><file name="Session.php" hash="558a80fb45a532af59727ae5657cd380"/><file name="Translate.php" hash="35326b8d2214f516d7dba82519902529"/></dir><dir name="controllers"><file name="AdminController.php" hash="d4d81dfdcb28354a7aabd9d9f6f10c86"/><dir name="Adminhtml"><file name="LitemageCacheController.php" hash="18b8cd29b5cf0fe20bd8d18d515fd79d"/></dir><file name="EsiController.php" hash="af5573b7eb74b48873a9c6a922d0a64d"/></dir><dir name="etc"><file name="config.xml" hash="f3f33da74787e94064688ab640ab563a"/><file name="config.xml.dev" hash="cd3f0860f7eeb206787d5c2d3297ebc4"/><file name="config.xml.package" hash="4220542c5e7689bf0b14f3adf05dcb23"/><file name="system.xml" hash="dc6bce0102d756500c8285a1db68a025"/></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="litemage.xml" hash="70c8a6fc5f5eaf99b8c0648a33bb3b7d"/></dir><dir name="template"><dir name="litemage"><file name="cache_management.phtml" hash="25be160ae1cb42391e4caa87049f272f"/></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="litemage.xml" hash="4c840b12cc6246f68b1b028f0ef1056d"/></dir><dir name="template"><dir name="litemage"><dir name="inject"><file name="jsvar.phtml" hash="5bbd9992e7ba5925d09f21cf03237676"/></dir></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Litespeed_Litemage.xml" hash="ba0c8904bc89219c6829e37cc14d9bdd"/></dir></target></contents>
16
  <compatible/>
17
+ <dependencies><required><php><min>5.3.0</min><max>7.1.0</max></php></required></dependencies>
18
  </package>