From f70295eb90b07a6678706c334f4c3b704e2862ab Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C3=98yvind=20gjesdal?= <oyvind@localhost.localdomain>
Date: Tue, 27 Oct 2020 13:38:09 +0100
Subject: [PATCH] add new Hangaa version

---
 classes/Utils.php                             |    6 +-
 classes/modules/staticModule.php              |    7 +-
 lib/Haanga/lib/Haanga.php                     |   68 +-
 lib/Haanga/lib/Haanga/AST.php                 |    8 +-
 lib/Haanga/lib/Haanga/Compiler.php            |  125 +-
 lib/Haanga/lib/Haanga/Compiler/Parser.php     | 1919 +++++++++--------
 lib/Haanga/lib/Haanga/Compiler/Parser.y       |   35 +-
 lib/Haanga/lib/Haanga/Compiler/Runtime.php    |    4 +-
 lib/Haanga/lib/Haanga/Compiler/Tokenizer.php  |   22 +-
 .../lib/Haanga/Extension/Filter/Count.php     |    2 +-
 .../lib/Haanga/Extension/Filter/Date.php      |    3 +-
 .../Extension/Filter/Decodedescription.php    |   29 +-
 .../Haanga/Extension/Filter/Divisibleby.php   |   10 +
 .../lib/Haanga/Extension/Filter/Explode.php   |    9 +-
 .../lib/Haanga/Extension/Filter/Json.php      |    6 +
 .../Haanga/Extension/Filter/Linebreaksbr.php  |   10 +
 .../Haanga/Extension/Filter/old-Length.php    |   32 +
 lib/Haanga/lib/Haanga/Extension/Tag/Exec.php  |    2 +-
 .../lib/Haanga/Extension/Tag/Inline.php       |    2 +-
 .../lib/Haanga/Extension/Tag/Tryinclude.php   |    2 +-
 lib/Haanga/lib/Haanga/Generator/PHP.php       |    8 +-
 lib/Haanga/lib/Haanga/Loader.php              |  133 ++
 utils/install-https                           |   72 +
 23 files changed, 1474 insertions(+), 1040 deletions(-)
 create mode 100755 lib/Haanga/lib/Haanga/Extension/Filter/Divisibleby.php
 create mode 100644 lib/Haanga/lib/Haanga/Extension/Filter/Json.php
 create mode 100644 lib/Haanga/lib/Haanga/Extension/Filter/Linebreaksbr.php
 create mode 100644 lib/Haanga/lib/Haanga/Extension/Filter/old-Length.php
 create mode 100644 lib/Haanga/lib/Haanga/Loader.php
 create mode 100644 utils/install-https

diff --git a/classes/Utils.php b/classes/Utils.php
index 28c0be87..0899f134 100644
--- a/classes/Utils.php
+++ b/classes/Utils.php
@@ -216,9 +216,9 @@ class Utils{
   	case 'json':
   	  $ser = ARC2::getRDFJSONSerializer();
   	  break;
-        case 'jsonp':
-          $ser = ARC2::getRDFJSONSerializer();
-          break;
+      case 'jsonp':
+        $ser = ARC2::getRDFJSONSerializer();
+        break;
   	case 'rdf':
   	  $ser = ARC2::getRDFXMLSerializer();
   	  break;
diff --git a/classes/modules/staticModule.php b/classes/modules/staticModule.php
index 69a5501d..2b2efcd4 100644
--- a/classes/modules/staticModule.php
+++ b/classes/modules/staticModule.php
@@ -24,8 +24,9 @@ class StaticModule extends abstractModule{
   	global $uri;
   	global $acceptContentType;
   	global $endpoints;
-  	global $lodspk;  	
-  	$extension = array_pop(explode(".", $file));
+  	global $lodspk;  
+      $filenamearray =explode(".",$file);
+  	$extension = end($filenamearray);
   	$ct = $this->getContentType($extension);
   	header("Content-type: ".$ct);
   	$uri = $localUri;
@@ -62,7 +63,7 @@ class StaticModule extends abstractModule{
                           'js'   => 'application/javascript',
                           'json' => 'application/json',
                           'jsonp'=> 'application/javascript',
-			  'nt'   => 'text/plain',
+			              'nt'   => 'text/plain',
                           'ttl'  => 'text/turtle',
                           'png'  => 'image/png',
                           'jpg'  => 'image/jpeg',
diff --git a/lib/Haanga/lib/Haanga.php b/lib/Haanga/lib/Haanga.php
index 8ae8423d..bc52e3c7 100644
--- a/lib/Haanga/lib/Haanga.php
+++ b/lib/Haanga/lib/Haanga.php
@@ -37,7 +37,7 @@
 
 if (!defined('HAANGA_VERSION')) {
     /* anyone can override this value to force recompilation */
-    define('HAANGA_VERSION', '1.0.4');
+    define('HAANGA_VERSION', '1.0.7');
 }
 
 
@@ -53,7 +53,7 @@ if (!defined('HAANGA_VERSION')) {
 class Haanga
 {
     protected static $cache_dir;
-    protected static $templates_dir='.';
+    protected static $templates_dir=array('.');
     protected static $debug;
     protected static $bootstrap = NULL;
     protected static $check_ttl;
@@ -70,26 +70,6 @@ class Haanga
         /* The class can't be instanced */
     }
 
-    final public static function AutoLoad($class)
-    {
-        static $loaded = array();
-        static $path;
-
-        if (!isset($loaded[$class]) && substr($class, 0, 6) === 'Haanga' && !class_exists($class, false)) {
-            if ($path === NULL) {
-                $path = dirname(__FILE__);
-            }
-            $file = $path.DIRECTORY_SEPARATOR.str_replace('_', DIRECTORY_SEPARATOR, $class).'.php';
-            if (is_file($file)) {
-                require $file;
-            }
-            $loaded[$class] = TRUE;
-            return;
-        }
-
-        return FALSE;
-    }
-
     public static function getTemplateDir()
     {
         return self::$templates_dir; 
@@ -121,7 +101,7 @@ class Haanga
         		self::$cache_dir = $value;
                 break;
             case 'template_dir':
-        		self::$templates_dir = $value;
+        		self::$templates_dir = (Array)$value;
                 break;
             case 'bootstrap':
                 if (is_callable($value)) {
@@ -225,7 +205,7 @@ class Haanga
 
             /* load compiler (done just once) */
             if (self::$use_autoload) {
-                spl_autoload_register(array(__CLASS__, 'AutoLoad'));
+                require_once "{$dir}/Haanga/Loader.php";
             }
 
             $compiler = new Haanga_Compiler_Runtime;
@@ -272,16 +252,27 @@ class Haanga
 
         $code = $compiler->compile($tpl);
 
-        return create_function('$vars=array(), $return=TRUE, $blocks=array()', $code);
+        return create_function('$' . $compiler->getScopeVariable(NULL, TRUE) . '=array(), $return=TRUE, $blocks=array()', $code);
     }
     // }}}
 
+    public static function getTemplatePath($file)
+    {
+        foreach (self::$templates_dir as $dir) {
+            $tpl = $dir .'/'.$file;
+            if (is_file($tpl)) {
+                return realpath($tpl);
+            }
+        }
+        throw new \RuntimeException("Cannot find {$file} file  (looked in " . implode(",", self::$templates_dir) . ")");
+    }
+
     // safe_load(string $file, array $vars, bool $return, array $blocks) {{{
     public static function Safe_Load($file, $vars = array(), $return=FALSE, $blocks=array())
     {
         try {
 
-            $tpl = self::$templates_dir.'/'.$file;
+            $tpl = self::getTemplatePath($file);
             if (file_exists($tpl)) {
                 /* call load if the tpl file exists */
                 return self::Load($file, $vars, $return, $blocks);
@@ -318,7 +309,7 @@ class Haanga
 
         self::$has_compiled = FALSE;
 
-        $tpl      = self::$templates_dir.'/'.$file;
+        $tpl      = self::getTemplatePath($file);
         $fnc      = sha1($tpl);
         $callback = "haanga_".$fnc;
 
@@ -340,9 +331,10 @@ class Haanga
                 $result = call_user_func(self::$check_set, $callback, TRUE, self::$check_ttl);
             }
         } 
-        
-        if (!is_file($php) || ($check && filemtime($tpl) > filemtime($php))) {
 
+        $mtpl = filemtime($tpl);
+        
+        if (!is_file($php) || ($check && $mtpl > filemtime($php))) {
             if (!is_file($tpl)) {
                 /* There is no template nor compiled file */
                 throw new Exception("View {$file} doesn't exists");
@@ -404,6 +396,7 @@ class Haanga
                 fwrite($fp, "<?php".$code);
                 flock($fp, LOCK_UN); // release the lock
                 fclose($fp);
+                touch($php, $mtpl, $mtpl);
             } else {
                 /* local eval */
                 eval($code);
@@ -419,10 +412,21 @@ class Haanga
                 /* 
                    really weird case ($php is empty, another process is compiling
                    the $tpl for the first time), so create a lambda function
-                   for the template
+                   for the template.
+
+                   To be safe we're invalidating its time, because its content 
+                   is no longer valid to us
                  */
-                $lambda= self::compile(file_get_contents($tpl), $vars);
-                return $lambda($vars, $return, $blocks);
+                touch($php, 300, 300);
+                chmod($php, 0777);
+            
+                
+                // compile temporarily
+                $compiler = self::getCompiler();
+                $code = $compiler->compile_file($tpl, FALSE, $vars);
+                eval($code);
+
+                return $callback($vars, $return, $blocks);
             }
         }
 
diff --git a/lib/Haanga/lib/Haanga/AST.php b/lib/Haanga/lib/Haanga/AST.php
index 22d7b3bb..d745b2ed 100644
--- a/lib/Haanga/lib/Haanga/AST.php
+++ b/lib/Haanga/lib/Haanga/AST.php
@@ -236,7 +236,7 @@ class Haanga_AST
         } else if ($obj === TRUE) {
             $value = array('expr' => TRUE);
         } else if (is_array($obj)) {
-            foreach (array('exec', 'var', 'string', 'number', 'constant') as $type) {
+            foreach (array('expr_cond', 'op_expr', 'exec', 'var', 'string', 'number', 'constant') as $type) {
                 if (isset($obj[$type])) {
                     $value = $obj;
                     return;
@@ -299,6 +299,9 @@ class Haanga_AST
             if (is_object($var1)) {
                 $var1 = $var1->getArray();
             }
+            if (empty($var1['var'])) {
+                throw new Exception("Can't iterate, apparently $var isn't a variable");
+            }
             $var1 = $var1['var'];
         }
         $def = array('op' => 'foreach', 'array' => $array, 'value' => $value);
@@ -528,6 +531,9 @@ function hvar()
 function hvar_ex($args)
 {
     $code = hcode();
+    if (is_object($args)) {
+        return $args->stack[0];
+    }
     return call_user_func_array(array($code, 'v'), $args);
 }
 // }}}
diff --git a/lib/Haanga/lib/Haanga/Compiler.php b/lib/Haanga/lib/Haanga/Compiler.php
index 0f8daa3f..f523bae0 100644
--- a/lib/Haanga/lib/Haanga/Compiler.php
+++ b/lib/Haanga/lib/Haanga/Compiler.php
@@ -100,6 +100,24 @@ class Haanga_Compiler
         }
     }
 
+    public function getScopeVariable($part = NULL, $string = FALSE) 
+    {
+        static $var = NULL;
+
+        if ($var === NULL) {
+            $var = 'vars' . uniqid(true);
+        }
+
+        if ($string) {
+            return $var;
+        }
+
+        if ($part !== NULL) {
+            return hvar($var, $part);
+        }
+        return hvar($var);
+    }
+
     // getOption($option) {{{
     public static function getOption($option)
     {
@@ -269,7 +287,7 @@ class Haanga_Compiler
         }
 
 
-        $body->do_exec('extract', hvar('vars'));
+        $body->do_exec('extract', $this->getScopeVariable());
         $body->do_if(hexpr(hvar('return'), '==', TRUE));
         $body->do_exec('ob_start');
         $body->do_endif();
@@ -300,7 +318,7 @@ class Haanga_Compiler
         $op_code = $body->getArray(TRUE);
 
 
-        $code   .= $this->generator->getCode($op_code);
+        $code   .= $this->generator->getCode($op_code, $this->getScopeVariable(NULL, TRUE));
         if (!empty($this->append)) {
             $code .= $this->append;
         }
@@ -334,7 +352,11 @@ class Haanga_Compiler
         $this->check_function = $safe;
         $this->context        = $context;
         $name                 = $this->set_template_name($file);
-        return $this->compile(file_get_contents($file), $name, $file);
+        try {
+            return $this->compile(file_get_contents($file), $name, $file);
+        } catch (Exception $e) {
+            $this->Error((string)$e);
+        }
     }
     // }}}
 
@@ -356,7 +378,7 @@ class Haanga_Compiler
         $parsed = Haanga_Compiler_Tokenizer::init($code, $this, $file);
         $body = new Haanga_AST;
         if (isset($parsed[0]) && $parsed[0]['operation'] == 'base') {
-            $this->Error("{% base is not supported on inlines %}");
+            throw new Exception("{% base is not supported on inlines %}");
         }
         $body = new Haanga_AST;
         $this->generate_op_code($parsed, $body);
@@ -395,7 +417,7 @@ class Haanga_Compiler
     {
         return hexec(
             $this->get_function_name($this->subtemplate),
-            hvar('vars'), TRUE,
+            $this->getScopeVariable(), TRUE,
             hvar('blocks')
         );
     }
@@ -417,7 +439,7 @@ class Haanga_Compiler
     function get_base_template($base)
     {
         if (!Haanga_AST::is_str($base)) {
-            $this->Error("Dynamic inheritance is not supported for compilated templates");
+            throw new Exception("Dynamic inheritance is not supported for compilated templates");
         }
         $file = $base['string'];
         list($this->subtemplate, $new_code) = $this->compile_required_template($file);
@@ -428,7 +450,7 @@ class Haanga_Compiler
     // {% base "foo.html" %} {{{
     protected function generate_op_base()
     {
-        $this->Error("{% base %} can be only as first statement");
+        throw new Exception("{% base %} can be only as first statement");
     }
     // }}}
 
@@ -436,14 +458,14 @@ class Haanga_Compiler
     protected function generate_op_code($parsed, &$body)
     {
         if (!is_array($parsed)) {
-            $this->Error("Invalid \$parsed array");
+            throw new Exception("Invalid \$parsed array");
         }
         foreach ($parsed as $op) {
             if (!is_array($op)) {
                 continue;
             }
             if (!isset($op['operation'])) {
-                $this->Error("Malformed array:".print_r($op, TRUE));
+                throw new Exception("Malformed array:".print_r($op, TRUE));
             }
             if (isset($op['line'])) {
                 $this->line = $op['line'];
@@ -456,7 +478,7 @@ class Haanga_Compiler
 
             $method = "generate_op_".$op['operation'];
             if (!is_callable(array($this, $method))) {
-                $this->Error("Compiler: Missing method $method");
+                throw new Exception("Compiler: Missing method $method");
             }
             $this->$method($op, $body);
         }
@@ -556,7 +578,7 @@ class Haanga_Compiler
             }
         }
         if (!is_file($file)) {
-           $this->Error("can't find {$file} file template");
+           throw new Exception("can't find {$file} file template");
         }
         $class = get_class($this);
         $comp  = new  $class;
@@ -570,13 +592,13 @@ class Haanga_Compiler
     protected function generate_op_include($details, &$body)
     {
         if (!$details[0]['string']) {
-            $this->Error("Dynamic inheritance is not supported for compilated templates");
+            throw new Exception("Dynamic inheritance is not supported for compilated templates");
         }
         list($name,$code) = $this->compile_required_template($details[0]['string']);
         $this->append .= "\n\n{$code}";
         $this->do_print($body,
             hexec($this->get_function_name($name), 
-            hvar('vars'), TRUE, hvar('blocks'))
+            $this->getScopeVariable(), TRUE, hvar('blocks'))
         );
     }
     // }}}
@@ -619,20 +641,32 @@ class Haanga_Compiler
      *  @return expr  
      *
      */
-    function get_filtered_var($variable, &$varname, $accept_string=FALSE)
+    function get_filtered_var($variable, &$varname, $accept_string=NULL)
     {
         $this->var_is_safe = FALSE;
 
+        if ($accept_string === NULL && is_array($variable[0]) && 
+            !Haanga_AST::is_exec($variable[0])) {
+            $accept_string = !empty($variable[0]['string'])
+                || $variable[0][0] === 'block';
+        }
+
         if (count($variable) > 1) {
             $count  = count($variable);
-            $target = $this->generate_variable_name($variable[0]);
+            if ($accept_string && isset($variable[0]['string'])) {
+                $target = $variable[0];
+            } else if (Haanga_AST::is_exec($variable[0])) {
+                $target = $variable[0];
+            } else {
+                $target = $this->generate_variable_name($variable[0]);
+            }
             
-            if (!Haanga_AST::is_var($target)) {
+            if (!empty($variable[0][0]) && $variable[0][0] == 'block') {
                 /* block.super can't have any filter */
-                $this->Error("This variable can't have any filter");
+                throw new Exception("This variable can't have any filter");
             }
 
-            if ($this->isMethod($target['var'], $return)) {
+            if (!empty($target['var']) && $this->isMethod($target['var'], $return)) {
                 $target = $return;
             }
 
@@ -649,6 +683,10 @@ class Haanga_Compiler
             $varname = $args[0];
             $details = $exec;
         } else {
+            if (Haanga_AST::is_exec($variable[0])) {
+                return $variable[0];
+            } 
+
             $details = $this->generate_variable_name($variable[0]);
             $varname = $variable[0];
 
@@ -660,7 +698,7 @@ class Haanga_Compiler
                 /* generate_variable_name didn't replied a variable, weird case
                     currently just used for {{block.super}}.
                 */
-                $this->Error("Invalid variable name {$variable[0]}");
+                throw new Exception("Invalid variable name {$variable[0]}");
             }
         }
 
@@ -678,27 +716,16 @@ class Haanga_Compiler
      */
     protected function generate_op_print_var($details, &$body)
     {
+        $expr = $details['expr'];
+        $this->check_expr($expr);
 
-        $details = $this->get_filtered_var($details['variable'], $variable, TRUE);
 
-        if (!Haanga_AST::is_var($details) && !Haanga_AST::is_exec($details)) {
-            /* generate_variable_name didn't replied a variable, weird case
-                currently just used for {{block.super}}.
-            */
-            $this->do_print($body, $details);
-            return;
-        }
-
-        if (!$this->is_safe($details) && self::$autoescape) {
-            $args    = array($details);
-            $details = $this->do_filtering('escape', $args);
+        if (!$this->is_safe($expr) && self::$autoescape) {
+            $args    = array($expr);
+            $expr = $this->do_filtering('escape', $args);
         }
 
-
-        if (is_array($details)) {
-            $details = Haanga_AST::fromArrayGetAST($details);
-        }
-        $this->do_print($body, $details);
+        $this->do_print($body, $expr);
     }
     // }}}
 
@@ -724,7 +751,7 @@ class Haanga_Compiler
                     } elseif (isset($part['object'])) {
                         $name .= "{$part['object']}";
                     } else {
-                        $this->Error("Invalid blockname");
+                        throw new Exception("Invalid blockname");
                     }
                 }
                 $name .= ".";
@@ -863,10 +890,10 @@ class Haanga_Compiler
                             }
                             $var = &$var->$name;
                         } else {
-                            if (!isset($var->$part['object'])) {
+                            if (!isset($var->{$part['object']})) {
                                 return NULL;
                             }
-                            $var = &$var->$part['object'];
+                            $var = &$var->{$part['object']};
                         }
                     } else if (is_object($var)) {
                         if (!isset($var->$part)) {
@@ -926,7 +953,7 @@ class Haanga_Compiler
                     return array('var' => $variable);
                 }
                 if (!$this->forid) {
-                    $this->Error("Invalid forloop reference outside of a loop");
+                    throw new Exception("Invalid forloop reference outside of a loop");
                 }
 
                 switch ($variable[1]['object']) {
@@ -963,7 +990,7 @@ class Haanga_Compiler
                     $this->forid++;
                     break;
                 default:
-                    $this->Error("Unexpected forloop.{$variable[1]}");
+                    throw new Exception("Unexpected forloop.{$variable[1]}");
                 }
                 /* no need to escape it */
                 $this->var_is_safe = TRUE;
@@ -973,10 +1000,10 @@ class Haanga_Compiler
                     return array('var' => $variable);
                 }
                 if ($this->in_block == 0) {
-                    $this->Error("Can't use block.super outside a block");
+                    throw new Exception("Can't use block.super outside a block");
                 }
                 if (!$this->subtemplate) {
-                    $this->Error("Only subtemplates can call block.super");
+                    throw new Exception("Only subtemplates can call block.super");
                 }
                 /* no need to escape it */
                 $this->var_is_safe = TRUE;
@@ -1198,7 +1225,7 @@ class Haanga_Compiler
         $var = $this->generate_variable_name($details['var']);
         $this->check_expr($details['expr']);
         $body->decl_raw($var, $details['expr']);
-        $body->decl(hvar('vars', $var['var']), $var);
+        $body->decl($this->getScopeVariable($var['var']), $var);
     }
 
 
@@ -1224,7 +1251,7 @@ class Haanga_Compiler
             /* beauty :-) */
             foreach ($details['check'] as $id=>$type) {
                 if (!Haanga_AST::is_var($type)) {
-                    $this->Error("Unexpected string {$type['string']}, expected a varabile");
+                    throw new Exception("Unexpected string {$type['string']}, expected a varabile");
                 }
 
                 $this_expr = hexpr(hexpr(
@@ -1233,7 +1260,7 @@ class Haanga_Compiler
                 ));
 
                 if (isset($expr)) {
-                    $this_expr = hexpr($expr, '&&', $this_expr);
+                    $this_expr = hexpr($expr, '||', $this_expr);
                 }
 
                 $expr = $this_expr;
@@ -1331,7 +1358,7 @@ class Haanga_Compiler
                 $args = array_merge(array($target), $details['list']);
                 $exec = $tags->generator($tag_name, $this, $args);
                 if (!$exec InstanceOf Haanga_AST) {
-                    $this->Error("Invalid output of custom filter {$tag_name}");
+                    throw new Exception("Invalid output of custom filter {$tag_name}");
                 }
                 if ($exec->stack_size() >= 2 || $exec->doesPrint) {
                     /* 
@@ -1367,7 +1394,7 @@ class Haanga_Compiler
                     return;
                 }
             } else {
-                $this->Error("Invalid output of the custom tag {$tag_name}");
+                throw new Exception("Invalid output of the custom tag {$tag_name}");
             }
         } else {
             $fnc  = array_shift($args);
@@ -1425,7 +1452,7 @@ class Haanga_Compiler
         }
 
         if (!$filter->isValid($name)) {
-            $this->Error("{$name} is an invalid filter");
+            throw new Exception("{$name} is an invalid filter");
         }
 
         if ($filter->isSafe($name)) {
diff --git a/lib/Haanga/lib/Haanga/Compiler/Parser.php b/lib/Haanga/lib/Haanga/Compiler/Parser.php
index 9d16bb5f..4e0b9421 100644
--- a/lib/Haanga/lib/Haanga/Compiler/Parser.php
+++ b/lib/Haanga/lib/Haanga/Compiler/Parser.php
@@ -94,7 +94,7 @@ class Haanga_yyStackEntry
 };
 
 // code external to the class is included here
-#line 2 "Parser.y"
+#line 2 "lib/Haanga/Compiler/Parser.y"
 
 /*
   +---------------------------------------------------------------------------------+
@@ -131,15 +131,15 @@ class Haanga_yyStackEntry
   | Authors: César Rodas <crodas@php.net>                                           |
   +---------------------------------------------------------------------------------+
 */
-#line 136 "Parser.php"
+#line 136 "lib/Haanga/Compiler/Parser.php"
 
 // declare_class is output here
-#line 39 "Parser.y"
- class Haanga_Compiler_Parser #line 141 "Parser.php"
+#line 39 "lib/Haanga/Compiler/Parser.y"
+ class Haanga_Compiler_Parser #line 141 "lib/Haanga/Compiler/Parser.php"
 {
 /* First off, code is included which follows the "include_class" declaration
 ** in the input file. */
-#line 40 "Parser.y"
+#line 40 "lib/Haanga/Compiler/Parser.y"
 
     protected $lex;
     protected $file;
@@ -155,7 +155,7 @@ class Haanga_yyStackEntry
         throw new Haanga_Compiler_Exception($text.' in '.$this->file.':'.$this->lex->getLine());
     }
 
-#line 162 "Parser.php"
+#line 162 "lib/Haanga/Compiler/Parser.php"
 
 /* Next is all token values, as class constants
 */
@@ -170,69 +170,71 @@ class Haanga_yyStackEntry
     const T_NOT                          =  2;
     const T_AND                          =  3;
     const T_OR                           =  4;
-    const T_EQ                           =  5;
-    const T_NE                           =  6;
-    const T_GT                           =  7;
-    const T_GE                           =  8;
-    const T_LT                           =  9;
-    const T_LE                           = 10;
-    const T_IN                           = 11;
-    const T_PLUS                         = 12;
-    const T_MINUS                        = 13;
-    const T_CONCAT                       = 14;
-    const T_TIMES                        = 15;
-    const T_DIV                          = 16;
-    const T_MOD                          = 17;
-    const T_PIPE                         = 18;
-    const T_BITWISE                      = 19;
-    const T_HTML                         = 20;
-    const T_COMMENT                      = 21;
-    const T_PRINT_OPEN                   = 22;
-    const T_PRINT_CLOSE                  = 23;
-    const T_EXTENDS                      = 24;
-    const T_TAG_CLOSE                    = 25;
-    const T_INCLUDE                      = 26;
-    const T_AUTOESCAPE                   = 27;
-    const T_CUSTOM_END                   = 28;
-    const T_CUSTOM_TAG                   = 29;
-    const T_AS                           = 30;
-    const T_CUSTOM_BLOCK                 = 31;
-    const T_SPACEFULL                    = 32;
-    const T_WITH                         = 33;
-    const T_SET                          = 34;
-    const T_ASSIGN                       = 35;
-    const T_LOAD                         = 36;
-    const T_FOR                          = 37;
-    const T_COMMA                        = 38;
-    const T_STEP                         = 39;
-    const T_EMPTY                        = 40;
-    const T_IF                           = 41;
-    const T_ELSE                         = 42;
-    const T_IFCHANGED                    = 43;
-    const T_IFEQUAL                      = 44;
-    const T_IFNOTEQUAL                   = 45;
-    const T_BLOCK                        = 46;
-    const T_FILTER                       = 47;
-    const T_REGROUP                      = 48;
-    const T_BY                           = 49;
-    const T_COLON                        = 50;
-    const T_TRUE                         = 51;
-    const T_FALSE                        = 52;
-    const T_STRING                       = 53;
-    const T_INTL                         = 54;
-    const T_RPARENT                      = 55;
-    const T_LPARENT                      = 56;
-    const T_OBJ                          = 57;
-    const T_DOT                          = 58;
-    const T_CLASS                        = 59;
-    const T_BRACKETS_OPEN                = 60;
-    const T_BRACKETS_CLOSE               = 61;
-    const T_ALPHA                        = 62;
-    const T_DOTDOT                       = 63;
-    const T_NUMERIC                      = 64;
-    const YY_NO_ACTION = 356;
-    const YY_ACCEPT_ACTION = 355;
-    const YY_ERROR_ACTION = 354;
+    const T_QUESTION                     =  5;
+    const T_COLON                        =  6;
+    const T_EQ                           =  7;
+    const T_NE                           =  8;
+    const T_GT                           =  9;
+    const T_GE                           = 10;
+    const T_LT                           = 11;
+    const T_LE                           = 12;
+    const T_IN                           = 13;
+    const T_PLUS                         = 14;
+    const T_MINUS                        = 15;
+    const T_CONCAT                       = 16;
+    const T_TIMES                        = 17;
+    const T_DIV                          = 18;
+    const T_MOD                          = 19;
+    const T_PIPE                         = 20;
+    const T_BITWISE                      = 21;
+    const T_FILTER_PIPE                  = 22;
+    const T_HTML                         = 23;
+    const T_COMMENT                      = 24;
+    const T_PRINT_OPEN                   = 25;
+    const T_PRINT_CLOSE                  = 26;
+    const T_EXTENDS                      = 27;
+    const T_TAG_CLOSE                    = 28;
+    const T_INCLUDE                      = 29;
+    const T_AUTOESCAPE                   = 30;
+    const T_CUSTOM_END                   = 31;
+    const T_CUSTOM_TAG                   = 32;
+    const T_AS                           = 33;
+    const T_CUSTOM_BLOCK                 = 34;
+    const T_SPACEFULL                    = 35;
+    const T_WITH                         = 36;
+    const T_SET                          = 37;
+    const T_ASSIGN                       = 38;
+    const T_LOAD                         = 39;
+    const T_FOR                          = 40;
+    const T_COMMA                        = 41;
+    const T_STEP                         = 42;
+    const T_EMPTY                        = 43;
+    const T_IF                           = 44;
+    const T_ELSE                         = 45;
+    const T_IFCHANGED                    = 46;
+    const T_IFEQUAL                      = 47;
+    const T_IFNOTEQUAL                   = 48;
+    const T_BLOCK                        = 49;
+    const T_FILTER                       = 50;
+    const T_REGROUP                      = 51;
+    const T_BY                           = 52;
+    const T_TRUE                         = 53;
+    const T_FALSE                        = 54;
+    const T_STRING                       = 55;
+    const T_INTL                         = 56;
+    const T_RPARENT                      = 57;
+    const T_LPARENT                      = 58;
+    const T_OBJ                          = 59;
+    const T_DOT                          = 60;
+    const T_CLASS                        = 61;
+    const T_BRACKETS_OPEN                = 62;
+    const T_BRACKETS_CLOSE               = 63;
+    const T_ALPHA                        = 64;
+    const T_DOTDOT                       = 65;
+    const T_NUMERIC                      = 66;
+    const YY_NO_ACTION = 374;
+    const YY_ACCEPT_ACTION = 373;
+    const YY_ERROR_ACTION = 372;
 
 /* Next are that tables used to determine what action to take based on the
 ** current state and lookahead token.  These tables are used to implement
@@ -284,435 +286,473 @@ class Haanga_yyStackEntry
 **                          shifting non-terminals after a reduce.
 **  self::$yy_default       Default action for each state.
 */
-    const YY_SZ_ACTTAB = 1402;
+    const YY_SZ_ACTTAB = 1586;
 static public $yy_action = array(
- /*     0 */    49,   57,   47,   66,  163,   39,  188,   41,  186,   61,
- /*    10 */    63,  225,   95,   67,   28,   28,  104,   33,  165,   40,
- /*    20 */    35,   37,   56,   52,   53,   49,  232,   47,   66,  157,
- /*    30 */    39,  195,   41,  186,   61,   63,  247,   95,   67,  228,
- /*    40 */   150,  210,   33,  158,   40,   35,   37,   56,   52,   53,
- /*    50 */    49,  229,   47,   66,  179,   39,  212,   41,  186,   61,
- /*    60 */    63,  235,   95,   67,   38,  355,   86,   33,  183,   40,
- /*    70 */    35,   37,   56,   52,   53,   49,   57,   47,   66,  185,
- /*    80 */    39,  200,   41,  186,   61,   63,  108,   95,   67,  116,
- /*    90 */   117,   68,   33,  181,   40,   35,   37,   56,   52,   53,
- /*   100 */    49,  230,   47,   66,  171,   39,  106,   41,  186,   61,
- /*   110 */    63,   57,   95,   67,  105,  215,  173,   33,  239,   40,
- /*   120 */    35,   37,   56,   52,   53,   49,  209,   47,   66,  146,
- /*   130 */    39,  242,   41,  186,   61,   63,  214,   95,   67,  102,
- /*   140 */   253,  251,   33,  147,   40,   35,   37,   56,   52,   53,
- /*   150 */    49,   59,   47,   66,  153,   39,  110,   41,  186,   61,
- /*   160 */    63,   57,   95,   67,  191,  199,  248,   33,  190,   40,
- /*   170 */    35,   37,   56,   52,   53,   49,   60,   47,   66,  184,
- /*   180 */    39,  244,   41,  186,   61,   63,  204,   95,   67,  246,
- /*   190 */   103,  115,   33,   25,   40,   35,   37,   56,   52,   53,
- /*   200 */    49,   50,   47,   66,  138,   39,  243,   41,  186,   61,
- /*   210 */    63,  252,   95,   67,  236,   98,  194,   33,   45,   40,
- /*   220 */    35,   37,   56,   52,   53,   49,  154,   47,   66,  139,
- /*   230 */    39,  351,   41,  186,   61,   63,   57,   95,   67,  238,
- /*   240 */    54,  237,   33,   97,   40,   35,   37,   56,   52,   53,
- /*   250 */    49,  233,   47,   66,  160,   39,  107,   41,  186,   61,
- /*   260 */    63,   45,   95,   67,  264,   99,  113,   33,  189,   40,
- /*   270 */    35,   37,   56,   52,   53,   49,   76,   47,   66,  164,
- /*   280 */    39,  224,   41,  186,   61,   63,  203,   95,   67,   89,
- /*   290 */    71,   83,   33,  241,   40,   35,   37,   56,   52,   53,
- /*   300 */    49,   82,   47,   66,  187,   39,  185,   41,  186,   61,
- /*   310 */    63,   78,   95,   67,   73,   84,   80,   33,  174,   40,
- /*   320 */    35,   37,   56,   52,   53,   49,   75,   47,   66,  167,
- /*   330 */    39,   74,   41,  186,   61,   63,   72,   95,   67,   81,
- /*   340 */    85,   77,   33,  185,   40,   35,   37,   56,   52,   53,
- /*   350 */    49,   79,   47,   66,  176,   39,   90,   41,  186,   61,
- /*   360 */    63,   92,   95,   67,   88,   91,   93,   33,  185,   40,
- /*   370 */    35,   37,   56,   52,   53,   49,   87,   47,   66,  140,
- /*   380 */    39,  185,   41,  186,   61,   63,  185,   95,   67,  185,
- /*   390 */   185,  185,   33,  185,   40,   35,   37,   56,   52,   53,
- /*   400 */    49,  185,   47,   66,  149,   39,  185,   41,  186,   61,
- /*   410 */    63,  185,   95,   67,  185,  185,  185,   33,  185,   40,
- /*   420 */    35,   37,   56,   52,   53,   49,  185,   47,   66,   94,
- /*   430 */    39,  185,   41,  186,   61,   63,  185,   95,   67,  185,
- /*   440 */   185,  185,   33,  185,   40,   35,   37,   56,   52,   53,
- /*   450 */    49,  185,   47,   66,  166,   39,  161,   41,  186,   61,
- /*   460 */    63,  185,   95,   67,  185,  185,  185,   33,  192,   40,
- /*   470 */    35,   37,   56,   52,   53,   32,   26,   29,   29,   29,
- /*   480 */    29,   29,   29,   29,   30,   30,   30,   27,   27,   27,
- /*   490 */    28,   28,   49,  185,   47,   66,  142,   39,  185,   41,
- /*   500 */   186,   61,   63,  185,   95,   67,   57,  219,  100,   33,
- /*   510 */   185,   40,   35,   37,   56,   52,   53,   70,   70,   69,
- /*   520 */    48,   49,   51,   47,   66,   58,   39,  250,   41,  186,
- /*   530 */    61,   63,  185,   95,   67,  185,  185,   62,   33,  185,
- /*   540 */    40,   35,   37,   56,   52,   53,   32,   26,   29,   29,
- /*   550 */    29,   29,   29,   29,   29,   30,   30,   30,   27,   27,
- /*   560 */    27,   28,   28,   27,   27,   27,   28,   28,  111,   49,
- /*   570 */   185,   47,   66,  177,   39,  185,   41,  186,   61,   63,
- /*   580 */   185,   95,   67,  185,  185,  185,   33,  127,   40,   35,
- /*   590 */    37,   56,   52,   53,   49,  185,   47,   66,  175,   39,
- /*   600 */   185,   41,  186,   61,   63,  185,   95,   67,  263,  126,
- /*   610 */   220,   33,  185,   40,   35,   37,   56,   52,   53,   32,
- /*   620 */    26,   29,   29,   29,   29,   29,   29,   29,   30,   30,
- /*   630 */    30,   27,   27,   27,   28,   28,   26,   29,   29,   29,
- /*   640 */    29,   29,   29,   29,   30,   30,   30,   27,   27,   27,
- /*   650 */    28,   28,   29,   29,   29,   29,   29,   29,   29,   30,
- /*   660 */    30,   30,   27,   27,   27,   28,   28,  161,  231,  231,
- /*   670 */    24,  231,  185,  185,  185,  185,  185,  185,  175,  234,
- /*   680 */   185,  161,  231,  231,   64,  231,  231,  185,  257,  126,
- /*   690 */   220,  185,   46,  185,  185,  185,  231,  231,  185,  231,
- /*   700 */   231,  155,  231,  185,  185,  222,  222,  228,  150,  185,
- /*   710 */   172,  161,  126,  220,  231,  185,  231,  185,  219,  261,
- /*   720 */   261,  228,  150,  213,   31,  131,  231,  231,   65,  231,
- /*   730 */   231,  185,  219,  185,  185,  185,  134,  185,  185,  185,
- /*   740 */   185,  161,  129,  156,  231,  201,  263,  126,  220,  222,
- /*   750 */   222,  228,  150,  112,  254,  185,  231,  231,  185,  231,
- /*   760 */   231,  185,  219,  185,  223,   42,   46,  185,  227,  185,
- /*   770 */   185,  161,  185,  221,  231,  126,  220,  185,  185,  222,
- /*   780 */   222,  228,  150,  114,  185,  185,  231,  231,  196,  231,
- /*   790 */   231,  185,  219,  185,  197,  202,   46,  201,  185,  126,
- /*   800 */   220,  161,  185,  180,  231,  126,  220,  185,  185,  222,
- /*   810 */   222,  228,  150,  109,  126,  220,  231,  231,  185,  231,
- /*   820 */   231,  226,  219,  185,  137,  208,  207,  205,  206,  211,
- /*   830 */   217,  218,  216,  161,  231,  185,  240,  185,   96,  222,
- /*   840 */   222,  228,  150,  185,  168,  101,  185,  161,  231,  231,
- /*   850 */   231,  231,  219,  185,  245,  126,  220,  231,  231,  185,
- /*   860 */   231,  161,  231,  231,  185,  231,  231,  185,  185,  185,
- /*   870 */   185,  222,  222,  228,  150,  231,  231,  231,  182,  231,
- /*   880 */   231,  143,  231,  185,  219,  222,  222,  228,  150,  126,
- /*   890 */   220,  231,  126,  220,  231,  151,  231,  162,  219,  261,
- /*   900 */   261,  228,  150,  170,  185,  185,  126,  220,  126,  220,
- /*   910 */   231,  185,  219,  185,  175,  185,  125,  185,  259,  170,
- /*   920 */   185,  185,  249,  262,  263,  126,  220,  185,  185,  185,
- /*   930 */   175,  185,  118,  170,  259,  185,  185,  185,  249,  262,
- /*   940 */   263,  126,  220,  185,  175,  185,  124,  170,  259,  185,
- /*   950 */   135,  185,  249,  262,  263,  126,  220,  185,  175,  185,
- /*   960 */   130,  175,  259,  169,  185,  170,  249,  262,  263,  126,
- /*   970 */   220,  263,  126,  220,  126,  220,  175,  185,  121,  132,
- /*   980 */   259,  170,  185,  185,  249,  262,  263,  126,  220,  185,
- /*   990 */   126,  220,  175,  185,  120,  170,  259,  185,  185,  185,
- /*  1000 */   249,  262,  263,  126,  220,  185,  175,  185,  123,  170,
- /*  1010 */   259,  185,  185,  185,  249,  262,  263,  126,  220,  185,
- /*  1020 */   175,  185,  122,  170,  259,  185,  185,  185,  249,  262,
- /*  1030 */   263,  126,  220,  185,  175,  185,  260,  170,  259,  185,
- /*  1040 */   185,  185,  249,  262,  263,  126,  220,  185,  175,  185,
- /*  1050 */   119,  170,  259,  185,  185,  185,  249,  262,  263,  126,
- /*  1060 */   220,  185,  175,  185,  185,  170,  259,  185,  185,  185,
- /*  1070 */    36,  262,  263,  126,  220,  185,  175,  185,  185,  170,
- /*  1080 */   259,  185,  185,  185,  144,  262,  263,  126,  220,  185,
- /*  1090 */   175,  185,  185,  170,  259,  185,  185,  185,   34,  262,
- /*  1100 */   263,  126,  220,  185,  175,  185,  148,  161,  259,  185,
- /*  1110 */   254,  185,  141,  262,  263,  126,  220,  126,  220,  185,
- /*  1120 */   223,   43,  231,  231,  227,  231,  185,  185,  254,  221,
- /*  1130 */   185,  126,  220,  178,  185,  185,  185,  185,  223,   44,
- /*  1140 */   231,  185,  227,  255,  126,  220,  185,  221,  185,  126,
- /*  1150 */   220,  185,  185,  223,  185,  185,  231,  227,  219,  159,
- /*  1160 */   185,  185,  221,  185,  126,  220,  185,  185,  185,  223,
- /*  1170 */   185,  185,  152,  227,  185,  185,  185,  185,  221,  185,
- /*  1180 */   126,  220,  223,  185,  185,  256,  227,  185,  185,  185,
- /*  1190 */   185,  221,  185,  126,  220,  223,  185,   20,  185,  227,
- /*  1200 */   136,  185,  185,  185,  221,  185,  126,  220,  185,  185,
- /*  1210 */   223,  185,  185,  185,  227,  258,  198,  193,   55,  221,
- /*  1220 */   185,  126,  220,  185,  128,  223,  185,  185,  133,  227,
- /*  1230 */   185,  196,  185,   12,  221,  175,  126,  220,  145,  175,
- /*  1240 */   201,   11,  126,  220,   19,  263,  126,  220,   16,  263,
- /*  1250 */   126,  220,  198,  193,   55,    4,  185,  185,  185,  185,
- /*  1260 */   198,  193,   55,  198,  193,   55,    7,  198,  193,   55,
- /*  1270 */    14,  185,  185,  185,  198,  193,   55,   21,  185,  185,
- /*  1280 */   185,  185,  185,  185,  185,  198,  193,   55,   17,  198,
- /*  1290 */   193,   55,    3,  185,  185,  185,  198,  193,   55,   23,
- /*  1300 */   185,  185,  185,  185,  185,  185,  185,  198,  193,   55,
- /*  1310 */    13,  198,  193,   55,   22,  185,  185,  185,  198,  193,
- /*  1320 */    55,    9,  185,  185,  185,  185,  185,  185,  185,  198,
- /*  1330 */   193,   55,    2,  198,  193,   55,   10,  185,  185,  185,
- /*  1340 */   198,  193,   55,   15,  185,  185,  185,  185,  185,  185,
- /*  1350 */   185,  198,  193,   55,   18,  198,  193,   55,    8,  185,
- /*  1360 */   185,  185,  198,  193,   55,    5,  185,  185,  185,  185,
- /*  1370 */   185,  185,  185,  198,  193,   55,    1,  198,  193,   55,
- /*  1380 */     6,  185,  185,  185,  198,  193,   55,  185,  185,  185,
- /*  1390 */   185,  185,  185,  185,  185,  198,  193,   55,  185,  198,
- /*  1400 */   193,   55,
+ /*     0 */    33,   34,   35,   32,   31,   31,   31,   31,   31,   31,
+ /*    10 */    31,   36,   36,   36,   27,   27,   27,   25,   30,   54,
+ /*    20 */    62,   51,   74,  193,   43,  241,   45,  175,   66,   71,
+ /*    30 */   255,  101,   65,  251,  144,  117,   28,  195,   46,   39,
+ /*    40 */    40,   61,   58,   56,   54,   70,   51,   74,  168,   43,
+ /*    50 */    69,   45,  175,   66,   71,   55,  101,   65,  105,  252,
+ /*    60 */    38,   28,  160,   46,   39,   40,   61,   58,   56,   33,
+ /*    70 */    34,   35,   60,   31,   31,   31,   31,   31,   31,   31,
+ /*    80 */    36,   36,   36,   27,   27,   27,   25,   30,   67,   33,
+ /*    90 */    34,   35,  204,   31,   31,   31,   31,   31,   31,   31,
+ /*   100 */    36,   36,   36,   27,   27,   27,   25,   30,   54,   37,
+ /*   110 */    51,   74,  146,   43,  369,   45,  175,   66,   71,  261,
+ /*   120 */   101,   65,  373,   80,  167,   28,  153,   46,   39,   40,
+ /*   130 */    61,   58,   56,  192,  258,  134,  220,  273,  273,  120,
+ /*   140 */   273,   25,   30,  270,   54,  190,   51,   74,  183,   43,
+ /*   150 */   203,   45,  175,   66,   71,  273,  101,   65,  246,  227,
+ /*   160 */   177,   28,  249,   46,   39,   40,   61,   58,   56,  174,
+ /*   170 */   273,   54,   63,   51,   74,  155,   43,  232,   45,  175,
+ /*   180 */    66,   71,  208,  101,   65,  259,  115,  123,   28,  158,
+ /*   190 */    46,   39,   40,   61,   58,   56,   33,   34,   35,  174,
+ /*   200 */    31,   31,   31,   31,   31,   31,   31,   36,   36,   36,
+ /*   210 */    27,   27,   27,   25,   30,  273,  273,  198,  273,  110,
+ /*   220 */   238,  106,   54,   55,   51,   74,  169,   43,  263,   45,
+ /*   230 */   175,   66,   71,  273,  101,   65,  205,  230,  228,   28,
+ /*   240 */   165,   46,   39,   40,   61,   58,   56,  229,  273,   54,
+ /*   250 */   238,   51,   74,  100,   43,  272,   45,  175,   66,   71,
+ /*   260 */   102,  101,   65,  253,  262,  277,   28,   68,   46,   39,
+ /*   270 */    40,   61,   58,   56,   54,   62,   51,   74,  150,   43,
+ /*   280 */   122,   45,  175,   66,   71,  209,  101,   65,  103,  109,
+ /*   290 */   104,   28,  119,   46,   39,   40,   61,   58,   56,   54,
+ /*   300 */    57,   51,   74,  185,   43,  212,   45,  175,   66,   71,
+ /*   310 */   118,  101,   65,   59,  254,  239,   28,  217,   46,   39,
+ /*   320 */    40,   61,   58,   56,   54,   86,   51,   74,  151,   43,
+ /*   330 */   201,   45,  175,   66,   71,  111,  101,   65,  206,  218,
+ /*   340 */   224,   28,  207,   46,   39,   40,   61,   58,   56,   33,
+ /*   350 */    34,   35,  116,   31,   31,   31,   31,   31,   31,   31,
+ /*   360 */    36,   36,   36,   27,   27,   27,   25,   30,  200,   54,
+ /*   370 */   176,   51,   74,  196,   43,   82,   45,  175,   66,   71,
+ /*   380 */   275,  101,   65,  240,   95,   96,   28,   98,   46,   39,
+ /*   390 */    40,   61,   58,   56,   54,   81,   51,   74,   64,   43,
+ /*   400 */    97,   45,  175,   66,   71,   90,  101,   65,   88,   93,
+ /*   410 */    89,   28,  235,   46,   39,   40,   61,   58,   56,   54,
+ /*   420 */    99,   51,   74,  152,   43,   91,   45,  175,   66,   71,
+ /*   430 */    83,  101,   65,   84,   87,   92,   28,   77,   46,   39,
+ /*   440 */    40,   61,   58,   56,   54,   78,   51,   74,  172,   43,
+ /*   450 */    94,   45,  175,   66,   71,   85,  101,   65,   79,  192,
+ /*   460 */   192,   28,  192,   46,   39,   40,   61,   58,   56,   54,
+ /*   470 */   192,   51,   74,  197,   43,  192,   45,  175,   66,   71,
+ /*   480 */   192,  101,   65,  192,  192,  192,   28,  192,   46,   39,
+ /*   490 */    40,   61,   58,   56,   54,  192,   51,   74,  173,   43,
+ /*   500 */   192,   45,  175,   66,   71,  192,  101,   65,  192,  192,
+ /*   510 */   192,   28,  192,   46,   39,   40,   61,   58,   56,   54,
+ /*   520 */   192,   51,   74,  154,   43,  192,   45,  175,   66,   71,
+ /*   530 */   192,  101,   65,  192,  192,  192,   28,  192,   46,   39,
+ /*   540 */    40,   61,   58,   56,   54,  192,   51,   74,  179,   43,
+ /*   550 */   192,   45,  175,   66,   71,  192,  101,   65,  192,  192,
+ /*   560 */   192,   28,  192,   46,   39,   40,   61,   58,   56,   54,
+ /*   570 */   192,   51,   74,  194,   43,  192,   45,  175,   66,   71,
+ /*   580 */   192,  101,   65,  192,  192,  192,   28,  192,   46,   39,
+ /*   590 */    40,   61,   58,   56,   54,  192,   51,   74,  187,   43,
+ /*   600 */   192,   45,  175,   66,   71,  192,  101,   65,  192,  192,
+ /*   610 */   192,   28,  192,   46,   39,   40,   61,   58,   56,   54,
+ /*   620 */   192,   51,   74,  148,   43,  192,   45,  175,   66,   71,
+ /*   630 */   192,  101,   65,  192,  192,  192,   28,  192,   46,   39,
+ /*   640 */    40,   61,   58,   56,   54,  192,   51,   74,  170,   43,
+ /*   650 */   192,   45,  175,   66,   71,  192,  101,   65,  192,  192,
+ /*   660 */   192,   28,  192,   46,   39,   40,   61,   58,   56,   54,
+ /*   670 */   192,   51,   74,  178,   43,  192,   45,  175,   66,   71,
+ /*   680 */   192,  101,   65,  268,  134,  220,   28,  192,   46,   39,
+ /*   690 */    40,   61,   58,   56,   34,   35,  192,   31,   31,   31,
+ /*   700 */    31,   31,   31,   31,   36,   36,   36,   27,   27,   27,
+ /*   710 */    25,   30,   35,  192,   31,   31,   31,   31,   31,   31,
+ /*   720 */    31,   36,   36,   36,   27,   27,   27,   25,   30,   31,
+ /*   730 */    31,   31,   31,   31,   31,   31,   36,   36,   36,   27,
+ /*   740 */    27,   27,   25,   30,  174,  192,  226,   62,  273,  273,
+ /*   750 */   192,  273,  192,  274,  192,  192,  257,  225,  174,  250,
+ /*   760 */   273,  273,   73,  273,  192,  260,  273,  134,  220,  192,
+ /*   770 */    52,  219,  192,   24,  273,  273,   72,  273,  273,  178,
+ /*   780 */   192,  273,  256,  256,  251,  144,  174,  192,   62,  247,
+ /*   790 */   134,  220,  273,  273,  121,  238,  256,  256,  251,  144,
+ /*   800 */   192,  178,  273,  273,  163,  273,  143,  273,  192,  238,
+ /*   810 */   192,  269,  134,  220,  174,  192,   62,  192,  273,  273,
+ /*   820 */   273,  273,  216,  192,  266,  266,  251,  144,  192,   26,
+ /*   830 */   273,  273,  192,  273,  192,  273,  273,  238,  192,  192,
+ /*   840 */    52,  192,  251,  144,   17,  174,  192,  192,  273,  192,
+ /*   850 */   192,  273,  256,  256,  251,  144,  237,  192,  114,  236,
+ /*   860 */   192,  273,  273,  273,  273,  238,  214,  215,   29,  257,
+ /*   870 */    49,   52,  250,  192,  174,  192,  192,  192,  260,  273,
+ /*   880 */   134,  220,   19,  256,  256,  251,  144,  107,  236,  192,
+ /*   890 */   273,  273,  192,  273,  273,  192,  238,  192,  257,   47,
+ /*   900 */    52,  250,  192,  174,  214,  215,   29,  260,  273,  134,
+ /*   910 */   220,  192,  256,  256,  251,  144,  113,  192,  192,  273,
+ /*   920 */   273,  192,  273,  273,  137,  238,  192,  163,  142,  136,
+ /*   930 */   141,  164,  174,  202,  269,  134,  220,  273,  192,  134,
+ /*   940 */   220,  256,  256,  251,  144,  112,  236,  192,  273,  273,
+ /*   950 */   192,  273,  273,  192,  238,  192,  257,   50,  192,  250,
+ /*   960 */    27,   27,   27,   25,   30,  260,  273,  134,  220,  192,
+ /*   970 */   256,  256,  251,  144,   44,   76,   76,   75,   53,  192,
+ /*   980 */   192,  273,  192,  238,  199,  192,  174,  156,  245,  244,
+ /*   990 */   242,  243,  233,  222,  223,  221,  131,  210,  276,    5,
+ /*  1000 */   108,  192,  273,  273,  181,  273,  202,  178,  134,  220,
+ /*  1010 */   166,  192,  191,  192,  174,  271,  267,  269,  134,  220,
+ /*  1020 */   273,  214,  215,   29,  256,  256,  251,  144,  234,  192,
+ /*  1030 */   273,  273,  210,  273,  192,  273,  192,  238,  188,  211,
+ /*  1040 */   174,  202,  192,  134,  220,   11,  192,  192,  273,  134,
+ /*  1050 */   220,  192,  256,  256,  251,  144,  273,  273,  192,  273,
+ /*  1060 */   192,  192,  192,  273,  192,  238,  192,  214,  215,   29,
+ /*  1070 */   192,  192,  178,  192,  273,  163,  126,  138,  266,  266,
+ /*  1080 */   251,  144,  269,  134,  220,  192,  192,  178,  192,  273,
+ /*  1090 */   166,  238,  191,  135,  192,  271,  267,  269,  134,  220,
+ /*  1100 */   192,  192,  192,  192,  178,  192,  139,  166,  192,  191,
+ /*  1110 */   192,  192,  271,  267,  269,  134,  220,  178,  192,  189,
+ /*  1120 */   166,  124,  191,  192,  192,  271,  267,  269,  134,  220,
+ /*  1130 */   134,  220,  178,  192,  157,  166,  125,  191,  192,  192,
+ /*  1140 */   271,  267,  269,  134,  220,  134,  220,  178,  192,  127,
+ /*  1150 */   166,  192,  191,  192,  192,  271,  267,  269,  134,  220,
+ /*  1160 */   178,  192,  133,  166,  192,  191,  192,  192,  271,  267,
+ /*  1170 */   269,  134,  220,  178,  192,  162,  166,  132,  191,  192,
+ /*  1180 */   192,  271,  267,  269,  134,  220,  134,  220,  178,  192,
+ /*  1190 */   130,  166,  192,  191,  192,  192,  271,  267,  269,  134,
+ /*  1200 */   220,  178,  192,  192,  166,  264,  191,  192,  192,  271,
+ /*  1210 */   267,  269,  134,  220,  174,  192,  178,  192,  192,  166,
+ /*  1220 */   192,  191,  192,  128,  271,  267,  269,  134,  220,  147,
+ /*  1230 */   273,  273,  192,  273,  178,    1,  192,  166,  192,  191,
+ /*  1240 */   134,  220,  271,  267,  269,  134,  220,  192,  273,  192,
+ /*  1250 */   265,  192,  192,  192,  251,  144,    3,  214,  215,   29,
+ /*  1260 */     4,  178,  192,  273,  166,  238,  191,  192,  192,  271,
+ /*  1270 */   267,  269,  134,  220,  129,  213,  192,  192,  214,  215,
+ /*  1280 */    29,  192,  214,  215,   29,  178,  134,  220,  166,  192,
+ /*  1290 */   191,  192,  192,  271,  267,  269,  134,  220,  178,  192,
+ /*  1300 */   192,  166,  192,  191,  192,  192,   42,  267,  269,  134,
+ /*  1310 */   220,  178,  192,  186,  166,  192,  191,  192,  192,  161,
+ /*  1320 */   267,  269,  134,  220,  134,  220,  178,  192,  192,  166,
+ /*  1330 */   192,  191,  192,  192,  149,  267,  269,  134,  220,  178,
+ /*  1340 */   192,  192,  166,  236,  191,  192,  192,   41,  267,  269,
+ /*  1350 */   134,  220,  192,  257,   48,  192,  250,  192,  192,  145,
+ /*  1360 */   192,  192,  260,  192,  134,  220,  192,    6,  192,  257,
+ /*  1370 */   192,  192,  250,  192,  192,  231,  192,  192,  260,  192,
+ /*  1380 */   134,  220,  159,  192,  192,  257,  192,  184,  250,  214,
+ /*  1390 */   215,   29,  257,  192,  260,  250,  134,  220,  134,  220,
+ /*  1400 */   171,  260,  192,  134,  220,  178,  192,  192,  163,  248,
+ /*  1410 */   140,  134,  220,  182,  192,  269,  134,  220,   22,  257,
+ /*  1420 */   192,   16,  250,  257,   13,  192,  250,  180,  260,  192,
+ /*  1430 */   134,  220,  260,    8,  134,  220,   21,  192,  134,  220,
+ /*  1440 */   214,  215,   29,  214,  215,   29,  214,  215,   29,    7,
+ /*  1450 */   192,  192,  192,  192,  192,  214,  215,   29,  214,  215,
+ /*  1460 */    29,    9,  192,  192,  192,  192,  192,  192,  192,  192,
+ /*  1470 */   192,  214,  215,   29,   15,  192,  192,  192,  192,  192,
+ /*  1480 */   192,  192,  192,  214,  215,   29,    2,  192,  192,  192,
+ /*  1490 */   192,  192,  192,  192,  192,  192,  214,  215,   29,   23,
+ /*  1500 */   192,  192,  192,  192,  192,  192,  192,  192,  214,  215,
+ /*  1510 */    29,   20,  192,  192,  192,  192,  192,  192,  192,  192,
+ /*  1520 */   192,  214,  215,   29,   10,  192,  192,  192,  192,  192,
+ /*  1530 */   192,  192,  192,  214,  215,   29,   18,  192,  192,  192,
+ /*  1540 */   192,  192,  192,  192,  192,  192,  214,  215,   29,   12,
+ /*  1550 */   192,  192,  192,  192,  192,  192,  192,  192,  214,  215,
+ /*  1560 */    29,   14,  192,  192,  192,  192,  192,  192,  192,  192,
+ /*  1570 */   192,  214,  215,   29,  192,  192,  192,  192,  192,  192,
+ /*  1580 */   192,  192,  192,  214,  215,   29,
     );
     static public $yy_lookahead = array(
- /*     0 */    24,   18,   26,   27,   28,   29,   23,   31,   32,   33,
- /*    10 */    34,   68,   36,   37,   18,   19,   25,   41,   42,   43,
- /*    20 */    44,   45,   46,   47,   48,   24,   93,   26,   27,   28,
- /*    30 */    29,   25,   31,   32,   33,   34,   25,   36,   37,   53,
- /*    40 */    54,   25,   41,   42,   43,   44,   45,   46,   47,   48,
- /*    50 */    24,   93,   26,   27,   28,   29,   25,   31,   32,   33,
- /*    60 */    34,   25,   36,   37,   11,   66,   67,   41,   42,   43,
- /*    70 */    44,   45,   46,   47,   48,   24,   18,   26,   27,   28,
- /*    80 */    29,   25,   31,   32,   33,   34,   25,   36,   37,   25,
- /*    90 */    25,   38,   41,   42,   43,   44,   45,   46,   47,   48,
- /*   100 */    24,   61,   26,   27,   28,   29,   25,   31,   32,   33,
- /*   110 */    34,   18,   36,   37,   25,   25,   40,   41,   25,   43,
- /*   120 */    44,   45,   46,   47,   48,   24,   64,   26,   27,   28,
- /*   130 */    29,   25,   31,   32,   33,   34,   25,   36,   37,   25,
- /*   140 */    25,   25,   41,   42,   43,   44,   45,   46,   47,   48,
- /*   150 */    24,   30,   26,   27,   28,   29,   25,   31,   32,   33,
- /*   160 */    34,   18,   36,   37,   25,   25,   25,   41,   25,   43,
- /*   170 */    44,   45,   46,   47,   48,   24,   30,   26,   27,   28,
- /*   180 */    29,   25,   31,   32,   33,   34,   25,   36,   37,   25,
- /*   190 */    25,   25,   41,   35,   43,   44,   45,   46,   47,   48,
- /*   200 */    24,   63,   26,   27,   28,   29,   25,   31,   32,   33,
- /*   210 */    34,   25,   36,   37,   25,   25,   25,   41,   50,   43,
- /*   220 */    44,   45,   46,   47,   48,   24,   53,   26,   27,   28,
- /*   230 */    29,   63,   31,   32,   33,   34,   18,   36,   37,   25,
- /*   240 */    11,   25,   41,   25,   43,   44,   45,   46,   47,   48,
- /*   250 */    24,   55,   26,   27,   28,   29,   25,   31,   32,   33,
- /*   260 */    34,   50,   36,   37,   25,   25,   25,   41,   25,   43,
- /*   270 */    44,   45,   46,   47,   48,   24,   67,   26,   27,   28,
- /*   280 */    29,   25,   31,   32,   33,   34,   25,   36,   37,   67,
- /*   290 */    67,   67,   41,   85,   43,   44,   45,   46,   47,   48,
- /*   300 */    24,   67,   26,   27,   28,   29,   94,   31,   32,   33,
- /*   310 */    34,   67,   36,   37,   67,   67,   67,   41,   90,   43,
- /*   320 */    44,   45,   46,   47,   48,   24,   67,   26,   27,   28,
- /*   330 */    29,   67,   31,   32,   33,   34,   67,   36,   37,   67,
- /*   340 */    67,   67,   41,   94,   43,   44,   45,   46,   47,   48,
- /*   350 */    24,   67,   26,   27,   28,   29,   67,   31,   32,   33,
- /*   360 */    34,   67,   36,   37,   67,   67,   67,   41,   94,   43,
- /*   370 */    44,   45,   46,   47,   48,   24,   67,   26,   27,   28,
- /*   380 */    29,   94,   31,   32,   33,   34,   94,   36,   37,   94,
- /*   390 */    94,   94,   41,   94,   43,   44,   45,   46,   47,   48,
- /*   400 */    24,   94,   26,   27,   28,   29,   94,   31,   32,   33,
- /*   410 */    34,   94,   36,   37,   94,   94,   94,   41,   94,   43,
- /*   420 */    44,   45,   46,   47,   48,   24,   94,   26,   27,   28,
- /*   430 */    29,   94,   31,   32,   33,   34,   94,   36,   37,   94,
- /*   440 */    94,   94,   41,   94,   43,   44,   45,   46,   47,   48,
- /*   450 */    24,   94,   26,   27,   28,   29,   13,   31,   32,   33,
- /*   460 */    34,   94,   36,   37,   94,   94,   94,   41,   25,   43,
- /*   470 */    44,   45,   46,   47,   48,    3,    4,    5,    6,    7,
- /*   480 */     8,    9,   10,   11,   12,   13,   14,   15,   16,   17,
- /*   490 */    18,   19,   24,   94,   26,   27,   28,   29,   94,   31,
- /*   500 */    32,   33,   34,   94,   36,   37,   18,   64,   25,   41,
- /*   510 */    94,   43,   44,   45,   46,   47,   48,   57,   58,   59,
- /*   520 */    60,   24,   39,   26,   27,   28,   29,   55,   31,   32,
- /*   530 */    33,   34,   94,   36,   37,   94,   94,   49,   41,   94,
- /*   540 */    43,   44,   45,   46,   47,   48,    3,    4,    5,    6,
- /*   550 */     7,    8,    9,   10,   11,   12,   13,   14,   15,   16,
- /*   560 */    17,   18,   19,   15,   16,   17,   18,   19,   25,   24,
- /*   570 */    94,   26,   27,   28,   29,   94,   31,   32,   33,   34,
- /*   580 */    94,   36,   37,   94,   94,   94,   41,   70,   43,   44,
- /*   590 */    45,   46,   47,   48,   24,   94,   26,   27,   81,   29,
- /*   600 */    94,   31,   32,   33,   34,   94,   36,   37,   91,   92,
- /*   610 */    93,   41,   94,   43,   44,   45,   46,   47,   48,    3,
- /*   620 */     4,    5,    6,    7,    8,    9,   10,   11,   12,   13,
- /*   630 */    14,   15,   16,   17,   18,   19,    4,    5,    6,    7,
- /*   640 */     8,    9,   10,   11,   12,   13,   14,   15,   16,   17,
- /*   650 */    18,   19,    5,    6,    7,    8,    9,   10,   11,   12,
- /*   660 */    13,   14,   15,   16,   17,   18,   19,   13,   28,   29,
- /*   670 */     2,   31,   94,   94,   94,   94,   94,   94,   81,   25,
- /*   680 */    94,   13,   28,   29,   30,   31,   46,   94,   91,   92,
- /*   690 */    93,   94,   38,   94,   94,   94,   28,   29,   94,   31,
- /*   700 */    46,   81,   62,   94,   94,   51,   52,   53,   54,   94,
- /*   710 */    90,   13,   92,   93,   46,   94,   62,   94,   64,   51,
- /*   720 */    52,   53,   54,   25,   56,   70,   28,   29,   30,   31,
- /*   730 */    62,   94,   64,   94,   94,   94,   81,   94,   94,   94,
- /*   740 */    94,   13,   87,   88,   46,   90,   91,   92,   93,   51,
- /*   750 */    52,   53,   54,   25,   71,   94,   28,   29,   94,   31,
- /*   760 */    62,   94,   64,   94,   81,   82,   38,   94,   85,   94,
- /*   770 */    94,   13,   94,   90,   46,   92,   93,   94,   94,   51,
- /*   780 */    52,   53,   54,   25,   94,   94,   28,   29,   81,   31,
- /*   790 */    62,   94,   64,   94,   81,   88,   38,   90,   94,   92,
- /*   800 */    93,   13,   94,   81,   46,   92,   93,   94,   94,   51,
- /*   810 */    52,   53,   54,   25,   92,   93,   28,   29,   94,   31,
- /*   820 */    62,   69,   64,   94,   72,   73,   74,   75,   76,   77,
- /*   830 */    78,   79,   80,   13,   46,   94,   84,   94,   86,   51,
- /*   840 */    52,   53,   54,   94,   81,   25,   94,   13,   28,   29,
- /*   850 */    62,   31,   64,   94,   25,   92,   93,   28,   29,   94,
- /*   860 */    31,   13,   28,   29,   94,   31,   46,   94,   94,   94,
- /*   870 */    94,   51,   52,   53,   54,   46,   28,   29,   81,   31,
- /*   880 */    46,   81,   62,   94,   64,   51,   52,   53,   54,   92,
- /*   890 */    93,   62,   92,   93,   46,   81,   62,   81,   64,   51,
- /*   900 */    52,   53,   54,   70,   94,   94,   92,   93,   92,   93,
- /*   910 */    62,   94,   64,   94,   81,   94,   83,   94,   85,   70,
- /*   920 */    94,   94,   89,   90,   91,   92,   93,   94,   94,   94,
- /*   930 */    81,   94,   83,   70,   85,   94,   94,   94,   89,   90,
- /*   940 */    91,   92,   93,   94,   81,   94,   83,   70,   85,   94,
- /*   950 */    70,   94,   89,   90,   91,   92,   93,   94,   81,   94,
- /*   960 */    83,   81,   85,   81,   94,   70,   89,   90,   91,   92,
- /*   970 */    93,   91,   92,   93,   92,   93,   81,   94,   83,   81,
- /*   980 */    85,   70,   94,   94,   89,   90,   91,   92,   93,   94,
- /*   990 */    92,   93,   81,   94,   83,   70,   85,   94,   94,   94,
- /*  1000 */    89,   90,   91,   92,   93,   94,   81,   94,   83,   70,
- /*  1010 */    85,   94,   94,   94,   89,   90,   91,   92,   93,   94,
- /*  1020 */    81,   94,   83,   70,   85,   94,   94,   94,   89,   90,
- /*  1030 */    91,   92,   93,   94,   81,   94,   83,   70,   85,   94,
- /*  1040 */    94,   94,   89,   90,   91,   92,   93,   94,   81,   94,
- /*  1050 */    83,   70,   85,   94,   94,   94,   89,   90,   91,   92,
- /*  1060 */    93,   94,   81,   94,   94,   70,   85,   94,   94,   94,
- /*  1070 */    89,   90,   91,   92,   93,   94,   81,   94,   94,   70,
- /*  1080 */    85,   94,   94,   94,   89,   90,   91,   92,   93,   94,
- /*  1090 */    81,   94,   94,   70,   85,   94,   94,   94,   89,   90,
- /*  1100 */    91,   92,   93,   94,   81,   94,   81,   13,   85,   94,
- /*  1110 */    71,   94,   89,   90,   91,   92,   93,   92,   93,   94,
- /*  1120 */    81,   82,   28,   29,   85,   31,   94,   94,   71,   90,
- /*  1130 */    94,   92,   93,   81,   94,   94,   94,   94,   81,   82,
- /*  1140 */    46,   94,   85,   71,   92,   93,   94,   90,   94,   92,
- /*  1150 */    93,   94,   94,   81,   94,   94,   62,   85,   64,   71,
- /*  1160 */    94,   94,   90,   94,   92,   93,   94,   94,   94,   81,
- /*  1170 */    94,   94,   71,   85,   94,   94,   94,   94,   90,   94,
- /*  1180 */    92,   93,   81,   94,   94,   71,   85,   94,   94,   94,
- /*  1190 */    94,   90,   94,   92,   93,   81,   94,    1,   94,   85,
- /*  1200 */    71,   94,   94,   94,   90,   94,   92,   93,   94,   94,
- /*  1210 */    81,   94,   94,   94,   85,   71,   20,   21,   22,   90,
- /*  1220 */    94,   92,   93,   94,   70,   81,   94,   94,   70,   85,
- /*  1230 */    94,   81,   94,    1,   90,   81,   92,   93,   88,   81,
- /*  1240 */    90,    1,   92,   93,    1,   91,   92,   93,    1,   91,
- /*  1250 */    92,   93,   20,   21,   22,    1,   94,   94,   94,   94,
- /*  1260 */    20,   21,   22,   20,   21,   22,    1,   20,   21,   22,
- /*  1270 */     1,   94,   94,   94,   20,   21,   22,    1,   94,   94,
- /*  1280 */    94,   94,   94,   94,   94,   20,   21,   22,    1,   20,
- /*  1290 */    21,   22,    1,   94,   94,   94,   20,   21,   22,    1,
- /*  1300 */    94,   94,   94,   94,   94,   94,   94,   20,   21,   22,
- /*  1310 */     1,   20,   21,   22,    1,   94,   94,   94,   20,   21,
- /*  1320 */    22,    1,   94,   94,   94,   94,   94,   94,   94,   20,
- /*  1330 */    21,   22,    1,   20,   21,   22,    1,   94,   94,   94,
- /*  1340 */    20,   21,   22,    1,   94,   94,   94,   94,   94,   94,
- /*  1350 */    94,   20,   21,   22,    1,   20,   21,   22,    1,   94,
- /*  1360 */    94,   94,   20,   21,   22,    1,   94,   94,   94,   94,
- /*  1370 */    94,   94,   94,   20,   21,   22,    1,   20,   21,   22,
- /*  1380 */     1,   94,   94,   94,   20,   21,   22,   94,   94,   94,
- /*  1390 */    94,   94,   94,   94,   94,   20,   21,   22,   94,   20,
- /*  1400 */    21,   22,
+ /*     0 */     3,    4,    5,    6,    7,    8,    9,   10,   11,   12,
+ /*    10 */    13,   14,   15,   16,   17,   18,   19,   20,   21,   27,
+ /*    20 */    22,   29,   30,   31,   32,   63,   34,   35,   36,   37,
+ /*    30 */    28,   39,   40,   55,   56,   28,   44,   45,   46,   47,
+ /*    40 */    48,   49,   50,   51,   27,   33,   29,   30,   31,   32,
+ /*    50 */    52,   34,   35,   36,   37,    6,   39,   40,   28,   28,
+ /*    60 */    13,   44,   45,   46,   47,   48,   49,   50,   51,    3,
+ /*    70 */     4,    5,   42,    7,    8,    9,   10,   11,   12,   13,
+ /*    80 */    14,   15,   16,   17,   18,   19,   20,   21,   41,    3,
+ /*    90 */     4,    5,   26,    7,    8,    9,   10,   11,   12,   13,
+ /*   100 */    14,   15,   16,   17,   18,   19,   20,   21,   27,   38,
+ /*   110 */    29,   30,   31,   32,   65,   34,   35,   36,   37,   28,
+ /*   120 */    39,   40,   68,   69,   83,   44,   45,   46,   47,   48,
+ /*   130 */    49,   50,   51,   92,   28,   94,   95,   31,   32,   28,
+ /*   140 */    34,   20,   21,   57,   27,   55,   29,   30,   31,   32,
+ /*   150 */    28,   34,   35,   36,   37,   49,   39,   40,   28,   28,
+ /*   160 */    43,   44,   28,   46,   47,   48,   49,   50,   51,   15,
+ /*   170 */    64,   27,   22,   29,   30,   31,   32,   28,   34,   35,
+ /*   180 */    36,   37,   28,   39,   40,   28,   28,   28,   44,   45,
+ /*   190 */    46,   47,   48,   49,   50,   51,    3,    4,    5,   15,
+ /*   200 */     7,    8,    9,   10,   11,   12,   13,   14,   15,   16,
+ /*   210 */    17,   18,   19,   20,   21,   31,   32,   28,   34,   28,
+ /*   220 */    66,   28,   27,    6,   29,   30,   31,   32,   28,   34,
+ /*   230 */    35,   36,   37,   49,   39,   40,   28,   28,   28,   44,
+ /*   240 */    45,   46,   47,   48,   49,   50,   51,   28,   64,   27,
+ /*   250 */    66,   29,   30,   31,   32,   28,   34,   35,   36,   37,
+ /*   260 */    28,   39,   40,   28,   57,   28,   44,   33,   46,   47,
+ /*   270 */    48,   49,   50,   51,   27,   22,   29,   30,   31,   32,
+ /*   280 */    28,   34,   35,   36,   37,   28,   39,   40,   28,   28,
+ /*   290 */    28,   44,   28,   46,   47,   48,   49,   50,   51,   27,
+ /*   300 */    13,   29,   30,   31,   32,   28,   34,   35,   36,   37,
+ /*   310 */    28,   39,   40,   65,   28,   66,   44,   28,   46,   47,
+ /*   320 */    48,   49,   50,   51,   27,   69,   29,   30,   31,   32,
+ /*   330 */    28,   34,   35,   36,   37,   28,   39,   40,   28,   28,
+ /*   340 */    28,   44,   28,   46,   47,   48,   49,   50,   51,    3,
+ /*   350 */     4,    5,   28,    7,    8,    9,   10,   11,   12,   13,
+ /*   360 */    14,   15,   16,   17,   18,   19,   20,   21,   70,   27,
+ /*   370 */    92,   29,   30,   31,   32,   69,   34,   35,   36,   37,
+ /*   380 */    86,   39,   40,   95,   69,   69,   44,   69,   46,   47,
+ /*   390 */    48,   49,   50,   51,   27,   69,   29,   30,   31,   32,
+ /*   400 */    69,   34,   35,   36,   37,   69,   39,   40,   69,   69,
+ /*   410 */    69,   44,   95,   46,   47,   48,   49,   50,   51,   27,
+ /*   420 */    69,   29,   30,   31,   32,   69,   34,   35,   36,   37,
+ /*   430 */    69,   39,   40,   69,   69,   69,   44,   69,   46,   47,
+ /*   440 */    48,   49,   50,   51,   27,   69,   29,   30,   31,   32,
+ /*   450 */    69,   34,   35,   36,   37,   69,   39,   40,   69,   96,
+ /*   460 */    96,   44,   96,   46,   47,   48,   49,   50,   51,   27,
+ /*   470 */    96,   29,   30,   31,   32,   96,   34,   35,   36,   37,
+ /*   480 */    96,   39,   40,   96,   96,   96,   44,   96,   46,   47,
+ /*   490 */    48,   49,   50,   51,   27,   96,   29,   30,   31,   32,
+ /*   500 */    96,   34,   35,   36,   37,   96,   39,   40,   96,   96,
+ /*   510 */    96,   44,   96,   46,   47,   48,   49,   50,   51,   27,
+ /*   520 */    96,   29,   30,   31,   32,   96,   34,   35,   36,   37,
+ /*   530 */    96,   39,   40,   96,   96,   96,   44,   96,   46,   47,
+ /*   540 */    48,   49,   50,   51,   27,   96,   29,   30,   31,   32,
+ /*   550 */    96,   34,   35,   36,   37,   96,   39,   40,   96,   96,
+ /*   560 */    96,   44,   96,   46,   47,   48,   49,   50,   51,   27,
+ /*   570 */    96,   29,   30,   31,   32,   96,   34,   35,   36,   37,
+ /*   580 */    96,   39,   40,   96,   96,   96,   44,   96,   46,   47,
+ /*   590 */    48,   49,   50,   51,   27,   96,   29,   30,   31,   32,
+ /*   600 */    96,   34,   35,   36,   37,   96,   39,   40,   96,   96,
+ /*   610 */    96,   44,   96,   46,   47,   48,   49,   50,   51,   27,
+ /*   620 */    96,   29,   30,   31,   32,   96,   34,   35,   36,   37,
+ /*   630 */    96,   39,   40,   96,   96,   96,   44,   96,   46,   47,
+ /*   640 */    48,   49,   50,   51,   27,   96,   29,   30,   31,   32,
+ /*   650 */    96,   34,   35,   36,   37,   96,   39,   40,   96,   96,
+ /*   660 */    96,   44,   96,   46,   47,   48,   49,   50,   51,   27,
+ /*   670 */    96,   29,   30,   83,   32,   96,   34,   35,   36,   37,
+ /*   680 */    96,   39,   40,   93,   94,   95,   44,   96,   46,   47,
+ /*   690 */    48,   49,   50,   51,    4,    5,   96,    7,    8,    9,
+ /*   700 */    10,   11,   12,   13,   14,   15,   16,   17,   18,   19,
+ /*   710 */    20,   21,    5,   96,    7,    8,    9,   10,   11,   12,
+ /*   720 */    13,   14,   15,   16,   17,   18,   19,   20,   21,    7,
+ /*   730 */     8,    9,   10,   11,   12,   13,   14,   15,   16,   17,
+ /*   740 */    18,   19,   20,   21,   15,   96,   73,   22,   31,   32,
+ /*   750 */    96,   34,   96,   28,   96,   96,   83,   28,   15,   86,
+ /*   760 */    31,   32,   33,   34,   96,   92,   49,   94,   95,   96,
+ /*   770 */    41,   28,   96,    2,   31,   32,   33,   34,   49,   83,
+ /*   780 */    96,   64,   53,   54,   55,   56,   15,   96,   22,   93,
+ /*   790 */    94,   95,   49,   64,   28,   66,   53,   54,   55,   56,
+ /*   800 */    96,   83,   31,   32,   86,   34,   88,   64,   96,   66,
+ /*   810 */    96,   93,   94,   95,   15,   96,   22,   96,   31,   32,
+ /*   820 */    49,   34,   28,   96,   53,   54,   55,   56,   96,   58,
+ /*   830 */    31,   32,   96,   34,   96,   64,   49,   66,   96,   96,
+ /*   840 */    41,   96,   55,   56,    1,   15,   96,   96,   49,   96,
+ /*   850 */    96,   64,   53,   54,   55,   56,   57,   96,   28,   73,
+ /*   860 */    96,   31,   32,   64,   34,   66,   23,   24,   25,   83,
+ /*   870 */    84,   41,   86,   96,   15,   96,   96,   96,   92,   49,
+ /*   880 */    94,   95,    1,   53,   54,   55,   56,   28,   73,   96,
+ /*   890 */    31,   32,   96,   34,   64,   96,   66,   96,   83,   84,
+ /*   900 */    41,   86,   96,   15,   23,   24,   25,   92,   49,   94,
+ /*   910 */    95,   96,   53,   54,   55,   56,   28,   96,   96,   31,
+ /*   920 */    32,   96,   34,   64,   83,   66,   96,   86,   83,   88,
+ /*   930 */    89,   90,   15,   92,   93,   94,   95,   49,   96,   94,
+ /*   940 */    95,   53,   54,   55,   56,   28,   73,   96,   31,   32,
+ /*   950 */    96,   34,   64,   96,   66,   96,   83,   84,   96,   86,
+ /*   960 */    17,   18,   19,   20,   21,   92,   49,   94,   95,   96,
+ /*   970 */    53,   54,   55,   56,   58,   59,   60,   61,   62,   96,
+ /*   980 */    96,   64,   96,   66,   71,   96,   15,   74,   75,   76,
+ /*   990 */    77,   78,   79,   80,   81,   82,   72,   83,   85,    1,
+ /*  1000 */    87,   96,   31,   32,   90,   34,   92,   83,   94,   95,
+ /*  1010 */    86,   96,   88,   96,   15,   91,   92,   93,   94,   95,
+ /*  1020 */    49,   23,   24,   25,   53,   54,   55,   56,   57,   96,
+ /*  1030 */    31,   32,   83,   34,   96,   64,   96,   66,   83,   90,
+ /*  1040 */    15,   92,   96,   94,   95,    1,   96,   96,   49,   94,
+ /*  1050 */    95,   96,   53,   54,   55,   56,   31,   32,   96,   34,
+ /*  1060 */    96,   96,   96,   64,   96,   66,   96,   23,   24,   25,
+ /*  1070 */    96,   96,   83,   96,   49,   86,   72,   88,   53,   54,
+ /*  1080 */    55,   56,   93,   94,   95,   96,   96,   83,   96,   64,
+ /*  1090 */    86,   66,   88,   72,   96,   91,   92,   93,   94,   95,
+ /*  1100 */    96,   96,   96,   96,   83,   96,   72,   86,   96,   88,
+ /*  1110 */    96,   96,   91,   92,   93,   94,   95,   83,   96,   83,
+ /*  1120 */    86,   72,   88,   96,   96,   91,   92,   93,   94,   95,
+ /*  1130 */    94,   95,   83,   96,   83,   86,   72,   88,   96,   96,
+ /*  1140 */    91,   92,   93,   94,   95,   94,   95,   83,   96,   72,
+ /*  1150 */    86,   96,   88,   96,   96,   91,   92,   93,   94,   95,
+ /*  1160 */    83,   96,   72,   86,   96,   88,   96,   96,   91,   92,
+ /*  1170 */    93,   94,   95,   83,   96,   83,   86,   72,   88,   96,
+ /*  1180 */    96,   91,   92,   93,   94,   95,   94,   95,   83,   96,
+ /*  1190 */    72,   86,   96,   88,   96,   96,   91,   92,   93,   94,
+ /*  1200 */    95,   83,   96,   96,   86,   72,   88,   96,   96,   91,
+ /*  1210 */    92,   93,   94,   95,   15,   96,   83,   96,   96,   86,
+ /*  1220 */    96,   88,   96,   72,   91,   92,   93,   94,   95,   83,
+ /*  1230 */    31,   32,   96,   34,   83,    1,   96,   86,   96,   88,
+ /*  1240 */    94,   95,   91,   92,   93,   94,   95,   96,   49,   96,
+ /*  1250 */    72,   96,   96,   96,   55,   56,    1,   23,   24,   25,
+ /*  1260 */     1,   83,   96,   64,   86,   66,   88,   96,   96,   91,
+ /*  1270 */    92,   93,   94,   95,   72,   83,   96,   96,   23,   24,
+ /*  1280 */    25,   96,   23,   24,   25,   83,   94,   95,   86,   96,
+ /*  1290 */    88,   96,   96,   91,   92,   93,   94,   95,   83,   96,
+ /*  1300 */    96,   86,   96,   88,   96,   96,   91,   92,   93,   94,
+ /*  1310 */    95,   83,   96,   83,   86,   96,   88,   96,   96,   91,
+ /*  1320 */    92,   93,   94,   95,   94,   95,   83,   96,   96,   86,
+ /*  1330 */    96,   88,   96,   96,   91,   92,   93,   94,   95,   83,
+ /*  1340 */    96,   96,   86,   73,   88,   96,   96,   91,   92,   93,
+ /*  1350 */    94,   95,   96,   83,   84,   96,   86,   96,   96,   73,
+ /*  1360 */    96,   96,   92,   96,   94,   95,   96,    1,   96,   83,
+ /*  1370 */    96,   96,   86,   96,   96,   73,   96,   96,   92,   96,
+ /*  1380 */    94,   95,   73,   96,   96,   83,   96,   83,   86,   23,
+ /*  1390 */    24,   25,   83,   96,   92,   86,   94,   95,   94,   95,
+ /*  1400 */    83,   92,   96,   94,   95,   83,   96,   96,   86,   73,
+ /*  1410 */    88,   94,   95,   73,   96,   93,   94,   95,    1,   83,
+ /*  1420 */    96,    1,   86,   83,    1,   96,   86,   83,   92,   96,
+ /*  1430 */    94,   95,   92,    1,   94,   95,    1,   96,   94,   95,
+ /*  1440 */    23,   24,   25,   23,   24,   25,   23,   24,   25,    1,
+ /*  1450 */    96,   96,   96,   96,   96,   23,   24,   25,   23,   24,
+ /*  1460 */    25,    1,   96,   96,   96,   96,   96,   96,   96,   96,
+ /*  1470 */    96,   23,   24,   25,    1,   96,   96,   96,   96,   96,
+ /*  1480 */    96,   96,   96,   23,   24,   25,    1,   96,   96,   96,
+ /*  1490 */    96,   96,   96,   96,   96,   96,   23,   24,   25,    1,
+ /*  1500 */    96,   96,   96,   96,   96,   96,   96,   96,   23,   24,
+ /*  1510 */    25,    1,   96,   96,   96,   96,   96,   96,   96,   96,
+ /*  1520 */    96,   23,   24,   25,    1,   96,   96,   96,   96,   96,
+ /*  1530 */    96,   96,   96,   23,   24,   25,    1,   96,   96,   96,
+ /*  1540 */    96,   96,   96,   96,   96,   96,   23,   24,   25,    1,
+ /*  1550 */    96,   96,   96,   96,   96,   96,   96,   96,   23,   24,
+ /*  1560 */    25,    1,   96,   96,   96,   96,   96,   96,   96,   96,
+ /*  1570 */    96,   23,   24,   25,   96,   96,   96,   96,   96,   96,
+ /*  1580 */    96,   96,   96,   23,   24,   25,
 );
-    const YY_SHIFT_USE_DFLT = -25;
-    const YY_SHIFT_MAX = 187;
+    const YY_SHIFT_USE_DFLT = -39;
+    const YY_SHIFT_MAX = 197;
     static public $yy_shift_ofst = array(
- /*     0 */   -25,  101,   51,  -24,   76,    1,   26,  468,  426,  351,
- /*    10 */   201,  176,  126,  276,  326,  401,  251,  545,  301,  376,
- /*    20 */   151,  497,  226,  570,  668,  668,  668,  668,  668,  668,
- /*    30 */   668,  668,  668,  668,  848,  848,  848,  848, 1094,  698,
- /*    40 */   788,  820,  654,  728,  758,  834,  834,  834,  834,  834,
- /*    50 */  1094, 1094,  640,  640,  640,  640, 1094,  640,  829,  640,
- /*    60 */   640,  640,  640,  640,  640,  640,  640,  640,  640,  640,
- /*    70 */   640, 1357, 1375, 1364, 1379, 1353, 1313, 1254, 1265, 1243,
- /*    80 */  1232, 1269, 1320, 1309, 1291, 1342, 1298, 1287, 1331, 1196,
- /*    90 */  1276, 1247, 1240, 1335,  443,  -14,  -25,  -25,  -25,  -25,
- /*   100 */   -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,
- /*   110 */   -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  472,  543,
- /*   120 */   616,  616,  632,  647,  647,  548,  460,  143,  488,  483,
- /*   130 */    -4,   93,   53,  -17,  168,  218,   31,   16,   11,    6,
- /*   140 */    56,   61,   90,   89,   81,   65,  141,  231,  229,  191,
- /*   150 */   173,  239,  256,  243,  196,  241,  138,  164,  165,   40,
- /*   160 */   156,   62,  121,  189,  186,  166,  181,  116,  146,  158,
- /*   170 */    58,  161,  190,  240,  261,  211,  214,  216,   64,  106,
- /*   180 */   111,   -9,   36,  114,  139,  140,  131,  115,
+ /*     0 */   -39,  144,  195,   81,   -8,  117,   17,  542,  517,  592,
+ /*    10 */   567,  617,  392,  492,  297,  272,  247,  222,  342,  442,
+ /*    20 */   367,  467,  417,  642,  771,  771,  771,  771,  771,  771,
+ /*    30 */   771,  771,  771,  771,  771,  771,  771,  771, 1199, 1025,
+ /*    40 */  1025, 1025, 1025,  743,  971,  917,  888,  729,  830,  799,
+ /*    50 */   859,  999,  999,  999,  999,  999,  787,  787,  787,  184,
+ /*    60 */   184,  184,  717,  717,  106,  717,  717,  717,  717,  717,
+ /*    70 */   717,  717,  717,  717,  717,  717,  717, 1535, 1560, 1510,
+ /*    80 */  1498, 1485, 1523, 1548, 1423, 1255, 1259, 1234, 1417,  998,
+ /*    90 */  1044,  843,  881, 1366, 1460, 1435, 1448, 1473, 1432, 1420,
+ /*   100 */   154,  -22,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,
+ /*   110 */   -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,
+ /*   120 */   -39,  -39,  -39,  -39,   86,   -3,  193,   66,  346,  346,
+ /*   130 */   690,  707,  722,  722,  916,  943,  725,   49,  766,  121,
+ /*   140 */   794,   30,   47,   -2,   90,  149,  134,   71,  131,  158,
+ /*   150 */   189,  122,   31,    7,    2,   91,  130,   12,  111,  -38,
+ /*   160 */   159,  324,  287,  150,  248,  282,  150,  264,  277,  286,
+ /*   170 */   289,  312,  314,  311,  249,  307,  310,  261,  217,  219,
+ /*   180 */   209,  191,  208,  227,  252,  257,  237,  235,  234,  262,
+ /*   190 */   207,  253,  232,  200,  210,  260,  302,  157,
 );
-    const YY_REDUCE_USE_DFLT = -68;
-    const YY_REDUCE_MAX = 117;
+    const YY_REDUCE_USE_DFLT = -1;
+    const YY_REDUCE_MAX = 123;
     static public $yy_reduce_ofst = array(
- /*     0 */    -1,  752,  752,  752,  752,  752,  752,  752,  752,  752,
- /*    10 */   752,  752,  752,  752,  752,  752,  752,  752,  752,  752,
- /*    20 */   752,  752,  752,  752,  895,  911,  925,  877,  953,  863,
- /*    30 */   833,  849,  939,  967, 1023, 1009,  995,  981,  655,  683,
- /*    40 */  1057, 1039, 1072, 1072, 1072, 1144, 1114, 1129, 1088, 1101,
- /*    50 */   707, 1150,  880, 1154,  517, 1158,  620,  597,  814,  713,
- /*    60 */  1052,  763,  816,  882,  797,  722,  800,  898, 1025,  -42,
- /*    70 */   -67,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,
- /*    80 */   -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,
- /*    90 */   -57,  -57,  -57,  -57,  228,  208,  274,  284,  273,  272,
- /*   100 */   234,  224,  223,  209,  222,  244,  247,  294,  269,  264,
- /*   110 */   259,  248,  249,  289,  297,  309,  298,  299,
+ /*     0 */    54,  913,  913,  913,  913,  913,  913,  913,  913,  913,
+ /*    10 */   913,  913,  913,  913,  913,  913,  913,  913,  913,  913,
+ /*    20 */   913,  913,  913,  913, 1202, 1178, 1049, 1034, 1004, 1077,
+ /*    30 */  1133, 1105, 1090, 1118,  924, 1064, 1021, 1151,  841, 1256,
+ /*    40 */  1215, 1243, 1228,  815,  786, 1270,  873,  673,  673,  673,
+ /*    50 */   673, 1286, 1302, 1309, 1340, 1336,  718, 1322,  989,  949,
+ /*    60 */   914,   41,  696,  590, 1230,  845,  955, 1092, 1304, 1051,
+ /*    70 */  1192, 1146, 1317, 1344, 1036,  288,  317,  298,  298,  298,
+ /*    80 */   298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
+ /*    90 */   298,  298,  298,  298,  298,  298,  298,  298,  298,  298,
+ /*   100 */   278,  294,  356,  306,  315,  339,  256,  340,  341,  336,
+ /*   110 */   331,  316,  318,  326,  351,  386,  365,  364,  361,  389,
+ /*   120 */   366,  368,  381,  376,
 );
     static public $yyExpectedTokens = array(
         /* 0 */ array(),
-        /* 1 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 42, 43, 44, 45, 46, 47, 48, ),
-        /* 2 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 42, 43, 44, 45, 46, 47, 48, ),
-        /* 3 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 42, 43, 44, 45, 46, 47, 48, ),
-        /* 4 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 40, 41, 43, 44, 45, 46, 47, 48, ),
-        /* 5 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 42, 43, 44, 45, 46, 47, 48, ),
-        /* 6 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 42, 43, 44, 45, 46, 47, 48, ),
-        /* 7 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 43, 44, 45, 46, 47, 48, ),
-        /* 8 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 43, 44, 45, 46, 47, 48, ),
-        /* 9 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 43, 44, 45, 46, 47, 48, ),
-        /* 10 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 43, 44, 45, 46, 47, 48, ),
-        /* 11 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 43, 44, 45, 46, 47, 48, ),
-        /* 12 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 43, 44, 45, 46, 47, 48, ),
-        /* 13 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 43, 44, 45, 46, 47, 48, ),
-        /* 14 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 43, 44, 45, 46, 47, 48, ),
-        /* 15 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 43, 44, 45, 46, 47, 48, ),
-        /* 16 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 43, 44, 45, 46, 47, 48, ),
-        /* 17 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 43, 44, 45, 46, 47, 48, ),
-        /* 18 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 43, 44, 45, 46, 47, 48, ),
-        /* 19 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 43, 44, 45, 46, 47, 48, ),
-        /* 20 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 43, 44, 45, 46, 47, 48, ),
-        /* 21 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 43, 44, 45, 46, 47, 48, ),
-        /* 22 */ array(24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 41, 43, 44, 45, 46, 47, 48, ),
-        /* 23 */ array(24, 26, 27, 29, 31, 32, 33, 34, 36, 37, 41, 43, 44, 45, 46, 47, 48, ),
-        /* 24 */ array(2, 13, 28, 29, 31, 46, 51, 52, 53, 54, 56, 62, 64, ),
-        /* 25 */ array(2, 13, 28, 29, 31, 46, 51, 52, 53, 54, 56, 62, 64, ),
-        /* 26 */ array(2, 13, 28, 29, 31, 46, 51, 52, 53, 54, 56, 62, 64, ),
-        /* 27 */ array(2, 13, 28, 29, 31, 46, 51, 52, 53, 54, 56, 62, 64, ),
-        /* 28 */ array(2, 13, 28, 29, 31, 46, 51, 52, 53, 54, 56, 62, 64, ),
-        /* 29 */ array(2, 13, 28, 29, 31, 46, 51, 52, 53, 54, 56, 62, 64, ),
-        /* 30 */ array(2, 13, 28, 29, 31, 46, 51, 52, 53, 54, 56, 62, 64, ),
-        /* 31 */ array(2, 13, 28, 29, 31, 46, 51, 52, 53, 54, 56, 62, 64, ),
-        /* 32 */ array(2, 13, 28, 29, 31, 46, 51, 52, 53, 54, 56, 62, 64, ),
-        /* 33 */ array(2, 13, 28, 29, 31, 46, 51, 52, 53, 54, 56, 62, 64, ),
-        /* 34 */ array(13, 28, 29, 31, 46, 51, 52, 53, 54, 62, 64, ),
-        /* 35 */ array(13, 28, 29, 31, 46, 51, 52, 53, 54, 62, 64, ),
-        /* 36 */ array(13, 28, 29, 31, 46, 51, 52, 53, 54, 62, 64, ),
-        /* 37 */ array(13, 28, 29, 31, 46, 51, 52, 53, 54, 62, 64, ),
-        /* 38 */ array(13, 28, 29, 31, 46, 62, 64, ),
-        /* 39 */ array(13, 25, 28, 29, 30, 31, 46, 51, 52, 53, 54, 62, 64, ),
-        /* 40 */ array(13, 25, 28, 29, 31, 46, 51, 52, 53, 54, 62, 64, ),
-        /* 41 */ array(13, 25, 28, 29, 31, 46, 51, 52, 53, 54, 62, 64, ),
-        /* 42 */ array(13, 25, 28, 29, 30, 31, 38, 46, 51, 52, 53, 54, 62, 64, ),
-        /* 43 */ array(13, 25, 28, 29, 31, 38, 46, 51, 52, 53, 54, 62, 64, ),
-        /* 44 */ array(13, 25, 28, 29, 31, 38, 46, 51, 52, 53, 54, 62, 64, ),
-        /* 45 */ array(13, 28, 29, 31, 46, 51, 52, 53, 54, 62, 64, ),
-        /* 46 */ array(13, 28, 29, 31, 46, 51, 52, 53, 54, 62, 64, ),
-        /* 47 */ array(13, 28, 29, 31, 46, 51, 52, 53, 54, 62, 64, ),
-        /* 48 */ array(13, 28, 29, 31, 46, 51, 52, 53, 54, 62, 64, ),
-        /* 49 */ array(13, 28, 29, 31, 46, 51, 52, 53, 54, 62, 64, ),
-        /* 50 */ array(13, 28, 29, 31, 46, 62, 64, ),
-        /* 51 */ array(13, 28, 29, 31, 46, 62, 64, ),
-        /* 52 */ array(28, 29, 31, 46, 62, ),
-        /* 53 */ array(28, 29, 31, 46, 62, ),
-        /* 54 */ array(28, 29, 31, 46, 62, ),
-        /* 55 */ array(28, 29, 31, 46, 62, ),
-        /* 56 */ array(13, 28, 29, 31, 46, 62, 64, ),
-        /* 57 */ array(28, 29, 31, 46, 62, ),
-        /* 58 */ array(25, 28, 29, 31, 46, 62, ),
-        /* 59 */ array(28, 29, 31, 46, 62, ),
-        /* 60 */ array(28, 29, 31, 46, 62, ),
-        /* 61 */ array(28, 29, 31, 46, 62, ),
-        /* 62 */ array(28, 29, 31, 46, 62, ),
-        /* 63 */ array(28, 29, 31, 46, 62, ),
-        /* 64 */ array(28, 29, 31, 46, 62, ),
-        /* 65 */ array(28, 29, 31, 46, 62, ),
-        /* 66 */ array(28, 29, 31, 46, 62, ),
-        /* 67 */ array(28, 29, 31, 46, 62, ),
-        /* 68 */ array(28, 29, 31, 46, 62, ),
-        /* 69 */ array(28, 29, 31, 46, 62, ),
-        /* 70 */ array(28, 29, 31, 46, 62, ),
-        /* 71 */ array(1, 20, 21, 22, ),
-        /* 72 */ array(1, 20, 21, 22, ),
-        /* 73 */ array(1, 20, 21, 22, ),
-        /* 74 */ array(1, 20, 21, 22, ),
-        /* 75 */ array(1, 20, 21, 22, ),
-        /* 76 */ array(1, 20, 21, 22, ),
-        /* 77 */ array(1, 20, 21, 22, ),
-        /* 78 */ array(1, 20, 21, 22, ),
-        /* 79 */ array(1, 20, 21, 22, ),
-        /* 80 */ array(1, 20, 21, 22, ),
-        /* 81 */ array(1, 20, 21, 22, ),
-        /* 82 */ array(1, 20, 21, 22, ),
-        /* 83 */ array(1, 20, 21, 22, ),
-        /* 84 */ array(1, 20, 21, 22, ),
-        /* 85 */ array(1, 20, 21, 22, ),
-        /* 86 */ array(1, 20, 21, 22, ),
-        /* 87 */ array(1, 20, 21, 22, ),
-        /* 88 */ array(1, 20, 21, 22, ),
-        /* 89 */ array(1, 20, 21, 22, ),
-        /* 90 */ array(1, 20, 21, 22, ),
-        /* 91 */ array(1, 20, 21, 22, ),
-        /* 92 */ array(1, 20, 21, 22, ),
-        /* 93 */ array(1, 20, 21, 22, ),
-        /* 94 */ array(13, 25, 64, ),
-        /* 95 */ array(53, 54, ),
-        /* 96 */ array(),
-        /* 97 */ array(),
-        /* 98 */ array(),
-        /* 99 */ array(),
-        /* 100 */ array(),
-        /* 101 */ array(),
+        /* 1 */ array(27, 29, 30, 31, 32, 34, 35, 36, 37, 39, 40, 44, 45, 46, 47, 48, 49, 50, 51, ),
+        /* 2 */ array(27, 29, 30, 31, 32, 34, 35, 36, 37, 39, 40, 44, 45, 46, 47, 48, 49, 50, 51, ),
+        /* 3 */ array(27, 29, 30, 31, 32, 34, 35, 36, 37, 39, 40, 44, 45, 46, 47, 48, 49, 50, 51, ),
+        /* 4 */ array(27, 29, 30, 31, 32, 34, 35, 36, 37, 39, 40, 44, 45, 46, 47, 48, 49, 50, 51, ),
+        /* 5 */ array(27, 29, 30, 31, 32, 34, 35, 36, 37, 39, 40, 43, 44, 46, 47, 48, 49, 50, 51, ),
+        /* 6 */ array(27, 29, 30, 31, 32, 34, 35, 36, 37, 39, 40, 44, 45, 46, 47, 48, 49, 50, 51, ),
+        /* 7 */ array(27, 29, 30, 31, 32, 34, 35, 36, 37, 39, 40, 44, 46, 47, 48, 49, 50, 51, ),
+        /* 8 */ array(27, 29, 30, 31, 32, 34, 35, 36, 37, 39, 40, 44, 46, 47, 48, 49, 50, 51, ),
+        /* 9 */ array(27, 29, 30, 31, 32, 34, 35, 36, 37, 39, 40, 44, 46, 47, 48, 49, 50, 51, ),
+        /* 10 */ array(27, 29, 30, 31, 32, 34, 35, 36, 37, 39, 40, 44, 46, 47, 48, 49, 50, 51, ),
+        /* 11 */ array(27, 29, 30, 31, 32, 34, 35, 36, 37, 39, 40, 44, 46, 47, 48, 49, 50, 51, ),
+        /* 12 */ array(27, 29, 30, 31, 32, 34, 35, 36, 37, 39, 40, 44, 46, 47, 48, 49, 50, 51, ),
+        /* 13 */ array(27, 29, 30, 31, 32, 34, 35, 36, 37, 39, 40, 44, 46, 47, 48, 49, 50, 51, ),
+        /* 14 */ array(27, 29, 30, 31, 32, 34, 35, 36, 37, 39, 40, 44, 46, 47, 48, 49, 50, 51, ),
+        /* 15 */ array(27, 29, 30, 31, 32, 34, 35, 36, 37, 39, 40, 44, 46, 47, 48, 49, 50, 51, ),
+        /* 16 */ array(27, 29, 30, 31, 32, 34, 35, 36, 37, 39, 40, 44, 46, 47, 48, 49, 50, 51, ),
+        /* 17 */ array(27, 29, 30, 31, 32, 34, 35, 36, 37, 39, 40, 44, 46, 47, 48, 49, 50, 51, ),
+        /* 18 */ array(27, 29, 30, 31, 32, 34, 35, 36, 37, 39, 40, 44, 46, 47, 48, 49, 50, 51, ),
+        /* 19 */ array(27, 29, 30, 31, 32, 34, 35, 36, 37, 39, 40, 44, 46, 47, 48, 49, 50, 51, ),
+        /* 20 */ array(27, 29, 30, 31, 32, 34, 35, 36, 37, 39, 40, 44, 46, 47, 48, 49, 50, 51, ),
+        /* 21 */ array(27, 29, 30, 31, 32, 34, 35, 36, 37, 39, 40, 44, 46, 47, 48, 49, 50, 51, ),
+        /* 22 */ array(27, 29, 30, 31, 32, 34, 35, 36, 37, 39, 40, 44, 46, 47, 48, 49, 50, 51, ),
+        /* 23 */ array(27, 29, 30, 32, 34, 35, 36, 37, 39, 40, 44, 46, 47, 48, 49, 50, 51, ),
+        /* 24 */ array(2, 15, 31, 32, 34, 49, 53, 54, 55, 56, 58, 64, 66, ),
+        /* 25 */ array(2, 15, 31, 32, 34, 49, 53, 54, 55, 56, 58, 64, 66, ),
+        /* 26 */ array(2, 15, 31, 32, 34, 49, 53, 54, 55, 56, 58, 64, 66, ),
+        /* 27 */ array(2, 15, 31, 32, 34, 49, 53, 54, 55, 56, 58, 64, 66, ),
+        /* 28 */ array(2, 15, 31, 32, 34, 49, 53, 54, 55, 56, 58, 64, 66, ),
+        /* 29 */ array(2, 15, 31, 32, 34, 49, 53, 54, 55, 56, 58, 64, 66, ),
+        /* 30 */ array(2, 15, 31, 32, 34, 49, 53, 54, 55, 56, 58, 64, 66, ),
+        /* 31 */ array(2, 15, 31, 32, 34, 49, 53, 54, 55, 56, 58, 64, 66, ),
+        /* 32 */ array(2, 15, 31, 32, 34, 49, 53, 54, 55, 56, 58, 64, 66, ),
+        /* 33 */ array(2, 15, 31, 32, 34, 49, 53, 54, 55, 56, 58, 64, 66, ),
+        /* 34 */ array(2, 15, 31, 32, 34, 49, 53, 54, 55, 56, 58, 64, 66, ),
+        /* 35 */ array(2, 15, 31, 32, 34, 49, 53, 54, 55, 56, 58, 64, 66, ),
+        /* 36 */ array(2, 15, 31, 32, 34, 49, 53, 54, 55, 56, 58, 64, 66, ),
+        /* 37 */ array(2, 15, 31, 32, 34, 49, 53, 54, 55, 56, 58, 64, 66, ),
+        /* 38 */ array(15, 31, 32, 34, 49, 55, 56, 64, 66, ),
+        /* 39 */ array(15, 31, 32, 34, 49, 53, 54, 55, 56, 64, 66, ),
+        /* 40 */ array(15, 31, 32, 34, 49, 53, 54, 55, 56, 64, 66, ),
+        /* 41 */ array(15, 31, 32, 34, 49, 53, 54, 55, 56, 64, 66, ),
+        /* 42 */ array(15, 31, 32, 34, 49, 53, 54, 55, 56, 64, 66, ),
+        /* 43 */ array(15, 28, 31, 32, 33, 34, 49, 53, 54, 55, 56, 64, 66, ),
+        /* 44 */ array(15, 31, 32, 34, 49, 53, 54, 55, 56, 57, 64, 66, ),
+        /* 45 */ array(15, 28, 31, 32, 34, 49, 53, 54, 55, 56, 64, 66, ),
+        /* 46 */ array(15, 28, 31, 32, 34, 49, 53, 54, 55, 56, 64, 66, ),
+        /* 47 */ array(15, 28, 31, 32, 33, 34, 41, 49, 53, 54, 55, 56, 64, 66, ),
+        /* 48 */ array(15, 28, 31, 32, 34, 41, 49, 53, 54, 55, 56, 64, 66, ),
+        /* 49 */ array(15, 31, 32, 34, 41, 49, 53, 54, 55, 56, 57, 64, 66, ),
+        /* 50 */ array(15, 28, 31, 32, 34, 41, 49, 53, 54, 55, 56, 64, 66, ),
+        /* 51 */ array(15, 31, 32, 34, 49, 53, 54, 55, 56, 64, 66, ),
+        /* 52 */ array(15, 31, 32, 34, 49, 53, 54, 55, 56, 64, 66, ),
+        /* 53 */ array(15, 31, 32, 34, 49, 53, 54, 55, 56, 64, 66, ),
+        /* 54 */ array(15, 31, 32, 34, 49, 53, 54, 55, 56, 64, 66, ),
+        /* 55 */ array(15, 31, 32, 34, 49, 53, 54, 55, 56, 64, 66, ),
+        /* 56 */ array(31, 32, 34, 49, 55, 56, 64, ),
+        /* 57 */ array(31, 32, 34, 49, 55, 56, 64, ),
+        /* 58 */ array(31, 32, 34, 49, 55, 56, 64, ),
+        /* 59 */ array(15, 31, 32, 34, 49, 64, 66, ),
+        /* 60 */ array(15, 31, 32, 34, 49, 64, 66, ),
+        /* 61 */ array(15, 31, 32, 34, 49, 64, 66, ),
+        /* 62 */ array(31, 32, 34, 49, 64, ),
+        /* 63 */ array(31, 32, 34, 49, 64, ),
+        /* 64 */ array(28, 31, 32, 34, 49, 64, ),
+        /* 65 */ array(31, 32, 34, 49, 64, ),
+        /* 66 */ array(31, 32, 34, 49, 64, ),
+        /* 67 */ array(31, 32, 34, 49, 64, ),
+        /* 68 */ array(31, 32, 34, 49, 64, ),
+        /* 69 */ array(31, 32, 34, 49, 64, ),
+        /* 70 */ array(31, 32, 34, 49, 64, ),
+        /* 71 */ array(31, 32, 34, 49, 64, ),
+        /* 72 */ array(31, 32, 34, 49, 64, ),
+        /* 73 */ array(31, 32, 34, 49, 64, ),
+        /* 74 */ array(31, 32, 34, 49, 64, ),
+        /* 75 */ array(31, 32, 34, 49, 64, ),
+        /* 76 */ array(31, 32, 34, 49, 64, ),
+        /* 77 */ array(1, 23, 24, 25, ),
+        /* 78 */ array(1, 23, 24, 25, ),
+        /* 79 */ array(1, 23, 24, 25, ),
+        /* 80 */ array(1, 23, 24, 25, ),
+        /* 81 */ array(1, 23, 24, 25, ),
+        /* 82 */ array(1, 23, 24, 25, ),
+        /* 83 */ array(1, 23, 24, 25, ),
+        /* 84 */ array(1, 23, 24, 25, ),
+        /* 85 */ array(1, 23, 24, 25, ),
+        /* 86 */ array(1, 23, 24, 25, ),
+        /* 87 */ array(1, 23, 24, 25, ),
+        /* 88 */ array(1, 23, 24, 25, ),
+        /* 89 */ array(1, 23, 24, 25, ),
+        /* 90 */ array(1, 23, 24, 25, ),
+        /* 91 */ array(1, 23, 24, 25, ),
+        /* 92 */ array(1, 23, 24, 25, ),
+        /* 93 */ array(1, 23, 24, 25, ),
+        /* 94 */ array(1, 23, 24, 25, ),
+        /* 95 */ array(1, 23, 24, 25, ),
+        /* 96 */ array(1, 23, 24, 25, ),
+        /* 97 */ array(1, 23, 24, 25, ),
+        /* 98 */ array(1, 23, 24, 25, ),
+        /* 99 */ array(1, 23, 24, 25, ),
+        /* 100 */ array(15, 28, 66, ),
+        /* 101 */ array(55, 56, ),
         /* 102 */ array(),
         /* 103 */ array(),
         /* 104 */ array(),
@@ -729,86 +769,86 @@ static public $yy_action = array(
         /* 115 */ array(),
         /* 116 */ array(),
         /* 117 */ array(),
-        /* 118 */ array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 55, ),
-        /* 119 */ array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 25, ),
-        /* 120 */ array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ),
-        /* 121 */ array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ),
-        /* 122 */ array(4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ),
-        /* 123 */ array(5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ),
-        /* 124 */ array(5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ),
-        /* 125 */ array(15, 16, 17, 18, 19, ),
-        /* 126 */ array(57, 58, 59, 60, ),
-        /* 127 */ array(18, 25, ),
-        /* 128 */ array(18, 49, ),
-        /* 129 */ array(25, 39, ),
-        /* 130 */ array(18, 19, ),
-        /* 131 */ array(18, 25, ),
-        /* 132 */ array(11, 38, ),
-        /* 133 */ array(18, 23, ),
-        /* 134 */ array(50, 63, ),
-        /* 135 */ array(18, 25, ),
-        /* 136 */ array(25, ),
-        /* 137 */ array(25, ),
-        /* 138 */ array(25, ),
-        /* 139 */ array(25, ),
-        /* 140 */ array(25, ),
-        /* 141 */ array(25, ),
-        /* 142 */ array(25, ),
-        /* 143 */ array(25, ),
-        /* 144 */ array(25, ),
-        /* 145 */ array(25, ),
-        /* 146 */ array(25, ),
-        /* 147 */ array(25, ),
-        /* 148 */ array(11, ),
-        /* 149 */ array(25, ),
-        /* 150 */ array(53, ),
-        /* 151 */ array(25, ),
-        /* 152 */ array(25, ),
-        /* 153 */ array(25, ),
-        /* 154 */ array(55, ),
-        /* 155 */ array(25, ),
-        /* 156 */ array(63, ),
-        /* 157 */ array(25, ),
-        /* 158 */ array(25, ),
-        /* 159 */ array(61, ),
-        /* 160 */ array(25, ),
-        /* 161 */ array(64, ),
-        /* 162 */ array(30, ),
-        /* 163 */ array(25, ),
-        /* 164 */ array(25, ),
-        /* 165 */ array(25, ),
-        /* 166 */ array(25, ),
-        /* 167 */ array(25, ),
-        /* 168 */ array(30, ),
-        /* 169 */ array(35, ),
-        /* 170 */ array(18, ),
-        /* 171 */ array(25, ),
-        /* 172 */ array(25, ),
-        /* 173 */ array(25, ),
-        /* 174 */ array(25, ),
-        /* 175 */ array(50, ),
-        /* 176 */ array(25, ),
-        /* 177 */ array(25, ),
-        /* 178 */ array(25, ),
-        /* 179 */ array(25, ),
-        /* 180 */ array(25, ),
-        /* 181 */ array(25, ),
-        /* 182 */ array(25, ),
-        /* 183 */ array(25, ),
-        /* 184 */ array(25, ),
-        /* 185 */ array(25, ),
-        /* 186 */ array(25, ),
-        /* 187 */ array(25, ),
-        /* 188 */ array(),
-        /* 189 */ array(),
-        /* 190 */ array(),
-        /* 191 */ array(),
-        /* 192 */ array(),
-        /* 193 */ array(),
-        /* 194 */ array(),
-        /* 195 */ array(),
-        /* 196 */ array(),
-        /* 197 */ array(),
+        /* 118 */ array(),
+        /* 119 */ array(),
+        /* 120 */ array(),
+        /* 121 */ array(),
+        /* 122 */ array(),
+        /* 123 */ array(),
+        /* 124 */ array(3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 57, ),
+        /* 125 */ array(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, ),
+        /* 126 */ array(3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 28, ),
+        /* 127 */ array(3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 26, ),
+        /* 128 */ array(3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, ),
+        /* 129 */ array(3, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, ),
+        /* 130 */ array(4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, ),
+        /* 131 */ array(5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, ),
+        /* 132 */ array(7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, ),
+        /* 133 */ array(7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, ),
+        /* 134 */ array(58, 59, 60, 61, 62, ),
+        /* 135 */ array(17, 18, 19, 20, 21, ),
+        /* 136 */ array(22, 28, ),
+        /* 137 */ array(6, 65, ),
+        /* 138 */ array(22, 28, ),
+        /* 139 */ array(20, 21, ),
+        /* 140 */ array(22, 28, ),
+        /* 141 */ array(28, 42, ),
+        /* 142 */ array(13, 41, ),
+        /* 143 */ array(22, 52, ),
+        /* 144 */ array(55, ),
+        /* 145 */ array(28, ),
+        /* 146 */ array(28, ),
+        /* 147 */ array(38, ),
+        /* 148 */ array(28, ),
+        /* 149 */ array(28, ),
+        /* 150 */ array(28, ),
+        /* 151 */ array(28, ),
+        /* 152 */ array(28, ),
+        /* 153 */ array(28, ),
+        /* 154 */ array(28, ),
+        /* 155 */ array(28, ),
+        /* 156 */ array(28, ),
+        /* 157 */ array(33, ),
+        /* 158 */ array(28, ),
+        /* 159 */ array(63, ),
+        /* 160 */ array(28, ),
+        /* 161 */ array(28, ),
+        /* 162 */ array(13, ),
+        /* 163 */ array(22, ),
+        /* 164 */ array(65, ),
+        /* 165 */ array(28, ),
+        /* 166 */ array(22, ),
+        /* 167 */ array(28, ),
+        /* 168 */ array(28, ),
+        /* 169 */ array(28, ),
+        /* 170 */ array(28, ),
+        /* 171 */ array(28, ),
+        /* 172 */ array(28, ),
+        /* 173 */ array(28, ),
+        /* 174 */ array(66, ),
+        /* 175 */ array(28, ),
+        /* 176 */ array(28, ),
+        /* 177 */ array(28, ),
+        /* 178 */ array(6, ),
+        /* 179 */ array(28, ),
+        /* 180 */ array(28, ),
+        /* 181 */ array(28, ),
+        /* 182 */ array(28, ),
+        /* 183 */ array(28, ),
+        /* 184 */ array(28, ),
+        /* 185 */ array(28, ),
+        /* 186 */ array(28, ),
+        /* 187 */ array(28, ),
+        /* 188 */ array(33, ),
+        /* 189 */ array(28, ),
+        /* 190 */ array(57, ),
+        /* 191 */ array(22, ),
+        /* 192 */ array(28, ),
+        /* 193 */ array(28, ),
+        /* 194 */ array(28, ),
+        /* 195 */ array(28, ),
+        /* 196 */ array(28, ),
+        /* 197 */ array(28, ),
         /* 198 */ array(),
         /* 199 */ array(),
         /* 200 */ array(),
@@ -876,35 +916,49 @@ static public $yy_action = array(
         /* 262 */ array(),
         /* 263 */ array(),
         /* 264 */ array(),
+        /* 265 */ array(),
+        /* 266 */ array(),
+        /* 267 */ array(),
+        /* 268 */ array(),
+        /* 269 */ array(),
+        /* 270 */ array(),
+        /* 271 */ array(),
+        /* 272 */ array(),
+        /* 273 */ array(),
+        /* 274 */ array(),
+        /* 275 */ array(),
+        /* 276 */ array(),
+        /* 277 */ array(),
 );
     static public $yy_default = array(
- /*     0 */   267,  354,  354,  354,  354,  354,  354,  354,  354,  354,
- /*    10 */   354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
- /*    20 */   354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
- /*    30 */   354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
- /*    40 */   354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
- /*    50 */   354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
- /*    60 */   354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
- /*    70 */   354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
- /*    80 */   354,  354,  354,  354,  354,  354,  265,  354,  354,  354,
- /*    90 */   354,  354,  354,  354,  354,  354,  267,  267,  267,  267,
- /*   100 */   267,  267,  267,  267,  267,  267,  267,  267,  267,  267,
- /*   110 */   267,  267,  267,  267,  267,  267,  267,  267,  354,  354,
- /*   120 */   292,  334,  335,  336,  338,  337,  343,  354,  354,  354,
- /*   130 */   339,  354,  354,  354,  320,  354,  354,  354,  354,  354,
- /*   140 */   354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
- /*   150 */   354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
- /*   160 */   354,  354,  354,  354,  354,  354,  354,  354,  354,  354,
- /*   170 */   328,  354,  354,  354,  354,  320,  354,  354,  354,  354,
- /*   180 */   354,  354,  354,  354,  354,  354,  354,  354,  271,  289,
- /*   190 */   296,  306,  313,  270,  315,  299,  351,  316,  269,  304,
- /*   200 */   298,  350,  349,  314,  297,  276,  277,  275,  274,  353,
- /*   210 */   273,  278,  279,  284,  285,  283,  282,  280,  281,  352,
- /*   220 */   347,  325,  326,  324,  272,  266,  268,  327,  332,  345,
- /*   230 */   346,  348,  344,  333,  286,  287,  301,  302,  300,  295,
- /*   240 */   293,  294,  303,  305,  310,  311,  309,  308,  307,  342,
- /*   250 */   341,  290,  291,  288,  323,  321,  322,  317,  319,  331,
- /*   260 */   340,  330,  329,  318,  312,
+ /*     0 */   280,  372,  372,  372,  372,  372,  372,  372,  372,  372,
+ /*    10 */   372,  372,  372,  372,  372,  372,  372,  372,  372,  372,
+ /*    20 */   372,  372,  372,  372,  372,  372,  372,  372,  372,  372,
+ /*    30 */   372,  372,  372,  372,  372,  372,  372,  372,  372,  372,
+ /*    40 */   372,  372,  372,  372,  372,  372,  372,  372,  372,  372,
+ /*    50 */   372,  372,  372,  372,  372,  372,  372,  372,  372,  372,
+ /*    60 */   372,  372,  372,  372,  372,  372,  372,  372,  372,  372,
+ /*    70 */   372,  372,  372,  372,  372,  372,  372,  372,  372,  372,
+ /*    80 */   278,  372,  372,  372,  372,  372,  372,  372,  372,  372,
+ /*    90 */   372,  372,  372,  372,  372,  372,  372,  372,  372,  372,
+ /*   100 */   372,  372,  280,  280,  280,  280,  280,  280,  280,  280,
+ /*   110 */   280,  280,  280,  280,  280,  280,  280,  280,  280,  280,
+ /*   120 */   280,  280,  280,  280,  372,  372,  372,  372,  305,  349,
+ /*   130 */   350,  351,  353,  348,  361,  352,  372,  334,  372,  354,
+ /*   140 */   372,  372,  372,  372,  372,  372,  372,  372,  372,  372,
+ /*   150 */   372,  372,  372,  372,  372,  372,  372,  372,  372,  372,
+ /*   160 */   372,  372,  372,  372,  372,  372,  345,  372,  372,  372,
+ /*   170 */   372,  372,  372,  372,  372,  372,  372,  372,  334,  372,
+ /*   180 */   372,  372,  372,  372,  372,  372,  372,  372,  372,  372,
+ /*   190 */   372,  342,  372,  372,  372,  372,  372,  372,  302,  281,
+ /*   200 */   279,  328,  368,  319,  284,  285,  327,  311,  326,  312,
+ /*   210 */   369,  367,  317,  329,  282,  283,  309,  313,  296,  297,
+ /*   220 */   365,  295,  293,  294,  298,  299,  335,  304,  303,  301,
+ /*   230 */   300,  336,  292,  291,  359,  362,  337,  360,  370,  371,
+ /*   240 */   363,  364,  289,  290,  288,  287,  286,  330,  333,  320,
+ /*   250 */   341,  346,  318,  315,  316,  321,  340,  338,  324,  323,
+ /*   260 */   339,  322,  347,  314,  355,  356,  344,  343,  331,  332,
+ /*   270 */   357,  358,  310,  366,  308,  307,  306,  325,
 );
 /* The next thing included is series of defines which control
 ** various aspects of the generated parser.
@@ -921,11 +975,11 @@ static public $yy_action = array(
 **    self::YYERRORSYMBOL is the code number of the error symbol.  If not
 **                        defined, then do no error processing.
 */
-    const YYNOCODE = 95;
+    const YYNOCODE = 97;
     const YYSTACKDEPTH = 100;
-    const YYNSTATE = 265;
-    const YYNRULE = 89;
-    const YYERRORSYMBOL = 65;
+    const YYNSTATE = 278;
+    const YYNRULE = 94;
+    const YYERRORSYMBOL = 67;
     const YYERRSYMDT = 'yy0';
     const YYFALLBACK = 0;
     /** The next table maps tokens into fallback tokens.  If a construct
@@ -1008,29 +1062,29 @@ static public $yy_action = array(
      */
     static public $yyTokenName = array( 
   '$',             'T_TAG_OPEN',    'T_NOT',         'T_AND',       
-  'T_OR',          'T_EQ',          'T_NE',          'T_GT',        
-  'T_GE',          'T_LT',          'T_LE',          'T_IN',        
-  'T_PLUS',        'T_MINUS',       'T_CONCAT',      'T_TIMES',     
-  'T_DIV',         'T_MOD',         'T_PIPE',        'T_BITWISE',   
-  'T_HTML',        'T_COMMENT',     'T_PRINT_OPEN',  'T_PRINT_CLOSE',
-  'T_EXTENDS',     'T_TAG_CLOSE',   'T_INCLUDE',     'T_AUTOESCAPE',
-  'T_CUSTOM_END',  'T_CUSTOM_TAG',  'T_AS',          'T_CUSTOM_BLOCK',
-  'T_SPACEFULL',   'T_WITH',        'T_SET',         'T_ASSIGN',    
-  'T_LOAD',        'T_FOR',         'T_COMMA',       'T_STEP',      
-  'T_EMPTY',       'T_IF',          'T_ELSE',        'T_IFCHANGED', 
-  'T_IFEQUAL',     'T_IFNOTEQUAL',  'T_BLOCK',       'T_FILTER',    
-  'T_REGROUP',     'T_BY',          'T_COLON',       'T_TRUE',      
-  'T_FALSE',       'T_STRING',      'T_INTL',        'T_RPARENT',   
-  'T_LPARENT',     'T_OBJ',         'T_DOT',         'T_CLASS',     
-  'T_BRACKETS_OPEN',  'T_BRACKETS_CLOSE',  'T_ALPHA',       'T_DOTDOT',    
-  'T_NUMERIC',     'error',         'start',         'body',        
-  'code',          'stmts',         'filtered_var',  'var_or_string',
-  'stmt',          'for_stmt',      'ifchanged_stmt',  'block_stmt',  
-  'filter_stmt',   'if_stmt',       'custom_tag',    'alias',       
-  'ifequal',       'varname',       'params',        'expr',        
-  'regroup',       'string',        'for_def',       'range',       
-  'numvar',        'fvar_or_string',  'number',        'varname_args',
-  'varpart',       'varpart_single',
+  'T_OR',          'T_QUESTION',    'T_COLON',       'T_EQ',        
+  'T_NE',          'T_GT',          'T_GE',          'T_LT',        
+  'T_LE',          'T_IN',          'T_PLUS',        'T_MINUS',     
+  'T_CONCAT',      'T_TIMES',       'T_DIV',         'T_MOD',       
+  'T_PIPE',        'T_BITWISE',     'T_FILTER_PIPE',  'T_HTML',      
+  'T_COMMENT',     'T_PRINT_OPEN',  'T_PRINT_CLOSE',  'T_EXTENDS',   
+  'T_TAG_CLOSE',   'T_INCLUDE',     'T_AUTOESCAPE',  'T_CUSTOM_END',
+  'T_CUSTOM_TAG',  'T_AS',          'T_CUSTOM_BLOCK',  'T_SPACEFULL', 
+  'T_WITH',        'T_SET',         'T_ASSIGN',      'T_LOAD',      
+  'T_FOR',         'T_COMMA',       'T_STEP',        'T_EMPTY',     
+  'T_IF',          'T_ELSE',        'T_IFCHANGED',   'T_IFEQUAL',   
+  'T_IFNOTEQUAL',  'T_BLOCK',       'T_FILTER',      'T_REGROUP',   
+  'T_BY',          'T_TRUE',        'T_FALSE',       'T_STRING',    
+  'T_INTL',        'T_RPARENT',     'T_LPARENT',     'T_OBJ',       
+  'T_DOT',         'T_CLASS',       'T_BRACKETS_OPEN',  'T_BRACKETS_CLOSE',
+  'T_ALPHA',       'T_DOTDOT',      'T_NUMERIC',     'error',       
+  'start',         'body',          'code',          'stmts',       
+  'expr',          'var_or_string',  'stmt',          'for_stmt',    
+  'ifchanged_stmt',  'block_stmt',    'filter_stmt',   'if_stmt',     
+  'custom_tag',    'alias',         'ifequal',       'varname',     
+  'params',        'regroup',       'string',        'for_def',     
+  'filtered_var',  'range',         'numvar',        'fvar_or_string',
+  'number',        'varname_args',  'varpart',       'varpart_single',
     );
 
     /**
@@ -1044,7 +1098,7 @@ static public $yy_action = array(
  /*   3 */ "code ::= T_TAG_OPEN stmts",
  /*   4 */ "code ::= T_HTML",
  /*   5 */ "code ::= T_COMMENT",
- /*   6 */ "code ::= T_PRINT_OPEN filtered_var T_PRINT_CLOSE",
+ /*   6 */ "code ::= T_PRINT_OPEN expr T_PRINT_CLOSE",
  /*   7 */ "stmts ::= T_EXTENDS var_or_string T_TAG_CLOSE",
  /*   8 */ "stmts ::= stmt T_TAG_CLOSE",
  /*   9 */ "stmts ::= for_stmt",
@@ -1090,43 +1144,48 @@ static public $yy_action = array(
  /*  49 */ "block_stmt ::= T_BLOCK number T_TAG_CLOSE body T_TAG_OPEN T_CUSTOM_END number T_TAG_CLOSE",
  /*  50 */ "filter_stmt ::= T_FILTER filtered_var T_TAG_CLOSE body T_TAG_OPEN T_CUSTOM_END T_TAG_CLOSE",
  /*  51 */ "regroup ::= T_REGROUP filtered_var T_BY varname T_AS varname",
- /*  52 */ "filtered_var ::= filtered_var T_PIPE varname_args",
- /*  53 */ "filtered_var ::= varname_args",
- /*  54 */ "varname_args ::= varname T_COLON var_or_string",
- /*  55 */ "varname_args ::= varname",
- /*  56 */ "params ::= params var_or_string",
- /*  57 */ "params ::= params T_COMMA var_or_string",
- /*  58 */ "params ::= var_or_string",
- /*  59 */ "var_or_string ::= varname",
- /*  60 */ "var_or_string ::= number",
- /*  61 */ "var_or_string ::= T_TRUE|T_FALSE",
- /*  62 */ "var_or_string ::= string",
- /*  63 */ "fvar_or_string ::= filtered_var",
- /*  64 */ "fvar_or_string ::= number",
- /*  65 */ "fvar_or_string ::= T_TRUE|T_FALSE",
- /*  66 */ "fvar_or_string ::= string",
- /*  67 */ "string ::= T_STRING",
- /*  68 */ "string ::= T_INTL T_STRING T_RPARENT",
- /*  69 */ "expr ::= T_NOT expr",
- /*  70 */ "expr ::= expr T_AND expr",
- /*  71 */ "expr ::= expr T_OR expr",
- /*  72 */ "expr ::= expr T_PLUS|T_MINUS|T_CONCAT expr",
- /*  73 */ "expr ::= expr T_EQ|T_NE|T_GT|T_GE|T_LT|T_LE|T_IN expr",
- /*  74 */ "expr ::= expr T_TIMES|T_DIV|T_MOD expr",
- /*  75 */ "expr ::= expr T_BITWISE|T_PIPE expr",
- /*  76 */ "expr ::= T_LPARENT expr T_RPARENT",
- /*  77 */ "expr ::= fvar_or_string",
- /*  78 */ "varname ::= varpart",
- /*  79 */ "varpart ::= varpart T_OBJ|T_DOT varpart_single",
- /*  80 */ "varpart ::= varpart T_CLASS varpart_single",
- /*  81 */ "varpart ::= varpart T_BRACKETS_OPEN var_or_string T_BRACKETS_CLOSE",
- /*  82 */ "varpart ::= varpart_single",
- /*  83 */ "varpart_single ::= T_ALPHA|T_BLOCK|T_CUSTOM_TAG|T_CUSTOM_END|T_CUSTOM_BLOCK",
- /*  84 */ "range ::= numvar T_DOTDOT numvar",
- /*  85 */ "numvar ::= number",
- /*  86 */ "numvar ::= varname",
- /*  87 */ "number ::= T_NUMERIC",
- /*  88 */ "number ::= T_MINUS T_NUMERIC",
+ /*  52 */ "filtered_var ::= filtered_var T_FILTER_PIPE varname_args",
+ /*  53 */ "filtered_var ::= string T_FILTER_PIPE varname_args",
+ /*  54 */ "filtered_var ::= varname_args",
+ /*  55 */ "varname_args ::= varname T_COLON var_or_string",
+ /*  56 */ "varname_args ::= varname",
+ /*  57 */ "params ::= params var_or_string",
+ /*  58 */ "params ::= params T_COMMA var_or_string",
+ /*  59 */ "params ::= var_or_string",
+ /*  60 */ "var_or_string ::= varname",
+ /*  61 */ "var_or_string ::= number",
+ /*  62 */ "var_or_string ::= T_TRUE|T_FALSE",
+ /*  63 */ "var_or_string ::= string",
+ /*  64 */ "fvar_or_string ::= filtered_var",
+ /*  65 */ "fvar_or_string ::= number",
+ /*  66 */ "fvar_or_string ::= T_TRUE|T_FALSE",
+ /*  67 */ "fvar_or_string ::= string",
+ /*  68 */ "string ::= T_STRING",
+ /*  69 */ "string ::= T_INTL T_STRING T_RPARENT",
+ /*  70 */ "expr ::= expr T_QUESTION expr T_COLON expr",
+ /*  71 */ "expr ::= T_NOT expr",
+ /*  72 */ "expr ::= expr T_AND expr",
+ /*  73 */ "expr ::= expr T_OR expr",
+ /*  74 */ "expr ::= expr T_PLUS|T_MINUS|T_CONCAT expr",
+ /*  75 */ "expr ::= expr T_EQ|T_NE|T_GT|T_GE|T_LT|T_LE|T_IN expr",
+ /*  76 */ "expr ::= expr T_TIMES|T_DIV|T_MOD expr",
+ /*  77 */ "expr ::= expr T_BITWISE expr",
+ /*  78 */ "expr ::= expr T_PIPE expr",
+ /*  79 */ "expr ::= T_LPARENT expr T_RPARENT",
+ /*  80 */ "expr ::= fvar_or_string",
+ /*  81 */ "varname ::= varpart T_LPARENT T_RPARENT",
+ /*  82 */ "varname ::= varpart T_LPARENT params T_RPARENT",
+ /*  83 */ "varname ::= varpart",
+ /*  84 */ "varpart ::= varpart T_OBJ|T_DOT varpart_single",
+ /*  85 */ "varpart ::= varpart T_CLASS varpart_single",
+ /*  86 */ "varpart ::= varpart T_BRACKETS_OPEN var_or_string T_BRACKETS_CLOSE",
+ /*  87 */ "varpart ::= varpart_single",
+ /*  88 */ "varpart_single ::= T_ALPHA|T_BLOCK|T_CUSTOM_TAG|T_CUSTOM_END|T_CUSTOM_BLOCK",
+ /*  89 */ "range ::= numvar T_DOTDOT numvar",
+ /*  90 */ "numvar ::= number",
+ /*  91 */ "numvar ::= varname",
+ /*  92 */ "number ::= T_NUMERIC",
+ /*  93 */ "number ::= T_MINUS T_NUMERIC",
     );
 
     /**
@@ -1491,95 +1550,100 @@ static public $yy_action = array(
      * </pre>
      */
     static public $yyRuleInfo = array(
-  array( 'lhs' => 66, 'rhs' => 1 ),
-  array( 'lhs' => 67, 'rhs' => 2 ),
-  array( 'lhs' => 67, 'rhs' => 0 ),
-  array( 'lhs' => 68, 'rhs' => 2 ),
   array( 'lhs' => 68, 'rhs' => 1 ),
-  array( 'lhs' => 68, 'rhs' => 1 ),
-  array( 'lhs' => 68, 'rhs' => 3 ),
-  array( 'lhs' => 69, 'rhs' => 3 ),
   array( 'lhs' => 69, 'rhs' => 2 ),
-  array( 'lhs' => 69, 'rhs' => 1 ),
-  array( 'lhs' => 69, 'rhs' => 1 ),
-  array( 'lhs' => 69, 'rhs' => 1 ),
-  array( 'lhs' => 69, 'rhs' => 1 ),
-  array( 'lhs' => 69, 'rhs' => 1 ),
-  array( 'lhs' => 69, 'rhs' => 3 ),
-  array( 'lhs' => 69, 'rhs' => 1 ),
-  array( 'lhs' => 69, 'rhs' => 1 ),
-  array( 'lhs' => 69, 'rhs' => 1 ),
-  array( 'lhs' => 69, 'rhs' => 7 ),
-  array( 'lhs' => 78, 'rhs' => 2 ),
-  array( 'lhs' => 78, 'rhs' => 4 ),
-  array( 'lhs' => 78, 'rhs' => 3 ),
-  array( 'lhs' => 78, 'rhs' => 5 ),
-  array( 'lhs' => 78, 'rhs' => 6 ),
-  array( 'lhs' => 78, 'rhs' => 7 ),
-  array( 'lhs' => 78, 'rhs' => 6 ),
-  array( 'lhs' => 79, 'rhs' => 9 ),
-  array( 'lhs' => 72, 'rhs' => 4 ),
-  array( 'lhs' => 72, 'rhs' => 1 ),
-  array( 'lhs' => 72, 'rhs' => 2 ),
-  array( 'lhs' => 86, 'rhs' => 5 ),
-  array( 'lhs' => 86, 'rhs' => 7 ),
-  array( 'lhs' => 73, 'rhs' => 5 ),
-  array( 'lhs' => 73, 'rhs' => 9 ),
-  array( 'lhs' => 73, 'rhs' => 11 ),
-  array( 'lhs' => 73, 'rhs' => 9 ),
-  array( 'lhs' => 77, 'rhs' => 7 ),
-  array( 'lhs' => 77, 'rhs' => 11 ),
-  array( 'lhs' => 74, 'rhs' => 6 ),
-  array( 'lhs' => 74, 'rhs' => 7 ),
-  array( 'lhs' => 74, 'rhs' => 10 ),
-  array( 'lhs' => 74, 'rhs' => 11 ),
-  array( 'lhs' => 80, 'rhs' => 8 ),
-  array( 'lhs' => 80, 'rhs' => 12 ),
-  array( 'lhs' => 80, 'rhs' => 8 ),
-  array( 'lhs' => 80, 'rhs' => 12 ),
-  array( 'lhs' => 75, 'rhs' => 7 ),
-  array( 'lhs' => 75, 'rhs' => 8 ),
-  array( 'lhs' => 75, 'rhs' => 7 ),
-  array( 'lhs' => 75, 'rhs' => 8 ),
-  array( 'lhs' => 76, 'rhs' => 7 ),
-  array( 'lhs' => 84, 'rhs' => 6 ),
-  array( 'lhs' => 70, 'rhs' => 3 ),
+  array( 'lhs' => 69, 'rhs' => 0 ),
+  array( 'lhs' => 70, 'rhs' => 2 ),
   array( 'lhs' => 70, 'rhs' => 1 ),
-  array( 'lhs' => 91, 'rhs' => 3 ),
-  array( 'lhs' => 91, 'rhs' => 1 ),
-  array( 'lhs' => 82, 'rhs' => 2 ),
-  array( 'lhs' => 82, 'rhs' => 3 ),
-  array( 'lhs' => 82, 'rhs' => 1 ),
+  array( 'lhs' => 70, 'rhs' => 1 ),
+  array( 'lhs' => 70, 'rhs' => 3 ),
+  array( 'lhs' => 71, 'rhs' => 3 ),
+  array( 'lhs' => 71, 'rhs' => 2 ),
   array( 'lhs' => 71, 'rhs' => 1 ),
   array( 'lhs' => 71, 'rhs' => 1 ),
   array( 'lhs' => 71, 'rhs' => 1 ),
   array( 'lhs' => 71, 'rhs' => 1 ),
-  array( 'lhs' => 89, 'rhs' => 1 ),
-  array( 'lhs' => 89, 'rhs' => 1 ),
-  array( 'lhs' => 89, 'rhs' => 1 ),
-  array( 'lhs' => 89, 'rhs' => 1 ),
-  array( 'lhs' => 85, 'rhs' => 1 ),
-  array( 'lhs' => 85, 'rhs' => 3 ),
-  array( 'lhs' => 83, 'rhs' => 2 ),
-  array( 'lhs' => 83, 'rhs' => 3 ),
-  array( 'lhs' => 83, 'rhs' => 3 ),
-  array( 'lhs' => 83, 'rhs' => 3 ),
-  array( 'lhs' => 83, 'rhs' => 3 ),
-  array( 'lhs' => 83, 'rhs' => 3 ),
-  array( 'lhs' => 83, 'rhs' => 3 ),
+  array( 'lhs' => 71, 'rhs' => 1 ),
+  array( 'lhs' => 71, 'rhs' => 3 ),
+  array( 'lhs' => 71, 'rhs' => 1 ),
+  array( 'lhs' => 71, 'rhs' => 1 ),
+  array( 'lhs' => 71, 'rhs' => 1 ),
+  array( 'lhs' => 71, 'rhs' => 7 ),
+  array( 'lhs' => 80, 'rhs' => 2 ),
+  array( 'lhs' => 80, 'rhs' => 4 ),
+  array( 'lhs' => 80, 'rhs' => 3 ),
+  array( 'lhs' => 80, 'rhs' => 5 ),
+  array( 'lhs' => 80, 'rhs' => 6 ),
+  array( 'lhs' => 80, 'rhs' => 7 ),
+  array( 'lhs' => 80, 'rhs' => 6 ),
+  array( 'lhs' => 81, 'rhs' => 9 ),
+  array( 'lhs' => 74, 'rhs' => 4 ),
+  array( 'lhs' => 74, 'rhs' => 1 ),
+  array( 'lhs' => 74, 'rhs' => 2 ),
+  array( 'lhs' => 87, 'rhs' => 5 ),
+  array( 'lhs' => 87, 'rhs' => 7 ),
+  array( 'lhs' => 75, 'rhs' => 5 ),
+  array( 'lhs' => 75, 'rhs' => 9 ),
+  array( 'lhs' => 75, 'rhs' => 11 ),
+  array( 'lhs' => 75, 'rhs' => 9 ),
+  array( 'lhs' => 79, 'rhs' => 7 ),
+  array( 'lhs' => 79, 'rhs' => 11 ),
+  array( 'lhs' => 76, 'rhs' => 6 ),
+  array( 'lhs' => 76, 'rhs' => 7 ),
+  array( 'lhs' => 76, 'rhs' => 10 ),
+  array( 'lhs' => 76, 'rhs' => 11 ),
+  array( 'lhs' => 82, 'rhs' => 8 ),
+  array( 'lhs' => 82, 'rhs' => 12 ),
+  array( 'lhs' => 82, 'rhs' => 8 ),
+  array( 'lhs' => 82, 'rhs' => 12 ),
+  array( 'lhs' => 77, 'rhs' => 7 ),
+  array( 'lhs' => 77, 'rhs' => 8 ),
+  array( 'lhs' => 77, 'rhs' => 7 ),
+  array( 'lhs' => 77, 'rhs' => 8 ),
+  array( 'lhs' => 78, 'rhs' => 7 ),
+  array( 'lhs' => 85, 'rhs' => 6 ),
+  array( 'lhs' => 88, 'rhs' => 3 ),
+  array( 'lhs' => 88, 'rhs' => 3 ),
+  array( 'lhs' => 88, 'rhs' => 1 ),
+  array( 'lhs' => 93, 'rhs' => 3 ),
+  array( 'lhs' => 93, 'rhs' => 1 ),
+  array( 'lhs' => 84, 'rhs' => 2 ),
+  array( 'lhs' => 84, 'rhs' => 3 ),
+  array( 'lhs' => 84, 'rhs' => 1 ),
+  array( 'lhs' => 73, 'rhs' => 1 ),
+  array( 'lhs' => 73, 'rhs' => 1 ),
+  array( 'lhs' => 73, 'rhs' => 1 ),
+  array( 'lhs' => 73, 'rhs' => 1 ),
+  array( 'lhs' => 91, 'rhs' => 1 ),
+  array( 'lhs' => 91, 'rhs' => 1 ),
+  array( 'lhs' => 91, 'rhs' => 1 ),
+  array( 'lhs' => 91, 'rhs' => 1 ),
+  array( 'lhs' => 86, 'rhs' => 1 ),
+  array( 'lhs' => 86, 'rhs' => 3 ),
+  array( 'lhs' => 72, 'rhs' => 5 ),
+  array( 'lhs' => 72, 'rhs' => 2 ),
+  array( 'lhs' => 72, 'rhs' => 3 ),
+  array( 'lhs' => 72, 'rhs' => 3 ),
+  array( 'lhs' => 72, 'rhs' => 3 ),
+  array( 'lhs' => 72, 'rhs' => 3 ),
+  array( 'lhs' => 72, 'rhs' => 3 ),
+  array( 'lhs' => 72, 'rhs' => 3 ),
+  array( 'lhs' => 72, 'rhs' => 3 ),
+  array( 'lhs' => 72, 'rhs' => 3 ),
+  array( 'lhs' => 72, 'rhs' => 1 ),
   array( 'lhs' => 83, 'rhs' => 3 ),
+  array( 'lhs' => 83, 'rhs' => 4 ),
   array( 'lhs' => 83, 'rhs' => 1 ),
-  array( 'lhs' => 81, 'rhs' => 1 ),
-  array( 'lhs' => 92, 'rhs' => 3 ),
-  array( 'lhs' => 92, 'rhs' => 3 ),
-  array( 'lhs' => 92, 'rhs' => 4 ),
-  array( 'lhs' => 92, 'rhs' => 1 ),
-  array( 'lhs' => 93, 'rhs' => 1 ),
-  array( 'lhs' => 87, 'rhs' => 3 ),
-  array( 'lhs' => 88, 'rhs' => 1 ),
-  array( 'lhs' => 88, 'rhs' => 1 ),
+  array( 'lhs' => 94, 'rhs' => 3 ),
+  array( 'lhs' => 94, 'rhs' => 3 ),
+  array( 'lhs' => 94, 'rhs' => 4 ),
+  array( 'lhs' => 94, 'rhs' => 1 ),
+  array( 'lhs' => 95, 'rhs' => 1 ),
+  array( 'lhs' => 89, 'rhs' => 3 ),
   array( 'lhs' => 90, 'rhs' => 1 ),
-  array( 'lhs' => 90, 'rhs' => 2 ),
+  array( 'lhs' => 90, 'rhs' => 1 ),
+  array( 'lhs' => 92, 'rhs' => 1 ),
+  array( 'lhs' => 92, 'rhs' => 2 ),
     );
 
     /**
@@ -1598,7 +1662,7 @@ static public $yy_action = array(
         6 => 6,
         7 => 7,
         8 => 8,
-        68 => 8,
+        69 => 8,
         9 => 9,
         10 => 9,
         11 => 9,
@@ -1608,13 +1672,13 @@ static public $yy_action = array(
         16 => 9,
         17 => 9,
         28 => 9,
-        55 => 9,
-        67 => 9,
-        77 => 9,
-        82 => 9,
-        83 => 9,
-        85 => 9,
+        56 => 9,
+        68 => 9,
+        80 => 9,
         87 => 9,
+        88 => 9,
+        90 => 9,
+        92 => 9,
         14 => 14,
         18 => 18,
         19 => 19,
@@ -1650,34 +1714,39 @@ static public $yy_action = array(
         50 => 50,
         51 => 51,
         52 => 52,
-        57 => 52,
+        58 => 52,
         53 => 53,
-        58 => 53,
         54 => 54,
-        56 => 56,
-        59 => 59,
-        86 => 59,
+        59 => 54,
+        55 => 55,
+        57 => 57,
         60 => 60,
-        64 => 60,
+        91 => 60,
         61 => 61,
         65 => 61,
         62 => 62,
         66 => 62,
         63 => 63,
-        69 => 69,
+        67 => 63,
+        64 => 64,
         70 => 70,
-        71 => 70,
-        72 => 70,
-        74 => 70,
-        73 => 73,
+        71 => 71,
+        72 => 72,
+        73 => 72,
+        74 => 72,
+        76 => 72,
         75 => 75,
-        76 => 76,
+        77 => 77,
         78 => 78,
         79 => 79,
-        80 => 80,
         81 => 81,
+        82 => 82,
+        83 => 83,
         84 => 84,
-        88 => 88,
+        85 => 85,
+        86 => 86,
+        89 => 89,
+        93 => 93,
     );
     /* Beginning here are the reduction cases.  A typical example
     ** follows:
@@ -1685,46 +1754,46 @@ static public $yy_action = array(
     **   function yy_r0($yymsp){ ... }           // User supplied code
     **  #line <lineno> <thisfile>
     */
-#line 80 "Parser.y"
+#line 81 "lib/Haanga/Compiler/Parser.y"
     function yy_r0(){ $this->body = $this->yystack[$this->yyidx + 0]->minor;     }
-#line 1696 "Parser.php"
-#line 82 "Parser.y"
+#line 1765 "lib/Haanga/Compiler/Parser.php"
+#line 83 "lib/Haanga/Compiler/Parser.y"
     function yy_r1(){ $this->_retvalue=$this->yystack[$this->yyidx + -1]->minor; $this->_retvalue[] = $this->yystack[$this->yyidx + 0]->minor;     }
-#line 1699 "Parser.php"
-#line 83 "Parser.y"
+#line 1768 "lib/Haanga/Compiler/Parser.php"
+#line 84 "lib/Haanga/Compiler/Parser.y"
     function yy_r2(){ $this->_retvalue = array();     }
-#line 1702 "Parser.php"
-#line 86 "Parser.y"
+#line 1771 "lib/Haanga/Compiler/Parser.php"
+#line 87 "lib/Haanga/Compiler/Parser.y"
     function yy_r3(){ if (count($this->yystack[$this->yyidx + 0]->minor)) $this->yystack[$this->yyidx + 0]->minor['line'] = $this->lex->getLine();  $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;     }
-#line 1705 "Parser.php"
-#line 88 "Parser.y"
+#line 1774 "lib/Haanga/Compiler/Parser.php"
+#line 89 "lib/Haanga/Compiler/Parser.y"
     function yy_r4(){
     $this->_retvalue = array('operation' => 'html', 'html' => $this->yystack[$this->yyidx + 0]->minor, 'line' => $this->lex->getLine() ); 
     }
-#line 1710 "Parser.php"
-#line 92 "Parser.y"
+#line 1779 "lib/Haanga/Compiler/Parser.php"
+#line 93 "lib/Haanga/Compiler/Parser.y"
     function yy_r5(){
     $this->yystack[$this->yyidx + 0]->minor=rtrim($this->yystack[$this->yyidx + 0]->minor); $this->_retvalue = array('operation' => 'comment', 'comment' => $this->yystack[$this->yyidx + 0]->minor); 
     }
-#line 1715 "Parser.php"
-#line 96 "Parser.y"
+#line 1784 "lib/Haanga/Compiler/Parser.php"
+#line 97 "lib/Haanga/Compiler/Parser.y"
     function yy_r6(){
-    $this->_retvalue = array('operation' => 'print_var', 'variable' => $this->yystack[$this->yyidx + -1]->minor, 'line' => $this->lex->getLine() ); 
+    $this->_retvalue = array('operation' => 'print_var', 'expr' => $this->yystack[$this->yyidx + -1]->minor, 'line' => $this->lex->getLine() ); 
     }
-#line 1720 "Parser.php"
-#line 100 "Parser.y"
+#line 1789 "lib/Haanga/Compiler/Parser.php"
+#line 101 "lib/Haanga/Compiler/Parser.y"
     function yy_r7(){ $this->_retvalue = array('operation' => 'base', $this->yystack[$this->yyidx + -1]->minor);     }
-#line 1723 "Parser.php"
-#line 101 "Parser.y"
+#line 1792 "lib/Haanga/Compiler/Parser.php"
+#line 102 "lib/Haanga/Compiler/Parser.y"
     function yy_r8(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor;     }
-#line 1726 "Parser.php"
-#line 102 "Parser.y"
+#line 1795 "lib/Haanga/Compiler/Parser.php"
+#line 103 "lib/Haanga/Compiler/Parser.y"
     function yy_r9(){ $this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;     }
-#line 1729 "Parser.php"
-#line 107 "Parser.y"
+#line 1798 "lib/Haanga/Compiler/Parser.php"
+#line 108 "lib/Haanga/Compiler/Parser.y"
     function yy_r14(){ $this->_retvalue = array('operation' => 'include', $this->yystack[$this->yyidx + -1]->minor);     }
-#line 1732 "Parser.php"
-#line 111 "Parser.y"
+#line 1801 "lib/Haanga/Compiler/Parser.php"
+#line 112 "lib/Haanga/Compiler/Parser.y"
     function yy_r18(){ 
     $this->yystack[$this->yyidx + -5]->minor = strtolower($this->yystack[$this->yyidx + -5]->minor);
     if ($this->yystack[$this->yyidx + -5]->minor != 'on' && $this->yystack[$this->yyidx + -5]->minor != 'off') {
@@ -1735,71 +1804,76 @@ static public $yy_action = array(
     }
     $this->_retvalue = array('operation' => 'autoescape', 'value' => $this->yystack[$this->yyidx + -5]->minor, 'body' => $this->yystack[$this->yyidx + -3]->minor); 
     }
-#line 1744 "Parser.php"
-#line 125 "Parser.y"
+#line 1813 "lib/Haanga/Compiler/Parser.php"
+#line 126 "lib/Haanga/Compiler/Parser.y"
     function yy_r19(){
     $this->_retvalue = array('operation' => 'custom_tag', 'name' => $this->yystack[$this->yyidx + -1]->minor, 'list'=>array()); 
     }
-#line 1749 "Parser.php"
-#line 128 "Parser.y"
+#line 1818 "lib/Haanga/Compiler/Parser.php"
+#line 129 "lib/Haanga/Compiler/Parser.y"
     function yy_r20(){
     $this->_retvalue = array('operation' => 'custom_tag', 'name' => $this->yystack[$this->yyidx + -3]->minor, 'as' => $this->yystack[$this->yyidx + -1]->minor, 'list'=>array()); 
     }
-#line 1754 "Parser.php"
-#line 131 "Parser.y"
+#line 1823 "lib/Haanga/Compiler/Parser.php"
+#line 132 "lib/Haanga/Compiler/Parser.y"
     function yy_r21(){ 
     $this->_retvalue = array('operation' => 'custom_tag', 'name' => $this->yystack[$this->yyidx + -2]->minor, 'list' => $this->yystack[$this->yyidx + -1]->minor); 
     }
-#line 1759 "Parser.php"
-#line 134 "Parser.y"
+#line 1828 "lib/Haanga/Compiler/Parser.php"
+#line 135 "lib/Haanga/Compiler/Parser.y"
     function yy_r22(){
     $this->_retvalue = array('operation' => 'custom_tag', 'name' => $this->yystack[$this->yyidx + -4]->minor, 'as' => $this->yystack[$this->yyidx + -1]->minor, 'list' => $this->yystack[$this->yyidx + -3]->minor);
     }
-#line 1764 "Parser.php"
-#line 139 "Parser.y"
+#line 1833 "lib/Haanga/Compiler/Parser.php"
+#line 140 "lib/Haanga/Compiler/Parser.y"
     function yy_r23(){
     if ('end'.$this->yystack[$this->yyidx + -5]->minor != $this->yystack[$this->yyidx + -1]->minor) { 
         $this->error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor); 
     } 
     $this->_retvalue = array('operation' => 'custom_tag', 'name' => $this->yystack[$this->yyidx + -5]->minor, 'body' => $this->yystack[$this->yyidx + -3]->minor, 'list' => array());
     }
-#line 1772 "Parser.php"
-#line 145 "Parser.y"
+#line 1841 "lib/Haanga/Compiler/Parser.php"
+#line 146 "lib/Haanga/Compiler/Parser.y"
     function yy_r24(){
     if ('end'.$this->yystack[$this->yyidx + -6]->minor != $this->yystack[$this->yyidx + -1]->minor) { 
         $this->error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor); 
     } 
     $this->_retvalue = array('operation' => 'custom_tag', 'name' => $this->yystack[$this->yyidx + -6]->minor, 'body' => $this->yystack[$this->yyidx + -3]->minor, 'list' => $this->yystack[$this->yyidx + -5]->minor);
     }
-#line 1780 "Parser.php"
-#line 153 "Parser.y"
+#line 1849 "lib/Haanga/Compiler/Parser.php"
+#line 154 "lib/Haanga/Compiler/Parser.y"
     function yy_r25(){
     if ('endspacefull' != $this->yystack[$this->yyidx + -1]->minor) {
         $this->error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor);
     } 
     $this->_retvalue = array('operation' => 'spacefull', 'body' => $this->yystack[$this->yyidx + -3]->minor);
     }
-#line 1788 "Parser.php"
-#line 161 "Parser.y"
+#line 1857 "lib/Haanga/Compiler/Parser.php"
+#line 162 "lib/Haanga/Compiler/Parser.y"
     function yy_r26(){
     if ($this->yystack[$this->yyidx + -1]->minor != "endwith") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endwith");
     }
     $this->_retvalue = array('operation' => 'alias', 'var' => $this->yystack[$this->yyidx + -7]->minor, 'as' => $this->yystack[$this->yyidx + -5]->minor, 'body' => $this->yystack[$this->yyidx + -3]->minor); 
     }
-#line 1796 "Parser.php"
-#line 169 "Parser.y"
+#line 1865 "lib/Haanga/Compiler/Parser.php"
+#line 170 "lib/Haanga/Compiler/Parser.y"
     function yy_r27(){ $this->_retvalue = array('operation' => 'set', 'var' => $this->yystack[$this->yyidx + -2]->minor,'expr' => $this->yystack[$this->yyidx + 0]->minor);     }
-#line 1799 "Parser.php"
-#line 171 "Parser.y"
+#line 1868 "lib/Haanga/Compiler/Parser.php"
+#line 172 "lib/Haanga/Compiler/Parser.y"
     function yy_r29(){
+    if (is_file(dirname($this->file) . '/' . $this->yystack[$this->yyidx + 0]->minor)) {
+        $this->yystack[$this->yyidx + 0]->minor = dirname($this->file) . '/' . $this->yystack[$this->yyidx + 0]->minor;
+    } else if (is_file(getcwd() . '/' . $this->yystack[$this->yyidx + 0]->minor)) {
+        $this->yystack[$this->yyidx + 0]->minor = getcwd() . '/' . $this->yystack[$this->yyidx + 0]->minor;
+    }
     if (!is_file($this->yystack[$this->yyidx + 0]->minor) || !Haanga_Compiler::getOption('enable_load')) {
         $this->error($this->yystack[$this->yyidx + 0]->minor." is not a valid file"); 
     } 
     require_once $this->yystack[$this->yyidx + 0]->minor;
     }
-#line 1807 "Parser.php"
-#line 180 "Parser.y"
+#line 1881 "lib/Haanga/Compiler/Parser.php"
+#line 186 "lib/Haanga/Compiler/Parser.y"
     function yy_r30(){
     $var = $this->compiler->get_context($this->yystack[$this->yyidx + -1]->minor[0]);
     if (is_array($var) || $var instanceof Iterator) {
@@ -1808,8 +1882,8 @@ static public $yy_action = array(
     }
     $this->_retvalue = array('operation' => 'loop', 'variable' => $this->yystack[$this->yyidx + -3]->minor, 'index' => NULL, 'array' => $this->yystack[$this->yyidx + -1]->minor);
     }
-#line 1817 "Parser.php"
-#line 188 "Parser.y"
+#line 1891 "lib/Haanga/Compiler/Parser.php"
+#line 194 "lib/Haanga/Compiler/Parser.y"
     function yy_r31(){
     $var = $this->compiler->get_context($this->yystack[$this->yyidx + -1]->minor[0]);
     if (is_array($var) || $var instanceof Iterator) {
@@ -1819,8 +1893,8 @@ static public $yy_action = array(
     $this->_retvalue = array('operation' => 'loop', 'variable' => $this->yystack[$this->yyidx + -3]->minor, 'index' => $this->yystack[$this->yyidx + -5]->minor, 'array' => $this->yystack[$this->yyidx + -1]->minor);
 
     }
-#line 1828 "Parser.php"
-#line 198 "Parser.y"
+#line 1902 "lib/Haanga/Compiler/Parser.php"
+#line 204 "lib/Haanga/Compiler/Parser.y"
     function yy_r32(){ 
     if ($this->yystack[$this->yyidx + -1]->minor != "endfor") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endfor");
@@ -1828,24 +1902,24 @@ static public $yy_action = array(
     $this->_retvalue = $this->yystack[$this->yyidx + -4]->minor;
     $this->_retvalue['body'] = $this->yystack[$this->yyidx + -3]->minor;
     }
-#line 1837 "Parser.php"
-#line 206 "Parser.y"
+#line 1911 "lib/Haanga/Compiler/Parser.php"
+#line 212 "lib/Haanga/Compiler/Parser.y"
     function yy_r33(){
     if ($this->yystack[$this->yyidx + -1]->minor != "endfor") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endfor");
     }
     $this->_retvalue = array('operation' => 'loop', 'variable' => $this->yystack[$this->yyidx + -7]->minor, 'range' => $this->yystack[$this->yyidx + -5]->minor, 'body' => $this->yystack[$this->yyidx + -3]->minor, 'variable' => $this->yystack[$this->yyidx + -7]->minor, 'step' => 1);
     }
-#line 1845 "Parser.php"
-#line 213 "Parser.y"
+#line 1919 "lib/Haanga/Compiler/Parser.php"
+#line 219 "lib/Haanga/Compiler/Parser.y"
     function yy_r34(){
     if ($this->yystack[$this->yyidx + -1]->minor != "endfor") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endfor");
     }
     $this->_retvalue = array('operation' => 'loop', 'variable' => $this->yystack[$this->yyidx + -9]->minor, 'range' => $this->yystack[$this->yyidx + -7]->minor, 'body' => $this->yystack[$this->yyidx + -3]->minor, 'variable' => $this->yystack[$this->yyidx + -9]->minor, 'step' => $this->yystack[$this->yyidx + -5]->minor);
     }
-#line 1853 "Parser.php"
-#line 220 "Parser.y"
+#line 1927 "lib/Haanga/Compiler/Parser.php"
+#line 226 "lib/Haanga/Compiler/Parser.y"
     function yy_r35(){ 
     if ($this->yystack[$this->yyidx + -1]->minor != "endfor") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endfor");
@@ -1854,191 +1928,216 @@ static public $yy_action = array(
     $this->_retvalue['body']  = $this->yystack[$this->yyidx + -7]->minor;
     $this->_retvalue['empty'] = $this->yystack[$this->yyidx + -3]->minor;
     }
-#line 1863 "Parser.php"
-#line 229 "Parser.y"
+#line 1937 "lib/Haanga/Compiler/Parser.php"
+#line 235 "lib/Haanga/Compiler/Parser.y"
     function yy_r36(){
     if ($this->yystack[$this->yyidx + -1]->minor != "endif") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endif");
     }
     $this->_retvalue = array('operation' => 'if', 'expr' => $this->yystack[$this->yyidx + -5]->minor, 'body' => $this->yystack[$this->yyidx + -3]->minor);
     }
-#line 1871 "Parser.php"
-#line 235 "Parser.y"
+#line 1945 "lib/Haanga/Compiler/Parser.php"
+#line 241 "lib/Haanga/Compiler/Parser.y"
     function yy_r37(){
     if ($this->yystack[$this->yyidx + -1]->minor != "endif") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endif");
     }
     $this->_retvalue = array('operation' => 'if', 'expr' => $this->yystack[$this->yyidx + -9]->minor, 'body' => $this->yystack[$this->yyidx + -7]->minor, 'else' => $this->yystack[$this->yyidx + -3]->minor);
     }
-#line 1879 "Parser.php"
-#line 243 "Parser.y"
+#line 1953 "lib/Haanga/Compiler/Parser.php"
+#line 249 "lib/Haanga/Compiler/Parser.y"
     function yy_r38(){ 
     if ($this->yystack[$this->yyidx + -1]->minor != "endifchanged") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endifchanged");
     }
     $this->_retvalue = array('operation' => 'ifchanged', 'body' => $this->yystack[$this->yyidx + -3]->minor); 
     }
-#line 1887 "Parser.php"
-#line 250 "Parser.y"
+#line 1961 "lib/Haanga/Compiler/Parser.php"
+#line 256 "lib/Haanga/Compiler/Parser.y"
     function yy_r39(){ 
     if ($this->yystack[$this->yyidx + -1]->minor != "endifchanged") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endifchanged");
     }
     $this->_retvalue = array('operation' => 'ifchanged', 'body' => $this->yystack[$this->yyidx + -3]->minor, 'check' => $this->yystack[$this->yyidx + -5]->minor);
     }
-#line 1895 "Parser.php"
-#line 256 "Parser.y"
+#line 1969 "lib/Haanga/Compiler/Parser.php"
+#line 262 "lib/Haanga/Compiler/Parser.y"
     function yy_r40(){ 
     if ($this->yystack[$this->yyidx + -1]->minor != "endifchanged") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endifchanged");
     }
     $this->_retvalue = array('operation' => 'ifchanged', 'body' => $this->yystack[$this->yyidx + -7]->minor, 'else' => $this->yystack[$this->yyidx + -3]->minor); 
     }
-#line 1903 "Parser.php"
-#line 263 "Parser.y"
+#line 1977 "lib/Haanga/Compiler/Parser.php"
+#line 269 "lib/Haanga/Compiler/Parser.y"
     function yy_r41(){ 
     if ($this->yystack[$this->yyidx + -1]->minor != "endifchanged") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endifchanged");
     }
     $this->_retvalue = array('operation' => 'ifchanged', 'body' => $this->yystack[$this->yyidx + -7]->minor, 'check' => $this->yystack[$this->yyidx + -9]->minor, 'else' => $this->yystack[$this->yyidx + -3]->minor);
     }
-#line 1911 "Parser.php"
-#line 271 "Parser.y"
+#line 1985 "lib/Haanga/Compiler/Parser.php"
+#line 277 "lib/Haanga/Compiler/Parser.y"
     function yy_r42(){
     if ($this->yystack[$this->yyidx + -1]->minor != "endifequal") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endifequal");
     }
     $this->_retvalue = array('operation' => 'ifequal', 'cmp' => '==', 1 => $this->yystack[$this->yyidx + -6]->minor, 2 => $this->yystack[$this->yyidx + -5]->minor, 'body' => $this->yystack[$this->yyidx + -3]->minor); 
     }
-#line 1919 "Parser.php"
-#line 277 "Parser.y"
+#line 1993 "lib/Haanga/Compiler/Parser.php"
+#line 283 "lib/Haanga/Compiler/Parser.y"
     function yy_r43(){
     if ($this->yystack[$this->yyidx + -1]->minor != "endifequal") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endifequal");
     }
     $this->_retvalue = array('operation' => 'ifequal', 'cmp' => '==', 1 => $this->yystack[$this->yyidx + -10]->minor, 2 => $this->yystack[$this->yyidx + -9]->minor, 'body' => $this->yystack[$this->yyidx + -7]->minor, 'else' => $this->yystack[$this->yyidx + -3]->minor); 
     }
-#line 1927 "Parser.php"
-#line 283 "Parser.y"
+#line 2001 "lib/Haanga/Compiler/Parser.php"
+#line 289 "lib/Haanga/Compiler/Parser.y"
     function yy_r44(){
     if ($this->yystack[$this->yyidx + -1]->minor != "endifnotequal") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endifnotequal");
     }
     $this->_retvalue = array('operation' => 'ifequal', 'cmp' => '!=', 1 => $this->yystack[$this->yyidx + -6]->minor, 2 => $this->yystack[$this->yyidx + -5]->minor, 'body' => $this->yystack[$this->yyidx + -3]->minor);
     }
-#line 1935 "Parser.php"
-#line 289 "Parser.y"
+#line 2009 "lib/Haanga/Compiler/Parser.php"
+#line 295 "lib/Haanga/Compiler/Parser.y"
     function yy_r45(){
     if ($this->yystack[$this->yyidx + -1]->minor != "endifnotequal") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endifnotequal");
     }
     $this->_retvalue = array('operation' => 'ifequal', 'cmp' => '!=', 1 => $this->yystack[$this->yyidx + -10]->minor, 2 => $this->yystack[$this->yyidx + -9]->minor, 'body' => $this->yystack[$this->yyidx + -7]->minor, 'else' => $this->yystack[$this->yyidx + -3]->minor); 
     }
-#line 1943 "Parser.php"
-#line 297 "Parser.y"
+#line 2017 "lib/Haanga/Compiler/Parser.php"
+#line 303 "lib/Haanga/Compiler/Parser.y"
     function yy_r46(){ 
     if ($this->yystack[$this->yyidx + -1]->minor != "endblock") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endblock");
     }
     $this->_retvalue = array('operation' => 'block', 'name' => $this->yystack[$this->yyidx + -5]->minor, 'body' => $this->yystack[$this->yyidx + -3]->minor); 
     }
-#line 1951 "Parser.php"
-#line 304 "Parser.y"
+#line 2025 "lib/Haanga/Compiler/Parser.php"
+#line 310 "lib/Haanga/Compiler/Parser.y"
     function yy_r47(){
     if ($this->yystack[$this->yyidx + -2]->minor != "endblock") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -2]->minor.", expecting endblock");
     }
     $this->_retvalue = array('operation' => 'block', 'name' => $this->yystack[$this->yyidx + -6]->minor, 'body' => $this->yystack[$this->yyidx + -4]->minor); 
     }
-#line 1959 "Parser.php"
-#line 311 "Parser.y"
+#line 2033 "lib/Haanga/Compiler/Parser.php"
+#line 317 "lib/Haanga/Compiler/Parser.y"
     function yy_r48(){
     if ($this->yystack[$this->yyidx + -1]->minor != "endblock") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endblock");
     }
     $this->_retvalue = array('operation' => 'block', 'name' => $this->yystack[$this->yyidx + -5]->minor, 'body' => $this->yystack[$this->yyidx + -3]->minor); 
     }
-#line 1967 "Parser.php"
-#line 326 "Parser.y"
+#line 2041 "lib/Haanga/Compiler/Parser.php"
+#line 332 "lib/Haanga/Compiler/Parser.y"
     function yy_r50(){
     if ($this->yystack[$this->yyidx + -1]->minor != "endfilter") {
         $this->Error("Unexpected ".$this->yystack[$this->yyidx + -1]->minor.", expecting endfilter");
     }
     $this->_retvalue = array('operation' => 'filter', 'functions' => $this->yystack[$this->yyidx + -5]->minor, 'body' => $this->yystack[$this->yyidx + -3]->minor);
     }
-#line 1975 "Parser.php"
-#line 334 "Parser.y"
+#line 2049 "lib/Haanga/Compiler/Parser.php"
+#line 340 "lib/Haanga/Compiler/Parser.y"
     function yy_r51(){ $this->_retvalue=array('operation' => 'regroup', 'array' => $this->yystack[$this->yyidx + -4]->minor, 'row' => $this->yystack[$this->yyidx + -2]->minor, 'as' => $this->yystack[$this->yyidx + 0]->minor);     }
-#line 1978 "Parser.php"
-#line 337 "Parser.y"
+#line 2052 "lib/Haanga/Compiler/Parser.php"
+#line 343 "lib/Haanga/Compiler/Parser.y"
     function yy_r52(){ $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor; $this->_retvalue[] = $this->yystack[$this->yyidx + 0]->minor;     }
-#line 1981 "Parser.php"
-#line 338 "Parser.y"
-    function yy_r53(){ $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor);     }
-#line 1984 "Parser.php"
-#line 340 "Parser.y"
-    function yy_r54(){ $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor, 'args'=>array($this->yystack[$this->yyidx + 0]->minor));     }
-#line 1987 "Parser.php"
-#line 344 "Parser.y"
-    function yy_r56(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor; $this->_retvalue[] = $this->yystack[$this->yyidx + 0]->minor;     }
-#line 1990 "Parser.php"
-#line 350 "Parser.y"
-    function yy_r59(){ $this->_retvalue = array('var' => $this->yystack[$this->yyidx + 0]->minor);     }
-#line 1993 "Parser.php"
-#line 351 "Parser.y"
-    function yy_r60(){ $this->_retvalue = array('number' => $this->yystack[$this->yyidx + 0]->minor);     }
-#line 1996 "Parser.php"
-#line 352 "Parser.y"
-    function yy_r61(){ $this->_retvalue = trim(@$this->yystack[$this->yyidx + 0]->minor);     }
-#line 1999 "Parser.php"
-#line 353 "Parser.y"
-    function yy_r62(){ $this->_retvalue = array('string' => $this->yystack[$this->yyidx + 0]->minor);     }
-#line 2002 "Parser.php"
-#line 356 "Parser.y"
-    function yy_r63(){ $this->_retvalue = array('var_filter' => $this->yystack[$this->yyidx + 0]->minor);     }
-#line 2005 "Parser.php"
-#line 366 "Parser.y"
-    function yy_r69(){ $this->_retvalue = array('op_expr' => 'not', $this->yystack[$this->yyidx + 0]->minor);     }
-#line 2008 "Parser.php"
-#line 367 "Parser.y"
-    function yy_r70(){ $this->_retvalue = array('op_expr' => @$this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor);     }
-#line 2011 "Parser.php"
-#line 370 "Parser.y"
-    function yy_r73(){ $this->_retvalue = array('op_expr' => trim(@$this->yystack[$this->yyidx + -1]->minor), $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor);     }
-#line 2014 "Parser.php"
-#line 372 "Parser.y"
-    function yy_r75(){ $this->_retvalue = array('op_expr' => 'expr', array('op_expr' => @$this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor));     }
-#line 2017 "Parser.php"
-#line 373 "Parser.y"
-    function yy_r76(){ $this->_retvalue = array('op_expr' => 'expr', $this->yystack[$this->yyidx + -1]->minor);     }
-#line 2020 "Parser.php"
-#line 378 "Parser.y"
-    function yy_r78(){ $this->_retvalue = current($this->compiler->generate_variable_name($this->yystack[$this->yyidx + 0]->minor, false));     }
-#line 2023 "Parser.php"
-#line 380 "Parser.y"
-    function yy_r79(){ 
+#line 2055 "lib/Haanga/Compiler/Parser.php"
+#line 344 "lib/Haanga/Compiler/Parser.y"
+    function yy_r53(){ $this->_retvalue = array(array('string' => $this->yystack[$this->yyidx + -2]->minor)); $this->_retvalue[] = $this->yystack[$this->yyidx + 0]->minor;     }
+#line 2058 "lib/Haanga/Compiler/Parser.php"
+#line 345 "lib/Haanga/Compiler/Parser.y"
+    function yy_r54(){ $this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor);     }
+#line 2061 "lib/Haanga/Compiler/Parser.php"
+#line 347 "lib/Haanga/Compiler/Parser.y"
+    function yy_r55(){ $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor, 'args'=>array($this->yystack[$this->yyidx + 0]->minor));     }
+#line 2064 "lib/Haanga/Compiler/Parser.php"
+#line 351 "lib/Haanga/Compiler/Parser.y"
+    function yy_r57(){ $this->_retvalue = $this->yystack[$this->yyidx + -1]->minor; $this->_retvalue[] = $this->yystack[$this->yyidx + 0]->minor;     }
+#line 2067 "lib/Haanga/Compiler/Parser.php"
+#line 357 "lib/Haanga/Compiler/Parser.y"
+    function yy_r60(){ $this->_retvalue = array('var' => $this->yystack[$this->yyidx + 0]->minor);     }
+#line 2070 "lib/Haanga/Compiler/Parser.php"
+#line 358 "lib/Haanga/Compiler/Parser.y"
+    function yy_r61(){ $this->_retvalue = array('number' => $this->yystack[$this->yyidx + 0]->minor);     }
+#line 2073 "lib/Haanga/Compiler/Parser.php"
+#line 359 "lib/Haanga/Compiler/Parser.y"
+    function yy_r62(){ $this->_retvalue = trim(@$this->yystack[$this->yyidx + 0]->minor);     }
+#line 2076 "lib/Haanga/Compiler/Parser.php"
+#line 360 "lib/Haanga/Compiler/Parser.y"
+    function yy_r63(){ $this->_retvalue = array('string' => $this->yystack[$this->yyidx + 0]->minor);     }
+#line 2079 "lib/Haanga/Compiler/Parser.php"
+#line 363 "lib/Haanga/Compiler/Parser.y"
+    function yy_r64(){
+    $this->_retvalue = array('var_filter' => $this->yystack[$this->yyidx + 0]->minor); 
+    }
+#line 2084 "lib/Haanga/Compiler/Parser.php"
+#line 375 "lib/Haanga/Compiler/Parser.y"
+    function yy_r70(){
+    $this->_retvalue = array('expr_cond' => $this->yystack[$this->yyidx + -4]->minor, 'true' => $this->yystack[$this->yyidx + -2]->minor, 'false' => $this->yystack[$this->yyidx + 0]->minor);
+    }
+#line 2089 "lib/Haanga/Compiler/Parser.php"
+#line 378 "lib/Haanga/Compiler/Parser.y"
+    function yy_r71(){ $this->_retvalue = array('op_expr' => 'not', $this->yystack[$this->yyidx + 0]->minor);     }
+#line 2092 "lib/Haanga/Compiler/Parser.php"
+#line 379 "lib/Haanga/Compiler/Parser.y"
+    function yy_r72(){ $this->_retvalue = array('op_expr' => @$this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor);     }
+#line 2095 "lib/Haanga/Compiler/Parser.php"
+#line 382 "lib/Haanga/Compiler/Parser.y"
+    function yy_r75(){ $this->_retvalue = array('op_expr' => trim(@$this->yystack[$this->yyidx + -1]->minor), $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor);     }
+#line 2098 "lib/Haanga/Compiler/Parser.php"
+#line 384 "lib/Haanga/Compiler/Parser.y"
+    function yy_r77(){ $this->_retvalue = array('op_expr' => 'expr', array('op_expr' => @$this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor));     }
+#line 2101 "lib/Haanga/Compiler/Parser.php"
+#line 385 "lib/Haanga/Compiler/Parser.y"
+    function yy_r78(){ $this->_retvalue = array('op_expr' => 'expr', array('op_expr' => '|', $this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor));     }
+#line 2104 "lib/Haanga/Compiler/Parser.php"
+#line 386 "lib/Haanga/Compiler/Parser.y"
+    function yy_r79(){ $this->_retvalue = array('op_expr' => 'expr', $this->yystack[$this->yyidx + -1]->minor);     }
+#line 2107 "lib/Haanga/Compiler/Parser.php"
+#line 391 "lib/Haanga/Compiler/Parser.y"
+    function yy_r81(){
+    $this->_retvalue = hexec($this->yystack[$this->yyidx + -2]->minor)->getArray();
+    }
+#line 2112 "lib/Haanga/Compiler/Parser.php"
+#line 395 "lib/Haanga/Compiler/Parser.y"
+    function yy_r82(){
+    $tmp  = hcode();
+    $args = array_merge(array($this->yystack[$this->yyidx + -3]->minor),  $this->yystack[$this->yyidx + -1]->minor);
+    $this->_retvalue =  call_user_func_array(array($tmp, 'exec'), $args);
+    }
+#line 2119 "lib/Haanga/Compiler/Parser.php"
+#line 401 "lib/Haanga/Compiler/Parser.y"
+    function yy_r83(){ $this->_retvalue = current($this->compiler->generate_variable_name($this->yystack[$this->yyidx + 0]->minor, false));     }
+#line 2122 "lib/Haanga/Compiler/Parser.php"
+#line 403 "lib/Haanga/Compiler/Parser.y"
+    function yy_r84(){ 
     if (!is_array($this->yystack[$this->yyidx + -2]->minor)) { $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor); } 
     else { $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor; }  $this->_retvalue[]=array('object' => $this->yystack[$this->yyidx + 0]->minor);
     }
-#line 2029 "Parser.php"
-#line 385 "Parser.y"
-    function yy_r80(){ 
+#line 2128 "lib/Haanga/Compiler/Parser.php"
+#line 408 "lib/Haanga/Compiler/Parser.y"
+    function yy_r85(){ 
     if (!is_array($this->yystack[$this->yyidx + -2]->minor)) { $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor); } 
     else { $this->_retvalue = $this->yystack[$this->yyidx + -2]->minor; }  $this->_retvalue[]=array('class' => '$'.$this->yystack[$this->yyidx + 0]->minor);
     }
-#line 2035 "Parser.php"
-#line 390 "Parser.y"
-    function yy_r81(){
+#line 2134 "lib/Haanga/Compiler/Parser.php"
+#line 413 "lib/Haanga/Compiler/Parser.y"
+    function yy_r86(){
     if (!is_array($this->yystack[$this->yyidx + -3]->minor)) { $this->_retvalue = array($this->yystack[$this->yyidx + -3]->minor); } 
     else { $this->_retvalue = $this->yystack[$this->yyidx + -3]->minor; }  $this->_retvalue[]=$this->yystack[$this->yyidx + -1]->minor;
     }
-#line 2041 "Parser.php"
-#line 399 "Parser.y"
-    function yy_r84(){ $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor);     }
-#line 2044 "Parser.php"
-#line 405 "Parser.y"
-    function yy_r88(){ $this->_retvalue = -1 * ($this->yystack[$this->yyidx + 0]->minor);     }
-#line 2047 "Parser.php"
+#line 2140 "lib/Haanga/Compiler/Parser.php"
+#line 422 "lib/Haanga/Compiler/Parser.y"
+    function yy_r89(){ $this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor);     }
+#line 2143 "lib/Haanga/Compiler/Parser.php"
+#line 428 "lib/Haanga/Compiler/Parser.y"
+    function yy_r93(){ $this->_retvalue = -1 * ($this->yystack[$this->yyidx + 0]->minor);     }
+#line 2146 "lib/Haanga/Compiler/Parser.php"
 
     /**
      * placeholder for the left hand side in a reduce operation.
@@ -2150,14 +2249,14 @@ static public $yy_action = array(
      */
     function yy_syntax_error($yymajor, $TOKEN)
     {
-#line 71 "Parser.y"
+#line 72 "lib/Haanga/Compiler/Parser.y"
 
     $expect = array();
     foreach ($this->yy_get_expected_tokens($yymajor) as $token) {
         $expect[] = self::$yyTokenName[$token];
     }
     $this->Error('Unexpected ' . $this->tokenName($yymajor) . '(' . $TOKEN. ')');
-#line 2167 "Parser.php"
+#line 2266 "lib/Haanga/Compiler/Parser.php"
     }
 
     /**
@@ -2175,9 +2274,9 @@ static public $yy_action = array(
         }
         /* Here code is inserted which will be executed whenever the
         ** parser accepts */
-#line 57 "Parser.y"
+#line 57 "lib/Haanga/Compiler/Parser.y"
 
-#line 2188 "Parser.php"
+#line 2287 "lib/Haanga/Compiler/Parser.php"
     }
 
     /**
diff --git a/lib/Haanga/lib/Haanga/Compiler/Parser.y b/lib/Haanga/lib/Haanga/Compiler/Parser.y
index ee70e510..9b890e32 100644
--- a/lib/Haanga/lib/Haanga/Compiler/Parser.y
+++ b/lib/Haanga/lib/Haanga/Compiler/Parser.y
@@ -62,12 +62,13 @@
 %right T_NOT.
 %left T_AND.
 %left T_OR.
+%left T_QUESTION T_COLON.
 %nonassoc T_EQ T_NE.
 %nonassoc T_GT T_GE T_LT T_LE.
 %nonassoc T_IN.
 %left T_PLUS T_MINUS T_CONCAT.
 %left T_TIMES T_DIV T_MOD.
-%left T_PIPE T_BITWISE.
+%left T_PIPE T_BITWISE T_FILTER_PIPE.
 
 %syntax_error {
     $expect = array();
@@ -94,8 +95,8 @@ code(A) ::= T_COMMENT(B). {
     B=rtrim(B); A = array('operation' => 'comment', 'comment' => B); 
 } 
 
-code(A) ::= T_PRINT_OPEN filtered_var(B) T_PRINT_CLOSE.  {
-    A = array('operation' => 'print_var', 'variable' => B, 'line' => $this->lex->getLine() ); 
+code(A) ::= T_PRINT_OPEN expr(B) T_PRINT_CLOSE.  {
+    A = array('operation' => 'print_var', 'expr' => B, 'line' => $this->lex->getLine() ); 
 }
 
 stmts(A) ::= T_EXTENDS var_or_string(B) T_TAG_CLOSE. { A = array('operation' => 'base', B); }
@@ -170,6 +171,11 @@ alias(A) ::= T_WITH varname(B) T_AS varname(C) T_TAG_CLOSE body(X) T_TAG_OPEN T_
 stmt(A) ::= T_SET varname(C) T_ASSIGN expr(X). { A = array('operation' => 'set', 'var' => C,'expr' => X); }
 stmt(A) ::= regroup(B). { A = B; }
 stmt ::= T_LOAD string(B). {
+    if (is_file(dirname($this->file) . '/' . B)) {
+        B = dirname($this->file) . '/' . B;
+    } else if (is_file(getcwd() . '/' . B)) {
+        B = getcwd() . '/' . B;
+    }
     if (!is_file(B) || !Haanga_Compiler::getOption('enable_load')) {
         $this->error(B." is not a valid file"); 
     } 
@@ -337,7 +343,8 @@ filter_stmt(A) ::= T_FILTER filtered_var(B) T_TAG_CLOSE body(X) T_TAG_OPEN T_CUS
 regroup(A) ::= T_REGROUP filtered_var(B) T_BY varname(C) T_AS varname(X). { A=array('operation' => 'regroup', 'array' => B, 'row' => C, 'as' => X); }
 
 /* variables with filters */
-filtered_var(A) ::= filtered_var(B) T_PIPE varname_args(C). { A = B; A[] = C; }
+filtered_var(A) ::= filtered_var(B) T_FILTER_PIPE varname_args(C). { A = B; A[] = C; }
+filtered_var(A) ::= string(B) T_FILTER_PIPE varname_args(C). { A = array(array('string' => B)); A[] = C; }
 filtered_var(A) ::= varname_args(B). { A = array(B); }
 
 varname_args(A) ::= varname(B) T_COLON var_or_string(X) . { A = array(B, 'args'=>array(X)); }
@@ -356,7 +363,9 @@ var_or_string(A) ::= T_TRUE|T_FALSE(B).   { A = trim(@B); }
 var_or_string(A) ::= string(B).     { A = array('string' => B); }
 
 /* filtered variables */
-fvar_or_string(A) ::= filtered_var(B).  { A = array('var_filter' => B); }  
+fvar_or_string(A) ::= filtered_var(B).  {
+    A = array('var_filter' => B); 
+}  
 fvar_or_string(A) ::= number(B).     { A = array('number' => B); }  
 fvar_or_string(A) ::= T_TRUE|T_FALSE(B).   { A = trim(@B); }  
 fvar_or_string(A) ::= string(B).        { A = array('string' => B); }
@@ -366,18 +375,32 @@ string(A)    ::= T_STRING(B).   { A = B; }
 string(A)    ::= T_INTL T_STRING(B) T_RPARENT. { A = B; }
 
 /* expr */
+expr(A) ::= expr(Z) T_QUESTION expr(B) T_COLON expr(C). {
+    A = array('expr_cond' => Z, 'true' => B, 'false' => C);
+}
 expr(A) ::= T_NOT expr(B). { A = array('op_expr' => 'not', B); }
 expr(A) ::= expr(B) T_AND(X)  expr(C).  { A = array('op_expr' => @X, B, C); }
 expr(A) ::= expr(B) T_OR(X)  expr(C).  { A = array('op_expr' => @X, B, C); }
 expr(A) ::= expr(B) T_PLUS|T_MINUS|T_CONCAT(X)  expr(C).  { A = array('op_expr' => @X, B, C); }
 expr(A) ::= expr(B) T_EQ|T_NE|T_GT|T_GE|T_LT|T_LE|T_IN(X)  expr(C).  { A = array('op_expr' => trim(@X), B, C); }
 expr(A) ::= expr(B) T_TIMES|T_DIV|T_MOD(X)  expr(C).  { A = array('op_expr' => @X, B, C); }
-expr(A) ::= expr(B) T_BITWISE|T_PIPE(X)  expr(C).  { A = array('op_expr' => 'expr', array('op_expr' => @X, B, C)); }
+expr(A) ::= expr(B) T_BITWISE(X)  expr(C).  { A = array('op_expr' => 'expr', array('op_expr' => @X, B, C)); }
+expr(A) ::= expr(B) T_PIPE  expr(C).  { A = array('op_expr' => 'expr', array('op_expr' => '|', B, C)); }
 expr(A) ::= T_LPARENT expr(B) T_RPARENT. { A = array('op_expr' => 'expr', B); }
 expr(A) ::= fvar_or_string(B). { A = B; }
 
 /* Variable name */
 
+varname(A) ::= varpart(B) T_LPARENT T_RPARENT. {
+    A = hexec(B)->getArray();
+}
+
+varname(A) ::= varpart(B) T_LPARENT params(X) T_RPARENT. {
+    $tmp  = hcode();
+    $args = array_merge(array(B),  X);
+    A =  call_user_func_array(array($tmp, 'exec'), $args);
+}
+
 varname(A) ::= varpart(B). { A = current($this->compiler->generate_variable_name(B, false)); }
 
 varpart(A) ::= varpart(B) T_OBJ|T_DOT varpart_single(C). { 
diff --git a/lib/Haanga/lib/Haanga/Compiler/Runtime.php b/lib/Haanga/lib/Haanga/Compiler/Runtime.php
index a076d990..ce3736b8 100644
--- a/lib/Haanga/lib/Haanga/Compiler/Runtime.php
+++ b/lib/Haanga/lib/Haanga/Compiler/Runtime.php
@@ -64,7 +64,7 @@ final class Haanga_Compiler_Runtime extends Haanga_Compiler
     protected function generate_op_include($details, &$body)
     {
         $this->do_print($body,
-            hexec('Haanga::Load', $details[0], hvar('vars'),
+            hexec('Haanga::Load', $details[0], $this->getScopeVariable(),
             TRUE,
             hvar('blocks'))
         );
@@ -75,7 +75,7 @@ final class Haanga_Compiler_Runtime extends Haanga_Compiler
     function expr_call_base_template()
     {
         return hexec('Haanga::Load', $this->subtemplate, 
-            hvar('vars'), TRUE, hvar('blocks'));
+            $this->getScopeVariable(), TRUE, hvar('blocks'));
     }
     // }}}
 
diff --git a/lib/Haanga/lib/Haanga/Compiler/Tokenizer.php b/lib/Haanga/lib/Haanga/Compiler/Tokenizer.php
index e618b7a0..3448562c 100644
--- a/lib/Haanga/lib/Haanga/Compiler/Tokenizer.php
+++ b/lib/Haanga/lib/Haanga/Compiler/Tokenizer.php
@@ -96,9 +96,10 @@ class Haanga_Compiler_Tokenizer
         '<'     => HG_Parser::T_LT,
         '='     => HG_Parser::T_ASSIGN,
         '>'     => HG_Parser::T_GT,
+        '?'     => HG_Parser::T_QUESTION, 
         '['     => HG_Parser::T_BRACKETS_OPEN,
         ']'     => HG_Parser::T_BRACKETS_CLOSE,
-        '|'     => HG_Parser::T_PIPE,
+        '|'     => HG_Parser::T_FILTER_PIPE,
     );
     static $operators = array(
         '!=='   => HG_Parser::T_NE,
@@ -113,7 +114,7 @@ class Haanga_Compiler_Tokenizer
         '=='    => HG_Parser::T_EQ,
         '>='    => HG_Parser::T_GE,
         '>>'    => HG_Parser::T_BITWISE,
-        '||'    => HG_Parser::T_OR,
+        '||'    => HG_Parser::T_PIPE,
     );
 
     static $close_tags = array();
@@ -135,6 +136,8 @@ class Haanga_Compiler_Tokenizer
     const IN_TAG     = 2;
     const IN_ECHO    = 3;
 
+    protected $echoFirstToken = false;
+
     function __construct($data, $compiler, $file)
     {
         $this->data     = $data;
@@ -205,6 +208,7 @@ class Haanga_Compiler_Tokenizer
                         break;
                     case HG_Parser::T_PRINT_OPEN:
                         $this->status = self::IN_ECHO;
+                        $this->echoFirstToken = false;
                         break;
                     }
                     return TRUE;
@@ -376,14 +380,23 @@ class Haanga_Compiler_Tokenizer
                     if (!$tag) {
                         $tag = Haanga_Extension::getInstance('Tag');
                     }
-                    $value = $tag->isValid($alpha);
-                    $this->token = $value ? $value : HG_Parser::T_ALPHA;
+
+                    if ($this->status == self::IN_ECHO && !$this->echoFirstToken) {
+                        $this->token =  HG_Parser::T_ALPHA;
+                    } else {
+                        $value = $tag->isValid($alpha);
+                        $this->token = $value ? $value : HG_Parser::T_ALPHA;
+                    }
                     $this->value = $alpha;
 
                 }
                 break 2;
             }
         }
+    
+        if ($this->status == self::IN_ECHO) {
+            $this->echoFirstToken = true;
+        }
 
         if ($this->token == HG_Parser::T_TAG_CLOSE ||
             $this->token == HG_Parser::T_PRINT_CLOSE) {
@@ -545,6 +558,7 @@ class Haanga_Compiler_Tokenizer
     static function init($template, $compiler, $file='')
     {
         $lexer  = new Haanga_Compiler_Tokenizer($template, $compiler, $file);
+        file_put_contents('/var/www/sites/katalogskeivtarkiv/tmp/foo.php', $file . "\n", FILE_APPEND);
         $parser = new Haanga_Compiler_Parser($lexer, $file);
 
         $parser->compiler = $compiler;
diff --git a/lib/Haanga/lib/Haanga/Extension/Filter/Count.php b/lib/Haanga/lib/Haanga/Extension/Filter/Count.php
index 8465c35b..01d1bb62 100644
--- a/lib/Haanga/lib/Haanga/Extension/Filter/Count.php
+++ b/lib/Haanga/lib/Haanga/Extension/Filter/Count.php
@@ -1,6 +1,6 @@
 <?php
 
-class Haanga_Extension_Filter_Length
+class Haanga_Extension_Filter_Count
 {
     public $php_alias = "count";
     public $is_safe = TRUE; /* a number if safe */
diff --git a/lib/Haanga/lib/Haanga/Extension/Filter/Date.php b/lib/Haanga/lib/Haanga/Extension/Filter/Date.php
index b15bdc98..b60b299e 100644
--- a/lib/Haanga/lib/Haanga/Extension/Filter/Date.php
+++ b/lib/Haanga/lib/Haanga/Extension/Filter/Date.php
@@ -4,8 +4,7 @@ class Haanga_Extension_Filter_Date
 {
     static function generator($compiler, $args)
     {
-//        return hexec( 'date', $args[1], hexec('strtotime', $args[1]));
-        return hexec('date', $args[1], hexec('strtotime', $args[0]));
+        return hexec('date', $args[1], $args[0]);
     }
 }
     
diff --git a/lib/Haanga/lib/Haanga/Extension/Filter/Decodedescription.php b/lib/Haanga/lib/Haanga/Extension/Filter/Decodedescription.php
index 7f9c5cd6..02a39b2c 100644
--- a/lib/Haanga/lib/Haanga/Extension/Filter/Decodedescription.php
+++ b/lib/Haanga/lib/Haanga/Extension/Filter/Decodedescription.php
@@ -2,20 +2,17 @@
 //decodes a any text containing a
 class Haanga_Extension_Filter_Decodedescription
 {
-    static function main($text) {
-    $allowed_tags ="<u><b><i><strong><br><p><ul><ol><li><iframe><a><img>";
-   
-    $description= strip_tags(html_entity_decode(htmlspecialchars(html_entity_decode($text,ENT_QUOTES,"UTF-8"),ENT_QUOTES,"UTF-8"),ENT_QUOTES,"UTF-8"),$allowed_tags); 
+    static function main($args) {
+    
+        $allowed_tags = "<u><b><i><strong><br><p><ul><ol><li><iframe><a><img>";
+    
+        $description = strip_tags(html_entity_decode(htmlspecialchars(html_entity_decode($args,ENT_QUOTES,"UTF-8"),ENT_QUOTES,"UTF-8"),ENT_QUOTES,"UTF-8"),$allowed_tags);
 
-    preg_match("/<p(\s[^>]*)?>/i",$description,$matches);
-    if ($matches)
-   {} 
-   else 
-    {$description="<p>".$description . "</p>";}
-   
-// public $php_alias = "html_entity_decode";
-   // public $is_safe = TRUE; /* a number if safe */ <b> &ltb;&gt, &lt; &gt; ->
- # return $allowed_tags_regex_strip_not_name;
-   return $description;
-# return htmlspecialchars($allowed_tags_regex);    
-}}
+        preg_match("/<p(\s[^>]*)?>/i",$description,$matches);
+        if ($matches)
+            {return $description ; }
+        else
+            { return "<p>". $description . "</p>"; }
+
+}
+}
diff --git a/lib/Haanga/lib/Haanga/Extension/Filter/Divisibleby.php b/lib/Haanga/lib/Haanga/Extension/Filter/Divisibleby.php
new file mode 100755
index 00000000..fa0bb378
--- /dev/null
+++ b/lib/Haanga/lib/Haanga/Extension/Filter/Divisibleby.php
@@ -0,0 +1,10 @@
+<?php
+
+class Haanga_Extension_Filter_Divisibleby
+{
+    static function main($number, $divisible_by)
+    {
+       	return ($number % $divisible_by) == 0;
+
+    }
+}
diff --git a/lib/Haanga/lib/Haanga/Extension/Filter/Explode.php b/lib/Haanga/lib/Haanga/Extension/Filter/Explode.php
index 7e6deae3..de7561a4 100644
--- a/lib/Haanga/lib/Haanga/Extension/Filter/Explode.php
+++ b/lib/Haanga/lib/Haanga/Extension/Filter/Explode.php
@@ -2,12 +2,11 @@
 
 class Haanga_Extension_Filter_Explode
 {
-    static function generator($compiler, $args)
+    public static function generator($compiler, $args)
     {
-        if (count($args) != 2) {
-            $compiler->Error("Explode only needs two parameter");
+        if (count($args) == 1 || $args[1] == "") {
+            return hexec("str_split", $args[0]);
         }
-
-        return hexec('explode', $args[1], $args[0]);
+        return hexec("explode", $args[1], $args[0]);
     }
 }
diff --git a/lib/Haanga/lib/Haanga/Extension/Filter/Json.php b/lib/Haanga/lib/Haanga/Extension/Filter/Json.php
new file mode 100644
index 00000000..3ef6caf8
--- /dev/null
+++ b/lib/Haanga/lib/Haanga/Extension/Filter/Json.php
@@ -0,0 +1,6 @@
+<?php
+
+class Haanga_Extension_Filter_Json
+{
+    public $php_alias = "json_encode";
+}
diff --git a/lib/Haanga/lib/Haanga/Extension/Filter/Linebreaksbr.php b/lib/Haanga/lib/Haanga/Extension/Filter/Linebreaksbr.php
new file mode 100644
index 00000000..7be1e83f
--- /dev/null
+++ b/lib/Haanga/lib/Haanga/Extension/Filter/Linebreaksbr.php
@@ -0,0 +1,10 @@
+<?php
+
+class Haanga_Extension_Filter_Linebreaksbr
+{
+    static function generator($compiler, $args)
+    {
+    	$compiler->var_is_safe = TRUE;			/* we assume that if you use |linebreaksbr, you also want |safe */
+        return hexec('preg_replace', "/\r\n|\r|\n/", "<br />\n", $args[0]);
+    }
+}
diff --git a/lib/Haanga/lib/Haanga/Extension/Filter/old-Length.php b/lib/Haanga/lib/Haanga/Extension/Filter/old-Length.php
new file mode 100644
index 00000000..d0fb5262
--- /dev/null
+++ b/lib/Haanga/lib/Haanga/Extension/Filter/old-Length.php
@@ -0,0 +1,32 @@
+<?php
+
+class Haanga_Extension_Filter_Length
+{
+    public $is_safe = TRUE; /* a number if safe */
+    static function generator($compiler, $args)
+    {
+        $count  = hexec('count', $args[0]);
+        $strlen = hexec('strlen', $args[0]);
+        $guess  = hexpr_cond(hexec('is_array', $args[0]), hexec('count', $args[0]),
+                            hexec('strlen', $args[0]));
+
+        if (Haanga_AST::is_var($args[0])) {
+            /* if it is a variable, best effort to detect
+               its type at compile time */
+            $value = $compiler->get_context($args[0]['var']);
+            if (is_array($value)) {
+                return $count;
+            } else if  (is_string($value)) {
+                return $strlen;
+            } else {
+                return $guess;
+            }
+        }
+
+        if (Haanga_AST::is_str($args[0])) {
+            return $strlen;
+        }
+
+        return $guess;
+    }
+}
diff --git a/lib/Haanga/lib/Haanga/Extension/Tag/Exec.php b/lib/Haanga/lib/Haanga/Extension/Tag/Exec.php
index e4390b29..6fe85a2e 100644
--- a/lib/Haanga/lib/Haanga/Extension/Tag/Exec.php
+++ b/lib/Haanga/lib/Haanga/Extension/Tag/Exec.php
@@ -39,7 +39,7 @@ class Haanga_Extension_Tag_Exec
             $code->decl($assign, $exec);
 
             // make it global
-            $code->decl(hvar('vars', $assign), hvar($assign));
+            $code->decl($cmp->getScopeVariable($assign), hvar($assign));
         } else {
             $cmp->do_print($code, $exec);
         }
diff --git a/lib/Haanga/lib/Haanga/Extension/Tag/Inline.php b/lib/Haanga/lib/Haanga/Extension/Tag/Inline.php
index 287fd234..aeb593e9 100644
--- a/lib/Haanga/lib/Haanga/Extension/Tag/Inline.php
+++ b/lib/Haanga/lib/Haanga/Extension/Tag/Inline.php
@@ -18,7 +18,7 @@ class Haanga_Extension_Tag_Inline
         $file = $args[0]['string'];
 
         if (class_exists('Haanga')) {
-            $file = Haanga::GetTemplateDir().'/'.$file;
+            $file = Haanga::getTemplatePath($file);
         }
 
         if (!is_file($file)) {
diff --git a/lib/Haanga/lib/Haanga/Extension/Tag/Tryinclude.php b/lib/Haanga/lib/Haanga/Extension/Tag/Tryinclude.php
index c4957004..c7d18057 100644
--- a/lib/Haanga/lib/Haanga/Extension/Tag/Tryinclude.php
+++ b/lib/Haanga/lib/Haanga/Extension/Tag/Tryinclude.php
@@ -9,7 +9,7 @@ class Haanga_Extension_Tag_Tryinclude
         }
 
         $code = hcode();
-        $exec = hexec('Haanga::Safe_Load', $args[0], hvar('vars'), TRUE, array());
+        $exec = hexec('Haanga::Safe_Load', $args[0], $cmp->getScopeVariable(), TRUE, array());
 
         $cmp->do_print($code, $exec);
 
diff --git a/lib/Haanga/lib/Haanga/Generator/PHP.php b/lib/Haanga/lib/Haanga/Generator/PHP.php
index addf6645..09e8a648 100644
--- a/lib/Haanga/lib/Haanga/Generator/PHP.php
+++ b/lib/Haanga/lib/Haanga/Generator/PHP.php
@@ -59,6 +59,7 @@ class Haanga_Generator_PHP
 {
     protected $ident;
     protected $tab = "    ";
+    protected $scopeVariableName;
 
     // getCode (AST $op_code) {{{
     /**
@@ -69,8 +70,9 @@ class Haanga_Generator_PHP
      *  
      *  @return string
      */
-    final function getCode($op_code)
+    final function getCode($op_code, $scope)
     {
+        $this->scopeVariableName = $scope;
         $this->ident = 0;
         $code = "";
         $size = count($op_code);
@@ -195,7 +197,7 @@ class Haanga_Generator_PHP
      */
     function php_function($op)
     {
-        $code = "function {$op['name']}(\$vars, \$return=FALSE, \$blocks=array())".$this->ident()."{";
+        $code = "function {$op['name']}(\${$this->scopeVariableName}, \$return=FALSE, \$blocks=array())".$this->ident()."{";
         $this->ident++;
         return $code;
     }
@@ -331,7 +333,7 @@ class Haanga_Generator_PHP
     {
         $op['array'] = $this->php_get_varname($op['array']);
         $op['value'] = $this->php_get_varname($op['value']);
-        $code = "foreach ((array) {$op['array']} as ";
+        $code = "foreach ({$op['array']} as ";
         if (!isset($op['key'])) {
             $code .= " {$op['value']}";
         } else {
diff --git a/lib/Haanga/lib/Haanga/Loader.php b/lib/Haanga/lib/Haanga/Loader.php
new file mode 100644
index 00000000..d95d5aa8
--- /dev/null
+++ b/lib/Haanga/lib/Haanga/Loader.php
@@ -0,0 +1,133 @@
+<?php
+/**
+ *  Autoloader function generated by crodas/Autoloader
+ *
+ *  https://github.com/crodas/Autoloader
+ *
+ *  This is a generated file, do not modify it.
+ */
+
+spl_autoload_register(function ($class) {
+    /*
+        This array has a map of (class => file)
+    */
+
+    // classes {{{
+    static $classes = array (
+  'haanga' => '/../Haanga.php',
+  'haanga_extension' => '/Extension.php',
+  'haanga_exception' => '/Exception.php',
+  'haanga_compiler' => '/Compiler.php',
+  'hg_parser' => '/Compiler/Tokenizer.php',
+  'haanga_compiler_parser' => '/Compiler/Parser.php',
+  'haanga_compiler_tokenizer' => '/Compiler/Tokenizer.php',
+  'haanga_compiler_runtime' => '/Compiler/Runtime.php',
+  'haanga_compiler_exception' => '/Compiler/Exception.php',
+  'haanga_yytoken' => '/Compiler/Parser.php',
+  'haanga_yystackentry' => '/Compiler/Parser.php',
+  'haanga_generator_php' => '/Generator/PHP.php',
+  'haanga_extension_filter' => '/Extension/Filter.php',
+  'haanga_extension_filter_pluralize' => '/Extension/Filter/Pluralize.php',
+  'haanga_extension_filter_count' => '/Extension/Filter/Count.php',
+  'haanga_extension_filter_json' => '/Extension/Filter/Json.php',
+  'haanga_extension_filter_translation' => '/Extension/Filter/Translation.php',
+  'haanga_extension_filter_trans' => '/Extension/Filter/Trans.php',
+  'haanga_extension_filter_upper' => '/Extension/Filter/Upper.php',
+  'haanga_extension_filter_date' => '/Extension/Filter/Date.php',
+  'haanga_extension_filter_empty' => '/Extension/Filter/Empty.php',
+  'haanga_extension_filter_reverse' => '/Extension/Filter/Reverse.php',
+  'haanga_extension_filter_capfirst' => '/Extension/Filter/Capfirst.php',
+  'haanga_extension_filter_exists' => '/Extension/Filter/Exists.php',
+  'haanga_extension_filter_intval' => '/Extension/Filter/Intval.php',
+  'haanga_extension_filter_null' => '/Extension/Filter/Null.php',
+  'haanga_extension_filter_safe' => '/Extension/Filter/Safe.php',
+  'haanga_extension_filter_truncatechars' => '/Extension/Filter/Truncatechars.php',
+  'haanga_extension_filter_hostname' => '/Extension/Filter/Hostname.php',
+  'haanga_extension_filter_length' => '/Extension/Filter/Length.php',
+  'haanga_extension_filter_trim' => '/Extension/Filter/Trim.php',
+  'haanga_extension_filter_title' => '/Extension/Filter/Title.php',
+  'haanga_extension_filter_escape' => '/Extension/Filter/Escape.php',
+  'haanga_extension_filter_stringformat' => '/Extension/Filter/Stringformat.php',
+  'haanga_extension_filter_join' => '/Extension/Filter/Join.php',
+  'haanga_extension_filter_linebreaksbr' => '/Extension/Filter/Linebreaksbr.php',
+  'haanga_extension_filter_default' => '/Extension/Filter/Default.php',
+  'haanga_extension_filter_dictsort' => '/Extension/Filter/Dictsort.php',
+  'haanga_extension_filter_substr' => '/Extension/Filter/Substr.php',
+  'haanga_extension_filter_urlencode' => '/Extension/Filter/Urlencode.php',
+  'haanga_extension_filter_cut' => '/Extension/Filter/Cut.php',
+  'haanga_extension_filter_lower' => '/Extension/Filter/Lower.php',
+  'haanga_extension_filter_truncatewords' => '/Extension/Filter/Truncatewords.php',
+  'haanga_extension_filter_explode' => '/Extension/Filter/Explode.php',
+  'haanga_extension_filter_isarray' => '/Extension/Filter/Isarray.php',
+  'haanga_extension_filter_slugify' => '/Extension/Filter/Slugify.php',
+  'haanga_extension_filter_decodedescription' => '/Extension/Filter/Decodedescription.php',
+  'haanga_extension_filter_deurifier' => '/Extension/Filter/Deurifier.php',
+
+  
+  'haanga_extension_tag' => '/Extension/Tag.php',
+  'haanga_extension_tag_min' => '/Extension/Tag/Min.php',
+  'haanga_extension_tag_upper' => '/Extension/Tag/Upper.php',
+  'haanga_extension_tag_tryinclude' => '/Extension/Tag/Tryinclude.php',
+  'haanga_extension_tag_setsafe' => '/Extension/Tag/Setsafe.php',
+  'haanga_extension_tag_trans' => '/Extension/Tag/Trans.php',
+  'haanga_extension_tag_inline' => '/Extension/Tag/Inline.php',
+  'haanga_extension_tag_exec' => '/Extension/Tag/Exec.php',
+  'haanga_extension_tag_buffer' => '/Extension/Tag/Buffer.php',
+  'haanga_extension_tag_currenttime' => '/Extension/Tag/Currenttime.php',
+  'haanga_extension_tag_spaceless' => '/Extension/Tag/Spaceless.php',
+  'haanga_extension_tag_templatetag' => '/Extension/Tag/Templatetag.php',
+  'haanga_extension_tag_cycle' => '/Extension/Tag/Cycle.php',
+  'haanga_extension_tag_dictsort' => '/Extension/Tag/Dictsort.php',
+  'haanga_extension_tag_firstof' => '/Extension/Tag/Firstof.php',
+  'haanga_extension_tag_lower' => '/Extension/Tag/Lower.php',
+  'haanga_ast' => '/AST.php',
+);
+    // }}}
+
+    // deps {{{
+    static $deps    = array (
+  'hg_parser' => 
+  array (
+    0 => 'haanga_compiler_parser',
+  ),
+  'haanga_compiler_runtime' => 
+  array (
+    0 => 'haanga_compiler',
+  ),
+  'haanga_extension_filter' => 
+  array (
+    0 => 'haanga_extension',
+  ),
+  'haanga_extension_filter_translation' => 
+  array (
+    0 => 'haanga_extension_filter_trans',
+  ),
+  'haanga_extension_tag' => 
+  array (
+    0 => 'haanga_extension',
+  ),
+);
+    // }}}
+
+    $class = strtolower($class);
+    if (isset($classes[$class])) {
+        if (!empty($deps[$class])) {
+            foreach ($deps[$class] as $zclass) {
+                if (!class_exists($zclass, false)) {
+                    require __DIR__  . $classes[$zclass];
+                }
+            }
+        }
+
+        if (!class_exists($class, false)) {
+
+            require __DIR__  . $classes[$class];
+
+        }
+        return true;
+    }
+
+    return false;
+});
+
+
diff --git a/utils/install-https b/utils/install-https
new file mode 100644
index 00000000..a60dd656
--- /dev/null
+++ b/utils/install-https
@@ -0,0 +1,72 @@
+#
+# Installation script for LODSPeaKr (http://lodspeakr.org)
+# Author: Alvaro Graves (alvaro@graves.cl)
+# Modified by: Tim Lebo (lebot@rpi.edu)
+#
+# The URL:
+#    http://lodspeakr.org/install 
+#       303 redirects to this script.
+
+lodspeakr_repository="https://github.com/alangrafu/lodspeakr.git"
+home=`basename $lodspeakr_repository | sed 's/.git//'`
+
+source ~/.bashrc
+GIT=`which git`
+
+if [ -z "$GIT" ]; then
+  echo "git is required to continue installation. Please add git to your \$PATH."
+  exit 1
+fi
+
+
+_baseurl=
+_basens=
+_sparqlendpoint=
+_chown=
+_chmod=
+_components=
+
+options=$@
+
+# An array with all the arguments
+arguments=($options)
+
+# Loop index
+index=0
+
+for argument in $options
+  do
+    # Incrementing index
+    index=`expr $index + 1`
+
+    # The conditions
+    case $argument in
+      base-url=*) val=${argument#*=};
+                  opt=${argument%=$val};
+                  _baseurl="base-url=${val}" ;;
+      base-namespace=*) val=${argument#*=};
+                  opt=${argument%=$val};
+                  _basens="base-namespace=${val}" ;;
+      sparql-endpoint=*) val=${argument#*=};
+                  opt=${argument%=$val};
+                  _sparqlendpoint="sparql-endpoint=${val}" ;;
+      chown=*) val=${argument#*=};
+                  opt=${argument%=$val};
+                  _chown="chown=${val}" ;;
+      chmod=*) val=${argument#*=};
+                  opt=${argument%=$val};
+                  _chmod="chmod=${val}" ;;
+      components=*) val=${argument#*=};
+                  opt=${argument%=$val};
+                  _components="components=${val}" ;;
+    esac
+  done
+
+
+if [ ! -e "$home" ]; then
+   $GIT clone $lodspeakr_repository
+   cd $home
+   ./install.sh $home $_baseurl $_basens $_sparqlendpoint $_chown $_chmod $_components
+ else
+   echo "There is already an existing directory called '$home'. Installation cancelled. Remove it first and try again."
+fi
-- 
GitLab