text: var ast, _;
  
  _ = _ = require('underscore');
  
  ast = ast = require('./ast.js');
  
  put_if_not_null = function(o, key, val) {
    if (!_.isEmpty(val)) {
      o[key] = val;
    }
    return o;
  };
  
  flatstr = function(x, rejectSpace, joinChar) {
    if (rejectSpace == null) {
      rejectSpace = false;
    }
    if (joinChar == null) {
      joinChar = '';
    }
    return _.reject(_.flatten(x), _.isEmpty).join(joinChar);
  };
  
  module.exports = (function() {
    "use strict";
  
    /*
     * Generated by PEG.js 0.9.0.
     *
     * http://pegjs.org/
     */
  
    function peg$subclass(child, parent) {
      function ctor() { this.constructor = child; }
      ctor.prototype = parent.prototype;
      child.prototype = new ctor();
    }
  
    function peg$SyntaxError(message, expected, found, location) {
      this.message  = message;
      this.expected = expected;
      this.found    = found;
      this.location = location;
      this.name     = "SyntaxError";
  
      if (typeof Error.captureStackTrace === "function") {
        Error.captureStackTrace(this, peg$SyntaxError);
      }
    }
  
    peg$subclass(peg$SyntaxError, Error);
  
    function peg$parse(input) {
      var options = arguments.length > 1 ? arguments[1] : {},
          parser  = this,
  
          peg$FAILED = {},
  
          peg$startRuleFunctions = { start: peg$parsestart },
          peg$startRuleFunction  = peg$parsestart,
  
          peg$c0 = function(c) { 
              var qs = _.chain(c)
                        .flatten()
                        .without(";", " ", "\t")
                        .compact()
                        .value();
              return new ast.Queries(qs);
            },
          peg$c1 = function(g) { return g; },
          peg$c2 = "(",
          peg$c3 = { type: "literal", value: "(", description: "\"(\"" },
          peg$c4 = ")",
          peg$c5 = { type: "literal", value: ")", description: "\")\"" },
          peg$c6 = function(s) {
              return new ast.Tuple(s[0], s[2]);
            },
          peg$c7 = function(l) {
              return _.chain(l)
                      .flatten()
                      .without(" ", ",")
                      .compact()
                      .value();
            },
          peg$c8 = ":-",
          peg$c9 = { type: "literal", value: ":-", description: "\":-\"" },
          peg$c10 = function(s) {
              return new ast.Statement(s[0], s[4]);
            },
          peg$c11 = function(h) {
              return new ast.Predicate(h[0], h[2]);
            },
          peg$c12 = function(n) {
              var name = n[0],
                  args = n[2];
              args = _.chain(args)
                      .flatten()
                      .without(" ", ",")
                      .compact()
                      .value();
  
              if (_.all(args, _.isString)) {
                return new ast.Predicate(name, args);
              }
              return new ast.AggPredicate(name, args);
            },
          peg$c13 = function(a) {
              return _.chain(a)
                      .flatten()
                      .without(",", " ", "\n", "\t")
                      .compact()
                      .value();
            },
          peg$c14 = function(l) {
              return _.chain(l)
                      .flatten()
                      .without(",", " ", "\n", "\t")
                      .value();
            },
          peg$c15 = function(t) {
              return _.chain(t)
                      .flatten()
                      .without(",", " ", "\n", "\t")
                      .value();
            },
          peg$c16 = function(x) { 
                        if (x == "NULL" || x == "null") {
                          return new ast.SpecialExpr(null);
                        }
                        return new ast.ValExpr(x); 
                      },
          peg$c17 = function(t) { return new ast.ColExpr(t[2], t[0]); },
          peg$c18 = function(c) { return new ast.ColExpr(c); },
          peg$c19 = function(r) { return r; },
          peg$c20 = function(pv) { return pv },
          peg$c21 = function(u) { return new ast.UnaryExpr(u[0], u[1]); },
          peg$c22 = function(p) { return p[1]; },
          peg$c23 = function(v) { return v[1] },
          peg$c24 = "AND",
          peg$c25 = { type: "literal", value: "AND", description: "\"AND\"" },
          peg$c26 = function(e) {
              var expr = e[0];
              var expr_rest = e[1];
              var memo_f = function(memo, e) { return new ast.Expr(memo, 'AND', e); }
  
              expr_rest = _.compact(_.without(_.flatten(expr_rest), "AND", " ", "\t"));
              expr = _.reduce(expr_rest, memo_f, expr);
              return expr;
            },
          peg$c27 = function(a) { return new ast.Expr(a[0], a[1], a[2]); },
          peg$c28 = function(b) { return new ast.Expr(b[0], b[1]); },
          peg$c29 = function(c) { return new ast.Expr(c[0], "IS NOT", c[c.length-1]) },
          peg$c30 = function(f) { 
                          if (f.length == 5) {
                            return new ast.BetweenExpr(f[0], "NOT BETWEEN", f[3], f[5]);
                          } return new ast.BetweenExpr(f[0], "BETWEEN", f[3], f[5]);
                        },
          peg$c31 = function(e) { return e[1]; },
          peg$c32 = "$",
          peg$c33 = { type: "literal", value: "$", description: "\"$\"" },
          peg$c34 = function(r) { return new ast.ParamVar(r[1]); },
          peg$c35 = ":",
          peg$c36 = { type: "literal", value: ":", description: "\":\"" },
          peg$c37 = "|",
          peg$c38 = { type: "literal", value: "|", description: "\"|\"" },
          peg$c39 = function(r) {
              var expr = r[1];
  
              var defaultMatch = r[2];
              var defaultExpr = null;
              if (!_.isNull(defaultMatch)) {
                defaultExpr = defaultMatch[3];
                if (defaultExpr.descendents("ParamVar").length > 0) {
                  throw Error("Param: default expression cannot include variables");
                }
              }
              return new ast.ParamExpr(expr, defaultExpr);
            },
          peg$c40 = function(c) {
              c = _.flatten(c);
              c = _.without(c, ' ', '\t', 'AND');
              return new ast.Where(c);
            },
          peg$c41 = function(x) { return new ast.ValExpr(x); },
          peg$c42 = function(v) { return new ast.ColExpr(v, null); },
          peg$c43 = function(pv) { return pv; },
          peg$c44 = function(y) { return y[1]; },
          peg$c45 = "EXISTS",
          peg$c46 = { type: "literal", value: "EXISTS", description: "\"EXISTS\"" },
          peg$c47 = function(d) { return new ast.QuantExpr("exists", d[2], d[5], d[7]); },
          peg$c48 = "FORALL",
          peg$c49 = { type: "literal", value: "FORALL", description: "\"FORALL\"" },
          peg$c50 = function(e) { return new ast.QuantExpr("all", e[2], e[5], e[7]); },
          peg$c51 = function(a) { 
                            var distinct = !_.isNull(a[0]);
                            var args = _.chain(a[1])
                              .flatten()
                              .without(",", " ", "\t", "\n")
                              .compact()
                              .value();
                            return {
                              distinct: distinct,
                              args: args
                            }
                           },
          peg$c52 = function() { 
                             return { 
                              distinct: false,
                              args: [new ast.SpecialExpr("*")]
                             }; 
                            },
          peg$c53 = function(cf) { 
              var args = cf[3];
              return new ast.FuncExpr(cf[0], args.args);
            },
          peg$c54 = function(r) { return new ast.ColExpr(r[2], r[0]); },
          peg$c55 = function(r) { return new ast.TableExpr(r); },
          peg$c56 = function(digits) { 
              var x = flatstr(digits);
              if (x.indexOf('.') >= 0) {
                return parseFloat(x);
              }
              return parseInt(x);
            },
          peg$c57 = function(t) { if (!_.isNull(t) && !_.isNull(t[0])) t = t[0];
                        return new ast.SpecialExpr("*", t); },
          peg$c58 = function(a) { 
                          var distinct = !_.isNull(a[0]);
                          var args = _.chain(a[1])
                            .flatten()
                            .without(",", " ", "\t", null)
                            .value();
                          // ignores distinct
                          return args;
                        },
          peg$c59 = function(cf) { 
              return new ast.FuncExpr(cf[0], cf[3]);
            },
          peg$c60 = function(r) {
              var t = null;
              if (!_.isNull(r[0]) && !_.isNull(r[0][0])) t = r[0][0];
              return new ast.ColExpr(r[1], t);
            },
          peg$c61 = function(gt) { return gt[1]; },
          peg$c62 = function(ot) { 
              var asc = true; 
              if (ot[1][1] == "DESC") asc = false;
              return new ast.OrderByClause(ot[1][0], asc);
            },
          peg$c63 = function(o) { return { op: flatstr(o) } },
          peg$c64 = "-",
          peg$c65 = { type: "literal", value: "-", description: "\"-\"" },
          peg$c66 = "+",
          peg$c67 = { type: "literal", value: "+", description: "\"+\"" },
          peg$c68 = "~",
          peg$c69 = { type: "literal", value: "~", description: "\"~\"" },
          peg$c70 = "NOT",
          peg$c71 = { type: "literal", value: "NOT", description: "\"NOT\"" },
          peg$c72 = function(x) { return x[1] },
          peg$c73 = "||",
          peg$c74 = { type: "literal", value: "||", description: "\"||\"" },
          peg$c75 = "*",
          peg$c76 = { type: "literal", value: "*", description: "\"*\"" },
          peg$c77 = "/",
          peg$c78 = { type: "literal", value: "/", description: "\"/\"" },
          peg$c79 = "%",
          peg$c80 = { type: "literal", value: "%", description: "\"%\"" },
          peg$c81 = "<<",
          peg$c82 = { type: "literal", value: "<<", description: "\"<<\"" },
          peg$c83 = ">>",
          peg$c84 = { type: "literal", value: ">>", description: "\">>\"" },
          peg$c85 = "&",
          peg$c86 = { type: "literal", value: "&", description: "\"&\"" },
          peg$c87 = "<=",
          peg$c88 = { type: "literal", value: "<=", description: "\"<=\"" },
          peg$c89 = ">=",
          peg$c90 = { type: "literal", value: ">=", description: "\">=\"" },
          peg$c91 = "<",
          peg$c92 = { type: "literal", value: "<", description: "\"<\"" },
          peg$c93 = ">",
          peg$c94 = { type: "literal", value: ">", description: "\">\"" },
          peg$c95 = "=",
          peg$c96 = { type: "literal", value: "=", description: "\"=\"" },
          peg$c97 = "==",
          peg$c98 = { type: "literal", value: "==", description: "\"==\"" },
          peg$c99 = "!=",
          peg$c100 = { type: "literal", value: "!=", description: "\"!=\"" },
          peg$c101 = "<>",
          peg$c102 = { type: "literal", value: "<>", description: "\"<>\"" },
          peg$c103 = "IS",
          peg$c104 = { type: "literal", value: "IS", description: "\"IS\"" },
          peg$c105 = "IS NOT",
          peg$c106 = { type: "literal", value: "IS NOT", description: "\"IS NOT\"" },
          peg$c107 = "IN",
          peg$c108 = { type: "literal", value: "IN", description: "\"IN\"" },
          peg$c109 = "NOT IN",
          peg$c110 = { type: "literal", value: "NOT IN", description: "\"NOT IN\"" },
          peg$c111 = "LIKE",
          peg$c112 = { type: "literal", value: "LIKE", description: "\"LIKE\"" },
          peg$c113 = "GLOB",
          peg$c114 = { type: "literal", value: "GLOB", description: "\"GLOB\"" },
          peg$c115 = "MATCH",
          peg$c116 = { type: "literal", value: "MATCH", description: "\"MATCH\"" },
          peg$c117 = "REGEXP",
          peg$c118 = { type: "literal", value: "REGEXP", description: "\"REGEXP\"" },
          peg$c119 = "OR",
          peg$c120 = { type: "literal", value: "OR", description: "\"OR\"" },
          peg$c121 = /^[A-Za-z0-9_]/,
          peg$c122 = { type: "class", value: "[A-Za-z0-9_]", description: "[A-Za-z0-9_]" },
          peg$c123 = function(str) { return str.join('') },
          peg$c124 = "int",
          peg$c125 = { type: "literal", value: "int", description: "\"int\"" },
          peg$c126 = "numeric",
          peg$c127 = { type: "literal", value: "numeric", description: "\"numeric\"" },
          peg$c128 = "float",
          peg$c129 = { type: "literal", value: "float", description: "\"float\"" },
          peg$c130 = "text",
          peg$c131 = { type: "literal", value: "text", description: "\"text\"" },
          peg$c132 = "varchar",
          peg$c133 = { type: "literal", value: "varchar", description: "\"varchar\"" },
          peg$c134 = "char",
          peg$c135 = { type: "literal", value: "char", description: "\"char\"" },
          peg$c136 = function(n) { return new ast.Table(n, null); },
          peg$c137 = /^[0-9]/,
          peg$c138 = { type: "class", value: "[0-9]", description: "[0-9]" },
          peg$c139 = ".",
          peg$c140 = { type: "literal", value: ".", description: "\".\"" },
          peg$c141 = ",",
          peg$c142 = { type: "literal", value: ",", description: "\",\"" },
          peg$c143 = ";",
          peg$c144 = { type: "literal", value: ";", description: "\";\"" },
          peg$c145 = "--",
          peg$c146 = { type: "literal", value: "--", description: "\"--\"" },
          peg$c147 = "\n",
          peg$c148 = { type: "literal", value: "\n", description: "\"\\n\"" },
          peg$c149 = /^[^\n]/,
          peg$c150 = { type: "class", value: "[^\\n]", description: "[^\\n]" },
          peg$c151 = "/*",
          peg$c152 = { type: "literal", value: "/*", description: "\"/*\"" },
          peg$c153 = "*/",
          peg$c154 = { type: "literal", value: "*/", description: "\"*/\"" },
          peg$c155 = { type: "any", description: "any character" },
          peg$c156 = "'",
          peg$c157 = { type: "literal", value: "'", description: "\"'\"" },
          peg$c158 = /^[^"']/,
          peg$c159 = { type: "class", value: "[^\"']", description: "[^\"']" },
          peg$c160 = function(s) { return s[1].join(''); },
          peg$c161 = "\\",
          peg$c162 = { type: "literal", value: "\\", description: "\"\\\\\"" },
          peg$c163 = "",
          peg$c164 = "now",
          peg$c165 = { type: "literal", value: "now", description: "\"now\"" },
          peg$c166 = /^[ \t\n\r]/,
          peg$c167 = { type: "class", value: "[ \\t\\n\\r]", description: "[ \\t\\n\\r]" },
          peg$c168 = "ADD",
          peg$c169 = { type: "literal", value: "ADD", description: "\"ADD\"" },
          peg$c170 = "ALL",
          peg$c171 = { type: "literal", value: "ALL", description: "\"ALL\"" },
          peg$c172 = "ALTER",
          peg$c173 = { type: "literal", value: "ALTER", description: "\"ALTER\"" },
          peg$c174 = "AS",
          peg$c175 = { type: "literal", value: "AS", description: "\"AS\"" },
          peg$c176 = "ASC",
          peg$c177 = { type: "literal", value: "ASC", description: "\"ASC\"" },
          peg$c178 = "BETWEEN",
          peg$c179 = { type: "literal", value: "BETWEEN", description: "\"BETWEEN\"" },
          peg$c180 = "BY",
          peg$c181 = { type: "literal", value: "BY", description: "\"BY\"" },
          peg$c182 = "CAST",
          peg$c183 = { type: "literal", value: "CAST", description: "\"CAST\"" },
          peg$c184 = "COLUMN",
          peg$c185 = { type: "literal", value: "COLUMN", description: "\"COLUMN\"" },
          peg$c186 = "DESC",
          peg$c187 = { type: "literal", value: "DESC", description: "\"DESC\"" },
          peg$c188 = "DISTINCT",
          peg$c189 = { type: "literal", value: "DISTINCT", description: "\"DISTINCT\"" },
          peg$c190 = "E",
          peg$c191 = { type: "literal", value: "E", description: "\"E\"" },
          peg$c192 = "ESCAPE",
          peg$c193 = { type: "literal", value: "ESCAPE", description: "\"ESCAPE\"" },
          peg$c194 = "EXCEPT",
          peg$c195 = { type: "literal", value: "EXCEPT", description: "\"EXCEPT\"" },
          peg$c196 = "EXPLAIN",
          peg$c197 = { type: "literal", value: "EXPLAIN", description: "\"EXPLAIN\"" },
          peg$c198 = "EVENT",
          peg$c199 = { type: "literal", value: "EVENT", description: "\"EVENT\"" },
          peg$c200 = "FROM",
          peg$c201 = { type: "literal", value: "FROM", description: "\"FROM\"" },
          peg$c202 = "GROUP",
          peg$c203 = { type: "literal", value: "GROUP", description: "\"GROUP\"" },
          peg$c204 = "HAVING",
          peg$c205 = { type: "literal", value: "HAVING", description: "\"HAVING\"" },
          peg$c206 = "INNER",
          peg$c207 = { type: "literal", value: "INNER", description: "\"INNER\"" },
          peg$c208 = "INSERT",
          peg$c209 = { type: "literal", value: "INSERT", description: "\"INSERT\"" },
          peg$c210 = "INTERSECT",
          peg$c211 = { type: "literal", value: "INTERSECT", description: "\"INTERSECT\"" },
          peg$c212 = "INTO",
          peg$c213 = { type: "literal", value: "INTO", description: "\"INTO\"" },
          peg$c214 = "ISNULL",
          peg$c215 = { type: "literal", value: "ISNULL", description: "\"ISNULL\"" },
          peg$c216 = "JOIN",
          peg$c217 = { type: "literal", value: "JOIN", description: "\"JOIN\"" },
          peg$c218 = "KEY",
          peg$c219 = { type: "literal", value: "KEY", description: "\"KEY\"" },
          peg$c220 = "LEFT",
          peg$c221 = { type: "literal", value: "LEFT", description: "\"LEFT\"" },
          peg$c222 = "LIMIT",
          peg$c223 = { type: "literal", value: "LIMIT", description: "\"LIMIT\"" },
          peg$c224 = "NO",
          peg$c225 = { type: "literal", value: "NO", description: "\"NO\"" },
          peg$c226 = "NOTNULL",
          peg$c227 = { type: "literal", value: "NOTNULL", description: "\"NOTNULL\"" },
          peg$c228 = "NULL",
          peg$c229 = { type: "literal", value: "NULL", description: "\"NULL\"" },
          peg$c230 = "null",
          peg$c231 = { type: "literal", value: "null", description: "\"null\"" },
          peg$c232 = "OF",
          peg$c233 = { type: "literal", value: "OF", description: "\"OF\"" },
          peg$c234 = "OFFSET",
          peg$c235 = { type: "literal", value: "OFFSET", description: "\"OFFSET\"" },
          peg$c236 = "ON",
          peg$c237 = { type: "literal", value: "ON", description: "\"ON\"" },
          peg$c238 = "ORDER",
          peg$c239 = { type: "literal", value: "ORDER", description: "\"ORDER\"" },
          peg$c240 = "OUTER",
          peg$c241 = { type: "literal", value: "OUTER", description: "\"OUTER\"" },
          peg$c242 = "PRIMARY",
          peg$c243 = { type: "literal", value: "PRIMARY", description: "\"PRIMARY\"" },
          peg$c244 = "QUERY",
          peg$c245 = { type: "literal", value: "QUERY", description: "\"QUERY\"" },
          peg$c246 = "RAISE",
          peg$c247 = { type: "literal", value: "RAISE", description: "\"RAISE\"" },
          peg$c248 = "REFERENCES",
          peg$c249 = { type: "literal", value: "REFERENCES", description: "\"REFERENCES\"" },
          peg$c250 = "RENAME",
          peg$c251 = { type: "literal", value: "RENAME", description: "\"RENAME\"" },
          peg$c252 = "REPLACE",
          peg$c253 = { type: "literal", value: "REPLACE", description: "\"REPLACE\"" },
          peg$c254 = "RETURN",
          peg$c255 = { type: "literal", value: "RETURN", description: "\"RETURN\"" },
          peg$c256 = "ROW",
          peg$c257 = { type: "literal", value: "ROW", description: "\"ROW\"" },
          peg$c258 = "SAVEPOINT",
          peg$c259 = { type: "literal", value: "SAVEPOINT", description: "\"SAVEPOINT\"" },
          peg$c260 = "SELECT",
          peg$c261 = { type: "literal", value: "SELECT", description: "\"SELECT\"" },
          peg$c262 = "SET",
          peg$c263 = { type: "literal", value: "SET", description: "\"SET\"" },
          peg$c264 = "TABLE",
          peg$c265 = { type: "literal", value: "TABLE", description: "\"TABLE\"" },
          peg$c266 = "TEMP",
          peg$c267 = { type: "literal", value: "TEMP", description: "\"TEMP\"" },
          peg$c268 = "TEMPORARY",
          peg$c269 = { type: "literal", value: "TEMPORARY", description: "\"TEMPORARY\"" },
          peg$c270 = "THEN",
          peg$c271 = { type: "literal", value: "THEN", description: "\"THEN\"" },
          peg$c272 = "TO",
          peg$c273 = { type: "literal", value: "TO", description: "\"TO\"" },
          peg$c274 = "UNION",
          peg$c275 = { type: "literal", value: "UNION", description: "\"UNION\"" },
          peg$c276 = "USING",
          peg$c277 = { type: "literal", value: "USING", description: "\"USING\"" },
          peg$c278 = "VALUES",
          peg$c279 = { type: "literal", value: "VALUES", description: "\"VALUES\"" },
          peg$c280 = "VIRTUAL",
          peg$c281 = { type: "literal", value: "VIRTUAL", description: "\"VIRTUAL\"" },
          peg$c282 = "WITH",
          peg$c283 = { type: "literal", value: "WITH", description: "\"WITH\"" },
          peg$c284 = "WHERE",
          peg$c285 = { type: "literal", value: "WHERE", description: "\"WHERE\"" },
          peg$c286 = { type: "other", description: "string" },
          peg$c287 = "\"",
          peg$c288 = { type: "literal", value: "\"", description: "\"\\\"\"" },
          peg$c289 = function(chars) {
                return { type: "Literal", value: chars.join("") };
              },
          peg$c290 = function() { return text(); },
          peg$c291 = function(sequence) { return sequence; },
          peg$c292 = function() { return ""; },
          peg$c293 = "0",
          peg$c294 = { type: "literal", value: "0", description: "\"0\"" },
          peg$c295 = function() { return "\0"; },
          peg$c296 = /^[\n\r\u2028\u2029]/,
          peg$c297 = { type: "class", value: "[\\n\\r\\u2028\\u2029]", description: "[\\n\\r\\u2028\\u2029]" },
          peg$c298 = "b",
          peg$c299 = { type: "literal", value: "b", description: "\"b\"" },
          peg$c300 = function() { return "\b";   },
          peg$c301 = "f",
          peg$c302 = { type: "literal", value: "f", description: "\"f\"" },
          peg$c303 = function() { return "\f";   },
          peg$c304 = "n",
          peg$c305 = { type: "literal", value: "n", description: "\"n\"" },
          peg$c306 = function() { return "\n";   },
          peg$c307 = "r",
          peg$c308 = { type: "literal", value: "r", description: "\"r\"" },
          peg$c309 = function() { return "\r";   },
          peg$c310 = "t",
          peg$c311 = { type: "literal", value: "t", description: "\"t\"" },
          peg$c312 = function() { return "\t";   },
          peg$c313 = "v",
          peg$c314 = { type: "literal", value: "v", description: "\"v\"" },
          peg$c315 = function() { return "\x0B"; },
          peg$c316 = { type: "other", description: "end of line" },
          peg$c317 = "\r\n",
          peg$c318 = { type: "literal", value: "\r\n", description: "\"\\r\\n\"" },
          peg$c319 = "\r",
          peg$c320 = { type: "literal", value: "\r", description: "\"\\r\"" },
          peg$c321 = "\u2028",
          peg$c322 = { type: "literal", value: "\u2028", description: "\"\\u2028\"" },
          peg$c323 = "\u2029",
          peg$c324 = { type: "literal", value: "\u2029", description: "\"\\u2029\"" },
          peg$c325 = "x",
          peg$c326 = { type: "literal", value: "x", description: "\"x\"" },
          peg$c327 = "u",
          peg$c328 = { type: "literal", value: "u", description: "\"u\"" },
          peg$c329 = function(digits) {
                return String.fromCharCode(parseInt(digits, 16));
              },
          peg$c330 = /^[0-9a-f]/i,
          peg$c331 = { type: "class", value: "[0-9a-f]i", description: "[0-9a-f]i" },
  
          peg$currPos          = 0,
          peg$savedPos         = 0,
          peg$posDetailsCache  = [{ line: 1, column: 1, seenCR: false }],
          peg$maxFailPos       = 0,
          peg$maxFailExpected  = [],
          peg$silentFails      = 0,
  
          peg$result;
  
      if ("startRule" in options) {
        if (!(options.startRule in peg$startRuleFunctions)) {
          throw new Error("Can't start parsing from rule \"" + options.startRule + "\".");
        }
  
        peg$startRuleFunction = peg$startRuleFunctions[options.startRule];
      }
  
      function text() {
        return input.substring(peg$savedPos, peg$currPos);
      }
  
      function location() {
        return peg$computeLocation(peg$savedPos, peg$currPos);
      }
  
      function expected(description) {
        throw peg$buildException(
          null,
          [{ type: "other", description: description }],
          input.substring(peg$savedPos, peg$currPos),
          peg$computeLocation(peg$savedPos, peg$currPos)
        );
      }
  
      function error(message) {
        throw peg$buildException(
          message,
          null,
          input.substring(peg$savedPos, peg$currPos),
          peg$computeLocation(peg$savedPos, peg$currPos)
        );
      }
  
      function peg$computePosDetails(pos) {
        var details = peg$posDetailsCache[pos],
            p, ch;
  
        if (details) {
          return details;
        } else {
          p = pos - 1;
          while (!peg$posDetailsCache[p]) {
            p--;
          }
  
          details = peg$posDetailsCache[p];
          details = {
            line:   details.line,
            column: details.column,
            seenCR: details.seenCR
          };
  
          while (p < pos) {
            ch = input.charAt(p);
            if (ch === "\n") {
              if (!details.seenCR) { details.line++; }
              details.column = 1;
              details.seenCR = false;
            } else if (ch === "\r" || ch === "\u2028" || ch === "\u2029") {
              details.line++;
              details.column = 1;
              details.seenCR = true;
            } else {
              details.column++;
              details.seenCR = false;
            }
  
            p++;
          }
  
          peg$posDetailsCache[pos] = details;
          return details;
        }
      }
  
      function peg$computeLocation(startPos, endPos) {
        var startPosDetails = peg$computePosDetails(startPos),
            endPosDetails   = peg$computePosDetails(endPos);
  
        return {
          start: {
            offset: startPos,
            line:   startPosDetails.line,
            column: startPosDetails.column
          },
          end: {
            offset: endPos,
            line:   endPosDetails.line,
            column: endPosDetails.column
          }
        };
      }
  
      function peg$fail(expected) {
        if (peg$currPos < peg$maxFailPos) { return; }
  
        if (peg$currPos > peg$maxFailPos) {
          peg$maxFailPos = peg$currPos;
          peg$maxFailExpected = [];
        }
  
        peg$maxFailExpected.push(expected);
      }
  
      function peg$buildException(message, expected, found, location) {
        function cleanupExpected(expected) {
          var i = 1;
  
          expected.sort(function(a, b) {
            if (a.description < b.description) {
              return -1;
            } else if (a.description > b.description) {
              return 1;
            } else {
              return 0;
            }
          });
  
          while (i < expected.length) {
            if (expected[i - 1] === expected[i]) {
              expected.splice(i, 1);
            } else {
              i++;
            }
          }
        }
  
        function buildMessage(expected, found) {
          function stringEscape(s) {
            function hex(ch) { return ch.charCodeAt(0).toString(16).toUpperCase(); }
  
            return s
              .replace(/\\/g,   '\\\\')
              .replace(/"/g,    '\\"')
              .replace(/\x08/g, '\\b')
              .replace(/\t/g,   '\\t')
              .replace(/\n/g,   '\\n')
              .replace(/\f/g,   '\\f')
              .replace(/\r/g,   '\\r')
              .replace(/[\x00-\x07\x0B\x0E\x0F]/g, function(ch) { return '\\x0' + hex(ch); })
              .replace(/[\x10-\x1F\x80-\xFF]/g,    function(ch) { return '\\x'  + hex(ch); })
              .replace(/[\u0100-\u0FFF]/g,         function(ch) { return '\\u0' + hex(ch); })
              .replace(/[\u1000-\uFFFF]/g,         function(ch) { return '\\u'  + hex(ch); });
          }
  
          var expectedDescs = new Array(expected.length),
              expectedDesc, foundDesc, i;
  
          for (i = 0; i < expected.length; i++) {
            expectedDescs[i] = expected[i].description;
          }
  
          expectedDesc = expected.length > 1
            ? expectedDescs.slice(0, -1).join(", ")
                + " or "
                + expectedDescs[expected.length - 1]
            : expectedDescs[0];
  
          foundDesc = found ? "\"" + stringEscape(found) + "\"" : "end of input";
  
          return "Expected " + expectedDesc + " but " + foundDesc + " found.";
        }
  
        if (expected !== null) {
          cleanupExpected(expected);
        }
  
        return new peg$SyntaxError(
          message !== null ? message : buildMessage(expected, found),
          expected,
          found,
          location
        );
      }
  
      function peg$parsestart() {
        var s0;
  
        s0 = peg$parsestmt_list();
  
        return s0;
      }
  
      function peg$parsestmt_list() {
        var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parsewhitespace();
        if (s2 !== peg$FAILED) {
          s3 = peg$parsegeneral_stmt();
          if (s3 === peg$FAILED) {
            s3 = null;
          }
          if (s3 !== peg$FAILED) {
            s4 = [];
            s5 = peg$currPos;
            s6 = peg$parsewhitespace();
            if (s6 !== peg$FAILED) {
              s7 = peg$parsesemicolon();
              if (s7 !== peg$FAILED) {
                s8 = peg$parsewhitespace();
                if (s8 !== peg$FAILED) {
                  s9 = peg$parsegeneral_stmt();
                  if (s9 === peg$FAILED) {
                    s9 = null;
                  }
                  if (s9 !== peg$FAILED) {
                    s6 = [s6, s7, s8, s9];
                    s5 = s6;
                  } else {
                    peg$currPos = s5;
                    s5 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s5;
                  s5 = peg$FAILED;
                }
              } else {
                peg$currPos = s5;
                s5 = peg$FAILED;
              }
            } else {
              peg$currPos = s5;
              s5 = peg$FAILED;
            }
            while (s5 !== peg$FAILED) {
              s4.push(s5);
              s5 = peg$currPos;
              s6 = peg$parsewhitespace();
              if (s6 !== peg$FAILED) {
                s7 = peg$parsesemicolon();
                if (s7 !== peg$FAILED) {
                  s8 = peg$parsewhitespace();
                  if (s8 !== peg$FAILED) {
                    s9 = peg$parsegeneral_stmt();
                    if (s9 === peg$FAILED) {
                      s9 = null;
                    }
                    if (s9 !== peg$FAILED) {
                      s6 = [s6, s7, s8, s9];
                      s5 = s6;
                    } else {
                      peg$currPos = s5;
                      s5 = peg$FAILED;
                    }
                  } else {
                    peg$currPos = s5;
                    s5 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s5;
                  s5 = peg$FAILED;
                }
              } else {
                peg$currPos = s5;
                s5 = peg$FAILED;
              }
            }
            if (s4 !== peg$FAILED) {
              s5 = peg$parsewhitespace();
              if (s5 !== peg$FAILED) {
                s6 = peg$parsesemicolon();
                if (s6 === peg$FAILED) {
                  s6 = null;
                }
                if (s6 !== peg$FAILED) {
                  s7 = peg$parsewhitespace();
                  if (s7 !== peg$FAILED) {
                    s2 = [s2, s3, s4, s5, s6, s7];
                    s1 = s2;
                  } else {
                    peg$currPos = s1;
                    s1 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s1;
                  s1 = peg$FAILED;
                }
              } else {
                peg$currPos = s1;
                s1 = peg$FAILED;
              }
            } else {
              peg$currPos = s1;
              s1 = peg$FAILED;
            }
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c0(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parsegeneral_stmt() {
        var s0, s1;
  
        s0 = peg$currPos;
        s1 = peg$parsetuple_stmt();
        if (s1 === peg$FAILED) {
          s1 = peg$parsedatalog_stmt();
          if (s1 === peg$FAILED) {
            s1 = peg$parseparam_expr();
            if (s1 === peg$FAILED) {
              s1 = peg$parseexpr_and();
            }
          }
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c1(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parsetuple_stmt() {
        var s0, s1, s2, s3, s4, s5;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parsename();
        if (s2 !== peg$FAILED) {
          if (input.charCodeAt(peg$currPos) === 40) {
            s3 = peg$c2;
            peg$currPos++;
          } else {
            s3 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c3); }
          }
          if (s3 !== peg$FAILED) {
            s4 = peg$parseval_list();
            if (s4 !== peg$FAILED) {
              if (input.charCodeAt(peg$currPos) === 41) {
                s5 = peg$c4;
                peg$currPos++;
              } else {
                s5 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c5); }
              }
              if (s5 !== peg$FAILED) {
                s2 = [s2, s3, s4, s5];
                s1 = s2;
              } else {
                peg$currPos = s1;
                s1 = peg$FAILED;
              }
            } else {
              peg$currPos = s1;
              s1 = peg$FAILED;
            }
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c6(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parseval_list() {
        var s0, s1, s2, s3, s4, s5, s6, s7, s8;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parseliteral_value();
        if (s2 !== peg$FAILED) {
          s3 = [];
          s4 = peg$currPos;
          s5 = peg$parsewhitespace();
          if (s5 !== peg$FAILED) {
            s6 = peg$parsecomma();
            if (s6 !== peg$FAILED) {
              s7 = peg$parsewhitespace();
              if (s7 !== peg$FAILED) {
                s8 = peg$parseliteral_value();
                if (s8 !== peg$FAILED) {
                  s5 = [s5, s6, s7, s8];
                  s4 = s5;
                } else {
                  peg$currPos = s4;
                  s4 = peg$FAILED;
                }
              } else {
                peg$currPos = s4;
                s4 = peg$FAILED;
              }
            } else {
              peg$currPos = s4;
              s4 = peg$FAILED;
            }
          } else {
            peg$currPos = s4;
            s4 = peg$FAILED;
          }
          while (s4 !== peg$FAILED) {
            s3.push(s4);
            s4 = peg$currPos;
            s5 = peg$parsewhitespace();
            if (s5 !== peg$FAILED) {
              s6 = peg$parsecomma();
              if (s6 !== peg$FAILED) {
                s7 = peg$parsewhitespace();
                if (s7 !== peg$FAILED) {
                  s8 = peg$parseliteral_value();
                  if (s8 !== peg$FAILED) {
                    s5 = [s5, s6, s7, s8];
                    s4 = s5;
                  } else {
                    peg$currPos = s4;
                    s4 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s4;
                  s4 = peg$FAILED;
                }
              } else {
                peg$currPos = s4;
                s4 = peg$FAILED;
              }
            } else {
              peg$currPos = s4;
              s4 = peg$FAILED;
            }
          }
          if (s3 !== peg$FAILED) {
            s2 = [s2, s3];
            s1 = s2;
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c7(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parsedatalog_stmt() {
        var s0, s1, s2, s3, s4, s5, s6;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parsehead_predicate();
        if (s2 !== peg$FAILED) {
          s3 = peg$parsewhitespace();
          if (s3 !== peg$FAILED) {
            if (input.substr(peg$currPos, 2) === peg$c8) {
              s4 = peg$c8;
              peg$currPos += 2;
            } else {
              s4 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c9); }
            }
            if (s4 !== peg$FAILED) {
              s5 = peg$parsewhitespace();
              if (s5 !== peg$FAILED) {
                s6 = peg$parsetail();
                if (s6 !== peg$FAILED) {
                  s2 = [s2, s3, s4, s5, s6];
                  s1 = s2;
                } else {
                  peg$currPos = s1;
                  s1 = peg$FAILED;
                }
              } else {
                peg$currPos = s1;
                s1 = peg$FAILED;
              }
            } else {
              peg$currPos = s1;
              s1 = peg$FAILED;
            }
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c10(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parsepredicate() {
        var s0, s1, s2, s3, s4, s5;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parsename();
        if (s2 !== peg$FAILED) {
          if (input.charCodeAt(peg$currPos) === 40) {
            s3 = peg$c2;
            peg$currPos++;
          } else {
            s3 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c3); }
          }
          if (s3 !== peg$FAILED) {
            s4 = peg$parsepred_arg_list();
            if (s4 !== peg$FAILED) {
              if (input.charCodeAt(peg$currPos) === 41) {
                s5 = peg$c4;
                peg$currPos++;
              } else {
                s5 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c5); }
              }
              if (s5 !== peg$FAILED) {
                s2 = [s2, s3, s4, s5];
                s1 = s2;
              } else {
                peg$currPos = s1;
                s1 = peg$FAILED;
              }
            } else {
              peg$currPos = s1;
              s1 = peg$FAILED;
            }
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c11(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parsehead_predicate() {
        var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parsename();
        if (s2 !== peg$FAILED) {
          if (input.charCodeAt(peg$currPos) === 40) {
            s3 = peg$c2;
            peg$currPos++;
          } else {
            s3 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c3); }
          }
          if (s3 !== peg$FAILED) {
            s4 = peg$currPos;
            s5 = peg$parsecall_function();
            if (s5 === peg$FAILED) {
              s5 = peg$parsename();
            }
            if (s5 !== peg$FAILED) {
              s6 = [];
              s7 = peg$currPos;
              s8 = peg$parsewhitespace();
              if (s8 !== peg$FAILED) {
                s9 = peg$parsecomma();
                if (s9 !== peg$FAILED) {
                  s10 = peg$parsewhitespace();
                  if (s10 !== peg$FAILED) {
                    s11 = peg$parsecall_function();
                    if (s11 === peg$FAILED) {
                      s11 = peg$parsename();
                    }
                    if (s11 !== peg$FAILED) {
                      s8 = [s8, s9, s10, s11];
                      s7 = s8;
                    } else {
                      peg$currPos = s7;
                      s7 = peg$FAILED;
                    }
                  } else {
                    peg$currPos = s7;
                    s7 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s7;
                  s7 = peg$FAILED;
                }
              } else {
                peg$currPos = s7;
                s7 = peg$FAILED;
              }
              while (s7 !== peg$FAILED) {
                s6.push(s7);
                s7 = peg$currPos;
                s8 = peg$parsewhitespace();
                if (s8 !== peg$FAILED) {
                  s9 = peg$parsecomma();
                  if (s9 !== peg$FAILED) {
                    s10 = peg$parsewhitespace();
                    if (s10 !== peg$FAILED) {
                      s11 = peg$parsecall_function();
                      if (s11 === peg$FAILED) {
                        s11 = peg$parsename();
                      }
                      if (s11 !== peg$FAILED) {
                        s8 = [s8, s9, s10, s11];
                        s7 = s8;
                      } else {
                        peg$currPos = s7;
                        s7 = peg$FAILED;
                      }
                    } else {
                      peg$currPos = s7;
                      s7 = peg$FAILED;
                    }
                  } else {
                    peg$currPos = s7;
                    s7 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s7;
                  s7 = peg$FAILED;
                }
              }
              if (s6 !== peg$FAILED) {
                s5 = [s5, s6];
                s4 = s5;
              } else {
                peg$currPos = s4;
                s4 = peg$FAILED;
              }
            } else {
              peg$currPos = s4;
              s4 = peg$FAILED;
            }
            if (s4 === peg$FAILED) {
              s4 = null;
            }
            if (s4 !== peg$FAILED) {
              if (input.charCodeAt(peg$currPos) === 41) {
                s5 = peg$c4;
                peg$currPos++;
              } else {
                s5 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c5); }
              }
              if (s5 !== peg$FAILED) {
                s2 = [s2, s3, s4, s5];
                s1 = s2;
              } else {
                peg$currPos = s1;
                s1 = peg$FAILED;
              }
            } else {
              peg$currPos = s1;
              s1 = peg$FAILED;
            }
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c12(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parseagg_list() {
        var s0, s1, s2, s3, s4, s5, s6, s7, s8;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parsecall_function();
        if (s2 !== peg$FAILED) {
          s3 = [];
          s4 = peg$currPos;
          s5 = peg$parsewhitespace();
          if (s5 !== peg$FAILED) {
            s6 = peg$parsecomma();
            if (s6 !== peg$FAILED) {
              s7 = peg$parsewhitespace();
              if (s7 !== peg$FAILED) {
                s8 = peg$parsecall_function();
                if (s8 !== peg$FAILED) {
                  s5 = [s5, s6, s7, s8];
                  s4 = s5;
                } else {
                  peg$currPos = s4;
                  s4 = peg$FAILED;
                }
              } else {
                peg$currPos = s4;
                s4 = peg$FAILED;
              }
            } else {
              peg$currPos = s4;
              s4 = peg$FAILED;
            }
          } else {
            peg$currPos = s4;
            s4 = peg$FAILED;
          }
          while (s4 !== peg$FAILED) {
            s3.push(s4);
            s4 = peg$currPos;
            s5 = peg$parsewhitespace();
            if (s5 !== peg$FAILED) {
              s6 = peg$parsecomma();
              if (s6 !== peg$FAILED) {
                s7 = peg$parsewhitespace();
                if (s7 !== peg$FAILED) {
                  s8 = peg$parsecall_function();
                  if (s8 !== peg$FAILED) {
                    s5 = [s5, s6, s7, s8];
                    s4 = s5;
                  } else {
                    peg$currPos = s4;
                    s4 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s4;
                  s4 = peg$FAILED;
                }
              } else {
                peg$currPos = s4;
                s4 = peg$FAILED;
              }
            } else {
              peg$currPos = s4;
              s4 = peg$FAILED;
            }
          }
          if (s3 !== peg$FAILED) {
            s2 = [s2, s3];
            s1 = s2;
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c13(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parsepred_arg_list() {
        var s0, s1, s2, s3, s4, s5, s6, s7, s8;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parsename();
        if (s2 !== peg$FAILED) {
          s3 = [];
          s4 = peg$currPos;
          s5 = peg$parsewhitespace();
          if (s5 !== peg$FAILED) {
            s6 = peg$parsecomma();
            if (s6 !== peg$FAILED) {
              s7 = peg$parsewhitespace();
              if (s7 !== peg$FAILED) {
                s8 = peg$parsename();
                if (s8 !== peg$FAILED) {
                  s5 = [s5, s6, s7, s8];
                  s4 = s5;
                } else {
                  peg$currPos = s4;
                  s4 = peg$FAILED;
                }
              } else {
                peg$currPos = s4;
                s4 = peg$FAILED;
              }
            } else {
              peg$currPos = s4;
              s4 = peg$FAILED;
            }
          } else {
            peg$currPos = s4;
            s4 = peg$FAILED;
          }
          while (s4 !== peg$FAILED) {
            s3.push(s4);
            s4 = peg$currPos;
            s5 = peg$parsewhitespace();
            if (s5 !== peg$FAILED) {
              s6 = peg$parsecomma();
              if (s6 !== peg$FAILED) {
                s7 = peg$parsewhitespace();
                if (s7 !== peg$FAILED) {
                  s8 = peg$parsename();
                  if (s8 !== peg$FAILED) {
                    s5 = [s5, s6, s7, s8];
                    s4 = s5;
                  } else {
                    peg$currPos = s4;
                    s4 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s4;
                  s4 = peg$FAILED;
                }
              } else {
                peg$currPos = s4;
                s4 = peg$FAILED;
              }
            } else {
              peg$currPos = s4;
              s4 = peg$FAILED;
            }
          }
          if (s3 !== peg$FAILED) {
            s2 = [s2, s3];
            s1 = s2;
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 === peg$FAILED) {
          s1 = null;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c14(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parsetail() {
        var s0, s1, s2, s3, s4, s5, s6, s7, s8;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parsepredicate();
        if (s2 !== peg$FAILED) {
          s3 = [];
          s4 = peg$currPos;
          s5 = peg$parsewhitespace();
          if (s5 !== peg$FAILED) {
            s6 = peg$parsecomma();
            if (s6 !== peg$FAILED) {
              s7 = peg$parsewhitespace();
              if (s7 !== peg$FAILED) {
                s8 = peg$parsepredicate();
                if (s8 === peg$FAILED) {
                  s8 = peg$parseexpr();
                }
                if (s8 !== peg$FAILED) {
                  s5 = [s5, s6, s7, s8];
                  s4 = s5;
                } else {
                  peg$currPos = s4;
                  s4 = peg$FAILED;
                }
              } else {
                peg$currPos = s4;
                s4 = peg$FAILED;
              }
            } else {
              peg$currPos = s4;
              s4 = peg$FAILED;
            }
          } else {
            peg$currPos = s4;
            s4 = peg$FAILED;
          }
          while (s4 !== peg$FAILED) {
            s3.push(s4);
            s4 = peg$currPos;
            s5 = peg$parsewhitespace();
            if (s5 !== peg$FAILED) {
              s6 = peg$parsecomma();
              if (s6 !== peg$FAILED) {
                s7 = peg$parsewhitespace();
                if (s7 !== peg$FAILED) {
                  s8 = peg$parsepredicate();
                  if (s8 === peg$FAILED) {
                    s8 = peg$parseexpr();
                  }
                  if (s8 !== peg$FAILED) {
                    s5 = [s5, s6, s7, s8];
                    s4 = s5;
                  } else {
                    peg$currPos = s4;
                    s4 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s4;
                  s4 = peg$FAILED;
                }
              } else {
                peg$currPos = s4;
                s4 = peg$FAILED;
              }
            } else {
              peg$currPos = s4;
              s4 = peg$FAILED;
            }
          }
          if (s3 !== peg$FAILED) {
            s2 = [s2, s3];
            s1 = s2;
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c15(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parsevalue() {
        var s0, s1, s2, s3, s4, s5, s6, s7, s8;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parsewhitespace();
        if (s2 !== peg$FAILED) {
          s3 = peg$parsecall_function();
          if (s3 === peg$FAILED) {
            s3 = peg$currPos;
            s4 = peg$parseliteral_value();
            if (s4 !== peg$FAILED) {
              peg$savedPos = s3;
              s4 = peg$c16(s4);
            }
            s3 = s4;
            if (s3 === peg$FAILED) {
              s3 = peg$currPos;
              s4 = peg$currPos;
              s5 = peg$parsetable_name();
              if (s5 !== peg$FAILED) {
                s6 = peg$parsedot();
                if (s6 !== peg$FAILED) {
                  s7 = peg$parsename();
                  if (s7 !== peg$FAILED) {
                    s5 = [s5, s6, s7];
                    s4 = s5;
                  } else {
                    peg$currPos = s4;
                    s4 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s4;
                  s4 = peg$FAILED;
                }
              } else {
                peg$currPos = s4;
                s4 = peg$FAILED;
              }
              if (s4 !== peg$FAILED) {
                peg$savedPos = s3;
                s4 = peg$c17(s4);
              }
              s3 = s4;
              if (s3 === peg$FAILED) {
                s3 = peg$currPos;
                s4 = peg$parsename();
                if (s4 !== peg$FAILED) {
                  peg$savedPos = s3;
                  s4 = peg$c18(s4);
                }
                s3 = s4;
                if (s3 === peg$FAILED) {
                  s3 = peg$currPos;
                  s4 = peg$parseparam_expr();
                  if (s4 !== peg$FAILED) {
                    peg$savedPos = s3;
                    s4 = peg$c19(s4);
                  }
                  s3 = s4;
                  if (s3 === peg$FAILED) {
                    s3 = peg$currPos;
                    s4 = peg$parseparam_var();
                    if (s4 !== peg$FAILED) {
                      peg$savedPos = s3;
                      s4 = peg$c20(s4);
                    }
                    s3 = s4;
                    if (s3 === peg$FAILED) {
                      s3 = peg$currPos;
                      s4 = peg$currPos;
                      s5 = peg$parseunary_operator();
                      if (s5 !== peg$FAILED) {
                        s6 = peg$parseexpr();
                        if (s6 !== peg$FAILED) {
                          s5 = [s5, s6];
                          s4 = s5;
                        } else {
                          peg$currPos = s4;
                          s4 = peg$FAILED;
                        }
                      } else {
                        peg$currPos = s4;
                        s4 = peg$FAILED;
                      }
                      if (s4 !== peg$FAILED) {
                        peg$savedPos = s3;
                        s4 = peg$c21(s4);
                      }
                      s3 = s4;
                      if (s3 === peg$FAILED) {
                        s3 = peg$currPos;
                        s4 = peg$currPos;
                        s5 = peg$parselparen();
                        if (s5 !== peg$FAILED) {
                          s6 = peg$parseexpr();
                          if (s6 !== peg$FAILED) {
                            s7 = peg$parsewhitespace();
                            if (s7 !== peg$FAILED) {
                              s8 = peg$parserparen();
                              if (s8 !== peg$FAILED) {
                                s5 = [s5, s6, s7, s8];
                                s4 = s5;
                              } else {
                                peg$currPos = s4;
                                s4 = peg$FAILED;
                              }
                            } else {
                              peg$currPos = s4;
                              s4 = peg$FAILED;
                            }
                          } else {
                            peg$currPos = s4;
                            s4 = peg$FAILED;
                          }
                        } else {
                          peg$currPos = s4;
                          s4 = peg$FAILED;
                        }
                        if (s4 !== peg$FAILED) {
                          peg$savedPos = s3;
                          s4 = peg$c22(s4);
                        }
                        s3 = s4;
                      }
                    }
                  }
                }
              }
            }
          }
          if (s3 !== peg$FAILED) {
            s2 = [s2, s3];
            s1 = s2;
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c23(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parseexpr_and() {
        var s0, s1, s2, s3, s4, s5, s6, s7;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parseexpr();
        if (s2 !== peg$FAILED) {
          s3 = [];
          s4 = peg$currPos;
          s5 = peg$parsewhitespace1();
          if (s5 !== peg$FAILED) {
            if (input.substr(peg$currPos, 3) === peg$c24) {
              s6 = peg$c24;
              peg$currPos += 3;
            } else {
              s6 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c25); }
            }
            if (s6 !== peg$FAILED) {
              s7 = peg$parseexpr();
              if (s7 !== peg$FAILED) {
                s5 = [s5, s6, s7];
                s4 = s5;
              } else {
                peg$currPos = s4;
                s4 = peg$FAILED;
              }
            } else {
              peg$currPos = s4;
              s4 = peg$FAILED;
            }
          } else {
            peg$currPos = s4;
            s4 = peg$FAILED;
          }
          while (s4 !== peg$FAILED) {
            s3.push(s4);
            s4 = peg$currPos;
            s5 = peg$parsewhitespace1();
            if (s5 !== peg$FAILED) {
              if (input.substr(peg$currPos, 3) === peg$c24) {
                s6 = peg$c24;
                peg$currPos += 3;
              } else {
                s6 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c25); }
              }
              if (s6 !== peg$FAILED) {
                s7 = peg$parseexpr();
                if (s7 !== peg$FAILED) {
                  s5 = [s5, s6, s7];
                  s4 = s5;
                } else {
                  peg$currPos = s4;
                  s4 = peg$FAILED;
                }
              } else {
                peg$currPos = s4;
                s4 = peg$FAILED;
              }
            } else {
              peg$currPos = s4;
              s4 = peg$FAILED;
            }
          }
          if (s3 !== peg$FAILED) {
            s2 = [s2, s3];
            s1 = s2;
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c26(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parseexpr() {
        var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parsewhitespace();
        if (s2 !== peg$FAILED) {
          s3 = peg$currPos;
          s4 = peg$currPos;
          s5 = peg$parsevalue();
          if (s5 !== peg$FAILED) {
            s6 = peg$parsebinary_op_wout_and();
            if (s6 !== peg$FAILED) {
              s7 = peg$parseexpr();
              if (s7 !== peg$FAILED) {
                s5 = [s5, s6, s7];
                s4 = s5;
              } else {
                peg$currPos = s4;
                s4 = peg$FAILED;
              }
            } else {
              peg$currPos = s4;
              s4 = peg$FAILED;
            }
          } else {
            peg$currPos = s4;
            s4 = peg$FAILED;
          }
          if (s4 !== peg$FAILED) {
            peg$savedPos = s3;
            s4 = peg$c27(s4);
          }
          s3 = s4;
          if (s3 === peg$FAILED) {
            s3 = peg$currPos;
            s4 = peg$currPos;
            s5 = peg$parsee_value();
            if (s5 !== peg$FAILED) {
              s6 = peg$parseISNULL();
              if (s6 === peg$FAILED) {
                s6 = peg$parseNOTNULL();
                if (s6 === peg$FAILED) {
                  s6 = peg$currPos;
                  s7 = peg$parseNOT();
                  if (s7 !== peg$FAILED) {
                    s8 = peg$parsewhitespace1();
                    if (s8 !== peg$FAILED) {
                      s9 = peg$parseNULL();
                      if (s9 !== peg$FAILED) {
                        s7 = [s7, s8, s9];
                        s6 = s7;
                      } else {
                        peg$currPos = s6;
                        s6 = peg$FAILED;
                      }
                    } else {
                      peg$currPos = s6;
                      s6 = peg$FAILED;
                    }
                  } else {
                    peg$currPos = s6;
                    s6 = peg$FAILED;
                  }
                }
              }
              if (s6 !== peg$FAILED) {
                s5 = [s5, s6];
                s4 = s5;
              } else {
                peg$currPos = s4;
                s4 = peg$FAILED;
              }
            } else {
              peg$currPos = s4;
              s4 = peg$FAILED;
            }
            if (s4 !== peg$FAILED) {
              peg$savedPos = s3;
              s4 = peg$c28(s4);
            }
            s3 = s4;
            if (s3 === peg$FAILED) {
              s3 = peg$currPos;
              s4 = peg$currPos;
              s5 = peg$parsee_value();
              if (s5 !== peg$FAILED) {
                s6 = peg$parseIS();
                if (s6 !== peg$FAILED) {
                  s7 = peg$parseNOT();
                  if (s7 === peg$FAILED) {
                    s7 = null;
                  }
                  if (s7 !== peg$FAILED) {
                    s8 = peg$parsee_expr();
                    if (s8 !== peg$FAILED) {
                      s5 = [s5, s6, s7, s8];
                      s4 = s5;
                    } else {
                      peg$currPos = s4;
                      s4 = peg$FAILED;
                    }
                  } else {
                    peg$currPos = s4;
                    s4 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s4;
                  s4 = peg$FAILED;
                }
              } else {
                peg$currPos = s4;
                s4 = peg$FAILED;
              }
              if (s4 !== peg$FAILED) {
                peg$savedPos = s3;
                s4 = peg$c29(s4);
              }
              s3 = s4;
              if (s3 === peg$FAILED) {
                s3 = peg$currPos;
                s4 = peg$currPos;
                s5 = peg$parsee_value();
                if (s5 !== peg$FAILED) {
                  s6 = peg$parseNOT();
                  if (s6 === peg$FAILED) {
                    s6 = null;
                  }
                  if (s6 !== peg$FAILED) {
                    s7 = peg$parseBETWEEN();
                    if (s7 !== peg$FAILED) {
                      s8 = peg$parsee_expr();
                      if (s8 !== peg$FAILED) {
                        s9 = peg$parseAND();
                        if (s9 !== peg$FAILED) {
                          s10 = peg$parsee_expr();
                          if (s10 !== peg$FAILED) {
                            s5 = [s5, s6, s7, s8, s9, s10];
                            s4 = s5;
                          } else {
                            peg$currPos = s4;
                            s4 = peg$FAILED;
                          }
                        } else {
                          peg$currPos = s4;
                          s4 = peg$FAILED;
                        }
                      } else {
                        peg$currPos = s4;
                        s4 = peg$FAILED;
                      }
                    } else {
                      peg$currPos = s4;
                      s4 = peg$FAILED;
                    }
                  } else {
                    peg$currPos = s4;
                    s4 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s4;
                  s4 = peg$FAILED;
                }
                if (s4 !== peg$FAILED) {
                  peg$savedPos = s3;
                  s4 = peg$c30(s4);
                }
                s3 = s4;
                if (s3 === peg$FAILED) {
                  s3 = peg$parsevalue();
                }
              }
            }
          }
          if (s3 !== peg$FAILED) {
            s2 = [s2, s3];
            s1 = s2;
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c31(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parseparam_var() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        if (input.charCodeAt(peg$currPos) === 36) {
          s2 = peg$c32;
          peg$currPos++;
        } else {
          s2 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c33); }
        }
        if (s2 !== peg$FAILED) {
          s3 = peg$parsename();
          if (s3 !== peg$FAILED) {
            s2 = [s2, s3];
            s1 = s2;
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c34(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parseparam_expr() {
        var s0, s1, s2, s3, s4, s5, s6, s7, s8;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        if (input.charCodeAt(peg$currPos) === 58) {
          s2 = peg$c35;
          peg$currPos++;
        } else {
          s2 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c36); }
        }
        if (s2 !== peg$FAILED) {
          s3 = peg$parseexpr_and();
          if (s3 !== peg$FAILED) {
            s4 = peg$currPos;
            s5 = peg$parsewhitespace();
            if (s5 !== peg$FAILED) {
              if (input.charCodeAt(peg$currPos) === 124) {
                s6 = peg$c37;
                peg$currPos++;
              } else {
                s6 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c38); }
              }
              if (s6 !== peg$FAILED) {
                s7 = peg$parsewhitespace();
                if (s7 !== peg$FAILED) {
                  s8 = peg$parseexpr_and();
                  if (s8 !== peg$FAILED) {
                    s5 = [s5, s6, s7, s8];
                    s4 = s5;
                  } else {
                    peg$currPos = s4;
                    s4 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s4;
                  s4 = peg$FAILED;
                }
              } else {
                peg$currPos = s4;
                s4 = peg$FAILED;
              }
            } else {
              peg$currPos = s4;
              s4 = peg$FAILED;
            }
            if (s4 === peg$FAILED) {
              s4 = null;
            }
            if (s4 !== peg$FAILED) {
              if (input.charCodeAt(peg$currPos) === 58) {
                s5 = peg$c35;
                peg$currPos++;
              } else {
                s5 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c36); }
              }
              if (s5 !== peg$FAILED) {
                s2 = [s2, s3, s4, s5];
                s1 = s2;
              } else {
                peg$currPos = s1;
                s1 = peg$FAILED;
              }
            } else {
              peg$currPos = s1;
              s1 = peg$FAILED;
            }
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c39(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parsee_where() {
        var s0, s1, s2, s3, s4, s5, s6, s7, s8;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parsewhitespace();
        if (s2 !== peg$FAILED) {
          s3 = peg$parsee_expr();
          if (s3 !== peg$FAILED) {
            s4 = [];
            s5 = peg$currPos;
            s6 = peg$parsewhitespace();
            if (s6 !== peg$FAILED) {
              if (input.substr(peg$currPos, 3) === peg$c24) {
                s7 = peg$c24;
                peg$currPos += 3;
              } else {
                s7 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c25); }
              }
              if (s7 !== peg$FAILED) {
                s8 = peg$parsee_expr();
                if (s8 !== peg$FAILED) {
                  s6 = [s6, s7, s8];
                  s5 = s6;
                } else {
                  peg$currPos = s5;
                  s5 = peg$FAILED;
                }
              } else {
                peg$currPos = s5;
                s5 = peg$FAILED;
              }
            } else {
              peg$currPos = s5;
              s5 = peg$FAILED;
            }
            while (s5 !== peg$FAILED) {
              s4.push(s5);
              s5 = peg$currPos;
              s6 = peg$parsewhitespace();
              if (s6 !== peg$FAILED) {
                if (input.substr(peg$currPos, 3) === peg$c24) {
                  s7 = peg$c24;
                  peg$currPos += 3;
                } else {
                  s7 = peg$FAILED;
                  if (peg$silentFails === 0) { peg$fail(peg$c25); }
                }
                if (s7 !== peg$FAILED) {
                  s8 = peg$parsee_expr();
                  if (s8 !== peg$FAILED) {
                    s6 = [s6, s7, s8];
                    s5 = s6;
                  } else {
                    peg$currPos = s5;
                    s5 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s5;
                  s5 = peg$FAILED;
                }
              } else {
                peg$currPos = s5;
                s5 = peg$FAILED;
              }
            }
            if (s4 !== peg$FAILED) {
              s2 = [s2, s3, s4];
              s1 = s2;
            } else {
              peg$currPos = s1;
              s1 = peg$FAILED;
            }
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c40(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parsee_value() {
        var s0, s1, s2, s3, s4, s5, s6, s7, s8;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parsewhitespace();
        if (s2 !== peg$FAILED) {
          s3 = peg$parsee_call_function();
          if (s3 === peg$FAILED) {
            s3 = peg$currPos;
            s4 = peg$parseliteral_value();
            if (s4 !== peg$FAILED) {
              peg$savedPos = s3;
              s4 = peg$c41(s4);
            }
            s3 = s4;
            if (s3 === peg$FAILED) {
              s3 = peg$currPos;
              s4 = peg$currPos;
              s5 = peg$parsetable_name();
              if (s5 !== peg$FAILED) {
                s6 = peg$parsedot();
                if (s6 !== peg$FAILED) {
                  s7 = peg$parsename();
                  if (s7 !== peg$FAILED) {
                    s5 = [s5, s6, s7];
                    s4 = s5;
                  } else {
                    peg$currPos = s4;
                    s4 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s4;
                  s4 = peg$FAILED;
                }
              } else {
                peg$currPos = s4;
                s4 = peg$FAILED;
              }
              if (s4 !== peg$FAILED) {
                peg$savedPos = s3;
                s4 = peg$c17(s4);
              }
              s3 = s4;
              if (s3 === peg$FAILED) {
                s3 = peg$currPos;
                s4 = peg$parsename();
                if (s4 !== peg$FAILED) {
                  peg$savedPos = s3;
                  s4 = peg$c42(s4);
                }
                s3 = s4;
                if (s3 === peg$FAILED) {
                  s3 = peg$currPos;
                  s4 = peg$parseparam_expr();
                  if (s4 !== peg$FAILED) {
                    peg$savedPos = s3;
                    s4 = peg$c19(s4);
                  }
                  s3 = s4;
                  if (s3 === peg$FAILED) {
                    s3 = peg$currPos;
                    s4 = peg$parseparam_var();
                    if (s4 !== peg$FAILED) {
                      peg$savedPos = s3;
                      s4 = peg$c43(s4);
                    }
                    s3 = s4;
                    if (s3 === peg$FAILED) {
                      s3 = peg$currPos;
                      s4 = peg$currPos;
                      s5 = peg$parselparen();
                      if (s5 !== peg$FAILED) {
                        s6 = peg$parsee_where();
                        if (s6 !== peg$FAILED) {
                          s7 = peg$parsewhitespace();
                          if (s7 !== peg$FAILED) {
                            s8 = peg$parserparen();
                            if (s8 !== peg$FAILED) {
                              s5 = [s5, s6, s7, s8];
                              s4 = s5;
                            } else {
                              peg$currPos = s4;
                              s4 = peg$FAILED;
                            }
                          } else {
                            peg$currPos = s4;
                            s4 = peg$FAILED;
                          }
                        } else {
                          peg$currPos = s4;
                          s4 = peg$FAILED;
                        }
                      } else {
                        peg$currPos = s4;
                        s4 = peg$FAILED;
                      }
                      if (s4 !== peg$FAILED) {
                        peg$savedPos = s3;
                        s4 = peg$c44(s4);
                      }
                      s3 = s4;
                    }
                  }
                }
              }
            }
          }
          if (s3 !== peg$FAILED) {
            s2 = [s2, s3];
            s1 = s2;
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c23(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parsee_expr() {
        var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parsewhitespace();
        if (s2 !== peg$FAILED) {
          s3 = peg$currPos;
          s4 = peg$currPos;
          s5 = peg$parsee_value();
          if (s5 !== peg$FAILED) {
            s6 = peg$parsebinary_op_wout_and();
            if (s6 !== peg$FAILED) {
              s7 = peg$parsee_expr();
              if (s7 !== peg$FAILED) {
                s5 = [s5, s6, s7];
                s4 = s5;
              } else {
                peg$currPos = s4;
                s4 = peg$FAILED;
              }
            } else {
              peg$currPos = s4;
              s4 = peg$FAILED;
            }
          } else {
            peg$currPos = s4;
            s4 = peg$FAILED;
          }
          if (s4 !== peg$FAILED) {
            peg$savedPos = s3;
            s4 = peg$c27(s4);
          }
          s3 = s4;
          if (s3 === peg$FAILED) {
            s3 = peg$currPos;
            s4 = peg$currPos;
            s5 = peg$parsee_value();
            if (s5 !== peg$FAILED) {
              s6 = peg$parseISNULL();
              if (s6 === peg$FAILED) {
                s6 = peg$parseNOTNULL();
                if (s6 === peg$FAILED) {
                  s6 = peg$currPos;
                  s7 = peg$parseNOT();
                  if (s7 !== peg$FAILED) {
                    s8 = peg$parsewhitespace1();
                    if (s8 !== peg$FAILED) {
                      s9 = peg$parseNULL();
                      if (s9 !== peg$FAILED) {
                        s7 = [s7, s8, s9];
                        s6 = s7;
                      } else {
                        peg$currPos = s6;
                        s6 = peg$FAILED;
                      }
                    } else {
                      peg$currPos = s6;
                      s6 = peg$FAILED;
                    }
                  } else {
                    peg$currPos = s6;
                    s6 = peg$FAILED;
                  }
                }
              }
              if (s6 !== peg$FAILED) {
                s5 = [s5, s6];
                s4 = s5;
              } else {
                peg$currPos = s4;
                s4 = peg$FAILED;
              }
            } else {
              peg$currPos = s4;
              s4 = peg$FAILED;
            }
            if (s4 !== peg$FAILED) {
              peg$savedPos = s3;
              s4 = peg$c28(s4);
            }
            s3 = s4;
            if (s3 === peg$FAILED) {
              s3 = peg$currPos;
              s4 = peg$currPos;
              s5 = peg$parsee_value();
              if (s5 !== peg$FAILED) {
                s6 = peg$parseIS();
                if (s6 !== peg$FAILED) {
                  s7 = peg$parseNOT();
                  if (s7 === peg$FAILED) {
                    s7 = null;
                  }
                  if (s7 !== peg$FAILED) {
                    s8 = peg$parsee_expr();
                    if (s8 !== peg$FAILED) {
                      s5 = [s5, s6, s7, s8];
                      s4 = s5;
                    } else {
                      peg$currPos = s4;
                      s4 = peg$FAILED;
                    }
                  } else {
                    peg$currPos = s4;
                    s4 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s4;
                  s4 = peg$FAILED;
                }
              } else {
                peg$currPos = s4;
                s4 = peg$FAILED;
              }
              if (s4 !== peg$FAILED) {
                peg$savedPos = s3;
                s4 = peg$c29(s4);
              }
              s3 = s4;
              if (s3 === peg$FAILED) {
                s3 = peg$currPos;
                s4 = peg$currPos;
                if (input.substr(peg$currPos, 6) === peg$c45) {
                  s5 = peg$c45;
                  peg$currPos += 6;
                } else {
                  s5 = peg$FAILED;
                  if (peg$silentFails === 0) { peg$fail(peg$c46); }
                }
                if (s5 !== peg$FAILED) {
                  s6 = peg$parsewhitespace1();
                  if (s6 !== peg$FAILED) {
                    s7 = peg$parsename();
                    if (s7 !== peg$FAILED) {
                      s8 = peg$parseIN();
                      if (s8 !== peg$FAILED) {
                        s9 = peg$parsewhitespace1();
                        if (s9 !== peg$FAILED) {
                          s10 = peg$parsee_table_ref();
                          if (s10 !== peg$FAILED) {
                            s11 = peg$parsewhitespace1();
                            if (s11 !== peg$FAILED) {
                              s12 = peg$parsee_where();
                              if (s12 !== peg$FAILED) {
                                s5 = [s5, s6, s7, s8, s9, s10, s11, s12];
                                s4 = s5;
                              } else {
                                peg$currPos = s4;
                                s4 = peg$FAILED;
                              }
                            } else {
                              peg$currPos = s4;
                              s4 = peg$FAILED;
                            }
                          } else {
                            peg$currPos = s4;
                            s4 = peg$FAILED;
                          }
                        } else {
                          peg$currPos = s4;
                          s4 = peg$FAILED;
                        }
                      } else {
                        peg$currPos = s4;
                        s4 = peg$FAILED;
                      }
                    } else {
                      peg$currPos = s4;
                      s4 = peg$FAILED;
                    }
                  } else {
                    peg$currPos = s4;
                    s4 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s4;
                  s4 = peg$FAILED;
                }
                if (s4 !== peg$FAILED) {
                  peg$savedPos = s3;
                  s4 = peg$c47(s4);
                }
                s3 = s4;
                if (s3 === peg$FAILED) {
                  s3 = peg$currPos;
                  s4 = peg$currPos;
                  if (input.substr(peg$currPos, 6) === peg$c48) {
                    s5 = peg$c48;
                    peg$currPos += 6;
                  } else {
                    s5 = peg$FAILED;
                    if (peg$silentFails === 0) { peg$fail(peg$c49); }
                  }
                  if (s5 !== peg$FAILED) {
                    s6 = peg$parsewhitespace1();
                    if (s6 !== peg$FAILED) {
                      s7 = peg$parsename();
                      if (s7 !== peg$FAILED) {
                        s8 = peg$parseIN();
                        if (s8 !== peg$FAILED) {
                          s9 = peg$parsewhitespace1();
                          if (s9 !== peg$FAILED) {
                            s10 = peg$parsee_table_ref();
                            if (s10 !== peg$FAILED) {
                              s11 = peg$parsewhitespace1();
                              if (s11 !== peg$FAILED) {
                                s12 = peg$parsee_where();
                                if (s12 !== peg$FAILED) {
                                  s5 = [s5, s6, s7, s8, s9, s10, s11, s12];
                                  s4 = s5;
                                } else {
                                  peg$currPos = s4;
                                  s4 = peg$FAILED;
                                }
                              } else {
                                peg$currPos = s4;
                                s4 = peg$FAILED;
                              }
                            } else {
                              peg$currPos = s4;
                              s4 = peg$FAILED;
                            }
                          } else {
                            peg$currPos = s4;
                            s4 = peg$FAILED;
                          }
                        } else {
                          peg$currPos = s4;
                          s4 = peg$FAILED;
                        }
                      } else {
                        peg$currPos = s4;
                        s4 = peg$FAILED;
                      }
                    } else {
                      peg$currPos = s4;
                      s4 = peg$FAILED;
                    }
                  } else {
                    peg$currPos = s4;
                    s4 = peg$FAILED;
                  }
                  if (s4 !== peg$FAILED) {
                    peg$savedPos = s3;
                    s4 = peg$c50(s4);
                  }
                  s3 = s4;
                  if (s3 === peg$FAILED) {
                    s3 = peg$currPos;
                    s4 = peg$currPos;
                    s5 = peg$parsee_value();
                    if (s5 !== peg$FAILED) {
                      s6 = peg$parseNOT();
                      if (s6 === peg$FAILED) {
                        s6 = null;
                      }
                      if (s6 !== peg$FAILED) {
                        s7 = peg$parseBETWEEN();
                        if (s7 !== peg$FAILED) {
                          s8 = peg$parsee_expr();
                          if (s8 !== peg$FAILED) {
                            s9 = peg$parseAND();
                            if (s9 !== peg$FAILED) {
                              s10 = peg$parsee_expr();
                              if (s10 !== peg$FAILED) {
                                s5 = [s5, s6, s7, s8, s9, s10];
                                s4 = s5;
                              } else {
                                peg$currPos = s4;
                                s4 = peg$FAILED;
                              }
                            } else {
                              peg$currPos = s4;
                              s4 = peg$FAILED;
                            }
                          } else {
                            peg$currPos = s4;
                            s4 = peg$FAILED;
                          }
                        } else {
                          peg$currPos = s4;
                          s4 = peg$FAILED;
                        }
                      } else {
                        peg$currPos = s4;
                        s4 = peg$FAILED;
                      }
                    } else {
                      peg$currPos = s4;
                      s4 = peg$FAILED;
                    }
                    if (s4 !== peg$FAILED) {
                      peg$savedPos = s3;
                      s4 = peg$c30(s4);
                    }
                    s3 = s4;
                    if (s3 === peg$FAILED) {
                      s3 = peg$currPos;
                      s4 = peg$parsee_value();
                      if (s4 !== peg$FAILED) {
                        peg$savedPos = s3;
                        s4 = peg$c1(s4);
                      }
                      s3 = s4;
                    }
                  }
                }
              }
            }
          }
          if (s3 !== peg$FAILED) {
            s2 = [s2, s3];
            s1 = s2;
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c31(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parsee_call_function() {
        var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parsename();
        if (s2 !== peg$FAILED) {
          s3 = peg$parsewhitespace();
          if (s3 !== peg$FAILED) {
            s4 = peg$parselparen();
            if (s4 !== peg$FAILED) {
              s5 = peg$currPos;
              s6 = peg$currPos;
              s7 = peg$parseDISTINCT();
              if (s7 === peg$FAILED) {
                s7 = null;
              }
              if (s7 !== peg$FAILED) {
                s8 = peg$currPos;
                s9 = peg$parsee_expr();
                if (s9 !== peg$FAILED) {
                  s10 = [];
                  s11 = peg$currPos;
                  s12 = peg$parsewhitespace();
                  if (s12 !== peg$FAILED) {
                    s13 = peg$parsecomma();
                    if (s13 !== peg$FAILED) {
                      s14 = peg$parsee_expr();
                      if (s14 !== peg$FAILED) {
                        s12 = [s12, s13, s14];
                        s11 = s12;
                      } else {
                        peg$currPos = s11;
                        s11 = peg$FAILED;
                      }
                    } else {
                      peg$currPos = s11;
                      s11 = peg$FAILED;
                    }
                  } else {
                    peg$currPos = s11;
                    s11 = peg$FAILED;
                  }
                  while (s11 !== peg$FAILED) {
                    s10.push(s11);
                    s11 = peg$currPos;
                    s12 = peg$parsewhitespace();
                    if (s12 !== peg$FAILED) {
                      s13 = peg$parsecomma();
                      if (s13 !== peg$FAILED) {
                        s14 = peg$parsee_expr();
                        if (s14 !== peg$FAILED) {
                          s12 = [s12, s13, s14];
                          s11 = s12;
                        } else {
                          peg$currPos = s11;
                          s11 = peg$FAILED;
                        }
                      } else {
                        peg$currPos = s11;
                        s11 = peg$FAILED;
                      }
                    } else {
                      peg$currPos = s11;
                      s11 = peg$FAILED;
                    }
                  }
                  if (s10 !== peg$FAILED) {
                    s9 = [s9, s10];
                    s8 = s9;
                  } else {
                    peg$currPos = s8;
                    s8 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s8;
                  s8 = peg$FAILED;
                }
                if (s8 !== peg$FAILED) {
                  s7 = [s7, s8];
                  s6 = s7;
                } else {
                  peg$currPos = s6;
                  s6 = peg$FAILED;
                }
              } else {
                peg$currPos = s6;
                s6 = peg$FAILED;
              }
              if (s6 !== peg$FAILED) {
                peg$savedPos = s5;
                s6 = peg$c51(s6);
              }
              s5 = s6;
              if (s5 === peg$FAILED) {
                s5 = peg$currPos;
                s6 = peg$parsewhitespace();
                if (s6 !== peg$FAILED) {
                  s7 = peg$parsestar();
                  if (s7 !== peg$FAILED) {
                    peg$savedPos = s5;
                    s6 = peg$c52();
                    s5 = s6;
                  } else {
                    peg$currPos = s5;
                    s5 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s5;
                  s5 = peg$FAILED;
                }
              }
              if (s5 === peg$FAILED) {
                s5 = null;
              }
              if (s5 !== peg$FAILED) {
                s6 = peg$parsewhitespace();
                if (s6 !== peg$FAILED) {
                  s7 = peg$parserparen();
                  if (s7 !== peg$FAILED) {
                    s2 = [s2, s3, s4, s5, s6, s7];
                    s1 = s2;
                  } else {
                    peg$currPos = s1;
                    s1 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s1;
                  s1 = peg$FAILED;
                }
              } else {
                peg$currPos = s1;
                s1 = peg$FAILED;
              }
            } else {
              peg$currPos = s1;
              s1 = peg$FAILED;
            }
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c53(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parsee_column_ref() {
        var s0, s1, s2, s3, s4;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parsetable_name();
        if (s2 !== peg$FAILED) {
          s3 = peg$parsedot();
          if (s3 !== peg$FAILED) {
            s4 = peg$parsename();
            if (s4 !== peg$FAILED) {
              s2 = [s2, s3, s4];
              s1 = s2;
            } else {
              peg$currPos = s1;
              s1 = peg$FAILED;
            }
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c54(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parsee_table_ref() {
        var s0, s1;
  
        s0 = peg$currPos;
        s1 = peg$parsetable_name();
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c55(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parsetype_name() {
        var s0, s1, s2, s3, s4, s5, s6, s7;
  
        s0 = peg$currPos;
        s1 = [];
        s2 = peg$parsename();
        if (s2 !== peg$FAILED) {
          while (s2 !== peg$FAILED) {
            s1.push(s2);
            s2 = peg$parsename();
          }
        } else {
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$currPos;
          s3 = peg$parselparen();
          if (s3 !== peg$FAILED) {
            s4 = peg$parsesigned_number();
            if (s4 !== peg$FAILED) {
              s5 = peg$parserparen();
              if (s5 !== peg$FAILED) {
                s3 = [s3, s4, s5];
                s2 = s3;
              } else {
                peg$currPos = s2;
                s2 = peg$FAILED;
              }
            } else {
              peg$currPos = s2;
              s2 = peg$FAILED;
            }
          } else {
            peg$currPos = s2;
            s2 = peg$FAILED;
          }
          if (s2 === peg$FAILED) {
            s2 = peg$currPos;
            s3 = peg$parselparen();
            if (s3 !== peg$FAILED) {
              s4 = peg$parsesigned_number();
              if (s4 !== peg$FAILED) {
                s5 = peg$parsecomma();
                if (s5 !== peg$FAILED) {
                  s6 = peg$parsesigned_number();
                  if (s6 !== peg$FAILED) {
                    s7 = peg$parserparen();
                    if (s7 !== peg$FAILED) {
                      s3 = [s3, s4, s5, s6, s7];
                      s2 = s3;
                    } else {
                      peg$currPos = s2;
                      s2 = peg$FAILED;
                    }
                  } else {
                    peg$currPos = s2;
                    s2 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s2;
                  s2 = peg$FAILED;
                }
              } else {
                peg$currPos = s2;
                s2 = peg$FAILED;
              }
            } else {
              peg$currPos = s2;
              s2 = peg$FAILED;
            }
          }
          if (s2 === peg$FAILED) {
            s2 = null;
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsesigned_number() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parseplus();
        if (s1 === peg$FAILED) {
          s1 = peg$parseminus();
        }
        if (s1 === peg$FAILED) {
          s1 = null;
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$parsenumeric_literal();
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseliteral_value() {
        var s0;
  
        s0 = peg$parsenumeric_literal();
        if (s0 === peg$FAILED) {
          s0 = peg$parsestring_literal();
          if (s0 === peg$FAILED) {
            s0 = peg$parsestring_literal();
            if (s0 === peg$FAILED) {
              s0 = peg$parseNULL();
              if (s0 === peg$FAILED) {
                s0 = peg$parseCURRENT_TIME();
                if (s0 === peg$FAILED) {
                  s0 = peg$parseCURRENT_DATE();
                  if (s0 === peg$FAILED) {
                    s0 = peg$parseCURRENT_TIMESTAMP();
                  }
                }
              }
            }
          }
        }
  
        return s0;
      }
  
      function peg$parsenumeric_literal() {
        var s0, s1, s2, s3, s4, s5, s6, s7, s8;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parseplus();
        if (s2 === peg$FAILED) {
          s2 = peg$parseminus();
        }
        if (s2 === peg$FAILED) {
          s2 = null;
        }
        if (s2 !== peg$FAILED) {
          s3 = peg$currPos;
          s4 = [];
          s5 = peg$parsedigit();
          if (s5 !== peg$FAILED) {
            while (s5 !== peg$FAILED) {
              s4.push(s5);
              s5 = peg$parsedigit();
            }
          } else {
            s4 = peg$FAILED;
          }
          if (s4 !== peg$FAILED) {
            s5 = peg$currPos;
            s6 = peg$parsedot();
            if (s6 !== peg$FAILED) {
              s7 = [];
              s8 = peg$parsedigit();
              if (s8 !== peg$FAILED) {
                while (s8 !== peg$FAILED) {
                  s7.push(s8);
                  s8 = peg$parsedigit();
                }
              } else {
                s7 = peg$FAILED;
              }
              if (s7 !== peg$FAILED) {
                s6 = [s6, s7];
                s5 = s6;
              } else {
                peg$currPos = s5;
                s5 = peg$FAILED;
              }
            } else {
              peg$currPos = s5;
              s5 = peg$FAILED;
            }
            if (s5 === peg$FAILED) {
              s5 = null;
            }
            if (s5 !== peg$FAILED) {
              s4 = [s4, s5];
              s3 = s4;
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          } else {
            peg$currPos = s3;
            s3 = peg$FAILED;
          }
          if (s3 === peg$FAILED) {
            s3 = peg$currPos;
            s4 = peg$parsedot();
            if (s4 !== peg$FAILED) {
              s5 = [];
              s6 = peg$parsedigit();
              if (s6 !== peg$FAILED) {
                while (s6 !== peg$FAILED) {
                  s5.push(s6);
                  s6 = peg$parsedigit();
                }
              } else {
                s5 = peg$FAILED;
              }
              if (s5 !== peg$FAILED) {
                s4 = [s4, s5];
                s3 = s4;
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          }
          if (s3 !== peg$FAILED) {
            s4 = peg$currPos;
            s5 = peg$parseE();
            if (s5 !== peg$FAILED) {
              s6 = peg$parseplus();
              if (s6 === peg$FAILED) {
                s6 = peg$parseminus();
              }
              if (s6 === peg$FAILED) {
                s6 = null;
              }
              if (s6 !== peg$FAILED) {
                s7 = [];
                s8 = peg$parsedigit();
                if (s8 !== peg$FAILED) {
                  while (s8 !== peg$FAILED) {
                    s7.push(s8);
                    s8 = peg$parsedigit();
                  }
                } else {
                  s7 = peg$FAILED;
                }
                if (s7 !== peg$FAILED) {
                  s5 = [s5, s6, s7];
                  s4 = s5;
                } else {
                  peg$currPos = s4;
                  s4 = peg$FAILED;
                }
              } else {
                peg$currPos = s4;
                s4 = peg$FAILED;
              }
            } else {
              peg$currPos = s4;
              s4 = peg$FAILED;
            }
            if (s4 === peg$FAILED) {
              s4 = null;
            }
            if (s4 !== peg$FAILED) {
              s2 = [s2, s3, s4];
              s1 = s2;
            } else {
              peg$currPos = s1;
              s1 = peg$FAILED;
            }
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c56(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parsecall_function() {
        var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parsename();
        if (s2 !== peg$FAILED) {
          s3 = peg$parsewhitespace();
          if (s3 !== peg$FAILED) {
            s4 = peg$parselparen();
            if (s4 !== peg$FAILED) {
              s5 = peg$currPos;
              s6 = peg$parsewhitespace();
              if (s6 !== peg$FAILED) {
                s7 = peg$currPos;
                s8 = peg$parsetable_name();
                if (s8 !== peg$FAILED) {
                  s9 = peg$parsedot();
                  if (s9 !== peg$FAILED) {
                    s8 = [s8, s9];
                    s7 = s8;
                  } else {
                    peg$currPos = s7;
                    s7 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s7;
                  s7 = peg$FAILED;
                }
                if (s7 === peg$FAILED) {
                  s7 = null;
                }
                if (s7 !== peg$FAILED) {
                  s8 = peg$parsestar();
                  if (s8 !== peg$FAILED) {
                    peg$savedPos = s5;
                    s6 = peg$c57(s7);
                    s5 = s6;
                  } else {
                    peg$currPos = s5;
                    s5 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s5;
                  s5 = peg$FAILED;
                }
              } else {
                peg$currPos = s5;
                s5 = peg$FAILED;
              }
              if (s5 === peg$FAILED) {
                s5 = peg$currPos;
                s6 = peg$currPos;
                s7 = peg$parseDISTINCT();
                if (s7 === peg$FAILED) {
                  s7 = null;
                }
                if (s7 !== peg$FAILED) {
                  s8 = peg$currPos;
                  s9 = peg$parseexpr();
                  if (s9 !== peg$FAILED) {
                    s10 = [];
                    s11 = peg$currPos;
                    s12 = peg$parsewhitespace();
                    if (s12 !== peg$FAILED) {
                      s13 = peg$parsecomma();
                      if (s13 !== peg$FAILED) {
                        s14 = peg$parseexpr();
                        if (s14 !== peg$FAILED) {
                          s12 = [s12, s13, s14];
                          s11 = s12;
                        } else {
                          peg$currPos = s11;
                          s11 = peg$FAILED;
                        }
                      } else {
                        peg$currPos = s11;
                        s11 = peg$FAILED;
                      }
                    } else {
                      peg$currPos = s11;
                      s11 = peg$FAILED;
                    }
                    while (s11 !== peg$FAILED) {
                      s10.push(s11);
                      s11 = peg$currPos;
                      s12 = peg$parsewhitespace();
                      if (s12 !== peg$FAILED) {
                        s13 = peg$parsecomma();
                        if (s13 !== peg$FAILED) {
                          s14 = peg$parseexpr();
                          if (s14 !== peg$FAILED) {
                            s12 = [s12, s13, s14];
                            s11 = s12;
                          } else {
                            peg$currPos = s11;
                            s11 = peg$FAILED;
                          }
                        } else {
                          peg$currPos = s11;
                          s11 = peg$FAILED;
                        }
                      } else {
                        peg$currPos = s11;
                        s11 = peg$FAILED;
                      }
                    }
                    if (s10 !== peg$FAILED) {
                      s9 = [s9, s10];
                      s8 = s9;
                    } else {
                      peg$currPos = s8;
                      s8 = peg$FAILED;
                    }
                  } else {
                    peg$currPos = s8;
                    s8 = peg$FAILED;
                  }
                  if (s8 !== peg$FAILED) {
                    s7 = [s7, s8];
                    s6 = s7;
                  } else {
                    peg$currPos = s6;
                    s6 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s6;
                  s6 = peg$FAILED;
                }
                if (s6 !== peg$FAILED) {
                  peg$savedPos = s5;
                  s6 = peg$c58(s6);
                }
                s5 = s6;
              }
              if (s5 === peg$FAILED) {
                s5 = null;
              }
              if (s5 !== peg$FAILED) {
                s6 = peg$parsewhitespace();
                if (s6 !== peg$FAILED) {
                  s7 = peg$parserparen();
                  if (s7 !== peg$FAILED) {
                    s2 = [s2, s3, s4, s5, s6, s7];
                    s1 = s2;
                  } else {
                    peg$currPos = s1;
                    s1 = peg$FAILED;
                  }
                } else {
                  peg$currPos = s1;
                  s1 = peg$FAILED;
                }
              } else {
                peg$currPos = s1;
                s1 = peg$FAILED;
              }
            } else {
              peg$currPos = s1;
              s1 = peg$FAILED;
            }
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c59(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parsecolumn_ref() {
        var s0, s1, s2, s3, s4;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$currPos;
        s3 = peg$parsetable_name();
        if (s3 !== peg$FAILED) {
          s4 = peg$parsedot();
          if (s4 !== peg$FAILED) {
            s3 = [s3, s4];
            s2 = s3;
          } else {
            peg$currPos = s2;
            s2 = peg$FAILED;
          }
        } else {
          peg$currPos = s2;
          s2 = peg$FAILED;
        }
        if (s2 === peg$FAILED) {
          s2 = null;
        }
        if (s2 !== peg$FAILED) {
          s3 = peg$parsename();
          if (s3 !== peg$FAILED) {
            s2 = [s2, s3];
            s1 = s2;
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c60(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parsegrouping_term() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parsewhitespace();
        if (s2 !== peg$FAILED) {
          s3 = peg$parseexpr();
          if (s3 !== peg$FAILED) {
            s2 = [s2, s3];
            s1 = s2;
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c61(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parseordering_term() {
        var s0, s1, s2, s3, s4, s5;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parsewhitespace();
        if (s2 !== peg$FAILED) {
          s3 = peg$currPos;
          s4 = peg$parseexpr();
          if (s4 !== peg$FAILED) {
            s5 = peg$parseASC();
            if (s5 === peg$FAILED) {
              s5 = peg$parseDESC();
            }
            if (s5 === peg$FAILED) {
              s5 = null;
            }
            if (s5 !== peg$FAILED) {
              s4 = [s4, s5];
              s3 = s4;
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          } else {
            peg$currPos = s3;
            s3 = peg$FAILED;
          }
          if (s3 !== peg$FAILED) {
            s2 = [s2, s3];
            s1 = s2;
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c62(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parsecompound_operator() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parseUNION();
        if (s2 !== peg$FAILED) {
          s3 = peg$parseALL();
          if (s3 === peg$FAILED) {
            s3 = null;
          }
          if (s3 !== peg$FAILED) {
            s2 = [s2, s3];
            s1 = s2;
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 === peg$FAILED) {
          s1 = peg$parseINTERSECT();
          if (s1 === peg$FAILED) {
            s1 = peg$parseEXCEPT();
          }
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c63(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parseunary_operator() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parsewhitespace();
        if (s2 !== peg$FAILED) {
          if (input.charCodeAt(peg$currPos) === 45) {
            s3 = peg$c64;
            peg$currPos++;
          } else {
            s3 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c65); }
          }
          if (s3 === peg$FAILED) {
            if (input.charCodeAt(peg$currPos) === 43) {
              s3 = peg$c66;
              peg$currPos++;
            } else {
              s3 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c67); }
            }
            if (s3 === peg$FAILED) {
              if (input.charCodeAt(peg$currPos) === 126) {
                s3 = peg$c68;
                peg$currPos++;
              } else {
                s3 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c69); }
              }
              if (s3 === peg$FAILED) {
                if (input.substr(peg$currPos, 3) === peg$c70) {
                  s3 = peg$c70;
                  peg$currPos += 3;
                } else {
                  s3 = peg$FAILED;
                  if (peg$silentFails === 0) { peg$fail(peg$c71); }
                }
              }
            }
          }
          if (s3 !== peg$FAILED) {
            s2 = [s2, s3];
            s1 = s2;
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c72(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parsebinary_op_wout_and() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parsewhitespace();
        if (s2 !== peg$FAILED) {
          if (input.substr(peg$currPos, 2) === peg$c73) {
            s3 = peg$c73;
            peg$currPos += 2;
          } else {
            s3 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c74); }
          }
          if (s3 === peg$FAILED) {
            if (input.charCodeAt(peg$currPos) === 42) {
              s3 = peg$c75;
              peg$currPos++;
            } else {
              s3 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c76); }
            }
            if (s3 === peg$FAILED) {
              if (input.charCodeAt(peg$currPos) === 47) {
                s3 = peg$c77;
                peg$currPos++;
              } else {
                s3 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c78); }
              }
              if (s3 === peg$FAILED) {
                if (input.charCodeAt(peg$currPos) === 37) {
                  s3 = peg$c79;
                  peg$currPos++;
                } else {
                  s3 = peg$FAILED;
                  if (peg$silentFails === 0) { peg$fail(peg$c80); }
                }
                if (s3 === peg$FAILED) {
                  if (input.charCodeAt(peg$currPos) === 43) {
                    s3 = peg$c66;
                    peg$currPos++;
                  } else {
                    s3 = peg$FAILED;
                    if (peg$silentFails === 0) { peg$fail(peg$c67); }
                  }
                  if (s3 === peg$FAILED) {
                    if (input.charCodeAt(peg$currPos) === 45) {
                      s3 = peg$c64;
                      peg$currPos++;
                    } else {
                      s3 = peg$FAILED;
                      if (peg$silentFails === 0) { peg$fail(peg$c65); }
                    }
                    if (s3 === peg$FAILED) {
                      if (input.substr(peg$currPos, 2) === peg$c81) {
                        s3 = peg$c81;
                        peg$currPos += 2;
                      } else {
                        s3 = peg$FAILED;
                        if (peg$silentFails === 0) { peg$fail(peg$c82); }
                      }
                      if (s3 === peg$FAILED) {
                        if (input.substr(peg$currPos, 2) === peg$c83) {
                          s3 = peg$c83;
                          peg$currPos += 2;
                        } else {
                          s3 = peg$FAILED;
                          if (peg$silentFails === 0) { peg$fail(peg$c84); }
                        }
                        if (s3 === peg$FAILED) {
                          if (input.charCodeAt(peg$currPos) === 38) {
                            s3 = peg$c85;
                            peg$currPos++;
                          } else {
                            s3 = peg$FAILED;
                            if (peg$silentFails === 0) { peg$fail(peg$c86); }
                          }
                          if (s3 === peg$FAILED) {
                            if (input.substr(peg$currPos, 2) === peg$c87) {
                              s3 = peg$c87;
                              peg$currPos += 2;
                            } else {
                              s3 = peg$FAILED;
                              if (peg$silentFails === 0) { peg$fail(peg$c88); }
                            }
                            if (s3 === peg$FAILED) {
                              if (input.substr(peg$currPos, 2) === peg$c89) {
                                s3 = peg$c89;
                                peg$currPos += 2;
                              } else {
                                s3 = peg$FAILED;
                                if (peg$silentFails === 0) { peg$fail(peg$c90); }
                              }
                              if (s3 === peg$FAILED) {
                                if (input.charCodeAt(peg$currPos) === 60) {
                                  s3 = peg$c91;
                                  peg$currPos++;
                                } else {
                                  s3 = peg$FAILED;
                                  if (peg$silentFails === 0) { peg$fail(peg$c92); }
                                }
                                if (s3 === peg$FAILED) {
                                  if (input.charCodeAt(peg$currPos) === 62) {
                                    s3 = peg$c93;
                                    peg$currPos++;
                                  } else {
                                    s3 = peg$FAILED;
                                    if (peg$silentFails === 0) { peg$fail(peg$c94); }
                                  }
                                  if (s3 === peg$FAILED) {
                                    if (input.charCodeAt(peg$currPos) === 61) {
                                      s3 = peg$c95;
                                      peg$currPos++;
                                    } else {
                                      s3 = peg$FAILED;
                                      if (peg$silentFails === 0) { peg$fail(peg$c96); }
                                    }
                                    if (s3 === peg$FAILED) {
                                      if (input.substr(peg$currPos, 2) === peg$c97) {
                                        s3 = peg$c97;
                                        peg$currPos += 2;
                                      } else {
                                        s3 = peg$FAILED;
                                        if (peg$silentFails === 0) { peg$fail(peg$c98); }
                                      }
                                      if (s3 === peg$FAILED) {
                                        if (input.substr(peg$currPos, 2) === peg$c99) {
                                          s3 = peg$c99;
                                          peg$currPos += 2;
                                        } else {
                                          s3 = peg$FAILED;
                                          if (peg$silentFails === 0) { peg$fail(peg$c100); }
                                        }
                                        if (s3 === peg$FAILED) {
                                          if (input.substr(peg$currPos, 2) === peg$c101) {
                                            s3 = peg$c101;
                                            peg$currPos += 2;
                                          } else {
                                            s3 = peg$FAILED;
                                            if (peg$silentFails === 0) { peg$fail(peg$c102); }
                                          }
                                          if (s3 === peg$FAILED) {
                                            if (input.substr(peg$currPos, 2) === peg$c103) {
                                              s3 = peg$c103;
                                              peg$currPos += 2;
                                            } else {
                                              s3 = peg$FAILED;
                                              if (peg$silentFails === 0) { peg$fail(peg$c104); }
                                            }
                                            if (s3 === peg$FAILED) {
                                              if (input.substr(peg$currPos, 6) === peg$c105) {
                                                s3 = peg$c105;
                                                peg$currPos += 6;
                                              } else {
                                                s3 = peg$FAILED;
                                                if (peg$silentFails === 0) { peg$fail(peg$c106); }
                                              }
                                              if (s3 === peg$FAILED) {
                                                if (input.substr(peg$currPos, 2) === peg$c107) {
                                                  s3 = peg$c107;
                                                  peg$currPos += 2;
                                                } else {
                                                  s3 = peg$FAILED;
                                                  if (peg$silentFails === 0) { peg$fail(peg$c108); }
                                                }
                                                if (s3 === peg$FAILED) {
                                                  if (input.substr(peg$currPos, 6) === peg$c109) {
                                                    s3 = peg$c109;
                                                    peg$currPos += 6;
                                                  } else {
                                                    s3 = peg$FAILED;
                                                    if (peg$silentFails === 0) { peg$fail(peg$c110); }
                                                  }
                                                  if (s3 === peg$FAILED) {
                                                    if (input.substr(peg$currPos, 4) === peg$c111) {
                                                      s3 = peg$c111;
                                                      peg$currPos += 4;
                                                    } else {
                                                      s3 = peg$FAILED;
                                                      if (peg$silentFails === 0) { peg$fail(peg$c112); }
                                                    }
                                                    if (s3 === peg$FAILED) {
                                                      if (input.substr(peg$currPos, 4) === peg$c113) {
                                                        s3 = peg$c113;
                                                        peg$currPos += 4;
                                                      } else {
                                                        s3 = peg$FAILED;
                                                        if (peg$silentFails === 0) { peg$fail(peg$c114); }
                                                      }
                                                      if (s3 === peg$FAILED) {
                                                        if (input.substr(peg$currPos, 5) === peg$c115) {
                                                          s3 = peg$c115;
                                                          peg$currPos += 5;
                                                        } else {
                                                          s3 = peg$FAILED;
                                                          if (peg$silentFails === 0) { peg$fail(peg$c116); }
                                                        }
                                                        if (s3 === peg$FAILED) {
                                                          if (input.substr(peg$currPos, 6) === peg$c117) {
                                                            s3 = peg$c117;
                                                            peg$currPos += 6;
                                                          } else {
                                                            s3 = peg$FAILED;
                                                            if (peg$silentFails === 0) { peg$fail(peg$c118); }
                                                          }
                                                          if (s3 === peg$FAILED) {
                                                            if (input.substr(peg$currPos, 2) === peg$c119) {
                                                              s3 = peg$c119;
                                                              peg$currPos += 2;
                                                            } else {
                                                              s3 = peg$FAILED;
                                                              if (peg$silentFails === 0) { peg$fail(peg$c120); }
                                                            }
                                                          }
                                                        }
                                                      }
                                                    }
                                                  }
                                                }
                                              }
                                            }
                                          }
                                        }
                                      }
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
          if (s3 !== peg$FAILED) {
            s2 = [s2, s3];
            s1 = s2;
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c72(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parsebinary_operator() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$parsewhitespace();
        if (s2 !== peg$FAILED) {
          if (input.substr(peg$currPos, 2) === peg$c73) {
            s3 = peg$c73;
            peg$currPos += 2;
          } else {
            s3 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c74); }
          }
          if (s3 === peg$FAILED) {
            if (input.charCodeAt(peg$currPos) === 42) {
              s3 = peg$c75;
              peg$currPos++;
            } else {
              s3 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c76); }
            }
            if (s3 === peg$FAILED) {
              if (input.charCodeAt(peg$currPos) === 47) {
                s3 = peg$c77;
                peg$currPos++;
              } else {
                s3 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c78); }
              }
              if (s3 === peg$FAILED) {
                if (input.charCodeAt(peg$currPos) === 37) {
                  s3 = peg$c79;
                  peg$currPos++;
                } else {
                  s3 = peg$FAILED;
                  if (peg$silentFails === 0) { peg$fail(peg$c80); }
                }
                if (s3 === peg$FAILED) {
                  if (input.charCodeAt(peg$currPos) === 43) {
                    s3 = peg$c66;
                    peg$currPos++;
                  } else {
                    s3 = peg$FAILED;
                    if (peg$silentFails === 0) { peg$fail(peg$c67); }
                  }
                  if (s3 === peg$FAILED) {
                    if (input.charCodeAt(peg$currPos) === 45) {
                      s3 = peg$c64;
                      peg$currPos++;
                    } else {
                      s3 = peg$FAILED;
                      if (peg$silentFails === 0) { peg$fail(peg$c65); }
                    }
                    if (s3 === peg$FAILED) {
                      if (input.substr(peg$currPos, 2) === peg$c81) {
                        s3 = peg$c81;
                        peg$currPos += 2;
                      } else {
                        s3 = peg$FAILED;
                        if (peg$silentFails === 0) { peg$fail(peg$c82); }
                      }
                      if (s3 === peg$FAILED) {
                        if (input.substr(peg$currPos, 2) === peg$c83) {
                          s3 = peg$c83;
                          peg$currPos += 2;
                        } else {
                          s3 = peg$FAILED;
                          if (peg$silentFails === 0) { peg$fail(peg$c84); }
                        }
                        if (s3 === peg$FAILED) {
                          if (input.charCodeAt(peg$currPos) === 38) {
                            s3 = peg$c85;
                            peg$currPos++;
                          } else {
                            s3 = peg$FAILED;
                            if (peg$silentFails === 0) { peg$fail(peg$c86); }
                          }
                          if (s3 === peg$FAILED) {
                            if (input.charCodeAt(peg$currPos) === 124) {
                              s3 = peg$c37;
                              peg$currPos++;
                            } else {
                              s3 = peg$FAILED;
                              if (peg$silentFails === 0) { peg$fail(peg$c38); }
                            }
                            if (s3 === peg$FAILED) {
                              if (input.substr(peg$currPos, 2) === peg$c87) {
                                s3 = peg$c87;
                                peg$currPos += 2;
                              } else {
                                s3 = peg$FAILED;
                                if (peg$silentFails === 0) { peg$fail(peg$c88); }
                              }
                              if (s3 === peg$FAILED) {
                                if (input.substr(peg$currPos, 2) === peg$c89) {
                                  s3 = peg$c89;
                                  peg$currPos += 2;
                                } else {
                                  s3 = peg$FAILED;
                                  if (peg$silentFails === 0) { peg$fail(peg$c90); }
                                }
                                if (s3 === peg$FAILED) {
                                  if (input.charCodeAt(peg$currPos) === 60) {
                                    s3 = peg$c91;
                                    peg$currPos++;
                                  } else {
                                    s3 = peg$FAILED;
                                    if (peg$silentFails === 0) { peg$fail(peg$c92); }
                                  }
                                  if (s3 === peg$FAILED) {
                                    if (input.charCodeAt(peg$currPos) === 62) {
                                      s3 = peg$c93;
                                      peg$currPos++;
                                    } else {
                                      s3 = peg$FAILED;
                                      if (peg$silentFails === 0) { peg$fail(peg$c94); }
                                    }
                                    if (s3 === peg$FAILED) {
                                      if (input.charCodeAt(peg$currPos) === 61) {
                                        s3 = peg$c95;
                                        peg$currPos++;
                                      } else {
                                        s3 = peg$FAILED;
                                        if (peg$silentFails === 0) { peg$fail(peg$c96); }
                                      }
                                      if (s3 === peg$FAILED) {
                                        if (input.substr(peg$currPos, 2) === peg$c97) {
                                          s3 = peg$c97;
                                          peg$currPos += 2;
                                        } else {
                                          s3 = peg$FAILED;
                                          if (peg$silentFails === 0) { peg$fail(peg$c98); }
                                        }
                                        if (s3 === peg$FAILED) {
                                          if (input.substr(peg$currPos, 2) === peg$c99) {
                                            s3 = peg$c99;
                                            peg$currPos += 2;
                                          } else {
                                            s3 = peg$FAILED;
                                            if (peg$silentFails === 0) { peg$fail(peg$c100); }
                                          }
                                          if (s3 === peg$FAILED) {
                                            if (input.substr(peg$currPos, 2) === peg$c101) {
                                              s3 = peg$c101;
                                              peg$currPos += 2;
                                            } else {
                                              s3 = peg$FAILED;
                                              if (peg$silentFails === 0) { peg$fail(peg$c102); }
                                            }
                                            if (s3 === peg$FAILED) {
                                              if (input.substr(peg$currPos, 2) === peg$c103) {
                                                s3 = peg$c103;
                                                peg$currPos += 2;
                                              } else {
                                                s3 = peg$FAILED;
                                                if (peg$silentFails === 0) { peg$fail(peg$c104); }
                                              }
                                              if (s3 === peg$FAILED) {
                                                if (input.substr(peg$currPos, 6) === peg$c105) {
                                                  s3 = peg$c105;
                                                  peg$currPos += 6;
                                                } else {
                                                  s3 = peg$FAILED;
                                                  if (peg$silentFails === 0) { peg$fail(peg$c106); }
                                                }
                                                if (s3 === peg$FAILED) {
                                                  if (input.substr(peg$currPos, 2) === peg$c107) {
                                                    s3 = peg$c107;
                                                    peg$currPos += 2;
                                                  } else {
                                                    s3 = peg$FAILED;
                                                    if (peg$silentFails === 0) { peg$fail(peg$c108); }
                                                  }
                                                  if (s3 === peg$FAILED) {
                                                    if (input.substr(peg$currPos, 6) === peg$c109) {
                                                      s3 = peg$c109;
                                                      peg$currPos += 6;
                                                    } else {
                                                      s3 = peg$FAILED;
                                                      if (peg$silentFails === 0) { peg$fail(peg$c110); }
                                                    }
                                                    if (s3 === peg$FAILED) {
                                                      if (input.substr(peg$currPos, 4) === peg$c111) {
                                                        s3 = peg$c111;
                                                        peg$currPos += 4;
                                                      } else {
                                                        s3 = peg$FAILED;
                                                        if (peg$silentFails === 0) { peg$fail(peg$c112); }
                                                      }
                                                      if (s3 === peg$FAILED) {
                                                        if (input.substr(peg$currPos, 4) === peg$c113) {
                                                          s3 = peg$c113;
                                                          peg$currPos += 4;
                                                        } else {
                                                          s3 = peg$FAILED;
                                                          if (peg$silentFails === 0) { peg$fail(peg$c114); }
                                                        }
                                                        if (s3 === peg$FAILED) {
                                                          if (input.substr(peg$currPos, 5) === peg$c115) {
                                                            s3 = peg$c115;
                                                            peg$currPos += 5;
                                                          } else {
                                                            s3 = peg$FAILED;
                                                            if (peg$silentFails === 0) { peg$fail(peg$c116); }
                                                          }
                                                          if (s3 === peg$FAILED) {
                                                            if (input.substr(peg$currPos, 6) === peg$c117) {
                                                              s3 = peg$c117;
                                                              peg$currPos += 6;
                                                            } else {
                                                              s3 = peg$FAILED;
                                                              if (peg$silentFails === 0) { peg$fail(peg$c118); }
                                                            }
                                                            if (s3 === peg$FAILED) {
                                                              if (input.substr(peg$currPos, 3) === peg$c24) {
                                                                s3 = peg$c24;
                                                                peg$currPos += 3;
                                                              } else {
                                                                s3 = peg$FAILED;
                                                                if (peg$silentFails === 0) { peg$fail(peg$c25); }
                                                              }
                                                              if (s3 === peg$FAILED) {
                                                                if (input.substr(peg$currPos, 2) === peg$c119) {
                                                                  s3 = peg$c119;
                                                                  peg$currPos += 2;
                                                                } else {
                                                                  s3 = peg$FAILED;
                                                                  if (peg$silentFails === 0) { peg$fail(peg$c120); }
                                                                }
                                                              }
                                                            }
                                                          }
                                                        }
                                                      }
                                                    }
                                                  }
                                                }
                                              }
                                            }
                                          }
                                        }
                                      }
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
          if (s3 !== peg$FAILED) {
            s2 = [s2, s3];
            s1 = s2;
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c72(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parsename() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = [];
        if (peg$c121.test(input.charAt(peg$currPos))) {
          s2 = input.charAt(peg$currPos);
          peg$currPos++;
        } else {
          s2 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c122); }
        }
        if (s2 !== peg$FAILED) {
          while (s2 !== peg$FAILED) {
            s1.push(s2);
            if (peg$c121.test(input.charAt(peg$currPos))) {
              s2 = input.charAt(peg$currPos);
              peg$currPos++;
            } else {
              s2 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c122); }
            }
          }
        } else {
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c123(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parsetype() {
        var s0;
  
        if (input.substr(peg$currPos, 3) === peg$c124) {
          s0 = peg$c124;
          peg$currPos += 3;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c125); }
        }
        if (s0 === peg$FAILED) {
          if (input.substr(peg$currPos, 7) === peg$c126) {
            s0 = peg$c126;
            peg$currPos += 7;
          } else {
            s0 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c127); }
          }
          if (s0 === peg$FAILED) {
            if (input.substr(peg$currPos, 5) === peg$c128) {
              s0 = peg$c128;
              peg$currPos += 5;
            } else {
              s0 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c129); }
            }
            if (s0 === peg$FAILED) {
              if (input.substr(peg$currPos, 4) === peg$c130) {
                s0 = peg$c130;
                peg$currPos += 4;
              } else {
                s0 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c131); }
              }
              if (s0 === peg$FAILED) {
                if (input.substr(peg$currPos, 7) === peg$c132) {
                  s0 = peg$c132;
                  peg$currPos += 7;
                } else {
                  s0 = peg$FAILED;
                  if (peg$silentFails === 0) { peg$fail(peg$c133); }
                }
                if (s0 === peg$FAILED) {
                  if (input.substr(peg$currPos, 4) === peg$c134) {
                    s0 = peg$c134;
                    peg$currPos += 4;
                  } else {
                    s0 = peg$FAILED;
                    if (peg$silentFails === 0) { peg$fail(peg$c135); }
                  }
                }
              }
            }
          }
        }
  
        return s0;
      }
  
      function peg$parsetable_name() {
        var s0, s1;
  
        s0 = peg$currPos;
        s1 = peg$parsename();
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c136(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parsedigit() {
        var s0;
  
        if (peg$c137.test(input.charAt(peg$currPos))) {
          s0 = input.charAt(peg$currPos);
          peg$currPos++;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c138); }
        }
  
        return s0;
      }
  
      function peg$parseequal() {
        var s0;
  
        if (input.charCodeAt(peg$currPos) === 61) {
          s0 = peg$c95;
          peg$currPos++;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c96); }
        }
  
        return s0;
      }
  
      function peg$parsedot() {
        var s0;
  
        if (input.charCodeAt(peg$currPos) === 46) {
          s0 = peg$c139;
          peg$currPos++;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c140); }
        }
  
        return s0;
      }
  
      function peg$parsecomma() {
        var s0;
  
        if (input.charCodeAt(peg$currPos) === 44) {
          s0 = peg$c141;
          peg$currPos++;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c142); }
        }
  
        return s0;
      }
  
      function peg$parsesemicolon() {
        var s0;
  
        if (input.charCodeAt(peg$currPos) === 59) {
          s0 = peg$c143;
          peg$currPos++;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c144); }
        }
  
        return s0;
      }
  
      function peg$parseminusminus() {
        var s0;
  
        if (input.substr(peg$currPos, 2) === peg$c145) {
          s0 = peg$c145;
          peg$currPos += 2;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c146); }
        }
  
        return s0;
      }
  
      function peg$parseminus() {
        var s0;
  
        if (input.charCodeAt(peg$currPos) === 45) {
          s0 = peg$c64;
          peg$currPos++;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c65); }
        }
  
        return s0;
      }
  
      function peg$parseplus() {
        var s0;
  
        if (input.charCodeAt(peg$currPos) === 43) {
          s0 = peg$c66;
          peg$currPos++;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c67); }
        }
  
        return s0;
      }
  
      function peg$parselparen() {
        var s0;
  
        if (input.charCodeAt(peg$currPos) === 40) {
          s0 = peg$c2;
          peg$currPos++;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c3); }
        }
  
        return s0;
      }
  
      function peg$parserparen() {
        var s0;
  
        if (input.charCodeAt(peg$currPos) === 41) {
          s0 = peg$c4;
          peg$currPos++;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c5); }
        }
  
        return s0;
      }
  
      function peg$parsestar() {
        var s0;
  
        if (input.charCodeAt(peg$currPos) === 42) {
          s0 = peg$c75;
          peg$currPos++;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c76); }
        }
  
        return s0;
      }
  
      function peg$parsenewline() {
        var s0;
  
        if (input.charCodeAt(peg$currPos) === 10) {
          s0 = peg$c147;
          peg$currPos++;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c148); }
        }
  
        return s0;
      }
  
      function peg$parseanything_except_newline() {
        var s0, s1;
  
        s0 = [];
        if (peg$c149.test(input.charAt(peg$currPos))) {
          s1 = input.charAt(peg$currPos);
          peg$currPos++;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c150); }
        }
        while (s1 !== peg$FAILED) {
          s0.push(s1);
          if (peg$c149.test(input.charAt(peg$currPos))) {
            s1 = input.charAt(peg$currPos);
            peg$currPos++;
          } else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c150); }
          }
        }
  
        return s0;
      }
  
      function peg$parsecomment_beg() {
        var s0;
  
        if (input.substr(peg$currPos, 2) === peg$c151) {
          s0 = peg$c151;
          peg$currPos += 2;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c152); }
        }
  
        return s0;
      }
  
      function peg$parsecomment_end() {
        var s0;
  
        if (input.substr(peg$currPos, 2) === peg$c153) {
          s0 = peg$c153;
          peg$currPos += 2;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c154); }
        }
  
        return s0;
      }
  
      function peg$parseanything_except_comment_end() {
        var s0, s1, s2, s3;
  
        s0 = peg$currPos;
        s1 = [];
        if (input.length > peg$currPos) {
          s2 = input.charAt(peg$currPos);
          peg$currPos++;
        } else {
          s2 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c155); }
        }
        while (s2 !== peg$FAILED) {
          s1.push(s2);
          if (input.length > peg$currPos) {
            s2 = input.charAt(peg$currPos);
            peg$currPos++;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c155); }
          }
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$currPos;
          peg$silentFails++;
          if (input.substr(peg$currPos, 2) === peg$c153) {
            s3 = peg$c153;
            peg$currPos += 2;
          } else {
            s3 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c154); }
          }
          peg$silentFails--;
          if (s3 !== peg$FAILED) {
            peg$currPos = s2;
            s2 = void 0;
          } else {
            s2 = peg$FAILED;
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsestring_literal() {
        var s0, s1, s2, s3, s4;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        if (input.charCodeAt(peg$currPos) === 39) {
          s2 = peg$c156;
          peg$currPos++;
        } else {
          s2 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c157); }
        }
        if (s2 !== peg$FAILED) {
          s3 = [];
          s4 = peg$parseescape_char();
          if (s4 === peg$FAILED) {
            if (peg$c158.test(input.charAt(peg$currPos))) {
              s4 = input.charAt(peg$currPos);
              peg$currPos++;
            } else {
              s4 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c159); }
            }
          }
          while (s4 !== peg$FAILED) {
            s3.push(s4);
            s4 = peg$parseescape_char();
            if (s4 === peg$FAILED) {
              if (peg$c158.test(input.charAt(peg$currPos))) {
                s4 = input.charAt(peg$currPos);
                peg$currPos++;
              } else {
                s4 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c159); }
              }
            }
          }
          if (s3 !== peg$FAILED) {
            if (input.charCodeAt(peg$currPos) === 39) {
              s4 = peg$c156;
              peg$currPos++;
            } else {
              s4 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c157); }
            }
            if (s4 !== peg$FAILED) {
              s2 = [s2, s3, s4];
              s1 = s2;
            } else {
              peg$currPos = s1;
              s1 = peg$FAILED;
            }
          } else {
            peg$currPos = s1;
            s1 = peg$FAILED;
          }
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          peg$savedPos = s0;
          s1 = peg$c160(s1);
        }
        s0 = s1;
  
        return s0;
      }
  
      function peg$parseescape_char() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        if (input.charCodeAt(peg$currPos) === 92) {
          s1 = peg$c161;
          peg$currPos++;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c162); }
        }
        if (s1 !== peg$FAILED) {
          if (input.length > peg$currPos) {
            s2 = input.charAt(peg$currPos);
            peg$currPos++;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c155); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsenil() {
        var s0;
  
        s0 = peg$c163;
  
        return s0;
      }
  
      function peg$parseCURRENT_TIME() {
        var s0;
  
        if (input.substr(peg$currPos, 3) === peg$c164) {
          s0 = peg$c164;
          peg$currPos += 3;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c165); }
        }
  
        return s0;
      }
  
      function peg$parseCURRENT_DATE() {
        var s0;
  
        if (input.substr(peg$currPos, 3) === peg$c164) {
          s0 = peg$c164;
          peg$currPos += 3;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c165); }
        }
  
        return s0;
      }
  
      function peg$parseCURRENT_TIMESTAMP() {
        var s0;
  
        if (input.substr(peg$currPos, 3) === peg$c164) {
          s0 = peg$c164;
          peg$currPos += 3;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c165); }
        }
  
        return s0;
      }
  
      function peg$parsewhitespace() {
        var s0, s1;
  
        s0 = [];
        if (peg$c166.test(input.charAt(peg$currPos))) {
          s1 = input.charAt(peg$currPos);
          peg$currPos++;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c167); }
        }
        while (s1 !== peg$FAILED) {
          s0.push(s1);
          if (peg$c166.test(input.charAt(peg$currPos))) {
            s1 = input.charAt(peg$currPos);
            peg$currPos++;
          } else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c167); }
          }
        }
  
        return s0;
      }
  
      function peg$parsewhitespace1() {
        var s0, s1;
  
        s0 = [];
        if (peg$c166.test(input.charAt(peg$currPos))) {
          s1 = input.charAt(peg$currPos);
          peg$currPos++;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c167); }
        }
        if (s1 !== peg$FAILED) {
          while (s1 !== peg$FAILED) {
            s0.push(s1);
            if (peg$c166.test(input.charAt(peg$currPos))) {
              s1 = input.charAt(peg$currPos);
              peg$currPos++;
            } else {
              s1 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c167); }
            }
          }
        } else {
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseADD() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 3) === peg$c168) {
            s2 = peg$c168;
            peg$currPos += 3;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c169); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseALL() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 3) === peg$c170) {
            s2 = peg$c170;
            peg$currPos += 3;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c171); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseALTER() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 5) === peg$c172) {
            s2 = peg$c172;
            peg$currPos += 5;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c173); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseAND() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 3) === peg$c24) {
            s2 = peg$c24;
            peg$currPos += 3;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c25); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseAS() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 2) === peg$c174) {
            s2 = peg$c174;
            peg$currPos += 2;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c175); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseASC() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 3) === peg$c176) {
            s2 = peg$c176;
            peg$currPos += 3;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c177); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseBETWEEN() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 7) === peg$c178) {
            s2 = peg$c178;
            peg$currPos += 7;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c179); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseBY() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 2) === peg$c180) {
            s2 = peg$c180;
            peg$currPos += 2;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c181); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseCAST() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 4) === peg$c182) {
            s2 = peg$c182;
            peg$currPos += 4;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c183); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseCOLUMN() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 6) === peg$c184) {
            s2 = peg$c184;
            peg$currPos += 6;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c185); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseDESC() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 4) === peg$c186) {
            s2 = peg$c186;
            peg$currPos += 4;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c187); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseDISTINCT() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 8) === peg$c188) {
            s2 = peg$c188;
            peg$currPos += 8;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c189); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseE() {
        var s0;
  
        if (input.charCodeAt(peg$currPos) === 69) {
          s0 = peg$c190;
          peg$currPos++;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c191); }
        }
  
        return s0;
      }
  
      function peg$parseESCAPE() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 6) === peg$c192) {
            s2 = peg$c192;
            peg$currPos += 6;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c193); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseEXCEPT() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 6) === peg$c194) {
            s2 = peg$c194;
            peg$currPos += 6;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c195); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseEXISTS() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 6) === peg$c45) {
            s2 = peg$c45;
            peg$currPos += 6;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c46); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseEXPLAIN() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 7) === peg$c196) {
            s2 = peg$c196;
            peg$currPos += 7;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c197); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseEVENT() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 5) === peg$c198) {
            s2 = peg$c198;
            peg$currPos += 5;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c199); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseFORALL() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 6) === peg$c48) {
            s2 = peg$c48;
            peg$currPos += 6;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c49); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseFROM() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 4) === peg$c200) {
            s2 = peg$c200;
            peg$currPos += 4;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c201); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseGLOB() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 4) === peg$c113) {
            s2 = peg$c113;
            peg$currPos += 4;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c114); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseGROUP() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 5) === peg$c202) {
            s2 = peg$c202;
            peg$currPos += 5;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c203); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseHAVING() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 6) === peg$c204) {
            s2 = peg$c204;
            peg$currPos += 6;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c205); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseIN() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 2) === peg$c107) {
            s2 = peg$c107;
            peg$currPos += 2;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c108); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseINNER() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 5) === peg$c206) {
            s2 = peg$c206;
            peg$currPos += 5;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c207); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseINSERT() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 6) === peg$c208) {
            s2 = peg$c208;
            peg$currPos += 6;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c209); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseINTERSECT() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 9) === peg$c210) {
            s2 = peg$c210;
            peg$currPos += 9;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c211); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseINTO() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 4) === peg$c212) {
            s2 = peg$c212;
            peg$currPos += 4;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c213); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseIS() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 2) === peg$c103) {
            s2 = peg$c103;
            peg$currPos += 2;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c104); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseISNULL() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 6) === peg$c214) {
            s2 = peg$c214;
            peg$currPos += 6;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c215); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseJOIN() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 4) === peg$c216) {
            s2 = peg$c216;
            peg$currPos += 4;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c217); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseKEY() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 3) === peg$c218) {
            s2 = peg$c218;
            peg$currPos += 3;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c219); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseLEFT() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 4) === peg$c220) {
            s2 = peg$c220;
            peg$currPos += 4;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c221); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseLIKE() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 4) === peg$c111) {
            s2 = peg$c111;
            peg$currPos += 4;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c112); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseLIMIT() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 5) === peg$c222) {
            s2 = peg$c222;
            peg$currPos += 5;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c223); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseMATCH() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 5) === peg$c115) {
            s2 = peg$c115;
            peg$currPos += 5;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c116); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseNO() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 2) === peg$c224) {
            s2 = peg$c224;
            peg$currPos += 2;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c225); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseNOT() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 3) === peg$c70) {
            s2 = peg$c70;
            peg$currPos += 3;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c71); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseNOTNULL() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 7) === peg$c226) {
            s2 = peg$c226;
            peg$currPos += 7;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c227); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseNULL() {
        var s0;
  
        if (input.substr(peg$currPos, 4) === peg$c228) {
          s0 = peg$c228;
          peg$currPos += 4;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c229); }
        }
        if (s0 === peg$FAILED) {
          if (input.substr(peg$currPos, 4) === peg$c230) {
            s0 = peg$c230;
            peg$currPos += 4;
          } else {
            s0 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c231); }
          }
        }
  
        return s0;
      }
  
      function peg$parseOF() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 2) === peg$c232) {
            s2 = peg$c232;
            peg$currPos += 2;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c233); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseOFFSET() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 6) === peg$c234) {
            s2 = peg$c234;
            peg$currPos += 6;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c235); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseON() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 2) === peg$c236) {
            s2 = peg$c236;
            peg$currPos += 2;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c237); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseOR() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 2) === peg$c119) {
            s2 = peg$c119;
            peg$currPos += 2;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c120); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseORDER() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 5) === peg$c238) {
            s2 = peg$c238;
            peg$currPos += 5;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c239); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseOUTER() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 5) === peg$c240) {
            s2 = peg$c240;
            peg$currPos += 5;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c241); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsePRIMARY() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 7) === peg$c242) {
            s2 = peg$c242;
            peg$currPos += 7;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c243); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseQUERY() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 5) === peg$c244) {
            s2 = peg$c244;
            peg$currPos += 5;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c245); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseRAISE() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 5) === peg$c246) {
            s2 = peg$c246;
            peg$currPos += 5;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c247); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseREFERENCES() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 10) === peg$c248) {
            s2 = peg$c248;
            peg$currPos += 10;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c249); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseREGEXP() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 6) === peg$c117) {
            s2 = peg$c117;
            peg$currPos += 6;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c118); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseRENAME() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 6) === peg$c250) {
            s2 = peg$c250;
            peg$currPos += 6;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c251); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseREPLACE() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 7) === peg$c252) {
            s2 = peg$c252;
            peg$currPos += 7;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c253); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseRETURN() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 6) === peg$c254) {
            s2 = peg$c254;
            peg$currPos += 6;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c255); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseROW() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 3) === peg$c256) {
            s2 = peg$c256;
            peg$currPos += 3;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c257); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseSAVEPOINT() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 9) === peg$c258) {
            s2 = peg$c258;
            peg$currPos += 9;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c259); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseSELECT() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 6) === peg$c260) {
            s2 = peg$c260;
            peg$currPos += 6;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c261); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseSET() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 3) === peg$c262) {
            s2 = peg$c262;
            peg$currPos += 3;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c263); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseTABLE() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 5) === peg$c264) {
            s2 = peg$c264;
            peg$currPos += 5;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c265); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseTEMP() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 4) === peg$c266) {
            s2 = peg$c266;
            peg$currPos += 4;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c267); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseTEMPORARY() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 9) === peg$c268) {
            s2 = peg$c268;
            peg$currPos += 9;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c269); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseTHEN() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 4) === peg$c270) {
            s2 = peg$c270;
            peg$currPos += 4;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c271); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseTO() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 2) === peg$c272) {
            s2 = peg$c272;
            peg$currPos += 2;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c273); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseUNION() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 5) === peg$c274) {
            s2 = peg$c274;
            peg$currPos += 5;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c275); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseUSING() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 5) === peg$c276) {
            s2 = peg$c276;
            peg$currPos += 5;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c277); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsevALUES() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 6) === peg$c278) {
            s2 = peg$c278;
            peg$currPos += 6;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c279); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseVIRTUAL() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 7) === peg$c280) {
            s2 = peg$c280;
            peg$currPos += 7;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c281); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseWITH() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 4) === peg$c282) {
            s2 = peg$c282;
            peg$currPos += 4;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c283); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parseWHERE() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$parsewhitespace1();
        if (s1 !== peg$FAILED) {
          if (input.substr(peg$currPos, 5) === peg$c284) {
            s2 = peg$c284;
            peg$currPos += 5;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c285); }
          }
          if (s2 !== peg$FAILED) {
            s1 = [s1, s2];
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsejs_string_literal() {
        var s0, s1, s2, s3;
  
        peg$silentFails++;
        s0 = peg$currPos;
        if (input.charCodeAt(peg$currPos) === 34) {
          s1 = peg$c287;
          peg$currPos++;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c288); }
        }
        if (s1 !== peg$FAILED) {
          s2 = [];
          s3 = peg$parsejs_double_string_character();
          while (s3 !== peg$FAILED) {
            s2.push(s3);
            s3 = peg$parsejs_double_string_character();
          }
          if (s2 !== peg$FAILED) {
            if (input.charCodeAt(peg$currPos) === 34) {
              s3 = peg$c287;
              peg$currPos++;
            } else {
              s3 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c288); }
            }
            if (s3 !== peg$FAILED) {
              peg$savedPos = s0;
              s1 = peg$c289(s2);
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
        if (s0 === peg$FAILED) {
          s0 = peg$currPos;
          if (input.charCodeAt(peg$currPos) === 39) {
            s1 = peg$c156;
            peg$currPos++;
          } else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c157); }
          }
          if (s1 !== peg$FAILED) {
            s2 = [];
            s3 = peg$parsejs_single_string_character();
            while (s3 !== peg$FAILED) {
              s2.push(s3);
              s3 = peg$parsejs_single_string_character();
            }
            if (s2 !== peg$FAILED) {
              if (input.charCodeAt(peg$currPos) === 39) {
                s3 = peg$c156;
                peg$currPos++;
              } else {
                s3 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c157); }
              }
              if (s3 !== peg$FAILED) {
                peg$savedPos = s0;
                s1 = peg$c289(s2);
                s0 = s1;
              } else {
                peg$currPos = s0;
                s0 = peg$FAILED;
              }
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        }
        peg$silentFails--;
        if (s0 === peg$FAILED) {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c286); }
        }
  
        return s0;
      }
  
      function peg$parsejs_double_string_character() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        peg$silentFails++;
        if (input.charCodeAt(peg$currPos) === 34) {
          s2 = peg$c287;
          peg$currPos++;
        } else {
          s2 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c288); }
        }
        if (s2 === peg$FAILED) {
          if (input.charCodeAt(peg$currPos) === 92) {
            s2 = peg$c161;
            peg$currPos++;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c162); }
          }
          if (s2 === peg$FAILED) {
            s2 = peg$parsejs_line_terminator();
          }
        }
        peg$silentFails--;
        if (s2 === peg$FAILED) {
          s1 = void 0;
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$parsejs_source_character();
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c290();
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
        if (s0 === peg$FAILED) {
          s0 = peg$currPos;
          if (input.charCodeAt(peg$currPos) === 92) {
            s1 = peg$c161;
            peg$currPos++;
          } else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c162); }
          }
          if (s1 !== peg$FAILED) {
            s2 = peg$parsejs_escape_sequence();
            if (s2 !== peg$FAILED) {
              peg$savedPos = s0;
              s1 = peg$c291(s2);
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
          if (s0 === peg$FAILED) {
            s0 = peg$parsejs_line_continuation();
          }
        }
  
        return s0;
      }
  
      function peg$parsejs_single_string_character() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        peg$silentFails++;
        if (input.charCodeAt(peg$currPos) === 39) {
          s2 = peg$c156;
          peg$currPos++;
        } else {
          s2 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c157); }
        }
        if (s2 === peg$FAILED) {
          if (input.charCodeAt(peg$currPos) === 92) {
            s2 = peg$c161;
            peg$currPos++;
          } else {
            s2 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c162); }
          }
          if (s2 === peg$FAILED) {
            s2 = peg$parsejs_line_terminator();
          }
        }
        peg$silentFails--;
        if (s2 === peg$FAILED) {
          s1 = void 0;
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$parsejs_source_character();
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c290();
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
        if (s0 === peg$FAILED) {
          s0 = peg$currPos;
          if (input.charCodeAt(peg$currPos) === 92) {
            s1 = peg$c161;
            peg$currPos++;
          } else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c162); }
          }
          if (s1 !== peg$FAILED) {
            s2 = peg$parsejs_escape_sequence();
            if (s2 !== peg$FAILED) {
              peg$savedPos = s0;
              s1 = peg$c291(s2);
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
          if (s0 === peg$FAILED) {
            s0 = peg$parsejs_line_continuation();
          }
        }
  
        return s0;
      }
  
      function peg$parsejs_line_continuation() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        if (input.charCodeAt(peg$currPos) === 92) {
          s1 = peg$c161;
          peg$currPos++;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c162); }
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$parsejs_line_terminator_sequence();
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c292();
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsejs_escape_sequence() {
        var s0, s1, s2, s3;
  
        s0 = peg$parsejs_character_escape_sequence();
        if (s0 === peg$FAILED) {
          s0 = peg$currPos;
          if (input.charCodeAt(peg$currPos) === 48) {
            s1 = peg$c293;
            peg$currPos++;
          } else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c294); }
          }
          if (s1 !== peg$FAILED) {
            s2 = peg$currPos;
            peg$silentFails++;
            s3 = peg$parsejs_decimal_digit();
            peg$silentFails--;
            if (s3 === peg$FAILED) {
              s2 = void 0;
            } else {
              peg$currPos = s2;
              s2 = peg$FAILED;
            }
            if (s2 !== peg$FAILED) {
              peg$savedPos = s0;
              s1 = peg$c295();
              s0 = s1;
            } else {
              peg$currPos = s0;
              s0 = peg$FAILED;
            }
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
          if (s0 === peg$FAILED) {
            s0 = peg$parsejs_hex_escape_sequence();
            if (s0 === peg$FAILED) {
              s0 = peg$parsejs_unicode_escape_sequence();
            }
          }
        }
  
        return s0;
      }
  
      function peg$parsejs_line_terminator() {
        var s0;
  
        if (peg$c296.test(input.charAt(peg$currPos))) {
          s0 = input.charAt(peg$currPos);
          peg$currPos++;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c297); }
        }
  
        return s0;
      }
  
      function peg$parsejs_source_character() {
        var s0;
  
        if (input.length > peg$currPos) {
          s0 = input.charAt(peg$currPos);
          peg$currPos++;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c155); }
        }
  
        return s0;
      }
  
      function peg$parsejs_character_escape_sequence() {
        var s0;
  
        s0 = peg$parsejs_single_escape_character();
        if (s0 === peg$FAILED) {
          s0 = peg$parsejs_non_escape_character();
        }
  
        return s0;
      }
  
      function peg$parsejs_single_escape_character() {
        var s0, s1;
  
        if (input.charCodeAt(peg$currPos) === 39) {
          s0 = peg$c156;
          peg$currPos++;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c157); }
        }
        if (s0 === peg$FAILED) {
          if (input.charCodeAt(peg$currPos) === 34) {
            s0 = peg$c287;
            peg$currPos++;
          } else {
            s0 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c288); }
          }
          if (s0 === peg$FAILED) {
            if (input.charCodeAt(peg$currPos) === 92) {
              s0 = peg$c161;
              peg$currPos++;
            } else {
              s0 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c162); }
            }
            if (s0 === peg$FAILED) {
              s0 = peg$currPos;
              if (input.charCodeAt(peg$currPos) === 98) {
                s1 = peg$c298;
                peg$currPos++;
              } else {
                s1 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c299); }
              }
              if (s1 !== peg$FAILED) {
                peg$savedPos = s0;
                s1 = peg$c300();
              }
              s0 = s1;
              if (s0 === peg$FAILED) {
                s0 = peg$currPos;
                if (input.charCodeAt(peg$currPos) === 102) {
                  s1 = peg$c301;
                  peg$currPos++;
                } else {
                  s1 = peg$FAILED;
                  if (peg$silentFails === 0) { peg$fail(peg$c302); }
                }
                if (s1 !== peg$FAILED) {
                  peg$savedPos = s0;
                  s1 = peg$c303();
                }
                s0 = s1;
                if (s0 === peg$FAILED) {
                  s0 = peg$currPos;
                  if (input.charCodeAt(peg$currPos) === 110) {
                    s1 = peg$c304;
                    peg$currPos++;
                  } else {
                    s1 = peg$FAILED;
                    if (peg$silentFails === 0) { peg$fail(peg$c305); }
                  }
                  if (s1 !== peg$FAILED) {
                    peg$savedPos = s0;
                    s1 = peg$c306();
                  }
                  s0 = s1;
                  if (s0 === peg$FAILED) {
                    s0 = peg$currPos;
                    if (input.charCodeAt(peg$currPos) === 114) {
                      s1 = peg$c307;
                      peg$currPos++;
                    } else {
                      s1 = peg$FAILED;
                      if (peg$silentFails === 0) { peg$fail(peg$c308); }
                    }
                    if (s1 !== peg$FAILED) {
                      peg$savedPos = s0;
                      s1 = peg$c309();
                    }
                    s0 = s1;
                    if (s0 === peg$FAILED) {
                      s0 = peg$currPos;
                      if (input.charCodeAt(peg$currPos) === 116) {
                        s1 = peg$c310;
                        peg$currPos++;
                      } else {
                        s1 = peg$FAILED;
                        if (peg$silentFails === 0) { peg$fail(peg$c311); }
                      }
                      if (s1 !== peg$FAILED) {
                        peg$savedPos = s0;
                        s1 = peg$c312();
                      }
                      s0 = s1;
                      if (s0 === peg$FAILED) {
                        s0 = peg$currPos;
                        if (input.charCodeAt(peg$currPos) === 118) {
                          s1 = peg$c313;
                          peg$currPos++;
                        } else {
                          s1 = peg$FAILED;
                          if (peg$silentFails === 0) { peg$fail(peg$c314); }
                        }
                        if (s1 !== peg$FAILED) {
                          peg$savedPos = s0;
                          s1 = peg$c315();
                        }
                        s0 = s1;
                      }
                    }
                  }
                }
              }
            }
          }
        }
  
        return s0;
      }
  
      function peg$parsejs_line_terminator_sequence() {
        var s0, s1;
  
        peg$silentFails++;
        if (input.charCodeAt(peg$currPos) === 10) {
          s0 = peg$c147;
          peg$currPos++;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c148); }
        }
        if (s0 === peg$FAILED) {
          if (input.substr(peg$currPos, 2) === peg$c317) {
            s0 = peg$c317;
            peg$currPos += 2;
          } else {
            s0 = peg$FAILED;
            if (peg$silentFails === 0) { peg$fail(peg$c318); }
          }
          if (s0 === peg$FAILED) {
            if (input.charCodeAt(peg$currPos) === 13) {
              s0 = peg$c319;
              peg$currPos++;
            } else {
              s0 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c320); }
            }
            if (s0 === peg$FAILED) {
              if (input.charCodeAt(peg$currPos) === 8232) {
                s0 = peg$c321;
                peg$currPos++;
              } else {
                s0 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c322); }
              }
              if (s0 === peg$FAILED) {
                if (input.charCodeAt(peg$currPos) === 8233) {
                  s0 = peg$c323;
                  peg$currPos++;
                } else {
                  s0 = peg$FAILED;
                  if (peg$silentFails === 0) { peg$fail(peg$c324); }
                }
              }
            }
          }
        }
        peg$silentFails--;
        if (s0 === peg$FAILED) {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c316); }
        }
  
        return s0;
      }
  
      function peg$parsejs_non_escape_character() {
        var s0, s1, s2;
  
        s0 = peg$currPos;
        s1 = peg$currPos;
        peg$silentFails++;
        s2 = peg$parsejs_escape_character();
        if (s2 === peg$FAILED) {
          s2 = peg$parsejs_line_terminator();
        }
        peg$silentFails--;
        if (s2 === peg$FAILED) {
          s1 = void 0;
        } else {
          peg$currPos = s1;
          s1 = peg$FAILED;
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$parsejs_source_character();
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c290();
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsejs_escape_character() {
        var s0;
  
        s0 = peg$parsejs_single_escape_character();
        if (s0 === peg$FAILED) {
          s0 = peg$parsejs_decimal_digit();
          if (s0 === peg$FAILED) {
            if (input.charCodeAt(peg$currPos) === 120) {
              s0 = peg$c325;
              peg$currPos++;
            } else {
              s0 = peg$FAILED;
              if (peg$silentFails === 0) { peg$fail(peg$c326); }
            }
            if (s0 === peg$FAILED) {
              if (input.charCodeAt(peg$currPos) === 117) {
                s0 = peg$c327;
                peg$currPos++;
              } else {
                s0 = peg$FAILED;
                if (peg$silentFails === 0) { peg$fail(peg$c328); }
              }
            }
          }
        }
  
        return s0;
      }
  
      function peg$parsejs_decimal_digit() {
        var s0;
  
        if (peg$c137.test(input.charAt(peg$currPos))) {
          s0 = input.charAt(peg$currPos);
          peg$currPos++;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c138); }
        }
  
        return s0;
      }
  
      function peg$parsejs_hex_escape_sequence() {
        var s0, s1, s2, s3, s4, s5;
  
        s0 = peg$currPos;
        if (input.charCodeAt(peg$currPos) === 120) {
          s1 = peg$c325;
          peg$currPos++;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c326); }
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$currPos;
          s3 = peg$currPos;
          s4 = peg$parsejs_hex_digit();
          if (s4 !== peg$FAILED) {
            s5 = peg$parsejs_hex_digit();
            if (s5 !== peg$FAILED) {
              s4 = [s4, s5];
              s3 = s4;
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          } else {
            peg$currPos = s3;
            s3 = peg$FAILED;
          }
          if (s3 !== peg$FAILED) {
            s2 = input.substring(s2, peg$currPos);
          } else {
            s2 = s3;
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c329(s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      function peg$parsejs_hex_digit() {
        var s0;
  
        if (peg$c330.test(input.charAt(peg$currPos))) {
          s0 = input.charAt(peg$currPos);
          peg$currPos++;
        } else {
          s0 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c331); }
        }
  
        return s0;
      }
  
      function peg$parsejs_unicode_escape_sequence() {
        var s0, s1, s2, s3, s4, s5, s6, s7;
  
        s0 = peg$currPos;
        if (input.charCodeAt(peg$currPos) === 117) {
          s1 = peg$c327;
          peg$currPos++;
        } else {
          s1 = peg$FAILED;
          if (peg$silentFails === 0) { peg$fail(peg$c328); }
        }
        if (s1 !== peg$FAILED) {
          s2 = peg$currPos;
          s3 = peg$currPos;
          s4 = peg$parsejs_hex_digit();
          if (s4 !== peg$FAILED) {
            s5 = peg$parsejs_hex_digit();
            if (s5 !== peg$FAILED) {
              s6 = peg$parsejs_hex_digit();
              if (s6 !== peg$FAILED) {
                s7 = peg$parsejs_hex_digit();
                if (s7 !== peg$FAILED) {
                  s4 = [s4, s5, s6, s7];
                  s3 = s4;
                } else {
                  peg$currPos = s3;
                  s3 = peg$FAILED;
                }
              } else {
                peg$currPos = s3;
                s3 = peg$FAILED;
              }
            } else {
              peg$currPos = s3;
              s3 = peg$FAILED;
            }
          } else {
            peg$currPos = s3;
            s3 = peg$FAILED;
          }
          if (s3 !== peg$FAILED) {
            s2 = input.substring(s2, peg$currPos);
          } else {
            s2 = s3;
          }
          if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$c329(s2);
            s0 = s1;
          } else {
            peg$currPos = s0;
            s0 = peg$FAILED;
          }
        } else {
          peg$currPos = s0;
          s0 = peg$FAILED;
        }
  
        return s0;
      }
  
      peg$result = peg$startRuleFunction();
  
      if (peg$result !== peg$FAILED && peg$currPos === input.length) {
        return peg$result;
      } else {
        if (peg$result !== peg$FAILED && peg$currPos < input.length) {
          peg$fail({ type: "end", description: "end of input" });
        }
  
        throw peg$buildException(
          null,
          peg$maxFailExpected,
          peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,
          peg$maxFailPos < input.length
            ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)
            : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)
        );
      }
    }
  
    return {
      SyntaxError: peg$SyntaxError,
      parse:       peg$parse
    };
  })();
  