forked from Geekcrowds/provisioner
-
Notifications
You must be signed in to change notification settings - Fork 15
/
simple_twig_minified.php
2 lines (2 loc) · 138 KB
/
simple_twig_minified.php
1
2
<?php
class Twig_Error extends Exception{ protected $lineno; protected $filename; protected $rawMessage; protected $previous; public function __construct($message,$lineno=-1,$filename=null,Exception$previous=null){if(version_compare(PHP_VERSION,'5.3.0','<')){$this->previous=$previous;parent::__construct('');}else {parent::__construct('',0,$previous);}$this->lineno=$lineno;$this->filename=$filename;if(-1===$this->lineno||null===$this->filename){$this->guessTemplateInfo();}$this->rawMessage=$message;$this->updateRepr();} public function getRawMessage(){return $this->rawMessage;} public function getTemplateFile(){return $this->filename;} public function setTemplateFile($filename){$this->filename=$filename;$this->updateRepr();} public function getTemplateLine(){return $this->lineno;} public function setTemplateLine($lineno){$this->lineno=$lineno;$this->updateRepr();} public function __call($method,$arguments){if('getprevious'==strtolower($method)){return $this->previous;} throw new BadMethodCallException(sprintf('Method "Twig_Error::%s()" does not exist.',$method));} protected function updateRepr(){$this->message=$this->rawMessage;$dot=false;if('.'===substr($this->message,-1)){$this->message=substr($this->message,0,-1);$dot=true;}if(null!==$this->filename){if(is_string($this->filename)||(is_object($this->filename)&&method_exists($this->filename,'__toString'))){$filename=sprintf('"%s"',$this->filename);}else {$filename=json_encode($this->filename);}$this->message.=sprintf(' in %s',$filename);}if($this->lineno>=0){$this->message.=sprintf(' at line %d',$this->lineno);}if($dot){$this->message.='.';}} protected function guessTemplateInfo(){$template=null;foreach(debug_backtrace() as $trace){if(isset($trace['object'])&&$trace['object'] instanceof Twig_Template&&'Twig_Template'!==get_class($trace['object'])){$template=$trace['object'];}}if(null!==$template&&null===$this->filename){$this->filename=$template->getTemplateName();}if(null===$template||$this->lineno>-1){return;}$r=new ReflectionObject($template);$file=$r->getFileName();$exceptions=array($e=$this);while(($e instanceof self||method_exists($e,'getPrevious'))&&$e=$e->getPrevious()){$exceptions[]=$e;}while($e=array_pop($exceptions)){$traces=$e->getTrace();while($trace=array_shift($traces)){if(!isset($trace['file'])||!isset($trace['line'])||$file!=$trace['file']){continue;}foreach($template->getDebugInfo() as $codeLine=>$templateLine){if($codeLine<=$trace['line']){$this->lineno=$templateLine;return;}}}}}}class Twig_Error_Loader extends Twig_Error{}class Twig_Loader_Filesystem implements Twig_LoaderInterface{ protected $paths; protected $cache; public function __construct($paths){$this->setPaths($paths);} public function getPaths($namespace='__main__'){return isset($this->paths[$namespace])?$this->paths[$namespace]:array();} public function getNamespaces(){return array_keys($this->paths);} public function setPaths($paths,$namespace='__main__'){if(!is_array($paths)){$paths=array($paths);}$this->paths[$namespace]=array();foreach($paths as $path){$this->addPath($path,$namespace);}} public function addPath($path,$namespace='__main__'){$this->cache=array();if(!is_dir($path)){ throw new Twig_Error_Loader(sprintf('The "%s" directory does not exist.',$path));}$this->paths[$namespace][]=rtrim($path,'/\\');} public function prependPath($path,$namespace='__main__'){$this->cache=array();if(!is_dir($path)){ throw new Twig_Error_Loader(sprintf('The "%s" directory does not exist.',$path));}$path=rtrim($path,'/\\');if(!isset($this->paths[$namespace])){$this->paths[$namespace][]=$path;}else {array_unshift($this->paths[$namespace],$path);}} public function getSource($name){return file_get_contents($this->findTemplate($name));} public function getCacheKey($name){return $this->findTemplate($name);} public function isFresh($name,$time){return filemtime($this->findTemplate($name))<=$time;} protected function findTemplate($name){$name=preg_replace('#/{2,}#','/',strtr($name,'\\','/'));if(isset($this->cache[$name])){return $this->cache[$name];}$this->validateName($name);$namespace='__main__';if(isset($name[0])&&'@'==$name[0]){if(false===$pos=strpos($name,'/')){ throw new InvalidArgumentException(sprintf('Malformed namespaced template name "%s" (expecting "@namespace/template_name").',$name));}$namespace=substr($name,1,$pos-1);$name=substr($name,$pos+1);}if(!isset($this->paths[$namespace])){ throw new Twig_Error_Loader(sprintf('There are no registered paths for namespace "%s".',$namespace));}foreach($this->paths[$namespace] as $path){if(is_file($path.'/'.$name)){return $this->cache[$name]=$path.'/'.$name;}} throw new Twig_Error_Loader(sprintf('Unable to find template "%s" (looked into: %s).',$name,implode(', ',$this->paths[$namespace])));} protected function validateName($name){if(false!==strpos($name,"\0")){ throw new Twig_Error_Loader('A template name cannot contain NUL bytes.');}$parts=explode('/',$name);$level=0;foreach($parts as $part){if('..'===$part){--$level;}elseif('.'!==$part){++$level;}if($level<0){ throw new Twig_Error_Loader(sprintf('Looks like you try to load a template outside configured directories (%s).',$name));}}}} interface Twig_LoaderInterface{function getSource($name);function getCacheKey($name);function isFresh($name,$time);}class Twig_Environment{const VERSION='1.10.0'; protected $charset; protected $loader; protected $debug; protected $autoReload; protected $cache; protected $lexer; protected $parser; protected $compiler; protected $baseTemplateClass; protected $extensions; protected $parsers; protected $visitors; protected $filters; protected $tests; protected $functions; protected $globals; protected $runtimeInitialized; protected $loadedTemplates; protected $strictVariables; protected $unaryOperators; protected $binaryOperators; protected $templateClassPrefix='__TwigTemplate_'; protected $functionCallbacks; protected $filterCallbacks; protected $staging; public function __construct(Twig_LoaderInterface$loader=null,$options=array()){if(null!==$loader){$this->setLoader($loader);}$options=array_merge(array('debug'=>false,'charset'=>'UTF-8','base_template_class'=>'Twig_Template','strict_variables'=>false,'autoescape'=>'html','cache'=>false,'auto_reload'=>null,'optimizations'=>-1,),$options);$this->debug=(bool)$options['debug'];$this->charset=$options['charset'];$this->baseTemplateClass=$options['base_template_class'];$this->autoReload=null===$options['auto_reload']?$this->debug:(bool)$options['auto_reload'];$this->extensions=array('core'=>new Twig_Extension_Core(),'escaper'=>new Twig_Extension_Escaper($options['autoescape']),'optimizer'=>new Twig_Extension_Optimizer($options['optimizations']),);$this->strictVariables=(bool)$options['strict_variables'];$this->runtimeInitialized=false;$this->setCache($options['cache']);$this->functionCallbacks=array();$this->filterCallbacks=array();$this->staging=array('functions'=>array(),'filters'=>array(),'tests'=>array(),'token_parsers'=>array(),'visitors'=>array(),'globals'=>array(),);} public function getBaseTemplateClass(){return $this->baseTemplateClass;} public function setBaseTemplateClass($class){$this->baseTemplateClass=$class;} public function enableDebug(){$this->debug=true;} public function disableDebug(){$this->debug=false;} public function isDebug(){return $this->debug;} public function enableAutoReload(){$this->autoReload=true;} public function disableAutoReload(){$this->autoReload=false;} public function isAutoReload(){return $this->autoReload;} public function enableStrictVariables(){$this->strictVariables=true;} public function disableStrictVariables(){$this->strictVariables=false;} public function isStrictVariables(){return $this->strictVariables;} public function getCache(){return $this->cache;} public function setCache($cache){$this->cache=$cache?$cache:false;} public function getCacheFilename($name){if(false===$this->cache){return false;}$class=substr($this->getTemplateClass($name),strlen($this->templateClassPrefix));return $this->getCache().'/'.substr($class,0,2).'/'.substr($class,2,2).'/'.substr($class,4).'.php';} public function getTemplateClass($name,$index=null){return $this->templateClassPrefix.md5($this->loader->getCacheKey($name)).(null===$index?'':'_'.$index);} public function getTemplateClassPrefix(){return $this->templateClassPrefix;} public function render($name,array$context=array()){return $this->loadTemplate($name)->render($context);} public function display($name,array$context=array()){$this->loadTemplate($name)->display($context);} public function loadTemplate($name,$index=null){$cls=$this->getTemplateClass($name,$index);if(isset($this->loadedTemplates[$cls])){return $this->loadedTemplates[$cls];}if(!class_exists($cls,false)){if(false===$cache=$this->getCacheFilename($name)){eval($this->compileSource($this->loader->getSource($name),$name));}else {if(!is_file($cache)||($this->isAutoReload()&&!$this->isTemplateFresh($name,filemtime($cache)))){$this->writeCacheFile($cache,$this->compileSource($this->loader->getSource($name),$name));}require_once $cache;}}if(!$this->runtimeInitialized){$this->initRuntime();}return $this->loadedTemplates[$cls]=new $cls($this);} public function isTemplateFresh($name,$time){foreach($this->extensions as $extension){$r=new ReflectionObject($extension);if(filemtime($r->getFileName())>$time){return false;}}return $this->loader->isFresh($name,$time);} public function resolveTemplate($names){if(!is_array($names)){$names=array($names);}foreach($names as $name){if($name instanceof Twig_Template){return $name;}try{return $this->loadTemplate($name);}catch(Twig_Error_Loader$e){}}if(1===count($names)){ throw $e;} throw new Twig_Error_Loader(sprintf('Unable to find one of the following templates: "%s".',implode('", "',$names)));} public function clearTemplateCache(){$this->loadedTemplates=array();} public function clearCacheFiles(){if(false===$this->cache){return;}foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->cache),RecursiveIteratorIterator::LEAVES_ONLY) as $file){if($file->isFile()){@unlink($file->getPathname());}}} public function getLexer(){if(null===$this->lexer){$this->lexer=new Twig_Lexer($this);}return $this->lexer;} public function setLexer(Twig_LexerInterface$lexer){$this->lexer=$lexer;} public function tokenize($source,$name=null){return $this->getLexer()->tokenize($source,$name);} public function getParser(){if(null===$this->parser){$this->parser=new Twig_Parser($this);}return $this->parser;} public function setParser(Twig_ParserInterface$parser){$this->parser=$parser;} public function parse(Twig_TokenStream$tokens){return $this->getParser()->parse($tokens);} public function getCompiler(){if(null===$this->compiler){$this->compiler=new Twig_Compiler($this);}return $this->compiler;} public function setCompiler(Twig_CompilerInterface$compiler){$this->compiler=$compiler;} public function compile(Twig_NodeInterface$node){return $this->getCompiler()->compile($node)->getSource();} public function compileSource($source,$name=null){try{return $this->compile($this->parse($this->tokenize($source,$name)));}catch(Twig_Error$e){$e->setTemplateFile($name); throw $e;}catch(Exception$e){ throw new Twig_Error_Runtime(sprintf('An exception has been thrown during the compilation of a template ("%s").',$e->getMessage()),-1,$name,$e);}} public function setLoader(Twig_LoaderInterface$loader){$this->loader=$loader;} public function getLoader(){return $this->loader;} public function setCharset($charset){$this->charset=$charset;} public function getCharset(){return $this->charset;} public function initRuntime(){$this->runtimeInitialized=true;foreach($this->getExtensions() as $extension){$extension->initRuntime($this);}} public function hasExtension($name){return isset($this->extensions[$name]);} public function getExtension($name){if(!isset($this->extensions[$name])){ throw new Twig_Error_Runtime(sprintf('The "%s" extension is not enabled.',$name));}return $this->extensions[$name];} public function addExtension(Twig_ExtensionInterface$extension){$this->extensions[$extension->getName()]=$extension;$this->parsers=null;$this->visitors=null;$this->filters=null;$this->tests=null;$this->functions=null;$this->globals=null;} public function removeExtension($name){unset($this->extensions[$name]);$this->parsers=null;$this->visitors=null;$this->filters=null;$this->tests=null;$this->functions=null;$this->globals=null;} public function setExtensions(array$extensions){foreach($extensions as $extension){$this->addExtension($extension);}} public function getExtensions(){return $this->extensions;} public function addTokenParser(Twig_TokenParserInterface$parser){$this->staging['token_parsers'][]=$parser;$this->parsers=null;} public function getTokenParsers(){if(null===$this->parsers){$this->parsers=new Twig_TokenParserBroker();if(isset($this->staging['token_parsers'])){foreach($this->staging['token_parsers'] as $parser){$this->parsers->addTokenParser($parser);}}foreach($this->getExtensions() as $extension){$parsers=$extension->getTokenParsers();foreach($parsers as $parser){if($parser instanceof Twig_TokenParserInterface){$this->parsers->addTokenParser($parser);}elseif($parser instanceof Twig_TokenParserBrokerInterface){$this->parsers->addTokenParserBroker($parser);}else { throw new Twig_Error_Runtime('getTokenParsers() must return an array of Twig_TokenParserInterface or Twig_TokenParserBrokerInterface instances');}}}}return $this->parsers;} public function getTags(){$tags=array();foreach($this->getTokenParsers()->getParsers() as $parser){if($parser instanceof Twig_TokenParserInterface){$tags[$parser->getTag()]=$parser;}}return $tags;} public function addNodeVisitor(Twig_NodeVisitorInterface$visitor){$this->staging['visitors'][]=$visitor;$this->visitors=null;} public function getNodeVisitors(){if(null===$this->visitors){foreach($this->getExtensions() as $extension){foreach($extension->getNodeVisitors() as $visitor){$this->addNodeVisitor($visitor);}}$this->visitors=$this->staging['visitors'];}return $this->visitors;} public function addFilter($name,Twig_FilterInterface$filter){$this->staging['filters'][$name]=$filter;$this->filters=null;} public function getFilter($name){if(null===$this->filters){$this->getFilters();}if(isset($this->filters[$name])){return $this->filters[$name];}foreach($this->filters as $pattern=>$filter){$pattern=str_replace('\\*','(.*?)',preg_quote($pattern,'#'),$count);if($count){if(preg_match('#^'.$pattern.'$#',$name,$matches)){array_shift($matches);$filter->setArguments($matches);return $filter;}}}foreach($this->filterCallbacks as $callback){if(false!==$filter=call_user_func($callback,$name)){return $filter;}}return false;} public function registerUndefinedFilterCallback($callable){$this->filterCallbacks[]=$callable;} public function getFilters(){if(null===$this->filters){foreach($this->getExtensions() as $extension){foreach($extension->getFilters() as $name=>$filter){$this->addFilter($name,$filter);}}$this->filters=$this->staging['filters'];}return $this->filters;} public function addTest($name,Twig_TestInterface$test){$this->staging['tests'][$name]=$test;$this->tests=null;} public function getTests(){if(null===$this->tests){foreach($this->getExtensions() as $extension){foreach($extension->getTests() as $name=>$test){$this->addTest($name,$test);}}$this->tests=$this->staging['tests'];}return $this->tests;} public function addFunction($name,Twig_FunctionInterface$function){$this->staging['functions'][$name]=$function;$this->functions=null;} public function getFunction($name){if(null===$this->functions){$this->getFunctions();}if(isset($this->functions[$name])){return $this->functions[$name];}foreach($this->functions as $pattern=>$function){$pattern=str_replace('\\*','(.*?)',preg_quote($pattern,'#'),$count);if($count){if(preg_match('#^'.$pattern.'$#',$name,$matches)){array_shift($matches);$function->setArguments($matches);return $function;}}}foreach($this->functionCallbacks as $callback){if(false!==$function=call_user_func($callback,$name)){return $function;}}return false;} public function registerUndefinedFunctionCallback($callable){$this->functionCallbacks[]=$callable;} public function getFunctions(){if(null===$this->functions){foreach($this->getExtensions() as $extension){foreach($extension->getFunctions() as $name=>$function){$this->addFunction($name,$function);}}$this->functions=$this->staging['functions'];}return $this->functions;} public function addGlobal($name,$value){$this->staging['globals'][$name]=$value;$this->globals=null;} public function getGlobals(){if(null===$this->globals){$this->globals=isset($this->staging['globals'])?$this->staging['globals']:array();foreach($this->getExtensions() as $extension){$this->globals=array_merge($this->globals,$extension->getGlobals());}}return $this->globals;} public function mergeGlobals(array$context){foreach($this->getGlobals() as $key=>$value){if(!array_key_exists($key,$context)){$context[$key]=$value;}}return $context;} public function getUnaryOperators(){if(null===$this->unaryOperators){$this->initOperators();}return $this->unaryOperators;} public function getBinaryOperators(){if(null===$this->binaryOperators){$this->initOperators();}return $this->binaryOperators;} public function computeAlternatives($name,$items){$alternatives=array();foreach($items as $item){$lev=levenshtein($name,$item);if($lev<=strlen($name)/3||false!==strpos($item,$name)){$alternatives[$item]=$lev;}}asort($alternatives);return array_keys($alternatives);} protected function initOperators(){$this->unaryOperators=array();$this->binaryOperators=array();foreach($this->getExtensions() as $extension){$operators=$extension->getOperators();if(!$operators){continue;}if(2!==count($operators)){ throw new InvalidArgumentException(sprintf('"%s::getOperators()" does not return a valid operators array.',get_class($extension)));}$this->unaryOperators=array_merge($this->unaryOperators,$operators[0]);$this->binaryOperators=array_merge($this->binaryOperators,$operators[1]);}} protected function writeCacheFile($file,$content){$dir=dirname($file);if(!is_dir($dir)){if(false===@mkdir($dir,0777,true)&&!is_dir($dir)){ throw new RuntimeException(sprintf("Unable to create the cache directory (%s).",$dir));}}elseif(!is_writable($dir)){ throw new RuntimeException(sprintf("Unable to write in the cache directory (%s).",$dir));}$tmpFile=tempnam(dirname($file),basename($file));if(false!==@file_put_contents($tmpFile,$content)){if(@rename($tmpFile,$file)||(@copy($tmpFile,$file)&&unlink($tmpFile))){@chmod($file,0666&~umask());return;}} throw new Twig_Error_Runtime(sprintf('Failed to write cache file "%s".',$file));}}if(!defined('ENT_SUBSTITUTE')){define('ENT_SUBSTITUTE',8);}abstract class Twig_Extension implements Twig_ExtensionInterface{ public function initRuntime(Twig_Environment$environment){} public function getTokenParsers(){return array();} public function getNodeVisitors(){return array();} public function getFilters(){return array();} public function getTests(){return array();} public function getFunctions(){return array();} public function getOperators(){return array();} public function getGlobals(){return array();}}class Twig_Extension_Core extends Twig_Extension{ protected $dateFormats=array('F j, Y H:i','%d days'); protected $numberFormat=array(0,'.',','); protected $timezone=null; public function setDateFormat($format=null,$dateIntervalFormat=null){if(null!==$format){$this->dateFormats[0]=$format;}if(null!==$dateIntervalFormat){$this->dateFormats[1]=$dateIntervalFormat;}} public function getDateFormat(){return $this->dateFormats;} public function setTimezone($timezone){$this->timezone=$timezone instanceof DateTimeZone?$timezone:new DateTimeZone($timezone);} public function getTimezone(){return $this->timezone;} public function setNumberFormat($decimal,$decimalPoint,$thousandSep){$this->numberFormat=array($decimal,$decimalPoint,$thousandSep);} public function getNumberFormat(){return $this->numberFormat;} public function getTokenParsers(){return array(new Twig_TokenParser_For(),new Twig_TokenParser_If(),new Twig_TokenParser_Extends(),new Twig_TokenParser_Include(),new Twig_TokenParser_Block(),new Twig_TokenParser_Use(),new Twig_TokenParser_Filter(),new Twig_TokenParser_Macro(),new Twig_TokenParser_Import(),new Twig_TokenParser_From(),new Twig_TokenParser_Set(),new Twig_TokenParser_Spaceless(),new Twig_TokenParser_Flush(),new Twig_TokenParser_Do(),new Twig_TokenParser_Embed(),);} public function getFilters(){$filters=array('date'=>new Twig_Filter_Function('twig_date_format_filter',array('needs_environment'=>true)),'date_modify'=>new Twig_Filter_Function('twig_date_modify_filter',array('needs_environment'=>true)),'format'=>new Twig_Filter_Function('sprintf'),'replace'=>new Twig_Filter_Function('strtr'),'number_format'=>new Twig_Filter_Function('twig_number_format_filter',array('needs_environment'=>true)),'abs'=>new Twig_Filter_Function('abs'),'url_encode'=>new Twig_Filter_Function('twig_urlencode_filter'),'json_encode'=>new Twig_Filter_Function('twig_jsonencode_filter'),'convert_encoding'=>new Twig_Filter_Function('twig_convert_encoding'),'title'=>new Twig_Filter_Function('twig_title_string_filter',array('needs_environment'=>true)),'capitalize'=>new Twig_Filter_Function('twig_capitalize_string_filter',array('needs_environment'=>true)),'upper'=>new Twig_Filter_Function('strtoupper'),'lower'=>new Twig_Filter_Function('strtolower'),'striptags'=>new Twig_Filter_Function('strip_tags'),'trim'=>new Twig_Filter_Function('trim'),'nl2br'=>new Twig_Filter_Function('nl2br',array('pre_escape'=>'html','is_safe'=>array('html'))),'join'=>new Twig_Filter_Function('twig_join_filter'),'sort'=>new Twig_Filter_Function('twig_sort_filter'),'merge'=>new Twig_Filter_Function('twig_array_merge'),'reverse'=>new Twig_Filter_Function('twig_reverse_filter',array('needs_environment'=>true)),'length'=>new Twig_Filter_Function('twig_length_filter',array('needs_environment'=>true)),'slice'=>new Twig_Filter_Function('twig_slice',array('needs_environment'=>true)),'default'=>new Twig_Filter_Node('Twig_Node_Expression_Filter_Default'),'_default'=>new Twig_Filter_Function('_twig_default_filter'),'keys'=>new Twig_Filter_Function('twig_get_array_keys_filter'),'escape'=>new Twig_Filter_Function('twig_escape_filter',array('needs_environment'=>true,'is_safe_callback'=>'twig_escape_filter_is_safe')),'e'=>new Twig_Filter_Function('twig_escape_filter',array('needs_environment'=>true,'is_safe_callback'=>'twig_escape_filter_is_safe')),);if(function_exists('mb_get_info')){$filters['upper']=new Twig_Filter_Function('twig_upper_filter',array('needs_environment'=>true));$filters['lower']=new Twig_Filter_Function('twig_lower_filter',array('needs_environment'=>true));}return $filters;} public function getFunctions(){return array('range'=>new Twig_Function_Function('range'),'constant'=>new Twig_Function_Function('constant'),'cycle'=>new Twig_Function_Function('twig_cycle'),'random'=>new Twig_Function_Function('twig_random',array('needs_environment'=>true)),'date'=>new Twig_Function_Function('twig_date_converter',array('needs_environment'=>true)),);} public function getTests(){return array('even'=>new Twig_Test_Node('Twig_Node_Expression_Test_Even'),'odd'=>new Twig_Test_Node('Twig_Node_Expression_Test_Odd'),'defined'=>new Twig_Test_Node('Twig_Node_Expression_Test_Defined'),'sameas'=>new Twig_Test_Node('Twig_Node_Expression_Test_Sameas'),'none'=>new Twig_Test_Node('Twig_Node_Expression_Test_Null'),'null'=>new Twig_Test_Node('Twig_Node_Expression_Test_Null'),'divisibleby'=>new Twig_Test_Node('Twig_Node_Expression_Test_Divisibleby'),'constant'=>new Twig_Test_Node('Twig_Node_Expression_Test_Constant'),'empty'=>new Twig_Test_Function('twig_test_empty'),'iterable'=>new Twig_Test_Function('twig_test_iterable'),);} public function getOperators(){return array(array('not'=>array('precedence'=>50,'class'=>'Twig_Node_Expression_Unary_Not'),'-'=>array('precedence'=>500,'class'=>'Twig_Node_Expression_Unary_Neg'),'+'=>array('precedence'=>500,'class'=>'Twig_Node_Expression_Unary_Pos'),),array('b-and'=>array('precedence'=>5,'class'=>'Twig_Node_Expression_Binary_BitwiseAnd','associativity'=>Twig_ExpressionParser::OPERATOR_LEFT),'b-xor'=>array('precedence'=>5,'class'=>'Twig_Node_Expression_Binary_BitwiseXor','associativity'=>Twig_ExpressionParser::OPERATOR_LEFT),'b-or'=>array('precedence'=>5,'class'=>'Twig_Node_Expression_Binary_BitwiseOr','associativity'=>Twig_ExpressionParser::OPERATOR_LEFT),'or'=>array('precedence'=>10,'class'=>'Twig_Node_Expression_Binary_Or','associativity'=>Twig_ExpressionParser::OPERATOR_LEFT),'and'=>array('precedence'=>15,'class'=>'Twig_Node_Expression_Binary_And','associativity'=>Twig_ExpressionParser::OPERATOR_LEFT),'=='=>array('precedence'=>20,'class'=>'Twig_Node_Expression_Binary_Equal','associativity'=>Twig_ExpressionParser::OPERATOR_LEFT),'!='=>array('precedence'=>20,'class'=>'Twig_Node_Expression_Binary_NotEqual','associativity'=>Twig_ExpressionParser::OPERATOR_LEFT),'<'=>array('precedence'=>20,'class'=>'Twig_Node_Expression_Binary_Less','associativity'=>Twig_ExpressionParser::OPERATOR_LEFT),'>'=>array('precedence'=>20,'class'=>'Twig_Node_Expression_Binary_Greater','associativity'=>Twig_ExpressionParser::OPERATOR_LEFT),'>='=>array('precedence'=>20,'class'=>'Twig_Node_Expression_Binary_GreaterEqual','associativity'=>Twig_ExpressionParser::OPERATOR_LEFT),'<='=>array('precedence'=>20,'class'=>'Twig_Node_Expression_Binary_LessEqual','associativity'=>Twig_ExpressionParser::OPERATOR_LEFT),'not in'=>array('precedence'=>20,'class'=>'Twig_Node_Expression_Binary_NotIn','associativity'=>Twig_ExpressionParser::OPERATOR_LEFT),'in'=>array('precedence'=>20,'class'=>'Twig_Node_Expression_Binary_In','associativity'=>Twig_ExpressionParser::OPERATOR_LEFT),'..'=>array('precedence'=>25,'class'=>'Twig_Node_Expression_Binary_Range','associativity'=>Twig_ExpressionParser::OPERATOR_LEFT),'+'=>array('precedence'=>30,'class'=>'Twig_Node_Expression_Binary_Add','associativity'=>Twig_ExpressionParser::OPERATOR_LEFT),'-'=>array('precedence'=>30,'class'=>'Twig_Node_Expression_Binary_Sub','associativity'=>Twig_ExpressionParser::OPERATOR_LEFT),'~'=>array('precedence'=>40,'class'=>'Twig_Node_Expression_Binary_Concat','associativity'=>Twig_ExpressionParser::OPERATOR_LEFT),'*'=>array('precedence'=>60,'class'=>'Twig_Node_Expression_Binary_Mul','associativity'=>Twig_ExpressionParser::OPERATOR_LEFT),'/'=>array('precedence'=>60,'class'=>'Twig_Node_Expression_Binary_Div','associativity'=>Twig_ExpressionParser::OPERATOR_LEFT),'//'=>array('precedence'=>60,'class'=>'Twig_Node_Expression_Binary_FloorDiv','associativity'=>Twig_ExpressionParser::OPERATOR_LEFT),'%'=>array('precedence'=>60,'class'=>'Twig_Node_Expression_Binary_Mod','associativity'=>Twig_ExpressionParser::OPERATOR_LEFT),'is'=>array('precedence'=>100,'callable'=>array($this,'parseTestExpression'),'associativity'=>Twig_ExpressionParser::OPERATOR_LEFT),'is not'=>array('precedence'=>100,'callable'=>array($this,'parseNotTestExpression'),'associativity'=>Twig_ExpressionParser::OPERATOR_LEFT),'**'=>array('precedence'=>200,'class'=>'Twig_Node_Expression_Binary_Power','associativity'=>Twig_ExpressionParser::OPERATOR_RIGHT),),);} public function parseNotTestExpression(Twig_Parser$parser,$node){return new Twig_Node_Expression_Unary_Not($this->parseTestExpression($parser,$node),$parser->getCurrentToken()->getLine());} public function parseTestExpression(Twig_Parser$parser,$node){$stream=$parser->getStream();$name=$stream->expect(Twig_Token::NAME_TYPE)->getValue();$arguments=null;if($stream->test(Twig_Token::PUNCTUATION_TYPE,'(')){$arguments=$parser->getExpressionParser()->parseArguments();}$class=$this->getTestNodeClass($parser->getEnvironment(),$name);return new $class($node,$name,$arguments,$parser->getCurrentToken()->getLine());} protected function getTestNodeClass(Twig_Environment$env,$name){$testMap=$env->getTests();if(isset($testMap[$name])&&$testMap[$name] instanceof Twig_Test_Node){return $testMap[$name]->getClass();}return 'Twig_Node_Expression_Test';} public function getName(){return 'core';}}function twig_cycle($values,$i){if(!is_array($values)&&!$values instanceof ArrayAccess){return $values;}return $values[$i%count($values)];}function twig_random(Twig_Environment$env,$values=null){if(null===$values){return mt_rand();}if(is_int($values)||is_float($values)){return $values<0?mt_rand($values,0):mt_rand(0,$values);}if($values instanceof Traversable){$values=iterator_to_array($values);}elseif(is_string($values)){if(''===$values){return '';}if(null!==$charset=$env->getCharset()){if('UTF-8'!=$charset){$values=twig_convert_encoding($values,'UTF-8',$charset);}$values=preg_split('/(?<!^)(?!$)/u',$values);if('UTF-8'!=$charset){foreach($values as $i=>$value){$values[$i]=twig_convert_encoding($value,$charset,'UTF-8');}}}else {return $values[mt_rand(0,strlen($values)-1)];}}if(!is_array($values)){return $values;}if(0===count($values)){ throw new Twig_Error_Runtime('The random function cannot pick from an empty array.');}return $values[array_rand($values,1)];}function twig_date_format_filter(Twig_Environment$env,$date,$format=null,$timezone=null){if(null===$format){$formats=$env->getExtension('core')->getDateFormat();$format=$date instanceof DateInterval?$formats[1]:$formats[0];}if($date instanceof DateInterval||$date instanceof DateTime){if(null!==$timezone){$date=clone $date;$date->setTimezone($timezone instanceof DateTimeZone?$timezone:new DateTimeZone($timezone));}return $date->format($format);}return twig_date_converter($env,$date,$timezone)->format($format);}function twig_date_modify_filter(Twig_Environment$env,$date,$modifier){if($date instanceof DateTime){$date=clone $date;}else {$date=twig_date_converter($env,$date);}$date->modify($modifier);return $date;}function twig_date_converter(Twig_Environment$env,$date=null,$timezone=null){if(!$date instanceof DateTime){$asString=(string)$date;if(ctype_digit($asString)||(!empty($asString)&&'-'===$asString[0]&&ctype_digit(substr($asString,1)))){$date=new DateTime('@'.$date);}else {$date=new DateTime($date);}}else {$date=clone $date;}if(null!==$timezone){if($timezone instanceof DateTimeZone){$date->setTimezone($timezone);}else {$date->setTimezone(new DateTimeZone($timezone));}}elseif(($timezone=$env->getExtension('core')->getTimezone()) instanceof DateTimeZone){$date->setTimezone($timezone);}else {$date->setTimezone(new DateTimeZone(date_default_timezone_get()));}return $date;}function twig_number_format_filter(Twig_Environment$env,$number,$decimal=null,$decimalPoint=null,$thousandSep=null){$defaults=$env->getExtension('core')->getNumberFormat();if(null===$decimal){$decimal=$defaults[0];}if(null===$decimalPoint){$decimalPoint=$defaults[1];}if(null===$thousandSep){$thousandSep=$defaults[2];}return number_format((float)$number,$decimal,$decimalPoint,$thousandSep);}function twig_urlencode_filter($url,$raw=false){if($raw){return rawurlencode($url);}return urlencode($url);}if(version_compare(PHP_VERSION,'5.3.0','<')){function twig_jsonencode_filter($value,$options=0){if($value instanceof Twig_Markup){$value=(string)$value;}elseif(is_array($value)){array_walk_recursive($value,'_twig_markup2string');}return json_encode($value);}}else {function twig_jsonencode_filter($value,$options=0){if($value instanceof Twig_Markup){$value=(string)$value;}elseif(is_array($value)){array_walk_recursive($value,'_twig_markup2string');}return json_encode($value,$options);}}function _twig_markup2string(&$value){if($value instanceof Twig_Markup){$value=(string)$value;}}function twig_array_merge($arr1,$arr2){if(!is_array($arr1)||!is_array($arr2)){ throw new Twig_Error_Runtime('The merge filter only works with arrays or hashes.');}return array_merge($arr1,$arr2);}function twig_slice(Twig_Environment$env,$item,$start,$length=null,$preserveKeys=false){if($item instanceof Traversable){$item=iterator_to_array($item,false);}if(is_array($item)){return array_slice($item,$start,$length,$preserveKeys);}$item=(string)$item;if(function_exists('mb_get_info')&&null!==$charset=$env->getCharset()){return mb_substr($item,$start,null===$length?mb_strlen($item,$charset)-$start:$length,$charset);}return null===$length?substr($item,$start):substr($item,$start,$length);}function twig_join_filter($value,$glue=''){if($value instanceof Traversable){$value=iterator_to_array($value,false);}return implode($glue,(array)$value);}function _twig_default_filter($value,$default=''){if(twig_test_empty($value)){return $default;}return $value;}function twig_get_array_keys_filter($array){if(is_object($array)&&$array instanceof Traversable){return array_keys(iterator_to_array($array));}if(!is_array($array)){return array();}return array_keys($array);}function twig_reverse_filter(Twig_Environment$env,$item,$preserveKeys=false){if(is_object($item)&&$item instanceof Traversable){return array_reverse(iterator_to_array($item),$preserveKeys);}if(is_array($item)){return array_reverse($item,$preserveKeys);}if(null!==$charset=$env->getCharset()){$string=(string)$item;if('UTF-8'!=$charset){$item=twig_convert_encoding($string,'UTF-8',$charset);}preg_match_all('/./us',$item,$matches);$string=implode('',array_reverse($matches[0]));if('UTF-8'!=$charset){$string=twig_convert_encoding($string,$charset,'UTF-8');}return $string;}return strrev((string)$item);}function twig_sort_filter($array){asort($array);return $array;}function twig_in_filter($value,$compare){$strict=is_object($value);if(is_array($compare)){return in_array($value,$compare,$strict);}elseif(is_string($compare)){if(!strlen((string)$value)){return empty($compare);}return false!==strpos($compare,(string)$value);}elseif(is_object($compare)&&$compare instanceof Traversable){return in_array($value,iterator_to_array($compare,false),$strict);}return false;}function twig_escape_filter(Twig_Environment$env,$string,$strategy='html',$charset=null,$autoescape=false){if($autoescape&&is_object($string)&&$string instanceof Twig_Markup){return $string;}if(!is_string($string)&&!(is_object($string)&&method_exists($string,'__toString'))){return $string;}if(null===$charset){$charset=$env->getCharset();}$string=(string)$string;switch($strategy){case 'js':if('UTF-8'!=$charset){$string=twig_convert_encoding($string,'UTF-8',$charset);}if(0==strlen($string)?false:(1==preg_match('/^./su',$string)?false:true)){ throw new Twig_Error_Runtime('The string to escape is not a valid UTF-8 string.');}$string=preg_replace_callback('#[^a-zA-Z0-9,\._]#Su','_twig_escape_js_callback',$string);if('UTF-8'!=$charset){$string=twig_convert_encoding($string,$charset,'UTF-8');}return $string;case 'css':if('UTF-8'!=$charset){$string=twig_convert_encoding($string,'UTF-8',$charset);}if(0==strlen($string)?false:(1==preg_match('/^./su',$string)?false:true)){ throw new Twig_Error_Runtime('The string to escape is not a valid UTF-8 string.');}$string=preg_replace_callback('#[^a-zA-Z0-9]#Su','_twig_escape_css_callback',$string);if('UTF-8'!=$charset){$string=twig_convert_encoding($string,$charset,'UTF-8');}return $string;case 'html_attr':if('UTF-8'!=$charset){$string=twig_convert_encoding($string,'UTF-8',$charset);}if(0==strlen($string)?false:(1==preg_match('/^./su',$string)?false:true)){ throw new Twig_Error_Runtime('The string to escape is not a valid UTF-8 string.');}$string=preg_replace_callback('#[^a-zA-Z0-9,\.\-_]#Su','_twig_escape_html_attr_callback',$string);if('UTF-8'!=$charset){$string=twig_convert_encoding($string,$charset,'UTF-8');}return $string;case 'html':static $htmlspecialcharsCharsets=array('iso-8859-1'=>true,'iso8859-1'=>true,'iso-8859-15'=>true,'iso8859-15'=>true,'utf-8'=>true,'cp866'=>true,'ibm866'=>true,'866'=>true,'cp1251'=>true,'windows-1251'=>true,'win-1251'=>true,'1251'=>true,'cp1252'=>true,'windows-1252'=>true,'1252'=>true,'koi8-r'=>true,'koi8-ru'=>true,'koi8r'=>true,'big5'=>true,'950'=>true,'gb2312'=>true,'936'=>true,'big5-hkscs'=>true,'shift_jis'=>true,'sjis'=>true,'932'=>true,'euc-jp'=>true,'eucjp'=>true,'iso8859-5'=>true,'iso-8859-5'=>true,'macroman'=>true,);if(isset($htmlspecialcharsCharsets[strtolower($charset)])){return htmlspecialchars($string,ENT_QUOTES|ENT_SUBSTITUTE,$charset);}$string=twig_convert_encoding($string,'UTF-8',$charset);$string=htmlspecialchars($string,ENT_QUOTES|ENT_SUBSTITUTE,'UTF-8');return twig_convert_encoding($string,$charset,'UTF-8');case 'url':if(version_compare(PHP_VERSION,'5.3.0','<')){return str_replace('%7E','~',rawurlencode($string));}return rawurlencode($string);default: throw new Twig_Error_Runtime(sprintf('Invalid escaping strategy "%s" (valid ones: html, js, url, css, and html_attr).',$strategy));}}function twig_escape_filter_is_safe(Twig_Node$filterArgs){foreach($filterArgs as $arg){if($arg instanceof Twig_Node_Expression_Constant){return array($arg->getAttribute('value'));}return array();}return array('html');}if(function_exists('mb_convert_encoding')){function twig_convert_encoding($string,$to,$from){return mb_convert_encoding($string,$to,$from);}}elseif(function_exists('iconv')){function twig_convert_encoding($string,$to,$from){return iconv($from,$to,$string);}}else {function twig_convert_encoding($string,$to,$from){ throw new Twig_Error_Runtime('No suitable convert encoding function (use UTF-8 as your encoding or install the iconv or mbstring extension).');}}function _twig_escape_js_callback($matches){$char=$matches[0];if(!isset($char[1])){return '\\x'.strtoupper(substr('00'.bin2hex($char),-2));}$char=twig_convert_encoding($char,'UTF-16BE','UTF-8');return '\\u'.strtoupper(substr('0000'.bin2hex($char),-4));}function _twig_escape_css_callback($matches){$char=$matches[0];if(!isset($char[1])){$hex=ltrim(strtoupper(bin2hex($char)),'0');if(0===strlen($hex)){$hex='0';}return '\\'.$hex.' ';}$char=twig_convert_encoding($char,'UTF-16BE','UTF-8');return '\\'.ltrim(strtoupper(bin2hex($char)),'0').' ';}function _twig_escape_html_attr_callback($matches){static $entityMap=array(34=>'quot',38=>'amp',60=>'lt',62=>'gt',);$chr=$matches[0];$ord=ord($chr);if(($ord<=0x1f&&$chr!="\t"&&$chr!="\n"&&$chr!="\r")||($ord>=0x7f&&$ord<=0x9f)){return '�';}if(strlen($chr)==1){$hex=strtoupper(substr('00'.bin2hex($chr),-2));}else {$chr=twig_convert_encoding($chr,'UTF-16BE','UTF-8');$hex=strtoupper(substr('0000'.bin2hex($chr),-4));}$int=hexdec($hex);if(array_key_exists($int,$entityMap)){return sprintf('&%s;',$entityMap[$int]);}return sprintf('&#x%s;',$hex);}if(function_exists('mb_get_info')){function twig_length_filter(Twig_Environment$env,$thing){return is_scalar($thing)?mb_strlen($thing,$env->getCharset()):count($thing);}function twig_upper_filter(Twig_Environment$env,$string){if(null!==($charset=$env->getCharset())){return mb_strtoupper($string,$charset);}return strtoupper($string);}function twig_lower_filter(Twig_Environment$env,$string){if(null!==($charset=$env->getCharset())){return mb_strtolower($string,$charset);}return strtolower($string);}function twig_title_string_filter(Twig_Environment$env,$string){if(null!==($charset=$env->getCharset())){return mb_convert_case($string,MB_CASE_TITLE,$charset);}return ucwords(strtolower($string));}function twig_capitalize_string_filter(Twig_Environment$env,$string){if(null!==($charset=$env->getCharset())){return mb_strtoupper(mb_substr($string,0,1,$charset),$charset).mb_strtolower(mb_substr($string,1,mb_strlen($string,$charset),$charset),$charset);}return ucfirst(strtolower($string));}}else {function twig_length_filter(Twig_Environment$env,$thing){return is_scalar($thing)?strlen($thing):count($thing);}function twig_title_string_filter(Twig_Environment$env,$string){return ucwords(strtolower($string));}function twig_capitalize_string_filter(Twig_Environment$env,$string){return ucfirst(strtolower($string));}}function twig_ensure_traversable($seq){if($seq instanceof Traversable||is_array($seq)){return $seq;}return array();}function twig_test_empty($value){if($value instanceof Countable){return 0==count($value);}return false===$value||(empty($value)&&'0'!=$value);}function twig_test_iterable($value){return $value instanceof Traversable||is_array($value);} interface Twig_ExtensionInterface{function initRuntime(Twig_Environment$environment);function getTokenParsers();function getNodeVisitors();function getFilters();function getTests();function getFunctions();function getOperators();function getGlobals();function getName();}class Twig_Extension_Escaper extends Twig_Extension{ protected $defaultStrategy; public function __construct($defaultStrategy='html'){$this->setDefaultStrategy($defaultStrategy);} public function getTokenParsers(){return array(new Twig_TokenParser_AutoEscape());} public function getNodeVisitors(){return array(new Twig_NodeVisitor_Escaper());} public function getFilters(){return array('raw'=>new Twig_Filter_Function('twig_raw_filter',array('is_safe'=>array('all'))),);} public function setDefaultStrategy($defaultStrategy){if(true===$defaultStrategy){$defaultStrategy='html';}$this->defaultStrategy=$defaultStrategy;} public function getDefaultStrategy($filename){if(!is_string($this->defaultStrategy)&&is_callable($this->defaultStrategy)){return call_user_func($this->defaultStrategy,$filename);}return $this->defaultStrategy;} public function getName(){return 'escaper';}}function twig_raw_filter($string){return $string;}class Twig_Extension_Optimizer extends Twig_Extension{ protected $optimizers; public function __construct($optimizers=-1){$this->optimizers=$optimizers;} public function getNodeVisitors(){return array(new Twig_NodeVisitor_Optimizer($this->optimizers));} public function getName(){return 'optimizer';}}class Twig_Lexer implements Twig_LexerInterface{ protected $tokens; protected $code; protected $cursor; protected $lineno; protected $end; protected $state; protected $states; protected $brackets; protected $env; protected $filename; protected $options; protected $regexes; protected $position; protected $positions;const STATE_DATA=0;const STATE_BLOCK=1;const STATE_VAR=2;const STATE_STRING=3;const STATE_INTERPOLATION=4;const REGEX_NAME='/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/A';const REGEX_NUMBER='/[0-9]+(?:\.[0-9]+)?/A';const REGEX_STRING='/"([^#"\\\\]*(?:\\\\.[^#"\\\\]*)*)"|\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\'/As';const REGEX_DQ_STRING_DELIM='/"/A';const REGEX_DQ_STRING_PART='/[^#"\\\\]*(?:(?:\\\\.|#(?!\{))[^#"\\\\]*)*/As';const PUNCTUATION='()[]{}?:.,|'; public function __construct(Twig_Environment$env,array$options=array()){$this->env=$env;$this->options=array_merge(array('tag_comment'=>array('{#','#}'),'tag_block'=>array('{%','%}'),'tag_variable'=>array('{{','}}'),'whitespace_trim'=>'-','interpolation'=>array('#{','}'),),$options);$this->regexes=array('lex_var'=>'/\s*'.preg_quote($this->options['whitespace_trim'].$this->options['tag_variable'][1],'/').'\s*|\s*'.preg_quote($this->options['tag_variable'][1],'/').'/A','lex_block'=>'/\s*(?:'.preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1],'/').'\s*|\s*'.preg_quote($this->options['tag_block'][1],'/').')\n?/A','lex_raw_data'=>'/('.preg_quote($this->options['tag_block'][0].$this->options['whitespace_trim'],'/').'|'.preg_quote($this->options['tag_block'][0],'/').')\s*endraw\s*(?:'.preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1],'/').'\s*|\s*'.preg_quote($this->options['tag_block'][1],'/').')/s','operator'=>$this->getOperatorRegex(),'lex_comment'=>'/(?:'.preg_quote($this->options['whitespace_trim'],'/').preg_quote($this->options['tag_comment'][1],'/').'\s*|'.preg_quote($this->options['tag_comment'][1],'/').')\n?/s','lex_block_raw'=>'/\s*raw\s*(?:'.preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1],'/').'\s*|\s*'.preg_quote($this->options['tag_block'][1],'/').')/As','lex_block_line'=>'/\s*line\s+(\d+)\s*'.preg_quote($this->options['tag_block'][1],'/').'/As','lex_tokens_start'=>'/('.preg_quote($this->options['tag_variable'][0],'/').'|'.preg_quote($this->options['tag_block'][0],'/').'|'.preg_quote($this->options['tag_comment'][0],'/').')('.preg_quote($this->options['whitespace_trim'],'/').')?/s','interpolation_start'=>'/'.preg_quote($this->options['interpolation'][0],'/').'\s*/A','interpolation_end'=>'/\s*'.preg_quote($this->options['interpolation'][1],'/').'/A',);} public function tokenize($code,$filename=null){if(function_exists('mb_internal_encoding')&&((int)ini_get('mbstring.func_overload'))&2){$mbEncoding=mb_internal_encoding();mb_internal_encoding('ASCII');}$this->code=str_replace(array("\r\n","\r"),"\n",$code);$this->filename=$filename;$this->cursor=0;$this->lineno=1;$this->end=strlen($this->code);$this->tokens=array();$this->state=self::STATE_DATA;$this->states=array();$this->brackets=array();$this->position=-1;preg_match_all($this->regexes['lex_tokens_start'],$this->code,$matches,PREG_OFFSET_CAPTURE);$this->positions=$matches;while($this->cursor<$this->end){switch($this->state){case self::STATE_DATA:$this->lexData();break;case self::STATE_BLOCK:$this->lexBlock();break;case self::STATE_VAR:$this->lexVar();break;case self::STATE_STRING:$this->lexString();break;case self::STATE_INTERPOLATION:$this->lexInterpolation();break;}}$this->pushToken(Twig_Token::EOF_TYPE);if(!empty($this->brackets)){list($expect,$lineno)=array_pop($this->brackets); throw new Twig_Error_Syntax(sprintf('Unclosed "%s"',$expect),$lineno,$this->filename);}if(isset($mbEncoding)){mb_internal_encoding($mbEncoding);}return new Twig_TokenStream($this->tokens,$this->filename);} protected function lexData(){if($this->position==count($this->positions[0])-1){$this->pushToken(Twig_Token::TEXT_TYPE,substr($this->code,$this->cursor));$this->cursor=$this->end;return;}$position=$this->positions[0][++$this->position];while($position[1]<$this->cursor){if($this->position==count($this->positions[0])-1){return;}$position=$this->positions[0][++$this->position];}$text=$textContent=substr($this->code,$this->cursor,$position[1]-$this->cursor);if(isset($this->positions[2][$this->position][0])){$text=rtrim($text);}$this->pushToken(Twig_Token::TEXT_TYPE,$text);$this->moveCursor($textContent.$position[0]);switch($this->positions[1][$this->position][0]){case $this->options['tag_comment'][0]:$this->lexComment();break;case $this->options['tag_block'][0]:if(preg_match($this->regexes['lex_block_raw'],$this->code,$match,null,$this->cursor)){$this->moveCursor($match[0]);$this->lexRawData();}elseif(preg_match($this->regexes['lex_block_line'],$this->code,$match,null,$this->cursor)){$this->moveCursor($match[0]);$this->lineno=(int)$match[1];}else {$this->pushToken(Twig_Token::BLOCK_START_TYPE);$this->pushState(self::STATE_BLOCK);}break;case $this->options['tag_variable'][0]:$this->pushToken(Twig_Token::VAR_START_TYPE);$this->pushState(self::STATE_VAR);break;}} protected function lexBlock(){if(empty($this->brackets)&&preg_match($this->regexes['lex_block'],$this->code,$match,null,$this->cursor)){$this->pushToken(Twig_Token::BLOCK_END_TYPE);$this->moveCursor($match[0]);$this->popState();}else {$this->lexExpression();}} protected function lexVar(){if(empty($this->brackets)&&preg_match($this->regexes['lex_var'],$this->code,$match,null,$this->cursor)){$this->pushToken(Twig_Token::VAR_END_TYPE);$this->moveCursor($match[0]);$this->popState();}else {$this->lexExpression();}} protected function lexExpression(){if(preg_match('/\s+/A',$this->code,$match,null,$this->cursor)){$this->moveCursor($match[0]);if($this->cursor>=$this->end){ throw new Twig_Error_Syntax(sprintf('Unexpected end of file: Unclosed "%s"',$this->state===self::STATE_BLOCK?'block':'variable'),$this->lineno,$this->filename);}}if(preg_match($this->regexes['operator'],$this->code,$match,null,$this->cursor)){$this->pushToken(Twig_Token::OPERATOR_TYPE,$match[0]);$this->moveCursor($match[0]);}elseif(preg_match(self::REGEX_NAME,$this->code,$match,null,$this->cursor)){$this->pushToken(Twig_Token::NAME_TYPE,$match[0]);$this->moveCursor($match[0]);}elseif(preg_match(self::REGEX_NUMBER,$this->code,$match,null,$this->cursor)){$number=(float)$match[0];if(ctype_digit($match[0])&&$number<=PHP_INT_MAX){$number=(int)$match[0];}$this->pushToken(Twig_Token::NUMBER_TYPE,$number);$this->moveCursor($match[0]);}elseif(false!==strpos(self::PUNCTUATION,$this->code[$this->cursor])){if(false!==strpos('([{',$this->code[$this->cursor])){$this->brackets[]=array($this->code[$this->cursor],$this->lineno);}elseif(false!==strpos(')]}',$this->code[$this->cursor])){if(empty($this->brackets)){ throw new Twig_Error_Syntax(sprintf('Unexpected "%s"',$this->code[$this->cursor]),$this->lineno,$this->filename);}list($expect,$lineno)=array_pop($this->brackets);if($this->code[$this->cursor]!=strtr($expect,'([{',')]}')){ throw new Twig_Error_Syntax(sprintf('Unclosed "%s"',$expect),$lineno,$this->filename);}}$this->pushToken(Twig_Token::PUNCTUATION_TYPE,$this->code[$this->cursor]);++$this->cursor;}elseif(preg_match(self::REGEX_STRING,$this->code,$match,null,$this->cursor)){$this->pushToken(Twig_Token::STRING_TYPE,stripcslashes(substr($match[0],1,-1)));$this->moveCursor($match[0]);}elseif(preg_match(self::REGEX_DQ_STRING_DELIM,$this->code,$match,null,$this->cursor)){$this->brackets[]=array('"',$this->lineno);$this->pushState(self::STATE_STRING);$this->moveCursor($match[0]);}else { throw new Twig_Error_Syntax(sprintf('Unexpected character "%s"',$this->code[$this->cursor]),$this->lineno,$this->filename);}} protected function lexRawData(){if(!preg_match($this->regexes['lex_raw_data'],$this->code,$match,PREG_OFFSET_CAPTURE,$this->cursor)){ throw new Twig_Error_Syntax(sprintf('Unexpected end of file: Unclosed "block"'),$this->lineno,$this->filename);}$text=substr($this->code,$this->cursor,$match[0][1]-$this->cursor);$this->moveCursor($text.$match[0][0]);if(false!==strpos($match[1][0],$this->options['whitespace_trim'])){$text=rtrim($text);}$this->pushToken(Twig_Token::TEXT_TYPE,$text);} protected function lexComment(){if(!preg_match($this->regexes['lex_comment'],$this->code,$match,PREG_OFFSET_CAPTURE,$this->cursor)){ throw new Twig_Error_Syntax('Unclosed comment',$this->lineno,$this->filename);}$this->moveCursor(substr($this->code,$this->cursor,$match[0][1]-$this->cursor).$match[0][0]);} protected function lexString(){if(preg_match($this->regexes['interpolation_start'],$this->code,$match,null,$this->cursor)){$this->brackets[]=array($this->options['interpolation'][0],$this->lineno);$this->pushToken(Twig_Token::INTERPOLATION_START_TYPE);$this->moveCursor($match[0]);$this->pushState(self::STATE_INTERPOLATION);}elseif(preg_match(self::REGEX_DQ_STRING_PART,$this->code,$match,null,$this->cursor)&&strlen($match[0])>0){$this->pushToken(Twig_Token::STRING_TYPE,stripcslashes($match[0]));$this->moveCursor($match[0]);}elseif(preg_match(self::REGEX_DQ_STRING_DELIM,$this->code,$match,null,$this->cursor)){list($expect,$lineno)=array_pop($this->brackets);if($this->code[$this->cursor]!='"'){ throw new Twig_Error_Syntax(sprintf('Unclosed "%s"',$expect),$lineno,$this->filename);}$this->popState();++$this->cursor;}} protected function lexInterpolation(){$bracket=end($this->brackets);if($this->options['interpolation'][0]===$bracket[0]&&preg_match($this->regexes['interpolation_end'],$this->code,$match,null,$this->cursor)){array_pop($this->brackets);$this->pushToken(Twig_Token::INTERPOLATION_END_TYPE);$this->moveCursor($match[0]);$this->popState();}else {$this->lexExpression();}} protected function pushToken($type,$value=''){if(Twig_Token::TEXT_TYPE===$type&&''===$value){return;}$this->tokens[]=new Twig_Token($type,$value,$this->lineno);} protected function moveCursor($text){$this->cursor+=strlen($text);$this->lineno+=substr_count($text,"\n");} protected function getOperatorRegex(){$operators=array_merge(array('='),array_keys($this->env->getUnaryOperators()),array_keys($this->env->getBinaryOperators()));$operators=array_combine($operators,array_map('strlen',$operators));arsort($operators);$regex=array();foreach($operators as $operator=>$length){if(ctype_alpha($operator[$length-1])){$regex[]=preg_quote($operator,'/').'(?=[\s()])';}else {$regex[]=preg_quote($operator,'/');}}return '/'.implode('|',$regex).'/A';} protected function pushState($state){$this->states[]=$this->state;$this->state=$state;} protected function popState(){if(0===count($this->states)){ throw new Exception('Cannot pop state without a previous state');}$this->state=array_pop($this->states);}} interface Twig_LexerInterface{function tokenize($code,$filename=null);} interface Twig_NodeInterface extends Countable,IteratorAggregate{function compile(Twig_Compiler$compiler);function getLine();function getNodeTag();}class Twig_Node implements Twig_NodeInterface{ protected $nodes; protected $attributes; protected $lineno; protected $tag; public function __construct(array$nodes=array(),array$attributes=array(),$lineno=0,$tag=null){$this->nodes=$nodes;$this->attributes=$attributes;$this->lineno=$lineno;$this->tag=$tag;} public function __toString(){$attributes=array();foreach($this->attributes as $name=>$value){$attributes[]=sprintf('%s: %s',$name,str_replace("\n",'',var_export($value,true)));}$repr=array(get_class($this).'('.implode(', ',$attributes));if(count($this->nodes)){foreach($this->nodes as $name=>$node){$len=strlen($name)+4;$noderepr=array();foreach(explode("\n",(string)$node) as $line){$noderepr[]=str_repeat(' ',$len).$line;}$repr[]=sprintf(' %s: %s',$name,ltrim(implode("\n",$noderepr)));}$repr[]=')';}else {$repr[0].=')';}return implode("\n",$repr);} public function toXml($asDom=false){$dom=new DOMDocument('1.0','UTF-8');$dom->formatOutput=true;$dom->appendChild($xml=$dom->createElement('twig'));$xml->appendChild($node=$dom->createElement('node'));$node->setAttribute('class',get_class($this));foreach($this->attributes as $name=>$value){$node->appendChild($attribute=$dom->createElement('attribute'));$attribute->setAttribute('name',$name);$attribute->appendChild($dom->createTextNode($value));}foreach($this->nodes as $name=>$n){if(null===$n){continue;}$child=$n->toXml(true)->getElementsByTagName('node')->item(0);$child=$dom->importNode($child,true);$child->setAttribute('name',$name);$node->appendChild($child);}return $asDom?$dom:$dom->saveXml();} public function compile(Twig_Compiler$compiler){foreach($this->nodes as $node){$node->compile($compiler);}} public function getLine(){return $this->lineno;} public function getNodeTag(){return $this->tag;} public function hasAttribute($name){return array_key_exists($name,$this->attributes);} public function getAttribute($name){if(!array_key_exists($name,$this->attributes)){ throw new Twig_Error_Runtime(sprintf('Attribute "%s" does not exist for Node "%s".',$name,get_class($this)));}return $this->attributes[$name];} public function setAttribute($name,$value){$this->attributes[$name]=$value;} public function removeAttribute($name){unset($this->attributes[$name]);} public function hasNode($name){return array_key_exists($name,$this->nodes);} public function getNode($name){if(!array_key_exists($name,$this->nodes)){ throw new Twig_Error_Runtime(sprintf('Node "%s" does not exist for Node "%s".',$name,get_class($this)));}return $this->nodes[$name];} public function setNode($name,$node=null){$this->nodes[$name]=$node;} public function removeNode($name){unset($this->nodes[$name]);} public function count(){return count($this->nodes);} public function getIterator(){return new ArrayIterator($this->nodes);}}abstract class Twig_Node_Expression extends Twig_Node{}class Twig_Node_Expression_Filter extends Twig_Node_Expression{ public function __construct(Twig_NodeInterface$node,Twig_Node_Expression_Constant$filterName,Twig_NodeInterface$arguments,$lineno,$tag=null){parent::__construct(array('node'=>$node,'filter'=>$filterName,'arguments'=>$arguments),array(),$lineno,$tag);} public function compile(Twig_Compiler$compiler){$name=$this->getNode('filter')->getAttribute('value');if(false===$filter=$compiler->getEnvironment()->getFilter($name)){$message=sprintf('The filter "%s" does not exist',$name);if($alternatives=$compiler->getEnvironment()->computeAlternatives($name,array_keys($compiler->getEnvironment()->getFilters()))){$message=sprintf('%s. Did you mean "%s"',$message,implode('", "',$alternatives));} throw new Twig_Error_Syntax($message,$this->getLine());}$this->compileFilter($compiler,$filter);} protected function compileFilter(Twig_Compiler$compiler,Twig_FilterInterface$filter){$compiler->raw($filter->compile().'(')->raw($filter->needsEnvironment()?'$this->env, ':'')->raw($filter->needsContext()?'$context, ':'');foreach($filter->getArguments() as $argument){$compiler->string($argument)->raw(', ');}$compiler->subcompile($this->getNode('node'));foreach($this->getNode('arguments') as $node){$compiler->raw(', ')->subcompile($node);}$compiler->raw(')');}}class Twig_Node_Expression_Test extends Twig_Node_Expression{ public function __construct(Twig_NodeInterface$node,$name,Twig_NodeInterface$arguments=null,$lineno){parent::__construct(array('node'=>$node,'arguments'=>$arguments),array('name'=>$name),$lineno);} public function compile(Twig_Compiler$compiler){$name=$this->getAttribute('name');$testMap=$compiler->getEnvironment()->getTests();if(!isset($testMap[$name])){$message=sprintf('The test "%s" does not exist',$name);if($alternatives=$compiler->getEnvironment()->computeAlternatives($name,array_keys($compiler->getEnvironment()->getTests()))){$message=sprintf('%s. Did you mean "%s"',$message,implode('", "',$alternatives));} throw new Twig_Error_Syntax($message,$this->getLine());}$name=$this->getAttribute('name');$node=$this->getNode('node');$compiler->raw($testMap[$name]->compile().'(')->subcompile($node);if(null!==$this->getNode('arguments')){$compiler->raw(', ');$max=count($this->getNode('arguments'))-1;foreach($this->getNode('arguments') as $i=>$arg){$compiler->subcompile($arg);if($i!=$max){$compiler->raw(', ');}}}$compiler->raw(')');}}class Twig_Node_Expression_Test_Defined extends Twig_Node_Expression_Test{ public function __construct(Twig_NodeInterface$node,$name,Twig_NodeInterface$arguments=null,$lineno){parent::__construct($node,$name,$arguments,$lineno);if($node instanceof Twig_Node_Expression_Name){$node->setAttribute('is_defined_test',true);}elseif($node instanceof Twig_Node_Expression_GetAttr){$node->setAttribute('is_defined_test',true);$this->changeIgnoreStrictCheck($node);}else { throw new Twig_Error_Syntax('The "defined" test only works with simple variables',$this->getLine());}} protected function changeIgnoreStrictCheck(Twig_Node_Expression_GetAttr$node){$node->setAttribute('ignore_strict_check',true);if($node->getNode('node') instanceof Twig_Node_Expression_GetAttr){$this->changeIgnoreStrictCheck($node->getNode('node'));}} public function compile(Twig_Compiler$compiler){$compiler->subcompile($this->getNode('node'));}}class Twig_Node_Expression_Filter_Default extends Twig_Node_Expression_Filter{ public function __construct(Twig_NodeInterface$node,Twig_Node_Expression_Constant$filterName,Twig_NodeInterface$arguments,$lineno,$tag=null){$default=new Twig_Node_Expression_Filter($node,new Twig_Node_Expression_Constant('_default',$node->getLine()),$arguments,$node->getLine());if('default'===$filterName->getAttribute('value')&&($node instanceof Twig_Node_Expression_Name||$node instanceof Twig_Node_Expression_GetAttr)){$test=new Twig_Node_Expression_Test_Defined(clone $node,'defined',new Twig_Node(),$node->getLine());$false=count($arguments)?$arguments->getNode(0):new Twig_Node_Expression_Constant('',$node->getLine());$node=new Twig_Node_Expression_Conditional($test,$default,$false,$node->getLine());}else {$node=$default;}parent::__construct($node,$filterName,$arguments,$lineno,$tag);} public function compile(Twig_Compiler$compiler){$compiler->subcompile($this->getNode('node'));}}class Twig_ExpressionParser{const OPERATOR_LEFT=1;const OPERATOR_RIGHT=2; protected $parser; protected $unaryOperators; protected $binaryOperators; public function __construct(Twig_Parser$parser,array$unaryOperators,array$binaryOperators){$this->parser=$parser;$this->unaryOperators=$unaryOperators;$this->binaryOperators=$binaryOperators;} public function parseExpression($precedence=0){$expr=$this->getPrimary();$token=$this->parser->getCurrentToken();while($this->isBinary($token)&&$this->binaryOperators[$token->getValue()]['precedence']>=$precedence){$op=$this->binaryOperators[$token->getValue()];$this->parser->getStream()->next();if(isset($op['callable'])){$expr=call_user_func($op['callable'],$this->parser,$expr);}else {$expr1=$this->parseExpression(self::OPERATOR_LEFT===$op['associativity']?$op['precedence']+1:$op['precedence']);$class=$op['class'];$expr=new $class($expr,$expr1,$token->getLine());}$token=$this->parser->getCurrentToken();}if(0===$precedence){return $this->parseConditionalExpression($expr);}return $expr;} protected function getPrimary(){$token=$this->parser->getCurrentToken();if($this->isUnary($token)){$operator=$this->unaryOperators[$token->getValue()];$this->parser->getStream()->next();$expr=$this->parseExpression($operator['precedence']);$class=$operator['class'];return $this->parsePostfixExpression(new $class($expr,$token->getLine()));}elseif($token->test(Twig_Token::PUNCTUATION_TYPE,'(')){$this->parser->getStream()->next();$expr=$this->parseExpression();$this->parser->getStream()->expect(Twig_Token::PUNCTUATION_TYPE,')','An opened parenthesis is not properly closed');return $this->parsePostfixExpression($expr);}return $this->parsePrimaryExpression();} protected function parseConditionalExpression($expr){while($this->parser->getStream()->test(Twig_Token::PUNCTUATION_TYPE,'?')){$this->parser->getStream()->next();$expr2=$this->parseExpression();$this->parser->getStream()->expect(Twig_Token::PUNCTUATION_TYPE,':','The ternary operator must have a default value');$expr3=$this->parseExpression();$expr=new Twig_Node_Expression_Conditional($expr,$expr2,$expr3,$this->parser->getCurrentToken()->getLine());}return $expr;} protected function isUnary(Twig_Token$token){return $token->test(Twig_Token::OPERATOR_TYPE)&&isset($this->unaryOperators[$token->getValue()]);} protected function isBinary(Twig_Token$token){return $token->test(Twig_Token::OPERATOR_TYPE)&&isset($this->binaryOperators[$token->getValue()]);} public function parsePrimaryExpression(){$token=$this->parser->getCurrentToken();switch($token->getType()){case Twig_Token::NAME_TYPE:$this->parser->getStream()->next();switch($token->getValue()){case 'true':case 'TRUE':$node=new Twig_Node_Expression_Constant(true,$token->getLine());break;case 'false':case 'FALSE':$node=new Twig_Node_Expression_Constant(false,$token->getLine());break;case 'none':case 'NONE':case 'null':case 'NULL':$node=new Twig_Node_Expression_Constant(null,$token->getLine());break;default:if('('===$this->parser->getCurrentToken()->getValue()){$node=$this->getFunctionNode($token->getValue(),$token->getLine());}else {$node=new Twig_Node_Expression_Name($token->getValue(),$token->getLine());}}break;case Twig_Token::NUMBER_TYPE:$this->parser->getStream()->next();$node=new Twig_Node_Expression_Constant($token->getValue(),$token->getLine());break;case Twig_Token::STRING_TYPE:case Twig_Token::INTERPOLATION_START_TYPE:$node=$this->parseStringExpression();break;default:if($token->test(Twig_Token::PUNCTUATION_TYPE,'[')){$node=$this->parseArrayExpression();}elseif($token->test(Twig_Token::PUNCTUATION_TYPE,'{')){$node=$this->parseHashExpression();}else { throw new Twig_Error_Syntax(sprintf('Unexpected token "%s" of value "%s"',Twig_Token::typeToEnglish($token->getType(),$token->getLine()),$token->getValue()),$token->getLine());}}return $this->parsePostfixExpression($node);} public function parseStringExpression(){$stream=$this->parser->getStream();$nodes=array();$nextCanBeString=true;while(true){if($stream->test(Twig_Token::STRING_TYPE)&&$nextCanBeString){$token=$stream->next();$nodes[]=new Twig_Node_Expression_Constant($token->getValue(),$token->getLine());$nextCanBeString=false;}elseif($stream->test(Twig_Token::INTERPOLATION_START_TYPE)){$stream->next();$nodes[]=$this->parseExpression();$stream->expect(Twig_Token::INTERPOLATION_END_TYPE);$nextCanBeString=true;}else {break;}}$expr=array_shift($nodes);foreach($nodes as $node){$expr=new Twig_Node_Expression_Binary_Concat($expr,$node,$node->getLine());}return $expr;} public function parseArrayExpression(){$stream=$this->parser->getStream();$stream->expect(Twig_Token::PUNCTUATION_TYPE,'[','An array element was expected');$node=new Twig_Node_Expression_Array(array(),$stream->getCurrent()->getLine());$first=true;while(!$stream->test(Twig_Token::PUNCTUATION_TYPE,']')){if(!$first){$stream->expect(Twig_Token::PUNCTUATION_TYPE,',','An array element must be followed by a comma');if($stream->test(Twig_Token::PUNCTUATION_TYPE,']')){break;}}$first=false;$node->addElement($this->parseExpression());}$stream->expect(Twig_Token::PUNCTUATION_TYPE,']','An opened array is not properly closed');return $node;} public function parseHashExpression(){$stream=$this->parser->getStream();$stream->expect(Twig_Token::PUNCTUATION_TYPE,'{','A hash element was expected');$node=new Twig_Node_Expression_Array(array(),$stream->getCurrent()->getLine());$first=true;while(!$stream->test(Twig_Token::PUNCTUATION_TYPE,'}')){if(!$first){$stream->expect(Twig_Token::PUNCTUATION_TYPE,',','A hash value must be followed by a comma');if($stream->test(Twig_Token::PUNCTUATION_TYPE,'}')){break;}}$first=false;if($stream->test(Twig_Token::STRING_TYPE)||$stream->test(Twig_Token::NAME_TYPE)||$stream->test(Twig_Token::NUMBER_TYPE)){$token=$stream->next();$key=new Twig_Node_Expression_Constant($token->getValue(),$token->getLine());}elseif($stream->test(Twig_Token::PUNCTUATION_TYPE,'(')){$key=$this->parseExpression();}else {$current=$stream->getCurrent(); throw new Twig_Error_Syntax(sprintf('A hash key must be a quoted string, a number, a name, or an expression enclosed in parentheses (unexpected token "%s" of value "%s"',Twig_Token::typeToEnglish($current->getType(),$current->getLine()),$current->getValue()),$current->getLine());}$stream->expect(Twig_Token::PUNCTUATION_TYPE,':','A hash key must be followed by a colon (:)');$value=$this->parseExpression();$node->addElement($value,$key);}$stream->expect(Twig_Token::PUNCTUATION_TYPE,'}','An opened hash is not properly closed');return $node;} public function parsePostfixExpression($node){while(true){$token=$this->parser->getCurrentToken();if($token->getType()==Twig_Token::PUNCTUATION_TYPE){if('.'==$token->getValue()||'['==$token->getValue()){$node=$this->parseSubscriptExpression($node);}elseif('|'==$token->getValue()){$node=$this->parseFilterExpression($node);}else {break;}}else {break;}}return $node;} public function getFunctionNode($name,$line){$args=$this->parseArguments();switch($name){case 'parent':if(!count($this->parser->getBlockStack())){ throw new Twig_Error_Syntax('Calling "parent" outside a block is forbidden',$line);}if(!$this->parser->getParent()&&!$this->parser->hasTraits()){ throw new Twig_Error_Syntax('Calling "parent" on a template that does not extend nor "use" another template is forbidden',$line);}return new Twig_Node_Expression_Parent($this->parser->peekBlockStack(),$line);case 'block':return new Twig_Node_Expression_BlockReference($args->getNode(0),false,$line);case 'attribute':if(count($args)<2){ throw new Twig_Error_Syntax('The "attribute" function takes at least two arguments (the variable and the attributes)',$line);}return new Twig_Node_Expression_GetAttr($args->getNode(0),$args->getNode(1),count($args)>2?$args->getNode(2):new Twig_Node_Expression_Array(array(),$line),Twig_TemplateInterface::ANY_CALL,$line);default:if(null!==$alias=$this->parser->getImportedFunction($name)){$arguments=new Twig_Node_Expression_Array(array(),$line);foreach($args as $n){$arguments->addElement($n);}$node=new Twig_Node_Expression_MethodCall($alias['node'],$alias['name'],$arguments,$line);$node->setAttribute('safe',true);return $node;}$class=$this->getFunctionNodeClass($name);return new $class($name,$args,$line);}} public function parseSubscriptExpression($node){$stream=$this->parser->getStream();$token=$stream->next();$lineno=$token->getLine();$arguments=new Twig_Node_Expression_Array(array(),$lineno);$type=Twig_TemplateInterface::ANY_CALL;if($token->getValue()=='.'){$token=$stream->next();if($token->getType()==Twig_Token::NAME_TYPE||$token->getType()==Twig_Token::NUMBER_TYPE||($token->getType()==Twig_Token::OPERATOR_TYPE&&preg_match(Twig_Lexer::REGEX_NAME,$token->getValue()))){$arg=new Twig_Node_Expression_Constant($token->getValue(),$lineno);if($stream->test(Twig_Token::PUNCTUATION_TYPE,'(')){$type=Twig_TemplateInterface::METHOD_CALL;foreach($this->parseArguments() as $n){$arguments->addElement($n);}}}else { throw new Twig_Error_Syntax('Expected name or number',$lineno);}}else {$type=Twig_TemplateInterface::ARRAY_CALL;$arg=$this->parseExpression();if($stream->test(Twig_Token::PUNCTUATION_TYPE,':')){$stream->next();if($stream->test(Twig_Token::PUNCTUATION_TYPE,']')){$length=new Twig_Node_Expression_Constant(null,$token->getLine());}else {$length=$this->parseExpression();}$class=$this->getFilterNodeClass('slice');$arguments=new Twig_Node(array($arg,$length));$filter=new $class($node,new Twig_Node_Expression_Constant('slice',$token->getLine()),$arguments,$token->getLine());$stream->expect(Twig_Token::PUNCTUATION_TYPE,']');return $filter;}$stream->expect(Twig_Token::PUNCTUATION_TYPE,']');}return new Twig_Node_Expression_GetAttr($node,$arg,$arguments,$type,$lineno);} public function parseFilterExpression($node){$this->parser->getStream()->next();return $this->parseFilterExpressionRaw($node);} public function parseFilterExpressionRaw($node,$tag=null){while(true){$token=$this->parser->getStream()->expect(Twig_Token::NAME_TYPE);$name=new Twig_Node_Expression_Constant($token->getValue(),$token->getLine());if(!$this->parser->getStream()->test(Twig_Token::PUNCTUATION_TYPE,'(')){$arguments=new Twig_Node();}else {$arguments=$this->parseArguments();}$class=$this->getFilterNodeClass($name->getAttribute('value'));$node=new $class($node,$name,$arguments,$token->getLine(),$tag);if(!$this->parser->getStream()->test(Twig_Token::PUNCTUATION_TYPE,'|')){break;}$this->parser->getStream()->next();}return $node;} public function parseArguments(){$args=array();$stream=$this->parser->getStream();$stream->expect(Twig_Token::PUNCTUATION_TYPE,'(','A list of arguments must be opened by a parenthesis');while(!$stream->test(Twig_Token::PUNCTUATION_TYPE,')')){if(!empty($args)){$stream->expect(Twig_Token::PUNCTUATION_TYPE,',','Arguments must be separated by a comma');}$args[]=$this->parseExpression();}$stream->expect(Twig_Token::PUNCTUATION_TYPE,')','A list of arguments must be closed by a parenthesis');return new Twig_Node($args);} public function parseAssignmentExpression(){$targets=array();while(true){$token=$this->parser->getStream()->expect(Twig_Token::NAME_TYPE,null,'Only variables can be assigned to');if(in_array($token->getValue(),array('true','false','none'))){ throw new Twig_Error_Syntax(sprintf('You cannot assign a value to "%s"',$token->getValue()),$token->getLine());}$targets[]=new Twig_Node_Expression_AssignName($token->getValue(),$token->getLine());if(!$this->parser->getStream()->test(Twig_Token::PUNCTUATION_TYPE,',')){break;}$this->parser->getStream()->next();}return new Twig_Node($targets);} public function parseMultitargetExpression(){$targets=array();while(true){$targets[]=$this->parseExpression();if(!$this->parser->getStream()->test(Twig_Token::PUNCTUATION_TYPE,',')){break;}$this->parser->getStream()->next();}return new Twig_Node($targets);} protected function getFunctionNodeClass($name){$functionMap=$this->parser->getEnvironment()->getFunctions();if(isset($functionMap[$name])&&$functionMap[$name] instanceof Twig_Function_Node){return $functionMap[$name]->getClass();}return 'Twig_Node_Expression_Function';} protected function getFilterNodeClass($name){$filterMap=$this->parser->getEnvironment()->getFilters();if(isset($filterMap[$name])&&$filterMap[$name] instanceof Twig_Filter_Node){return $filterMap[$name]->getClass();}return 'Twig_Node_Expression_Filter';}}class Twig_Token{ protected $value; protected $type; protected $lineno;const EOF_TYPE=-1;const TEXT_TYPE=0;const BLOCK_START_TYPE=1;const VAR_START_TYPE=2;const BLOCK_END_TYPE=3;const VAR_END_TYPE=4;const NAME_TYPE=5;const NUMBER_TYPE=6;const STRING_TYPE=7;const OPERATOR_TYPE=8;const PUNCTUATION_TYPE=9;const INTERPOLATION_START_TYPE=10;const INTERPOLATION_END_TYPE=11; public function __construct($type,$value,$lineno){$this->type=$type;$this->value=$value;$this->lineno=$lineno;} public function __toString(){return sprintf('%s(%s)',self::typeToString($this->type,true,$this->lineno),$this->value);} public function test($type,$values=null){if(null===$values&&!is_int($type)){$values=$type;$type=self::NAME_TYPE;}return ($this->type===$type)&&(null===$values||(is_array($values)&&in_array($this->value,$values))||$this->value==$values);} public function getLine(){return $this->lineno;} public function getType(){return $this->type;} public function getValue(){return $this->value;}static public function typeToString($type,$short=false,$line=-1){switch($type){case self::EOF_TYPE:$name='EOF_TYPE';break;case self::TEXT_TYPE:$name='TEXT_TYPE';break;case self::BLOCK_START_TYPE:$name='BLOCK_START_TYPE';break;case self::VAR_START_TYPE:$name='VAR_START_TYPE';break;case self::BLOCK_END_TYPE:$name='BLOCK_END_TYPE';break;case self::VAR_END_TYPE:$name='VAR_END_TYPE';break;case self::NAME_TYPE:$name='NAME_TYPE';break;case self::NUMBER_TYPE:$name='NUMBER_TYPE';break;case self::STRING_TYPE:$name='STRING_TYPE';break;case self::OPERATOR_TYPE:$name='OPERATOR_TYPE';break;case self::PUNCTUATION_TYPE:$name='PUNCTUATION_TYPE';break;case self::INTERPOLATION_START_TYPE:$name='INTERPOLATION_START_TYPE';break;case self::INTERPOLATION_END_TYPE:$name='INTERPOLATION_END_TYPE';break;default: throw new Twig_Error_Syntax(sprintf('Token of type "%s" does not exist.',$type),$line);}return $short?$name:'Twig_Token::'.$name;}static public function typeToEnglish($type,$line=-1){switch($type){case self::EOF_TYPE:return 'end of template';case self::TEXT_TYPE:return 'text';case self::BLOCK_START_TYPE:return 'begin of statement block';case self::VAR_START_TYPE:return 'begin of print statement';case self::BLOCK_END_TYPE:return 'end of statement block';case self::VAR_END_TYPE:return 'end of print statement';case self::NAME_TYPE:return 'name';case self::NUMBER_TYPE:return 'number';case self::STRING_TYPE:return 'string';case self::OPERATOR_TYPE:return 'operator';case self::PUNCTUATION_TYPE:return 'punctuation';case self::INTERPOLATION_START_TYPE:return 'begin of string interpolation';case self::INTERPOLATION_END_TYPE:return 'end of string interpolation';default: throw new Twig_Error_Syntax(sprintf('Token of type "%s" does not exist.',$type),$line);}}}class Twig_TokenStream{ protected $tokens; protected $current; protected $filename; public function __construct(array$tokens,$filename=null){$this->tokens=$tokens;$this->current=0;$this->filename=$filename;} public function __toString(){return implode("\n",$this->tokens);} public function injectTokens(array$tokens){$this->tokens=array_merge(array_slice($this->tokens,0,$this->current),$tokens,array_slice($this->tokens,$this->current));} public function next(){if(!isset($this->tokens[++$this->current])){ throw new Twig_Error_Syntax('Unexpected end of template',-1,$this->filename);}return $this->tokens[$this->current-1];} public function expect($type,$value=null,$message=null){$token=$this->tokens[$this->current];if(!$token->test($type,$value)){$line=$token->getLine(); throw new Twig_Error_Syntax(sprintf('%sUnexpected token "%s" of value "%s" ("%s" expected%s)',$message?$message.'. ':'',Twig_Token::typeToEnglish($token->getType(),$line),$token->getValue(),Twig_Token::typeToEnglish($type,$line),$value?sprintf(' with value "%s"',$value):''),$line,$this->filename);}$this->next();return $token;} public function look($number=1){if(!isset($this->tokens[$this->current+$number])){ throw new Twig_Error_Syntax('Unexpected end of template',-1,$this->filename);}return $this->tokens[$this->current+$number];} public function test($primary,$secondary=null){return $this->tokens[$this->current]->test($primary,$secondary);} public function isEOF(){return $this->tokens[$this->current]->getType()===Twig_Token::EOF_TYPE;} public function getCurrent(){return $this->tokens[$this->current];} public function getFilename(){return $this->filename;}}abstract class Twig_Node_Expression_Binary extends Twig_Node_Expression{ public function __construct(Twig_NodeInterface$left,Twig_NodeInterface$right,$lineno){parent::__construct(array('left'=>$left,'right'=>$right),array(),$lineno);} public function compile(Twig_Compiler$compiler){$compiler->raw('(')->subcompile($this->getNode('left'))->raw(' ');$this->operator($compiler);$compiler->raw(' ')->subcompile($this->getNode('right'))->raw(')');}abstract public function operator(Twig_Compiler$compiler);}class Twig_Node_Expression_Binary_Add extends Twig_Node_Expression_Binary{ public function operator(Twig_Compiler$compiler){return $compiler->raw('+');}}class Twig_Node_Set extends Twig_Node{ public function __construct($capture,Twig_NodeInterface$names,Twig_NodeInterface$values,$lineno,$tag=null){parent::__construct(array('names'=>$names,'values'=>$values),array('capture'=>$capture,'safe'=>false),$lineno,$tag);if($this->getAttribute('capture')){$this->setAttribute('safe',true);$values=$this->getNode('values');if($values instanceof Twig_Node_Text){$this->setNode('values',new Twig_Node_Expression_Constant($values->getAttribute('data'),$values->getLine()));$this->setAttribute('capture',false);}}} public function compile(Twig_Compiler$compiler){$compiler->addDebugInfo($this);if(count($this->getNode('names'))>1){$compiler->write('list(');foreach($this->getNode('names') as $idx=>$node){if($idx){$compiler->raw(', ');}$compiler->subcompile($node);}$compiler->raw(')');}else {if($this->getAttribute('capture')){$compiler->write("ob_start();\n")->subcompile($this->getNode('values'));}$compiler->subcompile($this->getNode('names'),false);if($this->getAttribute('capture')){$compiler->raw(" = ('' === \$tmp = ob_get_clean()) ? '' : new Twig_Markup(\$tmp, \$this->env->getCharset())");}}if(!$this->getAttribute('capture')){$compiler->raw(' = ');if(count($this->getNode('names'))>1){$compiler->write('array(');foreach($this->getNode('values') as $idx=>$value){if($idx){$compiler->raw(', ');}$compiler->subcompile($value);}$compiler->raw(')');}else {if($this->getAttribute('safe')){$compiler->raw("('' === \$tmp = ")->subcompile($this->getNode('values'))->raw(") ? '' : new Twig_Markup(\$tmp, \$this->env->getCharset())");}else {$compiler->subcompile($this->getNode('values'));}}}$compiler->raw(";\n");}}class Twig_Parser implements Twig_ParserInterface{ protected $stack=array(); protected $stream; protected $parent; protected $handlers; protected $visitors; protected $expressionParser; protected $blocks; protected $blockStack; protected $macros; protected $env; protected $reservedMacroNames; protected $importedFunctions; protected $traits; protected $embeddedTemplates=array(); public function __construct(Twig_Environment$env){$this->env=$env;} public function getEnvironment(){return $this->env;} public function getVarName(){return sprintf('__internal_%s',hash('sha1',uniqid(mt_rand(),true),false));} public function parse(Twig_TokenStream$stream,$test=null,$dropNeedle=false){$vars=get_object_vars($this);unset($vars['stack'],$vars['env'],$vars['handlers'],$vars['visitors'],$vars['expressionParser']);$this->stack[]=$vars;if(null===$this->handlers){$this->handlers=$this->env->getTokenParsers();$this->handlers->setParser($this);}if(null===$this->visitors){$this->visitors=$this->env->getNodeVisitors();}if(null===$this->expressionParser){$this->expressionParser=new Twig_ExpressionParser($this,$this->env->getUnaryOperators(),$this->env->getBinaryOperators());}$this->stream=$stream;$this->parent=null;$this->blocks=array();$this->macros=array();$this->traits=array();$this->blockStack=array();$this->importedFunctions=array(array());$this->embeddedTemplates=array();try{$body=$this->subparse($test,$dropNeedle);if(null!==$this->parent){if(null===$body=$this->filterBodyNodes($body)){$body=new Twig_Node();}}}catch(Twig_Error_Syntax$e){if(null===$e->getTemplateFile()){$e->setTemplateFile($this->stream->getFilename());} throw $e;}$node=new Twig_Node_Module(new Twig_Node_Body(array($body)),$this->parent,new Twig_Node($this->blocks),new Twig_Node($this->macros),new Twig_Node($this->traits),$this->embeddedTemplates,$this->stream->getFilename());$traverser=new Twig_NodeTraverser($this->env,$this->visitors);$node=$traverser->traverse($node);foreach(array_pop($this->stack) as $key=>$val){$this->$key=$val;}return $node;} public function subparse($test,$dropNeedle=false){$lineno=$this->getCurrentToken()->getLine();$rv=array();while(!$this->stream->isEOF()){switch($this->getCurrentToken()->getType()){case Twig_Token::TEXT_TYPE:$token=$this->stream->next();$rv[]=new Twig_Node_Text($token->getValue(),$token->getLine());break;case Twig_Token::VAR_START_TYPE:$token=$this->stream->next();$expr=$this->expressionParser->parseExpression();$this->stream->expect(Twig_Token::VAR_END_TYPE);$rv[]=new Twig_Node_Print($expr,$token->getLine());break;case Twig_Token::BLOCK_START_TYPE:$this->stream->next();$token=$this->getCurrentToken();if($token->getType()!==Twig_Token::NAME_TYPE){ throw new Twig_Error_Syntax('A block must start with a tag name',$token->getLine(),$this->stream->getFilename());}if(null!==$test&&call_user_func($test,$token)){if($dropNeedle){$this->stream->next();}if(1===count($rv)){return $rv[0];}return new Twig_Node($rv,array(),$lineno);}$subparser=$this->handlers->getTokenParser($token->getValue());if(null===$subparser){if(null!==$test){$error=sprintf('Unexpected tag name "%s"',$token->getValue());if(is_array($test)&&isset($test[0])&&$test[0] instanceof Twig_TokenParserInterface){$error.=sprintf(' (expecting closing tag for the "%s" tag defined near line %s)',$test[0]->getTag(),$lineno);} throw new Twig_Error_Syntax($error,$token->getLine(),$this->stream->getFilename());}$message=sprintf('Unknown tag name "%s"',$token->getValue());if($alternatives=$this->env->computeAlternatives($token->getValue(),array_keys($this->env->getTags()))){$message=sprintf('%s. Did you mean "%s"',$message,implode('", "',$alternatives));} throw new Twig_Error_Syntax($message,$token->getLine(),$this->stream->getFilename());}$this->stream->next();$node=$subparser->parse($token);if(null!==$node){$rv[]=$node;}break;default: throw new Twig_Error_Syntax('Lexer or parser ended up in unsupported state.',-1,$this->stream->getFilename());}}if(1===count($rv)){return $rv[0];}return new Twig_Node($rv,array(),$lineno);} public function addHandler($name,$class){$this->handlers[$name]=$class;} public function addNodeVisitor(Twig_NodeVisitorInterface$visitor){$this->visitors[]=$visitor;} public function getBlockStack(){return $this->blockStack;} public function peekBlockStack(){return $this->blockStack[count($this->blockStack)-1];} public function popBlockStack(){array_pop($this->blockStack);} public function pushBlockStack($name){$this->blockStack[]=$name;} public function hasBlock($name){return isset($this->blocks[$name]);} public function getBlock($name){return $this->blocks[$name];} public function setBlock($name,$value){$this->blocks[$name]=new Twig_Node_Body(array($value),array(),$value->getLine());} public function hasMacro($name){return isset($this->macros[$name]);} public function setMacro($name,Twig_Node_Macro$node){if(null===$this->reservedMacroNames){$this->reservedMacroNames=array();$r=new ReflectionClass($this->env->getBaseTemplateClass());foreach($r->getMethods() as $method){$this->reservedMacroNames[]=$method->getName();}}if(in_array($name,$this->reservedMacroNames)){ throw new Twig_Error_Syntax(sprintf('"%s" cannot be used as a macro name as it is a reserved keyword',$name),$node->getLine());}$this->macros[$name]=$node;} public function addTrait($trait){$this->traits[]=$trait;} public function hasTraits(){return count($this->traits)>0;} public function embedTemplate(Twig_Node_Module$template){$template->setIndex(mt_rand());$this->embeddedTemplates[]=$template;} public function addImportedFunction($alias,$name,Twig_Node_Expression$node){$this->importedFunctions[0][$alias]=array('name'=>$name,'node'=>$node);} public function getImportedFunction($alias){foreach($this->importedFunctions as $functions){if(isset($functions[$alias])){return $functions[$alias];}}} public function isMainScope(){return 1===count($this->importedFunctions);} public function pushLocalScope(){array_unshift($this->importedFunctions,array());} public function popLocalScope(){array_shift($this->importedFunctions);} public function getExpressionParser(){return $this->expressionParser;} public function getParent(){return $this->parent;} public function setParent($parent){$this->parent=$parent;} public function getStream(){return $this->stream;} public function getCurrentToken(){return $this->stream->getCurrent();} protected function filterBodyNodes(Twig_NodeInterface$node){if(($node instanceof Twig_Node_Text&&!ctype_space($node->getAttribute('data')))||(!$node instanceof Twig_Node_Text&&!$node instanceof Twig_Node_BlockReference&&$node instanceof Twig_NodeOutputInterface)){if(false!==strpos((string)$node,chr(0xEF).chr(0xBB).chr(0xBF))){ throw new Twig_Error_Syntax('A template that extends another one cannot have a body but a byte order mark (BOM) has been detected; it must be removed.',$node->getLine(),$this->stream->getFilename());} throw new Twig_Error_Syntax('A template that extends another one cannot have a body.',$node->getLine(),$this->stream->getFilename());}if($node instanceof Twig_Node_Set){return $node;}if($node instanceof Twig_NodeOutputInterface){return;}foreach($node as $k=>$n){if(null!==$n&&null===$n=$this->filterBodyNodes($n)){$node->removeNode($k);}}return $node;}} interface Twig_ParserInterface{function parse(Twig_TokenStream$stream);}class Twig_TokenParserBroker implements Twig_TokenParserBrokerInterface{ protected $parser; protected $parsers=array(); protected $brokers=array(); public function __construct($parsers=array(),$brokers=array()){foreach($parsers as $parser){if(!$parser instanceof Twig_TokenParserInterface){ throw new Twig_Error('$parsers must a an array of Twig_TokenParserInterface');}$this->parsers[$parser->getTag()]=$parser;}foreach($brokers as $broker){if(!$broker instanceof Twig_TokenParserBrokerInterface){ throw new Twig_Error('$brokers must a an array of Twig_TokenParserBrokerInterface');}$this->brokers[]=$broker;}} public function addTokenParser(Twig_TokenParserInterface$parser){$this->parsers[$parser->getTag()]=$parser;} public function addTokenParserBroker(Twig_TokenParserBroker$broker){$this->brokers[]=$broker;} public function getTokenParser($tag){if(isset($this->parsers[$tag])){return $this->parsers[$tag];}$broker=end($this->brokers);while(false!==$broker){$parser=$broker->getTokenParser($tag);if(null!==$parser){return $parser;}$broker=prev($this->brokers);}return null;} public function getParsers(){return $this->parsers;} public function getParser(){return $this->parser;} public function setParser(Twig_ParserInterface$parser){$this->parser=$parser;foreach($this->parsers as $tokenParser){$tokenParser->setParser($parser);}foreach($this->brokers as $broker){$broker->setParser($parser);}}} interface Twig_TokenParserBrokerInterface{function getTokenParser($tag);function setParser(Twig_ParserInterface$parser);function getParser();}abstract class Twig_TokenParser implements Twig_TokenParserInterface{ protected $parser; public function setParser(Twig_Parser$parser){$this->parser=$parser;}}class Twig_TokenParser_For extends Twig_TokenParser{ public function parse(Twig_Token$token){$lineno=$token->getLine();$targets=$this->parser->getExpressionParser()->parseAssignmentExpression();$this->parser->getStream()->expect(Twig_Token::OPERATOR_TYPE,'in');$seq=$this->parser->getExpressionParser()->parseExpression();$ifexpr=null;if($this->parser->getStream()->test(Twig_Token::NAME_TYPE,'if')){$this->parser->getStream()->next();$ifexpr=$this->parser->getExpressionParser()->parseExpression();}$this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);$body=$this->parser->subparse(array($this,'decideForFork'));if($this->parser->getStream()->next()->getValue()=='else'){$this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);$else=$this->parser->subparse(array($this,'decideForEnd'),true);}else {$else=null;}$this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);if(count($targets)>1){$keyTarget=$targets->getNode(0);$keyTarget=new Twig_Node_Expression_AssignName($keyTarget->getAttribute('name'),$keyTarget->getLine());$valueTarget=$targets->getNode(1);$valueTarget=new Twig_Node_Expression_AssignName($valueTarget->getAttribute('name'),$valueTarget->getLine());}else {$keyTarget=new Twig_Node_Expression_AssignName('_key',$lineno);$valueTarget=$targets->getNode(0);$valueTarget=new Twig_Node_Expression_AssignName($valueTarget->getAttribute('name'),$valueTarget->getLine());}return new Twig_Node_For($keyTarget,$valueTarget,$seq,$ifexpr,$body,$else,$lineno,$this->getTag());} public function decideForFork(Twig_Token$token){return $token->test(array('else','endfor'));} public function decideForEnd(Twig_Token$token){return $token->test('endfor');} public function getTag(){return 'for';}} interface Twig_TokenParserInterface{function setParser(Twig_Parser$parser);function parse(Twig_Token$token);function getTag();}class Twig_TokenParser_If extends Twig_TokenParser{ public function parse(Twig_Token$token){$lineno=$token->getLine();$expr=$this->parser->getExpressionParser()->parseExpression();$this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);$body=$this->parser->subparse(array($this,'decideIfFork'));$tests=array($expr,$body);$else=null;$end=false;while(!$end){switch($this->parser->getStream()->next()->getValue()){case 'else':$this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);$else=$this->parser->subparse(array($this,'decideIfEnd'));break;case 'elseif':$expr=$this->parser->getExpressionParser()->parseExpression();$this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);$body=$this->parser->subparse(array($this,'decideIfFork'));$tests[]=$expr;$tests[]=$body;break;case 'endif':$end=true;break;default: throw new Twig_Error_Syntax(sprintf('Unexpected end of template. Twig was looking for the following tags "else", "elseif", or "endif" to close the "if" block started at line %d)',$lineno),-1);}}$this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);return new Twig_Node_If(new Twig_Node($tests),$else,$lineno,$this->getTag());} public function decideIfFork(Twig_Token$token){return $token->test(array('elseif','else','endif'));} public function decideIfEnd(Twig_Token$token){return $token->test(array('endif'));} public function getTag(){return 'if';}}class Twig_TokenParser_Extends extends Twig_TokenParser{ public function parse(Twig_Token$token){if(!$this->parser->isMainScope()){ throw new Twig_Error_Syntax('Cannot extend from a block',$token->getLine());}if(null!==$this->parser->getParent()){ throw new Twig_Error_Syntax('Multiple extends tags are forbidden',$token->getLine());}$this->parser->setParent($this->parser->getExpressionParser()->parseExpression());$this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);return null;} public function getTag(){return 'extends';}}class Twig_TokenParser_Include extends Twig_TokenParser{ public function parse(Twig_Token$token){$expr=$this->parser->getExpressionParser()->parseExpression();list($variables,$only,$ignoreMissing)=$this->parseArguments();return new Twig_Node_Include($expr,$variables,$only,$ignoreMissing,$token->getLine(),$this->getTag());} protected function parseArguments(){$stream=$this->parser->getStream();$ignoreMissing=false;if($stream->test(Twig_Token::NAME_TYPE,'ignore')){$stream->next();$stream->expect(Twig_Token::NAME_TYPE,'missing');$ignoreMissing=true;}$variables=null;if($stream->test(Twig_Token::NAME_TYPE,'with')){$stream->next();$variables=$this->parser->getExpressionParser()->parseExpression();}$only=false;if($stream->test(Twig_Token::NAME_TYPE,'only')){$stream->next();$only=true;}$stream->expect(Twig_Token::BLOCK_END_TYPE);return array($variables,$only,$ignoreMissing);} public function getTag(){return 'include';}}class Twig_TokenParser_Block extends Twig_TokenParser{ public function parse(Twig_Token$token){$lineno=$token->getLine();$stream=$this->parser->getStream();$name=$stream->expect(Twig_Token::NAME_TYPE)->getValue();if($this->parser->hasBlock($name)){ throw new Twig_Error_Syntax(sprintf("The block '$name' has already been defined line %d",$this->parser->getBlock($name)->getLine()),$lineno);}$this->parser->setBlock($name,$block=new Twig_Node_Block($name,new Twig_Node(array()),$lineno));$this->parser->pushLocalScope();$this->parser->pushBlockStack($name);if($stream->test(Twig_Token::BLOCK_END_TYPE)){$stream->next();$body=$this->parser->subparse(array($this,'decideBlockEnd'),true);if($stream->test(Twig_Token::NAME_TYPE)){$value=$stream->next()->getValue();if($value!=$name){ throw new Twig_Error_Syntax(sprintf("Expected endblock for block '$name' (but %s given)",$value),$lineno);}}}else {$body=new Twig_Node(array(new Twig_Node_Print($this->parser->getExpressionParser()->parseExpression(),$lineno),));}$stream->expect(Twig_Token::BLOCK_END_TYPE);$block->setNode('body',$body);$this->parser->popBlockStack();$this->parser->popLocalScope();return new Twig_Node_BlockReference($name,$lineno,$this->getTag());} public function decideBlockEnd(Twig_Token$token){return $token->test('endblock');} public function getTag(){return 'block';}}class Twig_TokenParser_Use extends Twig_TokenParser{ public function parse(Twig_Token$token){$template=$this->parser->getExpressionParser()->parseExpression();if(!$template instanceof Twig_Node_Expression_Constant){ throw new Twig_Error_Syntax('The template references in a "use" statement must be a string.',$token->getLine());}$stream=$this->parser->getStream();$targets=array();if($stream->test('with')){$stream->next();do{$name=$stream->expect(Twig_Token::NAME_TYPE)->getValue();$alias=$name;if($stream->test('as')){$stream->next();$alias=$stream->expect(Twig_Token::NAME_TYPE)->getValue();}$targets[$name]=new Twig_Node_Expression_Constant($alias,-1);if(!$stream->test(Twig_Token::PUNCTUATION_TYPE,',')){break;}$stream->next();}while(true);}$stream->expect(Twig_Token::BLOCK_END_TYPE);$this->parser->addTrait(new Twig_Node(array('template'=>$template,'targets'=>new Twig_Node($targets))));return null;} public function getTag(){return 'use';}}class Twig_TokenParser_Filter extends Twig_TokenParser{ public function parse(Twig_Token$token){$name=$this->parser->getVarName();$ref=new Twig_Node_Expression_BlockReference(new Twig_Node_Expression_Constant($name,$token->getLine()),true,$token->getLine(),$this->getTag());$filter=$this->parser->getExpressionParser()->parseFilterExpressionRaw($ref,$this->getTag());$this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);$body=$this->parser->subparse(array($this,'decideBlockEnd'),true);$this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);$block=new Twig_Node_Block($name,$body,$token->getLine());$this->parser->setBlock($name,$block);return new Twig_Node_Print($filter,$token->getLine(),$this->getTag());} public function decideBlockEnd(Twig_Token$token){return $token->test('endfilter');} public function getTag(){return 'filter';}}class Twig_TokenParser_Macro extends Twig_TokenParser{ public function parse(Twig_Token$token){$lineno=$token->getLine();$name=$this->parser->getStream()->expect(Twig_Token::NAME_TYPE)->getValue();$arguments=$this->parser->getExpressionParser()->parseArguments();$this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);$this->parser->pushLocalScope();$body=$this->parser->subparse(array($this,'decideBlockEnd'),true);if($this->parser->getStream()->test(Twig_Token::NAME_TYPE)){$value=$this->parser->getStream()->next()->getValue();if($value!=$name){ throw new Twig_Error_Syntax(sprintf("Expected endmacro for macro '$name' (but %s given)",$value),$lineno);}}$this->parser->popLocalScope();$this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);$this->parser->setMacro($name,new Twig_Node_Macro($name,new Twig_Node_Body(array($body)),$arguments,$lineno,$this->getTag()));return null;} public function decideBlockEnd(Twig_Token$token){return $token->test('endmacro');} public function getTag(){return 'macro';}}class Twig_TokenParser_Import extends Twig_TokenParser{ public function parse(Twig_Token$token){$macro=$this->parser->getExpressionParser()->parseExpression();$this->parser->getStream()->expect('as');$var=new Twig_Node_Expression_AssignName($this->parser->getStream()->expect(Twig_Token::NAME_TYPE)->getValue(),$token->getLine());$this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);return new Twig_Node_Import($macro,$var,$token->getLine(),$this->getTag());} public function getTag(){return 'import';}}class Twig_TokenParser_From extends Twig_TokenParser{ public function parse(Twig_Token$token){$macro=$this->parser->getExpressionParser()->parseExpression();$stream=$this->parser->getStream();$stream->expect('import');$targets=array();do{$name=$stream->expect(Twig_Token::NAME_TYPE)->getValue();$alias=$name;if($stream->test('as')){$stream->next();$alias=$stream->expect(Twig_Token::NAME_TYPE)->getValue();}$targets[$name]=$alias;if(!$stream->test(Twig_Token::PUNCTUATION_TYPE,',')){break;}$stream->next();}while(true);$stream->expect(Twig_Token::BLOCK_END_TYPE);$node=new Twig_Node_Import($macro,new Twig_Node_Expression_AssignName($this->parser->getVarName(),$token->getLine()),$token->getLine(),$this->getTag());foreach($targets as $name=>$alias){$this->parser->addImportedFunction($alias,'get'.$name,$node->getNode('var'));}return $node;} public function getTag(){return 'from';}}class Twig_TokenParser_Set extends Twig_TokenParser{ public function parse(Twig_Token$token){$lineno=$token->getLine();$stream=$this->parser->getStream();$names=$this->parser->getExpressionParser()->parseAssignmentExpression();$capture=false;if($stream->test(Twig_Token::OPERATOR_TYPE,'=')){$stream->next();$values=$this->parser->getExpressionParser()->parseMultitargetExpression();$stream->expect(Twig_Token::BLOCK_END_TYPE);if(count($names)!==count($values)){ throw new Twig_Error_Syntax("When using set, you must have the same number of variables and assignements.",$lineno);}}else {$capture=true;if(count($names)>1){ throw new Twig_Error_Syntax("When using set with a block, you cannot have a multi-target.",$lineno);}$stream->expect(Twig_Token::BLOCK_END_TYPE);$values=$this->parser->subparse(array($this,'decideBlockEnd'),true);$stream->expect(Twig_Token::BLOCK_END_TYPE);}return new Twig_Node_Set($capture,$names,$values,$lineno,$this->getTag());} public function decideBlockEnd(Twig_Token$token){return $token->test('endset');} public function getTag(){return 'set';}}class Twig_TokenParser_Spaceless extends Twig_TokenParser{ public function parse(Twig_Token$token){$lineno=$token->getLine();$this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);$body=$this->parser->subparse(array($this,'decideSpacelessEnd'),true);$this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);return new Twig_Node_Spaceless($body,$lineno,$this->getTag());} public function decideSpacelessEnd(Twig_Token$token){return $token->test('endspaceless');} public function getTag(){return 'spaceless';}}class Twig_TokenParser_Flush extends Twig_TokenParser{ public function parse(Twig_Token$token){$this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);return new Twig_Node_Flush($token->getLine(),$this->getTag());} public function getTag(){return 'flush';}}class Twig_TokenParser_Do extends Twig_TokenParser{ public function parse(Twig_Token$token){$expr=$this->parser->getExpressionParser()->parseExpression();$this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);return new Twig_Node_Do($expr,$token->getLine(),$this->getTag());} public function getTag(){return 'do';}}class Twig_TokenParser_Embed extends Twig_TokenParser_Include{ public function parse(Twig_Token$token){$stream=$this->parser->getStream();$parent=$this->parser->getExpressionParser()->parseExpression();list($variables,$only,$ignoreMissing)=$this->parseArguments();$stream->injectTokens(array(new Twig_Token(Twig_Token::BLOCK_START_TYPE,'',$token->getLine()),new Twig_Token(Twig_Token::NAME_TYPE,'extends',$token->getLine()),new Twig_Token(Twig_Token::STRING_TYPE,'__parent__',$token->getLine()),new Twig_Token(Twig_Token::BLOCK_END_TYPE,'',$token->getLine()),));$module=$this->parser->parse($stream,array($this,'decideBlockEnd'),true);$module->setNode('parent',$parent);$this->parser->embedTemplate($module);$stream->expect(Twig_Token::BLOCK_END_TYPE);return new Twig_Node_Embed($module->getAttribute('filename'),$module->getAttribute('index'),$variables,$only,$ignoreMissing,$token->getLine(),$this->getTag());} public function decideBlockEnd(Twig_Token$token){return $token->test('endembed');} public function getTag(){return 'embed';}}class Twig_TokenParser_AutoEscape extends Twig_TokenParser{ public function parse(Twig_Token$token){$lineno=$token->getLine();if($this->parser->getStream()->test(Twig_Token::BLOCK_END_TYPE)){$value='html';}else {$expr=$this->parser->getExpressionParser()->parseExpression();if(!$expr instanceof Twig_Node_Expression_Constant){ throw new Twig_Error_Syntax('An escaping strategy must be a string or a Boolean.',$lineno);}$value=$expr->getAttribute('value');$compat=true===$value||false===$value;if(true===$value){$value='html';}if($compat&&$this->parser->getStream()->test(Twig_Token::NAME_TYPE)){if(false===$value){ throw new Twig_Error_Syntax('Unexpected escaping strategy as you set autoescaping to false.',$lineno);}$value=$this->parser->getStream()->next()->getValue();}}$this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);$body=$this->parser->subparse(array($this,'decideBlockEnd'),true);$this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);return new Twig_Node_AutoEscape($value,$body,$lineno,$this->getTag());} public function decideBlockEnd(Twig_Token$token){return $token->test('endautoescape');} public function getTag(){return 'autoescape';}}class Twig_NodeVisitor_Escaper implements Twig_NodeVisitorInterface{ protected $statusStack=array(); protected $blocks=array(); protected $safeAnalysis; protected $traverser; protected $defaultStrategy=false; protected $safeVars=array(); public function __construct(){$this->safeAnalysis=new Twig_NodeVisitor_SafeAnalysis();} public function enterNode(Twig_NodeInterface$node,Twig_Environment$env){if($node instanceof Twig_Node_Module){if($env->hasExtension('escaper')&&$defaultStrategy=$env->getExtension('escaper')->getDefaultStrategy($node->getAttribute('filename'))){$this->defaultStrategy=$defaultStrategy;}$this->safeVars=array();}elseif($node instanceof Twig_Node_AutoEscape){$this->statusStack[]=$node->getAttribute('value');}elseif($node instanceof Twig_Node_Block){$this->statusStack[]=isset($this->blocks[$node->getAttribute('name')])?$this->blocks[$node->getAttribute('name')]:$this->needEscaping($env);}elseif($node instanceof Twig_Node_Import){$this->safeVars[]=$node->getNode('var')->getAttribute('name');}return $node;} public function leaveNode(Twig_NodeInterface$node,Twig_Environment$env){if($node instanceof Twig_Node_Module){$this->defaultStrategy=false;$this->safeVars=array();}elseif($node instanceof Twig_Node_Expression_Filter){return $this->preEscapeFilterNode($node,$env);}elseif($node instanceof Twig_Node_Print){return $this->escapePrintNode($node,$env,$this->needEscaping($env));}if($node instanceof Twig_Node_AutoEscape||$node instanceof Twig_Node_Block){array_pop($this->statusStack);}elseif($node instanceof Twig_Node_BlockReference){$this->blocks[$node->getAttribute('name')]=$this->needEscaping($env);}return $node;} protected function escapePrintNode(Twig_Node_Print$node,Twig_Environment$env,$type){if(false===$type){return $node;}$expression=$node->getNode('expr');if($this->isSafeFor($type,$expression,$env)){return $node;}$class=get_class($node);return new $class($this->getEscaperFilter($type,$expression),$node->getLine());} protected function preEscapeFilterNode(Twig_Node_Expression_Filter$filter,Twig_Environment$env){$name=$filter->getNode('filter')->getAttribute('value');if(false!==$f=$env->getFilter($name)){$type=$f->getPreEscape();if(null===$type){return $filter;}$node=$filter->getNode('node');if($this->isSafeFor($type,$node,$env)){return $filter;}$filter->setNode('node',$this->getEscaperFilter($type,$node));return $filter;}return $filter;} protected function isSafeFor($type,Twig_NodeInterface$expression,$env){$safe=$this->safeAnalysis->getSafe($expression);if(null===$safe){if(null===$this->traverser){$this->traverser=new Twig_NodeTraverser($env,array($this->safeAnalysis));}$this->safeAnalysis->setSafeVars($this->safeVars);$this->traverser->traverse($expression);$safe=$this->safeAnalysis->getSafe($expression);}return in_array($type,$safe)||in_array('all',$safe);} protected function needEscaping(Twig_Environment$env){if(count($this->statusStack)){return $this->statusStack[count($this->statusStack)-1];}return $this->defaultStrategy?$this->defaultStrategy:false;} protected function getEscaperFilter($type,Twig_NodeInterface$node){$line=$node->getLine();$name=new Twig_Node_Expression_Constant('escape',$line);$args=new Twig_Node(array(new Twig_Node_Expression_Constant((string)$type,$line),new Twig_Node_Expression_Constant(null,$line),new Twig_Node_Expression_Constant(true,$line)));return new Twig_Node_Expression_Filter($node,$name,$args,$line);} public function getPriority(){return 0;}} interface Twig_NodeVisitorInterface{function enterNode(Twig_NodeInterface$node,Twig_Environment$env);function leaveNode(Twig_NodeInterface$node,Twig_Environment$env);function getPriority();}class Twig_NodeVisitor_SafeAnalysis implements Twig_NodeVisitorInterface{ protected $data=array(); protected $safeVars=array(); public function setSafeVars($safeVars){$this->safeVars=$safeVars;} public function getSafe(Twig_NodeInterface$node){$hash=spl_object_hash($node);if(isset($this->data[$hash])){foreach($this->data[$hash] as $bucket){if($bucket['key']===$node){return $bucket['value'];}}}return null;} protected function setSafe(Twig_NodeInterface$node,array$safe){$hash=spl_object_hash($node);if(isset($this->data[$hash])){foreach($this->data[$hash] as &$bucket){if($bucket['key']===$node){$bucket['value']=$safe;return;}}}$this->data[$hash][]=array('key'=>$node,'value'=>$safe,);} public function enterNode(Twig_NodeInterface$node,Twig_Environment$env){return $node;} public function leaveNode(Twig_NodeInterface$node,Twig_Environment$env){if($node instanceof Twig_Node_Expression_Constant){$this->setSafe($node,array('all'));}elseif($node instanceof Twig_Node_Expression_BlockReference){$this->setSafe($node,array('all'));}elseif($node instanceof Twig_Node_Expression_Parent){$this->setSafe($node,array('all'));}elseif($node instanceof Twig_Node_Expression_Conditional){$safe=$this->intersectSafe($this->getSafe($node->getNode('expr2')),$this->getSafe($node->getNode('expr3')));$this->setSafe($node,$safe);}elseif($node instanceof Twig_Node_Expression_Filter){$name=$node->getNode('filter')->getAttribute('value');$args=$node->getNode('arguments');if(false!==$filter=$env->getFilter($name)){$safe=$filter->getSafe($args);if(null===$safe){$safe=$this->intersectSafe($this->getSafe($node->getNode('node')),$filter->getPreservesSafety());}$this->setSafe($node,$safe);}else {$this->setSafe($node,array());}}elseif($node instanceof Twig_Node_Expression_Function){$name=$node->getAttribute('name');$args=$node->getNode('arguments');$function=$env->getFunction($name);if(false!==$function){$this->setSafe($node,$function->getSafe($args));}else {$this->setSafe($node,array());}}elseif($node instanceof Twig_Node_Expression_MethodCall){if($node->getAttribute('safe')){$this->setSafe($node,array('all'));}else {$this->setSafe($node,array());}}elseif($node instanceof Twig_Node_Expression_GetAttr&&$node->getNode('node') instanceof Twig_Node_Expression_Name){$name=$node->getNode('node')->getAttribute('name');if('_self'==$name||in_array($name,$this->safeVars)){$this->setSafe($node,array('all'));}else {$this->setSafe($node,array());}}else {$this->setSafe($node,array());}return $node;} protected function intersectSafe(array$a=null,array$b=null){if(null===$a||null===$b){return array();}if(in_array('all',$a)){return $b;}if(in_array('all',$b)){return $a;}return array_intersect($a,$b);} public function getPriority(){return 0;}}class Twig_Node_SetTemp extends Twig_Node{ public function __construct($name,$lineno){parent::__construct(array(),array('name'=>$name),$lineno);} public function compile(Twig_Compiler$compiler){$name=$this->getAttribute('name');$compiler->addDebugInfo($this)->write('if (isset($context[')->string($name)->raw('])) { $_')->raw($name)->raw('_ = $context[')->repr($name)->raw(']; } else { $_')->raw($name)->raw("_ = null; }\n");}}class Twig_Node_Expression_TempName extends Twig_Node_Expression{ public function __construct($name,$lineno){parent::__construct(array(),array('name'=>$name),$lineno);} public function compile(Twig_Compiler$compiler){$compiler->raw('$_')->raw($this->getAttribute('name'))->raw('_');}}class Twig_NodeVisitor_Optimizer implements Twig_NodeVisitorInterface{const OPTIMIZE_ALL=-1;const OPTIMIZE_NONE=0;const OPTIMIZE_FOR=2;const OPTIMIZE_RAW_FILTER=4;const OPTIMIZE_VAR_ACCESS=8; protected $loops=array(); protected $optimizers; protected $prependedNodes=array(); protected $inABody=false; public function __construct($optimizers=-1){if(!is_int($optimizers)||$optimizers>2){ throw new InvalidArgumentException(sprintf('Optimizer mode "%s" is not valid.',$optimizers));}$this->optimizers=$optimizers;} public function enterNode(Twig_NodeInterface$node,Twig_Environment$env){if(self::OPTIMIZE_FOR===(self::OPTIMIZE_FOR&$this->optimizers)){$this->enterOptimizeFor($node,$env);}if(!version_compare(phpversion(),'5.4.0RC1','>=')&&self::OPTIMIZE_VAR_ACCESS===(self::OPTIMIZE_VAR_ACCESS&$this->optimizers)&&!$env->isStrictVariables()&&!$env->hasExtension('sandbox')){if($this->inABody){if(!$node instanceof Twig_Node_Expression){if(get_class($node)!=='Twig_Node'){array_unshift($this->prependedNodes,array());}}else {$node=$this->optimizeVariables($node,$env);}}elseif($node instanceof Twig_Node_Body){$this->inABody=true;}}return $node;} public function leaveNode(Twig_NodeInterface$node,Twig_Environment$env){$expression=$node instanceof Twig_Node_Expression;if(self::OPTIMIZE_FOR===(self::OPTIMIZE_FOR&$this->optimizers)){$this->leaveOptimizeFor($node,$env);}if(self::OPTIMIZE_RAW_FILTER===(self::OPTIMIZE_RAW_FILTER&$this->optimizers)){$node=$this->optimizeRawFilter($node,$env);}$node=$this->optimizePrintNode($node,$env);if(self::OPTIMIZE_VAR_ACCESS===(self::OPTIMIZE_VAR_ACCESS&$this->optimizers)&&!$env->isStrictVariables()&&!$env->hasExtension('sandbox')){if($node instanceof Twig_Node_Body){$this->inABody=false;}elseif($this->inABody){if(!$expression&&get_class($node)!=='Twig_Node'&&$prependedNodes=array_shift($this->prependedNodes)){$nodes=array();foreach(array_unique($prependedNodes) as $name){$nodes[]=new Twig_Node_SetTemp($name,$node->getLine());}$nodes[]=$node;$node=new Twig_Node($nodes);}}}return $node;} protected function optimizeVariables($node,$env){if('Twig_Node_Expression_Name'===get_class($node)&&$node->isSimple()){$this->prependedNodes[0][]=$node->getAttribute('name');return new Twig_Node_Expression_TempName($node->getAttribute('name'),$node->getLine());}return $node;} protected function optimizePrintNode($node,$env){if(!$node instanceof Twig_Node_Print){return $node;}if($node->getNode('expr') instanceof Twig_Node_Expression_BlockReference||$node->getNode('expr') instanceof Twig_Node_Expression_Parent){$node->getNode('expr')->setAttribute('output',true);return $node->getNode('expr');}return $node;} protected function optimizeRawFilter($node,$env){if($node instanceof Twig_Node_Expression_Filter&&'raw'==$node->getNode('filter')->getAttribute('value')){return $node->getNode('node');}return $node;} protected function enterOptimizeFor($node,$env){if($node instanceof Twig_Node_For){$node->setAttribute('with_loop',false);array_unshift($this->loops,$node);}elseif(!$this->loops){return;}elseif($node instanceof Twig_Node_Expression_Name&&'loop'===$node->getAttribute('name')){$this->addLoopToCurrent();}elseif($node instanceof Twig_Node_BlockReference||$node instanceof Twig_Node_Expression_BlockReference){$this->addLoopToCurrent();}elseif($node instanceof Twig_Node_Include&&!$node->getAttribute('only')){$this->addLoopToAll();}elseif($node instanceof Twig_Node_Expression_GetAttr&&(!$node->getNode('attribute') instanceof Twig_Node_Expression_Constant||'parent'===$node->getNode('attribute')->getAttribute('value'))&&(true===$this->loops[0]->getAttribute('with_loop')||($node->getNode('node') instanceof Twig_Node_Expression_Name&&'loop'===$node->getNode('node')->getAttribute('name')))){$this->addLoopToAll();}} protected function leaveOptimizeFor($node,$env){if($node instanceof Twig_Node_For){array_shift($this->loops);}} protected function addLoopToCurrent(){$this->loops[0]->setAttribute('with_loop',true);} protected function addLoopToAll(){foreach($this->loops as $loop){$loop->setAttribute('with_loop',true);}} public function getPriority(){return 255;}}class Twig_Node_Text extends Twig_Node implements Twig_NodeOutputInterface{ public function __construct($data,$lineno){parent::__construct(array(),array('data'=>$data),$lineno);} public function compile(Twig_Compiler$compiler){$compiler->addDebugInfo($this)->write('echo ')->string($this->getAttribute('data'))->raw(";\n");}} interface Twig_NodeOutputInterface{}class Twig_Node_Expression_Name extends Twig_Node_Expression{ protected $specialVars=array('_self'=>'$this','_context'=>'$context','_charset'=>'$this->env->getCharset()',); public function __construct($name,$lineno){parent::__construct(array(),array('name'=>$name,'is_defined_test'=>false,'ignore_strict_check'=>false),$lineno);} public function compile(Twig_Compiler$compiler){$name=$this->getAttribute('name');if($this->getAttribute('is_defined_test')){if($this->isSpecial()){$compiler->repr(true);}else {$compiler->raw('array_key_exists(')->repr($name)->raw(', $context)');}}elseif($this->isSpecial()){$compiler->raw($this->specialVars[$name]);}else {if(version_compare(phpversion(),'5.4.0RC1','>=')&&($this->getAttribute('ignore_strict_check')||!$compiler->getEnvironment()->isStrictVariables())){$compiler->raw('(isset($context[')->string($name)->raw(']) ? $context[')->string($name)->raw('] : null)');}else {$compiler->raw('$this->getContext($context, ')->string($name);if($this->getAttribute('ignore_strict_check')){$compiler->raw(', true');}$compiler->raw(')');}}} public function isSpecial(){return isset($this->specialVars[$this->getAttribute('name')]);} public function isSimple(){return !$this->isSpecial()&&!$this->getAttribute('is_defined_test');}}class Twig_Node_Expression_AssignName extends Twig_Node_Expression_Name{ public function compile(Twig_Compiler$compiler){$compiler->raw('$context[')->string($this->getAttribute('name'))->raw(']');}}class Twig_Node_For extends Twig_Node{ protected $loop; public function __construct(Twig_Node_Expression_AssignName$keyTarget,Twig_Node_Expression_AssignName$valueTarget,Twig_Node_Expression$seq,Twig_Node_Expression$ifexpr=null,Twig_NodeInterface$body,Twig_NodeInterface$else=null,$lineno,$tag=null){$body=new Twig_Node(array($body,$this->loop=new Twig_Node_ForLoop($lineno,$tag)));if(null!==$ifexpr){$body=new Twig_Node_If(new Twig_Node(array($ifexpr,$body)),null,$lineno,$tag);}parent::__construct(array('key_target'=>$keyTarget,'value_target'=>$valueTarget,'seq'=>$seq,'body'=>$body,'else'=>$else),array('with_loop'=>true,'ifexpr'=>null!==$ifexpr),$lineno,$tag);} public function compile(Twig_Compiler$compiler){$compiler->addDebugInfo($this)->write("\$context['_parent'] = (array) \$context;\n")->write("\$context['_seq'] = twig_ensure_traversable(")->subcompile($this->getNode('seq'))->raw(");\n");if(null!==$this->getNode('else')){$compiler->write("\$context['_iterated'] = false;\n");}if($this->getAttribute('with_loop')){$compiler->write("\$context['loop'] = array(\n")->write(" 'parent' => \$context['_parent'],\n")->write(" 'index0' => 0,\n")->write(" 'index' => 1,\n")->write(" 'first' => true,\n")->write(");\n");if(!$this->getAttribute('ifexpr')){$compiler->write("if (is_array(\$context['_seq']) || (is_object(\$context['_seq']) && \$context['_seq'] instanceof Countable)) {\n")->indent()->write("\$length = count(\$context['_seq']);\n")->write("\$context['loop']['revindex0'] = \$length - 1;\n")->write("\$context['loop']['revindex'] = \$length;\n")->write("\$context['loop']['length'] = \$length;\n")->write("\$context['loop']['last'] = 1 === \$length;\n")->outdent()->write("}\n");}}$this->loop->setAttribute('else',null!==$this->getNode('else'));$this->loop->setAttribute('with_loop',$this->getAttribute('with_loop'));$this->loop->setAttribute('ifexpr',$this->getAttribute('ifexpr'));$compiler->write("foreach (\$context['_seq'] as ")->subcompile($this->getNode('key_target'))->raw(" => ")->subcompile($this->getNode('value_target'))->raw(") {\n")->indent()->subcompile($this->getNode('body'))->outdent()->write("}\n");if(null!==$this->getNode('else')){$compiler->write("if (!\$context['_iterated']) {\n")->indent()->subcompile($this->getNode('else'))->outdent()->write("}\n");}$compiler->write("\$_parent = \$context['_parent'];\n");$compiler->write('unset($context[\'_seq\'], $context[\'_iterated\'], $context[\''.$this->getNode('key_target')->getAttribute('name').'\'], $context[\''.$this->getNode('value_target')->getAttribute('name').'\'], $context[\'_parent\'], $context[\'loop\']);'."\n");$compiler->write("\$context = array_merge(\$_parent, array_intersect_key(\$context, \$_parent));\n");}}class Twig_Node_ForLoop extends Twig_Node{ public function __construct($lineno,$tag=null){parent::__construct(array(),array('with_loop'=>false,'ifexpr'=>false,'else'=>false),$lineno,$tag);} public function compile(Twig_Compiler$compiler){if($this->getAttribute('else')){$compiler->write("\$context['_iterated'] = true;\n");}if($this->getAttribute('with_loop')){$compiler->write("++\$context['loop']['index0'];\n")->write("++\$context['loop']['index'];\n")->write("\$context['loop']['first'] = false;\n");if(!$this->getAttribute('ifexpr')){$compiler->write("if (isset(\$context['loop']['length'])) {\n")->indent()->write("--\$context['loop']['revindex0'];\n")->write("--\$context['loop']['revindex'];\n")->write("\$context['loop']['last'] = 0 === \$context['loop']['revindex0'];\n")->outdent()->write("}\n");}}}}class Twig_Node_Expression_Array extends Twig_Node_Expression{ protected $index; public function __construct(array$elements,$lineno){parent::__construct($elements,array(),$lineno);$this->index=-1;foreach($this->getKeyValuePairs() as $pair){if($pair['key'] instanceof Twig_Node_Expression_Constant&&ctype_digit((string)$pair['key']->getAttribute('value'))&&$pair['key']->getAttribute('value')>$this->index){$this->index=$pair['key']->getAttribute('value');}}} public function getKeyValuePairs(){$pairs=array();foreach(array_chunk($this->nodes,2) as $pair){$pairs[]=array('key'=>$pair[0],'value'=>$pair[1],);}return $pairs;} public function hasElement(Twig_Node_Expression$key){foreach($this->getKeyValuePairs() as $pair){if((string)$key==(string)$pair['key']){return true;}}return false;} public function addElement(Twig_Node_Expression$value,Twig_Node_Expression$key=null){if(null===$key){$key=new Twig_Node_Expression_Constant(++$this->index,$value->getLine());}array_push($this->nodes,$key,$value);} public function compile(Twig_Compiler$compiler){$compiler->raw('array(');$first=true;foreach($this->getKeyValuePairs() as $pair){if(!$first){$compiler->raw(', ');}$first=false;$compiler->subcompile($pair['key'])->raw(' => ')->subcompile($pair['value']);}$compiler->raw(')');}} interface Twig_TemplateInterface{const ANY_CALL='any';const ARRAY_CALL='array';const METHOD_CALL='method';function render(array$context);function display(array$context,array$blocks=array());function getEnvironment();}class Twig_Node_Expression_Constant extends Twig_Node_Expression{ public function __construct($value,$lineno){parent::__construct(array(),array('value'=>$value),$lineno);} public function compile(Twig_Compiler$compiler){$compiler->repr($this->getAttribute('value'));}}class Twig_Node_Expression_GetAttr extends Twig_Node_Expression{ public function __construct(Twig_Node_Expression$node,Twig_Node_Expression$attribute,Twig_Node_Expression_Array$arguments,$type,$lineno){parent::__construct(array('node'=>$node,'attribute'=>$attribute,'arguments'=>$arguments),array('type'=>$type,'is_defined_test'=>false,'ignore_strict_check'=>false),$lineno);} public function compile(Twig_Compiler$compiler){if(function_exists('twig_template_get_attributes')){$compiler->raw('twig_template_get_attributes($this, ');}else {$compiler->raw('$this->getAttribute(');}if($this->getAttribute('ignore_strict_check')){$this->getNode('node')->setAttribute('ignore_strict_check',true);}$compiler->subcompile($this->getNode('node'));$compiler->raw(', ')->subcompile($this->getNode('attribute'));if(count($this->getNode('arguments'))||Twig_TemplateInterface::ANY_CALL!==$this->getAttribute('type')||$this->getAttribute('is_defined_test')||$this->getAttribute('ignore_strict_check')){$compiler->raw(', ')->subcompile($this->getNode('arguments'));if(Twig_TemplateInterface::ANY_CALL!==$this->getAttribute('type')||$this->getAttribute('is_defined_test')||$this->getAttribute('ignore_strict_check')){$compiler->raw(', ')->repr($this->getAttribute('type'));}if($this->getAttribute('is_defined_test')||$this->getAttribute('ignore_strict_check')){$compiler->raw(', '.($this->getAttribute('is_defined_test')?'true':'false'));}if($this->getAttribute('ignore_strict_check')){$compiler->raw(', '.($this->getAttribute('ignore_strict_check')?'true':'false'));}}$compiler->raw(')');}}class Twig_Node_Expression_Conditional extends Twig_Node_Expression{ public function __construct(Twig_Node_Expression$expr1,Twig_Node_Expression$expr2,Twig_Node_Expression$expr3,$lineno){parent::__construct(array('expr1'=>$expr1,'expr2'=>$expr2,'expr3'=>$expr3),array(),$lineno);} public function compile(Twig_Compiler$compiler){$compiler->raw('((')->subcompile($this->getNode('expr1'))->raw(') ? (')->subcompile($this->getNode('expr2'))->raw(') : (')->subcompile($this->getNode('expr3'))->raw('))');}}class Twig_Node_Print extends Twig_Node implements Twig_NodeOutputInterface{ public function __construct(Twig_Node_Expression$expr,$lineno,$tag=null){parent::__construct(array('expr'=>$expr),array(),$lineno,$tag);} public function compile(Twig_Compiler$compiler){$compiler->addDebugInfo($this)->write('echo ')->subcompile($this->getNode('expr'))->raw(";\n");}}class Twig_Node_Module extends Twig_Node{ public function __construct(Twig_NodeInterface$body,Twig_Node_Expression$parent=null,Twig_NodeInterface$blocks,Twig_NodeInterface$macros,Twig_NodeInterface$traits,$embeddedTemplates,$filename){parent::__construct(array('parent'=>$parent,'body'=>$body,'blocks'=>$blocks,'macros'=>$macros,'traits'=>$traits),array('filename'=>$filename,'index'=>null,'embedded_templates'=>$embeddedTemplates),1);} public function setIndex($index){$this->setAttribute('index',$index);} public function compile(Twig_Compiler$compiler){$this->compileTemplate($compiler);foreach($this->getAttribute('embedded_templates') as $template){$compiler->subcompile($template);}} protected function compileTemplate(Twig_Compiler$compiler){if(!$this->getAttribute('index')){$compiler->write('');}$this->compileClassHeader($compiler);if(count($this->getNode('blocks'))||count($this->getNode('traits'))||null===$this->getNode('parent')||$this->getNode('parent') instanceof Twig_Node_Expression_Constant){$this->compileConstructor($compiler);}$this->compileGetParent($compiler);$this->compileDisplayHeader($compiler);$this->compileDisplayBody($compiler);$this->compileDisplayFooter($compiler);$compiler->subcompile($this->getNode('blocks'));$this->compileMacros($compiler);$this->compileGetTemplateName($compiler);$this->compileIsTraitable($compiler);$this->compileDebugInfo($compiler);$this->compileClassFooter($compiler);} protected function compileGetParent(Twig_Compiler$compiler){if(null===$this->getNode('parent')){return;}$compiler->write("protected function doGetParent(array \$context)\n","{\n")->indent()->write("return ");if($this->getNode('parent') instanceof Twig_Node_Expression_Constant){$compiler->subcompile($this->getNode('parent'));}else {$compiler->raw("\$this->env->resolveTemplate(")->subcompile($this->getNode('parent'))->raw(")");}$compiler->raw(";\n")->outdent()->write("}\n\n");} protected function compileDisplayBody(Twig_Compiler$compiler){$compiler->subcompile($this->getNode('body'));if(null!==$this->getNode('parent')){if($this->getNode('parent') instanceof Twig_Node_Expression_Constant){$compiler->write("\$this->parent");}else {$compiler->write("\$this->getParent(\$context)");}$compiler->raw("->display(\$context, array_merge(\$this->blocks, \$blocks));\n");}} protected function compileClassHeader(Twig_Compiler$compiler){$compiler->write("\n\n")->write("/* ".str_replace('*/','* /',$this->getAttribute('filename'))." */\n")->write('class '.$compiler->getEnvironment()->getTemplateClass($this->getAttribute('filename'),$this->getAttribute('index')))->raw(sprintf(" extends %s\n",$compiler->getEnvironment()->getBaseTemplateClass()))->write("{\n")->indent();} protected function compileConstructor(Twig_Compiler$compiler){$compiler->write("public function __construct(Twig_Environment \$env)\n","{\n")->indent()->write("parent::__construct(\$env);\n\n");if(null===$this->getNode('parent')){$compiler->write("\$this->parent = false;\n\n");}elseif($this->getNode('parent') instanceof Twig_Node_Expression_Constant){$compiler->write("\$this->parent = \$this->env->loadTemplate(")->subcompile($this->getNode('parent'))->raw(");\n\n");}$countTraits=count($this->getNode('traits'));if($countTraits){foreach($this->getNode('traits') as $i=>$trait){$this->compileLoadTemplate($compiler,$trait->getNode('template'),sprintf('$_trait_%s',$i));$compiler->addDebugInfo($trait->getNode('template'))->write(sprintf("if (!\$_trait_%s->isTraitable()) {\n",$i))->indent()->write("throw new Twig_Error_Runtime('Template \"'.")->subcompile($trait->getNode('template'))->raw(".'\" cannot be used as a trait.');\n")->outdent()->write("}\n")->write(sprintf("\$_trait_%s_blocks = \$_trait_%s->getBlocks();\n\n",$i,$i));foreach($trait->getNode('targets') as $key=>$value){$compiler->write(sprintf("\$_trait_%s_blocks[",$i))->subcompile($value)->raw(sprintf("] = \$_trait_%s_blocks[",$i))->string($key)->raw(sprintf("]; unset(\$_trait_%s_blocks[",$i))->string($key)->raw("]);\n\n");}}if($countTraits>1){$compiler->write("\$this->traits = array_merge(\n")->indent();for($i=0;$i<$countTraits;$i++){$compiler->write(sprintf("\$_trait_%s_blocks".($i==$countTraits-1?'':',')."\n",$i));}$compiler->outdent()->write(");\n\n");}else {$compiler->write("\$this->traits = \$_trait_0_blocks;\n\n");}$compiler->write("\$this->blocks = array_merge(\n")->indent()->write("\$this->traits,\n")->write("array(\n");}else {$compiler->write("\$this->blocks = array(\n");}$compiler->indent();foreach($this->getNode('blocks') as $name=>$node){$compiler->write(sprintf("'%s' => array(\$this, 'block_%s'),\n",$name,$name));}if($countTraits){$compiler->outdent()->write(")\n");}$compiler->outdent()->write(");\n")->outdent()->write("}\n\n");;} protected function compileDisplayHeader(Twig_Compiler$compiler){$compiler->write("protected function doDisplay(array \$context, array \$blocks = array())\n","{\n")->indent();} protected function compileDisplayFooter(Twig_Compiler$compiler){$compiler->outdent()->write("}\n\n");} protected function compileClassFooter(Twig_Compiler$compiler){$compiler->outdent()->write("}\n");} protected function compileMacros(Twig_Compiler$compiler){$compiler->subcompile($this->getNode('macros'));} protected function compileGetTemplateName(Twig_Compiler$compiler){$compiler->write("public function getTemplateName()\n","{\n")->indent()->write('return ')->repr($this->getAttribute('filename'))->raw(";\n")->outdent()->write("}\n\n");} protected function compileIsTraitable(Twig_Compiler$compiler){$traitable=null===$this->getNode('parent')&&0===count($this->getNode('macros'));if($traitable){if($this->getNode('body') instanceof Twig_Node_Body){$nodes=$this->getNode('body')->getNode(0);}else {$nodes=$this->getNode('body');}if(!count($nodes)){$nodes=new Twig_Node(array($nodes));}foreach($nodes as $node){if(!count($node)){continue;}if($node instanceof Twig_Node_Text&&ctype_space($node->getAttribute('data'))){continue;}if($node instanceof Twig_Node_BlockReference){continue;}$traitable=false;break;}}if($traitable){return;}$compiler->write("public function isTraitable()\n","{\n")->indent()->write(sprintf("return %s;\n",$traitable?'true':'false'))->outdent()->write("}\n\n");} protected function compileDebugInfo(Twig_Compiler$compiler){$compiler->write("public function getDebugInfo()\n","{\n")->indent()->write(sprintf("return %s;\n",str_replace("\n",'',var_export(array_reverse($compiler->getDebugInfo(),true),true))))->outdent()->write("}\n");} protected function compileLoadTemplate(Twig_Compiler$compiler,$node,$var){if($node instanceof Twig_Node_Expression_Constant){$compiler->write(sprintf("%s = \$this->env->loadTemplate(",$var))->subcompile($node)->raw(");\n");}else {$compiler->write(sprintf("%s = ",$var))->subcompile($node)->raw(";\n")->write(sprintf("if (!%s",$var))->raw(" instanceof Twig_Template) {\n")->indent()->write(sprintf("%s = \$this->env->loadTemplate(%s);\n",$var,$var))->outdent()->write("}\n");}}}class Twig_Node_Body extends Twig_Node{}class Twig_NodeTraverser{ protected $env; protected $visitors; public function __construct(Twig_Environment$env,array$visitors=array()){$this->env=$env;$this->visitors=array();foreach($visitors as $visitor){$this->addVisitor($visitor);}} public function addVisitor(Twig_NodeVisitorInterface$visitor){if(!isset($this->visitors[$visitor->getPriority()])){$this->visitors[$visitor->getPriority()]=array();}$this->visitors[$visitor->getPriority()][]=$visitor;} public function traverse(Twig_NodeInterface$node){ksort($this->visitors);foreach($this->visitors as $visitors){foreach($visitors as $visitor){$node=$this->traverseForVisitor($visitor,$node);}}return $node;} protected function traverseForVisitor(Twig_NodeVisitorInterface$visitor,Twig_NodeInterface$node=null){if(null===$node){return null;}$node=$visitor->enterNode($node,$this->env);foreach($node as $k=>$n){if(false!==$n=$this->traverseForVisitor($visitor,$n)){$node->setNode($k,$n);}else {$node->removeNode($k);}}return $visitor->leaveNode($node,$this->env);}}class Twig_Compiler implements Twig_CompilerInterface{ protected $lastLine; protected $source; protected $indentation; protected $env; protected $debugInfo; protected $sourceOffset; protected $sourceLine; public function __construct(Twig_Environment$env){$this->env=$env;$this->debugInfo=array();} public function getEnvironment(){return $this->env;} public function getSource(){return $this->source;} public function compile(Twig_NodeInterface$node,$indentation=0){$this->lastLine=null;$this->source='';$this->sourceOffset=0;$this->sourceLine=0;$this->indentation=$indentation;$node->compile($this);return $this;} public function subcompile(Twig_NodeInterface$node,$raw=true){if(false===$raw){$this->addIndentation();}$node->compile($this);return $this;} public function raw($string){$this->source.=$string;return $this;} public function write(){$strings=func_get_args();foreach($strings as $string){$this->addIndentation();$this->source.=$string;}return $this;} public function addIndentation(){$this->source.=str_repeat(' ',$this->indentation*4);return $this;} public function string($value){$this->source.=sprintf('"%s"',addcslashes($value,"\0\t\"\$\\"));return $this;} public function repr($value){if(is_int($value)||is_float($value)){if(false!==$locale=setlocale(LC_NUMERIC,0)){setlocale(LC_NUMERIC,'C');}$this->raw($value);if(false!==$locale){setlocale(LC_NUMERIC,$locale);}}elseif(null===$value){$this->raw('null');}elseif(is_bool($value)){$this->raw($value?'true':'false');}elseif(is_array($value)){$this->raw('array(');$i=0;foreach($value as $key=>$value){if($i++){$this->raw(', ');}$this->repr($key);$this->raw(' => ');$this->repr($value);}$this->raw(')');}else {$this->string($value);}return $this;} public function addDebugInfo(Twig_NodeInterface$node){if($node->getLine()!=$this->lastLine){if(((int)ini_get('mbstring.func_overload'))&2){$this->sourceLine+=mb_substr_count(mb_substr($this->source,$this->sourceOffset),"\n");}else {$this->sourceLine+=substr_count($this->source,"\n",$this->sourceOffset);}$this->sourceOffset=strlen($this->source);$this->debugInfo[$this->sourceLine]=$node->getLine();$this->lastLine=$node->getLine();$this->write("// line {$node->getLine()}\n");}return $this;} public function getDebugInfo(){return $this->debugInfo;} public function indent($step=1){$this->indentation+=$step;return $this;} public function outdent($step=1){if($this->indentation<$step){ throw new Twig_Error('Unable to call outdent() as the indentation would become negative');}$this->indentation-=$step;return $this;}} interface Twig_CompilerInterface{function compile(Twig_NodeInterface$node);function getSource();}abstract class Twig_Filter implements Twig_FilterInterface{ protected $options; protected $arguments=array(); public function __construct(array$options=array()){$this->options=array_merge(array('needs_environment'=>false,'needs_context'=>false,'pre_escape'=>null,'preserves_safety'=>null,),$options);} public function setArguments($arguments){$this->arguments=$arguments;} public function getArguments(){return $this->arguments;} public function needsEnvironment(){return $this->options['needs_environment'];} public function needsContext(){return $this->options['needs_context'];} public function getSafe(Twig_Node$filterArgs){if(isset($this->options['is_safe'])){return $this->options['is_safe'];}if(isset($this->options['is_safe_callback'])){return call_user_func($this->options['is_safe_callback'],$filterArgs);}return null;} public function getPreservesSafety(){return $this->options['preserves_safety'];} public function getPreEscape(){return $this->options['pre_escape'];}}class Twig_Filter_Function extends Twig_Filter{ protected $function; public function __construct($function,array$options=array()){parent::__construct($options);$this->function=$function;} public function compile(){return $this->function;}} interface Twig_FilterInterface{function compile();function needsEnvironment();function needsContext();function getSafe(Twig_Node$filterArgs);function getPreservesSafety();function getPreEscape();function setArguments($arguments);function getArguments();}class Twig_Filter_Node extends Twig_Filter{ protected $class; public function __construct($class,array$options=array()){parent::__construct($options);$this->class=$class;} public function getClass(){return $this->class;} public function compile(){}}abstract class Twig_Template implements Twig_TemplateInterface{static protected $cache=array(); protected $parent; protected $parents; protected $env; protected $blocks; protected $traits; public function __construct(Twig_Environment$env){$this->env=$env;$this->blocks=array();$this->traits=array();}abstract public function getTemplateName(); public function getEnvironment(){return $this->env;} public function getParent(array$context){if(null!==$this->parent){return $this->parent;}$parent=$this->doGetParent($context);if(false===$parent){return false;}elseif($parent instanceof Twig_Template){$name=$parent->getTemplateName();$this->parents[$name]=$parent;$parent=$name;}elseif(!isset($this->parents[$parent])){$this->parents[$parent]=$this->env->loadTemplate($parent);}return $this->parents[$parent];} protected function doGetParent(array$context){return false;} public function isTraitable(){return true;} public function displayParentBlock($name,array$context,array$blocks=array()){$name=(string)$name;if(isset($this->traits[$name])){$this->traits[$name][0]->displayBlock($name,$context,$blocks);}elseif(false!==$parent=$this->getParent($context)){$parent->displayBlock($name,$context,$blocks);}else { throw new Twig_Error_Runtime(sprintf('The template has no parent and no traits defining the "%s" block',$name),-1,$this->getTemplateName());}} public function displayBlock($name,array$context,array$blocks=array()){$name=(string)$name;if(isset($blocks[$name])){$b=$blocks;unset($b[$name]);call_user_func($blocks[$name],$context,$b);}elseif(isset($this->blocks[$name])){call_user_func($this->blocks[$name],$context,$blocks);}elseif(false!==$parent=$this->getParent($context)){$parent->displayBlock($name,$context,array_merge($this->blocks,$blocks));}} public function renderParentBlock($name,array$context,array$blocks=array()){ob_start();$this->displayParentBlock($name,$context,$blocks);return ob_get_clean();} public function renderBlock($name,array$context,array$blocks=array()){ob_start();$this->displayBlock($name,$context,$blocks);return ob_get_clean();} public function hasBlock($name){return isset($this->blocks[(string)$name]);} public function getBlockNames(){return array_keys($this->blocks);} public function getBlocks(){return $this->blocks;} public function display(array$context,array$blocks=array()){$this->displayWithErrorHandling($this->env->mergeGlobals($context),$blocks);} public function render(array$context){$level=ob_get_level();ob_start();try{$this->display($context);}catch(Exception$e){while(ob_get_level()>$level){ob_end_clean();} throw $e;}return ob_get_clean();} protected function displayWithErrorHandling(array$context,array$blocks=array()){try{$this->doDisplay($context,$blocks);}catch(Twig_Error$e){ throw $e;}catch(Exception$e){ throw new Twig_Error_Runtime(sprintf('An exception has been thrown during the rendering of a template ("%s").',$e->getMessage()),-1,null,$e);}}abstract protected function doDisplay(array$context,array$blocks=array());final protected function getContext($context,$item,$ignoreStrictCheck=false){if(!array_key_exists($item,$context)){if($ignoreStrictCheck||!$this->env->isStrictVariables()){return null;} throw new Twig_Error_Runtime(sprintf('Variable "%s" does not exist',$item));}return $context[$item];} protected function getAttribute($object,$item,array$arguments=array(),$type=Twig_TemplateInterface::ANY_CALL,$isDefinedTest=false,$ignoreStrictCheck=false){$item=ctype_digit((string)$item)?(int)$item:(string)$item;if(Twig_TemplateInterface::METHOD_CALL!==$type){if((is_array($object)&&array_key_exists($item,$object))||($object instanceof ArrayAccess&&isset($object[$item]))){if($isDefinedTest){return true;}return $object[$item];}if(Twig_TemplateInterface::ARRAY_CALL===$type){if($isDefinedTest){return false;}if($ignoreStrictCheck||!$this->env->isStrictVariables()){return null;}if(is_object($object)){ throw new Twig_Error_Runtime(sprintf('Key "%s" in object (with ArrayAccess) of type "%s" does not exist',$item,get_class($object)));}elseif(is_array($object)){ throw new Twig_Error_Runtime(sprintf('Key "%s" for array with keys "%s" does not exist',$item,implode(', ',array_keys($object))));}else { throw new Twig_Error_Runtime(sprintf('Impossible to access a key ("%s") on a "%s" variable',$item,gettype($object)));}}}if(!is_object($object)){if($isDefinedTest){return false;}if($ignoreStrictCheck||!$this->env->isStrictVariables()){return null;} throw new Twig_Error_Runtime(sprintf('Item "%s" for "%s" does not exist',$item,is_array($object)?'Array':$object));}$class=get_class($object);if(Twig_TemplateInterface::METHOD_CALL!==$type){if(isset($object->$item)||array_key_exists($item,$object)){if($isDefinedTest){return true;}if($this->env->hasExtension('sandbox')){$this->env->getExtension('sandbox')->checkPropertyAllowed($object,$item);}return $object->$item;}}if(!isset(self::$cache[$class]['methods'])){self::$cache[$class]['methods']=array_change_key_case(array_flip(get_class_methods($object)));}$lcItem=strtolower($item);if(isset(self::$cache[$class]['methods'][$lcItem])){$method=$item;}elseif(isset(self::$cache[$class]['methods']['get'.$lcItem])){$method='get'.$item;}elseif(isset(self::$cache[$class]['methods']['is'.$lcItem])){$method='is'.$item;}elseif(isset(self::$cache[$class]['methods']['__call'])){$method=$item;}else {if($isDefinedTest){return false;}if($ignoreStrictCheck||!$this->env->isStrictVariables()){return null;} throw new Twig_Error_Runtime(sprintf('Method "%s" for object "%s" does not exist',$item,get_class($object)));}if($isDefinedTest){return true;}if($this->env->hasExtension('sandbox')){$this->env->getExtension('sandbox')->checkMethodAllowed($object,$method);}$ret=call_user_func_array(array($object,$method),$arguments);if($object instanceof Twig_TemplateInterface){return $ret===''?'':new Twig_Markup($ret,$this->env->getCharset());}return $ret;}static public function clearCache(){self::$cache=array();}}