/**
  * Compiles code for the {/function} tag
  *
  * @param  array                                       $args      array with attributes from parser
  * @param object|\Smarty_Internal_TemplateCompilerBase $compiler  compiler object
  * @param  array                                       $parameter array with compilation parameter
  *
  * @return bool true
  */
 public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
 {
     $compiler->loopNesting--;
     $this->compiler = $compiler;
     $saved_data = $this->closeTag($compiler, array('function'));
     $_attr = $saved_data[0];
     $_name = trim($_attr['name'], "'\"");
     $compiler->parent_compiler->tpl_function[$_name]['called_functions'] = $compiler->parent_compiler->template->tpl_function[$_name]['called_functions'] = $compiler->called_functions;
     $compiler->parent_compiler->tpl_function[$_name]['compiled_filepath'] = $compiler->parent_compiler->template->tpl_function[$_name]['compiled_filepath'] = $compiler->parent_compiler->template->compiled->filepath;
     $compiler->parent_compiler->tpl_function[$_name]['uid'] = $compiler->parent_compiler->template->tpl_function[$_name]['uid'] = $compiler->template->source->uid;
     $compiler->called_functions = array();
     $_parameter = $_attr;
     unset($_parameter['name']);
     // default parameter
     $_paramsArray = array();
     foreach ($_parameter as $_key => $_value) {
         if (is_int($_key)) {
             $_paramsArray[] = "{$_key}=>{$_value}";
         } else {
             $_paramsArray[] = "'{$_key}'=>{$_value}";
         }
     }
     if (!empty($_paramsArray)) {
         $_params = 'array(' . implode(",", $_paramsArray) . ')';
         $_paramsCode = "\$params = array_merge({$_params}, \$params);\n";
     } else {
         $_paramsCode = '';
     }
     $_functionCode = $compiler->parser->current_buffer;
     // setup buffer for template function code
     $compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template();
     $_funcName = "smarty_template_function_{$_name}_{$compiler->template->compiled->nocache_hash}";
     $_funcNameCaching = $_funcName . '_nocache';
     if ($compiler->template->compiled->has_nocache_code) {
         $compiler->parent_compiler->tpl_function[$_name]['call_name_caching'] = $compiler->parent_compiler->template->tpl_function[$_name]['call_name_caching'] = $_funcNameCaching;
         $output = "<?php\n";
         $output .= "/* {$_funcNameCaching} */\n";
         $output .= "if (!function_exists('{$_funcNameCaching}')) {\n";
         $output .= "function {$_funcNameCaching} (\$_smarty_tpl,\$params) {\n";
         $output .= "ob_start();\n";
         $output .= "\$_smarty_tpl->compiled->has_nocache_code = true;\n";
         $output .= $_paramsCode;
         $output .= "\$_smarty_tpl->_cache['saved_tpl_vars'][] = \$_smarty_tpl->tpl_vars;\n";
         $output .= "foreach (\$params as \$key => \$value) {\n\$_smarty_tpl->tpl_vars[\$key] = new Smarty_Variable(\$value);\n}";
         $output .= "\$params = var_export(\$params, true);\n";
         $output .= "echo \"/*%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/<?php ";
         $output .= "\\\$saved_tpl_vars = \\\$_smarty_tpl->tpl_vars;\nforeach (\$params as \\\$key => \\\$value) {\n\\\$_smarty_tpl->tpl_vars[\\\$key] = new Smarty_Variable(\\\$value);\n}\n?>";
         $output .= "/*/%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/\n\";?>";
         $compiler->parser->current_buffer->append_subtree($compiler->parser, new Smarty_Internal_ParseTree_Tag($compiler->parser, $output));
         $compiler->parser->current_buffer->append_subtree($compiler->parser, $_functionCode);
         $output = "<?php echo \"/*%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/<?php ";
         $output .= "foreach (Smarty::\\\$global_tpl_vars as \\\$key => \\\$value){\n";
         $output .= "if (!isset(\\\$_smarty_tpl->tpl_vars[\\\$key]) || \\\$_smarty_tpl->tpl_vars[\\\$key] === \\\$value) \\\$saved_tpl_vars[\\\$key] = \\\$value;\n}\n";
         $output .= "\\\$_smarty_tpl->tpl_vars = \\\$saved_tpl_vars;?>\n";
         $output .= "/*/%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/\";\n?>";
         $output .= "<?php echo str_replace('{$compiler->template->compiled->nocache_hash}', \$_smarty_tpl->compiled->nocache_hash, ob_get_clean());\n";
         $output .= "\$_smarty_tpl->tpl_vars = array_pop(\$_smarty_tpl->_cache['saved_tpl_vars']);\n}\n}\n";
         $output .= "/*/ {$_funcName}_nocache */\n\n";
         $output .= "?>\n";
         $compiler->parser->current_buffer->append_subtree($compiler->parser, new Smarty_Internal_ParseTree_Tag($compiler->parser, $output));
         $_functionCode = new Smarty_Internal_ParseTree_Tag($compiler->parser, preg_replace_callback("/((<\\?php )?echo '\\/\\*%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%\\*\\/([\\S\\s]*?)\\/\\*\\/%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%\\*\\/';(\\?>\n)?)/", array($this, 'removeNocache'), $_functionCode->to_smarty_php($compiler->parser)));
     }
     $compiler->parent_compiler->tpl_function[$_name]['call_name'] = $compiler->parent_compiler->template->tpl_function[$_name]['call_name'] = $_funcName;
     $output = "<?php\n";
     $output .= "/* {$_funcName} */\n";
     $output .= "if (!function_exists('{$_funcName}')) {\n";
     $output .= "function {$_funcName}(\$_smarty_tpl,\$params) {\n";
     $output .= "\$saved_tpl_vars = \$_smarty_tpl->tpl_vars;\n";
     $output .= $_paramsCode;
     $output .= "foreach (\$params as \$key => \$value) {\n\$_smarty_tpl->tpl_vars[\$key] = new Smarty_Variable(\$value);\n}?>";
     $compiler->parser->current_buffer->append_subtree($compiler->parser, new Smarty_Internal_ParseTree_Tag($compiler->parser, $output));
     $compiler->parser->current_buffer->append_subtree($compiler->parser, $_functionCode);
     $output = "<?php foreach (Smarty::\$global_tpl_vars as \$key => \$value){\n";
     $output .= "if (!isset(\$_smarty_tpl->tpl_vars[\$key]) || \$_smarty_tpl->tpl_vars[\$key] === \$value) \$saved_tpl_vars[\$key] = \$value;\n}\n";
     $output .= "\$_smarty_tpl->tpl_vars = \$saved_tpl_vars;\n}\n}\n";
     $output .= "/*/ {$_funcName} */\n\n";
     $output .= "?>\n";
     $compiler->parser->current_buffer->append_subtree($compiler->parser, new Smarty_Internal_ParseTree_Tag($compiler->parser, $output));
     $compiler->parent_compiler->blockOrFunctionCode .= $compiler->parser->current_buffer->to_smarty_php($compiler->parser);
     // nocache plugins must be copied
     if (!empty($compiler->template->compiled->required_plugins['nocache'])) {
         foreach ($compiler->template->compiled->required_plugins['nocache'] as $plugin => $tmp) {
             foreach ($tmp as $type => $data) {
                 $compiler->parent_compiler->template->compiled->required_plugins['compiled'][$plugin][$type] = $data;
             }
         }
     }
     // restore old buffer
     $compiler->parser->current_buffer = $saved_data[1];
     // restore old status
     $compiler->template->compiled->has_nocache_code = $saved_data[2];
     $compiler->template->caching = $saved_data[3];
     return true;
 }
 /**
  * Compiles code for the {/block} tag
  *
  * @param  array                                $args      array with attributes from parser
  * @param \Smarty_Internal_TemplateCompilerBase $compiler  compiler object
  * @param  array                                $parameter array with compilation parameter
  *
  * @return bool true
  */
 public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
 {
     $this->compiler = $compiler;
     list($_attr, $_nocache, $_buffer, $_has_nocache_code, $_caching) = $this->closeTag($compiler, array('block'));
     $_name = trim($_attr['name'], "'\"");
     $_functionCode = $compiler->parser->current_buffer;
     // setup buffer for template function code
     $compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template();
     $_funcNameCaching = $_funcName = preg_replace('![^\\w]+!', '_', "block_function_{$_name}_" . uniqid(rand(), true));
     if ($compiler->template->compiled->has_nocache_code) {
         //            $compiler->parent_compiler->template->tpl_function[$_name]['call_name_caching'] = $_funcNameCaching;
         $_funcNameCaching .= '_nocache';
         $output = "<?php\n\n";
         $output .= "/* {block '{$_name}'} {$compiler->template->source->type}:{$compiler->template->source->name} */\n";
         $output .= "function {$_funcNameCaching} (\$_smarty_tpl, \$block) {\n";
         $output .= "/*/%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/\n";
         $output .= "\$_smarty_tpl->cached->hashes['{$compiler->template->compiled->nocache_hash}'] = true;\n?>\n";
         $compiler->parser->current_buffer->append_subtree($compiler->parser, new Smarty_Internal_ParseTree_Tag($compiler->parser, $output));
         $compiler->parser->current_buffer->append_subtree($compiler->parser, $_functionCode);
         $output = "<?php /*%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/\n";
         $output .= "\n}\n";
         $output .= "/* {/block '{$_name}'} */\n\n";
         $output .= "?>\n";
         $compiler->parser->current_buffer->append_subtree($compiler->parser, new Smarty_Internal_ParseTree_Tag($compiler->parser, $output));
         $compiler->blockOrFunctionCode .= $f = $compiler->parser->current_buffer->to_smarty_php($compiler->parser);
         $compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template();
         $_functionCode = new Smarty_Internal_ParseTree_Tag($compiler->parser, preg_replace_callback("/((<\\?php )?echo '\\/\\*%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%\\*\\/([\\S\\s]*?)\\/\\*\\/%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%\\*\\/';(\\?>\n)?)/", array($this, 'removeNocache'), $_functionCode->to_smarty_php($compiler->parser)));
     }
     $output = "<?php\n\n";
     $output .= "/* {block '{$_name}'}  {$compiler->template->source->type}:{$compiler->template->source->name} */\n";
     $output .= "function {$_funcName}(\$_smarty_tpl, \$block) {?>";
     $compiler->parser->current_buffer->append_subtree($compiler->parser, new Smarty_Internal_ParseTree_Tag($compiler->parser, $output));
     $compiler->parser->current_buffer->append_subtree($compiler->parser, $_functionCode);
     $output = "<?php\n}\n";
     $output .= "/* {/block '{$_name}'} */\n\n";
     $output .= "?>\n";
     $compiler->parser->current_buffer->append_subtree($compiler->parser, new Smarty_Internal_ParseTree_Tag($compiler->parser, $output));
     $compiler->blockOrFunctionCode .= $f = $compiler->parser->current_buffer->to_smarty_php($compiler->parser);
     // nocache plugins must be copied
     if (!empty($compiler->template->compiled->required_plugins['nocache'])) {
         foreach ($compiler->template->compiled->required_plugins['nocache'] as $plugin => $tmp) {
             foreach ($tmp as $type => $data) {
                 $compiler->parent_compiler->template->compiled->required_plugins['compiled'][$plugin][$type] = $data;
             }
         }
     }
     // restore old status
     $compiler->template->compiled->has_nocache_code = $_has_nocache_code;
     $compiler->tag_nocache = $compiler->nocache;
     $compiler->nocache = $_nocache;
     $compiler->parser->current_buffer = $_buffer;
     $_parameter = $_attr;
     foreach ($_parameter as $name => $stat) {
         if ($stat === false) {
             unset($_parameter[$name]);
         }
     }
     if (isset($compiler->callChildBlock[$compiler->blockTagNestingLevel])) {
         $_parameter['callChildBlock'] = 'true';
         unset($compiler->callChildBlock[$compiler->blockTagNestingLevel]);
     }
     $compiler->blockTagNestingLevel--;
     // inner {block} or child template {block} must register block
     if ($compiler->blockTagNestingLevel == 0 && $compiler->inheritanceChild) {
         $_function = 'register';
     } else {
         $_function = 'call';
     }
     $cm = $compiler->template->caching ? 'true' : 'false';
     $output = "<?php \n\$_smarty_tpl->_Block->{$_function}Block(\$_smarty_tpl, array('caching' => {$cm}, 'function' => '{$_funcNameCaching}'";
     foreach ($_parameter as $name => $stat) {
         if ($stat !== false) {
             $output .= ", '{$name}' => {$stat}";
         }
     }
     $output .= "));\n?>\n";
     $compiler->has_code = true;
     $compiler->suppressNocacheProcessing = true;
     return $output;
 }
 /**
  * Compiles code for the {/block} tag
  *
  * @param  array                                $args      array with attributes from parser
  * @param \Smarty_Internal_TemplateCompilerBase $compiler  compiler object
  * @param  array                                $parameter array with compilation parameter
  *
  * @return bool true
  */
 public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
 {
     list($_attr, $_nocache, $_buffer, $_has_nocache_code, $_caching) = $this->closeTag($compiler, array('block'));
     // init block parameter
     $_block = $compiler->_cache['blockParams'][$compiler->_cache['blockNesting']];
     unset($compiler->_cache['blockParams'][$compiler->_cache['blockNesting']]);
     $_block[2] = $_block[3] = 0;
     $_name = trim($_attr['name'], "'\"");
     $_assign = isset($_attr['assign']) ? $_attr['assign'] : null;
     unset($_attr['assign'], $_attr['name']);
     foreach ($_attr as $name => $stat) {
         if (is_bool($stat) && $stat !== false || !is_bool($stat) && $stat != 'false') {
             $_block[$name] = is_string($stat) ? trim($stat, "'\"") : $stat;
         }
     }
     $_funcName = $_block[0];
     // get compiled block code
     $_functionCode = $compiler->parser->current_buffer;
     // setup buffer for template function code
     $compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template();
     if ($compiler->template->compiled->has_nocache_code) {
         //            $compiler->parent_compiler->template->tpl_function[$_name]['call_name_caching'] = $_funcNameCaching;
         $_block[6] = $_funcNameCaching = $_funcName . '_nocache';
         $output = "<?php\n";
         $output .= "/* {block '{$_name}'} {$compiler->template->source->type}:{$compiler->template->source->name} */\n";
         $output .= "function {$_funcNameCaching} (\$_smarty_tpl, \$_blockParentStack) {\n";
         $output .= "/*/%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/\n";
         $output .= "\$_smarty_tpl->cached->hashes['{$compiler->template->compiled->nocache_hash}'] = true;\n";
         if (isset($_assign)) {
             $output .= "ob_start();\n";
         }
         $output .= "?>\n";
         $compiler->parser->current_buffer->append_subtree($compiler->parser, new Smarty_Internal_ParseTree_Tag($compiler->parser, $output));
         $compiler->parser->current_buffer->append_subtree($compiler->parser, $_functionCode);
         $output = "<?php\n";
         if (isset($_assign)) {
             $output .= "\$_smarty_tpl->tpl_vars[{$_assign}] = new Smarty_Variable(ob_get_clean());\n";
         }
         $output .= "/*%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%*/\n";
         $output .= "}\n";
         $output .= "/* {/block '{$_name}'} */\n\n";
         $output .= "?>\n";
         $compiler->parser->current_buffer->append_subtree($compiler->parser, new Smarty_Internal_ParseTree_Tag($compiler->parser, $output));
         $compiler->blockOrFunctionCode .= $f = $compiler->parser->current_buffer->to_smarty_php($compiler->parser);
         $compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template();
         $this->compiler = $compiler;
         $_functionCode = new Smarty_Internal_ParseTree_Tag($compiler->parser, preg_replace_callback("/((<\\?php )?echo '\\/\\*%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%\\*\\/([\\S\\s]*?)\\/\\*\\/%%SmartyNocache:{$compiler->template->compiled->nocache_hash}%%\\*\\/';(\\?>\n)?)/", array($this, 'removeNocache'), $_functionCode->to_smarty_php($compiler->parser)));
         $this->compiler = null;
     }
     $output = "<?php\n";
     $output .= "/* {block '{$_name}'}  {$compiler->template->source->type}:{$compiler->template->source->name} */\n";
     $output .= "function {$_funcName}(\$_smarty_tpl, \$_blockParentStack) {\n";
     if (isset($_assign)) {
         $output .= "ob_start();\n";
     }
     $output .= "?>\n";
     $compiler->parser->current_buffer->append_subtree($compiler->parser, new Smarty_Internal_ParseTree_Tag($compiler->parser, $output));
     $compiler->parser->current_buffer->append_subtree($compiler->parser, $_functionCode);
     $output = "<?php\n";
     if (isset($_assign)) {
         $output .= "\$_smarty_tpl->tpl_vars[{$_assign}] = new Smarty_Variable(ob_get_clean());\n";
     }
     $output .= "}\n";
     $output .= "/* {/block '{$_name}'} */\n\n";
     $output .= "?>\n";
     $compiler->parser->current_buffer->append_subtree($compiler->parser, new Smarty_Internal_ParseTree_Tag($compiler->parser, $output));
     $compiler->blockOrFunctionCode .= $compiler->parser->current_buffer->to_smarty_php($compiler->parser);
     // nocache plugins must be copied
     if (!empty($compiler->template->compiled->required_plugins['nocache'])) {
         foreach ($compiler->template->compiled->required_plugins['nocache'] as $plugin => $tmp) {
             foreach ($tmp as $type => $data) {
                 $compiler->parent_compiler->template->compiled->required_plugins['compiled'][$plugin][$type] = $data;
             }
         }
     }
     // restore old status
     $compiler->template->compiled->has_nocache_code = $_has_nocache_code;
     $compiler->tag_nocache = $compiler->nocache;
     $compiler->nocache = $_nocache;
     $compiler->parser->current_buffer = $_buffer;
     $output = "<?php \n";
     if ($compiler->_cache['blockNesting'] == 1) {
         $output .= "\$_smarty_tpl->_inheritance->processBlock(\$_smarty_tpl, 0, {$compiler->_cache['blockName'][$compiler->_cache['blockNesting']]}, " . var_export($_block, true) . ");\n";
     } else {
         $output .= "\$_smarty_tpl->_inheritance->processBlock(\$_smarty_tpl, 0, {$compiler->_cache['blockName'][$compiler->_cache['blockNesting']]}, " . var_export($_block, true) . ", \$_blockParentStack);\n";
     }
     $output .= "?>\n";
     $compiler->_cache['blockNesting']--;
     if ($compiler->_cache['blockNesting'] == 0) {
         unset($compiler->_cache['blockNesting']);
     }
     $compiler->has_code = true;
     $compiler->suppressNocacheProcessing = true;
     return $output;
 }
 /**
  * Compiles code for the {/function} tag
  * @param  array $args array with attributes from parser
  * @param object|\Smarty_Internal_TemplateCompilerBase $compiler compiler object
  * @param  array $parameter array with compilation parameter
  * @return bool true
  */
 public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler, $parameter)
 {
     $this->compiler = $compiler;
     $saved_data = $this->closeTag($compiler, ['function']);
     $_attr = $saved_data[0];
     $_name = trim($_attr['name'], "'\"");
     // reset flag that we are compiling a template function
     $compiler->compiles_template_function = FALSE;
     $compiler->parent_compiler->templateProperties['tpl_function'][$_name]['called_functions'] = $compiler->called_functions;
     $compiler->parent_compiler->templateProperties['tpl_function'][$_name]['compiled_filepath'] = $compiler->parent_compiler->template->compiled->filepath;
     $compiler->parent_compiler->templateProperties['tpl_function'][$_name]['uid'] = $compiler->template->source->uid;
     $compiler->called_functions = [];
     $_parameter = $_attr;
     unset($_parameter['name']);
     // default parameter
     $_paramsArray = [];
     foreach ($_parameter as $_key => $_value) {
         if (is_int($_key)) {
             $_paramsArray[] = "{$_key}=>{$_value}";
         } else {
             $_paramsArray[] = "'{$_key}'=>{$_value}";
         }
     }
     if (!empty($_paramsArray)) {
         $_params = 'array(' . implode(",", $_paramsArray) . ')';
         $_paramsCode = "\$params = array_merge({$_params}, \$params);\n";
     } else {
         $_paramsCode = '';
     }
     $_functionCode = $compiler->parser->current_buffer;
     // setup buffer for template function code
     $compiler->parser->current_buffer = new Smarty_Internal_ParseTree_Template($compiler->parser);
     $_funcName = "smarty_template_function_{$_name}_{$compiler->template->properties['nocache_hash']}";
     $_funcNameCaching = $_funcName . '_nocache';
     if ($compiler->template->has_nocache_code) {
         $compiler->parent_compiler->templateProperties['tpl_function'][$_name]['call_name_caching'] = $_funcNameCaching;
         $output = "<?php\n";
         $output .= "/* {$_funcNameCaching} */\n";
         $output .= "if (!function_exists('{$_funcNameCaching}')) {\n";
         $output .= "function {$_funcNameCaching} (\$_smarty_tpl,\$params) {\n";
         // build plugin include code
         if (!empty($compiler->template->required_plugins['compiled'])) {
             foreach ($compiler->template->required_plugins['compiled'] as $tmp) {
                 foreach ($tmp as $data) {
                     $output .= "if (!is_callable('{$data['function']}')) require_once '{$data['file']}';\n";
                 }
             }
         }
         if (!empty($compiler->template->required_plugins['nocache'])) {
             $output .= "echo '/*%%SmartyNocache:{$compiler->template->properties['nocache_hash']}%%*/<?php ";
             foreach ($compiler->template->required_plugins['nocache'] as $tmp) {
                 foreach ($tmp as $data) {
                     $output .= "if (!is_callable(\\'{$data['function']}\\')) require_once \\'{$data['file']}\\';\n";
                 }
             }
             $output .= "?>/*/%%SmartyNocache:{$compiler->template->properties['nocache_hash']}%%*/';\n";
         }
         $output .= "ob_start();\n";
         $output .= $_paramsCode;
         $output .= "\$_smarty_tpl->properties['saved_tpl_vars'][] = \$_smarty_tpl->tpl_vars;\n";
         $output .= "foreach (\$params as \$key => \$value) {\n\$_smarty_tpl->tpl_vars[\$key] = new Smarty_Variable(\$value);\n}";
         $output .= "\$params = var_export(\$params, true);\n";
         $output .= "echo \"/*%%SmartyNocache:{$compiler->template->properties['nocache_hash']}%%*/<?php ";
         $output .= "\\\$saved_tpl_vars = \\\$_smarty_tpl->tpl_vars;\nforeach (\$params as \\\$key => \\\$value) {\n\\\$_smarty_tpl->tpl_vars[\\\$key] = new Smarty_Variable(\\\$value);\n}\n?>";
         $output .= "/*/%%SmartyNocache:{$compiler->template->properties['nocache_hash']}%%*/\n\";?>";
         $compiler->parser->current_buffer->append_subtree(new Smarty_Internal_ParseTree_Tag($compiler->parser, $output));
         $compiler->parser->current_buffer->append_subtree($_functionCode);
         $output = "<?php echo \"/*%%SmartyNocache:{$compiler->template->properties['nocache_hash']}%%*/<?php ";
         $output .= "foreach (Smarty::\\\$global_tpl_vars as \\\$key => \\\$value){\n";
         $output .= "if (\\\$_smarty_tpl->tpl_vars[\\\$key] === \\\$value) \\\$saved_tpl_vars[\\\$key] = \\\$value;\n}\n";
         $output .= "\\\$_smarty_tpl->tpl_vars = \\\$saved_tpl_vars;?>\n";
         $output .= "/*/%%SmartyNocache:{$compiler->template->properties['nocache_hash']}%%*/\";\n?>";
         $output .= "<?php echo str_replace('{$compiler->template->properties['nocache_hash']}', \$_smarty_tpl->properties['nocache_hash'], ob_get_clean());\n";
         $output .= "\$_smarty_tpl->tpl_vars = array_pop(\$_smarty_tpl->properties['saved_tpl_vars']);\n}\n}\n";
         $output .= "/*/ {$_funcName}_nocache */\n\n";
         $output .= "?>\n";
         $compiler->parser->current_buffer->append_subtree(new Smarty_Internal_ParseTree_Tag($compiler->parser, $output));
         $_functionCode = new Smarty_Internal_ParseTree_Tag($compiler->parser, preg_replace_callback("/((<\\?php )?echo '\\/\\*%%SmartyNocache:{$compiler->template->properties['nocache_hash']}%%\\*\\/([\\S\\s]*?)\\/\\*\\/%%SmartyNocache:{$compiler->template->properties['nocache_hash']}%%\\*\\/';(\\?>\n)?)/", [$this, 'removeNocache'], $_functionCode->to_smarty_php()));
     }
     $compiler->parent_compiler->templateProperties['tpl_function'][$_name]['call_name'] = $_funcName;
     $output = "<?php\n";
     $output .= "/* {$_funcName} */\n";
     $output .= "if (!function_exists('{$_funcName}')) {\n";
     $output .= "function {$_funcName}(\$_smarty_tpl,\$params) {\n";
     // build plugin include code
     if (!empty($compiler->template->required_plugins['nocache'])) {
         $compiler->template->required_plugins['compiled'] = array_merge($compiler->template->required_plugins['compiled'], $compiler->template->required_plugins['nocache']);
     }
     if (!empty($compiler->template->required_plugins['compiled'])) {
         foreach ($compiler->template->required_plugins['compiled'] as $tmp) {
             foreach ($tmp as $data) {
                 $output .= "if (!is_callable('{$data['function']}')) require_once '{$data['file']}';\n";
             }
         }
     }
     $output .= "\$saved_tpl_vars = \$_smarty_tpl->tpl_vars;\n";
     $output .= $_paramsCode;
     $output .= "foreach (\$params as \$key => \$value) {\n\$_smarty_tpl->tpl_vars[\$key] = new Smarty_Variable(\$value);\n}?>";
     $compiler->parser->current_buffer->append_subtree(new Smarty_Internal_ParseTree_Tag($compiler->parser, $output));
     $compiler->parser->current_buffer->append_subtree($_functionCode);
     $output = "<?php foreach (Smarty::\$global_tpl_vars as \$key => \$value){\n";
     $output .= "if (\$_smarty_tpl->tpl_vars[\$key] === \$value) \$saved_tpl_vars[\$key] = \$value;\n}\n";
     $output .= "\$_smarty_tpl->tpl_vars = \$saved_tpl_vars;\n}\n}\n";
     $output .= "/*/ {$_funcName} */\n\n";
     $output .= "?>\n";
     $compiler->parser->current_buffer->append_subtree(new Smarty_Internal_ParseTree_Tag($compiler->parser, $output));
     $compiler->parent_compiler->templateFunctionCode .= $compiler->parser->current_buffer->to_smarty_php();
     // restore old buffer
     $compiler->parser->current_buffer = $saved_data[1];
     // restore old status
     $compiler->template->has_nocache_code = $saved_data[2];
     $compiler->template->required_plugins = $saved_data[3];
     $compiler->template->caching = $saved_data[4];
     return TRUE;
 }