Update Smarty 3.1.8 to 3.1.12.
authorYugo Nagata <nagata@sraoss.co.jp>
Mon, 15 Oct 2012 02:01:50 +0000 (11:01 +0900)
committerYugo Nagata <nagata@sraoss.co.jp>
Mon, 15 Oct 2012 02:01:50 +0000 (11:01 +0900)
This version has a security fix for Cross-Site Scripting (XSS)
vulnerability.

45 files changed:
libs/Smarty.class.php
libs/SmartyBC.class.php [new file with mode: 0644]
libs/plugins/function.html_options.php
libs/plugins/modifier.date_format.php
libs/plugins/modifier.escape.php
libs/plugins/modifiercompiler.cat.php [new file with mode: 0644]
libs/plugins/modifiercompiler.count_characters.php [new file with mode: 0644]
libs/plugins/modifiercompiler.count_paragraphs.php [new file with mode: 0644]
libs/plugins/modifiercompiler.count_sentences.php [new file with mode: 0644]
libs/plugins/modifiercompiler.count_words.php [new file with mode: 0644]
libs/plugins/modifiercompiler.default.php [new file with mode: 0644]
libs/plugins/modifiercompiler.escape.php [new file with mode: 0644]
libs/plugins/modifiercompiler.from_charset.php [new file with mode: 0644]
libs/plugins/modifiercompiler.indent.php [new file with mode: 0644]
libs/plugins/modifiercompiler.lower.php [new file with mode: 0644]
libs/plugins/modifiercompiler.noprint.php [new file with mode: 0644]
libs/plugins/modifiercompiler.string_format.php [new file with mode: 0644]
libs/plugins/modifiercompiler.strip.php [new file with mode: 0644]
libs/plugins/modifiercompiler.strip_tags.php [new file with mode: 0644]
libs/plugins/modifiercompiler.to_charset.php [new file with mode: 0644]
libs/plugins/modifiercompiler.unescape.php [new file with mode: 0644]
libs/plugins/modifiercompiler.upper.php [new file with mode: 0644]
libs/plugins/modifiercompiler.wordwrap.php [new file with mode: 0644]
libs/plugins/outputfilter.trimwhitespace.php
libs/plugins/shared.literal_compiler_param.php [new file with mode: 0644]
libs/plugins/shared.mb_str_replace.php [new file with mode: 0644]
libs/plugins/shared.mb_unicode.php [new file with mode: 0644]
libs/plugins/shared.mb_wordwrap.php [new file with mode: 0644]
libs/plugins/variablefilter.htmlspecialchars.php [new file with mode: 0644]
libs/sysplugins/smarty_internal_cacheresource_file.php
libs/sysplugins/smarty_internal_compile_assign.php
libs/sysplugins/smarty_internal_compile_block.php
libs/sysplugins/smarty_internal_compile_extends.php
libs/sysplugins/smarty_internal_compile_private_modifier.php
libs/sysplugins/smarty_internal_compile_private_special_variable.php
libs/sysplugins/smarty_internal_config.php
libs/sysplugins/smarty_internal_resource_extends.php
libs/sysplugins/smarty_internal_template.php
libs/sysplugins/smarty_internal_templatebase.php
libs/sysplugins/smarty_internal_templatecompilerbase.php
libs/sysplugins/smarty_internal_templatelexer.php
libs/sysplugins/smarty_internal_templateparser.php
libs/sysplugins/smarty_internal_utility.php
libs/sysplugins/smarty_internal_write_file.php
libs/sysplugins/smarty_resource.php

index c1e081eedd66c0c8385db4354571047acefcc92b..4a914aba9e99dc7991926fafa5795ac0d7940b7d 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * Project:     Smarty: the PHP compiling template engine
  * File:        Smarty.class.php
- * SVN:         $Id: Smarty.class.php 4551 2012-02-06 20:45:10Z rodneyrehm $
+ * SVN:         $Id: Smarty.class.php 4658 2012-09-11 16:23:30Z uwe.tews@googlemail.com $
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -28,7 +28,7 @@
  * @author Uwe Tews
  * @author Rodney Rehm
  * @package Smarty
- * @version 3.1.8
+ * @version 3.1.12
  */
 
 /**
@@ -57,7 +57,7 @@ if (!defined('SMARTY_PLUGINS_DIR')) {
     define('SMARTY_PLUGINS_DIR', SMARTY_DIR . 'plugins' . DS);
 }
 if (!defined('SMARTY_MBSTRING')) {
-    define('SMARTY_MBSTRING', function_exists('mb_strlen'));
+    define('SMARTY_MBSTRING', function_exists('mb_split'));
 }
 if (!defined('SMARTY_RESOURCE_CHAR_SET')) {
     // UTF-8 can only be done properly when mbstring is available!
@@ -113,7 +113,7 @@ class Smarty extends Smarty_Internal_TemplateBase {
     /**
      * smarty version
      */
-    const SMARTY_VERSION = 'Smarty-3.1.8';
+    const SMARTY_VERSION = 'Smarty-3.1.12';
 
     /**
      * define variable scopes
@@ -189,8 +189,12 @@ class Smarty extends Smarty_Internal_TemplateBase {
      * Flag denoting if PCRE should run in UTF-8 mode
      */
     public static $_UTF8_MODIFIER = 'u';
-    
-    
+
+    /**
+     * Flag denoting if operating system is windows
+     */
+    public static $_IS_WINDOWS = false;
+
     /**#@+
      * variables
      */
@@ -1277,7 +1281,7 @@ class Smarty extends Smarty_Internal_TemplateBase {
         }
         // plugin filename is expected to be: [type].[name].php
         $_plugin_filename = "{$_name_parts[1]}.{$_name_parts[2]}.php";
-        
+
         $_stream_resolve_include_path = function_exists('stream_resolve_include_path');
 
         // loop through plugin dirs and find the plugin
@@ -1298,7 +1302,7 @@ class Smarty extends Smarty_Internal_TemplateBase {
                     } else {
                         $file = Smarty_Internal_Get_Include_Path::getIncludePath($file);
                     }
-                    
+
                     if ($file !== false) {
                         require_once($file);
                         return $file;
@@ -1464,6 +1468,9 @@ class Smarty extends Smarty_Internal_TemplateBase {
     }
 }
 
+// Check if we're running on windows
+Smarty::$_IS_WINDOWS = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN';
+
 // let PCRE (preg_*) treat strings as ISO-8859-1 if we're not dealing with UTF-8
 if (Smarty::$_CHARSET !== 'UTF-8') {
     Smarty::$_UTF8_MODIFIER = '';
@@ -1474,6 +1481,9 @@ if (Smarty::$_CHARSET !== 'UTF-8') {
  * @package Smarty
  */
 class SmartyException extends Exception {
+    public function __construct($message) {
+        $this->message = htmlentities($message);
+    }
 }
 
 /**
diff --git a/libs/SmartyBC.class.php b/libs/SmartyBC.class.php
new file mode 100644 (file)
index 0000000..f8f0a13
--- /dev/null
@@ -0,0 +1,460 @@
+<?php\r
+/**\r
+ * Project:     Smarty: the PHP compiling template engine\r
+ * File:        SmartyBC.class.php\r
+ * SVN:         $Id: $\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 2.1 of the License, or (at your option) any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+ *\r
+ * For questions, help, comments, discussion, etc., please join the\r
+ * Smarty mailing list. Send a blank e-mail to\r
+ * smarty-discussion-subscribe@googlegroups.com\r
+ *\r
+ * @link http://www.smarty.net/\r
+ * @copyright 2008 New Digital Group, Inc.\r
+ * @author Monte Ohrt <monte at ohrt dot com>\r
+ * @author Uwe Tews\r
+ * @author Rodney Rehm\r
+ * @package Smarty\r
+ */\r
+/**\r
+ * @ignore\r
+ */\r
+require(dirname(__FILE__) . '/Smarty.class.php');\r
+\r
+/**\r
+ * Smarty Backward Compatability Wrapper Class\r
+ *\r
+ * @package Smarty\r
+ */\r
+class SmartyBC extends Smarty {\r
+\r
+    /**\r
+     * Smarty 2 BC\r
+     * @var string\r
+     */\r
+    public $_version = self::SMARTY_VERSION;\r
+\r
+    /**\r
+     * Initialize new SmartyBC object\r
+     *\r
+     * @param array $options options to set during initialization, e.g. array( 'forceCompile' => false )\r
+     */\r
+    public function __construct(array $options=array())\r
+    {\r
+        parent::__construct($options);\r
+        // register {php} tag\r
+        $this->registerPlugin('block', 'php', 'smarty_php_tag');\r
+    }\r
+\r
+    /**\r
+     * wrapper for assign_by_ref\r
+     *\r
+     * @param string $tpl_var the template variable name\r
+     * @param mixed  &$value  the referenced value to assign\r
+     */\r
+    public function assign_by_ref($tpl_var, &$value)\r
+    {\r
+        $this->assignByRef($tpl_var, $value);\r
+    }\r
+\r
+    /**\r
+     * wrapper for append_by_ref\r
+     *\r
+     * @param string  $tpl_var the template variable name\r
+     * @param mixed   &$value  the referenced value to append\r
+     * @param boolean $merge   flag if array elements shall be merged\r
+     */\r
+    public function append_by_ref($tpl_var, &$value, $merge = false)\r
+    {\r
+        $this->appendByRef($tpl_var, $value, $merge);\r
+    }\r
+\r
+    /**\r
+     * clear the given assigned template variable.\r
+     *\r
+     * @param string $tpl_var the template variable to clear\r
+     */\r
+    public function clear_assign($tpl_var)\r
+    {\r
+        $this->clearAssign($tpl_var);\r
+    }\r
+\r
+    /**\r
+     * Registers custom function to be used in templates\r
+     *\r
+     * @param string $function      the name of the template function\r
+     * @param string $function_impl the name of the PHP function to register\r
+     * @param bool   $cacheable\r
+     * @param mixed  $cache_attrs\r
+     */\r
+    public function register_function($function, $function_impl, $cacheable=true, $cache_attrs=null)\r
+    {\r
+        $this->registerPlugin('function', $function, $function_impl, $cacheable, $cache_attrs);\r
+    }\r
+\r
+    /**\r
+     * Unregisters custom function\r
+     *\r
+     * @param string $function name of template function\r
+     */\r
+    public function unregister_function($function)\r
+    {\r
+        $this->unregisterPlugin('function', $function);\r
+    }\r
+\r
+    /**\r
+     * Registers object to be used in templates\r
+     *\r
+     * @param string  $object      name of template object\r
+     * @param object  $object_impl the referenced PHP object to register\r
+     * @param array   $allowed     list of allowed methods (empty = all)\r
+     * @param boolean $smarty_args smarty argument format, else traditional\r
+     * @param array   $block_functs list of methods that are block format\r
+     */\r
+    public function register_object($object, $object_impl, $allowed = array(), $smarty_args = true, $block_methods = array())\r
+    {\r
+        settype($allowed, 'array');\r
+        settype($smarty_args, 'boolean');\r
+        $this->registerObject($object, $object_impl, $allowed, $smarty_args, $block_methods);\r
+    }\r
+\r
+    /**\r
+     * Unregisters object\r
+     *\r
+     * @param string $object name of template object\r
+     */\r
+    public function unregister_object($object)\r
+    {\r
+        $this->unregisterObject($object);\r
+    }\r
+\r
+    /**\r
+     * Registers block function to be used in templates\r
+     *\r
+     * @param string $block      name of template block\r
+     * @param string $block_impl PHP function to register\r
+     * @param bool   $cacheable\r
+     * @param mixed  $cache_attrs\r
+     */\r
+    public function register_block($block, $block_impl, $cacheable=true, $cache_attrs=null)\r
+    {\r
+        $this->registerPlugin('block', $block, $block_impl, $cacheable, $cache_attrs);\r
+    }\r
+\r
+    /**\r
+     * Unregisters block function\r
+     *\r
+     * @param string $block name of template function\r
+     */\r
+    public function unregister_block($block)\r
+    {\r
+        $this->unregisterPlugin('block', $block);\r
+    }\r
+\r
+    /**\r
+     * Registers compiler function\r
+     *\r
+     * @param string $function      name of template function\r
+     * @param string $function_impl name of PHP function to register\r
+     * @param bool   $cacheable\r
+     */\r
+    public function register_compiler_function($function, $function_impl, $cacheable=true)\r
+    {\r
+        $this->registerPlugin('compiler', $function, $function_impl, $cacheable);\r
+    }\r
+\r
+    /**\r
+     * Unregisters compiler function\r
+     *\r
+     * @param string $function name of template function\r
+     */\r
+    public function unregister_compiler_function($function)\r
+    {\r
+        $this->unregisterPlugin('compiler', $function);\r
+    }\r
+\r
+    /**\r
+     * Registers modifier to be used in templates\r
+     *\r
+     * @param string $modifier name of template modifier\r
+     * @param string $modifier_impl name of PHP function to register\r
+     */\r
+    public function register_modifier($modifier, $modifier_impl)\r
+    {\r
+        $this->registerPlugin('modifier', $modifier, $modifier_impl);\r
+    }\r
+\r
+    /**\r
+     * Unregisters modifier\r
+     *\r
+     * @param string $modifier name of template modifier\r
+     */\r
+    public function unregister_modifier($modifier)\r
+    {\r
+        $this->unregisterPlugin('modifier', $modifier);\r
+    }\r
+\r
+    /**\r
+     * Registers a resource to fetch a template\r
+     *\r
+     * @param string $type      name of resource\r
+     * @param array  $functions array of functions to handle resource\r
+     */\r
+    public function register_resource($type, $functions)\r
+    {\r
+        $this->registerResource($type, $functions);\r
+    }\r
+\r
+    /**\r
+     * Unregisters a resource\r
+     *\r
+     * @param string $type name of resource\r
+     */\r
+    public function unregister_resource($type)\r
+    {\r
+        $this->unregisterResource($type);\r
+    }\r
+\r
+    /**\r
+     * Registers a prefilter function to apply\r
+     * to a template before compiling\r
+     *\r
+     * @param callable $function\r
+     */\r
+    public function register_prefilter($function)\r
+    {\r
+        $this->registerFilter('pre', $function);\r
+    }\r
+\r
+    /**\r
+     * Unregisters a prefilter function\r
+     *\r
+     * @param callable $function\r
+     */\r
+    public function unregister_prefilter($function)\r
+    {\r
+        $this->unregisterFilter('pre', $function);\r
+    }\r
+\r
+    /**\r
+     * Registers a postfilter function to apply\r
+     * to a compiled template after compilation\r
+     *\r
+     * @param callable $function\r
+     */\r
+    public function register_postfilter($function)\r
+    {\r
+        $this->registerFilter('post', $function);\r
+    }\r
+\r
+    /**\r
+     * Unregisters a postfilter function\r
+     *\r
+     * @param callable $function\r
+     */\r
+    public function unregister_postfilter($function)\r
+    {\r
+        $this->unregisterFilter('post', $function);\r
+    }\r
+\r
+    /**\r
+     * Registers an output filter function to apply\r
+     * to a template output\r
+     *\r
+     * @param callable $function\r
+     */\r
+    public function register_outputfilter($function)\r
+    {\r
+        $this->registerFilter('output', $function);\r
+    }\r
+\r
+    /**\r
+     * Unregisters an outputfilter function\r
+     *\r
+     * @param callable $function\r
+     */\r
+    public function unregister_outputfilter($function)\r
+    {\r
+        $this->unregisterFilter('output', $function);\r
+    }\r
+\r
+    /**\r
+     * load a filter of specified type and name\r
+     *\r
+     * @param string $type filter type\r
+     * @param string $name filter name\r
+     */\r
+    public function load_filter($type, $name)\r
+    {\r
+        $this->loadFilter($type, $name);\r
+    }\r
+\r
+    /**\r
+     * clear cached content for the given template and cache id\r
+     *\r
+     * @param string $tpl_file   name of template file\r
+     * @param string $cache_id   name of cache_id\r
+     * @param string $compile_id name of compile_id\r
+     * @param string $exp_time   expiration time\r
+     * @return boolean\r
+     */\r
+    public function clear_cache($tpl_file = null, $cache_id = null, $compile_id = null, $exp_time = null)\r
+    {\r
+        return $this->clearCache($tpl_file, $cache_id, $compile_id, $exp_time);\r
+    }\r
+\r
+    /**\r
+     * clear the entire contents of cache (all templates)\r
+     *\r
+     * @param string $exp_time expire time\r
+     * @return boolean\r
+     */\r
+    public function clear_all_cache($exp_time = null)\r
+    {\r
+        return $this->clearCache(null, null, null, $exp_time);\r
+    }\r
+\r
+    /**\r
+     * test to see if valid cache exists for this template\r
+     *\r
+     * @param string $tpl_file name of template file\r
+     * @param string $cache_id\r
+     * @param string $compile_id\r
+     * @return boolean\r
+     */\r
+    public function is_cached($tpl_file, $cache_id = null, $compile_id = null)\r
+    {\r
+        return $this->isCached($tpl_file, $cache_id, $compile_id);\r
+    }\r
+\r
+    /**\r
+     * clear all the assigned template variables.\r
+     */\r
+    public function clear_all_assign()\r
+    {\r
+        $this->clearAllAssign();\r
+    }\r
+\r
+    /**\r
+     * clears compiled version of specified template resource,\r
+     * or all compiled template files if one is not specified.\r
+     * This function is for advanced use only, not normally needed.\r
+     *\r
+     * @param string $tpl_file\r
+     * @param string $compile_id\r
+     * @param string $exp_time\r
+     * @return boolean results of {@link smarty_core_rm_auto()}\r
+     */\r
+    public function clear_compiled_tpl($tpl_file = null, $compile_id = null, $exp_time = null)\r
+    {\r
+        return $this->clearCompiledTemplate($tpl_file, $compile_id, $exp_time);\r
+    }\r
+\r
+    /**\r
+     * Checks whether requested template exists.\r
+     *\r
+     * @param string $tpl_file\r
+     * @return boolean\r
+     */\r
+    public function template_exists($tpl_file)\r
+    {\r
+        return $this->templateExists($tpl_file);\r
+    }\r
+\r
+    /**\r
+     * Returns an array containing template variables\r
+     *\r
+     * @param string $name\r
+     * @return array\r
+     */\r
+    public function get_template_vars($name=null)\r
+    {\r
+        return $this->getTemplateVars($name);\r
+    }\r
+\r
+    /**\r
+     * Returns an array containing config variables\r
+     *\r
+     * @param string $name\r
+     * @return array\r
+     */\r
+    public function get_config_vars($name=null)\r
+    {\r
+        return $this->getConfigVars($name);\r
+    }\r
+\r
+    /**\r
+     * load configuration values\r
+     *\r
+     * @param string $file\r
+     * @param string $section\r
+     * @param string $scope\r
+     */\r
+    public function config_load($file, $section = null, $scope = 'global')\r
+    {\r
+        $this->ConfigLoad($file, $section, $scope);\r
+    }\r
+\r
+    /**\r
+     * return a reference to a registered object\r
+     *\r
+     * @param string $name\r
+     * @return object\r
+     */\r
+    public function get_registered_object($name)\r
+    {\r
+        return $this->getRegisteredObject($name);\r
+    }\r
+\r
+    /**\r
+     * clear configuration values\r
+     *\r
+     * @param string $var\r
+     */\r
+    public function clear_config($var = null)\r
+    {\r
+        $this->clearConfig($var);\r
+    }\r
+\r
+    /**\r
+     * trigger Smarty error\r
+     *\r
+     * @param string $error_msg\r
+     * @param integer $error_type\r
+     */\r
+    public function trigger_error($error_msg, $error_type = E_USER_WARNING)\r
+    {\r
+        trigger_error("Smarty error: $error_msg", $error_type);\r
+    }\r
+\r
+}\r
+\r
+/**\r
+ * Smarty {php}{/php} block function\r
+ *\r
+ * @param array   $params   parameter list\r
+ * @param string  $content  contents of the block\r
+ * @param object  $template template object\r
+ * @param boolean &$repeat  repeat flag\r
+ * @return string content re-formatted\r
+ */\r
+function smarty_php_tag($params, $content, $template, &$repeat)\r
+{\r
+    eval($content);\r
+    return '';\r
+}\r
+\r
+?>
\ No newline at end of file
index 86266e26985278209814df5981abfb49c5e363d1..46330e8960de83a2eda059f0a3b4768b5a8cbb15 100644 (file)
@@ -150,6 +150,8 @@ function smarty_function_html_options_optoutput($key, $value, $selected, $id, $c
                 trigger_error("html_options: value is an object of class '". get_class($value) ."' without __toString() method", E_USER_NOTICE);
                 return '';
             }
+        } else {
+            $value = smarty_function_escape_special_chars((string) $value);
         }
         $_html_result .= $_html_class . $_html_id . '>' . $value . '</option>' . "\n";
         $idx++;
index 3cca7d395c107915b502fe6161898ff151c76925..f3eaba057796a49fe1ad4467b9abecdaba60beea 100644 (file)
@@ -35,7 +35,7 @@ function smarty_modifier_date_format($string, $format=null, $default_date='', $f
     * Include the {@link shared.make_timestamp.php} plugin
     */
     require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php');
-    if ($string != '') {
+    if ($string != '' && $string != '0000-00-00' && $string != '0000-00-00 00:00:00') {
         $timestamp = smarty_make_timestamp($string);
     } elseif ($default_date != '') {
         $timestamp = smarty_make_timestamp($default_date);
index 523d0653a7a67885af6d33d97d9697430222e0ae..5ca8e7796e89708f2a3a72adc32fe62be923790f 100644 (file)
  */
 function smarty_modifier_escape($string, $esc_type = 'html', $char_set = null, $double_encode = true)
 {
+    static $_double_encode = null;
+    if ($_double_encode === null) {
+        $_double_encode = version_compare(PHP_VERSION, '5.2.3', '>=');
+    }
+    
     if (!$char_set) {
         $char_set = Smarty::$_CHARSET;
     }
 
     switch ($esc_type) {
         case 'html':
-            return htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode);
+            if ($_double_encode) {
+                // php >=5.3.2 - go native
+                return htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode);
+            } else {
+                if ($double_encode) {
+                    // php <5.2.3 - only handle double encoding
+                    return htmlspecialchars($string, ENT_QUOTES, $char_set);
+                } else {
+                    // php <5.2.3 - prevent double encoding
+                    $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string);
+                    $string = htmlspecialchars($string, ENT_QUOTES, $char_set);
+                    $string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string);
+                    return $string;
+                }
+            }
 
         case 'htmlall':
             if (Smarty::$_MBSTRING) {
                 // mb_convert_encoding ignores htmlspecialchars()
-                $string = htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode);
+                if ($_double_encode) {
+                    // php >=5.3.2 - go native
+                    $string = htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode);
+                } else {
+                    if ($double_encode) {
+                        // php <5.2.3 - only handle double encoding
+                        $string = htmlspecialchars($string, ENT_QUOTES, $char_set);
+                    } else {
+                        // php <5.2.3 - prevent double encoding
+                        $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string);
+                        $string = htmlspecialchars($string, ENT_QUOTES, $char_set);
+                        $string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string);
+                        return $string;
+                    }
+                }
+                
                 // htmlentities() won't convert everything, so use mb_convert_encoding
                 return mb_convert_encoding($string, 'HTML-ENTITIES', $char_set);
             }
 
             // no MBString fallback
-            return htmlentities($string, ENT_QUOTES, $char_set, $double_encode);
+            if ($_double_encode) {
+                return htmlentities($string, ENT_QUOTES, $char_set, $double_encode);
+            } else {
+                if ($double_encode) {
+                    return htmlentities($string, ENT_QUOTES, $char_set);
+                } else {
+                    $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string);
+                    $string = htmlentities($string, ENT_QUOTES, $char_set);
+                    $string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string);
+                    return $string;
+                }
+            }
 
         case 'url':
             return rawurlencode($string);
diff --git a/libs/plugins/modifiercompiler.cat.php b/libs/plugins/modifiercompiler.cat.php
new file mode 100644 (file)
index 0000000..1cfe630
--- /dev/null
@@ -0,0 +1,30 @@
+<?php\r
+/**\r
+ * Smarty plugin\r
+ *\r
+ * @package Smarty\r
+ * @subpackage PluginsModifierCompiler\r
+ */\r
+\r
+/**\r
+ * Smarty cat modifier plugin\r
+ *\r
+ * Type:     modifier<br>\r
+ * Name:     cat<br>\r
+ * Date:     Feb 24, 2003<br>\r
+ * Purpose:  catenate a value to a variable<br>\r
+ * Input:    string to catenate<br>\r
+ * Example:  {$var|cat:"foo"}\r
+ *\r
+ * @link http://smarty.php.net/manual/en/language.modifier.cat.php cat\r
+ *          (Smarty online manual)\r
+ * @author   Uwe Tews\r
+ * @param array $params parameters\r
+ * @return string with compiled code\r
+ */\r
+function smarty_modifiercompiler_cat($params, $compiler)\r
+{\r
+    return '('.implode(').(', $params).')';\r
+}\r
+\r
+?>
\ No newline at end of file
diff --git a/libs/plugins/modifiercompiler.count_characters.php b/libs/plugins/modifiercompiler.count_characters.php
new file mode 100644 (file)
index 0000000..98e8efa
--- /dev/null
@@ -0,0 +1,33 @@
+<?php\r
+/**\r
+ * Smarty plugin\r
+ *\r
+ * @package Smarty\r
+ * @subpackage PluginsModifierCompiler\r
+ */\r
+\r
+/**\r
+ * Smarty count_characters modifier plugin\r
+ *\r
+ * Type:     modifier<br>\r
+ * Name:     count_characteres<br>\r
+ * Purpose:  count the number of characters in a text\r
+ *\r
+ * @link http://www.smarty.net/manual/en/language.modifier.count.characters.php count_characters (Smarty online manual)\r
+ * @author Uwe Tews\r
+ * @param array $params parameters\r
+ * @return string with compiled code\r
+ */\r
+function smarty_modifiercompiler_count_characters($params, $compiler)\r
+{\r
+    if (!isset($params[1]) || $params[1] != 'true') {\r
+        return 'preg_match_all(\'/[^\s]/' . Smarty::$_UTF8_MODIFIER . '\',' . $params[0] . ', $tmp)';\r
+    }\r
+    if (Smarty::$_MBSTRING) {\r
+        return 'mb_strlen(' . $params[0] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')';\r
+    }\r
+    // no MBString fallback\r
+    return 'strlen(' . $params[0] . ')';\r
+}\r
+\r
+?>
\ No newline at end of file
diff --git a/libs/plugins/modifiercompiler.count_paragraphs.php b/libs/plugins/modifiercompiler.count_paragraphs.php
new file mode 100644 (file)
index 0000000..0e1b0af
--- /dev/null
@@ -0,0 +1,28 @@
+<?php\r
+/**\r
+ * Smarty plugin\r
+ *\r
+ * @package Smarty\r
+ * @subpackage PluginsModifierCompiler\r
+ */\r
+\r
+/**\r
+ * Smarty count_paragraphs modifier plugin\r
+ *\r
+ * Type:     modifier<br>\r
+ * Name:     count_paragraphs<br>\r
+ * Purpose:  count the number of paragraphs in a text\r
+ *\r
+ * @link http://www.smarty.net/manual/en/language.modifier.count.paragraphs.php\r
+ *          count_paragraphs (Smarty online manual)\r
+ * @author Uwe Tews\r
+ * @param array $params parameters\r
+ * @return string with compiled code\r
+ */\r
+function smarty_modifiercompiler_count_paragraphs($params, $compiler)\r
+{\r
+    // count \r or \n characters\r
+    return '(preg_match_all(\'#[\r\n]+#\', ' . $params[0] . ', $tmp)+1)';\r
+}\r
+\r
+?>
\ No newline at end of file
diff --git a/libs/plugins/modifiercompiler.count_sentences.php b/libs/plugins/modifiercompiler.count_sentences.php
new file mode 100644 (file)
index 0000000..2f517be
--- /dev/null
@@ -0,0 +1,28 @@
+<?php\r
+/**\r
+ * Smarty plugin\r
+ *\r
+ * @package Smarty\r
+ * @subpackage PluginsModifierCompiler\r
+ */\r
+\r
+/**\r
+ * Smarty count_sentences modifier plugin\r
+ *\r
+ * Type:     modifier<br>\r
+ * Name:     count_sentences\r
+ * Purpose:  count the number of sentences in a text\r
+ *\r
+ * @link http://www.smarty.net/manual/en/language.modifier.count.paragraphs.php\r
+ *          count_sentences (Smarty online manual)\r
+ * @author Uwe Tews\r
+ * @param array $params parameters\r
+ * @return string with compiled code\r
+ */\r
+function smarty_modifiercompiler_count_sentences($params, $compiler)\r
+{\r
+    // find periods, question marks, exclamation marks with a word before but not after.\r
+    return 'preg_match_all("#\w[\.\?\!](\W|$)#S' . Smarty::$_UTF8_MODIFIER . '", ' . $params[0] . ', $tmp)';\r
+}\r
+\r
+?>
\ No newline at end of file
diff --git a/libs/plugins/modifiercompiler.count_words.php b/libs/plugins/modifiercompiler.count_words.php
new file mode 100644 (file)
index 0000000..e05738c
--- /dev/null
@@ -0,0 +1,32 @@
+<?php\r
+/**\r
+ * Smarty plugin\r
+ *\r
+ * @package Smarty\r
+ * @subpackage PluginsModifierCompiler\r
+ */\r
+\r
+/**\r
+ * Smarty count_words modifier plugin\r
+ *\r
+ * Type:     modifier<br>\r
+ * Name:     count_words<br>\r
+ * Purpose:  count the number of words in a text\r
+ *\r
+ * @link http://www.smarty.net/manual/en/language.modifier.count.words.php count_words (Smarty online manual)\r
+ * @author Uwe Tews\r
+ * @param array $params parameters\r
+ * @return string with compiled code\r
+*/\r
+function smarty_modifiercompiler_count_words($params, $compiler)\r
+{\r
+    if (Smarty::$_MBSTRING) {\r
+        // return 'preg_match_all(\'#[\w\pL]+#' . Smarty::$_UTF8_MODIFIER . '\', ' . $params[0] . ', $tmp)';\r
+        // expression taken from http://de.php.net/manual/en/function.str-word-count.php#85592\r
+        return 'preg_match_all(\'/\p{L}[\p{L}\p{Mn}\p{Pd}\\\'\x{2019}]*/' . Smarty::$_UTF8_MODIFIER . '\', ' . $params[0] . ', $tmp)';\r
+    }\r
+    // no MBString fallback\r
+    return 'str_word_count(' . $params[0] . ')';\r
+}\r
+\r
+?>
\ No newline at end of file
diff --git a/libs/plugins/modifiercompiler.default.php b/libs/plugins/modifiercompiler.default.php
new file mode 100644 (file)
index 0000000..4f831a5
--- /dev/null
@@ -0,0 +1,35 @@
+<?php\r
+/**\r
+ * Smarty plugin\r
+ *\r
+ * @package Smarty\r
+ * @subpackage PluginsModifierCompiler\r
+ */\r
+\r
+/**\r
+ * Smarty default modifier plugin\r
+ *\r
+ * Type:     modifier<br>\r
+ * Name:     default<br>\r
+ * Purpose:  designate default value for empty variables\r
+ *\r
+ * @link http://www.smarty.net/manual/en/language.modifier.default.php default (Smarty online manual)\r
+ * @author Uwe Tews\r
+ * @param array $params parameters\r
+ * @return string with compiled code\r
+ */\r
+function smarty_modifiercompiler_default ($params, $compiler)\r
+{\r
+    $output = $params[0];\r
+    if (!isset($params[1])) {\r
+        $params[1] = "''";\r
+    }\r
+    \r
+    array_shift($params);\r
+    foreach ($params as $param) {\r
+        $output = '(($tmp = @' . $output . ')===null||$tmp===\'\' ? ' . $param . ' : $tmp)';\r
+    }\r
+    return $output;\r
+}\r
+\r
+?>
\ No newline at end of file
diff --git a/libs/plugins/modifiercompiler.escape.php b/libs/plugins/modifiercompiler.escape.php
new file mode 100644 (file)
index 0000000..f50028b
--- /dev/null
@@ -0,0 +1,125 @@
+<?php\r
+/**\r
+ * Smarty plugin\r
+ *\r
+ * @package Smarty\r
+ * @subpackage PluginsModifierCompiler\r
+ */\r
+\r
+/**\r
+ * @ignore\r
+ */\r
+require_once( SMARTY_PLUGINS_DIR .'shared.literal_compiler_param.php' );\r
+\r
+/**\r
+ * Smarty escape modifier plugin\r
+ *\r
+ * Type:     modifier<br>\r
+ * Name:     escape<br>\r
+ * Purpose:  escape string for output\r
+ *\r
+ * @link http://www.smarty.net/docsv2/en/language.modifier.escape count_characters (Smarty online manual)\r
+ * @author Rodney Rehm\r
+ * @param array $params parameters\r
+ * @return string with compiled code\r
+ */\r
+function smarty_modifiercompiler_escape($params, $compiler)\r
+{\r
+    static $_double_encode = null;\r
+    if ($_double_encode === null) {\r
+        $_double_encode = version_compare(PHP_VERSION, '5.2.3', '>=');\r
+    }\r
+    \r
+    try {\r
+        $esc_type = smarty_literal_compiler_param($params, 1, 'html');\r
+        $char_set = smarty_literal_compiler_param($params, 2, Smarty::$_CHARSET);\r
+        $double_encode = smarty_literal_compiler_param($params, 3, true);\r
+\r
+        if (!$char_set) {\r
+            $char_set = Smarty::$_CHARSET;\r
+        }\r
+\r
+        switch ($esc_type) {\r
+            case 'html':\r
+                if ($_double_encode) {\r
+                    return 'htmlspecialchars('\r
+                        . $params[0] .', ENT_QUOTES, '\r
+                        . var_export($char_set, true) . ', '\r
+                        . var_export($double_encode, true) . ')';\r
+                } else if ($double_encode) {\r
+                    return 'htmlspecialchars('\r
+                        . $params[0] .', ENT_QUOTES, '\r
+                        . var_export($char_set, true) . ')';\r
+                } else {\r
+                    // fall back to modifier.escape.php\r
+                }\r
+\r
+            case 'htmlall':\r
+                if (Smarty::$_MBSTRING) {\r
+                    if ($_double_encode) {\r
+                        // php >=5.2.3 - go native\r
+                        return 'mb_convert_encoding(htmlspecialchars('\r
+                            . $params[0] .', ENT_QUOTES, '\r
+                            . var_export($char_set, true) . ', '\r
+                            . var_export($double_encode, true)\r
+                            . '), "HTML-ENTITIES", '\r
+                            . var_export($char_set, true) . ')';\r
+                    } else if ($double_encode) {\r
+                        // php <5.2.3 - only handle double encoding\r
+                        return 'mb_convert_encoding(htmlspecialchars('\r
+                            . $params[0] .', ENT_QUOTES, '\r
+                            . var_export($char_set, true)\r
+                            . '), "HTML-ENTITIES", '\r
+                            . var_export($char_set, true) . ')';\r
+                    } else {\r
+                        // fall back to modifier.escape.php\r
+                    }\r
+                }\r
+\r
+                // no MBString fallback\r
+                if ($_double_encode) {\r
+                    // php >=5.2.3 - go native\r
+                    return 'htmlentities('\r
+                        . $params[0] .', ENT_QUOTES, '\r
+                        . var_export($char_set, true) . ', '\r
+                        . var_export($double_encode, true) . ')';\r
+                } else if ($double_encode) {\r
+                    // php <5.2.3 - only handle double encoding\r
+                    return 'htmlentities('\r
+                        . $params[0] .', ENT_QUOTES, '\r
+                        . var_export($char_set, true) . ')';\r
+                } else {\r
+                    // fall back to modifier.escape.php\r
+                }\r
+\r
+            case 'url':\r
+                return 'rawurlencode(' . $params[0] . ')';\r
+\r
+            case 'urlpathinfo':\r
+                return 'str_replace("%2F", "/", rawurlencode(' . $params[0] . '))';\r
+\r
+            case 'quotes':\r
+                // escape unescaped single quotes\r
+                return 'preg_replace("%(?<!\\\\\\\\)\'%", "\\\'",' . $params[0] . ')';\r
+\r
+            case 'javascript':\r
+                // escape quotes and backslashes, newlines, etc.\r
+                return 'strtr(' . $params[0] . ', array("\\\\" => "\\\\\\\\", "\'" => "\\\\\'", "\"" => "\\\\\"", "\\r" => "\\\\r", "\\n" => "\\\n", "</" => "<\/" ))';\r
+\r
+        }\r
+    } catch(SmartyException $e) {\r
+        // pass through to regular plugin fallback\r
+    }\r
+\r
+    // could not optimize |escape call, so fallback to regular plugin\r
+    if ($compiler->tag_nocache | $compiler->nocache) {\r
+        $compiler->template->required_plugins['nocache']['escape']['modifier']['file'] = SMARTY_PLUGINS_DIR .'modifier.escape.php';\r
+        $compiler->template->required_plugins['nocache']['escape']['modifier']['function'] = 'smarty_modifier_escape';\r
+    } else {\r
+        $compiler->template->required_plugins['compiled']['escape']['modifier']['file'] = SMARTY_PLUGINS_DIR .'modifier.escape.php';\r
+        $compiler->template->required_plugins['compiled']['escape']['modifier']['function'] = 'smarty_modifier_escape';\r
+    }\r
+    return 'smarty_modifier_escape(' . join( ', ', $params ) . ')';\r
+}\r
+\r
+?>
\ No newline at end of file
diff --git a/libs/plugins/modifiercompiler.from_charset.php b/libs/plugins/modifiercompiler.from_charset.php
new file mode 100644 (file)
index 0000000..93b568a
--- /dev/null
@@ -0,0 +1,34 @@
+<?php\r
+/**\r
+ * Smarty plugin\r
+ *\r
+ * @package Smarty\r
+ * @subpackage PluginsModifierCompiler\r
+ */\r
+\r
+/**\r
+ * Smarty from_charset modifier plugin\r
+ *\r
+ * Type:     modifier<br>\r
+ * Name:     from_charset<br>\r
+ * Purpose:  convert character encoding from $charset to internal encoding\r
+ *\r
+ * @author Rodney Rehm\r
+ * @param array $params parameters\r
+ * @return string with compiled code\r
+ */\r
+function smarty_modifiercompiler_from_charset($params, $compiler)\r
+{\r
+    if (!Smarty::$_MBSTRING) {\r
+        // FIXME: (rodneyrehm) shouldn't this throw an error?\r
+        return $params[0];\r
+    }\r
+\r
+    if (!isset($params[1])) {\r
+        $params[1] = '"ISO-8859-1"';\r
+    }\r
+\r
+    return 'mb_convert_encoding(' . $params[0] . ', "' . addslashes(Smarty::$_CHARSET) . '", ' . $params[1] . ')';\r
+}\r
+\r
+?>
\ No newline at end of file
diff --git a/libs/plugins/modifiercompiler.indent.php b/libs/plugins/modifiercompiler.indent.php
new file mode 100644 (file)
index 0000000..020c4fd
--- /dev/null
@@ -0,0 +1,32 @@
+<?php\r
+/**\r
+ * Smarty plugin\r
+ * @package Smarty\r
+ * @subpackage PluginsModifierCompiler\r
+ */\r
+\r
+/**\r
+ * Smarty indent modifier plugin\r
+ *\r
+ * Type:     modifier<br>\r
+ * Name:     indent<br>\r
+ * Purpose:  indent lines of text\r
+ *\r
+ * @link http://www.smarty.net/manual/en/language.modifier.indent.php indent (Smarty online manual)\r
+ * @author Uwe Tews\r
+ * @param array $params parameters\r
+ * @return string with compiled code\r
+ */\r
+\r
+function smarty_modifiercompiler_indent($params, $compiler)\r
+{\r
+    if (!isset($params[1])) {\r
+        $params[1] = 4;\r
+    }\r
+    if (!isset($params[2])) {\r
+        $params[2] = "' '";\r
+    }\r
+    return 'preg_replace(\'!^!m\',str_repeat(' . $params[2] . ',' . $params[1] . '),' . $params[0] . ')';\r
+}\r
+\r
+?>
\ No newline at end of file
diff --git a/libs/plugins/modifiercompiler.lower.php b/libs/plugins/modifiercompiler.lower.php
new file mode 100644 (file)
index 0000000..1845cc1
--- /dev/null
@@ -0,0 +1,31 @@
+<?php\r
+/**\r
+ * Smarty plugin\r
+ * @package Smarty\r
+ * @subpackage PluginsModifierCompiler\r
+ */\r
+\r
+/**\r
+ * Smarty lower modifier plugin\r
+ *\r
+ * Type:     modifier<br>\r
+ * Name:     lower<br>\r
+ * Purpose:  convert string to lowercase\r
+ *\r
+ * @link http://www.smarty.net/manual/en/language.modifier.lower.php lower (Smarty online manual)\r
+ * @author Monte Ohrt <monte at ohrt dot com>\r
+ * @author Uwe Tews\r
+ * @param array $params parameters\r
+ * @return string with compiled code\r
+ */\r
+\r
+function smarty_modifiercompiler_lower($params, $compiler)\r
+{\r
+    if (Smarty::$_MBSTRING) {\r
+        return 'mb_strtolower(' . $params[0] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')' ;\r
+    }\r
+    // no MBString fallback\r
+    return 'strtolower(' . $params[0] . ')';\r
+}\r
+\r
+?>
\ No newline at end of file
diff --git a/libs/plugins/modifiercompiler.noprint.php b/libs/plugins/modifiercompiler.noprint.php
new file mode 100644 (file)
index 0000000..3ca2657
--- /dev/null
@@ -0,0 +1,25 @@
+<?php\r
+/**\r
+ * Smarty plugin\r
+ *\r
+ * @package Smarty\r
+ * @subpackage PluginsModifierCompiler\r
+ */\r
+\r
+/**\r
+ * Smarty noprint modifier plugin\r
+ *\r
+ * Type:     modifier<br>\r
+ * Name:     noprint<br>\r
+ * Purpose:  return an empty string\r
+ *\r
+ * @author   Uwe Tews\r
+ * @param array $params parameters\r
+ * @return string with compiled code\r
+ */\r
+function smarty_modifiercompiler_noprint($params, $compiler)\r
+{\r
+    return "''";\r
+}\r
+\r
+?>
\ No newline at end of file
diff --git a/libs/plugins/modifiercompiler.string_format.php b/libs/plugins/modifiercompiler.string_format.php
new file mode 100644 (file)
index 0000000..8334597
--- /dev/null
@@ -0,0 +1,26 @@
+<?php\r
+/**\r
+ * Smarty plugin\r
+ *\r
+ * @package Smarty\r
+ * @subpackage PluginsModifierCompiler\r
+ */\r
+\r
+/**\r
+ * Smarty string_format modifier plugin\r
+ *\r
+ * Type:     modifier<br>\r
+ * Name:     string_format<br>\r
+ * Purpose:  format strings via sprintf\r
+ *\r
+ * @link http://www.smarty.net/manual/en/language.modifier.string.format.php string_format (Smarty online manual)\r
+ * @author Uwe Tews\r
+ * @param array $params parameters\r
+ * @return string with compiled code\r
+ */\r
+function smarty_modifiercompiler_string_format($params, $compiler)\r
+{\r
+    return 'sprintf(' . $params[1] . ',' . $params[0] . ')';\r
+}\r
+\r
+?>
\ No newline at end of file
diff --git a/libs/plugins/modifiercompiler.strip.php b/libs/plugins/modifiercompiler.strip.php
new file mode 100644 (file)
index 0000000..f1d5db0
--- /dev/null
@@ -0,0 +1,33 @@
+<?php\r
+/**\r
+ * Smarty plugin\r
+ *\r
+ * @package Smarty\r
+ * @subpackage PluginsModifierCompiler\r
+ */\r
+\r
+/**\r
+ * Smarty strip modifier plugin\r
+ *\r
+ * Type:     modifier<br>\r
+ * Name:     strip<br>\r
+ * Purpose:  Replace all repeated spaces, newlines, tabs\r
+ *              with a single space or supplied replacement string.<br>\r
+ * Example:  {$var|strip} {$var|strip:"&nbsp;"}<br>\r
+ * Date:     September 25th, 2002\r
+ *\r
+ * @link http://www.smarty.net/manual/en/language.modifier.strip.php strip (Smarty online manual)\r
+ * @author Uwe Tews\r
+ * @param array $params parameters\r
+ * @return string with compiled code\r
+ */\r
+\r
+function smarty_modifiercompiler_strip($params, $compiler)\r
+{\r
+    if (!isset($params[1])) {\r
+        $params[1] = "' '";\r
+    }\r
+    return "preg_replace('!\s+!" . Smarty::$_UTF8_MODIFIER . "', {$params[1]},{$params[0]})";\r
+}\r
+\r
+?>
\ No newline at end of file
diff --git a/libs/plugins/modifiercompiler.strip_tags.php b/libs/plugins/modifiercompiler.strip_tags.php
new file mode 100644 (file)
index 0000000..296a3a2
--- /dev/null
@@ -0,0 +1,33 @@
+<?php\r
+/**\r
+ * Smarty plugin\r
+ *\r
+ * @package Smarty\r
+ * @subpackage PluginsModifierCompiler\r
+ */\r
+\r
+/**\r
+ * Smarty strip_tags modifier plugin\r
+ *\r
+ * Type:     modifier<br>\r
+ * Name:     strip_tags<br>\r
+ * Purpose:  strip html tags from text\r
+ *\r
+ * @link http://www.smarty.net/manual/en/language.modifier.strip.tags.php strip_tags (Smarty online manual)\r
+ * @author Uwe Tews\r
+ * @param array $params parameters\r
+ * @return string with compiled code\r
+ */\r
+function smarty_modifiercompiler_strip_tags($params, $compiler)\r
+{\r
+   if (!isset($params[1])) {\r
+        $params[1] = true;\r
+    }\r
+    if ($params[1] === true) {\r
+        return "preg_replace('!<[^>]*?>!', ' ', {$params[0]})";\r
+    } else {\r
+        return 'strip_tags(' . $params[0] . ')';\r
+    }\r
+}\r
+\r
+?>
\ No newline at end of file
diff --git a/libs/plugins/modifiercompiler.to_charset.php b/libs/plugins/modifiercompiler.to_charset.php
new file mode 100644 (file)
index 0000000..f5cdf45
--- /dev/null
@@ -0,0 +1,34 @@
+<?php\r
+/**\r
+ * Smarty plugin\r
+ *\r
+ * @package Smarty\r
+ * @subpackage PluginsModifierCompiler\r
+ */\r
+\r
+/**\r
+ * Smarty to_charset modifier plugin\r
+ *\r
+ * Type:     modifier<br>\r
+ * Name:     to_charset<br>\r
+ * Purpose:  convert character encoding from internal encoding to $charset\r
+ *\r
+ * @author Rodney Rehm\r
+ * @param array $params parameters\r
+ * @return string with compiled code\r
+ */\r
+function smarty_modifiercompiler_to_charset($params, $compiler)\r
+{\r
+    if (!Smarty::$_MBSTRING) {\r
+        // FIXME: (rodneyrehm) shouldn't this throw an error?\r
+        return $params[0];\r
+    }\r
+\r
+    if (!isset($params[1])) {\r
+        $params[1] = '"ISO-8859-1"';\r
+    }\r
+\r
+    return 'mb_convert_encoding(' . $params[0] . ', ' . $params[1] . ', "' . addslashes(Smarty::$_CHARSET) . '")';\r
+}\r
+\r
+?>
\ No newline at end of file
diff --git a/libs/plugins/modifiercompiler.unescape.php b/libs/plugins/modifiercompiler.unescape.php
new file mode 100644 (file)
index 0000000..4321ff1
--- /dev/null
@@ -0,0 +1,51 @@
+<?php\r
+/**\r
+ * Smarty plugin\r
+ *\r
+ * @package Smarty\r
+ * @subpackage PluginsModifierCompiler\r
+ */\r
+\r
+/**\r
+ * Smarty unescape modifier plugin\r
+ *\r
+ * Type:     modifier<br>\r
+ * Name:     unescape<br>\r
+ * Purpose:  unescape html entities\r
+ *\r
+ * @author Rodney Rehm\r
+ * @param array $params parameters\r
+ * @return string with compiled code\r
+ */\r
+function smarty_modifiercompiler_unescape($params, $compiler)\r
+{\r
+    if (!isset($params[1])) {\r
+        $params[1] = 'html';\r
+    }\r
+    if (!isset($params[2])) {\r
+        $params[2] = '\'' . addslashes(Smarty::$_CHARSET) . '\'';\r
+    } else {\r
+        $params[2] = "'" . $params[2] . "'";\r
+    }\r
+\r
+    switch (trim($params[1], '"\'')) {\r
+        case 'entity':\r
+        case 'htmlall':\r
+            if (Smarty::$_MBSTRING) {\r
+                return 'mb_convert_encoding(' . $params[0] . ', ' . $params[2] . ', \'HTML-ENTITIES\')';\r
+            }\r
+\r
+            return 'html_entity_decode(' . $params[0] . ', ENT_NOQUOTES, ' . $params[2] . ')';\r
+\r
+        case 'html':\r
+            return 'htmlspecialchars_decode(' . $params[0] . ', ENT_QUOTES)';\r
+\r
+        case 'url':\r
+            return 'rawurldecode(' . $params[0] . ')';\r
+\r
+        default:\r
+            return $params[0];\r
+    }\r
+}\r
+\r
+?>
\ No newline at end of file
diff --git a/libs/plugins/modifiercompiler.upper.php b/libs/plugins/modifiercompiler.upper.php
new file mode 100644 (file)
index 0000000..f368e37
--- /dev/null
@@ -0,0 +1,30 @@
+<?php\r
+/**\r
+ * Smarty plugin\r
+ *\r
+ * @package Smarty\r
+ * @subpackage PluginsModifierCompiler\r
+ */\r
+\r
+/**\r
+ * Smarty upper modifier plugin\r
+ * \r
+ * Type:     modifier<br>\r
+ * Name:     lower<br>\r
+ * Purpose:  convert string to uppercase\r
+ * \r
+ * @link http://smarty.php.net/manual/en/language.modifier.upper.php lower (Smarty online manual)\r
+ * @author Uwe Tews \r
+ * @param array $params parameters\r
+ * @return string with compiled code\r
+ */\r
+function smarty_modifiercompiler_upper($params, $compiler)\r
+{\r
+    if (Smarty::$_MBSTRING) {\r
+        return 'mb_strtoupper(' . $params[0] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')' ;\r
+    }\r
+    // no MBString fallback\r
+    return 'strtoupper(' . $params[0] . ')';\r
+} \r
+\r
+?>
\ No newline at end of file
diff --git a/libs/plugins/modifiercompiler.wordwrap.php b/libs/plugins/modifiercompiler.wordwrap.php
new file mode 100644 (file)
index 0000000..f6845ad
--- /dev/null
@@ -0,0 +1,46 @@
+<?php\r
+/**\r
+ * Smarty plugin\r
+ *\r
+ * @package Smarty\r
+ * @subpackage PluginsModifierCompiler\r
+ */\r
+\r
+/**\r
+ * Smarty wordwrap modifier plugin\r
+ * \r
+ * Type:     modifier<br>\r
+ * Name:     wordwrap<br>\r
+ * Purpose:  wrap a string of text at a given length\r
+ * \r
+ * @link http://smarty.php.net/manual/en/language.modifier.wordwrap.php wordwrap (Smarty online manual)\r
+ * @author Uwe Tews \r
+ * @param array $params parameters\r
+ * @return string with compiled code\r
+ */\r
+function smarty_modifiercompiler_wordwrap($params, $compiler)\r
+{\r
+    if (!isset($params[1])) {\r
+        $params[1] = 80;\r
+    } \r
+    if (!isset($params[2])) {\r
+        $params[2] = '"\n"';\r
+    } \r
+    if (!isset($params[3])) {\r
+        $params[3] = 'false';\r
+    } \r
+    $function = 'wordwrap';\r
+    if (Smarty::$_MBSTRING) {\r
+        if ($compiler->tag_nocache | $compiler->nocache) {\r
+            $compiler->template->required_plugins['nocache']['wordwrap']['modifier']['file'] = SMARTY_PLUGINS_DIR .'shared.mb_wordwrap.php';\r
+            $compiler->template->required_plugins['nocache']['wordwrap']['modifier']['function'] = 'smarty_mb_wordwrap';\r
+        } else {\r
+            $compiler->template->required_plugins['compiled']['wordwrap']['modifier']['file'] = SMARTY_PLUGINS_DIR .'shared.mb_wordwrap.php';\r
+            $compiler->template->required_plugins['compiled']['wordwrap']['modifier']['function'] = 'smarty_mb_wordwrap';\r
+        }\r
+        $function = 'smarty_mb_wordwrap';\r
+    }\r
+    return $function . '(' . $params[0] . ',' . $params[1] . ',' . $params[2] . ',' . $params[3] . ')';\r
+} \r
+\r
+?>
\ No newline at end of file
index 31a75557c17c404374f5994e1c4505baaf607b24..87cf8c781687264b99a658fb0834c7513c3c16b4 100644 (file)
@@ -40,6 +40,7 @@ function smarty_outputfilter_trimwhitespace($source, Smarty_Internal_Template $s
     }
 
     // Strip all HTML-Comments
+    // yes, even the ones in <script> - see http://stackoverflow.com/a/808850/515124
     $source = preg_replace( '#<!--.*?-->#ms', '', $source );
 
     // capture html elements not to be messed with
diff --git a/libs/plugins/shared.literal_compiler_param.php b/libs/plugins/shared.literal_compiler_param.php
new file mode 100644 (file)
index 0000000..dbcd937
--- /dev/null
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsShared
+ */
+
+/**
+ * evaluate compiler parameter
+ *
+ * @param array   $params  parameter array as given to the compiler function
+ * @param integer $index   array index of the parameter to convert
+ * @param mixed   $default value to be returned if the parameter is not present
+ * @return mixed evaluated value of parameter or $default
+ * @throws SmartyException if parameter is not a literal (but an expression, variable, â€¦)
+ * @author Rodney Rehm
+ */
+function smarty_literal_compiler_param($params, $index, $default=null)
+{
+    // not set, go default
+    if (!isset($params[$index])) {
+        return $default;
+    }
+    // test if param is a literal
+    if (!preg_match('/^([\'"]?)[a-zA-Z0-9]+(\\1)$/', $params[$index])) {
+        throw new SmartyException('$param[' . $index . '] is not a literal and is thus not evaluatable at compile time');
+    }
+
+    $t = null;
+    eval("\$t = " . $params[$index] . ";");
+    return $t;
+}
diff --git a/libs/plugins/shared.mb_str_replace.php b/libs/plugins/shared.mb_str_replace.php
new file mode 100644 (file)
index 0000000..ecafeb7
--- /dev/null
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Smarty shared plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsShared
+ */
+if (!function_exists('smarty_mb_str_replace')) {
+
+    /**
+     * Multibyte string replace
+     *
+     * @param string $search  the string to be searched
+     * @param string $replace the replacement string
+     * @param string $subject the source string
+     * @param int    &$count  number of matches found
+     * @return string replaced string
+     * @author Rodney Rehm
+     */
+    function smarty_mb_str_replace($search, $replace, $subject, &$count=0)
+    {
+        if (!is_array($search) && is_array($replace)) {
+            return false;
+        }
+        if (is_array($subject)) {
+            // call mb_replace for each single string in $subject
+            foreach ($subject as &$string) {
+                $string = &smarty_mb_str_replace($search, $replace, $string, $c);
+                $count += $c;
+            }
+        } elseif (is_array($search)) {
+            if (!is_array($replace)) {
+                foreach ($search as &$string) {
+                    $subject = smarty_mb_str_replace($string, $replace, $subject, $c);
+                    $count += $c;
+                }
+            } else {
+                $n = max(count($search), count($replace));
+                while ($n--) {
+                    $subject = smarty_mb_str_replace(current($search), current($replace), $subject, $c);
+                    $count += $c;
+                    next($search);
+                    next($replace);
+                }
+            }
+        } else {
+            $parts = mb_split(preg_quote($search), $subject);
+            $count = count($parts) - 1;
+            $subject = implode($replace, $parts);
+        }
+        return $subject;
+    }
+
+}
+?>
\ No newline at end of file
diff --git a/libs/plugins/shared.mb_unicode.php b/libs/plugins/shared.mb_unicode.php
new file mode 100644 (file)
index 0000000..e7f839e
--- /dev/null
@@ -0,0 +1,48 @@
+<?php
+/**
+ * Smarty shared plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsShared
+ */
+
+/**
+ * convert characters to their decimal unicode equivalents
+ *
+ * @link http://www.ibm.com/developerworks/library/os-php-unicode/index.html#listing3 for inspiration
+ * @param string $string   characters to calculate unicode of
+ * @param string $encoding encoding of $string, if null mb_internal_encoding() is used
+ * @return array sequence of unicodes
+ * @author Rodney Rehm
+ */
+function smarty_mb_to_unicode($string, $encoding=null) {
+    if ($encoding) {
+        $expanded = mb_convert_encoding($string, "UTF-32BE", $encoding);
+    } else {
+        $expanded = mb_convert_encoding($string, "UTF-32BE");
+    }
+    return unpack("N*", $expanded);
+}
+
+/**
+ * convert unicodes to the character of given encoding
+ *
+ * @link http://www.ibm.com/developerworks/library/os-php-unicode/index.html#listing3 for inspiration
+ * @param integer|array $unicode  single unicode or list of unicodes to convert
+ * @param string        $encoding encoding of returned string, if null mb_internal_encoding() is used
+ * @return string unicode as character sequence in given $encoding
+ * @author Rodney Rehm
+ */
+function smarty_mb_from_unicode($unicode, $encoding=null) {
+    $t = '';
+    if (!$encoding) {
+        $encoding = mb_internal_encoding();
+    }
+    foreach((array) $unicode as $utf32be) {
+        $character = pack("N*", $utf32be);
+        $t .= mb_convert_encoding($character, $encoding, "UTF-32BE");
+    }
+    return $t;
+}
+
+?>
\ No newline at end of file
diff --git a/libs/plugins/shared.mb_wordwrap.php b/libs/plugins/shared.mb_wordwrap.php
new file mode 100644 (file)
index 0000000..ba3498c
--- /dev/null
@@ -0,0 +1,83 @@
+<?php
+/**
+ * Smarty shared plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsShared
+ */
+
+if(!function_exists('smarty_mb_wordwrap')) {
+
+    /**
+     * Wrap a string to a given number of characters
+     *
+     * @link http://php.net/manual/en/function.wordwrap.php for similarity
+     * @param string  $str   the string to wrap
+     * @param int     $width the width of the output
+     * @param string  $break the character used to break the line
+     * @param boolean $cut   ignored parameter, just for the sake of
+     * @return string wrapped string
+     * @author Rodney Rehm
+     */
+    function smarty_mb_wordwrap($str, $width=75, $break="\n", $cut=false)
+    {
+        // break words into tokens using white space as a delimiter
+        $tokens = preg_split('!(\s)!S' . Smarty::$_UTF8_MODIFIER, $str, -1, PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE);
+        $length = 0;
+        $t = '';
+        $_previous = false;
+
+        foreach ($tokens as $_token) {
+            $token_length = mb_strlen($_token, Smarty::$_CHARSET);
+            $_tokens = array($_token);
+            if ($token_length > $width) {
+                // remove last space
+                $t = mb_substr($t, 0, -1, Smarty::$_CHARSET);
+                $_previous = false;
+                $length = 0;
+
+                if ($cut) {
+                    $_tokens = preg_split('!(.{' . $width . '})!S' . Smarty::$_UTF8_MODIFIER, $_token, -1, PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE);
+                    // broken words go on a new line
+                    $t .= $break;
+                }
+            }
+
+            foreach ($_tokens as $token) {
+                $_space = !!preg_match('!^\s$!S' . Smarty::$_UTF8_MODIFIER, $token);
+                $token_length = mb_strlen($token, Smarty::$_CHARSET);
+                $length += $token_length;
+
+                if ($length > $width) {
+                    // remove space before inserted break
+                    if ($_previous && $token_length < $width) {
+                        $t = mb_substr($t, 0, -1, Smarty::$_CHARSET);
+                    }
+
+                    // add the break before the token
+                    $t .= $break;
+                    $length = $token_length;
+
+                    // skip space after inserting a break
+                    if ($_space) {
+                        $length = 0;
+                        continue;
+                    }
+                } else if ($token == "\n") {
+                    // hard break must reset counters
+                    $_previous = 0;
+                    $length = 0;
+                } else {
+                    // remember if we had a space or not
+                    $_previous = $_space;
+                }
+                // add the token
+                $t .= $token;
+            }
+        }
+
+        return $t;
+    }
+
+}
+?>
\ No newline at end of file
diff --git a/libs/plugins/variablefilter.htmlspecialchars.php b/libs/plugins/variablefilter.htmlspecialchars.php
new file mode 100644 (file)
index 0000000..aff711e
--- /dev/null
@@ -0,0 +1,21 @@
+<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsFilter
+ */
+
+/**
+ * Smarty htmlspecialchars variablefilter plugin
+ *
+ * @param string                   $source input string
+ * @param Smarty_Internal_Template $smarty Smarty object
+ * @return string filtered output
+ */
+function smarty_variablefilter_htmlspecialchars($source, $smarty)
+{
+    return htmlspecialchars($source, ENT_QUOTES, Smarty::$_CHARSET);
+}
+
+?>
\ No newline at end of file
index 2519541263c39ebaf72323fe7a530e46b5877a60..04194b3965cc238c28fa53b7bdda2baba3be16b2 100644 (file)
@@ -100,9 +100,11 @@ class Smarty_Internal_CacheResource_File extends Smarty_CacheResource {
     public function writeCachedContent(Smarty_Internal_Template $_template, $content)
     {
         if (Smarty_Internal_Write_File::writeFile($_template->cached->filepath, $content, $_template->smarty) === true) {
-            $_template->cached->timestamp = filemtime($_template->cached->filepath);
+            $_template->cached->timestamp = @filemtime($_template->cached->filepath);
             $_template->cached->exists = !!$_template->cached->timestamp;
-            return true;
+            if ($_template->cached->exists) {
+                return true;
+            }
         }
         return false;
     }
@@ -176,7 +178,7 @@ class Smarty_Internal_CacheResource_File extends Smarty_CacheResource {
             $_cacheDirs = new RecursiveDirectoryIterator($_dir);
             $_cache = new RecursiveIteratorIterator($_cacheDirs, RecursiveIteratorIterator::CHILD_FIRST);
             foreach ($_cache as $_file) {
-                if (substr($_file->getBasename(),0,1) == '.' || strpos($_file, '.svn') !== false) continue;
+                if (substr(basename($_file->getPathname()),0,1) == '.' || strpos($_file, '.svn') !== false) continue;
                 // directory ?
                 if ($_file->isDir()) {
                     if (!$_cache->isDot()) {
index 40e4686210b4bd8fe079f69c5ee846cf39857e84..f2dfedfb892dbf0086d30852943220ca6124f4f1 100644 (file)
@@ -39,7 +39,11 @@ class Smarty_Internal_Compile_Assign extends Smarty_Internal_CompileBase {
         if ($compiler->tag_nocache || $compiler->nocache) {
             $_nocache = 'true';
             // create nocache var to make it know for further compiling
-            $compiler->template->tpl_vars[trim($_attr['var'], "'")] = new Smarty_variable(null, true);
+            if (isset($compiler->template->tpl_vars[trim($_attr['var'], "'")])) {
+                $compiler->template->tpl_vars[trim($_attr['var'], "'")]->nocache = true;
+            } else {
+                $compiler->template->tpl_vars[trim($_attr['var'], "'")] = new Smarty_variable(null, true);
+            }
         }
         // scope setup
         if (isset($_attr['scope'])) {
@@ -58,7 +62,14 @@ class Smarty_Internal_Compile_Assign extends Smarty_Internal_CompileBase {
         if (isset($parameter['smarty_internal_index'])) {
             $output = "<?php \$_smarty_tpl->createLocalArrayVariable($_attr[var], $_nocache, $_scope);\n\$_smarty_tpl->tpl_vars[$_attr[var]]->value$parameter[smarty_internal_index] = $_attr[value];";
         } else {
-            $output = "<?php \$_smarty_tpl->tpl_vars[$_attr[var]] = new Smarty_variable($_attr[value], $_nocache, $_scope);";
+            // implement Smarty2's behaviour of variables assigned by reference
+            if ($compiler->template->smarty instanceof SmartyBC) {
+                $output = "<?php if (isset(\$_smarty_tpl->tpl_vars[$_attr[var]])) {\$_smarty_tpl->tpl_vars[$_attr[var]] = clone \$_smarty_tpl->tpl_vars[$_attr[var]];";
+                $output .= "\n\$_smarty_tpl->tpl_vars[$_attr[var]]->value = $_attr[value]; \$_smarty_tpl->tpl_vars[$_attr[var]]->nocache = $_nocache; \$_smarty_tpl->tpl_vars[$_attr[var]]->scope = $_scope;";
+                $output .= "\n} else \$_smarty_tpl->tpl_vars[$_attr[var]] = new Smarty_variable($_attr[value], $_nocache, $_scope);";
+            } else {
+                $output = "<?php \$_smarty_tpl->tpl_vars[$_attr[var]] = new Smarty_variable($_attr[value], $_nocache, $_scope);";
+            }
         }
         if ($_scope == Smarty::SCOPE_PARENT) {
             $output .= "\nif (\$_smarty_tpl->parent != null) \$_smarty_tpl->parent->tpl_vars[$_attr[var]] = clone \$_smarty_tpl->tpl_vars[$_attr[var]];";
index d40c357730b13e56cdd24a7b966d31a52d791862..11a67998174581d596f630c5e65f73c57abd9fe4 100644 (file)
@@ -1,53 +1,55 @@
 <?php
+
 /**
-* Smarty Internal Plugin Compile Block
-*
-* Compiles the {block}{/block} tags
-*
-* @package Smarty
-* @subpackage Compiler
-* @author Uwe Tews
-*/
+ * Smarty Internal Plugin Compile Block
+ *
+ * Compiles the {block}{/block} tags
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ * @author Uwe Tews
+ */
 
 /**
-* Smarty Internal Plugin Compile Block Class
-*
-* @package Smarty
-* @subpackage Compiler
-*/
+ * Smarty Internal Plugin Compile Block Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
 class Smarty_Internal_Compile_Block extends Smarty_Internal_CompileBase {
 
     /**
-    * Attribute definition: Overwrites base class.
-    *
-    * @var array
-    * @see Smarty_Internal_CompileBase
-    */
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
     public $required_attributes = array('name');
+
     /**
-    * Attribute definition: Overwrites base class.
-    *
-    * @var array
-    * @see Smarty_Internal_CompileBase
-    */
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
     public $shorttag_order = array('name', 'hide');
+
     /**
-    * Attribute definition: Overwrites base class.
-    *
-    * @var array
-    * @see Smarty_Internal_CompileBase
-    */
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
     public $optional_attributes = array('hide');
 
     /**
-    * Compiles code for the {block} tag
-    *
-    * @param array  $args     array with attributes from parser
-    * @param object $compiler compiler object
-    * @return boolean true
-    */
-    public function compile($args, $compiler)
-    {
+     * Compiles code for the {block} tag
+     *
+     * @param array  $args     array with attributes from parser
+     * @param object $compiler compiler object
+     * @return boolean true
+     */
+    public function compile($args, $compiler) {
         // check and get attributes
         $_attr = $this->getAttributes($compiler, $args);
         $save = array($_attr, $compiler->parser->current_buffer, $compiler->nocache, $compiler->smarty->merge_compiled_includes, $compiler->merged_templates, $compiler->smarty->merged_templates_func, $compiler->template->properties, $compiler->template->has_nocache_code);
@@ -66,18 +68,17 @@ class Smarty_Internal_Compile_Block extends Smarty_Internal_CompileBase {
     }
 
     /**
-    * Save or replace child block source by block name during parsing
-    *
-    * @param string $block_content     block source content
-    * @param string $block_tag         opening block tag
-    * @param object $template          template object
-    * @param string $filepath          filepath of template source
-    */
-    public static function saveBlockData($block_content, $block_tag, $template, $filepath)
-    {
+     * Save or replace child block source by block name during parsing
+     *
+     * @param string $block_content     block source content
+     * @param string $block_tag         opening block tag
+     * @param object $template          template object
+     * @param string $filepath          filepath of template source
+     */
+    public static function saveBlockData($block_content, $block_tag, $template, $filepath) {
         $_rdl = preg_quote($template->smarty->right_delimiter);
         $_ldl = preg_quote($template->smarty->left_delimiter);
-        if ($template->smarty->auto_literal) {
+        if (!$template->smarty->auto_literal) {
             $al = '\s*';
         } else {
             $al = '';
@@ -89,23 +90,28 @@ class Smarty_Internal_Compile_Block extends Smarty_Internal_CompileBase {
             $_name = trim($_match[3], '\'"');
             if ($_match[8] != 'hide' || isset($template->block_data[$_name])) {        // replace {$smarty.block.child}
                 // do we have {$smart.block.child} in nested {block} tags?
-                if (0 != preg_match_all("!({$_ldl}{$al}block\s+)(name=)?(\w+|'.*'|\".*\")([\s\S]*?{$_rdl})([\s\S]*?)({$_ldl}{$al}\\\$smarty\.block\.child{$_rdl})([\s\S]*?{$_ldl}{$al}/block{$_rdl})!", $block_content, $_match2)) {
-                    foreach($_match2[3] as $name) {
+                if (0 != preg_match_all("!({$_ldl}{$al}block\s+)(name=)?(\w+|'.*'|\".*\")([\s\S]*?)(hide)?(\s*{$_rdl})([\s\S]*?)({$_ldl}{$al}\\\$smarty\.block\.child\s*{$_rdl})([\s\S]*?{$_ldl}{$al}/block\s*{$_rdl})!", $block_content, $_match2)) {
+                    foreach ($_match2[3] as $key => $name) {
                         // get it's replacement
                         $_name2 = trim($name, '\'"');
-                        if (isset($template->block_data[$_name2])) {
-                            $replacement = $template->block_data[$_name2]['source'];
+                        if ($_match2[5][$key] != 'hide' || isset($template->block_data[$_name2])) {
+                            if (isset($template->block_data[$_name2])) {
+                                $replacement = $template->block_data[$_name2]['source'];
+                            } else {
+                                $replacement = '';
+                            }
+                            // replace {$smarty.block.child} tag
+                            $search = array("!({$_ldl}{$al}block[\s\S]*?{$name}[\s\S]*?{$_rdl})([\s\S]*?)({$_ldl}{$al}\\\$smarty\.block\.child\s*{$_rdl})([\s\S]*?)({$_ldl}{$al}/block\s*{$_rdl})!", "/§§§child§§§/");
+                            $replace = array('\2§§§child§§§\4', $replacement);
+                            $block_content = preg_replace($search, $replace, $block_content);
                         } else {
-                            $replacement = '';
+                            // remove hidden blocks
+                            $block_content = preg_replace("!({$_ldl}{$al}block[\s\S]*?{$name}[\s\S]*?{$_rdl}[\s\S]*?{$_ldl}{$al}/block\s*{$_rdl})!", '', $block_content);
                         }
-                        // replace {$smarty.block.child} tag
-                        $search = array("%({$_ldl}{$al}block[\s\S]*?{$name}[\s\S]*?{$_rdl})([\s\S]*?)({$_ldl}{$al}\\\$smarty\.block\.child{$_rdl})([\s\S]*?)({$_ldl}{$al}/block{$_rdl})%","/§§§child§§§/");
-                        $replace = array('\2§§§child§§§\4', $replacement);
-                        $block_content = preg_replace($search, $replace , $block_content);
                     }
                 }
                 // do we have not nested {$smart.block.child}
-                if (0 != preg_match("/({$_ldl}{$al}\\\$smarty\.block\.child{$_rdl})/", $block_content, $_match2)) {
+                if (0 != preg_match("!({$_ldl}{$al}\\\$smarty\.block\.child\s*{$_rdl})!", $block_content, $_match2)) {
                     // get child replacement for this block
                     if (isset($template->block_data[$_name])) {
                         $replacement = $template->block_data[$_name]['source'];
@@ -113,12 +119,12 @@ class Smarty_Internal_Compile_Block extends Smarty_Internal_CompileBase {
                     } else {
                         $replacement = '';
                     }
-                    $block_content = preg_replace("/({$_ldl}{$al}\\\$smarty\.block\.child{$_rdl})/", $replacement, $block_content);
+                    $block_content = preg_replace("!({$_ldl}{$al}\\\$smarty\.block\.child\s*{$_rdl})!", $replacement, $block_content);
                 }
                 if (isset($template->block_data[$_name])) {
                     if (strpos($template->block_data[$_name]['source'], '%%%%SMARTY_PARENT%%%%') !== false) {
                         $template->block_data[$_name]['source'] =
-                        str_replace('%%%%SMARTY_PARENT%%%%', $block_content, $template->block_data[$_name]['source']);
+                                str_replace('%%%%SMARTY_PARENT%%%%', $block_content, $template->block_data[$_name]['source']);
                     } elseif ($template->block_data[$_name]['mode'] == 'prepend') {
                         $template->block_data[$_name]['source'] .= $block_content;
                     } elseif ($template->block_data[$_name]['mode'] == 'append') {
@@ -140,21 +146,20 @@ class Smarty_Internal_Compile_Block extends Smarty_Internal_CompileBase {
     }
 
     /**
-    * Compile saved child block source
-    *
-    * @param object $compiler  compiler object
-    * @param string $_name     optional name of child block
-    * @return string   compiled code of schild block
-    */
-    public static function compileChildBlock($compiler, $_name = null)
-    {
+     * Compile saved child block source
+     *
+     * @param object $compiler  compiler object
+     * @param string $_name     optional name of child block
+     * @return string   compiled code of schild block
+     */
+    public static function compileChildBlock($compiler, $_name = null) {
         $_output = '';
         // if called by {$smarty.block.child} we must search the name of enclosing {block}
         if ($_name == null) {
             $stack_count = count($compiler->_tag_stack);
             while (--$stack_count >= 0) {
                 if ($compiler->_tag_stack[$stack_count][0] == 'block') {
-                    $_name = trim($compiler->_tag_stack[$stack_count][1][0]['name'] ,"'\"");
+                    $_name = trim($compiler->_tag_stack[$stack_count][1][0]['name']"'\"");
                     break;
                 }
             }
@@ -168,8 +173,8 @@ class Smarty_Internal_Compile_Block extends Smarty_Internal_CompileBase {
         if (!isset($compiler->template->block_data[$_name]['source'])) {
             return '';
         }
-        $_tpl = new Smarty_Internal_template ('string:' . $compiler->template->block_data[$_name]['source'], $compiler->smarty, $compiler->template, $compiler->template->cache_id,
-        $compiler->template->compile_id = null, $compiler->template->caching, $compiler->template->cache_lifetime);
+        $_tpl = new Smarty_Internal_template('string:' . $compiler->template->block_data[$_name]['source'], $compiler->smarty, $compiler->template, $compiler->template->cache_id,
+                        $compiler->template->compile_id = null, $compiler->template->caching, $compiler->template->cache_lifetime);
         $_tpl->variable_filters = $compiler->template->variable_filters;
         $_tpl->properties['nocache_hash'] = $compiler->template->properties['nocache_hash'];
         $_tpl->source->filepath = $compiler->template->block_data[$_name]['file'];
@@ -198,14 +203,14 @@ class Smarty_Internal_Compile_Block extends Smarty_Internal_CompileBase {
         if ($_tpl->has_nocache_code) {
             $compiler->template->has_nocache_code = true;
         }
-        foreach($_tpl->required_plugins as $key => $tmp1) {
-            if ($compiler->nocache) {
+        foreach ($_tpl->required_plugins as $key => $tmp1) {
+            if ($compiler->nocache && $compiler->template->caching) {
                 $code = 'nocache';
             } else {
                 $code = $key;
             }
-            foreach($tmp1 as $name => $tmp) {
-                foreach($tmp as $type => $data) {
+            foreach ($tmp1 as $name => $tmp) {
+                foreach ($tmp as $type => $data) {
                     $compiler->template->required_plugins[$code][$name][$type] = $data;
                 }
             }
@@ -217,22 +222,21 @@ class Smarty_Internal_Compile_Block extends Smarty_Internal_CompileBase {
 }
 
 /**
-* Smarty Internal Plugin Compile BlockClose Class
-*
-* @package Smarty
-* @subpackage Compiler
-*/
+ * Smarty Internal Plugin Compile BlockClose Class
+ *
+ * @package Smarty
+ * @subpackage Compiler
+ */
 class Smarty_Internal_Compile_Blockclose extends Smarty_Internal_CompileBase {
 
     /**
-    * Compiles code for the {/block} tag
-    *
-    * @param array  $args     array with attributes from parser
-    * @param object $compiler compiler object
-    * @return string compiled code
-    */
-    public function compile($args, $compiler)
-    {
+     * Compiles code for the {/block} tag
+     *
+     * @param array  $args     array with attributes from parser
+     * @param object $compiler compiler object
+     * @return string compiled code
+     */
+    public function compile($args, $compiler) {
         $compiler->has_code = true;
         // check and get attributes
         $_attr = $this->getAttributes($compiler, $args);
@@ -255,12 +259,12 @@ class Smarty_Internal_Compile_Blockclose extends Smarty_Internal_CompileBase {
             } else {
                 $_output = $compiler->parser->current_buffer->to_smarty_php();
             }
-            unset ($compiler->template->block_data[$_name]['compiled']);
+            unset($compiler->template->block_data[$_name]['compiled']);
         }
         // reset flags
         $compiler->parser->current_buffer = $saved_data[1];
         $compiler->nocache = $saved_data[2];
-        //$compiler->smarty->merge_compiled_includes = $saved_data[3];
+        $compiler->smarty->merge_compiled_includes = $saved_data[3];
         // reset flag for {block} tag
         $compiler->inheritance = false;
         // $_output content has already nocache code processed
index 9042aa23339b10cfb4a42285a70ae8c344abe984..b93139bfa6b7d400701fdb9a009a7dd361094762 100644 (file)
@@ -51,6 +51,11 @@ class Smarty_Internal_Compile_Extends extends Smarty_Internal_CompileBase {
         static $_is_stringy = array('string' => true, 'eval' => true);
         $this->_rdl = preg_quote($compiler->smarty->right_delimiter);
         $this->_ldl = preg_quote($compiler->smarty->left_delimiter);
+        if (!$compiler->smarty->auto_literal) {
+            $al = '\s*';
+        } else {
+            $al = '';
+        }
         $filepath = $compiler->template->source->filepath;
         $this->mbstring_overload = ini_get('mbstring.func_overload') & 2;
         // check and get attributes
@@ -78,11 +83,11 @@ class Smarty_Internal_Compile_Extends extends Smarty_Internal_CompileBase {
         }
         $compiler->template->properties['file_dependency'][$template_sha1] = array($_template->source->filepath, $_template->source->timestamp, $_template->source->type);
         $_content = ($this->mbstring_overload ? mb_substr($compiler->template->source->content, $compiler->lex->counter - 1, 20000000, 'latin1') : substr($compiler->template->source->content, $compiler->lex->counter - 1));
-        if (preg_match_all("!({$this->_ldl}block\s(.+?){$this->_rdl})!", $_content, $s) !=
-        preg_match_all("!({$this->_ldl}/block{$this->_rdl})!", $_content, $c)) {
+        if (preg_match_all("!({$this->_ldl}{$al}block\s(.+?)\s*{$this->_rdl})!", $_content, $s) !=
+        preg_match_all("!({$this->_ldl}{$al}/block\s*{$this->_rdl})!", $_content, $c)) {
             $compiler->trigger_template_error('unmatched {block} {/block} pairs');
         }
-        preg_match_all("!{$this->_ldl}block\s(.+?){$this->_rdl}|{$this->_ldl}/block{$this->_rdl}|{$this->_ldl}\*([\S\s]*?)\*{$this->_rdl}!", $_content, $_result, PREG_OFFSET_CAPTURE);
+        preg_match_all("!{$this->_ldl}{$al}block\s(.+?)\s*{$this->_rdl}|{$this->_ldl}{$al}/block\s*{$this->_rdl}|{$this->_ldl}\*([\S\s]*?)\*{$this->_rdl}!", $_content, $_result, PREG_OFFSET_CAPTURE);
         $_result_count = count($_result[0]);
         $_start = 0;
         while ($_start+1 < $_result_count) {
index ca4d90774f526ca75f9932331db21849de2da514..120f3ff10b8b7f76caeb8af9f6ced574f653e2bd 100644 (file)
@@ -26,8 +26,7 @@ class Smarty_Internal_Compile_Private_Modifier extends Smarty_Internal_CompileBa
      * @param array  $parameter array with compilation parameter\r
      * @return string compiled code\r
      */\r
-    public function compile($args, $compiler, $parameter)\r
-    {\r
+    public function compile($args, $compiler, $parameter) {\r
         // check and get attributes\r
         $_attr = $this->getAttributes($compiler, $args);\r
         $output = $parameter['value'];\r
@@ -36,40 +35,100 @@ class Smarty_Internal_Compile_Private_Modifier extends Smarty_Internal_CompileBa
             $modifier = $single_modifier[0];\r
             $single_modifier[0] = $output;\r
             $params = implode(',', $single_modifier);\r
-            // check for registered modifier\r
-            if (isset($compiler->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][$modifier])) {\r
-                $function = $compiler->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][$modifier][0];\r
-                if (!is_array($function)) {\r
-                    $output = "{$function}({$params})";\r
-                } else {\r
-                    if (is_object($function[0])) {\r
-                        $output = '$_smarty_tpl->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][\'' . $modifier . '\'][0][0]->' . $function[1] . '(' . $params . ')';\r
-                    } else {\r
-                        $output = $function[0] . '::' . $function[1] . '(' . $params . ')';\r
-                    }\r
-                }\r
-            } else if (isset($compiler->smarty->registered_plugins[Smarty::PLUGIN_MODIFIERCOMPILER][$modifier][0])) {\r
-                $output = call_user_func($compiler->smarty->registered_plugins[Smarty::PLUGIN_MODIFIERCOMPILER][$modifier][0], $single_modifier, $compiler->smarty);\r
-                // check for plugin modifiercompiler\r
-            } else if ($compiler->smarty->loadPlugin('smarty_modifiercompiler_' . $modifier)) {\r
-                // check if modifier allowed\r
-                if (!is_object($compiler->smarty->security_policy) || $compiler->smarty->security_policy->isTrustedModifier($modifier, $compiler)) {\r
-                    $plugin = 'smarty_modifiercompiler_' . $modifier;\r
-                    $output = $plugin($single_modifier, $compiler);\r
-                }\r
-                // check for plugin modifier\r
-            } else if ($function = $compiler->getPlugin($modifier, Smarty::PLUGIN_MODIFIER)) {\r
-                // check if modifier allowed\r
-                if (!is_object($compiler->smarty->security_policy) || $compiler->smarty->security_policy->isTrustedModifier($modifier, $compiler)) {\r
-                    $output = "{$function}({$params})";\r
-                }\r
-                // check if trusted PHP function\r
-            } else if (is_callable($modifier)) {\r
-                // check if modifier allowed\r
-                if (!is_object($compiler->smarty->security_policy) || $compiler->smarty->security_policy->isTrustedPhpModifier($modifier, $compiler)) {\r
-                    $output = "{$modifier}({$params})";\r
-                }\r
+            // check if we know already the type of modifier\r
+            if (isset($compiler->known_modifier_type[$modifier])) {\r
+                $modifier_types = array($compiler->known_modifier_type[$modifier]);\r
             } else {\r
+                $modifier_types = array(1, 2, 3, 4, 5, 6);\r
+            }\r
+            foreach ($modifier_types as $type) {\r
+                switch ($type) {\r
+                    case 1:\r
+                        // registered modifier\r
+                        if (isset($compiler->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][$modifier])) {\r
+                            $function = $compiler->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][$modifier][0];\r
+                            if (!is_array($function)) {\r
+                                $output = "{$function}({$params})";\r
+                            } else {\r
+                                if (is_object($function[0])) {\r
+                                    $output = '$_smarty_tpl->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][\'' . $modifier . '\'][0][0]->' . $function[1] . '(' . $params . ')';\r
+                                } else {\r
+                                    $output = $function[0] . '::' . $function[1] . '(' . $params . ')';\r
+                                }\r
+                            }\r
+                            $compiler->known_modifier_type[$modifier] = $type;\r
+                            break 2;\r
+                        }\r
+                        break;\r
+                    case 2:\r
+                        // registered modifier compiler\r
+                        if (isset($compiler->smarty->registered_plugins[Smarty::PLUGIN_MODIFIERCOMPILER][$modifier][0])) {\r
+                            $output = call_user_func($compiler->smarty->registered_plugins[Smarty::PLUGIN_MODIFIERCOMPILER][$modifier][0], $single_modifier, $compiler->smarty);\r
+                            $compiler->known_modifier_type[$modifier] = $type;\r
+                            break 2;\r
+                        }\r
+                        break;\r
+                    case 3:\r
+                        // modifiercompiler plugin\r
+                        if ($compiler->smarty->loadPlugin('smarty_modifiercompiler_' . $modifier)) {\r
+                            // check if modifier allowed\r
+                            if (!is_object($compiler->smarty->security_policy) || $compiler->smarty->security_policy->isTrustedModifier($modifier, $compiler)) {\r
+                                $plugin = 'smarty_modifiercompiler_' . $modifier;\r
+                                $output = $plugin($single_modifier, $compiler);\r
+                            }\r
+                            $compiler->known_modifier_type[$modifier] = $type;\r
+                            break 2;\r
+                        }\r
+                        break;\r
+                    case 4:\r
+                        // modifier plugin\r
+                        if ($function = $compiler->getPlugin($modifier, Smarty::PLUGIN_MODIFIER)) {\r
+                            // check if modifier allowed\r
+                            if (!is_object($compiler->smarty->security_policy) || $compiler->smarty->security_policy->isTrustedModifier($modifier, $compiler)) {\r
+                                $output = "{$function}({$params})";\r
+                            }\r
+                            $compiler->known_modifier_type[$modifier] = $type;\r
+                            break 2;\r
+                        }\r
+                        break;\r
+                    case 5:\r
+                        // PHP function\r
+                        if (is_callable($modifier)) {\r
+                            // check if modifier allowed\r
+                            if (!is_object($compiler->smarty->security_policy) || $compiler->smarty->security_policy->isTrustedPhpModifier($modifier, $compiler)) {\r
+                                $output = "{$modifier}({$params})";\r
+                            }\r
+                            $compiler->known_modifier_type[$modifier] = $type;\r
+                            break 2;\r
+                        }\r
+                        break;\r
+                    case 6:\r
+                        // default plugin handler\r
+                        if (isset($compiler->default_handler_plugins[Smarty::PLUGIN_MODIFIER][$modifier]) || (is_callable($compiler->smarty->default_plugin_handler_func) && $compiler->getPluginFromDefaultHandler($modifier, Smarty::PLUGIN_MODIFIER))) {\r
+                            $function = $compiler->default_handler_plugins[Smarty::PLUGIN_MODIFIER][$modifier][0];\r
+                            // check if modifier allowed\r
+                            if (!is_object($compiler->smarty->security_policy) || $compiler->smarty->security_policy->isTrustedModifier($modifier, $compiler)) {\r
+                                if (!is_array($function)) {\r
+                                    $output = "{$function}({$params})";\r
+                                } else {\r
+                                    if (is_object($function[0])) {\r
+                                        $output = '$_smarty_tpl->smarty->registered_plugins[Smarty::PLUGIN_MODIFIER][\'' . $modifier . '\'][0][0]->' . $function[1] . '(' . $params . ')';\r
+                                    } else {\r
+                                        $output = $function[0] . '::' . $function[1] . '(' . $params . ')';\r
+                                    }\r
+                                }\r
+                            }\r
+                            if (isset($compiler->template->required_plugins['nocache'][$modifier][Smarty::PLUGIN_MODIFIER]['file']) || isset($compiler->template->required_plugins['compiled'][$modifier][Smarty::PLUGIN_MODIFIER]['file'])) {\r
+                                // was a plugin\r
+                                $compiler->known_modifier_type[$modifier] = 4;\r
+                            } else {\r
+                                $compiler->known_modifier_type[$modifier] = $type;\r
+                            }\r
+                            break 2;\r
+                        }\r
+                }\r
+            }\r
+            if (!isset($compiler->known_modifier_type[$modifier])) {\r
                 $compiler->trigger_template_error("unknown modifier \"" . $modifier . "\"", $compiler->lex->taglineno);\r
             }\r
         }\r
index 4760dbe3f59a40aaccbd3d93ea20d42c7f5be6e7..986a11c106ba44cefdb6e67306a864d214b31932 100644 (file)
@@ -80,7 +80,11 @@ class Smarty_Internal_Compile_Private_Special_Variable extends Smarty_Internal_C
                 return '@' . trim($_index[1], "'");
 
             case 'config':
-                return "\$_smarty_tpl->getConfigVariable($_index[1])";
+                if (isset($_index[2])) {
+                    return "(is_array(\$tmp = \$_smarty_tpl->getConfigVariable($_index[1])) ? \$tmp[$_index[2]] : null)";
+                } else {
+                    return "\$_smarty_tpl->getConfigVariable($_index[1])";
+                }
             case 'ldelim':
                 $_ldelim = $compiler->smarty->left_delimiter;
                 return "'$_ldelim'";
index a309ec9ff77d76750b9b2a14edb4ee83b8147490..bcb3ce05453e9fe883987ec0a8b7db35a57f713a 100644 (file)
@@ -240,9 +240,8 @@ class Smarty_Internal_Config {
         }
         // scan sections
         if (!empty($sections)) {
-            $sections = array_flip((array) $sections);
-            foreach ($_config_vars['sections'] as $this_section => $dummy) {
-                if (isset($sections[$this_section])) {
+            foreach ((array) $sections as $this_section) {
+                if (isset($_config_vars['sections'][$this_section])) {
                     foreach ($_config_vars['sections'][$this_section]['vars'] as $variable => $value) {
                         if ($this->smarty->config_overwrite || !isset($scope_ptr->config_vars[$variable])) {
                             $scope_ptr->config_vars[$variable] = $value;
index 9481d9922e1e51b25c6252ac82dc1c59ab4743dc..29734ae057fe8c75f455e038bfc110527bc4bac4 100644 (file)
@@ -89,6 +89,11 @@ class Smarty_Internal_Resource_Extends extends Smarty_Resource {
         $this->mbstring_overload = ini_get('mbstring.func_overload') & 2;
         $_rdl = preg_quote($source->smarty->right_delimiter);
         $_ldl = preg_quote($source->smarty->left_delimiter);
+        if (!$source->smarty->auto_literal) {
+            $al = '\s*';
+        } else {
+            $al = '';
+        }
         $_components = array_reverse($source->components);
         $_first = reset($_components);
         $_last = end($_components);
@@ -105,11 +110,11 @@ class Smarty_Internal_Resource_Extends extends Smarty_Resource {
 
             // extend sources
             if ($_component != $_last) {
-                if (preg_match_all("!({$_ldl}block\s(.+?){$_rdl})!", $_content, $_open) !=
-                preg_match_all("!({$_ldl}/block{$_rdl})!", $_content, $_close)) {
+                if (preg_match_all("!({$_ldl}{$al}block\s(.+?)\s*{$_rdl})!", $_content, $_open) !=
+                preg_match_all("!({$_ldl}{$al}/block\s*{$_rdl})!", $_content, $_close)) {
                     throw new SmartyException("unmatched {block} {/block} pairs in template {$_component->type} '{$_component->name}'");
                 }
-                preg_match_all("!{$_ldl}block\s(.+?){$_rdl}|{$_ldl}/block{$_rdl}|{$_ldl}\*([\S\s]*?)\*{$_rdl}!", $_content, $_result, PREG_OFFSET_CAPTURE);
+                preg_match_all("!{$_ldl}{$al}block\s(.+?)\s*{$_rdl}|{$_ldl}{$al}/block\s*{$_rdl}|{$_ldl}\*([\S\s]*?)\*{$_rdl}!", $_content, $_result, PREG_OFFSET_CAPTURE);
                 $_result_count = count($_result[0]);
                 $_start = 0;
                 while ($_start+1 < $_result_count) {
index 447ff3c950a0b4b70a8d781dac972d087535b3c6..29017edbb548c8b5c4607ada5f4fba6383d21cf3 100644 (file)
@@ -266,6 +266,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
         // get variables from calling scope
         if ($parent_scope == Smarty::SCOPE_LOCAL) {
             $tpl->tpl_vars = $this->tpl_vars;
+            $tpl->tpl_vars['smarty'] = clone $this->tpl_vars['smarty'];
         } elseif ($parent_scope == Smarty::SCOPE_PARENT) {
             $tpl->tpl_vars = &$this->tpl_vars;
         } elseif ($parent_scope == Smarty::SCOPE_GLOBAL) {
@@ -305,6 +306,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
         // get variables from calling scope
         if ($parent_scope == Smarty::SCOPE_LOCAL ) {
             $tpl->tpl_vars = $this->tpl_vars;
+            $tpl->tpl_vars['smarty'] = clone $this->tpl_vars['smarty'];
         } elseif ($parent_scope == Smarty::SCOPE_PARENT) {
             $tpl->tpl_vars = &$this->tpl_vars;
         } elseif ($parent_scope == Smarty::SCOPE_GLOBAL) {
@@ -342,7 +344,11 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
                 foreach ($this->required_plugins['compiled'] as $tmp) {
                     foreach ($tmp as $data) {
                         $file = addslashes($data['file']);
-                        $plugins_string .= "if (!is_callable('{$data['function']}')) include '{$file}';\n";
+                        if (is_Array($data['function'])){
+                            $plugins_string .= "if (!is_callable(array('{$data['function'][0]}','{$data['function'][1]}'))) include '{$file}';\n";
+                        } else {
+                            $plugins_string .= "if (!is_callable('{$data['function']}')) include '{$file}';\n";
+                        }
                     }
                 }
                 $plugins_string .= '?>';
@@ -353,7 +359,11 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
                 foreach ($this->required_plugins['nocache'] as $tmp) {
                     foreach ($tmp as $data) {
                         $file = addslashes($data['file']);
-                        $plugins_string .= addslashes("if (!is_callable('{$data['function']}')) include '{$file}';\n");
+                        if (is_Array($data['function'])){
+                            $plugins_string .= addslashes("if (!is_callable(array('{$data['function'][0]}','{$data['function'][1]}'))) include '{$file}';\n");
+                        } else {
+                            $plugins_string .= addslashes("if (!is_callable('{$data['function']}')) include '{$file}';\n");
+                        }
                     }
                 }
                 $plugins_string .= "?>/*/%%SmartyNocache:{$this->properties['nocache_hash']}%%*/';?>\n";
@@ -442,7 +452,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
                         $mtime = $this->source->timestamp;
                     } else {
                         // file and php types can be checked without loading the respective resource handlers
-                        $mtime = filemtime($_file_to_check[0]);
+                        $mtime = @filemtime($_file_to_check[0]);
                     }
                 } elseif ($_file_to_check[2] == 'string') {
                     continue;
@@ -450,7 +460,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
                     $source = Smarty_Resource::source(null, $this->smarty, $_file_to_check[0]);
                     $mtime = $source->timestamp;
                 }
-                if ($mtime > $_file_to_check[1]) {
+                if (!$mtime || $mtime > $_file_to_check[1]) {
                     $is_valid = false;
                     break;
                 }
index d60ecd16ebba72974ba934d0326da59beb60a696..abd48b79929a97b3bc3ce44546ec0483eba3f34d 100644 (file)
@@ -319,7 +319,7 @@ abstract class Smarty_Internal_TemplateBase extends Smarty_Internal_Data {
                         break;\r
 \r
                         default:\r
-                        header('HTTP/1.1 304 Not Modified');\r
+                        header($_SERVER['SERVER_PROTOCOL'].' 304 Not Modified');\r
                         break;\r
                     }\r
                 } else {\r
index a9264c73c328a3f4365038faafe981eb736ecb5c..5eeb8ef6aa02e6f8f4af6b366d871a35b5bc4e91 100644 (file)
@@ -1,4 +1,5 @@
 <?php\r
+\r
 /**\r
  * Smarty Internal Plugin Smarty Template Compiler Base\r
  *\r
@@ -23,101 +24,122 @@ abstract class Smarty_Internal_TemplateCompilerBase {
      * @var mixed\r
      */\r
     private $nocache_hash = null;\r
+\r
     /**\r
      * suppress generation of nocache code\r
      *\r
      * @var bool\r
      */\r
     public $suppressNocacheProcessing = false;\r
+\r
     /**\r
      * suppress generation of merged template code\r
      *\r
      * @var bool\r
      */\r
     public $suppressMergedTemplates = false;\r
+\r
     /**\r
      * compile tag objects\r
      *\r
      * @var array\r
      */\r
     public static $_tag_objects = array();\r
+\r
     /**\r
      * tag stack\r
      *\r
      * @var array\r
      */\r
     public $_tag_stack = array();\r
+\r
     /**\r
      * current template\r
      *\r
      * @var Smarty_Internal_Template\r
      */\r
     public $template = null;\r
+\r
     /**\r
      * merged templates\r
      *\r
      * @var array\r
      */\r
     public $merged_templates = array();\r
+\r
     /**\r
      * flag when compiling {block}\r
      *\r
      * @var bool\r
      */\r
     public $inheritance = false;\r
+\r
     /**\r
      * plugins loaded by default plugin handler\r
      *\r
      * @var array\r
      */\r
     public $default_handler_plugins = array();\r
+\r
     /**\r
      * saved preprocessed modifier list\r
      *\r
      * @var mixed\r
      */\r
     public $default_modifier_list = null;\r
+\r
     /**\r
      * force compilation of complete template as nocache\r
      * @var boolean\r
      */\r
     public $forceNocache = false;\r
+\r
     /**\r
      * suppress Smarty header code in compiled template\r
      * @var bool\r
      */\r
     public $suppressHeader = false;\r
+\r
     /**\r
      * suppress template property header code in compiled template\r
      * @var bool\r
      */\r
     public $suppressTemplatePropertyHeader = false;\r
+\r
     /**\r
      * flag if compiled template file shall we written\r
      * @var bool\r
      */\r
     public $write_compiled_code = true;\r
+\r
     /**\r
      * flag if currently a template function is compiled\r
      * @var bool\r
      */\r
     public $compiles_template_function = false;\r
+\r
     /**\r
      * called subfuntions from template function\r
      * @var array\r
      */\r
     public $called_functions = array();\r
+\r
     /**\r
      * flags for used modifier plugins\r
      * @var array\r
      */\r
     public $modifier_plugins = array();\r
 \r
+    /**\r
+     * type of already compiled modifier\r
+     * @var array\r
+     */\r
+    public $known_modifier_type = array();\r
+\r
     /**\r
      * Initialize compiler\r
      */\r
-    public function __construct()\r
-    {\r
+    public function __construct() {\r
         $this->nocache_hash = str_replace('.', '-', uniqid(rand(), true));\r
     }\r
 \r
@@ -127,8 +149,7 @@ abstract class Smarty_Internal_TemplateCompilerBase {
      * @param  Smarty_Internal_Template $template template object to compile\r
      * @return bool true if compiling succeeded, false if it failed\r
      */\r
-    public function compileTemplate(Smarty_Internal_Template $template)\r
-    {\r
+    public function compileTemplate(Smarty_Internal_Template $template) {\r
         if (empty($template->properties['nocache_hash'])) {\r
             $template->properties['nocache_hash'] = $this->nocache_hash;\r
         } else {\r
@@ -156,7 +177,7 @@ abstract class Smarty_Internal_TemplateCompilerBase {
             $_content = $template->source->content;\r
             // run prefilter if required\r
             if (isset($this->smarty->autoload_filters['pre']) || isset($this->smarty->registered_filters['pre'])) {\r
-                $template->source->content = $_content = Smarty_Internal_Filter_Handler::runFilter('pre', $_content, $template);\r
+                $_content = Smarty_Internal_Filter_Handler::runFilter('pre', $_content, $template);\r
             }\r
             // on empty template just return header\r
             if ($_content == '') {\r
@@ -194,6 +215,8 @@ abstract class Smarty_Internal_TemplateCompilerBase {
         } else {\r
             $code = $template_header . $template->createTemplateCodeFrame($_compiled_code) . $merged_code;\r
         }\r
+        // unset content because template inheritance could have replace source with parent code\r
+        unset ($template->source->content);\r
         return $code;\r
     }\r
 \r
@@ -208,8 +231,7 @@ abstract class Smarty_Internal_TemplateCompilerBase {
      * @param array  $parameter array with compilation parameter\r
      * @return string compiled code\r
      */\r
-    public function compileTag($tag, $args, $parameter = array())\r
-    {\r
+    public function compileTag($tag, $args, $parameter = array()) {\r
         // $args contains the attributes parsed and compiled by the lexer/parser\r
         // assume that tag does compile into code, but creates no HTML output\r
         $this->has_code = true;\r
@@ -219,8 +241,8 @@ abstract class Smarty_Internal_TemplateCompilerBase {
             $this->template->used_tags[] = array($tag, $args);\r
         }\r
         // check nocache option flag\r
-        if (in_array("'nocache'",$args) || in_array(array('nocache'=>'true'),$args)\r
-        || in_array(array('nocache'=>'"true"'),$args) || in_array(array('nocache'=>"'true'"),$args)) {\r
+        if (in_array("'nocache'", $args) || in_array(array('nocache' => 'true'), $args)\r
+                || in_array(array('nocache' => '"true"'), $args) || in_array(array('nocache' => "'true'"), $args)) {\r
             $this->tag_nocache = true;\r
         }\r
         // compile the smarty tag (required compile classes to compile the tag are autoloaded)\r
@@ -260,12 +282,12 @@ abstract class Smarty_Internal_TemplateCompilerBase {
                 if (isset($this->smarty->registered_objects[$tag]) && isset($parameter['object_methode'])) {\r
                     $methode = $parameter['object_methode'];\r
                     if (!in_array($methode, $this->smarty->registered_objects[$tag][3]) &&\r
-                    (empty($this->smarty->registered_objects[$tag][1]) || in_array($methode, $this->smarty->registered_objects[$tag][1]))) {\r
+                            (empty($this->smarty->registered_objects[$tag][1]) || in_array($methode, $this->smarty->registered_objects[$tag][1]))) {\r
                         return $this->callTagCompiler('private_object_function', $args, $parameter, $tag, $methode);\r
                     } elseif (in_array($methode, $this->smarty->registered_objects[$tag][3])) {\r
                         return $this->callTagCompiler('private_object_block_function', $args, $parameter, $tag, $methode);\r
                     } else {\r
-                        return $this->trigger_template_error ('unallowed methode "' . $methode . '" in registered object "' . $tag . '"', $this->lex->taglineno);\r
+                        return $this->trigger_template_error('unallowed methode "' . $methode . '" in registered object "' . $tag . '"', $this->lex->taglineno);\r
                     }\r
                 }\r
                 // check if tag is registered\r
@@ -275,10 +297,10 @@ abstract class Smarty_Internal_TemplateCompilerBase {
                         if ($plugin_type == Smarty::PLUGIN_COMPILER) {\r
                             $new_args = array();\r
                             foreach ($args as $key => $mixed) {\r
-                               if (is_array($mixed)) {\r
-                                       $new_args = array_merge($new_args, $mixed);\r
+                                if (is_array($mixed)) {\r
+                                    $new_args = array_merge($new_args, $mixed);\r
                                 } else {\r
-                                       $new_args[$key] = $mixed;\r
+                                    $new_args[$key] = $mixed;\r
                                 }\r
                             }\r
                             if (!$this->smarty->registered_plugins[$plugin_type][$tag][1]) {\r
@@ -297,7 +319,6 @@ abstract class Smarty_Internal_TemplateCompilerBase {
                         if ($plugin_type == Smarty::PLUGIN_FUNCTION || $plugin_type == Smarty::PLUGIN_BLOCK) {\r
                             return $this->callTagCompiler('private_registered_' . $plugin_type, $args, $parameter, $tag);\r
                         }\r
-\r
                     }\r
                 }\r
                 // check plugins from plugins folder\r
@@ -308,10 +329,10 @@ abstract class Smarty_Internal_TemplateCompilerBase {
                             // convert arguments format for old compiler plugins\r
                             $new_args = array();\r
                             foreach ($args as $key => $mixed) {\r
-                               if (is_array($mixed)) {\r
-                                       $new_args = array_merge($new_args, $mixed);\r
+                                if (is_array($mixed)) {\r
+                                    $new_args = array_merge($new_args, $mixed);\r
                                 } else {\r
-                                       $new_args[$key] = $mixed;\r
+                                    $new_args[$key] = $mixed;\r
                                 }\r
                             }\r
                             return $plugin($new_args, $this->smarty);\r
@@ -325,7 +346,7 @@ abstract class Smarty_Internal_TemplateCompilerBase {
                         throw new SmartyException("Plugin \"{$tag}\" not callable");\r
                     } else {\r
                         if ($function = $this->getPlugin($tag, $plugin_type)) {\r
-                            if(!isset($this->smarty->security_policy) || $this->smarty->security_policy->isTrustedTag($tag, $this)) {\r
+                            if (!isset($this->smarty->security_policy) || $this->smarty->security_policy->isTrustedTag($tag, $this)) {\r
                                 return $this->callTagCompiler('private_' . $plugin_type . '_plugin', $args, $parameter, $tag, $function);\r
                             }\r
                         }\r
@@ -378,7 +399,7 @@ abstract class Smarty_Internal_TemplateCompilerBase {
                     if (in_array($methode, $this->smarty->registered_objects[$base_tag][3])) {\r
                         return $this->callTagCompiler('private_object_block_function', $args, $parameter, $tag, $methode);\r
                     } else {\r
-                        return $this->trigger_template_error ('unallowed closing tag methode "' . $methode . '" in registered object "' . $base_tag . '"', $this->lex->taglineno);\r
+                        return $this->trigger_template_error('unallowed closing tag methode "' . $methode . '" in registered object "' . $base_tag . '"', $this->lex->taglineno);\r
                     }\r
                 }\r
                 // registered block tag ?\r
@@ -389,6 +410,22 @@ abstract class Smarty_Internal_TemplateCompilerBase {
                 if ($function = $this->getPlugin($base_tag, Smarty::PLUGIN_BLOCK)) {\r
                     return $this->callTagCompiler('private_block_plugin', $args, $parameter, $tag, $function);\r
                 }\r
+                // registered compiler plugin ?\r
+                if (isset($this->smarty->registered_plugins[Smarty::PLUGIN_COMPILER][$tag])) {\r
+                    // if compiler function plugin call it now\r
+                    $args = array();\r
+                    if (!$this->smarty->registered_plugins[Smarty::PLUGIN_COMPILER][$tag][1]) {\r
+                        $this->tag_nocache = true;\r
+                    }\r
+                    $function = $this->smarty->registered_plugins[Smarty::PLUGIN_COMPILER][$tag][0];\r
+                    if (!is_array($function)) {\r
+                        return $function($args, $this);\r
+                    } else if (is_object($function[0])) {\r
+                        return $this->smarty->registered_plugins[Smarty::PLUGIN_COMPILER][$tag][0][0]->$function[1]($args, $this);\r
+                    } else {\r
+                        return call_user_func_array($function, array($args, $this));\r
+                    }\r
+                }\r
                 if ($this->smarty->loadPlugin('smarty_compiler_' . $tag)) {\r
                     $plugin = 'smarty_compiler_' . $tag;\r
                     if (is_callable($plugin)) {\r
@@ -403,7 +440,7 @@ abstract class Smarty_Internal_TemplateCompilerBase {
                     throw new SmartyException("Plugin \"{$tag}\" not callable");\r
                 }\r
             }\r
-            $this->trigger_template_error ("unknown tag \"" . $tag . "\"", $this->lex->taglineno);\r
+            $this->trigger_template_error("unknown tag \"" . $tag . "\"", $this->lex->taglineno);\r
         }\r
     }\r
 \r
@@ -421,8 +458,7 @@ abstract class Smarty_Internal_TemplateCompilerBase {
      * @param mixed $param3 optional parameter\r
      * @return string compiled code\r
      */\r
-    public function callTagCompiler($tag, $args, $param1 = null, $param2 = null, $param3 = null)\r
-    {\r
+    public function callTagCompiler($tag, $args, $param1 = null, $param2 = null, $param3 = null) {\r
         // re-use object if already exists\r
         if (isset(self::$_tag_objects[$tag])) {\r
             // compile this tag\r
@@ -433,10 +469,10 @@ abstract class Smarty_Internal_TemplateCompilerBase {
         if ($this->smarty->loadPlugin($class_name)) {\r
             // check if tag allowed by security\r
             if (!isset($this->smarty->security_policy) || $this->smarty->security_policy->isTrustedTag($tag, $this)) {\r
-            // use plugin if found\r
-            self::$_tag_objects[$tag] = new $class_name;\r
-            // compile this tag\r
-            return self::$_tag_objects[$tag]->compile($args, $this, $param1, $param2, $param3);\r
+                // use plugin if found\r
+                self::$_tag_objects[$tag] = new $class_name;\r
+                // compile this tag\r
+                return self::$_tag_objects[$tag]->compile($args, $this, $param1, $param2, $param3);\r
             }\r
         }\r
         // no internal compile plugin for this tag\r
@@ -450,8 +486,7 @@ abstract class Smarty_Internal_TemplateCompilerBase {
      * @param string $plugin_type type of plugin\r
      * @return string call name of function\r
      */\r
-    public function getPlugin($plugin_name, $plugin_type)\r
-    {\r
+    public function getPlugin($plugin_name, $plugin_type) {\r
         $function = null;\r
         if ($this->template->caching && ($this->nocache || $this->tag_nocache)) {\r
             if (isset($this->template->required_plugins['nocache'][$plugin_name][$plugin_type])) {\r
@@ -505,14 +540,12 @@ abstract class Smarty_Internal_TemplateCompilerBase {
      * @param string $plugin_type type of plugin\r
      * @return boolean true if found\r
      */\r
-    public function getPluginFromDefaultHandler($tag, $plugin_type)\r
-    {\r
+    public function getPluginFromDefaultHandler($tag, $plugin_type) {\r
         $callback = null;\r
         $script = null;\r
         $cacheable = true;\r
         $result = call_user_func_array(\r
-            $this->smarty->default_plugin_handler_func,\r
-            array($tag, $plugin_type, $this->template, &$callback, &$script, &$cacheable)\r
+                $this->smarty->default_plugin_handler_func, array($tag, $plugin_type, $this->template, &$callback, &$script, &$cacheable)\r
         );\r
         if ($result) {\r
             $this->tag_nocache = $this->tag_nocache || !$cacheable;\r
@@ -526,7 +559,7 @@ abstract class Smarty_Internal_TemplateCompilerBase {
                         $this->template->required_plugins['compiled'][$tag][$plugin_type]['function'] = $callback;\r
                     }\r
                     include_once $script;\r
-                }  else {\r
+                } else {\r
                     $this->trigger_template_error("Default plugin handler: Returned script file \"{$script}\" for \"{$tag}\" not found");\r
                 }\r
             }\r
@@ -554,16 +587,14 @@ abstract class Smarty_Internal_TemplateCompilerBase {
      * @param boolean $is_code true if content is compiled code\r
      * @return string content\r
      */\r
-    public function processNocacheCode($content, $is_code)\r
-    {\r
+    public function processNocacheCode($content, $is_code) {\r
         // If the template is not evaluated and we have a nocache section and or a nocache tag\r
         if ($is_code && !empty($content)) {\r
             // generate replacement code\r
             if ((!($this->template->source->recompiled) || $this->forceNocache) && $this->template->caching && !$this->suppressNocacheProcessing &&\r
-            ($this->nocache || $this->tag_nocache || $this->forceNocache == 2)) {\r
+                    ($this->nocache || $this->tag_nocache || $this->forceNocache == 2)) {\r
                 $this->template->has_nocache_code = true;\r
-                $_output = str_replace("'", "\'", $content);\r
-                $_output = str_replace('\\\\', '\\\\\\', $_output);\r
+                $_output = addcslashes($content,'\'\\');\r
                 $_output = str_replace("^#^", "'", $_output);\r
                 $_output = "<?php echo '/*%%SmartyNocache:{$this->nocache_hash}%%*/" . $_output . "/*/%%SmartyNocache:{$this->nocache_hash}%%*/';?>\n";\r
                 // make sure we include modifer plugins for nocache code\r
@@ -596,21 +627,20 @@ abstract class Smarty_Internal_TemplateCompilerBase {
      * @param string $line line-number\r
      * @throws SmartyCompilerException when an unexpected token is found\r
      */\r
-    public function trigger_template_error($args = null, $line = null)\r
-    {\r
+    public function trigger_template_error($args = null, $line = null) {\r
         // get template source line which has error\r
         if (!isset($line)) {\r
             $line = $this->lex->line;\r
         }\r
         $match = preg_split("/\n/", $this->lex->data);\r
-        $error_text = 'Syntax Error in template "' . $this->template->source->filepath . '"  on line ' . $line . ' "' . htmlspecialchars(trim(preg_replace('![\t\r\n]+!',' ',$match[$line-1]))) . '" ';\r
+        $error_text = 'Syntax Error in template "' . $this->template->source->filepath . '"  on line ' . $line . ' "' . htmlspecialchars(trim(preg_replace('![\t\r\n]+!', ' ', $match[$line - 1]))) . '" ';\r
         if (isset($args)) {\r
             // individual error message\r
             $error_text .= $args;\r
         } else {\r
             // expected token from parser\r
-            $error_text .= ' - Unexpected "' . $this->lex->value.'"';\r
-            if (count($this->parser->yy_get_expected_tokens($this->parser->yymajor)) <= 4 ) {\r
+            $error_text .= ' - Unexpected "' . $this->lex->value . '"';\r
+            if (count($this->parser->yy_get_expected_tokens($this->parser->yymajor)) <= 4) {\r
                 foreach ($this->parser->yy_get_expected_tokens($this->parser->yymajor) as $token) {\r
                     $exp_token = $this->parser->yyTokenName[$token];\r
                     if (isset($this->lex->smarty_token_names[$exp_token])) {\r
index 5e4041241a48f68ac9a8ef520350abbc36617a39..a7d5fa9a5e3b0b186de138050d31f340827a0fa4 100644 (file)
@@ -85,6 +85,7 @@ class Smarty_Internal_Templatelexer
         $this->ldel = preg_quote($this->smarty->left_delimiter,'/');
         $this->ldel_length = strlen($this->smarty->left_delimiter);
         $this->rdel = preg_quote($this->smarty->right_delimiter,'/');
+        $this->rdel_length = strlen($this->smarty->right_delimiter);
         $this->smarty_token_names['LDEL'] =    $this->smarty->left_delimiter;
         $this->smarty_token_names['RDEL'] =    $this->smarty->right_delimiter;
         $this->mbstring_overload = ini_get('mbstring.func_overload') & 2;
@@ -141,11 +142,12 @@ class Smarty_Internal_Templatelexer
               21 => 0,
               22 => 0,
               23 => 0,
+              24 => 0,
             );
         if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
             return false; // end of input
         }
-        $yy_global_pattern = "/\G(".$this->ldel."[$]smarty\\.block\\.child".$this->rdel.")|\G(\\{\\})|\G(".$this->ldel."\\*([\S\s]*?)\\*".$this->rdel.")|\G(".$this->ldel."strip".$this->rdel.")|\G(".$this->ldel."\\s{1,}strip\\s{1,}".$this->rdel.")|\G(".$this->ldel."\/strip".$this->rdel.")|\G(".$this->ldel."\\s{1,}\/strip\\s{1,}".$this->rdel.")|\G(".$this->ldel."\\s*literal\\s*".$this->rdel.")|\G(".$this->ldel."\\s{1,}\/)|\G(".$this->ldel."\\s*(if|elseif|else if|while)\\s+)|\G(".$this->ldel."\\s*for\\s+)|\G(".$this->ldel."\\s*foreach(?![^\s]))|\G(".$this->ldel."\\s*setfilter\\s+)|\G(".$this->ldel."\\s{1,})|\G(".$this->ldel."\/)|\G(".$this->ldel.")|\G(<\\?(?:php\\w+|=|[a-zA-Z]+)?)|\G(\\?>)|\G(<%)|\G(%>)|\G([\S\s])/iS";
+        $yy_global_pattern = "/\G(".$this->ldel."[$]smarty\\.block\\.child".$this->rdel.")|\G(\\{\\})|\G(".$this->ldel."\\*([\S\s]*?)\\*".$this->rdel.")|\G(".$this->ldel."strip".$this->rdel.")|\G(".$this->ldel."\\s{1,}strip\\s{1,}".$this->rdel.")|\G(".$this->ldel."\/strip".$this->rdel.")|\G(".$this->ldel."\\s{1,}\/strip\\s{1,}".$this->rdel.")|\G(".$this->ldel."\\s*literal\\s*".$this->rdel.")|\G(".$this->ldel."\\s{1,}\/)|\G(".$this->ldel."\\s*(if|elseif|else if|while)\\s+)|\G(".$this->ldel."\\s*for\\s+)|\G(".$this->ldel."\\s*foreach(?![^\s]))|\G(".$this->ldel."\\s*setfilter\\s+)|\G(".$this->ldel."\\s{1,})|\G(".$this->ldel."\/)|\G(".$this->ldel.")|\G(<\\?(?:php\\w+|=|[a-zA-Z]+)?)|\G(\\?>)|\G(".$this->rdel.")|\G(<%)|\G(%>)|\G([\S\s])/iS";
 
         do {
             if ($this->mbstring_overload ? preg_match($yy_global_pattern, mb_substr($this->data, $this->counter,2000000000,'latin1'), $yymatches) : preg_match($yy_global_pattern,$this->data, $yymatches, null, $this->counter)) {
@@ -344,16 +346,21 @@ class Smarty_Internal_Templatelexer
     function yy_r1_21($yy_subpatterns)
     {
 
-  $this->token = Smarty_Internal_Templateparser::TP_ASPSTARTTAG;
+  $this->token = Smarty_Internal_Templateparser::TP_TEXT;
     }
     function yy_r1_22($yy_subpatterns)
     {
 
-  $this->token = Smarty_Internal_Templateparser::TP_ASPENDTAG;
+  $this->token = Smarty_Internal_Templateparser::TP_ASPSTARTTAG;
     }
     function yy_r1_23($yy_subpatterns)
     {
 
+  $this->token = Smarty_Internal_Templateparser::TP_ASPENDTAG;
+    }
+    function yy_r1_24($yy_subpatterns)
+    {
+
   if ($this->mbstring_overload) {
     $to = mb_strlen($this->data,'latin1');
   } else {
@@ -442,11 +449,12 @@ class Smarty_Internal_Templatelexer
               74 => 0,
               75 => 0,
               76 => 0,
+              77 => 0,
             );
         if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
             return false; // end of input
         }
-        $yy_global_pattern = "/\G('[^'\\\\]*(?:\\\\.[^'\\\\]*)*')|\G(".$this->ldel."\\s{1,}\/)|\G(".$this->ldel."\\s*(if|elseif|else if|while)\\s+)|\G(".$this->ldel."\\s*for\\s+)|\G(".$this->ldel."\\s*foreach(?![^\s]))|\G(".$this->ldel."\\s{1,})|\G(\\s{1,}".$this->rdel.")|\G(".$this->ldel."\/)|\G(".$this->ldel.")|\G(".$this->rdel.")|\G(\\s+is\\s+in\\s+)|\G(\\s+as\\s+)|\G(\\s+to\\s+)|\G(\\s+step\\s+)|\G(\\s+instanceof\\s+)|\G(\\s*===\\s*)|\G(\\s*!==\\s*)|\G(\\s*==\\s*|\\s+eq\\s+)|\G(\\s*!=\\s*|\\s*<>\\s*|\\s+(ne|neq)\\s+)|\G(\\s*>=\\s*|\\s+(ge|gte)\\s+)|\G(\\s*<=\\s*|\\s+(le|lte)\\s+)|\G(\\s*>\\s*|\\s+gt\\s+)|\G(\\s*<\\s*|\\s+lt\\s+)|\G(\\s+mod\\s+)|\G(!\\s*|not\\s+)|\G(\\s*&&\\s*|\\s*and\\s+)|\G(\\s*\\|\\|\\s*|\\s*or\\s+)|\G(\\s*xor\\s+)|\G(\\s+is\\s+odd\\s+by\\s+)|\G(\\s+is\\s+not\\s+odd\\s+by\\s+)|\G(\\s+is\\s+odd)|\G(\\s+is\\s+not\\s+odd)|\G(\\s+is\\s+even\\s+by\\s+)|\G(\\s+is\\s+not\\s+even\\s+by\\s+)|\G(\\s+is\\s+even)|\G(\\s+is\\s+not\\s+even)|\G(\\s+is\\s+div\\s+by\\s+)|\G(\\s+is\\s+not\\s+div\\s+by\\s+)|\G(\\((int(eger)?|bool(ean)?|float|double|real|string|binary|array|object)\\)\\s*)|\G(\\s*\\(\\s*)|\G(\\s*\\))|\G(\\[\\s*)|\G(\\s*\\])|\G(\\s*->\\s*)|\G(\\s*=>\\s*)|\G(\\s*=\\s*)|\G(\\+\\+|--)|\G(\\s*(\\+|-)\\s*)|\G(\\s*(\\*|\/|%)\\s*)|\G(\\$)|\G(\\s*;)|\G(::)|\G(\\s*:\\s*)|\G(@)|\G(#)|\G(\")|\G(`)|\G(\\|)|\G(\\.)|\G(\\s*,\\s*)|\G(\\s*&\\s*)|\G(\\s*\\?\\s*)|\G(0[xX][0-9a-fA-F]+)|\G([0-9]*[a-zA-Z_]\\w*)|\G(\\d+)|\G(\\s+)|\G([\S\s])/iS";
+        $yy_global_pattern = "/\G('[^'\\\\]*(?:\\\\.[^'\\\\]*)*')|\G(".$this->ldel."\\s{1,}\/)|\G(".$this->ldel."\\s*(if|elseif|else if|while)\\s+)|\G(".$this->ldel."\\s*for\\s+)|\G(".$this->ldel."\\s*foreach(?![^\s]))|\G(".$this->ldel."\\s{1,})|\G(\\s{1,}".$this->rdel.")|\G(".$this->ldel."\/)|\G(".$this->ldel.")|\G(".$this->rdel.")|\G(\\s+is\\s+in\\s+)|\G(\\s+as\\s+)|\G(\\s+to\\s+)|\G(\\s+step\\s+)|\G(\\s+instanceof\\s+)|\G(\\s*===\\s*)|\G(\\s*!==\\s*)|\G(\\s*==\\s*|\\s+eq\\s+)|\G(\\s*!=\\s*|\\s*<>\\s*|\\s+(ne|neq)\\s+)|\G(\\s*>=\\s*|\\s+(ge|gte)\\s+)|\G(\\s*<=\\s*|\\s+(le|lte)\\s+)|\G(\\s*>\\s*|\\s+gt\\s+)|\G(\\s*<\\s*|\\s+lt\\s+)|\G(\\s+mod\\s+)|\G(!\\s*|not\\s+)|\G(\\s*&&\\s*|\\s*and\\s+)|\G(\\s*\\|\\|\\s*|\\s*or\\s+)|\G(\\s*xor\\s+)|\G(\\s+is\\s+odd\\s+by\\s+)|\G(\\s+is\\s+not\\s+odd\\s+by\\s+)|\G(\\s+is\\s+odd)|\G(\\s+is\\s+not\\s+odd)|\G(\\s+is\\s+even\\s+by\\s+)|\G(\\s+is\\s+not\\s+even\\s+by\\s+)|\G(\\s+is\\s+even)|\G(\\s+is\\s+not\\s+even)|\G(\\s+is\\s+div\\s+by\\s+)|\G(\\s+is\\s+not\\s+div\\s+by\\s+)|\G(\\((int(eger)?|bool(ean)?|float|double|real|string|binary|array|object)\\)\\s*)|\G(\\s*\\(\\s*)|\G(\\s*\\))|\G(\\[\\s*)|\G(\\s*\\])|\G(\\s*->\\s*)|\G(\\s*=>\\s*)|\G(\\s*=\\s*)|\G(\\+\\+|--)|\G(\\s*(\\+|-)\\s*)|\G(\\s*(\\*|\/|%)\\s*)|\G(\\$)|\G(\\s*;)|\G(::)|\G(\\s*:\\s*)|\G(@)|\G(#)|\G(\")|\G(`)|\G(\\|)|\G(\\.)|\G(\\s*,\\s*)|\G(\\s*&\\s*)|\G(\\s*\\?\\s*)|\G(0[xX][0-9a-fA-F]+)|\G(\\s+[0-9]*[a-zA-Z_][a-zA-Z0-9_\-:]*\\s*=\\s*)|\G([0-9]*[a-zA-Z_]\\w*)|\G(\\d+)|\G(\\s+)|\G([\S\s])/iS";
 
         do {
             if ($this->mbstring_overload ? preg_match($yy_global_pattern, mb_substr($this->data, $this->counter,2000000000,'latin1'), $yymatches) : preg_match($yy_global_pattern,$this->data, $yymatches, null, $this->counter)) {
@@ -852,21 +860,33 @@ class Smarty_Internal_Templatelexer
     function yy_r2_73($yy_subpatterns)
     {
 
-  $this->token = Smarty_Internal_Templateparser::TP_ID;
+  // resolve conflicts with shorttag and right_delimiter starting with '='
+  if (substr($this->data, $this->counter + strlen($this->value) - 1, $this->rdel_length) == $this->smarty->right_delimiter) {
+     preg_match("/\s+/",$this->value,$match);
+     $this->value = $match[0];
+     $this->token = Smarty_Internal_Templateparser::TP_SPACE;
+  } else {
+     $this->token = Smarty_Internal_Templateparser::TP_ATTR;
+  }
     }
     function yy_r2_74($yy_subpatterns)
     {
 
-  $this->token = Smarty_Internal_Templateparser::TP_INTEGER;
+  $this->token = Smarty_Internal_Templateparser::TP_ID;
     }
     function yy_r2_75($yy_subpatterns)
     {
 
-  $this->token = Smarty_Internal_Templateparser::TP_SPACE;
+  $this->token = Smarty_Internal_Templateparser::TP_INTEGER;
     }
     function yy_r2_76($yy_subpatterns)
     {
 
+  $this->token = Smarty_Internal_Templateparser::TP_SPACE;
+    }
+    function yy_r2_77($yy_subpatterns)
+    {
+
   $this->token = Smarty_Internal_Templateparser::TP_TEXT;
     }
 
@@ -1181,4 +1201,3 @@ class Smarty_Internal_Templatelexer
     }
 
 }
-?>
\ No newline at end of file
index 94dca0ac4491efc6d46b2bbb3149e6c438eea4b1..d67be6e6fa4066d9ff9970efaad183daf85f9a7c 100644 (file)
@@ -172,887 +172,852 @@ class Smarty_Internal_Templateparser#line 79 "smarty_internal_templateparser.php
     const TP_LDELSETFILTER                  = 32;
     const TP_SMARTYBLOCKCHILD               = 33;
     const TP_LDELSLASH                      = 34;
-    const TP_INTEGER                        = 35;
-    const TP_COMMA                          = 36;
-    const TP_OPENP                          = 37;
-    const TP_CLOSEP                         = 38;
-    const TP_MATH                           = 39;
-    const TP_UNIMATH                        = 40;
-    const TP_ANDSYM                         = 41;
-    const TP_ISIN                           = 42;
-    const TP_ISDIVBY                        = 43;
-    const TP_ISNOTDIVBY                     = 44;
-    const TP_ISEVEN                         = 45;
-    const TP_ISNOTEVEN                      = 46;
-    const TP_ISEVENBY                       = 47;
-    const TP_ISNOTEVENBY                    = 48;
-    const TP_ISODD                          = 49;
-    const TP_ISNOTODD                       = 50;
-    const TP_ISODDBY                        = 51;
-    const TP_ISNOTODDBY                     = 52;
-    const TP_INSTANCEOF                     = 53;
-    const TP_QMARK                          = 54;
-    const TP_NOT                            = 55;
-    const TP_TYPECAST                       = 56;
-    const TP_HEX                            = 57;
-    const TP_DOT                            = 58;
-    const TP_SINGLEQUOTESTRING              = 59;
-    const TP_DOUBLECOLON                    = 60;
-    const TP_AT                             = 61;
-    const TP_HATCH                          = 62;
-    const TP_OPENB                          = 63;
-    const TP_CLOSEB                         = 64;
-    const TP_EQUALS                         = 65;
-    const TP_NOTEQUALS                      = 66;
-    const TP_GREATERTHAN                    = 67;
-    const TP_LESSTHAN                       = 68;
-    const TP_GREATEREQUAL                   = 69;
-    const TP_LESSEQUAL                      = 70;
-    const TP_IDENTITY                       = 71;
-    const TP_NONEIDENTITY                   = 72;
-    const TP_MOD                            = 73;
-    const TP_LAND                           = 74;
-    const TP_LOR                            = 75;
-    const TP_LXOR                           = 76;
-    const TP_QUOTE                          = 77;
-    const TP_BACKTICK                       = 78;
-    const TP_DOLLARID                       = 79;
-    const YY_NO_ACTION = 592;
-    const YY_ACCEPT_ACTION = 591;
-    const YY_ERROR_ACTION = 590;
+    const TP_ATTR                           = 35;
+    const TP_INTEGER                        = 36;
+    const TP_COMMA                          = 37;
+    const TP_OPENP                          = 38;
+    const TP_CLOSEP                         = 39;
+    const TP_MATH                           = 40;
+    const TP_UNIMATH                        = 41;
+    const TP_ANDSYM                         = 42;
+    const TP_ISIN                           = 43;
+    const TP_ISDIVBY                        = 44;
+    const TP_ISNOTDIVBY                     = 45;
+    const TP_ISEVEN                         = 46;
+    const TP_ISNOTEVEN                      = 47;
+    const TP_ISEVENBY                       = 48;
+    const TP_ISNOTEVENBY                    = 49;
+    const TP_ISODD                          = 50;
+    const TP_ISNOTODD                       = 51;
+    const TP_ISODDBY                        = 52;
+    const TP_ISNOTODDBY                     = 53;
+    const TP_INSTANCEOF                     = 54;
+    const TP_QMARK                          = 55;
+    const TP_NOT                            = 56;
+    const TP_TYPECAST                       = 57;
+    const TP_HEX                            = 58;
+    const TP_DOT                            = 59;
+    const TP_SINGLEQUOTESTRING              = 60;
+    const TP_DOUBLECOLON                    = 61;
+    const TP_AT                             = 62;
+    const TP_HATCH                          = 63;
+    const TP_OPENB                          = 64;
+    const TP_CLOSEB                         = 65;
+    const TP_EQUALS                         = 66;
+    const TP_NOTEQUALS                      = 67;
+    const TP_GREATERTHAN                    = 68;
+    const TP_LESSTHAN                       = 69;
+    const TP_GREATEREQUAL                   = 70;
+    const TP_LESSEQUAL                      = 71;
+    const TP_IDENTITY                       = 72;
+    const TP_NONEIDENTITY                   = 73;
+    const TP_MOD                            = 74;
+    const TP_LAND                           = 75;
+    const TP_LOR                            = 76;
+    const TP_LXOR                           = 77;
+    const TP_QUOTE                          = 78;
+    const TP_BACKTICK                       = 79;
+    const TP_DOLLARID                       = 80;
+    const YY_NO_ACTION = 597;
+    const YY_ACCEPT_ACTION = 596;
+    const YY_ERROR_ACTION = 595;
 
-    const YY_SZ_ACTTAB = 2562;
+    const YY_SZ_ACTTAB = 2383;
 static public $yy_action = array(
- /*     0 */   218,  317,  318,  320,  319,  316,  315,  311,  310,  312,
- /*    10 */   313,  314,  321,  322,  197,  193,  187,   43,  591,   95,
- /*    20 */   255,  318,  320,    6,  107,  292,   38,   11,   42,  154,
- /*    30 */   283,   13,  181,  245,  295,  241,  262,  284,   51,   50,
- /*    40 */    52,   44,   23,   28,  367,  374,   33,   32,  375,  383,
- /*    50 */    21,   31,  328,  323,  325,  326,  324,    9,   36,  353,
- /*    60 */   265,  197,  331,  329,  384,  385,  386,  382,  381,  377,
- /*    70 */   376,  378,  379,  282,  380,  362,  218,  344,    4,  106,
- /*    80 */   175,  120,    7,   11,   82,  129,  283,   12,  456,  292,
- /*    90 */   453,   27,  291,  301,  361,  109,  387,  236,  368,  365,
- /*   100 */   456,  343,  453,  243,   42,  136,  200,   37,    7,  267,
- /*   110 */     7,  219,  256,    7,   51,   50,   52,   44,   23,   28,
- /*   120 */   367,  374,   33,   32,  375,  383,   21,   31,  239,   99,
- /*   130 */   171,  136,   36,  136,  261,   26,  136,  123,  373,  292,
- /*   140 */   384,  385,  386,  382,  381,  377,  376,  378,  379,  282,
- /*   150 */   380,  362,  218,  344,  369,  218,  200,  132,  158,  184,
- /*   160 */    68,  119,  235,   11,   11,  153,  283,  283,  337,  301,
- /*   170 */   361,  458,  306,  236,  368,  365,   42,  343,  252,  284,
- /*   180 */    42,  191,  218,  458,  250,   11,  200,  287,  283,   12,
- /*   190 */    51,   50,   52,   44,   23,   28,  367,  374,   33,   32,
- /*   200 */   375,  383,   21,   31,  302,  108,  168,   49,  200,  232,
- /*   210 */    11,  218,   35,  283,  240,  292,  384,  385,  386,  382,
- /*   220 */   381,  377,  376,  378,  379,  282,  380,  362,  218,  344,
- /*   230 */   207,  218,  200,  132,   49,    8,   54,  119,  142,   11,
- /*   240 */    14,  158,  283,  110,  342,  301,  361,  455,  152,  236,
- /*   250 */   368,  365,   42,  343,  231,  239,   42,  350,  103,  455,
- /*   260 */   248,  199,  339,   49,  343,  345,   51,   50,   52,   44,
- /*   270 */    23,   28,  367,  374,   33,   32,  375,  383,   21,   31,
- /*   280 */   128,  183,  174,   49,  370,  163,  198,  339,   15,  158,
- /*   290 */   292,  292,  384,  385,  386,  382,  381,  377,  376,  378,
- /*   300 */   379,  282,  380,  362,  218,  344,  192,  218,  201,  120,
- /*   310 */   344,  272,   82,  129,  156,  164,  270,  218,  129,  158,
- /*   320 */   273,  301,  361,  458,  292,  236,  368,  365,  128,  343,
- /*   330 */   236,  368,  365,  296,  343,  458,  284,  244,  130,  227,
- /*   340 */   260,  330,   51,   50,   52,   44,   23,   28,  367,  374,
- /*   350 */    33,   32,  375,  383,   21,   31,  207,  196,  339,   49,
- /*   360 */    41,    8,  127,  162,  251,  229,  212,  242,  384,  385,
- /*   370 */   386,  382,  381,  377,  376,  378,  379,  282,  380,  362,
- /*   380 */   218,  344,  101,  218,  176,  132,  344,  140,   78,  129,
- /*   390 */   148,  166,  249,  292,  129,  186,  278,  301,  361,  327,
- /*   400 */   292,  236,  368,  365,  292,  343,  236,  368,  365,    5,
- /*   410 */   343,   42,  211,   36,  121,  281,  284,  201,   51,   50,
- /*   420 */    52,   44,   23,   28,  367,  374,   33,   32,  375,  383,
- /*   430 */    21,   31,  218,  178,    7,   49,  179,  275,  225,  185,
- /*   440 */    11,  284,  292,  283,  384,  385,  386,  382,  381,  377,
- /*   450 */   376,  378,  379,  282,  380,  362,   17,  136,   11,  201,
- /*   460 */   170,  226,  173,  200,  284,  141,  247,  223,  335,  292,
- /*   470 */    51,   50,   52,   44,   23,   28,  367,  374,   33,   32,
- /*   480 */   375,  383,   21,   31,  135,  218,  201,  359,   11,   11,
- /*   490 */    11,  238,  213,  234,  188,  302,  384,  385,  386,  382,
- /*   500 */   381,  377,  376,  378,  379,  282,  380,  362,  195,  351,
- /*   510 */   189,  366,  251,  235,  218,  251,  264,  333,  146,  332,
- /*   520 */   305,  200,  143,   51,   50,   52,   44,   23,   28,  367,
- /*   530 */   374,   33,   32,  375,  383,   21,   31,  218,  203,  137,
- /*   540 */    15,  297,   42,  271,  194,   19,   98,  116,  102,  384,
- /*   550 */   385,  386,  382,  381,  377,  376,  378,  379,  282,  380,
- /*   560 */   362,  372,  372,  372,  300,   34,  224,  138,   39,  139,
- /*   570 */   225,  146,  131,  133,  159,   51,   50,   52,   44,   23,
- /*   580 */    28,  367,  374,   33,   32,  375,  383,   21,   31,  372,
- /*   590 */   172,  334,   94,  299,  276,  302,    2,  371,    4,  292,
- /*   600 */   125,  384,  385,  386,  382,  381,  377,  376,  378,  379,
- /*   610 */   282,  380,  362,  218,  344,  372,  218,  308,  132,  344,
- /*   620 */   287,   78,  129,  150,  370,  201,  161,  129,  160,  204,
- /*   630 */   301,  361,  341,   29,  236,  368,  365,  292,  343,  236,
- /*   640 */   368,  365,  218,  343,  284,  216,   42,   20,  277,  284,
- /*   650 */   263,   51,   50,   52,   44,   23,   28,  367,  374,   33,
- /*   660 */    32,  375,  383,   21,   31,  218,  228,   45,   49,   16,
- /*   670 */   326,  249,  104,  326,  326,  118,  105,  384,  385,  386,
- /*   680 */   382,  381,  377,  376,  378,  379,  282,  380,  362,  340,
- /*   690 */   372,  372,  326,  326,  326,  326,  326,  326,  326,  326,
- /*   700 */   326,   42,  237,   51,   50,   52,   44,   23,   28,  367,
- /*   710 */   374,   33,   32,  375,  383,   21,   31,  218,  326,  326,
- /*   720 */   326,  326,  326,  326,  326,  326,  114,  326,  218,  384,
- /*   730 */   385,  386,  382,  381,  377,  376,  378,  379,  282,  380,
- /*   740 */   362,  372,  353,  326,  307,  326,  326,  326,  326,  326,
- /*   750 */   326,  326,  326,  326,  268,   51,   50,   52,   44,   23,
- /*   760 */    28,  367,  374,   33,   32,  375,  383,   21,   31,  218,
- /*   770 */   326,  326,  326,  326,  326,  326,  326,  326,   97,  355,
- /*   780 */   112,  384,  385,  386,  382,  381,  377,  376,  378,  379,
- /*   790 */   282,  380,  362,  372,  326,  372,  326,   42,  326,  326,
- /*   800 */   326,  326,  326,  326,  326,  326,  158,   51,   50,   52,
- /*   810 */    44,   23,   28,  367,  374,   33,   32,  375,  383,   21,
- /*   820 */    31,  218,  326,  326,  326,  326,  326,  326,  326,  326,
- /*   830 */   326,  326,  326,  384,  385,  386,  382,  381,  377,  376,
- /*   840 */   378,  379,  282,  380,  362,  128,  326,  326,  326,  326,
- /*   850 */   326,  326,  326,  326,  326,  326,  326,  326,  326,   51,
- /*   860 */    50,   52,   44,   23,   28,  367,  374,   33,   32,  375,
- /*   870 */   383,   21,   31,  326,  326,  326,  326,  326,  326,  326,
- /*   880 */   326,  326,  326,  326,  266,  384,  385,  386,  382,  381,
- /*   890 */   377,  376,  378,  379,  282,  380,  362,  218,  326,  326,
- /*   900 */   326,  326,  190,  344,  326,  326,   11,  145,  354,  283,
- /*   910 */   288,  129,  218,  202,   18,   24,   22,  218,   45,   42,
- /*   920 */     6,  107,   42,  236,  368,  365,  154,  343,  286,  200,
- /*   930 */   245,  295,  241,  285,  326,   51,   50,   52,   44,   23,
- /*   940 */    28,  367,  374,   33,   32,  375,  383,   21,   31,  218,
- /*   950 */    10,  326,  326,  326,  326,  326,  326,  326,  326,  326,
- /*   960 */   326,  384,  385,  386,  382,  381,  377,  376,  378,  379,
- /*   970 */   282,  380,  362,  326,  326,  356,   40,  352,  326,  326,
- /*   980 */   326,  326,  326,  326,  326,  326,  326,   51,   50,   52,
- /*   990 */    44,   23,   28,  367,  374,   33,   32,  375,  383,   21,
- /*  1000 */    31,  218,  326,  326,  326,  326,  326,  326,  326,  326,
- /*  1010 */   326,  326,  326,  384,  385,  386,  382,  381,  377,  376,
- /*  1020 */   378,  379,  282,  380,  362,  326,  326,  326,  326,  326,
- /*  1030 */   326,  326,  326,  326,  326,  326,  326,  326,  326,   51,
- /*  1040 */    50,   52,   44,   23,   28,  367,  374,   33,   32,  375,
- /*  1050 */   383,   21,   31,  326,  326,  326,  326,  326,  326,  326,
- /*  1060 */   326,  326,  326,  326,  326,  384,  385,  386,  382,  381,
- /*  1070 */   377,  376,  378,  379,  282,  380,  362,  218,  218,   51,
- /*  1080 */    50,   52,   44,   23,   28,  367,  374,   33,   32,  375,
- /*  1090 */   383,   21,   31,  303,  304,  326,  326,  326,  326,  326,
- /*  1100 */   326,  326,  326,  326,  326,  384,  385,  386,  382,  381,
- /*  1110 */   377,  376,  378,  379,  282,  380,  362,  218,  326,  218,
- /*  1120 */   326,  326,   43,  326,  134,  208,  326,  326,    6,  107,
- /*  1130 */   326,  326,  253,  348,  154,  452,  354,  230,  245,  295,
- /*  1140 */   241,  246,   18,   30,   42,   42,   48,   42,    6,  107,
- /*  1150 */   326,  326,  326,    7,  154,  326,  326,  326,  245,  295,
- /*  1160 */   241,   47,   46,  298,  233,  363,  326,  344,  101,    1,
- /*  1170 */   269,  155,  326,  326,  326,  129,  136,  326,   43,  326,
- /*  1180 */   134,  220,  326,   96,    6,  107,  358,  236,  368,  365,
- /*  1190 */   154,  343,  326,  326,  245,  295,  241,  246,   42,   30,
- /*  1200 */   326,  254,   48,  360,   40,  352,  326,  344,  326,  326,
- /*  1210 */   326,  151,  326,   42,  349,  129,  326,   47,   46,  298,
- /*  1220 */   233,  363,  326,  274,  101,    1,   42,  236,  368,  365,
- /*  1230 */   326,  343,  336,  357,   43,   42,  144,  220,  326,   96,
- /*  1240 */     6,  107,  289,  326,   42,   42,  154,  258,  326,  294,
- /*  1250 */   245,  295,  241,  246,   42,    3,  326,  338,   48,   42,
- /*  1260 */   259,   42,  326,  344,  326,  326,  326,  149,  326,   42,
- /*  1270 */   279,  129,   42,   47,   46,  298,  233,  363,  326,  293,
- /*  1280 */   101,    1,   42,  236,  368,  365,  326,  343,  309,  347,
- /*  1290 */    43,   42,  126,  220,  326,   96,    6,  107,  290,  326,
- /*  1300 */    42,   42,  154,  346,  326,  257,  245,  295,  241,  246,
- /*  1310 */    42,   30,  326,  326,   48,   42,  326,   42,  326,  326,
- /*  1320 */   326,  326,  326,  326,  326,  326,  326,  326,  326,   47,
- /*  1330 */    46,  298,  233,  363,  326,  326,  101,    1,  326,  326,
- /*  1340 */   326,  326,  326,  326,  326,  326,   43,  326,  130,  220,
- /*  1350 */   326,   96,    6,  107,  326,  326,  326,  326,  154,  326,
- /*  1360 */   326,  326,  245,  295,  241,  246,  326,   25,  326,  326,
- /*  1370 */    48,  326,  326,  326,  326,  326,  326,  326,  326,  326,
- /*  1380 */   326,  326,  326,  326,  326,   47,   46,  298,  233,  363,
- /*  1390 */   326,  326,  101,    1,  326,  326,  326,  326,  326,  326,
- /*  1400 */   326,  326,   43,  326,  134,  210,  326,   96,    6,  107,
- /*  1410 */   326,  326,  326,  326,  154,  326,  326,  326,  245,  295,
- /*  1420 */   241,  246,  326,   30,  326,  326,   48,  326,  326,  326,
- /*  1430 */   326,  326,  326,  326,  326,  326,  326,  326,  326,  326,
- /*  1440 */   326,   47,   46,  298,  233,  363,  326,  326,  101,    1,
- /*  1450 */   326,  326,  326,  326,  326,  326,  326,  326,   43,  326,
- /*  1460 */   124,   92,  326,   96,    6,  107,  326,  326,  326,  326,
- /*  1470 */   154,  326,  326,  326,  245,  295,  241,  246,  326,   30,
- /*  1480 */   326,  326,   48,  326,  326,  326,  326,  326,  326,  326,
- /*  1490 */   326,  326,  326,  326,  326,  326,  326,   47,   46,  298,
- /*  1500 */   233,  363,  326,  326,  101,    1,  326,  326,  326,  326,
- /*  1510 */   326,  326,  326,  326,   43,  326,  134,  206,  326,   96,
- /*  1520 */     6,  107,  326,  326,  326,  326,  154,  326,  326,  326,
- /*  1530 */   245,  295,  241,  222,  326,   30,  326,  326,   48,  326,
- /*  1540 */   326,  326,  326,  326,  326,  326,  326,  326,  326,  326,
- /*  1550 */   326,  326,  326,   47,   46,  298,  233,  363,  326,  326,
- /*  1560 */   101,    1,  326,  326,  326,  326,  326,  326,  326,  326,
- /*  1570 */    43,  326,  134,  205,  326,   96,    6,  107,  326,  326,
- /*  1580 */   326,  326,  154,  326,  326,  326,  245,  295,  241,  246,
- /*  1590 */   326,   30,  326,  326,   48,  326,  326,  326,  326,  326,
- /*  1600 */   326,  326,  326,  326,  326,  326,  326,  326,  326,   47,
- /*  1610 */    46,  298,  233,  363,  326,  326,  101,    1,  326,  326,
- /*  1620 */   326,  326,  326,  326,  326,  326,   43,  326,  134,  209,
- /*  1630 */   326,   96,    6,  107,  326,  326,  326,  326,  154,  326,
- /*  1640 */   326,  326,  245,  295,  241,  246,  326,   30,  326,  326,
- /*  1650 */    48,  326,  326,  326,  326,  326,  326,  326,  326,  326,
- /*  1660 */   326,  326,  326,  326,  326,   47,   46,  298,  233,  363,
- /*  1670 */   326,  326,  101,    1,  326,  326,  326,  326,  326,  326,
- /*  1680 */   326,  326,   43,  326,  130,  220,  326,   96,    6,  107,
- /*  1690 */   326,  326,  326,  326,  154,  326,  326,  326,  245,  295,
- /*  1700 */   241,  246,  326,   25,  326,  326,   48,  326,  326,  326,
- /*  1710 */   326,  326,  326,  326,  326,  326,  326,  326,  326,  190,
- /*  1720 */   165,   47,   46,  298,  233,  363,  326,  326,  101,  292,
- /*  1730 */   326,  326,   24,   22,  326,  326,  326,  326,   43,  326,
- /*  1740 */   130,  221,  326,   96,    6,  107,  200,  326,  326,  326,
- /*  1750 */   154,  326,  326,  326,  245,  295,  241,  246,  326,   25,
- /*  1760 */   326,  326,   48,  326,  326,  326,  326,  326,  326,  326,
- /*  1770 */   326,  326,  326,  326,  326,  326,  326,   47,   46,  298,
- /*  1780 */   233,  363,  326,  326,  101,  326,  326,  326,  326,  326,
- /*  1790 */   326,  326,  326,  326,  326,  501,  190,  180,  326,   96,
- /*  1800 */   326,  326,  501,  326,  501,  501,  292,  501,  501,   24,
- /*  1810 */    22,  326,  326,  344,  501,    7,  501,  132,  326,  326,
- /*  1820 */    78,  129,  326,  200,  326,  326,  326,  326,  326,  301,
- /*  1830 */   361,  501,  326,  236,  368,  365,  326,  343,  136,  326,
- /*  1840 */   326,  344,  501,  326,  217,   93,  326,  326,   59,  117,
- /*  1850 */   326,  326,  326,  326,  326,  326,  501,  301,  361,  326,
- /*  1860 */   326,  236,  368,  365,  344,  343,  326,  326,  132,  326,
- /*  1870 */   326,   77,  129,  326,  326,  326,  326,  326,  326,  326,
- /*  1880 */   301,  361,  326,  326,  236,  368,  365,  344,  343,  326,
- /*  1890 */   326,  132,  326,  326,   84,  129,  326,  326,  344,  326,
- /*  1900 */   326,  326,  115,  301,  361,   72,  129,  236,  368,  365,
- /*  1910 */   326,  343,  326,  326,  301,  361,  326,  326,  236,  368,
- /*  1920 */   365,  326,  343,  344,  326,  326,  326,  132,  326,  326,
- /*  1930 */    64,  129,  326,  326,  344,  326,  326,  326,  132,  301,
- /*  1940 */   361,   66,  129,  236,  368,  365,  326,  343,  326,  326,
- /*  1950 */   301,  361,  326,  344,  236,  368,  365,  132,  343,  326,
- /*  1960 */    68,  129,  326,  326,  326,  326,  326,  326,  326,  301,
- /*  1970 */   361,  326,  344,  236,  368,  365,  132,  343,  326,   76,
- /*  1980 */   129,  326,  326,  344,  326,  326,  326,  132,  301,  361,
- /*  1990 */    80,  129,  236,  368,  365,  326,  343,  326,  326,  301,
- /*  2000 */   361,  326,  326,  236,  368,  365,  326,  343,  344,  326,
- /*  2010 */   326,  326,  132,  326,  326,   60,  129,  326,  326,  344,
- /*  2020 */   326,  326,  326,  132,  301,  361,   73,  129,  236,  368,
- /*  2030 */   365,  326,  343,  326,  326,  301,  361,  326,  344,  236,
- /*  2040 */   368,  365,  132,  343,  326,   74,  129,  326,  326,  326,
- /*  2050 */   326,  326,  326,  326,  301,  361,  326,  344,  236,  368,
- /*  2060 */   365,  132,  343,  326,   90,  129,  326,  326,  344,  326,
- /*  2070 */   326,  326,  132,  301,  361,   65,  129,  236,  368,  365,
- /*  2080 */   326,  343,  326,  326,  301,  361,  326,  326,  236,  368,
- /*  2090 */   365,  326,  343,  344,  326,  326,  326,  132,  326,  326,
- /*  2100 */    83,  129,  326,  326,  344,  326,  326,  326,   93,  301,
- /*  2110 */   361,   53,  117,  236,  368,  365,  326,  343,  326,  326,
- /*  2120 */   301,  361,  326,  344,  215,  368,  365,  132,  343,  326,
- /*  2130 */    87,  129,  326,  326,  326,  326,  326,  326,  326,  301,
- /*  2140 */   361,  326,  344,  236,  368,  365,  132,  343,  326,   58,
- /*  2150 */   129,  326,  326,  344,  326,  326,  326,  122,  301,  361,
- /*  2160 */    55,  129,  236,  368,  365,  326,  343,  326,  326,  301,
- /*  2170 */   361,  326,  326,  236,  368,  365,  326,  343,  344,  326,
- /*  2180 */   326,  326,  132,  326,  326,   70,  129,  326,  326,  344,
- /*  2190 */   326,  326,  326,  132,  301,  361,   91,  129,  236,  368,
- /*  2200 */   365,  326,  343,  326,  326,  301,  361,  326,  344,  236,
- /*  2210 */   368,  365,  111,  343,  326,   63,  129,  326,  326,  326,
- /*  2220 */   326,  326,  326,  326,  301,  361,  326,  344,  236,  368,
- /*  2230 */   365,  132,  343,  326,   86,  129,  326,  326,  344,  326,
- /*  2240 */   326,  326,  132,  301,  361,   79,  129,  236,  368,  365,
- /*  2250 */   326,  343,  326,  326,  301,  361,  326,  326,  236,  368,
- /*  2260 */   365,  326,  343,  344,  326,  326,  326,  132,  326,  326,
- /*  2270 */    75,  129,  326,  326,  344,  326,  326,  326,  132,  301,
- /*  2280 */   361,   88,  129,  236,  368,  365,  326,  343,  326,  326,
- /*  2290 */   301,  361,  326,  344,  236,  368,  365,  132,  343,  326,
- /*  2300 */    62,  129,  326,  326,  326,  326,  326,  326,  326,  301,
- /*  2310 */   361,  326,  344,  236,  368,  365,  132,  343,  326,   61,
- /*  2320 */   129,  326,  326,  344,  326,  326,  326,  132,  301,  361,
- /*  2330 */    69,  129,  236,  368,  365,  326,  343,  326,  326,  301,
- /*  2340 */   361,  326,  326,  236,  368,  365,  326,  343,  344,  326,
- /*  2350 */   326,  326,  132,  326,  326,   57,  129,  326,  326,  344,
- /*  2360 */   326,  326,  326,  132,  301,  361,   89,  129,  236,  368,
- /*  2370 */   365,  326,  343,  326,  326,  301,  361,  326,  344,  236,
- /*  2380 */   368,  365,  132,  343,  326,   81,  129,  326,  326,  326,
- /*  2390 */   326,  326,  326,  326,  301,  361,  326,  344,  236,  368,
- /*  2400 */   365,  113,  343,  326,   85,  129,  326,  326,  344,  326,
- /*  2410 */   326,  326,  132,  301,  361,   71,  129,  236,  368,  365,
- /*  2420 */   326,  343,  326,  326,  301,  361,  326,  326,  236,  368,
- /*  2430 */   365,  326,  343,  344,  326,  326,  326,  132,  326,  326,
- /*  2440 */    67,  129,  326,  326,  344,  326,  326,  326,  132,  301,
- /*  2450 */   361,   56,  129,  214,  368,  365,  326,  343,  326,  326,
- /*  2460 */   301,  361,  326,  344,  236,  368,  365,  147,  343,  326,
- /*  2470 */   326,  129,  326,  326,  326,  326,  326,  326,  326,  326,
- /*  2480 */   364,  326,  344,  236,  368,  365,  157,  343,  326,  326,
- /*  2490 */   129,  326,  326,  326,  326,  100,  177,  326,  326,  280,
- /*  2500 */   326,  326,  236,  368,  365,  292,  343,  326,   24,   22,
- /*  2510 */   326,  190,  167,  326,  326,  326,  326,  326,  190,  182,
- /*  2520 */   326,  292,  200,  326,   24,   22,  326,  326,  292,  326,
- /*  2530 */   326,   24,   22,  326,  190,  169,  326,  326,  200,  326,
- /*  2540 */   326,  326,  326,  326,  292,  200,  326,   24,   22,  326,
- /*  2550 */   326,  326,  326,  326,  326,  326,  326,  326,  326,  326,
- /*  2560 */   326,  200,
+ /*     0 */   225,  275,  263,  276,  259,  257,  260,  390,  356,  359,
+ /*    10 */   353,  193,   18,  127,   42,  317,  381,  351,  196,  350,
+ /*    20 */     6,  108,   24,   98,  128,  190,  134,  318,   41,   41,
+ /*    30 */   249,  329,  231,   18,   43,   43,  317,   26,  298,   50,
+ /*    40 */    47,   48,   44,   10,   13,  305,  306,   12,   11,  340,
+ /*    50 */   341,   40,   20,  387,  308,  307,  309,  374,  254,  248,
+ /*    60 */   252,  217,  193,  385,  291,  375,  376,  377,  373,  372,
+ /*    70 */   368,  367,  369,  370,  371,  378,  379,  225,  312,  255,
+ /*    80 */   225,  225,  118,    2,  207,   76,  135,  596,   95,  281,
+ /*    90 */   271,  264,    2,  366,  315,  386,  461,  383,  232,  294,
+ /*   100 */   303,  388,  313,  389,  227,   41,  144,  225,  461,  245,
+ /*   110 */   282,   43,  218,  358,  461,  144,   50,   47,   48,   44,
+ /*   120 */    10,   13,  305,  306,   12,   11,  340,  341,   40,   20,
+ /*   130 */   105,  177,  522,   46,   46,   41,   19,  522,  143,  297,
+ /*   140 */   325,   43,  375,  376,  377,  373,  372,  368,  367,  369,
+ /*   150 */   370,  371,  378,  379,  225,  312,  293,  206,  225,  141,
+ /*   160 */   124,  225,   54,  119,  123,  225,  459,   38,  173,  246,
+ /*   170 */   319,  315,  386,  347,  455,  232,  294,  303,  459,  313,
+ /*   180 */   139,  321,   41,   31,  459,   41,   41,    2,   43,  188,
+ /*   190 */     2,   43,   43,   50,   47,   48,   44,   10,   13,  305,
+ /*   200 */   306,   12,   11,  340,  341,   40,   20,  225,  136,  301,
+ /*   210 */   144,  194,  350,  144,   46,  202,  206,  328,  198,  375,
+ /*   220 */   376,  377,  373,  372,  368,  367,  369,  370,  371,  378,
+ /*   230 */   379,   21,    9,   28,  185,   41,  318,  225,  265,  271,
+ /*   240 */   264,   43,  206,   27,  173,  206,   50,   47,   48,   44,
+ /*   250 */    10,   13,  305,  306,   12,   11,  340,  341,   40,   20,
+ /*   260 */   225,  178,   18,  212,  330,  317,   17,   32,    8,   14,
+ /*   270 */   325,  267,  375,  376,  377,  373,  372,  368,  367,  369,
+ /*   280 */   370,  371,  378,  379,  136,  363,  363,  207,   41,    4,
+ /*   290 */    46,    5,  131,  233,   43,   25,  186,  289,  318,   50,
+ /*   300 */    47,   48,   44,   10,   13,  305,  306,   12,   11,  340,
+ /*   310 */   341,   40,   20,  225,  100,  161,   18,  355,  361,  317,
+ /*   320 */    26,  109,  360,  346,  325,  375,  376,  377,  373,  372,
+ /*   330 */   368,  367,  369,  370,  371,  378,  379,  106,  201,  172,
+ /*   340 */    25,  206,  288,   25,   18,  261,  181,  317,  325,   45,
+ /*   350 */   339,  129,   50,   47,   48,   44,   10,   13,  305,  306,
+ /*   360 */    12,   11,  340,  341,   40,   20,  225,  104,  162,   18,
+ /*   370 */    16,  205,  317,  206,  248,  238,   43,  325,  375,  376,
+ /*   380 */   377,  373,  372,  368,  367,  369,  370,  371,  378,  379,
+ /*   390 */   255,  354,  243,  229,  206,  342,   18,  239,  242,  241,
+ /*   400 */   248,  266,  300,  330,  240,   50,   47,   48,   44,   10,
+ /*   410 */    13,  305,  306,   12,   11,  340,  341,   40,   20,  225,
+ /*   420 */   165,  176,  184,   18,   18,   18,  253,  215,  251,  325,
+ /*   430 */   325,  375,  376,  377,  373,  372,  368,  367,  369,  370,
+ /*   440 */   371,  378,  379,  304,  268,  159,  207,  207,  247,  206,
+ /*   450 */   148,   41,  195,  350,  325,   27,   33,   43,   50,   47,
+ /*   460 */    48,   44,   10,   13,  305,  306,   12,   11,  340,  341,
+ /*   470 */    40,   20,  163,  225,  328,  199,  133,   29,  187,   23,
+ /*   480 */   250,  325,  101,  225,  375,  376,  377,  373,  372,  368,
+ /*   490 */   367,  369,  370,  371,  378,  379,  225,  298,  207,  334,
+ /*   500 */   225,   45,  312,  103,  299,  192,  154,  364,   18,  302,
+ /*   510 */   135,  317,  285,   35,  173,  203,  320,    3,  236,    6,
+ /*   520 */   108,   41,  232,  294,  303,  134,  313,   43,  130,  249,
+ /*   530 */   329,  231,  250,  225,  280,   50,   47,   48,   44,   10,
+ /*   540 */    13,  305,  306,   12,   11,  340,  341,   40,   20,  336,
+ /*   550 */    36,  166,  212,  230,  332,  228,  338,    8,  132,  330,
+ /*   560 */   325,  375,  376,  377,  373,  372,  368,  367,  369,  370,
+ /*   570 */   371,  378,  379,  225,  312,  345,   37,  362,  141,  312,
+ /*   580 */    94,   77,  135,  156,  236,  182,  173,  135,  122,  204,
+ /*   590 */   315,  386,  365,  225,  232,  294,  303,  137,  313,  232,
+ /*   600 */   294,  303,  125,  313,   41,  222,  333,  180,  277,  337,
+ /*   610 */    43,  225,   50,   47,   48,   44,   10,   13,  305,  306,
+ /*   620 */    12,   11,  340,  341,   40,   20,  136,  335,  316,    5,
+ /*   630 */    22,  197,  269,   34,  173,  148,  126,  116,  375,  376,
+ /*   640 */   377,  373,  372,  368,  367,  369,  370,  371,  378,  379,
+ /*   650 */   225,  312,  298,  225,  292,  141,  312,  258,   77,  135,
+ /*   660 */   153,  183,  318,  301,  135,  175,  284,  315,  386,  461,
+ /*   670 */   117,  232,  294,  303,  325,  313,  232,  294,  303,  382,
+ /*   680 */   313,  461,  220,  110,  329,  298,  318,  461,  329,   50,
+ /*   690 */    47,   48,   44,   10,   13,  305,  306,   12,   11,  340,
+ /*   700 */   341,   40,   20,  225,   30,  191,   46,  189,  314,  107,
+ /*   710 */   329,  329,  146,   97,  102,  375,  376,  377,  373,  372,
+ /*   720 */   368,  367,  369,  370,  371,  378,  379,  298,  298,  298,
+ /*   730 */   329,  329,  329,  329,  329,  329,  329,  329,  329,  329,
+ /*   740 */   329,  329,   50,   47,   48,   44,   10,   13,  305,  306,
+ /*   750 */    12,   11,  340,  341,   40,   20,  225,  329,  329,  329,
+ /*   760 */   329,  329,  329,  329,  329,  114,  160,  115,  375,  376,
+ /*   770 */   377,  373,  372,  368,  367,  369,  370,  371,  378,  379,
+ /*   780 */   298,  298,  298,  329,  329,  329,  329,  329,  329,  329,
+ /*   790 */   329,  329,  329,  329,  283,   50,   47,   48,   44,   10,
+ /*   800 */    13,  305,  306,   12,   11,  340,  341,   40,   20,  329,
+ /*   810 */   225,  329,  329,  329,  329,  329,  329,  329,  329,  329,
+ /*   820 */   329,  375,  376,  377,  373,  372,  368,  367,  369,  370,
+ /*   830 */   371,  378,  379,  200,  329,  329,  329,  329,  329,  329,
+ /*   840 */   329,  329,  329,  329,  329,  329,  329,  329,  329,   50,
+ /*   850 */    47,   48,   44,   10,   13,  305,  306,   12,   11,  340,
+ /*   860 */   341,   40,   20,  225,  329,  329,  329,  329,  329,  329,
+ /*   870 */   329,  329,  329,  329,  329,  375,  376,  377,  373,  372,
+ /*   880 */   368,  367,  369,  370,  371,  378,  379,  329,  329,  329,
+ /*   890 */   329,  329,  329,  329,  329,  329,  329,  329,  329,  329,
+ /*   900 */   329,  329,   50,   47,   48,   44,   10,   13,  305,  306,
+ /*   910 */    12,   11,  340,  341,   40,   20,  329,  329,  329,  329,
+ /*   920 */   329,  329,  329,  329,  329,  329,  329,  290,  375,  376,
+ /*   930 */   377,  373,  372,  368,  367,  369,  370,  371,  378,  379,
+ /*   940 */   225,  312,  329,  225,  329,  141,  312,  329,   77,  135,
+ /*   950 */   152,  329,  329,  329,  135,  158,  208,  315,  386,  458,
+ /*   960 */   329,  232,  294,  303,  325,  313,  232,  294,  303,  329,
+ /*   970 */   313,  458,  223,  329,  329,  329,  318,  458,  329,   50,
+ /*   980 */    47,   48,   44,   10,   13,  305,  306,   12,   11,  340,
+ /*   990 */   341,   40,   20,  225,  329,  329,   46,  329,  329,  329,
+ /*  1000 */   329,  329,  329,  329,  329,  375,  376,  377,  373,  372,
+ /*  1010 */   368,  367,  369,  370,  371,  378,  379,  329,  329,  329,
+ /*  1020 */   329,  329,  329,  329,  329,  329,  329,  329,  329,  329,
+ /*  1030 */   329,  329,   50,   47,   48,   44,   10,   13,  305,  306,
+ /*  1040 */    12,   11,  340,  341,   40,   20,  329,  329,  329,  329,
+ /*  1050 */   329,  329,  329,  329,  329,  329,  329,  329,  375,  376,
+ /*  1060 */   377,  373,  372,  368,  367,  369,  370,  371,  378,  379,
+ /*  1070 */   329,  329,  329,   50,   47,   48,   44,   10,   13,  305,
+ /*  1080 */   306,   12,   11,  340,  341,   40,   20,  329,  329,  329,
+ /*  1090 */   329,  329,  329,  329,  329,  329,  329,  329,  329,  375,
+ /*  1100 */   376,  377,  373,  372,  368,  367,  369,  370,  371,  378,
+ /*  1110 */   379,  329,  329,  329,  329,  329,   42,  329,  145,  211,
+ /*  1120 */   329,  329,    6,  108,  329,  279,  329,  312,  134,  329,
+ /*  1130 */   329,  150,  249,  329,  231,  135,  235,   41,   39,  329,
+ /*  1140 */   329,   52,  329,   43,  311,  329,  312,  232,  294,  303,
+ /*  1150 */   147,  313,  329,  170,  135,  329,   51,   49,  331,  237,
+ /*  1160 */   296,  329,  325,  106,    1,  278,  232,  294,  303,  329,
+ /*  1170 */   313,  155,  329,   42,  318,  145,  216,  329,   96,    6,
+ /*  1180 */   108,   18,  329,  226,  317,  134,  329,  313,  329,  249,
+ /*  1190 */   329,  231,  329,  235,   41,   39,  256,  329,   52,  329,
+ /*  1200 */    43,  329,  312,  329,  329,  329,  141,  329,  329,   66,
+ /*  1210 */   119,  238,  329,   51,   49,  331,  237,  296,  315,  386,
+ /*  1220 */   106,    1,  232,  294,  303,  329,  313,  270,  329,  329,
+ /*  1230 */    42,  329,  140,   92,  329,   96,    6,  108,   18,   41,
+ /*  1240 */   169,  317,  134,  329,  273,   43,  249,  329,  231,  325,
+ /*  1250 */   235,   41,   39,  244,  329,   52,   41,   43,  329,  312,
+ /*  1260 */   329,  318,   43,  141,  329,  329,   67,  135,  225,  329,
+ /*  1270 */    51,   49,  331,  237,  296,  315,  386,  106,    1,  224,
+ /*  1280 */   294,  303,  329,  313,  310,  329,  329,   42,  329,  145,
+ /*  1290 */   213,  329,   96,    6,  108,  329,   41,  329,  329,  134,
+ /*  1300 */   329,  323,   43,  249,  329,  231,  329,  235,  329,   39,
+ /*  1310 */   329,  329,   52,   41,  329,  329,  312,  329,  329,   43,
+ /*  1320 */   141,   46,  329,   86,  135,  329,  329,   51,   49,  331,
+ /*  1330 */   237,  296,  315,  386,  106,    1,  232,  294,  303,  329,
+ /*  1340 */   313,  274,  329,  329,   42,  329,  142,  216,  329,   96,
+ /*  1350 */     6,  108,  329,   41,  329,  329,  134,  329,  348,   43,
+ /*  1360 */   249,  329,  231,  329,  235,  329,    7,  329,  329,   52,
+ /*  1370 */    41,  329,  329,  312,  329,  329,   43,  141,  329,  329,
+ /*  1380 */    90,  135,  329,  329,   51,   49,  331,  237,  296,  315,
+ /*  1390 */   386,  106,    1,  232,  294,  303,  329,  313,  295,  329,
+ /*  1400 */   329,   42,  329,  138,  216,  329,   96,    6,  108,  329,
+ /*  1410 */    41,  329,  329,  134,  329,  322,   43,  249,  329,  231,
+ /*  1420 */   329,  235,  329,   39,  329,  329,   52,   41,  329,  329,
+ /*  1430 */   312,  329,  329,   43,  141,  329,  329,   87,  135,  329,
+ /*  1440 */   329,   51,   49,  331,  237,  296,  315,  386,  106,    1,
+ /*  1450 */   232,  294,  303,  329,  313,  384,  329,  329,   42,  329,
+ /*  1460 */   131,  216,  329,   96,    6,  108,  329,   41,  329,  329,
+ /*  1470 */   134,  329,  380,   43,  249,  329,  231,  329,  235,  329,
+ /*  1480 */    15,  329,  329,   52,   41,  329,  329,  312,  329,  329,
+ /*  1490 */    43,  141,  329,  329,   79,  135,  329,  329,   51,   49,
+ /*  1500 */   331,  237,  296,  315,  386,  106,    1,  232,  294,  303,
+ /*  1510 */   329,  313,  272,  329,  329,   42,  329,  145,  210,  329,
+ /*  1520 */    96,    6,  108,  329,   41,  329,  329,  134,  329,  349,
+ /*  1530 */    43,  249,  329,  231,  329,  221,  329,   39,  329,  329,
+ /*  1540 */    52,   41,  329,  329,  312,  329,  329,   43,  141,  329,
+ /*  1550 */   329,   70,  135,  329,  329,   51,   49,  331,  237,  296,
+ /*  1560 */   315,  386,  106,    1,  232,  294,  303,  329,  313,  324,
+ /*  1570 */   329,  329,   42,  329,  145,  209,  329,   96,    6,  108,
+ /*  1580 */   329,   41,  329,  329,  134,  329,  326,   43,  249,  329,
+ /*  1590 */   231,  329,  235,  329,   39,  329,  329,   52,   41,  329,
+ /*  1600 */   329,  312,  329,  329,   43,  141,  329,  329,   74,  135,
+ /*  1610 */   329,  329,   51,   49,  331,  237,  296,  315,  386,  106,
+ /*  1620 */     1,  232,  294,  303,  329,  313,  262,  329,  329,   42,
+ /*  1630 */   329,  131,  214,  329,   96,    6,  108,  329,   41,  329,
+ /*  1640 */   329,  134,  329,  327,   43,  249,  329,  231,  329,  235,
+ /*  1650 */   329,   15,  329,  329,   52,   41,  329,  329,  312,  329,
+ /*  1660 */   329,   43,  141,  329,  329,   53,  135,  329,  329,   51,
+ /*  1670 */    49,  331,  237,  296,  315,  386,  106,  329,  232,  294,
+ /*  1680 */   303,  329,  313,  286,  329,  329,   42,  329,  131,  216,
+ /*  1690 */   329,   96,    6,  108,  329,   41,  329,  329,  134,  329,
+ /*  1700 */   343,   43,  249,  329,  231,  329,  235,  329,   15,  329,
+ /*  1710 */   329,   52,   41,  329,  329,  312,  329,  329,   43,  118,
+ /*  1720 */   329,  329,   76,  135,  329,  329,   51,   49,  331,  237,
+ /*  1730 */   296,  315,  386,  106,  329,  232,  294,  303,  329,  313,
+ /*  1740 */   329,  329,  329,  329,  504,  329,  329,  329,   96,  329,
+ /*  1750 */   357,  504,  329,  504,  504,  364,  504,  504,  329,  329,
+ /*  1760 */   329,   35,  504,  329,  504,    2,  504,    6,  108,  329,
+ /*  1770 */   198,  174,  329,  134,  329,  329,  329,  249,  329,  231,
+ /*  1780 */   325,  504,  329,   21,    9,  329,  329,  329,  144,  329,
+ /*  1790 */   329,  329,  504,  329,  312,   99,  179,  206,  141,  329,
+ /*  1800 */   329,   58,  135,  329,  329,  325,  504,  329,   21,    9,
+ /*  1810 */   315,  386,  329,  312,  232,  294,  303,  141,  313,  329,
+ /*  1820 */    71,  135,  206,  344,   37,  362,  329,  329,  329,  315,
+ /*  1830 */   386,  329,  329,  232,  294,  303,  312,  313,  329,  329,
+ /*  1840 */   141,  329,  329,   72,  135,  329,  329,  312,  329,  329,
+ /*  1850 */   329,  141,  315,  386,   65,  135,  232,  294,  303,  329,
+ /*  1860 */   313,  329,  329,  315,  386,  329,  329,  232,  294,  303,
+ /*  1870 */   329,  313,  329,  329,  312,  198,  167,  329,  141,  329,
+ /*  1880 */   329,   69,  135,  329,  329,  325,  329,  329,   21,    9,
+ /*  1890 */   315,  386,  329,  329,  232,  294,  303,  312,  313,  329,
+ /*  1900 */   329,  141,  206,  329,   85,  135,  329,  312,  329,  329,
+ /*  1910 */   329,  149,  329,  315,  386,  135,  312,  232,  294,  303,
+ /*  1920 */   141,  313,  329,   81,  135,  329,  329,  232,  294,  303,
+ /*  1930 */   329,  313,  315,  386,  329,  329,  232,  294,  303,  312,
+ /*  1940 */   313,  329,  329,  141,  329,  329,   82,  135,  329,  329,
+ /*  1950 */   312,  329,  329,  329,  141,  315,  386,   63,  135,  232,
+ /*  1960 */   294,  303,  329,  313,  329,  329,  315,  386,  329,  329,
+ /*  1970 */   232,  294,  303,  329,  313,  329,  312,  329,  329,  329,
+ /*  1980 */   141,  329,  329,   73,  135,  329,  329,  312,  329,  329,
+ /*  1990 */   329,  141,  315,  386,   83,  135,  232,  294,  303,  329,
+ /*  2000 */   313,  329,  329,  315,  386,  329,  312,  232,  294,  303,
+ /*  2010 */   141,  313,  329,   89,  135,  329,  329,  329,  329,  329,
+ /*  2020 */   329,  329,  315,  386,  329,  312,  232,  294,  303,  111,
+ /*  2030 */   313,  329,   68,  135,  329,  329,  312,  329,  329,  329,
+ /*  2040 */   141,  315,  386,   62,  135,  232,  294,  303,  329,  313,
+ /*  2050 */   329,  329,  315,  386,  329,  329,  232,  294,  303,  329,
+ /*  2060 */   313,  329,  312,  329,  329,  329,  141,  329,  329,   61,
+ /*  2070 */   135,  329,  329,  312,  329,  329,  329,  141,  315,  386,
+ /*  2080 */    91,  135,  232,  294,  303,  329,  313,  329,  329,  315,
+ /*  2090 */   386,  329,  312,  232,  294,  303,  141,  313,  329,   78,
+ /*  2100 */   135,  329,  329,  329,  329,  329,  329,  329,  315,  386,
+ /*  2110 */   329,  312,  232,  294,  303,  141,  313,  329,   66,  135,
+ /*  2120 */   329,  329,  312,  329,  329,  329,  141,  315,  386,   80,
+ /*  2130 */   135,  232,  294,  303,  329,  313,  329,  329,  315,  386,
+ /*  2140 */   329,  329,  232,  294,  303,  329,  313,  329,  312,  329,
+ /*  2150 */   329,  329,  113,  329,  329,   88,  135,  329,  329,  312,
+ /*  2160 */   329,  329,  329,  112,  315,  386,   84,  135,  232,  294,
+ /*  2170 */   303,  329,  313,  329,  329,  315,  386,  329,  312,  232,
+ /*  2180 */   294,  303,  141,  313,  329,   57,  135,  329,  329,  329,
+ /*  2190 */   329,  329,  329,  329,  315,  386,  329,  312,  232,  294,
+ /*  2200 */   303,   93,  313,  329,   59,  121,  329,  329,  312,  329,
+ /*  2210 */   329,  329,  141,  315,  386,   75,  135,  232,  294,  303,
+ /*  2220 */   329,  313,  329,  329,  315,  386,  329,  329,  232,  294,
+ /*  2230 */   303,  329,  313,  329,  312,  329,  329,  329,  141,  329,
+ /*  2240 */   329,   60,  135,  329,  329,  312,  329,  329,  329,  141,
+ /*  2250 */   315,  386,   64,  135,  232,  294,  303,  329,  313,  329,
+ /*  2260 */   329,  315,  386,  329,  312,  232,  294,  303,  120,  313,
+ /*  2270 */   329,   55,  135,  329,  329,  329,  329,  329,  329,  329,
+ /*  2280 */   315,  386,  329,  312,  232,  294,  303,   93,  313,  329,
+ /*  2290 */    56,  121,  225,  329,  312,  329,  198,  164,  157,  315,
+ /*  2300 */   386,  329,  135,  219,  294,  303,  325,  313,  352,   21,
+ /*  2310 */     9,  287,  234,  329,  232,  294,  303,  329,  313,  329,
+ /*  2320 */    41,  329,  329,  206,  312,  329,   43,  329,  151,    2,
+ /*  2330 */   329,  329,  135,  329,  329,  329,  329,  329,  329,  329,
+ /*  2340 */   198,  168,  329,  329,  232,  294,  303,  329,  313,  329,
+ /*  2350 */   325,  329,  144,   21,    9,  198,  171,  329,  329,  329,
+ /*  2360 */   329,  329,  329,  329,  329,  325,  329,  206,   21,    9,
+ /*  2370 */   329,  329,  329,  329,  329,  329,  329,  329,  329,  329,
+ /*  2380 */   329,  329,  206,
     );
     static public $yy_lookahead = array(
- /*     0 */     1,   83,   84,   85,    3,    4,    5,    6,    7,    8,
- /*    10 */     9,   10,   11,   12,   13,   98,   90,   16,   81,   82,
- /*    20 */    83,   84,   85,   22,   23,   99,   27,   16,   29,   28,
- /*    30 */    19,   20,  109,   32,   33,   34,   25,  111,   39,   40,
+ /*     0 */     1,    3,    4,    5,    6,    7,    8,    9,   10,   11,
+ /*    10 */    12,   13,   16,   98,   16,   19,   17,   17,  113,  114,
+ /*    20 */    22,   23,   16,   97,   18,   19,   28,  112,   29,   29,
+ /*    30 */    32,   33,   34,   16,   35,   35,   19,   20,  112,   40,
  /*    40 */    41,   42,   43,   44,   45,   46,   47,   48,   49,   50,
- /*    50 */    51,   52,    4,    5,    6,    7,    8,   16,   36,   84,
- /*    60 */    38,   13,   14,   15,   65,   66,   67,   68,   69,   70,
- /*    70 */    71,   72,   73,   74,   75,   76,    1,   84,   37,   89,
- /*    80 */    90,   88,   37,   16,   91,   92,   19,   20,   17,   99,
- /*    90 */    17,   20,   17,  100,  101,  120,  121,  104,  105,  106,
- /*   100 */    29,  108,   29,   58,   29,   60,  116,   31,   37,   64,
- /*   110 */    37,  118,  119,   37,   39,   40,   41,   42,   43,   44,
- /*   120 */    45,   46,   47,   48,   49,   50,   51,   52,   61,   89,
- /*   130 */    90,   60,   36,   60,   38,   16,   60,   18,   19,   99,
- /*   140 */    65,   66,   67,   68,   69,   70,   71,   72,   73,   74,
- /*   150 */    75,   76,    1,   84,   35,    1,  116,   88,   21,   89,
- /*   160 */    91,   92,   93,   16,   16,   97,   19,   19,   17,  100,
- /*   170 */   101,   17,   19,  104,  105,  106,   29,  108,   31,  111,
- /*   180 */    29,   89,    1,   29,   30,   16,  116,  117,   19,   20,
- /*   190 */    39,   40,   41,   42,   43,   44,   45,   46,   47,   48,
- /*   200 */    49,   50,   51,   52,   25,   89,   90,   53,  116,   61,
- /*   210 */    16,    1,   31,   19,   61,   99,   65,   66,   67,   68,
- /*   220 */    69,   70,   71,   72,   73,   74,   75,   76,    1,   84,
- /*   230 */    58,    1,  116,   88,   53,   63,   91,   92,   93,   16,
- /*   240 */    20,   21,   19,   86,   17,  100,  101,   17,   92,  104,
- /*   250 */   105,  106,   29,  108,   31,   61,   29,   78,   98,   29,
- /*   260 */   104,  112,  113,   53,  108,  113,   39,   40,   41,   42,
- /*   270 */    43,   44,   45,   46,   47,   48,   49,   50,   51,   52,
- /*   280 */    60,   90,   90,   53,  110,  109,  112,  113,   20,   21,
- /*   290 */    99,   99,   65,   66,   67,   68,   69,   70,   71,   72,
- /*   300 */    73,   74,   75,   76,    1,   84,   98,    1,  116,   88,
- /*   310 */    84,   62,   91,   92,   88,   90,   64,    1,   92,   21,
- /*   320 */    17,  100,  101,   17,   99,  104,  105,  106,   60,  108,
- /*   330 */   104,  105,  106,   17,  108,   29,  111,   21,   18,   19,
- /*   340 */   119,   14,   39,   40,   41,   42,   43,   44,   45,   46,
- /*   350 */    47,   48,   49,   50,   51,   52,   58,  112,  113,   53,
- /*   360 */    16,   63,   18,   19,   92,   93,   94,   19,   65,   66,
- /*   370 */    67,   68,   69,   70,   71,   72,   73,   74,   75,   76,
- /*   380 */     1,   84,   62,    1,   90,   88,   84,   19,   91,   92,
- /*   390 */    88,   90,   58,   99,   92,   90,   17,  100,  101,   17,
- /*   400 */    99,  104,  105,  106,   99,  108,  104,  105,  106,   36,
- /*   410 */   108,   29,  115,   36,   19,   38,  111,  116,   39,   40,
- /*   420 */    41,   42,   43,   44,   45,   46,   47,   48,   49,   50,
- /*   430 */    51,   52,    1,   90,   37,   53,   89,   64,    2,  109,
- /*   440 */    16,  111,   99,   19,   65,   66,   67,   68,   69,   70,
- /*   450 */    71,   72,   73,   74,   75,   76,   20,   60,   16,  116,
- /*   460 */    90,   19,  109,  116,  111,   18,   18,   19,   19,   99,
- /*   470 */    39,   40,   41,   42,   43,   44,   45,   46,   47,   48,
- /*   480 */    49,   50,   51,   52,   37,    1,  116,   17,   16,   16,
- /*   490 */    16,   19,   19,   19,   89,   25,   65,   66,   67,   68,
- /*   500 */    69,   70,   71,   72,   73,   74,   75,   76,   24,   78,
- /*   510 */    24,  107,   92,   93,    1,   92,   93,   85,  114,   87,
- /*   520 */    19,  116,   36,   39,   40,   41,   42,   43,   44,   45,
- /*   530 */    46,   47,   48,   49,   50,   51,   52,    1,   19,   18,
- /*   540 */    20,   35,   29,   62,   19,    2,   96,   96,   96,   65,
- /*   550 */    66,   67,   68,   69,   70,   71,   72,   73,   74,   75,
- /*   560 */    76,  111,  111,  111,  107,   54,   30,   18,   26,   18,
- /*   570 */     2,  114,   18,   18,   96,   39,   40,   41,   42,   43,
- /*   580 */    44,   45,   46,   47,   48,   49,   50,   51,   52,  111,
- /*   590 */    90,   19,   19,   35,   38,   25,   37,   19,   37,   99,
- /*   600 */    96,   65,   66,   67,   68,   69,   70,   71,   72,   73,
- /*   610 */    74,   75,   76,    1,   84,  111,    1,   99,   88,   84,
- /*   620 */   117,   91,   92,   88,  110,  116,  109,   92,   90,   17,
- /*   630 */   100,  101,   17,   20,  104,  105,  106,   99,  108,  104,
- /*   640 */   105,  106,    1,  108,  111,  115,   29,   29,  114,  111,
- /*   650 */    29,   39,   40,   41,   42,   43,   44,   45,   46,   47,
- /*   660 */    48,   49,   50,   51,   52,    1,   95,    2,   53,   95,
- /*   670 */   122,   58,  109,  122,  122,   96,   96,   65,   66,   67,
- /*   680 */    68,   69,   70,   71,   72,   73,   74,   75,   76,   17,
- /*   690 */   111,  111,  122,  122,  122,  122,  122,  122,  122,  122,
- /*   700 */   122,   29,   38,   39,   40,   41,   42,   43,   44,   45,
- /*   710 */    46,   47,   48,   49,   50,   51,   52,    1,  122,  122,
- /*   720 */   122,  122,  122,  122,  122,  122,   96,  122,    1,   65,
- /*   730 */    66,   67,   68,   69,   70,   71,   72,   73,   74,   75,
- /*   740 */    76,  111,   84,  122,   17,  122,  122,  122,  122,  122,
- /*   750 */   122,  122,  122,  122,   38,   39,   40,   41,   42,   43,
- /*   760 */    44,   45,   46,   47,   48,   49,   50,   51,   52,    1,
- /*   770 */   122,  122,  122,  122,  122,  122,  122,  122,   96,  121,
- /*   780 */    96,   65,   66,   67,   68,   69,   70,   71,   72,   73,
- /*   790 */    74,   75,   76,  111,  122,  111,  122,   29,  122,  122,
- /*   800 */   122,  122,  122,  122,  122,  122,   21,   39,   40,   41,
- /*   810 */    42,   43,   44,   45,   46,   47,   48,   49,   50,   51,
- /*   820 */    52,    1,  122,  122,  122,  122,  122,  122,  122,  122,
- /*   830 */   122,  122,  122,   65,   66,   67,   68,   69,   70,   71,
- /*   840 */    72,   73,   74,   75,   76,   60,  122,  122,  122,  122,
- /*   850 */   122,  122,  122,  122,  122,  122,  122,  122,  122,   39,
- /*   860 */    40,   41,   42,   43,   44,   45,   46,   47,   48,   49,
- /*   870 */    50,   51,   52,  122,  122,  122,  122,  122,  122,  122,
- /*   880 */   122,  122,  122,  122,   64,   65,   66,   67,   68,   69,
- /*   890 */    70,   71,   72,   73,   74,   75,   76,    1,  122,  122,
- /*   900 */   122,  122,   89,   84,  122,  122,   16,   88,   10,   19,
- /*   910 */    17,   92,    1,   17,   16,  102,  103,    1,    2,   29,
- /*   920 */    22,   23,   29,  104,  105,  106,   28,  108,   17,  116,
- /*   930 */    32,   33,   34,   17,  122,   39,   40,   41,   42,   43,
- /*   940 */    44,   45,   46,   47,   48,   49,   50,   51,   52,    1,
- /*   950 */     2,  122,  122,  122,  122,  122,  122,  122,  122,  122,
- /*   960 */   122,   65,   66,   67,   68,   69,   70,   71,   72,   73,
- /*   970 */    74,   75,   76,  122,  122,   77,   78,   79,  122,  122,
- /*   980 */   122,  122,  122,  122,  122,  122,  122,   39,   40,   41,
- /*   990 */    42,   43,   44,   45,   46,   47,   48,   49,   50,   51,
- /*  1000 */    52,    1,  122,  122,  122,  122,  122,  122,  122,  122,
- /*  1010 */   122,  122,  122,   65,   66,   67,   68,   69,   70,   71,
- /*  1020 */    72,   73,   74,   75,   76,  122,  122,  122,  122,  122,
- /*  1030 */   122,  122,  122,  122,  122,  122,  122,  122,  122,   39,
- /*  1040 */    40,   41,   42,   43,   44,   45,   46,   47,   48,   49,
- /*  1050 */    50,   51,   52,  122,  122,  122,  122,  122,  122,  122,
- /*  1060 */   122,  122,  122,  122,  122,   65,   66,   67,   68,   69,
- /*  1070 */    70,   71,   72,   73,   74,   75,   76,    1,    1,   39,
- /*  1080 */    40,   41,   42,   43,   44,   45,   46,   47,   48,   49,
- /*  1090 */    50,   51,   52,   17,   17,  122,  122,  122,  122,  122,
- /*  1100 */   122,  122,  122,  122,  122,   65,   66,   67,   68,   69,
- /*  1110 */    70,   71,   72,   73,   74,   75,   76,    1,  122,    1,
- /*  1120 */   122,  122,   16,  122,   18,   19,  122,  122,   22,   23,
- /*  1130 */   122,  122,   17,   17,   28,   17,   10,   21,   32,   33,
- /*  1140 */    34,   35,   16,   37,   29,   29,   40,   29,   22,   23,
- /*  1150 */   122,  122,  122,   37,   28,  122,  122,  122,   32,   33,
- /*  1160 */    34,   55,   56,   57,   58,   59,  122,   84,   62,   63,
- /*  1170 */    64,   88,  122,  122,  122,   92,   60,  122,   16,  122,
- /*  1180 */    18,   19,  122,   77,   22,   23,   17,  104,  105,  106,
- /*  1190 */    28,  108,  122,  122,   32,   33,   34,   35,   29,   37,
- /*  1200 */   122,   17,   40,   77,   78,   79,  122,   84,  122,  122,
- /*  1210 */   122,   88,  122,   29,   17,   92,  122,   55,   56,   57,
- /*  1220 */    58,   59,  122,   17,   62,   63,   29,  104,  105,  106,
- /*  1230 */   122,  108,   17,   17,   16,   29,   18,   19,  122,   77,
- /*  1240 */    22,   23,   17,  122,   29,   29,   28,   17,  122,   17,
- /*  1250 */    32,   33,   34,   35,   29,   37,  122,   17,   40,   29,
- /*  1260 */    17,   29,  122,   84,  122,  122,  122,   88,  122,   29,
- /*  1270 */    17,   92,   29,   55,   56,   57,   58,   59,  122,   17,
- /*  1280 */    62,   63,   29,  104,  105,  106,  122,  108,   17,   17,
- /*  1290 */    16,   29,   18,   19,  122,   77,   22,   23,   17,  122,
- /*  1300 */    29,   29,   28,   17,  122,   17,   32,   33,   34,   35,
- /*  1310 */    29,   37,  122,  122,   40,   29,  122,   29,  122,  122,
- /*  1320 */   122,  122,  122,  122,  122,  122,  122,  122,  122,   55,
- /*  1330 */    56,   57,   58,   59,  122,  122,   62,   63,  122,  122,
- /*  1340 */   122,  122,  122,  122,  122,  122,   16,  122,   18,   19,
- /*  1350 */   122,   77,   22,   23,  122,  122,  122,  122,   28,  122,
- /*  1360 */   122,  122,   32,   33,   34,   35,  122,   37,  122,  122,
- /*  1370 */    40,  122,  122,  122,  122,  122,  122,  122,  122,  122,
- /*  1380 */   122,  122,  122,  122,  122,   55,   56,   57,   58,   59,
- /*  1390 */   122,  122,   62,   63,  122,  122,  122,  122,  122,  122,
- /*  1400 */   122,  122,   16,  122,   18,   19,  122,   77,   22,   23,
- /*  1410 */   122,  122,  122,  122,   28,  122,  122,  122,   32,   33,
- /*  1420 */    34,   35,  122,   37,  122,  122,   40,  122,  122,  122,
- /*  1430 */   122,  122,  122,  122,  122,  122,  122,  122,  122,  122,
- /*  1440 */   122,   55,   56,   57,   58,   59,  122,  122,   62,   63,
- /*  1450 */   122,  122,  122,  122,  122,  122,  122,  122,   16,  122,
- /*  1460 */    18,   19,  122,   77,   22,   23,  122,  122,  122,  122,
- /*  1470 */    28,  122,  122,  122,   32,   33,   34,   35,  122,   37,
- /*  1480 */   122,  122,   40,  122,  122,  122,  122,  122,  122,  122,
- /*  1490 */   122,  122,  122,  122,  122,  122,  122,   55,   56,   57,
- /*  1500 */    58,   59,  122,  122,   62,   63,  122,  122,  122,  122,
- /*  1510 */   122,  122,  122,  122,   16,  122,   18,   19,  122,   77,
- /*  1520 */    22,   23,  122,  122,  122,  122,   28,  122,  122,  122,
- /*  1530 */    32,   33,   34,   35,  122,   37,  122,  122,   40,  122,
- /*  1540 */   122,  122,  122,  122,  122,  122,  122,  122,  122,  122,
- /*  1550 */   122,  122,  122,   55,   56,   57,   58,   59,  122,  122,
- /*  1560 */    62,   63,  122,  122,  122,  122,  122,  122,  122,  122,
- /*  1570 */    16,  122,   18,   19,  122,   77,   22,   23,  122,  122,
- /*  1580 */   122,  122,   28,  122,  122,  122,   32,   33,   34,   35,
- /*  1590 */   122,   37,  122,  122,   40,  122,  122,  122,  122,  122,
- /*  1600 */   122,  122,  122,  122,  122,  122,  122,  122,  122,   55,
- /*  1610 */    56,   57,   58,   59,  122,  122,   62,   63,  122,  122,
- /*  1620 */   122,  122,  122,  122,  122,  122,   16,  122,   18,   19,
- /*  1630 */   122,   77,   22,   23,  122,  122,  122,  122,   28,  122,
- /*  1640 */   122,  122,   32,   33,   34,   35,  122,   37,  122,  122,
- /*  1650 */    40,  122,  122,  122,  122,  122,  122,  122,  122,  122,
- /*  1660 */   122,  122,  122,  122,  122,   55,   56,   57,   58,   59,
- /*  1670 */   122,  122,   62,   63,  122,  122,  122,  122,  122,  122,
- /*  1680 */   122,  122,   16,  122,   18,   19,  122,   77,   22,   23,
- /*  1690 */   122,  122,  122,  122,   28,  122,  122,  122,   32,   33,
- /*  1700 */    34,   35,  122,   37,  122,  122,   40,  122,  122,  122,
- /*  1710 */   122,  122,  122,  122,  122,  122,  122,  122,  122,   89,
- /*  1720 */    90,   55,   56,   57,   58,   59,  122,  122,   62,   99,
- /*  1730 */   122,  122,  102,  103,  122,  122,  122,  122,   16,  122,
- /*  1740 */    18,   19,  122,   77,   22,   23,  116,  122,  122,  122,
- /*  1750 */    28,  122,  122,  122,   32,   33,   34,   35,  122,   37,
- /*  1760 */   122,  122,   40,  122,  122,  122,  122,  122,  122,  122,
- /*  1770 */   122,  122,  122,  122,  122,  122,  122,   55,   56,   57,
- /*  1780 */    58,   59,  122,  122,   62,  122,  122,  122,  122,  122,
- /*  1790 */   122,  122,  122,  122,  122,   17,   89,   90,  122,   77,
- /*  1800 */   122,  122,   24,  122,   26,   27,   99,   29,   30,  102,
- /*  1810 */   103,  122,  122,   84,   36,   37,   38,   88,  122,  122,
- /*  1820 */    91,   92,  122,  116,  122,  122,  122,  122,  122,  100,
- /*  1830 */   101,   53,  122,  104,  105,  106,  122,  108,   60,  122,
- /*  1840 */   122,   84,   64,  122,  115,   88,  122,  122,   91,   92,
- /*  1850 */   122,  122,  122,  122,  122,  122,   78,  100,  101,  122,
- /*  1860 */   122,  104,  105,  106,   84,  108,  122,  122,   88,  122,
- /*  1870 */   122,   91,   92,  122,  122,  122,  122,  122,  122,  122,
- /*  1880 */   100,  101,  122,  122,  104,  105,  106,   84,  108,  122,
- /*  1890 */   122,   88,  122,  122,   91,   92,  122,  122,   84,  122,
- /*  1900 */   122,  122,   88,  100,  101,   91,   92,  104,  105,  106,
- /*  1910 */   122,  108,  122,  122,  100,  101,  122,  122,  104,  105,
- /*  1920 */   106,  122,  108,   84,  122,  122,  122,   88,  122,  122,
- /*  1930 */    91,   92,  122,  122,   84,  122,  122,  122,   88,  100,
- /*  1940 */   101,   91,   92,  104,  105,  106,  122,  108,  122,  122,
- /*  1950 */   100,  101,  122,   84,  104,  105,  106,   88,  108,  122,
- /*  1960 */    91,   92,  122,  122,  122,  122,  122,  122,  122,  100,
- /*  1970 */   101,  122,   84,  104,  105,  106,   88,  108,  122,   91,
- /*  1980 */    92,  122,  122,   84,  122,  122,  122,   88,  100,  101,
- /*  1990 */    91,   92,  104,  105,  106,  122,  108,  122,  122,  100,
- /*  2000 */   101,  122,  122,  104,  105,  106,  122,  108,   84,  122,
- /*  2010 */   122,  122,   88,  122,  122,   91,   92,  122,  122,   84,
- /*  2020 */   122,  122,  122,   88,  100,  101,   91,   92,  104,  105,
- /*  2030 */   106,  122,  108,  122,  122,  100,  101,  122,   84,  104,
- /*  2040 */   105,  106,   88,  108,  122,   91,   92,  122,  122,  122,
- /*  2050 */   122,  122,  122,  122,  100,  101,  122,   84,  104,  105,
- /*  2060 */   106,   88,  108,  122,   91,   92,  122,  122,   84,  122,
- /*  2070 */   122,  122,   88,  100,  101,   91,   92,  104,  105,  106,
- /*  2080 */   122,  108,  122,  122,  100,  101,  122,  122,  104,  105,
- /*  2090 */   106,  122,  108,   84,  122,  122,  122,   88,  122,  122,
- /*  2100 */    91,   92,  122,  122,   84,  122,  122,  122,   88,  100,
- /*  2110 */   101,   91,   92,  104,  105,  106,  122,  108,  122,  122,
- /*  2120 */   100,  101,  122,   84,  104,  105,  106,   88,  108,  122,
- /*  2130 */    91,   92,  122,  122,  122,  122,  122,  122,  122,  100,
- /*  2140 */   101,  122,   84,  104,  105,  106,   88,  108,  122,   91,
- /*  2150 */    92,  122,  122,   84,  122,  122,  122,   88,  100,  101,
- /*  2160 */    91,   92,  104,  105,  106,  122,  108,  122,  122,  100,
- /*  2170 */   101,  122,  122,  104,  105,  106,  122,  108,   84,  122,
- /*  2180 */   122,  122,   88,  122,  122,   91,   92,  122,  122,   84,
- /*  2190 */   122,  122,  122,   88,  100,  101,   91,   92,  104,  105,
- /*  2200 */   106,  122,  108,  122,  122,  100,  101,  122,   84,  104,
- /*  2210 */   105,  106,   88,  108,  122,   91,   92,  122,  122,  122,
- /*  2220 */   122,  122,  122,  122,  100,  101,  122,   84,  104,  105,
- /*  2230 */   106,   88,  108,  122,   91,   92,  122,  122,   84,  122,
- /*  2240 */   122,  122,   88,  100,  101,   91,   92,  104,  105,  106,
- /*  2250 */   122,  108,  122,  122,  100,  101,  122,  122,  104,  105,
- /*  2260 */   106,  122,  108,   84,  122,  122,  122,   88,  122,  122,
- /*  2270 */    91,   92,  122,  122,   84,  122,  122,  122,   88,  100,
- /*  2280 */   101,   91,   92,  104,  105,  106,  122,  108,  122,  122,
- /*  2290 */   100,  101,  122,   84,  104,  105,  106,   88,  108,  122,
- /*  2300 */    91,   92,  122,  122,  122,  122,  122,  122,  122,  100,
- /*  2310 */   101,  122,   84,  104,  105,  106,   88,  108,  122,   91,
- /*  2320 */    92,  122,  122,   84,  122,  122,  122,   88,  100,  101,
- /*  2330 */    91,   92,  104,  105,  106,  122,  108,  122,  122,  100,
- /*  2340 */   101,  122,  122,  104,  105,  106,  122,  108,   84,  122,
- /*  2350 */   122,  122,   88,  122,  122,   91,   92,  122,  122,   84,
- /*  2360 */   122,  122,  122,   88,  100,  101,   91,   92,  104,  105,
- /*  2370 */   106,  122,  108,  122,  122,  100,  101,  122,   84,  104,
- /*  2380 */   105,  106,   88,  108,  122,   91,   92,  122,  122,  122,
- /*  2390 */   122,  122,  122,  122,  100,  101,  122,   84,  104,  105,
- /*  2400 */   106,   88,  108,  122,   91,   92,  122,  122,   84,  122,
- /*  2410 */   122,  122,   88,  100,  101,   91,   92,  104,  105,  106,
- /*  2420 */   122,  108,  122,  122,  100,  101,  122,  122,  104,  105,
- /*  2430 */   106,  122,  108,   84,  122,  122,  122,   88,  122,  122,
- /*  2440 */    91,   92,  122,  122,   84,  122,  122,  122,   88,  100,
- /*  2450 */   101,   91,   92,  104,  105,  106,  122,  108,  122,  122,
- /*  2460 */   100,  101,  122,   84,  104,  105,  106,   88,  108,  122,
- /*  2470 */   122,   92,  122,  122,  122,  122,  122,  122,  122,  122,
- /*  2480 */   101,  122,   84,  104,  105,  106,   88,  108,  122,  122,
- /*  2490 */    92,  122,  122,  122,  122,   89,   90,  122,  122,  101,
- /*  2500 */   122,  122,  104,  105,  106,   99,  108,  122,  102,  103,
- /*  2510 */   122,   89,   90,  122,  122,  122,  122,  122,   89,   90,
- /*  2520 */   122,   99,  116,  122,  102,  103,  122,  122,   99,  122,
- /*  2530 */   122,  102,  103,  122,   89,   90,  122,  122,  116,  122,
- /*  2540 */   122,  122,  122,  122,   99,  116,  122,  102,  103,  122,
- /*  2550 */   122,  122,  122,  122,  122,  122,  122,  122,  122,  122,
- /*  2560 */   122,  116,
+ /*    50 */    51,   52,   53,    4,    5,    6,    7,    8,   62,   93,
+ /*    60 */    94,   95,   13,   14,   15,   66,   67,   68,   69,   70,
+ /*    70 */    71,   72,   73,   74,   75,   76,   77,    1,   85,   62,
+ /*    80 */     1,    1,   89,   38,  117,   92,   93,   82,   83,   84,
+ /*    90 */    85,   86,   38,   17,  101,  102,   17,   17,  105,  106,
+ /*   100 */   107,   86,  109,   88,   59,   29,   61,    1,   29,   30,
+ /*   110 */    65,   35,  119,  120,   35,   61,   40,   41,   42,   43,
+ /*   120 */    44,   45,   46,   47,   48,   49,   50,   51,   52,   53,
+ /*   130 */    90,   91,   59,   54,   54,   29,   16,   64,   18,   19,
+ /*   140 */   100,   35,   66,   67,   68,   69,   70,   71,   72,   73,
+ /*   150 */    74,   75,   76,   77,    1,   85,   36,  117,    1,   89,
+ /*   160 */    18,    1,   92,   93,   94,    1,   17,   20,   21,   20,
+ /*   170 */    17,  101,  102,   17,   17,  105,  106,  107,   29,  109,
+ /*   180 */    38,   17,   29,   31,   35,   29,   29,   38,   35,   90,
+ /*   190 */    38,   35,   35,   40,   41,   42,   43,   44,   45,   46,
+ /*   200 */    47,   48,   49,   50,   51,   52,   53,    1,   61,  111,
+ /*   210 */    61,  113,  114,   61,   54,   90,  117,  118,   90,   66,
+ /*   220 */    67,   68,   69,   70,   71,   72,   73,   74,   75,   76,
+ /*   230 */    77,  103,  104,   27,  110,   29,  112,    1,   84,   85,
+ /*   240 */    86,   35,  117,   20,   21,  117,   40,   41,   42,   43,
+ /*   250 */    44,   45,   46,   47,   48,   49,   50,   51,   52,   53,
+ /*   260 */     1,   91,   16,   59,   25,   19,   20,   31,   64,   16,
+ /*   270 */   100,   25,   66,   67,   68,   69,   70,   71,   72,   73,
+ /*   280 */    74,   75,   76,   77,   61,   85,   85,  117,   29,   37,
+ /*   290 */    54,   38,   18,   19,   35,   37,  110,   39,  112,   40,
+ /*   300 */    41,   42,   43,   44,   45,   46,   47,   48,   49,   50,
+ /*   310 */    51,   52,   53,    1,   90,   91,   16,   65,   79,   19,
+ /*   320 */    20,  121,  122,  122,  100,   66,   67,   68,   69,   70,
+ /*   330 */    71,   72,   73,   74,   75,   76,   77,   63,   24,   91,
+ /*   340 */    37,  117,   39,   37,   16,   39,   90,   19,  100,    2,
+ /*   350 */    19,   37,   40,   41,   42,   43,   44,   45,   46,   47,
+ /*   360 */    48,   49,   50,   51,   52,   53,    1,   90,   91,   16,
+ /*   370 */    29,   19,   19,  117,   93,   94,   35,  100,   66,   67,
+ /*   380 */    68,   69,   70,   71,   72,   73,   74,   75,   76,   77,
+ /*   390 */    62,   79,   96,   62,  117,   17,   16,   18,   19,   19,
+ /*   400 */    93,   94,   19,   25,   39,   40,   41,   42,   43,   44,
+ /*   410 */    45,   46,   47,   48,   49,   50,   51,   52,   53,    1,
+ /*   420 */    91,   91,   90,   16,   16,   16,   19,   19,   19,  100,
+ /*   430 */   100,   66,   67,   68,   69,   70,   71,   72,   73,   74,
+ /*   440 */    75,   76,   77,  108,   29,   91,  117,  117,   30,  117,
+ /*   450 */   115,   29,  113,  114,  100,   20,   96,   35,   40,   41,
+ /*   460 */    42,   43,   44,   45,   46,   47,   48,   49,   50,   51,
+ /*   470 */    52,   53,   91,    1,  118,   99,   18,   26,  110,   20,
+ /*   480 */     2,  100,   97,    1,   66,   67,   68,   69,   70,   71,
+ /*   490 */    72,   73,   74,   75,   76,   77,    1,  112,  117,   17,
+ /*   500 */     1,    2,   85,   99,   19,  110,   89,   10,   16,   19,
+ /*   510 */    93,   19,   17,   16,   21,   99,   17,   38,   59,   22,
+ /*   520 */    23,   29,  105,  106,  107,   28,  109,   35,   18,   32,
+ /*   530 */    33,   34,    2,    1,   65,   40,   41,   42,   43,   44,
+ /*   540 */    45,   46,   47,   48,   49,   50,   51,   52,   53,   17,
+ /*   550 */    20,   91,   59,   21,   36,   19,   19,   64,   19,   25,
+ /*   560 */   100,   66,   67,   68,   69,   70,   71,   72,   73,   74,
+ /*   570 */    75,   76,   77,    1,   85,   78,   79,   80,   89,   85,
+ /*   580 */    19,   92,   93,   89,   59,   63,   21,   93,   19,   17,
+ /*   590 */   101,  102,   17,    1,  105,  106,  107,   18,  109,  105,
+ /*   600 */   106,  107,   18,  109,   29,  116,   36,   63,   19,   17,
+ /*   610 */    35,    1,   40,   41,   42,   43,   44,   45,   46,   47,
+ /*   620 */    48,   49,   50,   51,   52,   53,   61,   17,  108,   38,
+ /*   630 */     2,   19,   39,   55,   21,  115,   18,   97,   66,   67,
+ /*   640 */    68,   69,   70,   71,   72,   73,   74,   75,   76,   77,
+ /*   650 */     1,   85,  112,    1,  100,   89,   85,  115,   92,   93,
+ /*   660 */    89,  110,  112,  111,   93,   91,   17,  101,  102,   17,
+ /*   670 */    97,  105,  106,  107,  100,  109,  105,  106,  107,   14,
+ /*   680 */   109,   29,  116,   87,  123,  112,  112,   35,  123,   40,
+ /*   690 */    41,   42,   43,   44,   45,   46,   47,   48,   49,   50,
+ /*   700 */    51,   52,   53,    1,    2,  110,   54,  110,  114,  110,
+ /*   710 */   123,  123,   97,   97,   97,   66,   67,   68,   69,   70,
+ /*   720 */    71,   72,   73,   74,   75,   76,   77,  112,  112,  112,
+ /*   730 */   123,  123,  123,  123,  123,  123,  123,  123,  123,  123,
+ /*   740 */   123,  123,   40,   41,   42,   43,   44,   45,   46,   47,
+ /*   750 */    48,   49,   50,   51,   52,   53,    1,  123,  123,  123,
+ /*   760 */   123,  123,  123,  123,  123,   97,   97,   97,   66,   67,
+ /*   770 */    68,   69,   70,   71,   72,   73,   74,   75,   76,   77,
+ /*   780 */   112,  112,  112,  123,  123,  123,  123,  123,  123,  123,
+ /*   790 */   123,  123,  123,  123,   39,   40,   41,   42,   43,   44,
+ /*   800 */    45,   46,   47,   48,   49,   50,   51,   52,   53,  123,
+ /*   810 */     1,  123,  123,  123,  123,  123,  123,  123,  123,  123,
+ /*   820 */   123,   66,   67,   68,   69,   70,   71,   72,   73,   74,
+ /*   830 */    75,   76,   77,   24,  123,  123,  123,  123,  123,  123,
+ /*   840 */   123,  123,  123,  123,  123,  123,  123,  123,  123,   40,
+ /*   850 */    41,   42,   43,   44,   45,   46,   47,   48,   49,   50,
+ /*   860 */    51,   52,   53,    1,  123,  123,  123,  123,  123,  123,
+ /*   870 */   123,  123,  123,  123,  123,   66,   67,   68,   69,   70,
+ /*   880 */    71,   72,   73,   74,   75,   76,   77,  123,  123,  123,
+ /*   890 */   123,  123,  123,  123,  123,  123,  123,  123,  123,  123,
+ /*   900 */   123,  123,   40,   41,   42,   43,   44,   45,   46,   47,
+ /*   910 */    48,   49,   50,   51,   52,   53,  123,  123,  123,  123,
+ /*   920 */   123,  123,  123,  123,  123,  123,  123,   65,   66,   67,
+ /*   930 */    68,   69,   70,   71,   72,   73,   74,   75,   76,   77,
+ /*   940 */     1,   85,  123,    1,  123,   89,   85,  123,   92,   93,
+ /*   950 */    89,  123,  123,  123,   93,   91,   17,  101,  102,   17,
+ /*   960 */   123,  105,  106,  107,  100,  109,  105,  106,  107,  123,
+ /*   970 */   109,   29,  116,  123,  123,  123,  112,   35,  123,   40,
+ /*   980 */    41,   42,   43,   44,   45,   46,   47,   48,   49,   50,
+ /*   990 */    51,   52,   53,    1,  123,  123,   54,  123,  123,  123,
+ /*  1000 */   123,  123,  123,  123,  123,   66,   67,   68,   69,   70,
+ /*  1010 */    71,   72,   73,   74,   75,   76,   77,  123,  123,  123,
+ /*  1020 */   123,  123,  123,  123,  123,  123,  123,  123,  123,  123,
+ /*  1030 */   123,  123,   40,   41,   42,   43,   44,   45,   46,   47,
+ /*  1040 */    48,   49,   50,   51,   52,   53,  123,  123,  123,  123,
+ /*  1050 */   123,  123,  123,  123,  123,  123,  123,  123,   66,   67,
+ /*  1060 */    68,   69,   70,   71,   72,   73,   74,   75,   76,   77,
+ /*  1070 */   123,  123,  123,   40,   41,   42,   43,   44,   45,   46,
+ /*  1080 */    47,   48,   49,   50,   51,   52,   53,  123,  123,  123,
+ /*  1090 */   123,  123,  123,  123,  123,  123,  123,  123,  123,   66,
+ /*  1100 */    67,   68,   69,   70,   71,   72,   73,   74,   75,   76,
+ /*  1110 */    77,  123,  123,  123,  123,  123,   16,  123,   18,   19,
+ /*  1120 */   123,  123,   22,   23,  123,   17,  123,   85,   28,  123,
+ /*  1130 */   123,   89,   32,   33,   34,   93,   36,   29,   38,  123,
+ /*  1140 */   123,   41,  123,   35,  102,  123,   85,  105,  106,  107,
+ /*  1150 */    89,  109,  123,   91,   93,  123,   56,   57,   58,   59,
+ /*  1160 */    60,  123,  100,   63,   64,   65,  105,  106,  107,  123,
+ /*  1170 */   109,   93,  123,   16,  112,   18,   19,  123,   78,   22,
+ /*  1180 */    23,   16,  123,  105,   19,   28,  123,  109,  123,   32,
+ /*  1190 */    33,   34,  123,   36,   29,   38,   31,  123,   41,  123,
+ /*  1200 */    35,  123,   85,  123,  123,  123,   89,  123,  123,   92,
+ /*  1210 */    93,   94,  123,   56,   57,   58,   59,   60,  101,  102,
+ /*  1220 */    63,   64,  105,  106,  107,  123,  109,   17,  123,  123,
+ /*  1230 */    16,  123,   18,   19,  123,   78,   22,   23,   16,   29,
+ /*  1240 */    91,   19,   28,  123,   17,   35,   32,   33,   34,  100,
+ /*  1250 */    36,   29,   38,   31,  123,   41,   29,   35,  123,   85,
+ /*  1260 */   123,  112,   35,   89,  123,  123,   92,   93,    1,  123,
+ /*  1270 */    56,   57,   58,   59,   60,  101,  102,   63,   64,  105,
+ /*  1280 */   106,  107,  123,  109,   17,  123,  123,   16,  123,   18,
+ /*  1290 */    19,  123,   78,   22,   23,  123,   29,  123,  123,   28,
+ /*  1300 */   123,   17,   35,   32,   33,   34,  123,   36,  123,   38,
+ /*  1310 */   123,  123,   41,   29,  123,  123,   85,  123,  123,   35,
+ /*  1320 */    89,   54,  123,   92,   93,  123,  123,   56,   57,   58,
+ /*  1330 */    59,   60,  101,  102,   63,   64,  105,  106,  107,  123,
+ /*  1340 */   109,   17,  123,  123,   16,  123,   18,   19,  123,   78,
+ /*  1350 */    22,   23,  123,   29,  123,  123,   28,  123,   17,   35,
+ /*  1360 */    32,   33,   34,  123,   36,  123,   38,  123,  123,   41,
+ /*  1370 */    29,  123,  123,   85,  123,  123,   35,   89,  123,  123,
+ /*  1380 */    92,   93,  123,  123,   56,   57,   58,   59,   60,  101,
+ /*  1390 */   102,   63,   64,  105,  106,  107,  123,  109,   17,  123,
+ /*  1400 */   123,   16,  123,   18,   19,  123,   78,   22,   23,  123,
+ /*  1410 */    29,  123,  123,   28,  123,   17,   35,   32,   33,   34,
+ /*  1420 */   123,   36,  123,   38,  123,  123,   41,   29,  123,  123,
+ /*  1430 */    85,  123,  123,   35,   89,  123,  123,   92,   93,  123,
+ /*  1440 */   123,   56,   57,   58,   59,   60,  101,  102,   63,   64,
+ /*  1450 */   105,  106,  107,  123,  109,   17,  123,  123,   16,  123,
+ /*  1460 */    18,   19,  123,   78,   22,   23,  123,   29,  123,  123,
+ /*  1470 */    28,  123,   17,   35,   32,   33,   34,  123,   36,  123,
+ /*  1480 */    38,  123,  123,   41,   29,  123,  123,   85,  123,  123,
+ /*  1490 */    35,   89,  123,  123,   92,   93,  123,  123,   56,   57,
+ /*  1500 */    58,   59,   60,  101,  102,   63,   64,  105,  106,  107,
+ /*  1510 */   123,  109,   17,  123,  123,   16,  123,   18,   19,  123,
+ /*  1520 */    78,   22,   23,  123,   29,  123,  123,   28,  123,   17,
+ /*  1530 */    35,   32,   33,   34,  123,   36,  123,   38,  123,  123,
+ /*  1540 */    41,   29,  123,  123,   85,  123,  123,   35,   89,  123,
+ /*  1550 */   123,   92,   93,  123,  123,   56,   57,   58,   59,   60,
+ /*  1560 */   101,  102,   63,   64,  105,  106,  107,  123,  109,   17,
+ /*  1570 */   123,  123,   16,  123,   18,   19,  123,   78,   22,   23,
+ /*  1580 */   123,   29,  123,  123,   28,  123,   17,   35,   32,   33,
+ /*  1590 */    34,  123,   36,  123,   38,  123,  123,   41,   29,  123,
+ /*  1600 */   123,   85,  123,  123,   35,   89,  123,  123,   92,   93,
+ /*  1610 */   123,  123,   56,   57,   58,   59,   60,  101,  102,   63,
+ /*  1620 */    64,  105,  106,  107,  123,  109,   17,  123,  123,   16,
+ /*  1630 */   123,   18,   19,  123,   78,   22,   23,  123,   29,  123,
+ /*  1640 */   123,   28,  123,   17,   35,   32,   33,   34,  123,   36,
+ /*  1650 */   123,   38,  123,  123,   41,   29,  123,  123,   85,  123,
+ /*  1660 */   123,   35,   89,  123,  123,   92,   93,  123,  123,   56,
+ /*  1670 */    57,   58,   59,   60,  101,  102,   63,  123,  105,  106,
+ /*  1680 */   107,  123,  109,   17,  123,  123,   16,  123,   18,   19,
+ /*  1690 */   123,   78,   22,   23,  123,   29,  123,  123,   28,  123,
+ /*  1700 */    17,   35,   32,   33,   34,  123,   36,  123,   38,  123,
+ /*  1710 */   123,   41,   29,  123,  123,   85,  123,  123,   35,   89,
+ /*  1720 */   123,  123,   92,   93,  123,  123,   56,   57,   58,   59,
+ /*  1730 */    60,  101,  102,   63,  123,  105,  106,  107,  123,  109,
+ /*  1740 */   123,  123,  123,  123,   17,  123,  123,  123,   78,  123,
+ /*  1750 */   120,   24,  123,   26,   27,   10,   29,   30,  123,  123,
+ /*  1760 */   123,   16,   35,  123,   37,   38,   39,   22,   23,  123,
+ /*  1770 */    90,   91,  123,   28,  123,  123,  123,   32,   33,   34,
+ /*  1780 */   100,   54,  123,  103,  104,  123,  123,  123,   61,  123,
+ /*  1790 */   123,  123,   65,  123,   85,   90,   91,  117,   89,  123,
+ /*  1800 */   123,   92,   93,  123,  123,  100,   79,  123,  103,  104,
+ /*  1810 */   101,  102,  123,   85,  105,  106,  107,   89,  109,  123,
+ /*  1820 */    92,   93,  117,   78,   79,   80,  123,  123,  123,  101,
+ /*  1830 */   102,  123,  123,  105,  106,  107,   85,  109,  123,  123,
+ /*  1840 */    89,  123,  123,   92,   93,  123,  123,   85,  123,  123,
+ /*  1850 */   123,   89,  101,  102,   92,   93,  105,  106,  107,  123,
+ /*  1860 */   109,  123,  123,  101,  102,  123,  123,  105,  106,  107,
+ /*  1870 */   123,  109,  123,  123,   85,   90,   91,  123,   89,  123,
+ /*  1880 */   123,   92,   93,  123,  123,  100,  123,  123,  103,  104,
+ /*  1890 */   101,  102,  123,  123,  105,  106,  107,   85,  109,  123,
+ /*  1900 */   123,   89,  117,  123,   92,   93,  123,   85,  123,  123,
+ /*  1910 */   123,   89,  123,  101,  102,   93,   85,  105,  106,  107,
+ /*  1920 */    89,  109,  123,   92,   93,  123,  123,  105,  106,  107,
+ /*  1930 */   123,  109,  101,  102,  123,  123,  105,  106,  107,   85,
+ /*  1940 */   109,  123,  123,   89,  123,  123,   92,   93,  123,  123,
+ /*  1950 */    85,  123,  123,  123,   89,  101,  102,   92,   93,  105,
+ /*  1960 */   106,  107,  123,  109,  123,  123,  101,  102,  123,  123,
+ /*  1970 */   105,  106,  107,  123,  109,  123,   85,  123,  123,  123,
+ /*  1980 */    89,  123,  123,   92,   93,  123,  123,   85,  123,  123,
+ /*  1990 */   123,   89,  101,  102,   92,   93,  105,  106,  107,  123,
+ /*  2000 */   109,  123,  123,  101,  102,  123,   85,  105,  106,  107,
+ /*  2010 */    89,  109,  123,   92,   93,  123,  123,  123,  123,  123,
+ /*  2020 */   123,  123,  101,  102,  123,   85,  105,  106,  107,   89,
+ /*  2030 */   109,  123,   92,   93,  123,  123,   85,  123,  123,  123,
+ /*  2040 */    89,  101,  102,   92,   93,  105,  106,  107,  123,  109,
+ /*  2050 */   123,  123,  101,  102,  123,  123,  105,  106,  107,  123,
+ /*  2060 */   109,  123,   85,  123,  123,  123,   89,  123,  123,   92,
+ /*  2070 */    93,  123,  123,   85,  123,  123,  123,   89,  101,  102,
+ /*  2080 */    92,   93,  105,  106,  107,  123,  109,  123,  123,  101,
+ /*  2090 */   102,  123,   85,  105,  106,  107,   89,  109,  123,   92,
+ /*  2100 */    93,  123,  123,  123,  123,  123,  123,  123,  101,  102,
+ /*  2110 */   123,   85,  105,  106,  107,   89,  109,  123,   92,   93,
+ /*  2120 */   123,  123,   85,  123,  123,  123,   89,  101,  102,   92,
+ /*  2130 */    93,  105,  106,  107,  123,  109,  123,  123,  101,  102,
+ /*  2140 */   123,  123,  105,  106,  107,  123,  109,  123,   85,  123,
+ /*  2150 */   123,  123,   89,  123,  123,   92,   93,  123,  123,   85,
+ /*  2160 */   123,  123,  123,   89,  101,  102,   92,   93,  105,  106,
+ /*  2170 */   107,  123,  109,  123,  123,  101,  102,  123,   85,  105,
+ /*  2180 */   106,  107,   89,  109,  123,   92,   93,  123,  123,  123,
+ /*  2190 */   123,  123,  123,  123,  101,  102,  123,   85,  105,  106,
+ /*  2200 */   107,   89,  109,  123,   92,   93,  123,  123,   85,  123,
+ /*  2210 */   123,  123,   89,  101,  102,   92,   93,  105,  106,  107,
+ /*  2220 */   123,  109,  123,  123,  101,  102,  123,  123,  105,  106,
+ /*  2230 */   107,  123,  109,  123,   85,  123,  123,  123,   89,  123,
+ /*  2240 */   123,   92,   93,  123,  123,   85,  123,  123,  123,   89,
+ /*  2250 */   101,  102,   92,   93,  105,  106,  107,  123,  109,  123,
+ /*  2260 */   123,  101,  102,  123,   85,  105,  106,  107,   89,  109,
+ /*  2270 */   123,   92,   93,  123,  123,  123,  123,  123,  123,  123,
+ /*  2280 */   101,  102,  123,   85,  105,  106,  107,   89,  109,  123,
+ /*  2290 */    92,   93,    1,  123,   85,  123,   90,   91,   89,  101,
+ /*  2300 */   102,  123,   93,  105,  106,  107,  100,  109,   17,  103,
+ /*  2310 */   104,  102,   21,  123,  105,  106,  107,  123,  109,  123,
+ /*  2320 */    29,  123,  123,  117,   85,  123,   35,  123,   89,   38,
+ /*  2330 */   123,  123,   93,  123,  123,  123,  123,  123,  123,  123,
+ /*  2340 */    90,   91,  123,  123,  105,  106,  107,  123,  109,  123,
+ /*  2350 */   100,  123,   61,  103,  104,   90,   91,  123,  123,  123,
+ /*  2360 */   123,  123,  123,  123,  123,  100,  123,  117,  103,  104,
+ /*  2370 */   123,  123,  123,  123,  123,  123,  123,  123,  123,  123,
+ /*  2380 */   123,  123,  117,
 );
-    const YY_SHIFT_USE_DFLT = -2;
-    const YY_SHIFT_MAX = 252;
+    const YY_SHIFT_USE_DFLT = -5;
+    const YY_SHIFT_MAX = 256;
     static public $yy_shift_ofst = array(
- /*     0 */     1, 1386, 1162, 1218, 1162, 1386, 1218, 1162, 1106, 1162,
- /*    10 */  1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1442, 1554,
- /*    20 */  1498, 1162, 1162, 1162, 1162, 1162, 1162, 1610, 1162, 1162,
- /*    30 */  1162, 1162, 1162, 1162, 1274, 1162, 1162, 1162, 1162, 1162,
- /*    40 */  1162, 1162, 1498, 1442, 1330, 1330, 1666, 1666, 1666, 1722,
- /*    50 */  1666, 1666, 1666,  227,   75,  151,   -1,  768,  768,  768,
- /*    60 */   948,  896,  820,  536,  379,  716,  303,  431,  664,  612,
- /*    70 */   484, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000,
- /*    80 */  1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000,
- /*    90 */  1040, 1040, 1116,  382,  513,    1, 1126,  147,  223, 1118,
- /*   100 */  1118,  320,  890,  916,  298,  890,  513,  447,  513,  898,
- /*   110 */    48,  154,   11,  306,   67,  230,  194,  220,  169,  268,
- /*   120 */   181,  316,  615,  424,  473,  424,  472,  474,  448,  785,
- /*   130 */   424,  424,  210,  424,  442,  447,  448,  424,  424,  424,
- /*   140 */   727,  424, 1288,  447,  442,  641,  137,  641,  641,  641,
- /*   150 */   641,  641,  137,  617,  618,  641,  641,   -2,  344,  148,
- /*   160 */   893,  172,   41,  172, 1225, 1215, 1216, 1206, 1197, 1115,
- /*   170 */  1169, 1184, 1230,  172, 1271,  672, 1262, 1272, 1286, 1077,
- /*   180 */  1281,  172, 1240, 1232,  911,  172, 1253, 1243, 1076,  621,
- /*   190 */   641,  641,  665,  665,  559,  621,  137,  327,  137,  137,
- /*   200 */    -2,   -2,   -2,   -2,   -2, 1778,   71,  119,   45,   73,
- /*   210 */    76,   96,  486,  436,  179,  470,   22,  377,  153,  373,
- /*   220 */   397,  397,  613,  561,  554,  572,  568,  249,  549,  542,
- /*   230 */   573,  555,  578,  558,  559,  556,  570,  511,  543,  449,
- /*   240 */   501,  395,  252,  348,  368,  519,  334,  525,  481,  506,
- /*   250 */   521,  520,  551,
+ /*     0 */    -2, 1271, 1157, 1157, 1271, 1157, 1328, 1328, 1100, 1157,
+ /*    10 */  1157, 1157, 1157, 1157, 1157, 1157, 1499, 1157, 1157, 1157,
+ /*    20 */  1157, 1157, 1556, 1157, 1157, 1157, 1157, 1157, 1157, 1157,
+ /*    30 */  1157, 1157, 1157, 1157, 1385, 1214, 1157, 1157, 1157, 1157,
+ /*    40 */  1157, 1499, 1214, 1157, 1442, 1442, 1613, 1670, 1670, 1670,
+ /*    50 */  1670, 1670, 1670,  206,  153,   76,   -1,  259,  259,  259,
+ /*    60 */   809,  939,  755,  862,  702,  649,  365,  312,  418,  495,
+ /*    70 */   572,  992,  992,  992,  992,  992,  992,  992,  992,  992,
+ /*    80 */   992,  992,  992,  992,  992,  992,  992,  992,  992,  992,
+ /*    90 */  1033, 1033, 2291, 1267,  106,   -2, 1745, 1222, 1165,  157,
+ /*   100 */   157,  492,  492,  499,  106,  106,  274,  493,  142,  497,
+ /*   110 */    49,   79,  942,  652,  246,   17,  328,  300,  236,  223,
+ /*   120 */    80,  147,  532, 1227,  353,  353,  353,  422,  407,  142,
+ /*   130 */   353,  353,  610,  353,  341,  565,  379,  353,  380,  142,
+ /*   140 */   408,  160,  409,  353,  379,  409,  353,  472,  613,  472,
+ /*   150 */   472,  472,  472,  472,  472,  613,  472,   -5, 1284, 1210,
+ /*   160 */    -4, 1108,    0,  156,  575, 1683, 1552, 1512, 1569, 1609,
+ /*   170 */  1666, 1324, 1626,    6, 1495, 1398, 1381, 1341, 1438, 1455,
+ /*   180 */    73,  482,   73,  204,  592,  204,  204,  204,  164,  204,
+ /*   190 */   253,  204,  204,  665,  613,  613,  613,  479,  472,  347,
+ /*   200 */   415,  415,  472,  347,   -5,   -5,   -5,   -5,   -5, 1727,
+ /*   210 */   149,   45,  120,  152,   54,  530,   54,  314,  252,  378,
+ /*   220 */   306,  459,  258,  303,  239,  331,  522,  536,  469,  537,
+ /*   230 */   539,  569,  534,  544,  561,  525,  518,  570,  593,  612,
+ /*   240 */   578,  628,  591,  579,  510,  584,  589,  458,  435,  352,
+ /*   250 */   485,  478,  451,  479,  490,  383,  618,
 );
-    const YY_REDUCE_USE_DFLT = -84;
-    const YY_REDUCE_MAX = 204;
+    const YY_REDUCE_USE_DFLT = -96;
+    const YY_REDUCE_MAX = 208;
     static public $yy_reduce_ofst = array(
- /*     0 */   -63,   -7, 1729,   69,  297,  221,  145,  530, 2209, 2228,
- /*    10 */  1973, 1850, 2190, 2039, 2058, 1899, 2094, 2069, 2020, 2105,
- /*    20 */  2124, 2179, 2154, 2143, 2009, 1984, 1839, 1814, 1780, 1803,
- /*    30 */  1869, 1888, 1954, 1935, 1924, 2275, 2324, 2294, 2264, 2360,
- /*    40 */  2349, 2239, 2313, 1757, 2379, 2398,  226,  819,  302,  535,
- /*    50 */  1179, 1123, 1083, 2406, 1707, 1630, 2422, 2445, 2429, 2406,
- /*    60 */   813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
- /*    70 */   813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
- /*    80 */   813,  813,  813,  813,  813,  813,  813,  813,  813,  813,
- /*    90 */   813,  813,  -10,   40,  116,  -82,  -25,  225,  -74,  192,
- /*   100 */   343,  156,  305,   70,  174,  538,  370,  272,  301,  658,
- /*   110 */   432,   92,   68,   92,  330,   92,  330,  245,  330,  245,
- /*   120 */    92,  347,   92,  478,  451,  353,  451,  504,  404,  245,
- /*   130 */   451,  450,   92,  452,  451,  420,  457,  682,  684,  580,
- /*   140 */   405,  579,  500,  423,  630,   92,  149,   92,   92,   92,
- /*   150 */    92,   92,  245,  294,  191,   92,   92,   92,  534,  533,
- /*   160 */   518,  514,  517,  514,  518,  518,  518,  518,  518,  518,
- /*   170 */   518,  518,  518,  514,  518,  518,  518,  518,  518,  509,
- /*   180 */   518,  514,  518,  518,  509,  514,  518,  518,  509,  574,
- /*   190 */   509,  509,  503,  503,  563,  571,  152,  157,  152,  152,
- /*   200 */   -83,  208,  176,  160,  -77,
+ /*     0 */     5,   -7,  489,  566, 1630,  856,   70, 1117, 1865, 1854,
+ /*    10 */  1831, 1812, 1891, 1902, 1977, 1951, 1940, 1921, 1789, 1762,
+ /*    20 */  1402, 1345, 1288, 1231, 1459, 1516, 1751, 1728, 1709, 1573,
+ /*    30 */  1988, 2007, 2123, 2149, 2160, 2198, 2179, 1174, 2093, 2026,
+ /*    40 */  2037, 2063, 2112, 2074, 1042, 2209, 1822, 2239, 1061,  861,
+ /*    50 */   494,  417,  571, 2265, 2250, 2206, 1705, 1785, 1680, 1705,
+ /*    60 */   128,  128,  128,  128,  128,  128,  128,  128,  128,  128,
+ /*    70 */   128,  128,  128,  128,  128,  128,  128,  128,  128,  128,
+ /*    80 */   128,  128,  128,  128,  128,  128,  128,  128,  128,  128,
+ /*    90 */   128,  128,  277,  224,   40,  154,  200,  864, 1062,  170,
+ /*   100 */   330,  574, 1149,   99,  329,  381, 1078,   98,  -34,  201,
+ /*   110 */    15,  125,  125,  125,  -85,  124,  124,  124,  125,  -95,
+ /*   120 */   125,  -95,  332,  354,  573,  616,  617,  460,  615,  307,
+ /*   130 */   385,  540,  256,  -74,  248,  -95,  335,  668,  540,  281,
+ /*   140 */   540,  125,  670,  669,  520,  540,  186,  125,  339,  125,
+ /*   150 */   125,  125,  125,  125,  125,  -95,  125,  125,  554,  554,
+ /*   160 */   550,  554,  554,  554,  554,  554,  554,  554,  554,  554,
+ /*   170 */   554,  554,  554,  542,  554,  554,  554,  554,  554,  554,
+ /*   180 */   595,  -33,  551,  552,  -33,  552,  552,  552,  -33,  552,
+ /*   190 */   597,  552,  552,  596,  594,  594,  594,  599,  -33,  356,
+ /*   200 */   296,  360,  -33,  356,  395,  404,  376,  416,  368,
 );
     static public $yyExpectedTokens = array(
         /* 0 */ array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 22, 23, 28, 32, 33, 34, ),
-        /* 1 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 2 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 3 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 4 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 5 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 6 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 7 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 8 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 64, 77, ),
-        /* 9 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 10 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 11 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 12 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 13 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 14 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 15 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 16 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 17 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 18 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 19 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 20 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 21 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 22 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 23 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 24 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 25 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 26 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 27 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 28 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 29 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 30 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 31 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 32 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 33 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 34 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 35 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 36 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 37 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 38 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 39 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 40 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 41 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 42 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 43 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 44 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 45 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 63, 77, ),
-        /* 46 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 77, ),
-        /* 47 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 77, ),
-        /* 48 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 77, ),
-        /* 49 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 77, ),
-        /* 50 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 77, ),
-        /* 51 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 77, ),
-        /* 52 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 35, 37, 40, 55, 56, 57, 58, 59, 62, 77, ),
-        /* 53 */ array(1, 17, 29, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 54 */ array(1, 17, 29, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 55 */ array(1, 17, 29, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 56 */ array(1, 27, 29, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 57 */ array(1, 29, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 58 */ array(1, 29, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 59 */ array(1, 29, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 60 */ array(1, 2, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 61 */ array(1, 17, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 62 */ array(1, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 63 */ array(1, 30, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 64 */ array(1, 17, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 65 */ array(1, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 66 */ array(1, 17, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 67 */ array(1, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 78, ),
-        /* 68 */ array(1, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 69 */ array(1, 17, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 70 */ array(1, 24, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 71 */ array(1, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 72 */ array(1, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 73 */ array(1, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 74 */ array(1, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 75 */ array(1, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 76 */ array(1, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 77 */ array(1, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 78 */ array(1, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 79 */ array(1, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 80 */ array(1, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 81 */ array(1, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 82 */ array(1, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 83 */ array(1, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 84 */ array(1, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 85 */ array(1, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 86 */ array(1, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 87 */ array(1, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 88 */ array(1, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 89 */ array(1, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 90 */ array(39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 91 */ array(39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, ),
-        /* 92 */ array(1, 17, 21, 29, 37, 60, ),
-        /* 93 */ array(1, 17, 29, 53, ),
-        /* 94 */ array(1, 29, ),
+        /* 1 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 2 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 3 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 4 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 5 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 6 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 7 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 8 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 65, 78, ),
+        /* 9 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 10 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 11 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 12 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 13 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 14 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 15 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 16 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 17 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 18 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 19 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 20 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 21 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 22 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 23 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 24 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 25 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 26 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 27 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 28 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 29 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 30 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 31 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 32 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 33 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 34 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 35 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 36 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 37 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 38 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 39 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 40 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 41 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 42 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 43 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 44 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 45 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 64, 78, ),
+        /* 46 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 78, ),
+        /* 47 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 78, ),
+        /* 48 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 78, ),
+        /* 49 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 78, ),
+        /* 50 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 78, ),
+        /* 51 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 78, ),
+        /* 52 */ array(16, 18, 19, 22, 23, 28, 32, 33, 34, 36, 38, 41, 56, 57, 58, 59, 60, 63, 78, ),
+        /* 53 */ array(1, 27, 29, 35, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 54 */ array(1, 17, 29, 35, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 55 */ array(1, 17, 29, 35, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 56 */ array(1, 17, 29, 35, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 57 */ array(1, 29, 35, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 58 */ array(1, 29, 35, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 59 */ array(1, 29, 35, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 60 */ array(1, 24, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 61 */ array(1, 17, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 62 */ array(1, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 63 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 64 */ array(1, 2, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 65 */ array(1, 17, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 66 */ array(1, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 67 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 79, ),
+        /* 68 */ array(1, 30, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 69 */ array(1, 17, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 70 */ array(1, 17, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 71 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 72 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 73 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 74 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 75 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 76 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 77 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 78 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 79 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 80 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 81 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 82 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 83 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 84 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 85 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 86 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 87 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 88 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 89 */ array(1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 90 */ array(40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 91 */ array(40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, ),
+        /* 92 */ array(1, 17, 21, 29, 35, 38, 61, ),
+        /* 93 */ array(1, 17, 29, 35, 54, ),
+        /* 94 */ array(1, 29, 35, ),
         /* 95 */ array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 16, 22, 23, 28, 32, 33, 34, ),
-        /* 96 */ array(10, 16, 22, 23, 28, 32, 33, 34, 77, 78, 79, ),
-        /* 97 */ array(16, 19, 29, 31, ),
-        /* 98 */ array(16, 19, 29, 31, ),
-        /* 99 */ array(1, 17, 29, ),
-        /* 100 */ array(1, 17, 29, ),
-        /* 101 */ array(18, 19, 62, ),
-        /* 102 */ array(16, 19, 29, ),
+        /* 96 */ array(10, 16, 22, 23, 28, 32, 33, 34, 78, 79, 80, ),
+        /* 97 */ array(16, 19, 29, 31, 35, ),
+        /* 98 */ array(16, 19, 29, 31, 35, ),
+        /* 99 */ array(1, 17, 29, 35, ),
+        /* 100 */ array(1, 17, 29, 35, ),
+        /* 101 */ array(16, 19, 29, 35, ),
+        /* 102 */ array(16, 19, 29, 35, ),
         /* 103 */ array(1, 2, 17, ),
-        /* 104 */ array(21, 58, 63, ),
-        /* 105 */ array(16, 19, 29, ),
-        /* 106 */ array(1, 29, ),
-        /* 107 */ array(18, 37, ),
-        /* 108 */ array(1, 29, ),
-        /* 109 */ array(10, 16, 22, 23, 28, 32, 33, 34, 77, 78, 79, ),
+        /* 104 */ array(1, 29, 35, ),
+        /* 105 */ array(1, 29, 35, ),
+        /* 106 */ array(18, 19, 63, ),
+        /* 107 */ array(21, 59, 64, ),
+        /* 108 */ array(18, 38, ),
+        /* 109 */ array(10, 16, 22, 23, 28, 32, 33, 34, 78, 79, 80, ),
         /* 110 */ array(4, 5, 6, 7, 8, 13, 14, 15, ),
-        /* 111 */ array(1, 17, 29, 30, 53, ),
-        /* 112 */ array(16, 19, 20, 25, ),
-        /* 113 */ array(1, 17, 29, 53, ),
-        /* 114 */ array(16, 19, 20, 61, ),
-        /* 115 */ array(1, 17, 29, 53, ),
-        /* 116 */ array(16, 19, 61, ),
-        /* 117 */ array(20, 21, 60, ),
-        /* 118 */ array(16, 19, 20, ),
-        /* 119 */ array(20, 21, 60, ),
-        /* 120 */ array(1, 31, 53, ),
-        /* 121 */ array(1, 17, 21, ),
-        /* 122 */ array(1, 17, 53, ),
-        /* 123 */ array(16, 19, ),
+        /* 111 */ array(1, 17, 29, 30, 35, 54, ),
+        /* 112 */ array(1, 17, 29, 35, 54, ),
+        /* 113 */ array(1, 17, 29, 35, 54, ),
+        /* 114 */ array(16, 19, 20, 25, ),
+        /* 115 */ array(16, 19, 20, 62, ),
+        /* 116 */ array(16, 19, 62, ),
+        /* 117 */ array(16, 19, 20, ),
+        /* 118 */ array(1, 31, 54, ),
+        /* 119 */ array(20, 21, 61, ),
+        /* 120 */ array(1, 17, 54, ),
+        /* 121 */ array(20, 21, 61, ),
+        /* 122 */ array(1, 17, 21, ),
+        /* 123 */ array(17, 29, 35, ),
         /* 124 */ array(16, 19, ),
         /* 125 */ array(16, 19, ),
         /* 126 */ array(16, 19, ),
-        /* 127 */ array(16, 19, ),
-        /* 128 */ array(18, 19, ),
-        /* 129 */ array(21, 60, ),
+        /* 127 */ array(29, 35, ),
+        /* 128 */ array(16, 19, ),
+        /* 129 */ array(18, 38, ),
         /* 130 */ array(16, 19, ),
         /* 131 */ array(16, 19, ),
-        /* 132 */ array(1, 53, ),
+        /* 132 */ array(1, 17, ),
         /* 133 */ array(16, 19, ),
-        /* 134 */ array(16, 19, ),
-        /* 135 */ array(18, 37, ),
+        /* 134 */ array(29, 35, ),
+        /* 135 */ array(21, 61, ),
         /* 136 */ array(18, 19, ),
         /* 137 */ array(16, 19, ),
         /* 138 */ array(16, 19, ),
-        /* 139 */ array(16, 19, ),
-        /* 140 */ array(1, 17, ),
-        /* 141 */ array(16, 19, ),
-        /* 142 */ array(17, 29, ),
-        /* 143 */ array(18, 37, ),
-        /* 144 */ array(16, 19, ),
-        /* 145 */ array(1, ),
-        /* 146 */ array(21, ),
+        /* 139 */ array(18, 38, ),
+        /* 140 */ array(16, 19, ),
+        /* 141 */ array(1, 54, ),
+        /* 142 */ array(16, 19, ),
+        /* 143 */ array(16, 19, ),
+        /* 144 */ array(18, 19, ),
+        /* 145 */ array(16, 19, ),
+        /* 146 */ array(16, 19, ),
         /* 147 */ array(1, ),
-        /* 148 */ array(1, ),
+        /* 148 */ array(21, ),
         /* 149 */ array(1, ),
         /* 150 */ array(1, ),
         /* 151 */ array(1, ),
-        /* 152 */ array(21, ),
-        /* 153 */ array(29, ),
-        /* 154 */ array(29, ),
-        /* 155 */ array(1, ),
+        /* 152 */ array(1, ),
+        /* 153 */ array(1, ),
+        /* 154 */ array(1, ),
+        /* 155 */ array(21, ),
         /* 156 */ array(1, ),
         /* 157 */ array(),
-        /* 158 */ array(16, 18, 19, ),
-        /* 159 */ array(16, 19, 61, ),
-        /* 160 */ array(17, 29, ),
-        /* 161 */ array(58, 63, ),
-        /* 162 */ array(16, 37, ),
-        /* 163 */ array(58, 63, ),
-        /* 164 */ array(17, 29, ),
-        /* 165 */ array(17, 29, ),
-        /* 166 */ array(17, 29, ),
-        /* 167 */ array(17, 29, ),
-        /* 168 */ array(17, 29, ),
-        /* 169 */ array(17, 29, ),
-        /* 170 */ array(17, 29, ),
-        /* 171 */ array(17, 29, ),
-        /* 172 */ array(17, 29, ),
-        /* 173 */ array(58, 63, ),
-        /* 174 */ array(17, 29, ),
-        /* 175 */ array(17, 29, ),
-        /* 176 */ array(17, 29, ),
-        /* 177 */ array(17, 29, ),
-        /* 178 */ array(17, 29, ),
-        /* 179 */ array(1, 17, ),
-        /* 180 */ array(17, 29, ),
-        /* 181 */ array(58, 63, ),
-        /* 182 */ array(17, 29, ),
-        /* 183 */ array(17, 29, ),
+        /* 158 */ array(17, 29, 35, ),
+        /* 159 */ array(17, 29, 35, ),
+        /* 160 */ array(16, 19, 62, ),
+        /* 161 */ array(17, 29, 35, ),
+        /* 162 */ array(17, 29, 35, ),
+        /* 163 */ array(17, 29, 35, ),
+        /* 164 */ array(17, 29, 35, ),
+        /* 165 */ array(17, 29, 35, ),
+        /* 166 */ array(17, 29, 35, ),
+        /* 167 */ array(17, 29, 35, ),
+        /* 168 */ array(17, 29, 35, ),
+        /* 169 */ array(17, 29, 35, ),
+        /* 170 */ array(17, 29, 35, ),
+        /* 171 */ array(17, 29, 35, ),
+        /* 172 */ array(17, 29, 35, ),
+        /* 173 */ array(16, 18, 19, ),
+        /* 174 */ array(17, 29, 35, ),
+        /* 175 */ array(17, 29, 35, ),
+        /* 176 */ array(17, 29, 35, ),
+        /* 177 */ array(17, 29, 35, ),
+        /* 178 */ array(17, 29, 35, ),
+        /* 179 */ array(17, 29, 35, ),
+        /* 180 */ array(59, 64, ),
+        /* 181 */ array(1, 17, ),
+        /* 182 */ array(59, 64, ),
+        /* 183 */ array(59, 64, ),
         /* 184 */ array(1, 17, ),
-        /* 185 */ array(58, 63, ),
-        /* 186 */ array(17, 29, ),
-        /* 187 */ array(17, 29, ),
+        /* 185 */ array(59, 64, ),
+        /* 186 */ array(59, 64, ),
+        /* 187 */ array(59, 64, ),
         /* 188 */ array(1, 17, ),
-        /* 189 */ array(29, ),
-        /* 190 */ array(1, ),
-        /* 191 */ array(1, ),
-        /* 192 */ array(2, ),
-        /* 193 */ array(2, ),
-        /* 194 */ array(37, ),
-        /* 195 */ array(29, ),
+        /* 189 */ array(59, 64, ),
+        /* 190 */ array(16, 38, ),
+        /* 191 */ array(59, 64, ),
+        /* 192 */ array(59, 64, ),
+        /* 193 */ array(14, ),
+        /* 194 */ array(21, ),
+        /* 195 */ array(21, ),
         /* 196 */ array(21, ),
-        /* 197 */ array(14, ),
-        /* 198 */ array(21, ),
-        /* 199 */ array(21, ),
-        /* 200 */ array(),
-        /* 201 */ array(),
-        /* 202 */ array(),
-        /* 203 */ array(),
+        /* 197 */ array(38, ),
+        /* 198 */ array(1, ),
+        /* 199 */ array(2, ),
+        /* 200 */ array(29, ),
+        /* 201 */ array(29, ),
+        /* 202 */ array(1, ),
+        /* 203 */ array(2, ),
         /* 204 */ array(),
-        /* 205 */ array(17, 24, 26, 27, 29, 30, 36, 37, 38, 53, 60, 64, 78, ),
-        /* 206 */ array(17, 20, 29, 37, 60, ),
-        /* 207 */ array(16, 18, 19, 35, ),
-        /* 208 */ array(37, 58, 60, 64, ),
-        /* 209 */ array(17, 29, 37, 60, ),
-        /* 210 */ array(31, 37, 60, ),
-        /* 211 */ array(36, 38, ),
-        /* 212 */ array(24, 36, ),
-        /* 213 */ array(2, 20, ),
-        /* 214 */ array(25, 78, ),
-        /* 215 */ array(17, 25, ),
-        /* 216 */ array(36, 38, ),
-        /* 217 */ array(36, 38, ),
-        /* 218 */ array(19, 61, ),
-        /* 219 */ array(36, 64, ),
-        /* 220 */ array(37, 60, ),
-        /* 221 */ array(37, 60, ),
-        /* 222 */ array(20, 58, ),
-        /* 223 */ array(37, ),
-        /* 224 */ array(18, ),
-        /* 225 */ array(19, ),
-        /* 226 */ array(2, ),
-        /* 227 */ array(62, ),
-        /* 228 */ array(18, ),
-        /* 229 */ array(26, ),
+        /* 205 */ array(),
+        /* 206 */ array(),
+        /* 207 */ array(),
+        /* 208 */ array(),
+        /* 209 */ array(17, 24, 26, 27, 29, 30, 35, 37, 38, 39, 54, 61, 65, 79, ),
+        /* 210 */ array(17, 20, 29, 35, 38, 61, ),
+        /* 211 */ array(38, 59, 61, 65, ),
+        /* 212 */ array(16, 18, 19, 36, ),
+        /* 213 */ array(31, 38, 61, ),
+        /* 214 */ array(38, 61, ),
+        /* 215 */ array(2, 20, ),
+        /* 216 */ array(38, 61, ),
+        /* 217 */ array(24, 37, ),
+        /* 218 */ array(37, 65, ),
+        /* 219 */ array(17, 25, ),
+        /* 220 */ array(37, 39, ),
+        /* 221 */ array(20, 59, ),
+        /* 222 */ array(37, 39, ),
+        /* 223 */ array(37, 39, ),
+        /* 224 */ array(25, 79, ),
+        /* 225 */ array(19, 62, ),
+        /* 226 */ array(63, ),
+        /* 227 */ array(19, ),
+        /* 228 */ array(65, ),
+        /* 229 */ array(19, ),
         /* 230 */ array(19, ),
-        /* 231 */ array(18, ),
-        /* 232 */ array(19, ),
-        /* 233 */ array(35, ),
-        /* 234 */ array(37, ),
-        /* 235 */ array(38, ),
-        /* 236 */ array(25, ),
-        /* 237 */ array(54, ),
-        /* 238 */ array(2, ),
+        /* 231 */ array(19, ),
+        /* 232 */ array(25, ),
+        /* 233 */ array(63, ),
+        /* 234 */ array(19, ),
+        /* 235 */ array(59, ),
+        /* 236 */ array(36, ),
+        /* 237 */ array(36, ),
+        /* 238 */ array(39, ),
         /* 239 */ array(19, ),
-        /* 240 */ array(19, ),
-        /* 241 */ array(19, ),
-        /* 242 */ array(64, ),
-        /* 243 */ array(19, ),
-        /* 244 */ array(19, ),
-        /* 245 */ array(19, ),
-        /* 246 */ array(58, ),
-        /* 247 */ array(19, ),
-        /* 248 */ array(62, ),
-        /* 249 */ array(35, ),
-        /* 250 */ array(18, ),
-        /* 251 */ array(20, ),
-        /* 252 */ array(18, ),
-        /* 253 */ array(),
-        /* 254 */ array(),
-        /* 255 */ array(),
-        /* 256 */ array(),
+        /* 240 */ array(55, ),
+        /* 241 */ array(2, ),
+        /* 242 */ array(38, ),
+        /* 243 */ array(18, ),
+        /* 244 */ array(18, ),
+        /* 245 */ array(18, ),
+        /* 246 */ array(19, ),
+        /* 247 */ array(18, ),
+        /* 248 */ array(20, ),
+        /* 249 */ array(19, ),
+        /* 250 */ array(19, ),
+        /* 251 */ array(2, ),
+        /* 252 */ array(26, ),
+        /* 253 */ array(38, ),
+        /* 254 */ array(19, ),
+        /* 255 */ array(19, ),
+        /* 256 */ array(18, ),
         /* 257 */ array(),
         /* 258 */ array(),
         /* 259 */ array(),
@@ -1184,53 +1149,57 @@ static public $yy_action = array(
         /* 385 */ array(),
         /* 386 */ array(),
         /* 387 */ array(),
+        /* 388 */ array(),
+        /* 389 */ array(),
+        /* 390 */ array(),
 );
     static public $yy_default = array(
- /*     0 */   391,  573,  544,  590,  544,  590,  590,  544,  590,  590,
- /*    10 */   590,  590,  590,  590,  590,  590,  590,  590,  590,  590,
- /*    20 */   590,  590,  590,  590,  590,  590,  590,  590,  590,  590,
- /*    30 */   590,  590,  590,  590,  590,  590,  590,  590,  590,  590,
- /*    40 */   590,  590,  590,  590,  590,  590,  590,  590,  590,  590,
- /*    50 */   590,  590,  590,  590,  590,  590,  452,  452,  452,  452,
- /*    60 */   590,  590,  590,  457,  590,  590,  590,  590,  590,  590,
- /*    70 */   590,  542,  454,  481,  482,  485,  486,  478,  543,  476,
- /*    80 */   463,  575,  576,  473,  459,  457,  477,  434,  462,  574,
- /*    90 */   490,  489,  501,  465,  452,  388,  590,  452,  452,  509,
- /*   100 */   472,  590,  452,  590,  556,  452,  452,  590,  452,  590,
- /*   110 */   590,  465,  590,  465,  517,  465,  517,  510,  517,  510,
- /*   120 */   465,  590,  465,  590,  590,  517,  590,  590,  590,  510,
- /*   130 */   590,  590,  465,  590,  590,  590,  590,  590,  590,  590,
- /*   140 */   590,  590,  590,  590,  590,  493,  553,  475,  492,  469,
- /*   150 */   488,  468,  510,  452,  452,  470,  494,  551,  590,  518,
- /*   160 */   590,  534,  517,  537,  590,  590,  590,  590,  590,  590,
- /*   170 */   590,  590,  590,  535,  590,  590,  590,  590,  590,  590,
- /*   180 */   590,  536,  590,  590,  590,  515,  590,  590,  590,  589,
- /*   190 */   472,  509,  545,  546,  517,  589,  531,  407,  557,  554,
- /*   200 */   550,  550,  517,  550,  517,  467,  501,  590,  501,  501,
- /*   210 */   501,  590,  590,  529,  491,  491,  590,  590,  590,  590,
- /*   220 */   501,  487,  497,  555,  590,  590,  529,  590,  590,  460,
- /*   230 */   590,  590,  590,  590,  529,  590,  491,  503,  529,  590,
- /*   240 */   590,  590,  590,  590,  590,  590,  497,  590,  590,  499,
- /*   250 */   590,  590,  590,  437,  417,  389,  571,  431,  432,  441,
- /*   260 */   572,  540,  435,  588,  461,  539,  525,  523,  503,  526,
- /*   270 */   524,  514,  513,  530,  436,  570,  464,  538,  522,  442,
- /*   280 */   552,  541,  567,  529,  528,  443,  444,  549,  440,  439,
- /*   290 */   430,  429,  451,  433,  438,  445,  446,  498,  496,  500,
- /*   300 */   506,  466,  495,  449,  447,  547,  548,  448,  450,  416,
- /*   310 */   398,  397,  399,  400,  401,  396,  395,  390,  392,  393,
- /*   320 */   394,  402,  403,  412,  411,  413,  414,  415,  410,  409,
- /*   330 */   404,  405,  406,  408,  467,  511,  422,  421,  423,  532,
- /*   340 */   424,  420,  585,  512,  508,  533,  418,  419,  425,  426,
- /*   350 */   581,  582,  583,  586,  587,  579,  578,  428,  427,  584,
- /*   360 */   577,  471,  569,  504,  474,  505,  507,  479,  502,  521,
- /*   370 */   516,  519,  527,  520,  480,  483,  564,  563,  565,  566,
- /*   380 */   568,  562,  561,  484,  558,  559,  560,  580,
+ /*     0 */   394,  578,  549,  549,  595,  549,  595,  595,  595,  595,
+ /*    10 */   595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+ /*    20 */   595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+ /*    30 */   595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+ /*    40 */   595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+ /*    50 */   595,  595,  595,  455,  595,  595,  595,  455,  455,  455,
+ /*    60 */   595,  595,  595,  595,  595,  595,  595,  595,  460,  595,
+ /*    70 */   595,  466,  465,  484,  547,  579,  581,  548,  580,  489,
+ /*    80 */   488,  480,  479,  481,  457,  485,  462,  476,  460,  437,
+ /*    90 */   492,  493,  504,  468,  455,  391,  595,  455,  455,  475,
+ /*   100 */   512,  455,  455,  595,  455,  455,  595,  561,  595,  595,
+ /*   110 */   595,  468,  468,  468,  595,  522,  522,  522,  468,  513,
+ /*   120 */   468,  513,  595,  595,  595,  595,  595,  455,  595,  595,
+ /*   130 */   595,  595,  595,  595,  455,  513,  595,  595,  595,  595,
+ /*   140 */   595,  468,  595,  595,  595,  595,  522,  473,  558,  491,
+ /*   150 */   478,  472,  497,  495,  496,  513,  471,  556,  595,  595,
+ /*   160 */   523,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+ /*   170 */   595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+ /*   180 */   516,  595,  518,  519,  595,  520,  540,  542,  595,  539,
+ /*   190 */   522,  517,  541,  410,  562,  559,  536,  522,  475,  551,
+ /*   200 */   594,  594,  512,  550,  522,  555,  555,  555,  522,  470,
+ /*   210 */   504,  504,  595,  504,  490,  534,  504,  595,  595,  494,
+ /*   220 */   595,  500,  595,  595,  494,  595,  595,  595,  595,  595,
+ /*   230 */   595,  595,  494,  595,  595,  500,  502,  595,  595,  595,
+ /*   240 */   506,  534,  560,  595,  595,  595,  595,  595,  595,  595,
+ /*   250 */   595,  534,  463,  534,  595,  595,  595,  401,  543,  400,
+ /*   260 */   402,  546,  445,  398,  397,  393,  464,  438,  593,  467,
+ /*   270 */   435,  395,  440,  434,  439,  396,  399,  456,  531,  420,
+ /*   280 */   529,  392,  528,  506,  527,  535,  444,  557,  545,  544,
+ /*   290 */   530,  412,  453,  526,  505,  419,  507,  525,  532,  470,
+ /*   300 */   514,  521,  524,  508,  510,  482,  483,  416,  415,  417,
+ /*   310 */   418,  477,  511,  515,  538,  469,  509,  534,  533,  432,
+ /*   320 */   446,  447,  443,  442,  436,  454,  433,  441,  554,  448,
+ /*   330 */   498,  499,  501,  503,  452,  451,  449,  450,  552,  553,
+ /*   340 */   486,  487,  589,  430,  582,  583,  584,  431,  429,  426,
+ /*   350 */   537,  427,  428,  406,  587,  575,  404,  577,  576,  405,
+ /*   360 */   585,  586,  588,  591,  592,  425,  424,  569,  568,  570,
+ /*   370 */   571,  572,  567,  566,  414,  563,  564,  565,  573,  574,
+ /*   380 */   422,  590,  407,  423,  421,  408,  474,  413,  411,  409,
+ /*   390 */   403,
 );
-    const YYNOCODE = 123;
+    const YYNOCODE = 124;
     const YYSTACKDEPTH = 100;
-    const YYNSTATE = 388;
-    const YYNRULE = 202;
-    const YYERRORSYMBOL = 80;
+    const YYNSTATE = 391;
+    const YYNRULE = 204;
+    const YYERRORSYMBOL = 81;
     const YYERRSYMDT = 'yy0';
     const YYFALLBACK = 0;
     static public $yyFallback = array(
@@ -1267,29 +1236,29 @@ static public $yy_action = array(
   'EQUAL',         'PTR',           'LDELIF',        'LDELFOR',
   'SEMICOLON',     'INCDEC',        'TO',            'STEP',
   'LDELFOREACH',   'SPACE',         'AS',            'APTR',
-  'LDELSETFILTER',  'SMARTYBLOCKCHILD',  'LDELSLASH',     'INTEGER',
-  'COMMA',         'OPENP',         'CLOSEP',        'MATH',
-  'UNIMATH',       'ANDSYM',        'ISIN',          'ISDIVBY',
-  'ISNOTDIVBY',    'ISEVEN',        'ISNOTEVEN',     'ISEVENBY',
-  'ISNOTEVENBY',   'ISODD',         'ISNOTODD',      'ISODDBY',
-  'ISNOTODDBY',    'INSTANCEOF',    'QMARK',         'NOT',
-  'TYPECAST',      'HEX',           'DOT',           'SINGLEQUOTESTRING',
-  'DOUBLECOLON',   'AT',            'HATCH',         'OPENB',
-  'CLOSEB',        'EQUALS',        'NOTEQUALS',     'GREATERTHAN',
-  'LESSTHAN',      'GREATEREQUAL',  'LESSEQUAL',     'IDENTITY',
-  'NONEIDENTITY',  'MOD',           'LAND',          'LOR',
-  'LXOR',          'QUOTE',         'BACKTICK',      'DOLLARID',
-  'error',         'start',         'template',      'template_element',
-  'smartytag',     'literal',       'literal_elements',  'literal_element',
-  'value',         'modifierlist',  'attributes',    'expr',
-  'varindexed',    'statement',     'statements',    'optspace',
-  'varvar',        'foraction',     'modparameters',  'attribute',
-  'ternary',       'array',         'ifcond',        'lop',
-  'variable',      'function',      'doublequoted_with_quotes',  'static_class_access',
-  'object',        'arrayindex',    'indexdef',      'varvarele',
-  'objectchain',   'objectelement',  'method',        'params',
-  'modifier',      'modparameter',  'arrayelements',  'arrayelement',
-  'doublequoted',  'doublequotedcontent',
+  'LDELSETFILTER',  'SMARTYBLOCKCHILD',  'LDELSLASH',     'ATTR',
+  'INTEGER',       'COMMA',         'OPENP',         'CLOSEP',
+  'MATH',          'UNIMATH',       'ANDSYM',        'ISIN',
+  'ISDIVBY',       'ISNOTDIVBY',    'ISEVEN',        'ISNOTEVEN',
+  'ISEVENBY',      'ISNOTEVENBY',   'ISODD',         'ISNOTODD',
+  'ISODDBY',       'ISNOTODDBY',    'INSTANCEOF',    'QMARK',
+  'NOT',           'TYPECAST',      'HEX',           'DOT',
+  'SINGLEQUOTESTRING',  'DOUBLECOLON',   'AT',            'HATCH',
+  'OPENB',         'CLOSEB',        'EQUALS',        'NOTEQUALS',
+  'GREATERTHAN',   'LESSTHAN',      'GREATEREQUAL',  'LESSEQUAL',
+  'IDENTITY',      'NONEIDENTITY',  'MOD',           'LAND',
+  'LOR',           'LXOR',          'QUOTE',         'BACKTICK',
+  'DOLLARID',      'error',         'start',         'template',
+  'template_element',  'smartytag',     'literal',       'literal_elements',
+  'literal_element',  'value',         'modifierlist',  'attributes',
+  'expr',          'varindexed',    'statement',     'statements',
+  'optspace',      'varvar',        'foraction',     'modparameters',
+  'attribute',     'ternary',       'array',         'ifcond',
+  'lop',           'variable',      'function',      'doublequoted_with_quotes',
+  'static_class_access',  'object',        'arrayindex',    'indexdef',
+  'varvarele',     'objectchain',   'objectelement',  'method',
+  'params',        'modifier',      'modparameter',  'arrayelements',
+  'arrayelement',  'doublequoted',  'doublequotedcontent',
     );
 
     static public $yyRuleName = array(
@@ -1359,8 +1328,8 @@ static public $yy_action = array(
  /*  63 */ "attributes ::= attribute",
  /*  64 */ "attributes ::=",
  /*  65 */ "attribute ::= SPACE ID EQUAL ID",
- /*  66 */ "attribute ::= SPACE ID EQUAL expr",
- /*  67 */ "attribute ::= SPACE ID EQUAL value",
+ /*  66 */ "attribute ::= ATTR expr",
+ /*  67 */ "attribute ::= ATTR value",
  /*  68 */ "attribute ::= SPACE ID",
  /*  69 */ "attribute ::= SPACE expr",
  /*  70 */ "attribute ::= SPACE value",
@@ -1419,82 +1388,84 @@ static public $yy_action = array(
  /* 123 */ "variable ::= DOLLAR varvar AT ID",
  /* 124 */ "variable ::= object",
  /* 125 */ "variable ::= HATCH ID HATCH",
- /* 126 */ "variable ::= HATCH variable HATCH",
- /* 127 */ "varindexed ::= DOLLAR varvar arrayindex",
- /* 128 */ "arrayindex ::= arrayindex indexdef",
- /* 129 */ "arrayindex ::=",
- /* 130 */ "indexdef ::= DOT DOLLAR varvar",
- /* 131 */ "indexdef ::= DOT DOLLAR varvar AT ID",
- /* 132 */ "indexdef ::= DOT ID",
- /* 133 */ "indexdef ::= DOT INTEGER",
- /* 134 */ "indexdef ::= DOT LDEL expr RDEL",
- /* 135 */ "indexdef ::= OPENB ID CLOSEB",
- /* 136 */ "indexdef ::= OPENB ID DOT ID CLOSEB",
- /* 137 */ "indexdef ::= OPENB expr CLOSEB",
- /* 138 */ "indexdef ::= OPENB CLOSEB",
- /* 139 */ "varvar ::= varvarele",
- /* 140 */ "varvar ::= varvar varvarele",
- /* 141 */ "varvarele ::= ID",
- /* 142 */ "varvarele ::= LDEL expr RDEL",
- /* 143 */ "object ::= varindexed objectchain",
- /* 144 */ "objectchain ::= objectelement",
- /* 145 */ "objectchain ::= objectchain objectelement",
- /* 146 */ "objectelement ::= PTR ID arrayindex",
- /* 147 */ "objectelement ::= PTR DOLLAR varvar arrayindex",
- /* 148 */ "objectelement ::= PTR LDEL expr RDEL arrayindex",
- /* 149 */ "objectelement ::= PTR ID LDEL expr RDEL arrayindex",
- /* 150 */ "objectelement ::= PTR method",
- /* 151 */ "function ::= ID OPENP params CLOSEP",
- /* 152 */ "method ::= ID OPENP params CLOSEP",
- /* 153 */ "method ::= DOLLAR ID OPENP params CLOSEP",
- /* 154 */ "params ::= params COMMA expr",
- /* 155 */ "params ::= expr",
- /* 156 */ "params ::=",
- /* 157 */ "modifierlist ::= modifierlist modifier modparameters",
- /* 158 */ "modifierlist ::= modifier modparameters",
- /* 159 */ "modifier ::= VERT AT ID",
- /* 160 */ "modifier ::= VERT ID",
- /* 161 */ "modparameters ::= modparameters modparameter",
- /* 162 */ "modparameters ::=",
- /* 163 */ "modparameter ::= COLON value",
- /* 164 */ "modparameter ::= COLON array",
- /* 165 */ "static_class_access ::= method",
- /* 166 */ "static_class_access ::= method objectchain",
- /* 167 */ "static_class_access ::= ID",
- /* 168 */ "static_class_access ::= DOLLAR ID arrayindex",
- /* 169 */ "static_class_access ::= DOLLAR ID arrayindex objectchain",
- /* 170 */ "ifcond ::= EQUALS",
- /* 171 */ "ifcond ::= NOTEQUALS",
- /* 172 */ "ifcond ::= GREATERTHAN",
- /* 173 */ "ifcond ::= LESSTHAN",
- /* 174 */ "ifcond ::= GREATEREQUAL",
- /* 175 */ "ifcond ::= LESSEQUAL",
- /* 176 */ "ifcond ::= IDENTITY",
- /* 177 */ "ifcond ::= NONEIDENTITY",
- /* 178 */ "ifcond ::= MOD",
- /* 179 */ "lop ::= LAND",
- /* 180 */ "lop ::= LOR",
- /* 181 */ "lop ::= LXOR",
- /* 182 */ "array ::= OPENB arrayelements CLOSEB",
- /* 183 */ "arrayelements ::= arrayelement",
- /* 184 */ "arrayelements ::= arrayelements COMMA arrayelement",
- /* 185 */ "arrayelements ::=",
- /* 186 */ "arrayelement ::= value APTR expr",
- /* 187 */ "arrayelement ::= ID APTR expr",
- /* 188 */ "arrayelement ::= expr",
- /* 189 */ "doublequoted_with_quotes ::= QUOTE QUOTE",
- /* 190 */ "doublequoted_with_quotes ::= QUOTE doublequoted QUOTE",
- /* 191 */ "doublequoted ::= doublequoted doublequotedcontent",
- /* 192 */ "doublequoted ::= doublequotedcontent",
- /* 193 */ "doublequotedcontent ::= BACKTICK variable BACKTICK",
- /* 194 */ "doublequotedcontent ::= BACKTICK expr BACKTICK",
- /* 195 */ "doublequotedcontent ::= DOLLARID",
- /* 196 */ "doublequotedcontent ::= LDEL variable RDEL",
- /* 197 */ "doublequotedcontent ::= LDEL expr RDEL",
- /* 198 */ "doublequotedcontent ::= smartytag",
- /* 199 */ "doublequotedcontent ::= TEXT",
- /* 200 */ "optspace ::= SPACE",
- /* 201 */ "optspace ::=",
+ /* 126 */ "variable ::= HATCH ID HATCH arrayindex",
+ /* 127 */ "variable ::= HATCH variable HATCH",
+ /* 128 */ "variable ::= HATCH variable HATCH arrayindex",
+ /* 129 */ "varindexed ::= DOLLAR varvar arrayindex",
+ /* 130 */ "arrayindex ::= arrayindex indexdef",
+ /* 131 */ "arrayindex ::=",
+ /* 132 */ "indexdef ::= DOT DOLLAR varvar",
+ /* 133 */ "indexdef ::= DOT DOLLAR varvar AT ID",
+ /* 134 */ "indexdef ::= DOT ID",
+ /* 135 */ "indexdef ::= DOT INTEGER",
+ /* 136 */ "indexdef ::= DOT LDEL expr RDEL",
+ /* 137 */ "indexdef ::= OPENB ID CLOSEB",
+ /* 138 */ "indexdef ::= OPENB ID DOT ID CLOSEB",
+ /* 139 */ "indexdef ::= OPENB expr CLOSEB",
+ /* 140 */ "indexdef ::= OPENB CLOSEB",
+ /* 141 */ "varvar ::= varvarele",
+ /* 142 */ "varvar ::= varvar varvarele",
+ /* 143 */ "varvarele ::= ID",
+ /* 144 */ "varvarele ::= LDEL expr RDEL",
+ /* 145 */ "object ::= varindexed objectchain",
+ /* 146 */ "objectchain ::= objectelement",
+ /* 147 */ "objectchain ::= objectchain objectelement",
+ /* 148 */ "objectelement ::= PTR ID arrayindex",
+ /* 149 */ "objectelement ::= PTR DOLLAR varvar arrayindex",
+ /* 150 */ "objectelement ::= PTR LDEL expr RDEL arrayindex",
+ /* 151 */ "objectelement ::= PTR ID LDEL expr RDEL arrayindex",
+ /* 152 */ "objectelement ::= PTR method",
+ /* 153 */ "function ::= ID OPENP params CLOSEP",
+ /* 154 */ "method ::= ID OPENP params CLOSEP",
+ /* 155 */ "method ::= DOLLAR ID OPENP params CLOSEP",
+ /* 156 */ "params ::= params COMMA expr",
+ /* 157 */ "params ::= expr",
+ /* 158 */ "params ::=",
+ /* 159 */ "modifierlist ::= modifierlist modifier modparameters",
+ /* 160 */ "modifierlist ::= modifier modparameters",
+ /* 161 */ "modifier ::= VERT AT ID",
+ /* 162 */ "modifier ::= VERT ID",
+ /* 163 */ "modparameters ::= modparameters modparameter",
+ /* 164 */ "modparameters ::=",
+ /* 165 */ "modparameter ::= COLON value",
+ /* 166 */ "modparameter ::= COLON array",
+ /* 167 */ "static_class_access ::= method",
+ /* 168 */ "static_class_access ::= method objectchain",
+ /* 169 */ "static_class_access ::= ID",
+ /* 170 */ "static_class_access ::= DOLLAR ID arrayindex",
+ /* 171 */ "static_class_access ::= DOLLAR ID arrayindex objectchain",
+ /* 172 */ "ifcond ::= EQUALS",
+ /* 173 */ "ifcond ::= NOTEQUALS",
+ /* 174 */ "ifcond ::= GREATERTHAN",
+ /* 175 */ "ifcond ::= LESSTHAN",
+ /* 176 */ "ifcond ::= GREATEREQUAL",
+ /* 177 */ "ifcond ::= LESSEQUAL",
+ /* 178 */ "ifcond ::= IDENTITY",
+ /* 179 */ "ifcond ::= NONEIDENTITY",
+ /* 180 */ "ifcond ::= MOD",
+ /* 181 */ "lop ::= LAND",
+ /* 182 */ "lop ::= LOR",
+ /* 183 */ "lop ::= LXOR",
+ /* 184 */ "array ::= OPENB arrayelements CLOSEB",
+ /* 185 */ "arrayelements ::= arrayelement",
+ /* 186 */ "arrayelements ::= arrayelements COMMA arrayelement",
+ /* 187 */ "arrayelements ::=",
+ /* 188 */ "arrayelement ::= value APTR expr",
+ /* 189 */ "arrayelement ::= ID APTR expr",
+ /* 190 */ "arrayelement ::= expr",
+ /* 191 */ "doublequoted_with_quotes ::= QUOTE QUOTE",
+ /* 192 */ "doublequoted_with_quotes ::= QUOTE doublequoted QUOTE",
+ /* 193 */ "doublequoted ::= doublequoted doublequotedcontent",
+ /* 194 */ "doublequoted ::= doublequotedcontent",
+ /* 195 */ "doublequotedcontent ::= BACKTICK variable BACKTICK",
+ /* 196 */ "doublequotedcontent ::= BACKTICK expr BACKTICK",
+ /* 197 */ "doublequotedcontent ::= DOLLARID",
+ /* 198 */ "doublequotedcontent ::= LDEL variable RDEL",
+ /* 199 */ "doublequotedcontent ::= LDEL expr RDEL",
+ /* 200 */ "doublequotedcontent ::= smartytag",
+ /* 201 */ "doublequotedcontent ::= TEXT",
+ /* 202 */ "optspace ::= SPACE",
+ /* 203 */ "optspace ::=",
     );
 
     function tokenName($tokenType)
@@ -1754,7 +1725,7 @@ static public $yy_action = array(
 
     $this->internalError = true;
     $this->compiler->trigger_template_error("Stack overflow in template parser");
-#line 1753 "smarty_internal_templateparser.php"
+#line 1724 "smarty_internal_templateparser.php"
             return;
         }
         $yytos = new TP_yyStackEntry;
@@ -1775,208 +1746,210 @@ static public $yy_action = array(
     }
 
     static public $yyRuleInfo = array(
-  array( 'lhs' => 81, 'rhs' => 1 ),
   array( 'lhs' => 82, 'rhs' => 1 ),
-  array( 'lhs' => 82, 'rhs' => 2 ),
-  array( 'lhs' => 82, 'rhs' => 0 ),
   array( 'lhs' => 83, 'rhs' => 1 ),
-  array( 'lhs' => 83, 'rhs' => 1 ),
-  array( 'lhs' => 83, 'rhs' => 1 ),
-  array( 'lhs' => 83, 'rhs' => 1 ),
-  array( 'lhs' => 83, 'rhs' => 1 ),
-  array( 'lhs' => 83, 'rhs' => 1 ),
-  array( 'lhs' => 83, 'rhs' => 1 ),
-  array( 'lhs' => 83, 'rhs' => 1 ),
-  array( 'lhs' => 83, 'rhs' => 1 ),
-  array( 'lhs' => 83, 'rhs' => 1 ),
-  array( 'lhs' => 83, 'rhs' => 1 ),
-  array( 'lhs' => 83, 'rhs' => 1 ),
-  array( 'lhs' => 85, 'rhs' => 2 ),
-  array( 'lhs' => 85, 'rhs' => 3 ),
-  array( 'lhs' => 86, 'rhs' => 2 ),
-  array( 'lhs' => 86, 'rhs' => 0 ),
-  array( 'lhs' => 87, 'rhs' => 1 ),
-  array( 'lhs' => 87, 'rhs' => 1 ),
-  array( 'lhs' => 87, 'rhs' => 1 ),
-  array( 'lhs' => 87, 'rhs' => 1 ),
-  array( 'lhs' => 87, 'rhs' => 1 ),
-  array( 'lhs' => 87, 'rhs' => 1 ),
-  array( 'lhs' => 87, 'rhs' => 1 ),
-  array( 'lhs' => 84, 'rhs' => 3 ),
-  array( 'lhs' => 84, 'rhs' => 5 ),
-  array( 'lhs' => 84, 'rhs' => 4 ),
-  array( 'lhs' => 84, 'rhs' => 5 ),
-  array( 'lhs' => 84, 'rhs' => 4 ),
-  array( 'lhs' => 84, 'rhs' => 6 ),
-  array( 'lhs' => 84, 'rhs' => 6 ),
-  array( 'lhs' => 84, 'rhs' => 7 ),
-  array( 'lhs' => 84, 'rhs' => 6 ),
-  array( 'lhs' => 84, 'rhs' => 4 ),
-  array( 'lhs' => 84, 'rhs' => 3 ),
-  array( 'lhs' => 84, 'rhs' => 6 ),
-  array( 'lhs' => 84, 'rhs' => 5 ),
-  array( 'lhs' => 84, 'rhs' => 7 ),
-  array( 'lhs' => 84, 'rhs' => 3 ),
-  array( 'lhs' => 84, 'rhs' => 4 ),
-  array( 'lhs' => 84, 'rhs' => 3 ),
-  array( 'lhs' => 84, 'rhs' => 4 ),
-  array( 'lhs' => 84, 'rhs' => 12 ),
-  array( 'lhs' => 97, 'rhs' => 2 ),
-  array( 'lhs' => 97, 'rhs' => 1 ),
-  array( 'lhs' => 84, 'rhs' => 6 ),
-  array( 'lhs' => 84, 'rhs' => 8 ),
-  array( 'lhs' => 84, 'rhs' => 3 ),
-  array( 'lhs' => 84, 'rhs' => 8 ),
-  array( 'lhs' => 84, 'rhs' => 11 ),
-  array( 'lhs' => 84, 'rhs' => 8 ),
-  array( 'lhs' => 84, 'rhs' => 11 ),
-  array( 'lhs' => 84, 'rhs' => 4 ),
-  array( 'lhs' => 84, 'rhs' => 5 ),
+  array( 'lhs' => 83, 'rhs' => 2 ),
+  array( 'lhs' => 83, 'rhs' => 0 ),
   array( 'lhs' => 84, 'rhs' => 1 ),
-  array( 'lhs' => 84, 'rhs' => 3 ),
-  array( 'lhs' => 84, 'rhs' => 4 ),
-  array( 'lhs' => 84, 'rhs' => 5 ),
-  array( 'lhs' => 84, 'rhs' => 6 ),
-  array( 'lhs' => 90, 'rhs' => 2 ),
-  array( 'lhs' => 90, 'rhs' => 1 ),
-  array( 'lhs' => 90, 'rhs' => 0 ),
-  array( 'lhs' => 99, 'rhs' => 4 ),
-  array( 'lhs' => 99, 'rhs' => 4 ),
-  array( 'lhs' => 99, 'rhs' => 4 ),
-  array( 'lhs' => 99, 'rhs' => 2 ),
-  array( 'lhs' => 99, 'rhs' => 2 ),
-  array( 'lhs' => 99, 'rhs' => 2 ),
-  array( 'lhs' => 99, 'rhs' => 4 ),
-  array( 'lhs' => 94, 'rhs' => 1 ),
-  array( 'lhs' => 94, 'rhs' => 3 ),
-  array( 'lhs' => 93, 'rhs' => 4 ),
-  array( 'lhs' => 93, 'rhs' => 3 ),
-  array( 'lhs' => 93, 'rhs' => 3 ),
-  array( 'lhs' => 91, 'rhs' => 1 ),
-  array( 'lhs' => 91, 'rhs' => 1 ),
-  array( 'lhs' => 91, 'rhs' => 4 ),
-  array( 'lhs' => 91, 'rhs' => 3 ),
-  array( 'lhs' => 91, 'rhs' => 3 ),
-  array( 'lhs' => 91, 'rhs' => 3 ),
-  array( 'lhs' => 91, 'rhs' => 1 ),
-  array( 'lhs' => 91, 'rhs' => 2 ),
-  array( 'lhs' => 91, 'rhs' => 3 ),
-  array( 'lhs' => 91, 'rhs' => 3 ),
-  array( 'lhs' => 91, 'rhs' => 3 ),
-  array( 'lhs' => 91, 'rhs' => 3 ),
-  array( 'lhs' => 91, 'rhs' => 3 ),
-  array( 'lhs' => 91, 'rhs' => 3 ),
-  array( 'lhs' => 91, 'rhs' => 2 ),
-  array( 'lhs' => 91, 'rhs' => 2 ),
-  array( 'lhs' => 91, 'rhs' => 3 ),
-  array( 'lhs' => 91, 'rhs' => 3 ),
-  array( 'lhs' => 91, 'rhs' => 2 ),
-  array( 'lhs' => 91, 'rhs' => 2 ),
-  array( 'lhs' => 91, 'rhs' => 3 ),
-  array( 'lhs' => 91, 'rhs' => 3 ),
-  array( 'lhs' => 91, 'rhs' => 3 ),
-  array( 'lhs' => 91, 'rhs' => 3 ),
-  array( 'lhs' => 100, 'rhs' => 8 ),
-  array( 'lhs' => 100, 'rhs' => 7 ),
-  array( 'lhs' => 88, 'rhs' => 1 ),
-  array( 'lhs' => 88, 'rhs' => 2 ),
-  array( 'lhs' => 88, 'rhs' => 2 ),
-  array( 'lhs' => 88, 'rhs' => 2 ),
-  array( 'lhs' => 88, 'rhs' => 2 ),
+  array( 'lhs' => 84, 'rhs' => 1 ),
+  array( 'lhs' => 84, 'rhs' => 1 ),
+  array( 'lhs' => 84, 'rhs' => 1 ),
+  array( 'lhs' => 84, 'rhs' => 1 ),
+  array( 'lhs' => 84, 'rhs' => 1 ),
+  array( 'lhs' => 84, 'rhs' => 1 ),
+  array( 'lhs' => 84, 'rhs' => 1 ),
+  array( 'lhs' => 84, 'rhs' => 1 ),
+  array( 'lhs' => 84, 'rhs' => 1 ),
+  array( 'lhs' => 84, 'rhs' => 1 ),
+  array( 'lhs' => 84, 'rhs' => 1 ),
+  array( 'lhs' => 86, 'rhs' => 2 ),
+  array( 'lhs' => 86, 'rhs' => 3 ),
+  array( 'lhs' => 87, 'rhs' => 2 ),
+  array( 'lhs' => 87, 'rhs' => 0 ),
   array( 'lhs' => 88, 'rhs' => 1 ),
   array( 'lhs' => 88, 'rhs' => 1 ),
-  array( 'lhs' => 88, 'rhs' => 3 ),
-  array( 'lhs' => 88, 'rhs' => 2 ),
-  array( 'lhs' => 88, 'rhs' => 2 ),
   array( 'lhs' => 88, 'rhs' => 1 ),
   array( 'lhs' => 88, 'rhs' => 1 ),
-  array( 'lhs' => 88, 'rhs' => 3 ),
   array( 'lhs' => 88, 'rhs' => 1 ),
   array( 'lhs' => 88, 'rhs' => 1 ),
-  array( 'lhs' => 88, 'rhs' => 3 ),
-  array( 'lhs' => 88, 'rhs' => 3 ),
   array( 'lhs' => 88, 'rhs' => 1 ),
-  array( 'lhs' => 88, 'rhs' => 2 ),
-  array( 'lhs' => 104, 'rhs' => 1 ),
-  array( 'lhs' => 104, 'rhs' => 4 ),
-  array( 'lhs' => 104, 'rhs' => 1 ),
-  array( 'lhs' => 104, 'rhs' => 3 ),
-  array( 'lhs' => 104, 'rhs' => 3 ),
+  array( 'lhs' => 85, 'rhs' => 3 ),
+  array( 'lhs' => 85, 'rhs' => 5 ),
+  array( 'lhs' => 85, 'rhs' => 4 ),
+  array( 'lhs' => 85, 'rhs' => 5 ),
+  array( 'lhs' => 85, 'rhs' => 4 ),
+  array( 'lhs' => 85, 'rhs' => 6 ),
+  array( 'lhs' => 85, 'rhs' => 6 ),
+  array( 'lhs' => 85, 'rhs' => 7 ),
+  array( 'lhs' => 85, 'rhs' => 6 ),
+  array( 'lhs' => 85, 'rhs' => 4 ),
+  array( 'lhs' => 85, 'rhs' => 3 ),
+  array( 'lhs' => 85, 'rhs' => 6 ),
+  array( 'lhs' => 85, 'rhs' => 5 ),
+  array( 'lhs' => 85, 'rhs' => 7 ),
+  array( 'lhs' => 85, 'rhs' => 3 ),
+  array( 'lhs' => 85, 'rhs' => 4 ),
+  array( 'lhs' => 85, 'rhs' => 3 ),
+  array( 'lhs' => 85, 'rhs' => 4 ),
+  array( 'lhs' => 85, 'rhs' => 12 ),
+  array( 'lhs' => 98, 'rhs' => 2 ),
+  array( 'lhs' => 98, 'rhs' => 1 ),
+  array( 'lhs' => 85, 'rhs' => 6 ),
+  array( 'lhs' => 85, 'rhs' => 8 ),
+  array( 'lhs' => 85, 'rhs' => 3 ),
+  array( 'lhs' => 85, 'rhs' => 8 ),
+  array( 'lhs' => 85, 'rhs' => 11 ),
+  array( 'lhs' => 85, 'rhs' => 8 ),
+  array( 'lhs' => 85, 'rhs' => 11 ),
+  array( 'lhs' => 85, 'rhs' => 4 ),
+  array( 'lhs' => 85, 'rhs' => 5 ),
+  array( 'lhs' => 85, 'rhs' => 1 ),
+  array( 'lhs' => 85, 'rhs' => 3 ),
+  array( 'lhs' => 85, 'rhs' => 4 ),
+  array( 'lhs' => 85, 'rhs' => 5 ),
+  array( 'lhs' => 85, 'rhs' => 6 ),
+  array( 'lhs' => 91, 'rhs' => 2 ),
+  array( 'lhs' => 91, 'rhs' => 1 ),
+  array( 'lhs' => 91, 'rhs' => 0 ),
+  array( 'lhs' => 100, 'rhs' => 4 ),
+  array( 'lhs' => 100, 'rhs' => 2 ),
+  array( 'lhs' => 100, 'rhs' => 2 ),
+  array( 'lhs' => 100, 'rhs' => 2 ),
+  array( 'lhs' => 100, 'rhs' => 2 ),
+  array( 'lhs' => 100, 'rhs' => 2 ),
+  array( 'lhs' => 100, 'rhs' => 4 ),
+  array( 'lhs' => 95, 'rhs' => 1 ),
+  array( 'lhs' => 95, 'rhs' => 3 ),
+  array( 'lhs' => 94, 'rhs' => 4 ),
+  array( 'lhs' => 94, 'rhs' => 3 ),
+  array( 'lhs' => 94, 'rhs' => 3 ),
+  array( 'lhs' => 92, 'rhs' => 1 ),
+  array( 'lhs' => 92, 'rhs' => 1 ),
+  array( 'lhs' => 92, 'rhs' => 4 ),
   array( 'lhs' => 92, 'rhs' => 3 ),
-  array( 'lhs' => 109, 'rhs' => 2 ),
-  array( 'lhs' => 109, 'rhs' => 0 ),
-  array( 'lhs' => 110, 'rhs' => 3 ),
-  array( 'lhs' => 110, 'rhs' => 5 ),
-  array( 'lhs' => 110, 'rhs' => 2 ),
-  array( 'lhs' => 110, 'rhs' => 2 ),
-  array( 'lhs' => 110, 'rhs' => 4 ),
-  array( 'lhs' => 110, 'rhs' => 3 ),
-  array( 'lhs' => 110, 'rhs' => 5 ),
-  array( 'lhs' => 110, 'rhs' => 3 ),
+  array( 'lhs' => 92, 'rhs' => 3 ),
+  array( 'lhs' => 92, 'rhs' => 3 ),
+  array( 'lhs' => 92, 'rhs' => 1 ),
+  array( 'lhs' => 92, 'rhs' => 2 ),
+  array( 'lhs' => 92, 'rhs' => 3 ),
+  array( 'lhs' => 92, 'rhs' => 3 ),
+  array( 'lhs' => 92, 'rhs' => 3 ),
+  array( 'lhs' => 92, 'rhs' => 3 ),
+  array( 'lhs' => 92, 'rhs' => 3 ),
+  array( 'lhs' => 92, 'rhs' => 3 ),
+  array( 'lhs' => 92, 'rhs' => 2 ),
+  array( 'lhs' => 92, 'rhs' => 2 ),
+  array( 'lhs' => 92, 'rhs' => 3 ),
+  array( 'lhs' => 92, 'rhs' => 3 ),
+  array( 'lhs' => 92, 'rhs' => 2 ),
+  array( 'lhs' => 92, 'rhs' => 2 ),
+  array( 'lhs' => 92, 'rhs' => 3 ),
+  array( 'lhs' => 92, 'rhs' => 3 ),
+  array( 'lhs' => 92, 'rhs' => 3 ),
+  array( 'lhs' => 92, 'rhs' => 3 ),
+  array( 'lhs' => 101, 'rhs' => 8 ),
+  array( 'lhs' => 101, 'rhs' => 7 ),
+  array( 'lhs' => 89, 'rhs' => 1 ),
+  array( 'lhs' => 89, 'rhs' => 2 ),
+  array( 'lhs' => 89, 'rhs' => 2 ),
+  array( 'lhs' => 89, 'rhs' => 2 ),
+  array( 'lhs' => 89, 'rhs' => 2 ),
+  array( 'lhs' => 89, 'rhs' => 1 ),
+  array( 'lhs' => 89, 'rhs' => 1 ),
+  array( 'lhs' => 89, 'rhs' => 3 ),
+  array( 'lhs' => 89, 'rhs' => 2 ),
+  array( 'lhs' => 89, 'rhs' => 2 ),
+  array( 'lhs' => 89, 'rhs' => 1 ),
+  array( 'lhs' => 89, 'rhs' => 1 ),
+  array( 'lhs' => 89, 'rhs' => 3 ),
+  array( 'lhs' => 89, 'rhs' => 1 ),
+  array( 'lhs' => 89, 'rhs' => 1 ),
+  array( 'lhs' => 89, 'rhs' => 3 ),
+  array( 'lhs' => 89, 'rhs' => 3 ),
+  array( 'lhs' => 89, 'rhs' => 1 ),
+  array( 'lhs' => 89, 'rhs' => 2 ),
+  array( 'lhs' => 105, 'rhs' => 1 ),
+  array( 'lhs' => 105, 'rhs' => 4 ),
+  array( 'lhs' => 105, 'rhs' => 1 ),
+  array( 'lhs' => 105, 'rhs' => 3 ),
+  array( 'lhs' => 105, 'rhs' => 4 ),
+  array( 'lhs' => 105, 'rhs' => 3 ),
+  array( 'lhs' => 105, 'rhs' => 4 ),
+  array( 'lhs' => 93, 'rhs' => 3 ),
   array( 'lhs' => 110, 'rhs' => 2 ),
-  array( 'lhs' => 96, 'rhs' => 1 ),
-  array( 'lhs' => 96, 'rhs' => 2 ),
-  array( 'lhs' => 111, 'rhs' => 1 ),
+  array( 'lhs' => 110, 'rhs' => 0 ),
   array( 'lhs' => 111, 'rhs' => 3 ),
-  array( 'lhs' => 108, 'rhs' => 2 ),
+  array( 'lhs' => 111, 'rhs' => 5 ),
+  array( 'lhs' => 111, 'rhs' => 2 ),
+  array( 'lhs' => 111, 'rhs' => 2 ),
+  array( 'lhs' => 111, 'rhs' => 4 ),
+  array( 'lhs' => 111, 'rhs' => 3 ),
+  array( 'lhs' => 111, 'rhs' => 5 ),
+  array( 'lhs' => 111, 'rhs' => 3 ),
+  array( 'lhs' => 111, 'rhs' => 2 ),
+  array( 'lhs' => 97, 'rhs' => 1 ),
+  array( 'lhs' => 97, 'rhs' => 2 ),
   array( 'lhs' => 112, 'rhs' => 1 ),
-  array( 'lhs' => 112, 'rhs' => 2 ),
-  array( 'lhs' => 113, 'rhs' => 3 ),
-  array( 'lhs' => 113, 'rhs' => 4 ),
-  array( 'lhs' => 113, 'rhs' => 5 ),
-  array( 'lhs' => 113, 'rhs' => 6 ),
+  array( 'lhs' => 112, 'rhs' => 3 ),
+  array( 'lhs' => 109, 'rhs' => 2 ),
+  array( 'lhs' => 113, 'rhs' => 1 ),
   array( 'lhs' => 113, 'rhs' => 2 ),
-  array( 'lhs' => 105, 'rhs' => 4 ),
+  array( 'lhs' => 114, 'rhs' => 3 ),
   array( 'lhs' => 114, 'rhs' => 4 ),
   array( 'lhs' => 114, 'rhs' => 5 ),
-  array( 'lhs' => 115, 'rhs' => 3 ),
-  array( 'lhs' => 115, 'rhs' => 1 ),
-  array( 'lhs' => 115, 'rhs' => 0 ),
-  array( 'lhs' => 89, 'rhs' => 3 ),
-  array( 'lhs' => 89, 'rhs' => 2 ),
+  array( 'lhs' => 114, 'rhs' => 6 ),
+  array( 'lhs' => 114, 'rhs' => 2 ),
+  array( 'lhs' => 106, 'rhs' => 4 ),
+  array( 'lhs' => 115, 'rhs' => 4 ),
+  array( 'lhs' => 115, 'rhs' => 5 ),
   array( 'lhs' => 116, 'rhs' => 3 ),
-  array( 'lhs' => 116, 'rhs' => 2 ),
-  array( 'lhs' => 98, 'rhs' => 2 ),
-  array( 'lhs' => 98, 'rhs' => 0 ),
-  array( 'lhs' => 117, 'rhs' => 2 ),
+  array( 'lhs' => 116, 'rhs' => 1 ),
+  array( 'lhs' => 116, 'rhs' => 0 ),
+  array( 'lhs' => 90, 'rhs' => 3 ),
+  array( 'lhs' => 90, 'rhs' => 2 ),
+  array( 'lhs' => 117, 'rhs' => 3 ),
   array( 'lhs' => 117, 'rhs' => 2 ),
-  array( 'lhs' => 107, 'rhs' => 1 ),
-  array( 'lhs' => 107, 'rhs' => 2 ),
-  array( 'lhs' => 107, 'rhs' => 1 ),
-  array( 'lhs' => 107, 'rhs' => 3 ),
-  array( 'lhs' => 107, 'rhs' => 4 ),
-  array( 'lhs' => 102, 'rhs' => 1 ),
-  array( 'lhs' => 102, 'rhs' => 1 ),
-  array( 'lhs' => 102, 'rhs' => 1 ),
-  array( 'lhs' => 102, 'rhs' => 1 ),
-  array( 'lhs' => 102, 'rhs' => 1 ),
-  array( 'lhs' => 102, 'rhs' => 1 ),
-  array( 'lhs' => 102, 'rhs' => 1 ),
-  array( 'lhs' => 102, 'rhs' => 1 ),
-  array( 'lhs' => 102, 'rhs' => 1 ),
+  array( 'lhs' => 99, 'rhs' => 2 ),
+  array( 'lhs' => 99, 'rhs' => 0 ),
+  array( 'lhs' => 118, 'rhs' => 2 ),
+  array( 'lhs' => 118, 'rhs' => 2 ),
+  array( 'lhs' => 108, 'rhs' => 1 ),
+  array( 'lhs' => 108, 'rhs' => 2 ),
+  array( 'lhs' => 108, 'rhs' => 1 ),
+  array( 'lhs' => 108, 'rhs' => 3 ),
+  array( 'lhs' => 108, 'rhs' => 4 ),
   array( 'lhs' => 103, 'rhs' => 1 ),
   array( 'lhs' => 103, 'rhs' => 1 ),
   array( 'lhs' => 103, 'rhs' => 1 ),
-  array( 'lhs' => 101, 'rhs' => 3 ),
-  array( 'lhs' => 118, 'rhs' => 1 ),
-  array( 'lhs' => 118, 'rhs' => 3 ),
-  array( 'lhs' => 118, 'rhs' => 0 ),
-  array( 'lhs' => 119, 'rhs' => 3 ),
-  array( 'lhs' => 119, 'rhs' => 3 ),
+  array( 'lhs' => 103, 'rhs' => 1 ),
+  array( 'lhs' => 103, 'rhs' => 1 ),
+  array( 'lhs' => 103, 'rhs' => 1 ),
+  array( 'lhs' => 103, 'rhs' => 1 ),
+  array( 'lhs' => 103, 'rhs' => 1 ),
+  array( 'lhs' => 103, 'rhs' => 1 ),
+  array( 'lhs' => 104, 'rhs' => 1 ),
+  array( 'lhs' => 104, 'rhs' => 1 ),
+  array( 'lhs' => 104, 'rhs' => 1 ),
+  array( 'lhs' => 102, 'rhs' => 3 ),
   array( 'lhs' => 119, 'rhs' => 1 ),
-  array( 'lhs' => 106, 'rhs' => 2 ),
-  array( 'lhs' => 106, 'rhs' => 3 ),
-  array( 'lhs' => 120, 'rhs' => 2 ),
+  array( 'lhs' => 119, 'rhs' => 3 ),
+  array( 'lhs' => 119, 'rhs' => 0 ),
+  array( 'lhs' => 120, 'rhs' => 3 ),
+  array( 'lhs' => 120, 'rhs' => 3 ),
   array( 'lhs' => 120, 'rhs' => 1 ),
-  array( 'lhs' => 121, 'rhs' => 3 ),
-  array( 'lhs' => 121, 'rhs' => 3 ),
-  array( 'lhs' => 121, 'rhs' => 1 ),
-  array( 'lhs' => 121, 'rhs' => 3 ),
-  array( 'lhs' => 121, 'rhs' => 3 ),
-  array( 'lhs' => 121, 'rhs' => 1 ),
+  array( 'lhs' => 107, 'rhs' => 2 ),
+  array( 'lhs' => 107, 'rhs' => 3 ),
+  array( 'lhs' => 121, 'rhs' => 2 ),
   array( 'lhs' => 121, 'rhs' => 1 ),
-  array( 'lhs' => 95, 'rhs' => 1 ),
-  array( 'lhs' => 95, 'rhs' => 0 ),
+  array( 'lhs' => 122, 'rhs' => 3 ),
+  array( 'lhs' => 122, 'rhs' => 3 ),
+  array( 'lhs' => 122, 'rhs' => 1 ),
+  array( 'lhs' => 122, 'rhs' => 3 ),
+  array( 'lhs' => 122, 'rhs' => 3 ),
+  array( 'lhs' => 122, 'rhs' => 1 ),
+  array( 'lhs' => 122, 'rhs' => 1 ),
+  array( 'lhs' => 96, 'rhs' => 1 ),
+  array( 'lhs' => 96, 'rhs' => 0 ),
     );
 
     static public $yyReduceMap = array(
@@ -1997,15 +1970,15 @@ static public $yy_action = array(
         15 => 15,
         16 => 16,
         19 => 16,
-        201 => 16,
+        203 => 16,
         17 => 17,
         76 => 17,
         18 => 18,
         104 => 18,
         106 => 18,
         107 => 18,
-        128 => 18,
-        166 => 18,
+        130 => 18,
+        168 => 18,
         20 => 20,
         21 => 20,
         47 => 20,
@@ -2021,12 +1994,12 @@ static public $yy_action = array(
         116 => 20,
         117 => 20,
         124 => 20,
-        139 => 20,
-        165 => 20,
+        141 => 20,
         167 => 20,
-        183 => 20,
-        188 => 20,
-        200 => 20,
+        169 => 20,
+        185 => 20,
+        190 => 20,
+        202 => 20,
         22 => 22,
         23 => 22,
         24 => 24,
@@ -2069,18 +2042,18 @@ static public $yy_action = array(
         62 => 62,
         63 => 63,
         72 => 63,
-        155 => 63,
-        159 => 63,
-        163 => 63,
-        164 => 63,
+        157 => 63,
+        161 => 63,
+        165 => 63,
+        166 => 63,
         64 => 64,
-        156 => 64,
-        162 => 64,
+        158 => 64,
+        164 => 64,
         65 => 65,
         66 => 66,
         67 => 66,
-        71 => 66,
         68 => 68,
+        71 => 71,
         73 => 73,
         74 => 74,
         75 => 74,
@@ -2122,19 +2095,19 @@ static public $yy_action = array(
         125 => 125,
         126 => 126,
         127 => 127,
+        128 => 128,
         129 => 129,
-        185 => 129,
-        130 => 130,
         131 => 131,
+        187 => 131,
         132 => 132,
         133 => 133,
         134 => 134,
-        137 => 134,
         135 => 135,
         136 => 136,
+        139 => 136,
+        137 => 137,
         138 => 138,
         140 => 140,
-        141 => 141,
         142 => 142,
         143 => 143,
         144 => 144,
@@ -2148,12 +2121,12 @@ static public $yy_action = array(
         152 => 152,
         153 => 153,
         154 => 154,
-        157 => 157,
-        158 => 158,
+        155 => 155,
+        156 => 156,
+        159 => 159,
         160 => 160,
-        161 => 161,
-        168 => 168,
-        169 => 169,
+        162 => 162,
+        163 => 163,
         170 => 170,
         171 => 171,
         172 => 172,
@@ -2167,31 +2140,33 @@ static public $yy_action = array(
         180 => 180,
         181 => 181,
         182 => 182,
+        183 => 183,
         184 => 184,
         186 => 186,
-        187 => 187,
+        188 => 188,
         189 => 189,
-        190 => 190,
         191 => 191,
         192 => 192,
         193 => 193,
-        194 => 193,
-        196 => 193,
+        194 => 194,
         195 => 195,
+        196 => 195,
+        198 => 195,
         197 => 197,
-        198 => 198,
         199 => 199,
+        200 => 200,
+        201 => 201,
     );
 #line 95 "smarty_internal_templateparser.y"
     function yy_r0(){
     $this->_retvalue = $this->root_buffer->to_smarty_php();
     }
-#line 2185 "smarty_internal_templateparser.php"
+#line 2160 "smarty_internal_templateparser.php"
 #line 103 "smarty_internal_templateparser.y"
     function yy_r1(){
     $this->current_buffer->append_subtree($this->yystack[$this->yyidx + 0]->minor);
     }
-#line 2190 "smarty_internal_templateparser.php"
+#line 2165 "smarty_internal_templateparser.php"
 #line 119 "smarty_internal_templateparser.y"
     function yy_r4(){
     if ($this->compiler->has_code) {
@@ -2203,17 +2178,17 @@ static public $yy_action = array(
     $this->compiler->has_variable_string = false;
     $this->block_nesting_level = count($this->compiler->_tag_stack);
     }
-#line 2202 "smarty_internal_templateparser.php"
+#line 2177 "smarty_internal_templateparser.php"
 #line 131 "smarty_internal_templateparser.y"
     function yy_r5(){
     $this->_retvalue = new _smarty_tag($this, '');
     }
-#line 2207 "smarty_internal_templateparser.php"
+#line 2182 "smarty_internal_templateparser.php"
 #line 136 "smarty_internal_templateparser.y"
     function yy_r6(){
     $this->_retvalue = new _smarty_text($this, $this->yystack[$this->yyidx + 0]->minor);
     }
-#line 2212 "smarty_internal_templateparser.php"
+#line 2187 "smarty_internal_templateparser.php"
 #line 141 "smarty_internal_templateparser.y"
     function yy_r7(){
     if ($this->php_handling == Smarty::PHP_PASSTHRU) {
@@ -2229,14 +2204,14 @@ static public $yy_action = array(
         $this->_retvalue = new _smarty_text($this, '');
     }
     }
-#line 2228 "smarty_internal_templateparser.php"
+#line 2203 "smarty_internal_templateparser.php"
 #line 157 "smarty_internal_templateparser.y"
     function yy_r8(){
     if ($this->is_xml) {
         $this->compiler->tag_nocache = true;
         $this->is_xml = false;
         $save = $this->template->has_nocache_code;
-        $this->_retvalue = new _smarty_text($this, $this->compiler->processNocacheCode("<?php echo '?>';?>", $this->compiler, true));
+        $this->_retvalue = new _smarty_text($this, $this->compiler->processNocacheCode("<?php echo '?>';?>\n", $this->compiler, true));
         $this->template->has_nocache_code = $save;
     } elseif ($this->php_handling == Smarty::PHP_PASSTHRU) {
         $this->_retvalue = new _smarty_text($this, '?<?php ?>>');
@@ -2248,7 +2223,7 @@ static public $yy_action = array(
         $this->_retvalue = new _smarty_text($this, '');
     }
     }
-#line 2247 "smarty_internal_templateparser.php"
+#line 2222 "smarty_internal_templateparser.php"
 #line 176 "smarty_internal_templateparser.y"
     function yy_r9(){
     if ($this->php_handling == Smarty::PHP_PASSTHRU) {
@@ -2272,7 +2247,7 @@ static public $yy_action = array(
         }
     }
     }
-#line 2271 "smarty_internal_templateparser.php"
+#line 2246 "smarty_internal_templateparser.php"
 #line 200 "smarty_internal_templateparser.y"
     function yy_r10(){
     if ($this->php_handling == Smarty::PHP_PASSTHRU) {
@@ -2293,7 +2268,7 @@ static public $yy_action = array(
         }
     }
     }
-#line 2292 "smarty_internal_templateparser.php"
+#line 2267 "smarty_internal_templateparser.php"
 #line 220 "smarty_internal_templateparser.y"
     function yy_r11(){
     if ($this->strip) {
@@ -2302,7 +2277,7 @@ static public $yy_action = array(
         $this->_retvalue = new _smarty_text($this, self::escape_start_tag($this->yystack[$this->yyidx + 0]->minor));
     }
     }
-#line 2301 "smarty_internal_templateparser.php"
+#line 2276 "smarty_internal_templateparser.php"
 #line 229 "smarty_internal_templateparser.y"
     function yy_r12(){
     $this->compiler->tag_nocache = true;
@@ -2311,7 +2286,7 @@ static public $yy_action = array(
     $this->_retvalue = new _smarty_text($this, $this->compiler->processNocacheCode("<?php echo '<?xml';?>", $this->compiler, true));
     $this->template->has_nocache_code = $save;
     }
-#line 2310 "smarty_internal_templateparser.php"
+#line 2285 "smarty_internal_templateparser.php"
 #line 238 "smarty_internal_templateparser.y"
     function yy_r13(){
     if ($this->strip) {
@@ -2320,235 +2295,235 @@ static public $yy_action = array(
         $this->_retvalue = new _smarty_text($this, $this->yystack[$this->yyidx + 0]->minor);
     }
     }
-#line 2319 "smarty_internal_templateparser.php"
+#line 2294 "smarty_internal_templateparser.php"
 #line 247 "smarty_internal_templateparser.y"
     function yy_r14(){
     $this->strip = true;
     $this->_retvalue = new _smarty_text($this, '');
     }
-#line 2325 "smarty_internal_templateparser.php"
+#line 2300 "smarty_internal_templateparser.php"
 #line 252 "smarty_internal_templateparser.y"
     function yy_r15(){
     $this->strip = false;
     $this->_retvalue = new _smarty_text($this, '');
     }
-#line 2331 "smarty_internal_templateparser.php"
+#line 2306 "smarty_internal_templateparser.php"
 #line 258 "smarty_internal_templateparser.y"
     function yy_r16(){
     $this->_retvalue = '';
     }
-#line 2336 "smarty_internal_templateparser.php"
+#line 2311 "smarty_internal_templateparser.php"
 #line 262 "smarty_internal_templateparser.y"
     function yy_r17(){
     $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor;
     }
-#line 2341 "smarty_internal_templateparser.php"
+#line 2316 "smarty_internal_templateparser.php"
 #line 266 "smarty_internal_templateparser.y"
     function yy_r18(){
     $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;
     }
-#line 2346 "smarty_internal_templateparser.php"
+#line 2321 "smarty_internal_templateparser.php"
 #line 274 "smarty_internal_templateparser.y"
     function yy_r20(){
     $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;
     }
-#line 2351 "smarty_internal_templateparser.php"
+#line 2326 "smarty_internal_templateparser.php"
 #line 282 "smarty_internal_templateparser.y"
     function yy_r22(){
     $this->_retvalue = self::escape_start_tag($this->yystack[$this->yyidx + 0]->minor);
     }
-#line 2356 "smarty_internal_templateparser.php"
+#line 2331 "smarty_internal_templateparser.php"
 #line 290 "smarty_internal_templateparser.y"
     function yy_r24(){
     $this->_retvalue = self::escape_end_tag($this->yystack[$this->yyidx + 0]->minor);
     }
-#line 2361 "smarty_internal_templateparser.php"
+#line 2336 "smarty_internal_templateparser.php"
 #line 294 "smarty_internal_templateparser.y"
     function yy_r25(){
     $this->_retvalue = '<<?php ?>%';
     }
-#line 2366 "smarty_internal_templateparser.php"
+#line 2341 "smarty_internal_templateparser.php"
 #line 298 "smarty_internal_templateparser.y"
     function yy_r26(){
     $this->_retvalue = '%<?php ?>>';
     }
-#line 2371 "smarty_internal_templateparser.php"
+#line 2346 "smarty_internal_templateparser.php"
 #line 307 "smarty_internal_templateparser.y"
     function yy_r27(){
     $this->_retvalue = $this->compiler->compileTag('private_print_expression',array(),array('value'=>$this->yystack[$this->yyidx + -1]->minor));
     }
-#line 2376 "smarty_internal_templateparser.php"
+#line 2351 "smarty_internal_templateparser.php"
 #line 311 "smarty_internal_templateparser.y"
     function yy_r28(){
     $this->_retvalue = $this->compiler->compileTag('private_print_expression',$this->yystack[$this->yyidx + -1]->minor,array('value'=>$this->yystack[$this->yyidx + -3]->minor, 'modifierlist'=>$this->yystack[$this->yyidx + -2]->minor));
     }
-#line 2381 "smarty_internal_templateparser.php"
+#line 2356 "smarty_internal_templateparser.php"
 #line 315 "smarty_internal_templateparser.y"
     function yy_r29(){
     $this->_retvalue = $this->compiler->compileTag('private_print_expression',$this->yystack[$this->yyidx + -1]->minor,array('value'=>$this->yystack[$this->yyidx + -2]->minor));
     }
-#line 2386 "smarty_internal_templateparser.php"
+#line 2361 "smarty_internal_templateparser.php"
 #line 319 "smarty_internal_templateparser.y"
     function yy_r30(){
     $this->_retvalue = $this->compiler->compileTag('private_print_expression',$this->yystack[$this->yyidx + -1]->minor,array('value'=>$this->yystack[$this->yyidx + -3]->minor,'modifierlist'=>$this->yystack[$this->yyidx + -2]->minor));
     }
-#line 2391 "smarty_internal_templateparser.php"
+#line 2366 "smarty_internal_templateparser.php"
 #line 332 "smarty_internal_templateparser.y"
     function yy_r32(){
     $this->_retvalue = $this->compiler->compileTag('assign',array(array('value'=>$this->yystack[$this->yyidx + -1]->minor),array('var'=>"'".$this->yystack[$this->yyidx + -3]->minor."'")));
     }
-#line 2396 "smarty_internal_templateparser.php"
+#line 2371 "smarty_internal_templateparser.php"
 #line 340 "smarty_internal_templateparser.y"
     function yy_r34(){
     $this->_retvalue = $this->compiler->compileTag('assign',array_merge(array(array('value'=>$this->yystack[$this->yyidx + -2]->minor),array('var'=>"'".$this->yystack[$this->yyidx + -4]->minor."'")),$this->yystack[$this->yyidx + -1]->minor));
     }
-#line 2401 "smarty_internal_templateparser.php"
+#line 2376 "smarty_internal_templateparser.php"
 #line 344 "smarty_internal_templateparser.y"
     function yy_r35(){
     $this->_retvalue = $this->compiler->compileTag('assign',array_merge(array(array('value'=>$this->yystack[$this->yyidx + -2]->minor),array('var'=>$this->yystack[$this->yyidx + -4]->minor['var'])),$this->yystack[$this->yyidx + -1]->minor),array('smarty_internal_index'=>$this->yystack[$this->yyidx + -4]->minor['smarty_internal_index']));
     }
-#line 2406 "smarty_internal_templateparser.php"
+#line 2381 "smarty_internal_templateparser.php"
 #line 349 "smarty_internal_templateparser.y"
     function yy_r36(){
     $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -2]->minor,$this->yystack[$this->yyidx + -1]->minor);
     }
-#line 2411 "smarty_internal_templateparser.php"
+#line 2386 "smarty_internal_templateparser.php"
 #line 353 "smarty_internal_templateparser.y"
     function yy_r37(){
     $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -1]->minor,array());
     }
-#line 2416 "smarty_internal_templateparser.php"
+#line 2391 "smarty_internal_templateparser.php"
 #line 358 "smarty_internal_templateparser.y"
     function yy_r38(){
     $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -4]->minor,$this->yystack[$this->yyidx + -1]->minor,array('object_methode'=>$this->yystack[$this->yyidx + -2]->minor));
     }
-#line 2421 "smarty_internal_templateparser.php"
+#line 2396 "smarty_internal_templateparser.php"
 #line 363 "smarty_internal_templateparser.y"
     function yy_r39(){
     $this->_retvalue = '<?php ob_start();?>'.$this->compiler->compileTag($this->yystack[$this->yyidx + -3]->minor,$this->yystack[$this->yyidx + -1]->minor).'<?php echo ';
     $this->_retvalue .= $this->compiler->compileTag('private_modifier',array(),array('modifierlist'=>$this->yystack[$this->yyidx + -2]->minor,'value'=>'ob_get_clean()')).'?>';
     }
-#line 2427 "smarty_internal_templateparser.php"
+#line 2402 "smarty_internal_templateparser.php"
 #line 369 "smarty_internal_templateparser.y"
     function yy_r40(){
     $this->_retvalue = '<?php ob_start();?>'.$this->compiler->compileTag($this->yystack[$this->yyidx + -5]->minor,$this->yystack[$this->yyidx + -1]->minor,array('object_methode'=>$this->yystack[$this->yyidx + -3]->minor)).'<?php echo ';
     $this->_retvalue .= $this->compiler->compileTag('private_modifier',array(),array('modifierlist'=>$this->yystack[$this->yyidx + -2]->minor,'value'=>'ob_get_clean()')).'?>';
     }
-#line 2433 "smarty_internal_templateparser.php"
+#line 2408 "smarty_internal_templateparser.php"
 #line 375 "smarty_internal_templateparser.y"
     function yy_r41(){
     $tag = trim(substr($this->yystack[$this->yyidx + -2]->minor,$this->lex->ldel_length));
     $this->_retvalue = $this->compiler->compileTag(($tag == 'else if')? 'elseif' : $tag,array(),array('if condition'=>$this->yystack[$this->yyidx + -1]->minor));
     }
-#line 2439 "smarty_internal_templateparser.php"
+#line 2414 "smarty_internal_templateparser.php"
 #line 380 "smarty_internal_templateparser.y"
     function yy_r42(){
     $tag = trim(substr($this->yystack[$this->yyidx + -3]->minor,$this->lex->ldel_length));
     $this->_retvalue = $this->compiler->compileTag(($tag == 'else if')? 'elseif' : $tag,$this->yystack[$this->yyidx + -1]->minor,array('if condition'=>$this->yystack[$this->yyidx + -2]->minor));
     }
-#line 2445 "smarty_internal_templateparser.php"
+#line 2420 "smarty_internal_templateparser.php"
 #line 385 "smarty_internal_templateparser.y"
     function yy_r43(){
     $tag = trim(substr($this->yystack[$this->yyidx + -2]->minor,$this->lex->ldel_length));
     $this->_retvalue = $this->compiler->compileTag(($tag == 'else if')? 'elseif' : $tag,array(),array('if condition'=>$this->yystack[$this->yyidx + -1]->minor));
     }
-#line 2451 "smarty_internal_templateparser.php"
+#line 2426 "smarty_internal_templateparser.php"
 #line 396 "smarty_internal_templateparser.y"
     function yy_r45(){
     $this->_retvalue = $this->compiler->compileTag('for',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('start'=>$this->yystack[$this->yyidx + -10]->minor),array('ifexp'=>$this->yystack[$this->yyidx + -7]->minor),array('var'=>$this->yystack[$this->yyidx + -3]->minor),array('step'=>$this->yystack[$this->yyidx + -2]->minor))),1);
     }
-#line 2456 "smarty_internal_templateparser.php"
+#line 2431 "smarty_internal_templateparser.php"
 #line 400 "smarty_internal_templateparser.y"
     function yy_r46(){
     $this->_retvalue = '='.$this->yystack[$this->yyidx + 0]->minor;
     }
-#line 2461 "smarty_internal_templateparser.php"
+#line 2436 "smarty_internal_templateparser.php"
 #line 408 "smarty_internal_templateparser.y"
     function yy_r48(){
     $this->_retvalue = $this->compiler->compileTag('for',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('start'=>$this->yystack[$this->yyidx + -4]->minor),array('to'=>$this->yystack[$this->yyidx + -2]->minor))),0);
     }
-#line 2466 "smarty_internal_templateparser.php"
+#line 2441 "smarty_internal_templateparser.php"
 #line 412 "smarty_internal_templateparser.y"
     function yy_r49(){
     $this->_retvalue = $this->compiler->compileTag('for',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('start'=>$this->yystack[$this->yyidx + -6]->minor),array('to'=>$this->yystack[$this->yyidx + -4]->minor),array('step'=>$this->yystack[$this->yyidx + -2]->minor))),0);
     }
-#line 2471 "smarty_internal_templateparser.php"
+#line 2446 "smarty_internal_templateparser.php"
 #line 417 "smarty_internal_templateparser.y"
     function yy_r50(){
     $this->_retvalue = $this->compiler->compileTag('foreach',$this->yystack[$this->yyidx + -1]->minor);
     }
-#line 2476 "smarty_internal_templateparser.php"
+#line 2451 "smarty_internal_templateparser.php"
 #line 422 "smarty_internal_templateparser.y"
     function yy_r51(){
     $this->_retvalue = $this->compiler->compileTag('foreach',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('from'=>$this->yystack[$this->yyidx + -5]->minor),array('item'=>$this->yystack[$this->yyidx + -2]->minor))));
     }
-#line 2481 "smarty_internal_templateparser.php"
+#line 2456 "smarty_internal_templateparser.php"
 #line 426 "smarty_internal_templateparser.y"
     function yy_r52(){
     $this->_retvalue = $this->compiler->compileTag('foreach',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('from'=>$this->yystack[$this->yyidx + -8]->minor),array('item'=>$this->yystack[$this->yyidx + -2]->minor),array('key'=>$this->yystack[$this->yyidx + -5]->minor))));
     }
-#line 2486 "smarty_internal_templateparser.php"
+#line 2461 "smarty_internal_templateparser.php"
 #line 430 "smarty_internal_templateparser.y"
     function yy_r53(){
     $this->_retvalue = $this->compiler->compileTag('foreach',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('from'=>$this->yystack[$this->yyidx + -5]->minor),array('item'=>$this->yystack[$this->yyidx + -2]->minor))));
     }
-#line 2491 "smarty_internal_templateparser.php"
+#line 2466 "smarty_internal_templateparser.php"
 #line 434 "smarty_internal_templateparser.y"
     function yy_r54(){
     $this->_retvalue = $this->compiler->compileTag('foreach',array_merge($this->yystack[$this->yyidx + -1]->minor,array(array('from'=>$this->yystack[$this->yyidx + -8]->minor),array('item'=>$this->yystack[$this->yyidx + -2]->minor),array('key'=>$this->yystack[$this->yyidx + -5]->minor))));
     }
-#line 2496 "smarty_internal_templateparser.php"
+#line 2471 "smarty_internal_templateparser.php"
 #line 439 "smarty_internal_templateparser.y"
     function yy_r55(){
     $this->_retvalue = $this->compiler->compileTag('setfilter',array(),array('modifier_list'=>array(array_merge(array($this->yystack[$this->yyidx + -2]->minor),$this->yystack[$this->yyidx + -1]->minor))));
     }
-#line 2501 "smarty_internal_templateparser.php"
+#line 2476 "smarty_internal_templateparser.php"
 #line 443 "smarty_internal_templateparser.y"
     function yy_r56(){
     $this->_retvalue = $this->compiler->compileTag('setfilter',array(),array('modifier_list'=>array_merge(array(array_merge(array($this->yystack[$this->yyidx + -3]->minor),$this->yystack[$this->yyidx + -2]->minor)),$this->yystack[$this->yyidx + -1]->minor)));
     }
-#line 2506 "smarty_internal_templateparser.php"
+#line 2481 "smarty_internal_templateparser.php"
 #line 448 "smarty_internal_templateparser.y"
     function yy_r57(){
     $this->_retvalue = SMARTY_INTERNAL_COMPILE_BLOCK::compileChildBlock($this->compiler);
     }
-#line 2511 "smarty_internal_templateparser.php"
+#line 2486 "smarty_internal_templateparser.php"
 #line 454 "smarty_internal_templateparser.y"
     function yy_r58(){
     $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -1]->minor.'close',array());
     }
-#line 2516 "smarty_internal_templateparser.php"
+#line 2491 "smarty_internal_templateparser.php"
 #line 458 "smarty_internal_templateparser.y"
     function yy_r59(){
     $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -2]->minor.'close',array(),array('modifier_list'=>$this->yystack[$this->yyidx + -1]->minor));
     }
-#line 2521 "smarty_internal_templateparser.php"
+#line 2496 "smarty_internal_templateparser.php"
 #line 463 "smarty_internal_templateparser.y"
     function yy_r60(){
     $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -3]->minor.'close',array(),array('object_methode'=>$this->yystack[$this->yyidx + -1]->minor));
     }
-#line 2526 "smarty_internal_templateparser.php"
+#line 2501 "smarty_internal_templateparser.php"
 #line 467 "smarty_internal_templateparser.y"
     function yy_r61(){
     $this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -4]->minor.'close',array(),array('object_methode'=>$this->yystack[$this->yyidx + -2]->minor, 'modifier_list'=>$this->yystack[$this->yyidx + -1]->minor));
     }
-#line 2531 "smarty_internal_templateparser.php"
+#line 2506 "smarty_internal_templateparser.php"
 #line 475 "smarty_internal_templateparser.y"
     function yy_r62(){
     $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor;
     $this->_retvalue[] = $this->yystack[$this->yyidx + 0]->minor;
     }
-#line 2537 "smarty_internal_templateparser.php"
+#line 2512 "smarty_internal_templateparser.php"
 #line 481 "smarty_internal_templateparser.y"
     function yy_r63(){
     $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor);
     }
-#line 2542 "smarty_internal_templateparser.php"
+#line 2517 "smarty_internal_templateparser.php"
 #line 486 "smarty_internal_templateparser.y"
     function yy_r64(){
     $this->_retvalue = array();
     }
-#line 2547 "smarty_internal_templateparser.php"
+#line 2522 "smarty_internal_templateparser.php"
 #line 491 "smarty_internal_templateparser.y"
     function yy_r65(){
     if (preg_match('~^true$~i', $this->yystack[$this->yyidx + 0]->minor)) {
@@ -2561,125 +2536,130 @@ static public $yy_action = array(
         $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor=>"'".$this->yystack[$this->yyidx + 0]->minor."'");
     }
     }
-#line 2560 "smarty_internal_templateparser.php"
+#line 2535 "smarty_internal_templateparser.php"
 #line 503 "smarty_internal_templateparser.y"
     function yy_r66(){
-    $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor=>$this->yystack[$this->yyidx + 0]->minor);
+    $this->_retvalue = array(trim($this->yystack[$this->yyidx + -1]->minor," =\n\r\t")=>$this->yystack[$this->yyidx + 0]->minor);
     }
-#line 2565 "smarty_internal_templateparser.php"
+#line 2540 "smarty_internal_templateparser.php"
 #line 511 "smarty_internal_templateparser.y"
     function yy_r68(){
     $this->_retvalue = "'".$this->yystack[$this->yyidx + 0]->minor."'";
     }
-#line 2570 "smarty_internal_templateparser.php"
+#line 2545 "smarty_internal_templateparser.php"
+#line 523 "smarty_internal_templateparser.y"
+    function yy_r71(){
+    $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor=>$this->yystack[$this->yyidx + 0]->minor);
+    }
+#line 2550 "smarty_internal_templateparser.php"
 #line 536 "smarty_internal_templateparser.y"
     function yy_r73(){
     $this->yystack[$this->yyidx + -2]->minor[]=$this->yystack[$this->yyidx + 0]->minor;
     $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor;
     }
-#line 2576 "smarty_internal_templateparser.php"
+#line 2556 "smarty_internal_templateparser.php"
 #line 541 "smarty_internal_templateparser.y"
     function yy_r74(){
     $this->_retvalue = array('var' => $this->yystack[$this->yyidx + -2]->minor, 'value'=>$this->yystack[$this->yyidx + 0]->minor);
     }
-#line 2581 "smarty_internal_templateparser.php"
+#line 2561 "smarty_internal_templateparser.php"
 #line 569 "smarty_internal_templateparser.y"
     function yy_r79(){
     $this->_retvalue = '$_smarty_tpl->getStreamVariable(\''. $this->yystack[$this->yyidx + -2]->minor .'://'. $this->yystack[$this->yyidx + 0]->minor . '\')';
     }
-#line 2586 "smarty_internal_templateparser.php"
+#line 2566 "smarty_internal_templateparser.php"
 #line 574 "smarty_internal_templateparser.y"
     function yy_r80(){
     $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor . trim($this->yystack[$this->yyidx + -1]->minor) . $this->yystack[$this->yyidx + 0]->minor;
     }
-#line 2591 "smarty_internal_templateparser.php"
+#line 2571 "smarty_internal_templateparser.php"
 #line 593 "smarty_internal_templateparser.y"
     function yy_r84(){
     $this->_retvalue = $this->compiler->compileTag('private_modifier',array(),array('value'=>$this->yystack[$this->yyidx + -1]->minor,'modifierlist'=>$this->yystack[$this->yyidx + 0]->minor));
     }
-#line 2596 "smarty_internal_templateparser.php"
+#line 2576 "smarty_internal_templateparser.php"
 #line 599 "smarty_internal_templateparser.y"
     function yy_r85(){
     $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;
     }
-#line 2601 "smarty_internal_templateparser.php"
+#line 2581 "smarty_internal_templateparser.php"
 #line 603 "smarty_internal_templateparser.y"
     function yy_r86(){
     $this->_retvalue = 'in_array('.$this->yystack[$this->yyidx + -2]->minor.','.$this->yystack[$this->yyidx + 0]->minor.')';
     }
-#line 2606 "smarty_internal_templateparser.php"
+#line 2586 "smarty_internal_templateparser.php"
 #line 607 "smarty_internal_templateparser.y"
     function yy_r87(){
     $this->_retvalue = 'in_array('.$this->yystack[$this->yyidx + -2]->minor.',(array)'.$this->yystack[$this->yyidx + 0]->minor.')';
     }
-#line 2611 "smarty_internal_templateparser.php"
+#line 2591 "smarty_internal_templateparser.php"
 #line 615 "smarty_internal_templateparser.y"
     function yy_r89(){
     $this->_retvalue = '!('.$this->yystack[$this->yyidx + -2]->minor.' % '.$this->yystack[$this->yyidx + 0]->minor.')';
     }
-#line 2616 "smarty_internal_templateparser.php"
+#line 2596 "smarty_internal_templateparser.php"
 #line 619 "smarty_internal_templateparser.y"
     function yy_r90(){
     $this->_retvalue = '('.$this->yystack[$this->yyidx + -2]->minor.' % '.$this->yystack[$this->yyidx + 0]->minor.')';
     }
-#line 2621 "smarty_internal_templateparser.php"
+#line 2601 "smarty_internal_templateparser.php"
 #line 623 "smarty_internal_templateparser.y"
     function yy_r91(){
     $this->_retvalue = '!(1 & '.$this->yystack[$this->yyidx + -1]->minor.')';
     }
-#line 2626 "smarty_internal_templateparser.php"
+#line 2606 "smarty_internal_templateparser.php"
 #line 627 "smarty_internal_templateparser.y"
     function yy_r92(){
     $this->_retvalue = '(1 & '.$this->yystack[$this->yyidx + -1]->minor.')';
     }
-#line 2631 "smarty_internal_templateparser.php"
+#line 2611 "smarty_internal_templateparser.php"
 #line 631 "smarty_internal_templateparser.y"
     function yy_r93(){
     $this->_retvalue = '!(1 & '.$this->yystack[$this->yyidx + -2]->minor.' / '.$this->yystack[$this->yyidx + 0]->minor.')';
     }
-#line 2636 "smarty_internal_templateparser.php"
+#line 2616 "smarty_internal_templateparser.php"
 #line 635 "smarty_internal_templateparser.y"
     function yy_r94(){
     $this->_retvalue = '(1 & '.$this->yystack[$this->yyidx + -2]->minor.' / '.$this->yystack[$this->yyidx + 0]->minor.')';
     }
-#line 2641 "smarty_internal_templateparser.php"
+#line 2621 "smarty_internal_templateparser.php"
 #line 659 "smarty_internal_templateparser.y"
     function yy_r100(){
     $this->prefix_number++;
     $this->compiler->prefix_code[] = '<?php $_tmp'.$this->prefix_number.'='.$this->yystack[$this->yyidx + 0]->minor.';?>';
     $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + -1]->minor.'$_tmp'.$this->prefix_number;
     }
-#line 2648 "smarty_internal_templateparser.php"
+#line 2628 "smarty_internal_templateparser.php"
 #line 668 "smarty_internal_templateparser.y"
     function yy_r101(){
     $this->_retvalue = $this->yystack[$this->yyidx + -6]->minor.' ? '. $this->compileVariable("'".$this->yystack[$this->yyidx + -2]->minor."'") . ' : '.$this->yystack[$this->yyidx + 0]->minor;
     }
-#line 2653 "smarty_internal_templateparser.php"
+#line 2633 "smarty_internal_templateparser.php"
 #line 672 "smarty_internal_templateparser.y"
     function yy_r102(){
     $this->_retvalue = $this->yystack[$this->yyidx + -5]->minor.' ? '.$this->yystack[$this->yyidx + -2]->minor.' : '.$this->yystack[$this->yyidx + 0]->minor;
     }
-#line 2658 "smarty_internal_templateparser.php"
+#line 2638 "smarty_internal_templateparser.php"
 #line 687 "smarty_internal_templateparser.y"
     function yy_r105(){
     $this->_retvalue = '!'.$this->yystack[$this->yyidx + 0]->minor;
     }
-#line 2663 "smarty_internal_templateparser.php"
+#line 2643 "smarty_internal_templateparser.php"
 #line 708 "smarty_internal_templateparser.y"
     function yy_r110(){
     $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.'.'.$this->yystack[$this->yyidx + 0]->minor;
     }
-#line 2668 "smarty_internal_templateparser.php"
+#line 2648 "smarty_internal_templateparser.php"
 #line 712 "smarty_internal_templateparser.y"
     function yy_r111(){
     $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.'.';
     }
-#line 2673 "smarty_internal_templateparser.php"
+#line 2653 "smarty_internal_templateparser.php"
 #line 716 "smarty_internal_templateparser.y"
     function yy_r112(){
     $this->_retvalue = '.'.$this->yystack[$this->yyidx + 0]->minor;
     }
-#line 2678 "smarty_internal_templateparser.php"
+#line 2658 "smarty_internal_templateparser.php"
 #line 721 "smarty_internal_templateparser.y"
     function yy_r113(){
     if (preg_match('~^true$~i', $this->yystack[$this->yyidx + 0]->minor)) {
@@ -2692,12 +2672,12 @@ static public $yy_action = array(
         $this->_retvalue = "'".$this->yystack[$this->yyidx + 0]->minor."'";
     }
     }
-#line 2691 "smarty_internal_templateparser.php"
+#line 2671 "smarty_internal_templateparser.php"
 #line 739 "smarty_internal_templateparser.y"
     function yy_r115(){
     $this->_retvalue = "(". $this->yystack[$this->yyidx + -1]->minor .")";
     }
-#line 2696 "smarty_internal_templateparser.php"
+#line 2676 "smarty_internal_templateparser.php"
 #line 754 "smarty_internal_templateparser.y"
     function yy_r118(){
     if (!$this->security || isset($this->smarty->registered_classes[$this->yystack[$this->yyidx + -2]->minor]) || $this->smarty->security_policy->isTrustedStaticClass($this->yystack[$this->yyidx + -2]->minor, $this->compiler)) {
@@ -2710,7 +2690,7 @@ static public $yy_action = array(
         $this->compiler->trigger_template_error ("static class '".$this->yystack[$this->yyidx + -2]->minor."' is undefined or not allowed by security setting");
     }
     }
-#line 2709 "smarty_internal_templateparser.php"
+#line 2689 "smarty_internal_templateparser.php"
 #line 766 "smarty_internal_templateparser.y"
     function yy_r119(){
     if ($this->yystack[$this->yyidx + -2]->minor['var'] == '\'smarty\'') {
@@ -2719,14 +2699,14 @@ static public $yy_action = array(
         $this->_retvalue = $this->compileVariable($this->yystack[$this->yyidx + -2]->minor['var']).$this->yystack[$this->yyidx + -2]->minor['smarty_internal_index'].'::'.$this->yystack[$this->yyidx + 0]->minor;
     }
     }
-#line 2718 "smarty_internal_templateparser.php"
+#line 2698 "smarty_internal_templateparser.php"
 #line 775 "smarty_internal_templateparser.y"
     function yy_r120(){
     $this->prefix_number++;
     $this->compiler->prefix_code[] = '<?php ob_start();?>'.$this->yystack[$this->yyidx + 0]->minor.'<?php $_tmp'.$this->prefix_number.'=ob_get_clean();?>';
     $this->_retvalue = '$_tmp'.$this->prefix_number;
     }
-#line 2725 "smarty_internal_templateparser.php"
+#line 2705 "smarty_internal_templateparser.php"
 #line 790 "smarty_internal_templateparser.y"
     function yy_r122(){
     if ($this->yystack[$this->yyidx + 0]->minor['var'] == '\'smarty\'') {
@@ -2739,145 +2719,155 @@ static public $yy_action = array(
         $this->_retvalue = $this->compileVariable($this->yystack[$this->yyidx + 0]->minor['var']).$this->yystack[$this->yyidx + 0]->minor['smarty_internal_index'];
     }
     }
-#line 2738 "smarty_internal_templateparser.php"
+#line 2718 "smarty_internal_templateparser.php"
 #line 803 "smarty_internal_templateparser.y"
     function yy_r123(){
     $this->_retvalue = '$_smarty_tpl->tpl_vars['. $this->yystack[$this->yyidx + -2]->minor .']->'.$this->yystack[$this->yyidx + 0]->minor;
     }
-#line 2743 "smarty_internal_templateparser.php"
+#line 2723 "smarty_internal_templateparser.php"
 #line 813 "smarty_internal_templateparser.y"
     function yy_r125(){
     $this->_retvalue = '$_smarty_tpl->getConfigVariable(\''. $this->yystack[$this->yyidx + -1]->minor .'\')';
     }
-#line 2748 "smarty_internal_templateparser.php"
+#line 2728 "smarty_internal_templateparser.php"
 #line 817 "smarty_internal_templateparser.y"
     function yy_r126(){
-    $this->_retvalue = '$_smarty_tpl->getConfigVariable('. $this->yystack[$this->yyidx + -1]->minor .')';
+    $this->_retvalue = '(is_array($tmp = $_smarty_tpl->getConfigVariable(\''. $this->yystack[$this->yyidx + -2]->minor .'\')) ? $tmp'.$this->yystack[$this->yyidx + 0]->minor.' :null)';
     }
-#line 2753 "smarty_internal_templateparser.php"
+#line 2733 "smarty_internal_templateparser.php"
 #line 821 "smarty_internal_templateparser.y"
     function yy_r127(){
-    $this->_retvalue = array('var'=>$this->yystack[$this->yyidx + -1]->minor, 'smarty_internal_index'=>$this->yystack[$this->yyidx + 0]->minor);
+    $this->_retvalue = '$_smarty_tpl->getConfigVariable('. $this->yystack[$this->yyidx + -1]->minor .')';
     }
-#line 2758 "smarty_internal_templateparser.php"
-#line 834 "smarty_internal_templateparser.y"
-    function yy_r129(){
-    return;
+#line 2738 "smarty_internal_templateparser.php"
+#line 825 "smarty_internal_templateparser.y"
+    function yy_r128(){
+    $this->_retvalue = '(is_array($tmp = $_smarty_tpl->getConfigVariable('. $this->yystack[$this->yyidx + -2]->minor .')) ? $tmp'.$this->yystack[$this->yyidx + 0]->minor.' : null)';
     }
-#line 2763 "smarty_internal_templateparser.php"
-#line 840 "smarty_internal_templateparser.y"
-    function yy_r130(){
-    $this->_retvalue = '['.$this->compileVariable($this->yystack[$this->yyidx + 0]->minor).']';
+#line 2743 "smarty_internal_templateparser.php"
+#line 829 "smarty_internal_templateparser.y"
+    function yy_r129(){
+    $this->_retvalue = array('var'=>$this->yystack[$this->yyidx + -1]->minor, 'smarty_internal_index'=>$this->yystack[$this->yyidx + 0]->minor);
     }
-#line 2768 "smarty_internal_templateparser.php"
-#line 844 "smarty_internal_templateparser.y"
+#line 2748 "smarty_internal_templateparser.php"
+#line 842 "smarty_internal_templateparser.y"
     function yy_r131(){
-    $this->_retvalue = '['.$this->compileVariable($this->yystack[$this->yyidx + -2]->minor).'->'.$this->yystack[$this->yyidx + 0]->minor.']';
+    return;
     }
-#line 2773 "smarty_internal_templateparser.php"
+#line 2753 "smarty_internal_templateparser.php"
 #line 848 "smarty_internal_templateparser.y"
     function yy_r132(){
-    $this->_retvalue = "['". $this->yystack[$this->yyidx + 0]->minor ."']";
+    $this->_retvalue = '['.$this->compileVariable($this->yystack[$this->yyidx + 0]->minor).']';
     }
-#line 2778 "smarty_internal_templateparser.php"
+#line 2758 "smarty_internal_templateparser.php"
 #line 852 "smarty_internal_templateparser.y"
     function yy_r133(){
-    $this->_retvalue = "[". $this->yystack[$this->yyidx + 0]->minor ."]";
+    $this->_retvalue = '['.$this->compileVariable($this->yystack[$this->yyidx + -2]->minor).'->'.$this->yystack[$this->yyidx + 0]->minor.']';
     }
-#line 2783 "smarty_internal_templateparser.php"
+#line 2763 "smarty_internal_templateparser.php"
 #line 856 "smarty_internal_templateparser.y"
     function yy_r134(){
-    $this->_retvalue = "[". $this->yystack[$this->yyidx + -1]->minor ."]";
+    $this->_retvalue = "['". $this->yystack[$this->yyidx + 0]->minor ."']";
     }
-#line 2788 "smarty_internal_templateparser.php"
-#line 861 "smarty_internal_templateparser.y"
+#line 2768 "smarty_internal_templateparser.php"
+#line 860 "smarty_internal_templateparser.y"
     function yy_r135(){
-    $this->_retvalue = '['.$this->compiler->compileTag('private_special_variable',array(),'[\'section\'][\''.$this->yystack[$this->yyidx + -1]->minor.'\'][\'index\']').']';
+    $this->_retvalue = "[". $this->yystack[$this->yyidx + 0]->minor ."]";
     }
-#line 2793 "smarty_internal_templateparser.php"
-#line 865 "smarty_internal_templateparser.y"
+#line 2773 "smarty_internal_templateparser.php"
+#line 864 "smarty_internal_templateparser.y"
     function yy_r136(){
-    $this->_retvalue = '['.$this->compiler->compileTag('private_special_variable',array(),'[\'section\'][\''.$this->yystack[$this->yyidx + -3]->minor.'\'][\''.$this->yystack[$this->yyidx + -1]->minor.'\']').']';
+    $this->_retvalue = "[". $this->yystack[$this->yyidx + -1]->minor ."]";
     }
-#line 2798 "smarty_internal_templateparser.php"
-#line 875 "smarty_internal_templateparser.y"
+#line 2778 "smarty_internal_templateparser.php"
+#line 869 "smarty_internal_templateparser.y"
+    function yy_r137(){
+    $this->_retvalue = '['.$this->compiler->compileTag('private_special_variable',array(),'[\'section\'][\''.$this->yystack[$this->yyidx + -1]->minor.'\'][\'index\']').']';
+    }
+#line 2783 "smarty_internal_templateparser.php"
+#line 873 "smarty_internal_templateparser.y"
     function yy_r138(){
-    $this->_retvalue = '[]';
+    $this->_retvalue = '['.$this->compiler->compileTag('private_special_variable',array(),'[\'section\'][\''.$this->yystack[$this->yyidx + -3]->minor.'\'][\''.$this->yystack[$this->yyidx + -1]->minor.'\']').']';
     }
-#line 2803 "smarty_internal_templateparser.php"
-#line 888 "smarty_internal_templateparser.y"
+#line 2788 "smarty_internal_templateparser.php"
+#line 883 "smarty_internal_templateparser.y"
     function yy_r140(){
+    $this->_retvalue = '[]';
+    }
+#line 2793 "smarty_internal_templateparser.php"
+#line 896 "smarty_internal_templateparser.y"
+    function yy_r142(){
     $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.'.'.$this->yystack[$this->yyidx + 0]->minor;
     }
-#line 2808 "smarty_internal_templateparser.php"
-#line 893 "smarty_internal_templateparser.y"
-    function yy_r141(){
+#line 2798 "smarty_internal_templateparser.php"
+#line 901 "smarty_internal_templateparser.y"
+    function yy_r143(){
     $this->_retvalue = '\''.$this->yystack[$this->yyidx + 0]->minor.'\'';
     }
-#line 2813 "smarty_internal_templateparser.php"
-#line 898 "smarty_internal_templateparser.y"
-    function yy_r142(){
+#line 2803 "smarty_internal_templateparser.php"
+#line 906 "smarty_internal_templateparser.y"
+    function yy_r144(){
     $this->_retvalue = '('.$this->yystack[$this->yyidx + -1]->minor.')';
     }
-#line 2818 "smarty_internal_templateparser.php"
-#line 905 "smarty_internal_templateparser.y"
-    function yy_r143(){
+#line 2808 "smarty_internal_templateparser.php"
+#line 913 "smarty_internal_templateparser.y"
+    function yy_r145(){
     if ($this->yystack[$this->yyidx + -1]->minor['var'] == '\'smarty\'') {
         $this->_retvalue =  $this->compiler->compileTag('private_special_variable',array(),$this->yystack[$this->yyidx + -1]->minor['smarty_internal_index']).$this->yystack[$this->yyidx + 0]->minor;
     } else {
         $this->_retvalue = $this->compileVariable($this->yystack[$this->yyidx + -1]->minor['var']).$this->yystack[$this->yyidx + -1]->minor['smarty_internal_index'].$this->yystack[$this->yyidx + 0]->minor;
     }
     }
-#line 2827 "smarty_internal_templateparser.php"
-#line 914 "smarty_internal_templateparser.y"
-    function yy_r144(){
+#line 2817 "smarty_internal_templateparser.php"
+#line 922 "smarty_internal_templateparser.y"
+    function yy_r146(){
     $this->_retvalue  = $this->yystack[$this->yyidx + 0]->minor;
     }
-#line 2832 "smarty_internal_templateparser.php"
-#line 919 "smarty_internal_templateparser.y"
-    function yy_r145(){
+#line 2822 "smarty_internal_templateparser.php"
+#line 927 "smarty_internal_templateparser.y"
+    function yy_r147(){
     $this->_retvalue  = $this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;
     }
-#line 2837 "smarty_internal_templateparser.php"
-#line 924 "smarty_internal_templateparser.y"
-    function yy_r146(){
+#line 2827 "smarty_internal_templateparser.php"
+#line 932 "smarty_internal_templateparser.y"
+    function yy_r148(){
     if ($this->security && substr($this->yystack[$this->yyidx + -1]->minor,0,1) == '_') {
         $this->compiler->trigger_template_error (self::Err1);
     }
     $this->_retvalue = '->'.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;
     }
-#line 2845 "smarty_internal_templateparser.php"
-#line 931 "smarty_internal_templateparser.y"
-    function yy_r147(){
+#line 2835 "smarty_internal_templateparser.php"
+#line 939 "smarty_internal_templateparser.y"
+    function yy_r149(){
     if ($this->security) {
         $this->compiler->trigger_template_error (self::Err2);
     }
     $this->_retvalue = '->{'.$this->compileVariable($this->yystack[$this->yyidx + -1]->minor).$this->yystack[$this->yyidx + 0]->minor.'}';
     }
-#line 2853 "smarty_internal_templateparser.php"
-#line 938 "smarty_internal_templateparser.y"
-    function yy_r148(){
+#line 2843 "smarty_internal_templateparser.php"
+#line 946 "smarty_internal_templateparser.y"
+    function yy_r150(){
     if ($this->security) {
         $this->compiler->trigger_template_error (self::Err2);
     }
     $this->_retvalue = '->{'.$this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + 0]->minor.'}';
     }
-#line 2861 "smarty_internal_templateparser.php"
-#line 945 "smarty_internal_templateparser.y"
-    function yy_r149(){
+#line 2851 "smarty_internal_templateparser.php"
+#line 953 "smarty_internal_templateparser.y"
+    function yy_r151(){
     if ($this->security) {
         $this->compiler->trigger_template_error (self::Err2);
     }
     $this->_retvalue = '->{\''.$this->yystack[$this->yyidx + -4]->minor.'\'.'.$this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + 0]->minor.'}';
     }
-#line 2869 "smarty_internal_templateparser.php"
-#line 953 "smarty_internal_templateparser.y"
-    function yy_r150(){
+#line 2859 "smarty_internal_templateparser.php"
+#line 961 "smarty_internal_templateparser.y"
+    function yy_r152(){
     $this->_retvalue = '->'.$this->yystack[$this->yyidx + 0]->minor;
     }
-#line 2874 "smarty_internal_templateparser.php"
-#line 961 "smarty_internal_templateparser.y"
-    function yy_r151(){
+#line 2864 "smarty_internal_templateparser.php"
+#line 969 "smarty_internal_templateparser.y"
+    function yy_r153(){
     if (!$this->security || $this->smarty->security_policy->isTrustedPhpFunction($this->yystack[$this->yyidx + -3]->minor, $this->compiler)) {
         if (strcasecmp($this->yystack[$this->yyidx + -3]->minor,'isset') === 0 || strcasecmp($this->yystack[$this->yyidx + -3]->minor,'empty') === 0 || strcasecmp($this->yystack[$this->yyidx + -3]->minor,'array') === 0 || is_callable($this->yystack[$this->yyidx + -3]->minor)) {
             $func_name = strtolower($this->yystack[$this->yyidx + -3]->minor);
@@ -2911,17 +2901,17 @@ static public $yy_action = array(
         }
     }
     }
-#line 2910 "smarty_internal_templateparser.php"
-#line 999 "smarty_internal_templateparser.y"
-    function yy_r152(){
+#line 2900 "smarty_internal_templateparser.php"
+#line 1007 "smarty_internal_templateparser.y"
+    function yy_r154(){
     if ($this->security && substr($this->yystack[$this->yyidx + -3]->minor,0,1) == '_') {
         $this->compiler->trigger_template_error (self::Err1);
     }
     $this->_retvalue = $this->yystack[$this->yyidx + -3]->minor . "(". implode(',',$this->yystack[$this->yyidx + -1]->minor) .")";
     }
-#line 2918 "smarty_internal_templateparser.php"
-#line 1006 "smarty_internal_templateparser.y"
-    function yy_r153(){
+#line 2908 "smarty_internal_templateparser.php"
+#line 1014 "smarty_internal_templateparser.y"
+    function yy_r155(){
     if ($this->security) {
         $this->compiler->trigger_template_error (self::Err2);
     }
@@ -2929,168 +2919,168 @@ static public $yy_action = array(
     $this->compiler->prefix_code[] = '<?php $_tmp'.$this->prefix_number.'='.$this->compileVariable("'".$this->yystack[$this->yyidx + -3]->minor."'").';?>';
     $this->_retvalue = '$_tmp'.$this->prefix_number.'('. implode(',',$this->yystack[$this->yyidx + -1]->minor) .')';
     }
-#line 2928 "smarty_internal_templateparser.php"
-#line 1017 "smarty_internal_templateparser.y"
-    function yy_r154(){
+#line 2918 "smarty_internal_templateparser.php"
+#line 1025 "smarty_internal_templateparser.y"
+    function yy_r156(){
     $this->_retvalue = array_merge($this->yystack[$this->yyidx + -2]->minor,array($this->yystack[$this->yyidx + 0]->minor));
     }
-#line 2933 "smarty_internal_templateparser.php"
-#line 1034 "smarty_internal_templateparser.y"
-    function yy_r157(){
+#line 2923 "smarty_internal_templateparser.php"
+#line 1042 "smarty_internal_templateparser.y"
+    function yy_r159(){
     $this->_retvalue = array_merge($this->yystack[$this->yyidx + -2]->minor,array(array_merge($this->yystack[$this->yyidx + -1]->minor,$this->yystack[$this->yyidx + 0]->minor)));
     }
-#line 2938 "smarty_internal_templateparser.php"
-#line 1038 "smarty_internal_templateparser.y"
-    function yy_r158(){
-    $this->_retvalue = array(array_merge($this->yystack[$this->yyidx + -1]->minor,$this->yystack[$this->yyidx + 0]->minor));
-    }
-#line 2943 "smarty_internal_templateparser.php"
+#line 2928 "smarty_internal_templateparser.php"
 #line 1046 "smarty_internal_templateparser.y"
     function yy_r160(){
-    $this->_retvalue =  array($this->yystack[$this->yyidx + 0]->minor);
+    $this->_retvalue = array(array_merge($this->yystack[$this->yyidx + -1]->minor,$this->yystack[$this->yyidx + 0]->minor));
     }
-#line 2948 "smarty_internal_templateparser.php"
+#line 2933 "smarty_internal_templateparser.php"
 #line 1054 "smarty_internal_templateparser.y"
-    function yy_r161(){
-    $this->_retvalue = array_merge($this->yystack[$this->yyidx + -1]->minor,$this->yystack[$this->yyidx + 0]->minor);
-    }
-#line 2953 "smarty_internal_templateparser.php"
-#line 1088 "smarty_internal_templateparser.y"
-    function yy_r168(){
-    $this->_retvalue = '$'.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;
+    function yy_r162(){
+    $this->_retvalue =  array($this->yystack[$this->yyidx + 0]->minor);
     }
-#line 2958 "smarty_internal_templateparser.php"
-#line 1093 "smarty_internal_templateparser.y"
-    function yy_r169(){
-    $this->_retvalue = '$'.$this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;
+#line 2938 "smarty_internal_templateparser.php"
+#line 1062 "smarty_internal_templateparser.y"
+    function yy_r163(){
+    $this->_retvalue = array_merge($this->yystack[$this->yyidx + -1]->minor,$this->yystack[$this->yyidx + 0]->minor);
     }
-#line 2963 "smarty_internal_templateparser.php"
-#line 1099 "smarty_internal_templateparser.y"
+#line 2943 "smarty_internal_templateparser.php"
+#line 1096 "smarty_internal_templateparser.y"
     function yy_r170(){
-    $this->_retvalue = '==';
+    $this->_retvalue = '$'.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;
     }
-#line 2968 "smarty_internal_templateparser.php"
-#line 1103 "smarty_internal_templateparser.y"
+#line 2948 "smarty_internal_templateparser.php"
+#line 1101 "smarty_internal_templateparser.y"
     function yy_r171(){
-    $this->_retvalue = '!=';
+    $this->_retvalue = '$'.$this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;
     }
-#line 2973 "smarty_internal_templateparser.php"
+#line 2953 "smarty_internal_templateparser.php"
 #line 1107 "smarty_internal_templateparser.y"
     function yy_r172(){
-    $this->_retvalue = '>';
+    $this->_retvalue = '==';
     }
-#line 2978 "smarty_internal_templateparser.php"
+#line 2958 "smarty_internal_templateparser.php"
 #line 1111 "smarty_internal_templateparser.y"
     function yy_r173(){
-    $this->_retvalue = '<';
+    $this->_retvalue = '!=';
     }
-#line 2983 "smarty_internal_templateparser.php"
+#line 2963 "smarty_internal_templateparser.php"
 #line 1115 "smarty_internal_templateparser.y"
     function yy_r174(){
-    $this->_retvalue = '>=';
+    $this->_retvalue = '>';
     }
-#line 2988 "smarty_internal_templateparser.php"
+#line 2968 "smarty_internal_templateparser.php"
 #line 1119 "smarty_internal_templateparser.y"
     function yy_r175(){
-    $this->_retvalue = '<=';
+    $this->_retvalue = '<';
     }
-#line 2993 "smarty_internal_templateparser.php"
+#line 2973 "smarty_internal_templateparser.php"
 #line 1123 "smarty_internal_templateparser.y"
     function yy_r176(){
-    $this->_retvalue = '===';
+    $this->_retvalue = '>=';
     }
-#line 2998 "smarty_internal_templateparser.php"
+#line 2978 "smarty_internal_templateparser.php"
 #line 1127 "smarty_internal_templateparser.y"
     function yy_r177(){
-    $this->_retvalue = '!==';
+    $this->_retvalue = '<=';
     }
-#line 3003 "smarty_internal_templateparser.php"
+#line 2983 "smarty_internal_templateparser.php"
 #line 1131 "smarty_internal_templateparser.y"
     function yy_r178(){
-    $this->_retvalue = '%';
+    $this->_retvalue = '===';
     }
-#line 3008 "smarty_internal_templateparser.php"
+#line 2988 "smarty_internal_templateparser.php"
 #line 1135 "smarty_internal_templateparser.y"
     function yy_r179(){
-    $this->_retvalue = '&&';
+    $this->_retvalue = '!==';
     }
-#line 3013 "smarty_internal_templateparser.php"
+#line 2993 "smarty_internal_templateparser.php"
 #line 1139 "smarty_internal_templateparser.y"
     function yy_r180(){
-    $this->_retvalue = '||';
+    $this->_retvalue = '%';
     }
-#line 3018 "smarty_internal_templateparser.php"
+#line 2998 "smarty_internal_templateparser.php"
 #line 1143 "smarty_internal_templateparser.y"
     function yy_r181(){
-    $this->_retvalue = ' XOR ';
+    $this->_retvalue = '&&';
     }
-#line 3023 "smarty_internal_templateparser.php"
-#line 1150 "smarty_internal_templateparser.y"
+#line 3003 "smarty_internal_templateparser.php"
+#line 1147 "smarty_internal_templateparser.y"
     function yy_r182(){
-    $this->_retvalue = 'array('.$this->yystack[$this->yyidx + -1]->minor.')';
+    $this->_retvalue = '||';
     }
-#line 3028 "smarty_internal_templateparser.php"
+#line 3008 "smarty_internal_templateparser.php"
+#line 1151 "smarty_internal_templateparser.y"
+    function yy_r183(){
+    $this->_retvalue = ' XOR ';
+    }
+#line 3013 "smarty_internal_templateparser.php"
 #line 1158 "smarty_internal_templateparser.y"
     function yy_r184(){
-    $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.','.$this->yystack[$this->yyidx + 0]->minor;
+    $this->_retvalue = 'array('.$this->yystack[$this->yyidx + -1]->minor.')';
     }
-#line 3033 "smarty_internal_templateparser.php"
+#line 3018 "smarty_internal_templateparser.php"
 #line 1166 "smarty_internal_templateparser.y"
     function yy_r186(){
+    $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.','.$this->yystack[$this->yyidx + 0]->minor;
+    }
+#line 3023 "smarty_internal_templateparser.php"
+#line 1174 "smarty_internal_templateparser.y"
+    function yy_r188(){
     $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.'=>'.$this->yystack[$this->yyidx + 0]->minor;
     }
-#line 3038 "smarty_internal_templateparser.php"
-#line 1170 "smarty_internal_templateparser.y"
-    function yy_r187(){
+#line 3028 "smarty_internal_templateparser.php"
+#line 1178 "smarty_internal_templateparser.y"
+    function yy_r189(){
     $this->_retvalue = '\''.$this->yystack[$this->yyidx + -2]->minor.'\'=>'.$this->yystack[$this->yyidx + 0]->minor;
     }
-#line 3043 "smarty_internal_templateparser.php"
-#line 1182 "smarty_internal_templateparser.y"
-    function yy_r189(){
+#line 3033 "smarty_internal_templateparser.php"
+#line 1190 "smarty_internal_templateparser.y"
+    function yy_r191(){
     $this->_retvalue = "''";
     }
-#line 3048 "smarty_internal_templateparser.php"
-#line 1186 "smarty_internal_templateparser.y"
-    function yy_r190(){
+#line 3038 "smarty_internal_templateparser.php"
+#line 1194 "smarty_internal_templateparser.y"
+    function yy_r192(){
     $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor->to_smarty_php();
     }
-#line 3053 "smarty_internal_templateparser.php"
-#line 1191 "smarty_internal_templateparser.y"
-    function yy_r191(){
+#line 3043 "smarty_internal_templateparser.php"
+#line 1199 "smarty_internal_templateparser.y"
+    function yy_r193(){
     $this->yystack[$this->yyidx + -1]->minor->append_subtree($this->yystack[$this->yyidx + 0]->minor);
     $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor;
     }
-#line 3059 "smarty_internal_templateparser.php"
-#line 1196 "smarty_internal_templateparser.y"
-    function yy_r192(){
+#line 3049 "smarty_internal_templateparser.php"
+#line 1204 "smarty_internal_templateparser.y"
+    function yy_r194(){
     $this->_retvalue = new _smarty_doublequoted($this, $this->yystack[$this->yyidx + 0]->minor);
     }
-#line 3064 "smarty_internal_templateparser.php"
-#line 1200 "smarty_internal_templateparser.y"
-    function yy_r193(){
-    $this->_retvalue = new _smarty_code($this, $this->yystack[$this->yyidx + -1]->minor);
-    }
-#line 3069 "smarty_internal_templateparser.php"
+#line 3054 "smarty_internal_templateparser.php"
 #line 1208 "smarty_internal_templateparser.y"
     function yy_r195(){
-    $this->_retvalue = new _smarty_code($this, '$_smarty_tpl->tpl_vars[\''. substr($this->yystack[$this->yyidx + 0]->minor,1) .'\']->value');
+    $this->_retvalue = new _smarty_code($this, '(string)'.$this->yystack[$this->yyidx + -1]->minor);
     }
-#line 3074 "smarty_internal_templateparser.php"
+#line 3059 "smarty_internal_templateparser.php"
 #line 1216 "smarty_internal_templateparser.y"
     function yy_r197(){
-    $this->_retvalue = new _smarty_code($this, '('.$this->yystack[$this->yyidx + -1]->minor.')');
-    }
-#line 3079 "smarty_internal_templateparser.php"
-#line 1220 "smarty_internal_templateparser.y"
-    function yy_r198(){
-    $this->_retvalue = new _smarty_tag($this, $this->yystack[$this->yyidx + 0]->minor);
+    $this->_retvalue = new _smarty_code($this, '(string)$_smarty_tpl->tpl_vars[\''. substr($this->yystack[$this->yyidx + 0]->minor,1) .'\']->value');
     }
-#line 3084 "smarty_internal_templateparser.php"
+#line 3064 "smarty_internal_templateparser.php"
 #line 1224 "smarty_internal_templateparser.y"
     function yy_r199(){
+    $this->_retvalue = new _smarty_code($this, '(string)('.$this->yystack[$this->yyidx + -1]->minor.')');
+    }
+#line 3069 "smarty_internal_templateparser.php"
+#line 1228 "smarty_internal_templateparser.y"
+    function yy_r200(){
+    $this->_retvalue = new _smarty_tag($this, $this->yystack[$this->yyidx + 0]->minor);
+    }
+#line 3074 "smarty_internal_templateparser.php"
+#line 1232 "smarty_internal_templateparser.y"
+    function yy_r201(){
     $this->_retvalue = new _smarty_dq_content($this, $this->yystack[$this->yyidx + 0]->minor);
     }
-#line 3089 "smarty_internal_templateparser.php"
+#line 3079 "smarty_internal_templateparser.php"
 
     private $_retvalue;
 
@@ -3152,7 +3142,7 @@ static public $yy_action = array(
     $this->internalError = true;
     $this->yymajor = $yymajor;
     $this->compiler->trigger_template_error();
-#line 3152 "smarty_internal_templateparser.php"
+#line 3142 "smarty_internal_templateparser.php"
     }
 
     function yy_accept()
@@ -3169,7 +3159,7 @@ static public $yy_action = array(
     $this->internalError = false;
     $this->retvalue = $this->_retvalue;
     //echo $this->retvalue."\n\n";
-#line 3170 "smarty_internal_templateparser.php"
+#line 3160 "smarty_internal_templateparser.php"
     }
 
     function doParse($yymajor, $yytokenvalue)
@@ -3262,4 +3252,3 @@ static public $yy_action = array(
         } while ($yymajor != self::YYNOCODE && $this->yyidx >= 0);
     }
 }
-?>
\ No newline at end of file
index c8c2b6dce8c1291fdb2c27bf4597f6b5995978dc..e169653ff9aacb8de666d0c82cfc13ad32a4dcb4 100644 (file)
@@ -72,7 +72,7 @@ class Smarty_Internal_Utility {
             $_compileDirs = new RecursiveDirectoryIterator($_dir);
             $_compile = new RecursiveIteratorIterator($_compileDirs);
             foreach ($_compile as $_fileinfo) {
-                if (substr($_fileinfo->getBasename(),0,1) == '.' || strpos($_fileinfo, '.svn') !== false) continue;
+                if (substr(basename($_file->getPathname()),0,1) == '.' || strpos($_fileinfo, '.svn') !== false) continue;
                 $_file = $_fileinfo->getFilename();
                 if (!substr_compare($_file, $extention, - strlen($extention)) == 0) continue;
                 if ($_fileinfo->getPath() == substr($_dir, 0, -1)) {
@@ -87,6 +87,7 @@ class Smarty_Internal_Utility {
                     $_tpl = $smarty->createTemplate($_template_file,null,null,null,false);
                     if ($_tpl->mustCompile()) {
                         $_tpl->compileTemplateSource();
+                        $_count++;
                         echo ' compiled in  ', microtime(true) - $_start_time, ' seconds';
                         flush();
                     } else {
@@ -135,7 +136,7 @@ class Smarty_Internal_Utility {
             $_compileDirs = new RecursiveDirectoryIterator($_dir);
             $_compile = new RecursiveIteratorIterator($_compileDirs);
             foreach ($_compile as $_fileinfo) {
-                if (substr($_fileinfo->getBasename(),0,1) == '.' || strpos($_fileinfo, '.svn') !== false) continue;
+                if (substr(basename($_fileinfo->getPathname()),0,1) == '.' || strpos($_fileinfo, '.svn') !== false) continue;
                 $_file = $_fileinfo->getFilename();
                 if (!substr_compare($_file, $extention, - strlen($extention)) == 0) continue;
                 if ($_fileinfo->getPath() == substr($_dir, 0, -1)) {
@@ -150,6 +151,7 @@ class Smarty_Internal_Utility {
                     $_config = new Smarty_Internal_Config($_config_file, $smarty);
                     if ($_config->mustCompile()) {
                         $_config->compileConfigSource();
+                        $_count++;
                         echo ' compiled in  ', microtime(true) - $_start_time, ' seconds';
                         flush();
                     } else {
@@ -229,7 +231,7 @@ class Smarty_Internal_Utility {
         }
         $_compile = new RecursiveIteratorIterator($_compileDirs, RecursiveIteratorIterator::CHILD_FIRST);
         foreach ($_compile as $_file) {
-            if (substr($_file->getBasename(), 0, 1) == '.' || strpos($_file, '.svn') !== false)
+            if (substr(basename($_file->getPathname()), 0, 1) == '.' || strpos($_file, '.svn') !== false)
                 continue;
 
             $_filepath = (string) $_file;
@@ -299,7 +301,7 @@ class Smarty_Internal_Utility {
             echo "Smarty Installation test...\n";
             echo "Testing template directory...\n";
         }
-        
+
         $_stream_resolve_include_path = function_exists('stream_resolve_include_path');
 
         // test if all registered template_dir are accessible
@@ -315,7 +317,7 @@ class Smarty_Internal_Utility {
                     } else {
                         $template_dir = Smarty_Internal_Get_Include_Path::getIncludePath($_template_dir);
                     }
-                    
+
                     if ($template_dir !== false) {
                         if ($errors === null) {
                             echo "$template_dir is OK.\n";
@@ -436,7 +438,7 @@ class Smarty_Internal_Utility {
                     } else {
                         $plugin_dir = Smarty_Internal_Get_Include_Path::getIncludePath($_plugin_dir);
                     }
-                    
+
                     if ($plugin_dir !== false) {
                         if ($errors === null) {
                             echo "$plugin_dir is OK.\n";
@@ -568,7 +570,7 @@ class Smarty_Internal_Utility {
                     } else {
                         $config_dir = Smarty_Internal_Get_Include_Path::getIncludePath($_config_dir);
                     }
-                    
+
                     if ($config_dir !== false) {
                         if ($errors === null) {
                             echo "$config_dir is OK.\n";
index 2dfb4757c988fe0db3920265d5ca9ccebaae02e5..e5d19ce8d6842c3314a5c45066a1358f6e1fbca7 100644 (file)
@@ -44,12 +44,30 @@ class Smarty_Internal_Write_File {
             throw new SmartyException("unable to write file {$_tmp_file}");
             return false;
         }
+        
+        /*
+         * Windows' rename() fails if the destination exists,
+         * Linux' rename() properly handles the overwrite.
+         * Simply unlink()ing a file might cause other processes 
+         * currently reading that file to fail, but linux' rename()
+         * seems to be smart enough to handle that for us.
+         */
+        if (Smarty::$_IS_WINDOWS) {
+            // remove original file
+            @unlink($_filepath);
+            // rename tmp file
+            $success = @rename($_tmp_file, $_filepath);
+        } else {
+            // rename tmp file
+            $success = @rename($_tmp_file, $_filepath);
+            if (!$success) {
+                // remove original file
+                @unlink($_filepath);
+                // rename tmp file
+                $success = @rename($_tmp_file, $_filepath);
+            }
+        }
 
-        // remove original file
-        @unlink($_filepath);
-
-        // rename tmp file
-        $success = rename($_tmp_file, $_filepath);
         if (!$success) {
             error_reporting($_error_reporting);
             throw new SmartyException("unable to write file {$_filepath}");
index 7c1cea1352f656dab63b208327185a421082703f..55f1497fb1209d98904d3ffb9390ff1ac0b0f8de 100644 (file)
@@ -144,7 +144,52 @@ abstract class Smarty_Resource {
 
         $compiled->filepath = $_compile_dir . $_filepath . '.' . $compiled->source->type . $_basename . $_cache . '.php';
     }
-
+    
+    /**
+     * Normalize Paths "foo/../bar" to "bar" 
+     *
+     * @param string $_path path to normalize
+     * @param boolean $ds respect windows directory separator
+     * @return string normalized path
+     */
+    protected function normalizePath($_path, $ds=true)
+    {
+        if ($ds) {
+            // don't we all just love windows?
+            $_path = str_replace('\\', '/', $_path);
+        }
+        
+        $offset = 0;
+        
+        // resolve simples
+        $_path = preg_replace('#(/\./(\./)*)|/{2,}#', '/', $_path);
+        // resolve parents
+        while (true) {
+            $_parent = strpos($_path, '/../', $offset);
+            if (!$_parent) {
+                break;
+            } else if ($_path[$_parent - 1] === '.') {
+                $offset = $_parent + 3;
+                continue;
+            }
+            
+            $_pos = strrpos($_path, '/', $_parent - strlen($_path) - 1);
+            if ($_pos === false) {
+                // don't we all just love windows?
+                $_pos = $_parent;
+            }
+            
+            $_path = substr_replace($_path, '', $_pos, $_parent + 3 - $_pos);
+        }
+        
+        if ($ds && DS != '/') {
+            // don't we all just love windows?
+            $_path = str_replace('/', '\\', $_path);
+        }
+        
+        return $_path;
+    }
+    
     /**
      * build template filepath by traversing the template_dir array
      *
@@ -181,43 +226,22 @@ abstract class Smarty_Resource {
 
         // resolve relative path
         if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $file)) {
-            $_was_relative_prefix = $file[0] == '.' ? substr($file, 0, strpos($file, '|')) : null;
-            $_path = DS . trim($file, '/\\');
+            // don't we all just love windows?
+            $_path = str_replace('\\', '/', $file);
+            $_path = DS . trim($file, '/');
             $_was_relative = true;
         } else {
-            $_path = $file;
-        }
-        // don't we all just love windows?
-        $_path = str_replace('\\', '/', $_path);
-        // resolve simples
-        $_path = preg_replace('#(/\./(\./)*)|/{2,}#', '/', $_path);
-        // resolve parents
-        while (true) {
-            $_parent = strpos($_path, '/../');
-            if ($_parent === false) {
-                break;
-            } else if ($_parent === 0) {
-                $_path = substr($_path, 3);
-                break;
-            }
-            $_pos = strrpos($_path, '/', $_parent - strlen($_path) - 1);
-            if ($_pos === false) {
-                // don't we all just love windows?
-                $_pos = $_parent;
-            }
-            $_path = substr_replace($_path, '', $_pos, $_parent + 3 - $_pos);
+            // don't we all just love windows?
+            $_path = str_replace('\\', '/', $file);
         }
+        $_path = $this->normalizePath($_path, false);
         if (DS != '/') {
             // don't we all just love windows?
             $_path = str_replace('/', '\\', $_path);
         }
         // revert to relative
         if (isset($_was_relative)) {
-            if (isset($_was_relative_prefix)){
-                $_path = $_was_relative_prefix . $_path;
-            } else {
-                $_path = substr($_path, 1);
-            }
+            $_path = substr($_path, 1);
         }
 
         // this is only required for directories
@@ -254,7 +278,7 @@ abstract class Smarty_Resource {
                 }
             }
         }
-        
+
         $_stream_resolve_include_path = function_exists('stream_resolve_include_path');
 
         // relative file name?
@@ -262,7 +286,7 @@ abstract class Smarty_Resource {
             foreach ($_directories as $_directory) {
                 $_filepath = $_directory . $file;
                 if ($this->fileExists($source, $_filepath)) {
-                    return $_filepath;
+                    return $this->normalizePath($_filepath);
                 }
                 if ($source->smarty->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_directory)) {
                     // try PHP include_path
@@ -271,10 +295,10 @@ abstract class Smarty_Resource {
                     } else {
                         $_filepath = Smarty_Internal_Get_Include_Path::getIncludePath($_filepath);
                     }
-                    
+
                     if ($_filepath !== false) {
                         if ($this->fileExists($source, $_filepath)) {
-                            return $_filepath;
+                            return $this->normalizePath($_filepath);
                         }
                     }
                 }
@@ -493,6 +517,9 @@ abstract class Smarty_Resource {
 
         // check runtime cache
         $_cache_key = 'template|' . $unique_resource_name;
+        if ($smarty->compile_id) {
+            $_cache_key .= '|'.$smarty->compile_id;
+        }
         if (isset(self::$sources[$_cache_key])) {
             return self::$sources[$_cache_key];
         }